commit 1c3e861db65a9a5ce215893bc7320fb2cab78753 Author: archive Date: Thu Jun 15 00:00:00 2000 +0000 as released 2000-06-15 diff --git a/Bin/SoFData.exe b/Bin/SoFData.exe new file mode 100755 index 0000000..e030721 Binary files /dev/null and b/Bin/SoFData.exe differ diff --git a/Bin/Sof.qe4 b/Bin/Sof.qe4 new file mode 100644 index 0000000..756bb44 --- /dev/null +++ b/Bin/Sof.qe4 @@ -0,0 +1,43 @@ +// SoF SDK Radiant project file 29th March 2000 +// ---------------------------------------------------------- +// +// You will need to edit these paths if you installed SoF +// anywhere other than the default path. +// +// ie. Change every occurence of 'c:\Progra~1\Raven\SoF\base' +// to your 'base' directory. +// +// Be sure to extract the textures from the pak file. +// Put the 'entities.def' file in your 'base' directory. +// +// ---------------------------------------------------------- +// Disclaimer: This may work + +{ + +// Paths + +"basepath" "c:\Progra~1\Raven\SoF\base" +"rshcmd" "" +"remotebasepath" "c:\Progra~1\Raven\SoF\base" +"entitypath" "c:\Progra~1\Raven\SoF\base\entities.def" +"texturepath" "c:\Progra~1\Raven\SoF\base\textures" +"autosave" "c:\autosave.map" +"mapspath" "" + +// Compiles + +"bsp_Relight_Qrad" "! sofbsp.exe -onlyents $ && ! sofarghrad.exe -scale 2.0 -lightmip 2 -moddir c:\Progra~1\Raven\SoF\base $" +"bsp_FullVis (qrad -extra)" "! sofbsp.exe $ && ! sofvis.exe $ && ! sofarghrad.exe -scale 2.0 -lightmip 2 -moddir c:\Progra~1\Raven\SoF\base -extra $" +"bsp_NoVis" "! sofbsp.exe $" +"bsp_Entities" "! sofbsp.exe -onlyents $" +"bsp_VisRad (BSP ents only)" "! sofbsp.exe -onlyents $ && ! sofvis.exe $ && ! sofarghrad.exe -scale 2.0 -lightmip 2 -moddir c:\Progra~1\Raven\SoF\base $" +"bsp_FullVis" "! sofbsp.exe $ && ! sofvis.exe $ && ! sofarghrad.exe -scale 2.0 -lightmip 2 -moddir c:\Progra~1\Raven\SoF\base $" +"bsp_FullVis (no qrad)" "! sofbsp $ && ! sofvis $" +"bsp_FullVis (nodetail, qrad -extra)" "! sofbsp -nodetail $ && ! sofvis $ && ! sofarghrad -scale 2.0 -lightmip 2 -moddir c:\Progra~1\Raven\SoF\base -extra $" +"bsp_FastVis" "! sofbsp $ && ! sofvis -fast $ && ! sofarghrad -scale 2.0 -lightmip 2 -moddir c:\Progra~1\Raven\SoF\base -bounce 0 $" +"bsp_FastVis (nowater)" "! sofbsp -nowater $ && ! sofvis -fast $ && ! sofarghrad -scale 2.0 -lightmip 2 -moddir c:\Progra~1\Raven\SoF\base -bounce 0 $" +"bsp_FastVis (noqrad)" "! sofbsp $ && ! sofvis -fast $" +"bsp_FastVis (with bounce)" "! sofbsp $ && ! sofvis -fast $ && ! sofarghrad -scale 2.0 -lightmip 2 -moddir c:\Progra~1\Raven\SoF\base $" + +} diff --git a/Bin/entities.def b/Bin/entities.def new file mode 100644 index 0000000..b92ef5d --- /dev/null +++ b/Bin/entities.def @@ -0,0 +1,6268 @@ +/*QUAKED misc_ctf_base (1 0 0) (-32 -32 -24) (32 32 -16) +Stepping onto this base in possesion of the correct flag will end the current CTF game. +count = team base. 1 = team 1, 2 = team 2 +*/ + + +/*QUAKED script_runner (.5 .5 .5) (-8 -8 -8) (8 8 8) WILL_KILL_USER +set Script to the name of the script to run when triggered +use parm1 through parm16 to send parameters to the script + +--------SPAWNFLAGS---------- +WILL_KILL_USER: if used from a monster's killtarget, the monster won't kill itself and must be killed from the script +*/ + + +/*QUAKED misc_bosnia_antipersonnel_jack (1 .5 0) (-15 -17 -10) (15 13 16) INVULNERABLE NOPUSH x x x x FLUFF +Tri-pod shaped anti-personnel pointy things. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- hurts player when touching it +*/ + + +/*QUAKED misc_bosnia_flag_wall (1 .5 0) (-45 -18 -25) (-39 42 77) INVULNERABLE NOPUSH x x x x FLUFF +An animated banner hanging from a wall mounted arm. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_bosnia_landmine (1 .5 0) (-13 -13 -2) (13 13 2) INVULNERABLE NOPUSH x x x x FLUFF +A landmine surrounded by dirt +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- blows up when touched +*/ + + +/*QUAKED misc_bosnia_rubble1 (1 .5 0) (-13 -10 -5) (13 10 5) INVULNERABLE NOPUSH x x x x FLUFF +Some broken bricks +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_bosnia_rubble2 (1 .5 0) (-31 -30 -9) (45 22 36) INVULNERABLE NOPUSH x x x x FLUFF +Big twisted pipes +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_bosnia_searchbeam (1 .5 0) (-8 -8 -8) (8 8 8) INVULNERABLE NOPUSH x x x x FLUFF +A searchlight beam to be placed in the distance so it can scan the skies. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_bosnia_searchlight (1 .5 0) (-40 -40 -8) (40 40 100) INVULNERABLE NOPUSH CIRCLE RANDOM x x FLUFF +A searchlight which scans the sky. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't ever be pushed +CIRCLE - moves in circle +RANDOM - move randomly +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_bosnia_tank_jack (1 .5 0) (-28 -28 -19) (28 28 23) INVULNERABLE NOPUSH x x x x FLUFF +A tank jack +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_bosnia_truck_chunks (1 .5 0) (-15 -18 -27) (15 18 27) INVULNERABLE NOPUSH x x x x FLUFF +WWII-style covered transport truck chunks +------ KEYS ------ +Skin - skin type +0 - green +1 - red +2 - tan +Style - which chunk to display +0 - grill +1 -door +2 - panel +3 - tire +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_bosnia_truck_old (1 .5 0) (-96 -39 -45) (96 39 45) INVULNERABLE NOPUSH TRIGGERED LIGHTS WHEELS_ONLY x FLUFF +WWII-style covered transport truck +------ KEYS ------ +Skin - type of truck +0 - green WWII skin +1 - red Iraq skin +2 - rusted ACME truck +Distance - distance the truck will move when triggered +Speed - max speed (default 200) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +WHEELS_ONLY - wheels turn when used, stop turning when used again. +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_castle_armor (1 .5 0) (-4 -11 -38) (11 17 50) INVULNERABLE NOPUSH x x x x FLUFF +A suit of armor +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_castle_bust (1 .5 0) (-4 -6 -1) (4 3 13) INVULNERABLE NOPUSH x x x x FLUFF +A bust of a person +------ KEYS ------ +skin - +0 - guy bust +1 - girl bust +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_castle_cannon (1 .5 0) (-27 -11 -13) (55 11 20) INVULNERABLE NOPUSH x x x x FLUFF +A cannon on wheels +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_castle_chair (1 .5 0) (-17 -14 -15) (11 13 38) INVULNERABLE NOPUSH x x x x FLUFF +A chair with a high back +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls apart when shot +*/ + + +/*QUAKED misc_castle_chair_big (1 .5 0) (-18 -15 -18) (12 15 39) INVULNERABLE NOPUSH x x x x FLUFF +A big high back chair and arms +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls apart when shot +*/ + + +/*QUAKED misc_castle_globe (1 .5 0) (-7 -9 -26) (15 9 12) INVULNERABLE NOPUSH x x x x FLUFF +A globe of the earth. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- spins when hit +*/ + + +/*QUAKED misc_castle_hedge (1 .5 0) (-10 -14 -12) (9 11 11) INVULNERABLE NOPUSH x x x x FLUFF +A hedge +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_castle_tree (1 .5 0) (-24 -21 -11) (24 21 74) INVULNERABLE NOPUSH x x x x FLUFF +A pine tree +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED environ_snow (0 1 0) (-64 -64 0) (64 64 96) START_OFF +*/ + + +/*QUAKED environ_player_snow (0 1 0) (-12 -12 -12) (12 12 12) +"count" whether this should turn the snow on or off +*/ + + +/*QUAKED environ_steamgen (0 1 0) (-12 -12 -12) (12 12 12) START_OFF +"height" size of the puffs - (default is 35) +"wait" time in seconds the steam should blow... set to zero for constant steam...(default is 0) +"delay" time in seconds the steam should stop... set to zero for steam to go once +"dmg" amount of damage the steam generator does to folks per second of exposure(def is 0) + +Be certain to set the "angles" key or you will die + +*/ + + +/*QUAKED environ_smokegen (0 1 0) (-12 -12 -12) (12 12 12) START_OFF +"height" size of the puffs - 60 is medium sized... +*/ + + +/*QUAKED environ_sparkgen (0 1 0) (-12 -12 -12) (12 12 12) START_OFF ONE_SHOT +delay - frequency of sparks shooting out in seconds +wait - randomness to how often the sparks shoot out in seconds(should be less than delay) +lip - color of sparks... 0 = yellow, 1 = blue +use angles to determine what direction you want the little folks to go +*/ + + +/*QUAKED environ_waterglobgen (0 1 0) ? START_OFF +Drips from a 30 by 30 region around the origin of the entity +*/ + + +/*QUAKED environ_raingen (0 1 0) ? START_OFF +"count" - amount of rain(100 is default) +"wait" - length of the rain pieces(90 is default) +"delay" - speed that the rain falls at(90 is default) +"lip" - light level(200 is default) +*/ + + +/*QUAKED environ_rain_worldtrigger (0 1 0) (-12 -12 -12) (12 12 12) +"count" - amount of rain(100 is default) +"wait" - length of the rain pieces(90 is default) +*/ + + +/*QUAKED environ_cloudtrigger (0 1 0) (-12 -12 -12) (12 12 12) +"wait" - density of clouds (default = .1) +"count" speed of the clouds (default 10) +*/ + + +/*QUAKED environ_windgen (0 1 0) (-12 -12 -12) (12 12 12) START_OFF +not in yet, chump +*/ + + +/*QUAKED environ_bloodrain (0 1 0) (-4 -4 -4) (4 4 4) +Rains from a 30 by 30 region. Put the bloodrain entity +at the x-y center of the region you +want the blood to rain on. Put it at the height you +want the rain to start at. +*/ + + +/*QUAKED environ_linefountain (1 0 1) (-8 -8 -8) (8 8 8) START_OFF +count - power of the fountain (between 0 and 635) +Be certain to set the "angles" key or you will die +*/ + + +/*QUAKED environ_splashfountain (0 1 0) (-8 -8 -8) (8 8 8) +Nope, doesn't work yet, so don't use it ;( +*/ + + +/*QUAKED environ_lightning (0 1 0) (-8 -8 -8) (8 8 8) START_OFF +random = how often the lightning should strike, roughly, in seconds... - default 10... + +triggering this will turn it off and on +*/ + + +/*QUAKED environ_emergency_lights (0 1 0) (-8 -8 -8) (8 8 8) +*/ + + +/*QUAKED environ_skyfade (0 1 0) (-8 -8 -8) (8 8 8) START_OFF +"color" initial color of the sky in red green blue format, from 0.0 to 2.0, with 1.0 being normal (like "1.0 1.0 1.0" for white) +"endpoint" like color, but this is the ending color +"delay" time in seconds for the fade to take +*/ + + +/*QUAKED environ_explosion (0 1 0) (-8 -8 -8) (8 8 8) NO_BLIND NO_DAMAGE +"health" size of the explosion (default 150) +*/ + + +/*QUAKED environ_smoke_burst (0 1 0) (-8 -8 -8) (8 8 8) +"health" size of the smoke burst (default 50) +*/ + + +/*QUAKED environ_fire (0 1 0) (-8 -8 -8) (8 8 8) START_OFF SILENT +a fire +-------KEYS-------- +health - size of the fire burst (default is 12) +count - lifetime of the fire in 100th's of a second (default is 64) +delay - life of actual fire in seconds from being triggered (default is 0, which means don't turn off) +----SPAWNFLAGS--- +START_OFF - starts off +SILENT - makes no noise (use this on fires that will always be far away from player) +*/ + + +/*QUAKED environ_linetrap (0 1 0) (-8 -8 -8) (8 8 8) SINGLE_TRIGGER START_OFF DAMAGE +A red laser beam trip wire. Runs from point origin till it hits something. +------ SPAWNFLAGS ------ +SINGLE_TRIGGER - goes away after tripped once +START_OFF - line won't turn on until triggered +DAMAGE - do damage +------ KEYS ------ +"angles" - Direction of the beam from where it starts... +dmg - amount of damage done by beam (default 2) +*/ + + +/*QUAKED environ_inferno (0 1 0) ? START_OFF +"count" intensity(default 100) +"delay" windspeed (default 0) + +"angles" is the direction of the wind +*/ + + +/*QUAKED environ_invisible_attack (0 1 0) (-8 -8 -8) (8 8 8) START_OFF NO_DAMAGE +"count" is the attack type (I'll have a list somewhere for you guys to get the right attack - or just ask me)(default is 3, which is the glock) +"delay" is how long between shots in seconds (default is .2) +"random" how much the shots should waver, in degrees (default is 5) +"angles" is the direction of the attack +"wait" of -1 will pop the head off of "target" + +trigger this to turn it on and off +*/ + + +/*QUAKED environ_trainarm_spawn (0 1 0) (-8 -8 -8) (8 8 8) +*/ + + +/*QUAKED environ_dustsource (0 1 0) (-8 -8 -8) (8 8 8) MAKEASBITS +"delay" frequency at which the dust should fall - set to -1 to make trigger only. Default is 10 +"health" size of the dust puffs to poop out... - default is 5 +*/ + + +/*QUAKED environ_effect (0 1 0) (-8 -8 -8) (8 8 8) +"soundName" name of the effect to execute +look for more parameters here in the future +*/ + + +/*QUAKED environ_effect_continual (0 1 0) (-8 -8 -8) (8 8 8) START_OFF +"soundName" name of the effect to execute +use to trigger this on and off +*/ + + +/*QUAKED environ_chunk_spewer (0 1 0) (-4 -4 -4) (4 4 4) TRIGGER_SPAWN +uses an info_notnull as a target, like a func_remote_camera. +----------------KEY---------------- +count -- number of chunks to spew when this spewer is used. if negative, number of seconds between spewing chunks. +*/ + + +/*QUAKED func_plat (0 .5 .8) ? PLAT_LOW_TRIGGER +speed default 150 + +Plats are always drawn in the extended position, so they will light correctly. + +If the plat is the target of another trigger or button, it will start out disabled in the extended position until it is trigger, when it will lower and become a normal plat. + +"speed" overrides default 200. +"accel" overrides default 500 +"lip" overrides default 8 pixel lip + +If the "height" key is set, that will determine the amount the plat moves, instead of being implicitly determoveinfoned by the model's height. + +SoundName - Name of the sound type of the plat + +Set "sounds" to one of the following: +1) base fast +2) chain slow +*/ + + +/*QUAKED func_rotating (0 .5 .8) ? START_ON REVERSE X_AXIS Y_AXIS TOUCH_PAIN STOP ANIMATED ANIMATED_FAST +You need to have an origin brush as part of this entity. The center of that brush will be +the point around which it is rotated. It will rotate around the Z axis by default. You can +check either the X_AXIS or Y_AXIS box to change that. + +"speed" determines how fast it moves; default value is 100. +"dmg" damage to inflict when blocked (2 default) +"soundname" this will determine the sound that is played while the object rotates + +REVERSE will cause the it to rotate in the opposite direction. +STOP mean it will stop moving instead of pushing entities +*/ + + +/*QUAKED func_button (0 .5 .8) ? AUTOUSE NOTQUAD +When a button is touched, it moves some distance in the direction of it's angle, triggers all of it's targets, waits some time, then returns to it's original position where it can be triggered again. +Buttons cannot be used by player if they have a targetname. + +AUTOUSE - Not implemented +QUAD - Use frames 0-1 when up, 2-3 when down + +"angle" determines the opening direction +"target" all entities with a matching targetname will be used +"speed" override the default 40 speed +"wait" override the default 1 second wait (-1 = never return) +"lip" override the default 4 pixel lip remaining at end of move +"health" if set, the button must be killed instead of touched +"soundname" sounds to be used for this button... +"sp_message" is for a string package ID (numerical) +*/ + + +/*QUAKED func_water (0 .5 .8) ? START_OPEN +func_water is a moveable water brush. It must be targeted to operate. Use a non-water texture at your own risk. + +START_OPEN causes the water to move to its destination when spawned and operate in reverse. + +"angle" determines the opening direction (up or down only) +"speed" movement speed (25 default) +"wait" wait before returning (-1 default, -1 = TOGGLE) +"lip" lip remaining at end of move (0 default) +"soundName" (yes, these need to be changed) - this has got to be fixed later... +0) no sound +1) water +2) lava +*/ + + +/*QUAKED func_train (0 .5 .8) ? START_ON TOGGLE BLOCK_STOPS +Trains are moving platforms that players can ride. +The targets origin specifies the min point of the train at each corner. +The train spawns at the first target it is pointing at. +If the train is the target of a button or trigger, it will not begin moving until activated. +speed default 100 +dmg default 2 +"soundname" sound for the train + +*/ + + +/*QUAKED trigger_elevator (0.3 0.1 0.6) (-8 -8 -8) (8 8 8) +*/ + + +/*QUAKED func_timer (0.3 0.1 0.6) (-8 -8 -8) (8 8 8) START_ON +"wait" base time between triggering all targets, default is 1 +"random" wait variance, default is 0 + +so, the basic time between firing is a random time between +(wait - random) and (wait + random) + +"delay" delay before first firing when turned on, default is 0 + +"pausetime" additional delay used only the very first time + and only if spawned with START_ON + +These can used but not touched. +*/ + + +/*QUAKED func_conveyor (0 .5 .8) ? START_ON TOGGLE +Conveyors are stationary brushes that move what's on them. +The brush should be have a surface with at least one current content enabled. +speed default 100 +*/ + + +/*QUAKED func_killbox (1 0 0) ? +Kills everything inside when fired, irrespective of protection. +*/ + + +/*QUAKED func_pushkillbox (1 0 0) ? + +volume - speed things are shot out at +count - angle they're shot out at + +*/ + + +/*QUAKED func_door (0 .5 .8) ? START_OPEN x CRUSHER NOMONSTER LOCKED TOGGLE ANIMATED_FAST AUTOOPEN USE_TARGET x DUAL_TARGET +TOGGLE wait in both the start and end states for a trigger event. +START_OPEN the door to moves to its destination when spawned, and operate in reverse. It is used to temporarily or permanently close off an area when triggered (not useful for touch or takedamage doors). +NOMONSTER monsters will not trigger this door +LOCKED - door won't open until used by a non-player entity +USE_TARGET - door can be used by player even if it has a targetname +DUAL_TARGET - door fires target on both open AND closed, instead of just open + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"sp_message" is for a string package ID (numerical) +"angle" determines the opening direction +"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door. +"health" if set, door must be shot open +"speed" movement speed (100 default) +"wait" wait before returning (3 default, -1 = never return) +"lip" lip remaining at end of move (8 default) +"dmg" damage to inflict when blocked (2 default) +"soundName" - name of the sound type for the door +*/ + + +/*QUAKED func_door_rotating (0 .5 .8) ? START_OPEN REVERSE CRUSHER NOMONSTER LOCKED TOGGLE X_AXIS Y_AXIS USE_TARGET IGNORE_HACK +TOGGLE causes the door to wait in both the start and end states for a trigger event. + +START_OPEN the door to moves to its destination when spawned, and operate in reverse. It is used to temporarily or permanently close off an area when triggered (not useful for touch or takedamage doors). +NOMONSTER monsters will not trigger this door +LOCKED - door won't open until used by a non-player entity +USE_TARGET - door can be used by player even if it has a targetname +IGNORE_HACK - use this flag if the door's origin is not at the edge (hope you're happy, Zuk) + +You need to have an origin brush as part of this entity. The center of that brush will be +the point around which it is rotated. It will rotate around the Z axis by default. You can +check either the X_AXIS or Y_AXIS box to change that. + +"distance" is how many degrees the door will be rotated. +"speed" determines how fast the door moves; default value is 100. + +REVERSE will cause the door to rotate in the opposite direction. + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"sp_message" is for a string package ID (numerical) +"angle" determines the opening direction +"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door. +"health" if set, door must be shot open +"speed" movement speed (100 default) +"wait" wait before returning (3 default, -1 = never return) +"dmg" damage to inflict when blocked (2 default) +"soundName" - sound type for the door +*/ + + +/*QUAKED func_door_rotating_smart (0 .5 .8) ? START_OPEN REVERSE CRUSHER NOMONSTER LOCKED TOGGLE X_AXIS Y_AXIS USE_TARGET IGNORE_HACK + +TOGGLE causes the door to wait in both the start and end states for a trigger event. + +START_OPEN the door to moves to its destination when spawned, and operate in reverse. It is used to temporarily or permanently close off an area when triggered (not useful for touch or takedamage doors). +NOMONSTER monsters will not trigger this door +LOCKED - door won't open until used by a non-player entity +USE_TARGET - door can be used by player even if it has a targetname +IGNORE_HACK - use this flag if the door's origin is not at the edge (hope you're happy, Zuk) + +You need to have an origin brush as part of this entity. The center of that brush will be +the point around which it is rotated. It will rotate around the Z axis by default. You can +check either the X_AXIS or Y_AXIS box to change that. + +"distance" is how many degrees the door will be rotated. +"speed" determines how fast the door moves; default value is 100. + +The door will open in the direction opposite that of its activator. + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"sp_message" is for a string package ID (numerical) +"angle" determines the opening direction +"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door. +"health" if set, door must be shot open +"speed" movement speed (100 default) +"wait" wait before returning (3 default, -1 = never return) +"dmg" damage to inflict when blocked (2 default) +"soundName" - Sound type for the door +*/ + + +/*QUAKED func_door_secret (0 .5 .8) ? always_shoot 1st_left 1st_down +A secret door. Slide back and then to the side. + +open_once doors never closes +1st_left 1st move is left of arrow +1st_down 1st move is down from arrow +always_shoot door is shootebale even if targeted + +"angle" determines the direction +"dmg" damage to inflic when blocked (default 2) +"wait" how long to hold in the open position (default 5, -1 means hold) +*/ + + +/*QUAKED func_remote_camera (0 0.5 0.8) (-4 -4 -4) (4 4 4) ACTIVATOR_ONLY SCRIPTED NO_DELETE LW_ANIMATE + + pathtarget - holds the name of the camera's owner entity (if any). + target - holds the name of the entity to be looked at. + style - changes the player's FOV to assigned value while in camera if defined + volume - defines the cinematic mode: + 0 - normal (standard FPS, player can shoot) + 1 - third person + 2 - letterbox + 4 - monitor (graphic overlay border) + 8 - remote with no special features + 16 - sniper scope + ACTIVATOR_ONLY - only the activating client will see the remote camera view. + SCRIPTED - puts player in godmode while camera is running and makes player non-solid + NO_DELETE - don't delete camera + LW_ANIMATE - camera will animate without a target after its initial spawn, + but it still needs a target for its initial position + This should ONLY be used for one-shot cameras. +*/ + + +/*QUAKED func_alarm (0 .5 .8) (-8 -8 -8) (8 8 8) +Alerts everybody on the level that there is an intruder +*/ + + +/*QUAKED func_ignite (0 .5 .8) (-8 -8 -8) (8 8 8) +Roast folks +"Health" Radius of igniting +*/ + + +/*QUAKED func_Dekker_console (1 .4 .4) (-8 -8 -8) (8 8 8) +Where Dekkers will go to turn on autoguns and make cool stuff happen... +*/ + + +/*QUAKED func_Dekker_diehere (1 .4 .4) (-8 -8 -8) (8 8 8) +Where Good Dekkers go when they die... +*/ + + +/*QUAKED func_Dekker_jumphere (1 .4 .4) (-8 -8 -8) (8 8 8) +Spot for Dekker to hop up to... +*/ + + +/*QUAKED func_Dekker_split (1 .4 .4) (-8 -8 -8) (8 8 8) +Split Dekker in half... +*/ + + +/*QUAKED func_door_portcullis (0 .5 .8) ? x x CRUSHER +can only be opened by a trigger_keep_using. + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"sp_message" is for a string package ID (numerical) +"angle" determines the opening direction +"targetname" needs a name so the trigger_keep_using can open it +"wait" wait before returning (3 default, -1 = never return) +"lip" lip remaining at end of move (8 default) +"dmg" damage to inflict when blocked (2 default) +"soundName" - name of the sound type for the door + +ch-ch-ch-ch-changes... +"speed" UPWARD movement speed (20 default) +"volume" DOWNWARD movement speed (10 default) +*/ + + +/*QUAKED func_hide_the_players_gun (0 1 0) (-4 -4 -4) (4 4 4) +health -- 1 if you're disguised, 0 if you're not +if you set wait to -1 then use, count will indicate if we're currently disguised, 1 == disguised, 0 == not +*/ + + +/*QUAKED func_snipercam_zoom (0 1 0) (-4 -4 -4) (4 4 4) + + ------------ KEYS ------------ + count desired fov, clamped to [6,60]. -1 resets to normal fov. "use" to update. +*/ + + +/*QUAKED func_mission_status (0 1 0) (-4 -4 -4) (4 4 4) + + ------------ KEYS ------------ + count actual status of the mission. 0 = nothing yet, 1 = success. "use" to update. + + + ----------- NOTES ------------ + near the end of a level, set up 2 trigger_multiples to target this func_mission_status. + one of the triggers should have a targetname of "exitwarning_on", the other should be + called "exitwarning_off". place "exitwarning_off" a short distance from the exit. place + "exitwarning_on" in between "exitwarning_off" and the exit itself. +*/ + + +/*QUAKED func_player_health (0 1 0) (-4 -4 -4) (4 4 4) + + ------------ KEYS ------------ + count add this to the player's health when this func_player_health is used +*/ + + +/*QUAKED func_player_armor (0 1 0) (-4 -4 -4) (4 4 4) + + ------------ KEYS ------------ + count add this to the player's armor when this func_player_armor is used +*/ + + +/*QUAKED func_player_item (0 1 0) (-4 -4 -4) (4 4 4) + + ------------ KEYS ------------ + count number of items to be added to player's inventory when this func_player_item is used + health item to be added to player's inventory when this func_player_item is used + + SFE_FLASHPACK 1 + SFE_C4 2 + SFE_LIGHT_GOGGLES 3 + SFE_MEDKIT 5 + SFE_GRENADE 6 + +*/ + + +/*QUAKED misc_generic_access_card (1 .5 0) (-2.95 -3.71 -1.18) (5.99 3.71 1.18) INVULNERABLE NOPUSH x x x x FLUFF +An access card +------ SPAWNFLAGS ------ +INVULNERABLE - N/A, can't be damaged. +NOPUSH - N/A, can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_banner (1 .5 0) (-4.2 -50.12 -125.3) (4.01 51 126) INVULNERABLE NOPUSH NOANIMATE x x x FLUFF +2 story tall wall banner that waves in the wind +------ KEYS ------ +Skin - +0 - symbol of "Ugandan organization" +1 - Iraq flag +2 - Saddam +3 - Siberia +------ SPAWNFLAGS ------ +INVULNERABLE - N/A, can't be damaged. +NOPUSH - N/A, can't be pushed +NOANIMATE - won't flutter +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_barbwire_coil (1 .5 0) (-15 -59 -17) (15 59 17) VULNERABLE NOPUSH x x x x FLUFF +Roll of barbed-wire. Belongs atop a fence. +------ KEYS ------ +message - text printed when killed +------ SPAWNFLAGS ------ +VULNERABLE - can be damaged. +NOPUSH - N/A, can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +Hurts player when touched, causes player to jerk back. +*/ + + +/*QUAKED misc_generic_barrel_burning (1 .5 0) (-10 -10 -12) (10 10 19) VULNERABLE NOPUSH ON_FIRE x x x FLUFF +Open barrel. +------ SPAWNFLAGS ------ +VULNERABLE - can be damaged. +NOPUSH - won't move +ON_FIRE: Puts fire on top. +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +Will burn the player if it is ON_FIRE and the player stands on it. +*/ + + +/*QUAKED misc_generic_barrel_chemical (1 .5 0) (-9 -9 -15) (10 8 15) INVULNERABLE NOPUSH EXPLOSIVE DEKKER x x FLUFF +Chemical barrel. +------ KEYS ------ +message - text printed when killed +skin - +0 - normal barrel +1 - snowy barrel (Siberia) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +EXPLOSIVE: Will explode when it dies. +DEKKER - special barrel for Dekker to play with +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- Tips over when shot and leaks. +- Explosive barrels are given a red skin, others are brown. +*/ + + +/*QUAKED misc_generic_barrel_wine (1 .5 0) (-15 -10 -10) (15 10 10) INVULNERABLE NOPUSH x x x x FLUFF +A barrel of wine laying on it's side +------ KEYS ------ +message - text printed when killed +------ SPAWNFLAGS ------ +INVULNERABLE - can be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_bench (1 .5 0) (-11 -30 -18) (11 30 18) INVULNERABLE NOPUSH x x x x FLUFF +A highbacked wooden bench. +------ KEYS ------ +message - text printed when killed +skin - +0 - NYC bench (brown wood) +1 - Trainyard bench (beat up, faded) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls apart when shot +*/ + + +/*QUAKED misc_generic_bookshelf (1 .5 0) (-40 -16 0) (40 16 64) INVULNERABLE NOPUSH x x x x FLUFF +A bookshelf +--------SPAWNFLAGS---------- +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_broom (1 .5 0) (-3 -17 -26) (3 17 26) INVULNERABLE NOPUSH x x x x FLUFF +An upright push-broom +------ KEYS ------ +skin - +0 - old beat up broom +1 - new broom +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_bunk (1 .5 0) (-41 -21 -30) (41 21 30) INVULNERABLE NOPUSH x x x x FLUFF +Bunk bed +------ KEYS ------ +Skin - +0 - hi-tech bunk +1 - iraq bunk +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls apart when shot +*/ + + +/*QUAKED misc_generic_car_american (1 .5 0) (-95 -112 -29) (95 113 53) INVULNERABLE NOPUSH CAR_ON SIREN x x FLUFF +Police car, Taxi or Cadillac. +------ KEYS ------ +Skin - +0 - police car +1 - taxi +2 - black cadillac +3 - miami police +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - N/A can't be pushed +CAR_ON - car lights will be on +SIREN - police car lights will be flashing +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_car_european (1 .5 0) (-70 -31 -26) (70 31 26) INVULNERABLE NOPUSH TRIGGER_SPAWN x x x FLUFF +1980's Ford escort-like European egg-mobile car. +------ KEYS ------ +Skin - +0 - clean and tan +1 - dirty/rusty and red +2 - shot full o' holes, missing hood +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - N/A can't be pushed +TRIGGER_SPAWN - use it and it shows up +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_car_honda (1 .5 0) (-56 -25 -24) (56 25 31) INVULNERABLE NOPUSH x x x x FLUFF +Tiny Japanese police car +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_car_rolls (1 .5 0) (-85 -30 -25) (85 30 47) INVULNERABLE NOPUSH x x x x FLUFF +A luxury car. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- car alarm goes off when touched +- hood pops open when shot +*/ + + +/*QUAKED misc_generic_car_sports (1 .5 0) (-83 -36 -20) (83 36 20) INVULNERABLE NOPUSH x x x x FLUFF +a Lamborghini sports car. +------ KEYS ------ +Skin - +0 - shiny red +1 - shiny yellow +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_cart (1 .5 0) (-11 -21 -12) (11 21 12) INVULNERABLE NOPUSH x x x x FLUFF +A wheeled cart. Can put stuff on both shelves. +------ KEYS ------ +skin - +0 - Clean, metal +1 - Dirty, bloody (ugn2) +2 - wood (iraq) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_cash_register (1 .5 0) (-9 -9 -10) (9 9 10) INVULNERABLE NOPUSH x x x x FLUFF +A cash register. +------ KEYS ------ +skin : +0 - normal clean register +1 - damaged +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- has damage skin when shot +*/ + + +/*QUAKED misc_generic_chair_legs (1 .5 0) (-11 -10 -19) (11 10 19) INVULNERABLE NOPUSH x x x x FLUFF +A chair with four legs +------ KEYS------ +skin - +0 - metal +1 - wooden +2 - white plastic +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls apart when shot +*/ + + +/*QUAKED misc_generic_chair_legs2 (1 .5 0) (-13 -11 -21) (13 11 21) INVULNERABLE NOPUSH x x x x FLUFF +A chair with two long solid legs on the sides. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_chair_office (1 .5 0) (-10 -12 -18) (12 12 23) INVULNERABLE NOPUSH x x x x FLUFF +Office chair on castors. +------ KEYS ------ +skin - +0 - bright metal +1 - dark Tokyo chair +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- Spins and creaks when shot. + */ + + +/*QUAKED misc_generic_chunks_brick (1 .5 0) (-7 -4 -3) (7 4 3) INVULNERABLE NOPUSH x x x x FLUFF +Brick chunks used for debris +------ KEYS ------ +Skin - +0 - red brick (default) +1 - dark grey +2 - dark brown +3 - light brown +4 - light grey + +Style - type of chunk +0 - normal brick (default) +1 - half a brick +2 - 1/4 of brick +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_chunks_glass (1 .5 0) (-8 -7 -0.5) (8 7 0.5) INVULNERABLE x x x x x FLUFF +Glass shards used for debris +------ KEYS ------ +style - type of chunk +0 - small triangular (default) +1 - medium triangular +2 - long thin +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_chunks_metal (1 .5 0) (-5 -2 -1) (5 2 1) INVULNERABLE x x x x x FLUFF +Metal chunks used for debris. +------ KEYS ------ +style - type of chunk +0 - wide and long piece (default) +1 - long thin piece +2 - smaller piece +3 - another small piece +skin - +0 - dark +1 - rusty +2 - shiny +3 - light +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_chunks_rock (1 .5 0) (-5 -2 -1) (5 2 1) INVULNERABLE x x x x x FLUFF +Rock chunks used for debris. +------ KEYS ------ +style - type of chunk +0 - big rock (default) +1 - medium rock +2 - small rock +3 - another small rock +skin - +0 - brwn_dk +1 - brwn_lt +2 - grey_dk +3 - grey_lt +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_chunks_wall (1 .5 0) (-5 -6 -10) (5 8 10) INVULNERABLE x x x x x FLUFF +Wall chunks used as debris +------ KEYS ------ +Skin : +0 - black (default) +1 - brown +2 - dark brown +3 - light brown +4 - grey +5 - dark grey +6 - light grey +7 - green +8 - orange cone +9 - red +10 - white +Style - type of chunk +0 - small (default) +1 - thin flat +2 - round chunk +3 - other round chunk +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_chunks_wood (1 .5 0) (-5 -2 -1) (5 2 1) INVULNERABLE x x x x x FLUFF +Wood chunks used for debris +------ KEYS ------ +Style - type of chunk +0 - small piece(default) +1 - medium piece +2 - another small piece +3 - large piece +Skin : +0 - dark brown (default) +1 - dark grey +2 - light brown +3 - light grey +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_comp_keyboard (1 .5 0) (-4 -12 -2) (4 12 2) INVULNERABLE NOPUSH x x x x FLUFF +A keyboard to a computer. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_comp_monitor (1 .5 0) (-9 -12 -12) (9 12 12) INVULNERABLE NOPUSH x x x x FLUFF +A computer and monitor. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- sparks and smokes when shot +*/ + + +/*QUAKED misc_generic_comp_monitor2 (1 .5 0) (-34 -15 -8) (9 7 15) INVULNERABLE NOPUSH x x x x FLUFF +A high tech computer with a large monitor. +------ KEYS ------ +skin - +0 - clean +1 - damaged +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- sparks and smoke when shot +- switches to damage skin when shot +*/ + + +/*QUAKED misc_generic_crate_fish (1 .5 0) (-10 -8 -1) (11 8 8) INVULNERABLE NOPUSH x x x x FLUFF +A crate for holding fish. Great for the docks. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_desk_phone (1 .5 0) (-5 -7 -3) (5 6 3) INVULNERABLE NOPUSH x x x x FLUFF +A desk phone. +--------KEYS------------ +Skin : + 0 - clean (default) + 1 - dirty yucky phone +--------SPAWNFLAGS---------- +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- light flashes +- spins and sparks when shot +*/ + + +/*QUAKED misc_generic_fan_big (1 .5 0) (-64 -40 -63) (63 0 63) INVULNERABLE NOPUSH START_OFF x x x FLUFF +A really, really, big fan +------ KEYS ------ +speed - how fast fan spins (default 1.5) **must be less than 31!!** +volume - how fast fan accelerates or decelerates (default 0.05) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +AUTOMATE - spins +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- When targeted it will turn off or on. +*/ + + +/*QUAKED misc_generic_faucet (1 .5 0) (-7 -6 -6) (12 10 6) INVULNERABLE NOPUSH x x x x FLUFF +A sink faucet. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_fire_extinguisher (1 .5 0) (-4 -7 -13) (4 7 13) INVULNERABLE NOPUSH x x x x FLUFF +A wall mounted fire extinguisher. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- spews foam when shot +- explodes if shot again +- when 'used' spews foam +*/ + + +/*QUAKED misc_generic_fire_hydrant (1 .5 0) (-8 -8 -10) (8 8 14) INVULNERABLE NOPUSH x x x x FLUFF +A red fire hydrant. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- flies into air and a jet of water shoots out of ground when it dies +*/ + + +/*QUAKED misc_generic_fish (1 .5 0) (-18 -6 -8) (18 6 8) INVULNERABLE NOPUSH x x x x FLUFF +A large aquarium fish. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ KEYS ------ +Skin : +0 - white with red spots (default) +1 - gold +Angles : +- holds the second point in patrol route. If not set, fish don't move. +Volume : +- height of floor of tank +------ SPECIALS ------ +Patrols between its origin and a second point stored in angles. +*/ + + +/*QUAKED misc_generic_fish_dead (1 .5 0) (-18 -4 -8) (18 3 8) INVULNERABLE NOPUSH x x x x FLUFF +A big dead fish laying on it's side. +------ KEYS ------ +Skin : +0 - white with red spots (default) +1 - gold +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_flag_pole (1 .5 0) (-23 -66 -418) (17 39 37) INVULNERABLE NOPUSH x x x x FLUFF +A flag on a tall pole. +------ KEYS ------ +Skin : +0 - ??? (default) +1 - USA +2 - ??? +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_forklift (1 .5 0) (-74 -55 -54) (92 5 53) INVULNERABLE NOPUSH TRIGGER_SPAWN x x x FLUFF +A forklift. +------ KEYS ------ +Skin - +0 - blue/grey +1 - yellow +2 - green +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +TRIGGER_SPAWN - use it and it shows up +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_garbage_bag (1 .5 0) (-10 -9 -9) (10 10 12) INVULNERABLE NOPUSH x x x x FLUFF +A black plastic bag of garbage. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- rolls around when shot +- spews paper when shot +*/ + + +/*QUAKED misc_generic_gun_auto (1 .5 0) (-28 -21 -34) (21 21 19) VULNERABLE PUSH ACTIVE ARC_LIMITED x x FLUFF +Tri-pod mounted twin machine gun. +------ SPAWNFLAGS ------ +VULNERABLE - can be hurt +PUSH - can be moved +ACTIVE - allow these guns to track and shoot. +ARC_LIMITED - won't rotate outside of given arc +FLUFF - won't show if gl_pictip is set +--------KEYS------------ +Skin - +0 - green (Bosnia) +1 - silver (Siberia) +Speed - angular velocity in degrees per second the gun will track. Default 45. +Volume - the distance the guns will track. Default 400. +Wait - time interval in tenths of seconds that a gun in sleep mode will wait Default 30 +Health - designers can't edit health +maxyaw - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets on either side of its original facing (in degrees, to the left or right) +minpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets below its original facing (in degrees, default is 0) +maxpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets above its original facing (in degrees, default is 0) +------ SPECIALS ------ +- will track and shoot the player +*/ + + +/*QUAKED misc_generic_gun_auto2 (1 .5 0) (-28 -18 -8) (21 21 18) VULNERABLE PUSH ACTIVE ARC_LIMITED x x FLUFF +Twin machine gun with a hanging arm thingy, to be attached to the ceiling. +------ SPAWNFLAGS ------ +VULNERABLE - can be hurt +PUSH - can be moved +ACTIVE - allow these guns to track and shoot. +ARC_LIMITED - won't rotate outside of given arc +FLUFF - won't show if gl_pictip is set +--------KEYS------------ +Skin - +0 - green (Bosnia) +1 - silver (Siberia) +Speed - angular velocity in degrees per second the gun will track. Default 45. +Volume - the distance the guns will track. Default 400. +Wait - time interval in tenths of seconds that a gun in sleep mode will wait Default 30 +Health - designers can't edit health +maxyaw - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets on either side of its original facing (in degrees, to the left or right) +minpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets below its original facing (in degrees, default is 0) +maxpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets above its original facing (in degrees, default is 0) +------ SPECIALS ------ +- will track and shoot the player +*/ + + +/*QUAKED misc_generic_gun_auto3 (1 .5 0) (-21 -18 -8) (21 21 8) VULNERABLE PUSH ACTIVE ARC_LIMITED x x FLUFF +Twin machine gun with no tripod and no hanging arm thingy. Presumably this would just sit on a brush. +------ SPAWNFLAGS ------ +VULNERABLE - can be hurt +PUSH - can be moved +ACTIVE - allow these guns to track and shoot. +ARC_LIMITED - won't rotate outside of given arc +FLUFF - won't show if gl_pictip is set +--------KEYS------------ +Skin - +0 - green (Bosnia) +1 - silver (Siberia) +Speed - angular velocity in degrees per second the gun will track. Default 45. +Volume - the distance the guns will track. Default 400. +Wait - time interval in tenths of seconds that a gun in sleep mode will wait Default 30 +Health - designers can't edit health +maxyaw - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets on either side of its original facing (in degrees, to the left or right) +minpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets below its original facing (in degrees, default is 0) +maxpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets above its original facing (in degrees, default is 0) +------ SPECIALS ------ +- will track and shoot the player +*/ + + +/*QUAKED misc_generic_gun_big (1 .5 0) (-112 -75 -59) (48 76 39) INVULNERABLE NOPUSH ACTIVE ARC_LIMITED x x FLUFF +AWWWWWWW yeah.... Big ass quad machine gun turret +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't ever be pushed +ACTIVE - allow these guns to track and shoot. +ARC_LIMITED - won't rotate outside of given arc +FLUFF - won't show if gl_pictip is set +------ KEYS ------ +Skin - +0 - bosnian +1 - siberian +Speed - angular velocity in degrees per second the gun will track. Default 45. +Volume - the distance the guns will track. Default 400. +Wait - time interval in tenths of seconds that a gun in sleep mode will wait Default 30 +Health - designers can't edit health +maxyaw - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets on either side of its original facing (in degrees, to the left or right) +minpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets below its original facing (in degrees, default is 0) +maxpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets above its original facing (in degrees, default is 0) +*/ + + +/*QUAKED misc_generic_gun_castle (1 .5 0) (-56 -37 -29) (24 38 19) INVULNERABLE NOPUSH ACTIVE ARC_LIMITED TOGGLEABLE TRIGGER_SPAWN FLUFF +AWWWWWWW yeah.... Big ass quad machine gun turret +------ SPAWNFLAGS ------ +INVULNERABLE - N/A can't ever be damaged. +NOPUSH - N/A can't ever be pushed +ACTIVE - allow these guns to track and shoot. +ARC_LIMITED - won't rotate outside of given arc +TOGGLEABLE - using through trigger will activate/deactivate +TRIGGER_SPAWN - start inactive +FLUFF - won't show if gl_pictip is set +------ KEYS ------ +Skin - +0 - order +1 - bosnian +2 - siberian +Speed - angular velocity in degrees per second the gun will track. Default 45. +Volume - the distance the guns will track. Default 400. +Wait - time interval in tenths of seconds that a gun in sleep mode will wait Default 15 +Health - designers can't edit health +maxyaw - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets on either side of its original facing (in degrees, to the left or right) +minpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets below its original facing (in degrees, default is 0) +maxpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets above its original facing (in degrees, default is 0) +*/ + + +/*QUAKED misc_generic_heap (1 .5 0) (-21 -16 -2) (17 18 3) INVULNERABLE NOPUSH x x x x FLUFF +A heap of paper/guts/poop +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ KEYS ------ +Skin : + 0 - pile of paper. (default) + 1 - pile of guts. + 2 - cow patties... moo... +*/ + + +/*QUAKED misc_generic_light_beam (1 .5 0) (-14 -313 -31) (51 142 6) INVULNERABLE NOPUSH x x x x FLUFF +A beam of light like what comes off a car or train headlight. +------ SPAWNFLAGS ------ +INVULNERABLE - N/A, can't ever be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_light_flare (1 .5 0) (-5 -5 -5) (5 5 5) INVULNERABLE NOPUSH x x x x FLUFF +A halo for lights. +------ SPAWNFLAGS ------ +INVULNERABLE - N/A, can't ever be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_motorcycle (1 .5 0) (-45 -18 -26) (45 21 24) INVULNERABLE NOPUSH x x x x FLUFF +A red motorcycle. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- shows damage skin when shot +*/ + + +/*QUAKED misc_generic_orange_cone (1 .5 0) (-7 -7 -13) (7 7 13) INVULNERABLE NOPUSH x x x x FLUFF +An orange cone traffic cone. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls over when shot +*/ + + +/*QUAKED misc_generic_palette_jack (1 .5 0) (-30 -11 -21) (30 11 21) INVULNERABLE NOPUSH x x x x FLUFF +A palette jack. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_paper_blowing (1 .5 0) (-3 -3 -0) (3 3 1) INVULNERABLE NOPUSH NOANIMATE x x x FLUFF +A piece of paper fluttering in the breeze. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +NOANIMATE - won't flutter +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_parking_meter (1 .5 0) (-2 -5 -22) (2 5 22) INVULNERABLE NOPUSH x x x x FLUFF +A curbside parking meter +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_phone_booth (1 .5 0) (-11 -28 -20) (11 28 20) INVULNERABLE NOPUSH x x x x FLUFF +A group of three phone booths +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, won't ever move +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- rings when shot +*/ + + +/*QUAKED misc_generic_pillow (1 .5 0) (-19 -31 -3) (19 31 3) INVULNERABLE NOPUSH x x x x FLUFF +A large pillow to sit on +------ KEYS ------ +Skin : + 0 - white pillow. (default) + 1 - brown pillow for sitting (sushi bar) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_plant_potted (1 .5 0) (-34 -43 -19) (24 28 44) INVULNERABLE NOPUSH x x x x FLUFF +A large palm plant in an urn-shaped pot. +------ KEYS ------ +skin - +0 - black vase w/gold band +1 - dark grey vase +2 - gold vase +3 - clay vase +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_plant_tall (1 .5 0) (-14 -13 -21) (14 13 21) INVULNERABLE NOPUSH x x x x FLUFF +A little tree (waist high) in a pot. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_radar_dish (1 .5 0) (-49 -36 -39) (48 37 50) INVULNERABLE NOPUSH NOANIMATE x x x FLUFF +A radar dish that spins around and around. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +NOANIMATE - won't spin +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_radio (1 .5 0) (-4 -14 -9) (4 14 9) INVULNERABLE NOPUSH x x x x FLUFF +A boom box. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_security_camera (1 .5 0) (-8 -2 -4) (8 2 24) INVULNERABLE NOPUSH ROTATE TRIGGERING x x FLUFF +Ceiling mounted security camera +------ KEYS ------ +count - amount to rotate to one side from current facing (count = 30 means it rotates 60 total) (default 90) +speed - degrees per second to rotate (default 5) +attenuation - the half-fov in degrees (0 to 180), defaults to 30 +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't be pushed +ROTATE - camera will rotate on z axis +TRIGGERING - camera will trigger its target if it spots the player +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_security_camera2 (1 .5 0) (-8 -2 -4) (8 2 4) INVULNERABLE NOPUSH ROTATE TRIGGERING x x FLUFF +Rotating security camera without mounting pole +------ KEYS ------ +count - amount to rotate to one side from current facing (count = 30 means it rotates 60 total) (default 90) +speed - degrees per second to rotate (default 5) +attenuation - the half-fov in degrees (0 to 180), defaults to 30 +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't be pushed +ROTATE - camera will rotate on z axis +TRIGGERING - camera will trigger its target if it spots the player +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_shovel (1 .5 0) (-5 -3 -24) (5 3 24) INVULNERABLE NOPUSH x x x x FLUFF +Shovel, standing on its tip. +------ KEYS ------ +skin - +0 - normal shovel +1 - showy shovel (Siberia) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_shrub (1 .5 0) (-20 -20 -13) (20 20 13) INVULNERABLE NOPUSH x x x x FLUFF +A small leafy shrub. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_sink (1 .5 0) (-11 -12 -6) (11 12 7) INVULNERABLE NOPUSH x x x x FLUFF +A wall mounted porcelain sink. +_______KEYS________ +skin - +1 - clean skin +2 - dirty skin + +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A,can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls off wall and spouts water when shot +*/ + + +/*QUAKED misc_generic_sofa (1 .5 0) (-17 -36 -17) (17 36 17) INVULNERABLE NOPUSH x x x x FLUFF +A sofa. +------ KEYS ------ +skin - +0 - dirty green skin +1 - fancy white leather skin +2 - brown cloth with a design +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- emits smoke puffs when shot +*/ + + +/*QUAKED misc_generic_sofa_chair (1 .5 0) (-17 -16 -17) (17 16 17) INVULNERABLE NOPUSH x x x x FLUFF +A padded recliner-type chair +------ KEYS ------ +skin - +0 - brown with buttons +1 - brown cloth with a design +2 - brown with no buttons +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- emits smoke puffs when shot +*/ + + +/*QUAKED misc_generic_speaker (1 .5 0) (-3 -5 -10) (7 5 13) INVULNERABLE NOPUSH WALLMOUNT x x x FLUFF +A speaker hung from ceiling. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A,can't ever be pushed +WALLMOUNT - removes pole +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- sparks and falls when shot +- can remove wallmount using WALLMOUNT spawnflag +*/ + + +/*QUAKED misc_generic_stoplight (1 .5 0)(-6 -5 -44) (9 4 44) INVULNERABLE NOPUSH x x x x FLUFF +A traffic light red - yellow - green, y'know. +------ KEYS ------ +skin - +0 - clean +1 - damaged +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A,can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- changes to damage skin when shot +*/ + + +/*QUAKED misc_generic_street_name_sign (1 .5 0) (-12 -12 -36) (12 12 36) INVULNERABLE NOPUSH x x x x FLUFF +A corner street sign. +------ KEYS ------ +skin - +0 - Russian sign +1 - American sign +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_sword (1 .5 0) (-23 -2 -2) (23 2 2) INVULNERABLE NOPUSH x x x x FLUFF +A katana +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_sword_large (1 .5 0) (-29 -2 -2) (29 2 2) INVULNERABLE NOPUSH x x x x FLUFF +A large katana +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_table_round (1 .5 0) (-27 -23 -16) (27 23 16) INVULNERABLE NOPUSH x x x x FLUFF +Octagonal table with a support in the middle. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ KEYS ------ +skin - +0 - metal table (default) +1 - wooden table +*/ + + +/*QUAKED misc_generic_table1 (1 .5 0) (-41 -24 -18) (41 24 15) INVULNERABLE NOPUSH PLAYER_FLIPPABLE x x x FLUFF +A rectangular table with four legs and a front panel. +------ KEYS ------ +Skin : +0 - dirty wooden table. (default) +1 - high tech metal/white table +2 - dirty wooden table with stuff on it +3 - high tech table with stuff on it +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls apart when shot +*/ + + +/*QUAKED misc_generic_table2 (1 .5 0) (-64 -106 -30) (47 32 4) INVULNERABLE NOPUSH x x x x FLUFF +An 'L' shaped table with panels on four sides. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls apart when shot +*/ + + +/*QUAKED misc_generic_tank_gas (1 .5 0) (-58 -23 -27) (58 23 19) INVULNERABLE NOPUSH x x x x FLUFF +A big natural gas tank. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- when 'used' it blows up, even when invulnerable. +- blows up when shot +*/ + + +/*QUAKED misc_generic_tank_propane (1 .5 0) (-3 -3 -25) (3 3 25) INVULNERABLE NOPUSH NODEBRIS x x x FLUFF +A tall thin propane tank. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +NODEBRIS - won't produce debris when killed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_toilet (1 .5 0) (-14 -9 -16) (14 9 16) INVULNERABLE NOPUSH x x x x FLUFF +A toilet +------ KEYS ------ +Skin : + 0 - dirty New York. (default) + 1 - clean Tokyo +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- produces fountain of water when shot. +*/ + + +/*QUAKED misc_generic_train (1 .5 0) (-54 -164 -60) (55 168 60) TRIGGERED RESPAWNER START_ACTIVE DECCELERATE DISAPPEAR IDLE FLUFF +A train car. +------ KEYS ------ +accel - rate of acceleration (default 100) +skin - +0 - modern graffitti covered subway car +1 - old-fashioned subway +2 - cattle car +3 - box car +style - maximum speed (default 600) +------ SPAWNFLAGS ------ +TRIGGERED - set if train is to respond to a trigger. +RESPAWNER - set if you want the train to disappear when it stops and respawn. +When set, "wait" is the time in seconds that will pass before the train respawns +after disappearing. +START_ACTIVE - set the train is to begin the level moving, as opposed to being triggered. +DECCELERATE will cause the train to slow down instead of instantly stopping +DISAPPEAR - go away when train stops. +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- train moves +*/ + + +/*QUAKED misc_generic_trash_ashtray (1 .5 0) (-5 -4 -9) (5 4 9) INVULNERABLE NOPUSH x x x x FLUFF +A cylindrical ashtray/trashcan. Like what is placed outside Raven's entrance. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- fall over and roll around when shot +*/ + + +/*QUAKED misc_generic_trashcan_barrel (1 .5 0) (-15 -16 -17) (15 16 22) INVULNERABLE NOPUSH x x x x FLUFF +Round steel trashcan with lid. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls over when shot +- spawns paper when shot +*/ + + +/*QUAKED misc_generic_tree_thin (1 .5 0) (-26 -15 -66) (25 16 96) INVULNERABLE NOPUSH x x x x FLUFF +Bare thin tree. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_truckcab (1 .5 0) (-91 -40 -49) (91 40 49) INVULNERABLE NOPUSH x x x x FLUFF +A cab for a tractor-trailer. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- explodes when shot +*/ + + +/*QUAKED misc_generic_tv_ceiling (1 .5 0) (-18 -19 -22) (19 19 28) INVULNERABLE NOPUSH x x x x FLUFF +TV mounted from the ceiling. Has face of newcaster flashing on it. +Targeting with trigger makes it die +------ KEYS ------ +style : +0 - newscaster fading in and out +1 - bad guy symbol fading in and out +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls to ground when shot +- smokes and sparks when shot +*/ + + +/*QUAKED misc_generic_tv_wall (1 .5 0) (-5 -9 -9) (6 9 7) INVULNERABLE NOPUSH x x x x FLUFF +A wall-mounted TV. Has a scrolling monochrome screen +Targeting with trigger makes it die +------ KEYS ------ +style : +0 - monochrome screen +1 - radar screen +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls to floor when shot +- smokes and sparks when shot +*/ + + +/*QUAKED misc_generic_urinal (1 .5 0) (-6 -9 -11) (9 9 14) INVULNERABLE NOPUSH x x x x FLUFF +A urinal. +------ KEYS ------ +Skin : + 0 - dirty New York. (default) + 1 - clean Tokyo +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- throws out puck when shot +- produces water fountain when destroyed +*/ + + +/*QUAKED misc_generic_urinal_cake (1 .5 0) (-3 -3 -1) (3 3 1) INVULNERABLE NOPUSH x x x x FLUFF +A nice pink urinal cake. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_urn (1 .5 0) (-16 -16 -14) (16 16 14) INVULNERABLE NOPUSH x x x x FLUFF +A fine looking urn. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_waste_basket_wire (1 .5 0) (-6 -7 -7) (6 7 7) INVULNERABLE NOPUSH x x x x FLUFF +Small, circular wastebasket +------ KEYS ------ +Skin : + 0 - wire mesh. (default) + 1 - solid metal + 2 - rusty wire + 3 - rusty solid +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls over and rolls around when shot +*/ + + +/*QUAKED misc_generic_web_moss_animated (1 .5 0) (-4 -15 -10) (-1 15 10) INVULNERABLE NOPUSH NOANIMATE x x x FLUFF +moss/cobwebs blowing in the breeze +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +NOANIMATE - won't animate +FLUFF - won't show if gl_pictip is set +------ KEYS ------ +Skin : +0 - cobweb1 (default) +1 - cobweb2 +2 - moss1 +3 - moss2 +4 - bloodflap +*/ + + +/*QUAKED misc_generic_wet_floor_sign (1 .5 0) (-9 -8 -8) (9 8 8) INVULNERABLE NOPUSH x x x x FLUFF +A sign that says 'wet floor' +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls over when shot +*/ + + +/*QUAKED misc_generic_wpn_bat (1 .5 0) (-35 -33 55) (-31 3 60) INVULNERABLE NOPUSH x x x x FLUFF +A bat for cracking heads (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_wpn_desert_eagle (1 .5 0) (-42 -12 55) (-30 1 58) INVULNERABLE NOPUSH x x x x FLUFF +A weapon Desert Eagle (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_wpn_glock (1 .5 0) (-40 -10 56) (-31 1 58) INVULNERABLE NOPUSH x x x x FLUFF +A weapon Glock (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_wpn_ingram (1 .5 0) (-44 -13 55) (-27 2 59) INVULNERABLE NOPUSH x x x x FLUFF +A weapon Ingram (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_wpn_katana (1 .5 0) (-37 -42 54) (-30 9 61) INVULNERABLE NOPUSH x x x x FLUFF +A weapon Katana (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_wpn_minimi (1 .5 0) (-7 -2 -1) (29 7 3) INVULNERABLE NOPUSH x x x x FLUFF +A weapon Minimi (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_wpn_sig3000 (1 .5 0) (-60 -21 55) (-26 8 58) INVULNERABLE NOPUSH x x x x FLUFF +A weapon SIG3000 (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_wpn_spas12 (1 .5 0) (-60 -6 55) (-30 1 58) INVULNERABLE NOPUSH x x x x FLUFF +A weapon spas12 (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_generic_wpn_c4 (1 .5 0) (-4 -2 -4) (3 2 4) INVULNERABLE NOPUSH START_OFF x x x +A c4 charge (not a pickup). No FLUFF flag cuz we'll probably only want it for a KOS1 cinematic. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +START_OFF - doesn't appear until used +*/ + + +/*QUAKED misc_iraq_basket (1 .5 0) (-6 -7 -18) (7 6 15) INVULNERABLE NOPUSH x x x x FLUFF +A tall thin wicker basket +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_iraq_cart_camel (1 .5 0) (-20 -48 -24) (20 48 24) INVULNERABLE NOPUSH x x x x FLUFF +A large two wheeled wooden cart +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_iraq_flatbed (1 .5 0) (-95 -40 -42) (95 40 45) INVULNERABLE NOPUSH TRIGGERED LIGHTS WHEELS_ONLY x FLUFF +A flatbed truck that can have a tank on the back +------ KEYS ------ +Style : +0 - no tank - just a flatbed (default) +1 - has a tank on the back +Distance - distance the truck will move when triggered +Speed - max speed (default 200) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +TRIGGERED - trigger will cause the truck to move forward a specified amount +LIGHTS - the headlights are on +WHEELS_ONLY - wheels turn when used, stop turning when used again. +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- moves forward or backward +- wheels turn as it moves +*/ + + +/*QUAKED misc_iraq_fruit_stand (1 .5 0) (-8 -16 -16) (8 16 16) INVULNERABLE NOPUSH MELONS ORANGES NOFRUIT x FLUFF +Nice fruit stand. If none of the spawnflags are used, the table will have both types of fruit. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +MELONS - only melons on table +ORANGES - only oranges +NOFRUIT - no fruit on table +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- fruti is thrown when table is shot +*/ + + +/*QUAKED misc_iraq_partition (1 .5 0) (-63 -1 0) (62 2 35) INVULNERABLE NOPUSH x x x x FLUFF +Chrome pole with a felt line. Used by movie theaters use to keep people in line. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_iraq_pottery (1 .5 0) (-8 -8 -9) (8 8 9) INVULNERABLE NOPUSH x x x x FLUFF +A knee high pot for storing dates and figs and such. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_iraq_sprinkler (1 .5 0) (-7 -63 -2) (6 64 2) INVULNERABLE NOPUSH x x x x FLUFF +A six headed cattle sprinkler. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_iraq_stealth (1 .5 0) (-32 -32 -54) (32 32 53) INVULNERABLE NOPUSH x x x x FLUFF +A big stealth plane +------ SPAWNFLAGS ------ +INVULNERABLE - N/A can't be damaged. +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_iraq_tree_palm (1 .5 0) (-30 -9 -67) (-6 23 67) INVULNERABLE NOPUSH x x x x FLUFF +A tall palm tree +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set + + hey, designers! you need to put a clip brush around this joker cuz it defies physics. tree is non-solid, too. +*/ + + +/*QUAKED misc_generic_sprinkler (1 .5 0) (-4 -4 -4) (4 4 4) INVULNERABLE NOPUSH x x x x FLUFF +A ceiling water sprinkler + DO NOT USE YET! +*/ + + +/*QUAKED misc_iraq_valve (1 .5 0) (-12 -3 -10) (12 1 11) INVULNERABLE NOPUSH x x x x FLUFF PORTCULLIS +A circular valve that will spin when used. +------ SPAWNFLAGS ------ +INVULNERABLE - N/A, can't ever be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +PORTCULLIS - used by a func_door_portcullis +*/ + + +/*QUAKED item_ammo_pistol (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for pistol1 & machinepistol +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_shotgun (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for shotgun +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_pistol2 (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for pistol2 (the .44) +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_auto (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for assault rifle, machinegun, sniper rifle +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_battery (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for Microwave Pulse Gun (MPG) +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_gas (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for Flame Thrower +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_rocket (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for Rocket Launcher +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_slug (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for Slug Thrower +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_sp_pistol (0 .3 .3) (-6 -3 0) (6 3 5) x x x START_CRATED +Ammo for pistol1 & machinepistol +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_sp_shotgun (0 .3 .3) (-7 -9 0) (13 7 9) x x x START_CRATED +Ammo for shotgun +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_sp_pistol2 (0 .3 .3) (-6 -4 0) (6 4 6) x x x START_CRATED +Ammo for pistol2 (the .44) +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_sp_auto (0 .3 .3) (-9 -3 0) (12 3 6) x x x START_CRATED x x x RESPAWN +Ammo for assault rifle, machinegun, sniper rifle +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_sp_battery (0 .3 .3) (-5 -4 0) (5 4 10) x x x START_CRATED +Ammo for Microwave Pulse Gun (MPG) +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_sp_gas (0 .3 .3) (-5 -3 0) (5 3 13) x x x START_CRATED +Ammo for Flame Thrower +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_sp_rocket (0 .3 .3) (-2 -10 -1) (8 4 15) x x x START_CRATED x x x RESPAWN +Ammo for Rocket Launcher +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_sp_slug (0 .3 .3) (-5 -8 -1) (11 6 9) x x x START_CRATED +Ammo for Slug Thrower +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_weapon_pistol2 (0 .3 .3) (-16 -5 -2) (8 8 3) x x x START_CRATED +Weapon pickup for pistol2 +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_weapon_pistol1 (0 .3 .3) (-12 -12 -2) (5 7 2) x x x START_CRATED +Weapon pickup for pistol1 +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_weapon_machinepistol (0 .3 .3) (-15 -14 -3) (15 15 4) x x x START_CRATED +Weapon pickup for machine pistol +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_weapon_assault_rifle (0 .3 .3) (-16 -7 -2) (16 11 2) x x x START_CRATED +Weapon pickup for assault rifle +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_weapon_sniper_rifle (0 .3 .3) (-36 -8 -2) (36 16 3) x x x START_CRATED +Weapon pickup sniper rifle +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_weapon_autoshotgun (0 .3 .3) (-37 -10 -9) (25 11 9) x x x START_CRATED +Weapon pickup for auto shotgun +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_weapon_shotgun (0 .3 .3) (-28 -4 -3) (24 9 3) x x x START_CRATED +Weapon pickup for shotgun +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_weapon_machinegun (0 .3 .3) (-27 -11 -3) (38 7 6) x x x START_CRATED +Weapon pickup for machine gun +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_weapon_rocketlauncher (0 .3 .3) (-15 -13 -11) (38 17 11) x x x START_CRATED +Weapon pickup for rocket launcher +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_weapon_microwavepulse (0 .3 .3) (-22 -12 -9) (44 14 7) x x x START_CRATED +Weapon pickup for Microwave Pulse Gun (MPG) +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_weapon_flamethrower (0 .3 .3) (-20 -6 -3) (29 10 3) x x x START_CRATED +Weapon pickup for Flame Thrower +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_equip_armor (0 .3 .3) (-11 -9 -1) (11 9 5) x x x START_CRATED +count - armor value (default 50, max of 100) +if count < 0, the armor value will be a random number between 0 and count*-1 +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_equip_flashpack (0 .3 .3) (-5 -6 -9) (5 6 9) x x x START_CRATED +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_equip_c4 (0 .3 .3) (-2 -12 -11) (16 12 13) x x x START_CRATED +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_equip_light_goggles (0 .3 .3) (-5 -7 -4) (5 2 1) x x x START_CRATED +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_equip_claymore (0 .3 .3) (-4 -13 -6) (3 11 8) x x x START_CRATED +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_equip_medkit (0 .3 .3) (-11 -8 -0) (11 9 10) x x x START_CRATED +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_equip_grenade (0 .3 .3) (-3 -4 0) (4 4 8) x x x START_CRATED +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_ctf_flag (0 .3 .3) (-4 -13 -6) (3 11 8) x x x START_CRATED +count - team counter - 1 or 2 +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_health_small (0 .3 .3) (-7 -7 0) (7 7 7) x x x START_CRATED +count - health restored on pickup (default 10) +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED item_health_large (0 .3 .3) (-18 -4 -0) (18 4 26) x x x START_CRATED +count - health restored on pickup (default 50) +START_CRATED -- smash open a crate to get at this pickup +*/ + + +/*QUAKED light_generic_alley_wall (0 1 0) (-48 -41 -53)(38 41 21) START_OFF VULNERABLE MOVEABLE +A light on the end of a long horizontal pole which should be mounted to a wall. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED light_generic_alley_wall_old (0 1 0) (-28 -4 -13) (4 4 9) START_OFF VULNERABLE MOVEABLE +An old-fashioned lamp on an arm which is to be mounted on a wall. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED light_generic_caged (0 1 0) (-3 -3 -10) (3 3 5) START_OFF VULNERABLE MOVEABLE +A small square light which hangs from the wall. It's in a metal cage. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED light_generic_chandelier (0 1 0) (-24 -21 -0) (25 21 51) START_OFF VULNERABLE MOVEABLE +A chandelier light which hangs from the ceiling. +------ KEYS ------ +Light - how bright it is (default 300) +Skin - +0 - gold chandelier +1 - iron chandelier +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +- Swings and spins when shot +*/ + + +/*QUAKED light_generic_desk_lamp (0 1 0) (-6 -6 -5) (6 6 5) START_OFF VULNERABLE MOVEABLE +A small desk lamp. +------ KEYS ------ +Light - how bright it is (default 300) +Skin - skin of model +0 - bronze +1 - silver +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - will move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED light_generic_emergency (0 1 0) (-6 -6 -5) (6 6 5) START_OFF VULNERABLE MOVEABLE +A flashing emergency light +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - will move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED light_generic_emergency_blue (0 1 0) (-6 -6 -5) (6 6 5) START_OFF VULNERABLE MOVEABLE +A flashing blue emergency light +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - will move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED light_generic_halfshell (0 1 0) (-2 -7 -2) (2 7 2) START_OFF VULNERABLE MOVEABLE +An old-fashioned lamp on an arm which is to be mounted on a wall. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED light_generic_hanging (0 1 0) (-10 -10 -6) (10 10 44) START_OFF VULNERABLE MOVEABLE +Square light hanging from a cord. Attach to ceiling. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - will move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +- Swings when shot +*/ + + +/*QUAKED light_generic_lantern (0 1 0) (-7 -6 -22) (7 6 22) START_OFF VULNERABLE MOVEABLE +A hanging Chinese lantern. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - will move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +- Swings when shot +*/ + + +/*QUAKED light_generic_lantern2 (0 1 0) (-8 -7 -9) (4 7 8) START_OFF VULNERABLE MOVEABLE +A square light attached to the wall by a small pole. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - will move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED light_generic_lantern3 (0 1 0) (-7 -7 -13) (4 7 8) START_OFF VULNERABLE MOVEABLE +A square light attached to the wall by a small pole. Low polycount. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - will move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED light_generic_military_door (0 1 0) (-6 -6 -2) (6 9 3) START_OFF VULNERABLE MOVEABLE +A little bent light to be hung above doors. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +--------SPAWNFLAGS---------- +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, won't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED light_generic_military_door_outside (0 1 0) (-19 -22 -8) (19 27 10) START_OFF VULNERABLE MOVEABLE +A big bent light to be hung above doors. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, won't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED light_generic_shop (0 1 0) (-19 -23 -4) (19 22 32) START_OFF VULNERABLE MOVEABLE +Rectangular light hanging from two poles. Attach to ceiling. +------ KEYS ------ +Light - how bright it is (default 300) +Skin - +0 - normal +1 - wire mesh over it +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +--------SPAWNFLAGS---------- +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +- Swings when shot +*/ + + +/*QUAKED light_generic_street_modern (0 1 0) (-88 -75 -218) (75 75 17) START_OFF VULNERABLE MOVEABLE +A tall street light. Sits on ground. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED light_generic_street_old (0 1 0) (-7 -7 -48) (7 7 48) START_OFF VULNERABLE MOVEABLE +An old fashioned street light (vertical pole/lamp) +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED light_generic_lamp_hang (0 1 0) (-6 -7 -10) (5 7 15) START_OFF VULNERABLE MOVEABLE TABLE NOANIM +A train swinging lamp. Can be hung from ceiling or placed on a table. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +TABLE - can be placed on a table +NOANIM - won't animate +------ SPECIALS ------ +- If targeted, will toggle between on and off. +- Swings when shot +*/ + + +/*QUAKED light_generic_candelabra (0 1 0) (-11 -11 -55) (11 11 23) START_OFF VULNERABLE MOVEABLE +Tall candelabra, intended for floor placement in only the finest Transylvanian homes. +------ KEYS ------ +Skin - +0 - gold candelabra +1 - iron candelabra +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, won't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED light_generic_candelabra_small (0 1 0) (-10 -5 -17) (10 5 0) START_OFF VULNERABLE MOVEABLE +Candelabra for a table +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ + + +/*QUAKED func_group (0 0 0) ? +Used to group brushes together just for editor convenience. +*/ + + +/*QUAKED func_areaportal (0 0 0) ? + +This is a non-visible object that divides the world into +areas that are seperated when this portal is not activated. +Usually enclosed in the middle of a door. +*/ + + +/*QUAKED path_corner (.5 .3 0) (-8 -8 -8) (8 8 8) TELEPORT WAITONECYCLE FACEPLAYER +WAITONECYCLE: ignores wait time, goes through waitactions once +FACEPLAYER: will face the player forever, once it reaches this point +Target: next path corner +Pathtarget: gets used when an entity that has + this path_corner targeted touches it +MoveAction: animation to play while moving to the next path_corner +Waitaction1: animations to play while waiting +Waitaction2: +Waitaction3: +Waitaction4: +Waitaction5: +Waitaction6: +Wait: time to wait (-1 for forever) +*/ + + +/*QUAKED point_combat (0.5 0.3 0) (-8 -8 -8) (8 8 8) Hold WAITONECYCLE FACEPLAYER +Makes this the target of a monster and it will head here +when first activated before going after the activator. If +hold is selected, it will stay here. + +WAITONECYCLE: ignores wait time, goes through waitactions once +FACEPLAYER: will face the player forever, once it reaches this point +Target: next point_combat +Pathtarget: gets used when an entity that has + this path_corner targeted touches it +MoveAction: animation to play while moving to the next point_combat +Waitaction1: animations to play while waiting +Waitaction2: +Waitaction3: +Waitaction4: +Waitaction5: +Waitaction6: +Wait: time to wait (-1 for forever) +*/ + + +/*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4) +Used as a positional target for spotlights, etc. +*/ + + +/*QUAKED info_notnull (0 0.5 0) (-4 -4 -4) (4 4 4) +Used as a positional target for lightning. +*/ + + +/*QUAKED light (0 1 0) (-8 -8 -8) (8 8 8) START_OFF +Non-displayed light. +Default light value is 300. +Style - the light +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning + +If targeted, will toggle between on and off. +Default _cone value is 10 (used to set size of light for spotlights) +*/ + + +/*QUAKED func_wall (0 .5 .8) ? TRIGGER_SPAWN TOGGLE START_ON ANIMATED ANIMATED_FAST +This is just a solid wall if not inhibited + +TRIGGER_SPAWN the wall will not be present until triggered + it will then blink in to existance; it will + kill anything that was in it's way + +TOGGLE only valid for TRIGGER_SPAWN walls + this allows the wall to be turned on and off + +START_ON only valid for TRIGGER_SPAWN walls + the wall will initially be present +*/ + + +/*QUAKED func_object (0 .5 .8) ? TRIGGER_SPAWN ANIMATED ANIMATED_FAST +This is solid bmodel that will fall if it's support it removed. +*/ + + +/*QUAKED target_character (0 0 1) ? +used with target_string (must be on same "team") +"count" is position in the string (starts at 1) +*/ + + +/*QUAKED target_string (0 0 1) (-8 -8 -8) (8 8 8) +*/ + + +/*QUAKED func_clock (0 0 1) (-8 -8 -8) (8 8 8) TIMER_UP TIMER_DOWN START_OFF MULTI_USE +target a target_string with this + +The default is to be a time of day clock + +TIMER_UP and TIMER_DOWN run for "count" seconds and the fire "pathtarget" +If START_OFF, this entity must be used before it starts + +"style" 0 "xx" + 1 "xx:xx" + 2 "xx:xx:xx" +*/ + + +/*QUAKED test_model (1 .5 0) (-16 -16 -16) (16 16 16) +set model to the name of the model to show +*/ + + +/*QUAKED func_breakable_brush (0 .5 .8) ? INVINCIBLE PAINCHUNKS DEKKER CANT_DMG_IN_CAMERA_MODE +A breakable brush which has chunk size and type based upon the size and type of the brush. +--------SPAWNFLAGS---------- +INVINCIBLE - intended to be used in conjunction with triggers +PAINCHUNKS - spawn debris when hurt (used for windows that shatter when first shot) +DEKKER - only damageable by Dekker, will do damage to folks in the area when breaking +CANT_DMG_IN_CAMERA_MODE -- you can damage this brush normally but it's invincible when player is viewing thru a camera +-------KEYS----------------- +count - # of debris chunks to throw + +mass - size of chunks to throw +1 - small chunks +2 - medium chunks +3 - big chunks + +health - defaults to 100. The "dmg" key/value pair will set how much damage will be done on +its destruction (defaults to 0). The "volume" key/value pair will determine the radius of the +damage. Damage falls off linearly to zero at this radius. Volume will default to whatever +"dmg" is set to. + +message - text to print when it dies + +material - defines the type of debris to create when the brush breaks + 0 - MAT_NONE, (defaults to stone) + 1 - MAT_BRICK_BROWN, + 2 - MAT_BRICK_DBROWN, + 3 - MAT_BRICK_LBROWN, + 4 - MAT_BRICK_LGREY, + 5 - MAT_BRICK_DGREY, + 6 - MAT_BRICK_RED, + + 7 - MAT_GLASS, + + 8 - MAT_METAL_LGREY, + 9 - MAT_METAL_DGREY, +10 - MAT_METAL_RUSTY, +11 - MAT_METAL_SHINY, + +12 - MAT_ROCK_BROWN, +13 - MAT_ROCK_LBROWN, +14 - MAT_ROCK_DBROWN, +15 - MAT_ROCK_LGREY, +16 - MAT_ROCK_DGREY, + +17 - MAT_WOOD_LBROWN, +18 - MAT_WOOD_DBROWN, +19 - MAT_WOOD_LGREY, +20 - MAT_WOOD_DGREY, + +21 - MAT_WALL_BLACK, +22 - MAT_WALL_BROWN, +23 - MAT_WALL_DARKBROWN, +24 - MAT_WALL_LIGHTBROWN, +25 - MAT_WALL_GREY, +26 - MAT_WALL_DARKGREY, +27 - MAT_WALL_LIGHTGREY, +28 - MAT_WALL_GREEN, +29 - MAT_WALL_ORANGE, +30 - MAT_WALL_RED, +31 - MAT_WALL_WHITE, +32 - MAT_ROCK_FLESH, +33 - MAT_WALL_STRAW, +34 - MAT_ROCK_SNOW, + + +surfaceType - defines what sound to use when the brush breaks or takes damage +0 - defaults to stone... sorry Jersey :{ +14 - wood +17 - stone +28 - metal +35 - blood (how does blood break? I don't know.) +37 - glass +40 - paper + +*/ + + +/*QUAKED func_trigger_brush (0 .5 .8) ? NO_DRAW START_OFF +A brush that can take damage to a point, then call its triggers. + +Health defaults to 100. + +*/ + + +/*QUAKED func_score (1 0 0) (-8 -8 -8) (8 8 8) +Awards certain amount of score to a player +-----KEYS----- +count - amount awarded to player +*/ + + +/*QUAKED func_camerashake (0 .5 .8) (-8 -8 -8) (8 8 8) +Shakes the camera, centered on where the func is +"count" = intensity (from 0 to 100) - default is 30 +"health" = radius of shaking (will fall off over distance) - default is 300 +"delay" = the duration of the shaking (in seconds) - default is 3 +"style" = makes a sound as it shakes the camera - 0 is default + 1 == Dull explosion +*/ + + +/*QUAKED _region (0 1 1) ? + +For FOG Areas: + fog_mode (0 = normal, 1 = additive) + fog_start (0.0 to infinity) (4.0 recommended) + fog_end (fog_start to infinity) (400.0 recommended) + fog_height (fog_start to infinity) + fog_density (0.0 to 1.0) + fog_density_range (-1.0 to 1.0) + fog_color (vector RGB) + fog_flags (1 = PULSATE, 2 = HEIGHT, 4 = MAP, 8 = ANTI) + fog_time (speed) + fog_distance_cull (distance for culling fog areas) + fog_chop_size (size bsp should break up (128 default) ) +*/ + + +/*QUAKED func_fade (0 .5 .8) (-8 -8 -8) (8 8 8) REVERSE +"color" color to fade to in red green blue format, from 0.0 to 1.0, (with 1.0 being white like "1.0 1.0 1.0") +"delay" the length of time it'll take to fully fade -- defaults to 5 NOTE: do NOT set this +to zero! If you want instantaneous, use .1 + +Reverse flag fades from the color to "normal" + +*/ + + +/*QUAKED misc_newyork_burned_car (1 .5 0) (-91 -33 -25) (91 33 25) INVULNERABLE NOPUSH x x x x FLUFF +Burned out car. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_newyork_gumball (1 .5 0) (-8 -8 -19) (8 8 19) INVULNERABLE NOPUSH x x x x FLUFF +A gumball machine +------ KEYS ------ +Skin - +0 - intact, full of gumballs +1 - broken, no gumballs +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- when shot gumballs come out +*/ + + +/*QUAKED misc_newyork_trashcan (1 .5 0) (-10 -10 -19) (10 10 20) INVULNERABLE NOPUSH x x x x FLUFF +A "Pitch In" trash can +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- when shot on upper half, the top spins and generates papers +*/ + + +/*QUAKED misc_newyork_trash_pile (1 .5 0) (-14 -8 0) (5 14 14) INVULNERABLE NOPUSH x x x x FLUFF +Several beer/oil cans and a gas can. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- when shot one of the cans flys off +*/ + + +/*QUAKED misc_siberia_carton1 (1 .5 0) (-15 -15 -15) (15 15 15) INVULNERABLE NOPUSH x x x x FLUFF +A funky looking carton. 30 x 30 x 30 +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_siberia_carton2 (1 .5 0) (-8 -8 -7) (8 8 7) INVULNERABLE NOPUSH x x x x FLUFF +A square carton. 16 x 16 x 14 +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_siberia_carton3 (1 .5 0) (-3 -3 -4) (3 3 4) INVULNERABLE NOPUSH x x x x FLUFF +A tiny carton - looks like a soup thermos. 6 x 6 x 8 +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_siberia_carton4 (1 .5 0) (-10 -10 -15) (10 10 15) INVULNERABLE NOPUSH x x x x FLUFF +A barrel shaped carton. 20 x 20 x 30 +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_siberia_icicles (1 .5 0) (-1 -41 -41) (1 41 41) INVULNERABLE NOPUSH NOANIMATE x x x FLUFF +Icicles +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't be pushed +NOANIMATE - won't animate +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_siberia_flag (1 .5 0) (-16 -1 -1) (1 1 79) INVULNERABLE NOPUSH x x x x FLUFF +A flag +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_siberia_roadflare (1 .5 0) (-2 -2 -2) (2 2 2) INVULNERABLE NOPUSH STARTOFF BLUE x x FLUFF +A flaming, sputtering road flare +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't be pushed +FLUFF - won't show if gl_pictip is set +BLUE - it'll be blue. defaults to red if this flag not set +*/ + + +/*QUAKED misc_siberia_searchlight (1 .5 0) (-10 -10 -8) (10 10 12) INVULNERABLE NOPUSH STARTOFF x x x FLUFF +A small search light +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_siberia_snowcat (1 .5 0) (-91 -66 -33) (91 66 58) INVULNERABLE NOPUSH LIGHTS x x x FLUFF +Large Immobile Snowcat with turret. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't be pushed +LIGHTS - turns on headlights +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED func_ambientset (0 .5 .8) (-8 -8 -8) (8 8 8) +sets the current world ambient sound set to be played: +set soundName to be the name of the sound group you would like to use... +*/ + + +/*QUAKED func_musicControl (0 .5 .8) (-8 -8 -8) (8 8 8) +sets the current state of music... +"sounds" + -2 = turn music off + -1 = let game take over music again + 0-255 = ID number of specific song to be played... +*/ + + +/*QUAKED environ_soundgen (0 1 0) (-12 -12 -12) (12 12 12) START_OFF +"soundName" name of the soundset to use... +*/ + + +/*QUAKED worldspawn (0 0 0) ? + +Only used for the world. +"sky" environment map name +"skyaxis" vector axis for rotating sky +"skyrotate" speed of rotation in degrees/second +"sounds" music cd track number +"gravity" 800 is default gravity +"message" text to print at user logon +"musicset" filename of the musicset for this level +"terrainset" filename of the terrainset for this level +"distcull" sets the maximum distance for vis (100 is good) +"chop" sets the surface patch size for lighting +"chopsky" sets the surface patch size for sky +"chopwarp" sets the surface patch size for warp surfaces +"script" filename of a script to run at map loadtime +"raffel" set this to 1 if you want your map to run slower +"jersey" set this to 1 to make all enemies talk funny +"screeneffect" sets the style of general screen effect +"spawn1" +"spawn2" +"spawn3" types of guys that will be spawned into the world from combat +"spawnfrequency" 0..1 (from no guys to very likely) - default is 0 +"noweapons" for levels like the armory where the player gets no weapons. set to 1 for no weapons. +"setweapons" set the player's inventory. For TRN1 and TSR1 use 1. overridden by noweapons. +"maxDeadHostages" number of dead hostages allowed before you fail this mission +"ambientset" filename of the ambient set for this level +"startmusic" set if you want to force a specific song at startup +"forceHUD" set this for the tutorial level. draws HUD even with no weapon. +"weaponsAvailable" magic number for precaching weapons. ask a programmer. (68 for tutorial level) +*/ + + +/*QUAKED target_temp_entity (1 0 0) (-8 -8 -8) (8 8 8) +Fire an origin based temp entity event to the clients. +"style" type byte +*/ + + +/*QUAKED target_speaker (1 0 0) (-8 -8 -8) (8 8 8) looped-on looped-off reliable +"noise" wav file to play +"attenuation" +-1 = none, send to whole level +1 = normal fighting sounds +2 = idle sound level +3 = ambient sound level +"volume" 0.0 to 1.0 + +Normal sounds play each time the target is used. The reliable flag can be set for crucial voiceovers. + +Looped sounds are always atten 3 / vol 1, and the use function toggles it on/off. +Multiple identical looping sounds will just increase volume without any speed cost. +*/ + + +/*QUAKED target_help (1 0 1) (-16 -16 -24) (16 16 24) help1 +When fired, the "message" key becomes the current personal computer string, and the message light will be set on all clients status bars. +*/ + + +/*QUAKED target_secret (1 0 1) (-8 -8 -8) (8 8 8) +Counts a secret found. +These are single use targets. +*/ + + +/*QUAKED target_goal (1 0 1) (-8 -8 -8) (8 8 8) +Counts a goal completed. +These are single use targets. +*/ + + +/*QUAKED target_explosion (1 0 0) (-8 -8 -8) (8 8 8) +Spawns an explosion temporary entity when used. + +"delay" wait this long before going off +"dmg" how much radius damage should be done, defaults to 0 +*/ + + +/*QUAKED target_changelevel (1 0 0) (-8 -8 -8) (8 8 8) +Changes level to "map" when fired +*/ + + +/*QUAKED target_splash (1 0 0) (-8 -8 -8) (8 8 8) +Creates a particle splash effect when used. + +Set "sounds" to one of the following: + 1) sparks + 2) blue water + 3) brown water + 4) slime + 5) lava + 6) blood + +"count" how many pixels in the splash +"dmg" if set, does a radius damage at this location when it splashes + useful for lava/sparks +*/ + + +/*QUAKED target_spawner (1 0 0) (-8 -8 -8) (8 8 8) +Set target to the type of entity you want spawned. +Useful for spawning monsters and gibs in the factory levels. + +For monsters: + Set direction to the facing you want it to have. + +For gibs: + Set direction if you want it moving and + speed how fast it should be moving otherwise it + will just be dropped +*/ + + +/*QUAKED target_crosslevel_trigger (.5 .5 .5) (-8 -8 -8) (8 8 8) trigger1 trigger2 trigger3 trigger4 trigger5 trigger6 trigger7 trigger8 +Once this trigger is touched/used, any trigger_crosslevel_target with the same trigger number is automatically used when a level is started within the same unit. It is OK to check multiple triggers. Message, delay, target, and killtarget also work. +*/ + + +/*QUAKED target_crosslevel_target (.5 .5 .5) (-8 -8 -8) (8 8 8) trigger1 trigger2 trigger3 trigger4 trigger5 trigger6 trigger7 trigger8 +Triggered by a trigger_crosslevel elsewhere within a unit. If multiple triggers are checked, all must be true. Delay, target and +killtarget also work. + +"delay" delay before using targets if the trigger has been activated (default 1) +*/ + + +/*QUAKED target_laser (0 .5 .8) (-8 -8 -8) (8 8 8) START_ON RED GREEN BLUE YELLOW ORANGE FAT +When triggered, fires a laser. You can either set a target +or a direction. +*/ + + +/*QUAKED target_lightramp (0 .5 .8) (-8 -8 -8) (8 8 8) TOGGLE +speed How many seconds the ramping will take +message two letters; starting lightlevel and ending lightlevel +*/ + + +/*QUAKED target_earthquake (1 0 0) (-8 -8 -8) (8 8 8) +When triggered, this initiates a level-wide earthquake. +All players and monsters are affected. +"speed" severity of the quake (default:200) +"count" duration of the quake (default:5) +*/ + + +/*QUAKED misc_tokyo_bowl (1 .5 0) (-5 -5 -1) (5 5 2) INVULNERABLE NOPUSH x x x x FLUFF +A small bowl +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_tokyo_fan (1 .5 0) (0 -9 -4) (1 10 6) INVULNERABLE NOPUSH x x x x FLUFF +A small hand held fan +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_tokyo_gong (1 .5 0) (-2 -29 -33) (6 29 35) INVULNERABLE NOPUSH x x x x FLUFF +Large gold gong. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- swings when shot +*/ + + +/*QUAKED misc_tokyo_plant_bonsai (1 .5 0) (-5 -10 -8) (5 10 8) INVULNERABLE NOPUSH x x x x FLUFF +A small bonsai tree +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_tokyo_samurai_suit (1 .5 0) (-6 -18 -37) (9 16 37) INVULNERABLE NOPUSH x x x x FLUFF +A samurai suit of armor, man sized. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_tokyo_samurai_suit_small (1 .5 0) (-3 -8 -17) (4 7 17) INVULNERABLE NOPUSH x x x x FLUFF +A doll-sized samurai suit of armor. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_tokyo_shoe (1 .5 0) (-6 -3 -2) (6 3 2) INVULNERABLE NOPUSH x x x x FLUFF +a brown sandal +------ SPAWNFLAGS ------- +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_tokyo_stone_light (1 .5 0) (-15 -13 -14) (15 13 14) INVULNERABLE NOPUSH x x x x FLUFF +A waist high column of stone +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_exploding_heli (1 .5 0) (-280 -280 -50) (280 280 70) INVULNERABLE NOPUSH START_OFF +NOT TO BE USED!!!!!!!! +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +*/ + + +/*QUAKED trigger_multiple (.5 .5 .5) ? MONSTER NOT_PLAYER TRIGGERED USEKEY +Variable sized repeatable trigger. Must be targeted at one or more entities. +If "delay" is set, the trigger waits some time after activating before firing. +"wait" : Seconds between triggerings. (.2 default) +sounds +1)the "talk" beep +2)the "talk" beep +3)the "talk" beep + +set "message" to text string +"sp_message" is for a string package ID (numerical) + +If they are NOT targeted, then there are three flags you need to be aware of: + +The MONSTER flag must be set if you want a monster to be able to activate the trigger by walking into it. + +The NO_PLAYER flag must be set if you do NOT want the player to be able to activate the + trigger by walking into it. + +The TRIGGERED flag allows a trigger to be disabled until something else activates it. +After this activation, the trigger will be activated when something (depending on how +the first two flags are set) steps into it. Since this flag requires the trigger to +have a targetname, this flag will obviously override the "I can't be activated by anything +but my targeter" condition once it has been triggered. +*/ + + +/*QUAKED trigger_once (.5 .5 .5) ? MONSTER NOT_PLAYER TRIGGERED USEKEY +Triggers once, then removes itself. +You must set the key "target" to the name of another object in the level that has a matching "targetname". + +The MONSTER flag must be set if you want a monster to be able to activate the trigger by walking into it. + +The NO_PLAYER flag must be set if you do NOT want the player to be able to activate the + trigger by walking into it. + +If TRIGGERED, this trigger must be triggered before it is live. + +sounds + 1) secret + 2) beep beep + 3) large switch + 4) + +"message" string to be displayed when triggered +"sp_message" is for a string package ID (numerical) +*/ + + +/*QUAKED trigger_relay (.5 .5 .5) (-8 -8 -8) (8 8 8) +This fixed size trigger cannot be touched, it can only be fired by other events. +*/ + + +/*QUAKED trigger_key (.5 .5 .5) (-8 -8 -8) (8 8 8) +A relay trigger that only fires it's targets if player has the proper key. +Use "item" to specify the required key, for example "key_data_cd" +*/ + + +/*QUAKED trigger_counter (.5 .5 .5) ? nomessage +Acts as an intermediary for an action that takes multiple inputs. + +If nomessage is not set, t will print "1 more.. " etc when triggered and "sequence complete" when finished. + +After the counter has been triggered "count" times (default 2), it will fire all of it's targets and remove itself. +*/ + + +/*QUAKED trigger_countdown (.5 .5 .5) ? START_OFF ANY_USE REUSEABLE +Produces a timer on screen that counts backwards. When done it fires all of its targets and removes itself. Is activated by touch or use. +------ KEYS ------ +count - # to start counting backwards from (default 10, can be MUCH bigger than 255) +------ SPAWNFLAGS ------ +START_OFF - trigger is turned off so it can't be touched (use trigger_activate to make 'touchable') +*/ + + +/*QUAKED trigger_always (.5 .5 .5) (-8 -8 -8) (8 8 8) +This trigger will always fire. It is activated by the world. +*/ + + +/*QUAKED trigger_activate (.5 .5 .5) ? +Will make a trigger active if it is inactive, or inactive if it's active +*/ + + +/*QUAKED trigger_push (.5 .5 .5) ? PUSH_ONCE START_OFF +Pushes the player +"speed" defaults to 1000 + +PUSH_ONCE you guessed it. only works once. +START_OFF 'use' this trigger to turn on the pushing. 'use' it again to turn it off. rinse. repeat. +*/ + + +/*QUAKED trigger_hurt (.5 .5 .5) ? START_OFF x SILENT NO_PROTECTION SLOW PLAYER_ONLY IGNORE_ARMOR +Any entity that touches this will be hurt. +------ KEYS ------ +"dmg" - points of damage per server frame (default 5) whole numbers only +------ SPAWNFLAGS ------ +START_OFF - won't fire until trigger_activate is used +x - not in use +SILENT - does nothing yet +NO_PROTECTION - *nothing* stops the damage +SLOW - changes the damage rate to once per second +PLAYER_ONLY - trigger will only affect player +IGNORE_ARMOR - this damage ignores armor +*/ + + +/*QUAKED trigger_gravity (.5 .5 .5) ? +Changes the touching entites gravity to +the value of "gravity". 1.0 is standard +gravity for the level. +*/ + + +/*QUAKED trigger_monsterjump (.5 .5 .5) ? +Walking monsters that touch this will jump in the direction of the trigger's angle +"speed" default to 200, the speed thrown forward +"height" default to 200, the speed thrown upwards +*/ + + +/*QUAKED trigger_useable (.5 .5 .5) ? +A trigger that fires its targets only when the player hits the use key. +----------KEY--------- +targetname -- name of a sound to be played when the trigger is used. make sure +you put the ".wav" at the end +*/ + + +/*QUAKED trigger_heal (.5 .5 .5) ? +A trigger that heals the user only when the player hits the use key. +----------KEY--------- +health -- the number of points to be healed (defaults to 15) +*/ + + +/*QUAKED trigger_movedown (.5 .5 .5) ? +A trigger that forces thing downward. Meant to be used in conjunction with pushkill brush. +*/ + + +/*QUAKED trigger_keep_using (.5 .5 .5) ? +A trigger that keeps firing as long as the player hits the use key and keeps touching it. +*/ + + +/*QUAKED trigger_safezone (.5 .5 .5) ? START_OFF +Using this entity will toggle whether it hides players or not. +------ SPAWNFLAGS ------ +START_OFF - won't hide anybody until trigger is used +*/ + + +/*QUAKED trigger_sound (.5 .5 .5) (-4 -4 -4) (4 4 4) +Will trigger target when noisy things occur nearby (radius for activation is set by health (defaults to 128)) +target will set what it should trigger, of course +*/ + + +/*QUAKED trigger_objectives (.5 .5 .5) ? START_OFF +Using this entity will toggle the trigger enabled/disabled. When enabled, the trigger will +display a "check your objectives screen" message. +------ SPAWNFLAGS ------ +START_OFF - won't display anything until used +*/ + + +/*QUAKED misc_uganda_african_tree (1 .5 0) (-42 -77 -76) (42 77 76) INVULNERABLE NOPUSH x x x x FLUFF +Tree with funky sprite-ish foliage. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_uganda_chainsaw (1 .5 0) (-14 -4 -5) (14 4 5) INVULNERABLE NOPUSH RUNNING x x x FLUFF +a chainsaw +------ KEYS ------ +Skin : +0 - very dirty +1 - mildly dirty +2 - clean +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +RUNNING - shake and smoke +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- will smoke if running flag is set +*/ + + +/*QUAKED misc_uganda_cow (1 .5 0) (-13 -38 -29) (13 43 28) INVULNERABLE NOPUSH x x x x FLUFF +A cow. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_uganda_cow_head (1 .5 0) (-10 -13 -8) (10 13 8) INVULNERABLE NOPUSH BLOOD_POOL x x x FLUFF +A severed cow head +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +BLOOD_POOL - places a blood pool underneath +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_uganda_gore_pile (1 .5 0) (-26 -23 -3) (26 23 3) INVULNERABLE NOPUSH x x x x FLUFF +Heart, intestines, and assorted gore in a pile. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- splatters blood when shot +*/ + + +/*QUAKED misc_uganda_gutted_cow (1 .5 0) (-15 -33 -99) (27 25 1) INVULNERABLE NOPUSH BLOOD_POOL BLOOD_DRIP SWING x FLUFF +A gutted cow hanging by its leg from a chain. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +BLOODPOOL - blood underneath +BLOODDRIP - drips blood +SWING - gentle swing around +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- swings when shot +*/ + + +/*QUAKED misc_uganda_hook (1 .5 0) (-1 -7 -14) (1 1 0) INVULNERABLE NOPUSH x x x x FLUFF +a large meathook meant to hang from the ceiling +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_uganda_nuke (1 .5 0) (-31 -28 -24) (30 14 25) INVULNERABLE NOPUSH x x x x FLUFF +a nuclear bomb +--------SPAWNFLAGS---------- +INVULNERABLE - N/A can't be damaged. +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_uganda_rocket_core (1 .5 0) (-55 -14 -14) (55 14 14) INVULNERABLE NOPUSH x x x x FLUFF +The payload compartment of a rocket +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_uganda_rocket_engine (1 .5 0) (-76 -28 -27) (76 34 32) INVULNERABLE NOPUSH x x x x FLUFF +Rocket engine without the metal skin +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_uganda_side_o_beef (1 .5 0) (-13 -16 -55) (19 17 48) INVULNERABLE NOPUSH SWING x x x FLUFF +Dressed side of beef which hangs from ceiling +------ KEYS ------ +skin : +0 - normal +1 - frozen +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +SWING - swings gently +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- swings when shot +*/ + + +/*QUAKED misc_uganda_train_bumper (1 .5 0) (-32 -15 -16) (32 15 10) INVULNERABLE NOPUSH x x x x FLUFF +A train bumper +------ SPAWNFLAGS ------ +INVULNERABLE - N/A can't be damaged. +NOPUSH - N/A can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED misc_uganda_train_coupling (1 .5 0) (-31 -11 -5) (31 11 5) INVULNERABLE NOPUSH x x x x FLUFF +A train coupling +------ SPAWNFLAGS ------ +INVULNERABLE - N/A can't be damaged. +NOPUSH - N/A can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ + + +/*QUAKED dm_KOTH_targetzone (0 1 0) ? START_OFF +*/ + + +/*QUAKED spawner (0 1 0) (-16 -16 -32) (16 16 32) START_OFF SINGLE_TYPE +"soundName" door sound to be played when spawner is activated +"count" number of ents to be spawned at a single time (default 1) +"delay" frequency to spawn an ent in normal circumstances (default 30) +"wait" frequency to spawn an ent in triggered/active circumstances (default 10) +"mass" maximum number of ents owned by this trigger that can be in the world at once (default 1) ... -1 is unlimited +"health" number of items to spawn before removing - -1 is unlimited (default -1) +"lip" minimum radius to spawn guys in when you're not facing the spawner (defaults to 450) +"spawn1" +... +"spawn3" name of the ent to spawn from the ent list +*/ + + +/*QUAKED spawner_monster (0 1 0) (-16 -16 -32) (16 16 32) START_OFF SINGLE_TYPE TARGET_PLAYER IGNORE_VISIBLITY IGNORE_LIMITS +"target" if this is set, this will be run when the spawner is out of guys +"soundName" door sound to be played when spawner is activated +"count" number of ents to be spawned at a single time (default 1) +"delay" frequency to spawn an ent in normal circumstances (default 30) - set to -1 to NEVER spawn in non-alert mode +"wait" frequency to spawn an ent in triggered/active circumstances (default 10) +"mass" maximum number of ents owned by this trigger that can be in the world at once (default 1) ... -1 is unlimited +"health" number of items to spawn before removing - -1 is unlimited (default -1) +"lip" minimum radius to spawn guys in when you're not facing the spawner (defaults to 450) +"spawn1" +... +"spawn3" name of the ent to spawn from the ent list + +TARGET_PLAYER makes spawned guys default to attacking the player immediately +*/ + + +/*QUAKED spawner_boosterpack (0 1 0) (-16 -16 -32) (16 16 32) +"health" number of items to spawn before removing - default is 8 +"spawn1" +... +"spawn3" name of the ent to spawn from the ent list +*/ + + +/*QUAKED m_x_romulan (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +*/ + + +/*QUAKED m_x_rottweiler (1 .5 0) (-32 -32 -23) (32 32 14) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +an animal +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this guy dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_husky (1 .5 0) (-33 -33 -28) (33 33 16) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +an animal +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_germanshep (1 .5 0) (-33 -33 -28) (33 33 16) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +an animal +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_raiderdog (1 .5 0) (-33 -33 -28) (33 33 16) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +an animal +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_bull (1 .5 0) (-30 -14 -33) (56 14 26) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +an animal +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_sib_mtrooper1a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_sib_mtrooper1b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_sib_mtrooper2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_sib_mguard1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_sib_fguard2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_sib_mguard3 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_sib_mguard4 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_sib_mcleansuit (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_sib_mmechanic (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_sib_escientist1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_sib_fscientist2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_sib_eofficer (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_afr_ecommander (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_afr_msniper (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_afr_msoldier1a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_afr_msoldier1b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_afr_msoldier2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_afr_msoldier3 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_afr_eworker (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_afr_mbrute (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_afr_mrocket (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_kos_mgrunt1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_kos_mgrunt2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_kos_mgrunt3 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_kos_msniper1a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_kos_msniper1b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_kos_mcomtroop (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_kos_eofficer (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_kos_mbrute1a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_kos_mbrute1b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_kos_mmechanic (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_kos_mrebel (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_kos_mklaleader (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_kos_erefugee (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_tok_mman1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_tok_mman2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_tok_mhench1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_tok_mhench2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_tok_mkiller (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_tok_fassassin (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_tok_mninja (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_tok_mbrute (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_tok_fwoman1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_tok_fwoman2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_msoldier2b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_mrepguard1b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_mcommander (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_mbrute1a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_mbrute1b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_mrocket (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_msaddam (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_fwoman1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_fwoman2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_mman2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_mbodyguard (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_mpolice (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_msoldier1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_msoldier2a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_mrepguard1a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_eofficer (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_eman1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_irq_moilworker (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_cas_mraider1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_cas_mraider2a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_cas_mraider2b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_cas_mbrute (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_cas_ffemale (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_cas_mrocket (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_nyc_mpolitician (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_nyc_etourist (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_nyc_mpunk (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_nyc_epunk (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_nyc_eskinhead3 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_nyc_mskinhead1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_nyc_mskinhead2a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_nyc_mskinhead2b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_nyc_fskinchick (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_nyc_ebum (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_nyc_estockbroker (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_nyc_mswat (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_nyc_mswatleader (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_nyc_fwoman (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_mcharacter (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_mcharacter_snow (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_mcharacter_desert (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_mraiderboss1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human with desert eagle +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_mraiderboss2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human with mpg +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_ftaylor (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_mskinboss (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_mmerc (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_mhurtmerc (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +hawk, all beat up +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_msam (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE FACE_PLAYER +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. +FACE_PLAYER: always faces the player. set wait to 0 to turn off, 1 to turn back on. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_miraqboss (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + + +/*QUAKED m_x_chopper_black (1 .5 0) (-280 -280 -50) (280 280 70) IN_AIR ONDIE_HEAD2SPAWN INFINITE_ROCKETS DEBUG_WAYPOINTS ATTACK_CHOPPER + + This is the version that uses the class-based AI code. + +--------SPAWNFLAGS---------- +IN_AIR: already in the air, no pad exists (so don't try landing it!!) +ONDIE_HEAD2SPAWN: when damaged to death, plummet towards spawn pos before exploding +INFINITE_ROCKETS: go on, guess. +DEBUG_WAYPOINTS: enable this flag if you want to see waypoints/volumes/world dims drawn in the air +ATTACK_CHOPPER: this heli will become a Hind attack chopper with a certain script command +ALWAYS_SEEN draws no matter what + +--------KEYS------------ +Volume - aggressiveness. You *must* fill this in (values 0 to 10). 10's good for Tokyo, 3 is ok for Train. +*/ + + +/*QUAKED m_x_chopper_green (1 .5 0) (-280 -280 -50) (280 280 70) IN_AIR ONDIE_HEAD2SPAWN INFINITE_ROCKETS DEBUG_WAYPOINTS ATTACK_CHOPPER ALWAYS_SEEN + + This is the version that uses the class-based AI code. + +--------SPAWNFLAGS---------- +IN_AIR: already in the air, no pad exists (so don't try landing it!!) +ONDIE_HEAD2SPAWN: when damaged to death, plummet towards spawn pos before exploding +INFINITE_ROCKETS: go on, guess. +DEBUG_WAYPOINTS: enable this flag if you want to see waypoints/volumes/world dims drawn in the air +ATTACK_CHOPPER: this heli will become a Hind attack chopper with a certain script command +ALWAYS_SEEN draws no matter what + +--------KEYS------------ +Volume - aggressiveness. You *must* fill this in (values 0 to 10). 10's good for Tokyo, 3 is ok for Train. +*/ + + +/*QUAKED m_x_chopper_white (1 .5 0) (-280 -280 -50) (280 280 70) IN_AIR ONDIE_HEAD2SPAWN INFINITE_ROCKETS DEBUG_WAYPOINTS ATTACK_CHOPPER ALWAYS_SEEN + + This is the version that uses the class-based AI code. + +--------SPAWNFLAGS---------- +IN_AIR: already in the air, no pad exists (so don't try landing it!!) +ONDIE_HEAD2SPAWN: when damaged to death, plummet towards spawn pos before exploding +INFINITE_ROCKETS: go on, guess. +DEBUG_WAYPOINTS: enable this flag if you want to see waypoints/volumes/world dims drawn in the air +ATTACK_CHOPPER: this heli will become a Hind attack chopper with a certain script command +ALWAYS_SEEN draws no matter what + +--------KEYS------------ +Volume - aggressiveness. You *must* fill this in (values 0 to 10). 10's good for Tokyo, 3 is ok for Train. +*/ + + +/*QUAKED m_x_hind (1 .5 0) (-280 -280 -50) (280 280 70) IN_AIR ONDIE_HEAD2SPAWN INFINITE_ROCKETS DEBUG_WAYPOINTS ATTACK_CHOPPER ALWAYS_SEEN + + This is the version that uses the class-based AI code. + +--------SPAWNFLAGS---------- +IN_AIR: already in the air, no pad exists (so don't try landing it!!) +ONDIE_HEAD2SPAWN: when damaged to death, plummet towards spawn pos before exploding +INFINITE_ROCKETS: go on, guess. +DEBUG_WAYPOINTS: enable this flag if you want to see waypoints/volumes/world dims drawn in the air +ATTACK_CHOPPER: this heli will become a Hind attack chopper with a certain script command +ALWAYS_SEEN draws no matter what + +--------KEYS------------ +Volume - aggressiveness. You *must* fill this in (values 0 to 10). 10's good for Tokyo, 3 is ok for Train. +*/ + + +/*QUAKED m_x_snowcat (1 .5 0) (-91 -66 -33) (91 66 58) INACTIVE + + Not much AI right now, but you can disable what's there with the INACTIVE flag. + +--------SPAWNFLAGS---------- +INACTIVE - just a snowcat. no AI. + +--------KEYS------------ +*/ + + +/*QUAKED m_x_tank (1 .5 0) (-152 -85 -44) (152 85 80) INACTIVE + + Not much AI right now, but you can disable what's there with the INACTIVE flag. + +--------SPAWNFLAGS---------- +INACTIVE - just a tank. no AI. + +--------KEYS------------ +*/ + + +/*QUAKED info_merc_start (1 .1 .1) (-16 -16 -24) (16 16 32) +Starting point for merc buddies. +-------------------------------- +merctype - the default merc type (can be overridden by player during mission setup) + 0 - GRUNT + 1 - DEMO + 2 - MEDIC + 3 - SNIPER + 4 - HEAVY + 5 - TECH + +mercnum - the merc's id number (0 to 3) +*/ + + +/*QUAKED info_player_start (1 0 0) (-16 -16 -24) (16 16 32) +The normal starting point for a level. +*/ + + +/*QUAKED info_player_deathmatch (1 0 1) (-16 -16 -24) (16 16 32) +potential spawning position for deathmatch games +*/ + + +/*QUAKED info_player_team1 (1 0 0) (-16 -16 -24) (16 16 32) +potential spawning position for team deathmatch games (team1 players) +*/ + + +/*QUAKED info_player_team2 (1 0 0) (-16 -16 -24) (16 16 32) +potential spawning position for team deathmatch games (team2 players) +*/ + + +/*QUAKED info_player_intermission (1 0 1) (-16 -16 -24) (16 16 32) +The deathmatch intermission point will be at one of these +Use 'angles' instead of 'angle', so you can set pitch or roll as well as yaw. 'pitch yaw roll' +*/ + + +/*QUAKED test_rj (1 .5 0) (-16 -16 -16) (16 16 16) +RJ testing model +*/ + + diff --git a/Bin/plugins/M32Loader.dll b/Bin/plugins/M32Loader.dll new file mode 100644 index 0000000..6c14058 Binary files /dev/null and b/Bin/plugins/M32Loader.dll differ diff --git a/Bin/sofarghrad.exe b/Bin/sofarghrad.exe new file mode 100755 index 0000000..842ec4c Binary files /dev/null and b/Bin/sofarghrad.exe differ diff --git a/Bin/sofbsp.exe b/Bin/sofbsp.exe new file mode 100755 index 0000000..90645bd Binary files /dev/null and b/Bin/sofbsp.exe differ diff --git a/Bin/sofbspinfo.exe b/Bin/sofbspinfo.exe new file mode 100755 index 0000000..044ee69 Binary files /dev/null and b/Bin/sofbspinfo.exe differ diff --git a/Bin/sofds.exe b/Bin/sofds.exe new file mode 100755 index 0000000..a708930 Binary files /dev/null and b/Bin/sofds.exe differ diff --git a/Bin/sofradiant.exe b/Bin/sofradiant.exe new file mode 100755 index 0000000..aba0a27 Binary files /dev/null and b/Bin/sofradiant.exe differ diff --git a/Bin/sofvis.exe b/Bin/sofvis.exe new file mode 100755 index 0000000..e23d4fe Binary files /dev/null and b/Bin/sofvis.exe differ diff --git a/Configs/ai.cfg b/Configs/ai.cfg new file mode 100644 index 0000000..2b164e5 --- /dev/null +++ b/Configs/ai.cfg @@ -0,0 +1,24 @@ +set developer 1 + +// disk ops +bind s "savepoints" +bind l "loadpoint" +bind e "exportpoint" + +// point manipulation +bind d "deletepoint" +bind h "pointhelp" +bind m "movepoint" + +// misc +bind z "destroyents" +bind i "toggleignore" + +// point dropping +bind a "setpoint" +bind 1 "setflee" +bind 2 "setlean" +bind 3 "setduck" +bind 4 "setcover" +bind 5 "setfleefriendly" +bind 6 "setfleeenemy" diff --git a/Configs/fx.cfg b/Configs/fx.cfg new file mode 100644 index 0000000..eabfc99 --- /dev/null +++ b/Configs/fx.cfg @@ -0,0 +1,16 @@ +bind kp_uparrow "fx_partadjust -" +bind kp_downarrow "fx_partadjust +" +bind kp_home "fx_partsub 10" +bind kp_leftarrow "fx_partsub 1" +bind kp_end "fx_partsub .1" +bind kp_pgdn "fx_partadd .1" +bind kp_rightarrow "fx_partadd 1" +bind kp_pgup "fx_partadd 10" +bind kp_plus "fx_partadjust 1000" +bind kp_minus "fx_partadjust 999" +bind kp_ins "fx_partadjust 1002" +bind kp_enter "fx_run 1" +bind kp_5 "fx_run 1" +bind kp_fslash "fx_partadjust 1001" + +fx_edit 1 diff --git a/Docs/Raven Menu Format.doc b/Docs/Raven Menu Format.doc new file mode 100644 index 0000000..fcd279d Binary files /dev/null and b/Docs/Raven Menu Format.doc differ diff --git a/Docs/Scripting Documentation.doc b/Docs/Scripting Documentation.doc new file mode 100644 index 0000000..2573f7d Binary files /dev/null and b/Docs/Scripting Documentation.doc differ diff --git a/Docs/SoF SDK.rtf b/Docs/SoF SDK.rtf new file mode 100644 index 0000000..392ba2e --- /dev/null +++ b/Docs/SoF SDK.rtf @@ -0,0 +1,72 @@ +{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};}{\f75\froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};} +{\f76\froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};}{\f78\froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};}{\f79\froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};} +{\f80\froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};}{\f81\froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};}{\f82\froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};}} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; +\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\s1\ql \li0\ri0\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \fs36\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 +heading 1;}{\*\cs10 \additive Default Paragraph Font;}{\*\cs15 \additive \ul\cf2 \sbasedon10 Hyperlink;}{\*\cs16 \additive \ul\cf12 \sbasedon10 FollowedHyperlink;}}{\info{\title SoF SDK V1}{\author Rick Johnson}{\operator Rick Johnson} +{\creatim\yr2000\mo3\dy28\hr9\min36}{\revtim\yr2000\mo6\dy15\hr14\min29}{\version6}{\edmins43}{\nofpages2}{\nofwords308}{\nofchars1757}{\*\company Raven Software}{\nofcharsws2157}{\vern8247}}\margl720\margr720\margt720\margb720 +\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1701\dgvorigin1984\dghshow1\dgvshow1 +\jexpand\viewkind4\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule \fet0\sectd \linex0\endnhere\sectlinegrid360\sectdefaultcl {\*\pnseclvl1 +\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5 +\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \s1\ql \li0\ri0\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 +\fs36\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {SoF SDK V1.1 +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\fs36 June 15, 2000 +\par +\par }{\fs20 Added to the }{\b\fs20 Bin}{\fs20 directory: +\par \tab SoF.QE4\tab \tab \tab - Sample project file for QERadiant +\par +\par Added to the }{\b\fs20 Docs}{\fs20 directory: +\par \tab SoF partial animation list.htm\tab - Animation listing for SoF +\par +\par Changed the }{\b\fs20 Ghoul}{\fs20 directory to: +\par \tab Max2/GHOULExp.dle\tab \tab - the 3DS Max V2.x plugin +\par \tab Max3/GHOULExp3.dle\tab \tab - the 3DS Max V3.x plugin +\par +\par Added the }{\b\fs20 Source}{\fs20 directory: +\par \tab It is recommended that you compile the source code using Microsoft Visual C++ V6.0 SP3 +\par +\par \tab Game\tab \tab \tab \tab - Gamex86.dll source code +\par \tab Tools +\par \tab \tab SoFData\tab \tab \tab - SoFData source code (with M32 texture format) +\par +\par +\par }\pard\plain \s1\ql \li0\ri0\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \fs36\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { +\par SoF SDK V1.0 +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\fs36 March 28, 2000 +\par }{ +\par }{\fs20 The initial release of the SDK contains programs and information on how to create custom maps, scripts, menus, and ghoul models. Please refer to the }{\b\fs20 Mod Community Board}{\fs20 under the SoF Message Boards at } +{\field\flddirty{\*\fldinst {\fs20 HYPERLINK "http://sof.ravensoft.com" }{\fs20 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b02000000170000001900000068007400740070003a002f002f0073006f0066002e0072006100760065006e0073006f00660074002e0063006f006d000000e0c9ea79f9bace118c8200aa004ba90b3400000068007400740070003a002f002f0073006f0066002e00720061007600 +65006e0073006f00660074002e0063006f006d002f00000000000000}}}{\fldrslt {\cs15\fs20\ul\cf2 http://sof.ravensoft.com}}}{\fs20 for assistance, feedback, and other issues relating to this SDK. +\par +\par The }{\b\fs20 Bin}{\fs20 directory contains the following programs: +\par \tab SoFRadiant \tab \tab - the SoF map editor +\par \tab Entities.def\tab \tab - the SoF entity list (for SoFRadiant) +\par \tab SoFBSP\tab \tab \tab - to BSP your map +\par \tab SoFVis\tab \tab \tab - to Vis your map +\par \tab SoFArhgRad\tab \tab - to Light your map +\par \tab SoFBSPInfo\tab \tab - to get information about your bsp file +\par \tab SoFDS\tab \tab \tab - the designer script compiler +\par \tab SoFData\tab \tab \tab - to generate textures +\par +\par The }{\b\fs20 Ghoul}{\fs20 directory contains the 3DS Max 2.0 or higher plugin for GHOUL model creation: +\par \tab pmodels/buddy.gpm\tab - an example of a GHOUL Player Model file for custom player models in deathmatch +\par +\par The }{\b\fs20 Configs}{\fs20 directory contains config files useful for effect and map creation: +\par \tab AI.cfg\tab \tab \tab - Config file to help see various aspects of the AI +\par \tab FX.cfg\tab \tab \tab - Config file to assist in the creation of effects +\par +\par The }{\b\fs20 Docs}{\fs20 directory contains useful documentation: +\par \tab Raven Menu Format.doc\tab \tab - Describes the various commands to create a menu +\par \tab Scripting Documentation.doc\tab - Describes the various commands for the designer scripting language +\par \tab SoF SDK.rtf\tab \tab \tab - This document +\par +\par The }{\b\fs20 Menus}{\fs20 directory contains examples for creating menus under SoF. +\par +\par The }{\b\fs20 Sample}{\fs20 directory contains the scripts and original map file for the TSR1 level, which is the New York Subway level (first mission in the game). +\par +\par +\par +\par }} \ No newline at end of file diff --git a/Docs/SoF partial animation list.htm b/Docs/SoF partial animation list.htm new file mode 100644 index 0000000..d74a079 --- /dev/null +++ b/Docs/SoF partial animation list.htm @@ -0,0 +1,7865 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Animation NameMesoEctoFemaleScriptableDescriptionCatagoryStartFrameEndFrameFrameCountNotes
A4_ASCRAMBLE_N_A_No  FALSEFrantic scramble away on all + fours.  Use when in prone position.Fear045 
CCH_A_FWD_L_2o oFALSEaiming while + crouching with a rocket launcher 3645105 fps.
CCH_A_FWD_MS_2o kFALSECrouch aim forward + with machine gun or shotgun (two handed)Crouch Attack-16-4135 fps.  *soft notes (play control 5 fps -32 -7)
CCH_A_FWD_P_2l kFALSEDO NOT USE FOR ECTOCrouch Attack-10-1105 fps.  *soft notes (play control 5 fps -20 -1)
CCH_A_FWD_R_2o kFALSEcrouch aim forward + with rifle (2 handed).  Taken from + soft file- cch_f_fwd_r_2.Crouch Attack-16-4135 fps.  *soft notes (play control 5 fps -32 -7)
CCH_ECCH2WALK_N_A_No  FALSEtransition from + crouch to a crouch walkScripted Events17226 
CCH_ECHOKEDEATH_N_N_Nok FALSEExpriring from + choking while crouchedScripted Events587720 
CCH_ECHOKEKNEES_N_N_Nok FALSEon knees chokingScripted Events50578 
CCH_EHAWKCROUCH_N_A_No  TRUESpecial crouch pose + for HawkScripted Events0910 
CCH_EHAWKDEATH_2BK_N_No  TRUEHwk getting shot + while on his knees, to his side and ultimately to his back.Scripted Events365621 
CCH_EHAWKKNEES_N_N_No  TRUEHawk raged breathe + cycle on his knees looking beat up.Scripted Events023248 fps
CCH_EHAWKKNEETLK_N_N_No  TRUEBeat-up Hawk shaking + his head, "John, don't.  It's + Dekker."Scripted Events2534105 fps
CCH_EHEADNOD_N_A_No  FALSETaken from cch_italk + series.  Quick affirmative nod facing + forward.Scripted Events88936 
CCH_EHEADSET_FRM_A_No  TRUETaking left hand away + from left ear in crouch pose.Scripted Events54574 
CCH_EHEADSET_MID_A_No  TRUEleft hand to left ear + in crouch pose talking into headset.Scripted Events395315 
CCH_EHEADSET_TO_A_No  TRUEBringning left hand + to left ear in crouch pose.Scripted Events35384 
CCH_ENODLEFT_N_A_Ao  FALSElook to the left and + nod in affirmation.  From soft file + cch_iready_n_a_a.Scripted Events567116 
CCH_ENODRIGHT_N_A_Ao  FALSElook to the right and + nod in affirmation.  From soft file + cch_iready_n_a_a.Scripted Events728716 
CCH_ESCANTALK_LT_A_Ao  FALSESlowly scanning to + the left…could be used for talking as well, but don't make the talking super + obvious.   From soft file + cch_iready_n_a_a (24-39).Scripted Events121985 frames per second
CCH_ESCANTALK_RT_A_Ao  FALSESlowly scanning to + the right…could be used for talking as well, but don't make the talking super + obvious.  From soft file + cch_iready_n_a_a (40-55).Scripted Events202785 frames per second
CCH_ESTARTLE_RT_A_No  TRUEStartled from the + right while crouched.  Used primarily + for John as Hawn rolls in and spooks him.Scripted Events02627 
CCH_ETALK_DWN_P_No  FALSEHawk talking through + a grate below him to the player.  + Generic speech.Scripted Events089 
CCH_ETOSTAND_N_A_No  FALSEDekker slowly + standing up (Scene 38)Scripted Events03435 
CCH_EWALK2CCH_N_A_No  FALSECrouch walk + transition to crouched.  At the end of + the cch_w loop.Scripted Events12165 
CCH_F_FWD_L_2o kFALSEcrouch fire forward + rocket launcherCrouch Attack17259 
CCH_F_FWD_M_2l kFALSEcrouch fire machine + gun forward.  Taken from soft file- + cch_a_fwd_ms_2Crouch Attack16172 
CCH_F_FWD_P_2l kFALSEDO NOT USE FOR ECTOCrouch Attack045 
CCH_F_FWD_R_2l kFALSEfire rifle while + crouchedCrouch Attack155 
CCH_F_FWD_S_2l kFALSEcrouch fire forward + shotgun.  Taken from soft file- + cch_a_fwd_ms_2Crouch Attack056 
CCH_HLEANLTSHT_FRM_A_No oFALSETransition from + crouched leaning left around corner.  + Intended as a client animation.
+
+ ONLY TWO FRAMES LONG!!!
Crouch47504 
CCH_HLEANLTSHT_FRM_L_2o oFALSETransition from + crouched leaning left around corner.  + Intended as a client animation.
+
+ ONLY TWO FRAMES LONG!!!
Crouch75784 
CCH_HLEANLTSHT_MID_A_No oFALSECrouched leaning left + around corner aim breathe…5FPS.  + Intended as a client animation.Crouch Attack3746105 fps
CCH_HLEANLTSHT_MID_L_2o oFALSECrouched leaning left + around corner aim breathe…5FPS.  + Intended as a client animation.Crouch Attack6574105 fps
CCH_HLEANLTSHT_TO_A_No oFALSETransition to + crouched leaning left around corner.  + Intended as a client animation.
+
+ ONLY TWO FRAMES LONG!!!
Crouch34374 
CCH_HLEANLTSHT_TO_L_2o oFALSETransition to + crouched leaning left around corner.  + Intended as a client animation.
+
+ ONLY TWO FRAMES LONG!!!
Crouch62654 
CCH_HLEANRTSHT_FRM_A_No oFALSETransition from + crouched leaning right around corner.  + Intended as a client animation.
+
+ ONLY TWO FRAMES LONG!!!
Crouch31344 
CCH_HLEANRTSHT_FRM_L_2o oFALSETransition from + crouched leaning right around corner.  + Intended as a client animation.
+
+ ONLY TWO FRAMES LONG!!!
Crouch59624 
CCH_HLEANRTSHT_MID_A_No oFALSEcrouched leaning + right around corner aim breathe...5FPS.  + Intended as a client animation.Crouch Attack2130105 fps
CCH_HLEANRTSHT_MID_L_2o oFALSEcrouched leaning + right around corner aim breathe...5FPS.  + Intended as a client animation.Crouch Attack4958105 fps
CCH_HLEANRTSHT_TO_A_No oFALSETransition to + crouched leaning right around corner.  + Intended as a client animation.
+
+ ONLY TWO FRAMES LONG!!!
Crouch18214 
CCH_HLEANRTSHT_TO_L_2o oFALSETransition to + crouched leaning right around corner.  + Intended as a client animation.
+
+ ONLY TWO FRAMES LONG!!!
Crouch46494 
CCH_IREADY_N_A_Ao  FALSEgeneric idle poaition + while chrouched…use 5 FPS (Soft file frames 0-23)Idle011125 frames per second
CCH_ITALKPOSE_DWN_A_No  FALSEIdle breathe + chrouched while looking down.  Merges + with etalk_dwn.  5FPSScripted Events1120105 fps
CCH_R_N_PK_Nl  FALSEcrouch run while + holding the knife with right hand (or pistol)Crouch056 
CCH_RAIM_FWD_MRS_2l kFALSEcrouch run aiming + machine gun/rifle/shotgun (can use for fire)Crouch Attack056 
CCH_RAIM_FWD_P_2l kFALSEcrouch run aim pistol + with 2 hands (can use as fire)Crouch Attack056 
CCH_RAIM_N_L_2l kFALSEcrouch run aim rocket + launcher (can use as fire).  THIS + SHOULD BE USED AS THE NORMAL RUN CROUCH FOR GUYS WITH ROCKET LAUNCHERS (THEY + ARE ALWAYS AIMING IT)Crouch Attack056 
CCH_RSWIPE_N_K_No  FALSEswiping with knife + while crouch-runningCrouch Attack056 
CCH_SDEAD_2BK_N_Nl kFALSEguy shot while + crouching (only crouch death available)Injury/Death02324 
CCH_SONKNEES_2FRNT_N_NookFALSEGuy on knees with + hands behind head shot, falls to face.Injury/Death163621 
CCH_TLOBGRENADE_N_A_Nl  FALSEcrouch, throw grenade + (lob overhead)Crouch Attack02122 
CCH_W_N_A_No  FALSEcrpouched over + walk…brisk but not a jog.Crouch01112 
CCH_XCCHCOWER_N_A_NokkFALSEmale afraid cowering + (looped).  Transitons with up and + down.Fear183013loop of guys cowering
CCH_XCCHCOWER_UP_A_AokkFALSEguy stand up after + cowering (transitions with "mid")Fear01011reverse of the go + into crouch cower from stand
CCH_XCCHCOWER2_MID_A_AokkFALSEplay in middle of + previous anim (guy looks up and back down while cowering).Fear-32024look up durning loop + of guys cowering
CCH_XCROUCH_UP_L_2o kFALSEcrouch back to stand + carrying rocket launcher (note he comes up from knee)Crouch25328 
CCH_XCROUCH_UP_MRS_2o kFALSEstand up from crouch + aim carrying machine gun/rifle/shot gunCrouch8158 
CCH_XCROUCH_UP_PK_AookFALSEstand up from aim + crouch carrying pistol/knife (anything in left hand)Crouch8136dwn: 1-5 mid: 6-7 up: + 8-15   Best if used for enemies with + pisols and nothing in left hand (so they can hold pistol 2 handed in aim and + shoot).  People carrying briefcases or + anything else in left hand probably shouldn't be crouching at all.
CCH_XONKNEES_N_N_NookFALSEHostage on knees with + hands behind head.  Breathing.Scripted Events01415 
LB_ESLIDE_N_PK_No  TRUECharacter sliding + down shaft on his back… 45 degree surface.  + Missionm 7 level 2.Scripted Events0455 fps
LB_PCRAWL_BK_A_Nl  FALSEGuy injured, crawling + backwards.  NOTE:  MOST LIKELY HAS NOTHING IN HIS HANDS!Injury/Death02021 
LB_PGENERIC_N_N_Nl  FALSEguy writhing on back + with generin injury (arm over face).  + Has a trasition "to" and from ("die").  Probably should die after 6 or 7 seconds.Injury/Death02728 
LB_PGENERICDIE_N_N_Nl  FALSEtransition to death + from pgeneric after several seconds.  + Based off of Softimage file-lb_pgenericdie_n_n_n_vrs4.Injury/Death286437 
LB_PGENERICTO_N_N_No  FALSEtransition to the + pain loop after initial knock downInjury/Death24263 
LB_PHOLDLEG_LT_N_Nl  FALSElay on back holding + left leg in pain (has transition "to" and from + {"die"}).
+
+ DO NOT USE IF LEG SHOT OFF AT HIP--ONLY FOR PLAIN SHOT OR SHOT OFF AT KNEE
Injury/Death174125 
LB_PHOLDLEG_RT_N_Nl  FALSElay on back holding + right leg in pain (has transition "to" and from + {"die"}).
+
+ DO NOT USE IF LEG SHOT OFF AT HIP--ONLY FOR PLAIN SHOT OR SHOT OFF AT KNEE
Injury/Death174125 
LB_PHOLDLEGDIE_LT_N_No  FALSEtransition from right + leg pain to dying. (happens after 6 or 7 seconds)Injury/Death427332 
LB_PHOLDLEGDIE_RT_N_No  FALSEtransition from left + leg pain to dying. (happens after 6 or 7 seconds)Injury/Death428746 
LB_PHOLDLEGTO_LT_N_No  FALSEtransition to pain + holding left leg after innitial knock down.Injury/Death24263 
LB_PHOLDLEGTO_RT_N_No  FALSEtransition to pain + holding right leg after innitial knock down.Injury/Death24263 
LB_SAUTOFIRE_END_N_NokkFALSEAlways use after + sautofire_loop.  ALSO use when a guy + laying on back (dead or alive) is shot with a single fire weapon.Injury/Death11010 
LB_SAUTOFIRE_LOOP_N_NlkkFALSEPlays as guy getting + shot with machine gun while on back (dead or alive).  Body shakes.  When firing stops, transition to sautofire_end.Injury/Death-15-115 
LB_XGETUP_N_A_Nl  FALSEget up from laying on + backStand Misc. Movement03435 
LB_XLEANUPSHOOT_N_P_Nl  FALSEGuy dead on ground, + leans up, and fires off a couple shots.  + Dies.Injury/Death25251 
LB_XTWITCH2_N_N_Nl  FALSEDead guy twitching + violently. (can play at any time, lay on back only)Injury/Death11717 
LF_SAUTOFIRE_END_N_NokkFALSEplays after + lf_autofire_loop.  ALSO use when guy + laying on front gets shot with single fire weapon.  (also use when guy gets shot in prone position!)Injury/Death11010 
LF_SAUTOFIRE_LOOP_N_NokkFALSEguy laying dead or + alive on front getting shot with automatic weapon.  Shots stop, play sautofire_end.  (also use when guy gets shot in prone position!)Injury/Death-15-115 
LS_XGETKICKED_N_N_Noo FALSENPC laying on left + side getting kicked.  Looped laying on + side, afraid, shaking in pain!  If you + shoot him, goes into lb_sautofire anim.Scripted Events01415 
PRN_A_N_A_2o  FALSEaim OR fire any + weapon in prone position.Prone303564 fps
PRN_C_N_A_2l  FALSEProne low crawl + carrying any weapon 2 handedProne078 
PRN_XCOVERHEAD_FRM_A_Aok FALSEtransition from the + coverheadProne34374filename:std_xgoprone_n_a_a + frames: 35 to 40
PRN_XCOVERHEAD_N_A_AokkFALSElooped anim of prone + head covered (enemies and NPCs).  + Especially good for scripted events of NPCs on ground, captured by + baddies.Prone384811 
PRN_XCOVERHEAD_TO_A_AokkFALSEtransition to + prn_xcoverhead_n_a_a.  Transition from + std_xgoprone_n_a_a OR any of the aims.Prone49524 
PRN_XFALLING_N_N_No  FALSEfalling from high + place death, loopedInjury/Death18247std_sfallfwd_2frnt_n_n
PRN_XFALLLAND_N_N_No  FALSEhitting the ground on + stomach.  Bounce and death.Injury/Death253511std_sfallfwd_2frnt_n_n + frames 25-35
PRN_XTOSTAND_N_A_Aok FALSEProne position to + stand from any prone position except coverheadProne587316filename:std_xgoprone_n_a_a + 60 to 73
SI_EWALLFEAR_N_A_No  FALSEputting hand (left + hand especially) up to sheild head from falling objects.  Dekker deathScripted Events324110 
SI_EWALLFEAR_N_A_No  FALSEputting hand (left + hand especially) up to sheild head from falling objects.  Dekker deathScripted Events324110 
SI_EWALLIDLE_N_A_No  FALSElaying against a wall + breathing (dekker)Scripted Events01920 
SI_EWALLTALK_N_A_No  FALSEtalking loop to fit + in with the wallidleScripted Events213010 
SI_ISIT_N_A_Ao  FALSEguy sitting idle with + any weaponIdle-12-112export at 5 fps (soft + notes -24 - -1 change play control to 5 fps
SI_XALERTSTAND_UP_A_Ao  FALSEguy stands up from + sitting idle (alerted)Stand Misc. Movement02223 
SI_XBYWALL_N_N_Nl  FALSEguy dead or passed + out sitting, leaning against wall.  + One frameScripted Events111 
STD_A_DWN_L_2o kFALSEaim or fire launcher + down (1 frame anim).  Take pose from + aim fwd rocket launcher.  Use second + frame of animation- first frame is up.Stand Attack35351 
STD_A_DWN_MRS_2o kFALSEstand aiming down + with mrs 2 handed (1 FRAME ANIM!)  + Make match pose of mrs aim forward.  + Taken from soft file, std_a_fwd_ms_2.  + Exported with 2 frames, (up/down)Stand Attack19191 
STD_A_DWN_P_2o kFALSEstand aiming down + with pistol 2 handed (1 FRAME ANIM!).  + Make match pose of pistol aim forward 2 handed.   Taken from soft file std_f_fwd_p_2.  Exported with 2 frames (up/dwn).Stand Attack31322 
STD_A_FWD_L_2o kFALSEaim fwd with launcher + (breathe).  Use pose from fire + launcher anim.  5 fps.  *soft notes (play control 5 fps -32 -7)Stand Attack-16-413 
STD_A_FWD_MS_2o oFALSEstand, aiming machine + gun OR shotgun  5 fps.  *soft notes (play control 5 fps -32 -7)Stand Attack-16-413 
STD_A_FWD_P_2o oFALSEstand aim pistol 2 + handed  5 fps.  *soft notes (play control 5 fps  4  + 23)Stand Attack21110 
STD_A_FWD_P_CBok TRUEstand aim pistol 1 + handed, briefcase/bat/nothing in left hand
+
+ WILL WE EVER USE?  TALK TO STEVE. . .
Stand Attack-16-413use also as auto + shoot  5 fps.  *soft notes (play control 5 fps -32 -7)
STD_A_FWD_R_2o oFALSEstand aim rifle.  From soft file std_ashuffle_n_r_2Stand Attack-32-726 
STD_A_UP_L_2o kFALSEaim up with launcher + (1 frame anim).  Take pose from aim + fwd rocket launcher.  Use first frame + of animation- second frame is down.Stand Attack34341 
STD_A_UP_MRS_2o kFALSEstand aiming up with + mrs (1 FRAME ANIM!).  Make rougly + match aim forward with ms.  Taken from + soft file, std_a_fwd_ms_2.  Exported + with 2 frames, (up/down)Stand Attack18181 
STD_A_UP_P_2o kFALSEstand aiming up with + pistol 2 handed (1 FRAME ANIM!)   + Taken from soft file std_f_fwd_p_2.  + Exported with 2 frames (up/dwn).Stand Attack31311 
STD_ASHUFFLE_N_L_2o kFALSEshuffle holding + rocket launcher (right or left).  Same + shuffle as below but with rocket (see other anims for how rocket held)Stand Misc. Movement-6-16 
STD_ASHUFFLE_N_MS_2o kFALSEshuffle right or left + aiming mach gun or shotgun.     Taken + from soft file Std_a_fwd_ms_2.Stand Misc. Movement-6-16 
std_ashuffle_n_p_2o kFALSEshuffle right or left + while aiming pistol 2 handedStand Misc. Movement24296 
std_ashuffle_n_p_aok FALSEShuffle right or left + while aiming pistol one handed (replace what is there now) taken from soft + file- std_a_fwd_p_cbStand Misc. Movement-6-16 
std_ashuffle_n_r_2o kFALSEshuffle right or left + aiming rifle (replace what is there)Stand Misc. Movement-6-16 
STD_ATALK_FWD_P_2o  TRUEaiming with 2hands on + pistol while talking 09105 fps
STD_ATHREAT_DWN_P_No  FALSEAiming pistol at head + level of a guy sitting, on knees or crouching...body more askew in a + threatening pose  5 fps.  *soft notes (play control 5 fps 1 20)Stand Attack1995 fps
STD_ATHREAT_FWD_P_No  FALSEAiming pistol at head + level...body more askew in a threatening pose  5 fps.  *soft notes + (play control 5 fps 1 20)Stand Attack199 
STD_ATHREATSHT_DWN_P_No  FALSEAiming pistol at head + level of a guy sitting, on knees or crouching...body more askew in a + threatening pose…shooting hostage.Stand Attack01415 
STD_ATHREATYEL_DWN_P_No  FALSEAiming pistol at head + level of a guy sitting, on knees or crouching...body more askew in a + threatening pose…yelling at hostage while still keeping a bead on the + hostages head.Stand Attack1995 fps
STD_ATHREATYEL_FWD_P_No  FALSEAiming pistol at head + level...body more askew in a threatening pose and yelling at hostage…gun + keeping a bead on hostage's headStand Attack199 
STD_EBUSTGLASS_N_MRS_2o  FALSECharacter breaking + through a window with the tip of his weapon.  + Should be a violent action.Scripted Events0910 
STD_ECHOKEKNEES_TO_N_Nok FALSEfalling to knees from + chokeing animationScripted Events84942 
STD_ECHOKESHOOT_N_A_No  FALSEFrom shoking stand + animation to falling down and accidently shooting gun while doing so.Injury/Death82720 
STD_ECLIMBLEDG_DWN_A_No  FALSElowering self off + over a ledge…match up with "std_eclimbledg_mid_a_n"Scripted Events02021 
STD_ECLIMBLEDG_MID_A_No  FALSEhanging off  of a ledge breathing 5 FPS  amtch up with the other ledge animations.Scripted Events2029105 fps
STD_ECLIMBLEDGE_UP_A_No  FALSECharacter pulling + self up and over a ledge and standing upScripted Events02728 
STD_ECLIMBSHAFT_N_A_No  FALSEHawk climbing into + ventelator shaft.  Hight=32 (mission 7 + level 3)  Designers will likely have + to no clip the charactrer to make this work.  + This is a horizontal crawl.Scripted Events02021 
STD_ECOMEHERE_N_A_No  FALSECharacter waving + someone to "come hither" to and from idle position.Scripted Events01415 
STD_EDKRAIM_N_A_No  TRUEDekker looking at + john while he has the gun pointed at hawks head.  5FPS and trans with other edkr movesScripted Events09105 fps
STD_EDKRAIMLK_FWD_A_No  TRUEDekker looking away + from hawk to john as he enters the room.  + All the while he has the gun pointed at hawks head.Scripted Events-5-155 fps
STD_EDKRAIMTALK_N_A_No  TRUEDekker ltalking to + john as he has the gun pointed at hawks head.Scripted Events1019105 fps
STD_EDKRFIRELK_RT_A_No  TRUEDekker looking back + to hawk as john watches helplessly & shoots hawk.Scripted Events203819 
STD_EDROPCROUCH_N_A_Ao  FALSEguy falling through + air and landing, ends up in crouch position.  + Especially good for special events, like guys falling from vents in + ceiling.  Surprise factor.Scripted Events82215 
STD_EDROPGRENADE_N_A_No  FALSEthrowing a grenade + down off of a ledge or into a manhole more of a  vertical downward throw.Scripted Events01920 
STD_EEXAMINEWALL_N_A_No  FALSECharacter looking at + a controll pannel.  Match up with the + std_epushbuttons…Scripted Events6213170 
STD_EFALLDEATH_N_N_No  FALSEA guy in verticle + position falling  and flailingInjury/Death18247 
STD_EFALLIMPACT_N_N_No  FALSEThe impact to go + along with std_efalldeath_n_n_n crumpling and bouncing from the impact. This + animation should have him end up on his stomach.Injury/Death273812 
STD_EFLIPTABLE_N_A_No  FALSECharacter flipping a + table over to offer cover in front of himScripted Events01314 
STD_EFRMSHADOW_N_MRS_2o  FALSESneaking out of the + shadows and taking a quick look around.Scripted Events03940 
STD_EFRMSHADOW_N_P_No  FALSESneaking out of the + shadows and taking a quick look around.  + Gun un up position.  Transition + into "STD_IGUNUP_N_A_N"Scripted Events03839 
STD_EGANGSALUTE_N_A_No  FALSEGang style + salute…cross arms in front  (left arm + in front) then the left arm jutting forward.Scripted Events01617 
STD_EHANDTALK_FRM_P_No  FALSEtaking hand away from + face and returning to idle positionScripted Events20267 
STD_EHANDTALK_N_P_No  FALSEgeneric talking into + left hand loopScripted Events12198 
STD_EHANDTALK_TO_MRS_No  FALSETransition to  handtalk …..Character talking into a hand + mounted comunicator.  Transition from + alert readyScripted Events01112 
STD_EHANDTALK_TO_P_No  FALSECharacter taking an + invisible communicator from his belt and bringing it up to his mouthScripted Events01112 
STD_EHANDTLK_FRM_MRS_No  FALSETransition from + handtalk.. Transitions into idle alert.Scripted Events20267 
STD_EHEADNOD_N_A_No  FALSEnodding + afirmatively…not vigorously.  + Interfaces with the etalk serries 66672 
STD_EHEADSET_FRM_P_No  FALSETransition back to + ialertScripted Events54574 
STD_EHEADSET_MID_P_No  FALSEloop whith left hand + to left ear.  Very, very subtle + talking more of just a breathe.Scripted Events395315 
STD_EHEADSET_TO_P_No  FALSECharacter bringing + left hand up to touch left ear to activate his comlink.  Transition from ialert.Scripted Events35384 
STD_EHEADSHAKE_N_A_No  FALSEShaking head + negatively…not vigorously though.  + Interfaces with the etalk serries.Scripted Events465510 
STD_EJUMPRAIL_N_A_No  FALSEPlants hand on a 32 + unit tall railing and vaults over transitions into std_jdrop…Scripted Events0910 
STD_ELEADERWAVE_N_N_No  TRUEdictator waving to + crowdScripted Events020216 fps
STD_ENIPPLETWEAK_N_A_No  TRUEgrabbing another + characters nipples, twisting and then yanking down.Scripted Events000 
STD_EOFFLADDER_UP_A_No  FALSEgetting to the top of + a ladder and climbing up on to the "ground"Scripted Events467732 
STD_EPOUNDDOOR_N_A_No  FALSEPounding fist on a + door or wall in deseration…let me out!Scripted Events056 
STD_EPUSHBUTTONH_N_A_No  FALSEdekker leaning over + and pushing button in scene 75 on a horizontal (32 pixel) surface.  "You killed my brother!"Scripted Events04748 
STD_EPUSHBUTTONS_N_N_No  FALSECharacter pressing + buttons on a wall mounted control pannel.  + We can use a voyager animation from crew 4: "console a -or- + b".Scripted Events03233We may wan to go back + and split this up  to have a loopable + middle.  Or make it work with a normal + idle.
STD_EPUSHCRATE_N_A_No  FALSECharacter bearing + into a crate full fore with right shoulder and left hand pushing it along the + ground.  Could be used for pushing + crates off of high places onto the player.Scripted Events01718 
STD_ERAGEIDLE_N_P_No  FALSEThis is a 1 frame + looping idle taken from the last frame of erageshoot.Idle30301 
STD_ERAGESHOOT_N_P_No  FALSESabre gets very + angry, looks to his right and shoots an inocent who is crouched or kneeling + on the ground.Scripted Events03031 
STD_ESABREMOCK_N_A_No  FALSEMantis looking down + from a train, mocking our heros by  + laughing dementedly with crossed arms.Idle-43237 
STD_ESALUTATIONS_N_A_No kFALSEmullins and taylor + great each other with a slight nodScripted Events0345 fps
STD_ESALUTE_FRM_A_No  FALSEGoing from salute + pose to idle with a snap of the hand.  + Crisp and militaristic.Scripted Events6127 
STD_ESALUTE_FRM_MRS_No  FALSEGoing from salute + pose to idle with a snap of the hand.  + Crisp and militaristic.Scripted Events6127 
STD_ESALUTE_N_A_No  FALSElooping few frames in + saulute pose with left handScripted Events562 
STD_ESALUTE_N_MRS_No  FALSElooping couple of + frames in saulute pose with left handScripted Events562 
STD_ESALUTE_TO_A_No  FALSEGoing from idle to + salute animation using left hand….snappyScripted Events045 
STD_ESALUTE_TO_MRS_No  FALSEGoing from idle to + salute animation using left hand….snappyScripted Events045 
STD_ESIGNALALARM_N_A_No  FALSELooking to the side + and signalling to sound the alarmScripted Events01314 
STD_ESIGNALWAVE_N_A_No  TRUEwaving with both + hands high in air.Scripted Events0910 
STD_ESPIN180_LT_A_Nl  FALSEspin 180 degrees from + a normal idle position to an ialert pose (as if to turn toward enemy).  To the left.Scripted Events089 
STD_ESPIN180_RT_A_Nl  FALSEspin 180 degrees from + a normal idle position to an ialert pose (as if to turn toward enemy). To the + right.Scripted Events089 
STD_ESUPRISE90_LT_A_No  FALSEquick look right and + and then turn 90.  Ends up facing 90 + degrees from start.Scripted Events-13-68 
STD_ETALK_FRM_A_No  FALSEtransition to istand + from etalk serriesScripted Events-8-54 
STD_ETALK_N_A_No  FALSEA generic talking + loop used for non-specific talking during cinematics or scripted events. This + is a very subtle talking loop as opposed to some of the idle talking loops. + Works with:
+
+ std_etalkright_n_a_n
+
+ std_etalkleft_n_a_n
+
+ std_etalkboth_n_a_n
Scripted Events02526 
STD_ETALK_TO_A_No  FALSEtransition to etalk + serries from istandScripted Events-4-14 
STD_ETALK_UP_A_No  FALSECharacter talking at + an upward angleScripted Events02526 
STD_ETALKBOTH_N_A_No  FALSEgeneric talking with + a breif conversational gesture with both hands.  This animation transitions to and from std_etalk_n_a_n.
+
+ Works with:
+
+ std_etalkright_n_a_n
+
+ std_etalkleft_n_a_n
+
+ std_etalk_n_a_n
Scripted Events34407 
STD_ETALKLEFT_N_A_No  FALSEgeneric talking with + a breif conversational gesture from the left hand.  This animation transitions to and from std_etalk_n_a_n.
+
+ Works with:
+
+ std_etalkright_n_a_n
+
+ std_etalk_n_a_n
+
+ std_etalkboth_n_a_n
Scripted Events26338 
STD_ETALKLKLT_FRM_A_No  FALSETransition form + "etalklklt_mid"  to + std_etalk_n_a_n.Scripted Events-10-65 
STD_ETALKLKLT_MID_A_No  FALSEstanding talk loop + looking to the left…to be linked up with "etalklklt_to" and " + "etalklklt_frm"Scripted Events02526 
STD_ETALKLKLT_TO_A_No  FALSETransition from + std_etalk_n_a_n to looking to the left…to be linked up with + "etalklklt_mid"Scripted Events-5-15 
STD_ETALKLKRT_FRM_A_No  FALSETransition form + "etalklkrt_mid"  to + std_etalk_n_a_n.Scripted Events-10-65 
STD_ETALKLKRT_MID_A_No  FALSEstanding talk loop + looking to the left…to be linked up with "etalklkrt_to" and " + "etalklkrt_frm"Scripted Events02526 
STD_ETALKLKRT_TO_A_No  FALSETransition from + std_etalk_n_a_n to looking to the right…to be linked up with + "etalklklt_mid"Scripted Events-5-15 
STD_ETALKRIGHT_N_A_No  FALSEgeneric talking with + a breif conversational gesture from the right hand.  This animation transitions to and from std_etalk_n_a_n.
+
+ Works with:
+
+ std_etalk_n_a_n
+
+ std_etalkleft_n_a_n
+
+ std_etalkboth_n_a_n
Scripted Events41455 
STD_ETOAIM_N_P_2o  FALSECharacter quickly + pulling gun up to an aim position from an idle of some sort…doesn't need to + transition perfectly from anything because it’s a fast movement.Scripted Events-60-56515 fps
STD_ETORUN_N_MRS_2o  FALSEtransition from Idle + to runScripted Events045 
STD_ETORUN_N_P_No  FALSEtransition from Idle + to runScripted Events1711766 
STD_ETURN90_LT_A_No  FALSETruning in place 90 + degree to the left.  Interfaces with + normal idleScripted Events01112 
STD_ETURN90_RT_A_No  FALSETruning in place 90 + degree to the right.  Interfaces with + anormal idleScripted Events01112 
STD_ETYPING_N_N_No  FALSEcharacter typing in + keyboard at table level while standing.Scripted Events02324 
STD_EWALL2WALK_N_MRS_2o  FALSETransition of + character going from std_ewallidle_n_mrs_2 into a walkScripted Events70734 
STD_EWALL2WALK_N_PK_No  FALSEup against the wall + transitioning into a walk cycleScripted Events70745 
STD_EWALLIDLE_N_MRS_2o  FALSECharacter pressed up + against a wall holding gun closeScripted Events01920 
STD_EWALLIDLE_N_PK_No  FALSEStanding pressed up + against a wall breathing hands down to the side.Scripted Events01920 
STD_EWALLLOOK_LT_MRS_2o  FALSEPressed up against a + wall looking left breifly.  + Transitions in and out of std_ewallidle_n_mrs_n.Scripted Events456925 
STD_EWALLLOOK_LT_PK_No  FALSElooking to the left + breifly and then back.  Transitions in + and out of std_ewallidle_n_pk_n.Scripted Events456925 
STD_EWALLLOOK_RT_MRS_2o  FALSECharacter looking to + the right breifly and then back.  + Transistions into and out of std_ewallidle_n_mrs_2Scripted Events204425 
STD_EWALLLOOK_RT_PK_No  FALSECharacter breifly + looking to the right and then back.  + Transitions in and out of std_ewallidle_n_pk_n.Scripted Events204425 
STD_EWALLWALK_LT_PK_No  TRUEpressed up against a + wall walking sidewaysStand Walk/Run078 
STD_EWHIRL_RT_A_No  TRUEJohn whirling to his + right.  Happens right after Hawn + shoots someone on the other side of the glass.  John should be surprised.Scripted Events188 
STD_EWRENCHH_FRM_N_No  FALSETransition from + wratcheting to idle horizontalScripted Events22265 
STD_EWRENCHH_N_N_No  FALSERatcheting a wrnech + on a horizontal surface…perhaps a vehical engineScripted Events15217 
STD_EWRENCHH_TO_N_No  FALSETransition to + ratcheting a wrench  on a horizontal + surfaceScripted Events01415 
STD_EWRENCHV_FRM_N_No  FALSEComing from + ratcheting animation on a verticle surface.Scripted Events22265 
STD_EWRENCHV_N_N_No  FALSEratchetting a wrench + on a vertical surfaceScripted Events15217 
STD_EWRENCHV_TO_N_No  FALSEGoing to ratchetting + a wrench on a vertical surfaceScripted Events01415 
STD_EYELL_N_A_No  FALSEBrute Yelling + "Hury up..they'l be here soon"Scripted Events152410 
STD_F_FWD_L_2l kFALSEstand, fire launcherStand Attack089 
STD_F_FWD_M_2o kTRUEstand fire machine + gun.  From soft file std_a_fwd_ms_2Stand Attack232MALE
STD_F_FWD_P_2l kFALSEstand fire pistol 2 + handedStand Attack045 
STD_F_FWD_P_CBlk TRUEstand fire pistol 1 + handed, briefcase/bat/sword in left.  + Taken from soft file- std_a_fwd_p_cb.Stand Attack034 
STD_F_FWD_R_2l kFALSEstand fire + rifle.  From soft file + std_ashuffle_n_r_2Stand Attack155 
STD_F_FWD_S_2l kFALSEfire shot gun, + automatic cock.     Taken from soft + file Std_a_fwd_ms_2.Stand Attack056 
STD_F2ININJA_N_P_No  FALSEtransition from + std_f_fwd_n_p_n to std_ininja_n_p_cb 144 
STD_FATTITUDE_N_P_Alk FALSEstand fire pistol + with attitude (like skinhead or tough drug/mafia guy).  Esp. good for execution scripted events.Stand Attack23433 
STD_FAUTOSWEEP_N_M_2l  FALSEfire machine gun with + sweeping actionStand Attack41310 
STD_FAUTOSWEEP_N_PM_Al  FALSEstand firing SINGLE + HANDED auto pistol/ingram or other automatic light weapon in sweeping + motion.  CURRENTLY NOT USED!Stand Attack02627 
STD_FAUTOSWEEP_UP_M_Ao  FALSEused for dekker + shooting at the ceiling (40 degrees)  + at the end of the game…lengthen out the sweeping portion of it to + accommodate designer's needs.Stand Attack02728 
STD_FCORNERPEAK_LT_M_2l  FALSEPeak around corner, + fire an automatic burst, and return to coverStand Attack02829quake_ground must + atay in the same place…a satalite entity will cover the character's movement + outside of his bounding box.  Spins + out from the wall now.
STD_FCORNERPEAK_LT_P_Al  FALSEPeak around corner, + fire 2 shots (pistol), and return to coverStand Attack01920quake_ground must + atay in the same place…a satalite entity will cover the character's movement + outside of his bounding box.  Spins + out from the wall now.
STD_FCORNERPEAK_RT_M_2l  FALSEPeak around corner, + fire an automatic burst, and return to coverStand Attack02829quake_ground must + atay in the same place…a satalite entity will cover the character's movement + outside of his bounding box.  Spins + out from the wall now.
STD_FCORNERPEAK_RT_P_Al  FALSEPeak around corner, + fire 2 shots (pistol), and return to coverStand Attack01920quake_ground must + atay in the same place…a satalite entity will cover the character's movement + outside of his bounding box.  Spins + out from the wall now.
STD_FGANGBANGER_N_M_2l  FALSEViolent machine gun + bursts (gun held up high and thrust forward during shots).  Use esp. for skinheads/punk/mob guys?  CURRENTLY NOT USED!Stand Attack-21821 
STD_FRAPID_N_P_2o  TRUEShooting very rapidly + 20 FPS…a loop of 4 frames.Stand Attack03420 fps
STD_FRAPIDSWEEP_LT_P_2o  FALSEFiring 8 shots from + right to leftStand Attack10372815 fps
STD_FSWATSTYLE_FWD_M_2l  FALSEStand fire with gun + right up to face as if aiming.  + Hunched shoulders.  Use for + more high tech and official guys (esp. swat and Black Raiders)  CURRENTLY NOT USED!Stand Attack01516 
STD_FVIOLENT_DWN_M_2l  FALSEstand fire machine + gun down violently (as if over ledge or at victim on floor)Stand Attack03233 
STD_FVIOLENT_DWN_P_Nl  FALSEstand fire pistol + down violently (as if over ledge or at victim on floor)Stand Attack04647 
STD_HLEANLTSHT_FRM_A_No oFALSETransition from + leaning left around corner.  Intended + as a client animation.
+
+ ONLY TWO FRAMES LONG!!!
Stand Misc. Movement49524 
STD_HLEANLTSHT_FRM_L_2o oFALSETransition from + leaning left around corner.  Intended + as a client animation.
+
+ ONLY TWO FRAMES LONG!!!
Stand Misc. Movement62654 
STD_HLEANLTSHT_MID_A_No oFALSEleaning left around + corner aim breathe…5FPS.  Intended as + a client animation.Stand Attack3948105 fps
STD_HLEANLTSHT_MID_L_2o oFALSELeaning left around + corner aim breathe…5FPS.  Intended as + a client animation.Stand Attack5261105 fps
STD_HLEANLTSHT_TO_A_No oFALSETransition to leaning + left around corner.  Intended as a + client animation.
+
+ ONLY TWO FRAMES LONG!!!
Stand Misc. Movement36394 
STD_HLEANLTSHT_TO_L_2o oFALSETransition to leaning + left around corner.  Intended as a + client animation.
+
+ ONLY TWO FRAMES LONG!!!
Stand Misc. Movement49524 
STD_HLEANRTSHT_FRM_A_No oFALSETransition from + leaning right around corner.  Intended + as a client animation.
+
+ ONLY TWO FRAMES LONG!!!
Stand Misc. Movement33364 
STD_HLEANRTSHT_FRM_L_2o oFALSETransition frm + leaning right around corner.  Intended + as a client animation.
+
+ ONLY TWO FRAMES LONG!!!
Stand Misc. Movement59624 
STD_HLEANRTSHT_MID_A_No oFALSEleaning right around + corner aim breathe...5FPS.  Intended + as a client animation.Stand Attack2332105 fps
STD_HLEANRTSHT_MID_L_2o oFALSELeaning right around + corner aim breathe…5FPS.  Intended as + a client animation.Stand Attack3645105 fps
STD_HLEANRTSHT_TO_A_No oFALSETransition to leaning + right around corner.  Intended as a + client animation.
+
+ ONLY TWO FRAMES LONG!!!
Stand Misc. Movement20234 
STD_HLEANRTSHT_TO_L_2o oFALSETransition to leaning + right around corner.  Intended as a + client animation.
+
+ ONLY TWO FRAMES LONG!!!
Stand Misc. Movement33364 
std_Iadjust_n_l_2o  FALSERocket launcher guy + standing around adjusting launcher on shoulderIdle152713 
STD_IALERT_N_MRS_2o kFALSEstand idle alert + (guarding something) with machine gun/rifle/shotgun  5 fps.  *soft notes + (play control 5 fps 0  34)Idle01617 
STD_IALERT_N_P_NokkFALSEstand idle alert + (guarding something) with pistolIdle01617Use when enemies are + guarding something or on edge.  Not + just standing around casually.  Danger + is imminent.  5 fps.  *soft notes (play control 5 fps 0 34)
STD_IALERTLK_LT_MRS_2o  FALSEidle alert, guarding + something quick glance leftIdle-12-112Use when enemies are + guarding something or on edge.  Not + just standing around casually.  Danger + is imminent.
std_Ialertlk_lt_p_no  FALSEidle alert, guarding + something quick glance left  + (transitions to and from std_ialert. . .)Idle-12-112 
std_Ialertlk_rt_mrs_2o  FALSEidle alert, guarding + something quick glance right  + (transitions to and from std_ialert. . .)Idle-38-2712 
std_Ialertlk_rt_p_no  FALSEidle alert, guarding + something quick glance right  + (transitions to and from std_ialert. . .)Idle-37-2612 
std_Ialerttrn_lt_mrs_2o  FALSEidle alert, guarding + something turn back left  (transitions + to and from std_ialert. . .)Idle-25-1313 
std_Ialerttrn_lt_p_no  FALSEidle alert, guarding + something turn back left  (transitions + to and from std_ialert. . .)Idle-25-1313 
std_Ialerttrn_rt_mrs_2o  FALSEidle alert, guarding + something turn back right  + (transitions to and from std_ialert. . .)Idle-51-3913 
std_Ialerttrn_rt_p_no  FALSEidle alert, guarding + something turn back right  + (transitions to and from std_ialert. . .)Idle-50-3813 
STD_ICLEANGUN2_N_MRS_2o  FALSEFrom the + istand_n_mrs_2, enemy lifts guns, checks and wipes off.  Basic variation of the idle.  Transitions back to istand.Idle04445 
STD_ICLEANGUN2_N_PK_No  FALSEguy wipes gun.  Transition to and from std_istand_n_a_a is + included in the animationIdle04445 
STD_IETALKPOSE_N_A_No  FALSEIdle for talking + people transitions with the to and frm of etalk…5 FPSScripted Events012135 fps
STD_IETALKPOSE_RT_A_No  FALSEidle breathe looking + right.  2 frames longIdle464721 fps
STD_IGUNUP_N_A_No  FALSEIdle breathe with the + gun in the up position.  From the Soft + file std_efrmshadow_n_p_n (39-58).Idle202895 fps.  Joins with std_efrmshadow_n_p_n.  Also taken from that soft scene.
STD_IGUNUPLOOK_N_A_No  TRUEScan around idle that + matches up with "STD_IGUNUP_N_A_N".  See if we could get away with a lower frame rate…not + necessarilly 5 FPS though.  Mark the + resultant frame rate under notes if it is different than 10 fps.Scripted Events5974165fps
STD_ILEAN_N_P_No  FALSEleaning forward with + hands on a 32 unit tall rail. Looking straight ahead and down, breathing, + interfaces with the ILEANLOOK series  + 5 fps.  *soft notes (play + control 5 fps 91  110)Scripted Events465510 
STD_ILEANLOOK_FRM_PK_Ao  FALSEtransition back to + I_stand  From looking over railingIdle679024transitions to and + from std_istand_n_a_a???
+
+
+
+ Softimage filename: std_ileanlook_n_pk_n
STD_ILEANLOOK_MID_PK_Ao  FALSElooking over railingIdle186649transitions to and + from std_istand_n_a_a???
+
+
+
+ Softimage filename: std_ileanlook_n_pk_n
STD_ILEANLOOK_TO_PK_Ao  FALSEtransition to leaning + on railing from I_stand_pIdle01718transitions to and + from std_istand_n_a_a???
+
+
+
+ Softimage filename: std_ileanlook_n_pk_n
STD_ILOOKING_N_A_Alk FALSEGuy looking over + shoulders.  Transitions to and from + std_istand_n_a_a.  Do not use on guys + holding longer weapons (like minimi, sniper rifle).  Could be use for shot gun, ingram if desired)Idle3710165Filename: + std_istand_allmocaps_a_a frames 35-101
STD_ILOOKING_N_MRS_2o  FALSEguy looks right and + left, transitions to and from std_istand_n_mrs_2Idle3710165is saved under file + std_istand_mrs
std_Imonitor_n_a_no  FALSEcuts in on + istand.  Use only for guys looking at + monitors.  Guy looks back and forth, + scanning information in front of him.  + Taken from soft file -std_imonitorup_n_a_n.Idle6213170 
STD_IMONITORUP_N_A_No  FALSEguy staring up at a + high monitor.  Do not use on guys + holding longer weapons (like minimi, sniper rifle).  Could be use for shot gun, ingram if desired).  Add cut into "imonitorup2" as + variation.  From Soft  database-std_imonitorup2_n_a_nIdle6213170looking up at monitor
STD_IMONITORUP2_N_A_No  FALSECut in for variation + of Imonitorup.  In this, guy looks + back and forth, holds chin, points. Taken from soft file- + std_imonitorup_n_a_n.Idle16161 
STD_ININJA_N_P_No  FALSENinja stance idle + breatheIdle02324 
STD_IPISS_N_A_Ao  FALSEenemy taking a piss + at urinal (one frame)Scripted Events111 
std_Ishift_n_a_n  oFALSEIdle movement, brings + hand to neck and rubs.  Originates + from and returns to std_I_n_a_a for the female.Idle125544 
std_Ishiftlook_n_l_2o  FALSERocket launceher guy + shifting weight and looking casually to the left.  Returns to normal state.Idle01415 
STD_ISMOKE_FRM_A_No  FALSEGuy flicks cig down + and stamps out.  Trans back into + istand with p.Idle9513238 
STD_ISMOKE_N_A_No  FALSETaking a drag from a + cigarette and then flicking the asches while looking around.  Do not use on guys holding longer weapons + (like minimi, sniper rifle).  Could be + use for shot gun, ingram if desired)Idle04950 
STD_ISMOKE_TO_A_No  FALSEFrom istand with + pistol, he lights cig and starts smokingIdle509445 
STD_ISPIT_N_MRS_2o  FALSEtransitions with base + mrs idle.  Guy simply leans forward a + little and spits.  Trans back to mrs + istand.Idle03435 
STD_ISTAND_N_A_N  lTRUEStand idle breathe + (female)Idle01112 
STD_ISTAND_N_A_Nlk FALSEthe stand from which + almost everything originates.  Do not + use on guys holding longer weapons (like minimi, sniper rifle).  Could be use for shot gun, ingram if + desired)Idle01718Filename: *soft notes + std_istand_allmocaps_a_a frames 0-34, change play control to 5.  Export at 5fps
STD_ISTAND_N_MRS_2o  FALSEstand idle with + machine gun/rifle/shotgunIdle01718soft notes (frames + 0-34 - change playcontrol to 5 fps)
STD_ISTRETCH_N_A_Alk FALSEstretch, transition + to and from std_istand_n_a_a.  Do not + use on guys holding longer weapons (like minimi, sniper rifle).  Could be use for shot gun, ingram if + desired)Idle10216867Filename: + std_istand_allmocaps_a_a frames 102-168
std_Istretch_n_mrs_2o  FALSEidle stretch carrying + machine gun/rifle/shotgun.  + Transitions to and from std_istand_n_mrs_2Idle10216968 
STD_ITALK_N_A_No  FALSEguy talking.  Can loop or transition with istand.  Do not use on guys holding longer weapons + (like minimi, sniper rifle).  Could be + use for shot gun, ingram if desired).Idle-38286Filename: + std_istand_allmocaps_a_a frames ?-?  + talk to designers to see how talking will work (a talking flag?)     DAN--GET THIS IN AS SOON AS IT IS + EXPORTED AND READY!
STD_ITALK_N_MRS_2l  FALSEguy talking.  Can loop or transition with istand.  Holding machine gun/rifle/shotgun.Idle-56773talk to designers to + see how talking will work (a talking flag?)
STD_ITALKPOSE_UP_A_No  FALSECharacter idle + breathe while looking up. Merges with etalk_up.  5FPSScripted Events465510 
STD_ITOUCHNUTS_N_A_Nl  FALSEguy adjusts his + package.  Transitions to and from + std_istand_n_a_a.  Do not use on guys + holding longer weapons (like minimi, sniper rifle).  Could be use for shot gun, ingram if desired)Idle-53743 
STD_ITURNVALVE_FRM_N_No  FALSEtransition back to + istand_n_pk_n from turning valveScripted Events19235 
STD_ITURNVALVE_N_N_No  FALSEGuy turning a valve + (32 pixels off ground, 24 pixel wide valve).  + Transitions with to and from.Scripted Events334513 
STD_ITURNVALVE_TO_N_No  FALSEtransition to turning + valve from istand_n_pk_n.  Aprox. 5-10 + pixels away.Scripted Events01415 
STD_IWIPEBROW_N_A_Nl  FALSEguy (someone in hot + locale) wipes his forehead, annoyed with heat.  Do not use on guys holding longer weapons (like minimi, sniper + rifle).  Could be use for shot gun, + ingram if desired)Idle02021taken from soft file: + std_iwipebrow2_n_a_n
STD_JDIVE2PRONE_N_A_Nlk FALSEguy dives to avoid + something/escape.  Ends up in prone + positon.  Transitions to + prn_xtoready_n_a_a.Stand Misc. Movement01818 
STD_JDOWN_N_A_Al  FALSEUsed only for + scripted events.  A run/jump down a + minimal height   (32 pixels).  Ends up in generic ready position.Stand Misc. Movement52420 
STD_JDROP_N_A_Ao  FALSEguy falling through + air and landing, ends up in generic ready position.  Especially good for special events, like guys falling from + vents in ceiling.  Surprise factor.  DO NOT USE ON ECTOScripted Events82417frames 8-24
STD_JDROP_TO_A_No  FALSETransitioning into + jdrop with a small hop or a step.Stand Misc. Movement0910 
STD_JFLIP_BK_A_No  FALSENinja + backflipping.  From soft scene named + Std_jflip_n_p_nStand Misc. Movement11111frame rate should be + at 13fps in .ghl.
STD_JRUN_FWD_A_Al kFALSEJump/run across + chasm.  Steve, we are under the + impression you can control height and distance of jump.Stand Misc. Movement31816This animation will + pop slightly due to the fact that it has to be "spontaneous" enough + to start at any point durring the run cycle.  + It will, however, merge perfectly with the beginning of a new run + cycle.
STD_JSTRAIGHTUP_UP_A_Al kFALSEinitial jump straight + upStand Misc. Movement02324use last half for + "drop in" animation: Split drop, fall loop, and ground hit.
STD_JSTRAIGHTUP_UP_L_2o kFALSEinitial jump straight + up with launcher (transitions to jstraitup_mid_l_2)Stand Misc. Movement02324 
STD_JTHROWSTAR_BK_A_No  FALSENinja jump, retreat + backwards while throwing 3 starsStand Misc. Movement21211fire @f's 6,7,8
STD_JTHROWSTAR_FWD_A_No  TRUEninja jump while + throwing 3 starsStand Attack21211 
STD_JUPTO_N_A_Al  FALSEguy jumps up to table + height place.  Can carry any weapon + (but rocket launcher)  NOT SURE WHERE + THIS COULD BE USED.  POSSIBLY TO + TRAVERSE OBSTACLES.  CUT?Stand Misc. Movement12020 
std_l_n_l_2o kFALSEload rocket + launcher.  Transitions to and from + aim.Stand Misc. Movement03233 
std_l_n_ms_2l kFALSELoad machine and shot + gun.  Transitions to and from aim.Stand Misc. Movement03031 
std_l_n_p_2l kFALSEload pistol 2 + handed.  Transitions to and from aim.Stand Misc. Movement01617 
STD_L_N_P_Ko  FALSEReloading the pistol + with a machette in the left hand.Stand Misc. Movement01617 
STD_L_N_P_Noo FALSEload pistol 1 + handed.  Transitions to and from aim. 01617 
std_l_n_r_2o kFALSEreload rifle.    Transitions to and from aim.Stand Misc. Movement02223 
STD_MKICKLOW_N_A_Al  FALSEViolent kick at + something on the ground, most likely a hostage.  Transitions to and from ialertStand Attack02021 
STD_MKNEENUTS_FRM_A_No  TRUEtransistion from + character reaching out and kneeing another character in the nads.Stand Attack000 
STD_MKNEENUTS_MID_A_No  TRUEcharacter kneeing + another character in the nads.Stand Attack000 
STD_MKNEENUTS_TO_A_No  TRUEtransistion to + character reaching out and kneeing another character in the nads.Stand Attack000 
STD_MNINJAKICK_N_A_Bl  FALSEninja forward kickStand Attack11010 
STD_MPISTOLWHIP_N_P_Nl  FALSEPistol whip + pound.  Great for hostages!Stand Attack01819 
STD_MRIFLEBUTT_N_MRS_2l  FALSEa violent punch with + rifle butt.  Again, great for + hostages!  Can be used to push hostage + in front of train.Stand Attack01617 
STD_MSLASH_N_KP_Nl kFALSEslash with knife + (right hand) or pistol (player knife slash, desert eagle secondary fire)Stand Misc. Movement01819 
STD_MSWIPE_N_KP_Bl  FALSESword or bat swipe + (left hand)Stand Attack32220 
std_paim_n_a_no  FALSEstand attack while + injured and moving (limping).  Used + for either shot in foot, leg, or arm.  + Could possibly be used for shoulder shot.Injury/Death01415 
std_parm_lt_n_nlkkFALSEguy standing, holding + arm and writhing in pain.  Transitions + from std_sarm_lt_n_n.  If shot again, + transitions into any standing death.  Or, + he could limp away (std_plimp_lt_n_n)Injury/Death255026 
std_parm_rt_n_nlkkFALSEguy standing, holding + arm and writhing in pain.  Transitions + from std_sarm_rt_n_n.  If shot again, + transitions into any standing death.  Or, + he could limp away (std_plimp_rt_n_n)Injury/Death02425 
std_pblinded_frm_a_nokkFALSEtransition out of + pblinded_midInjury/Death426019 
std_pblinded_loop_a_nlkkFALSEGuy writhes, blinded + by flash grenade (or generic explosion if you want)Injury/Death164227 
std_pblinded_to_a_nlkkFALSEtransition into + pblinded_midInjury/Death11515 
std_phop_lt_n_nlkkFALSEhopping when shot in + right foot OR could try once in a while when leg shot off at right kneeInjury/Death056 
std_phop_rt_n_nlkkFALSEhopping when shot in + left foot OR could try once in a while when leg shot off at left kneeInjury/Death056 
std_plimp_lt_n_nl kFALSElimp away when shot + in right???? Leg.  Also could be used + after std_parm_lt_n_n.Injury/Death089 
std_plimp_rt_n_nl kFALSElimp away when shot + in left???? Leg.  Also could be used + after std_parm_rt_n_n.Injury/Death089 
STD_R_DWNST_MRS_2o kFALSErun downstairs with + machine gun/rifle/shotgunStand Walk/Run144 
STD_R_DWNST_PN_A  lFALSEfemale run downstairs + with pistol or nothingStand Walk/Run144 (keep left hand down somewhat) (make sure + this is one with her running sideways)
std_r_dwnst_pn_alk FALSErun downstairs with + pistol/knife or anythingStand Walk/Run144 (keep left hand down somewhat)
std_r_n_mrs_2  lFALSEfemale run with + machine gun/rifle/shotgunStand Walk/Run056This animation has a + specific Hierarchy modification.  IF + THERE IS NEED OF FUTURE RE-EXPORTATION, THE NEW HIERARCHY MUST BE MODIFIED IN + A LIKE MANNER OR STEPS MUST BE MADE TO INSURE THAT THE ANIMATION IS + SUCCESSFULLY TRANSFERRED.
STD_R_N_MRS_2l  FALSErun carrying machine + gun/rifle/shotgunStand Walk/Run056 
std_r_n_pk_n  lFALSEfemale run with + pistol/knife and nothing (change to anything--make work for briefcase?)Stand Walk/Run056 
STD_R_N_PK_Nlk FALSErun with pistol/knife + and nothingStand Walk/Run056 
std_r_upst_pn_alk FALSErun upstairs with + pistol/knife and anythingStand Walk/Run034(keep left hand down + somewhat for briefcase)
std_rafraid_n_n_n  lFALSEfemale run afraidFear056 
STD_RAFRAID_N_N_Nlk FALSEmale run afraidFear276 
std_rafraid_to_n_nokoFALSEtransition to + run_afraid.  Could be used for NPC or + after enemy gets gun shot from hand.Fear089 
std_rafraid2_n_a_alk FALSEanother version of + run afraid; leaning lower to ground.  + USE?  Could use on female.Fear056 
std_rafraid2_n_n_n  lFALSErun afraid for + female.Fear056 
std_raim_n_l_2l  FALSErun and aim/shoot + rocket launcherStand Attack056 
std_raim_n_mrs_2l  FALSErun aim/fire with + machine gun/rifle/shotgunStand Attack056 
std_raim_n_p_2l  FALSErun aim/fire carrying + pistol 2 handedStand Attack056 
std_raim_n_p_nlk FALSErun aim/fire pistol + one handed.  ONLY USE ON ECTO!!!!!Stand Attack056 
std_raimstraf_lt_l_2l kFALSEstrafe aim/shoot left + carrying launcher.  Probably only + useful for deathmatch.Stand Walk/Run056 
STD_RAIMSTRAF_LT_P_CBNl kFALSEstrafe left + aim/shooting pistol and briefcase/bat/nothingStand Walk/Run056 
std_raimstraf_rt_l_2l kFALSEstrafe aim/shoot + right carrying launcherStand Walk/Run056 
STD_RAIMSTRAF_RT_MRS_2l kFALSEstrafe right + aiming/firing machine gun/rifle/shotgunStand Walk/Run056 
STD_RAIMSTRAF_RT_P_CBNl kFALSEstrafe right carrying + pistol and briefcase/bat/nothingStand Walk/Run056 
std_rbackaim_n_l_2l kFALSEretreat aiming/firing + launcherStand Walk/Run056 
STD_RBACKAIM_N_MRS_2l kFALSEretreat aiming/firing + machine gun/shotgun/rifleStand Walk/Run034 
STD_RBACKAIM_N_P_2l kFALSEretreat + aiming/shooting pistol 1 handedStand Walk/Run056 
STD_RDYNAMIC_N_A_No  FALSEMore powerfull run + for cinematics including slow motion shots…20 FPSStand Walk/Run089MUST BE RUN THROUGH + AT 20 FPS
STD_RGUNUP_N_P_2l  FALSErun with pistol (gun + up in air, 2 handed).Stand Walk/Run078Old version of + std_rgunup_n_p_2 is from bin 2, frames 0-5 and is no longer used.  Instead, it's been replaced by + std_wjoggunup_n_p_a and saved with the above name.
STD_RONFIRE_N_N_No  FALSErunning around on + fire waving arms & thrashingInjury/Death056 
STD_RONFIRETODTH_N_N_No  FALSETransition from + std_ronfire_n_n_n to std_sonfire_2bk_n_nInjury/Death694 
STD_RSWIPE_N_K_No  FALSERun loop with an + "swipe" attack that works with "std_raim_fwd_p_n"Scripted Events056 
STD_RTOSTOP_N_MRS_2o  FALSEtransition to idle + stand from running (only works when placed at the end of the run cycle!)Stand Misc. Movement6149 
STD_RTOSTOP_N_PK_No  FALSEtransition to idle + from run (only works when used at end of run cycle)Stand Misc. Movement6149 
std_sarm_lt_n_nlkkFALSEstand shot in + arm.  Transitions to std_parm_lt_n_n.Injury/Death02425 
std_sarm_rt_n_nlkkFALSEstand shot in + arm.  Transitions to std_parm_rt_n_n.Injury/Death02425 
STD_SBLOWN_2BK_N_Nlk FALSEshot with powerful + weapon (like shotgun) and blown backwardInjury/Death12626 
std_schest_2frnt_n_nl kTRUEshot in chest, fall + forward.   Arms flail back and body + hits the ground with nice weight.Injury/Death02627 
std_sdance_n_n_nlkkFALSEGuy dancing from + machine gun fire.  Falls when firing + stops (or after certain amount of time)Injury/Death23736 
STD_SELECTROCUTE_N_N_No  FALSEloop of guy standing + getting electrocuted and not dying.Injury/Death21299 
STD_SFALLFWD_2FRNT_N_No  FALSEshot, fall forward + off a high place, transition into prn_xfalling_n_n_n.  Use as a "scripted event" (guy + set close to guard tower edge, doesn't move.  + Just shoots at you until you kill him.  He falls)Injury/Death51713Transition to falling + off tower
std_sgroin_2side_n_nlk FALSEshot in nuts, falls + to left side.  Use groin null for hit + detection to make this work.  + Transitions to ls_sautofire for when shot while on groundInjury/Death03940 
std_sgunfromhand_n_n_nlkkFALSEgun shot from hand, + shakes hand (ouch!), into ready stance, can transition into run or run afraidInjury/Death02223 
std_sgut_2side_n_nl  FALSEshot in gun, double + over, fall to left sideInjury/Death03031 
std_shead_2frnt_n_nlkkFALSEshot in head.  Immediate fall to face.  USE FOR SINGLE SHOT TO HEAD, ESP. WITH + SNIPER RIFLE.Injury/Death22827 
STD_SINBACK_2FRNT_N_Nl  FALSEshot in back with + powerful weapon.  Fly.  Fall to front.  Could be used for scripted events, esp. in response to + explosions.Injury/Death11919 
std_sleg_lt_n_nl kFALSEshot in left + leg.  Transitions to limpInjury/Death122615 
std_sleg_rt_n_nl kFALSEshot in rt leg.  Transitions to limpInjury/Death122615 
std_sleglt_2bk_n_nlkkFALSEUse for major blow to + leg (esp. leg blown off).  Transitions + in generic pain or leg pain.Injury/Death22019 
std_slegrt_2bk_n_nlkkFALSEUse for major blow to + leg (esp. leg blown off).  Transitions + in generic pain or leg pain.Injury/Death22019 
std_smicro_n_n_noooFALSEPuff up and explode + from getting shot by microwave gunInjury/Death365015set frame rate to + 20frames per second.  Also keep high + res hands turned on.
std_snervegun_2bck_n_nlkkFALSEdeath from neural + pulse emitterInjury/Death178064 
std_sonfire_2bk_n_nlkkFALSEguy on fire, falls to + back and diesInjury/Death05253 
STD_SSABREDEATH_BK_N_No  FALSESabre getting shot in + the chest, stubling back and falling off a building, make transition with the + xfall animationInjury/Death-11214 
std_sshoulder_lt_n_nlkkFALSEuse for shot in left + shoulder front, right shoulder back.  + Ends up laying on front!Injury/Death11616 
std_sshoulder_rt_n_nlkkTRUEuse for shot in right + shoulder front, left shoulder back.  + Ends up laying on front!Injury/Death11616 
STD_SSTUMBLE_2BK_P_Nl  FALSEguy shot while + running forward.  Does a flip forward + and dies on back.Injury/Death12727 
STD_SSTUMBLE_2FRNT_N_Nl  FALSEshot while running + forward, stumbles, ends up on stomachInjury/Death12727 
std_sthroat_2side_n_nlkkFALSEshot in throat (use + throat null on neck for detection), grabs neck, falls to left sideInjury/Death05455 
std_stoknees_2bk_n_nlk FALSEshot, fall to knees, + then to backInjury/Death45754 
std_sunhurt_bk_mrs_2l kFALSEjerk backward (shot + in front while wearing armor)   Use + for when a guy is hit but has armor OR WHEN A GUY IS HIT (LIKE WITH GLOCK) + BUT DOES NOT DIE OR GO INTO INJURED ANIMInjury/Death133 
std_sunhurt_bk_pk_nookFALSEjerk backward (shot + in front while wearing armor)   Use + for when a guy is hit but has armor OR WHEN A GUY IS HIT (LIKE WITH GLOCK) + BUT DOES NOT DIE OR GO INTO INJURED ANIMInjury/Death133 
std_sunhurt_fwd_mrs_2o kFALSEjerk forward (shot in + back while wearing armor).     Use for + when a guy is hit but has armor OR WHEN A GUY IS HIT (LIKE WITH GLOCK) BUT + DOES NOT DIE OR GO INTO INJURED ANIMInjury/Death11133 
std_sunhurt_fwd_pk_nookTRUEjerk fwd (shot in + back while wearing armor)   Use for + when a guy is hit but has armor OR WHEN A GUY IS HIT (LIKE WITH GLOCK) BUT + DOES NOT DIE OR GO INTO INJURED ANIMInjury/Death11133 
STD_SVIOLENT_N_N_Nl kFALSEa violent generic + death to be used when limbs are shot off.  + LET'S LOOK AT THIS.  GET ERIC.Injury/Death02122 
std_tgrenade_n_a_nl kFALSEstand throw grenade + with left hand (pull pin and chuck forward over head)Stand Attack02324 
std_tknife_n_k_al kFALSEthrow knife/throwing + stars with right hand-knife leaves hand between frame 8 & 9Stand Attack02122 
std_tmolotov_n_a_nokkFALSEStand and throw + molotov cocktail (basic throw but without the pin-pulling action)Stand Attack03637 
STD_TRUN_N_A_Nl  FALSEthrow grenade while + runningStand Attack01516 
STD_TSTAR_FWD_A_No  FALSEmissile attack for + ninjas, throwing stars with left handStand Attack24285 
std_tunder_n_a_nl  FALSEstand, throw grenade + underhanded (needed?)Stand Attack02425 
std_w_n_mrs_2  lFALSEfemale walk with + machine gun/rifle/shotgunStand Walk/Run0910The null hierarchy + has been altered to accommodate the animation.  If re-application is necessary, look at the original scene's + structure and duplicate.
STD_W_N_PN_N  lFALSEfemale walk with + pistol/nothing and nothing in left handStand Walk/Run0910 
STD_WAFRAID_BK_A_No  TRUEwalking backwards + fearfully,  right hand slightly + forward, keeping in mind gun may be in hand.Stand Walk/Run01314 
std_waim_fwd_l_2l kFALSEwalk aim forward + carrying rocket launcher.  Can shoot + during this anim.  Take the mocap and + make sure the launcher is aimed forward.Stand Walk/Run0910 
std_waim_fwd_ms_2o kFALSEwalk forward aiming, + possibly shooting.  Transitions with + stand aim, walk strafe aim, walk back aim.Stand Walk/Run01314 
std_waim_fwd_p_2o kFALSEwalk forward aiming, + possibly shooting.  Transitions with + stand aim, walk strafe aim, walk back aim.Stand Walk/Run0910 
std_waim_fwd_r_2o kFALSEwalk forward aiming, + possibly shooting.  Transitions with + stand aim, walk strafe aim, walk back aim.Stand Walk/Run01314 
std_waimstraf_lt_l_2o kFALSEwalk strafe + left.  Could be firing weapon if + desired.  Make sure transitions + roughly into walk back and stand aim and walk forward aim.Stand Walk/Run0910 
std_waimstraf_lt_ms_2o kFALSEwalk strafe + left.  Could be firing weapon if + desired.  Make sure transitions + roughly into walk back and stand aim and walk forward aim.Stand Walk/Run01314 
std_waimstraf_lt_p_2o kFALSEwalk strafe + left.  Could be firing weapon if + desired.  Make sure transitions + roughly into walk back and stand aim and walk forward aim.Stand Walk/Run01314 
std_waimstraf_lt_r_2o kFALSEwalk strafe + left.  Could be firing weapon if + desired.  Make sure transitions + roughly into walk back and stand aim and walk forward aim.Stand Walk/Run01314 
std_waimstraf_rt_l_2o kFALSEwalk strafe + left.  Could be firing weapon if + desired.  Make sure transitions + roughly into walk back and stand aim and walk forward aim.Stand Walk/Run0910 
std_waimstraf_rt_ms_2o kFALSEwalk strafe + left.  Could be firing weapon if + desired.  Make sure transitions + roughly into walk back and stand aim and walk forward aim.Stand Walk/Run01314 
std_waimstraf_rt_p_2o kFALSEwalk strafe + left.  Could be firing weapon if + desired.  Make sure transitions + roughly into walk back and stand aim and walk forward aim.Stand Walk/Run01314 
std_waimstraf_rt_r_2o kFALSEwalk strafe + left.  Could be firing weapon if + desired.  Make sure transitions + roughly into walk back and stand aim and walk forward aim.Stand Walk/Run01314 
STD_WATTITIUDE_N_PK_Aok FALSEwalk with attitude + (esp. for skinheads, etc.)Stand Walk/Run01314 
std_wbackaim_n_l_2o kFALSEwalk back.  Could be firing weapon if desired.  Make sure transitions roughly into walk + fwd, and stand aim and strafe walk aim.Stand Walk/Run01314 
STD_WBACKAIM_N_MS_2o kFALSEwalk back.  Could be firing weapon if desired.  Make sure transitions roughly into walk + fwd, and stand aim and strafe walk aim.Stand Walk/Run01314 
std_wbackaim_n_p_2o kFALSEwalk back.  Could be firing weapon if desired.  Make sure transitions roughly into walk + fwd, and stand aim and strafe walk aim.Stand Walk/Run01314 
std_wbackaim_n_r_2o kFALSEwalk back.  Could be firing weapon if desired.  Make sure transitions roughly into walk + fwd, and stand aim and strafe walk aim.Stand Walk/Run01314 
STD_WBACKWARDS_N_A_No  FALSEWalking backwards…not + aiming.  Same speed as w_aim seriesStand Walk/Run0910 
STD_WBCKSIGNAL_N_N_No  FALSEwalking backwards, + signalling helicopterScripted Events11414 
STD_WCARRY1_N_N_Nl  FALSEguy carrying + something heavy (like a bunch of pipes)Scripted Events0910 
STD_WCARRY2_N_N_No  FALSECarrying a  16 X 16 crate.Stand Walk/Run0910 
STD_WFAST_N_A_No  FALSEA walk cycle that + fits into 8 framesStand Walk/Run078 
std_wgunup_n_p_2l  TRUEwalk with pistol up, + 2 handed (cautious looking)Stand Walk/Run0910 
std_wgunup_n_p_nc  lFALSEfemale walk with + pistol up, 1 handed (cautious looking).  + Could be carrying nothing or briefcase.Stand Walk/Run089 
STD_WJOG_N_MRS_2l  FALSEwalk jog, hunched + over with machine gun/rifle/shotgunStand Walk/Run078 
STD_WJOGGUNDWN_N_P_2l  FALSEwalk jog (cautious) + with pistol in downward position, 2 handedStand Walk/Run078 
STD_WJOGGUNUP_N_P_Al kFALSEwalk jog with gun + pointed up, one hand (briefcase can work in left).  This one is used under the name std_rgunup_n_p_2.Stand Walk/Run078 
STD_WLOOK_RT_MRS_2o  TRUEguard walking and + looking at Decker to his right.Scripted Events01920 
std_wmilitary_n_p_no  TRUEstiff, military walk + carrying pistolStand Walk/Run0910 
STD_WNORMAL_N_PK_Alk FALSEwalk normal with + pistol/knife and anything in left (will briefcase work?)Stand Walk/Run01314Eport frames 1-14 not + 0-13
STD_WPATROL_N_MRS_2l  FALSEwalking, patrolling + area carrying machine gun/rifle/shotgun.  + *for animators (Replaces std_wpatrol_n_mrs_2 Bin#7 0-9, with soft file + -std_wtalk_n_mrs_2.)Stand Walk/Run0910 
STD_WPUSH_N_N_No  FALSEPushing a gate openScripted Events01314 
STD_WPUSHCART_N_N_No  FALSEpushing a cart, hands + 32 pixels off ground.  Meant for + pushing object like a pallette jack.Scripted Events01314used only as scripted + event
STD_WSTEALTH_N_PK_No  FALSEStealthfully walking, + merges with efrmshadowsStand Walk/Run02324 
STD_WTALK_LT_MRS_2o  FALSEA generic talking + cycle encompassing a walk cycle or two. Looking left.Scripted Events02930 
STD_WTOSTOP_N_PK_Ao  FALSEtransition from walk + to idle for cinimatic use.Stand Walk/Run14185 
STD_WTOSTOP_N_PK_Ao  FALSEtransition from walk + to idle for cinimatic use.Stand Walk/Run14185 
std_wturn180_lt_mrs_2o  TRUEturn 180 degrees with + machine gun/rifle/shotgunStand Walk/Run0910has 1 cycle of walk + at front of this anim to allow for smooth transition and a "finish" + 1/2 cycle at the end to make it mesh with the regular walk cycle     Based off of the walk patrol animation.
std_wturn180_lt_pk_no  FALSEturn 180 degrees with + machine pistol/knifeStand Walk/Run0910has 1 cycle of walk + at front of this anim to allow for smooth transitionand a "finish" + 1/2 cycle at the end to make it mesh with the regular walk cycle     Based off of the walk normal animation
std_wturn90_lt_mrs_2o  FALSEturn 90 degrees with + machine gun/rifle/shotgunStand Walk/Run0910has 1 cycle of walk + at front of this anim to allow for smooth transitionand a "finish" + 1/2 cycle at the end to make it mesh with the regular walk cycle     Based off of the walk patrol animation.
std_wturn90_lt_pk_no  FALSEturn 90 degrees with + machine pistol/knifeStand Walk/Run0910has 1 cycle of walk + at front of this anim to allow for smooth transition and a "finish" + 1/2 cycle at the end to make it mesh with the regular walk cycle     Based off of the walk normal animation.   JUST MAKE 1 CYCLE LIKE  THE MACHINE GUNS!!!
std_wturn90_rt_mrs_2o  FALSEturn 90 degrees with + machine gun/rifle/shotgunStand Walk/Run0910has 1 cycle of walk + at front of this anim to allow for smooth transition and a "finish" + 1/2 cycle at the end to make it mesh with the regular walk cycle.     Based off of the walk patrol animation.
std_wturn90_rt_pk_no  FALSEturn 90 degrees with + machine pistol/knifeStand Walk/Run0910has 1 cycle of walk + at front of this anim to allow for smooth transition and a "finish" + 1/2 cycle at the end to make it mesh with the regular walk cycle.     Based off of the walk normal animation.  JUST MAKE 1 CYCLE LIKE  THE MACHINE GUNS!!!
STD_XAFRAIDSHAKE_N_N_NlkkFALSEstand shaking, afraid + (used mostly for npcs)Fear33533 
STD_XALARMPUSH_N_A_Nok FALSEgeneric push buttonScripted Events01011 
std_xatkpause1_n_mrs_2o kFALSEduring firefight, guy + stops shooting, just stands ready, breathing hard  5 fps.  *soft notes + (play control 5 fps -21  -2)Stand Attack-11-111 
STD_XATKPAUSE1_N_PK_No kFALSEduring firefight, guy + stops shooting, just stands ready, breathing hard  5 fps.  *soft notes + (play control 5 fps -21  -1)Stand Attack-11-111 
STD_XATKPAUSE2_N_MRS_2o  TRUEvariation of attack + pause--guy lifts head and looks around up ahead (transition with + std_atkpause1. . .).  From soft file + std_xatkpause_n_mrs_2.Stand Attack02930 
STD_XATKPAUSE2_N_PK_No  FALSEvariation of attack + pause--guy lifts head and looks around up ahead (transition with + std_atkpause1. . .)Stand Attack02930 
STD_XBOOMCROUCH_N_A_Nl  FALSEcrouch and cover head + (reaction to explosion), then standFear14141 
STD_XCCHCOWER_DWN_A_AokkFALSEstand, then + transition to cch_xcchcower_mid_a_a.Fear11111 
STD_XCHOKE_N_N_NlkkFALSEChoking from + explosion or gas grenadeInjury/Death078 
std_xcock_n_r_2o kFALSEcocking rifle, back + to aim (MAKE SURE STEVE USES!)Stand Misc. Movement43532 
std_xcock_n_s_2o kFALSEcock shot gun.  SEPARATE COCK FROM STD_F_FWD_S_2 AND PUT + IT HEAR.  MUST TRANSITION FROM FIRE + AND INTO AIM!  ONLY USED ON SHOTGUNS.Stand Misc. Movement61510 
std_xcrouch_dwn_l_2l kFALSEcrouch down, aiming + rocket launcher (trans to cch_a_n_l_2)Crouch8158 
std_xcrouch_dwn_mrs_2o kFALSEfrom stand, crouch + down with machine gun/rifle/shotgun.  + (trans to cch_a_fwd_m_2, cch_a_fwd_s_2, and cch_a_fwd_r_2)Crouch254 
std_xcrouch_dwn_pk_ao kFALSEfrom stand, crouch + down with pistol.  (trans to + cch_a_fwd_p_2)Crouch144Soft database + filename: std_xcrouch_n_pk_a   + SHOULDN'T USE FOR PEOPLE WITH BRIEFCASES.  THEY SHOULD NOT BE CROUCHING!
STD_XDANCE_N_N_Nl kFALSEloopable danceScripted Events56157USED FOR SECRET AREA + ON SIBERIA CHEMICAL WEAPONS LAB
STD_XDONTSHOOT_N_A_NlkkFALSEguy signalling + frantically "don't shoot".  + For NPCs.  Starts in + std_istand_n_a_a.  Ends in + std_xafraidshake.  (as if guy + standing, gun pointed at, and he reacts)Fear02728 
STD_XFEARWAVE_N_N_NlkkFALSEguy waving in fear + (transitions with std_xafraidshake_n_n_n to give some variation!)Fear04748 
STD_XGOPRONE_N_A_AokkFALSEgoing prone from + stand.  Transitions to prone aim or + prn_xcoverhead_to_n_n (NPC ONLY!!!!)Prone01314 
STD_XHANDSPRNG_BK_A_No  FALSEevasive ninja menuver + to escape playerStand Misc. Movement2634915 fps
STD_XHANDSPRNG_FWD_A_No  TRUEevasive ninja menuver + to escape playerStand Misc. Movement243512 
STD_XKICKDOOR_N_A_Ao  FALSEkick door open.  Used when an activated/fighting enemy + wants to open a door.  Also used for + scripted events.  Aprox 30-32 pixels + from door.Stand Misc. Movement089 
STD_XLADDER_DWN_A_Al kFALSEclimb down + ladder.  Based off of soft file + std_xladder.Stand Misc. Movement-13-86 
STD_XLADDER_UP_A_Al kFALSEclimb up ladder.  Based on soft file- std_xladder.Stand Misc. Movement056 
STD_XLADDERFRM_UP_A_Ao  FALSETransition from + climbing up the ladder…is mostly going to be used for john in the cinematic, + so quickly get him in a stance that transitions well with the 'xroll_rt'Stand Misc. Movement52722112 fps
STD_XLADDERTO_UP_A_Ao  TRUETransition to + climbing up the ladderStand Misc. Movement-7-17 
std_xopendoor_n_a_nokkTRUEGuy, stopped, pushes + door open with left hand.Stand Misc. Movement0910 
STD_XROLL_LT_A_Al  FALSEroll left to crouch + position.  From there guy can fire.Crouch01819use as surprise roll + out from corner or as an quick evasive movement in firefight.  At least 115-130 pixel room needed to + complete move.  15 fps
STD_XROLL_RT_A_Al  FALSEroll right to crouch + position.  From there guy can fire.Crouch01819use as surprise roll + out from corner or as an quick evasive movement in firefight.  At least 115-130 pixel room needed to + complete move.
STD_XROLLTOCCH_FWD_A_Al  FALSEroll forward to + crouch.  Can be used as evasive + maneuver.  At least 130 pixels needed + to complete the move.Crouch0181915 fps
STD_XSTARTLED_N_A_Al  FALSEstartled jump, quick + look, and to ready position (from there he can spin, attack, etc.)Stand Misc. Movement11010Use when guys are + standing in a room and buddy is shot, a bullet hits close by, etc. . .
STD_XSTUMBLE_N_A_Al  FALSEstumble (knocked off + balance) from nearby explosionStand Misc. Movement12727 
std_xtakecover_n_n_n  lFALSETAKE COVER ANIM.  End of animation merges with + std_rafraid_n_n_n for female.Stand Misc. Movement16060 
STD_XTUMBLE_2FRNT_N_No  FALSEviolent tumble and + then death (laying on front)Injury/Death23635play when guys fall + off train, hit ground
STD_XYELLATYOU_N_A_Al  FALSEyelling at someone, + taunting.  Good for yelling at + hostagesStand Misc. Movement02728 
STD_XYELLPOINT_FWD_A_Nl  FALSEyelling to someone on + his right and pointing "he's there!"Stand Misc. Movement03334 
STD_XYELLWAVE_BK_A_Nl  FALSEYelling and waving at + guys behind him "come on!"Stand Misc. Movement03334 
+ + + + diff --git a/Ghoul/max2/ghoulexp.dle b/Ghoul/max2/ghoulexp.dle new file mode 100644 index 0000000..5bf53b0 Binary files /dev/null and b/Ghoul/max2/ghoulexp.dle differ diff --git a/Ghoul/max3/ghoulexp3.dle b/Ghoul/max3/ghoulexp3.dle new file mode 100644 index 0000000..5b8ef96 Binary files /dev/null and b/Ghoul/max3/ghoulexp3.dle differ diff --git a/Ghoul/pmodels/buddy.gpm b/Ghoul/pmodels/buddy.gpm new file mode 100644 index 0000000..dd0d38a --- /dev/null +++ b/Ghoul/pmodels/buddy.gpm @@ -0,0 +1,106 @@ +//First entry points to the working directory for the player model +// (this should generally be "enemy/meso" or "enemy/female") +enemy/meso + +//Second entry points to .ghb file to be used by menus +// (meso_menu1-10 and fem_menu1&2 are available in the pakfile) +meso_menu5 + +//Third entry points to .ghb file to be used in the game +// (meso_player and fem_play are available in the pakfile) +meso_player + +//Fourth entry points to set of .gsq files to be used in the game +// (this will determine most of the model parts turned on/off in game--can +// be adjusted further down) +playerbulbul + +//Fifth entry is the teamname of this model +// ("Noteam" designates that model isn't on any team) +"Noteam" + +//Sixth entry points to the directory in which pain and death sounds are found +// (the following directories are available in the pakfile: +// "enemy/dth/skin"--used for New York single player levels +// "enemy/dth/russ"--used for Siberia/Kosovo single player levels +// "enemy/dth/arab"--used for Iraq/Sudan single player levels +// "enemy/dth/jpn"--used for Japan single player levels +// "enemy/dth/rad"--used for Castle single player levels +// "enemy/dth/fem"--used for females in single player) +"enemy/dth/skin" + +//Seventh entry points to set of faces to be used by player model +// (this can be set to "" if you don't want to make use of facial expressions--the +// ninja player model is set this way) +// (these face sets are available in the pakfile: +// f_amu_--General Amu +// f_w_2,3,4,6,8,10,11,12,15,16,17_--most of the caucasion faces in the single player game +// f_b_2-7_--most of the African and African-American faces +// f_h_6_--a serbian face +// f_hb_1_--a bearded face +// f_j_3,4,&8_--Asian faces +// f_john_--John Mullins +// f_m_1&5_--Middle Eastern faces +// f_sam_--Sam +// f_taylor_--Taylor) +"f_w_3_" + +//Eighth entry is a list of skins to set for the model +// (each list member has three parts: the material to set the skin for, the name of +// the skin, and the model part to set the skin for. The materials on the meso player +// model are: +// H--head material +// HD--hood material, for hooded coat +// F--face material +// MD--mask material, for chemical suit +// A--arm material +// B--body material +// C--cap material (generally just used for severed limbs) +// GZ--gore zone material (generally just used for bullet-hole textures) +// The female player model has the same materials, except for HD and MD. +// +// If the seventh entry was set validly, it will override any face skin set here. +// These are the static faces available in the pakfile (for use when you set the 7th entry to ""): +// f_afrrocket +// f_dekker +// f_irqrocket +// f_irqwoman1 +// f_irqwoman2 +// f_ninja +// f_raider2-5 +// f_sibtroop +// f_sibtroop2 +// +// The model part can be the name of any mesh on the model, or can be set to 0 if you +// want the material on the entire model changed to the specified skin.) +{ +a a_kosmechanic 0 +b b_kosmechanic 0 +f f_w_3_n 0 +h h_w_3_s 0 +h h_raider2 _mohawk +} + +//Ninth entry is a list of bolt-ons for the model +// (each list member has four parts: the name of the .gbm file which descibes the item being +// bolted on, the name of the bolt on the player model, the name of the bolt on the item, and the +// scale to be applied to the item.) +{ +boltons/funface.gbm abolt_head_t to_abolt_head_t 1.187857142857 +} + +//Tenth entry is a list of extra part toggles +// (each list member has two parts: the name of the mesh on the player model, and a 1-or-0 value +// which specifies whether the part should be on (1) or off (0).) +{ +_mohawk 1 +_crewhead 0 +_beardhead 0 +_beardface 0 +_lbang 0 +_rbang 0 +_ponytail 0 +_helmethead 0 +_helmetface 0 +_lear 0 +} diff --git a/Menus/fonts.rmf b/Menus/fonts.rmf new file mode 100644 index 0000000..0a5f1b0 --- /dev/null +++ b/Menus/fonts.rmf @@ -0,0 +1,61 @@ + + + + + + + +"Font type small" + + +" ! #$%&'()*+,-./0123456789:; = ?" +"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]._" +"`abcdefghijklmnopqrstuvwxyz{|}~ " +"...............................Ÿ" +"...£.....©....®................¿" +"ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß" +"àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + + + + +"Font type medium" + + +" ! #$%&'()*+,-./0123456789:; = ?" +"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]._" +"`abcdefghijklmnopqrstuvwxyz{|}~ " +"...............................Ÿ" +"...£.....©....®................¿" +"ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß" +"àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + + + +"Font type title" + + +" ! #$%&'()*+,-./0123456789:; = ?" +"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]._" +"`abcdefghijklmnopqrstuvwxyz{|}~ " +"...............................Ÿ" +"...£.....©....®................¿" +"ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß" +"àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + + + + +"Font type interface" + + +"0123456789" + + + + + + + + + diff --git a/Menus/layout.rmf b/Menus/layout.rmf new file mode 100644 index 0000000..8b6a96b --- /dev/null +++ b/Menus/layout.rmf @@ -0,0 +1,52 @@ +This menu demonstrates some of the simple layout controls of the menu system + + + + + + + + +
+ + +LEFT + +RIGHT +
+CENTER + +
+ + +LEFT + +RIGHT +
+CENTER + +
+ + + + +These words appear in reverse order + +These words appear in order + +
+ +
+Not good with spaces. + +"Much better at handling spaces in quotes" + +
+ + +Normal text just appears left to right as you would expect - automatically carriage returning at the end +of a line. The carriage returns in the rmf document are ignored. Note how each word is highlighted individually. + + + +Anything past the is ignored completely - it is a good place to put comments like this :) diff --git a/Menus/readme.txt b/Menus/readme.txt new file mode 100644 index 0000000..ad1df09 --- /dev/null +++ b/Menus/readme.txt @@ -0,0 +1 @@ +Place these files in your "user/menus" folder. The user folder resides parallel to you base folder. diff --git a/Menus/simple.rmf b/Menus/simple.rmf new file mode 100644 index 0000000..6cb9535 --- /dev/null +++ b/Menus/simple.rmf @@ -0,0 +1,51 @@ +This menu demonstrates some of the simple area types + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Sample/ds/common/elevator.ds b/Sample/ds/common/elevator.ds new file mode 100644 index 0000000..52b67c4 --- /dev/null +++ b/Sample/ds/common/elevator.ds @@ -0,0 +1,228 @@ +// template file for common directory + +#include "../common/header.ds" + +output "p:/base/ds/common" + +// Declare the variables + + parameter vector location //how far will the elevator move + parameter vector newlocation //how far will the elevator move + parameter int upordown //defines which floor the elevator is on. Up = 0 + + parameter entity leftupper //Upper outside door + parameter entity rightupper //Upper outside door + parameter entity leftlower //Lower outside door + parameter entity rightlower //Lower outside door + + parameter entity elebody //The actual elevator + parameter entity eledoorleft //The inside elevator door + parameter entity eledoorright //The inside elevator door + + local int done = 0 //Shows when the elevator has stopped moving so the doors can open + local int currentfloor = 0 //this tells the program which floor the elevator is on. Up = 0 + +/* !!!!!WARNING!!!! with currentfloor set to 0, it assumes that the elevator is at its extended + position. If you want the elevator to be at the lower floor, set currentfloor = 1 */ + +//We need to check which floor it is on first... remember that up = 0 + + if upordown = currentfloor + if upordown = 1 + move entity leftlower by [0,48,0] at 100 speed //open the outside doors + move entity rightlower by [0,-48,0] at 100 speed + + wait .5 seconds + + move entity eledoorleft by [0,48,0] at 100 speed // open the inside doors + move entity eledoorright by [0,-48,0] at 100 speed signaling done + wait for any clearing done + + wait 2 seconds + + move entity eledoorleft by [0,-48,0] at 100 speed // close the inside doors + move entity eledoorright by [0,48,0] at 100 speed + + wait .5 seconds + + move entity leftlower by [0,48,0] at 100 speed //close the outside doors + move entity rightlower by [0,-48,0] at 100 speed signaling done + wait for any clearing done + + move entity eledoorleft by location at 100 speed //move the elevator + move entity eledoorright by location at 100 speed + move entity elebody by location at 100 speed signaling done + wait for any clearing done + + wait .5 seconds + + move entity eledoorleft by [0,48,0] at 100 speed // open the inside doors + move entity eledoorright by [0,-48,0] at 100 speed + + move entity leftupper by [0,48,0] at 100 speed //open the outside doors + move entity rightupper by [0,-48,0] at 100 speed signaling done + wait for any clearing done + + wait 2 seconds + + move entity leftupper by [0,-48,0] at 100 speed //close the outside doors + move entity rightupper by [0,48,0] at 100 speed + + wait .5 seconds + + move entity eledoorleft by [0,-48,0] at 100 speed // close the inside doors + move entity eledoorright by [0,48,0] at 100 speed signaling done + wait for any clearing done + + else + move entity leftupper by [0,48,0] at 100 speed //open the outside doors + move entity rightupper by [0,-48,0] at 100 speed + + wait .5 seconds + + move entity eledoorleft by [0,48,0] at 100 speed // open the inside doors + move entity eledoorright by [0,-48,0] at 100 speed signaling done + wait for any clearing done + + wait 2 seconds + + move entity eledoorleft by [0,-48,0] at 100 speed // close the inside doors + move entity eledoorright by [0,48,0] at 100 speed + + wait .5 seconds + + move entity leftupper by [0,48,0] at 100 speed //close the outside doors + move entity rightupper by [0,-48,0] at 100 speed signaling done + wait for any clearing done + + move entity eledoorleft by location at 100 speed //move the elevator + move entity eledoorright by location at 100 speed + move entity elebody by location at 100 speed signaling done + wait for any clearing done + + wait .5 seconds + + move entity eledoorleft by [0,48,0] at 100 speed // open the inside doors + move entity eledoorright by [0,-48,0] at 100 speed + + move entity leftlower by [0,48,0] at 100 speed //open the outside doors + move entity rightlower by [0,-48,0] at 100 speed signaling done + wait for any clearing done + + wait 2 seconds + + move entity leftlower by [0,-48,0] at 100 speed //close the outside doors + move entity rightlower by [0,48,0] at 100 speed + + wait .5 seconds + + move entity eledoorleft by [0,-48,0] at 100 speed // close the inside doors + move entity eledoorright by [0,48,0] at 100 speed signaling done + wait for any clearing done + endif + + + + + else + + endif + +suspend + + + + + + + +/* if upordown = 0 + move entity leftupper by [0,48,0] at 100 speed //open the outside doors + move entity rightupper by [0,-48,0] at 100 speed + wait .25 seconds + + move entity eledoorleft by [0,48,0] at 100 speed // open the inside doors + move entity eledoorright by [0,-48,0] at 100 speed signaling done + wait for any clearing done + + wait 1 seconds + + move entity eledoorleft by [0,-48,0] at 100 speed // close the inside doors + move entity eledoorright by [0,48,0] at 100 speed + wait .25 seconds + + move entity leftupper by [0,48,0] at 100 speed //close the outside doors + move entity rightupper by [0,-48,0] at 100 speed signaling done + wait for any clearing done + + else + move entity leftlower by [0,48,0] at 100 speed //open the outside doors + move entity rightlower by [0,-48,0] at 100 speed + wait .25 seconds + + move entity eledoorleft by [0,48,0] at 100 speed // open the inside doors + move entity eledoorright by [0,-48,0] at 100 speed signaling done + wait for any clearing done + + wait 1 seconds + + move entity eledoorleft by [0,-48,0] at 100 speed // close the inside doors + move entity eledoorright by [0,48,0] at 100 speed + wait .25 seconds + + move entity leftlower by [0,48,0] at 100 speed //close the outside doors + move entity rightlower by [0,-48,0] at 100 speed signaling done + endif + +//move to the next level + + move entity eledoorleft by newlocation at 200 speed + move entity eledoorright by newlocation at 200 speed + move entity elebody by newlocation at 200 speed signaling done + wait for any clearing done + + +//open the correct outside doors + + if upordown = 1 + move entity leftupper by [0,48,0] at 100 speed //open the outside doors + move entity rightupper by [0,-48,0] at 100 speed + wait .25 seconds + + move entity eledoorleft by [0,48,0] at 100 speed // open the inside doors + move entity eledoorright by [0,-48,0] at 100 speed signaling done + wait for any clearing done + + wait 1 seconds + + move entity eledoorleft by [0,-48,0] at 100 speed // close the inside doors + move entity eledoorright by [0,48,0] at 100 speed + wait .25 seconds + + move entity leftupper by [0,48,0] at 100 speed //close the outside doors + move entity rightupper by [0,-48,0] at 100 speed signaling done + wait for any clearing done + + + else + move entity leftlower by [0,48,0] at 100 speed //open the outside doors + move entity rightlower by [0,-48,0] at 100 speed + wait .25 seconds + + move entity eledoorleft by [0,48,0] at 100 speed // open the inside doors + move entity eledoorright by [0,-48,0] at 100 speed signaling done + wait for any clearing done + + wait 1 seconds + + move entity eledoorleft by [0,-48,0] at 100 speed // close the inside doors + move entity eledoorright by [0,48,0] at 100 speed + wait .25 seconds + + move entity leftlower by [0,48,0] at 100 speed //close the outside doors + move entity rightlower by [0,-48,0] at 100 speed signaling done + wait for any clearing done + endif + +suspend */ + diff --git a/Sample/ds/common/fallbackdeath.ds b/Sample/ds/common/fallbackdeath.ds new file mode 100644 index 0000000..dfb1b8a --- /dev/null +++ b/Sample/ds/common/fallbackdeath.ds @@ -0,0 +1,17 @@ +// Guy that gets shot gets blown backward! + +#include "../common/header.ds" + +output "p:/base/ds/common" + +parameter entity deadguy // This is the enemy that should fall back +parameter vector falldist // This is the direction and distance that he should go +parameter entity breakbrush // This is the entity (such as a window) that the enemy should bust through + +// If there is no window, make sure to set the breakbrush parameter to the same as the dying enemy parm +// That way, it will ignore breaking it +if breakbrush != deadguy + use entity breakbrush +endif + + animate entity deadguy performing action STD_SBLOWN_2BK_N_N by moving falldist diff --git a/Sample/ds/common/fallingdeath.ds b/Sample/ds/common/fallingdeath.ds new file mode 100644 index 0000000..4efb1a4 --- /dev/null +++ b/Sample/ds/common/fallingdeath.ds @@ -0,0 +1,18 @@ +// template file for common directory + +#include "../common/header.ds" + +output "p:/base/ds/common" + +parameter entity deadguy // This is the enemy that should be falling +parameter vector falldist // This is the direction and distance that he should go +parameter entity breakbrush // This is the entity (such as a railing) that the enemy should bust through + +// If there is no railing, make sure to set the breakbrush parameter to the same as the dying enemy parm +// That way, it will ignore breaking it +if breakbrush != deadguy + use entity breakbrush +endif + + animate entity deadguy performing action PRN_XFALLING_N_N_N by moving falldist + animate entity deadguy performing action PRN_XFALLLAND_N_N_N diff --git a/Sample/ds/common/header.ds b/Sample/ds/common/header.ds new file mode 100644 index 0000000..c944d22 --- /dev/null +++ b/Sample/ds/common/header.ds @@ -0,0 +1,560 @@ +field vector "origin" +field float "origin_x" +field float "origin_y" +field float "origin_z" +field int "movetype" +field vector "start_origin" +field vector "start_angles" +field int "state" +field float "distance" +field entity "owner" +field float "wait" +field vector "velocity" +field vector "angle_velocity" +field entity "team_chain" +field float "yaw_speed" +field int "modelindex" +field int "count" +field int "solid" +field vector "angles" +field vector "delta_angles" +field int "skinnum" +field int "c_mode" +field float "ideal_yaw" +field vector "p_origin" +field int "takedamage" +field int "health" + + + +// sound channels +// channel 0 never willingly overrides +// other channels (1-7) allways override a playing sound on that channel +#define CHAN_AUTO 0 +#define CHAN_WEAPON 1 +#define CHAN_VOICE 2 +#define CHAN_ITEM 3 +#define CHAN_BODY 4 +#define CHAN_ENT1 5 +#define CHAN_ENT2 6 +// modifier flags +#define CHAN_NO_PHS_ADD 8 // send to all clients, not just ones in PHS (ATTN 0 will also do this) +#define CHAN_RELIABLE 16 // send by reliable message, not datagram + + +// Defines for print level +#define PRINT_LOW 0 // pickup messages +#define PRINT_MEDIUM 1 // death messages +#define PRINT_HIGH 2 // critical messages +#define PRINT_CHAT 3 // chat messages + + + +// Physic movetypes +#define MOVETYPE_NONE 0 +#define MOVETYPE_NOCLIP 1 +#define MOVETYPE_PUSH 2 +#define MOVETYPE_STOP 3 +#define MOVETYPE_WALK 4 +#define MOVETYPE_STEP 5 +#define MOVETYPE_FLY 6 +#define MOVETYPE_TOSS 7 +#define MOVETYPE_FLYMISSILE 8 +#define MOVETYPE_BOUNCE 9 +#define MOVETYPE_DAN 10 + +// Defines for animation emotions (facial expressions) + +#define EMOTION_NORMAL 1 +#define EMOTION_FEAR 2 +#define EMOTION_ANGRY 3 +#define EMOTION_PAIN 4 +#define EMOTION_DEAD 5 +#define EMOTION_TALK 6 +#define EMOTION_TALKANGRY 7 +#define EMOTION_TALKAFRAID 8 + +// Defines for animation sequences + +#define UNKNOWN 0 +#define RUN 1 +#define JUMP 2 +#define DEATH 5 +#define DEATHTHROWN 6 +#define DUCK_DN 7 +#define DUCK_MID 8 +#define DUCK_UP 9 +#define DUCK_SHOOT 10 +#define IDLE 11 +#define IDLESTRETCH 12 +#define IDLELOOK 13 +#define SHOOT 14 +#define WALK 15 +#define AFRAIDRUN 19 +#define GUN_IDLE 17 + +// The following are direct calls to specific animations +#define CCH_A_FWD_P_2 82 +#define CCH_A_FWD_R_2 83 +#define CCH_SONKNEES_2FRNT_N_N 84 +#define CCH_XCCHCOWER_MID_A_A 86 +#define CCH_XCCHCOWER_MID2_A_A 87 +#define CCH_XCROUCH_UP_MRS_2 80 +#define CCH_XCROUCH_UP_PK_A 81 +#define CCH_XONKNEES_N_N_N 85 +#define LB_PGENERICDIE_N_N_N 90 +#define LS_XGETKICKED_N_N_N 43 +#define PRN_XCOVERHEAD_N_A_A 88 +#define SI_ISIT_N_A_A 125 +#define SI_XALERTSTAND_UP_A_A 126 +#define SI_XBYWALL_N_N_N 44 +#define STD_ASHUFFLE_N_P_2 171 +#define STD_ASHUFFLE_N_P_A 172 +#define STD_ASHUFFLE_N_MS_2 173 +#define STD_ASHUFFLE_N_R_2 174 +#define STD_ASHUFFLE_N_L_2 175 +#define STD_F_FWD_P_2 58 +#define STD_F_FWD_S_2 59 +#define STD_FATTITUDE_N_P_A 42 +#define STD_FAUTOSWEEP_N_PM_A 96 +#define STD_FCORNERPEAK_LT_P_A 65 +#define STD_FCORNERPEAK_RT_P_A 66 +#define STD_FGANGBANGER_N_M_2 97 +#define STD_FSWATSTYLE_FWD_M_2 98 +#define STD_FVIOLENT_DWN_M_2 100 +#define STD_FVIOLENT_DWN_P_N 101 +#define STD_IALERT_N_P_N 67 +#define STD_ICLEANGUN_N_A_N 20 +#define STD_ICLEANGUN2_N_MRS_2 68 +#define STD_ILEANLOOK_FRM_PK_N 54 +#define STD_ILEANLOOK_MID_PK_N 55 +#define STD_ILEANLOOK_TO_PK_N 56 +#define STD_ILOOKING_N_A_A 21 +#define STD_ILOOKING_N_MRS_2 29 +#define STD_IMONITORUP_N_A_N 22 +#define STD_IMONITORUP2_N_A_N 69 +#define STD_ISMOKE_FRM_A_N 76 +#define STD_ISMOKE_N_A_N 77 +#define STD_ISMOKE_TO_A_N 78 +#define STD_ISTAND_N_MRS_2 31 +#define STD_ITALK_N_A_N 23 +#define STD_ITALK_N_MRS_2 32 +#define STD_ITALKGEST1_N_A_N 24 +#define STD_ITALKGEST2_N_A_N 25 +#define STD_ITALKGEST3_N_A_N 26 +#define STD_ITOUCHNUTS_N_A_N 79 +#define STD_ITURNVALVE_FRM_N_N 33 +#define STD_ITURNVALVE_N_N_N 34 +#define STD_ITURNVALVE_TO_N_N 35 +#define STD_IWIPEBROW_N_A_N 27 +#define STD_JDIVE2PRONE_N_A_N 70 +#define STD_JDOWN_N_A_A 57 +#define STD_JDROP_N_A_A 36 +#define STD_JRUN_FWD_A_A 75 +#define STD_JUPTO_N_A_A 102 +#define STD_MKICKLOW_N_A_A 37 +#define STD_MNINJAKICK_N_A_B 103 +#define STD_MPISTOLWHIP_N_P_N 38 +#define STD_R_DWNST_MRS_2 105 +#define STD_R_N_MRS_2 60 +#define STD_R_N_PK_N 61 +#define STD_RAFRAID_N_N_N 71 +#define STD_RAIMSTRAF_LT_MRS_2 106 +#define STD_RAIMSTRAF_LT_P_CBN 107 +#define STD_RAIMSTRAF_RT_MRS_2 108 +#define STD_RAIMSTRAF_RT_P_CBN 109 +#define STD_RBACKAIM_N_MRS_2 110 +#define STD_RBACKAIM_N_P_2 111 +#define STD_RGUNUP_N_P_2 62 +#define STD_MRIFLEBUTT_N_MRS_2 104 +#define STD_SBLOWN_2BK_N_N 72 +#define STD_SFALLFWD_2FRNT_N_N 112 +#define STD_SINBACK_2FRNT_N_N 39 +#define STD_SSTUMBLE_2FRNT_N_N 113 +#define STD_SSTUMBLE_2BK_P_N 45 +#define STD_SVIOLENT_N_N_N 89 +#define STD_WATTITUDE_N_PK_A 91 +#define STD_WBCKSIGNAL_N_N_N 53 +#define STD_WCARRY1_N_N_N 50 +#define STD_WJOG_N_MRS_2 92 +#define STD_WJOGGUNDWN_N_P_2 93 +#define STD_WJOGGUNUP_N_P_A 94 +#define STD_WNORMAL_N_PK_A 51 +#define STD_WPATROL_N_MRS_2 52 +#define STD_WPUSH_N_N_N 46 +#define STD_WPUSHCART_N_N_N 95 +#define STD_XAFRAIDSHAKE_N_N_N 47 +#define STD_XALARMPUSH_N_A_N 30 +#define STD_XBOOMCROUCH_N_A_N 73 +#define STD_XCCHCOWER_DWN_A_A 114 +#define STD_XCHOKE_N_N_N 115 +#define STD_XDANCE_N_N_N 116 +#define STD_XDONTSHOOT_N_A_N 63 +#define STD_XGOPRONE_N_A_A 117 +#define STD_XFEARWAVE_N_N_N 64 +#define STD_XKICKDOOR_N_A_A 48 +#define STD_XTUMBLE_2FRNT_N_N 74 +#define STD_XLADDER_DWN_A_A 118 +#define STD_XLADDER_UP_A_A 119 +#define STD_XROLL_LT_A_A 120 +#define STD_XROLL_RT_A_A 121 +#define STD_XROLLTOCCH_FWD_A_A 122 +#define STD_XSTARTLED_N_A_A 123 +#define STD_XSTUMBLE_N_A_A 124 +#define STD_XYELLATYOU_N_A_A 49 +#define STD_XYELLPOINT_FWD_A_N 40 +#define STD_XYELLWAVE_BK_A_N 41 + +#define SCRIPT_RELEASE 99 + +#define PRN_C_N_A_2 127 +#define PRN_XCOVERHEAD_TO_A_A 128 +#define PRN_XFALLING_N_N_N 129 + +#define PRN_XFALLLAND_N_N_N 130 +#define PRN_XTOSTAND_N_A_A 131 +#define CCH_RAIM_FWD_MRS_2 132 +#define CCH_RAIM_FWD_P_2 133 +#define CCH_XCCHCOWER2_MID_A_A 134 +//it's actually lb_pcrawl_bk_a_n. see below. #define LB_PCRAWL_BCK_P_N 135 +#define LB_XLEANUPSHOOT_N_P_N 136 +#define CCH_A_FWD_MS_2 137 +#define CCH_F_FWD_L_2 138 +#define CCH_RAIM_N_L_2 139 + +#define CCH_TLOBGRENADE_N_A_N 140 +#define STD_ECHOKEKNEES_TO_N_N 141 +#define CCH_ECHOKEKNEES_N_N_N 142 +#define CCH_ECHOKEDEATH_N_N_N 143 +#define STD_SELECTROCUTE_N_N_N 144 +#define STD_EOFFLADDER_UP_A_N 145 +#define STD_EPOUNDDOOR_N_A_N 146 +#define STD_F_FWD_R_2 147 + +#define STD_EBUSTGLASS_N_MRS_2 148 +#define STD_ECOMEHERE_N_A_N 149 + +#define STD_EFALLDEATH_N_N_N 150 +#define STD_EFALLIMPACT_N_N_N 151 +#define STD_EFLIPTABLE_N_A_N 152 +#define STD_EPUSHBUTTONS_N_N_N 153 +#define STD_EPUSHCRATE_N_A_N 154 +#define STD_ESIGNALALARM_N_A_N 155 +#define STD_ETYPING_N_N_N 156 +#define STD_EWALL2WALK_N_MRS_2 157 +#define STD_EWALL2WALK_N_PK_N 158 +#define STD_EWALLIDLE_N_MRS_2 159 + +#define STD_EWALLIDLE_N_PK_N 160 +#define STD_EWALLLOOK_LT_MRS_2 161 +#define STD_EWALLLOOK_LT_PK_N 162 +#define STD_EWALLLOOK_RT_MRS_2 163 +#define STD_EWALLLOOK_RT_PK_N 164 +#define STD_EWRENCHH_FRM_N_N 165 +#define STD_EWRENCHH_N_N_N 166 +#define STD_EWRENCHH_TO_N_N 167 +#define STD_EWRENCHV_FRM_N_N 168 +#define STD_EWRENCHV_N_N_N 169 + +#define STD_EWRENCHV_TO_N_N 170 +#define STD_IPISS_N_A_A 176 +#define STD_ATHREAT_DWN_P_N 177 +#define STD_ATHREAT_FWD_P_N 178 +#define STD_ATHREATYEL_DWN_P_N 179 + +#define STD_ATHREATYEL_FWD_P_N 180 +#define STD_EEXAMINEWALL_N_A_N 181 +#define STD_ERAGESHOOT_N_P_N 182 +#define STD_ESABREMOCK_N_A_N 183 +#define STD_RTOSTOP_N_PK_N 184 +#define STD_ETALKBOTH_N_A_N 185 +#define STD_ETALK_N_A_N 186 +#define STD_EHEADNOD_N_A_N 187 +#define STD_EHEADSHAKE_N_A_N 188 +#define STD_EJUMPRAIL_N_A_N 189 + +#define STD_WTOSTOP_N_PK_A 190 +#define STD_ESPIN180_LT_A_N 191 +#define STD_ESPIN180_RT_A_N 192 +#define STD_ETORUN_N_P_N 193 +#define STD_ILEAN_N_P_N 194 +#define STD_WBACKAIM_N_MS_2 195 +#define STD_ETALKRIGHT_N_A_N 196 + +#define STD_ECLIMBLEDG_DWN_A_N 197 +#define STD_ECLIMBLEDG_MID_A_N 198 +#define STD_ECLIMBLEDGE_UP_A_N 199 + +#define STD_EDROPGRENADE_N_A_N 200 +#define STD_EFRMSHADOW_N_MRS_2 201 +#define STD_EFRMSHADOW_N_P_N 202 +#define STD_EHANDTALK_FRM_P_N 203 +#define STD_EHANDTALK_N_P_N 204 + +#define STD_EHANDTALK_TO_MRS_N 205 +#define STD_EHANDTALK_TO_P_N 206 +#define STD_EHANDTALK_FRM_MRS_N 207 +#define STD_EHEADSET_FRM_P_N 208 +#define STD_EHEADSET_MID_P_N 209 + +#define STD_EHEADSET_TO_P_N 210 +#define STD_ESALUTE_FRM_MRS_N 211 +#define STD_ESALUTE_N_MRS_N 212 +#define STD_ESALUTE_TO_MRS_N 213 +#define STD_ETALKLEFT_N_A_N 214 + +#define STD_ETALKLKLT_FRM_A_N 215 +#define STD_ETALKLKLT_MID_A_N 216 +#define STD_ETALKLKLT_TO_A_N 217 +#define STD_ETALKLKRT_FRM_A_N 218 +#define STD_ETALKLKRT_MID_A_N 219 + +#define STD_ETALKLKRT_TO_A_N 220 +#define STD_ETORUN_N_MRS_2 221 +#define STD_ETURN90_LT_A_N 222 +#define STD_ETURN90_RT_A_N 223 +#define STD_IGUNUP_N_A_N 224 + +#define STD_RONFIRE_N_N_N 225 +#define STD_RONFIRETODTH_N_N_N 226 +#define STD_RTOSTOP_N_MRS_2 227 +#define STD_SSHOULDER_LT_N_N 228 +#define STD_SUNHURT_BK_PK_N 229 + +#define STD_EDROPCROUCH_N_A_A 230 +#define STD_TRUN_N_A_N 231 +#define STD_W_N_PN_N 232 +#define STD_WCARRY2_N_N_N 233 +#define STD_WTALK_LT_MRS_2 234 + +#define A4_ASCRAMBLE_N_A_N 235 +#define CCH_ENODLEFT_N_A_A 236 +#define CCH_ENODRIGHT_N_A_A 237 +#define CCH_ESCANTALK_LT_A_A 238 +#define CCH_ESCANTALK_RT_A_A 239 + +#define CCH_IREADY_N_A_A 240 +#define STD_FAUTOSWEEP_N_M_2 241 +#define STD_L_N_MS_2 242 +#define STD_ISTAND_N_A_N 243 +#define STD_ECHOKESHOOT_N_A_N 244 + +#define STD_SONFIRE_2BK_N_N 245 +#define STD_ETALK_FRM_A_N 246 +#define STD_ETALK_TO_A_N 247 +#define STD_JDROP_TO_A_N 248 +#define STD_ATHREATSHT_DWN_P_N 249 + +#define LB_PHOLDLEG_LT_N_N 250 +#define STD_XCOCK_N_S_2 251 +#define STD_STOKNEES_2BK_N_N 252 +#define STD_SGUT_2SIDE_N_N 253 +#define STD_XLADDERFRM_UP_A_A 254 + +#define STD_SGUNFROMHAND_N_N_N 255 +#define CCH_ETOSTAND_N_A_N 256 +#define STD_ININJA_N_P_N 257 +#define STD_XHANDSPRING_FWD_A_N 258 +#define STD_EGANGSALUTE_N_A_N 259 + +#define STD_WBACKWARDS_N_A_N 260 +#define STD_SSABREDEATH_BK_N_N 261 +#define STD_WSTEALTH_N_PK_N 262 +#define STD_JTHROWSTAR_FWD_A_N 263 +#define PRN_A_N_A_2 264 + +#define STD_EYELL_N_A_N 265 +#define STD_IALERTLK_RT_MRS_2 266 +#define STD_EPUSHBUTTONH_N_A_N 267 +#define STD_IALERT_N_MRS_2 268 +#define STD_RDYNAMIC_N_A_N 269 + +#define STD_WAIM_FWD_P_2 270 +#define STD_A_FWD_P_2 271 +#define STD_IETALKPOSE_N_A_N 272 +#define STD_FRAPIDSWEEP_LT_P_2 273 +#define STD_IALERTTRN_LT_P_N 274 + +#define STD_ESUPRISE90_LT_A_N 275 +#define STD_FAUTOSWEEP_UP_M_2 276 +#define STD_XATKPAUSE1_N_MRS_2 277 +#define LB_PCRAWL_BK_P_N 278 +#define SI_EWALLIDLE_N_A_N 279 + +#define SI_EWALLTALK_N_A_N 280 +#define STD_ETOAIM_N_P_2 281 +#define STD_A_UP_P_2 282 +#define SI_EWALLFEAR_N_A_N 283 +#define STD_ESALUTE_TO_A_N 284 + +#define STD_ESALUTE_N_A_N 285 +#define STD_ESALUTE_FRM_A_N 286 +#define STD_ESALUTATIONS_N_A_N 287 +#define STD_ECLIMBSHAFT_N_A_N 288 +#define STD_XATKPAUSE2_N_PK_N 289 + +#define CCH_W_N_A_N 290 +#define CCH_EWALK2CCH_N_A_N 291 +#define CCH_ETALK_DWN_P_N 292 +#define STD_ITALKPOSE_UP_A_N 293 +#define CCH_ITALKPOSE_DWN_A_N 294 + +#define STD_ETALK_UP_A_N 295 +#define CCH_EHEADNOD_N_A_N 296 +#define CCH_ECCH2WALK_N_A_N 297 +#define STD_XATKPAUSE1_N_PK_N 298 +#define STD_WFAST_N_A_N 299 + +#define STD_ERAGEIDLE_N_P_N 300 +#define CCH_XCCHCOWER_UP_A_A 301 +#define STD_IETALKPOSE_RT_A_N 302 +#define STD_EBOOKLOOK_N_A_N 303 +#define STD_EBOOKSCAN_N_A_N 304 + +#define STD_XOPENDOOR_N_A_N 305 +#define STD_XCROUCH_DWN_PK_A 306 +#define CCH_EHEADSET_FRM_A_N 307 +#define CCH_EHEADSET_MID_A_N 308 +#define STD_SHEAD_2FRNT_N_N 309 + +#define STD_W_N_MRS_2 310 +#define STD_EDKRAIM_N_A_N 311 +#define CCH_EHAWKKNEES_N_N_N 312 +#define STD_EDKRAIMTALK_N_A_N 313 +#define STD_EDKRFIRELK_RT_A_N 314 + +#define CCH_EHAWKDEATH_N_N_N 315 +#define CCH_EHAWKKNEETLK_N_N_N 316 +#define CCH_EHAWKCROUCH_N_A_N 317 +#define CCH_EHEADSET_TO_A_N 318 +#define LB_ESLIDE_N_PK_N 319 + +#define STD_A_FWD_P_CB 320 +#define STD_IGUNUPLOOK_N_A_N 321 +#define STD_FRAPID_N_P_2 322 +#define STD_EDKRAIMLK_FWD_A_N 323 +#define STD_EWHIRL_RT_A_N 324 + +#define STD_FSWEEPUP_FRM_A_A 325 +#define STD_FSWEEPUP_TO_A_A 326 +#define STD_XTAKECOVER_N_A_N 327 +#define STD_ESABREBLUFF_N_A_A 328 +#define STD_EAUTOSWEEP_N_PM_A 329 + +#define CCH_F_FWD_S_2 330 +#define STD_F_FWD_P_CB 331 +#define STD_SOUTWINDOW_N_A_N 332 +#define STD_XCROUCH_DWN_MRS_2 333 +#define STD_XCROUCH_DWN_P_2 334 + +#define STD_TGRENADE_N_A_N 335 +#define STD_TUNDER_N_A_N 336 +#define CCH_XCROUCH_UP_L_2 337 +#define STD_XCROUCH_DWN_L_2 338 +#define STD_XCROUCH_DWN_P_A 339 + +#define STD_RAIM_N_MRS_2 340 +#define STD_WFIRE_FWD_MS_2 341 +#define CCH_AFIRE_FWD_MS_2 342 +#define STD_F_FWD_M_2 343 +#define CCH_F_FWD_M_2 344 + +#define STD_EPUSHOVER_N_PK_A 345 +#define STD_EMERCHALL_N_A_A 346 +#define STD_EMERCHONE_N_A_A 347 +#define STD_IEMERCHANT_N_A_A 348 +#define STD_EMERCHWAVE_RT_A_A 349 + +#define STD_EMERCHTALK_N_A_A 350 +#define STD_EMERCHWAVE_LT_A_A 351 +#define STD_EBEG_N_A_A 352 +#define STD_ICLEANGUN2_N_PK_N 353 +#define CCH_XCCHCOWER_N_A_N 354 + +// if we wind up #define'ing more than 500 anims, update ANIMLISTSIZE in ds.exe/ds.cpp + + + + + +#define SOLID_NOT 0 +#define SOLID_SOLID 2 // erm, why wasn't this made SOLID_BBOX? grrrr +#define SOLID_BSP 3 + + +#define DAMAGE_NO 0 // Won't take damage +#define DAMAGE_YES 1 // Takes damage +#define DAMAGE_AIM 2 // Can be autotargeted??? +#define DAMAGE_NO_RADIUS 3 // Will not take damage from radius blasts + +// Commands for the helicopter +// Note: Scripter REALLY needs Ghoul support +#define HELI_TAKEOFF 1 +#define HELI_LAND 2 +#define HELI_REPAIR 3 +#define HELI_REARM 4 +#define HELI_GOTO_COORDS 5 +#define HELI_GOTOREL_ENTITY 6 +#define HELI_GOTOREL_ENT_X 7 +#define HELI_GOTOREL_ENT_Y 8 +#define HELI_GOTOREL_ENT_Z 9 +#define HELI_MOVEREL 10 +#define HELI_PAUSE 11 +#define HELI_FACE_RELENT 12 +#define HELI_FACE_ABSCOORDS 13 +#define HELI_FACE_ABSDIR 14 +#define HELI_FACE_RELCOORDS 15 +#define HELI_PILOT_FACERELENT 16 +#define HELI_PILOT_FACERELCOORDS 17 +#define HELI_PILOT_FACEABSCOORDS 18 +#define HELI_GUNNER_FACERELENT 19 +#define HELI_GUNNER_FACERELCOORDS 20 +#define HELI_GUNNER_FACEABSCOORDS 21 +#define HELI_STRAFE_RT 22 +#define HELI_STRAFE_LT 23 +#define HELI_ROCKETS_ENABLE 24 +#define HELI_ROCKETS_DISABLE 25 +#define HELI_CHAINGUN_ENABLE 26 +#define HELI_CHAINGUN_DISABLE 27 +#define HELI_FIREAT_RELENT 28 +#define HELI_FIREAT_ABSCOORDS 29 +#define HELI_FIREAT_RELCOORDS 30 +#define HELI_AUTOFIRE_ON 31 +#define HELI_AUTOFIRE_OFF 32 +#define HELI_HOVER_PASSIVE 33 +#define HELI_HOVER_AGGRESSIVE 34 +#define HELI_SET_WORLDMINS 35 +#define HELI_SET_WORLDMAXS 36 +#define HELI_SET_MAXHEALTH 37 +#define HELI_SET_HEALTH 38 +#define HELI_SET_DEATHDEST 39 +#define HELI_SET_TRACEDIMS 40 +#define HELI_AI 41 +#define HELI_WAYPOINT 42 +#define HELI_VOLUME 43 +#define HELI_VOLUMEMINS 44 +#define HELI_VOLUMEMAXS 45 +#define HELI_DEBUG 46 +#define HELI_CHANGE_SKIN 47 +#define HELI_CHANGE_BODY 48 +#define HELI_OUT_OF_CONTROL 49 + +// use these for snowcats as well as tanks +#define TANK_GOTOCOORDS 1 +#define TANK_FIRECANNONATCOORDS 2 +#define TANK_MACHGUNAUTO 3 +#define TANK_DIE 4 +#define TANK_AIMTURRET 5 + +// defines for null targeting +#define HEAD 1 +// #define NECK 2 +#define LSHOULDER 3 +#define RSHOULDER 4 +#define CHEST 5 +#define GUT 6 +#define GROIN 7 +#define GUNHAND 8 +#define NUG_O_POPPIN 9 + + diff --git a/Sample/ds/common/killer.ds b/Sample/ds/common/killer.ds new file mode 100644 index 0000000..dc7cbd5 --- /dev/null +++ b/Sample/ds/common/killer.ds @@ -0,0 +1,15 @@ +// template file for common directory + +#include "../common/header.ds" + +output "p:/base/ds/common" + + +// THIS SCRIPT JUST TAKES PARM1 FROM A SCRIPT RUNNER AND WILL REMOVE IT, USEFUL FOR GETTING LOCKED MESSAGES OFF OF DOORS + + +parameter entity kill_thing + + + +remove entity kill_thing // removes whatever was in parm1 \ No newline at end of file diff --git a/Sample/ds/common/lwdoor_ccw.ds b/Sample/ds/common/lwdoor_ccw.ds new file mode 100644 index 0000000..26d0869 --- /dev/null +++ b/Sample/ds/common/lwdoor_ccw.ds @@ -0,0 +1,22 @@ +// Generic counter clockwise door 90 degree swing + +#include "../common/header.ds" + +output "p:/base/ds/common" + +///////////////////////////////////////////////////////////// +// Define + +// Actors +parameter entity door_ccw // Two doors, clockwise and counter-cw + +///////////////////////////////////////////////////////////// +// Assign + +// door_ccw.movetype = MOVETYPE_NOCLIP + +///////////////////////////////////////////////////////////// +// Action + +moverotate entity door_ccw from file "generic_door_ccw.rof" + diff --git a/Sample/ds/common/lwdoor_cw.ds b/Sample/ds/common/lwdoor_cw.ds new file mode 100644 index 0000000..120eb0c --- /dev/null +++ b/Sample/ds/common/lwdoor_cw.ds @@ -0,0 +1,22 @@ +// Generic clockwise door 90 degree swing + +#include "../common/header.ds" + +output "p:/base/ds/common" + +///////////////////////////////////////////////////////////// +// Define + +// Actors +parameter entity door_cw // Two doors, clockwise and counter-cw + +///////////////////////////////////////////////////////////// +// Assign + +// door_cw.movetype = MOVETYPE_NOCLIP + +///////////////////////////////////////////////////////////// +// Action + +moverotate entity door_cw from file "generic_door_cw.rof" + diff --git a/Sample/ds/common/lwdoors.ds b/Sample/ds/common/lwdoors.ds new file mode 100644 index 0000000..7bd5f45 --- /dev/null +++ b/Sample/ds/common/lwdoors.ds @@ -0,0 +1,24 @@ +// Generic double doors + +#include "../common/header.ds" + +output "p:/base/ds/common" + +///////////////////////////////////////////////////////////// +// Define + +// Actors +parameter entity door_cw // Two doors, clockwise and counter-cw +parameter entity door_ccw + +///////////////////////////////////////////////////////////// +// Assign + +// door_cw.movetype = MOVETYPE_NOCLIP +// door_ccw.movetype = MOVETYPE_NOCLIP + +///////////////////////////////////////////////////////////// +// Action + +moverotate entity door_cw from file "generic_door_cw.rof" +moverotate entity door_ccw from file "generic_door_ccw.rof" diff --git a/Sample/ds/common/midsave.ds b/Sample/ds/common/midsave.ds new file mode 100644 index 0000000..1711232 --- /dev/null +++ b/Sample/ds/common/midsave.ds @@ -0,0 +1,9 @@ +// autosave script for mid-level save + +#include "../common/header.ds" +#include "general.ds" + +output "p:/base/ds/common" + +print GENERAL_MIDSAVE +run console command "save mid" diff --git a/Sample/ds/common/pushthing.ds b/Sample/ds/common/pushthing.ds new file mode 100644 index 0000000..741c828 --- /dev/null +++ b/Sample/ds/common/pushthing.ds @@ -0,0 +1,45 @@ +// template file for common directory + +#include "../common/header.ds" + +output "p:/base/ds/common" + +parameter entity pusher +parameter entity pushed +parameter vector movedist + +local int sig1 +local int pusherhealth + +pusherhealth = pusher.health + +if pusherhealth > 0 + animate entity pusher performing action STD_EPUSHCRATE_N_A_N by moving movedist signaling sig1 + move entity pushed by movedist + wait for all clearing sig1 +endif + +pusherhealth = pusher.health + +if pusherhealth > 0 + animate entity pusher performing action STD_EPUSHCRATE_N_A_N by moving movedist signaling sig1 + move entity pushed by movedist + wait for all clearing sig1 +endif + +pusherhealth = pusher.health + +if pusherhealth > 0 + animate entity pusher performing action STD_EPUSHCRATE_N_A_N by moving movedist signaling sig1 + move entity pushed by movedist + wait for all clearing sig1 +endif + +pusherhealth = pusher.health + +if pusherhealth > 0 + animate entity pusher performing action STD_EPUSHCRATE_N_A_N by moving movedist signaling sig1 + move entity pushed by movedist + wait for all clearing sig1 +endif + diff --git a/Sample/ds/common/stairstoken.ds b/Sample/ds/common/stairstoken.ds new file mode 100644 index 0000000..3b87155 --- /dev/null +++ b/Sample/ds/common/stairstoken.ds @@ -0,0 +1,11 @@ +// template file for newyork directory + +#include "../common/header.ds" + +output "p:/base/ds/newyork" + + +local entity topstairguy1 + + +topstairguy1 = find entity with targetname "topstairguy1" diff --git a/Sample/ds/common/template.ds b/Sample/ds/common/template.ds new file mode 100644 index 0000000..da4533f --- /dev/null +++ b/Sample/ds/common/template.ds @@ -0,0 +1,7 @@ +// template file for common directory + +#include "../common/header.ds" + +output "p:/base/ds/common" + + diff --git a/Sample/ds/common/train.ds b/Sample/ds/common/train.ds new file mode 100644 index 0000000..6608e7a --- /dev/null +++ b/Sample/ds/common/train.ds @@ -0,0 +1,18 @@ +// The handy dandy moving subway train script + +#include "../common/header.ds" + +output "p:/base/ds/common" + +// declare the variables + +parameter entity train //which train to move +parameter vector move //how far the train should move +local int sig = 0 + +// move the trains + +move entity train by move signaling sig +wait for all signaling sig + +//This is a very stupid piece of crap diff --git a/Sample/ds/common/use2.ds b/Sample/ds/common/use2.ds new file mode 100644 index 0000000..4263bad --- /dev/null +++ b/Sample/ds/common/use2.ds @@ -0,0 +1,21 @@ +// Generic double use script + +#include "../common/header.ds" +output "p:/base/ds/common" + +///////////////////////////////////////////////////////////// +// Define + +parameter entity e_target // Entity to use twice + +///////////////////////////////////////////////////////////// +// Action + +use entity e_target +use entity e_target + +///////////////////////////////////////////////////////////// +// Cleanup + +exit + diff --git a/Sample/ds/tsr1/aftertok.ds b/Sample/ds/tsr1/aftertok.ds new file mode 100644 index 0000000..4a1a3fc --- /dev/null +++ b/Sample/ds/tsr1/aftertok.ds @@ -0,0 +1,28 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + +local entity runguy1 // the guy who runs by +local entity waveguy1 // the guy waving at the end of the hallway +local entity afterguy // a guy who will spawn in the token room +local entity behindwaver // the guy who spawns behind the guy waving +local int sig1 +local int sig2 + +runguy1 = find entity with targetname "runguy1" +waveguy1 = find entity with targetname "waveguy1" +afterguy = find entity with targetname "afterguy" +behindwaver = find entity with targetname "behindwaver" + +use entity runguy1 // spawns the guy running by +use entity waveguy1 //spawns the guy at the end of the hall + + +use entity behindwaver // spawns the guy in the waitingroom +use entity afterguy // spawns another guy in the token room + +animate entity runguy1 performing action SCRIPT_RELEASE +animate entity waveguy1 performing action SCRIPT_RELEASE +animate entity afterguy performing action SCRIPT_RELEASE +animate entity behindwaver performing action SCRIPT_RELEASE diff --git a/Sample/ds/tsr1/backout.ds b/Sample/ds/tsr1/backout.ds new file mode 100644 index 0000000..e947c11 --- /dev/null +++ b/Sample/ds/tsr1/backout.ds @@ -0,0 +1,39 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + +///////////////////////////////////////////////// +// Declare + +local entity camroom_door +local entity camroom_hole +local entity openout +local int sig1 +local int sig2 +local int health + +///////////////////////////////////////////////// +// Assign + +camroom_door = find entity with targetname "camroom_door" +camroom_hole = find entity with targetname "camroom_hole" +openout = find entity with targetname "openout" + +///////////////////////////////////////////////// +// Action + +camroom_hole.movetype = MOVETYPE_NOCLIP +health = camroom_door.health + +if health < 100 + exit + +endif + + +rotate entity camroom_door by [0, 90,0] at 90 speed signaling sig1 +rotate entity camroom_hole by [0, 90,0] at 90 speed signaling sig2 +wait for all clearing sig1,sig2 +use entity openout // triggers the func wall out if the player killed the doorkicking guy +camroom_hole.movetype = MOVETYPE_NONE + +// End \ No newline at end of file diff --git a/Sample/ds/tsr1/behinducam.ds b/Sample/ds/tsr1/behinducam.ds new file mode 100644 index 0000000..122d869 --- /dev/null +++ b/Sample/ds/tsr1/behinducam.ds @@ -0,0 +1,21 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + + +local entity behinducam // the cam that shows the enemys sneaking up on the player + + + +behinducam = find entity with targetname "behinducam" + + +behinducam.movetype = MOVETYPE_NOCLIP + + +use entity behinducam // turns the camera on + +use entity behinducam // turns the camera off + + diff --git a/Sample/ds/tsr1/below1.ds b/Sample/ds/tsr1/below1.ds new file mode 100644 index 0000000..4d0fdbc --- /dev/null +++ b/Sample/ds/tsr1/below1.ds @@ -0,0 +1,27 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + +// this script starts the guys running below the grate on the nyc1 map + + +local entity belowguy1 // the first enemy below the tracks +local entity train1 // the train that goes by underneath +local int sig1 + +belowguy1 = find entity with targetname "belowguy1" +train1 = find entity with targetname "train1" + + +use entity belowguy1 // spawns the front guy in +animate entity belowguy1 performing action STD_R_N_PK_N by moving [512, 0, 0] signaling sig1 +wait for all clearing sig1 +wait 5 seconds +use entity train1 // triggers the train going by +remove entity belowguy1 // removes the guys from the track + +exit + + + diff --git a/Sample/ds/tsr1/botsteps.ds b/Sample/ds/tsr1/botsteps.ds new file mode 100644 index 0000000..5f269b4 --- /dev/null +++ b/Sample/ds/tsr1/botsteps.ds @@ -0,0 +1,41 @@ +// template file for newyork directory + +#include "../common/header.ds" + +output "p:/base/ds/tsr1" + + + +local entity fuseguy // the guy hiding in the fusebox alcove +local entity stepsguy1 // the first guy at the bottom of the steps +local entity stepsguy2 // the second guy at the bottom of the steps +local entity fusedoor // the door that will get kicked open +local entity killhim68 // the player +local int sig1 +local int sig2 + +fuseguy = find entity with targetname "fuseguy" +stepsguy1 = find entity with targetname "stepsguy1" +stepsguy2 = find entity with targetname "stepsguy2" +fusedoor = find entity with targetname "fusedoor" +killhim68 = find entity player +// fusedoor.movetype = MOVETYPE_NOCLIP + + +use entity stepsguy1 // spawns the first guy in +use entity stepsguy2 // spawns the sec guy in +animate entity stepsguy2 performing action SCRIPT_RELEASE + +animate entity stepsguy1 performing action STD_FCORNERPEAK_RT_P_A targeting entity killhim68 +animate entity stepsguy1 performing action SCRIPT_RELEASE + +animate entity fuseguy performing action STD_XKICKDOOR_N_A_A signaling sig1 // plays the kicking door animations +animate entity fuseguy performing action SCRIPT_RELEASE +wait .25 seconds +moverotate entity fusedoor from file "generic_door_ccw.rof" signaling sig2 // rotates the door kicked open +play sound "Impact/Vending/Kick.wav" for entity fusedoor at volume 0.9 +wait for all clearing sig1, sig2 + + + + diff --git a/Sample/ds/tsr1/bummurder.ds b/Sample/ds/tsr1/bummurder.ds new file mode 100644 index 0000000..f736554 --- /dev/null +++ b/Sample/ds/tsr1/bummurder.ds @@ -0,0 +1,23 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + + +local entity deadbum // the bum who will get killed on the subway tracks +local entity bumkiller // the guy who will shoot the bum from behind +local int sig1 + +deadbum = find entity with targetname "deadbum" +bumkiller = find entity with targetname "bumkiller" + + +use entity bumkiller // spawns the bumkiller in +animate entity bumkiller performing action STD_R_N_PK_N by moving [0, -256, 0] signaling sig1 // guy runs down other track tunnel +wait for all clearing sig1 +animate entity bumkiller performing action STD_F_FWD_P_2 targeting entity deadbum kill signaling sig1 // he should kill the bum with this shot +wait for all clearing sig1 + +animate entity bumkiller performing action SCRIPT_RELEASE + + diff --git a/Sample/ds/tsr1/cam3.ds b/Sample/ds/tsr1/cam3.ds new file mode 100644 index 0000000..9c97147 --- /dev/null +++ b/Sample/ds/tsr1/cam3.ds @@ -0,0 +1,21 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + + +local entity sabre1 // skinhead boss who will shoot the hostages +local entity introhostage1 // the hostage to the left of sabre in the intro + + +sabre1 = find entity with targetname "sabre1" +introhostage1 = find entity with targetname "introhostage1" + + + + + + + + +animate entity sabre1 performing action STD_ERAGESHOOT_N_P_N targeting entity introhostage1 kill nulltarget HEAD// diff --git a/Sample/ds/tsr1/check_guys.ds b/Sample/ds/tsr1/check_guys.ds new file mode 100644 index 0000000..002297f --- /dev/null +++ b/Sample/ds/tsr1/check_guys.ds @@ -0,0 +1,28 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + +local entity lstallguy1 // the first guy in the ladies room stall +local entity lstallguy2 // the sec guy in the ladies rooms stall +local entity lstallguy3 // the newest guy in the stall sequence +local entity fire_script // the script runner that will start the sequence + +lstallguy1 = find entity with targetname "lstallguy1" +lstallguy2 = find entity with targetname "lstallguy2" +lstallguy3 = find entity with targetname "lstallguy3" +fire_script = find entity with targetname "t57" + + +// this checks the health all the time to see if the player takes a cheap shot at the guys in the stalls + +on lstallguy1.health < 100 goto stall_release +on lstallguy2.health < 100 goto stall_release +on lstallguy3.health < 100 goto stall_release + +suspend + +label stall_release + +use entity fire_script // fires off the script runner in case any of the guys get shot by the player +exit diff --git a/Sample/ds/tsr1/closetguy.ds b/Sample/ds/tsr1/closetguy.ds new file mode 100644 index 0000000..1ee190e --- /dev/null +++ b/Sample/ds/tsr1/closetguy.ds @@ -0,0 +1,41 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + +// skinhead karate kicks a door open + + + +local entity closetdoor // the door that opens slowly +local entity closetguy // the skinhead who will karate kick open the door +local entity f_closetpush // the push brush infront of the closet in case the player is by the rofed door +local int sig1 +local int sig2 + +closetdoor = find entity with targetname "closetdoor" +closetguy = find entity with targetname "closetguy" +f_closetpush = find entity with targetname "f_closetpush" + +// closetdoor.movetype = MOVETYPE_NOCLIP + +use entity closetguy // spawns him in +animate entity closetguy performing action STD_XKICKDOOR_N_A_A by moving [32, 0, 0] signaling sig1 // this is the ninja kick animation +animate entity closetguy performing action SCRIPT_RELEASE +wait .25 seconds +use entity f_closetpush // triggers the pushbrush to get the player out of the way +moverotate entity closetdoor from file "generic_door_ccw.rof" signaling sig2 // the door kicking open animation +wait .2 seconds +use entity f_closetpush // shuts this off +play sound "impact/door/kickdoor.wav" for entity closetdoor at volume 0.9 +wait for all clearing sig1, sig2 + + + +// closetdoor.movetype = MOVETYPE_STOP + + + + + + + diff --git a/Sample/ds/tsr1/cnrleaner1.ds b/Sample/ds/tsr1/cnrleaner1.ds new file mode 100644 index 0000000..50500e4 --- /dev/null +++ b/Sample/ds/tsr1/cnrleaner1.ds @@ -0,0 +1,43 @@ + + +#include "../common/header.ds" + +output "p:/base/ds/tsr1" + + +////////////////////////////////////////////////////////////////////////// +// Enemy leans around corner near token booth coming from start +////////////////////////////////////////////////////////////////////////// + +//enemy that leans +local entity cornerlean1 + +//to target player +local entity sneak + +//trigger relay for cnrleaner2 script +local entity cornerln2 + + +//enemy that leans +cornerlean1 = find entity with targetname "cornerlean1" + +//to target player +sneak = find entity player + +//trigger relay for cnrleaner2 script +cornerln2 = find entity with targetname "cornerln2" + + + + + + +//spawns leaner +use entity cornerlean1 +// this is him peeking around the corner firing +animate entity cornerlean1 performing action STD_FCORNERPEAK_RT_P_A targeting entity sneak +animate entity cornerlean1 performing action SCRIPT_RELEASE + +//remove trigger relay for cnrleaner2 script +remove entity cornerln2 \ No newline at end of file diff --git a/Sample/ds/tsr1/cnrleaner2.ds b/Sample/ds/tsr1/cnrleaner2.ds new file mode 100644 index 0000000..2882f13 --- /dev/null +++ b/Sample/ds/tsr1/cnrleaner2.ds @@ -0,0 +1,43 @@ + + +#include "../common/header.ds" + +output "p:/base/ds/tsr1" + + +////////////////////////////////////////////////////////////////////////// +// Enemy leans around corner near token booth coming from tokenbooth +////////////////////////////////////////////////////////////////////////// + +//enemy that leans +local entity cornerlean2 + +//to target player +local entity sneak + +//trigger relay for cnrleaner1 script +local entity cornerln1 + + + +//enemy that leans +cornerlean2 = find entity with targetname "cornerlean2" + +//to target player +sneak = find entity player + +//trigger relay for cnrleaner1 script +cornerln1 = find entity with targetname "cornerln1" + + + + + +//spawns leaner +use entity cornerlean2 +// this is him peeking around the corner firing +animate entity cornerlean2 performing action STD_FCORNERPEAK_LT_P_A targeting entity sneak +animate entity cornerlean2 performing action SCRIPT_RELEASE + +//remove trigger relay for cnrleaner1 script +remove entity cornerln1 \ No newline at end of file diff --git a/Sample/ds/tsr1/corner1b.ds b/Sample/ds/tsr1/corner1b.ds new file mode 100644 index 0000000..4c94902 --- /dev/null +++ b/Sample/ds/tsr1/corner1b.ds @@ -0,0 +1,31 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + +local entity hostage1 // the first hostage being kicked +local entity hostage2 // the second hostage next to him +local entity hostageshooter // the guy who will try and kill the hostages once the player is in the room +local entity corner1guy // the other guy around the corner +local int sig1 +local int sig2 + +hostage1 = find entity with targetname "hostage1" +hostage2 = find entity with targetname "hostage2" +corner1guy = find entity with targetname "corner1guy" +hostageshooter = find entity with targetname "hostageshooter" + + +use entity hostageshooter // spawns the guy in +use entity corner1guy // spawns the other guy in + +animate entity corner1guy performing action STD_R_N_PK_N by moving [-200, 0, 0] // gets the other guy moving to the side +animate entity corner1guy performing action SCRIPT_RELEASE + +animate entity hostageshooter performing action STD_R_N_MRS_2 by moving [-256, 0 , 0] // gets him to the side +// animate entity hostageshooter performing action STD_F_FWD_S_2 targeting entity hostage2 kill signaling sig1 // he attempts to murder the hostages +// animate entity hostageshooter performing action STD_F_FWD_S_2 targeting entity hostage1 kill signaling sig2 +// wait for all clearing sig1, sig2 +animate entity hostageshooter performing action SCRIPT_RELEASE + + diff --git a/Sample/ds/tsr1/endcam.ds b/Sample/ds/tsr1/endcam.ds new file mode 100644 index 0000000..edd4902 --- /dev/null +++ b/Sample/ds/tsr1/endcam.ds @@ -0,0 +1,145 @@ +// end camera voice over and flick for TEASER map + +#include "../common/header.ds" + +output "p:/base/ds/tsr1" + +//Declare all of the camera and notnull entities +local entity firstcam //first camera for the voice over +local entity firstnull //first camera null for the voice over +local entity secondcam //second camera for the voice over +local entity secondnull //second camera null for the voice over +local entity thirdcam //third camera for the voice over +local entity thirdnull //third camera null for the voice over +local entity fourthcam //fourth camera for the voice over +local entity fourthnull //fourth camera null for the voice over +local entity fifthcam //fifth camera for the voice over +local entity fifthnull //fifth camera null for the voice over +local entity endlevel // the end level trigger + +//Declare all of the black raider entities +local entity firstguard +local entity secondguard +local entity thirdguard +local entity fourthguard +local entity fifthguard +local entity sixthguard +local entity seventhguard +local entity eighthguard +local entity ninthguard +local entity escapetruck +local entity exitdoor + + +//Declare all of the signaling integers +local int sig1 //first signaling integer +local int sig2 //second signaling integer +local int sig3 //third signaling integer + +// assign all cameras and nulls to their appropriate entities +firstcam = find entity with targetname "firstcam" +firstnull = find entity with targetname "firstnull" +secondcam = find entity with targetname "secondcam" +secondnull = find entity with targetname "secondnull" +thirdcam = find entity with targetname "thirdcam" +thirdnull = find entity with targetname "thirdnull" +fourthcam = find entity with targetname "fourthcam" +fourthnull = find entity with targetname "fourthnull" +fifthcam = find entity with targetname "fifthcam" +fifthnull = find entity with targetname "fifthnull" +endlevel = find entity with targetname "endlevel" + +//assign all black raiders to the appropriate entities +firstguard = find entity with targetname "firstguard" +secondguard = find entity with targetname "secondguard" +thirdguard = find entity with targetname "thirdguard" +fourthguard = find entity with targetname "fourthguard" +fifthguard = find entity with targetname "fifthguard" +sixthguard = find entity with targetname "sixthguard" +seventhguard = find entity with targetname "seventhguard" +eighthguard = find entity with targetname "eighthguard" +ninthguard = find entity with targetname "ninthguard" +escapetruck = find entity with targetname "escapetruck" +exitdoor = find entity with targetname "exitdoor" + +//Assign movetypes to the cameras and their associated notnulls +firstcam.movetype = MOVETYPE_NOCLIP +firstnull.movetype = MOVETYPE_NOCLIP + +secondcam.movetype = MOVETYPE_NOCLIP +secondnull.movetype = MOVETYPE_NOCLIP + +thirdcam.movetype = MOVETYPE_NOCLIP +thirdnull.movetype = MOVETYPE_NOCLIP + +fourthcam.movetype = MOVETYPE_NOCLIP +fourthnull.movetype = MOVETYPE_NOCLIP + +fifthcam.movetype = MOVETYPE_NOCLIP +fifthnull.movetype = MOVETYPE_NOCLIP + +escapetruck.movetype = MOVETYPE_NOCLIP + +use entity firstcam // turn on the first camera and watch the guys shoot for a while +//make sure to remember to start the voice over here. Play the damn sound! +animate entity firstguard performing action STD_WBACKAIM_N_MS_2 by moving [-200,0,0] //signaling sig1 +wait .25 seconds +animate entity secondguard performing action STD_WBACKAIM_N_MS_2 by moving [-200,0,0]//signaling sig2 +//wait for all clearing sig1, sig2 +wait 2.5 seconds +use entity firstcam // turn off the first camera +remove entity firstguard +remove entity secondguard + + +use entity secondcam // turn on the second camera and watch the guys shoot for a while +animate entity thirdguard performing action STD_WBACKAIM_N_MS_2 by moving [-200,0,0] //signaling sig1 +wait .25 seconds +animate entity fourthguard performing action STD_WBACKAIM_N_MS_2 by moving [-200,0,0] //signaling sig2 +//wait for all clearing sig1, sig2 +wait 2.5 seconds +use entity secondcam // turn off the second camera +remove entity thirdguard +remove entity fourthguard + + +use entity thirdcam //turn on third camera +animate entity fifthguard performing action STD_XYELLWAVE_BK_A_N signaling sig1 +animate entity seventhguard performing action CCH_A_FWD_MS_2 repeating for 2 times +wait for any clearing sig1 +animate entity fifthguard performing action STD_R_N_MRS_2 by moving [-200,0,0] +use entity sixthguard +animate entity seventhguard performing action CCH_XCROUCH_UP_MRS_2 //signaling sig1 +//wait for any clearing sig1 +animate entity seventhguard performing action STD_F_FWD_S_2 signaling sig1 +wait for any clearing sig1 +animate entity seventhguard performing action STD_WBACKAIM_N_MS_2 by moving [-64,0,0] signaling sig1 +wait for any clearing sig1 +use entity thirdcam //turn off third camera +remove entity fifthguard +remove entity sixthguard +remove entity seventhguard + +use entity fourthcam //turn on fourth camera +animate entity ninthguard performing action CCH_A_FWD_MS_2 signaling sig1 +wait for all clearing sig1 +wait 2 seconds +use entity fourthcam //turn off fourth camera +remove entity ninthguard + +use entity fifthcam //turn on fifth camera +use entity exitdoor +animate entity eighthguard performing action STD_ISTAND_N_A_N signaling sig1 // +wait for any clearing sig1 +animate entity eighthguard performing action STD_ECOMEHERE_N_A_N repeating for 2 times signaling sig1 +wait for any clearing sig1 +use entity escapetruck // should start the wheels moving // MADE BY JERSEY :) +move entity escapetruck by [-400,0,0] at 60 speed +animate entity eighthguard performing action STD_ISTAND_N_A_N signaling sig1 +wait for any clearing sig1 +wait 1 seconds +use entity fifthcam // turn off fifth camera +// use entity endlevel // starts the next level + + +exit \ No newline at end of file diff --git a/Sample/ds/tsr1/endcavein.ds b/Sample/ds/tsr1/endcavein.ds new file mode 100644 index 0000000..02d6951 --- /dev/null +++ b/Sample/ds/tsr1/endcavein.ds @@ -0,0 +1,85 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + + + +local entity beam1 // the first beam looking from the front +local entity beam1b + +local entity beam2 // second beam +local entity beam2b + +local entity beam3 // third beam +local entity beam3b + +local entity rubblechunk1 // the first ceiling rubble chunk that will animate +local entity rubblechunk2 // the second one + +local entity breakceiling // the ceiling breakable brush + +local entity endexplosion1 // the first explosion +local entity endexplosion2 // 2nd +local entity endexplosion3 // 3rd +local entity trainplayer +local entity trainshake // the screenshake effect for the explosion +local entity dirtpile // +local entity tunnelsabre // the sabre model the player will see running into the alcove +local int sig1 + + +beam1 = find entity with targetname "beam1" +beam1b = find entity with targetname "beam1b" +beam2 = find entity with targetname "beam2" +beam2b = find entity with targetname "beam2b" +beam3 = find entity with targetname "beam3" +beam3b = find entity with targetname "beam3b" + +rubblechunk1 = find entity with targetname "rubblechunk1" +rubblechunk2 = find entity with targetname "rubblechunk2" + + +breakceiling = find entity with targetname "breakceiling" + + +endexplosion1 = find entity with targetname "endexplosion1" +endexplosion2 = find entity with targetname "endexplosion2" +endexplosion3 = find entity with targetname "endexplosion3" + +trainplayer = get entity activator +trainshake = find entity with targetname "trainshake" +tunnelsabre = find entity with targetname "tunnelsabre" + + +dirtpile = find entity with targetname "dirtpile" + +// THE EXPLOSIVES GETTING SET OFF + +animate entity tunnelsabre performing action STD_R_N_PK_N by moving [-448, 0, 0] signaling sig1 // him running into the little alcove +wait for all clearing sig1 + + +use entity endexplosion1 + +moverotate entity beam1 from file "tsr1_beam1.rof" // the first beams animation +moverotate entity beam1b from file "tsr1_beam1b.rof" // the first part 2 +moverotate entity beam2 from file "tsr1_beam2.rof" // second +moverotate entity beam2b from file "tsr1_beam2b.rof" // +moverotate entity beam3 from file "tsr1_beam3.rof" // third +moverotate entity beam3b from file "tsr1_beam3b.rof" // + + +moverotate entity rubblechunk1 from file "tsr1_rchunk1.rof" // the first rubble chunk animation +moverotate entity rubblechunk2 from file "tsr1_rchunk2.rof" // second one + + +play sound "Impact\Stone\BigRubble.adp" for entity trainplayer at volume 0.9 on channel CHAN_AUTO +use entity trainshake // triggers it +use entity breakceiling +use entity dirtpile // triggers the dirpile in + +animate entity tunnelsabre performing action STD_R_N_PK_N by moving [0, 176, 0] signaling sig1 // him running out of view +wait for all clearing sig1 +remove entity tunnelsabre // gets him out of the world + diff --git a/Sample/ds/tsr1/endcin.ds b/Sample/ds/tsr1/endcin.ds new file mode 100644 index 0000000..4082d62 --- /dev/null +++ b/Sample/ds/tsr1/endcin.ds @@ -0,0 +1,215 @@ +#include "../common/header.ds" +#include "tsr1.ds" +output "p:/base/ds/tsr1" + + +// this script starts the end cinematic + + +local entity endcam1 // the first camera +local entity endcam1n // the first cameras null +local entity endcam2 // the second camera +local entity endcam2n // the second cameras null +local entity endcam3 // the third camera +local entity endcam3n // the third cameras null +local entity endcam4 // the 4th camera +local entity endcam4n // the 4th cameras null +local entity endhawk1 // the hawk model for the end cinematic +local entity endhawk1b // the hawk model for the end cinematic +local entity endjohn1 // the john model used for the shots +local entity endhawk2 // the hawk model for the end cinematic +local entity endjohn2 // the john model used for the shots + + +//Declare all of the camera and notnull entities +local entity firstcam //first camera for the voice over +local entity firstnull //first camera null for the voice over +local entity secondcam //second camera for the voice over +local entity secondnull //second camera null for the voice over +local entity thirdcam //third camera for the voice over +local entity thirdnull //third camera null for the voice over +local entity fourthcam //fourth camera for the voice over +local entity fourthnull //fourth camera null for the voice over +local entity fifthcam //fifth camera for the voice over +local entity fifthnull //fifth camera null for the voice over +local entity endlevel // the end level trigger + + + + + + +// ALL THE GUYS THAT COULD BE LEFT OVER FROM THE SPAWNER SCRIPT INCLUDING THE TRAIN GUYS + +local entity endspawner1 // the first spawner at the end +local entity endspawner2 // the second spawner at the end +local entity endrightguy // the guy in the right alcove at the end of the tunnel +local entity endleftguy // the guy in the left alcove at the end of the tunnel +local entity rtskinhead1 // skinheads on the train +local entity rtskinhead2 // skinheads on the train +local entity rtskinhead3 // skinheads on the train +local entity testfade // the func fade to black +local entity testfade2 // the func fade that brings it back to normal + +//Declare all of the signaling integers +local int sig1 //first signaling integer +local int sig2 //second signaling integer +local int sig3 //third signaling integer + + + + + + + +cache sound "cin/tsr1/c8d1.adp" +cache sound "cin/tsr1/c8d2.adp" +// cache sound "cin/tsr1/c8d3.adp" +cache sound "cin/tsr1/c9d1.adp" +cache sound "cin/tsr1/c9d2.adp" +cache sound "cin/tsr1/c9d3.adp" +// cache sound "Enemy/So1/Sib1/Wake4.wav" + +endcam1 = find entity with targetname "endcam1" +enable cinematics +use entity endcam1 + +endcam1n = find entity with targetname "endcam1n" +endcam2 = find entity with targetname "endcam2" +endcam2n = find entity with targetname "endcam2n" +endcam3 = find entity with targetname "endcam3" +endcam3n = find entity with targetname "endcam3n" +endcam4 = find entity with targetname "endcam4" +endcam4n = find entity with targetname "endcam4n" +endhawk1 = find entity with targetname "endhawk1" +endhawk1b = find entity with targetname "endhawk1b" +endjohn1 = find entity with targetname "endjohn1" +endhawk2 = find entity with targetname "endhawk2" +endjohn2 = find entity with targetname "endjohn2" + + + +endspawner1 = find entity with targetname "endspawner1" +endspawner2 = find entity with targetname "endspawner2" +endrightguy = find entity with targetname "endrightguy" +endleftguy = find entity with targetname "endleftguy" +rtskinhead1 = find entity with targetname "rtskinhead1" +rtskinhead2 = find entity with targetname "rtskinhead2" +rtskinhead2 = find entity with targetname "rtskinhead2" + +testfade = find entity with targetname "testfade" +testfade2 = find entity with targetname "testfade2" + + + +endcam1.movetype = MOVETYPE_NOCLIP +endcam1n.movetype = MOVETYPE_NOCLIP +endcam2.movetype = MOVETYPE_NOCLIP +endcam2n.movetype = MOVETYPE_NOCLIP +endcam3.movetype = MOVETYPE_NOCLIP +endcam3n.movetype = MOVETYPE_NOCLIP +endcam4.movetype = MOVETYPE_NOCLIP +endcam4n.movetype = MOVETYPE_NOCLIP + + +// REMOVE ALL THE GUYS FROM THE LAST SCRIPT, DONT KNOW IF THIS WILL WORK? + +remove entity endspawner1 +remove entity endspawner2 +remove entity endleftguy +remove entity endrightguy +remove entity rtskinhead1 +remove entity rtskinhead2 +remove entity rtskinhead3 + + + +// first shot if hawk running into the camera view in the tunnel + +use entity testfade2 // fade in from black to show hawk + +use entity endhawk1 // spawns him in +// use entity endcam1 // should turn on the camera +animate entity endhawk1 performing action STD_R_N_PK_N by moving [0, -242, 0] signaling sig1 // shows hawk running towards the camera +wait for all clearing sig1 + + + +// third shot of hawk stepping into the frame + +use entity endjohn1 // spawns john in for the shot +use entity endhawk1b //spawns the other hawk model in for the shot +wait .1 seconds // NEW CHANGE + +remove entity endhawk1 // gets old hawk out + +use entity endcam3 // turns on the second shot + +move entity endcam3 to [1816, -1882, -476] at 65 speed +move entity endcam3n to [1822, -1874, -476] at 65 speed +animate entity endhawk1b performing action STD_R_N_PK_N by moving [0, -256, 0] // hawk running into this shot +animate entity endjohn1 performing action STD_IETALKPOSE_N_A_N holding for 6.0 +wait 1.2 seconds // delay for hawk to stop running + + + +// hawk talking during this shot + +animate entity endhawk1b showing emotion EMOTION_TALK holding for 2.5 // Hawks talking animation +animate entity endhawk1b performing action STD_ETALKLEFT_N_A_N holding for .4 +animate entity endhawk1b performing action STD_ETALK_N_A_N holding for 2.1 + + play sound "cin/tsr1/c8d1.adp" for entity endhawk1b at volume 0.9 on channel CHAN_AUTO + print TSR1_C8D1 + // "This ones over John .." + +wait 2.5 seconds + + + +// 4th shot of them running back up the tracks + +use entity endhawk2 // triggers the other endhawk in +use entity endjohn2 // triggers the other end john in +wait .1 seconds // NEW STUFF + +use entity endcam3 // shuts the second shut off +remove entity endhawk1b + +use entity endcam4 // triggers on that last camera +wait .1 seconds // magic delay for shot + +animate entity endhawk2 performing action STD_R_N_PK_N by moving [0, 600, 0] +animate entity endjohn2 performing action STD_R_N_PK_N by moving [0, 600, 0] + + play sound "cin/tsr1/c8d2.adp" for entity endjohn2 at volume 0.9 on channel CHAN_AUTO + print TSR1_C8D2 + // "Something big has happened" captioned + wait 4 seconds + +use entity testfade // triggers the fade out +wait 1.5 seconds + + +disable cinematics + + + + +unload sound "cin/tsr1/c8d1.adp" +unload sound "cin/tsr1/c8d2.adp" +// unload sound "cin/tsr1/c8d3.adp" +unload sound "cin/tsr1/c9d1.adp" +unload sound "cin/tsr1/c9d2.adp" +unload sound "cin/tsr1/c9d3.adp" + +// setcvar cvar "scr_blank" to 1.0 + +setcvar cvar "menu_nextmap" to "tsr2" +run console command "intermission acc2" + +// use entity endlevel // starts the next level + + + +exit diff --git a/Sample/ds/tsr1/endexplosion.ds b/Sample/ds/tsr1/endexplosion.ds new file mode 100644 index 0000000..9265ea7 --- /dev/null +++ b/Sample/ds/tsr1/endexplosion.ds @@ -0,0 +1,23 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + + + +local entity tunnelsabre // the sabre model the player will see running into the alcove +local int sig1 + +// this script triggers the explosion that happens at the end of the tunnel + + +tunnelsabre = find entity with targetname "tunnelsabre" + +// play sound "cin/tsr1/c5d2.adp" for entity tunnelsabre at volume 0.9 on channel CHAN_VOICE +animate entity tunnelsabre performing action STD_R_N_PK_N by moving [-504, 0, 0] signaling sig1 // him running into the little alcove +wait for all clearing sig1 +animate entity tunnelsabre performing action STD_R_N_PK_N by moving [0, 176, 0] signaling sig1 // him running out of view +wait for all clearing sig1 +remove entity tunnelsabre // gets him out of the world + + diff --git a/Sample/ds/tsr1/endsteps.ds b/Sample/ds/tsr1/endsteps.ds new file mode 100644 index 0000000..68e4d12 --- /dev/null +++ b/Sample/ds/tsr1/endsteps.ds @@ -0,0 +1,22 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + +local entity endstepsguy1 // first dude who will jump down the stairs +local entity endstepsguy2 // the second guy + + +endstepsguy1 = find entity with targetname "endstepsguy1" +endstepsguy2 = find entity with targetname "endstepsguy2" + + + +animate entity endstepsguy2 performing action STD_JRUN_FWD_A_A by moving [0, -188, 0] // first guy jumps off the steps +// animate entity endstepsguy1 performing action RUN by moving [-40, 0, 0] // second guy runs towards the steps +// animate entity endstepsguy1 performing action STD_JRUN_FWD_A_A by moving [0, -128, 0] // jumps off the steps + +animate entity endstepsguy2 performing action SCRIPT_RELEASE +exit + + diff --git a/Sample/ds/tsr1/endstepsa.ds b/Sample/ds/tsr1/endstepsa.ds new file mode 100644 index 0000000..9c7d1c6 --- /dev/null +++ b/Sample/ds/tsr1/endstepsa.ds @@ -0,0 +1,25 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + + +// this script spawns guys in around the corner just in case ghoul is rendering them + + + +local entity endstepsguy1 // first guy +local entity endstepsguy2 // second guy who will jump down the stairs +local entity bstepsguy // the guy walking path corners at the bottom of the stairs + +endstepsguy1 = find entity with targetname "endstepsguy1" +endstepsguy2 = find entity with targetname "endstepsguy2" +bstepsguy = find entity with targetname "bstepsguy" + +use entity endstepsguy1 // spawns the first guy in +use entity endstepsguy2 // spawns the second guy in. +use entity bstepsguy // spawns the other guy in + +animate entity endstepsguy1 performing action SCRIPT_RELEASE +animate entity endstepsguy2 performing action SCRIPT_RELEASE +animate entity bstepsguy performing action SCRIPT_RELEASE \ No newline at end of file diff --git a/Sample/ds/tsr1/endtunnel.ds b/Sample/ds/tsr1/endtunnel.ds new file mode 100644 index 0000000..c527d38 --- /dev/null +++ b/Sample/ds/tsr1/endtunnel.ds @@ -0,0 +1,58 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" +#include "tsr1.ds" + + + +// script that controls end stuff falling and rotating in tunnel + + + +local entity endspawner1 // the first spawner at the end +local entity endspawner2 // the second spawner at the end +local entity endrightguy // the guy in the right alcove at the end of the tunnel +local entity endleftguy // the guy in the left alcove at the end of the tunnel +local entity findjohnend + + +endspawner1 = find entity with targetname "endspawner1" +endspawner2 = find entity with targetname "endspawner2" +endrightguy = find entity with targetname "endrightguy" +endleftguy = find entity with targetname "endleftguy" +findjohnend = find entity player + + +wait 1 seconds // slight pause to make it sound more natural + +// JOHN TALKING TO HAWK OVER THE WALKIE TALKIE + + play sound "cin/tsr1/s2d1.adp" for entity findjohnend at volume 0.9 // john talking to hawk + print TSR1_S2D1 + // "damn" + + +use entity endspawner1 // triggers the first endspawner to activate +use entity endspawner2 // triggers the first endspawner to activate +use entity endrightguy // should send these guys to their point combats +use entity endleftguy // + +wait 3 seconds + + play sound "cin/tsr1/s2d2.adp" for entity findjohnend at volume 0.9 // john talking to hawk + print TSR1_S2D2 + // "copy.. look out" + +wait 2 seconds + + +use entity endspawner1 // triggers the first endspawner to activate +use entity endspawner2 // triggers the first endspawner to activate +use entity endrightguy // should send these guys to their point combats +use entity endleftguy // + + + + + + + diff --git a/Sample/ds/tsr1/etrainset.ds b/Sample/ds/tsr1/etrainset.ds new file mode 100644 index 0000000..913185c --- /dev/null +++ b/Sample/ds/tsr1/etrainset.ds @@ -0,0 +1,33 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + +// this script starts the train with skinheads on it running towards the end + + + +local entity rtskinhead1 // the first guy towards the front of the train +local entity rtskinhead2 // the second skinhead towards the back of the train +local entity rtskinhead3 // the third middle guy on the train +local entity skintrain // the train they ride out on +local entity trainplay + +rtskinhead1 = find entity with targetname "rtskinhead1" +rtskinhead2 = find entity with targetname "rtskinhead2" +rtskinhead3 = find entity with targetname "rtskinhead3" +skintrain = find entity with targetname "skintrain" +trainplay = find entity with targetname "player" + +use entity rtskinhead1 // spawns him in +use entity rtskinhead2 // spawns him in +use entity skintrain // starts the train moving + +animate entity rtskinhead1 performing action CCH_A_FWD_MS_2 targeting entity trainplay // holding for 9.0 // crouching firing +animate entity rtskinhead1 performing action SCRIPT_RELEASE + +animate entity rtskinhead3 performing action CCH_A_FWD_MS_2 targeting entity trainplay // holding for 9.0 // crouching firing +animate entity rtskinhead3 performing action SCRIPT_RELEASE + +animate entity rtskinhead2 performing action CCH_A_FWD_P_2 targeting entity trainplay // holding for 9.0 // crouching firing +animate entity rtskinhead2 performing action SCRIPT_RELEASE + diff --git a/Sample/ds/tsr1/gbnyc1.ds b/Sample/ds/tsr1/gbnyc1.ds new file mode 100644 index 0000000..ea56a49 --- /dev/null +++ b/Sample/ds/tsr1/gbnyc1.ds @@ -0,0 +1,28 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + +///////////////////////////////////////////////// +// Declare + +local entity bloke +local entity inplayer +local int sig + +///////////////////////////////////////////////// +// Assign + +bloke = find entity with targetname "subway_bloke1" +inplayer = find entity player +///////////////////////////////////////////////// +// Action + +play sound "enemy/sk1/tsr1/wake3.wav" for entity inplayer at volume 0.9 on channel CHAN_AUTO +animate entity bloke performing action STD_R_N_PK_N by moving [256,0,0] signaling sig // 336 +wait for all clearing sig +// animate entity bloke performing action STD_R_N_PK_N by moving [0,-208,0] signaling sig +// wait for all clearing sig +// animate entity bloke performing action SCRIPT_RELEASE +remove entity bloke + + +// End \ No newline at end of file diff --git a/Sample/ds/tsr1/gbnyc2.ds b/Sample/ds/tsr1/gbnyc2.ds new file mode 100644 index 0000000..a11ddf9 --- /dev/null +++ b/Sample/ds/tsr1/gbnyc2.ds @@ -0,0 +1,42 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + +///////////////////////////////////////////////// +// Declare + + +local entity runningguy // skinhead guy who runs around the corner quickly +local entity deadswatguy1 // the swat guy who will get killed +local entity swatkiller // the guy who will shoot the wounded swatguy +local entity gumball1 // the gumball machine +local int sig1 + +///////////////////////////////////////////////// +// Assign + + +runningguy = find entity with targetname "runningguy" +deadswatguy1 = find entity with targetname "deadswatguy1" +swatkiller = find entity with targetname "swatkiller" +gumball1 = find entity with targetname "gumball1" + + + +///////////////////////////////////////////////// +// Action +use entity deadswatguy1 // spawns the dead swatguy +use entity runningguy // spawns the guy in +animate entity swatkiller performing action SCRIPT_RELEASE + +use entity gumball1 // makes sure the gumball machine breaks + + +animate entity deadswatguy1 performing action LB_XLEANUPSHOOT_N_P_N targeting entity swatkiller +animate entity deadswatguy1 performing action SCRIPT_RELEASE +remove entity runningguy // gets him out of the way + + + + + +// End \ No newline at end of file diff --git a/Sample/ds/tsr1/gbnyc3.ds b/Sample/ds/tsr1/gbnyc3.ds new file mode 100644 index 0000000..bd8039d --- /dev/null +++ b/Sample/ds/tsr1/gbnyc3.ds @@ -0,0 +1,78 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + +///////////////////////////////////////////////// +// Declare + +local entity npc_murder // guy getting murdered +local entity npc_killer // the guy who kills him +local entity npc_watcher // the guy just standing there +local entity trackcam1_new // the first camera watching +local int sig1 + +///////////////////////////////////////////////// +// Assign + +npc_murder = find entity with targetname "npc_murder" +npc_killer = find entity with targetname "npc_killer" +npc_watcher = find entity with targetname "npc_watcher" +trackcam1_new = find entity with targetname "trackcam1_new" + + + + + +///////////////////////////////////////////////// + +trackcam1_new.movetype = MOVETYPE_NOCLIP + +// Action +/* +use entity npc_murder // spawns the guy who will get murdered in +use entity npc_killer // spawns the guy who will kill him +use entity npc_watcher // spawns the guy next to him in +*/ + + +animate entity npc_murder performing action STD_XAFRAIDSHAKE_N_N_N + + +play sound "speech/tsr1/npc/eb9-1.adp" for entity npc_murder at volume 0.9 +wait .7 seconds +animate entity npc_killer performing action STD_FATTITUDE_N_P_A targeting entity npc_murder kill nulltarget HEAD signaling sig1 + + +wait for all clearing sig1 + +// murder taking off out of sight +wait 1 seconds +play sound "speech/tsr1/skn/bt9-2.adp" for entity npc_killer at volume 0.9 +animate entity npc_killer performing action STD_R_N_PK_N by moving [0, -16, 0] + +animate entity npc_watcher performing action STD_R_N_MRS_2 by moving [-112, 0, 0] + +animate entity npc_killer performing action STD_R_N_PK_N by moving [-152, 0, 0] + +animate entity npc_killer performing action STD_R_N_PK_N by moving [0, -296, 0] // -226 +animate entity npc_killer performing action STD_R_N_PK_N by moving [-172, 0, 0] // -226 + +animate entity npc_watcher performing action STD_R_N_MRS_2 by moving [0, -372, 0] // -382 +animate entity npc_watcher performing action STD_R_N_MRS_2 by moving [-172, 0, 0] // -382 + + +wait 7 seconds +remove entity npc_killer +remove entity npc_watcher + + + + + +wait 2 seconds +play sound "speech/tsr1/skn/bt9-2.adp" for entity npc_killer at volume 0.9 + + + + + + diff --git a/Sample/ds/tsr1/gbnyc4.ds b/Sample/ds/tsr1/gbnyc4.ds new file mode 100644 index 0000000..7f2a411 --- /dev/null +++ b/Sample/ds/tsr1/gbnyc4.ds @@ -0,0 +1,31 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + +///////////////////////////////////////////////// +// Declare + +local entity camroom_door +local entity camroom_hole +local entity openin // the func wall for collision +local int sig1 +local int sig2 + +///////////////////////////////////////////////// +// Assign + +camroom_door = find entity with targetname "camroom_door" +camroom_hole = find entity with targetname "camroom_hole" +openin = find entity with targetname "openin" + +///////////////////////////////////////////////// +// Action + +camroom_hole.movetype = MOVETYPE_NOCLIP + +rotate entity camroom_door by [0,-90,0] at 90 speed signaling sig1 +rotate entity camroom_hole by [0,-90,0] at 90 speed signaling sig2 +wait for all clearing sig1,sig2 +use entity openin +camroom_hole.movetype = MOVETYPE_NONE + +// End \ No newline at end of file diff --git a/Sample/ds/tsr1/gbnyc5.ds b/Sample/ds/tsr1/gbnyc5.ds new file mode 100644 index 0000000..76fd3b5 --- /dev/null +++ b/Sample/ds/tsr1/gbnyc5.ds @@ -0,0 +1,46 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + +///////////////////////////////////////////////// +// Declare + +local entity camroom_door +local entity camroom_hole +local entity camroom_guys +local entity sparks1 // the spark gen by the fusebox +local entity right // the monitor towards the right +local entity backwall // the monitor by the back wall +local entity camdoorkicker // the guy who will actually kick the door open +local entity openin +local int sig1 +local int sig2 + +///////////////////////////////////////////////// +// Assign + +camroom_door = find entity with targetname "camroom_door" +camroom_hole = find entity with targetname "camroom_hole" +camroom_guys = find entity with targetname "camroom_guys" +sparks1 = find entity with targetname "sparks1" +right = find entity with targetname "right" +backwall = find entity with targetname "backwall" +camdoorkicker = find entity with targetname "camdoorkicker" +openin = find entity with targetname "openin" + +///////////////////////////////////////////////// +// Action + +camroom_hole.movetype = MOVETYPE_NOCLIP +rotate entity camroom_door by [0,90,0] at 155 speed signaling sig1 +rotate entity camroom_hole by [0,90,0] at 155 speed signaling sig2 +wait for all clearing sig1,sig2 +use entity openin // should set this off because it had to be on already + +use entity camdoorkicker //spawns the guy who will actually kick the door in +use entity camdoorkicker // sends him to his point combat + +use entity camroom_guys // spawns the guys in +play sound "Speech/tsr1/skn/bt9-1.adp" for entity camdoorkicker at volume 0.9 + +// animate entity camdoorkicker performing action STD_R_N_PK_N by moving [0, 512, 0] // moves him towards the door 256 + diff --git a/Sample/ds/tsr1/gbnyc5b.ds b/Sample/ds/tsr1/gbnyc5b.ds new file mode 100644 index 0000000..910279b --- /dev/null +++ b/Sample/ds/tsr1/gbnyc5b.ds @@ -0,0 +1,45 @@ + + +#include "../common/header.ds" +output "p:/base/ds/tsr1" + +local entity camroom_door +local entity camroom_hole +local entity camdoorkicker // the guy who will actually kick the door open +local entity kickedopen // the func wall clip brush that is collision for when it is kicked open +local entity playerpush +local int sig1 + +camroom_door = find entity with targetname "camroom_door" +camroom_hole = find entity with targetname "camroom_hole" +camdoorkicker = find entity with targetname "camdoorkicker" +kickedopen = find entity with targetname "kickedopen" +playerpush = find entity with targetname "playerpush" + +camroom_hole.movetype = MOVETYPE_NOCLIP + + +if camdoorkicker.health <= 0 + exit + +endif + + + +use entity camroom_hole + +animate entity camdoorkicker performing action STD_XKICKDOOR_N_A_A // plays the actual kicking animation +animate entity camdoorkicker performing action SCRIPT_RELEASE // lets him go from the script +camroom_door.health = 0 + + +moverotate entity camroom_door from file "generic_door_cw.rof" signaling sig1 +play sound "impact/vending/kick.wav" for entity camroom_door at volume 0.9 +use entity playerpush +wait .5 seconds +use entity playerpush +use entity kickedopen // spawns the func wall in for clipping +wait for all clearing sig1 + + +// End \ No newline at end of file diff --git a/Sample/ds/tsr1/gbnyc6.ds b/Sample/ds/tsr1/gbnyc6.ds new file mode 100644 index 0000000..e82c15b --- /dev/null +++ b/Sample/ds/tsr1/gbnyc6.ds @@ -0,0 +1,100 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + +///////////////////////////////////////////////// +// Declare + +local entity stall1 +local entity stall2 +local entity new_kick_stall // the new stall kick that Brian wanted in +local entity new_kick_stall_push // push brush that will simulate force when the door is kicked open +local entity backbystairs // trigger that needs to be hit when leaving ladies room +local entity lstallguy1 // the first guy in the ladies room stall +local entity lstallguy2 // the sec guy in the ladies rooms stall +local entity lstallguy3 // the newest guy in the stall sequence +local entity setup // this sets up the ambush on the way out +local entity stallshooter // the guy who will shoot the stall on the way out +local entity originalwall // the func_wall clean version stall that needs to be taken out for the ambush +local entity raf_clipdoor // the func wall clip brush for the bathroom door +local entity new_clip_stall // the clip brush func wall that will provide collision for when the door is kicked open +local int sig1 +local int sig2 + +///////////////////////////////////////////////// +// Assign + +stall1 = find entity with targetname "stall1" +stall2 = find entity with targetname "stall2" +new_kick_stall = find entity with targetname "new_kick_stall" +new_kick_stall_push = find entity with targetname "new_kick_stall_push" +backbystairs = find entity with targetname "backbystairs" +lstallguy1 = find entity with targetname "lstallguy1" +lstallguy2 = find entity with targetname "lstallguy2" +lstallguy3 = find entity with targetname "lstallguy3" +stallshooter = find entity with targetname "stallshooter" +setup = find entity with targetname "setup" +originalwall = find entity with targetname "originalwall" +raf_clipdoor = find entity with targetname "raf_clipdoor" +new_clip_stall = find entity with targetname "new_clip_stall" + +///////////////////////////////////////////////// +// Action + +// THE FIRST STALL GUY +if lstallguy1.health > 0 + + animate entity lstallguy1 performing action STD_XKICKDOOR_N_A_A // signaling sig1 + wait .25 seconds // mmm the magic delay + moverotate entity stall1 from file "gbnyc_stall.rof"// signaling sig2 + play sound "impact/door/kickdoor.wav" for entity stall1 at volume 0.9 + // wait 0.5 seconds + //wait for all clearing sig1, sig2 + animate entity lstallguy1 performing action STD_R_N_MRS_2 by moving [-64, 0, 0] + animate entity lstallguy1 performing action SCRIPT_RELEASE + +endif + +// THE SECOND STALL GUY + +if lstallguy2.health > 0 + + animate entity lstallguy2 performing action STD_XKICKDOOR_N_A_A //signaling sig1 + wait .25 seconds + moverotate entity stall2 from file "generic_door_cw.rof" //signaling sig2 + play sound "impact/door/kickdoor.wav" for entity stall2 at volume 0.9 + use entity new_clip_stall // triggers the funcwall in for clipping + //wait for all clearing sig1, sig2 + animate entity lstallguy2 performing action STD_R_N_MRS_2 by moving [-64, 0, 0] + animate entity lstallguy2 performing action SCRIPT_RELEASE +// use entity backbystairs + +endif + +wait 1 seconds // stall for the last guy to kick the stall + +// THE THIRD STALL GUY + +if lstallguy3.health > 0 + + animate entity lstallguy3 performing action STD_XKICKDOOR_N_A_A //signaling sig1 + wait .25 seconds + use entity new_kick_stall_push // triggers the push brush + wait .2 seconds + use entity new_kick_stall_push // shuts the stall push brush off + moverotate entity new_kick_stall from file "generic_door_ccw.rof" //signaling sig2 + use entity raf_clipdoor // triggers the clip hull in + play sound "impact/door/kickdoor.wav" for entity stall2 at volume 0.9 + //wait for all clearing sig1, sig2 + animate entity lstallguy3 performing action STD_R_N_MRS_2 by moving [64, 0, 0] + animate entity lstallguy3 performing action SCRIPT_RELEASE + +endif + +use entity setup // activates the trigger for the stall shooting guy +use entity stallshooter // spawns the skinhead in behind the front partition +// use entity originalwall // this should remove the func_wall + +animate entity stallshooter performing action SCRIPT_RELEASE + + +// End \ No newline at end of file diff --git a/Sample/ds/tsr1/health.ds b/Sample/ds/tsr1/health.ds new file mode 100644 index 0000000..6f626bf --- /dev/null +++ b/Sample/ds/tsr1/health.ds @@ -0,0 +1,15 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + + +parameter entity health_door // the door that rotates up +parameter entity health_button // the button that needs to switch textures + + + + +use entity health_door // triggers this so it opens +\wait 1.5 seconds +use entity health_button // switches the button texture by using it \ No newline at end of file diff --git a/Sample/ds/tsr1/hostage.ds b/Sample/ds/tsr1/hostage.ds new file mode 100644 index 0000000..8663e39 --- /dev/null +++ b/Sample/ds/tsr1/hostage.ds @@ -0,0 +1,51 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" +#include "tsr1.ds" + + + + +local entity hostage1 // the hostage on the ground +local entity badguy1 // the guy kicking the hostage + +local entity host_count // the hostage counter for how many hostage events the player has seen + + +hostage1 = find entity with targetname "hostage1" +badguy1 = find entity with targetname "badguy1" + +host_count = find entity with targetname "host_count" + + + + + +on badguy1.health < 100 goto release_badguy1 + + + animate entity badguy1 performing action STD_MKICKLOW_N_A_A // the first kick to the hostage + play sound "speech/tsr1/npc/eb9-3.adp" for entity badguy1 at volume 0.9 + wait 1 seconds + +label release + + animate entity badguy1 performing action SCRIPT_RELEASE + + animate entity hostage1 performing action SCRIPT_RELEASE + host_count.health += 1 // sets the hostage counter up by 1 + exit + + + + +label release_badguy1 + + reset ai for entity badguy1 + +goto release + + + + + + diff --git a/Sample/ds/tsr1/intoken.ds b/Sample/ds/tsr1/intoken.ds new file mode 100644 index 0000000..cb723f1 --- /dev/null +++ b/Sample/ds/tsr1/intoken.ds @@ -0,0 +1,59 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + +// this is the script triggered when the player enters the token booth through the glass + + + +local entity tokentv // the tv thing in the token booth +local entity tvthing // the other tvthing in the token booth +local entity roundguy // the skinhead that will spawn round the corner shooting at the player entering +local entity tokvictim // the guy who will run past the token booth +local entity tokchaser // the guy following him +local entity tollguy // the guy by the token machines +local entity outtoken // the trigger for leaving the token booth +local entity host_count // the hostage counter for how many hostage events the player has seen +local int sig1 + + + +tokentv = find entity with targetname "tokentv" +tvthing = find entity with targetname "tvthing" +roundguy = find entity with targetname "roundguy" +tokvictim = find entity with targetname "tokvictim" +tokchaser = find entity with targetname "tokchaser" +tollguy = find entity with targetname "tollguy" +outtoken = find entity with targetname "outtoken" +host_count = find entity with targetname "host_count" + + +use entity roundguy // spawns the guy in +animate entity roundguy performing action SCRIPT_RELEASE + + + +use entity outtoken // sets this trigger active + + +use entity tokvictim // spawns the first running guy in + + + +host_count.health += 1 // sets the hostage counter up by 1 +use entity tokchaser // spawns the guy chasing him +animate entity tokchaser performing action STD_R_N_PK_N by moving [156, 0, 0] +animate entity tokchaser performing action STD_R_N_PK_N by moving [0, -64, 0] signaling sig1 +wait for all clearing sig1 +animate entity tokchaser performing action SCRIPT_RELEASE + +use entity tollguy // spawns the guy around the corner in +animate entity tollguy performing action SCRIPT_RELEASE + + + + + + + + +exit diff --git a/Sample/ds/tsr1/introdeath.ds b/Sample/ds/tsr1/introdeath.ds new file mode 100644 index 0000000..48d1acc --- /dev/null +++ b/Sample/ds/tsr1/introdeath.ds @@ -0,0 +1,15 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + +// This is a custom death script called for the hostage murdered in the cinematic + +local entity introhostage1 // the hostage who will be killed + +introhostage1 = find entity with targetname "introhostage1" + + +animate entity introhostage1 performing action CCH_SONKNEES_2FRNT_N_N // the hostage getting shot and slumping to the ground + + +// exit \ No newline at end of file diff --git a/Sample/ds/tsr1/introstairs.ds b/Sample/ds/tsr1/introstairs.ds new file mode 100644 index 0000000..e76d9bc --- /dev/null +++ b/Sample/ds/tsr1/introstairs.ds @@ -0,0 +1,20 @@ +// template file for newyork directory + +#include "../common/header.ds" + +output "p:/base/ds/tsr1" + + + +local entity istairsguy +local entity sneak + +istairsguy = find entity with targetname "istairsguy" +sneak = find entity player + +// use entity istairsguy // spawns the guy in at the bottom of the steps +// animate entity istairsguy performing action RUN by moving to [-488, 1576, -104] +// animate entity istairsguy performing action STD_FCORNERPEAK_RT_P_A by turning to [100, -500, 150] targeting entity sneak // this is him peeking around the corner firing + +animate entity istairsguy performing action STD_FCORNERPEAK_RT_P_A targeting entity sneak // this is him peeking around the corner firing +animate entity istairsguy performing action SCRIPT_RELEASE \ No newline at end of file diff --git a/Sample/ds/tsr1/lhostage.ds b/Sample/ds/tsr1/lhostage.ds new file mode 100644 index 0000000..6ead63e --- /dev/null +++ b/Sample/ds/tsr1/lhostage.ds @@ -0,0 +1,58 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + +// this script is the ladies room hostage scene + +local entity lbadguy1 // the guy hitting the hostage +local entity lhostage // the second script that will run if the guy gets hit +local entity host_count // the hostage counter for how many hostage events the player has seen + + +local int sig1 +local int sig2 + +lbadguy1 = find entity with targetname "lbadguy1" +lhostage = find entity with targetname "lhostage" +host_count = find entity with targetname "host_count" + + +host_count.health += 1 // sets the hostage counter up by 1 + +on lbadguy1.health < 100 goto wm_release + +animate entity lbadguy1 performing action STD_MPISTOLWHIP_N_P_N signaling sig1 + +if lbadguy1.health < 100 + + goto wm_release + + +endif + +play sound "speech/tsr1/skn/bt9-3.adp" for entity lbadguy1 at volume 0.9 +wait for all clearing sig1 +// use entity lhostageb // fires off the second script if he got this far + +if lhostage.health > 0 + +animate entity lhostage performing action CCH_XONKNEES_N_N_N +play sound "speech/tsr1/npc/eb9-6.adp" for entity lhostage at volume 0.9 +animate entity lhostage performing action CCH_SONKNEES_2FRNT_N_N + +endif + + + + + +label wm_release + +reset ai for entity lbadguy1 +animate entity lbadguy1 performing action SCRIPT_RELEASE + + + + + diff --git a/Sample/ds/tsr1/lhostageb.ds b/Sample/ds/tsr1/lhostageb.ds new file mode 100644 index 0000000..9a7655b --- /dev/null +++ b/Sample/ds/tsr1/lhostageb.ds @@ -0,0 +1,31 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + + + + +local entity lhostage // the guy who will get pistol whipped +local entity lbadguy1 // the guy who does the pistol whip +local int health + + +lhostage = find entity with targetname "lhostage" +lbadguy1 = find entity with targetname "lbadguy1" +health = lbadguy1.health + + + +if health > 0 + + + +animate entity lhostage performing action CCH_XONKNEES_N_N_N +play sound "speech/tsr1/npc/eb9-6.adp" for entity lhostage at volume 0.9 +animate entity lhostage performing action CCH_SONKNEES_2FRNT_N_N + +endif + +animate entity lhostage performing action SCRIPT_RELEASE + diff --git a/Sample/ds/tsr1/lowpunks.ds b/Sample/ds/tsr1/lowpunks.ds new file mode 100644 index 0000000..5df5dcb --- /dev/null +++ b/Sample/ds/tsr1/lowpunks.ds @@ -0,0 +1,28 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + + + +// this script makes punk guys on the lower level run around the corner and attack the player + + + + +local entity lower_punk1 +local entity lower_punk2 + + +lower_punk1 = find entity with targetname "lower_punk1" +lower_punk2 = find entity with targetname "lower_punk2" + + +use entity lower_punk1 // spawns this guy in +use entity lower_punk2 // spawns him in + +use entity lower_punk1 // sends this guy to his point combat +use entity lower_punk2 // sends this guy to his point combat + + +exit \ No newline at end of file diff --git a/Sample/ds/tsr1/mensroom.ds b/Sample/ds/tsr1/mensroom.ds new file mode 100644 index 0000000..911a933 --- /dev/null +++ b/Sample/ds/tsr1/mensroom.ds @@ -0,0 +1,43 @@ +// template file for newyork directory + +#include "../common/header.ds" + +output "p:/base/ds/tsr1" + + +local entity mstalldoor1 // the stall door that flys off +local entity stallguym // the guy in the far stall +local entity sinkguy // the guy standing by the sink who yells +local entity pissguy // the guy taking a leak +local int sig1 +local int sig2 + + +mstalldoor1 = find entity with targetname "mstalldoor1" +stallguym = find entity with targetname "stallguym" +sinkguy = find entity with targetname "sinkguy" +pissguy = find entity with targetname "pissguy" + +// mstalldoor1.movetype = MOVETYPE_NOCLIP + + +animate entity stallguym performing action STD_XKICKDOOR_N_A_A // signaling sig1 // the kicking door animation +play sound "speech/tsr1/skn/bt9-6.adp" for entity sinkguy at volume 0.9 + +wait .25 seconds +moverotate entity mstalldoor1 from file "stall_door_1.rof" // signaling sig2 // the door getting kicked +play sound "impact/door/kickdoor.wav" for entity mstalldoor1 at volume 0.9 +// wait for all clearing sig1, sig2 + +animate entity stallguym performing action RUN by moving [-64, 0, 0] +animate entity stallguym performing action RUN by moving [0, -64, 0] // moves him forwards to try and get him out of the way of the stall + +use entity pissguy // gets this guy moving + + +animate entity stallguym performing action SCRIPT_RELEASE +animate entity sinkguy performing action SCRIPT_RELEASE +animate entity pissguy performing action SCRIPT_RELEASE + + +exit diff --git a/Sample/ds/tsr1/npc1.ds b/Sample/ds/tsr1/npc1.ds new file mode 100644 index 0000000..ee1ea74 --- /dev/null +++ b/Sample/ds/tsr1/npc1.ds @@ -0,0 +1,37 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + +// the script is the first npc getting murdered + + +local entity victim1 // the person who dodges from the alcove +local entity chaser1 // the guy who will wind up chasing him +local entity host_count // +local int chaser_health // the health of the chaser guy + +local int sig1 +local int sig2 + +victim1 = find entity with targetname "victim1" +chaser1 = find entity with targetname "chaser1" +host_count = find entity with targetname "host_count" + +on chaser1.health < 100 goto chaserhit + +animate entity chaser1 performing action STD_XYELLATYOU_N_A_A // chaser guys yelling at the hostage +play sound "Speech/TSR1/SKN/BT9-3.adp" for entity chaser1 on channel CHAN_VOICE at volume 0.9 +animate entity chaser1 performing action STD_F_FWD_P_2 targeting entity victim1 +animate entity chaser1 performing action SCRIPT_RELEASE +play sound "speech/tsr1/npc/eb9-2.adp" for entity victim1 at volume 0.9 + +suspend + + +label chaserhit + animate entity chaser1 performing action SCRIPT_RELEASE + animate entity victim1 performing action SCRIPT_RELEASE + reset ai for entity chaser1 // fancy new command +exit + diff --git a/Sample/ds/tsr1/npc1set.ds b/Sample/ds/tsr1/npc1set.ds new file mode 100644 index 0000000..a15465d --- /dev/null +++ b/Sample/ds/tsr1/npc1set.ds @@ -0,0 +1,18 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + + +local entity victim1 // the person who dodges from the alcove +local entity chaser1 // the guy who will wind up chasing him + + + +victim1 = find entity with targetname "victim1" +chaser1 = find entity with targetname "chaser1" + + + +use entity victim1 // spawns these guys in out of view +use entity chaser1 \ No newline at end of file diff --git a/Sample/ds/tsr1/nycintro.ds b/Sample/ds/tsr1/nycintro.ds new file mode 100644 index 0000000..3af558e --- /dev/null +++ b/Sample/ds/tsr1/nycintro.ds @@ -0,0 +1,807 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" +#include "tsr1.ds" + + +// redo of the nyc intro script, this is the first crane camera shot + +// first shot entities + +local entity introcam1 // the first camera looking down on the street +local entity introcam1n // the first cameras null +local entity walkingswatguy // the guy who will walk in the first shot +local entity intro4 // the second script runner that will trigger shot2 of the intro +local entity introhawk // the merc character in this shot +local entity introhawkb // the merc character in this shot +local entity introjohn // the merc character in this shot +local entity introjohnb // the merc character in this shot +local entity introswat3 // the guy back under the train bridge +local entity copcar1 // the slanted copcar in the middle of the street +local entity newcam1 // the new close up cam of john for the last couple of shots +local entity newcam2 // the cam for hawk close up +local entity newcam1n +local entity newcam2n +local entity t121 // the sound trigger for the first ambient set + +// stuff for second shot + +local entity introdeadswat // the swat guy who will get murdered +local entity introswatkiller // the guy who will kill him +local entity introswatcam // the camera showing the swat guy murdered +local entity introswatcamn // the cameras null +local entity intro3 // the cut to the shot back on the street + +local entity introcam6 // other cut around the conversation +local entity introcam6n // the cams null +local entity swatleader // the swat guy leader +local entity introltrain // the l train that will fly by + +// stuff for third shot + +local entity introcam4 // the camera +local entity introcam4n // the third cameras null + +// stuff for 4th shot + +local entity sabre1 // skinhead boss who will shoot the hostages +local entity walkinguy // skinhead who will walk in the shot +local entity introcam2 // the camera which will shoot this shot +local entity introcam2n // the cameras null in case we want to move it +local entity introhostage1 // the hostage to the left of sabre in the intro +local entity introhostage2 // the second hostage +local entity introcam3 // the close up camera shot of Sabre +local entity introcam3n // the close up cameras null +local entity introcam7 // the other new shot of the hostage murder +local entity introcam7a // the other new shot of the hostage murder SM +local entity introcam7n // the above cameras null +local entity lastcam1 // the last close up shot of them in this cinematic +local entity lastcam1n // the last cameras null +local entity lastcam2 // the camera at the bottom of the stairs +local entity lastcam2n // the stair cams null +local entity lastjohn // the john by the stairs +local entity lasthawk // the hawk at the top of the stairs +local entity lastswatleader // the last swatleader that appears in the shot with hawk +local entity runguy // the script runner that starts the ecto running at the bottom of the stairs +local entity show_objectives // the objective thing that needs to be turned on after the intro runs + +//sm addition + +local entity finaltrain //train in final camera +local entity gunshots //gunshots the swat members hear + +local entity tsr1fadeout // the fade out for the cinematic transition MADE BY JERSEY +local entity tsr1fadein // the fade in when the player starts in 1st person MADE BY JERSEY + +local int sig1 +local int sig2 + +// cache stuff + +cache roff "tsr1_introcam1_ren.rof" // changes made by jersey +cache roff "tsr1_introcam1t_ren.rof" + +/* +cache sound "cin/tsr1/c3d1.adp" +cache sound "cin/tsr1/c3d2.adp" +cache sound "cin/tsr1/c4d1.adp" +cache sound "cin/tsr1/c5d1.adp" +cache sound "cin/tsr1/c5d2.adp" +cache sound "cin/tsr1/c6d1.adp" +cache sound "cin/tsr1/c6d2.adp" +cache sound "cin/tsr1/c6d3.adp" +cache sound "cin/tsr1/c6d4.adp" +*/ + +introcam1 = find entity with targetname "introcam1" + +//turns on 1st camera +enable cinematics +use entity introcam1// turns on the camera + + +introcam1n = find entity with targetname "introcam1n" +walkingswatguy = find entity with targetname "walkingswatguy" +intro4 = find entity with targetname "intro4" +introhawk = find entity with targetname "introhawk" +introhawkb = find entity with targetname "introhawkb" +introjohn = find entity with targetname "introjohn" +introjohnb = find entity with targetname "introjohnb" +introltrain = find entity with targetname "introltrain" +copcar1 = find entity with targetname "copcar1" +newcam1 = find entity with targetname "newcam1" +newcam1n = find entity with targetname "newcam1n" +newcam2 = find entity with targetname "newcam2" +newcam2n = find entity with targetname "newcam2n" +introswat3 = find entity with targetname "introswat3" + +introdeadswat = find entity with targetname "introdeadswat" +introswatkiller = find entity with targetname "introswatkiller" +introswatcam = find entity with targetname "introswatcam" +introswatcamn = find entity with targetname "introswatcamn" +intro3 = find entity with targetname "intro3" + +introcam6 = find entity with targetname "introcam6" +introcam6n = find entity with targetname "introcam6n" +swatleader = find entity with targetname "swatleader" + +introcam4 = find entity with targetname "introcam4" +introcam4n = find entity with targetname "introcam4n" + +sabre1 = find entity with targetname "sabre1" +walkinguy = find entity with targetname "walkinguy" +introcam2 = find entity with targetname "introcam2" +introcam2n = find entity with targetname "introcam2n" +introcam3 = find entity with targetname "introcam3" +introcam3n = find entity with targetname "introcam3n" + +introhostage1 = find entity with targetname "introhostage1" +introhostage2 = find entity with targetname "introhostage2" + +introcam7 = find entity with targetname "introcam7" +introcam7a = find entity with targetname "introcam7a" +introcam7n = find entity with targetname "introcam7n" + +lastcam1 = find entity with targetname "lastcam1" +lastcam1n = find entity with targetname "lastcam1n" +lastcam2 = find entity with targetname "lastcam2" +lastcam2n = find entity with targetname "lastcam2n" +lastjohn = find entity with targetname "lastjohn" +lasthawk = find entity with targetname "lasthawk" +lastswatleader = find entity with targetname "lastswatleader" +runguy = find entity with targetname "runguy" + +tsr1fadeout = find entity with targetname "tsr1fadeout" // MADE BY JERSEY +tsr1fadein = find entity with targetname "tsr1fadein"// MADE BY JERSEY + +//sm addition +finaltrain = find entity with targetname "finaltrain" //train +gunshots = find entity with targetname "gunshots" //gunshots the swat members hear +show_objectives = find entity with targetname "show_objectives" + + +t121 = find entity with targetname "t121" + +//introcam1.movetype = MOVETYPE_NOCLIP +//introcam1n.movetype = MOVETYPE_NOCLIP +introswatcam.movetype = MOVETYPE_NOCLIP +introswatcamn.movetype = MOVETYPE_NOCLIP +introcam4.movetype = MOVETYPE_NOCLIP +introcam4n.movetype = MOVETYPE_NOCLIP +introcam2.movetype = MOVETYPE_NOCLIP +introcam2n.movetype = MOVETYPE_NOCLIP +introcam3.movetype = MOVETYPE_NOCLIP +introcam3n.movetype = MOVETYPE_NOCLIP +introcam7.movetype = MOVETYPE_NOCLIP +introcam7n.movetype = MOVETYPE_NOCLIP +lastcam1.movetype = MOVETYPE_NOCLIP +lastcam1n.movetype = MOVETYPE_NOCLIP +lastcam2.movetype = MOVETYPE_NOCLIP +lastcam2n.movetype = MOVETYPE_NOCLIP +newcam1.movetype = MOVETYPE_NOCLIP +newcam1n.movetype = MOVETYPE_NOCLIP +newcam2.movetype = MOVETYPE_NOCLIP +newcam2n.movetype = MOVETYPE_NOCLIP + +// +// FIRST SWEEPING SHOT OUTSIDE LEADS TO FIRST CONVERSATION +// + + +//TSR1_ACTIVISION +//TSR1_RAVEN +//TSR1_SOF + + + + +// Use the first camera- this will be the fly-by and the intro credits. + +//use entity introcam1// turns on the camera +playsong 1 +// use entity t121 // should start the intro sound set +print TSR1_INTRO // added by jersey +moverotate entity introcam1 from file "tsr1_introcam1_ren.rof" // starts the fly-by for the camera // CHANGES MADE BY JERSEY :) +moverotate entity introcam1n from file "tsr1_introcam1t_ren.rof" // starts the fly-by for the target + +wait 2 seconds + + + +//print ACTIVISION for 1st camera +print TSR1_ACTIVISION + +wait 1 seconds + +animate entity walkingswatguy performing action STD_WNORMAL_N_PK_A by moving [0, -148, 0] // Starts the moving SWAT guy walking forward + +wait 1.25 seconds + +use entity introltrain // makes the train run across the bridge +wait 2 seconds + +//eric biessman is a god + +// +// This is the faked conversation at the beginning of the intro +// +animate entity swatleader performing action STD_IETALKPOSE_N_A_N holding for 2.2 // wait while the walking SWAT guy talks + +animate entity walkingswatguy performing action STD_ETALKBOTH_N_A_N // talks for 1.5 seconds +animate entity walkingswatguy performing action STD_ETALKLEFT_N_A_N +animate entity walkingswatguy performing action STD_ETALKBOTH_N_A_N + +animate entity walkingswatguy performing action STD_IETALKPOSE_N_A_N holding for 3.1 // wait while the SWAT Leader talks + +animate entity swatleader performing action STD_ETALKLEFT_N_A_N // talks for 3.1 seconds +animate entity swatleader performing action STD_ETALKLEFT_N_A_N +animate entity swatleader performing action STD_ETALKBOTH_N_A_N +animate entity swatleader performing action STD_ETALKLEFT_N_A_N + +animate entity swatleader performing action STD_IETALKPOSE_N_A_N holding for 4.1 // wait while the walking SWAT guy talks + +animate entity walkingswatguy performing action STD_ETALKBOTH_N_A_N // talks for 4.1 seconds +animate entity walkingswatguy performing action STD_ETALK_N_A_N +animate entity walkingswatguy performing action STD_ETALKLEFT_N_A_N + +animate entity walkingswatguy performing action STD_IETALKPOSE_N_A_N holding for 4.8 // wait while the SWAT Leader talks + + +animate entity swatleader performing action STD_ETALKBOTH_N_A_N // talks for 4.8 seconds +animate entity swatleader performing action STD_ETALKLEFT_N_A_N +animate entity swatleader performing action STD_ETALK_N_A_N +animate entity swatleader performing action STD_ETALKBOTH_N_A_N + +//wait 1 seconds //was 5 before I added text + +//print RAVEN SOFTWARE for 1st camera +print TSR1_RAVEN + +wait 3 seconds + +//print SOLDIER OF FORTUNE for 1st camera +print TSR1_SOF + +wait 3 seconds + +//print +print TSR1_ONE + +//wait 10.8 seconds + +wait 3 seconds + +print TSR1_TWO + +wait 3 seconds + +print TSR1_THREE + +wait 3 seconds + +print TSR1_FOUR + +wait 3 seconds + + + + +// +// The conversation ends +// +animate entity walkingswatguy performing action STD_WNORMAL_N_PK_A by moving [0, 212, 0] // Move the first walking SWAT guy away + +wait .45 seconds + +remove entity introltrain // once the train is out of the camera's view, it is removed + +animate entity introjohn performing action STD_IETALKPOSE_N_A_N holding for 3.4 // 5.9standard talking pose, needs to hold it until he speaks +animate entity introhawk performing action STD_IETALKPOSE_N_A_N holding for 3.4 // standard talking pose, never needs to come out of it + +animate entity walkingswatguy performing action STD_WNORMAL_N_PK_A by moving [-20, 24, 0] // Move the first walking SWAT guy away + +animate entity swatleader performing action STD_WNORMAL_N_PK_A by moving [-88, 0, 0] signaling sig1// SWAT Leader walks into view (was -96) +wait for all clearing sig1 + +swatleader.angles = [0, 200, 0] + + +////////////////////////////////////////////////////////// +// SECOND CAMERA SHOT: TRANSITION BEHIND SWAT LEADER +////////////////////////////////////////////////////////// + +//SM ADDITION +use entity introcam1 // turns the first camera off to switch to the second camera +use entity introcam6 // turns the camera on +// + + + +animate entity swatleader showing emotion EMOTION_TALK holding for 3.4 // start the SWAT leader's face animating +animate entity swatleader performing action STD_ETALK_N_A_N holding for 3.0 // Does the normal talk anim for the first three seconds of the speech +animate entity swatleader performing action STD_ETALKLEFT_N_A_N holding for .4 // finishes with a different animation + +wait .1 seconds + + // + // SWAT talks to John and Hawk: 3.4 seconds long. Start the sound here and print the subtitle + // + play sound "cin/tsr1/c3d1.adp" for entity swatleader at volume 0.9 on channel CHAN_AUTO + print TSR1_C3D1 // "SWAT: This isn't a military operation, I can't let you boys go down there." + +wait 3.3 seconds // holds the script while the SWAT leader talks + +//gunshots go off +play sound "weapons/dpistol/fire.wav" for entity gunshots at volume 0.9 on channel CHAN_NO_PHS_ADD +wait .4 seconds + +//reaction to the gunshots heard +animate entity introjohn performing action STD_XSTARTLED_N_A_A +wait .1 seconds +animate entity swatleader performing action STD_IALERTTRN_LT_P_N +wait .2 seconds +animate entity introhawk performing action STD_XSTARTLED_N_A_A + +////////////////////// +//stuff for next shot +////////////////////// + + +//more gunshots go off +play sound "weapons/dpistol/fire.wav" for entity gunshots at volume 0.9 on channel CHAN_NO_PHS_ADD +wait .4 seconds +play sound "weapons/dpistol/fire.wav" for entity gunshots at volume 0.9 on channel CHAN_NO_PHS_ADD +wait .3 seconds + + + +remove entity walkingswatguy // removes the walking SWAT guy when he is out of frame +remove entity introswat3 // removes the standing SWAT guy when he is out of frame + + +//spawns baddie that guns down swat member in next sequence +use entity introswatkiller + + +/////////////////// +//turns off camera +/////////////////// +use entity introcam6 + + + +//////////////////////////////////////////////////////////////// +// THIRD CAMERA SHOT: Hate gang member guns down the SWAT guy +//////////////////////////////////////////////////////////////// + + +//turns on camera +use entity introswatcam // turn the correct camera on +move entity introswatcam by [-55, 20, 0] at 12 speed // Dollies the camera to the left, revealing the gang member running in + +//baddie runs around corner +animate entity introswatkiller performing action STD_R_N_PK_N by moving to [260,1432,-152] // the hate gang member runs around the corner[240,1432,-152] +animate entity introswatkiller performing action STD_R_N_PK_N by moving to [284,1376,-152] // Continues to run up to the SWAT guy[264,1376,-152] + + +//baddie runs up behind swat member +animate entity introswatkiller performing action STD_R_N_PK_N by moving [0,-205,0] // Runs behind the SWAT guy (was 174) + +//swat member walks forward towards camera +animate entity introdeadswat performing action STD_WAIM_FWD_P_2 by moving [0,-152,0] +animate entity introdeadswat performing action STD_XSTARTLED_N_A_A + +//swat member gets shot in the head +animate entity introswatkiller performing action STD_FATTITUDE_N_P_A targeting entity introdeadswat kill nulltarget HEAD // Shoots the SWAT guy + +wait .7 seconds + +print TSR1_FIVE + +wait 1.3 seconds + +//baddie walks over and fires more shots in dead swat member +animate entity introswatkiller performing action STD_WATTITUDE_N_PK_A by moving [8,-64,0] signaling sig1 // Moves up to the body was 20,-48,0 +wait for all clearing sig1 +animate entity introswatkiller performing action STD_FVIOLENT_DWN_P_N targeting entity introdeadswat kill nulltarget HEAD holding for 6.0// fires a couple of extra rounds for good measure + +wait 1.0 seconds + +print TSR1_SIX + +wait 3 seconds + +//turns off camera +use entity introswatcam // shuts this scene's camera off + +//clean up +remove entity introdeadswat // removes the body when it is out of camera shot +remove entity introswatkiller // removes the gang member when it is out of camera shot + + + + +////////////////////////////////////////////////////////////////////////// +//CAMERA SHOT: JOHN YELLS Doesn't sound like you have a choice, Captain +////////////////////////////////////////////////////////////////////////// +/////////////////// +//turns on camera +/////////////////// +use entity introcam6 + +////////////// +// +////////////// + +wait .1 seconds // waits for the SWAT leader to finish talking + +animate entity swatleader performing action STD_IETALKPOSE_N_A_N //holding for 4.0 // Put the swatleader into a talk stance + + +animate entity introjohn showing emotion EMOTION_TALK holding for 1.8 // begin to make John's face animate + + + +animate entity introjohn performing action STD_ETALKLEFT_N_A_N holding for .8 // run the animation for the talking +animate entity introjohn performing action STD_ETALK_N_A_N holding for 1.0 // add some spice to the animation +wait .5 seconds // Match the voice with the talking (was .25) + +use entity introdeadswat // spawns this enemy for the next shot +use entity introswatkiller // spawns this SWAT guy for the next shot + +//animate entity introswatkiller performing action STD_R_N_PK_N by moving to [240, 1432, -152] // the hate gang member runs around the corner +//animate entity introswatkiller performing action STD_R_N_PK_N by moving to [264, 1376, -152] // Continues to run up to the SWAT guy // + + // + // John talks to the SWAT leader: 1.8 seconds long. + // + play sound "cin/tsr1/c3d2.adp" for entity introjohn at volume 0.9 on channel CHAN_AUTO + print TSR1_C3D2 // "JOHN: Doesn't sound like you have a choice, Captain." + +animate entity introjohn performing action STD_IETALKPOSE_N_A_N holding for 5.0// goes back to his ready-to-talk pose + + +//swat leader talks +//animate entity swatleader showing emotion EMOTION_TALK //holding for 7.1 + + + +wait 2.0 seconds // cuts to next camera before John finishes talking 2.0 + + + +//set up stuff for the next shot +use entity introjohnb // Spawns the john model for the next camera shot +use entity introhawkb // Spawns the hawk model for the next camera shot + + +// + +introjohnb.movetype = MOVETYPE_NOCLIP + +animate entity introjohnb performing action STD_IETALKPOSE_RT_A_N holding for 6.0 // Sets the John model into his talk stance +animate entity introhawkb performing action STD_IETALKPOSE_N_A_N holding for 6.0 // Sets the Hawk model into his talk stance + + + + + + + + +///////////////////////////////////////////////////////////////////////////////////////////////// +// FOURTH CAMERA SHOT: Back to the outside where the SWAT leader tells John and Hawk to go on in +///////////////////////////////////////////////////////////////////////////////////////////////// + +wait .1 seconds + +/////////////////// +//turns off camera +/////////////////// +use entity introcam6 // turns the outside camera off + +remove entity introjohn // removes this John model from the game when it is out of camera shot +remove entity introhawk // removes this Hawk model from the game when it is out of camera shot + +//swat leader talks +animate entity swatleader showing emotion EMOTION_TALK + +use entity introcam4 // turns on the camera + + + +wait .1 seconds //wait (so sound will work) + +//animate entity swatleader showing emotion EMOTION_TALK + + // + // SWAT talks to John and tells him that he knows the leader's name: 5 seconds long + // + play sound "cin/tsr1/c4d1.adp" for entity swatleader at volume 0.9 on channel CHAN_AUTO + print TSR1_C4D1 // "SWAT: All right, you win. We know the leader's name." + +animate entity swatleader performing action STD_EHEADSHAKE_N_A_N holding for 2.0 +animate entity swatleader performing action STD_ETALK_N_A_N holding for 2.6 +animate entity swatleader performing action STD_ETALKLEFT_N_A_N holding for .4 +animate entity swatleader performing action STD_IETALKPOSE_N_A_N holding for 1.0 + +wait 0.9 seconds // Weird delay for no reason + +use entity sabre1 // Spawn the enemy for the next camera shot +use entity introhostage1 // Spawn the hostage for the next camera shot +use entity introhostage2 // Spawn the hostage for the next camera shot +use entity walkinguy // Spawn the enemy for the next camera shot + + +wait 3.8 seconds + + + + +//////////////////////////////////////////////////////////////////////////// +// FIFTH CAMERA SHOT: Sabre and gang member are angry and kill a hostage +//////////////////////////////////////////////////////////////////////////// + +animate entity walkinguy performing action STD_IETALKPOSE_N_A_N holding for 0.1 // get the scared gang member in his talk pose + +animate entity sabre1 performing action STD_IETALKPOSE_N_A_N holding for 3.1 // Make Sabre look menacing + +wait .1 seconds + +use entity introcam4 // turns off the previous camera +remove entity swatleader // Removes the SWAT leader from the game +remove entity introjohnb // Removes the John model from the shot +remove entity introhawkb // Removes the Hawk model from the shot +remove entity copcar1 // removes this out of the way so another hawk model doesnt get caught on it + +use entity introcam7 // turns on the camera + +wait .1 seconds //wait (so sound will work) + +//print TSR1_SEVEN + + +animate entity walkinguy performing action STD_EHEADSHAKE_N_A_N repeating for 2 times // Skinhead talking to Sabre +animate entity walkinguy performing action STD_ETALKBOTH_N_A_N repeating for 1 times +animate entity walkinguy performing action STD_ETALK_N_A_N holding for 1.0 + + // + // The Gang Member yells at Sabre: 2.7 seconds long + // + play sound "cin/tsr1/c5d1.adp" for entity walkinguy at volume 0.9 on channel CHAN_AUTO // the skinhead guy panics + print TSR1_C5D1 // "GANG MEMBER: Sabre! We gotta,,," +wait .3 seconds +print TSR1_SEVEN +//wait 1.6 seconds +wait 1.3 seconds + +animate entity walkinguy performing action STD_IETALKPOSE_N_A_N holding for 2.0 + +animate entity sabre1 showing emotion EMOTION_TALKANGRY holding for 3.2 //3.5 + + +wait .7 seconds // The delay for angry Sabre's face to start animating with the speaking + + + +animate entity sabre1 performing action STD_ETALK_N_A_N holding for 3.5 // Sabre talking, angry + +use entity introcam7 // turns off the camera + + +//////////////////////////////////////////////// +// SIXTH CAMERA SHOT: Sabre shown in close up +//////////////////////////////////////////////// + +use entity introcam3 // turns on the close-up shot of sabre + +//move entity introcam3 by [16, 0, 0] at 1 speed // pan across Sabre's face + +wait .1 seconds + + // + // Sabre says to grab hostages and detonate the bombs: 3.5 seconds long + // + play sound "cin/tsr1/c5d2.adp" for entity sabre1 at volume 0.9 on channel CHAN_AUTO // Sabre starts to talk + print TSR1_C5D2 // "SABRE: Take hostages, I want those bombs detonated!" + +wait .5 seconds +print TSR1_EIGHT +//wait 3.5 seconds // The time for the speech delay +wait 3.0 seconds + +use entity introcam3 // turns off the close-up + +///////////////////////////////////////////////////////// +//SEVENTH CAMERA SHOT: Sabre shoots the hostage in rage +///////////////////////////////////////////////////////// + +//turns on camera +use entity introcam7a + +animate entity sabre1 showing emotion EMOTION_ANGRY holding for 4.0 //STD_ERAGESHOOT_N_P_N +animate entity sabre1 performing action STD_ERAGESHOOT_N_P_N targeting entity introhostage1 kill nulltarget HEAD //signaling sig1 +//wait for all clearing sig1 + +wait .5 seconds +print TSR1_NINE +//wait 2.4 seconds //time STD_ERAGESHOOT_N_P_N takes +wait 1.9 seconds + + + +animate entity sabre1 performing action STD_IETALKPOSE_N_A_N holding for 10.0 // Sabre looks pissed off +wait .2 seconds +animate entity walkinguy performing action STD_R_N_PK_N by moving [0, -200, 0] + +use entity lastjohn // Spawns in the last John model- Thank God! +use entity lasthawk // Spawns in the last Hawk model +use entity lastswatleader // Spawns in the last SWAT leader + +//for next shot +animate entity lastswatleader showing emotion EMOTION_TALK holding for 2.0 + +wait .1 seconds // time to show the hostage killed + +//turns off camera +use entity introcam7a + +remove entity sabre1 // Removes Sabre from the shot +remove entity walkinguy // Removes the hate gang member from the shot +remove entity introhostage1 // Removes the dead hostage from the shot +remove entity introhostage2 // Removes the other hostage from the shot + +animate entity lastswatleader performing action STD_IETALKPOSE_N_A_N holding for 1.0 // set the SWAT Leader to speak + + +///////////////////////////////////////////////////////////////////////////////////////// +// EIGHTH CAMERA SHOT: John, Hawk, and the SWAT leader say one last round of conversation +///////////////////////////////////////////////////////////////////////////////////////// + +use entity lastcam1 // turns on the last camera, finally! + +move entity lastcam1 by [0, 0, 16] at 2 speed // pan up on the SWAT leader + +wait .1 seconds + +animate entity lasthawk performing action STD_IETALKPOSE_N_A_N holding for 2.6 // sets hawk standing there with a good transition animation +animate entity lastjohn performing action STD_IETALKPOSE_N_A_N holding for 2.0 // sets john up the same + + +//swat leader talks +//animate entity lastswatleader showing emotion EMOTION_TALK holding for 1.9 +animate entity lastswatleader performing action STD_ETALK_N_A_N holding for 2.0 + + // + // SWAT Leader says to take down Sabre to take down the game: 1.9 seconds long + // + play sound "cin/tsr1/c6d1.adp" for entity lastswatleader at volume 0.9 on channel CHAN_AUTO // swat leader saying the leader line + print TSR1_C6D1 // "SWAT LEADER: Kill Sabre, you've killed the gang." + +wait .1 seconds +print TSR1_TEN +//wait 2 seconds +wait 2.1 seconds + +animate entity lastswatleader performing action STD_IETALKPOSE_N_A_N holding for 10.0 // set the SWAT Leader to never speak again + +//off and on for last cam +use entity lastcam1 // turns off that bastard lastcam! +use entity newcam1 // close-up on John + +wait .1 seconds + +animate entity lastjohn showing emotion EMOTION_TALK holding for 0.7 +animate entity lastjohn performing action STD_EHEADNOD_N_A_N holding for 1.0 + + // + // John answers the SWAT Leader: .7 seconds long + // + play sound "cin/tsr1/c6d2.adp" for entity lastjohn at volume 0.9 on channel CHAN_AUTO // johns response of understood + print TSR1_C6D2 // Understood. .7 seconds + wait 1 second + + +//turns off camera +use entity newcam1 + +///////////////////////////////////////////////////////////// +//Cuts to a view from down the stairs point up at the actors +///////////////////////////////////////////////////////////// + +//turns on camera +use entity newcam2 // Cuts to a view from down the stairs point up at the actors + +//moves train +use entity finaltrain + +wait .1 seconds + +animate entity lasthawk showing emotion EMOTION_TALK holding for 3.3 // Set Hawk's face to animate +animate entity lasthawk performing action STD_ETALK_N_A_N holding for 2.6 // Set Hawk's body to animate +animate entity lasthawk performing action STD_ETALKBOTH_N_A_N holding for .7 // Continues to speak +animate entity lasthawk performing action STD_ETALK_N_A_N holding for 1.2 // Finishes up his speech + + // + // Hawk talks to John: 3.3 seconds + // + play sound "cin/tsr1/c6d3.adp" for entity lasthawk at volume 0.9 on channel CHAN_AUTO + print TSR1_C6D3 // "HAWK: John, take this entrance. I'll meet you at 6C." +wait .2 seconds +print TSR1_THIRTEEN +//wait 3.5 seconds +wait 3.3 seconds + + + + +animate entity lasthawk performing action STD_IETALKPOSE_N_A_N holding for 1.0 + +use entity newcam2 // turns off the Hawk Close-up + +// +// NINTH AND FINAL CAMERA SHOT: John runs down the stairs +// + +use entity lastcam2 // turns the lower camera on + +move entity lastcam2 by [64, 0 ,0] at 8 speed // pans to the right as John runs down the steps +wait .1 seconds + +animate entity lastjohn performing action STD_R_N_PK_N by moving [0, -336, 0] // john running down the stairs into the camera + + // + // John yells to Hawk: .8 seconds + // + play sound "cin/tsr1/c6d4.adp" for entity lastjohn at volume 0.9 on channel CHAN_AUTO + print TSR1_C6D4 // "JOHN:Good luck, Hawk." + +animate entity lasthawk performing action STD_R_N_PK_N by moving [96, 0, 0] // hawk running bacwards avoiding the copcar + +animate entity lasthawk performing action STD_R_N_PK_N by moving [152, 0, 0] //signaling sig1 // hawk running behind the cop car +//wait for all clearing sig1 + +wait .2 seconds +print TSR1_FOURTEEN //TSR1_FOURTEEN +//wait 1.4 seconds + +wait 2.1 seconds + + +use entity tsr1fadeout // starts the fade out // MADE BY JERSEY +wait 1 second +use entity lastcam2 // Finally ends the cinematic... there is a God +disable cinematics + +remove entity lastjohn // Remove the fake John model from the world +remove entity lasthawk // Remove the fake Hawk model from the world +remove entity lastswatleader // Removes the SWAT Leader from the world + +use entity runguy // starts the script runner of the guy running past +use entity show_objectives // triggers this + +////////////// +// Clean Up +////////////// + +//removes train +remove entity finaltrain + + + + +use entity tsr1fadein // fades in to players view // MADE BY JERSEY +playsong -1 + + +unload roff "trs1_introcam1_ren.rof" +unload roff "trs1_introcam1t_ren.rof" + +unload sound "cin/tsr1/c3d1.adp" +unload sound "cin/tsr1/c3d2.adp" +unload sound "cin/tsr1/c4d1.adp" +unload sound "cin/tsr1/c5d1.adp" +unload sound "cin/tsr1/c5d2.adp" +unload sound "cin/tsr1/c6d1.adp" +unload sound "cin/tsr1/c6d2.adp" +unload sound "cin/tsr1/c6d3.adp" +unload sound "cin/tsr1/c6d4.adp" diff --git a/Sample/ds/tsr1/pisscop.ds b/Sample/ds/tsr1/pisscop.ds new file mode 100644 index 0000000..8606066 --- /dev/null +++ b/Sample/ds/tsr1/pisscop.ds @@ -0,0 +1,31 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" +#include "tsr1.ds" + + + + +local entity pissguy1 +local entity pissguy2 + + + +pissguy1 = find entity with targetname "pissguy1" +pissguy2 = find entity with targetname "pissguy2" + + + + +play sound "Cin/TSR1/Script/Piss.wav" for entity pissguy2 on channel CHAN_VOICE at volume 0.9 +play sound "Speech/TSR1/SKN/BT9-2.adp" for entity pissguy1 on channel CHAN_VOICE at volume 0.9 + + +animate entity pissguy2 performing action SCRIPT_RELEASE // releases the second guy +wait 1.5 seconds +animate entity pissguy1 performing action SCRIPT_RELEASE // releases the other guy a little bit later + + + + + + diff --git a/Sample/ds/tsr1/r_murderguys.ds b/Sample/ds/tsr1/r_murderguys.ds new file mode 100644 index 0000000..9beef26 --- /dev/null +++ b/Sample/ds/tsr1/r_murderguys.ds @@ -0,0 +1,25 @@ +// template file for newyork directory + +#include "../common/header.ds" + +output "p:/base/ds/tsr1" + + + + + +local entity npc_murder // the npc who will be shot +local entity npc_killer // the guy who will kill the hostage +local entity npc_watcher // guy watching the murder + +npc_murder = find entity with targetname "npc_murder" +npc_killer = find entity with targetname "npc_killer" +npc_watcher = find entity with targetname "npc_watcher" + +// THIS GETS RID OF ALL THESE GUYS IF THEY WERENT USED IN THE CAMERA SCRIPT IN THE TOKEN BOOTH + +remove entity npc_murder +remove entity npc_killer +remove entity npc_watcher + + diff --git a/Sample/ds/tsr1/rafguy.ds b/Sample/ds/tsr1/rafguy.ds new file mode 100644 index 0000000..c1517a3 --- /dev/null +++ b/Sample/ds/tsr1/rafguy.ds @@ -0,0 +1,20 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + +// THIS SCRIPT RELEASES THE GUY WHO RUNS OUT THE BACK DOOR OF THE TOKEN BOOTH + + + + + +local entity tokenguy1 // the guy who is running out of the room + + + +tokenguy1 = find entity with targetname "tokenguy1" + + + +animate entity tokenguy1 performing action SCRIPT_RELEASE // script releases the guy once he gets by the door \ No newline at end of file diff --git a/Sample/ds/tsr1/raid.ds b/Sample/ds/tsr1/raid.ds new file mode 100644 index 0000000..98ae0ef --- /dev/null +++ b/Sample/ds/tsr1/raid.ds @@ -0,0 +1,82 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" +#include "tsr1.ds" + +// this script controls the end raid right before the player jumps on the train + +local entity rswat1 // the first swat guy +local entity rswat2 // the second swatguy +local entity rhawk // the hawk model used here +local entity rbadguy1 // first bad skinhead +local entity rbadguy2 // the second bad skinhead +local entity leader // the skinhead leader who will take off on the train +local entity rcam1 // the camera for the one cinematic shot +local entity rcam1n // the cameras null +local entity leadertrain // the train that leader takes off on +local entity sabrefade1 // the first fade +local entity sabrefade2 // the second fadeback +local entity traintriggerb // the trigger on top of the train that needs to become active once this script is over +local entity raidb // +local int hawkhealth + +local int sig1 + +rswat1 = find entity with targetname "rswat1" +rswat2 = find entity with targetname "rswat2" +rhawk = find entity with targetname "rhawk" +rbadguy1 = find entity with targetname "rbadguy1" +rbadguy2 = find entity with targetname "rbadguy2" +leader = find entity with targetname "leader" +rcam1 = find entity with targetname "rcam1" +rcam1n = find entity with targetname "rcam1n" +leadertrain = find entity with targetname "leadertrain" +sabrefade1 = find entity with targetname "sabrefade1" +sabrefade2 = find entity with targetname "sabrefade2" +traintriggerb = find entity with targetname "traintriggerb" +raidb = find entity with targetname "raidb" + + +rcam1.movetype = MOVETYPE_NOCLIP +rcam1n.movetype = MOVETYPE_NOCLIP + +wait .1 seconds // magic delay + + +animate entity rbadguy1 performing action CCH_XONKNEES_N_N_N holding for 999.0 +animate entity rbadguy2 performing action STD_XAFRAIDSHAKE_N_N_N holding for 999.0 // him laying there on the ground PRN_A_N_A_2 + +animate entity rhawk performing action STD_XYELLWAVE_BK_A_N holding for 2.6 //new line +use entity leader //new line + + + +wait .3 seconds //new line + + + + animate entity rhawk showing emotion EMOTION_TALK holding for 1.3 + play sound "cin/tsr1/c7d1.adp" for entity rhawk at volume 0.9 on channel CHAN_AUTO // Hawk talking to John + print TSR1_C7D1 + //wait 1 seconds + +wait .5 seconds + + + +wait .4 seconds + + + play sound "cin/tsr1/c7d2.adp" for entity rhawk at volume 0.9 on channel CHAN_AUTO // Hawk talking to John + print TSR1_C7D2 + +wait .5 seconds + +hawkhealth = rhawk.health + +if hawkhealth > 0 + + use entity raidb // triggers the second half of the script + +endif + + exit diff --git a/Sample/ds/tsr1/raidb.ds b/Sample/ds/tsr1/raidb.ds new file mode 100644 index 0000000..f7230f5 --- /dev/null +++ b/Sample/ds/tsr1/raidb.ds @@ -0,0 +1,66 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" +#include "tsr1.ds" + + + + +local entity rcam1 +local entity rhawk +local entity leader +local entity leadertrain +local entity sabrefade1 +local entity sabrefade2 +local entity traintriggerb + +rcam1 = find entity with targetname "rcam1" +rhawk= find entity with targetname "rhawk" +leader = find entity with targetname "leader" +leadertrain = find entity with targetname "leadertrain" +sabrefade1 = find entity with targetname "sabrefade1" +sabrefade2 = find entity with targetname "sabrefade2" +traintriggerb = find entity with targetname "traintriggerb" + + + +enable cinematics // +use entity rcam1 // turns the camera on + + + +// animate entity rhawk performing action STD_R_N_PK_N by moving [-320, 0, 0] //new line +// animate entity rhawk performing action STD_R_N_PK_N by moving [-32, -64, 0] //new line + +//Going to external camera + + + +wait .1 seconds + + animate entity leader performing action STD_ESABREMOCK_N_A_N holding for 4.0 // skinhead leader laughing as the train takes off + play sound "cin/tsr1/laugh.adp" for entity leader at volume .9 on channel CHAN_AUTO + +wait 3 seconds + +use entity leadertrain // starts the leaders train taking off + +wait .8 seconds + +use entity sabrefade1 // starts the fade + +wait 2 seconds + +use entity sabrefade2 // fade back + +use entity rcam1 // shuts the camera off +disable cinematics + +animate entity rhawk performing action STD_R_N_PK_N by moving [-320, 0, 0] //new line +animate entity rhawk performing action STD_R_N_PK_N by moving [-32, -64, 0] //new line + +use entity traintriggerb // sets the trigger active on top of the train + + + +remove entity leader // gets these guys out of the world +remove entity leadertrain diff --git a/Sample/ds/tsr1/raidspwn.ds b/Sample/ds/tsr1/raidspwn.ds new file mode 100644 index 0000000..337ecad --- /dev/null +++ b/Sample/ds/tsr1/raidspwn.ds @@ -0,0 +1,34 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + +///////////////////////////////////////// +// spawns in actors for the RAID script +///////////////////////////////////////// + + +local entity rswat1 // the first swat guy +local entity rswat2 // the second swatguy +local entity rbadguy1 // first bad skinhead +local entity rbadguy2 // the second bad skinhead + + + + +rswat1 = find entity with targetname "rswat1" +rswat2 = find entity with targetname "rswat2" +rbadguy1 = find entity with targetname "rbadguy1" +rbadguy2 = find entity with targetname "rbadguy2" + + + + +//spawns in swat guards +use entity rswat1 +use entity rswat2 + +//spawns in skinheads +use entity rbadguy1 +use entity rbadguy2 + +animate entity rbadguy2 performing action STD_XAFRAIDSHAKE_N_N_N holding for 999.0 // him laying there on the ground PRN_A_N_A_2 \ No newline at end of file diff --git a/Sample/ds/tsr1/scue1.ds b/Sample/ds/tsr1/scue1.ds new file mode 100644 index 0000000..d396a3a --- /dev/null +++ b/Sample/ds/tsr1/scue1.ds @@ -0,0 +1,47 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" +#include "tsr1.ds" + + + + + +// THE FIRST SOUND CUE FROM HAWK TRIGGERED WHEN THE PLAYER LEAVES THE SUBWAY STATION + +local entity splayer1 // the player who sets off the trigger +local entity notoken // the clip brush in front of the token booth +local entity scue1b // the relay between the trigger and the script runner so it doesnt get used twice + +splayer1 = get entity activator +notoken = find entity with targetname "notoken" +scue1b = find entity with targetname "scue1b" + +// THE WHOLE CONVERSATION EXCHANGE + +use entity notoken // should remove the clip brush func wall in the token booth windows + +play sound "cin/tsr1/s1d1.adp" for entity splayer1 at volume 0.9 // Hawks first call to John + print TSR1_S1D1 + wait 1.5 seconds + // "John do you read" + +play sound "cin/tsr1/s1d2.adp" for entity splayer1 at volume 0.9 // johns response + print TSR1_S1D2 + //" go ahead" + wait 1.5 seconds + +play sound "cin/tsr1/s1d3.adp" for entity splayer1 at volume 0.9 // hawk saying the info + print TSR1_S1D3 + // "nypd has a large group ....." + wait 4 seconds + +play sound "cin/tsr1/s1d4.adp" for entity splayer1 at volume 0.9 // roger + print TSR1_S1D4 + + // "roger" + + + + + + diff --git a/Sample/ds/tsr1/sodafall.ds b/Sample/ds/tsr1/sodafall.ds new file mode 100644 index 0000000..a3b25a4 --- /dev/null +++ b/Sample/ds/tsr1/sodafall.ds @@ -0,0 +1,25 @@ +// template file for newyork directory + +#include "../common/header.ds" + +output "p:/base/ds/tsr1" + + + +local entity swatkiller // the guy who will push over the soda machine +local entity soda_fall // the soda machine that will be tipped over +local entity deadswatguy1 // the dead swat guy, the sound will be played from this origin to make it louder +local int sig1 + +soda_fall = find entity with targetname "soda_fall" +swatkiller = find entity with targetname "swatkiller" +deadswatguy1 = find entity with targetname "deadswatguy1" + +animate entity swatkiller performing action STD_EPUSHOVER_N_PK_A // guy pushing over the soda machine +animate entity swatkiller performing action SCRIPT_RELEASE +moverotate entity soda_fall from file "tsr1_soda_fall.rof" signaling sig1 +wait .75 seconds +play sound "Impact/Metal/SodaMach.adp" for entity deadswatguy1 on channel CHAN_AUTO at volume 0.9 +wait for all clearing sig1 + +exit \ No newline at end of file diff --git a/Sample/ds/tsr1/sodalean.ds b/Sample/ds/tsr1/sodalean.ds new file mode 100644 index 0000000..c698ce9 --- /dev/null +++ b/Sample/ds/tsr1/sodalean.ds @@ -0,0 +1,29 @@ + + +#include "../common/header.ds" + +output "p:/base/ds/tsr1" + + +////////////////////////////////////////////////////////////////////////// +// Enemy leans around corner near soda machine after token booth gate +////////////////////////////////////////////////////////////////////////// + +//enemy that leans +local entity sodaleaner + +//to target player +local entity sneak + + + +//enemy that leans +sodaleaner = find entity with targetname "sodaleaner" +sneak = find entity player + + +//spawns leaner +use entity sodaleaner +// this is him peeking around the corner firing +animate entity sodaleaner performing action STD_FCORNERPEAK_RT_P_A targeting entity sneak +animate entity sodaleaner performing action SCRIPT_RELEASE \ No newline at end of file diff --git a/Sample/ds/tsr1/sodastairs.ds b/Sample/ds/tsr1/sodastairs.ds new file mode 100644 index 0000000..3c376fe --- /dev/null +++ b/Sample/ds/tsr1/sodastairs.ds @@ -0,0 +1,42 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + + + +local entity stairguy1 // the guy kicking the soda machine +local entity stepsrunguy // the guy running up the lower set of steps + +local int sig1 + +stairguy1 = find entity with targetname "stairguy1" +stepsrunguy = find entity with targetname "stepsrunguy" + + +use entity stepsrunguy // spawns him in the world + + + +on stairguy1.health < 100 goto sodalet_go + + play sound "impact/vending/kick.wav" for entity stairguy1 at volume 0.9 + animate entity stairguy1 performing action STD_XKICKDOOR_N_A_A // the first guy kicks the sodamachine + wait .1 seconds + play sound "impact/vending/kick.wav" for entity stairguy1 at volume 0.9 + animate entity stairguy1 performing action STD_XKICKDOOR_N_A_A // again + + play sound "impact/vending/sodadrop.wav" for entity stairguy1 at volume 0.9 + wait 1.5 seconds + play sound "speech/tsr1/skn/bt9-5.adp" for entity stairguy1 at volume 0.8 + wait .5 seconds + + +label sodalet_go + + reset ai for entity stairguy1 + animate entity stairguy1 performing action SCRIPT_RELEASE + use entity stepsrunguy // starts him on his pointcombats + + +exit \ No newline at end of file diff --git a/Sample/ds/tsr1/stairstoken.ds b/Sample/ds/tsr1/stairstoken.ds new file mode 100644 index 0000000..3c801fb --- /dev/null +++ b/Sample/ds/tsr1/stairstoken.ds @@ -0,0 +1,45 @@ +// template file for newyork directory + +#include "../common/header.ds" + +output "p:/base/ds/tsr1" + + +local entity topstairguy1 // the hostage at the top of the stairs +local entity topstairbad1 // +local entity host_count // the hostage counter for how many hostage events the player has seen + + + +topstairguy1 = find entity with targetname "topstairguy1" +topstairbad1 = find entity with targetname "topstairbad1" +host_count = find entity with targetname "host_count" + +on topstairbad1.health < 100 goto badstairs1 + + animate entity topstairguy1 performing action STD_XFEARWAVE_N_N_N + play sound "speech/tsr1/npc/eb9-3.adp" for entity topstairguy1 at volume 0.9 + + animate entity topstairbad1 performing action STD_XYELLATYOU_N_A_A + wait 1.0 seconds + play sound "speech/tsr1/skn/bt9-4.adp" for entity topstairbad1 at volume 0.9 + + +label release + + animate entity topstairbad1 performing action SCRIPT_RELEASE + animate entity topstairguy1 performing action SCRIPT_RELEASE + exit + + +label badstairs1 + + reset ai for entity topstairbad1 // lets this guy go +goto release + + + + + + + diff --git a/Sample/ds/tsr1/stall.ds b/Sample/ds/tsr1/stall.ds new file mode 100644 index 0000000..fd1890c --- /dev/null +++ b/Sample/ds/tsr1/stall.ds @@ -0,0 +1,33 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + +local entity stallshooter // the guy who will shoot the stall +local entity breakstall // the breakable brush for the stall +local entity originalwall // the func wall that needs to be removed +local entity stall_playerfind // the target that the stall guy will shoot at +local int sig1 + +stallshooter = find entity with targetname "stallshooter" // \ +breakstall = find entity with targetname "breakstall" +originalwall = find entity with targetname "originalwall" +stall_playerfind = find entity with targetname "stall_playerfind" + +// use entity stallshooter // spawns the guy in + +if stallshooter.health > 0 + + use entity originalwall // this should remove the func_wall + animate entity stallshooter performing action STD_F_FWD_S_2 targeting entity stall_playerfind signaling sig1 //breakstall // this should get the guy to fire and break the brush + wait .1 seconds + use entity breakstall // should trigger the stall to break no matter what, lets hope this fixes a bug + wait for all clearing sig1 + + +endif + + + reset ai for entity stallshooter + animate entity stallshooter performing action SCRIPT_RELEASE + exit \ No newline at end of file diff --git a/Sample/ds/tsr1/startcin.ds b/Sample/ds/tsr1/startcin.ds new file mode 100644 index 0000000..57ae64c --- /dev/null +++ b/Sample/ds/tsr1/startcin.ds @@ -0,0 +1,958 @@ +#include "../common/header.ds" +#include "tsr1.ds" +output "p:/base/ds/tsr1" + + + +//first camera stuff +local entity use_toll // trigger relay that starts the toll gates moving +local entity use_gates // trigger relay that starts the doors moving +local entity start_fade // starts the fade in +local entity end_fade // the reverse fade in +local entity first_cam // the first lighwave animated camera +local entity boothguard // guard in booth + +//second camera stuff +local entity second_cam // second camera +local entity sniperzoom // sniper xoom function +local int counter = 0 +local entity mullins // player +local entity vaporold // environ_invisible_attack +local entity vaporold2 // environ_invisible_attack +local entity cleanblood // clean wall +local entity dirtyblood // bloody wall + +//third camera stuff +local entity third_cam // third camera +local entity fronttruck // truck that pulls in +local entity trucksmoke // smoke for trucks tailpipe +local entity first_raider // raider dude that walks into booth + +//fourth camera stuff +local entity fourth_cam // fourth camera +local entity kneeler // guard that is kneeling +local entity t38 // kneeling guards pathcorner +local entity lookout // guard who is a lookout +local entity t39 // lookout guards pathcorner +local entity planter // raider who plants the c4 +local entity c4ofdeath // c4 + +//fifth camera stuff +local entity fifth_cam // fifth camera +local entity t40 // fifth cameras notnull +local entity boomwall // wall that blows up +local entity boompipe // pipe that blows up +local entity wallexp // explosion +local entity boomlight1 // emergency light +local entity boomlight2 // emergency light +local entity boomlights // world lights that turn off +local entity blowback1 // guard1 who gets blown back +local entity blowback2 // guard2 who gets blown back +local entity runner01 // 1st raider who runs out +local entity runner02 // 2nd raider who runs out +local entity runner03 // 3rd raider who runs out + +//sixth camera stuff +local entity sixth_cam // sixth camera +local entity hallraider1 // raider that is walking and shooting down hallway +local entity hallraider2 // raider that is walking and shooting down hallway +local entity hallbaddie1 // sib dude that runs out +local entity hallbaddie2 // sib dude that runs out +local entity hallbaddie3 // crawling sib dude +local entity hallflee1 // sib dude that runs away around corner +local entity hallflee2 // sib dude that runs away around corner +local entity hallbaddie1null // sib dude that runs out shoots at this +local entity hallbaddie2null // sib dude that runs out shoots at this + + +//seventh camera stuff + +//eighth camera stuff +local entity eighth_cam // eighth camera +local entity walkfire1 // raiders that are walking and firing +local entity walkfire2 // raiders that are walking and firing +local entity walkfire3 // raiders that are walking and firing +local entity walkfire4 // raiders that are walking and firing +local entity walkfire5 // raiders that are walking and firing + + + + +//ninth camera stuff +local entity ninth_cam // ninth camera +local entity doorrt // door that is blasted open +local entity doorlf // door that is blasted open +local entity rspark // sparks +local entity lspark // sparks +local entity sparkboom // explosion +local entity sparkrunner1 // raider that runs in +local entity sparkrunner2 // raider that runs in +local entity sparkrunner3 // raider that runs in +local entity sparkrunner4 // raider that runs in + +//tenth camera stuff +local entity tenth_cam // tenth camera +local entity pusher // raider that pushes crate +local entity nuke01 // nuke that gets pushed out of room +local entity nuketable1 // table nuke is sitting on +local entity nukewalker1 // guard who walks out with nuke +local entity nukewalker2 // guard who walks out with nuke + +//eleventh camera stuff +local entity eleventh_cam // eleventh camera +local entity traindoors // doors on train +local entity trainraider1 // raider that jumps out of train +local entity trainraider2 // raider that jumps out of train +local entity heli1 // helicoptor that flys by + +//twelve camera stuff +local entity twelve_cam // twelve camera +local entity trainguard1 // gaurd who stands outside train +local entity trainguard2 // gaurd who stands outside train +local entity trainguard3 // gaurd who stands outside train +local entity trainguard4 // gaurd who stands outside train +local entity traintruck // truck that backs up +local entity trainplat // plat that extends + +//thirteenth camera stuff +local entity thirteen_cam // thirteenth camera +local entity trainpusher // dude who pushes the nuke in the train +local entity trainnuke // nuke that is in the train +local entity traintable // table nuke is sitting on +local entity traintruck2 // truck that drives off + +//sound stuff +local entity outdoorsound // outdoor sound set +local entity indoorsound // indoor sound set +local entity nukesound1 // nuke that gets pushed out +local entity nukesound2 // nuke that gets pushed into the train +local entity trucksound1 // 1st truck +local entity beepsound // beeping sound for C4 +local entity writhe1 // writhing sound +local entity blowbacksound1 // blown back screaming +local entity blowbacksound2 // blown back screaming +local entity baddie1sound // sib guard yelling +local entity baddie2sound // sib guard yelling + +//change level entity +local entity changelevel + + + + + + + + + + +//first camera stuff +first_cam = find entity with targetname "first_cam" +enable cinematics + +run console command "cl_touch" + +//turns on first camera +use entity first_cam // turns the first camera on + +use_toll = find entity with targetname "use_toll" +use_gates = find entity with targetname "use_gates" +start_fade = find entity with targetname "start_fade" +end_fade = find entity with targetname "end_fade" +boothguard = find entity with targetname "boothguard" + +//second camera stuff +second_cam = find entity with targetname "second_cam" +sniperzoom = find entity with targetname "sniperzoom" +mullins = find entity player +vaporold = find entity with targetname "vaporold" +vaporold2 = find entity with targetname "vaporold2" +cleanblood = find entity with targetname "cleanblood" +dirtyblood = find entity with targetname "dirtyblood" + +//third camera stuff +third_cam = find entity with targetname "third_cam" +fronttruck = find entity with targetname "fronttruck" +trucksmoke = find entity with targetname "trucksmoke" +first_raider = find entity with targetname "first_raider" + +//fourth camera stuff +fourth_cam = find entity with targetname "fourth_cam" +kneeler = find entity with targetname "kneeler" +t38 = find entity with targetname "t38" +lookout = find entity with targetname "lookout" +t39 = find entity with targetname "t39" +planter = find entity with targetname "planter" +c4ofdeath = find entity with targetname "c4ofdeath" + +//fifth camera stuff +fifth_cam = find entity with targetname "fifth_cam" +t40 = find entity with targetname "t40" +boomwall = find entity with targetname "boomwall" +boompipe = find entity with targetname "boompipe" +wallexp = find entity with targetname "wallexp" +boomlight1 = find entity with targetname "boomlight1" +boomlight2 = find entity with targetname "boomlight2" +boomlights = find entity with targetname "boomlights" +blowback1 = find entity with targetname "blowback1" +blowback2 = find entity with targetname "blowback2" +runner01 = find entity with targetname "runner01" +runner02 = find entity with targetname "runner02" +runner03 = find entity with targetname "runner03" + +//sixth camera stuff +sixth_cam = find entity with targetname "sixth_cam" +hallraider1 = find entity with targetname "hallraider1" +hallraider2 = find entity with targetname "hallraider2" +hallbaddie1 = find entity with targetname "hallbaddie1" +hallbaddie2 = find entity with targetname "hallbaddie2" +hallbaddie3 = find entity with targetname "hallbaddie3" +hallflee1 = find entity with targetname "hallflee1" +hallflee2 = find entity with targetname "hallflee2" +hallbaddie1null = find entity with targetname "hallbaddie1null" +hallbaddie2null = find entity with targetname "hallbaddie2null" + +//seventh camera stuff + +//eighth camera stuff +eighth_cam = find entity with targetname "eighth_cam" +walkfire1 = find entity with targetname "walkfire1" +walkfire2 = find entity with targetname "walkfire2" +walkfire3 = find entity with targetname "walkfire3" +walkfire4 = find entity with targetname "walkfire4" +walkfire5 = find entity with targetname "walkfire5" + + +//ninth camera stuff +ninth_cam = find entity with targetname "ninth_cam" +doorrt = find entity with targetname "doorrt" +doorlf = find entity with targetname "doorlf" +rspark = find entity with targetname "rspark" +lspark = find entity with targetname "lspark" +sparkboom = find entity with targetname "sparkboom" +sparkrunner1 = find entity with targetname "sparkrunner1" +sparkrunner2 = find entity with targetname "sparkrunner2" +sparkrunner3 = find entity with targetname "sparkrunner3" +sparkrunner4 = find entity with targetname "sparkrunner4" + +//tenth camera stuff +tenth_cam = find entity with targetname "tenth_cam" +pusher = find entity with targetname "pusher" +nuke01 = find entity with targetname "nuke01" +nuketable1 = find entity with targetname "nuketable1" +nukewalker1 = find entity with targetname "nukewalker1" +nukewalker2 = find entity with targetname "nukewalker2" + +//eleventh camera stuff +eleventh_cam = find entity with targetname "eleventh_cam" +traindoors = find entity with targetname "traindoors" +trainraider1 = find entity with targetname "trainraider1" +trainraider2 = find entity with targetname "trainraider2" +heli1 = find entity with targetname "heli1" + +//tweleve camera stuff +twelve_cam = find entity with targetname "twelve_cam" +trainguard1 = find entity with targetname "trainguard1" +trainguard2 = find entity with targetname "trainguard2" +trainguard3 = find entity with targetname "trainguard3" +trainguard4 = find entity with targetname "trainguard4" +traintruck = find entity with targetname "traintruck" +trainplat = find entity with targetname "trainplat" + + +//thirteenth camera stuff +thirteen_cam = find entity with targetname "thirteen_cam" +trainpusher = find entity with targetname "trainpusher" +trainnuke = find entity with targetname "trainnuke" +traintable = find entity with targetname "traintable" +traintruck2 = find entity with targetname "traintruck2" + +//sound stuff +outdoorsound = find entity with targetname "outdoorsound" +indoorsound = find entity with targetname "indoorsound" +nukesound1 = find entity with targetname "nukesound1" +nukesound2 = find entity with targetname "nukesound2" +trucksound1 = find entity with targetname "trucksound1" +beepsound = find entity with targetname "beepsound" +writhe1 = find entity with targetname "writhe1" +blowbacksound1 = find entity with targetname "blowbacksound1" +blowbacksound2 = find entity with targetname "blowbacksound2" +baddie1sound = find entity with targetname "baddie1sound" +baddie2sound = find entity with targetname "baddie2sound" + +//change level entity +changelevel = find entity with targetname "changelevel" + + + + + +first_cam.movetype = MOVETYPE_NOCLIP +fronttruck.movetype = MOVETYPE_NOCLIP +trucksmoke.movetype = MOVETYPE_NOCLIP +fifth_cam.movetype = MOVETYPE_NOCLIP +t40.movetype = MOVETYPE_NOCLIP +sixth_cam.movetype = MOVETYPE_NOCLIP +eighth_cam.movetype = MOVETYPE_NOCLIP +tenth_cam.movetype = MOVETYPE_NOCLIP + +hallbaddie3.movetype = MOVETYPE_NOCLIP + +rspark.movetype = MOVETYPE_NOCLIP +lspark.movetype = MOVETYPE_NOCLIP +nuke01.movetype = MOVETYPE_NOCLIP +nuketable1.movetype = MOVETYPE_NOCLIP +traintruck.movetype = MOVETYPE_NOCLIP +twelve_cam.movetype = MOVETYPE_NOCLIP +eleventh_cam.movetype = MOVETYPE_NOCLIP +heli1.movetype = MOVETYPE_NOCLIP + +trainplat.movetype = MOVETYPE_NOCLIP + +thirteen_cam.movetype = MOVETYPE_NOCLIP +trainnuke.movetype = MOVETYPE_NOCLIP +traintable.movetype = MOVETYPE_NOCLIP +traintruck2.movetype = MOVETYPE_NOCLIP + +nukesound1.movetype = MOVETYPE_NOCLIP +nukesound2.movetype = MOVETYPE_NOCLIP +trucksound1.movetype = MOVETYPE_NOCLIP + + + +//////////////////////////////////////////////////// +// First Camera - Camera pulls back and gates close +//////////////////////////////////////////////////// + +//plays music +playsong 1 + +//turns on outdoor sound set +use entity outdoorsound + +//turns on first camera +//use entity first_cam // turns the first camera on + +//starts the fade in +use entity start_fade // starts the fade in + +wait 1.2 seconds + +//moves the camera +moverotate entity first_cam from file "tsr2_intro.rof" // moves the camera rof takes 7.2 seconds + +wait 1 seconds + +//print typomatic stuff +print TSR1_RUSSIA + +wait 1.5 seconds + +//closes gates +use entity use_gates //closes gate + +wait .7 seconds + +//closes tool bars +use entity use_toll //closes toll bars + +//guard walks to doorway +animate entity boothguard performing action STD_WNORMAL_N_PK_A by moving [78,0,0] //88 + +wait 1.2 seconds + +//guard looks around +animate entity boothguard performing action STD_ILOOKING_N_MRS_2 holding for 4.7 //3.7 + +//truck drive up -happy eric? +use entity trucksound1 +use entity fronttruck //turns on wheels +move entity fronttruck by [0,320,0] at 120 speed //truck drives in +move entity trucksmoke by [0,320,0] at 120 speed //trucksmoke moves with truck +move entity trucksound1 by [0,320,0] at 120 speed + +wait 2 seconds + +//fade out +use entity end_fade + +wait 1 second + +//turns off wheels and sound +use entity fronttruck //turns off wheels +use entity trucksound1 //turns off truck sound + +//turns off first camera +use entity first_cam // shuts the camera off + + + +////////////////////////////////////// +// Second Camera - Guard gets sniped +////////////////////////////////////// + +//starts the fade in +use entity start_fade +//turns on second camera +use entity second_cam + +//sniper scope zooms in on guard +sniperzoom.wait = 60 +while counter < 17 + + sniperzoom.wait -= 2.5 //2.1 + use entity sniperzoom + wait .1 seconds + counter += 1 + +endwhile + + +wait 1 second + +use entity vaporold +//use entity vaporold2 +use entity cleanblood +use entity dirtyblood +//sniper gun firing sound +play sound "Weapons\Sniper\Fire.wav" for entity mullins at volume 0.9 on channel CHAN_VOICE +//guard gets shot in the head +//animate entity vapor performing action STD_F_FWD_P_2 targeting entity boothguard kill nulltarget NUG_O_POPPIN +//animate entity boothguard performing action STD_SHEAD_2FRNT_N_N +wait .5 seconds +//use entity vaporold +//use entity vaporold2 + +//move truck up for next shot +//fronttruck.movetype = MOVETYPE_NOCLIP +move entity fronttruck by [0,84,0]// at 10000 speed //420 +move entity trucksmoke by [0,84,0] +move entity trucksound1 by [0,84,0] + + +wait 2.0 seconds + +//remove entity vapor + +//set fov back to normal +sniperzoom.wait = -1 +use entity sniperzoom + +//turns off second camera +use entity second_cam + + + +////////////////////////////////////// +// Third Camera - Truck pulls in +////////////////////////////////////// + +//turns on third camera +use entity third_cam //turns on third camera + +//raider dude walks into the booth +use entity first_raider +animate entity first_raider performing action STD_R_N_MRS_2 by moving [-192,0,0] //STD_WPATROL_N_MRS_2 + +wait .2 seconds + +play sound "Enemy/Ra1/Ger1/help.wav" for entity first_raider at volume 0.9 on channel CHAN_AUTO + +wait 2 seconds + +//opens tool bars +use entity use_toll //opens tool bars + +wait .7 seconds + +//opens tool bars +use entity use_gates //opens tool bars + +wait 2 seconds + +//truck drives in +use entity trucksound1 //turns on truck sound +use entity fronttruck //turns on wheels +use entity trucksmoke //turns on smoke +move entity fronttruck by [0,470,0] at 120 speed //truck drives in +move entity trucksmoke by [0,470,0] at 120 speed //trucksmoke moves with truck +move entity trucksound1 by [0,470,0] at 120 speed + +//spawns guys for next shot +use entity kneeler //spawns kneeling guy for next shot +use entity lookout //spawns lookout for next shot +use entity planter //spawns raider who plants c4 + +wait 3.5 seconds + +//turns off wheels and smoke +use entity fronttruck //turns off wheels +use entity trucksmoke //turns off smoke +use entity trucksound1 //turns off truck sound + +//turns off third camera +use entity third_cam + + + + +///////////////////////////////////////// +// Fourth Camera - Raiders place charge +///////////////////////////////////////// + +//turns on fourth camera +use entity fourth_cam //turns on fourth camera + +//turns on indoor sound set +use entity indoorsound + +//raider runs up to plant charge +animate entity planter performing action STD_R_N_PK_N by moving [0,168,0] +animate entity planter performing action STD_EWRENCHV_TO_N_N +animate entity planter performing action STD_EWRENCHV_FRM_N_N + +//guard runs +animate entity planter performing action STD_R_N_PK_N by moving [200,0,0] + +wait 2 seconds + +//C4 is spawned +use entity c4ofdeath + +wait .6 seconds +play sound "Weapons/C4/Beep.wav" for entity beepsound at volume 0.9 on channel CHAN_AUTO +wait .6 seconds +play sound "Weapons/C4/Beep.wav" for entity beepsound at volume 0.9 on channel CHAN_AUTO + +//lookouts run too +remove entity t38 +//animate entity kneeler performing action CCH_XCROUCH_UP_PK_A +animate entity kneeler performing action STD_R_N_PK_N by moving [400,0,0] +wait .6 seconds +remove entity t39 +animate entity lookout performing action STD_R_N_PK_N by moving [400,0,0] + +play sound "Weapons/C4/Beep.wav" for entity beepsound at volume 0.9 on channel CHAN_AUTO +wait .4 seconds +//play sound "Weapons/C4/Beep.wav" for entity beepsound at volume 0.9 on channel CHAN_AUTO + +//turns off fourth camera +use entity fourth_cam //turns off fourth camera + + + + + +//////////////////////////////////////////////////////// +// Fifth Camera - Wall blows up and raiders run through +//////////////////////////////////////////////////////// + +//turns on fifth camera +use entity fifth_cam //turns on fifth camera + +wait .5 seconds + +//guard standing says something +play sound "Enemy/So1/Sib1/Wake2.wav" for entity blowback1 at volume 0.9 on channel CHAN_AUTO + +wait 1.5 seconds + +//wall and pipe blow up emergency lights turn on +use entity wallexp +use entity boomwall +use entity boompipe +use entity boomlight1 +use entity boomlight2 +//use entity boomlights + +//guards get blown back +animate entity blowback1 performing action STD_SBLOWN_2BK_N_N +play sound "enemy/Dth/Arab/Scream2.wav" for entity blowbacksound1 at volume 0.9 on channel CHAN_AUTO +wait .2 seconds +animate entity blowback2 performing action STD_SBLOWN_2BK_N_N +play sound "enemy/Dth/Arab/Scream3.wav" for entity blowbacksound2 at volume 0.9 on channel CHAN_AUTO + +wait .8 seconds + +//raiders run out of blown hole +use entity runner01 +use entity runner02 +wait .2 seconds +use entity runner03 + +wait .2 seconds + +//camera slowly pans +move entity fifth_cam by [0,-32,0] at 7 speed +move entity t40 by [0,64,0] at 14 speed //32 + +wait .7 seconds + +// +play sound "Enemy/Ra1/Ger3/Wake4.wav" for entity runner02 at volume 0.9 on channel CHAN_AUTO + +wait 3 seconds + +//sib dudes flee around corner +use entity hallflee1 +use entity hallflee2 + +//LB_PCRAWL_BK_P_N + +//sib dude is crawling away +animate entity hallbaddie3 performing action LB_PCRAWL_BK_P_N holding for 999.0 +//play sound "enemy/Dth/Russ/Writhe1.wav" for entity hallbaddie3 at volume 0.9 on channel CHAN_AUTO + +//raiders walk down hallway +animate entity hallraider1 performing action STD_WPATROL_N_MRS_2 by moving [0,200,0] //STD_WAIM_FWD_MS_2 +wait .3 seconds +animate entity hallraider2 performing action STD_WPATROL_N_MRS_2 by moving [0,200,0] //STD_WAIM_FWD_MS_2 + +//turns off fifth camera +use entity fifth_cam //turns off fifth camera + + + +//////////////////////////////////////////////////////// +// Sixth Camera - Firefight down a hallway +//////////////////////////////////////////////////////// + +//turns on sixth camera +use entity sixth_cam //turns on sixth camera + +wait .1 seconds + +play sound "enemy/Dth/Russ/Writhe1.wav" for entity writhe1 at volume 0.9 on channel CHAN_AUTO + +//camera moves with raiders +move entity sixth_cam by [0,155,0] at 50 speed + + + +//baddies run up around the corner +animate entity hallbaddie1 performing action STD_R_N_MRS_2 by moving [-120,0,0] +animate entity hallbaddie1 performing action STD_R_N_MRS_2 by moving [-160,-80,0] +animate entity hallbaddie1 performing action STD_R_N_MRS_2 by moving [-80,-160,0] +animate entity hallbaddie1 performing action STD_R_N_MRS_2 by moving [0,-250,0] +animate entity hallbaddie1 performing action STD_F_FWD_M_2 targeting entity hallbaddie1null + +animate entity hallbaddie2 performing action STD_R_N_MRS_2 by moving [-176,0,0] +animate entity hallbaddie2 performing action STD_R_N_MRS_2 by moving [-120,-56,0] +animate entity hallbaddie2 performing action STD_R_N_MRS_2 by moving [-56,-120,0] +animate entity hallbaddie2 performing action STD_R_N_MRS_2 by moving [0,-250,0] +animate entity hallbaddie2 performing action STD_F_FWD_M_2 targeting entity hallbaddie2null + +//raiders gun down sib dudes +//animate entity hallraider2 performing action STD_XCROUCH_DWN_MRS_2 +animate entity hallraider2 performing action CCH_F_FWD_M_2 targeting entity hallbaddie2 kill nulltarget HEAD +animate entity hallraider2 performing action CCH_F_FWD_M_2 holding for 999.9 + +animate entity hallraider1 performing action STD_F_FWD_M_2 targeting entity hallbaddie1 kill nulltarget CHEST +animate entity hallraider1 performing action STD_F_FWD_M_2 holding for 999.9 + +wait 2 seconds + +play sound "enemy/So1/Sib1/Wake3.wav" for entity baddie1sound at volume 0.9 on channel CHAN_AUTO + +wait 1 seconds + +play sound "enemy/So1/Sib1/Wake1.wav" for entity baddie2sound at volume 0.9 on channel CHAN_AUTO + +wait 2 seconds + +//raiders walk and fire for next shot +animate entity walkfire1 performing action STD_WFIRE_FWD_MS_2 by moving [0,-240,0] +wait .2 seconds +animate entity walkfire2 performing action STD_WFIRE_FWD_MS_2 by moving [0,-240,0] +animate entity walkfire3 performing action STD_WPATROL_N_MRS_2 by moving [0,-240,0] +wait .1 seconds +animate entity walkfire4 performing action STD_WPATROL_N_MRS_2 by moving [0,-240,0] +wait .1 seconds +animate entity walkfire5 performing action STD_WPATROL_N_MRS_2 by moving [0,-240,0] + + +//turns off sixth camera +use entity sixth_cam //turns off sixth camera + + +//////////////////////////////////////////////////////// +// Seventh Camera - Firefight +//////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////// +// Eighth Camera - Firefight +//////////////////////////////////////////////////////// +//turns on eighth camera +use entity eighth_cam //turns on eighth camera + +//removes sib dude +remove entity hallflee1 + +//camera moves with raiders +move entity eighth_cam by [0,-210,0] at 80 speed + +wait 2.7 seconds + +//turns off sixth camera +use entity eighth_cam //turns off eighth camera + + +//////////////////////////////////////////////////////// +// Ninth Camera - Door is blasted and nuke is stolen +//////////////////////////////////////////////////////// + +//turns on ninth camera +use entity ninth_cam //turns on ninth camera + +wait .5 seconds + + play sound "cin/tsr1/c9d1.adp" for entity mullins at volume 0.9 on channel CHAN_NO_PHS_ADD + print TSR1_C9D1 + // "sources in russia...." captioned + +wait 2.7 seconds + +//sparks fly +use entity rspark +use entity lspark +moverotate entity rspark from file "Tsr2_startcin_sparkrt.rof" +moverotate entity lspark from file "Tsr2_startcin_sparklf.rof" + +wait 2 seconds + +//removes sparks +remove entity rspark +remove entity lspark + +wait 1 seconds + +//doors are blasted open +use entity sparkboom +moverotate entity doorrt from file "Tsr2_startcin_doorrt.rof" +moverotate entity doorlf from file "Tsr2_startcin_doorlf.rof" + +wait .4 seconds + +//raiders run in +use entity sparkrunner1 +wait .3 seconds +use entity sparkrunner2 +wait .2 seconds +use entity sparkrunner3 +wait .3 seconds +use entity sparkrunner4 + +wait .4 seconds + +//fade out +use entity end_fade + +wait 1 second + +//turns off ninth camera +use entity ninth_cam //turns off ninth camera + +//////////////////////////////////////////////////////// +// Tenth Camera - Raiders make off with the nuke +//////////////////////////////////////////////////////// + +//turns on tenth camera +use entity tenth_cam //turns on tenth camera + +//wait .1 seconds + +// play sound "cin/tsr1/c9d2.adp" for entity mullins at volume 0.9 on channel CHAN_NO_PHS_ADD +// print TSR1_C9D2 +// // "sold to the highest bidder" captioned + +//camera moves with raiders +move entity tenth_cam by [70,0,0] at 15 speed + +//starts the fade in +use entity start_fade // starts the fade in + +//guards walks with nuke +animate entity nukewalker1 performing action STD_WPATROL_N_MRS_2 by moving [-250,0,0] +animate entity nukewalker2 performing action STD_WPATROL_N_MRS_2 by moving [-250,0,0] + +//raider pushes out nuke +animate entity pusher performing action STD_WPUSH_N_N_N by moving [-250,0,0] holding for 10.0 +move entity nuke01 by [-245,0,0] at 49.7 speed //signaling sig1 +move entity nuketable1 by [-245,0,0] at 49.7 speed +move entity nukesound1 by [-245,0,0] at 49.7 speed +//wait for all clearing sig1 + +wait 3.2 seconds + +//fade out +use entity end_fade + +wait 1 seconds + +//turns off tenth camera +use entity tenth_cam //turns off tenth camera + + + + +/////////////////////////////////////////////////////////// +// Eleventh Camera - Train doors open and raiders jump out +/////////////////////////////////////////////////////////// + +//turns on eleventh camera +use entity eleventh_cam //turns on eleventh camera + +//turns on outdoor sound set +use entity outdoorsound + +//heli flys in the background +move entity heli1 by [1072,-1320,0] at 300 speed + +wait .1 seconds + + play sound "cin/tsr1/c9d2.adp" for entity mullins at volume 0.9 on channel CHAN_NO_PHS_ADD + print TSR1_C9D2 + // "sold to the highest bidder" captioned + +//camera pans +move entity eleventh_cam by [80,-16,0] at 16 speed + +//starts the fade in +use entity start_fade // starts the fade in + +wait 1 seconds + +//opens train doors +use entity traindoors + +wait .5 seconds + +//raiders jump out of train +animate entity trainraider1 performing action STD_WPATROL_N_MRS_2 by moving [0,-112,0] //STD_R_N_MRS_2 +wait .4 seconds + +// play sound "cin/tsr1/c9d3.adp" for entity mullins at volume 0.9 on channel CHAN_NO_PHS_ADD +// print TSR1_C9D3 +// // "As much ....." captioned + +animate entity trainraider2 performing action STD_WPATROL_N_MRS_2 by moving [0,-112,0] + +//animate entity trainraider1 performing action STD_JDOWN_N_A_A +//animate entity trainraider2 performing action STD_JDOWN_N_A_A + +//STD_JDROP_N_A_A + +wait 2.2 seconds + +//fade out +use entity end_fade + +wait 1.5 seconds + +//removes jumper raiders +remove entity trainraider1 +remove entity trainraider2 + +//turns off eleventh camera +use entity eleventh_cam //turns off eleventh camera + + +/////////////////////////////////////////////////////////// +// Twelve Camera - Truck backs up to train +/////////////////////////////////////////////////////////// + +//turns on twelve camera +use entity twelve_cam //turns on twelve camera + +wait .9 seconds + + play sound "cin/tsr1/c9d3.adp" for entity mullins at volume 0.9 on channel CHAN_NO_PHS_ADD + print TSR1_C9D3 +// // "As much ....." captioned + +//starts the fade in +use entity start_fade // starts the fade in + +//wait .1 seconds + +//camera pans up +move entity twelve_cam by [0,0,32] at 8 speed + + +//spawns guards +use entity trainguard1 +use entity trainguard2 +use entity trainguard3 +use entity trainguard4 +animate entity trainguard1 performing action STD_ILOOKING_N_MRS_2 holding for 999.9 +wait .1 seconds +animate entity trainguard2 performing action STD_ILOOKING_N_MRS_2 holding for 999.9 +animate entity trainguard3 performing action STD_ILOOKING_N_MRS_2 holding for 999.9 +animate entity trainguard4 performing action STD_ILOOKING_N_MRS_2 holding for 999.9 + + + +//plat moves out +move entity trainplat by [0,-64,0] at 40 speed + + +//truck backs up +use entity traintruck +move entity traintruck by [0,144,0] at 120 speed //truck drives in + +wait 1.3 seconds + +//turns off wheels and sound +use entity traintruck + +wait 1.6 seconds + +//turns off twelve camera +use entity twelve_cam //turns off twelve camera + + +/////////////////////////////////////////////////////////// +// Thirteenth Camera - Truck backs up to train and unloads +/////////////////////////////////////////////////////////// + +//turns on thirteen camera +use entity thirteen_cam //turns on camera + +//camera pans +move entity thirteen_cam by [62,-16,0] at 16 speed + +//raider pushes nuke in train +animate entity trainpusher performing action STD_WPUSH_N_N_N by moving [0,250,0] holding for 10.0 +move entity trainnuke by [0,245,0] at 49.7 speed //signaling sig1 +move entity traintable by [0,245,0] at 49.7 speed +move entity nukesound2 by [0,245,0] at 49.7 speed + +wait .5 seconds + +//truck drives away +move entity traintruck2 by [0,-470,0] at 90 speed //truck drives away + +wait 1.2 seconds + +//fade out +use entity end_fade + +wait 1.0 seconds +//setcvar cvar "scr_blank" to 80.0 +wait .8 seconds + +//turns off thirteen camera +use entity thirteen_cam //turns off camera + + +disable cinematics + +//use entity changelevel + +// run console command "menu congrats" +setcvar cvar "menu_nextmap" to "trn1" +run console command "intermission blankscreen_nostats" + + + +exit \ No newline at end of file diff --git a/Sample/ds/tsr1/swat1.ds b/Sample/ds/tsr1/swat1.ds new file mode 100644 index 0000000..0ce133a --- /dev/null +++ b/Sample/ds/tsr1/swat1.ds @@ -0,0 +1,26 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + +// the script sets up the swatguys + +local entity swatguyfront // the guy way up front by the second subway +local entity endtrackguy // the guy at the end of the tracks +local int sig1 + +swatguyfront = find entity with targetname "swatguyfront" +endtrackguy = find entity with targetname "endtrackguy" + + + +use entity swatguyfront // spawns the swatguy in +use entity endtrackguy // spawns the end guy in waiting on the tracks + +play sound "speech/tsr1/swt/mcd-1.adp" for entity swatguyfront at volume 0.9 on channel CHAN_AUTO // Swat guy yelling to drop +animate entity swatguyfront performing action STD_R_N_PK_N by moving [256, 0, 0] // signaling sig1 +animate entity swatguyfront performing action SCRIPT_RELEASE + +// wait for all clearing sig1 + +animate entity endtrackguy performing action STD_F_FWD_P_2 targeting entity swatguyfront kill +animate entity endtrackguy performing action SCRIPT_RELEASE diff --git a/Sample/ds/tsr1/swat2.ds b/Sample/ds/tsr1/swat2.ds new file mode 100644 index 0000000..aa7fd91 --- /dev/null +++ b/Sample/ds/tsr1/swat2.ds @@ -0,0 +1,60 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + +// the script sets up the swatguys + +local entity swatguyfront // the guy way up front by the second subway +local entity endgl2 // the skinhead guy running up the stairs +local entity jumpingman +local int sig1 + + + +swatguyfront = find entity with targetname "swatguyfront" +endgl2 = find entity with targetname "endgl2" +jumpingman = find entity with targetname "jumpingman" + +use entity jumpingman // triggers the guy in who will do jumping +use entity endgl2 // triggers the guy running up the stairs + + + + +animate entity jumpingman performing action STD_F_FWD_S_2 targeting entity swatguyfront kill signaling sig1 +wait for all clearing sig1 + +on jumpingman.health < 100 goto jumpingman_hit // check to see if he is shot + +animate entity jumpingman performing action STD_JRUN_FWD_A_A by moving [-128, 0, 0] signaling sig1 +wait for all clearing sig1 + +goto jumpingman_hit +exit + + + +label jumpingman_hit // lets him go out of the animation if he is shot + +reset ai for entity jumpingman +animate entity jumpingman performing action SCRIPT_RELEASE + +// animate entity swatguyfront performing action SCRIPT_RELEASE + +animate entity endgl2 performing action SCRIPT_RELEASE + + + + + + + + + + + + + + + + diff --git a/Sample/ds/tsr1/swatguard1.ds b/Sample/ds/tsr1/swatguard1.ds new file mode 100644 index 0000000..9e5c018 --- /dev/null +++ b/Sample/ds/tsr1/swatguard1.ds @@ -0,0 +1,18 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + +////////////////////////////////////////////////// +// swat guarding punk stands up if punk is killed +////////////////////////////////////////////////// + + +local entity rswat1 // the second swatguy + +rswat1 = find entity with targetname "rswat1" + + + + + +animate entity rswat1 performing action STD_IALERT_N_P_N \ No newline at end of file diff --git a/Sample/ds/tsr1/swatguard2.ds b/Sample/ds/tsr1/swatguard2.ds new file mode 100644 index 0000000..048da4e --- /dev/null +++ b/Sample/ds/tsr1/swatguard2.ds @@ -0,0 +1,17 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + +////////////////////////////////////////////////// +// swat guarding punk stands up if punk is killed +////////////////////////////////////////////////// + + +local entity rswat2 // the second swatguy + +rswat2 = find entity with targetname "rswat2" + + + + + +animate entity rswat2 performing action STD_IALERT_N_P_N diff --git a/Sample/ds/tsr1/swatintrob.ds b/Sample/ds/tsr1/swatintrob.ds new file mode 100644 index 0000000..f3d9e3e --- /dev/null +++ b/Sample/ds/tsr1/swatintrob.ds @@ -0,0 +1,11 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + +// the script that calls the death animation of the swat guy in the intro + +local entity introdeadswat // the guy who will be killed + +introdeadswat = find entity with targetname "introdeadswat" + +animate entity introdeadswat performing action STD_SINBACK_2FRNT_N_N // this is him getting shot in the back \ No newline at end of file diff --git a/Sample/ds/tsr1/swatkilled.ds b/Sample/ds/tsr1/swatkilled.ds new file mode 100644 index 0000000..7efa8bd --- /dev/null +++ b/Sample/ds/tsr1/swatkilled.ds @@ -0,0 +1,13 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + +// this script is the dead swat guy in the intro doing his thing, it is called once he gets shot with a killtarget + + +local entity introdeadswat + +introdeadswat = find entity with targetname "introdeadswat" + + +animate entity introdeadswat performing action STD_SINBACK_2FRNT_N_N // this is him getting shot in the back \ No newline at end of file diff --git a/Sample/ds/tsr1/tdoorcam1.ds b/Sample/ds/tsr1/tdoorcam1.ds new file mode 100644 index 0000000..f29b8eb --- /dev/null +++ b/Sample/ds/tsr1/tdoorcam1.ds @@ -0,0 +1,85 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" +#include "tsr1.ds" + +// THIS SCRIPT STARTS THE CAMERA IN THE TOKEN AREA SHOWING THE SUBWAY DOOR OPEN + + +local entity tokencam // the camera +local entity tokencamn // the cameras null +local entity tdoorjohn // the john model that spawns in the players spot +local entity tokenlocked2 // the relay that has the locked message +local entity tdoor // the actual door that will open +local entity new_tok_lever // the actual lever that will move +local entity use_the_switch // this is the actual trigger that opens the door and triggers this script +local entity host_count +local int host_counthealth + +// THIS IS STUFF THAT SHOULDNT GET REMOVED DURING THE CINEMATIC, THAT IS THE ONLY REASON IT IS HERE + +local entity roundguy // the skinhead that will spawn round the corner shooting at the player entering +local entity tokvictim // the guy who will run past the token booth +local entity tokchaser // the guy following him +local entity tollguy // the guy by the token machines + + +enable cinematics + +tokencam = find entity with targetname "tokencam" +tokencamn = find entity with targetname "tokencamn" +tdoorjohn = find entity with targetname "tdoorjohn" +tokenlocked2 = find entity with targetname "tokenlocked2" +tdoor = find entity with targetname "tdoor" +host_count = find entity with targetname "host_count" +new_tok_lever = find entity with targetname "new_tok_lever" +use_the_switch = find entity with scripttarget "use_the_switch" + +// HERE IS THE STUFF AGAIN + +roundguy = find entity with targetname "roundguy" +tokvictim = find entity with targetname "tokvictim" +tokchaser = find entity with targetname "tokchaser" +tollguy = find entity with targetname "tollguy" + + + +// label intro + +host_counthealth = host_count.health + + + + +// if host_counthealth < 5 // hostcount health must be greater than this number to get into the subway + +// print TSR1_USELEVER // string to warn the player there are still hostages left + +// else + + +use entity tdoorjohn // spawns the john model in players place **uncommented by SM** +// enable cinematics +use entity tokencam // turns the camera on + + +// use entity new_tok_lever // moves the level up +move entity new_tok_lever by [0, 0, -8] +use entity tdoor // starts the door moving up +remove entity use_the_switch // gets rid of the trigger multiple since it isnt needed anymore + +wait 2 seconds // pause time +use entity tokencam // shuts the camera off + + + +remove entity tokenlocked2 // cuts off the message on the relay + +// remove john model +remove entity tdoorjohn +disable cinematics +// endif + + +// suspend + +// goto intro \ No newline at end of file diff --git a/Sample/ds/tsr1/token.ds b/Sample/ds/tsr1/token.ds new file mode 100644 index 0000000..eedf227 --- /dev/null +++ b/Sample/ds/tsr1/token.ds @@ -0,0 +1,58 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + + +local entity tokenguy1 +local entity tokenguy2 +local entity tokenguy3 +local entity player_shoot // the player +local int sig1 +local int sig2 + + +tokenguy1 = find entity with targetname "tokenguy1" +tokenguy2 = find entity with targetname "tokenguy2": +tokenguy3 = find entity with targetname "tokenguy3" +player_shoot = find entity player + + + + + +// animate entity tokenguy1 performing action CCH_XCROUCH_UP_PK_A +// wait .2 seconds +play sound "speech/tsr1/skn/bt9-7.adp" for entity tokenguy1 at volume 0.9 + + +animate entity tokenguy1 performing action CCH_XCROUCH_UP_MRS_2 // first guy gets up +animate entity tokenguy1 performing action STD_F_FWD_S_2 targeting entity player_shoot // first guy takes a shot at the player + +// THIS IS THE GUY RUNNING AWAY OUT THE BACK EXIT + +// animate entity tokenguy1 performing action STD_R_N_MRS_2 by moving [-112, 0, 0] // guy running towards the back of the room +// animate entity tokenguy1 performing action STD_R_N_MRS_2 by moving [0, 112, 0] // guy running up the little hall and to the left +// animate entity tokenguy1 performing action STD_R_N_MRS_2 by moving [-216, 0, 0] // +// animate entity tokenguy1 performing action STD_R_N_MRS_2 by moving [0, 256, 0] // running towards the door + + + +// SECOND GUY DOING HIS THING +animate entity tokenguy2 performing action CCH_XCROUCH_UP_PK_A // JUMPS UP TO TAKE A SHOT AT THE PLAYER +animate entity tokenguy2 performing action STD_F_FWD_P_2 targeting entity player_shoot +animate entity tokenguy2 performing action STD_XCROUCH_DWN_PK_A // HIM DUCKING DOWN AGAIN +animate entity tokenguy2 performing action STD_F_FWD_P_2 targeting entity player_shoot // signaling sig1 + +// THIRD GUY DOING HIS THING +animate entity tokenguy3 performing action CCH_XCROUCH_UP_PK_A +animate entity tokenguy3 performing action STD_F_FWD_P_2 targeting entity player_shoot +animate entity tokenguy3 performing action STD_XCROUCH_DWN_PK_A // HIM DUCKING DOWN AGAIN +animate entity tokenguy3 performing action STD_F_FWD_P_2 targeting entity player_shoot // signaling sig2 + +// wait for all clearing sig1, sig2 +animate entity tokenguy2 performing action SCRIPT_RELEASE +animate entity tokenguy3 performing action SCRIPT_RELEASE +animate entity tokenguy1 performing action SCRIPT_RELEASE + + diff --git a/Sample/ds/tsr1/trackcam1.ds b/Sample/ds/tsr1/trackcam1.ds new file mode 100644 index 0000000..d094944 --- /dev/null +++ b/Sample/ds/tsr1/trackcam1.ds @@ -0,0 +1,30 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + +///////////////////////////////////////////////// + + + +local entity trackcam1 // the cam on the tracks +local entity trackcam1n // the trackcams null +local entity fryguy // the guy who gets killed +local entity tracksparks // the spark gen by the tracks +local int sig1 + +trackcam1 = find entity with targetname "trackcam1" +trackcam1n = find entity with targetname "trackcam1n" +fryguy = find entity with targetname "fryguy" +tracksparks = find entity with targetname "tracksparks" + +trackcam1.movetype = MOVETYPE_NOCLIP +trackcam1n.movetype = MOVETYPE_NOCLIP + +use entity fryguy // spawns the guy who will get killed +use entity trackcam1 // turns the camera on +animate entity fryguy performing action WALK by moving [-32, 0, 0] signaling sig1 // has the guy walkforward towards the fusebox +wait for all clearing sig1 +animate entity fryguy performing action STD_XALARMPUSH_N_A_N signaling sig1 // triggers the alarm push button animation +wait for all clearing sig1 +animate entity fryguy performing action STD_SBLOWN_2BK_N_N signaling sig1 // the blown back animation +use entity tracksparks // triggers the sparkgen +wait for all clearing sig1 diff --git a/Sample/ds/tsr1/train1.ds b/Sample/ds/tsr1/train1.ds new file mode 100644 index 0000000..03bb630 --- /dev/null +++ b/Sample/ds/tsr1/train1.ds @@ -0,0 +1,57 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + +///////////////////////////////////////////////// +// THIS SCRIPT IS THE HOSTAGE GETTING PUSHED IN FRONT OF THE TRAIN + + +local entity train2 // the train that moves +local entity trainvictim1 // the guy getting pushed in front of the train +local entity pusher // the guy who does the pushing +local entity shake1 // the shake when the train derails +local entity trainexplosion // the explosion when the train derails +local entity brokensign // the func_wall sign that gets triggered on after the train derails +local entity trainsmokegen // the smokegen that gets triggered by the train +local int health +local int sig1 + +train2 = find entity with targetname "train2" +trainvictim1 = find entity with targetname "trainvictim1" +pusher = find entity with targetname "pusher" +shake1 = find entity with targetname "shake1" +brokensign = find entity with targetname "brokensign" +trainexplosion = find entity with targetname "trainexplosion" +trainsmokegen = find entity with targetname "trainsmokegen" + +health = pusher.health + +// animate entity trainvictim1 performing action STD_XAFRAIDSHAKE_N_N_N // the hostage cowering + +if health <= 0 + + use entity train2 // makes the train move + animate entity trainvictim1 performing action SCRIPT_RELEASE + exit +endif + +animate entity pusher performing action STD_F_FWD_S_2 targeting entity trainvictim1 // the pusher guy pistol whiping the guy +animate entity pusher performing action SCRIPT_RELEASE +animate entity trainvictim1 performing action STD_SBLOWN_2BK_N_N by moving [64, 0, 0] // the animation of the guy getting pushed onto the tracks +play sound "Speech/tsr1/npc/eb9-11.adp" for entity trainvictim1 at volume 0.9 +wait 1.25 seconds + +use entity train2 // makes the train move +wait .75 seconds +remove entity trainvictim1 // gets the guy out of the way so the train doesnt get stuck + +wait 3 seconds +// use entity brokensign // triggers the sign in +use entity shake1 // causes the screen to shake +use entity trainexplosion // causes the explosions on the tracks. +rotate entity train2 by [-10, -5, 0] at 150 speed signaling sig1 +// use entity trainsmokegen // triggers the smokegen +wait for all clearing sig1 + + + +exit \ No newline at end of file diff --git a/Sample/ds/tsr1/trainhorn.ds b/Sample/ds/tsr1/trainhorn.ds new file mode 100644 index 0000000..4366e5c --- /dev/null +++ b/Sample/ds/tsr1/trainhorn.ds @@ -0,0 +1,23 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + +local entity runovertrain +local entity new_train_shake // the camera shake that people wanted +local entity qa_explosion // the explosion at the end of the tunnel +local entity qa_camerashake // the camera shake for the explosion at the end of the tunnel + +runovertrain = find entity with scripttarget "runovertrain" +new_train_shake = find entity with targetname "new_train_shake" +qa_explosion = find entity with targetname "qa_explosion" +qa_camerashake = find entity with targetname "qa_camerashake" + +wait .1 seconds +play sound "Cin/TSR1/Script/Warning.wav" for entity runovertrain at volume 0.9 +wait 2.2 seconds +use entity runovertrain // triggers the train going +use entity new_train_shake // triggers the camera shake effect +wait 4 seconds +use entity qa_explosion // the explosion gets triggered +use entity qa_camerashake // triggers the camera shake \ No newline at end of file diff --git a/Sample/ds/tsr1/tsr1.ds b/Sample/ds/tsr1/tsr1.ds new file mode 100644 index 0000000..20b1cd0 --- /dev/null +++ b/Sample/ds/tsr1/tsr1.ds @@ -0,0 +1,57 @@ +// __tsr1_ds +// + + +/******************************************************************************** + +TSR1 Level Specific Strings + +********************************************************************************/ + + +#define PACKAGE_TSR1 0x64 + +#define TSR1_C3D2 0x6400 +#define TSR1_C3D1 0x6401 +#define TSR1_C4D1 0x6402 +#define TSR1_C5D1 0x6403 +#define TSR1_C5D2 0x6404 +#define TSR1_C6D1 0x6405 +#define TSR1_C6D2 0x6406 +#define TSR1_C6D3 0x6407 +#define TSR1_S1D1 0x6408 +#define TSR1_S1D2 0x6409 +#define TSR1_S1D3 0x640a +#define TSR1_S1D4 0x640b +#define TSR1_S2D1 0x640c +#define TSR1_S2D2 0x640d +#define TSR1_C7D1 0x640e +#define TSR1_C7D2 0x640f +#define TSR1_C8D1 0x6410 +#define TSR1_C8D2 0x6411 +#define TSR1_C9D1 0x6412 +#define TSR1_C9D2 0x6413 +#define TSR1_C9D3 0x6414 +#define TSR1_C6D4 0x6415 +#define TSR1_RUSSIA 0x6416 +#define TSR1_INTRO 0x6417 +#define TSR1_ACTIVISION 0x6418 +#define TSR1_RAVEN 0x6419 +#define TSR1_SOF 0x641a +#define TSR1_LOCKED 0x641b +#define TSR1_ONE 0x641c +#define TSR1_TWO 0x641d +#define TSR1_THREE 0x641e +#define TSR1_FOUR 0x641f +#define TSR1_FIVE 0x6420 +#define TSR1_SIX 0x6421 +#define TSR1_SEVEN 0x6422 +#define TSR1_EIGHT 0x6423 +#define TSR1_NINE 0x6424 +#define TSR1_TEN 0x6425 +#define TSR1_USELEVER 0x6426 +#define TSR1_THIRTEEN 0x6428 +#define TSR1_FOURTEEN 0x6429 + + +// __tsr1_ds diff --git a/Sample/ds/tsr1/tsr1pre.ds b/Sample/ds/tsr1/tsr1pre.ds new file mode 100644 index 0000000..8968116 --- /dev/null +++ b/Sample/ds/tsr1/tsr1pre.ds @@ -0,0 +1,106 @@ +#include "../common/header.ds" +output "p:/base/ds/tsr1" + + + + +local entity startintro // the script runner that starts the first cinematic + +startintro = find entity with targetname "startintro" + +setcvar cvar "ai_spawnfrequency" to 1.0 + +cache strings "tsr1" + +cache sound "Impact/Vending/Kick.wav" +cache sound "Speech/TSR1/NPC/EB9-1.adp" // "Speech/Hostage1/Please.wav" +cache sound "Speech/TSR1/SKN/BT9-2.adp" // "Speech/Skinhead1/Snicker.wav" +cache sound "Speech/TSR1/SKN/BT9-1.adp" // "Speech/Skinhead1/InHere.wav" +cache sound "impact/door/kickdoor.wav" +cache sound "Speech/TSR1/NPC/EB9-6.adp" //"Speech/Hostage1/Whimper.wav" +cache sound "Speech/TSR1/NPC/EB9-5.adp" // "Speech/Hostage1/Cry.wav" + +cache sound "Speech/TSR1/SKN/BT9-3.adp" // "Speech/Skinhead1/Shutup.wav" +cache sound "Speech/TSR1/SKN/BT9-6.adp" // "Speech/Skinhead1/HesHere.wav" +cache sound "Speech/TSR1/NPC/EB9-2.adp" //"Speech/Hostage1/DontShoot.wav" +cache sound "impact/vending/sodadrop.wav" +cache sound "Speech/TSR1/SKN/BT9-5.adp" // "Speech/Skinhead1/LetsGo.wav" +cache sound "Speech/TSR1/NPC/EB9-3.adp" +cache sound "Speech/TSR1/SKN/BT9-4.adp" +cache sound "Speech/TSR1/SWT/MCD-1.adp" + +cache sound "Speech/TSR1/SKN/BT9-7.adp" +cache sound "Speech/TSR1/NPC/EB9-11.adp" +cache sound "Impact/Stone/BigRubble.adp" + +cache sound "cin/tsr1/c8d1.adp" +cache sound "cin/tsr1/c8d2.adp" + + +cache sound "cin/tsr1/c9d1.adp" +cache sound "cin/tsr1/c9d2.adp" +cache sound "cin/tsr1/c9d3.adp" + +// INTRO STUFF THAT GOT MOVED HERE + +cache sound "cin/tsr1/c3d1.adp" +cache sound "cin/tsr1/c3d2.adp" +cache sound "cin/tsr1/c4d1.adp" +cache sound "cin/tsr1/c5d1.adp" +cache sound "cin/tsr1/c5d2.adp" +cache sound "cin/tsr1/c6d1.adp" +cache sound "cin/tsr1/c6d2.adp" +cache sound "cin/tsr1/c6d3.adp" +cache sound "cin/tsr1/c6d4.adp" + + +cache sound "cin/tsr1/s1d1.adp" // speech when john gets out of token booth +cache sound "cin/tsr1/s1d2.adp" +cache sound "cin/tsr1/s1d3.adp" +cache sound "cin/tsr1/s1d4.adp" + + +cache sound "cin/tsr1/s2d1.adp" // end tunnel speech +cache sound "cin/tsr1/s2d2.adp" + +cache sound "cin/tsr1/s1d3.adp" +cache sound "cin/tsr1/s1d4.adp" + +cache sound "speech/tsr1/swt/mcd-1.adp" + +cache sound "cin/tsr1/c7d1.adp" +cache sound "cin/tsr1/c7d2.adp" +cache sound "cin/tsr1/laugh.adp" +cache sound "Ambient/Locs/Subway/Train/Horn2.wav" // the train horn wav +cache sound "Impact/Metal/SodaMach.adp" // the soda machine falling wave + +cache sound "Cin/TSR1/Script/Warning.wav" // the new train sound + +cache sound "Cin/TSR1/Script/Piss.wav" // the peeing sound +// cache sound "Cin/TSR1/Script/Health.wav" // the health station sound + + +cache roff "stall_door_1.rof" // the special kicked door in the mensroom +cache roff "generic_door_cw.rof" +cache roff "generic_door_ccw.rof" +cache roff "gbnyc_stall.rof" + +cache roff "tsr1_beam1.rof" +cache roff "tsr1_beam1b.rof" +cache roff "tsr1_beam2.rof" +cache roff "tsr1_beam2b.rof" +cache roff "tsr1_beam3.rof" +cache roff "tsr1_beam3b.rof" +cache roff "tsr1_rchunk1.rof" +cache roff "tsr1_rchunk2.rof" + +cache roff "tsr1_soda_fall.rof" // intro soda machine falling + +run console command "cl_touch" // makes sure Windows keeps an eye on these files +// wait 5 seconds + +use entity startintro // starts the intro cin + + + + diff --git a/Sample/ds/tsr1/tunlean.ds b/Sample/ds/tsr1/tunlean.ds new file mode 100644 index 0000000..5b59632 --- /dev/null +++ b/Sample/ds/tsr1/tunlean.ds @@ -0,0 +1,29 @@ + + +#include "../common/header.ds" + +output "p:/base/ds/tsr1" + + +////////////////////////////////////////////////////////////////////////// +// Enemy leans around corner in subway tunnel +////////////////////////////////////////////////////////////////////////// + +//enemy that leans +local entity tunnelleaner + +//to target player +local entity sneak + + + +//enemy that leans +tunnelleaner = find entity with targetname "tunnelleaner" +sneak = find entity player + + +//spawns leaner +use entity tunnelleaner +// this is him peeking around the corner firing +animate entity tunnelleaner performing action STD_FCORNERPEAK_RT_P_A targeting entity sneak +animate entity tunnelleaner performing action SCRIPT_RELEASE \ No newline at end of file diff --git a/Sample/map/tsr1.map b/Sample/map/tsr1.map new file mode 100644 index 0000000..e675455 --- /dev/null +++ b/Sample/map/tsr1.map @@ -0,0 +1,54566 @@ +{ +"maxDeadHostages" "3" +"spawn2" "m_nyc_mskinhead2a" +"spawn1" "m_nyc_mskinhead1" +"spawnfrequency" ".5" +"sky" "ny" +"classname" "worldspawn" +"_sun_color" "0.783465 0.684252 .555555" +"_sun_diffuse" "20" +"_sun_light" "112" +"_sun_ambient" "10 10 15" +"_sun_angle" "45 -45" +"script" "tsr1/tsr1pre" +"musicset" "tsr1" +"setweapons" "1" +"message" "TSR1" +// brush 0 +{ +( 496 328 -64 ) ( 496 384 -64 ) ( 552 384 -64 ) subway/1_tile 17 15 -180 0.500000 0.500000 134217728 318767104 0 +( 552 368 -64 ) ( 536 368 -80 ) ( 536 328 -80 ) subway/1_tile 17 15 -180 0.500000 0.500000 134217728 318767104 0 +( 536 368 -64 ) ( 536 368 -80 ) ( 552 384 -64 ) subway/1_tile -63 0 -180 0.500000 0.500000 134217728 318767104 0 +( 536 368 -80 ) ( 536 368 -64 ) ( 536 344 -64 ) subway/1_tile -63 0 -180 0.500000 0.500000 134217728 318767104 0 +( 560 328 -80 ) ( 488 328 -80 ) ( 524 328 -64 ) subway/1_tile -63 0 -180 0.500000 0.500000 134217728 318767104 0 +} +// brush 1 +{ +( 496 384 -64 ) ( 552 384 -64 ) ( 552 328 -64 ) subway/1_tile 17 15 -180 0.500000 0.500000 134217728 318767104 0 +( 536 328 -64 ) ( 536 344 -80 ) ( 496 344 -80 ) subway/1_tile 17 15 -180 0.500000 0.500000 134217728 318767104 0 +( 536 344 -64 ) ( 536 344 -80 ) ( 552 328 -64 ) subway/1_tile -63 0 -180 0.500000 0.500000 134217728 318767104 0 +( 480 344 -64 ) ( 480 344 -80 ) ( 536 344 -80 ) subway/1_tile 17 0 -180 0.500000 0.500000 134217728 318767104 0 +( 496 344 -80 ) ( 496 344 -64 ) ( 496 328 -64 ) subway/1_tile -63 0 -180 0.500000 0.500000 134217728 318767104 0 +} +// brush 2 +{ +( 552 384 -64 ) ( 552 328 -64 ) ( 496 328 -64 ) subway/1_tile 17 15 -180 0.500000 0.500000 134217728 318767104 0 +( 496 368 -80 ) ( 536 368 -80 ) ( 536 384 -64 ) subway/1_tile 17 15 -180 0.500000 0.500000 134217728 318767104 0 +( 552 384 -64 ) ( 536 368 -80 ) ( 536 368 -64 ) subway/1_tile -63 0 -180 0.500000 0.500000 134217728 318767104 0 +( 536 368 -80 ) ( 480 368 -80 ) ( 480 368 -64 ) subway/1_tile 17 0 -180 0.500000 0.500000 134217728 318767104 0 +( 496 384 -64 ) ( 496 368 -64 ) ( 496 368 -80 ) subway/1_tile -63 0 -180 0.500000 0.500000 134217728 318767104 0 +} +// brush 3 +{ +( 552 552 -64 ) ( 552 496 -64 ) ( 496 496 -64 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +( 496 536 -80 ) ( 536 536 -80 ) ( 536 552 -64 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +( 552 552 -64 ) ( 536 536 -80 ) ( 536 536 -64 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +( 536 536 -80 ) ( 480 536 -80 ) ( 480 536 -64 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +( 496 552 -64 ) ( 496 536 -64 ) ( 496 536 -80 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +} +// brush 4 +{ +( 496 552 -64 ) ( 552 552 -64 ) ( 552 496 -64 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +( 536 496 -64 ) ( 536 512 -80 ) ( 496 512 -80 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +( 536 512 -64 ) ( 536 512 -80 ) ( 552 496 -64 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +( 480 512 -64 ) ( 480 512 -80 ) ( 536 512 -80 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +( 496 512 -80 ) ( 496 512 -64 ) ( 496 496 -64 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +} +// brush 5 +{ +( 496 496 -64 ) ( 496 552 -64 ) ( 552 552 -64 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +( 552 536 -64 ) ( 536 536 -80 ) ( 536 496 -80 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +( 536 536 -64 ) ( 536 536 -80 ) ( 552 552 -64 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +( 536 536 -80 ) ( 536 536 -64 ) ( 536 512 -64 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +( 544 504 -64 ) ( 552 496 -80 ) ( 536 512 -80 ) subway/1_tile -47 0 -180 0.500000 0.500000 134217728 318767104 0 +} +// brush 6 +{ +( 720 328 -64 ) ( 664 328 -64 ) ( 664 384 -64 ) subway/1_tile 49 0 90 0.500000 0.500000 134217728 318767104 0 +( 664 384 -64 ) ( 664 368 -80 ) ( 704 368 -80 ) subway/1_tile 49 0 90 0.500000 0.500000 134217728 318767104 0 +( 720 328 -96 ) ( 720 264 -96 ) ( 720 264 -24 ) subway/1_tile 49 0 90 0.500000 0.500000 134217728 318767104 0 +( 720 368 -64 ) ( 720 368 -80 ) ( 680 368 -80 ) subway/1_tile 49 0 90 0.500000 0.500000 134217728 318767104 0 +( 672 376 -64 ) ( 680 368 -80 ) ( 664 384 -80 ) subway/1_tile 49 0 90 0.500000 0.500000 134217728 318767104 0 +} +// brush 7 +{ +( 720 384 -64 ) ( 720 328 -64 ) ( 664 328 -64 ) subway/1_tile 49 0 90 0.500000 0.500000 134217728 318767104 0 +( 664 344 -64 ) ( 680 344 -80 ) ( 680 384 -80 ) subway/1_tile 49 0 90 0.500000 0.500000 134217728 318767104 0 +( 712 328 -64 ) ( 728 328 -104 ) ( 696 328 -104 ) subway/1_tile 49 0 90 0.500000 0.500000 134217728 318767104 0 +( 680 384 -64 ) ( 680 384 -80 ) ( 680 344 -80 ) subway/1_tile 49 0 90 0.500000 0.500000 134217728 318767104 0 +( 672 376 -64 ) ( 664 384 -80 ) ( 680 368 -80 ) subway/1_tile 49 0 90 0.500000 0.500000 134217728 318767104 0 +} +// brush 8 +{ +( 664 552 -64 ) ( 720 552 -64 ) ( 720 496 -64 ) subway/1_tile -15 0 90 0.500000 0.500000 134217728 318767104 0 +( 680 496 -80 ) ( 680 536 -80 ) ( 664 536 -64 ) subway/1_tile -15 0 90 0.500000 0.500000 134217728 318767104 0 +( 696 552 -104 ) ( 728 552 -104 ) ( 712 552 -64 ) subway/1_tile -15 0 90 0.500000 0.500000 134217728 318767104 0 +( 680 536 -80 ) ( 680 496 -80 ) ( 680 496 -64 ) subway/1_tile -15 0 90 0.500000 0.500000 134217728 318767104 0 +( 680 512 -80 ) ( 664 496 -80 ) ( 672 504 -64 ) subway/1_tile -15 0 90 0.500000 0.500000 134217728 318767104 0 +} +// brush 9 +{ +( 664 496 -64 ) ( 664 552 -64 ) ( 720 552 -64 ) subway/1_tile -15 0 90 0.500000 0.500000 134217728 318767104 0 +( 704 512 -80 ) ( 664 512 -80 ) ( 664 496 -64 ) subway/1_tile -15 0 90 0.500000 0.500000 134217728 318767104 0 +( 720 616 -24 ) ( 720 616 -96 ) ( 720 552 -96 ) subway/1_tile -15 0 90 0.500000 0.500000 134217728 318767104 0 +( 680 512 -80 ) ( 720 512 -80 ) ( 720 512 -64 ) subway/1_tile -15 0 90 0.500000 0.500000 134217728 318767104 0 +( 664 496 -80 ) ( 680 512 -80 ) ( 672 504 -64 ) subway/1_tile -15 0 90 0.500000 0.500000 134217728 318767104 0 +} +// brush 10 +{ +( 1424 2448 -536 ) ( 1208 2448 -536 ) ( 1208 2440 -536 ) subway/clip 8 -8 0 1 1 196608 144 0 +( 1208 2440 -440 ) ( 1208 2448 -440 ) ( 1424 2448 -440 ) subway/clip 8 -8 0 1 1 196608 144 0 +( 1416 2264 -504 ) ( 1632 2264 -504 ) ( 1632 2264 -536 ) subway/clip 8 0 0 1 1 196608 144 0 +( 1424 2264 -504 ) ( 1424 2272 -504 ) ( 1424 2272 -536 ) subway/clip -48 0 0 1 1 196608 144 0 +( 1320 2456 -504 ) ( 1104 2456 -504 ) ( 1104 2456 -536 ) subway/clip 8 0 0 1 1 196608 144 0 +( 1416 2456 -504 ) ( 1416 2448 -504 ) ( 1416 2448 -536 ) subway/clip -48 0 0 1 1 196608 144 0 +} +// brush 11 +{ +( 1424 2440 -536 ) ( 1208 2440 -536 ) ( 1208 2432 -536 ) subway/clip 8 48 0 1 1 196608 144 0 +( 1208 2432 -440 ) ( 1208 2440 -440 ) ( 1424 2440 -440 ) subway/clip 8 48 0 1 1 196608 144 0 +( 1416 2256 -504 ) ( 1632 2256 -504 ) ( 1632 2256 -536 ) subway/clip 8 0 0 1 1 196608 144 0 +( 1544 2256 -504 ) ( 1544 2264 -504 ) ( 1544 2264 -536 ) subway/clip -40 0 0 1 1 196608 144 0 +( 1320 2264 -504 ) ( 1104 2264 -504 ) ( 1104 2264 -536 ) subway/clip 8 0 0 1 1 196608 144 0 +( 1416 2264 -504 ) ( 1416 2256 -504 ) ( 1416 2256 -536 ) subway/clip -40 0 0 1 1 196608 144 0 +} +// brush 12 +{ +( 1424 2336 -536 ) ( 1208 2336 -536 ) ( 1208 2328 -536 ) subway/clip 8 8 0 1 1 196608 144 0 +( 1208 2328 -440 ) ( 1208 2336 -440 ) ( 1424 2336 -440 ) subway/clip 8 8 0 1 1 196608 144 0 +( 1312 2152 -504 ) ( 1528 2152 -504 ) ( 1528 2152 -536 ) subway/clip 8 0 0 1 1 196608 144 0 +( 1544 2152 -504 ) ( 1544 2160 -504 ) ( 1544 2160 -536 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1320 2160 -504 ) ( 1104 2160 -504 ) ( 1104 2160 -536 ) subway/clip 8 0 0 1 1 196608 144 0 +( 1312 2160 -504 ) ( 1312 2152 -504 ) ( 1312 2152 -536 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 13 +{ +( 1416 2336 -536 ) ( 1200 2336 -536 ) ( 1200 2328 -536 ) subway/clip 16 -56 0 1 1 196608 144 0 +( 1200 2328 -440 ) ( 1200 2336 -440 ) ( 1416 2336 -440 ) subway/clip 16 -56 0 1 1 196608 144 0 +( 1304 2152 -504 ) ( 1520 2152 -504 ) ( 1520 2152 -536 ) subway/clip 16 0 0 1 1 196608 144 0 +( 1312 2152 -504 ) ( 1312 2160 -504 ) ( 1312 2160 -536 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1312 2336 -504 ) ( 1096 2336 -504 ) ( 1096 2336 -536 ) subway/clip 16 0 0 1 1 196608 144 0 +( 1304 2336 -504 ) ( 1304 2328 -504 ) ( 1304 2328 -536 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 14 +{ +( 1416 2344 -536 ) ( 1200 2344 -536 ) ( 1200 2336 -536 ) subway/clip 16 -48 0 1 1 196608 144 0 +( 1200 2336 -440 ) ( 1200 2344 -440 ) ( 1416 2344 -440 ) subway/clip 16 -48 0 1 1 196608 144 0 +( 1200 2336 -504 ) ( 1416 2336 -504 ) ( 1416 2336 -536 ) subway/clip 16 0 0 1 1 196608 144 0 +( 1312 2336 -504 ) ( 1312 2344 -504 ) ( 1312 2344 -536 ) subway/clip 56 0 0 1 1 196608 144 0 +( 1312 2344 -504 ) ( 1096 2344 -504 ) ( 1096 2344 -536 ) subway/clip 16 0 0 1 1 196608 144 0 +( 1200 2344 -504 ) ( 1200 2336 -504 ) ( 1200 2336 -536 ) subway/clip 56 0 0 1 1 196608 144 0 +} +// brush 15 +{ +( 1424 2456 -536 ) ( 1208 2456 -536 ) ( 1208 2448 -536 ) subway/clip -56 0 0 1 1 196608 144 0 +( 1208 2448 -440 ) ( 1208 2456 -440 ) ( 1424 2456 -440 ) subway/clip -56 0 0 1 1 196608 144 0 +( 1208 2448 -504 ) ( 1424 2448 -504 ) ( 1424 2448 -536 ) subway/clip -56 0 0 1 1 196608 144 0 +( 1424 2448 -504 ) ( 1424 2456 -504 ) ( 1424 2456 -536 ) subway/clip -56 0 0 1 1 196608 144 0 +( 1424 2456 -504 ) ( 1208 2456 -504 ) ( 1208 2456 -536 ) subway/clip -56 0 0 1 1 196608 144 0 +( 1208 2456 -504 ) ( 1208 2448 -504 ) ( 1208 2448 -536 ) subway/clip -56 0 0 1 1 196608 144 0 +} +// brush 16 +{ +( 1200 1448 -488 ) ( 1200 1424 -488 ) ( 1200 1424 -520 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1208 1440 -440 ) ( 1200 1440 -440 ) ( 1200 1440 -520 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1208 1424 -488 ) ( 1208 1448 -488 ) ( 1208 1448 -520 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1200 1424 -488 ) ( 1208 1424 -488 ) ( 1208 1424 -520 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1200 1440 -440 ) ( 1208 1440 -440 ) ( 1208 1424 -424 ) subway/metalrib1 0 -24 0 0.500000 0.500000 0 16777216 0 +( 1208 1448 -536 ) ( 1200 1448 -536 ) ( 1200 1424 -536 ) subway/metalrib1 0 -24 0 0.500000 0.500000 0 16777216 0 +} +// brush 17 +{ +( 1200 1568 -488 ) ( 1200 1544 -488 ) ( 1200 1544 -520 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1208 1560 -488 ) ( 1200 1560 -488 ) ( 1200 1560 -520 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1208 1544 -488 ) ( 1208 1568 -488 ) ( 1208 1568 -520 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1200 1544 -440 ) ( 1208 1544 -440 ) ( 1208 1544 -520 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1208 1544 -440 ) ( 1200 1544 -440 ) ( 1200 1560 -424 ) subway/metalrib1 0 -24 0 0.500000 0.500000 0 16777216 0 +( 1208 1568 -536 ) ( 1200 1568 -536 ) ( 1200 1544 -536 ) subway/metalrib1 0 -24 0 0.500000 0.500000 0 16777216 0 +} +// brush 18 +{ +( 1208 1440 -440 ) ( 1200 1440 -440 ) ( 1200 1424 -424 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 0 16777216 0 +( 1200 1544 -440 ) ( 1208 1544 -440 ) ( 1208 1560 -424 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 0 16777216 0 +( 1200 1504 -424 ) ( 1208 1504 -424 ) ( 1208 1472 -424 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 0 16777216 0 +( 1208 1504 -424 ) ( 1208 1504 -448 ) ( 1208 1472 -448 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 0 16777216 0 +( 1200 1440 -440 ) ( 1208 1440 -440 ) ( 1208 1544 -440 ) subway/metalrib1 0 -24 0 0.500000 0.500000 0 16777216 0 +( 1200 1504 -448 ) ( 1200 1504 -424 ) ( 1200 1472 -424 ) subway/metalrib1 -16 -24 90 0.500000 0.500000 0 16777216 0 +} +// brush 19 +{ +( 1296 1452 -540 ) ( 1296 1548 -540 ) ( 1288 1548 -540 ) subway/clip -40 56 0 1 1 196608 144 0 +( 1288 1552 -440 ) ( 1296 1552 -440 ) ( 1296 1456 -440 ) subway/clip -40 56 0 1 1 196608 144 0 +( 1288 1432 -504 ) ( 1288 1432 -472 ) ( 1296 1432 -472 ) subway/clip -40 0 0 1 1 196608 144 0 +( 1288 1528 -504 ) ( 1288 1528 -472 ) ( 1288 1432 -472 ) subway/clip -56 0 0 1 1 196608 144 0 +( 1296 1552 -504 ) ( 1296 1552 -472 ) ( 1288 1552 -472 ) subway/clip -40 0 0 1 1 196608 144 0 +( 1296 1456 -480 ) ( 1296 1456 -448 ) ( 1296 1552 -448 ) subway/clip -56 0 0 1 1 196608 144 0 +} +// brush 20 +{ +( 1296 1452 -540 ) ( 1296 1548 -540 ) ( 1288 1548 -540 ) subway/clip -40 56 0 1 1 196608 144 0 +( 1288 1552 -440 ) ( 1296 1552 -440 ) ( 1296 1456 -440 ) subway/clip -40 56 0 1 1 196608 144 0 +( 1296 1432 -504 ) ( 1296 1432 -472 ) ( 1304 1432 -472 ) subway/clip -40 0 0 1 1 196608 144 0 +( 1208 1524 -504 ) ( 1208 1524 -472 ) ( 1208 1428 -472 ) subway/clip -56 0 0 1 1 196608 144 0 +( 1288 1440 -504 ) ( 1288 1440 -472 ) ( 1280 1440 -472 ) subway/clip -40 0 0 1 1 196608 144 0 +( 1288 1456 -480 ) ( 1288 1456 -448 ) ( 1288 1552 -448 ) subway/clip -56 0 0 1 1 196608 144 0 +} +// brush 21 +{ +( 1296 1564 -540 ) ( 1296 1660 -540 ) ( 1288 1660 -540 ) subway/clip -40 40 0 1 1 196608 144 0 +( 1288 1664 -440 ) ( 1296 1664 -440 ) ( 1296 1568 -440 ) subway/clip -40 40 0 1 1 196608 144 0 +( 1296 1544 -504 ) ( 1296 1544 -472 ) ( 1304 1544 -472 ) subway/clip -40 0 0 1 1 196608 144 0 +( 1208 1636 -504 ) ( 1208 1636 -472 ) ( 1208 1540 -472 ) subway/clip -40 0 0 1 1 196608 144 0 +( 1296 1552 -504 ) ( 1296 1552 -472 ) ( 1288 1552 -472 ) subway/clip -40 0 0 1 1 196608 144 0 +( 1288 1568 -480 ) ( 1288 1568 -448 ) ( 1288 1664 -448 ) subway/clip -40 0 0 1 1 196608 144 0 +} +// brush 22 +{ +( 976 1412 -540 ) ( 968 1412 -540 ) ( 968 1316 -540 ) subway/clip 0 48 0 1 1 196608 144 0 +( 968 1320 -440 ) ( 968 1416 -440 ) ( 976 1416 -440 ) subway/clip 0 48 0 1 1 196608 144 0 +( 968 1296 -472 ) ( 976 1296 -472 ) ( 976 1296 -504 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1064 1292 -472 ) ( 1064 1388 -472 ) ( 1064 1388 -504 ) subway/clip -48 0 0 1 1 196608 144 0 +( 976 1304 -472 ) ( 968 1304 -472 ) ( 968 1304 -504 ) subway/clip 0 0 0 1 1 196608 144 0 +( 976 1416 -448 ) ( 976 1320 -448 ) ( 976 1320 -480 ) subway/clip -48 0 0 1 1 196608 144 0 +} +// brush 23 +{ +( 1064 1176 -424 ) ( 1064 1192 -440 ) ( 1056 1192 -440 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 0 16777216 0 +( 1056 1312 -424 ) ( 1056 1296 -440 ) ( 1064 1296 -440 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 0 16777216 0 +( 1056 1224 -424 ) ( 1056 1256 -424 ) ( 1064 1256 -424 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 0 16777216 0 +( 1056 1224 -448 ) ( 1056 1256 -448 ) ( 1056 1256 -424 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 0 16777216 0 +( 1056 1296 -440 ) ( 1056 1192 -440 ) ( 1064 1192 -440 ) subway/metalrib1 0 -24 0 0.500000 0.500000 0 16777216 0 +( 1064 1224 -424 ) ( 1064 1256 -424 ) ( 1064 1256 -448 ) subway/metalrib1 0 -24 90 0.500000 0.500000 0 16777216 0 +} +// brush 24 +{ +( 1064 1176 -520 ) ( 1064 1176 -488 ) ( 1064 1200 -488 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1064 1192 -520 ) ( 1064 1192 -440 ) ( 1056 1192 -440 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1056 1200 -520 ) ( 1056 1200 -488 ) ( 1056 1176 -488 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1056 1176 -520 ) ( 1056 1176 -488 ) ( 1064 1176 -488 ) subway/metalrib1 -8 8 0 0.500000 0.500000 0 16777216 0 +( 1056 1176 -424 ) ( 1056 1192 -440 ) ( 1064 1192 -440 ) subway/metalrib1 -8 -24 0 0.500000 0.500000 0 16777216 0 +( 1064 1176 -536 ) ( 1064 1200 -536 ) ( 1056 1200 -536 ) subway/metalrib1 -8 -24 0 0.500000 0.500000 0 16777216 0 +} +// brush 25 +{ +( 976 1300 -540 ) ( 968 1300 -540 ) ( 968 1204 -540 ) subway/clip 0 0 0 1 1 196608 144 0 +( 968 1208 -440 ) ( 968 1304 -440 ) ( 976 1304 -440 ) subway/clip 0 0 0 1 1 196608 144 0 +( 968 1184 -472 ) ( 976 1184 -472 ) ( 976 1184 -504 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1064 1180 -472 ) ( 1064 1276 -472 ) ( 1064 1276 -504 ) subway/clip 0 0 0 1 1 196608 144 0 +( 984 1192 -472 ) ( 976 1192 -472 ) ( 976 1192 -504 ) subway/clip 0 0 0 1 1 196608 144 0 +( 976 1304 -448 ) ( 976 1208 -448 ) ( 976 1208 -480 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 26 +{ +( 280 80 -216 ) ( 280 96 -216 ) ( 264 96 -216 ) subway/clip -16 0 0 1 1 131072 144 0 +( 264 96 -120 ) ( 280 96 -120 ) ( 280 80 -120 ) subway/clip -16 0 0 1 1 131072 144 0 +( 280 96 -184 ) ( 280 96 -152 ) ( 264 96 -152 ) subway/clip -16 0 0 1 1 131072 144 0 +( 280 80 -184 ) ( 280 80 -152 ) ( 280 96 -152 ) subway/clip 0 0 0 1 1 131072 144 0 +( 272 88 -120 ) ( 280 80 -216 ) ( 264 96 -216 ) subway/clip 0 0 0 1 1 131072 144 0 +} +// brush 27 +{ +( 200 96 -216 ) ( 184 96 -216 ) ( 184 80 -216 ) subway/clip 0 0 0 1 1 131072 144 0 +( 184 80 -120 ) ( 184 96 -120 ) ( 200 96 -120 ) subway/clip 0 0 0 1 1 131072 144 0 +( 200 96 -152 ) ( 184 96 -152 ) ( 184 96 -184 ) subway/clip 0 0 0 1 1 131072 144 0 +( 184 96 -152 ) ( 184 80 -152 ) ( 184 80 -184 ) subway/clip 0 0 0 1 1 131072 144 0 +( 200 96 -216 ) ( 184 80 -216 ) ( 192 88 -120 ) subway/clip 0 0 0 1 1 131072 144 0 +} +// brush 28 +{ +( 1828 1008 -216 ) ( 1824 1008 -216 ) ( 1824 1004 -216 ) subway/clip 32 0 -180 1 -1 196608 144 0 +( 1824 1004 -144 ) ( 1824 1008 -144 ) ( 1828 1008 -144 ) subway/clip 32 0 -180 1 -1 196608 144 0 +( 1828 1008 -144 ) ( 1824 1008 -144 ) ( 1824 1008 -208 ) subway/clip 32 0 -180 1 -1 196608 144 0 +( 1824 1008 -144 ) ( 1824 1004 -144 ) ( 1824 1004 -208 ) subway/clip 32 0 -180 1 -1 196608 144 0 +( 1828 1008 -216 ) ( 1824 1004 -216 ) ( 1826 1006 -144 ) subway/clip 32 0 -180 1 -1 196608 144 0 +} +// brush 29 +{ +( 414 -154 -216 ) ( 408 -154 -216 ) ( 408 -174 -216 ) subway/clip 0 0 0 1 1 131072 144 0 +( 408 -174 -120 ) ( 408 -154 -120 ) ( 414 -154 -120 ) subway/clip 0 0 0 1 1 131072 144 0 +( 408 -182 -216 ) ( 408 -182 -120 ) ( 414 -174 -120 ) subway/clip 0 0 0 1 1 131072 144 0 +( 414 -174 -208 ) ( 414 -154 -208 ) ( 414 -154 -216 ) subway/clip 0 0 0 1 1 131072 144 0 +( 408 -146 -120 ) ( 408 -146 -216 ) ( 414 -154 -216 ) subway/clip 0 0 0 1 1 131072 144 0 +( 408 -146 -216 ) ( 408 -146 -120 ) ( 408 -182 -120 ) subway/clip 0 0 0 1 1 131072 144 0 +} +// brush 30 +{ +( 672 -424 -120 ) ( 608 -424 -120 ) ( 608 -488 -120 ) subway/1_concrete_floor -16 0 0 0.500000 0.500000 0 285212672 0 +( 608 -488 -112 ) ( 608 -424 -112 ) ( 672 -424 -112 ) subway/1_concrete_floor -16 0 0 0.500000 0.500000 0 285212672 0 +( 472 -320 -88 ) ( 464 -320 -88 ) ( 464 -320 -56 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 584 -896 -88 ) ( 584 -896 -120 ) ( 584 -1040 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 584 -64 -88 ) ( 584 -64 -120 ) ( 592 -64 -120 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 496 -72 -120 ) ( 496 -64 -120 ) ( 496 -68 -112 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 31 +{ +( 672 -424 -120 ) ( 608 -424 -120 ) ( 608 -488 -120 ) subway/1_concrete_floor -16 0 0 0.500000 0.500000 0 285212672 0 +( 608 -488 -112 ) ( 608 -424 -112 ) ( 672 -424 -112 ) subway/1_concrete_floor -16 0 0 0.500000 0.500000 0 285212672 0 +( 472 -320 -88 ) ( 464 -320 -88 ) ( 464 -320 -56 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 592 -96 -88 ) ( 592 -96 -120 ) ( 600 -96 -120 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 408 -256 -120 ) ( 408 -256 -88 ) ( 408 -640 -88 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 496 -64 -120 ) ( 496 -72 -120 ) ( 496 -68 -112 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 32 +{ +( 1168 104 -104 ) ( 1168 104 -96 ) ( 1232 104 -96 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 0 352321536 0 +( 1304 -376 -104 ) ( 1304 -376 -96 ) ( 1304 -312 -96 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 0 352321536 0 +( 984 280 -104 ) ( 984 280 -96 ) ( 920 280 -96 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 0 352321536 0 +( 1176 64 -96 ) ( 1176 0 -96 ) ( 1112 0 -96 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 0 352321536 0 +( 1112 -16 -104 ) ( 1176 -16 -104 ) ( 1176 48 -104 ) subway/con14 176 80 0 0.500000 0.500000 0 285212672 0 +( 1000 264 -104 ) ( 1000 288 -104 ) ( 1000 276 -96 ) subway/con14 176 80 0 0.500000 0.500000 0 285212672 0 +} +// brush 33 +{ +( 1168 104 -104 ) ( 1168 104 -96 ) ( 1232 104 -96 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 0 352321536 0 +( 984 280 -104 ) ( 984 280 -96 ) ( 920 280 -96 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 0 352321536 0 +( 856 216 -112 ) ( 856 216 -104 ) ( 856 152 -104 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 0 352321536 0 +( 1176 64 -96 ) ( 1176 0 -96 ) ( 1112 0 -96 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 0 352321536 0 +( 1112 -16 -104 ) ( 1176 -16 -104 ) ( 1176 48 -104 ) subway/con14 177 81 0 0.500000 0.500000 0 285212672 0 +( 1000 288 -104 ) ( 1000 264 -104 ) ( 1000 276 -96 ) subway/con14 176 80 0 0.500000 0.500000 0 285212672 0 +} +// brush 34 +{ +( 18 1392 -140 ) ( 18 1392 -100 ) ( -38 1392 -100 ) subway/clip -16 12 0 1 1 131072 144 0 +( -42 1312 -100 ) ( 14 1312 -100 ) ( 14 1312 -140 ) subway/clip -16 12 0 1 1 131072 144 0 +( -44 1352 -134 ) ( -44 1312 -134 ) ( 12 1312 -134 ) subway/clip -16 12 0 1 1 131072 144 0 +( -32 1352 -100 ) ( -32 1312 -100 ) ( -32 1312 -140 ) subway/clip -16 12 0 1 1 131072 144 0 +( 14 1352 -100 ) ( 14 1312 -100 ) ( -42 1312 -100 ) subway/clip -16 12 0 1 1 131072 144 0 +( 14 1352 -140 ) ( 14 1312 -140 ) ( 14 1312 -100 ) subway/clip -16 12 0 1 1 131072 144 0 +} +// brush 35 +{ +( 408 -152 -148 ) ( 400 -152 -148 ) ( 400 -184 -148 ) subway/1_lobby2 32 16 0 0.500000 0.500000 0 285212672 0 +( 400 -184 -120 ) ( 400 -152 -120 ) ( 408 -152 -120 ) subway/1_lobby2 32 16 0 0.500000 0.500000 0 285212672 0 +( 400 -184 -120 ) ( 408 -184 -120 ) ( 408 -184 -152 ) subway/1_lobby2 32 16 0 0.500000 0.500000 0 285212672 0 +( 408 -180 -120 ) ( 408 -148 -120 ) ( 408 -148 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 412 -112 -120 ) ( 404 -112 -120 ) ( 404 -112 -152 ) subway/1_lobby2 32 16 0 0.500000 0.500000 0 285212672 0 +( 400 -152 -120 ) ( 400 -184 -120 ) ( 400 -184 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 36 +{ +( 400 -184 -188 ) ( 408 -184 -188 ) ( 408 -180 -184 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 400 -180 -152 ) ( 408 -180 -152 ) ( 408 -184 -148 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 400 -76 -184 ) ( 400 -76 -152 ) ( 400 -388 -152 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 408 -108 -152 ) ( 408 -108 -184 ) ( 408 -428 -184 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 408 -184 -188 ) ( 400 -184 -188 ) ( 400 -184 -148 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 408 -180 -152 ) ( 400 -180 -152 ) ( 400 -180 -184 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 37 +{ +( 2128 2624 -336 ) ( 2040 2624 -336 ) ( 2040 2616 -336 ) subway/clip 0 0 0 1 1 131072 144 0 +( 2040 2616 -224 ) ( 2040 2624 -224 ) ( 2128 2624 -224 ) subway/clip 0 0 0 1 1 131072 144 0 +( 2040 2616 -264 ) ( 2128 2616 -264 ) ( 2128 2616 -320 ) subway/clip 0 0 0 1 1 131072 144 0 +( 2128 2616 -264 ) ( 2128 2624 -264 ) ( 2128 2624 -320 ) subway/clip 0 0 0 1 1 131072 144 0 +( 2128 2624 -264 ) ( 2040 2624 -264 ) ( 2040 2624 -320 ) subway/clip 0 0 0 1 1 131072 144 0 +( 1872 2632 -264 ) ( 1872 2624 -264 ) ( 1872 2624 -320 ) subway/clip 0 0 0 1 1 131072 144 0 +} +// brush 38 +{ +( -352 1548 -8 ) ( -356 1548 -8 ) ( -356 1544 -8 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -356 1544 0 ) ( -356 1548 0 ) ( -352 1548 0 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -356 1544 4 ) ( -352 1544 4 ) ( -352 1544 -12 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -352 1544 0 ) ( -352 1548 0 ) ( -352 1548 -16 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -352 1548 0 ) ( -356 1548 0 ) ( -356 1548 -16 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -356 1548 8 ) ( -356 1544 8 ) ( -356 1544 -8 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 39 +{ +( -400 1548 4 ) ( -400 1544 4 ) ( -400 1544 -12 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -396 1548 0 ) ( -400 1548 0 ) ( -400 1548 -16 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -396 1544 0 ) ( -396 1548 0 ) ( -396 1548 -16 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -400 1544 4 ) ( -396 1544 4 ) ( -396 1544 -12 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -400 1544 0 ) ( -400 1548 0 ) ( -396 1548 0 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -396 1548 -10 ) ( -400 1548 -10 ) ( -400 1544 -10 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 40 +{ +( -347 1548 -41 ) ( -409 1548 -23 ) ( -409 1540 -23 ) subway/1_black 2 -8 0 0.480652 0.500000 134217728 16777216 0 +( -405 1540 -7 ) ( -405 1548 -7 ) ( -343 1548 -25 ) subway/1_black 9 0 0 0.480652 0.500000 134217728 16777216 0 +( -405 1544 -7 ) ( -343 1544 -25 ) ( -356 1544 -71 ) subway/1_sign2 259 72 -17 0.499989 0.499996 134217728 0 0 +( -343 1540 -25 ) ( -343 1548 -25 ) ( -356 1548 -71 ) subway/1_black 8 -4 0 0.500000 0.480630 134217728 16777216 0 +( -343 1548 -25 ) ( -405 1548 -7 ) ( -418 1548 -54 ) subway/1_sign2 122 -13 164 0.499988 -0.500003 134217728 0 0 +( -405 1548 -7 ) ( -405 1540 -7 ) ( -418 1540 -54 ) subway/1_black 8 -15 0 0.500000 0.480633 134217728 16777216 0 +} +// brush 41 +{ +( 408 -64 -184 ) ( 408 -64 -216 ) ( 408 -384 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 400 -72 -216 ) ( 400 -72 -184 ) ( 400 -384 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 296 -408 -216 ) ( 296 -344 -216 ) ( 232 -344 -216 ) subway/1_lobby1 32 16 0 0.500000 0.500000 0 285212672 0 +( 412 -184 -216 ) ( 400 -184 -216 ) ( 406 -184 -184 ) subway/1_lobby1 32 16 0 0.500000 0.500000 0 285212672 0 +( 412 -152 -188 ) ( 400 -152 -188 ) ( 406 -96 -188 ) subway/1_lobby1 32 16 0 0.500000 0.500000 0 285212672 0 +( 392 -112 -216 ) ( 412 -112 -216 ) ( 402 -112 -188 ) subway/1_lobby1 32 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 42 +{ +( 408 -96 -216 ) ( 408 -96 -184 ) ( 400 -104 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 408 -64 -184 ) ( 408 -64 -216 ) ( 408 -384 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 400 -40 -216 ) ( 400 -40 -184 ) ( 400 -352 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 296 -408 -216 ) ( 296 -344 -216 ) ( 232 -344 -216 ) subway/1_lobby1 32 16 0 0.500000 0.500000 0 285212672 0 +( 416 -152 -184 ) ( 404 -152 -184 ) ( 410 -96 -184 ) subway/1_lobby1 32 16 0 0.500000 0.500000 0 285212672 0 +( 412 -112 -216 ) ( 392 -112 -216 ) ( 402 -112 -188 ) subway/1_lobby1 32 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 43 +{ +( -132 -944 -384 ) ( -164 -944 -384 ) ( -164 -952 -384 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -164 -952 -380 ) ( -164 -944 -380 ) ( -132 -944 -380 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -164 -984 -352 ) ( -132 -984 -352 ) ( -132 -984 -368 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -128 -952 -352 ) ( -128 -944 -352 ) ( -128 -944 -368 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -132 -952 -352 ) ( -164 -952 -352 ) ( -164 -952 -368 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -200 -944 -352 ) ( -200 -952 -352 ) ( -200 -952 -368 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +} +// brush 44 +{ +( -176 -952 -340 ) ( -216 -952 -340 ) ( -216 -992 -340 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -216 -992 -336 ) ( -216 -952 -336 ) ( -176 -952 -336 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -216 -984 -336 ) ( -176 -984 -336 ) ( -176 -984 -384 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -128 -992 -336 ) ( -128 -952 -336 ) ( -128 -952 -384 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -168 -952 -336 ) ( -208 -952 -336 ) ( -208 -952 -384 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -200 -952 -336 ) ( -200 -992 -336 ) ( -200 -992 -384 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +} +// brush 45 +{ +( -192 -952 -384 ) ( -232 -952 -384 ) ( -232 -992 -384 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -232 -992 -336 ) ( -232 -952 -336 ) ( -192 -952 -336 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -232 -984 -336 ) ( -192 -984 -336 ) ( -192 -984 -384 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -200 -992 -336 ) ( -200 -952 -336 ) ( -200 -952 -384 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -184 -952 -336 ) ( -224 -952 -336 ) ( -224 -952 -384 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -216 -952 -336 ) ( -216 -992 -336 ) ( -216 -992 -384 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +} +// brush 46 +{ +( -136 -944 -376 ) ( -168 -944 -376 ) ( -168 -952 -376 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -236 -952 -344 ) ( -236 -944 -344 ) ( -204 -944 -344 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -236 -984 -320 ) ( -204 -984 -320 ) ( -204 -984 -336 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -196 -952 -320 ) ( -196 -944 -320 ) ( -196 -944 -336 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -204 -952 -320 ) ( -236 -952 -320 ) ( -236 -952 -336 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -200 -944 -320 ) ( -200 -952 -320 ) ( -200 -952 -336 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 47 +{ +( -64 -944 -376 ) ( -96 -944 -376 ) ( -96 -952 -376 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -164 -952 -344 ) ( -164 -944 -344 ) ( -132 -944 -344 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -164 -984 -320 ) ( -132 -984 -320 ) ( -132 -984 -336 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -128 -952 -320 ) ( -128 -944 -320 ) ( -128 -944 -336 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -132 -952 -320 ) ( -164 -952 -320 ) ( -164 -952 -336 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -132 -944 -320 ) ( -132 -952 -320 ) ( -132 -952 -336 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 48 +{ +( -132 -944 -344 ) ( -164 -944 -344 ) ( -164 -952 -344 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -164 -952 -340 ) ( -164 -944 -340 ) ( -132 -944 -340 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -164 -984 -312 ) ( -132 -984 -312 ) ( -132 -984 -328 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -128 -952 -312 ) ( -128 -944 -312 ) ( -128 -944 -328 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -132 -952 -312 ) ( -164 -952 -312 ) ( -164 -952 -328 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -200 -944 -312 ) ( -200 -952 -312 ) ( -200 -952 -328 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 49 +{ +( -128 -944 -380 ) ( -160 -944 -380 ) ( -160 -952 -380 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -164 -952 -376 ) ( -164 -944 -376 ) ( -132 -944 -376 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -164 -984 -352 ) ( -132 -984 -352 ) ( -132 -984 -368 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -128 -952 -352 ) ( -128 -944 -352 ) ( -128 -944 -368 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -132 -952 -352 ) ( -164 -952 -352 ) ( -164 -952 -368 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( -200 -944 -352 ) ( -200 -952 -352 ) ( -200 -952 -368 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 50 +{ +( -164 -944 -376 ) ( -196 -944 -376 ) ( -196 -952 -376 ) subway/med_red 0 0 0 0.500000 0.500000 0 0 0 +( -196 -952 -344 ) ( -196 -944 -344 ) ( -164 -944 -344 ) subway/med_red 0 0 0 0.500000 0.500000 0 0 0 +( -196 -984 -344 ) ( -164 -984 -344 ) ( -164 -984 -360 ) subway/med_red 0 0 0 0.500000 0.500000 0 0 0 +( -164 -952 -344 ) ( -164 -944 -344 ) ( -164 -944 -360 ) subway/med_red 0 0 0 0.500000 0.500000 0 0 0 +( -164 -952 -344 ) ( -196 -952 -344 ) ( -196 -952 -360 ) subway/med_red 0 0 0 0.500000 0.500000 0 0 0 +( -196 -944 -344 ) ( -196 -952 -344 ) ( -196 -952 -360 ) subway/med_red 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 51 +{ +( -96 -984 -368 ) ( -96 -984 -328 ) ( -64 -984 -328 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( -76 -952 -360 ) ( -76 -952 -320 ) ( -108 -952 -320 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -64 -1024 -336 ) ( -96 -1024 -336 ) ( -96 -984 -336 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -224 -952 -352 ) ( -224 -992 -352 ) ( -184 -952 -352 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -96 -944 -352 ) ( -96 -976 -352 ) ( -96 -960 -336 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -128 -976 -352 ) ( -128 -952 -352 ) ( -128 -964 -336 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 52 +{ +( -296 -832 -336 ) ( -296 -832 -296 ) ( -296 -872 -296 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( -96 -984 -368 ) ( -96 -984 -328 ) ( -64 -984 -328 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( -76 -952 -360 ) ( -76 -952 -320 ) ( -108 -952 -320 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -64 -1024 -336 ) ( -96 -1024 -336 ) ( -96 -984 -336 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -224 -952 -352 ) ( -224 -992 -352 ) ( -184 -952 -352 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -216 -936 -352 ) ( -216 -960 -352 ) ( -216 -948 -336 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 53 +{ +( -132 -944 -376 ) ( -164 -944 -376 ) ( -164 -952 -376 ) subway/med_sign 24 0 0 0.500000 0.500000 0 0 0 +( -164 -952 -344 ) ( -164 -944 -344 ) ( -132 -944 -344 ) subway/med_sign 24 0 0 0.500000 0.500000 0 0 0 +( -164 -984 -344 ) ( -132 -984 -344 ) ( -132 -984 -360 ) subway/med_sign 24 -16 0 0.500000 0.500000 0 0 0 +( -132 -952 -344 ) ( -132 -944 -344 ) ( -132 -944 -360 ) subway/med_sign 0 -16 0 0.500000 0.500000 0 0 0 +( -132 -952 -344 ) ( -164 -952 -344 ) ( -164 -952 -360 ) subway/med_sign -8 16 0 -0.500000 0.500000 0 0 0 +( -164 -944 -344 ) ( -164 -952 -344 ) ( -164 -952 -360 ) subway/med_sign 0 -16 0 0.500000 0.500000 0 0 0 +} +// brush 54 +{ +( -96 -984 -368 ) ( -96 -984 -328 ) ( -64 -984 -328 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -1008 -360 ) ( 128 -1008 -320 ) ( 128 -968 -320 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( -76 -952 -360 ) ( -76 -952 -320 ) ( -108 -952 -320 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -64 -1024 -336 ) ( -96 -1024 -336 ) ( -96 -984 -336 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -224 -952 -352 ) ( -224 -992 -352 ) ( -184 -952 -352 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -96 -976 -352 ) ( -96 -944 -352 ) ( -96 -960 -336 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 55 +{ +( 400 -116 -152 ) ( 408 -116 -152 ) ( 408 -112 -148 ) subway/med_stripe 0 8 0 0.500000 0.500000 0 0 0 +( 408 -112 -148 ) ( 408 -112 -152 ) ( 408 -160 -152 ) subway/med_stripe 1 0 0 0.500000 0.500000 0 0 0 +( 400 -36 -180 ) ( 400 -36 -148 ) ( 400 -348 -148 ) subway/med_stripe 0 8 0 0.500000 0.500000 0 0 0 +( 232 -344 -148 ) ( 296 -344 -148 ) ( 296 -408 -148 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 408 -180 -152 ) ( 400 -180 -152 ) ( 400 -184 -148 ) subway/med_stripe 0 8 0 0.500000 0.500000 0 0 0 +( 400 -180 -152 ) ( 408 -180 -152 ) ( 408 -116 -152 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 56 +{ +( 408 -112 -188 ) ( 408 -112 -184 ) ( 400 -112 -184 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 408 -112 -184 ) ( 408 -112 -188 ) ( 408 -160 -188 ) subway/med_stripe 1 0 0 0.500000 0.500000 0 0 0 +( 400 -40 -216 ) ( 400 -40 -184 ) ( 400 -352 -184 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 408 -180 -184 ) ( 400 -180 -184 ) ( 400 -112 -184 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 400 -180 -184 ) ( 408 -180 -184 ) ( 408 -184 -188 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 400 -152 -188 ) ( 412 -152 -188 ) ( 406 -96 -188 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 57 +{ +( 408 -72 -184 ) ( 408 -72 -216 ) ( 408 -392 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 400 -320 -216 ) ( 400 -320 -184 ) ( 408 -320 -184 ) subway/1_lobby1 32 16 0 0.500000 0.500000 0 285212672 0 +( 400 -44 -216 ) ( 400 -44 -184 ) ( 400 -356 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 232 -344 -184 ) ( 296 -344 -184 ) ( 296 -408 -184 ) subway/1_lobby1 32 16 0 0.500000 0.500000 0 285212672 0 +( 296 -408 -216 ) ( 296 -344 -216 ) ( 232 -344 -216 ) subway/1_lobby1 32 16 0 0.500000 0.500000 0 285212672 0 +( 400 -184 -216 ) ( 412 -184 -216 ) ( 406 -184 -184 ) subway/1_lobby1 32 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 58 +{ +( 296 -376 -184 ) ( 296 -312 -184 ) ( 232 -312 -184 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 400 -112 -148 ) ( 408 -112 -148 ) ( 408 -116 -152 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 400 -8 -184 ) ( 400 -8 -152 ) ( 400 -320 -152 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 408 -40 -124 ) ( 408 -40 -156 ) ( 408 -360 -156 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 424 -116 -184 ) ( 400 -116 -184 ) ( 412 -116 -152 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +( 408 -112 -148 ) ( 400 -112 -148 ) ( 400 -112 -184 ) subway/med_stripe 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 59 +{ +( 296 -408 -152 ) ( 296 -344 -152 ) ( 232 -344 -152 ) subway/1_lobby2 32 16 0 0.500000 0.500000 0 285212672 0 +( 232 -344 -120 ) ( 296 -344 -120 ) ( 296 -408 -120 ) subway/1_lobby2 32 16 0 0.500000 0.500000 0 285212672 0 +( 400 -40 -152 ) ( 400 -40 -120 ) ( 400 -352 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 408 -64 -120 ) ( 408 -64 -152 ) ( 408 -384 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 408 -96 -152 ) ( 408 -96 -120 ) ( 400 -104 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 416 -112 -152 ) ( 400 -112 -152 ) ( 408 -112 -120 ) subway/1_lobby2 32 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 60 +{ +( 296 -408 -184 ) ( 296 -344 -184 ) ( 232 -344 -184 ) subway/1_lobby2 -32 24 0 0.500000 0.500000 0 285212672 0 +( 232 -344 -152 ) ( 296 -344 -152 ) ( 296 -408 -152 ) subway/1_lobby2 -32 24 0 0.500000 0.500000 0 285212672 0 +( 400 -40 -184 ) ( 400 -40 -152 ) ( 400 -352 -152 ) subway/1_lobby2 0 -40 0 0.500000 0.500000 0 285212672 0 +( 408 -72 -152 ) ( 408 -72 -184 ) ( 408 -392 -184 ) subway/med_sign -24 -48 0 0.500000 0.500000 0 0 0 +( 424 -148 -184 ) ( 400 -148 -184 ) ( 412 -148 -152 ) subway/1_lobby2 -32 -40 0 0.500000 0.500000 0 285212672 0 +( 400 -116 -184 ) ( 416 -116 -184 ) ( 408 -116 -152 ) subway/1_lobby2 -32 -40 0 0.500000 0.500000 0 285212672 0 +} +// brush 61 +{ +( 296 -408 -152 ) ( 296 -344 -152 ) ( 232 -344 -152 ) subway/1_lobby2 32 16 0 0.500000 0.500000 0 285212672 0 +( 232 -344 -120 ) ( 296 -344 -120 ) ( 296 -408 -120 ) subway/1_lobby2 32 16 0 0.500000 0.500000 0 285212672 0 +( 400 -40 -152 ) ( 400 -40 -120 ) ( 400 -352 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 400 -320 -152 ) ( 400 -320 -120 ) ( 408 -320 -120 ) subway/1_lobby2 32 16 0 0.500000 0.500000 0 285212672 0 +( 408 -72 -120 ) ( 408 -72 -152 ) ( 408 -392 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 400 -184 -152 ) ( 424 -184 -152 ) ( 412 -184 -120 ) subway/1_lobby2 32 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 62 +{ +( 408 -96 -184 ) ( 408 -96 -152 ) ( 400 -104 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 408 -64 -152 ) ( 408 -64 -184 ) ( 408 -384 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 400 -8 -184 ) ( 400 -8 -152 ) ( 400 -320 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 232 -344 -152 ) ( 296 -344 -152 ) ( 296 -408 -152 ) subway/1_lobby1a 32 -16 0 0.500000 0.500000 0 285212672 0 +( 296 -408 -184 ) ( 296 -344 -184 ) ( 232 -344 -184 ) subway/1_lobby1a 32 -16 0 0.500000 0.500000 0 285212672 0 +( 416 -112 -184 ) ( 400 -112 -184 ) ( 408 -112 -152 ) subway/1_lobby1a 32 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 63 +{ +( 408 -96 -152 ) ( 408 -96 -184 ) ( 408 -416 -184 ) subway/med_red 0 0 0 1 1 0 0 0 +( 400 -40 -184 ) ( 400 -40 -152 ) ( 400 -352 -152 ) subway/med_red 0 0 0 1 1 0 0 0 +( 232 -376 -152 ) ( 296 -376 -152 ) ( 296 -440 -152 ) subway/med_red 0 0 0 1 1 0 0 0 +( 296 -444 -184 ) ( 296 -380 -184 ) ( 232 -380 -184 ) subway/med_red 0 0 0 1 1 0 0 0 +( 416 -180 -184 ) ( 400 -180 -184 ) ( 408 -180 -152 ) subway/med_red 0 0 0 1 1 0 0 0 +( 400 -148 -184 ) ( 416 -148 -184 ) ( 408 -148 -152 ) subway/med_red 0 0 0 1 1 0 0 0 +} +// brush 64 +{ +( 408 -72 -152 ) ( 408 -72 -184 ) ( 408 -392 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 400 -320 -184 ) ( 400 -320 -152 ) ( 408 -320 -152 ) subway/1_lobby1a 32 -16 0 0.500000 0.500000 0 285212672 0 +( 400 -8 -184 ) ( 400 -8 -152 ) ( 400 -320 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 232 -344 -152 ) ( 296 -344 -152 ) ( 296 -408 -152 ) subway/1_lobby1a 32 -16 0 0.500000 0.500000 0 285212672 0 +( 296 -408 -184 ) ( 296 -344 -184 ) ( 232 -344 -184 ) subway/1_lobby1a 32 -16 0 0.500000 0.500000 0 285212672 0 +( 400 -184 -184 ) ( 416 -184 -184 ) ( 408 -184 -152 ) subway/1_lobby1a 32 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 65 +{ +( -124 1496 -168 ) ( -132 1496 -168 ) ( -132 1488 -168 ) subway/clip 8 0 0 1 1 196608 144 0 +( -132 1488 -80 ) ( -132 1496 -80 ) ( -124 1496 -80 ) subway/clip 8 0 0 1 1 196608 144 0 +( -124 1488 -80 ) ( -124 1496 -80 ) ( -124 1496 -168 ) subway/clip 8 0 0 1 1 196608 144 0 +( -136 1496 -80 ) ( -136 1496 -168 ) ( -124 1496 -168 ) subway/clip 8 0 0 1 1 196608 144 0 +( -136 1496 -168 ) ( -136 1496 -80 ) ( -124 1488 -80 ) subway/clip 8 0 0 1 1 196608 144 0 +} +// brush 66 +{ +( 680 416 -104 ) ( 680 480 -104 ) ( 616 480 -104 ) subway/1_tile -2560 -1248 0 0.500000 0.500000 0 318767104 0 +( 664 496 -64 ) ( 664 552 -64 ) ( 720 552 -64 ) subway/1_tile -2560 -1248 0 0.500000 0.500000 0 318767104 0 +( 688 552 -96 ) ( 688 552 -24 ) ( 680 552 -24 ) subway/1_tile -2560 32 0 0.500000 0.500000 0 318767104 0 +( 720 616 -24 ) ( 720 616 -96 ) ( 720 552 -96 ) subway/1_tile -1408 32 0 0.500000 0.500000 0 318767104 0 +( 680 528 -104 ) ( 680 560 -104 ) ( 680 544 -64 ) subway/1_tile -1408 32 0 0.500000 0.500000 0 318767104 0 +( 704 512 -104 ) ( 680 512 -104 ) ( 692 512 -64 ) subway/1_tile -1408 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 67 +{ +( 18 1392 -174 ) ( 18 1392 -134 ) ( -38 1392 -134 ) subway/clip -16 -22 0 1 1 196608 144 0 +( -42 1312 -134 ) ( 14 1312 -134 ) ( 14 1312 -174 ) subway/clip -16 -22 0 1 1 196608 144 0 +( -44 1352 -168 ) ( -44 1312 -168 ) ( 12 1312 -168 ) subway/clip -16 -22 0 1 1 196608 144 0 +( -32 1352 -134 ) ( -32 1312 -134 ) ( -32 1312 -174 ) subway/clip -16 -22 0 1 1 196608 144 0 +( 14 1352 -136 ) ( 14 1312 -136 ) ( -42 1312 -136 ) subway/clip -16 -22 0 1 1 196608 144 0 +( 14 1352 -174 ) ( 14 1312 -174 ) ( 14 1312 -134 ) subway/clip -16 -22 0 1 1 196608 144 0 +} +// brush 68 +{ +( 1008 1288 -208 ) ( 968 1288 -208 ) ( 968 1264 -208 ) iraq/trigger 0 16 0 1 1 0 144 0 +( 968 1264 -176 ) ( 968 1288 -176 ) ( 1008 1288 -176 ) iraq/trigger 0 16 0 1 1 0 144 0 +( 968 1264 -192 ) ( 1008 1264 -192 ) ( 1008 1264 -208 ) iraq/trigger 0 0 0 1 1 0 144 0 +( 1008 1264 -192 ) ( 1008 1288 -192 ) ( 1008 1288 -208 ) iraq/trigger -16 0 0 1 1 0 144 0 +( 1008 1272 -192 ) ( 968 1272 -192 ) ( 968 1272 -208 ) iraq/trigger 0 0 0 1 1 0 144 0 +( 968 1288 -192 ) ( 968 1264 -192 ) ( 968 1264 -208 ) iraq/trigger -16 0 0 1 1 0 144 0 +} +// brush 69 +{ +( 1976 -860 -552 ) ( 1976 -860 -536 ) ( 1976 -844 -536 ) subway/clip 16 0 0 1 1 134414336 144 0 +( 1982 1352 -408 ) ( 1982 1352 -392 ) ( 1974 1352 -392 ) subway/clip -30 0 0 1 1 134414336 144 0 +( 1974 -20 -368 ) ( 1974 -20 -352 ) ( 1974 -36 -352 ) subway/clip 16 0 0 1 1 134414336 144 0 +( 1970 1680 -312 ) ( 1978 1680 -312 ) ( 1978 1664 -312 ) subway/clip -30 -16 0 1 1 134414336 144 0 +( 1982 1664 -552 ) ( 1982 1680 -552 ) ( 1974 1680 -552 ) subway/clip -30 -16 0 1 1 134414336 144 0 +( 2080 -640 -552 ) ( 1936 -640 -552 ) ( 2008 -640 -312 ) subway/clip -30 0 0 1 1 134414336 144 0 +} +// brush 70 +{ +( 1976 -860 -552 ) ( 1976 -860 -536 ) ( 1976 -844 -536 ) subway/clip 16 0 0 1 1 134414336 144 0 +( 1974 -20 -368 ) ( 1974 -20 -352 ) ( 1974 -36 -352 ) subway/clip 16 0 0 1 1 134414336 144 0 +( 1970 1680 -312 ) ( 1978 1680 -312 ) ( 1978 1664 -312 ) subway/clip -30 -16 0 1 1 134414336 144 0 +( 1982 1664 -552 ) ( 1982 1680 -552 ) ( 1974 1680 -552 ) subway/clip -30 -16 0 1 1 134414336 144 0 +( 2062 -1868 -552 ) ( 1934 -1868 -552 ) ( 1998 -1868 -312 ) subway/clip -30 0 0 1 1 134414336 144 0 +( 1936 -640 -552 ) ( 2080 -640 -552 ) ( 2008 -640 -312 ) subway/clip -30 0 0 1 1 134414336 144 0 +} +// brush 71 +{ +( 3128 -820 -712 ) ( 3192 -820 -712 ) ( 3192 -820 -712 ) subway/1_trim1 8 -15 -90 0.500000 0.500000 0 0 0 +( 3128 -900 -768 ) ( 3128 -900 -736 ) ( 3128 -932 -736 ) subway/1_tunnelwall -15 -16 -180 0.500000 -0.500000 0 301989888 0 +( 3152 -788 -768 ) ( 3152 -788 -736 ) ( 3120 -788 -736 ) subway/1_tunnelwall 24 -16 0 0.500000 0.500000 0 301989888 0 +( 3228 -924 -720 ) ( 3280 -916 -720 ) ( 3176 -916 -720 ) subway/1_tunnelwall 15 -16 -90 0.500000 0.500000 0 301989888 0 +( 3236 -924 -712 ) ( 3208 -916 -712 ) ( 3264 -916 -712 ) subway/1_tunnelwall 15 -16 -90 0.500000 0.500000 0 301989888 0 +( 3192 -788 -712 ) ( 3192 -820 -712 ) ( 3192 -820 -712 ) subway/1_trim1 8 -15 -90 0.500000 0.500000 0 0 0 +} +// brush 72 +{ +( 410 -190 -176 ) ( 426 -190 -176 ) ( 426 -158 -176 ) subway/med_sides -4 -14 -90 1 1 0 0 0 +( 426 -158 -160 ) ( 426 -190 -160 ) ( 410 -190 -160 ) subway/med_sides -4 -14 -90 1 1 0 0 0 +( 408 -158 -184 ) ( 408 -158 -144 ) ( 408 -190 -144 ) subway/med_sides -4 0 -180 1 -1 0 0 0 +( 422 -172 -184 ) ( 422 -172 -144 ) ( 406 -172 -144 ) subway/med_sides 0 0 0 1 1 0 0 0 +( 414 -190 -184 ) ( 414 -190 -144 ) ( 414 -158 -144 ) subway/med_sides -4 0 -180 1 -1 0 0 0 +( 410 -174 -184 ) ( 410 -174 -144 ) ( 426 -174 -144 ) subway/med_sides 0 0 0 1 1 0 0 0 +} +// brush 73 +{ +( 410 -172 -176 ) ( 426 -172 -176 ) ( 426 -140 -176 ) subway/med_sides -4 -14 -90 1 1 0 0 0 +( 426 -140 -160 ) ( 426 -172 -160 ) ( 410 -172 -160 ) subway/med_sides -4 -14 -90 1 1 0 0 0 +( 408 -140 -184 ) ( 408 -140 -144 ) ( 408 -172 -144 ) subway/med_sides -4 0 -180 1 -1 0 0 0 +( 422 -154 -184 ) ( 422 -154 -144 ) ( 406 -154 -144 ) subway/med_sides 0 0 0 1 1 0 0 0 +( 414 -172 -184 ) ( 414 -172 -144 ) ( 414 -140 -144 ) subway/med_sides -4 0 -180 1 -1 0 0 0 +( 410 -156 -184 ) ( 410 -156 -144 ) ( 426 -156 -144 ) subway/med_sides 0 0 0 1 1 0 0 0 +} +// brush 74 +{ +( 410 -190 -160 ) ( 426 -190 -160 ) ( 426 -158 -160 ) subway/med_sides -4 -14 -90 1 1 0 0 0 +( 426 -140 -158 ) ( 426 -172 -158 ) ( 410 -172 -158 ) subway/med_sides -4 -14 -90 1 1 0 0 0 +( 408 -140 -182 ) ( 408 -140 -142 ) ( 408 -172 -142 ) subway/med_sides -4 0 -180 1 -1 0 0 0 +( 422 -154 -182 ) ( 422 -154 -142 ) ( 406 -154 -142 ) subway/med_sides 0 0 0 1 1 0 0 0 +( 414 -172 -182 ) ( 414 -172 -142 ) ( 414 -140 -142 ) subway/med_sides -4 0 -180 1 -1 0 0 0 +( 410 -174 -182 ) ( 410 -174 -142 ) ( 426 -174 -142 ) subway/med_sides 0 0 0 1 1 0 0 0 +} +// brush 75 +{ +( 410 -190 -178 ) ( 426 -190 -178 ) ( 426 -158 -178 ) subway/med_sides -4 -14 -90 1 1 0 0 0 +( 426 -140 -176 ) ( 426 -172 -176 ) ( 410 -172 -176 ) subway/med_sides -4 -14 -90 1 1 0 0 0 +( 408 -140 -200 ) ( 408 -140 -160 ) ( 408 -172 -160 ) subway/med_sides -4 0 -180 1 -1 0 0 0 +( 422 -154 -200 ) ( 422 -154 -160 ) ( 406 -154 -160 ) subway/med_sides 0 0 0 1 1 0 0 0 +( 414 -172 -200 ) ( 414 -172 -160 ) ( 414 -140 -160 ) subway/med_sides -4 0 -180 1 -1 0 0 0 +( 410 -174 -200 ) ( 410 -174 -160 ) ( 426 -174 -160 ) subway/med_sides 0 0 0 1 1 0 0 0 +} +// brush 76 +{ +( 520 -424 -224 ) ( 456 -424 -224 ) ( 456 -488 -224 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 456 -488 -216 ) ( 456 -424 -216 ) ( 520 -424 -216 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 320 -96 -192 ) ( 312 -96 -192 ) ( 312 -96 -160 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 280 -920 -192 ) ( 280 -920 -224 ) ( 280 -1064 -224 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 184 -456 -224 ) ( 184 -456 -192 ) ( 184 -840 -192 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 272 96 -224 ) ( 288 96 -224 ) ( 280 96 -216 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 77 +{ +( 520 -424 -224 ) ( 456 -424 -224 ) ( 456 -488 -224 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 456 -488 -216 ) ( 456 -424 -216 ) ( 520 -424 -216 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 280 -920 -192 ) ( 280 -920 -224 ) ( 280 -1064 -224 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 432 104 -192 ) ( 432 104 -224 ) ( 440 104 -224 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 184 -456 -224 ) ( 184 -456 -192 ) ( 184 -840 -192 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 288 96 -224 ) ( 272 96 -224 ) ( 280 96 -216 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 78 +{ +( 521 -96 -176 ) ( 505 -96 -176 ) ( 505 -100 -176 ) subway/1_black -8 0 0 0.500000 0.500000 0 16777216 0 +( 504 -100 -174 ) ( 504 -96 -174 ) ( 520 -96 -174 ) subway/1_black -8 0 0 0.500000 0.500000 0 16777216 0 +( 486 -98 -174 ) ( 502 -98 -174 ) ( 502 -98 -206 ) subway/metal2 -4 -14 0 1 1 0 16777216 0 +( 506 -100 -174 ) ( 506 -96 -174 ) ( 506 -96 -206 ) subway/1_black 0 -12 0 0.500000 0.500000 0 16777216 0 +( 520 -96 -174 ) ( 504 -96 -174 ) ( 504 -96 -206 ) subway/cargo_elev_but -8 -12 0 0.500000 0.500000 0 0 0 +( 504 -96 -174 ) ( 504 -100 -174 ) ( 504 -100 -206 ) subway/1_black 0 -12 0 0.500000 0.500000 0 16777216 0 +} +// brush 79 +{ +( 527 -96 -176 ) ( 511 -96 -176 ) ( 511 -100 -176 ) subway/1_black -4 0 0 0.500000 0.500000 0 16777216 0 +( 510 -100 -174 ) ( 510 -96 -174 ) ( 526 -96 -174 ) subway/1_black -4 0 0 0.500000 0.500000 0 16777216 0 +( 492 -98 -174 ) ( 508 -98 -174 ) ( 508 -98 -206 ) subway/metal2 -10 -14 0 1 1 0 16777216 0 +( 512 -100 -174 ) ( 512 -96 -174 ) ( 512 -96 -206 ) subway/1_black 0 -12 0 0.500000 0.500000 0 16777216 0 +( 526 -96 -174 ) ( 510 -96 -174 ) ( 510 -96 -206 ) subway/cargo_elev_but -4 -12 0 0.500000 0.500000 0 0 0 +( 510 -96 -174 ) ( 510 -100 -174 ) ( 510 -100 -206 ) subway/1_black 0 -12 0 0.500000 0.500000 0 16777216 0 +} +// brush 80 +{ +( 527 -96 -162 ) ( 511 -96 -162 ) ( 511 -100 -162 ) subway/1_black -4 0 0 0.500000 0.500000 0 16777216 0 +( 510 -100 -160 ) ( 510 -96 -160 ) ( 526 -96 -160 ) subway/1_black -4 0 0 0.500000 0.500000 0 16777216 0 +( 492 -98 -160 ) ( 508 -98 -160 ) ( 508 -98 -192 ) subway/metal2 -10 0 0 1 1 0 16777216 0 +( 512 -100 -160 ) ( 512 -96 -160 ) ( 512 -96 -192 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 526 -96 -160 ) ( 510 -96 -160 ) ( 510 -96 -192 ) subway/cargo_elev_but -4 -16 0 0.500000 0.500000 0 0 0 +( 510 -96 -160 ) ( 510 -100 -160 ) ( 510 -100 -192 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 81 +{ +( 521 -96 -162 ) ( 505 -96 -162 ) ( 505 -100 -162 ) subway/1_black -8 0 0 0.500000 0.500000 0 16777216 0 +( 504 -100 -160 ) ( 504 -96 -160 ) ( 520 -96 -160 ) subway/1_black -8 0 0 0.500000 0.500000 0 16777216 0 +( 486 -98 -160 ) ( 502 -98 -160 ) ( 502 -98 -192 ) subway/metal2 -4 0 0 1 1 0 16777216 0 +( 506 -100 -160 ) ( 506 -96 -160 ) ( 506 -96 -192 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 520 -96 -160 ) ( 504 -96 -160 ) ( 504 -96 -192 ) subway/cargo_elev_but -8 -16 0 0.500000 0.500000 0 0 0 +( 504 -96 -160 ) ( 504 -100 -160 ) ( 504 -100 -192 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 82 +{ +( 525 -96 -174 ) ( 509 -96 -174 ) ( 509 -100 -174 ) subway/metal2 -12 0 0 1 1 0 16777216 0 +( 509 -100 -162 ) ( 509 -96 -162 ) ( 525 -96 -162 ) subway/metal2 -12 0 0 1 1 0 16777216 0 +( 492 -97 -160 ) ( 508 -97 -160 ) ( 508 -97 -192 ) subway/metal_clean 2 0 0 1 1 0 16777216 0 +( 512 -100 -160 ) ( 512 -96 -160 ) ( 512 -96 -192 ) subway/metal2 -4 0 0 1 1 0 16777216 0 +( 525 -96 -160 ) ( 509 -96 -160 ) ( 509 -96 -192 ) subway/metal2 -12 0 0 1 1 0 16777216 0 +( 510 -96 -158 ) ( 510 -100 -158 ) ( 510 -100 -190 ) subway/metal2 -4 0 0 1 1 0 16777216 0 +} +// brush 83 +{ +( 519 -96 -174 ) ( 503 -96 -174 ) ( 503 -100 -174 ) subway/metal2 -6 0 0 1 1 0 16777216 0 +( 503 -100 -162 ) ( 503 -96 -162 ) ( 519 -96 -162 ) subway/metal2 -6 0 0 1 1 0 16777216 0 +( 486 -97 -160 ) ( 502 -97 -160 ) ( 502 -97 -192 ) subway/metal_clean -2 0 0 1 1 0 16777216 0 +( 506 -100 -160 ) ( 506 -96 -160 ) ( 506 -96 -192 ) subway/metal2 -4 0 0 1 1 0 16777216 0 +( 519 -96 -160 ) ( 503 -96 -160 ) ( 503 -96 -192 ) subway/metal2 -6 0 0 1 1 0 16777216 0 +( 504 -96 -160 ) ( 504 -100 -160 ) ( 504 -100 -192 ) subway/metal2 -4 0 0 1 1 0 16777216 0 +} +// brush 84 +{ +( 530 -96 -176 ) ( 514 -96 -176 ) ( 514 -100 -176 ) subway/1_black -12 0 0 0.500000 0.500000 0 16777216 0 +( 514 -100 -160 ) ( 514 -96 -160 ) ( 530 -96 -160 ) subway/1_black -12 0 0 0.500000 0.500000 0 16777216 0 +( 496 -98 -160 ) ( 512 -98 -160 ) ( 512 -98 -192 ) subway/metal2 -14 0 0 1 1 0 16777216 0 +( 516 -100 -160 ) ( 516 -96 -160 ) ( 516 -96 -192 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 528 -96 -160 ) ( 512 -96 -160 ) ( 512 -96 -192 ) subway/cargo_elev_but -12 -16 0 0.500000 0.500000 0 0 0 +( 512 -96 -160 ) ( 512 -100 -160 ) ( 512 -100 -192 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 85 +{ +( 520 -96 -176 ) ( 504 -96 -176 ) ( 504 -100 -176 ) subway/1_black -8 0 0 0.500000 0.500000 0 16777216 0 +( 504 -100 -160 ) ( 504 -96 -160 ) ( 520 -96 -160 ) subway/1_black -8 0 0 0.500000 0.500000 0 16777216 0 +( 486 -98 -160 ) ( 502 -98 -160 ) ( 502 -98 -192 ) subway/metal2 -4 0 0 1 1 0 16777216 0 +( 510 -100 -160 ) ( 510 -96 -160 ) ( 510 -96 -192 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 520 -96 -160 ) ( 504 -96 -160 ) ( 504 -96 -192 ) subway/cargo_elev_but -8 -16 0 0.500000 0.500000 0 0 0 +( 506 -96 -160 ) ( 506 -100 -160 ) ( 506 -100 -192 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 86 +{ +( 516 -96 -176 ) ( 500 -96 -176 ) ( 500 -100 -176 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 500 -100 -160 ) ( 500 -96 -160 ) ( 516 -96 -160 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 482 -98 -160 ) ( 498 -98 -160 ) ( 498 -98 -192 ) subway/metal2 0 0 0 1 1 0 16777216 0 +( 504 -100 -160 ) ( 504 -96 -160 ) ( 504 -96 -192 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 516 -96 -160 ) ( 500 -96 -160 ) ( 500 -96 -192 ) subway/cargo_elev_but 0 -16 0 0.500000 0.500000 0 0 0 +( 500 -96 -160 ) ( 500 -100 -160 ) ( 500 -100 -192 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 87 +{ +( -104 -992 -336 ) ( -104 -1032 -336 ) ( -72 -1032 -336 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -104 -944 -320 ) ( 136 -944 -320 ) ( 136 -984 -320 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -944 -320 ) ( -104 -944 -320 ) ( -96 -952 -336 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( 128 -936 -336 ) ( 128 -936 -296 ) ( 128 -896 -296 ) subway/1_tile 80 -320 0 0.500000 0.500000 0 318767104 0 +( -96 -984 -336 ) ( -104 -984 -320 ) ( -64 -984 -320 ) subway/1_tile 368 -320 0 0.500000 0.500000 0 318767104 0 +( -288 -984 -332 ) ( -288 -984 -336 ) ( -288 -944 -334 ) subway/1_tile 80 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 88 +{ +( -104 -992 -336 ) ( -104 -1032 -336 ) ( -72 -1032 -336 ) subway/1_tile 80 -320 0 0.500000 0.500000 64 318767104 0 +( -104 -944 -320 ) ( 136 -944 -320 ) ( 136 -984 -320 ) subway/1_tile 80 -320 0 0.500000 0.500000 64 318767104 0 +( 136 -944 -320 ) ( -104 -944 -320 ) ( -96 -952 -336 ) subway/1_tile 80 -320 0 0.500000 0.500000 64 318767104 0 +( -96 -984 -336 ) ( -104 -984 -320 ) ( -64 -984 -320 ) subway/1_tile 80 -320 0 0.500000 0.500000 64 318767104 0 +( -304 -792 -320 ) ( -304 -832 -320 ) ( -296 -832 -336 ) subway/1_tile 80 -320 0 0.500000 0.500000 64 318767104 0 +( -288 -984 -336 ) ( -288 -984 -332 ) ( -288 -944 -334 ) subway/1_tile 80 -320 0 0.500000 0.500000 64 318767104 0 +} +// brush 89 +{ +( -104 -984 -320 ) ( -120 -984 -304 ) ( -64 -984 -304 ) subway/1_tile_middle -352 32 0 0.500000 0.500000 0 318767104 0 +( 128 -944 -304 ) ( 128 -944 -264 ) ( 128 -904 -264 ) subway/1_tile_middle 80 -320 0 0.500000 0.500000 0 318767104 0 +( 136 -928 -304 ) ( -120 -928 -304 ) ( -104 -944 -320 ) subway/1_tile_middle 64 64 0 -0.500000 0.500000 0 318767104 0 +( -304 -984 -304 ) ( -304 -928 -304 ) ( 128 -928 -304 ) subway/1_tile 368 -288 0 0.500000 0.500000 0 318767104 0 +( -88 -992 -320 ) ( -88 -1032 -320 ) ( -56 -1032 -320 ) subway/1_tile_middle 368 -64 0 0.500000 0.500000 0 318767104 0 +( -288 -984 -332 ) ( -288 -984 -336 ) ( -288 -928 -334 ) subway/1_tile_middle 368 -64 0 0.500000 0.500000 0 318767104 0 +} +// brush 90 +{ +( -304 -928 -304 ) ( -304 -984 -304 ) ( -304 -984 -320 ) subway/1_tile_middle -352 32 0 0.500000 0.500000 64 318767104 0 +( -104 -984 -320 ) ( -120 -984 -304 ) ( -64 -984 -304 ) subway/1_tile_middle -352 32 0 0.500000 0.500000 64 318767104 0 +( 136 -928 -304 ) ( -120 -928 -304 ) ( -104 -944 -320 ) subway/1_tile_middle -352 32 0 0.500000 0.500000 64 318767104 0 +( -304 -984 -304 ) ( -304 -928 -304 ) ( 128 -928 -304 ) subway/1_tile_middle -352 32 0 0.500000 0.500000 64 318767104 0 +( -88 -992 -320 ) ( -88 -1032 -320 ) ( -56 -1032 -320 ) subway/1_tile_middle -352 32 0 0.500000 0.500000 64 318767104 0 +( -288 -984 -336 ) ( -288 -984 -332 ) ( -288 -928 -334 ) subway/1_tile_middle -352 32 0 0.500000 0.500000 64 318767104 0 +} +// brush 91 +{ +( -480 -1032 -336 ) ( -448 -1032 -336 ) ( -448 -992 -336 ) subway/1_tile 80 -320 0 0.500000 0.500000 64 318767104 0 +( -440 -984 -320 ) ( -480 -984 -320 ) ( -480 -944 -320 ) subway/1_tile 80 -320 0 0.500000 0.500000 64 318767104 0 +( -436 -892 -304 ) ( -468 -892 -304 ) ( -468 -892 -344 ) subway/1_tile 80 -320 0 0.500000 0.500000 64 318767104 0 +( -480 -984 -320 ) ( -440 -984 -320 ) ( -448 -984 -336 ) subway/1_tile 80 -320 0 0.500000 0.500000 64 318767104 0 +( -448 -832 -336 ) ( -440 -832 -320 ) ( -440 -792 -320 ) subway/1_tile 80 -320 0 0.500000 0.500000 64 318767104 0 +( -456 -984 -300 ) ( -456 -984 -336 ) ( -456 -892 -318 ) subway/1_tile 80 -320 0 0.500000 0.500000 64 318767104 0 +} +// brush 92 +{ +( -480 -1032 -336 ) ( -448 -1032 -336 ) ( -448 -992 -336 ) subway/1_tile 672 -80 0 0.500000 0.500000 0 318767104 0 +( -440 -984 -320 ) ( -480 -984 -320 ) ( -480 -944 -320 ) subway/1_tile 672 -80 0 0.500000 0.500000 0 318767104 0 +( -436 -892 -304 ) ( -468 -892 -304 ) ( -468 -892 -344 ) subway/1_tile 672 -320 0 0.500000 0.500000 0 318767104 0 +( -480 -904 -296 ) ( -480 -944 -296 ) ( -480 -944 -336 ) subway/1_tile 80 -320 0 0.500000 0.500000 0 318767104 0 +( -480 -984 -320 ) ( -440 -984 -320 ) ( -448 -984 -336 ) subway/1_tile 672 -320 0 0.500000 0.500000 0 318767104 0 +( -456 -984 -336 ) ( -456 -984 -300 ) ( -456 -892 -318 ) subway/1_tile 80 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 93 +{ +( -440 -984 -320 ) ( -424 -984 -304 ) ( -424 -944 -304 ) subway/1_tile_middle -448 688 90 0.500000 0.500000 64 318767104 0 +( -480 -984 -304 ) ( -424 -984 -304 ) ( -440 -984 -320 ) subway/1_tile_middle -448 704 0 0.500000 0.500000 64 318767104 0 +( -436 -892 -264 ) ( -468 -892 -264 ) ( -468 -892 -304 ) subway/1_tile_middle -448 688 90 0.500000 0.500000 64 318767104 0 +( -424 -984 -304 ) ( -480 -984 -304 ) ( -480 -944 -304 ) subway/1_tile_middle -448 688 90 0.500000 0.500000 64 318767104 0 +( -488 -1032 -320 ) ( -456 -1032 -320 ) ( -456 -992 -320 ) subway/1_tile_middle -448 688 90 0.500000 0.500000 64 318767104 0 +( -456 -984 -300 ) ( -456 -984 -336 ) ( -456 -892 -318 ) subway/1_tile_middle -448 688 90 0.500000 0.500000 64 318767104 0 +} +// brush 94 +{ +( -480 -984 -304 ) ( -424 -984 -304 ) ( -440 -984 -320 ) subway/1_tile_middle -48 32 0 0.500000 0.500000 0 318767104 0 +( -480 -904 -264 ) ( -480 -944 -264 ) ( -480 -944 -304 ) subway/1_tile_middle 80 -320 0 0.500000 0.500000 0 318767104 0 +( -436 -892 -264 ) ( -468 -892 -264 ) ( -468 -892 -304 ) subway/1_tile_middle 672 -320 0 0.500000 0.500000 0 318767104 0 +( -424 -984 -304 ) ( -480 -984 -304 ) ( -480 -944 -304 ) subway/1_tile 672 -288 0 0.500000 0.500000 0 318767104 0 +( -488 -1032 -320 ) ( -456 -1032 -320 ) ( -456 -992 -320 ) subway/1_tile_middle 672 -64 0 0.500000 0.500000 0 318767104 0 +( -456 -984 -336 ) ( -456 -984 -300 ) ( -456 -892 -318 ) subway/1_tile_middle 672 -64 0 0.500000 0.500000 0 318767104 0 +} +// brush 95 +{ +( -480 -1168 -256 ) ( -440 -1168 -256 ) ( -440 -1224 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -440 -1168 -256 ) ( -480 -1168 -256 ) ( -480 -1176 -272 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -480 -1216 -272 ) ( -480 -1224 -256 ) ( -440 -1224 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -448 -1216 -272 ) ( -440 -1216 -256 ) ( -440 -1176 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -448 -1160 -272 ) ( -448 -1152 -272 ) ( -448 -1156 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +} +// brush 96 +{ +( -480 -1264 -272 ) ( -448 -1264 -272 ) ( -448 -1224 -272 ) subway/1_tile 688 -544 0 0.500000 0.500000 0 318767104 0 +( -480 -1168 -256 ) ( -440 -1168 -256 ) ( -440 -1224 -256 ) subway/1_tile 688 -544 0 0.500000 0.500000 0 318767104 0 +( -440 -1168 -256 ) ( -480 -1168 -256 ) ( -480 -1176 -272 ) subway/1_tile 688 -192 0 0.500000 0.500000 0 318767104 0 +( -480 -1136 -232 ) ( -480 -1176 -232 ) ( -480 -1176 -272 ) subway/1_tile 544 -192 0 0.500000 0.500000 0 318767104 0 +( -480 -1216 -272 ) ( -480 -1224 -256 ) ( -440 -1224 -256 ) subway/1_tile 688 -192 0 0.500000 0.500000 0 318767104 0 +( -448 -1152 -272 ) ( -448 -1160 -272 ) ( -448 -1156 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 0 318767104 0 +} +// brush 97 +{ +( -440 -1240 -240 ) ( -440 -1152 -240 ) ( -440 -1168 -256 ) subway/1_tile_middle 688 -160 0 0.500000 0.500000 64 318767104 0 +( -480 -1224 -256 ) ( -480 -1240 -240 ) ( -424 -1240 -240 ) subway/1_tile_middle 688 -144 0 0.500000 0.500000 64 318767104 0 +( -424 -1152 -240 ) ( -480 -1152 -240 ) ( -480 -1168 -256 ) subway/1_tile_middle 688 -160 0 0.500000 0.500000 64 318767104 0 +( -440 -1152 -240 ) ( -440 -1240 -240 ) ( -480 -1240 -240 ) subway/1_tile_middle 688 -160 0 0.500000 0.500000 64 318767104 0 +( -488 -1264 -256 ) ( -456 -1264 -256 ) ( -456 -1224 -256 ) subway/1_tile_middle 688 -160 0 0.500000 0.500000 64 318767104 0 +( -448 -1160 -256 ) ( -448 -1152 -256 ) ( -448 -1156 -240 ) subway/1_tile_middle 688 -160 0 0.500000 0.500000 64 318767104 0 +} +// brush 98 +{ +( -480 -1224 -256 ) ( -480 -1240 -240 ) ( -424 -1240 -240 ) subway/1_tile_middle 688 -176 0 0.500000 0.500000 0 318767104 0 +( -480 -1128 -200 ) ( -480 -1168 -200 ) ( -480 -1168 -240 ) subway/1_tile_middle 544 -192 0 0.500000 0.500000 0 318767104 0 +( -424 -1152 -240 ) ( -480 -1152 -240 ) ( -480 -1168 -256 ) subway/1_tile_middle 688 -192 0 0.500000 0.500000 0 318767104 0 +( -440 -1152 -240 ) ( -440 -1240 -240 ) ( -480 -1240 -240 ) subway/1_tile 688 -752 0 0.500000 0.500000 0 318767104 0 +( -488 -1264 -256 ) ( -456 -1264 -256 ) ( -456 -1224 -256 ) subway/1_tile_middle 688 -528 0 0.500000 0.500000 0 318767104 0 +( -448 -1152 -256 ) ( -448 -1160 -256 ) ( -448 -1156 -240 ) subway/1_tile_middle 688 -528 0 0.500000 0.500000 0 318767104 0 +} +// brush 99 +{ +( -248 -1256 -232 ) ( -248 -1216 -232 ) ( -248 -1216 -272 ) subway/1_tile 544 -224 0 0.500000 0.500000 0 318767104 0 +( -280 -1216 -256 ) ( -248 -1216 -256 ) ( -248 -1216 -296 ) subway/1_tile 320 -224 0 0.500000 0.500000 0 318767104 0 +( -256 -1176 -256 ) ( -288 -1176 -256 ) ( -288 -1176 -296 ) subway/1_tile 320 -224 0 0.500000 0.500000 0 318767104 0 +( -256 -1216 -272 ) ( -256 -1256 -272 ) ( -288 -1256 -272 ) subway/1_tile 320 -544 0 0.500000 0.500000 0 318767104 0 +( -288 -1264 -312 ) ( -256 -1264 -312 ) ( -256 -1224 -312 ) subway/1_tile 320 -544 0 0.500000 0.500000 0 318767104 0 +( -280 -1156 -312 ) ( -280 -1148 -312 ) ( -280 -1152 -272 ) subway/1_tile 320 -544 0 0.500000 0.500000 0 318767104 0 +} +// brush 100 +{ +( -280 -1216 -256 ) ( -248 -1216 -256 ) ( -248 -1216 -296 ) subway/1_tile 320 -224 0 0.500000 0.500000 0 318767104 0 +( -288 -1136 -248 ) ( -288 -1176 -248 ) ( -288 -1176 -288 ) subway/1_tile 544 -224 0 0.500000 0.500000 0 318767104 0 +( -256 -1176 -256 ) ( -288 -1176 -256 ) ( -288 -1176 -296 ) subway/1_tile 320 -224 0 0.500000 0.500000 0 318767104 0 +( -256 -1216 -272 ) ( -256 -1256 -272 ) ( -288 -1256 -272 ) subway/1_tile 320 -544 0 0.500000 0.500000 0 318767104 0 +( -288 -1264 -312 ) ( -256 -1264 -312 ) ( -256 -1224 -312 ) subway/1_tile 320 -544 0 0.500000 0.500000 0 318767104 0 +( -280 -1148 -312 ) ( -280 -1156 -312 ) ( -280 -1152 -272 ) subway/1_tile 320 -544 0 0.500000 0.500000 0 318767104 0 +} +// brush 101 +{ +( -280 -1264 -272 ) ( -248 -1264 -272 ) ( -248 -1224 -272 ) subway/1_tile 320 -544 0 0.500000 0.500000 0 318767104 0 +( -296 -1168 -256 ) ( -240 -1168 -256 ) ( -240 -1224 -256 ) subway/1_tile 320 -544 0 0.500000 0.500000 0 318767104 0 +( -240 -1168 -256 ) ( -296 -1168 -256 ) ( -288 -1176 -272 ) subway/1_tile 320 -192 0 0.500000 0.500000 0 318767104 0 +( -248 -1216 -272 ) ( -240 -1216 -256 ) ( -240 -1176 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 0 318767104 0 +( -96 -1216 -272 ) ( -120 -1216 -272 ) ( -108 -1216 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 0 318767104 0 +( -280 -1156 -272 ) ( -280 -1148 -272 ) ( -280 -1152 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 0 318767104 0 +} +// brush 102 +{ +( -280 -1264 -272 ) ( -248 -1264 -272 ) ( -248 -1224 -272 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -296 -1168 -256 ) ( -240 -1168 -256 ) ( -240 -1224 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -240 -1168 -256 ) ( -296 -1168 -256 ) ( -288 -1176 -272 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -296 -1176 -256 ) ( -296 -1224 -256 ) ( -288 -1216 -272 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -96 -1216 -272 ) ( -120 -1216 -272 ) ( -108 -1216 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -280 -1148 -272 ) ( -280 -1156 -272 ) ( -280 -1152 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +} +// brush 103 +{ +( -240 -1224 -256 ) ( -224 -1224 -240 ) ( -224 -1184 -240 ) subway/1_tile_middle 16 352 90 0.500000 0.500000 0 318767104 0 +( -224 -1152 -240 ) ( -312 -1152 -240 ) ( -296 -1168 -256 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 0 318767104 0 +( -296 -1240 -240 ) ( -296 -1152 -240 ) ( -224 -1152 -240 ) subway/1_tile 320 -752 0 0.500000 0.500000 0 318767104 0 +( -296 -1264 -256 ) ( -264 -1264 -256 ) ( -264 -1224 -256 ) subway/1_tile_middle 320 -528 0 0.500000 0.500000 0 318767104 0 +( -96 -1216 -256 ) ( -120 -1216 -256 ) ( -108 -1216 -240 ) subway/1_tile_middle 320 -528 0 0.500000 0.500000 0 318767104 0 +( -280 -1156 -256 ) ( -280 -1148 -256 ) ( -280 -1152 -240 ) subway/1_tile_middle 320 -528 0 0.500000 0.500000 0 318767104 0 +} +// brush 104 +{ +( -296 -1152 -240 ) ( -296 -1240 -240 ) ( -296 -1224 -256 ) subway/1_tile_middle 320 -32 0 0.500000 0.500000 64 318767104 0 +( -224 -1152 -240 ) ( -312 -1152 -240 ) ( -296 -1168 -256 ) subway/1_tile_middle 320 -32 0 0.500000 0.500000 64 318767104 0 +( -296 -1240 -240 ) ( -296 -1152 -240 ) ( -224 -1152 -240 ) subway/1_tile_middle 320 -32 0 0.500000 0.500000 64 318767104 0 +( -296 -1264 -256 ) ( -264 -1264 -256 ) ( -264 -1224 -256 ) subway/1_tile_middle 320 -32 0 0.500000 0.500000 64 318767104 0 +( -96 -1216 -256 ) ( -120 -1216 -256 ) ( -108 -1216 -240 ) subway/1_tile_middle 320 -32 0 0.500000 0.500000 64 318767104 0 +( -280 -1148 -256 ) ( -280 -1156 -256 ) ( -280 -1152 -240 ) subway/1_tile_middle 320 -32 0 0.500000 0.500000 64 318767104 0 +} +// brush 105 +{ +( 1484 -1912 -528 ) ( 1476 -1912 -528 ) ( 1476 -1944 -528 ) subway/clip 60 0 0 1 1 65536 144 0 +( 1476 -1952 -416 ) ( 1476 -1920 -416 ) ( 1484 -1920 -416 ) subway/clip 60 0 0 1 1 65536 144 0 +( 1484 -2048 -448 ) ( 1492 -2048 -448 ) ( 1492 -2048 -480 ) subway/clip 60 0 0 1 1 65536 144 0 +( 1484 -2048 -448 ) ( 1484 -2016 -448 ) ( 1484 -2016 -480 ) subway/clip 0 0 0 1 1 65536 144 0 +( 1484 -1920 -448 ) ( 1476 -1920 -448 ) ( 1476 -1920 -480 ) subway/clip 60 0 0 1 1 65536 144 0 +( 1468 -1920 -448 ) ( 1468 -1952 -448 ) ( 1468 -1952 -480 ) subway/clip 0 0 0 1 1 65536 144 0 +} +// brush 106 +{ +( 1544 -2080 -456 ) ( 1576 -2080 -456 ) ( 1576 -2080 -488 ) subway/1_tunnelwall -24 32 0 0.500000 0.500000 0 301989888 0 +( 1488 -1920 -456 ) ( 1488 -1888 -456 ) ( 1488 -1888 -488 ) subway/1_tunnelwall 8 32 0 0.500000 0.500000 0 301989888 0 +( 1280 -2048 -432 ) ( 1280 -2048 -400 ) ( 1248 -2080 -400 ) subway/1_tunnelwall 8 32 0 0.500000 0.500000 0 301989888 0 +( 1536 -1968 -416 ) ( 1536 -2024 -416 ) ( 1544 -1996 -416 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -2016 -400 ) ( 1536 -1944 -400 ) ( 1544 -1980 -400 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -2048 -400 ) ( 1280 -2048 -432 ) ( 1552 -2048 -432 ) subway/1_tunnelwall -24 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 107 +{ +( 1488 -1928 -456 ) ( 1488 -1896 -456 ) ( 1488 -1896 -488 ) subway/1_tunnelwall 8 32 0 0.500000 0.500000 0 301989888 0 +( 1440 -1888 -400 ) ( 1440 -1888 -432 ) ( 1552 -1888 -432 ) subway/1_tunnelwall -24 32 0 0.500000 0.500000 0 301989888 0 +( 1440 -1888 -432 ) ( 1440 -1888 -400 ) ( 1408 -1920 -400 ) subway/1_tunnelwall 8 32 0 0.500000 0.500000 0 301989888 0 +( 1536 -1968 -416 ) ( 1536 -2024 -416 ) ( 1544 -1996 -416 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -2016 -400 ) ( 1536 -1944 -400 ) ( 1544 -1980 -400 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -1920 -360 ) ( 1568 -1920 -360 ) ( 1536 -1920 -488 ) subway/1_tunnelwall -24 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 108 +{ +( 1408 -1696 -416 ) ( 1280 -1696 -416 ) ( 1280 -1792 -416 ) subway/no_draw 16 0 0 1 1 0 128 0 +( 1280 -1792 -400 ) ( 1280 -1696 -400 ) ( 1408 -1696 -400 ) subway/no_draw 16 0 0 1 1 0 128 0 +( 1280 -1792 -400 ) ( 1408 -1792 -400 ) ( 1408 -1792 -416 ) subway/no_draw 16 0 0 1 1 0 128 0 +( 1408 -1792 -400 ) ( 1408 -1696 -400 ) ( 1408 -1696 -416 ) subway/no_draw 0 0 0 1 1 0 128 0 +( 1408 -1664 -400 ) ( 1280 -1664 -400 ) ( 1280 -1664 -416 ) subway/no_draw 16 0 0 1 1 0 128 0 +( 1280 -1696 -400 ) ( 1280 -1792 -400 ) ( 1280 -1792 -416 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 109 +{ +( 1424 -1984 -400 ) ( 1408 -1984 -400 ) ( 1408 -2048 -400 ) subway/3_dirt 96 48 0 1 1 0 117440512 0 +( 1408 -2048 -384 ) ( 1408 -1984 -384 ) ( 1424 -1984 -384 ) subway/3_dirt 96 48 0 1 1 0 117440512 0 +( 1424 -2080 -384 ) ( 1440 -2080 -384 ) ( 1440 -2080 -416 ) subway/3_dirt 96 48 0 1 1 0 117440512 0 +( 1488 -2000 -392 ) ( 1488 -1936 -392 ) ( 1488 -1936 -424 ) subway/3_dirt 16 48 0 1 1 0 117440512 0 +( 1424 -1776 -384 ) ( 1408 -1776 -384 ) ( 1408 -1776 -416 ) subway/3_dirt 96 48 0 1 1 0 117440512 0 +( 1248 -1984 -384 ) ( 1248 -2048 -384 ) ( 1248 -2048 -416 ) subway/3_dirt 16 48 0 1 1 0 117440512 0 +} +// brush 110 +{ +( 1384 -1736 -448 ) ( 1312 -1736 -448 ) ( 1312 -1880 -448 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1312 -1880 -416 ) ( 1312 -1736 -416 ) ( 1384 -1736 -416 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1336 -1664 -504 ) ( 1408 -1664 -504 ) ( 1408 -1664 -520 ) subway/no_draw 16 32 0 1 1 0 128 0 +( 1440 -1880 -504 ) ( 1440 -1736 -504 ) ( 1440 -1736 -520 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1368 -1648 -504 ) ( 1296 -1648 -504 ) ( 1296 -1648 -520 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1248 -1736 -504 ) ( 1248 -1880 -504 ) ( 1248 -1880 -520 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 111 +{ +( 1440 -1792 -448 ) ( 1408 -1792 -448 ) ( 1408 -1920 -448 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -1920 -416 ) ( 1408 -1792 -416 ) ( 1440 -1792 -416 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1888 -416 ) ( 1440 -1888 -448 ) ( 1408 -1920 -448 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1888 -448 ) ( 1440 -1888 -416 ) ( 1440 -1792 -416 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1664 -416 ) ( 1408 -1664 -416 ) ( 1408 -1664 -448 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -1792 -416 ) ( 1408 -1920 -416 ) ( 1408 -1920 -448 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 112 +{ +( 1280 -2048 -448 ) ( 1280 -2048 -416 ) ( 1280 -2016 -416 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1376 -1664 -472 ) ( 1344 -1664 -472 ) ( 1344 -1664 -504 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1248 -2008 -472 ) ( 1248 -2040 -472 ) ( 1248 -2040 -504 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1376 -2096 -448 ) ( 1376 -2152 -448 ) ( 1384 -2124 -448 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1376 -2144 -416 ) ( 1376 -2072 -416 ) ( 1384 -2108 -416 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -2048 -416 ) ( 1280 -2048 -448 ) ( 1248 -2080 -448 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 113 +{ +( 1488 -1936 -416 ) ( 1440 -1936 -416 ) ( 1440 -2016 -416 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -2016 -400 ) ( 1440 -1936 -400 ) ( 1488 -1936 -400 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1488 -2016 -400 ) ( 1488 -1936 -400 ) ( 1488 -1936 -416 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1984 -416 ) ( 1488 -1920 -416 ) ( 1464 -1952 -400 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 1488 -2016 -416 ) ( 1440 -1984 -416 ) ( 1464 -2000 -400 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 114 +{ +( 1408 -1904 -416 ) ( 1392 -1904 -416 ) ( 1392 -1936 -416 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1392 -1936 -400 ) ( 1392 -1904 -400 ) ( 1408 -1904 -400 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1392 -1856 -416 ) ( 1392 -1856 -400 ) ( 1408 -1920 -400 ) subway/con14 0 0 0 1 1 0 285212672 0 +( 1408 -1936 -400 ) ( 1408 -1904 -400 ) ( 1408 -1904 -416 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -1792 -400 ) ( 1392 -1792 -400 ) ( 1392 -1792 -416 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1392 -1856 -400 ) ( 1392 -1856 -416 ) ( 1392 -1792 -416 ) subway/con14 0 0 0 1 1 0 285212672 0 +} +// brush 115 +{ +( 1360 -1888 -416 ) ( 1280 -1888 -416 ) ( 1280 -1952 -416 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -1952 -400 ) ( 1280 -1888 -400 ) ( 1360 -1888 -400 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1312 -1936 -400 ) ( 1312 -1936 -416 ) ( 1280 -1920 -416 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1312 -1936 -416 ) ( 1312 -1936 -400 ) ( 1344 -1872 -400 ) subway/con14 0 0 0 1 1 0 285212672 0 +( 1280 -1920 -416 ) ( 1344 -1872 -416 ) ( 1312 -1896 -400 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 116 +{ +( 1432 -1920 -400 ) ( 1432 -1888 -400 ) ( 1464 -1888 -400 ) subway/1_tunnelwall 24 0 0 0.500000 0.500000 0 301989888 0 +( 1448 -1792 -472 ) ( 1416 -1792 -472 ) ( 1416 -1792 -504 ) subway/1_tunnelwall 24 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -1872 -472 ) ( 1280 -1904 -472 ) ( 1280 -1904 -504 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1432 -1944 -416 ) ( 1432 -2016 -416 ) ( 1440 -1980 -416 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1344 -1888 -416 ) ( 1344 -1920 -416 ) ( 1344 -1904 -400 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1344 -1872 -416 ) ( 1280 -1920 -416 ) ( 1312 -1896 -400 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 117 +{ +( 1432 -1920 -400 ) ( 1432 -1888 -400 ) ( 1464 -1888 -400 ) subway/1_tunnelwall 24 0 0 0.500000 0.500000 0 301989888 0 +( 1392 -1856 -400 ) ( 1392 -1856 -416 ) ( 1344 -1872 -416 ) subway/con14 16 0 0 1 1 0 285212672 0 +( 1392 -1792 -400 ) ( 1392 -1792 -416 ) ( 1392 -1856 -416 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1392 -1792 -416 ) ( 1392 -1792 -400 ) ( 1344 -1792 -400 ) subway/1_tunnelwall 24 0 0 0.500000 0.500000 0 301989888 0 +( 1432 -1944 -416 ) ( 1432 -2016 -416 ) ( 1440 -1980 -416 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1344 -1920 -416 ) ( 1344 -1888 -416 ) ( 1344 -1904 -400 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 118 +{ +( 1480 -1920 -400 ) ( 1480 -1888 -400 ) ( 1512 -1888 -400 ) subway/1_tunnelwall -8 0 0 0.500000 0.500000 0 301989888 0 +( 1488 -2048 -472 ) ( 1520 -2048 -472 ) ( 1520 -2048 -504 ) subway/1_tunnelwall -8 0 0 0.500000 0.500000 0 301989888 0 +( 1312 -1936 -416 ) ( 1312 -1936 -400 ) ( 1280 -1920 -400 ) subway/1_tunnelwall -8 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -1888 -472 ) ( 1280 -1920 -472 ) ( 1280 -1920 -504 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1480 -1944 -416 ) ( 1480 -2016 -416 ) ( 1488 -1980 -416 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +( 1360 -1984 -400 ) ( 1360 -1984 -416 ) ( 1408 -2048 -416 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( 1312 -1936 -400 ) ( 1312 -1936 -416 ) ( 1360 -1984 -416 ) subway/con14 0 0 0 1 1 0 285212672 0 +} +// brush 119 +{ +( 1384 -1880 -552 ) ( 1312 -1880 -552 ) ( 1312 -2024 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1312 -2024 -536 ) ( 1312 -1880 -536 ) ( 1384 -1880 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1320 -2048 -536 ) ( 1392 -2048 -536 ) ( 1392 -2048 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1456 -1952 -536 ) ( 1456 -1952 -552 ) ( 1408 -2048 -552 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -1880 -536 ) ( 1280 -2024 -536 ) ( 1280 -2024 -552 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 1456 -1888 -552 ) ( 1456 -1888 -536 ) ( 1280 -1888 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1456 -1888 -536 ) ( 1456 -1888 -552 ) ( 1456 -1952 -552 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 120 +{ +( 2048 -2024 -448 ) ( 2048 -1880 -448 ) ( 1976 -1880 -448 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1976 -1880 -432 ) ( 2048 -1880 -432 ) ( 2048 -2024 -432 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1968 -2096 -448 ) ( 1968 -2096 -432 ) ( 2040 -2096 -432 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 1984 -1880 -448 ) ( 1984 -1880 -432 ) ( 1984 -2024 -432 ) subway/1_tunneltrack_plain 32 16 0 0.500000 0.500000 0 301989888 0 +( 2048 -1872 -448 ) ( 2048 -1872 -432 ) ( 1976 -1872 -432 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 2064 -2024 -448 ) ( 2064 -2024 -432 ) ( 2064 -1880 -432 ) subway/1_tunneltrack_plain 32 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 121 +{ +( 2064 -1904 -480 ) ( 2064 -1872 -480 ) ( 2040 -1872 -480 ) subway/1_tunnelwall 16 -47 90 1 1 0 301989888 0 +( 2040 -1872 -448 ) ( 2064 -1872 -448 ) ( 2064 -1904 -448 ) subway/1_tunnelwall 16 -47 90 1 1 0 301989888 0 +( 2048 -1904 -448 ) ( 2048 -1936 -448 ) ( 2048 -1936 -480 ) subway/1_tunnelwall_pipe -32 -56 0 0.500000 0.500000 0 16777216 0 +( 2048 -2096 -448 ) ( 2072 -2096 -448 ) ( 2072 -2096 -480 ) subway/1_tunnelwall -8 0 -180 1 -1 0 301989888 0 +( 2064 -1872 -448 ) ( 2064 -1872 -480 ) ( 2064 -2096 -480 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 2064 -1872 -480 ) ( 2064 -1872 -448 ) ( 2048 -1872 -448 ) subway/1_tunnelwall -7 0 0 1 1 0 301989888 0 +} +// brush 122 +{ +( 2056 -1904 -488 ) ( 2056 -1872 -488 ) ( 2048 -1872 -488 ) subway/1_trim1 -16 0 90 0.500000 0.500000 0 0 0 +( 2048 -1872 -480 ) ( 2056 -1872 -480 ) ( 2056 -1904 -480 ) subway/1_trim1 -16 0 90 0.500000 0.500000 0 0 0 +( 2048 -1872 -480 ) ( 2048 -1904 -480 ) ( 2048 -1904 -488 ) subway/1_trim1 -16 0 0 0.500000 0.500000 0 0 0 +( 2056 -2096 -480 ) ( 2064 -2096 -480 ) ( 2064 -2096 -488 ) subway/1_trim1 0 0 -180 0.500000 -0.500000 0 0 0 +( 2064 -1872 -480 ) ( 2064 -1872 -488 ) ( 2064 -2096 -488 ) subway/1_trim1 -16 0 0 0.500000 0.500000 0 0 0 +( 2064 -1872 -488 ) ( 2064 -1872 -480 ) ( 2048 -1872 -480 ) subway/1_trim1 -31 0 0 0.500000 0.500000 0 0 0 +} +// brush 123 +{ +( 2056 -1904 -520 ) ( 2056 -1872 -520 ) ( 2048 -1872 -520 ) subway/1_tunnelwall 16 -55 90 1 1 0 301989888 0 +( 2048 -1872 -488 ) ( 2056 -1872 -488 ) ( 2056 -1904 -488 ) subway/1_tunnelwall 16 -55 90 1 1 0 301989888 0 +( 2048 -1872 -488 ) ( 2048 -1904 -488 ) ( 2048 -1904 -496 ) subway/1_tunnelwall 16 -8 0 1 1 0 301989888 0 +( 2056 -2096 -496 ) ( 2064 -2096 -496 ) ( 2064 -2096 -504 ) subway/1_tunnelwall -8 -7 -180 1 -1 0 301989888 0 +( 2064 -1872 -488 ) ( 2064 -1872 -520 ) ( 2064 -2096 -520 ) subway/1_tunnelwall 16 -8 0 1 1 0 301989888 0 +( 2064 -1872 -520 ) ( 2064 -1872 -488 ) ( 2048 -1872 -488 ) subway/1_tunnelwall -7 -8 0 1 1 0 301989888 0 +} +// brush 124 +{ +( 2056 -1904 -536 ) ( 2056 -1872 -536 ) ( 2048 -1872 -536 ) subway/1_tunnelwall_floor 16 -15 90 1 0.500000 0 285212672 0 +( 2048 -1872 -520 ) ( 2056 -1872 -520 ) ( 2056 -1904 -520 ) subway/1_tunnelwall_floor 16 -15 90 1 0.500000 0 285212672 0 +( 2048 -1872 -504 ) ( 2048 -1904 -504 ) ( 2048 -1904 -512 ) subway/1_tunnelwall_floor 16 -16 0 1 0.500000 0 285212672 0 +( 2056 -2096 -512 ) ( 2064 -2096 -512 ) ( 2064 -2096 -520 ) subway/1_tunnelwall_floor -8 -15 -180 1 -0.500000 0 285212672 0 +( 2064 -1872 -520 ) ( 2064 -1872 -536 ) ( 2064 -2096 -536 ) subway/1_tunnelwall_floor 16 -16 0 1 0.500000 0 285212672 0 +( 2064 -1872 -536 ) ( 2064 -1872 -520 ) ( 2048 -1872 -520 ) subway/1_tunnelwall_floor -7 -16 0 1 0.500000 0 285212672 0 +} +// brush 125 +{ +( 1976 -2072 -480 ) ( 1976 -2096 -480 ) ( 2008 -2096 -480 ) subway/1_tunnelwall 8 -16 0 1 1 0 301989888 0 +( 2008 -2096 -448 ) ( 1976 -2096 -448 ) ( 1976 -2072 -448 ) subway/1_tunnelwall 8 -16 0 1 1 0 301989888 0 +( 2040 -2080 -480 ) ( 2040 -2080 -448 ) ( 2008 -2080 -448 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 2048 -2096 -480 ) ( 2048 -2096 -448 ) ( 2048 -2072 -448 ) subway/1_tunnelwall 24 0 0 1 1 0 301989888 0 +( 2048 -2096 -480 ) ( 1992 -2096 -480 ) ( 1992 -2096 -448 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1976 -2080 -448 ) ( 1992 -2096 -448 ) ( 1992 -2096 -480 ) subway/1_tunnelwall 24 0 0 1 1 0 301989888 0 +} +// brush 126 +{ +( 1976 -2080 -488 ) ( 1976 -2088 -488 ) ( 2008 -2088 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 2008 -2088 -480 ) ( 1976 -2088 -480 ) ( 1976 -2080 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 2008 -2080 -488 ) ( 2008 -2080 -480 ) ( 1976 -2080 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 2048 -2088 -488 ) ( 2048 -2088 -480 ) ( 2048 -2080 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 2008 -2088 -488 ) ( 1984 -2088 -488 ) ( 1984 -2088 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1976 -2080 -480 ) ( 1984 -2088 -480 ) ( 1984 -2088 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 127 +{ +( 1976 -2080 -520 ) ( 1976 -2088 -520 ) ( 2008 -2088 -520 ) subway/1_tunnelwall 8 -24 0 1 1 0 301989888 0 +( 2008 -2088 -488 ) ( 1976 -2088 -488 ) ( 1976 -2080 -488 ) subway/1_tunnelwall 8 -24 0 1 1 0 301989888 0 +( 2008 -2080 -496 ) ( 2008 -2080 -488 ) ( 1976 -2080 -488 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 2048 -2088 -504 ) ( 2048 -2088 -496 ) ( 2048 -2080 -496 ) subway/1_tunnelwall 24 -8 0 1 1 0 301989888 0 +( 2008 -2088 -504 ) ( 1984 -2088 -504 ) ( 1984 -2088 -496 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1976 -2080 -496 ) ( 1984 -2088 -496 ) ( 1984 -2088 -504 ) subway/1_tunnelwall 24 -8 0 1 1 0 301989888 0 +} +// brush 128 +{ +( 1976 -2080 -536 ) ( 1976 -2088 -536 ) ( 2008 -2088 -536 ) subway/1_tunnelwall_floor 8 16 0 1 0.500000 0 285212672 0 +( 2008 -2088 -520 ) ( 1976 -2088 -520 ) ( 1976 -2080 -520 ) subway/1_tunnelwall_floor 8 16 0 1 0.500000 0 285212672 0 +( 2008 -2080 -512 ) ( 2008 -2080 -504 ) ( 1976 -2080 -504 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 2048 -2088 -520 ) ( 2048 -2088 -512 ) ( 2048 -2080 -512 ) subway/1_tunnelwall_floor 24 -16 0 1 0.500000 0 285212672 0 +( 2008 -2088 -520 ) ( 1984 -2088 -520 ) ( 1984 -2088 -512 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1976 -2080 -512 ) ( 1984 -2088 -512 ) ( 1984 -2088 -520 ) subway/1_tunnelwall_floor 24 -16 0 1 0.500000 0 285212672 0 +} +// brush 129 +{ +( 2008 -1880 -536 ) ( 1976 -1880 -536 ) ( 1976 -1888 -536 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1976 -1888 -520 ) ( 1976 -1880 -520 ) ( 2008 -1880 -520 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1976 -1888 -504 ) ( 2008 -1888 -504 ) ( 2008 -1888 -512 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 2048 -1888 -512 ) ( 2048 -1880 -512 ) ( 2048 -1880 -520 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1984 -1880 -512 ) ( 1984 -1880 -520 ) ( 2008 -1880 -520 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1984 -1880 -520 ) ( 1984 -1880 -512 ) ( 1976 -1888 -512 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +} +// brush 130 +{ +( 2008 -1880 -520 ) ( 1976 -1880 -520 ) ( 1976 -1888 -520 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1976 -1888 -488 ) ( 1976 -1880 -488 ) ( 2008 -1880 -488 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1976 -1888 -488 ) ( 2008 -1888 -488 ) ( 2008 -1888 -496 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 2048 -1888 -496 ) ( 2048 -1880 -496 ) ( 2048 -1880 -504 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1984 -1880 -496 ) ( 1984 -1880 -504 ) ( 2008 -1880 -504 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1984 -1880 -504 ) ( 1984 -1880 -496 ) ( 1976 -1888 -496 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +} +// brush 131 +{ +( 2008 -1880 -488 ) ( 1976 -1880 -488 ) ( 1976 -1888 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1976 -1888 -480 ) ( 1976 -1880 -480 ) ( 2008 -1880 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1976 -1888 -480 ) ( 2008 -1888 -480 ) ( 2008 -1888 -488 ) subway/1_trim1 0 0 0 -0.500000 0.500000 0 0 0 +( 2048 -1888 -480 ) ( 2048 -1880 -480 ) ( 2048 -1880 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1984 -1880 -480 ) ( 1984 -1880 -488 ) ( 2008 -1880 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1984 -1880 -488 ) ( 1984 -1880 -480 ) ( 1976 -1888 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 132 +{ +( 2008 -1872 -480 ) ( 1976 -1872 -480 ) ( 1976 -1896 -480 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1976 -1896 -448 ) ( 1976 -1872 -448 ) ( 2008 -1872 -448 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 2008 -1888 -448 ) ( 2040 -1888 -448 ) ( 2040 -1888 -480 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 2048 -1896 -448 ) ( 2048 -1872 -448 ) ( 2048 -1872 -480 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1992 -1872 -448 ) ( 1992 -1872 -480 ) ( 2048 -1872 -480 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1992 -1872 -480 ) ( 1992 -1872 -448 ) ( 1976 -1888 -448 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +} +// brush 133 +{ +( 1976 -2152 -520 ) ( 1984 -2152 -520 ) ( 1984 -1880 -520 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1984 -2152 -488 ) ( 1976 -2152 -488 ) ( 1976 -1880 -488 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1976 -1880 -512 ) ( 1976 -1880 -504 ) ( 1976 -1904 -504 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1984 -2088 -488 ) ( 1984 -2088 -520 ) ( 1984 -2752 -520 ) subway/1_tunnelwall 16 -48 0 0.500000 0.500000 0 301989888 0 +( 1976 -2752 -488 ) ( 1984 -2752 -488 ) ( 1984 -2752 -520 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( 1984 -2088 -520 ) ( 1984 -2088 -488 ) ( 1976 -2080 -488 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +} +// brush 134 +{ +( 1976 -2152 -480 ) ( 1984 -2152 -480 ) ( 1984 -1880 -480 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1984 -2152 -448 ) ( 1976 -2152 -448 ) ( 1976 -1880 -448 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1976 -2944 -488 ) ( 1976 -2944 -480 ) ( 1976 -2968 -480 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 1984 -2088 -448 ) ( 1984 -2088 -480 ) ( 1984 -2752 -480 ) subway/1_tunnelwall_pipe 16 -32 0 0.500000 0.500000 0 16777216 0 +( 1976 -2752 -448 ) ( 1984 -2752 -448 ) ( 1984 -2752 -480 ) subway/1_tunnelwall 0 72 0 0.500000 0.500000 0 301989888 0 +( 1984 -2088 -480 ) ( 1984 -2088 -448 ) ( 1976 -2080 -448 ) subway/1_tunnelwall 0 72 0 0.500000 0.500000 0 301989888 0 +} +// brush 135 +{ +( 1984 -2088 -480 ) ( 1984 -2088 -488 ) ( 1984 -2752 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1976 -1760 -480 ) ( 1976 -2048 -480 ) ( 1976 -2048 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1984 -2152 -480 ) ( 1976 -2152 -480 ) ( 1976 -1880 -480 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1976 -2152 -488 ) ( 1984 -2152 -488 ) ( 1984 -1880 -488 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1984 -2752 -488 ) ( 1976 -2752 -488 ) ( 1976 -2752 -480 ) subway/1_tunnelwall 0 72 0 0.500000 0.500000 0 301989888 0 +( 1984 -2088 -488 ) ( 1984 -2088 -480 ) ( 1976 -2080 -480 ) subway/1_tunnelwall 0 72 0 0.500000 0.500000 0 301989888 0 +} +// brush 136 +{ +( 1984 -1748 -352 ) ( 1984 -1748 -344 ) ( 1984 -1724 -344 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 1772 -1880 -384 ) ( 1772 -1880 -376 ) ( 1652 -1880 -376 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -2576 -440 ) ( 1976 -2576 -432 ) ( 1976 -2600 -432 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1976 -2152 -448 ) ( 1984 -2152 -448 ) ( 1984 -1880 -448 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1984 -2152 -416 ) ( 1976 -2152 -416 ) ( 1976 -1880 -416 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 2048 -1984 -448 ) ( 1968 -1984 -448 ) ( 2008 -1984 -416 ) subway/1_tunnelwall 0 64 0 0.500000 0.500000 0 301989888 0 +} +// brush 137 +{ +( 1984 -1748 -352 ) ( 1984 -1748 -344 ) ( 1984 -1724 -344 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -2576 -440 ) ( 1976 -2576 -432 ) ( 1976 -2600 -432 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1976 -2152 -448 ) ( 1984 -2152 -448 ) ( 1984 -1880 -448 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1984 -2152 -416 ) ( 1976 -2152 -416 ) ( 1976 -1880 -416 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1984 -2752 -448 ) ( 1976 -2752 -448 ) ( 1976 -2752 -416 ) subway/1_tunnelwall 0 64 0 0.500000 0.500000 0 301989888 0 +( 1968 -1984 -448 ) ( 2048 -1984 -448 ) ( 2008 -1984 -416 ) subway/1_tunnelwall 0 64 0 0.500000 0.500000 0 301989888 0 +} +// brush 138 +{ +( 1984 -1748 -352 ) ( 1984 -1748 -344 ) ( 1984 -1724 -344 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -2048 -440 ) ( 1976 -2048 -432 ) ( 1976 -2072 -432 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1976 -2208 -416 ) ( 1984 -2208 -416 ) ( 1984 -1880 -416 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1944 -2408 -352 ) ( 1944 -2336 -352 ) ( 1968 -2336 -352 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1944 -1880 -256 ) ( 1968 -1880 -416 ) ( 1968 -1880 -256 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 2048 -1984 -416 ) ( 1968 -1984 -416 ) ( 2008 -1984 -352 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +} +// brush 139 +{ +( 1984 -1748 -352 ) ( 1984 -1748 -344 ) ( 1984 -1724 -344 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -2048 -440 ) ( 1976 -2048 -432 ) ( 1976 -2072 -432 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1976 -2208 -416 ) ( 1984 -2208 -416 ) ( 1984 -1880 -416 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1944 -2408 -352 ) ( 1944 -2336 -352 ) ( 1968 -2336 -352 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1976 -2752 -416 ) ( 1976 -2752 -400 ) ( 1984 -2752 -408 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1968 -1984 -416 ) ( 2048 -1984 -416 ) ( 2008 -1984 -352 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +} +// brush 140 +{ +( 1992 -1748 -352 ) ( 1992 -1748 -344 ) ( 1992 -1724 -344 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 1772 -1880 -384 ) ( 1772 -1880 -376 ) ( 1652 -1880 -376 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -2576 -440 ) ( 1976 -2576 -432 ) ( 1976 -2600 -432 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1968 -2836 -288 ) ( 1968 -2788 -288 ) ( 1976 -2788 -288 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1944 -2408 -352 ) ( 1968 -2336 -352 ) ( 1944 -2336 -352 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 2048 -1984 -352 ) ( 1968 -1984 -352 ) ( 2008 -1984 -288 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 141 +{ +( 1992 -1748 -352 ) ( 1992 -1748 -344 ) ( 1992 -1724 -344 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -2576 -440 ) ( 1976 -2576 -432 ) ( 1976 -2600 -432 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1968 -2836 -288 ) ( 1968 -2788 -288 ) ( 1976 -2788 -288 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1960 -2760 -336 ) ( 1968 -2760 -336 ) ( 1960 -2760 -448 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1944 -2408 -352 ) ( 1968 -2336 -352 ) ( 1944 -2336 -352 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1968 -1984 -352 ) ( 2048 -1984 -352 ) ( 2008 -1984 -288 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 142 +{ +( 1976 -2168 -536 ) ( 1984 -2168 -536 ) ( 1984 -1880 -536 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1672 -1836 -520 ) ( 1792 -1836 -520 ) ( 1792 -1860 -520 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1976 -1904 -528 ) ( 1976 -1904 -520 ) ( 1976 -1928 -520 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1984 -2088 -520 ) ( 1984 -2088 -536 ) ( 1984 -2752 -536 ) subway/con6 16 -16 0 0.500000 0.500000 0 285212672 0 +( 1976 -2752 -552 ) ( 1976 -2752 -512 ) ( 1984 -2752 -532 ) subway/1_tunnelwall_floor 8 -48 0 0.500000 0.500000 0 285212672 0 +( 1984 -2088 -536 ) ( 1984 -2088 -520 ) ( 1976 -2080 -520 ) subway/1_tunnelwall_floor 8 -48 0 0.500000 0.500000 0 285212672 0 +} +// brush 143 +{ +( 2048 -2024 -552 ) ( 2048 -1880 -552 ) ( 1976 -1880 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1976 -1880 -536 ) ( 2048 -1880 -536 ) ( 2048 -2024 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1968 -2048 -552 ) ( 1968 -2048 -536 ) ( 2040 -2048 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1952 -1880 -552 ) ( 1952 -1880 -536 ) ( 1952 -2024 -536 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 2048 -1920 -552 ) ( 2048 -1920 -536 ) ( 1976 -1920 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 2048 -2024 -552 ) ( 2048 -2024 -536 ) ( 2048 -1880 -536 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 144 +{ +( 2040 -2056 -552 ) ( 2040 -1912 -552 ) ( 1968 -1912 -552 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( 1968 -1912 -536 ) ( 2040 -1912 -536 ) ( 2040 -2056 -536 ) subway/1_tunnelfloor_2 3 0 0 1 1 0 285212672 0 +( 1976 -2080 -552 ) ( 1976 -2080 -536 ) ( 2032 -2080 -536 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( 1952 -2048 -552 ) ( 1952 -2048 -536 ) ( 1976 -2080 -536 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1952 -2048 -536 ) ( 1952 -2048 -552 ) ( 2032 -2048 -552 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( 2048 -2080 -536 ) ( 2048 -2048 -536 ) ( 2048 -2048 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 145 +{ +( 1968 -2056 -552 ) ( 2040 -2056 -552 ) ( 2040 -1912 -552 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( 2040 -1912 -536 ) ( 2040 -2056 -536 ) ( 1968 -2056 -536 ) subway/1_tunnelfloor_2 3 0 0 1 -1 0 285212672 0 +( 1976 -1888 -536 ) ( 1976 -1888 -552 ) ( 2032 -1888 -552 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( 1952 -1920 -536 ) ( 1952 -1920 -552 ) ( 1976 -1888 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1952 -1920 -552 ) ( 1952 -1920 -536 ) ( 2032 -1920 -536 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( 2048 -1888 -552 ) ( 2048 -1920 -552 ) ( 2048 -1920 -536 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 146 +{ +( 516 -98 -216 ) ( 516 -96 -216 ) ( 500 -96 -216 ) subway/clip 0 0 0 1 1 196608 144 0 +( 516 -94 -136 ) ( 516 -96 -136 ) ( 502 -96 -136 ) subway/clip 0 0 0 1 1 196608 144 0 +( 512 -98 -144 ) ( 512 -98 -216 ) ( 500 -98 -216 ) subway/clip 0 0 0 1 1 196608 144 0 +( 516 -98 -216 ) ( 516 -98 -144 ) ( 518 -96 -144 ) subway/clip 0 0 0 1 1 196608 144 0 +( 500 -96 -106 ) ( 500 -96 -178 ) ( 514 -96 -178 ) subway/clip 0 0 0 1 1 196608 144 0 +( 498 -96 -216 ) ( 498 -96 -144 ) ( 500 -98 -144 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 147 +{ +( -592 3040 -208 ) ( -704 3040 -208 ) ( -704 3008 -208 ) iraq/trigger 0 0 0 1 1 0 144 0 +( -704 3008 -128 ) ( -704 3040 -128 ) ( -592 3040 -128 ) iraq/trigger 0 0 0 1 1 0 144 0 +( -704 3008 -128 ) ( -592 3008 -128 ) ( -592 3008 -208 ) iraq/trigger 0 0 0 1 1 0 144 0 +( -592 3008 -128 ) ( -592 3040 -128 ) ( -592 3040 -208 ) iraq/trigger 0 0 0 1 1 0 144 0 +( -592 3040 -128 ) ( -704 3040 -128 ) ( -704 3040 -208 ) iraq/trigger 0 0 0 1 1 0 144 0 +( -704 3040 -128 ) ( -704 3008 -128 ) ( -704 3008 -208 ) iraq/trigger 0 0 0 1 1 0 144 0 +} +// brush 148 +{ +( 876 408 -536 ) ( 876 424 -536 ) ( 880 424 -528 ) subway/1_trim1 -32 0 0 0.500000 0.500000 134217728 0 0 +( 876 428 -536 ) ( 900 428 -536 ) ( 896 424 -528 ) subway/1_trim1 -80 0 0 0.500000 0.500000 134217728 0 0 +( 900 424 -536 ) ( 900 408 -536 ) ( 896 408 -528 ) subway/1_trim1 -32 0 0 0.500000 0.500000 134217728 0 0 +( 900 404 -536 ) ( 876 404 -536 ) ( 880 408 -528 ) subway/1_trim1 -80 0 0 0.500000 0.500000 134217728 0 0 +( 880 408 -528 ) ( 880 424 -528 ) ( 896 424 -528 ) subway/metalfloor1 -80 32 0 0.500000 0.500000 134217728 16777216 0 +( 876 404 -536 ) ( 900 404 -536 ) ( 900 428 -536 ) subway/1_trim1 -80 32 0 0.500000 0.500000 134217728 0 0 +} +// brush 149 +{ +( 896 424 -528 ) ( 880 424 -528 ) ( 880 408 -528 ) subway/metalrib1 -72 32 0 0.500000 0.500000 134217728 16777216 0 +( 880 408 -476 ) ( 880 424 -476 ) ( 896 424 -476 ) subway/metalrib1 -72 32 0 0.500000 0.500000 134217728 16777216 0 +( 880 412 -520 ) ( 896 412 -520 ) ( 896 412 -528 ) subway/metalrib1 -72 0 0 0.500000 0.500000 134217728 16777216 0 +( 892 412 -520 ) ( 892 428 -520 ) ( 892 428 -528 ) subway/metalrib1 -24 0 0 0.500000 0.500000 134217728 16777216 0 +( 896 420 -520 ) ( 880 420 -520 ) ( 880 420 -528 ) subway/metalrib1 -72 0 0 0.500000 0.500000 134217728 16777216 0 +( 884 420 -520 ) ( 884 404 -520 ) ( 884 404 -528 ) subway/metalrib1 -24 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 150 +{ +( 896 424 -488 ) ( 880 424 -488 ) ( 880 408 -488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 880 408 -472 ) ( 880 424 -472 ) ( 896 424 -472 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 880 408 -476 ) ( 896 408 -476 ) ( 896 408 -528 ) subway/button2a 0 -16 0 0.500000 0.500000 0 16777216 0 +( 896 408 -476 ) ( 896 424 -476 ) ( 896 424 -528 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 896 424 -476 ) ( 880 424 -476 ) ( 880 424 -528 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 880 424 -476 ) ( 880 408 -476 ) ( 880 408 -528 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 151 +{ +( 720 949 -184 ) ( 656 949 -184 ) ( 656 885 -184 ) subway/skip 0 -8 0 1 1 0 656 0 +( 656 885 -24 ) ( 656 949 -24 ) ( 720 949 -24 ) subway/skip 0 -8 0 1 1 0 656 0 +( 464 1029 -336 ) ( 464 1093 -336 ) ( 464 1093 -344 ) subway/hint 8 -16 0 1 1 0 400 0 +( 648 1128 -336 ) ( 584 1128 -336 ) ( 584 1128 -344 ) subway/hint 0 -16 0 1 1 0 400 0 +( 400 965 -336 ) ( 400 901 -336 ) ( 400 901 -344 ) subway/hint 8 -16 0 1 1 0 400 0 +( 488 960 -192 ) ( 456 960 -192 ) ( 472 960 -184 ) subway/hint 0 -16 0 1 1 0 400 0 +} +// brush 152 +{ +( 1376 -1376 -552 ) ( 1368 -1376 -552 ) ( 1368 -1504 -552 ) subway/clip 32 32 0 1 1 196608 144 0 +( 1368 -1504 -432 ) ( 1368 -1376 -432 ) ( 1376 -1376 -432 ) subway/clip 32 32 0 1 1 196608 144 0 +( 1368 -1504 -448 ) ( 1376 -1504 -448 ) ( 1376 -1504 -504 ) subway/clip 32 0 0 1 1 196608 144 0 +( 1376 -1504 -448 ) ( 1376 -1376 -448 ) ( 1376 -1376 -504 ) subway/clip -32 0 0 1 1 196608 144 0 +( 1376 -1376 -448 ) ( 1368 -1376 -448 ) ( 1368 -1376 -504 ) subway/clip 32 0 0 1 1 196608 144 0 +( 1368 -1376 -448 ) ( 1368 -1504 -448 ) ( 1368 -1504 -504 ) subway/clip -32 0 0 1 1 196608 144 0 +} +// brush 153 +{ +( 1384 -1880 -552 ) ( 1312 -1880 -552 ) ( 1312 -2024 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1312 -2024 -536 ) ( 1312 -1880 -536 ) ( 1384 -1880 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -2024 -536 ) ( 1408 -1880 -536 ) ( 1408 -1880 -552 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 1368 -1664 -536 ) ( 1296 -1664 -536 ) ( 1296 -1664 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -1880 -536 ) ( 1280 -2024 -536 ) ( 1280 -2024 -552 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -1888 -552 ) ( 1344 -1888 -552 ) ( 1376 -1888 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 154 +{ +( 1464 -1880 -552 ) ( 1392 -1880 -552 ) ( 1392 -2024 -552 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1488 -1952 -544 ) ( 1408 -1952 -544 ) ( 1408 -1920 -536 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1488 -2024 -536 ) ( 1488 -1880 -536 ) ( 1488 -1880 -552 ) subway/3_dirt 0 0 0 1 1 0 117440512 0 +( 1464 -1920 -536 ) ( 1392 -1920 -536 ) ( 1392 -1920 -552 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1408 -1880 -536 ) ( 1408 -2024 -536 ) ( 1408 -2024 -552 ) subway/3_dirt 0 0 0 1 1 0 117440512 0 +( 1408 -1952 -544 ) ( 1488 -1952 -544 ) ( 1488 -1952 -552 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +} +// brush 155 +{ +( 1464 -1880 -552 ) ( 1392 -1880 -552 ) ( 1392 -2024 -552 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1392 -2024 -544 ) ( 1392 -1880 -544 ) ( 1464 -1880 -544 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1488 -2024 -536 ) ( 1488 -1880 -536 ) ( 1488 -1880 -552 ) subway/3_dirt 0 0 0 1 1 0 117440512 0 +( 1408 -1880 -536 ) ( 1408 -2024 -536 ) ( 1408 -2024 -552 ) subway/3_dirt 0 0 0 1 1 0 117440512 0 +( 1424 -2016 -552 ) ( 1408 -2016 -552 ) ( 1416 -2016 -536 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1408 -1952 -552 ) ( 1456 -1952 -552 ) ( 1432 -1952 -536 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +} +// brush 156 +{ +( 1464 -1880 -552 ) ( 1392 -1880 -552 ) ( 1392 -2024 -552 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1408 -2016 -544 ) ( 1488 -2016 -544 ) ( 1488 -2048 -536 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1400 -2048 -536 ) ( 1472 -2048 -536 ) ( 1472 -2048 -552 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1488 -2024 -536 ) ( 1488 -1880 -536 ) ( 1488 -1880 -552 ) subway/3_dirt 0 0 0 1 1 0 117440512 0 +( 1408 -1880 -536 ) ( 1408 -2024 -536 ) ( 1408 -2024 -552 ) subway/3_dirt 0 0 0 1 1 0 117440512 0 +( 1488 -2016 -544 ) ( 1408 -2016 -544 ) ( 1408 -2016 -552 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +} +// brush 157 +{ +( 1480 -1848 -552 ) ( 1408 -1848 -552 ) ( 1408 -1992 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -1992 -536 ) ( 1408 -1848 -536 ) ( 1480 -1848 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1456 -1952 -544 ) ( 1456 -1952 -528 ) ( 1488 -1968 -528 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1488 -1992 -536 ) ( 1488 -1848 -536 ) ( 1488 -1848 -552 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 1456 -1920 -536 ) ( 1456 -1920 -552 ) ( 1488 -1920 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1456 -1920 -552 ) ( 1456 -1920 -536 ) ( 1456 -1952 -536 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 158 +{ +( 1544 -1928 -472 ) ( 1544 -1896 -472 ) ( 1544 -1896 -504 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1888 -416 ) ( 1440 -1888 -448 ) ( 1552 -1888 -448 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1888 -448 ) ( 1440 -1888 -416 ) ( 1408 -1920 -416 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -1968 -448 ) ( 1536 -2024 -448 ) ( 1544 -1996 -448 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -2016 -416 ) ( 1536 -1944 -416 ) ( 1544 -1980 -416 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -1920 -376 ) ( 1568 -1920 -376 ) ( 1536 -1920 -504 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 159 +{ +( 1544 -2080 -472 ) ( 1576 -2080 -472 ) ( 1576 -2080 -504 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1544 -1928 -472 ) ( 1544 -1896 -472 ) ( 1544 -1896 -504 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -2048 -448 ) ( 1280 -2048 -416 ) ( 1248 -2080 -416 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -1968 -448 ) ( 1536 -2024 -448 ) ( 1544 -1996 -448 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -2016 -416 ) ( 1536 -1944 -416 ) ( 1544 -1980 -416 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -2048 -416 ) ( 1280 -2048 -448 ) ( 1552 -2048 -448 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 160 +{ +( 1384 -1736 -552 ) ( 1312 -1736 -552 ) ( 1312 -1880 -552 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1312 -1880 -448 ) ( 1312 -1736 -448 ) ( 1384 -1736 -448 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1336 -1664 -536 ) ( 1408 -1664 -536 ) ( 1408 -1664 -552 ) subway/no_draw 16 0 0 1 1 0 128 0 +( 1440 -1880 -536 ) ( 1440 -1736 -536 ) ( 1440 -1736 -552 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1368 -1648 -536 ) ( 1296 -1648 -536 ) ( 1296 -1648 -552 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1248 -1736 -536 ) ( 1248 -1880 -536 ) ( 1248 -1880 -552 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 161 +{ +( 1544 -2080 -496 ) ( 1576 -2080 -496 ) ( 1576 -2080 -528 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1544 -1928 -496 ) ( 1544 -1896 -496 ) ( 1544 -1896 -528 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1280 -2048 -504 ) ( 1280 -2048 -472 ) ( 1248 -2080 -472 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1536 -1976 -488 ) ( 1536 -2024 -488 ) ( 1544 -2000 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1536 -2040 -480 ) ( 1536 -1936 -480 ) ( 1544 -1988 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1280 -2048 -472 ) ( 1280 -2048 -504 ) ( 1552 -2048 -504 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 162 +{ +( 1280 -2048 -480 ) ( 1280 -2048 -448 ) ( 1280 -2016 -448 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 1376 -1664 -504 ) ( 1344 -1664 -504 ) ( 1344 -1664 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1248 -2008 -504 ) ( 1248 -2040 -504 ) ( 1248 -2040 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1376 -2096 -480 ) ( 1376 -2152 -480 ) ( 1384 -2124 -480 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1376 -2144 -448 ) ( 1376 -2072 -448 ) ( 1384 -2108 -448 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -2048 -448 ) ( 1280 -2048 -480 ) ( 1248 -2080 -480 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +} +// brush 163 +{ +( 1408 -2016 -536 ) ( 1376 -2016 -536 ) ( 1376 -2048 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -2048 -528 ) ( 1280 -2048 -512 ) ( 1280 -2016 -512 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1392 -1664 -504 ) ( 1360 -1664 -504 ) ( 1360 -1664 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1248 -2008 -504 ) ( 1248 -2040 -504 ) ( 1248 -2040 -536 ) subway/1_tunnelwall_floor 40 -16 0 1 0.500000 0 285212672 0 +( 1376 -2152 -520 ) ( 1376 -2104 -520 ) ( 1384 -2128 -520 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -2048 -512 ) ( 1280 -2048 -528 ) ( 1248 -2080 -528 ) subway/1_tunnelwall_floor 40 -16 0 1 0.500000 0 285212672 0 +} +// brush 164 +{ +( 1280 -2048 -512 ) ( 1280 -2048 -480 ) ( 1280 -2016 -480 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1392 -1664 -504 ) ( 1360 -1664 -504 ) ( 1360 -1664 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1248 -2008 -504 ) ( 1248 -2040 -504 ) ( 1248 -2040 -536 ) subway/1_tunnelwall 40 -8 0 1 1 0 301989888 0 +( 1376 -2104 -520 ) ( 1376 -2152 -520 ) ( 1384 -2128 -520 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1376 -2168 -488 ) ( 1376 -2064 -488 ) ( 1384 -2116 -488 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -2048 -480 ) ( 1280 -2048 -512 ) ( 1248 -2080 -512 ) subway/1_tunnelwall 40 -8 0 1 1 0 301989888 0 +} +// brush 165 +{ +( 1272 -1664 -520 ) ( 1272 -1664 -488 ) ( 1240 -1664 -488 ) subway/1_trim1 0 0 -180 0.500000 -0.500000 0 0 0 +( 1280 -1936 -496 ) ( 1280 -2048 -496 ) ( 1280 -2048 -464 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1248 -2080 -464 ) ( 1280 -2048 -464 ) ( 1280 -2048 -496 ) subway/1_trim1 1 0 0 0.500000 0.500000 0 0 0 +( 1168 -1944 -488 ) ( 1144 -1952 -488 ) ( 1192 -1952 -488 ) subway/1_trim1 30 -31 90 0.500000 0.500000 0 0 0 +( 1180 -1944 -480 ) ( 1232 -1952 -480 ) ( 1128 -1952 -480 ) subway/1_trim1 30 -31 90 0.500000 0.500000 0 0 0 +( 1248 -1952 -520 ) ( 1248 -1920 -392 ) ( 1248 -1952 -392 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 166 +{ +( 1432 -1664 -520 ) ( 1432 -1664 -488 ) ( 1400 -1664 -488 ) subway/1_trim1 0 0 -180 0.500000 -0.500000 0 0 0 +( 1440 -1776 -496 ) ( 1440 -1888 -496 ) ( 1440 -1888 -464 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1408 -1920 -464 ) ( 1440 -1888 -464 ) ( 1440 -1888 -496 ) subway/1_trim1 -31 0 0 0.500000 0.500000 0 0 0 +( 1328 -1784 -488 ) ( 1304 -1792 -488 ) ( 1352 -1792 -488 ) subway/1_trim1 0 0 90 0.500000 0.500000 0 0 0 +( 1340 -1784 -480 ) ( 1392 -1792 -480 ) ( 1288 -1792 -480 ) subway/1_trim1 0 0 90 0.500000 0.500000 0 0 0 +( 1408 -1792 -520 ) ( 1408 -1760 -392 ) ( 1408 -1792 -392 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 167 +{ +( 1544 -1928 -488 ) ( 1544 -1896 -488 ) ( 1544 -1896 -520 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1440 -1888 -464 ) ( 1440 -1888 -496 ) ( 1552 -1888 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1440 -1888 -496 ) ( 1440 -1888 -464 ) ( 1408 -1920 -464 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1536 -1976 -488 ) ( 1536 -2024 -488 ) ( 1544 -2000 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1536 -2040 -480 ) ( 1536 -1936 -480 ) ( 1544 -1988 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1536 -1920 -392 ) ( 1568 -1920 -392 ) ( 1536 -1920 -520 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 168 +{ +( 1440 -1888 -512 ) ( 1440 -1888 -480 ) ( 1440 -1856 -480 ) subway/1_tunnelwall -24 -8 0 1 1 0 301989888 0 +( 1552 -1664 -504 ) ( 1520 -1664 -504 ) ( 1520 -1664 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -1848 -504 ) ( 1408 -1880 -504 ) ( 1408 -1880 -536 ) subway/no_draw 0 0 0 1 1 0 128 0 +( 1536 -1944 -520 ) ( 1536 -1992 -520 ) ( 1544 -1968 -520 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -2008 -488 ) ( 1536 -1904 -488 ) ( 1544 -1956 -488 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1888 -480 ) ( 1440 -1888 -512 ) ( 1408 -1920 -512 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +} +// brush 169 +{ +( 1568 -1856 -536 ) ( 1536 -1856 -536 ) ( 1536 -1888 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1760 -528 ) ( 1440 -1760 -512 ) ( 1440 -1728 -512 ) subway/1_tunnelwall_floor -24 -16 0 1 0.500000 0 285212672 0 +( 1552 -1664 -504 ) ( 1520 -1664 -504 ) ( 1520 -1664 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -1848 -504 ) ( 1408 -1880 -504 ) ( 1408 -1880 -536 ) subway/no_draw 0 0 0 1 1 0 128 0 +( 1536 -1992 -520 ) ( 1536 -1944 -520 ) ( 1544 -1968 -520 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1888 -512 ) ( 1440 -1888 -528 ) ( 1408 -1920 -528 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +} +// brush 170 +{ +( 1440 -1888 -480 ) ( 1440 -1888 -448 ) ( 1440 -1856 -448 ) subway/1_tunnelwall_pipe -48 -56 0 0.500000 0.500000 0 16777216 0 +( 1536 -1664 -504 ) ( 1504 -1664 -504 ) ( 1504 -1664 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -1848 -504 ) ( 1408 -1880 -504 ) ( 1408 -1880 -536 ) subway/no_draw 0 0 0 1 1 0 128 0 +( 1536 -1936 -480 ) ( 1536 -1992 -480 ) ( 1544 -1964 -480 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -1984 -448 ) ( 1536 -1912 -448 ) ( 1544 -1948 -448 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1888 -448 ) ( 1440 -1888 -480 ) ( 1408 -1920 -480 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +} +// brush 171 +{ +( 792 2048 -712 ) ( 792 2112 -712 ) ( 792 2112 -712 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 872 2048 -768 ) ( 872 2048 -736 ) ( 904 2048 -736 ) subway/1_tunnelwall 24 -16 0 0.500000 0.500000 0 301989888 0 +( 760 2072 -768 ) ( 760 2072 -736 ) ( 760 2040 -736 ) subway/1_tunnelwall 40 -16 0 0.500000 0.500000 0 301989888 0 +( 896 2148 -720 ) ( 888 2200 -720 ) ( 888 2096 -720 ) subway/1_tunnelwall -8 -32 0 0.500000 0.500000 0 301989888 0 +( 896 2156 -712 ) ( 888 2128 -712 ) ( 888 2184 -712 ) subway/1_tunnelwall -8 -32 0 0.500000 0.500000 0 301989888 0 +( 760 2112 -712 ) ( 792 2112 -712 ) ( 792 2112 -712 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +} +// brush 172 +{ +( 1512 -1880 -552 ) ( 1440 -1880 -552 ) ( 1440 -2024 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -2024 -536 ) ( 1440 -1880 -536 ) ( 1512 -1880 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1448 -2048 -536 ) ( 1520 -2048 -536 ) ( 1520 -2048 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -2024 -536 ) ( 1536 -1880 -536 ) ( 1536 -1880 -552 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 1512 -1920 -536 ) ( 1440 -1920 -536 ) ( 1440 -1920 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1488 -1880 -536 ) ( 1488 -2024 -536 ) ( 1488 -2024 -552 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 173 +{ +( 1816 -2736 -544 ) ( 1696 -2736 -544 ) ( 1696 -2752 -544 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1688 -2752 -288 ) ( 1688 -2736 -288 ) ( 1808 -2736 -288 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1688 -2752 -288 ) ( 1808 -2752 -288 ) ( 1808 -2752 -352 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1816 -2752 -288 ) ( 1816 -2736 -288 ) ( 1816 -2736 -352 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1816 -2736 -288 ) ( 1696 -2736 -288 ) ( 1696 -2736 -352 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1664 -2736 -288 ) ( 1664 -2752 -288 ) ( 1664 -2752 -352 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 174 +{ +( 1720 -1880 -320 ) ( 1720 -1880 -288 ) ( 1688 -1880 -288 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 -1896 -288 ) ( 1720 -1912 -288 ) ( 1688 -1912 -288 ) subway/1_tunnelwall 16 8 0 1 1 0 301989888 0 +( 1720 -3000 -288 ) ( 1696 -3000 -296 ) ( 1696 -3032 -296 ) subway/1_tunnelwall 0 0 90 0.500000 0.500000 0 301989888 0 +( 1688 -1912 -288 ) ( 1696 -1912 -296 ) ( 1696 -1880 -296 ) subway/1_tunnelwall 16 8 0 1 1 0 301989888 0 +( 1728 -2752 -296 ) ( 1640 -2752 -296 ) ( 1684 -2752 -288 ) subway/1_tunnelwall 16 8 0 1 1 0 301989888 0 +} +// brush 175 +{ +( 1872 -2644 -288 ) ( 1856 -2644 -288 ) ( 1856 -2612 -288 ) subway/1_tunnelwall 8 -12 0 1 1 0 301989888 0 +( 1864 -2532 -464 ) ( 1864 -2532 -336 ) ( 1848 -2532 -336 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1976 -2660 -472 ) ( 1976 -2660 -344 ) ( 1976 -2628 -344 ) subway/1_tunnelwall 20 0 0 1 1 0 301989888 0 +( 1880 -2588 -392 ) ( 1880 -2588 -264 ) ( 1896 -2588 -264 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1848 -2612 -440 ) ( 1848 -2612 -312 ) ( 1848 -2644 -312 ) subway/1_tunnelwall 20 0 0 1 1 0 301989888 0 +( 1848 -2620 -448 ) ( 1848 -2716 -448 ) ( 1880 -2668 -448 ) subway/1_tunnelwall 8 -12 0 1 1 0 301989888 0 +} +// brush 176 +{ +( 1864 -2532 -504 ) ( 1864 -2532 -376 ) ( 1848 -2532 -376 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1976 -2660 -512 ) ( 1976 -2660 -384 ) ( 1976 -2628 -384 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1872 -2588 -512 ) ( 1872 -2588 -384 ) ( 1888 -2588 -384 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1002 +( 1848 -2612 -480 ) ( 1848 -2612 -352 ) ( 1848 -2644 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1848 -2716 -488 ) ( 1848 -2620 -488 ) ( 1880 -2668 -488 ) subway/1_tunnelwall -40 24 0 0.500000 0.500000 0 301989888 0 +( 1952 -2588 -520 ) ( 1976 -2588 -520 ) ( 1964 -2532 -520 ) subway/1_tunnelwall -40 24 0 0.500000 0.500000 0 301989888 0 +} +// brush 177 +{ +( 1848 -2612 -536 ) ( 1848 -2644 -536 ) ( 1864 -2644 -536 ) subway/1_tunnelwall -56 8 0 0.500000 0.500000 0 301989888 0 +( 1864 -2532 -504 ) ( 1864 -2532 -376 ) ( 1848 -2532 -376 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1976 -2660 -512 ) ( 1976 -2660 -384 ) ( 1976 -2628 -384 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1872 -2588 -512 ) ( 1872 -2588 -384 ) ( 1888 -2588 -384 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1002 +( 1848 -2612 -480 ) ( 1848 -2612 -352 ) ( 1848 -2644 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1976 -2588 -520 ) ( 1952 -2588 -520 ) ( 1964 -2532 -520 ) subway/1_tunnelwall -40 24 0 0.500000 0.500000 0 301989888 0 +} +// brush 178 +{ +( 1864 -2644 -448 ) ( 1848 -2644 -448 ) ( 1848 -2612 -448 ) subway/1_tunnelwall_pipe 16 -16 0 0.500000 0.500000 0 16777216 0 +( 1864 -2532 -496 ) ( 1864 -2532 -368 ) ( 1848 -2532 -368 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 1976 -2660 -504 ) ( 1976 -2660 -376 ) ( 1976 -2628 -376 ) subway/1_tunnelwall_pipe -24 -8 0 0.500000 0.500000 0 16777216 0 +( 1872 -2588 -504 ) ( 1872 -2588 -376 ) ( 1888 -2588 -376 ) subway/1_tunnelwall_pipe 16 -8 0 0.500000 0.500000 0 16777216 0 +( 1848 -2612 -472 ) ( 1848 -2612 -344 ) ( 1848 -2644 -344 ) subway/1_tunnelwall_pipe -24 -8 0 0.500000 0.500000 0 16777216 0 +( 1848 -2620 -480 ) ( 1848 -2716 -480 ) ( 1880 -2668 -480 ) subway/1_tunnelwall_pipe 16 -16 0 0.500000 0.500000 0 16777216 0 +} +// brush 179 +{ +( 1864 -2644 -480 ) ( 1848 -2644 -480 ) ( 1848 -2612 -480 ) subway/1_trim1 0 24 0 0.500000 0.500000 0 0 0 +( 1864 -2532 -504 ) ( 1864 -2532 -376 ) ( 1848 -2532 -376 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1976 -2660 -512 ) ( 1976 -2660 -384 ) ( 1976 -2628 -384 ) subway/1_trim1 -24 0 0 0.500000 0.500000 0 0 0 +( 1872 -2588 -512 ) ( 1872 -2588 -384 ) ( 1888 -2588 -384 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1848 -2612 -480 ) ( 1848 -2612 -352 ) ( 1848 -2644 -352 ) subway/1_trim1 -24 0 0 0.500000 0.500000 0 0 0 +( 1848 -2620 -488 ) ( 1848 -2716 -488 ) ( 1880 -2668 -488 ) subway/1_trim1 0 24 0 0.500000 0.500000 0 0 0 +} +// brush 180 +{ +( 1816 -1880 -288 ) ( 1784 -1880 -288 ) ( 1784 -1880 -320 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 -1912 -288 ) ( 1784 -1912 -288 ) ( 1784 -1896 -288 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +( 1808 -2544 -296 ) ( 1808 -2512 -296 ) ( 1784 -2512 -288 ) subway/1_tunnelwall 0 -26 90 0.500000 0.500000 0 301989888 0 +( 1808 -1984 -296 ) ( 1808 -2016 -296 ) ( 1816 -2016 -288 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +( 1848 -2752 -296 ) ( 1776 -2752 -296 ) ( 1812 -2752 -288 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +} +// brush 181 +{ +( 1976 -1880 -288 ) ( 1944 -1880 -288 ) ( 1944 -1880 -320 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1976 -1912 -288 ) ( 1944 -1912 -288 ) ( 1944 -1896 -288 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +( 1968 -2432 -296 ) ( 1968 -2400 -296 ) ( 1944 -2400 -288 ) subway/1_tunnelwall 0 -31 90 0.500000 0.500000 0 301989888 0 +( 1968 -1880 -296 ) ( 1968 -1912 -296 ) ( 1976 -1912 -288 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +( 2000 -2752 -296 ) ( 1936 -2752 -296 ) ( 1968 -2752 -288 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +} +// brush 182 +{ +( 1512 2264 -536 ) ( 1576 2264 -536 ) ( 1576 2280 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1584 2280 -504 ) ( 1584 2272 -504 ) ( 1520 2272 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1432 2280 -504 ) ( 1432 2280 -536 ) ( 1584 2280 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1432 2280 -536 ) ( 1432 2280 -504 ) ( 1424 2272 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1544 2272 -520 ) ( 1544 2280 -520 ) ( 1544 2280 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1416 2272 -528 ) ( 1416 2272 -504 ) ( 1544 2272 -516 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 183 +{ +( 1512 2264 -536 ) ( 1576 2264 -536 ) ( 1576 2280 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1432 2280 -536 ) ( 1432 2280 -504 ) ( 1424 2272 -504 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1576 2264 -536 ) ( 1512 2264 -536 ) ( 1512 2272 -504 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1544 2272 -520 ) ( 1544 2280 -520 ) ( 1544 2280 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1416 2272 -504 ) ( 1416 2272 -528 ) ( 1544 2272 -516 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 184 +{ +( 1416 2368 -536 ) ( 1416 2304 -536 ) ( 1432 2304 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1432 2464 -536 ) ( 1432 2464 -504 ) ( 1424 2456 -504 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1416 2304 -536 ) ( 1416 2368 -536 ) ( 1424 2368 -504 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1432 2280 -504 ) ( 1432 2280 -536 ) ( 1416 2264 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1424 2264 -520 ) ( 1424 2264 -504 ) ( 1424 2464 -512 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 185 +{ +( 1416 2368 -536 ) ( 1416 2304 -536 ) ( 1432 2304 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1432 2296 -504 ) ( 1424 2296 -504 ) ( 1424 2360 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1432 2312 -536 ) ( 1432 2312 -504 ) ( 1432 2464 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1432 2464 -536 ) ( 1432 2464 -504 ) ( 1424 2456 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1432 2280 -504 ) ( 1432 2280 -536 ) ( 1416 2264 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1424 2264 -504 ) ( 1424 2264 -520 ) ( 1424 2464 -512 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 186 +{ +( 1344 2464 -536 ) ( 1344 2448 -536 ) ( 1408 2448 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1272 2456 -504 ) ( 1208 2456 -504 ) ( 1208 2464 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 2464 -536 ) ( 1296 2464 -504 ) ( 1208 2464 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1432 2464 -504 ) ( 1432 2464 -536 ) ( 1416 2448 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 2464 -536 ) ( 1208 2464 -520 ) ( 1208 2456 -520 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 2456 -536 ) ( 1208 2456 -504 ) ( 1432 2456 -520 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 187 +{ +( 1344 2464 -536 ) ( 1344 2448 -536 ) ( 1408 2448 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1432 2464 -504 ) ( 1432 2464 -536 ) ( 1416 2448 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1408 2456 -504 ) ( 1408 2448 -536 ) ( 1344 2448 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1208 2464 -536 ) ( 1208 2464 -520 ) ( 1208 2456 -520 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1208 2456 -504 ) ( 1208 2456 -536 ) ( 1432 2456 -520 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 188 +{ +( 1280 2344 -536 ) ( 1216 2344 -536 ) ( 1216 2328 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1296 2328 -536 ) ( 1296 2328 -504 ) ( 1304 2336 -504 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1216 2344 -536 ) ( 1280 2344 -536 ) ( 1280 2336 -504 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1208 2336 -520 ) ( 1208 2328 -520 ) ( 1208 2328 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1208 2336 -544 ) ( 1208 2336 -504 ) ( 1312 2336 -524 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 189 +{ +( 1280 2344 -536 ) ( 1216 2344 -536 ) ( 1216 2328 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 2328 -504 ) ( 1208 2336 -504 ) ( 1272 2336 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1344 2328 -504 ) ( 1344 2328 -536 ) ( 1264 2328 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 2328 -536 ) ( 1296 2328 -504 ) ( 1304 2336 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 2336 -520 ) ( 1208 2328 -520 ) ( 1208 2328 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 2336 -504 ) ( 1208 2336 -544 ) ( 1312 2336 -524 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 190 +{ +( 1296 2168 -536 ) ( 1312 2168 -536 ) ( 1312 2232 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 2224 -504 ) ( 1304 2160 -504 ) ( 1296 2160 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 2216 -536 ) ( 1296 2296 -536 ) ( 1296 2296 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 2336 -504 ) ( 1296 2328 -504 ) ( 1296 2328 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1312 2160 -536 ) ( 1296 2144 -536 ) ( 1304 2152 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 2144 -520 ) ( 1304 2144 -504 ) ( 1304 2344 -512 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 191 +{ +( 1296 2168 -536 ) ( 1312 2168 -536 ) ( 1312 2232 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1304 2336 -504 ) ( 1296 2328 -504 ) ( 1296 2328 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1304 2232 -504 ) ( 1312 2232 -536 ) ( 1312 2168 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1312 2160 -536 ) ( 1296 2144 -536 ) ( 1304 2152 -504 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1304 2144 -504 ) ( 1304 2144 -520 ) ( 1304 2344 -512 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 192 +{ +( 1456 2144 -536 ) ( 1456 2160 -536 ) ( 1392 2160 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1296 2144 -504 ) ( 1296 2144 -536 ) ( 1312 2160 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1392 2152 -504 ) ( 1392 2160 -536 ) ( 1456 2160 -536 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1544 2144 -536 ) ( 1544 2144 -520 ) ( 1544 2152 -520 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1296 2152 -512 ) ( 1296 2152 -496 ) ( 1544 2152 -504 ) subway/con11 0 16 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 193 +{ +( 1456 2144 -536 ) ( 1456 2160 -536 ) ( 1392 2160 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1400 2152 -504 ) ( 1464 2152 -504 ) ( 1464 2144 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 2144 -536 ) ( 1296 2144 -504 ) ( 1544 2144 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 2144 -504 ) ( 1296 2144 -536 ) ( 1312 2160 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1544 2144 -536 ) ( 1544 2144 -520 ) ( 1544 2152 -520 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 2152 -496 ) ( 1296 2152 -512 ) ( 1544 2152 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 194 +{ +( 1784 1976 -536 ) ( 1720 1976 -536 ) ( 1720 1848 -536 ) subway/skip -8 24 0 1 1 0 656 0 +( 1712 1848 -216 ) ( 1712 1976 -216 ) ( 1776 1976 -216 ) subway/skip -8 24 0 1 1 0 656 0 +( 1712 1848 -472 ) ( 1776 1848 -472 ) ( 1776 1848 -488 ) subway/hint -8 56 0 1 1 0 400 0 +( 1816 1840 -456 ) ( 1816 1968 -456 ) ( 1816 1968 -472 ) subway/hint -24 56 0 1 1 0 400 0 +( 1784 1992 -456 ) ( 1720 1992 -456 ) ( 1720 1992 -472 ) subway/hint -8 56 0 1 1 0 400 0 +( 1688 1960 -472 ) ( 1688 1832 -472 ) ( 1688 1832 -488 ) subway/hint -24 56 0 1 1 0 400 0 +} +// brush 195 +{ +( 1432 2280 -440 ) ( 1432 2280 -456 ) ( 1424 2272 -456 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 1424 2384 -464 ) ( 1424 2320 -464 ) ( 1424 2320 -480 ) subway/metalrib1 0 16 90 0.500000 -0.500000 0 16777216 0 +( 1432 2464 -456 ) ( 1432 2464 -440 ) ( 1424 2456 -440 ) subway/metalrib1 0 0 90 0.500000 -0.500000 0 16777216 0 +( 1432 2312 -456 ) ( 1432 2312 -440 ) ( 1432 2464 -440 ) subway/metalrib1 0 16 90 0.500000 -0.500000 0 16777216 0 +( 1432 2296 -440 ) ( 1424 2296 -440 ) ( 1424 2360 -440 ) subway/metalrib1 1 16 0 0.500000 0.500000 0 16777216 0 +( 1424 2360 -456 ) ( 1424 2296 -456 ) ( 1432 2296 -456 ) subway/metalrib1 1 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 196 +{ +( 1432 2280 -456 ) ( 1432 2280 -472 ) ( 1424 2272 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1424 2384 -480 ) ( 1424 2320 -480 ) ( 1424 2320 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1432 2464 -472 ) ( 1432 2464 -456 ) ( 1424 2456 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1432 2312 -472 ) ( 1432 2312 -456 ) ( 1432 2464 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1432 2296 -456 ) ( 1424 2296 -456 ) ( 1424 2360 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1424 2360 -472 ) ( 1424 2296 -472 ) ( 1432 2296 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 197 +{ +( 1424 2360 -504 ) ( 1424 2296 -504 ) ( 1432 2296 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1432 2296 -472 ) ( 1424 2296 -472 ) ( 1424 2360 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1432 2312 -504 ) ( 1432 2312 -472 ) ( 1432 2464 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1432 2464 -504 ) ( 1432 2464 -472 ) ( 1424 2456 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1424 2384 -488 ) ( 1424 2320 -488 ) ( 1424 2320 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1432 2280 -472 ) ( 1432 2280 -504 ) ( 1424 2272 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 198 +{ +( 2016 2392 -544 ) ( 2016 2272 -544 ) ( 2040 2272 -544 ) subway/1_tunnelfloor_2 17 17 -90 1 -1 0 285212672 0 +( 2024 2296 -536 ) ( 2000 2296 -536 ) ( 2000 2416 -536 ) subway/1_tunnelfloor_2 -2 23 90 1 1 0 285212672 0 +( 1416 2192 -544 ) ( 1416 2192 -536 ) ( 1416 2448 -536 ) subway/1_tunnelfloor_2 16 22 -180 1 1 0 285212672 0 +( 1392 2424 -544 ) ( 1416 2448 -544 ) ( 1416 2448 -536 ) subway/1_tunnelfloor_2 8 22 -180 1 1 0 285212672 0 +( 1392 2272 -536 ) ( 1392 2272 -544 ) ( 1392 2424 -544 ) subway/1_tunnelfloor_2 16 22 -180 1 1 0 285212672 0 +( 1392 2240 -544 ) ( 1392 2240 -536 ) ( 1416 2264 -536 ) subway/1_tunnelfloor_2 16 22 -180 1 1 0 285212672 0 +} +// brush 199 +{ +( 1208 2336 -464 ) ( 1208 2328 -464 ) ( 1208 2328 -480 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 1280 2336 -464 ) ( 1216 2336 -464 ) ( 1216 2336 -480 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1296 2328 -456 ) ( 1296 2328 -440 ) ( 1304 2336 -440 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 1296 2328 -440 ) ( 1296 2328 -456 ) ( 1216 2328 -456 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1208 2328 -440 ) ( 1208 2336 -440 ) ( 1272 2336 -440 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1272 2336 -456 ) ( 1208 2336 -456 ) ( 1208 2328 -456 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +} +// brush 200 +{ +( 1208 2336 -480 ) ( 1208 2328 -480 ) ( 1208 2328 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1280 2336 -480 ) ( 1216 2336 -480 ) ( 1216 2336 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 2328 -472 ) ( 1296 2328 -456 ) ( 1304 2336 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 2328 -456 ) ( 1296 2328 -472 ) ( 1216 2328 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1208 2328 -456 ) ( 1208 2336 -456 ) ( 1272 2336 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1272 2336 -472 ) ( 1208 2336 -472 ) ( 1208 2328 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 201 +{ +( 1272 2336 -504 ) ( 1208 2336 -504 ) ( 1208 2328 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 2328 -472 ) ( 1208 2336 -472 ) ( 1272 2336 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 2328 -472 ) ( 1296 2328 -504 ) ( 1216 2328 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 2328 -504 ) ( 1296 2328 -472 ) ( 1304 2336 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1280 2336 -488 ) ( 1216 2336 -488 ) ( 1216 2336 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 2336 -488 ) ( 1208 2328 -488 ) ( 1208 2328 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 202 +{ +( 1376 2408 -444 ) ( 1360 2408 -444 ) ( 1360 2392 -444 ) subway/light_yellow 0 16 0 0.500000 0.500000 134217728 16777217 15000 +( 1360 2392 -440 ) ( 1360 2408 -440 ) ( 1376 2408 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1360 2392 -440 ) ( 1376 2392 -440 ) ( 1376 2392 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1376 2392 -440 ) ( 1376 2408 -440 ) ( 1376 2408 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1376 2408 -440 ) ( 1360 2408 -440 ) ( 1360 2408 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1360 2408 -440 ) ( 1360 2392 -440 ) ( 1360 2392 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 203 +{ +( 1256 2408 -444 ) ( 1240 2408 -444 ) ( 1240 2392 -444 ) subway/light_yellow 16 16 0 0.500000 0.500000 134217728 16777217 4000 +( 1240 2392 -440 ) ( 1240 2408 -440 ) ( 1256 2408 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1240 2392 -440 ) ( 1256 2392 -440 ) ( 1256 2392 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1256 2392 -440 ) ( 1256 2408 -440 ) ( 1256 2408 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1256 2408 -440 ) ( 1240 2408 -440 ) ( 1240 2408 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1240 2408 -440 ) ( 1240 2392 -440 ) ( 1240 2392 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 204 +{ +( 1208 2464 -440 ) ( 1208 2456 -440 ) ( 1272 2456 -440 ) subway/con10 16 0 0 0.500000 0.500000 0 285212672 0 +( 1272 2456 -424 ) ( 1208 2456 -424 ) ( 1208 2464 -424 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1288 2464 -440 ) ( 1288 2464 -424 ) ( 1208 2464 -424 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1296 2456 -440 ) ( 1296 2456 -432 ) ( 1296 2464 -432 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 1304 2328 -432 ) ( 1304 2328 -440 ) ( 1216 2328 -440 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1208 2464 -464 ) ( 1208 2464 -448 ) ( 1208 2456 -448 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +} +// brush 205 +{ +( 1296 2464 -440 ) ( 1296 2456 -440 ) ( 1360 2456 -440 ) subway/con10 16 0 0 0.500000 0.500000 0 285212672 0 +( 1360 2456 -432 ) ( 1296 2456 -432 ) ( 1296 2464 -432 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1376 2464 -440 ) ( 1376 2464 -424 ) ( 1296 2464 -424 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1432 2456 -440 ) ( 1432 2456 -432 ) ( 1432 2464 -432 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 1424 2144 -432 ) ( 1424 2144 -440 ) ( 1336 2144 -440 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1296 2464 -464 ) ( 1296 2464 -448 ) ( 1296 2456 -448 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +} +// brush 206 +{ +( 1208 2464 -456 ) ( 1208 2456 -456 ) ( 1272 2456 -456 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1272 2456 -440 ) ( 1208 2456 -440 ) ( 1208 2464 -440 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1288 2464 -456 ) ( 1288 2464 -440 ) ( 1208 2464 -440 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1432 2464 -440 ) ( 1432 2464 -456 ) ( 1424 2456 -456 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 1296 2456 -480 ) ( 1296 2456 -464 ) ( 1360 2456 -464 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1208 2464 -480 ) ( 1208 2464 -464 ) ( 1208 2456 -464 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +} +// brush 207 +{ +( 1208 2464 -472 ) ( 1208 2456 -472 ) ( 1272 2456 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1272 2456 -456 ) ( 1208 2456 -456 ) ( 1208 2464 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1288 2464 -472 ) ( 1288 2464 -456 ) ( 1208 2464 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1432 2464 -456 ) ( 1432 2464 -472 ) ( 1424 2456 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 2456 -496 ) ( 1296 2456 -480 ) ( 1360 2456 -480 ) subway/1_trim1 8 0 0 -1 1 0 0 0 +( 1208 2464 -496 ) ( 1208 2464 -480 ) ( 1208 2456 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 208 +{ +( 1208 2464 -504 ) ( 1208 2456 -504 ) ( 1272 2456 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1272 2456 -472 ) ( 1208 2456 -472 ) ( 1208 2464 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 2464 -504 ) ( 1296 2464 -472 ) ( 1208 2464 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1432 2464 -472 ) ( 1432 2464 -504 ) ( 1424 2456 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 2456 -504 ) ( 1296 2456 -488 ) ( 1360 2456 -488 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 2464 -504 ) ( 1208 2464 -488 ) ( 1208 2456 -488 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 209 +{ +( 1328 1808 -544 ) ( 1208 1808 -544 ) ( 1208 1784 -544 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1232 1808 -536 ) ( 1232 1832 -536 ) ( 1352 1832 -536 ) subway/1_tunneltrack_plain 32 33 0 1 1 0 301989888 0 +( 1392 1752 -520 ) ( 1392 1776 -520 ) ( 1392 1776 -528 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1408 2424 -480 ) ( 1288 2424 -480 ) ( 1288 2424 -488 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1168 2320 -520 ) ( 1168 2296 -520 ) ( 1168 2296 -528 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1224 2400 -544 ) ( 1160 2400 -544 ) ( 1192 2400 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 210 +{ +( 1200 2448 -544 ) ( 1200 2448 -536 ) ( 1168 2424 -536 ) subway/1_tunnelfloor_2 24 24 0 1 -1 0 285212672 0 +( 1200 2448 -536 ) ( 1200 2448 -544 ) ( 1288 2448 -544 ) subway/1_tunnelfloor_2 24 24 0 1 -1 0 285212672 0 +( 1416 2448 -536 ) ( 1416 2448 -544 ) ( 1400 2432 -544 ) subway/1_tunnelfloor_2 -23 24 0 1 -1 0 285212672 0 +( 1216 2424 -568 ) ( 1336 2424 -568 ) ( 1336 2424 -576 ) subway/1_tunnelfloor_2 24 24 0 1 -1 0 285212672 0 +( 1232 1824 -536 ) ( 1232 1848 -536 ) ( 1352 1848 -536 ) subway/1_tunnelfloor_2 0 -16 0 1 -1 0 285212672 0 +( 1328 1816 -544 ) ( 1208 1816 -544 ) ( 1208 1792 -544 ) subway/1_tunnelfloor_2 24 -7 0 1 -1 0 285212672 0 +} +// brush 211 +{ +( 1208 2992 -544 ) ( 1208 2968 -544 ) ( 1328 2968 -544 ) subway/1_tunnelfloor_2 24 -8 0 1 -1 0 285212672 0 +( 1352 2952 -536 ) ( 1232 2952 -536 ) ( 1232 2976 -536 ) subway/1_tunnelfloor_2 27 8 0 1 1 0 285212672 0 +( 1328 2368 -544 ) ( 1328 2368 -536 ) ( 1168 2368 -536 ) subway/1_tunnelfloor_2 24 24 0 1 -1 0 285212672 0 +( 1336 2368 -536 ) ( 1336 2368 -544 ) ( 1312 2344 -544 ) subway/1_tunnelfloor_2 -24 24 0 1 -1 0 285212672 0 +( 1200 2344 -544 ) ( 1200 2344 -536 ) ( 1296 2344 -536 ) subway/1_tunnelfloor_2 24 24 0 1 -1 0 285212672 0 +( 1200 2344 -536 ) ( 1200 2344 -544 ) ( 1168 2368 -544 ) subway/1_tunnelfloor_2 24 24 0 1 -1 0 285212672 0 +} +// brush 212 +{ +( 1328 1808 -544 ) ( 1208 1808 -544 ) ( 1208 1784 -544 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1232 1808 -536 ) ( 1232 1832 -536 ) ( 1352 1832 -536 ) subway/1_tunneltrack_plain 32 32 0 1 1 0 301989888 0 +( 1160 2368 -568 ) ( 1280 2368 -568 ) ( 1280 2368 -576 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1392 1752 -520 ) ( 1392 1776 -520 ) ( 1392 1776 -528 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1168 2320 -520 ) ( 1168 2296 -520 ) ( 1168 2296 -528 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1160 2400 -544 ) ( 1224 2400 -544 ) ( 1192 2400 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 213 +{ +( 1144 2208 -544 ) ( 1080 2208 -544 ) ( 1080 2080 -544 ) subway/skip 56 0 0 1 1 0 656 0 +( 1072 2080 -336 ) ( 1072 2208 -336 ) ( 1136 2208 -336 ) subway/skip 56 0 0 1 1 0 656 0 +( 1072 2120 -472 ) ( 1136 2120 -472 ) ( 1136 2120 -488 ) subway/hint 56 56 0 1 1 0 400 0 +( 1216 2072 -456 ) ( 1216 2200 -456 ) ( 1216 2200 -472 ) subway/hint 0 56 0 1 1 0 400 0 +( 1144 2208 -456 ) ( 1080 2208 -456 ) ( 1080 2208 -472 ) subway/hint 56 56 0 1 1 0 400 0 +( 1048 2192 -472 ) ( 1048 2064 -472 ) ( 1048 2064 -488 ) subway/hint 0 56 0 1 1 0 400 0 +} +// brush 214 +{ +( 1168 2552 -552 ) ( 1168 2552 -536 ) ( 1168 2224 -536 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1200 2424 -552 ) ( 1200 2424 -536 ) ( 1200 2848 -536 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1184 2848 -552 ) ( 1216 2848 -552 ) ( 1216 2848 -536 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1368 2896 -536 ) ( 1248 2896 -536 ) ( 1248 2920 -536 ) subway/1_tunnelfloor_2 -272 -368 90 1 1 0 285212672 0 +( 1224 2944 -552 ) ( 1224 2920 -552 ) ( 1344 2920 -552 ) subway/1_tunneltrack_plain -784 416 0 0.500000 0.500000 0 301989888 0 +( 1200 2448 -552 ) ( 1168 2424 -552 ) ( 1184 2436 -536 ) subway/1_tunneltrack_plain -784 416 0 0.500000 0.500000 0 301989888 0 +} +// brush 215 +{ +( 588 -326 -180 ) ( 640 -300 -180 ) ( 640 -296 -180 ) subway/clip 0 -32 0 1 1 196608 144 0 +( 588 -322 -140 ) ( 640 -296 -140 ) ( 640 -300 -140 ) subway/clip 0 -32 0 1 1 196608 144 0 +( 588 -322 -180 ) ( 640 -296 -180 ) ( 640 -296 -148 ) subway/clip 0 0 0 1 1 196608 144 0 +( 588 -326 -148 ) ( 640 -300 -148 ) ( 640 -300 -180 ) subway/clip 0 0 0 1 1 196608 144 0 +( 588 -318 -180 ) ( 588 -318 -148 ) ( 588 -326 -148 ) subway/clip 32 0 0 1 1 196608 144 0 +( 612 -284 -140 ) ( 608 -280 -172 ) ( 616 -288 -172 ) subway/clip 32 0 0 1 1 196608 144 0 +} +// brush 216 +{ +( 624 -312 -180 ) ( 628 -312 -180 ) ( 654 -260 -180 ) subway/clip 0 -23 90 1 1 196608 144 0 +( 628 -312 -140 ) ( 624 -312 -140 ) ( 650 -260 -140 ) subway/clip 0 -23 90 1 1 196608 144 0 +( 624 -312 -140 ) ( 624 -312 -172 ) ( 650 -260 -172 ) subway/clip 0 0 0 1 1 196608 144 0 +( 628 -312 -180 ) ( 628 -312 -148 ) ( 654 -260 -148 ) subway/clip 0 0 0 1 1 196608 144 0 +( 658 -256 -148 ) ( 650 -256 -148 ) ( 650 -256 -180 ) subway/clip 24 0 -180 1 -1 196608 144 0 +( 616 -288 -172 ) ( 608 -280 -172 ) ( 612 -284 -140 ) subway/clip -40 0 -180 1 -1 196608 144 0 +} +// brush 217 +{ +( 654 -156 -180 ) ( 628 -104 -180 ) ( 624 -104 -180 ) subway/clip 32 -24 90 1 1 196608 144 0 +( 650 -156 -140 ) ( 624 -104 -140 ) ( 628 -104 -140 ) subway/clip 32 -24 90 1 1 196608 144 0 +( 650 -156 -180 ) ( 624 -104 -180 ) ( 624 -104 -148 ) subway/clip 32 0 0 1 1 196608 144 0 +( 654 -156 -148 ) ( 628 -104 -148 ) ( 628 -104 -180 ) subway/clip 32 0 0 1 1 196608 144 0 +( 650 -160 -180 ) ( 650 -160 -148 ) ( 658 -160 -148 ) subway/clip 24 0 -180 1 -1 196608 144 0 +( 612 -132 -148 ) ( 608 -136 -180 ) ( 616 -128 -180 ) subway/clip -8 0 -180 1 -1 196608 144 0 +} +// brush 218 +{ +( 640 -120 -180 ) ( 640 -116 -180 ) ( 588 -90 -180 ) subway/clip 0 0 0 1 1 196608 144 0 +( 640 -116 -140 ) ( 640 -120 -140 ) ( 588 -94 -140 ) subway/clip 0 0 0 1 1 196608 144 0 +( 640 -120 -148 ) ( 640 -120 -180 ) ( 588 -94 -180 ) subway/clip 0 0 0 1 1 196608 144 0 +( 640 -116 -180 ) ( 640 -116 -148 ) ( 588 -90 -148 ) subway/clip 0 0 0 1 1 196608 144 0 +( 588 -90 -148 ) ( 588 -98 -148 ) ( 588 -98 -180 ) subway/clip 0 0 0 1 1 196608 144 0 +( 616 -128 -180 ) ( 608 -136 -180 ) ( 612 -132 -148 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 219 +{ +( 632 -304 10 ) ( 632 -304 0 ) ( 612 -284 0 ) subway/trigger 24 0 0 1 1 134217728 144 0 +( 640 -256 -184 ) ( 580 -376 -184 ) ( 588 -376 -184 ) subway/trigger 24 0 0 1 1 134217728 144 0 +( 648 -258 -144 ) ( 588 -378 -144 ) ( 580 -378 -144 ) subway/trigger 24 0 0 1 1 134217728 144 0 +( 648 -256 -184 ) ( 588 -376 -184 ) ( 588 -376 -180 ) subway/trigger 24 0 0 1 1 134217728 144 0 +( 616 -256 -192 ) ( 640 -256 -192 ) ( 640 -256 -144 ) subway/trigger 24 0 0 1 1 134217728 144 0 +( 646 -258 -180 ) ( 586 -378 -180 ) ( 586 -378 -184 ) subway/trigger 24 0 0 1 1 134217728 144 0 +( 348 -376 -160 ) ( 284 -376 -160 ) ( 284 -376 -144 ) subway/trigger 24 0 0 1 1 134217728 144 0 +} +// brush 220 +{ +( 968 -352 10 ) ( 968 -352 0 ) ( 948 -372 0 ) subway/clip 20 0 0 1 1 134283264 144 0 +( 920 -344 -184 ) ( 1040 -404 -184 ) ( 1040 -396 -184 ) subway/clip -44 -48 0 1 1 134283264 144 0 +( 922 -336 -144 ) ( 1042 -396 -144 ) ( 1042 -404 -144 ) subway/clip -44 -48 0 1 1 134283264 144 0 +( 920 -336 -184 ) ( 1040 -396 -184 ) ( 1040 -396 -180 ) subway/clip -44 0 0 1 1 134283264 144 0 +( 920 -368 -192 ) ( 920 -344 -192 ) ( 920 -344 -144 ) subway/clip 20 0 0 1 1 134283264 144 0 +( 922 -338 -180 ) ( 1042 -398 -180 ) ( 1042 -398 -184 ) subway/clip -44 0 0 1 1 134283264 144 0 +( 1040 -636 -160 ) ( 1040 -700 -160 ) ( 1040 -700 -144 ) subway/clip 20 0 0 1 1 134283264 144 0 +} +// brush 221 +{ +( 948 -372 0 ) ( 968 -352 0 ) ( 968 -352 10 ) subway/clip 20 0 0 1 1 134283264 144 0 +( 924 -280 -184 ) ( 916 -280 -184 ) ( 976 -400 -184 ) subway/clip -44 -48 0 1 1 134283264 144 0 +( 916 -278 -144 ) ( 924 -278 -144 ) ( 984 -398 -144 ) subway/clip -44 -48 0 1 1 134283264 144 0 +( 924 -280 -180 ) ( 924 -280 -184 ) ( 984 -400 -184 ) subway/clip 20 0 0 1 1 134283264 144 0 +( 976 -400 -144 ) ( 976 -400 -192 ) ( 952 -400 -192 ) subway/clip -44 0 0 1 1 134283264 144 0 +( 922 -278 -184 ) ( 922 -278 -180 ) ( 982 -398 -180 ) subway/clip 20 0 0 1 1 134283264 144 0 +( 620 -280 -144 ) ( 620 -280 -160 ) ( 684 -280 -160 ) subway/clip -44 0 0 1 1 134283264 144 0 +} +// brush 222 +{ +( 984 -402 -184 ) ( 982 -402 -184 ) ( 982 -418 -184 ) subway/clip -44 -48 0 1 1 65536 144 0 +( 982 -418 -144 ) ( 982 -402 -144 ) ( 984 -402 -144 ) subway/clip -44 -48 0 1 1 65536 144 0 +( 982 -496 -144 ) ( 984 -496 -144 ) ( 984 -496 -184 ) subway/clip -44 0 0 1 1 65536 144 0 +( 984 -414 -144 ) ( 984 -398 -144 ) ( 984 -398 -184 ) subway/clip 20 0 0 1 1 65536 144 0 +( 984 -400 -144 ) ( 982 -400 -144 ) ( 982 -400 -184 ) subway/clip -44 0 0 1 1 65536 144 0 +( 983 -472 -144 ) ( 983 -488 -144 ) ( 983 -488 -184 ) subway/clip 20 0 0 1 1 65536 144 0 +} +// brush 223 +{ +( 948 -524 0 ) ( 968 -544 0 ) ( 968 -544 10 ) subway/clip 20 0 0 1 1 134283264 144 0 +( 1040 -500 -184 ) ( 1040 -492 -184 ) ( 920 -552 -184 ) subway/clip -44 -48 0 1 1 134283264 144 0 +( 1042 -492 -144 ) ( 1042 -500 -144 ) ( 922 -560 -144 ) subway/clip -44 -48 0 1 1 134283264 144 0 +( 1040 -500 -180 ) ( 1040 -500 -184 ) ( 920 -560 -184 ) subway/clip -44 0 0 1 1 134283264 144 0 +( 920 -552 -144 ) ( 920 -552 -192 ) ( 920 -528 -192 ) subway/clip 20 0 0 1 1 134283264 144 0 +( 1042 -498 -184 ) ( 1042 -498 -180 ) ( 922 -558 -180 ) subway/clip -44 0 0 1 1 134283264 144 0 +( 1040 -196 -144 ) ( 1040 -196 -160 ) ( 1040 -260 -160 ) subway/clip 20 0 0 1 1 134283264 144 0 +} +// brush 224 +{ +( 968 -544 10 ) ( 968 -544 0 ) ( 948 -524 0 ) subway/clip 20 0 0 1 1 134283264 144 0 +( 976 -496 -184 ) ( 916 -616 -184 ) ( 924 -616 -184 ) subway/clip -44 -48 0 1 1 134283264 144 0 +( 984 -498 -144 ) ( 924 -618 -144 ) ( 916 -618 -144 ) subway/clip -44 -48 0 1 1 134283264 144 0 +( 984 -496 -184 ) ( 924 -616 -184 ) ( 924 -616 -180 ) subway/clip 20 0 0 1 1 134283264 144 0 +( 952 -496 -192 ) ( 976 -496 -192 ) ( 976 -496 -144 ) subway/clip -44 0 0 1 1 134283264 144 0 +( 982 -498 -180 ) ( 922 -618 -180 ) ( 922 -618 -184 ) subway/clip 20 0 0 1 1 134283264 144 0 +( 684 -616 -160 ) ( 620 -616 -160 ) ( 620 -616 -144 ) subway/clip -44 0 0 1 1 134283264 144 0 +} +// brush 225 +{ +( 1280 1720 -544 ) ( 1160 1720 -544 ) ( 1160 1696 -544 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1184 1720 -536 ) ( 1184 1744 -536 ) ( 1304 1744 -536 ) subway/1_tunneltrack_plain 32 897 0 1 1 0 301989888 0 +( 1120 2184 -568 ) ( 1240 2184 -568 ) ( 1240 2184 -576 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1392 1664 -520 ) ( 1392 1688 -520 ) ( 1392 1688 -528 ) subway/1_tunneltrack_plain 48 0 0 0.500000 0.500000 0 301989888 0 +( 1360 2368 -480 ) ( 1240 2368 -480 ) ( 1240 2368 -488 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1360 2320 -544 ) ( 1360 2336 -544 ) ( 1360 2328 -536 ) subway/1_tunneltrack_plain 48 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 226 +{ +( 1280 1720 -544 ) ( 1160 1720 -544 ) ( 1160 1696 -544 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1184 1720 -536 ) ( 1184 1744 -536 ) ( 1304 1744 -536 ) subway/1_tunneltrack_plain 32 896 0 1 1 0 301989888 0 +( 1120 2184 -568 ) ( 1240 2184 -568 ) ( 1240 2184 -576 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1360 2368 -480 ) ( 1240 2368 -480 ) ( 1240 2368 -488 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1336 2224 -520 ) ( 1336 2200 -520 ) ( 1336 2200 -528 ) subway/1_tunneltrack_plain 48 0 0 0.500000 0.500000 0 301989888 0 +( 1360 2336 -544 ) ( 1360 2320 -544 ) ( 1360 2328 -536 ) subway/1_tunneltrack_plain 48 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 227 +{ +( 1208 2352 -536 ) ( 1200 2352 -536 ) ( 1200 2328 -536 ) subway/metalrib1 -8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1200 2344 -440 ) ( 1208 2344 -440 ) ( 1208 2328 -424 ) subway/metalrib1 -8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1200 2328 -488 ) ( 1208 2328 -488 ) ( 1208 2328 -520 ) subway/metalrib1 -8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1208 2328 -488 ) ( 1208 2352 -488 ) ( 1208 2352 -520 ) subway/metalrib1 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1208 2344 -440 ) ( 1200 2344 -440 ) ( 1200 2344 -520 ) subway/metalrib1 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1200 2352 -488 ) ( 1200 2328 -488 ) ( 1200 2328 -520 ) subway/metalrib1 0 8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 228 +{ +( 1208 2472 -536 ) ( 1200 2472 -536 ) ( 1200 2448 -536 ) subway/metalrib1 -8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1208 2448 -440 ) ( 1200 2448 -440 ) ( 1200 2464 -424 ) subway/metalrib1 -8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1200 2448 -440 ) ( 1208 2448 -440 ) ( 1208 2448 -520 ) subway/metalrib1 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1208 2448 -488 ) ( 1208 2472 -488 ) ( 1208 2472 -520 ) subway/metalrib1 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1208 2464 -488 ) ( 1200 2464 -488 ) ( 1200 2464 -520 ) subway/metalrib1 -8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1200 2472 -488 ) ( 1200 2448 -488 ) ( 1200 2448 -520 ) subway/metalrib1 0 8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 229 +{ +( 1200 2408 -448 ) ( 1200 2408 -424 ) ( 1200 2376 -424 ) subway/metalrib1 0 8 90 0.500000 0.500000 134217728 16777216 0 +( 1200 2344 -440 ) ( 1208 2344 -440 ) ( 1208 2448 -440 ) subway/metalrib1 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1208 2408 -424 ) ( 1208 2408 -448 ) ( 1208 2376 -448 ) subway/metalrib1 -7 8 90 0.500000 0.500000 134217728 16777216 0 +( 1200 2408 -424 ) ( 1208 2408 -424 ) ( 1208 2376 -424 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 134217728 16777216 0 +( 1200 2448 -440 ) ( 1208 2448 -440 ) ( 1208 2464 -424 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 134217728 16777216 0 +( 1208 2344 -440 ) ( 1200 2344 -440 ) ( 1200 2328 -424 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 230 +{ +( 984 -675 -536 ) ( 920 -675 -536 ) ( 920 -739 -536 ) subway/skip -8 -32 0 1 1 0 656 0 +( 920 -739 -332 ) ( 920 -675 -332 ) ( 984 -675 -332 ) subway/skip -8 -32 0 1 1 0 656 0 +( 824 -619 -656 ) ( 824 -555 -656 ) ( 824 -555 -664 ) subway/hint 32 -8 0 1 1 0 400 0 +( 912 -536 -648 ) ( 848 -536 -648 ) ( 848 -536 -656 ) subway/hint -8 -8 0 1 1 0 400 0 +( 688 -667 -640 ) ( 688 -731 -640 ) ( 688 -731 -648 ) subway/hint 32 -8 0 1 1 0 400 0 +( 752 -664 -504 ) ( 720 -664 -504 ) ( 736 -664 -496 ) subway/hint -8 -8 0 1 1 0 400 0 +} +// brush 231 +{ +( -78 -632 -400 ) ( -78 -624 -400 ) ( -142 -616 -400 ) subway/clip 22 0 0 1 1 196608 144 0 +( -78 -624 -312 ) ( -78 -632 -312 ) ( -142 -624 -312 ) subway/clip 22 0 0 1 1 196608 144 0 +( -78 -628 -312 ) ( -78 -628 -400 ) ( -142 -620 -400 ) subway/clip 22 24 0 1 1 196608 144 0 +( -78 -632 -352 ) ( -78 -624 -352 ) ( -78 -624 -368 ) subway/clip 0 24 0 1 1 196608 144 0 +( -78 -624 -400 ) ( -78 -624 -312 ) ( -142 -616 -312 ) subway/clip 22 24 0 1 1 196608 144 0 +( -142 -616 -352 ) ( -142 -624 -352 ) ( -142 -624 -368 ) subway/clip 0 24 0 1 1 196608 144 0 +} +// brush 232 +{ +( -64 1480 -168 ) ( -64 1488 -168 ) ( -128 1496 -168 ) subway/clip 8 0 0 1 1 196608 144 0 +( -64 1488 -80 ) ( -64 1480 -80 ) ( -128 1488 -80 ) subway/clip 8 0 0 1 1 196608 144 0 +( -124 1488 -168 ) ( -124 1488 -80 ) ( -64 1480 -80 ) subway/clip 8 0 0 1 1 196608 144 0 +( -64 1480 -120 ) ( -64 1488 -120 ) ( -64 1488 -136 ) subway/clip 8 0 0 1 1 196608 144 0 +( -124 1496 -80 ) ( -124 1496 -168 ) ( -64 1488 -168 ) subway/clip 8 0 0 1 1 196608 144 0 +( -124 1496 -168 ) ( -124 1496 -80 ) ( -124 1488 -80 ) subway/clip 8 0 0 1 1 196608 144 0 +} +// brush 233 +{ +( 1208 93 -224 ) ( 1144 93 -224 ) ( 1144 29 -224 ) subway/skip -40 32 0 1 1 0 656 0 +( 1144 29 -88 ) ( 1144 93 -88 ) ( 1208 93 -88 ) subway/skip -40 32 0 1 1 0 656 0 +( 1032 149 -336 ) ( 1032 213 -336 ) ( 1032 213 -344 ) subway/hint -32 -16 0 1 1 0 400 0 +( 1120 264 -336 ) ( 1056 264 -336 ) ( 1056 264 -344 ) subway/hint -40 -16 0 1 1 0 400 0 +( 856 109 -336 ) ( 856 45 -336 ) ( 856 45 -344 ) subway/hint -32 -16 0 1 1 0 400 0 +( 968 200 -192 ) ( 936 200 -192 ) ( 952 200 -184 ) subway/hint -40 -16 0 1 1 0 400 0 +} +// brush 234 +{ +( 1208 157 -216 ) ( 1144 157 -216 ) ( 1144 93 -216 ) subway/skip 24 32 0 1 1 0 656 0 +( 1144 93 -96 ) ( 1144 157 -96 ) ( 1208 157 -96 ) subway/skip 24 32 0 1 1 0 656 0 +( 1096 205 -336 ) ( 1096 269 -336 ) ( 1096 269 -344 ) subway/hint -32 -16 0 1 1 0 400 0 +( 1136 200 -336 ) ( 1072 200 -336 ) ( 1072 200 -344 ) subway/hint 24 -16 0 1 1 0 400 0 +( 920 165 -336 ) ( 920 101 -336 ) ( 920 101 -344 ) subway/hint -32 -16 0 1 1 0 400 0 +( 976 104 -192 ) ( 944 104 -192 ) ( 960 104 -184 ) subway/hint 24 -16 0 1 1 0 400 0 +} +// brush 235 +{ +( 984 -163 -224 ) ( 920 -163 -224 ) ( 920 -227 -224 ) subway/skip 56 -32 0 1 1 0 656 0 +( 920 -227 -48 ) ( 920 -163 -48 ) ( 984 -163 -48 ) subway/skip 56 -32 0 1 1 0 656 0 +( 808 -107 -336 ) ( 808 -43 -336 ) ( 808 -43 -344 ) subway/hint 32 -16 0 1 1 0 400 0 +( 912 -24 -336 ) ( 848 -24 -336 ) ( 848 -24 -344 ) subway/hint 56 -16 0 1 1 0 400 0 +( 696 -155 -336 ) ( 696 -219 -336 ) ( 696 -219 -344 ) subway/hint 32 -16 0 1 1 0 400 0 +( 752 -152 -192 ) ( 720 -152 -192 ) ( 736 -152 -184 ) subway/hint 56 -16 0 1 1 0 400 0 +} +// brush 236 +{ +( 1032 -208 -152 ) ( 1032 -208 -120 ) ( 1168 -208 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 -816 -152 ) ( 1304 -816 -144 ) ( 1304 -752 -144 ) subway/1_lobby2 16 16 0 0.500000 0.500000 0 285212672 0 +( 1432 -200 -152 ) ( 1432 -200 -144 ) ( 1368 -200 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 -208 -120 ) ( 904 -208 -152 ) ( 904 -200 -152 ) subway/1_lobby2 16 16 0 0.500000 0.500000 0 285212672 0 +( 1048 -208 -104 ) ( 968 -208 -104 ) ( 968 -200 -104 ) subway/1_tile_big_blue 0 -16 0 0.500000 0.500000 0 285212672 0 +( 856 -456 -152 ) ( 920 -456 -152 ) ( 920 -392 -152 ) subway/1_lobby2 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 237 +{ +( -56 296 -152 ) ( -32 272 -112 ) ( -32 328 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( -56 272 -112 ) ( -56 296 -152 ) ( -88 296 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( -24 328 -136 ) ( -88 328 -136 ) ( -88 328 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( -88 328 -112 ) ( -32 328 -112 ) ( -32 272 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( -56 320 -152 ) ( -56 328 -152 ) ( -56 324 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +} +// brush 238 +{ +( -56 272 -112 ) ( -56 296 -152 ) ( -88 296 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -88 296 -184 ) ( -88 320 -184 ) ( -88 320 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -24 328 -136 ) ( -88 328 -136 ) ( -88 328 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -88 328 -112 ) ( -32 328 -112 ) ( -32 272 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -88 328 -152 ) ( -88 296 -152 ) ( -56 296 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -56 328 -152 ) ( -56 320 -152 ) ( -56 324 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 239 +{ +( 104 296 -152 ) ( 136 296 -152 ) ( 136 328 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 272 -112 ) ( 80 328 -112 ) ( 136 328 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 328 -184 ) ( 136 328 -136 ) ( 72 328 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 320 -136 ) ( 136 320 -184 ) ( 136 296 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 296 -152 ) ( 72 296 -152 ) ( 104 296 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 288 -152 ) ( 104 336 -152 ) ( 104 312 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 240 +{ +( 80 272 -112 ) ( 80 328 -112 ) ( 136 328 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 136 328 -184 ) ( 136 328 -136 ) ( 72 328 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 80 328 -112 ) ( 80 272 -112 ) ( 104 296 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 136 296 -152 ) ( 72 296 -152 ) ( 104 296 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 104 336 -152 ) ( 104 288 -152 ) ( 104 312 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +} +// brush 241 +{ +( 80 272 -112 ) ( 80 328 -112 ) ( 136 328 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 136 320 -136 ) ( 136 320 -184 ) ( 136 296 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 136 296 -152 ) ( 104 296 -152 ) ( 104 272 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 80 328 -112 ) ( 80 272 -112 ) ( 104 296 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 72 296 -152 ) ( 136 296 -152 ) ( 104 296 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +} +// brush 242 +{ +( 1336 48 -136 ) ( 1336 80 -136 ) ( 1296 80 -136 ) subway/1_lobby2 47 31 90 0.500000 0.500000 0 285212672 0 +( 1272 48 -120 ) ( 1272 80 -120 ) ( 1328 80 -120 ) subway/1_lobby2 47 31 90 0.500000 0.500000 0 285212672 0 +( 1288 -32 -128 ) ( 1328 -32 -128 ) ( 1328 -32 -168 ) subway/1_lobby2 -16 16 -180 0.500000 -0.500000 0 285212672 0 +( 1328 48 -128 ) ( 1328 80 -128 ) ( 1328 80 -168 ) subway/1_lobby2 48 16 0 0.500000 0.500000 0 285212672 0 +( 1336 80 -128 ) ( 1296 80 -128 ) ( 1296 80 -168 ) subway/1_lobby2 -16 16 -180 0.500000 -0.500000 0 285212672 0 +( 1288 64 -136 ) ( 1288 80 -136 ) ( 1288 72 -120 ) subway/1_lobby2 -16 16 -180 0.500000 -0.500000 0 285212672 0 +} +// brush 243 +{ +( 1336 48 -136 ) ( 1336 80 -136 ) ( 1296 80 -136 ) subway/1_lobby2 47 32 90 0.500000 0.500000 64 285212672 0 +( 1272 48 -120 ) ( 1272 80 -120 ) ( 1328 80 -120 ) subway/1_lobby2 47 32 90 0.500000 0.500000 64 285212672 0 +( 1264 0 -120 ) ( 1264 -32 -120 ) ( 1280 -32 -136 ) subway/1_lobby2 47 32 90 0.500000 0.500000 64 285212672 0 +( 1288 -32 -128 ) ( 1328 -32 -128 ) ( 1328 -32 -168 ) subway/1_lobby2 -16 16 -180 0.500000 -0.500000 64 285212672 0 +( 1336 80 -128 ) ( 1296 80 -128 ) ( 1296 80 -168 ) subway/1_lobby2 -16 16 -180 0.500000 -0.500000 0 285212672 0 +( 1288 80 -136 ) ( 1288 64 -136 ) ( 1288 72 -120 ) subway/1_lobby2 47 32 90 0.500000 0.500000 64 285212672 0 +} +// brush 244 +{ +( 1328 80 -136 ) ( 1296 80 -136 ) ( 1296 80 -152 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +( 1328 48 -136 ) ( 1328 88 -136 ) ( 1328 80 -152 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +( 1280 -32 -144 ) ( 1320 -32 -144 ) ( 1320 -32 -184 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +( 1288 48 -136 ) ( 1288 80 -136 ) ( 1328 80 -136 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +( 1320 48 -152 ) ( 1320 80 -152 ) ( 1280 80 -152 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +( 1288 72 -152 ) ( 1288 80 -152 ) ( 1288 76 -136 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +} +// brush 245 +{ +( 1328 80 -136 ) ( 1296 80 -136 ) ( 1296 80 -152 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 64 285212672 0 +( 1280 -32 -144 ) ( 1320 -32 -144 ) ( 1320 -32 -184 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 64 285212672 0 +( 1280 0 -136 ) ( 1280 -32 -136 ) ( 1288 -32 -152 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 64 285212672 0 +( 1288 48 -136 ) ( 1288 80 -136 ) ( 1328 80 -136 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 64 285212672 0 +( 1288 80 -152 ) ( 1288 72 -152 ) ( 1288 76 -136 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 64 285212672 0 +} +// brush 246 +{ +( 1320 48 -216 ) ( 1320 80 -216 ) ( 1280 80 -216 ) subway/1_lobby1 47 31 90 0.500000 0.500000 0 285212672 0 +( 1296 80 -184 ) ( 1328 80 -184 ) ( 1328 48 -184 ) subway/1_lobby1 47 31 90 0.500000 0.500000 0 285212672 0 +( 1288 8 -184 ) ( 1288 -32 -184 ) ( 1288 -32 -200 ) subway/1_lobby1 48 16 0 0.500000 0.500000 0 285212672 0 +( 1288 -32 -192 ) ( 1328 -32 -192 ) ( 1328 -32 -232 ) subway/1_lobby1 -16 16 -180 0.500000 -0.500000 0 285212672 0 +( 1328 48 -184 ) ( 1328 88 -184 ) ( 1328 80 -200 ) subway/1_lobby1 48 16 0 0.500000 0.500000 0 285212672 0 +( 1328 80 -184 ) ( 1296 80 -184 ) ( 1296 80 -200 ) subway/1_lobby1 -16 16 -180 0.500000 -0.500000 0 285212672 0 +} +// brush 247 +{ +( 1328 80 -152 ) ( 1296 80 -152 ) ( 1296 80 -168 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +( 1328 48 -152 ) ( 1328 88 -152 ) ( 1328 80 -168 ) subway/1_lobby1a 48 0 0 0.500000 0.500000 0 285212672 0 +( 1288 -32 -160 ) ( 1328 -32 -160 ) ( 1328 -32 -200 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +( 1288 8 -152 ) ( 1288 -32 -152 ) ( 1288 -32 -168 ) subway/1_lobby1a 48 0 0 0.500000 0.500000 0 285212672 0 +( 1296 80 -152 ) ( 1328 80 -152 ) ( 1328 48 -152 ) subway/1_lobby1a 47 15 90 0.500000 0.500000 0 285212672 0 +( 1320 48 -184 ) ( 1320 80 -184 ) ( 1280 80 -184 ) subway/1_lobby1a 47 15 90 0.500000 0.500000 0 285212672 0 +} +// brush 248 +{ +( 1144 80 -128 ) ( 1104 80 -128 ) ( 1104 80 -168 ) subway/1_lobby2 -16 16 -180 0.500000 -0.500000 64 285212672 0 +( 1160 -32 -120 ) ( 1160 0 -120 ) ( 1136 0 -136 ) subway/1_lobby2 47 144 90 0.500000 -0.500000 64 285212672 0 +( 1104 -32 -128 ) ( 1144 -32 -128 ) ( 1144 -32 -168 ) subway/1_lobby2 -16 16 -180 0.500000 -0.500000 64 285212672 0 +( 1168 80 -120 ) ( 1168 48 -120 ) ( 1104 48 -120 ) subway/1_lobby2 47 144 90 0.500000 -0.500000 64 285212672 0 +( 1144 48 -136 ) ( 1144 80 -136 ) ( 1104 80 -136 ) subway/1_lobby2 47 144 90 0.500000 -0.500000 64 285212672 0 +( 1128 76 -136 ) ( 1128 84 -136 ) ( 1128 80 -120 ) subway/1_lobby2 47 144 90 0.500000 -0.500000 64 285212672 0 +} +// brush 249 +{ +( 1144 80 -128 ) ( 1104 80 -128 ) ( 1104 80 -168 ) subway/1_lobby2 -16 16 -180 0.500000 -0.500000 0 285212672 0 +( 1104 -32 -128 ) ( 1144 -32 -128 ) ( 1144 -32 -168 ) subway/1_lobby2 -16 16 -180 0.500000 -0.500000 0 285212672 0 +( 1104 80 -128 ) ( 1104 48 -128 ) ( 1104 48 -168 ) subway/1_lobby2 48 16 0 0.500000 0.500000 0 285212672 0 +( 1168 80 -120 ) ( 1168 48 -120 ) ( 1104 48 -120 ) subway/1_lobby2 47 31 90 0.500000 0.500000 0 285212672 0 +( 1144 48 -136 ) ( 1144 80 -136 ) ( 1104 80 -136 ) subway/1_lobby2 47 31 90 0.500000 0.500000 0 285212672 0 +( 1128 84 -136 ) ( 1128 76 -136 ) ( 1128 80 -120 ) subway/1_lobby2 47 31 90 0.500000 0.500000 0 285212672 0 +} +// brush 250 +{ +( 1136 80 -136 ) ( 1104 80 -136 ) ( 1104 80 -152 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 64 285212672 0 +( 1136 -32 -136 ) ( 1136 0 -136 ) ( 1128 0 -152 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 64 285212672 0 +( 1096 -32 -144 ) ( 1136 -32 -144 ) ( 1136 -32 -184 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 64 285212672 0 +( 1144 80 -136 ) ( 1144 48 -136 ) ( 1104 48 -136 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 64 285212672 0 +( 1128 76 -152 ) ( 1128 80 -152 ) ( 1128 78 -136 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 64 285212672 0 +} +// brush 251 +{ +( 1136 80 -136 ) ( 1104 80 -136 ) ( 1104 80 -152 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +( 1096 -32 -144 ) ( 1136 -32 -144 ) ( 1136 -32 -184 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +( 1104 88 -136 ) ( 1104 48 -136 ) ( 1104 48 -152 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +( 1144 80 -136 ) ( 1144 48 -136 ) ( 1104 48 -136 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +( 1128 48 -152 ) ( 1128 80 -152 ) ( 1088 80 -152 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +( 1128 80 -152 ) ( 1128 76 -152 ) ( 1128 78 -136 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +} +// brush 252 +{ +( 1136 80 -184 ) ( 1104 80 -184 ) ( 1104 80 -200 ) subway/1_lobby1 -16 16 -180 0.500000 -0.500000 0 285212672 0 +( 1128 -32 -184 ) ( 1128 8 -184 ) ( 1128 0 -200 ) subway/1_lobby1 48 16 0 0.500000 0.500000 0 285212672 0 +( 1096 -32 -192 ) ( 1136 -32 -192 ) ( 1136 -32 -232 ) subway/1_lobby1 -16 16 -180 0.500000 -0.500000 0 285212672 0 +( 1104 88 -184 ) ( 1104 48 -184 ) ( 1104 48 -200 ) subway/1_lobby1 48 16 0 0.500000 0.500000 0 285212672 0 +( 1104 80 -184 ) ( 1136 80 -184 ) ( 1136 48 -184 ) subway/1_lobby1 47 31 90 0.500000 0.500000 0 285212672 0 +( 1128 48 -216 ) ( 1128 80 -216 ) ( 1088 80 -216 ) subway/1_lobby1 47 31 90 0.500000 0.500000 0 285212672 0 +} +// brush 253 +{ +( 1128 48 -184 ) ( 1128 80 -184 ) ( 1088 80 -184 ) subway/1_lobby1a 47 15 90 0.500000 0.500000 0 285212672 0 +( 1104 80 -152 ) ( 1136 80 -152 ) ( 1136 48 -152 ) subway/1_lobby1a 47 15 90 0.500000 0.500000 0 285212672 0 +( 1104 88 -152 ) ( 1104 48 -152 ) ( 1104 48 -168 ) subway/1_lobby1a 48 0 0 0.500000 0.500000 0 285212672 0 +( 1096 -32 -160 ) ( 1136 -32 -160 ) ( 1136 -32 -200 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +( 1128 -32 -152 ) ( 1128 8 -152 ) ( 1128 0 -168 ) subway/1_lobby1a 48 0 0 0.500000 0.500000 0 285212672 0 +( 1136 80 -152 ) ( 1104 80 -152 ) ( 1104 80 -168 ) subway/1_lobby1a -16 0 -180 0.500000 -0.500000 0 285212672 0 +} +// brush 254 +{ +( 616 288 -152 ) ( 640 264 -112 ) ( 640 320 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 288 -184 ) ( 584 312 -184 ) ( 584 312 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 648 320 -136 ) ( 584 320 -136 ) ( 584 320 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 320 -112 ) ( 640 320 -112 ) ( 640 264 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 320 -152 ) ( 584 288 -152 ) ( 616 288 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 664 288 -152 ) ( 584 288 -152 ) ( 624 288 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 255 +{ +( 616 288 -152 ) ( 640 264 -112 ) ( 640 320 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 616 264 -112 ) ( 616 288 -152 ) ( 584 288 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 584 288 -184 ) ( 584 312 -184 ) ( 584 312 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 584 320 -112 ) ( 640 320 -112 ) ( 640 264 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 584 288 -152 ) ( 664 288 -152 ) ( 624 288 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +} +// brush 256 +{ +( 776 8 -152 ) ( 776 -24 -152 ) ( 808 -24 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 752 -32 -112 ) ( 752 0 -112 ) ( 800 0 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 -24 -184 ) ( 808 -24 -136 ) ( 808 40 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 800 -24 -136 ) ( 800 -24 -184 ) ( 776 -24 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 704 8 -136 ) ( 704 8 -152 ) ( 768 8 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 776 -8 -152 ) ( 776 16 -152 ) ( 776 4 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 257 +{ +( 752 -32 -112 ) ( 752 0 -112 ) ( 800 0 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 800 -24 -136 ) ( 800 -24 -184 ) ( 776 -24 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 776 -24 -152 ) ( 776 8 -152 ) ( 752 8 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 704 8 -136 ) ( 704 8 -152 ) ( 768 8 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 776 16 -152 ) ( 776 -8 -152 ) ( 776 4 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +} +// brush 258 +{ +( 808 112 -152 ) ( 808 144 -152 ) ( 776 144 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 88 -112 ) ( 752 88 -112 ) ( 752 168 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 752 88 -112 ) ( 808 88 -112 ) ( 808 112 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 144 -184 ) ( 808 120 -184 ) ( 808 120 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 776 168 -112 ) ( 776 144 -152 ) ( 808 144 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 776 152 -152 ) ( 776 176 -152 ) ( 776 164 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 259 +{ +( 808 88 -112 ) ( 752 88 -112 ) ( 752 168 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 752 88 -112 ) ( 808 88 -112 ) ( 808 112 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 776 168 -112 ) ( 776 144 -152 ) ( 808 144 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 776 144 -152 ) ( 752 168 -112 ) ( 752 112 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 776 176 -152 ) ( 776 152 -152 ) ( 776 164 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +} +// brush 260 +{ +( 640 112 -112 ) ( 640 168 -112 ) ( 616 144 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 584 88 -112 ) ( 640 88 -112 ) ( 616 112 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 584 168 -112 ) ( 640 168 -112 ) ( 640 88 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 568 144 -152 ) ( 664 144 -152 ) ( 616 144 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 616 128 -152 ) ( 616 152 -152 ) ( 616 140 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +} +// brush 261 +{ +( 584 120 -136 ) ( 584 120 -184 ) ( 584 144 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 88 -112 ) ( 640 88 -112 ) ( 616 112 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 168 -112 ) ( 640 168 -112 ) ( 640 88 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 616 144 -152 ) ( 584 144 -152 ) ( 584 112 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 568 144 -152 ) ( 664 144 -152 ) ( 616 144 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 616 152 -152 ) ( 616 128 -152 ) ( 616 140 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 262 +{ +( 640 112 -112 ) ( 640 168 -112 ) ( 616 144 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 584 120 -136 ) ( 584 120 -184 ) ( 584 144 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 584 168 -112 ) ( 640 168 -112 ) ( 640 88 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 640 168 -112 ) ( 584 168 -112 ) ( 584 144 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +( 664 144 -152 ) ( 568 144 -152 ) ( 616 144 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 64 318767104 0 +} +// brush 263 +{ +( 1872 2080 -376 ) ( 1896 2080 -376 ) ( 1896 2080 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2112 -376 ) ( 1912 2112 -424 ) ( 1912 1928 -424 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2088 -432 ) ( 1888 2088 -384 ) ( 1880 2088 -384 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1880 2112 -424 ) ( 1880 2112 -376 ) ( 1880 2056 -376 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1880 2072 -432 ) ( 1880 2080 -432 ) ( 1912 2076 -432 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2080 -448 ) ( 1880 2072 -448 ) ( 1912 2076 -448 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 264 +{ +( 1896 2016 -464 ) ( 1872 2016 -464 ) ( 1872 1992 -464 ) subway/1_tile 32 -16 0 0.500000 0.500000 0 318767104 0 +( 1872 2080 -376 ) ( 1896 2080 -376 ) ( 1896 2080 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2112 -376 ) ( 1912 2112 -424 ) ( 1912 1928 -424 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2088 -432 ) ( 1888 2088 -384 ) ( 1880 2088 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2112 -424 ) ( 1880 2112 -376 ) ( 1880 2056 -376 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2072 -448 ) ( 1880 2080 -448 ) ( 1912 2076 -448 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 265 +{ +( 1872 2064 -376 ) ( 1896 2064 -376 ) ( 1896 2064 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2096 -376 ) ( 1912 2096 -424 ) ( 1912 1912 -424 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2080 -432 ) ( 1888 2080 -384 ) ( 1880 2080 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2096 -424 ) ( 1880 2096 -376 ) ( 1880 2040 -376 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1880 2072 -432 ) ( 1880 2080 -432 ) ( 1912 2076 -432 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2080 -448 ) ( 1880 2072 -448 ) ( 1912 2076 -448 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 266 +{ +( 1896 2000 -464 ) ( 1872 2000 -464 ) ( 1872 1976 -464 ) subway/1_tile 32 -48 0 0.500000 0.500000 0 318767104 0 +( 1872 2064 -376 ) ( 1896 2064 -376 ) ( 1896 2064 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2096 -376 ) ( 1912 2096 -424 ) ( 1912 1912 -424 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2080 -432 ) ( 1888 2080 -384 ) ( 1880 2080 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2096 -424 ) ( 1880 2096 -376 ) ( 1880 2040 -376 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2072 -448 ) ( 1880 2080 -448 ) ( 1912 2076 -448 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 267 +{ +( 1872 2056 -376 ) ( 1896 2056 -376 ) ( 1896 2056 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2088 -376 ) ( 1912 2088 -424 ) ( 1912 1904 -424 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2064 -432 ) ( 1888 2064 -384 ) ( 1880 2064 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2088 -424 ) ( 1880 2088 -376 ) ( 1880 2032 -376 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1880 2072 -432 ) ( 1880 2080 -432 ) ( 1912 2076 -432 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2080 -448 ) ( 1880 2072 -448 ) ( 1912 2076 -448 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 268 +{ +( 1896 1992 -464 ) ( 1872 1992 -464 ) ( 1872 1968 -464 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2056 -376 ) ( 1896 2056 -376 ) ( 1896 2056 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2088 -376 ) ( 1912 2088 -424 ) ( 1912 1904 -424 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2064 -432 ) ( 1888 2064 -384 ) ( 1880 2064 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2088 -424 ) ( 1880 2088 -376 ) ( 1880 2032 -376 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2072 -448 ) ( 1880 2080 -448 ) ( 1912 2076 -448 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 269 +{ +( 1872 1992 -400 ) ( 1872 2016 -400 ) ( 1896 2016 -400 ) subway/1_tile 32 -16 0 0.500000 0.500000 0 318767104 0 +( 1872 2080 -376 ) ( 1896 2080 -376 ) ( 1896 2080 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2112 -376 ) ( 1912 2112 -424 ) ( 1912 1928 -424 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2088 -432 ) ( 1888 2088 -384 ) ( 1880 2088 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2112 -424 ) ( 1880 2112 -376 ) ( 1880 2056 -376 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2080 -432 ) ( 1880 2072 -432 ) ( 1912 2076 -432 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 270 +{ +( 1872 1968 -400 ) ( 1872 1992 -400 ) ( 1896 1992 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2056 -376 ) ( 1896 2056 -376 ) ( 1896 2056 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2088 -376 ) ( 1912 2088 -424 ) ( 1912 1904 -424 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2064 -432 ) ( 1888 2064 -384 ) ( 1880 2064 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2088 -424 ) ( 1880 2088 -376 ) ( 1880 2032 -376 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2080 -432 ) ( 1880 2072 -432 ) ( 1912 2076 -432 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 271 +{ +( 1872 1976 -408 ) ( 1872 2000 -408 ) ( 1896 2000 -408 ) subway/1_tile 32 -48 0 0.500000 0.500000 0 318767104 0 +( 1872 2064 -376 ) ( 1896 2064 -376 ) ( 1896 2064 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2096 -376 ) ( 1912 2096 -424 ) ( 1912 1912 -424 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2080 -432 ) ( 1888 2080 -384 ) ( 1880 2080 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2096 -424 ) ( 1880 2096 -376 ) ( 1880 2040 -376 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2080 -432 ) ( 1880 2072 -432 ) ( 1912 2076 -432 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 272 +{ +( 2152 1928 -400 ) ( 2144 1928 -400 ) ( 2144 1800 -400 ) subway/clip 0 16 0 0.500000 0.500000 131072 144 0 +( 2144 1800 -272 ) ( 2144 1928 -272 ) ( 2152 1928 -272 ) subway/clip 0 16 0 0.500000 0.500000 131072 144 0 +( 2144 1800 -352 ) ( 2152 1800 -352 ) ( 2152 1800 -384 ) subway/clip 0 16 0 0.500000 0.500000 131072 144 0 +( 2152 1800 -352 ) ( 2152 1928 -352 ) ( 2152 1928 -384 ) subway/clip 0 16 0 0.500000 0.500000 131072 144 0 +( 2152 1928 -352 ) ( 2144 1928 -352 ) ( 2144 1928 -384 ) subway/clip 0 16 0 0.500000 0.500000 131072 144 0 +( 2144 1928 -352 ) ( 2144 1800 -352 ) ( 2144 1800 -384 ) subway/clip 0 16 0 0.500000 0.500000 131072 144 0 +} +// brush 273 +{ +( 2208 1416 -544 ) ( 2176 1416 -544 ) ( 2176 1392 -544 ) subway/w_gardoor3 0 0 0 1 1 0 16777216 0 +( 2176 1392 -264 ) ( 2176 1416 -264 ) ( 2208 1416 -264 ) subway/w_gardoor3 0 0 0 1 1 0 16777216 0 +( 2176 1408 -264 ) ( 2208 1408 -264 ) ( 2208 1408 -544 ) subway/w_gardoor3 0 0 0 1 1 0 16777216 0 +( 2208 1392 -264 ) ( 2208 1416 -264 ) ( 2208 1416 -544 ) subway/w_gardoor3 0 0 0 1 1 0 16777216 0 +( 2208 1416 -264 ) ( 2176 1416 -264 ) ( 2176 1416 -544 ) subway/w_gardoor3 0 0 0 1 1 0 16777216 0 +( 2176 1416 -264 ) ( 2176 1392 -264 ) ( 2176 1392 -544 ) subway/w_gardoor3 0 0 0 1 1 0 16777216 0 +} +// brush 274 +{ +( 1626 1784 -312 ) ( 1626 1784 -552 ) ( 1626 -640 -552 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1626 1784 -552 ) ( 1626 1784 -312 ) ( 1624 1792 -312 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1624 1120 -368 ) ( 1624 1120 -352 ) ( 1624 1104 -352 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1620 1696 -312 ) ( 1628 1696 -312 ) ( 1628 1680 -312 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1632 1680 -552 ) ( 1632 1696 -552 ) ( 1624 1696 -552 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1712 -640 -552 ) ( 1584 -640 -552 ) ( 1648 -640 -312 ) subway/clip 0 0 0 1 1 134414336 144 0 +} +// brush 275 +{ +( 1626 -332 -552 ) ( 1626 -332 -536 ) ( 1626 -316 -536 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1624 1120 -368 ) ( 1624 1120 -352 ) ( 1624 1104 -352 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1628 -1888 -408 ) ( 1628 -1888 -392 ) ( 1636 -1888 -392 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1620 1696 -312 ) ( 1628 1696 -312 ) ( 1628 1680 -312 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1632 1680 -552 ) ( 1632 1696 -552 ) ( 1624 1696 -552 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1584 -640 -552 ) ( 1712 -640 -552 ) ( 1648 -640 -312 ) subway/clip 0 0 0 1 1 134414336 144 0 +} +// brush 276 +{ +( 1704 -876 -352 ) ( 1704 -804 -352 ) ( 1680 -804 -352 ) subway/light_yellow 0 16 0 0.250000 0.250000 134217792 16777217 30000 +( 1680 -844 -400 ) ( 1680 -844 -240 ) ( 1704 -844 -240 ) subway/1_black 0 0 0 1 1 134217792 16777216 0 +( 1688 -804 -400 ) ( 1688 -804 -240 ) ( 1688 -876 -240 ) subway/1_black 0 0 0 1 1 134217792 16777216 0 +( 1696 -836 -400 ) ( 1696 -836 -240 ) ( 1672 -836 -240 ) subway/1_black 0 0 0 1 1 134217792 16777216 0 +( 1696 -868 -400 ) ( 1696 -868 -240 ) ( 1696 -796 -240 ) subway/1_black -8 0 0 1 1 134217792 16777216 0 +( 1692 -836 -340 ) ( 1696 -844 -344 ) ( 1688 -844 -336 ) subway/1_black 0 8 0 1 1 134217792 16777216 0 +} +// brush 277 +{ +( 1784 596 -308 ) ( 1720 596 -308 ) ( 1720 592 -308 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1720 592 -292 ) ( 1720 596 -292 ) ( 1784 596 -292 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1720 592 -296 ) ( 1784 592 -296 ) ( 1784 592 -300 ) subway/1_danger 16 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1784 592 -296 ) ( 1784 596 -296 ) ( 1784 596 -300 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1784 596 -296 ) ( 1720 596 -296 ) ( 1720 596 -300 ) subway/1_danger 16 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1720 596 -296 ) ( 1720 592 -296 ) ( 1720 592 -300 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 278 +{ +( 1832 752 -352 ) ( 1824 752 -352 ) ( 1824 560 -352 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1824 560 -290 ) ( 1824 752 -290 ) ( 1832 752 -290 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1832 -280 -304 ) ( 1840 -280 -304 ) ( 1840 -280 -336 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1830 216 -304 ) ( 1830 408 -304 ) ( 1830 408 -336 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1832 752 -304 ) ( 1824 752 -304 ) ( 1824 752 -336 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1824 656 -306 ) ( 1824 464 -306 ) ( 1824 464 -338 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 279 +{ +( 1832 -280 -352 ) ( 1824 -280 -352 ) ( 1824 -472 -352 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1824 -472 -290 ) ( 1824 -280 -290 ) ( 1832 -280 -290 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1832 -1312 -304 ) ( 1840 -1312 -304 ) ( 1840 -1312 -336 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1830 -816 -304 ) ( 1830 -624 -304 ) ( 1830 -624 -336 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1832 -280 -304 ) ( 1824 -280 -304 ) ( 1824 -280 -336 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1824 -504 -306 ) ( 1824 -696 -306 ) ( 1824 -696 -338 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 280 +{ +( 1832 -1312 -336 ) ( 1824 -1312 -336 ) ( 1824 -1504 -336 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1824 -1504 -290 ) ( 1824 -1312 -290 ) ( 1832 -1312 -290 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1840 -2536 -304 ) ( 1848 -2536 -304 ) ( 1848 -2536 -336 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1830 -1848 -304 ) ( 1830 -1656 -304 ) ( 1830 -1656 -336 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1832 -1312 -304 ) ( 1824 -1312 -304 ) ( 1824 -1312 -336 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1824 -1536 -306 ) ( 1824 -1728 -306 ) ( 1824 -1728 -338 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 281 +{ +( 400 -664 -104 ) ( 264 -664 -104 ) ( 264 -664 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 264 -728 -104 ) ( 264 -600 -104 ) ( 400 -600 -104 ) subway/1_beam1 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 400 -600 -120 ) ( 264 -600 -120 ) ( 264 -728 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 380 -668 -120 ) ( 380 -676 -120 ) ( 380 -672 -104 ) subway/1_lobby3 0 0 0 1 1 134217728 285212672 0 +( 352 -696 -120 ) ( 352 -680 -120 ) ( 352 -688 -104 ) subway/1_lobby3 0 0 0 1 1 134217728 285212672 0 +( 376 -680 -120 ) ( 368 -680 -120 ) ( 372 -680 -104 ) subway/1_lobby3 0 0 0 1 1 134217728 285212672 0 +} +// brush 282 +{ +( 264 -728 -104 ) ( 264 -600 -104 ) ( 400 -600 -104 ) subway/1_beam1 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 400 -600 -120 ) ( 264 -600 -120 ) ( 264 -728 -120 ) subway/1_lobby3 0 1 0 0.500000 0.500000 134217728 285212672 0 +( 388 -700 -120 ) ( 384 -700 -120 ) ( 386 -700 -104 ) subway/1_lobby3 0 0 0 1 1 134217728 285212672 0 +( 380 -668 -120 ) ( 380 -676 -120 ) ( 380 -672 -104 ) subway/1_lobby3 0 0 0 1 1 134217728 285212672 0 +( 352 -696 -120 ) ( 352 -680 -120 ) ( 352 -688 -104 ) subway/1_lobby3 0 0 0 1 1 134217728 285212672 0 +( 368 -680 -120 ) ( 376 -680 -120 ) ( 372 -680 -104 ) subway/1_lobby3 0 0 0 1 1 134217728 285212672 0 +} +// brush 283 +{ +( 288 -600 -104 ) ( 288 -728 -104 ) ( 288 -728 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 400 -664 -104 ) ( 264 -664 -104 ) ( 264 -664 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 264 -728 -104 ) ( 264 -600 -104 ) ( 400 -600 -104 ) subway/1_beam1 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 400 -600 -120 ) ( 264 -600 -120 ) ( 264 -728 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 388 -700 -120 ) ( 384 -700 -120 ) ( 386 -700 -104 ) subway/1_lobby3 0 0 0 1 1 134217728 285212672 0 +( 352 -680 -120 ) ( 352 -696 -120 ) ( 352 -688 -104 ) subway/1_lobby3 0 0 0 1 1 134217728 285212672 0 +} +// brush 284 +{ +( 424 -688 0 ) ( 352 -728 0 ) ( 352 -728 10 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 30 +( 416 -664 0 ) ( 392 -728 0 ) ( 392 -728 10 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 30 +( 400 -664 -104 ) ( 264 -664 -104 ) ( 264 -664 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 264 -728 -104 ) ( 264 -600 -104 ) ( 400 -600 -104 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 400 -600 -120 ) ( 264 -600 -120 ) ( 264 -728 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 388 -700 -120 ) ( 384 -700 -120 ) ( 386 -700 -104 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 380 -676 -120 ) ( 380 -668 -120 ) ( 380 -672 -104 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +} +// brush 285 +{ +( 424 -688 0 ) ( 352 -728 0 ) ( 352 -728 10 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 30 +( 264 -728 -104 ) ( 264 -600 -104 ) ( 400 -600 -104 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 400 -600 -120 ) ( 264 -600 -120 ) ( 264 -728 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 384 -700 -120 ) ( 388 -700 -120 ) ( 386 -700 -104 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 352 -720 -120 ) ( 352 -712 -120 ) ( 352 -716 -104 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +} +// brush 286 +{ +( 288 -600 -104 ) ( 288 -728 -104 ) ( 288 -728 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 264 -728 -104 ) ( 400 -728 -104 ) ( 400 -728 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 30 +( 264 -728 -104 ) ( 264 -600 -104 ) ( 400 -600 -104 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 400 -600 -120 ) ( 264 -600 -120 ) ( 264 -728 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 384 -700 -120 ) ( 388 -700 -120 ) ( 386 -700 -104 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 352 -712 -120 ) ( 352 -720 -120 ) ( 352 -716 -104 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +} +// brush 287 +{ +( 576 -392 -184 ) ( 576 -392 -216 ) ( 584 -392 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -1152 -184 ) ( 584 -1152 -216 ) ( 584 -1296 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 392 -416 -216 ) ( 384 -416 -216 ) ( 384 -416 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -560 -184 ) ( 616 -496 -184 ) ( 680 -496 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 128 -216 ) ( 584 -112 -216 ) ( 592 -112 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 -406 -216 ) ( 568 -402 -216 ) ( 568 -404 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 288 +{ +( 576 -392 -184 ) ( 576 -392 -216 ) ( 584 -392 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 392 -416 -216 ) ( 384 -416 -216 ) ( 384 -416 -184 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 616 -560 -184 ) ( 616 -496 -184 ) ( 680 -496 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 128 -216 ) ( 584 -112 -216 ) ( 592 -112 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 566 -406 -216 ) ( 566 -402 -216 ) ( 566 -404 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 -402 -216 ) ( 568 -406 -216 ) ( 568 -404 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 289 +{ +( 368 128 -216 ) ( 368 128 -184 ) ( 368 -256 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 -392 -184 ) ( 576 -392 -216 ) ( 584 -392 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 392 -416 -216 ) ( 384 -416 -216 ) ( 384 -416 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -560 -184 ) ( 616 -496 -184 ) ( 680 -496 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 128 -216 ) ( 584 -112 -216 ) ( 592 -112 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 566 -402 -216 ) ( 566 -406 -216 ) ( 566 -404 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 290 +{ +( 584 -48 -216 ) ( 584 -288 -216 ) ( 592 -288 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -736 -184 ) ( 616 -672 -184 ) ( 680 -672 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 592 -608 -216 ) ( 584 -608 -216 ) ( 584 -608 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -1328 -184 ) ( 584 -1328 -216 ) ( 584 -1472 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 560 -568 -184 ) ( 560 -568 -216 ) ( 568 -568 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 -580 -216 ) ( 568 -572 -216 ) ( 568 -576 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 291 +{ +( 584 -48 -216 ) ( 584 -288 -216 ) ( 592 -288 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -736 -184 ) ( 616 -672 -184 ) ( 680 -672 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 592 -608 -216 ) ( 584 -608 -216 ) ( 584 -608 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 560 -568 -184 ) ( 560 -568 -216 ) ( 568 -568 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 552 -56 -216 ) ( 552 -56 -184 ) ( 552 -440 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 564 -572 -216 ) ( 564 -580 -216 ) ( 564 -576 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 292 +{ +( 328 -536 -512 ) ( 320 -536 -512 ) ( 320 -664 -512 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 320 -672 -480 ) ( 320 -544 -480 ) ( 328 -544 -480 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 320 -664 -464 ) ( 328 -664 -464 ) ( 328 -664 -512 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 328 -672 -480 ) ( 328 -544 -480 ) ( 328 -544 -528 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 328 -536 -464 ) ( 320 -536 -464 ) ( 320 -536 -512 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 320 -536 -464 ) ( 320 -664 -464 ) ( 320 -664 -512 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 293 +{ +( 128 -240 -520 ) ( 120 -240 -520 ) ( 120 -400 -520 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 120 -408 -488 ) ( 120 -248 -488 ) ( 128 -248 -488 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 120 -448 -480 ) ( 128 -448 -480 ) ( 128 -448 -488 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 128 -392 -512 ) ( 128 -232 -512 ) ( 128 -232 -520 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 128 -240 -480 ) ( 120 -240 -480 ) ( 120 -240 -488 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 120 -248 -488 ) ( 120 -408 -488 ) ( 120 -408 -496 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 294 +{ +( 0 -96 -520 ) ( 0 -32 -520 ) ( -64 -32 -520 ) subway/1_lobby_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( -64 -48 -512 ) ( 0 -48 -512 ) ( 0 -112 -512 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 128 -200 -520 ) ( 128 -264 -520 ) ( 128 -264 -528 ) subway/1_stair_side1 -8 0 0 0.500000 0.500000 0 285212672 0 +( 72 -728 -512 ) ( 136 -728 -512 ) ( 136 -728 -520 ) subway/1_lobby_floor 48 -32 0 0.500000 0.500000 0 285212672 0 +( 328 232 -512 ) ( 328 296 -512 ) ( 328 296 -520 ) subway/1_stair_side1 -8 0 0 0.500000 0.500000 0 285212672 0 +( 224 -432 -520 ) ( 272 -432 -520 ) ( 248 -432 -512 ) subway/1_lobby_floor 48 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 295 +{ +( 0 -96 -520 ) ( 0 -32 -520 ) ( -64 -32 -520 ) subway/1_lobby_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( -64 -48 -512 ) ( 0 -48 -512 ) ( 0 -112 -512 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 128 -200 -520 ) ( 128 -264 -520 ) ( 128 -264 -528 ) subway/1_stair_side1 -8 0 0 0.500000 0.500000 0 285212672 0 +( 328 232 -512 ) ( 328 296 -512 ) ( 328 296 -520 ) subway/1_stair_side1 -8 0 0 0.500000 0.500000 0 285212672 0 +( 8 -216 -512 ) ( -56 -216 -512 ) ( -56 -216 -520 ) subway/1_lobby_floor 48 -32 0 0.500000 0.500000 0 285212672 0 +( 272 -432 -520 ) ( 224 -432 -520 ) ( 248 -432 -512 ) subway/1_lobby_floor 48 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 296 +{ +( 0 -96 -488 ) ( 0 -32 -488 ) ( -64 -32 -488 ) subway/1_lobby_floor 448 -880 0 0.500000 0.500000 134217728 285212672 0 +( -64 -48 -480 ) ( 0 -48 -480 ) ( 0 -112 -480 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 128 -200 -488 ) ( 128 -264 -488 ) ( 128 -264 -496 ) subway/1_stair_side1 328 -368 0 0.500000 0.500000 134217728 285212672 0 +( 328 232 -480 ) ( 328 296 -480 ) ( 328 296 -488 ) subway/1_stair_side1 840 -368 0 0.500000 0.500000 134217728 285212672 0 +( 8 -216 -480 ) ( -56 -216 -480 ) ( -56 -216 -488 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 134217728 285212672 0 +( 272 -432 -488 ) ( 224 -432 -488 ) ( 248 -432 -480 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 297 +{ +( 0 -96 -488 ) ( 0 -32 -488 ) ( -64 -32 -488 ) subway/1_lobby_floor 448 -880 0 0.500000 0.500000 134217728 285212672 0 +( -64 -48 -480 ) ( 0 -48 -480 ) ( 0 -112 -480 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 128 -200 -488 ) ( 128 -264 -488 ) ( 128 -264 -496 ) subway/1_stair_side1 328 -368 0 0.500000 0.500000 134217728 285212672 0 +( 72 -728 -480 ) ( 136 -728 -480 ) ( 136 -728 -488 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 134217728 285212672 0 +( 328 232 -480 ) ( 328 296 -480 ) ( 328 296 -488 ) subway/1_stair_side1 840 -368 0 0.500000 0.500000 134217728 285212672 0 +( 224 -432 -488 ) ( 272 -432 -488 ) ( 248 -432 -480 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 298 +{ +( -2184 608 464 ) ( -2200 608 464 ) ( -2200 608 448 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2200 592 448 ) ( -2200 592 464 ) ( -2184 592 464 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -2184 592 464 ) ( -2216 592 464 ) ( -2216 608 464 ) subway/metal2 47 32 90 1 1 0 16777216 0 +( -2184 608 464 ) ( -2184 608 432 ) ( -2184 592 432 ) subway/metal2 0 48 90 1 1 0 16777216 0 +( -2184 608 432 ) ( -2216 608 464 ) ( -2216 592 464 ) subway/metal2 47 32 90 1 1 0 16777216 0 +} +// brush 299 +{ +( -2184 592 384 ) ( -2216 592 352 ) ( -2216 608 352 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +( -2184 592 352 ) ( -2184 592 384 ) ( -2184 608 384 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -2184 608 352 ) ( -2216 608 352 ) ( -2216 592 352 ) subway/metal_rust 0 -32 0 0.500000 0.500000 0 16777216 0 +( -2200 608 368 ) ( -2200 608 352 ) ( -2184 608 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2184 592 352 ) ( -2200 592 352 ) ( -2200 592 368 ) subway/metal2 0 32 90 1 1 0 16777216 0 +} +// brush 300 +{ +( -2280 592 368 ) ( -2280 592 352 ) ( -2296 592 352 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -2296 608 352 ) ( -2280 608 352 ) ( -2280 608 368 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2264 592 352 ) ( -2264 608 352 ) ( -2296 608 352 ) subway/metal_rust 0 -32 0 0.500000 0.500000 0 16777216 0 +( -2296 608 384 ) ( -2296 592 384 ) ( -2296 592 352 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -2264 608 352 ) ( -2264 592 352 ) ( -2296 592 384 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 301 +{ +( -2264 592 464 ) ( -2264 608 464 ) ( -2296 608 432 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +( -2296 592 432 ) ( -2296 608 432 ) ( -2296 608 464 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -2264 608 464 ) ( -2264 592 464 ) ( -2296 592 464 ) subway/metal2 47 32 90 1 1 0 16777216 0 +( -2296 592 464 ) ( -2280 592 464 ) ( -2280 592 448 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -2280 608 448 ) ( -2280 608 464 ) ( -2296 608 464 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 302 +{ +( 1520 1448 -204 ) ( 1516 1448 -204 ) ( 1516 1444 -204 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1516 1444 -200 ) ( 1516 1448 -200 ) ( 1520 1448 -200 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1516 1444 -196 ) ( 1520 1444 -196 ) ( 1520 1444 -260 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1519 1444 -196 ) ( 1519 1448 -196 ) ( 1519 1448 -260 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1520 1448 -196 ) ( 1516 1448 -196 ) ( 1516 1448 -260 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1517 1448 -196 ) ( 1517 1444 -196 ) ( 1517 1444 -260 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +} +// brush 303 +{ +( 1520 1448 -152 ) ( 1516 1448 -152 ) ( 1516 1444 -152 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1516 1444 -148 ) ( 1516 1448 -148 ) ( 1520 1448 -148 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1516 1444 -144 ) ( 1520 1444 -144 ) ( 1520 1444 -208 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1519 1444 -144 ) ( 1519 1448 -144 ) ( 1519 1448 -208 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1520 1448 -144 ) ( 1516 1448 -144 ) ( 1516 1448 -208 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1517 1448 -144 ) ( 1517 1444 -144 ) ( 1517 1444 -208 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +} +// brush 304 +{ +( 1524 1444 -176 ) ( 1516 1444 -176 ) ( 1516 1444 -192 ) subway/1_bath_stalldoor -16 -16 0 0.700000 1 134217728 16777216 0 +( 1520 1388 -176 ) ( 1520 1452 -176 ) ( 1520 1452 -192 ) subway/1_bath_stalldoor -44 -16 0 0.650000 1 134217728 16777216 0 +( 1516 1404 -176 ) ( 1524 1404 -176 ) ( 1524 1404 -192 ) subway/1_duct -24 0 -180 0.500000 -0.500000 134217728 16777216 0 +( 1516 1448 -176 ) ( 1516 1384 -176 ) ( 1516 1384 -192 ) subway/1_bath_stalldoor -44 -16 0 0.650000 1 134217728 16777216 0 +( 1516 1452 -144 ) ( 1524 1452 -144 ) ( 1524 1388 -144 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1524 1388 -208 ) ( 1524 1452 -208 ) ( 1516 1452 -208 ) subway/1_duct -24 23 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 305 +{ +( 1520 1352 -204 ) ( 1516 1352 -204 ) ( 1516 1348 -204 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1516 1348 -200 ) ( 1516 1352 -200 ) ( 1520 1352 -200 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1516 1348 -196 ) ( 1520 1348 -196 ) ( 1520 1348 -260 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1519 1348 -196 ) ( 1519 1352 -196 ) ( 1519 1352 -260 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1520 1352 -196 ) ( 1516 1352 -196 ) ( 1516 1352 -260 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1517 1352 -196 ) ( 1517 1348 -196 ) ( 1517 1348 -260 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +} +// brush 306 +{ +( 1520 1352 -152 ) ( 1516 1352 -152 ) ( 1516 1348 -152 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1516 1348 -148 ) ( 1516 1352 -148 ) ( 1520 1352 -148 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1516 1348 -144 ) ( 1520 1348 -144 ) ( 1520 1348 -208 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1519 1348 -144 ) ( 1519 1352 -144 ) ( 1519 1352 -208 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1520 1352 -144 ) ( 1516 1352 -144 ) ( 1516 1352 -208 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1517 1352 -144 ) ( 1517 1348 -144 ) ( 1517 1348 -208 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +} +// brush 307 +{ +( 1524 1348 -176 ) ( 1516 1348 -176 ) ( 1516 1348 -192 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1520 1292 -176 ) ( 1520 1356 -176 ) ( 1520 1356 -192 ) subway/1_bath_stalldoor -24 -16 0 0.650000 1 134217728 16777216 0 +( 1516 1308 -176 ) ( 1524 1308 -176 ) ( 1524 1308 -192 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1516 1352 -176 ) ( 1516 1288 -176 ) ( 1516 1288 -192 ) subway/1_bath_stalldoor -24 -16 0 0.650000 1 134217728 16777216 0 +( 1516 1356 -144 ) ( 1524 1356 -144 ) ( 1524 1292 -144 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1524 1292 -208 ) ( 1524 1356 -208 ) ( 1516 1356 -208 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +} +// brush 308 +{ +( 224 1344 -64 ) ( 192 1344 -64 ) ( 192 1336 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 192 1336 -48 ) ( 192 1344 -48 ) ( 224 1344 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 192 1336 -48 ) ( 224 1336 -48 ) ( 224 1336 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 224 1336 -48 ) ( 224 1344 -48 ) ( 224 1344 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 224 1344 -48 ) ( 192 1344 -48 ) ( 192 1344 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 192 1344 -48 ) ( 192 1336 -48 ) ( 192 1336 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 309 +{ +( 192 1376 -64 ) ( 184 1376 -64 ) ( 184 1336 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 184 1336 -48 ) ( 184 1376 -48 ) ( 192 1376 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 184 1336 -48 ) ( 192 1336 -48 ) ( 192 1336 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 192 1336 -48 ) ( 192 1376 -48 ) ( 192 1376 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 192 1376 -48 ) ( 184 1376 -48 ) ( 184 1376 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 184 1376 -48 ) ( 184 1336 -48 ) ( 184 1336 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 310 +{ +( 192 1376 -152 ) ( 184 1376 -152 ) ( 184 1336 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 184 1336 -64 ) ( 184 1376 -64 ) ( 192 1376 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 184 1336 -64 ) ( 192 1336 -64 ) ( 192 1336 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 192 1336 -64 ) ( 192 1376 -64 ) ( 192 1376 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 192 1376 -64 ) ( 184 1376 -64 ) ( 184 1376 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 184 1376 -64 ) ( 184 1336 -64 ) ( 184 1336 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +} +// brush 311 +{ +( 224 1344 -152 ) ( 192 1344 -152 ) ( 192 1336 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 192 1328 -64 ) ( 192 1336 -64 ) ( 224 1336 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 192 1336 -80 ) ( 224 1336 -80 ) ( 224 1336 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 224 1336 -136 ) ( 224 1344 -136 ) ( 224 1344 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 224 1344 -136 ) ( 192 1344 -136 ) ( 192 1344 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 192 1336 -80 ) ( 192 1328 -80 ) ( 192 1328 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +} +// brush 312 +{ +( 192 1376 -168 ) ( 184 1376 -168 ) ( 184 1336 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 184 1336 -152 ) ( 184 1376 -152 ) ( 192 1376 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 184 1336 -152 ) ( 192 1336 -152 ) ( 192 1336 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 192 1336 -152 ) ( 192 1376 -152 ) ( 192 1376 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 192 1376 -152 ) ( 184 1376 -152 ) ( 184 1376 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 184 1376 -152 ) ( 184 1336 -152 ) ( 184 1336 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 313 +{ +( 224 1344 -168 ) ( 192 1344 -168 ) ( 192 1336 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 10 +( 192 1336 -152 ) ( 192 1344 -152 ) ( 224 1344 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 10 +( 192 1336 -152 ) ( 224 1336 -152 ) ( 224 1336 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 10 +( 224 1336 -152 ) ( 224 1344 -152 ) ( 224 1344 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 10 +( 224 1344 -152 ) ( 192 1344 -152 ) ( 192 1344 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 10 +( 192 1344 -152 ) ( 192 1336 -152 ) ( 192 1336 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 10 +} +// brush 314 +{ +( 312 1384 -80 ) ( 72 1384 -80 ) ( 72 1376 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 312 1456 -48 ) ( 312 1416 -48 ) ( 72 1376 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 1376 -48 ) ( 72 1376 -80 ) ( 72 1392 -80 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 72 1384 -80 ) ( 312 1384 -80 ) ( 312 1416 -48 ) subway/1_tile_middle 0 48 0 0.500000 0.500000 0 318767104 10 +( 192 1416 -48 ) ( 192 1456 -48 ) ( 192 1392 -80 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 72 1376 -80 ) ( 72 1376 -48 ) ( 312 1376 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 248 1408 -64 ) ( 248 1336 -64 ) ( 258 1336 -64 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 315 +{ +( 312 1384 -80 ) ( 72 1384 -80 ) ( 72 1376 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 312 1456 -64 ) ( 312 1416 -64 ) ( 72 1376 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 1376 -48 ) ( 72 1376 -80 ) ( 72 1392 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 1384 -80 ) ( 312 1384 -80 ) ( 312 1416 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 192 1416 -48 ) ( 192 1456 -48 ) ( 192 1392 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 1376 -80 ) ( 72 1376 -48 ) ( 312 1376 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 316 +{ +( 160 -440 -400 ) ( 128 -440 -400 ) ( 128 -448 -400 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -448 -384 ) ( 128 -440 -384 ) ( 160 -440 -384 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -448 -384 ) ( 160 -448 -384 ) ( 160 -448 -400 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 160 -448 -384 ) ( 160 -440 -384 ) ( 160 -440 -400 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 160 -440 -384 ) ( 128 -440 -384 ) ( 128 -440 -400 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -440 -384 ) ( 128 -448 -384 ) ( 128 -448 -400 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 317 +{ +( 128 -408 -400 ) ( 120 -408 -400 ) ( 120 -448 -400 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 120 -448 -384 ) ( 120 -408 -384 ) ( 128 -408 -384 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 120 -448 -384 ) ( 128 -448 -384 ) ( 128 -448 -400 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -448 -384 ) ( 128 -408 -384 ) ( 128 -408 -400 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -408 -384 ) ( 120 -408 -384 ) ( 120 -408 -400 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 120 -408 -384 ) ( 120 -448 -384 ) ( 120 -448 -400 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 318 +{ +( 160 -440 -464 ) ( 128 -440 -464 ) ( 128 -448 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -448 -400 ) ( 128 -440 -400 ) ( 160 -440 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -448 -400 ) ( 160 -448 -400 ) ( 160 -448 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 160 -448 -448 ) ( 160 -440 -448 ) ( 160 -440 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 160 -440 -448 ) ( 128 -440 -448 ) ( 128 -440 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -440 -400 ) ( 128 -448 -400 ) ( 128 -448 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 319 +{ +( 128 -408 -464 ) ( 120 -408 -464 ) ( 120 -448 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 120 -448 -400 ) ( 120 -408 -400 ) ( 128 -408 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 120 -448 -400 ) ( 128 -448 -400 ) ( 128 -448 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -448 -400 ) ( 128 -408 -400 ) ( 128 -408 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -408 -448 ) ( 120 -408 -448 ) ( 120 -408 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 120 -408 -400 ) ( 120 -448 -400 ) ( 120 -448 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 320 +{ +( 128 -408 -480 ) ( 120 -408 -480 ) ( 120 -440 -480 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 0 318767104 0 +( 120 -440 -464 ) ( 120 -408 -464 ) ( 128 -408 -464 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 0 318767104 0 +( 120 -448 -464 ) ( 128 -448 -464 ) ( 128 -448 -480 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 0 318767104 0 +( 128 -440 -464 ) ( 128 -408 -464 ) ( 128 -408 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 128 -408 -464 ) ( 120 -408 -464 ) ( 120 -408 -480 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 0 318767104 0 +( 120 -416 -464 ) ( 120 -448 -464 ) ( 120 -448 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 321 +{ +( 168 -432 -512 ) ( 128 -432 -512 ) ( 128 -440 -512 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 128 -448 -464 ) ( 128 -440 -464 ) ( 168 -440 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 128 -448 -456 ) ( 168 -448 -456 ) ( 168 -448 -472 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 160 -448 -488 ) ( 160 -440 -488 ) ( 160 -440 -504 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 160 -440 -496 ) ( 120 -440 -496 ) ( 120 -440 -512 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 128 -440 -464 ) ( 128 -448 -464 ) ( 128 -448 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 322 +{ +( 1824 960 -204 ) ( 1820 960 -204 ) ( 1820 956 -204 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 956 -200 ) ( 1820 960 -200 ) ( 1824 960 -200 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 956 -196 ) ( 1824 956 -196 ) ( 1824 956 -260 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1823 956 -196 ) ( 1823 960 -196 ) ( 1823 960 -260 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 960 -196 ) ( 1820 960 -196 ) ( 1820 960 -260 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1821 960 -196 ) ( 1821 956 -196 ) ( 1821 956 -260 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 323 +{ +( 1824 960 -152 ) ( 1820 960 -152 ) ( 1820 956 -152 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 956 -148 ) ( 1820 960 -148 ) ( 1824 960 -148 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 956 -144 ) ( 1824 956 -144 ) ( 1824 956 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1823 956 -144 ) ( 1823 960 -144 ) ( 1823 960 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 960 -144 ) ( 1820 960 -144 ) ( 1820 960 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1821 960 -144 ) ( 1821 956 -144 ) ( 1821 956 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 324 +{ +( 1824 896 -186 ) ( 1824 960 -186 ) ( 1824 960 -202 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1820 924 -182 ) ( 1824 924 -182 ) ( 1824 924 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 964 -170 ) ( 1820 900 -170 ) ( 1820 900 -186 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1824 936 -192 ) ( 1820 936 -192 ) ( 1820 924 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 934 -188 ) ( 1824 934 -188 ) ( 1824 924 -182 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 936 -192 ) ( 1824 936 -192 ) ( 1824 934 -188 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 325 +{ +( 1824 896 -192 ) ( 1824 960 -192 ) ( 1824 960 -208 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1820 924 -176 ) ( 1828 924 -176 ) ( 1828 924 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 964 -176 ) ( 1820 900 -176 ) ( 1820 900 -192 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1828 900 -208 ) ( 1828 964 -208 ) ( 1820 964 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1828 916 -192 ) ( 1816 916 -192 ) ( 1822 956 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1812 948 -208 ) ( 1852 948 -208 ) ( 1832 948 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 326 +{ +( 1828 948 -160 ) ( 1820 948 -160 ) ( 1820 948 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 888 -144 ) ( 1824 952 -144 ) ( 1824 952 -160 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1820 952 -160 ) ( 1820 888 -160 ) ( 1820 888 -176 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1820 936 -192 ) ( 1824 936 -192 ) ( 1824 948 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 936 -192 ) ( 1820 936 -192 ) ( 1820 940 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 940 -176 ) ( 1820 948 -168 ) ( 1824 944 -172 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 327 +{ +( 1824 930 -160 ) ( 1820 930 -160 ) ( 1820 930 -168 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 868 -192 ) ( 1824 932 -192 ) ( 1824 932 -208 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1820 924 -192 ) ( 1828 924 -192 ) ( 1828 924 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 932 -192 ) ( 1820 868 -192 ) ( 1820 868 -208 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1820 930 -160 ) ( 1824 930 -160 ) ( 1824 924 -160 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 930 -168 ) ( 1820 930 -168 ) ( 1820 924 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 328 +{ +( 1824 874 -192 ) ( 1824 938 -192 ) ( 1824 938 -208 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1824 930 -168 ) ( 1820 930 -168 ) ( 1820 930 -160 ) subway/1_duct 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 1820 938 -192 ) ( 1820 874 -192 ) ( 1820 874 -208 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1820 936 -160 ) ( 1824 936 -160 ) ( 1824 930 -160 ) subway/1_duct 40 -12 0 0.500000 0.500000 134217728 16777216 0 +( 1824 934 -166 ) ( 1820 934 -166 ) ( 1820 930 -168 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 934 -166 ) ( 1824 934 -166 ) ( 1824 940 -160 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 329 +{ +( 1820 940 -160 ) ( 1824 940 -160 ) ( 1824 942 -164 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 940 -208 ) ( 1824 940 -192 ) ( 1824 1004 -192 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1820 948 -168 ) ( 1824 948 -168 ) ( 1824 948 -160 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 1004 -208 ) ( 1820 1004 -192 ) ( 1820 940 -192 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1824 940 -160 ) ( 1820 940 -160 ) ( 1820 948 -160 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 948 -168 ) ( 1820 942 -164 ) ( 1824 945 -166 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 330 +{ +( 1824 888 -176 ) ( 1824 952 -176 ) ( 1824 952 -192 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1820 916 -176 ) ( 1828 916 -176 ) ( 1828 916 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 960 -176 ) ( 1820 896 -176 ) ( 1820 896 -192 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1828 892 -208 ) ( 1828 956 -208 ) ( 1820 956 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1828 908 -144 ) ( 1816 908 -144 ) ( 1822 948 -144 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1812 924 -208 ) ( 1852 924 -208 ) ( 1832 924 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 331 +{ +( 1828 956 -176 ) ( 1820 956 -176 ) ( 1820 956 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 896 -176 ) ( 1824 960 -176 ) ( 1824 960 -192 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1820 960 -176 ) ( 1820 896 -176 ) ( 1820 896 -192 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1828 900 -208 ) ( 1828 964 -208 ) ( 1820 964 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1828 916 -144 ) ( 1816 916 -144 ) ( 1822 956 -144 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1852 948 -208 ) ( 1812 948 -208 ) ( 1832 948 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 332 +{ +( 1828 948 -176 ) ( 1820 948 -176 ) ( 1820 948 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 868 -176 ) ( 1824 932 -176 ) ( 1824 932 -192 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1820 924 -176 ) ( 1828 924 -176 ) ( 1828 924 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 932 -176 ) ( 1820 868 -176 ) ( 1820 868 -192 ) subway/1_bath_stalldoor 2 -16 0 0.650000 1 134217728 16777216 0 +( 1820 936 -144 ) ( 1828 936 -144 ) ( 1828 872 -144 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1816 888 -160 ) ( 1828 888 -160 ) ( 1822 928 -160 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 333 +{ +( 1820 2440 -536 ) ( 1812 2440 -536 ) ( 1812 2420 -536 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 1812 2420 -488 ) ( 1812 2440 -488 ) ( 1820 2440 -488 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 1812 1968 -536 ) ( 1812 1968 -488 ) ( 1816 1960 -488 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 1816 2340 -488 ) ( 1816 2360 -488 ) ( 1816 2360 -496 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 1812 2432 -488 ) ( 1812 2432 -536 ) ( 1816 2440 -536 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 1812 2432 -536 ) ( 1812 2432 -488 ) ( 1812 1968 -488 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +} +// brush 334 +{ +( -240 -1224 -256 ) ( -224 -1224 -240 ) ( -224 -1184 -240 ) subway/1_tile_middle 16 352 90 0.500000 0.500000 0 318767104 0 +( -280 -1240 -240 ) ( -232 -1240 -240 ) ( -240 -1224 -256 ) subway/1_tile_middle 320 -176 0 0.500000 0.500000 64 318767104 0 +( -296 -1152 -240 ) ( -296 -1240 -240 ) ( -296 -1224 -256 ) subway/1_tile_middle 320 -32 0 0.500000 0.500000 0 318767104 0 +( -296 -1240 -240 ) ( -296 -1152 -240 ) ( -224 -1152 -240 ) subway/1_tile_middle 320 -176 0 0.500000 0.500000 64 318767104 0 +( -296 -1264 -256 ) ( -264 -1264 -256 ) ( -264 -1224 -256 ) subway/1_tile_middle 320 -176 0 0.500000 0.500000 64 318767104 0 +( -120 -1216 -256 ) ( -96 -1216 -256 ) ( -108 -1216 -240 ) subway/1_tile_middle 320 -176 0 0.500000 0.500000 64 318767104 0 +} +// brush 335 +{ +( -296 -1168 -256 ) ( -240 -1168 -256 ) ( -240 -1224 -256 ) subway/1_tile 320 -192 0 0.500000 0.500000 64 318767104 0 +( -296 -1176 -256 ) ( -296 -1224 -256 ) ( -288 -1216 -272 ) subway/1_tile 320 -192 0 0.500000 0.500000 64 318767104 0 +( -280 -1224 -256 ) ( -240 -1224 -256 ) ( -248 -1216 -272 ) subway/1_tile 320 -192 0 0.500000 0.500000 64 318767104 0 +( -248 -1216 -272 ) ( -240 -1216 -256 ) ( -240 -1176 -256 ) subway/1_tile 320 -192 0 0.500000 0.500000 64 318767104 0 +( -120 -1216 -272 ) ( -96 -1216 -272 ) ( -108 -1216 -256 ) subway/1_tile 320 -192 0 0.500000 0.500000 64 318767104 0 +} +// brush 336 +{ +( -104 -1264 -256 ) ( -72 -1264 -256 ) ( -72 -1224 -256 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 64 318767104 0 +( -48 -1176 -240 ) ( -48 -1240 -240 ) ( -120 -1240 -240 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 64 318767104 0 +( -88 -1240 -240 ) ( -40 -1240 -240 ) ( -48 -1224 -256 ) subway/1_tile_middle 320 -176 0 0.500000 0.500000 64 318767104 0 +( -48 -1240 -240 ) ( -48 -1176 -240 ) ( -48 -1176 -256 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 64 318767104 0 +( -56 -1184 -256 ) ( -56 -1176 -256 ) ( -56 -1180 -240 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 64 318767104 0 +( -120 -1216 -256 ) ( -96 -1216 -256 ) ( -108 -1216 -240 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 64 318767104 0 +} +// brush 337 +{ +( -104 -1264 -256 ) ( -72 -1264 -256 ) ( -72 -1224 -256 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 64 318767104 0 +( -48 -1176 -240 ) ( -48 -1240 -240 ) ( -120 -1240 -240 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 64 318767104 0 +( -64 -1176 -200 ) ( -96 -1176 -200 ) ( -96 -1176 -240 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 64 318767104 0 +( -48 -1240 -240 ) ( -48 -1176 -240 ) ( -48 -1176 -256 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 64 318767104 0 +( -56 -1184 -256 ) ( -56 -1176 -256 ) ( -56 -1180 -240 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 64 318767104 0 +( -96 -1216 -256 ) ( -120 -1216 -256 ) ( -108 -1216 -240 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 64 318767104 0 +} +// brush 338 +{ +( -56 -1216 -272 ) ( -48 -1216 -256 ) ( -48 -1176 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -88 -1224 -256 ) ( -48 -1224 -256 ) ( -56 -1216 -272 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -104 -1224 -256 ) ( -104 -1176 -256 ) ( -48 -1176 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -56 -1184 -272 ) ( -56 -1176 -272 ) ( -56 -1180 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -120 -1216 -272 ) ( -96 -1216 -272 ) ( -108 -1216 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +} +// brush 339 +{ +( -56 -1216 -272 ) ( -48 -1216 -256 ) ( -48 -1176 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -64 -1176 -240 ) ( -96 -1176 -240 ) ( -96 -1176 -280 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -104 -1224 -256 ) ( -104 -1176 -256 ) ( -48 -1176 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -56 -1184 -272 ) ( -56 -1176 -272 ) ( -56 -1180 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( -96 -1216 -272 ) ( -120 -1216 -272 ) ( -108 -1216 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +} +// brush 340 +{ +( -104 -1264 -256 ) ( -72 -1264 -256 ) ( -72 -1224 -256 ) subway/1_tile_middle 320 -176 0 0.500000 0.500000 64 318767104 0 +( -48 -1176 -240 ) ( -48 -1240 -240 ) ( -120 -1240 -240 ) subway/1_tile_middle 320 -176 0 0.500000 0.500000 64 318767104 0 +( -120 -1176 -240 ) ( -120 -1240 -240 ) ( -104 -1224 -256 ) subway/1_tile_middle 16 336 90 0.500000 0.500000 0 318767104 0 +( -88 -1240 -240 ) ( -40 -1240 -240 ) ( -48 -1224 -256 ) subway/1_tile_middle 320 -176 0 0.500000 0.500000 64 318767104 0 +( -56 -1176 -256 ) ( -56 -1184 -256 ) ( -56 -1180 -240 ) subway/1_tile_middle 320 -176 0 0.500000 0.500000 64 318767104 0 +( -120 -1216 -256 ) ( -96 -1216 -256 ) ( -108 -1216 -240 ) subway/1_tile_middle 320 -176 0 0.500000 0.500000 64 318767104 0 +} +// brush 341 +{ +( -104 -1264 -256 ) ( -72 -1264 -256 ) ( -72 -1224 -256 ) subway/1_tile_middle 320 -528 0 0.500000 0.500000 0 318767104 0 +( -48 -1176 -240 ) ( -48 -1240 -240 ) ( -120 -1240 -240 ) subway/1_tile 320 -752 0 0.500000 0.500000 0 318767104 0 +( -64 -1176 -200 ) ( -96 -1176 -200 ) ( -96 -1176 -240 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 0 318767104 0 +( -120 -1176 -240 ) ( -120 -1240 -240 ) ( -104 -1224 -256 ) subway/1_tile_middle 16 336 90 0.500000 0.500000 0 318767104 0 +( -56 -1176 -256 ) ( -56 -1184 -256 ) ( -56 -1180 -240 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 0 318767104 0 +( -96 -1216 -256 ) ( -120 -1216 -256 ) ( -108 -1216 -240 ) subway/1_tile_middle 320 -192 0 0.500000 0.500000 0 318767104 0 +} +// brush 342 +{ +( -88 -1224 -256 ) ( -48 -1224 -256 ) ( -56 -1216 -272 ) subway/1_tile 320 -192 0 0.500000 0.500000 64 318767104 0 +( -104 -1176 -256 ) ( -104 -1224 -256 ) ( -96 -1216 -272 ) subway/1_tile 320 -192 0 0.500000 0.500000 64 318767104 0 +( -104 -1224 -256 ) ( -104 -1176 -256 ) ( -48 -1176 -256 ) subway/1_tile 320 -192 0 0.500000 0.500000 64 318767104 0 +( -56 -1176 -272 ) ( -56 -1184 -272 ) ( -56 -1180 -256 ) subway/1_tile 320 -192 0 0.500000 0.500000 64 318767104 0 +( -120 -1216 -272 ) ( -96 -1216 -272 ) ( -108 -1216 -256 ) subway/1_tile 320 -192 0 0.500000 0.500000 64 318767104 0 +} +// brush 343 +{ +( -104 -1176 -256 ) ( -104 -1224 -256 ) ( -96 -1216 -272 ) subway/1_tile 544 -192 0 0.500000 0.500000 0 318767104 0 +( -64 -1176 -240 ) ( -96 -1176 -240 ) ( -96 -1176 -280 ) subway/1_tile 320 -192 0 0.500000 0.500000 0 318767104 0 +( -104 -1224 -256 ) ( -104 -1176 -256 ) ( -48 -1176 -256 ) subway/1_tile 320 -544 0 0.500000 0.500000 0 318767104 0 +( -88 -1264 -272 ) ( -56 -1264 -272 ) ( -56 -1224 -272 ) subway/1_tile 320 -544 0 0.500000 0.500000 0 318767104 0 +( -56 -1176 -272 ) ( -56 -1184 -272 ) ( -56 -1180 -256 ) subway/1_tile 320 -544 0 0.500000 0.500000 0 318767104 0 +( -96 -1216 -272 ) ( -120 -1216 -272 ) ( -108 -1216 -256 ) subway/1_tile 320 -544 0 0.500000 0.500000 0 318767104 0 +} +// brush 344 +{ +( 1956 2592 -240 ) ( 1956 2576 -240 ) ( 2028 2576 -240 ) subway/1_black -15 11 -90 1 1 134217728 16777216 0 +( 2028 2576 -224 ) ( 1956 2576 -224 ) ( 1956 2592 -224 ) subway/1_black -15 11 -90 1 1 134217728 16777216 0 +( 2028 2576 -216 ) ( 2028 2592 -216 ) ( 2028 2592 -240 ) subway/1_black 0 0 -180 1 -1 134217728 16777216 0 +( 2028 2592 -224 ) ( 1956 2592 -224 ) ( 1956 2592 -248 ) subway/1_sign8 219 0 0 -0.500000 0.500000 134217728 16777216 0 +( 1964 2592 -216 ) ( 1964 2576 -216 ) ( 1964 2576 -240 ) subway/1_black 0 0 -180 1 -1 134217728 16777216 0 +( 1952 2588 -216 ) ( 2024 2588 -216 ) ( 2024 2588 -240 ) subway/1_sign8 171 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 345 +{ +( 1880 2304 -384 ) ( 1864 2304 -384 ) ( 1864 2232 -384 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +( 1864 2232 -368 ) ( 1864 2304 -368 ) ( 1880 2304 -368 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +( 1864 2232 -360 ) ( 1880 2232 -360 ) ( 1880 2232 -384 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 1880 2232 -368 ) ( 1880 2304 -368 ) ( 1880 2304 -392 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( 1880 2296 -360 ) ( 1864 2296 -360 ) ( 1864 2296 -384 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 1876 2308 -360 ) ( 1876 2236 -360 ) ( 1876 2236 -384 ) subway/1_sign8 -12 0 0 -0.500000 0.500000 134217728 16777216 0 +} +// brush 346 +{ +( -2520 760 320 ) ( -2528 760 320 ) ( -2528 592 320 ) subway/1_black 8 15 90 2 2 0 16777216 0 +( -2528 592 344 ) ( -2528 760 344 ) ( -2520 760 344 ) subway/1_black 8 15 90 2 2 0 16777216 0 +( -2528 592 344 ) ( -2520 592 344 ) ( -2520 592 320 ) subway/1_black 8 15 90 2 2 0 16777216 0 +( -2520 592 344 ) ( -2520 760 344 ) ( -2520 760 320 ) subway/1_black 8 15 90 2 2 0 16777216 0 +( -2520 760 344 ) ( -2528 760 344 ) ( -2528 760 320 ) subway/1_black 8 15 90 2 2 0 16777216 0 +( -2528 760 344 ) ( -2528 592 344 ) ( -2528 592 320 ) subway/1_black 8 15 90 2 2 0 16777216 0 +} +// brush 347 +{ +( -3128 784 264 ) ( -3136 784 264 ) ( -3136 592 264 ) subway/no_draw 16 0 0 1 1 0 128 0 +( -3136 592 488 ) ( -3136 784 488 ) ( -3128 784 488 ) subway/no_draw 16 0 0 1 1 0 128 0 +( -3136 592 480 ) ( -3128 592 480 ) ( -3128 592 312 ) subway/no_draw 16 0 0 1 1 0 128 0 +( -3128 592 480 ) ( -3128 784 480 ) ( -3128 784 312 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -3128 784 480 ) ( -3136 784 480 ) ( -3136 784 312 ) subway/no_draw 16 0 0 1 1 0 128 0 +( -3136 784 440 ) ( -3136 592 440 ) ( -3136 592 272 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 348 +{ +( -2680 784 488 ) ( -2688 784 488 ) ( -2688 592 488 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2688 592 632 ) ( -2688 784 632 ) ( -2680 784 632 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 15 +( -2688 592 632 ) ( -2680 592 632 ) ( -2680 592 136 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 15 +( -2680 592 632 ) ( -2680 784 632 ) ( -2680 784 136 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 15 +( -2680 904 632 ) ( -2688 904 632 ) ( -2688 904 136 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 15 +( -2688 904 632 ) ( -2688 712 632 ) ( -2688 712 136 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 15 +} +// brush 349 +{ +( -2680 776 488 ) ( -3048 776 488 ) ( -3048 592 488 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -3048 592 496 ) ( -3048 776 496 ) ( -2680 776 496 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -3048 592 496 ) ( -2680 592 496 ) ( -2680 592 328 ) subway/no_draw 0 16 0 1 1 0 128 0 +( -2688 592 496 ) ( -2688 776 496 ) ( -2688 776 328 ) subway/sky2 32 48 0 0.500000 0.500000 0 5 15 +( -2688 784 496 ) ( -3056 784 496 ) ( -3056 784 328 ) subway/no_draw 0 16 0 1 1 0 128 0 +( -3136 776 496 ) ( -3136 592 496 ) ( -3136 592 328 ) subway/no_draw 0 16 0 1 1 0 128 0 +} +// brush 350 +{ +( -2672 784 312 ) ( -3048 784 312 ) ( -3048 768 312 ) subway/no_draw 0 48 0 1 1 0 128 0 +( -3048 768 488 ) ( -3048 784 488 ) ( -2672 784 488 ) subway/no_draw 0 48 0 1 1 0 128 0 +( -3136 760 480 ) ( -2760 760 480 ) ( -2760 760 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2680 768 480 ) ( -2680 784 480 ) ( -2680 784 352 ) subway/no_draw -48 0 0 1 1 0 128 0 +( -2680 784 440 ) ( -3056 784 440 ) ( -3056 784 312 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -3136 784 480 ) ( -3136 768 480 ) ( -3136 768 352 ) subway/no_draw -48 0 0 1 1 0 128 0 +} +// brush 351 +{ +( -2680 768 344 ) ( -3048 768 344 ) ( -3048 600 344 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -3048 600 352 ) ( -3048 768 352 ) ( -2680 768 352 ) subway/1_black 8 15 90 2 2 0 16777216 0 +( -3048 584 328 ) ( -2680 584 328 ) ( -2680 584 256 ) subway/metalrib1 31 16 90 0.500000 0.500000 0 16777216 0 +( -2520 592 328 ) ( -2520 760 328 ) ( -2520 760 256 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2680 768 328 ) ( -3048 768 328 ) ( -3048 768 256 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -3136 768 328 ) ( -3136 600 328 ) ( -3136 600 256 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 352 +{ +( -2672 608 312 ) ( -3048 608 312 ) ( -3048 592 312 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -3048 592 488 ) ( -3048 608 488 ) ( -2672 608 488 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -3048 592 480 ) ( -2672 592 480 ) ( -2672 592 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2680 592 480 ) ( -2680 608 480 ) ( -2680 608 352 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 15 +( -2768 608 440 ) ( -3144 608 440 ) ( -3144 608 312 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -3136 608 480 ) ( -3136 592 480 ) ( -3136 592 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 353 +{ +( 872 -160 -184 ) ( 872 -160 -144 ) ( 872 -200 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 -200 -184 ) ( 872 -200 -144 ) ( 904 -200 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 -208 -184 ) ( 904 -208 -144 ) ( 904 -168 -144 ) subway/1_lobby1a 0 8 0 0.500000 0.500000 0 285212672 0 +( 872 -192 -136 ) ( 872 -152 -136 ) ( 904 -152 -136 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 -160 -152 ) ( 872 -200 -152 ) ( 904 -200 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 864 -160 -152 ) ( 928 -160 -152 ) ( 896 -160 -136 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 354 +{ +( 872 -160 -136 ) ( 872 -200 -136 ) ( 904 -200 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -192 -120 ) ( 872 -136 -120 ) ( 904 -136 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 -208 -168 ) ( 904 -208 -128 ) ( 904 -168 -128 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -200 -168 ) ( 872 -200 -128 ) ( 904 -200 -128 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -160 -168 ) ( 872 -160 -128 ) ( 872 -200 -128 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 864 -160 -136 ) ( 928 -160 -136 ) ( 896 -160 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 355 +{ +( 904 -8 -136 ) ( 872 -8 -136 ) ( 872 -48 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 -72 -120 ) ( 872 -72 -120 ) ( 872 -16 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 -40 -128 ) ( 904 0 -128 ) ( 904 0 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 16 -128 ) ( 872 16 -128 ) ( 872 16 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -8 -128 ) ( 872 -48 -128 ) ( 872 -48 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 912 -48 -136 ) ( 872 -48 -136 ) ( 892 -48 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 356 +{ +( 872 -8 -144 ) ( 872 -48 -144 ) ( 872 -48 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 16 -144 ) ( 872 16 -144 ) ( 872 16 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 -40 -144 ) ( 904 0 -144 ) ( 904 0 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 -56 -136 ) ( 872 -56 -136 ) ( 872 -16 -136 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 -8 -152 ) ( 872 -8 -152 ) ( 872 -48 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 912 -48 -152 ) ( 872 -48 -152 ) ( 892 -48 -136 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 357 +{ +( -624 -1096 -368 ) ( -640 -1096 -368 ) ( -640 -1160 -368 ) subway/clip 8 24 0 1 1 131072 144 0 +( -632 -1160 -240 ) ( -632 -1096 -240 ) ( -616 -1096 -240 ) subway/clip 8 24 0 1 1 131072 144 0 +( -640 -1152 -296 ) ( -624 -1152 -296 ) ( -624 -1152 -368 ) subway/clip 8 0 0 1 1 131072 144 0 +( -628 -1160 -296 ) ( -628 -1096 -296 ) ( -628 -1096 -368 ) subway/clip -24 0 0 1 1 131072 144 0 +( -616 -960 -296 ) ( -632 -960 -296 ) ( -632 -960 -368 ) subway/clip 8 0 0 1 1 131072 144 0 +( -636 -1096 -296 ) ( -636 -1160 -296 ) ( -636 -1160 -368 ) subway/clip -24 0 0 1 1 131072 144 0 +} +// brush 358 +{ +( 252 -960 -296 ) ( 244 -960 -296 ) ( 244 -980 -296 ) subway/clip 0 24 0 1 1 131072 144 0 +( 244 -980 -168 ) ( 244 -960 -168 ) ( 252 -960 -168 ) subway/clip 0 24 0 1 1 131072 144 0 +( 252 -1152 -224 ) ( 260 -1152 -224 ) ( 260 -1152 -296 ) subway/clip 0 0 0 1 1 131072 144 0 +( 252 -980 -224 ) ( 252 -960 -224 ) ( 252 -960 -296 ) subway/clip 8 0 0 1 1 131072 144 0 +( 252 -960 -224 ) ( 244 -960 -224 ) ( 244 -960 -296 ) subway/clip 0 0 0 1 1 131072 144 0 +( 244 -1076 -224 ) ( 244 -1096 -224 ) ( 244 -1096 -296 ) subway/clip 8 0 0 1 1 131072 144 0 +} +// brush 359 +{ +( 540 -960 -256 ) ( 540 -984 -264 ) ( 550 -984 -264 ) subway/metal_rust 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 540 -984 -240 ) ( 540 -960 -232 ) ( 550 -960 -232 ) subway/metal_rust 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 252 -960 -228 ) ( 252 -964 -228 ) ( 244 -964 -228 ) subway/metal_rust 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 252 -960 -256 ) ( 252 -960 -232 ) ( 244 -960 -232 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 252 -964 -260 ) ( 252 -960 -260 ) ( 244 -960 -260 ) subway/metal_rust 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 252 -964 -232 ) ( 252 -964 -256 ) ( 244 -964 -256 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 250 -964 -232 ) ( 250 -960 -232 ) ( 250 -960 -256 ) subway/metal_rust -48 0 0 0.500000 0.500000 134217728 16777216 0 +( 246 -960 -256 ) ( 246 -960 -232 ) ( 246 -964 -232 ) subway/metal_rust -48 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 360 +{ +( 250 -1048 -292 ) ( 250 -1052 -292 ) ( 250 -1052 -256 ) subway/metal_rust -48 -40 0 0.500000 0.500000 134217728 16777216 0 +( 246 -1052 -256 ) ( 246 -1052 -292 ) ( 246 -1048 -292 ) subway/metal_rust -48 -40 0 0.500000 0.500000 134217728 16777216 0 +( 348 -1048 -252 ) ( 340 -1048 -252 ) ( 340 -1048 -288 ) subway/metal_rust 0 -40 0 0.500000 0.500000 134217728 16777216 0 +( 252 -1052 -260 ) ( 244 -1052 -260 ) ( 244 -1048 -260 ) subway/metal_rust 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 252 -1052 -292 ) ( 244 -1052 -292 ) ( 244 -1052 -256 ) subway/metal_rust 0 -40 0 0.500000 0.500000 134217728 16777216 0 +( 252 -1048 -288 ) ( 244 -1048 -288 ) ( 244 -1052 -288 ) subway/metal_rust 0 8 0 0.500000 0.500000 134217728 16777216 0 +( -38 -1056 -288 ) ( -28 -1056 -288 ) ( -28 -1032 -280 ) subway/metal_rust 0 8 0 0.500000 0.500000 134217728 16777216 0 +( -38 -1008 -248 ) ( -28 -1008 -248 ) ( -28 -1056 -264 ) subway/metal_rust 0 8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 361 +{ +( 540 -1048 -296 ) ( 540 -1048 -248 ) ( 550 -1048 -248 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 252 -1152 -296 ) ( 244 -1152 -296 ) ( 244 -960 -232 ) subway/bars2 0 48 0 0.500000 0.500000 134217728 16779264 0 +( 244 -964 -256 ) ( 252 -964 -256 ) ( 252 -964 -224 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 252 -960 -256 ) ( 244 -960 -256 ) ( 244 -1152 -320 ) subway/bars2 0 48 0 0.500000 0.500000 134217728 16779264 0 +( 244 -1148 -288 ) ( 252 -1148 -288 ) ( 252 -1148 -320 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 250 -1008 -224 ) ( 250 -960 -224 ) ( 250 -960 -256 ) subway/bars2 -48 0 0 0.500000 0.500000 134217728 16779264 0 +( 246 -960 -256 ) ( 246 -960 -224 ) ( 246 -1008 -224 ) subway/bars2 -48 0 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 362 +{ +( 676 -536 -328 ) ( 612 -536 -328 ) ( 612 -600 -328 ) subway/metal_rust -16 48 0 0.500000 0.500000 134217728 16777216 0 +( 244 -960 -256 ) ( 252 -960 -256 ) ( 252 -1056 -288 ) subway/metal_rust -16 48 0 0.500000 0.500000 134217728 16777216 0 +( 252 -768 -304 ) ( 252 -768 -296 ) ( 252 -704 -296 ) subway/metal_rust -48 -40 0 0.500000 0.500000 134217728 16777216 0 +( 484 -1152 -304 ) ( 484 -1152 -296 ) ( 548 -1152 -296 ) subway/metal_rust 0 -56 0 0.500000 0.500000 134217728 16777216 0 +( 244 -160 -296 ) ( 244 -160 -288 ) ( 244 -224 -288 ) subway/metal_rust -48 -40 0 0.500000 0.500000 134217728 16777216 0 +( 252 -960 -256 ) ( 244 -960 -256 ) ( 244 -960 -296 ) subway/metal_rust 0 -56 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 363 +{ +( 252 -1152 -292 ) ( 244 -1152 -292 ) ( 244 -960 -228 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +( 244 -960 -232 ) ( 252 -960 -232 ) ( 252 -960 -200 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 252 -960 -232 ) ( 244 -960 -232 ) ( 244 -1152 -296 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +( 244 -1152 -264 ) ( 252 -1152 -264 ) ( 252 -1152 -296 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 252 -1008 -200 ) ( 252 -960 -200 ) ( 252 -960 -232 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( 244 -960 -232 ) ( 244 -960 -200 ) ( 244 -1008 -200 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +} +// brush 364 +{ +( 540 -1052 -260 ) ( 540 -1052 -300 ) ( 550 -1052 -300 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 246 -960 -256 ) ( 246 -960 -224 ) ( 246 -1008 -224 ) subway/bars2 -48 0 0 0.500000 0.500000 134217728 16779264 0 +( 250 -1008 -224 ) ( 250 -960 -224 ) ( 250 -960 -256 ) subway/bars2 -48 0 0 0.500000 0.500000 134217728 16779264 0 +( 244 -1148 -288 ) ( 252 -1148 -288 ) ( 252 -1148 -320 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 252 -960 -256 ) ( 244 -960 -256 ) ( 244 -1152 -320 ) subway/bars2 0 48 0 0.500000 0.500000 134217728 16779264 0 +( 244 -964 -256 ) ( 252 -964 -256 ) ( 252 -964 -224 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 252 -1152 -296 ) ( 244 -1152 -296 ) ( 244 -960 -232 ) subway/bars2 0 48 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 365 +{ +( 540 -1128 -312 ) ( 540 -1152 -320 ) ( 550 -1152 -320 ) subway/metal_rust 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 540 -1152 -296 ) ( 540 -1128 -288 ) ( 550 -1128 -288 ) subway/metal_rust 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 252 -1148 -292 ) ( 252 -1152 -292 ) ( 244 -1152 -292 ) subway/metal_rust 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 252 -1148 -324 ) ( 252 -1148 -292 ) ( 244 -1148 -292 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 252 -1152 -324 ) ( 252 -1148 -324 ) ( 244 -1148 -324 ) subway/metal_rust 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 252 -1152 -292 ) ( 252 -1152 -324 ) ( 244 -1152 -324 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 252 -1152 -292 ) ( 252 -1148 -292 ) ( 252 -1148 -324 ) subway/metal_rust -48 0 0 0.500000 0.500000 134217728 16777216 0 +( 244 -1148 -324 ) ( 244 -1148 -292 ) ( 244 -1152 -292 ) subway/metal_rust -48 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 366 +{ +( 224 -684 -256 ) ( 136 -684 -256 ) ( 136 -700 -256 ) subway/clip 32 52 0 1 1 131072 144 0 +( 136 -700 -120 ) ( 136 -684 -120 ) ( 224 -684 -120 ) subway/clip 32 52 0 1 1 131072 144 0 +( 144 -696 -112 ) ( 232 -696 -112 ) ( 232 -696 -256 ) subway/clip 32 0 0 1 1 131072 144 0 +( 232 -700 -112 ) ( 232 -684 -112 ) ( 232 -684 -256 ) subway/clip -28 0 0 1 1 131072 144 0 +( 224 -664 -112 ) ( 136 -664 -112 ) ( 136 -664 -256 ) subway/clip 32 0 0 1 1 131072 144 0 +( 136 -684 -112 ) ( 136 -700 -112 ) ( 136 -700 -256 ) subway/clip -28 0 0 1 1 131072 144 0 +} +// brush 367 +{ +( 232 -864 -256 ) ( 144 -864 -256 ) ( 144 -880 -256 ) subway/clip 24 0 0 1 1 131072 144 0 +( 144 -880 -120 ) ( 144 -864 -120 ) ( 232 -864 -120 ) subway/clip 24 0 0 1 1 131072 144 0 +( 144 -880 -112 ) ( 232 -880 -112 ) ( 232 -880 -256 ) subway/clip 24 0 0 1 1 131072 144 0 +( 232 -880 -112 ) ( 232 -864 -112 ) ( 232 -864 -256 ) subway/clip 24 0 0 1 1 131072 144 0 +( 232 -864 -112 ) ( 144 -864 -112 ) ( 144 -864 -256 ) subway/clip 24 0 0 1 1 131072 144 0 +( 144 -864 -112 ) ( 144 -880 -112 ) ( 144 -880 -256 ) subway/clip 24 0 0 1 1 131072 144 0 +} +// brush 368 +{ +( 776 184 -200 ) ( 776 248 -200 ) ( 776 248 -184 ) subway/clip 0 0 0 1 1 131072 144 0 +( 840 320 -184 ) ( 832 320 -184 ) ( 832 320 -200 ) subway/clip 0 0 0 1 1 131072 144 0 +( 808 176 -232 ) ( 808 152 -232 ) ( 808 152 -184 ) subway/clip 0 0 0 1 1 131072 144 0 +( 752 8 -184 ) ( 816 8 -184 ) ( 816 8 -232 ) subway/clip 0 0 0 1 1 131072 144 0 +( 808 48 -96 ) ( 808 112 -96 ) ( 872 112 -96 ) subway/clip 0 0 0 1 1 131072 144 0 +( 872 112 -200 ) ( 808 112 -200 ) ( 808 48 -200 ) subway/clip 0 0 0 1 1 131072 144 0 +} +// brush 369 +{ +( 584 -16 -200 ) ( 584 48 -200 ) ( 520 48 -200 ) subway/clip 0 0 0 1 1 131072 144 0 +( 520 48 -96 ) ( 584 48 -96 ) ( 584 -16 -96 ) subway/clip 0 0 0 1 1 131072 144 0 +( 576 8 -232 ) ( 576 8 -184 ) ( 640 8 -184 ) subway/clip 0 0 0 1 1 131072 144 0 +( 584 88 -184 ) ( 584 88 -232 ) ( 584 112 -232 ) subway/clip 0 0 0 1 1 131072 144 0 +( 568 112 -200 ) ( 568 112 -184 ) ( 560 112 -184 ) subway/clip 0 0 0 1 1 131072 144 0 +( 616 184 -184 ) ( 616 184 -200 ) ( 616 120 -200 ) subway/clip 0 0 0 1 1 131072 144 0 +} +// brush 370 +{ +( 552 352 -200 ) ( 616 352 -200 ) ( 616 416 -200 ) subway/clip 0 0 0 1 1 131072 144 0 +( 616 416 -96 ) ( 616 352 -96 ) ( 552 352 -96 ) subway/clip 0 0 0 1 1 131072 144 0 +( 680 320 -184 ) ( 616 320 -184 ) ( 616 320 -232 ) subway/clip 0 0 0 1 1 131072 144 0 +( 616 288 -232 ) ( 616 312 -232 ) ( 616 312 -184 ) subway/clip 0 0 0 1 1 131072 144 0 +( 592 288 -184 ) ( 600 288 -184 ) ( 600 288 -200 ) subway/clip 0 0 0 1 1 131072 144 0 +( 776 280 -200 ) ( 776 216 -200 ) ( 776 216 -184 ) subway/clip 0 0 0 1 1 131072 144 0 +} +// brush 371 +{ +( 40 136 -200 ) ( -56 136 -200 ) ( -56 112 -200 ) subway/clip 0 0 0 1 1 131072 144 0 +( -56 112 -96 ) ( -56 136 -96 ) ( 40 136 -96 ) subway/clip 0 0 0 1 1 131072 144 0 +( -56 112 -96 ) ( 40 112 -96 ) ( 40 112 -200 ) subway/clip 0 0 0 1 1 131072 144 0 +( 104 112 -96 ) ( 104 136 -96 ) ( 104 136 -200 ) subway/clip 0 0 0 1 1 131072 144 0 +( 40 144 -96 ) ( -56 144 -96 ) ( -56 144 -200 ) subway/clip 0 0 0 1 1 131072 144 0 +( -56 136 -96 ) ( -56 112 -96 ) ( -56 112 -200 ) subway/clip 0 0 0 1 1 131072 144 0 +} +// brush 372 +{ +( -152 328 -200 ) ( -88 328 -200 ) ( -88 392 -200 ) subway/clip 0 0 0 1 1 131072 144 0 +( -88 392 -96 ) ( -88 328 -96 ) ( -152 328 -96 ) subway/clip 0 0 0 1 1 131072 144 0 +( -24 296 -160 ) ( -88 296 -160 ) ( -88 296 -208 ) subway/clip 0 0 0 1 1 131072 144 0 +( -88 264 -208 ) ( -88 288 -208 ) ( -88 288 -160 ) subway/clip 0 0 0 1 1 131072 144 0 +( -104 112 -176 ) ( -96 112 -176 ) ( -96 112 -192 ) subway/clip 0 0 0 1 1 131072 144 0 +( -56 256 -176 ) ( -56 192 -176 ) ( -56 192 -160 ) subway/clip 0 0 0 1 1 131072 144 0 +} +// brush 373 +{ +( 64 584 -216 ) ( 8 584 -216 ) ( 8 544 -216 ) subway/clip 0 -24 0 1 1 131072 144 0 +( 8 544 -48 ) ( 8 584 -48 ) ( 64 584 -48 ) subway/clip 0 -24 0 1 1 131072 144 0 +( 8 552 -136 ) ( 64 552 -136 ) ( 64 552 -176 ) subway/clip 0 0 0 1 1 131072 144 0 +( 136 544 -136 ) ( 136 584 -136 ) ( 136 584 -176 ) subway/clip 24 0 0 1 1 131072 144 0 +( 64 560 -136 ) ( 8 560 -136 ) ( 8 560 -176 ) subway/clip 0 0 0 1 1 131072 144 0 +( 16 584 -136 ) ( 16 544 -136 ) ( 16 544 -176 ) subway/clip 24 0 0 1 1 131072 144 0 +} +// brush 374 +{ +( 64 736 -216 ) ( 8 736 -216 ) ( 8 696 -216 ) subway/clip 0 0 0 1 1 131072 144 0 +( 8 696 -48 ) ( 8 736 -48 ) ( 64 736 -48 ) subway/clip 0 0 0 1 1 131072 144 0 +( 8 704 -136 ) ( 64 704 -136 ) ( 64 704 -176 ) subway/clip 0 0 0 1 1 131072 144 0 +( 136 696 -136 ) ( 136 736 -136 ) ( 136 736 -176 ) subway/clip 0 0 0 1 1 131072 144 0 +( 64 744 -136 ) ( 8 744 -136 ) ( 8 744 -176 ) subway/clip 0 0 0 1 1 131072 144 0 +( 16 736 -136 ) ( 16 696 -136 ) ( 16 696 -176 ) subway/clip 0 0 0 1 1 131072 144 0 +} +// brush 375 +{ +( -1016 1152 -72 ) ( -1032 1152 -72 ) ( -1032 1112 -72 ) subway/clip 8 -56 0 1 1 131072 144 0 +( -1032 1112 128 ) ( -1032 1152 128 ) ( -1016 1152 128 ) subway/clip 8 -56 0 1 1 131072 144 0 +( -1032 1112 48 ) ( -1016 1112 48 ) ( -1016 1112 -72 ) subway/clip 8 0 0 1 1 131072 144 0 +( -1016 1112 48 ) ( -1016 1152 48 ) ( -1016 1152 -72 ) subway/clip 56 0 0 1 1 131072 144 0 +( -1016 1472 48 ) ( -1032 1472 48 ) ( -1032 1472 -72 ) subway/clip 8 0 0 1 1 131072 144 0 +( -1024 1144 48 ) ( -1024 1104 48 ) ( -1024 1104 -72 ) subway/clip 56 0 0 1 1 131072 144 0 +} +// brush 376 +{ +( -380 -680 -288 ) ( -340 -680 -288 ) ( -340 -680 -328 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -144 -576 -312 ) ( -144 -608 -312 ) ( -144 -608 -352 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -136 -572 -312 ) ( -136 -540 -312 ) ( -136 -540 -352 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -296 -720 -304 ) ( -336 -720 -304 ) ( -336 -688 -304 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -344 -696 -312 ) ( -344 -728 -312 ) ( -304 -728 -312 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( -144 -616 -320 ) ( -136 -616 -320 ) ( -140 -616 -304 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 377 +{ +( 712 1776 -8 ) ( 712 1496 -8 ) ( 712 1496 -224 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 656 928 -64 ) ( 720 928 -64 ) ( 720 864 -64 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +( 712 864 -168 ) ( 712 928 -168 ) ( 648 928 -168 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +( 704 792 -152 ) ( 720 792 -120 ) ( 704 792 -120 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +( 716 788 -64 ) ( 720 792 -168 ) ( 712 784 -168 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +} +// brush 378 +{ +( 840 1496 -224 ) ( 840 1496 -8 ) ( 840 1776 -8 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 832 864 -48 ) ( 832 928 -48 ) ( 896 928 -48 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +( 904 928 -208 ) ( 840 928 -208 ) ( 840 864 -208 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +( 896 792 -120 ) ( 880 792 -120 ) ( 896 792 -152 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +( 840 784 -168 ) ( 832 792 -168 ) ( 836 788 -64 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +} +// brush 379 +{ +( 840 -352 -8 ) ( 840 -72 -8 ) ( 840 -72 -224 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 896 496 -48 ) ( 832 496 -48 ) ( 832 560 -48 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +( 840 560 -208 ) ( 840 496 -208 ) ( 904 496 -208 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +( 896 632 -152 ) ( 880 632 -120 ) ( 896 632 -120 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +( 836 636 -64 ) ( 832 632 -168 ) ( 840 640 -168 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +} +// brush 380 +{ +( 712 -72 -224 ) ( 712 -72 -8 ) ( 712 -352 -8 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 720 560 -64 ) ( 720 496 -64 ) ( 656 496 -64 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +( 648 496 -168 ) ( 712 496 -168 ) ( 712 560 -168 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +( 704 632 -120 ) ( 720 632 -120 ) ( 704 632 -152 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +( 712 640 -168 ) ( 720 632 -168 ) ( 716 636 -64 ) subway/clip -16 0 0 0.500000 0.500000 196608 128 0 +} +// brush 381 +{ +( 1096 -24 -216 ) ( 1096 -32 -216 ) ( 1104 -32 -216 ) subway/clip -48 -32 0 1 1 196608 144 0 +( 1088 -32 -120 ) ( 1080 -32 -120 ) ( 1080 -24 -120 ) subway/clip -48 -32 0 1 1 196608 144 0 +( 1104 -24 -216 ) ( 1104 -24 -184 ) ( 1096 -24 -184 ) subway/clip -48 0 0 1 1 196608 144 0 +( 1104 -32 -216 ) ( 1104 -32 -184 ) ( 1104 -24 -184 ) subway/clip -16 0 0 1 1 196608 144 0 +( 1100 -28 -120 ) ( 1104 -32 -216 ) ( 1096 -24 -216 ) subway/clip -16 0 0 1 1 196608 144 0 +} +// brush 382 +{ +( 1104 80 -216 ) ( 1096 80 -216 ) ( 1096 72 -216 ) subway/clip -48 0 0 1 1 196608 144 0 +( 1080 72 -120 ) ( 1080 80 -120 ) ( 1088 80 -120 ) subway/clip -48 0 0 1 1 196608 144 0 +( 1096 72 -184 ) ( 1104 72 -184 ) ( 1104 72 -216 ) subway/clip -48 0 0 1 1 196608 144 0 +( 1104 72 -184 ) ( 1104 80 -184 ) ( 1104 80 -216 ) subway/clip -48 0 0 1 1 196608 144 0 +( 1096 72 -216 ) ( 1104 80 -216 ) ( 1100 76 -120 ) subway/clip -48 0 0 1 1 196608 144 0 +} +// brush 383 +{ +( 740 1152 -128 ) ( 692 1152 -128 ) ( 692 1136 -128 ) subway/glass_wire 0 0 45 0.500000 0.500000 0 620759040 0 +( 692 1136 -88 ) ( 692 1152 -88 ) ( 740 1152 -88 ) subway/glass_wire 0 0 45 0.500000 0.500000 0 620759040 0 +( 692 1130 -72 ) ( 740 1130 -72 ) ( 740 1130 -128 ) subway/glass_wire 0 0 45 0.500000 0.500000 0 620759040 0 +( 724 1136 -80 ) ( 724 1152 -80 ) ( 724 1152 -136 ) subway/glass_wire 0 0 45 0.500000 0.500000 0 620759040 0 +( 740 1134 -72 ) ( 692 1134 -72 ) ( 692 1134 -128 ) subway/glass_wire 0 0 45 0.500000 0.500000 0 620759040 0 +( 676 1152 -72 ) ( 676 1136 -72 ) ( 676 1136 -128 ) subway/glass_wire 0 0 45 0.500000 0.500000 0 620759040 0 +} +// brush 384 +{ +( 468 1096 -72 ) ( 468 1080 -72 ) ( 468 1080 -128 ) subway/glass_wire 0 0 45 0.500000 0.500000 0 620759040 0 +( 532 1134 -72 ) ( 484 1134 -72 ) ( 484 1134 -128 ) subway/glass_wire 0 0 45 0.500000 0.500000 0 620759040 0 +( 516 1136 -80 ) ( 516 1152 -80 ) ( 516 1152 -136 ) subway/glass_wire 0 0 45 0.500000 0.500000 0 620759040 0 +( 484 1130 -72 ) ( 532 1130 -72 ) ( 532 1130 -128 ) subway/glass_wire 0 0 45 0.500000 0.500000 0 620759040 0 +( 484 1136 -88 ) ( 484 1152 -88 ) ( 532 1152 -88 ) subway/glass_wire 0 0 45 0.500000 0.500000 0 620759040 0 +( 532 1152 -128 ) ( 484 1152 -128 ) ( 484 1136 -128 ) subway/glass_wire 0 0 45 0.500000 0.500000 0 620759040 0 +} +// brush 385 +{ +( 328 -624 -512 ) ( 160 -624 -512 ) ( 160 -720 -512 ) subway/hint 0 0 0 1 1 0 400 0 +( 160 -728 -376 ) ( 160 -632 -376 ) ( 328 -632 -376 ) subway/hint 0 0 0 1 1 0 400 0 +( 160 -536 -416 ) ( 328 -536 -416 ) ( 328 -536 -464 ) subway/skip 0 0 0 1 1 0 656 0 +( 328 -728 -416 ) ( 328 -632 -416 ) ( 328 -632 -464 ) subway/hint 0 0 0 1 1 0 400 0 +( 328 -528 -416 ) ( 160 -528 -416 ) ( 160 -528 -464 ) subway/hint 0 0 0 1 1 0 400 0 +( 160 -632 -416 ) ( 160 -728 -416 ) ( 160 -728 -464 ) subway/hint 0 0 0 1 1 0 400 0 +} +// brush 386 +{ +( 168 -1400 -240 ) ( 168 -1360 -240 ) ( 152 -1360 -256 ) subway/1_tile_middle -13 -14 90 0.500000 0.500000 64 318767104 0 +( 80 -1360 -240 ) ( 80 -1400 -240 ) ( 96 -1400 -256 ) subway/1_tile_middle -14 0 90 0.500000 0.500000 64 318767104 0 +( 112 -1400 -240 ) ( 112 -1400 -200 ) ( 144 -1400 -200 ) subway/1_tile_middle -16 -16 0 0.500000 0.500000 64 318767104 0 +( 80 -1400 -240 ) ( 80 -1360 -240 ) ( 168 -1360 -240 ) subway/1_tile_middle -16 -16 0 0.500000 0.500000 64 318767104 0 +( 136 -1352 -256 ) ( 136 -1312 -256 ) ( 104 -1312 -256 ) subway/1_tile_middle -16 -16 0 0.500000 0.500000 64 318767104 0 +( 104 -1360 -256 ) ( 160 -1360 -256 ) ( 132 -1360 -240 ) subway/1_tile_middle -16 -16 0 0.500000 0.500000 64 318767104 0 +} +// brush 387 +{ +( 168 -1400 -240 ) ( 168 -1360 -240 ) ( 152 -1360 -256 ) subway/1_tile_middle -13 -14 90 0.500000 0.500000 64 318767104 0 +( 168 -1336 -240 ) ( 112 -1336 -240 ) ( 112 -1352 -256 ) subway/1_tile_middle -16 -16 0 0.500000 0.500000 64 318767104 0 +( 80 -1336 -240 ) ( 80 -1360 -240 ) ( 96 -1360 -256 ) subway/1_tile_middle -14 0 90 0.500000 0.500000 64 318767104 0 +( 80 -1360 -240 ) ( 80 -1336 -240 ) ( 168 -1336 -240 ) subway/1_tile_middle -16 -16 0 0.500000 0.500000 64 318767104 0 +( 96 -1352 -256 ) ( 96 -1360 -256 ) ( 152 -1360 -256 ) subway/1_tile_middle -16 -16 0 0.500000 0.500000 64 318767104 0 +( 136 -1360 -256 ) ( 80 -1360 -256 ) ( 108 -1360 -240 ) subway/1_tile_middle -16 -16 0 0.500000 0.500000 64 318767104 0 +} +// brush 388 +{ +( 104 -1360 -272 ) ( 104 -1400 -272 ) ( 144 -1400 -272 ) subway/1_tile -16 0 0 0.500000 0.500000 64 318767104 0 +( 112 -1352 -256 ) ( 152 -1352 -256 ) ( 152 -1400 -256 ) subway/1_tile -16 0 0 0.500000 0.500000 64 318767104 0 +( 112 -1400 -280 ) ( 112 -1400 -240 ) ( 144 -1400 -240 ) subway/1_tile -16 0 0 0.500000 0.500000 64 318767104 0 +( 104 -1400 -272 ) ( 104 -1360 -272 ) ( 96 -1360 -256 ) subway/1_tile 16 0 0 0.500000 0.500000 64 318767104 0 +( 152 -1400 -256 ) ( 152 -1360 -256 ) ( 144 -1360 -272 ) subway/1_tile 16 0 0 0.500000 0.500000 64 318767104 0 +( 104 -1360 -272 ) ( 160 -1360 -272 ) ( 132 -1360 -256 ) subway/1_tile -16 0 0 0.500000 0.500000 64 318767104 0 +} +// brush 389 +{ +( 96 -1360 -256 ) ( 96 -1352 -256 ) ( 152 -1352 -256 ) subway/1_tile -16 0 0 0.500000 0.500000 64 318767104 0 +( 96 -1352 -256 ) ( 96 -1360 -256 ) ( 104 -1360 -272 ) subway/1_tile 16 0 0 0.500000 0.500000 64 318767104 0 +( 152 -1352 -256 ) ( 112 -1352 -256 ) ( 112 -1360 -272 ) subway/1_tile -16 0 0 0.500000 0.500000 64 318767104 0 +( 152 -1400 -256 ) ( 152 -1360 -256 ) ( 144 -1360 -272 ) subway/1_tile 16 0 0 0.500000 0.500000 64 318767104 0 +( 160 -1360 -272 ) ( 104 -1360 -272 ) ( 132 -1360 -256 ) subway/1_tile -16 0 0 0.500000 0.500000 64 318767104 0 +} +// brush 390 +{ +( -104 -1360 -256 ) ( -104 -1352 -256 ) ( -48 -1352 -256 ) subway/1_tile 0 0 0 0.500000 0.500000 64 318767104 0 +( -104 -1352 -256 ) ( -104 -1360 -256 ) ( -96 -1360 -272 ) subway/1_tile 16 0 0 0.500000 0.500000 64 318767104 0 +( -48 -1352 -256 ) ( -88 -1352 -256 ) ( -88 -1360 -272 ) subway/1_tile 0 0 0 0.500000 0.500000 64 318767104 0 +( -48 -1400 -256 ) ( -48 -1360 -256 ) ( -56 -1360 -272 ) subway/1_tile 16 0 0 0.500000 0.500000 64 318767104 0 +( -40 -1360 -272 ) ( -96 -1360 -272 ) ( -68 -1360 -256 ) subway/1_tile 0 0 0 0.500000 0.500000 64 318767104 0 +} +// brush 391 +{ +( -96 -1360 -272 ) ( -96 -1400 -272 ) ( -56 -1400 -272 ) subway/1_tile 0 0 0 0.500000 0.500000 64 318767104 0 +( -88 -1352 -256 ) ( -48 -1352 -256 ) ( -48 -1400 -256 ) subway/1_tile 0 0 0 0.500000 0.500000 64 318767104 0 +( -88 -1400 -280 ) ( -88 -1400 -240 ) ( -56 -1400 -240 ) subway/1_tile 0 0 0 0.500000 0.500000 64 318767104 0 +( -96 -1400 -272 ) ( -96 -1360 -272 ) ( -104 -1360 -256 ) subway/1_tile 16 0 0 0.500000 0.500000 64 318767104 0 +( -48 -1400 -256 ) ( -48 -1360 -256 ) ( -56 -1360 -272 ) subway/1_tile 16 0 0 0.500000 0.500000 64 318767104 0 +( -96 -1360 -272 ) ( -40 -1360 -272 ) ( -68 -1360 -256 ) subway/1_tile 0 0 0 0.500000 0.500000 64 318767104 0 +} +// brush 392 +{ +( -32 -1400 -240 ) ( -32 -1360 -240 ) ( -48 -1360 -256 ) subway/1_tile_middle -14 -31 90 0.500000 0.500000 64 318767104 0 +( -32 -1336 -240 ) ( -88 -1336 -240 ) ( -88 -1352 -256 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 64 318767104 0 +( -120 -1336 -240 ) ( -120 -1360 -240 ) ( -104 -1360 -256 ) subway/1_tile_middle -15 -16 90 0.500000 0.500000 64 318767104 0 +( -120 -1360 -240 ) ( -120 -1336 -240 ) ( -32 -1336 -240 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 64 318767104 0 +( -104 -1352 -256 ) ( -104 -1360 -256 ) ( -48 -1360 -256 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 64 318767104 0 +( -64 -1360 -256 ) ( -120 -1360 -256 ) ( -92 -1360 -240 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 64 318767104 0 +} +// brush 393 +{ +( -32 -1400 -240 ) ( -32 -1360 -240 ) ( -48 -1360 -256 ) subway/1_tile_middle -14 -31 90 0.500000 0.500000 64 318767104 0 +( -120 -1360 -240 ) ( -120 -1400 -240 ) ( -104 -1400 -256 ) subway/1_tile_middle -15 -16 90 0.500000 0.500000 64 318767104 0 +( -88 -1400 -240 ) ( -88 -1400 -200 ) ( -56 -1400 -200 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 64 318767104 0 +( -120 -1400 -240 ) ( -120 -1360 -240 ) ( -32 -1360 -240 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 64 318767104 0 +( -64 -1352 -256 ) ( -64 -1312 -256 ) ( -96 -1312 -256 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 64 318767104 0 +( -96 -1360 -256 ) ( -40 -1360 -256 ) ( -68 -1360 -240 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 64 318767104 0 +} +// brush 394 +{ +( -224 -1400 -240 ) ( -224 -1360 -240 ) ( -240 -1360 -256 ) subway/1_tile_middle -15 0 90 0.500000 0.500000 64 318767104 0 +( -312 -1360 -240 ) ( -312 -1400 -240 ) ( -296 -1400 -256 ) subway/1_tile_middle 720 -496 90 0.500000 0.500000 64 318767104 0 +( -280 -1400 -240 ) ( -280 -1400 -200 ) ( -248 -1400 -200 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 64 318767104 0 +( -312 -1400 -240 ) ( -312 -1360 -240 ) ( -224 -1360 -240 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 64 318767104 0 +( -256 -1352 -256 ) ( -256 -1312 -256 ) ( -288 -1312 -256 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 64 318767104 0 +( -288 -1360 -256 ) ( -232 -1360 -256 ) ( -260 -1360 -240 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 64 318767104 0 +} +// brush 395 +{ +( -224 -1400 -240 ) ( -224 -1360 -240 ) ( -240 -1360 -256 ) subway/1_tile_middle -15 0 90 0.500000 0.500000 64 318767104 0 +( -224 -1336 -240 ) ( -280 -1336 -240 ) ( -280 -1352 -256 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 64 318767104 0 +( -312 -1336 -240 ) ( -312 -1360 -240 ) ( -296 -1360 -256 ) subway/1_tile_middle 720 -496 90 0.500000 0.500000 64 318767104 0 +( -312 -1360 -240 ) ( -312 -1336 -240 ) ( -224 -1336 -240 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 64 318767104 0 +( -296 -1352 -256 ) ( -296 -1360 -256 ) ( -240 -1360 -256 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 64 318767104 0 +( -256 -1360 -256 ) ( -312 -1360 -256 ) ( -284 -1360 -240 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 64 318767104 0 +} +// brush 396 +{ +( -288 -1360 -272 ) ( -288 -1400 -272 ) ( -248 -1400 -272 ) subway/1_tile 0 0 0 0.500000 0.500000 64 318767104 0 +( -280 -1352 -256 ) ( -240 -1352 -256 ) ( -240 -1400 -256 ) subway/1_tile 0 0 0 0.500000 0.500000 64 318767104 0 +( -280 -1400 -280 ) ( -280 -1400 -240 ) ( -248 -1400 -240 ) subway/1_tile 0 0 0 0.500000 0.500000 64 318767104 0 +( -288 -1400 -272 ) ( -288 -1360 -272 ) ( -296 -1360 -256 ) subway/1_tile 16 0 0 0.500000 0.500000 64 318767104 0 +( -240 -1400 -256 ) ( -240 -1360 -256 ) ( -248 -1360 -272 ) subway/1_tile 16 0 0 0.500000 0.500000 64 318767104 0 +( -288 -1360 -272 ) ( -232 -1360 -272 ) ( -260 -1360 -256 ) subway/1_tile 0 0 0 0.500000 0.500000 64 318767104 0 +} +// brush 397 +{ +( -296 -1360 -256 ) ( -296 -1352 -256 ) ( -240 -1352 -256 ) subway/1_tile 0 0 0 0.500000 0.500000 64 318767104 0 +( -296 -1352 -256 ) ( -296 -1360 -256 ) ( -288 -1360 -272 ) subway/1_tile 16 0 0 0.500000 0.500000 64 318767104 0 +( -240 -1352 -256 ) ( -280 -1352 -256 ) ( -280 -1360 -272 ) subway/1_tile 0 0 0 0.500000 0.500000 64 318767104 0 +( -240 -1400 -256 ) ( -240 -1360 -256 ) ( -248 -1360 -272 ) subway/1_tile 16 0 0 0.500000 0.500000 64 318767104 0 +( -232 -1360 -272 ) ( -288 -1360 -272 ) ( -260 -1360 -256 ) subway/1_tile 0 0 0 0.500000 0.500000 64 318767104 0 +} +// brush 398 +{ +( -480 -1352 -256 ) ( -440 -1352 -256 ) ( -440 -1400 -256 ) subway/1_tile 720 -192 0 0.500000 0.500000 64 318767104 0 +( -480 -1400 -272 ) ( -480 -1400 -232 ) ( -480 -1440 -232 ) subway/1_tile 720 -192 0 0.500000 0.500000 64 318767104 0 +( -440 -1352 -256 ) ( -480 -1352 -256 ) ( -480 -1360 -272 ) subway/1_tile 720 -192 0 0.500000 0.500000 64 318767104 0 +( -440 -1400 -256 ) ( -440 -1360 -256 ) ( -448 -1360 -272 ) subway/1_tile 720 -192 0 0.500000 0.500000 64 318767104 0 +( -432 -1360 -272 ) ( -488 -1360 -272 ) ( -460 -1360 -256 ) subway/1_tile 720 -192 0 0.500000 0.500000 64 318767104 0 +} +// brush 399 +{ +( -448 -1352 -272 ) ( -448 -1312 -272 ) ( -480 -1312 -272 ) subway/1_tile 720 -192 0 0.500000 0.500000 64 318767104 0 +( -480 -1352 -256 ) ( -440 -1352 -256 ) ( -440 -1400 -256 ) subway/1_tile 720 -192 0 0.500000 0.500000 64 318767104 0 +( -480 -1400 -280 ) ( -480 -1400 -240 ) ( -448 -1400 -240 ) subway/1_tile 720 -192 0 0.500000 0.500000 64 318767104 0 +( -480 -1400 -272 ) ( -480 -1400 -232 ) ( -480 -1440 -232 ) subway/1_tile 720 -192 0 0.500000 0.500000 64 318767104 0 +( -440 -1400 -256 ) ( -440 -1360 -256 ) ( -448 -1360 -272 ) subway/1_tile 720 -192 0 0.500000 0.500000 64 318767104 0 +( -488 -1360 -272 ) ( -432 -1360 -272 ) ( -460 -1360 -256 ) subway/1_tile 720 -192 0 0.500000 0.500000 64 318767104 0 +} +// brush 400 +{ +( -424 -1400 -240 ) ( -424 -1360 -240 ) ( -440 -1360 -256 ) subway/1_tile_middle 720 -496 90 0.500000 0.500000 64 318767104 0 +( -424 -1336 -240 ) ( -480 -1336 -240 ) ( -480 -1352 -256 ) subway/1_tile_middle 720 -496 0 0.500000 0.500000 64 318767104 0 +( -480 -1400 -240 ) ( -480 -1400 -200 ) ( -480 -1440 -200 ) subway/1_tile_middle 720 -496 0 0.500000 0.500000 64 318767104 0 +( -480 -1336 -240 ) ( -424 -1336 -240 ) ( -424 -1400 -240 ) subway/1_tile_middle 720 -496 0 0.500000 0.500000 64 318767104 0 +( -456 -1352 -256 ) ( -456 -1312 -256 ) ( -488 -1312 -256 ) subway/1_tile_middle 720 -496 0 0.500000 0.500000 64 318767104 0 +( -432 -1360 -256 ) ( -488 -1360 -256 ) ( -460 -1360 -240 ) subway/1_tile_middle 720 -496 0 0.500000 0.500000 64 318767104 0 +} +// brush 401 +{ +( -424 -1400 -240 ) ( -424 -1360 -240 ) ( -440 -1360 -256 ) subway/1_tile_middle 720 -496 90 0.500000 0.500000 64 318767104 0 +( -480 -1400 -240 ) ( -480 -1400 -200 ) ( -480 -1440 -200 ) subway/1_tile_middle 720 -496 0 0.500000 0.500000 64 318767104 0 +( -480 -1400 -240 ) ( -480 -1400 -200 ) ( -448 -1400 -200 ) subway/1_tile_middle 720 -496 0 0.500000 0.500000 64 318767104 0 +( -480 -1336 -240 ) ( -424 -1336 -240 ) ( -424 -1400 -240 ) subway/1_tile_middle 720 -496 0 0.500000 0.500000 64 318767104 0 +( -456 -1352 -256 ) ( -456 -1312 -256 ) ( -488 -1312 -256 ) subway/1_tile_middle 720 -496 0 0.500000 0.500000 64 318767104 0 +( -488 -1360 -256 ) ( -432 -1360 -256 ) ( -460 -1360 -240 ) subway/1_tile_middle 720 -496 0 0.500000 0.500000 64 318767104 0 +} +// brush 402 +{ +( 112 -1224 -256 ) ( 112 -1264 -256 ) ( 144 -1264 -256 ) subway/1_tile_middle 0 -176 0 0.500000 0.500000 64 318767104 0 +( 96 -1240 -240 ) ( 96 -1176 -240 ) ( 136 -1176 -240 ) subway/1_tile_middle 0 -176 0 0.500000 0.500000 64 318767104 0 +( 136 -1176 -240 ) ( 136 -1176 -200 ) ( 136 -1136 -200 ) subway/1_tile_middle 0 -176 0 0.500000 0.500000 64 318767104 0 +( 80 -1240 -240 ) ( 136 -1240 -240 ) ( 136 -1224 -256 ) subway/1_tile_middle 0 -176 0 0.500000 0.500000 64 318767104 0 +( 96 -1216 -256 ) ( 128 -1216 -256 ) ( 112 -1216 -240 ) subway/1_tile_middle 0 -176 0 0.500000 0.500000 64 318767104 0 +( 96 -1240 -232 ) ( 96 -1240 -264 ) ( 96 -1216 -248 ) subway/1_tile_middle 80 0 0 -0.500000 0.500000 64 318767104 0 +} +// brush 403 +{ +( 96 -1224 -256 ) ( 136 -1224 -256 ) ( 136 -1216 -272 ) subway/1_tile 0 -192 0 0.500000 0.500000 64 318767104 0 +( 136 -1176 -272 ) ( 136 -1176 -232 ) ( 136 -1136 -232 ) subway/1_tile 0 -192 0 0.500000 0.500000 64 318767104 0 +( 136 -1224 -256 ) ( 96 -1224 -256 ) ( 96 -1176 -256 ) subway/1_tile 0 -192 0 0.500000 0.500000 64 318767104 0 +( 96 -1216 -272 ) ( 128 -1216 -272 ) ( 112 -1216 -256 ) subway/1_tile 0 -192 0 0.500000 0.500000 64 318767104 0 +( 96 -1224 -256 ) ( 104 -1224 -272 ) ( 100 -1216 -264 ) subway/1_tile 0 -192 0 0.500000 0.500000 64 318767104 0 +} +// brush 404 +{ +( 112 -1224 -256 ) ( 112 -1264 -256 ) ( 144 -1264 -256 ) subway/1_tile_middle 0 -528 0 0.500000 0.500000 0 318767104 0 +( 96 -1240 -240 ) ( 96 -1176 -240 ) ( 136 -1176 -240 ) subway/1_tile 0 -752 0 0.500000 0.500000 0 318767104 0 +( 136 -1176 -240 ) ( 136 -1176 -200 ) ( 104 -1176 -200 ) subway/1_tile_middle 80 0 0 -0.500000 0.500000 0 318767104 0 +( 136 -1176 -240 ) ( 136 -1176 -200 ) ( 136 -1136 -200 ) subway/1_tile_middle 544 -192 0 0.500000 0.500000 0 318767104 0 +( 104 -1192 -256 ) ( 104 -1176 -256 ) ( 104 -1184 -240 ) subway/1_tile_middle 80 0 0 -0.500000 0.500000 0 318767104 0 +( 128 -1216 -256 ) ( 96 -1216 -256 ) ( 112 -1216 -240 ) subway/1_tile_middle 80 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 405 +{ +( 136 -1176 -272 ) ( 136 -1176 -232 ) ( 136 -1136 -232 ) subway/1_tile 544 -192 0 0.500000 0.500000 0 318767104 0 +( 136 -1176 -280 ) ( 136 -1176 -240 ) ( 104 -1176 -240 ) subway/1_tile 0 -192 0 0.500000 0.500000 0 318767104 0 +( 136 -1224 -256 ) ( 96 -1224 -256 ) ( 96 -1176 -256 ) subway/1_tile 0 -544 0 0.500000 0.500000 0 318767104 0 +( 104 -1224 -272 ) ( 104 -1264 -272 ) ( 136 -1264 -272 ) subway/1_tile 0 -544 0 0.500000 0.500000 0 318767104 0 +( 104 -1192 -272 ) ( 104 -1176 -272 ) ( 104 -1184 -256 ) subway/1_tile 0 -544 0 0.500000 0.500000 0 318767104 0 +( 128 -1216 -272 ) ( 96 -1216 -272 ) ( 112 -1216 -256 ) subway/1_tile 0 -544 0 0.500000 0.500000 0 318767104 0 +} +// brush 406 +{ +( 112 -1224 -256 ) ( 112 -1264 -256 ) ( 144 -1264 -256 ) subway/1_tile_middle 80 0 0 -0.500000 0.500000 64 318767104 0 +( 96 -1240 -240 ) ( 96 -1176 -240 ) ( 136 -1176 -240 ) subway/1_tile_middle 80 0 0 -0.500000 0.500000 64 318767104 0 +( 136 -1176 -240 ) ( 136 -1176 -200 ) ( 104 -1176 -200 ) subway/1_tile_middle 80 0 0 -0.500000 0.500000 64 318767104 0 +( 96 -1176 -240 ) ( 96 -1240 -240 ) ( 96 -1224 -256 ) subway/1_tile_middle 80 0 0 -0.500000 0.500000 64 318767104 0 +( 104 -1176 -256 ) ( 104 -1192 -256 ) ( 104 -1184 -240 ) subway/1_tile_middle 80 0 0 -0.500000 0.500000 64 318767104 0 +( 128 -1216 -256 ) ( 96 -1216 -256 ) ( 112 -1216 -240 ) subway/1_tile_middle 80 0 0 -0.500000 0.500000 64 318767104 0 +} +// brush 407 +{ +( 96 -1176 -256 ) ( 96 -1216 -256 ) ( 104 -1216 -272 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( 136 -1176 -280 ) ( 136 -1176 -240 ) ( 104 -1176 -240 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( 136 -1224 -256 ) ( 96 -1224 -256 ) ( 96 -1176 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( 104 -1176 -272 ) ( 104 -1192 -272 ) ( 104 -1184 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +( 128 -1216 -272 ) ( 96 -1216 -272 ) ( 112 -1216 -256 ) subway/1_tile 544 -192 0 0.500000 0.500000 64 318767104 0 +} +// brush 408 +{ +( -952 896 624 ) ( -1224 896 624 ) ( -1224 584 624 ) subway/sky2 0 -32 0 0.500000 0.500000 0 5 15 +( -1224 584 632 ) ( -1224 896 632 ) ( -952 896 632 ) subway/sky2 0 -32 0 0.500000 0.500000 0 5 15 +( -1224 584 632 ) ( -952 584 632 ) ( -952 584 624 ) subway/sky2 0 -32 0 0.500000 0.500000 0 5 15 +( -896 584 632 ) ( -896 896 632 ) ( -896 896 624 ) subway/sky2 0 -32 0 0.500000 0.500000 0 5 15 +( -952 904 632 ) ( -1224 904 632 ) ( -1224 904 624 ) subway/sky2 0 -32 0 0.500000 0.500000 0 5 15 +( -1232 896 632 ) ( -1232 584 632 ) ( -1232 584 624 ) subway/sky2 0 -32 0 0.500000 0.500000 0 5 15 +} +// brush 409 +{ +( 1744 2128 -224 ) ( 1744 2152 -224 ) ( 1720 2152 -224 ) subway/1_tile -63 0 90 0.500000 0.500000 0 318767104 900 +( 1720 2152 -216 ) ( 1744 2152 -216 ) ( 1744 2128 -216 ) subway/1_tile_big -31 16 90 0.500000 0.500000 0 318767104 0 +( 2208 2304 -224 ) ( 2208 2344 -224 ) ( 2208 2324 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2232 2528 -224 ) ( 2248 2528 -224 ) ( 2248 2528 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2248 2544 -224 ) ( 2232 2544 -224 ) ( 2232 2544 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2232 2528 -224 ) ( 2232 2544 -224 ) ( 2232 2528 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 410 +{ +( 1744 2128 -224 ) ( 1744 2152 -224 ) ( 1720 2152 -224 ) subway/1_tile -63 0 90 0.500000 0.500000 0 318767104 900 +( 1720 2152 -216 ) ( 1744 2152 -216 ) ( 1744 2128 -216 ) subway/1_tile_big -31 16 90 0.500000 0.500000 0 318767104 0 +( 2128 2568 -224 ) ( 2152 2568 -224 ) ( 2140 2568 -216 ) subway/1_tile_big -16 16 -180 0.500000 -0.500000 0 318767104 0 +( 2208 2304 -224 ) ( 2208 2344 -224 ) ( 2208 2324 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2248 2528 -224 ) ( 2248 2544 -224 ) ( 2248 2544 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2232 2544 -224 ) ( 2248 2544 -224 ) ( 2232 2544 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 411 +{ +( 1744 2128 -224 ) ( 1744 2152 -224 ) ( 1720 2152 -224 ) subway/1_tile -63 0 90 0.500000 0.500000 0 318767104 900 +( 1720 2152 -216 ) ( 1744 2152 -216 ) ( 1744 2128 -216 ) subway/1_tile_big -31 16 90 0.500000 0.500000 0 318767104 0 +( 2272 2112 -232 ) ( 2272 2136 -232 ) ( 2272 2136 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2128 2568 -224 ) ( 2152 2568 -224 ) ( 2140 2568 -216 ) subway/1_tile_big -16 16 -180 0.500000 -0.500000 0 318767104 0 +( 2232 2528 -224 ) ( 2248 2528 -224 ) ( 2248 2528 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2248 2544 -224 ) ( 2248 2528 -224 ) ( 2248 2544 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 412 +{ +( 1744 2128 -224 ) ( 1744 2152 -224 ) ( 1720 2152 -224 ) subway/1_tile -63 0 90 0.500000 0.500000 0 318767104 900 +( 1720 2152 -216 ) ( 1744 2152 -216 ) ( 1744 2128 -216 ) subway/1_tile_big -31 16 90 0.500000 0.500000 0 318767104 0 +( 2272 2112 -232 ) ( 2272 2136 -232 ) ( 2272 2136 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2208 2304 -224 ) ( 2208 2344 -224 ) ( 2208 2324 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2320 2040 -224 ) ( 2216 2040 -224 ) ( 2268 2040 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2248 2528 -224 ) ( 2232 2528 -224 ) ( 2248 2528 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 413 +{ +( 2248 2544 -224 ) ( 2232 2544 -224 ) ( 2232 2528 -224 ) subway/light_yellow 16 0 0 0.500000 0.500000 0 16777217 15000 +( 2232 2528 -216 ) ( 2232 2544 -216 ) ( 2248 2544 -216 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 2232 2528 -224 ) ( 2248 2528 -224 ) ( 2248 2528 -240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 2248 2528 -224 ) ( 2248 2544 -224 ) ( 2248 2544 -240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 2248 2544 -224 ) ( 2232 2544 -224 ) ( 2232 2544 -240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 2232 2544 -224 ) ( 2232 2528 -224 ) ( 2232 2528 -240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 414 +{ +( 2232 2424 -164 ) ( 2232 2392 -164 ) ( 2232 2392 -228 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 2252 2424 -164 ) ( 2228 2424 -164 ) ( 2228 2424 -228 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2248 2392 -164 ) ( 2248 2424 -164 ) ( 2248 2424 -228 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 2228 2380 -164 ) ( 2252 2380 -164 ) ( 2252 2380 -228 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2228 2392 -224 ) ( 2228 2424 -224 ) ( 2252 2424 -224 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 2252 2424 -228 ) ( 2228 2424 -228 ) ( 2228 2392 -228 ) subway/light_tube -24 15 90 0.500000 0.500000 134217728 16777217 7000 +} +// brush 415 +{ +( 1672 3360 -256 ) ( 1680 3360 -256 ) ( 1680 2976 -256 ) subway/1_tile_top -16 0 -180 0.500000 -0.500000 0 318767104 904 +( 2064 3212 -344 ) ( 2064 2828 -344 ) ( 2064 2828 -376 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 2272 2784 -232 ) ( 1800 2784 -232 ) ( 1800 2784 -224 ) subway/1_tile_top -16 0 -180 0.500000 -0.500000 0 318767104 904 +( 1696 2816 -344 ) ( 1688 2816 -344 ) ( 1688 2816 -376 ) subway/1_tile_top -16 0 -180 0.500000 -0.500000 0 318767104 904 +( 2136 2912 -232 ) ( 2136 2888 -232 ) ( 2136 2900 -224 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 2104 2784 -264 ) ( 2184 2784 -264 ) ( 2144 2816 -264 ) subway/1_tile_top -16 0 -180 0.500000 -0.500000 0 318767104 904 +} +// brush 416 +{ +( 2064 3212 -344 ) ( 2064 2828 -344 ) ( 2064 2828 -376 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 900 +( 2272 2784 -232 ) ( 1800 2784 -232 ) ( 1800 2784 -224 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 900 +( 1696 2816 -344 ) ( 1688 2816 -344 ) ( 1688 2816 -376 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 900 +( 2136 2912 -232 ) ( 2136 2888 -232 ) ( 2136 2900 -224 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 900 +( 2184 2784 -264 ) ( 2104 2784 -264 ) ( 2144 2816 -264 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 2112 2784 -320 ) ( 2160 2784 -320 ) ( 2136 2816 -320 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +} +// brush 417 +{ +( 1800 2752 -336 ) ( 2272 2752 -336 ) ( 2272 2912 -336 ) subway/1_tile_bottom -16 18 -180 0.500000 -0.500000 0 318767104 904 +( 2064 3212 -344 ) ( 2064 2828 -344 ) ( 2064 2828 -376 ) subway/1_tile_bottom 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 2272 2784 -232 ) ( 1800 2784 -232 ) ( 1800 2784 -224 ) subway/1_tile_bottom -16 0 -180 0.500000 -0.500000 0 318767104 904 +( 1696 2816 -344 ) ( 1688 2816 -344 ) ( 1688 2816 -376 ) subway/1_tile_bottom -16 0 -180 0.500000 -0.500000 0 318767104 904 +( 2136 2912 -232 ) ( 2136 2888 -232 ) ( 2136 2900 -224 ) subway/1_tile_bottom 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 2160 2784 -320 ) ( 2112 2784 -320 ) ( 2136 2816 -320 ) subway/1_tile_bottom -16 18 -180 0.500000 -0.500000 0 318767104 904 +} +// brush 418 +{ +( 1600 2752 -336 ) ( 2072 2752 -336 ) ( 2072 2912 -336 ) subway/1_tile_bottom 0 17 -180 0.500000 -0.500000 0 318767104 904 +( 1864 3212 -344 ) ( 1864 2828 -344 ) ( 1864 2828 -376 ) subway/1_tile_bottom 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 2072 2784 -232 ) ( 1600 2784 -232 ) ( 1600 2784 -224 ) subway/1_tile_bottom 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 1496 2816 -344 ) ( 1488 2816 -344 ) ( 1488 2816 -376 ) subway/1_tile_bottom 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 1936 2912 -232 ) ( 1936 2888 -232 ) ( 1936 2900 -224 ) subway/1_tile_bottom 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 1960 2784 -320 ) ( 1912 2784 -320 ) ( 1936 2816 -320 ) subway/1_tile_bottom 0 17 -180 0.500000 -0.500000 0 318767104 904 +} +// brush 419 +{ +( 1864 3212 -344 ) ( 1864 2828 -344 ) ( 1864 2828 -376 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 900 +( 2072 2784 -232 ) ( 1600 2784 -232 ) ( 1600 2784 -224 ) subway/1_tile 48 0 0 0.500000 0.500000 0 318767104 900 +( 1496 2816 -344 ) ( 1488 2816 -344 ) ( 1488 2816 -376 ) subway/1_tile 48 0 0 0.500000 0.500000 0 318767104 900 +( 1936 2912 -232 ) ( 1936 2888 -232 ) ( 1936 2900 -224 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 900 +( 1984 2784 -264 ) ( 1904 2784 -264 ) ( 1944 2816 -264 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 900 +( 1912 2784 -320 ) ( 1960 2784 -320 ) ( 1936 2816 -320 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 900 +} +// brush 420 +{ +( 1472 3360 -256 ) ( 1480 3360 -256 ) ( 1480 2976 -256 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 1864 3212 -344 ) ( 1864 2828 -344 ) ( 1864 2828 -376 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 2072 2784 -232 ) ( 1600 2784 -232 ) ( 1600 2784 -224 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 1496 2816 -344 ) ( 1488 2816 -344 ) ( 1488 2816 -376 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 1936 2912 -232 ) ( 1936 2888 -232 ) ( 1936 2900 -224 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 1904 2784 -264 ) ( 1984 2784 -264 ) ( 1944 2816 -264 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 904 +} +// brush 421 +{ +( 2288 2328 -224 ) ( 2288 2400 -224 ) ( 2272 2400 -224 ) subway/1_tile_bottom -31 0 90 0.500000 0.500000 0 318767104 0 +( 2272 2400 -216 ) ( 2288 2400 -216 ) ( 2288 2328 -216 ) subway/1_tile_top -31 0 90 0.500000 0.500000 0 318767104 0 +( 2272 2024 -216 ) ( 2272 2024 -224 ) ( 2272 2344 -224 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2272 2040 -224 ) ( 2272 2040 -216 ) ( 2288 2024 -216 ) subway/1_tile_top -16 0 -180 0.500000 -0.500000 0 318767104 0 +( 2288 2328 -216 ) ( 2288 2400 -216 ) ( 2288 2400 -224 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2272 2568 -224 ) ( 2288 2584 -224 ) ( 2280 2576 -216 ) subway/1_tile_top 16 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 422 +{ +( 1808 2584 -224 ) ( 1736 2584 -224 ) ( 1736 2568 -224 ) subway/1_tile_bottom 16 16 180 -0.500000 0.500000 0 318767104 0 +( 1736 2568 -216 ) ( 1736 2584 -216 ) ( 1808 2584 -216 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1736 2568 -224 ) ( 1736 2568 -216 ) ( 1808 2568 -216 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1808 2584 -216 ) ( 1736 2584 -216 ) ( 1736 2584 -224 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1736 2568 -216 ) ( 1736 2568 -224 ) ( 1720 2584 -224 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2288 2584 -224 ) ( 2272 2568 -224 ) ( 2280 2576 -216 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 423 +{ +( 1904 2504 -224 ) ( 1832 2504 -224 ) ( 1832 2488 -224 ) subway/1_tile_bottom 16 16 0 0.500000 0.500000 0 318767104 0 +( 1832 2488 -216 ) ( 1832 2504 -216 ) ( 1904 2504 -216 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1848 2488 -224 ) ( 1848 2488 -216 ) ( 1920 2488 -216 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1904 2504 -216 ) ( 1832 2504 -216 ) ( 1832 2504 -224 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1848 2488 -216 ) ( 1848 2488 -224 ) ( 1832 2504 -224 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2208 2504 -224 ) ( 2192 2488 -224 ) ( 2200 2496 -216 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 424 +{ +( 2208 2232 -224 ) ( 2208 2304 -224 ) ( 2192 2304 -224 ) subway/1_tile_bottom -31 0 90 0.500000 -0.500000 0 318767104 0 +( 2192 2304 -216 ) ( 2208 2304 -216 ) ( 2208 2232 -216 ) subway/1_tile_top -31 0 90 0.500000 0.500000 0 318767104 0 +( 2192 2328 -224 ) ( 2192 2328 -216 ) ( 2192 2104 -216 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2208 2040 -216 ) ( 2208 2040 -224 ) ( 2192 2024 -224 ) subway/1_tile_top -16 0 -180 0.500000 -0.500000 0 318767104 0 +( 2208 2008 -224 ) ( 2208 2008 -216 ) ( 2208 2328 -216 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2192 2488 -224 ) ( 2208 2504 -224 ) ( 2200 2496 -216 ) subway/1_tile_top 16 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 425 +{ +( 1832 2464 -240 ) ( 2352 2464 -240 ) ( 2376 2488 -224 ) subway/1_tile -63 15 90 0.500000 0.500000 0 318767104 900 +( 2264 2448 -224 ) ( 2264 2448 -256 ) ( 1816 2448 -256 ) subway/1_tile_big_green 0 16 -180 0.500000 -0.500000 0 369098752 0 +( 1832 2488 -224 ) ( 2360 2488 -224 ) ( 2336 2448 -224 ) subway/1_tile_big_green -31 31 90 0.500000 0.500000 0 369098752 0 +( 2352 2464 -240 ) ( 1832 2464 -240 ) ( 1832 2448 -240 ) subway/1_tile_big_green -31 31 90 0.500000 0.500000 0 369098752 0 +( 1856 2480 -240 ) ( 1848 2488 -240 ) ( 1852 2484 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 2192 2488 -240 ) ( 2152 2448 -240 ) ( 2172 2468 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 426 +{ +( 2168 2344 -240 ) ( 2168 1824 -240 ) ( 2192 1800 -224 ) subway/1_tile -14 46 -180 0.500000 0.500000 0 318767104 900 +( 2152 2304 -240 ) ( 2152 2304 -224 ) ( 2152 2144 -224 ) subway/1_tile_big_green 0 16 -180 0.500000 -0.500000 0 369098752 0 +( 2192 2344 -224 ) ( 2192 1816 -224 ) ( 2152 1840 -224 ) subway/1_tile_big_green -14 30 -180 0.500000 0.500000 0 369098752 0 +( 2168 1824 -240 ) ( 2168 2344 -240 ) ( 2152 2344 -240 ) subway/1_tile_big_green -14 30 -180 0.500000 0.500000 0 369098752 0 +( 2200 1992 -240 ) ( 2152 1992 -240 ) ( 2176 1992 -224 ) subway/1_tile_big_green -16 0 -180 0.500000 -0.500000 0 369098752 0 +( 2152 2448 -240 ) ( 2192 2488 -240 ) ( 2172 2468 -224 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 427 +{ +( 2160 1904 -256 ) ( 2168 1896 -240 ) ( 2168 2416 -240 ) subway/1_tile -32 16 -180 0.500000 -0.500000 0 318767104 900 +( 2152 2320 -256 ) ( 2152 2320 -240 ) ( 2152 2144 -240 ) subway/1_tile_big_green 0 16 -180 0.500000 -0.500000 0 369098752 0 +( 2224 2072 -256 ) ( 2248 2072 -256 ) ( 2248 2096 -256 ) subway/1_tile_big_green -14 30 -180 0.500000 0.500000 0 369098752 0 +( 2168 2344 -240 ) ( 2168 1820 -240 ) ( 2152 1840 -240 ) subway/1_tile_big_green -14 30 -180 0.500000 0.500000 0 369098752 0 +( 2176 1992 -256 ) ( 2152 1992 -256 ) ( 2164 1992 -240 ) subway/1_tile_big_green -16 0 -180 0.500000 -0.500000 0 369098752 0 +( 2152 2448 -256 ) ( 2168 2464 -256 ) ( 2160 2456 -240 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 428 +{ +( 2120 2456 -256 ) ( 2128 2464 -240 ) ( 1608 2464 -240 ) subway/1_tile 0 16 -180 0.500000 -0.500000 0 318767104 900 +( 2400 2448 -224 ) ( 2400 2448 -256 ) ( 1952 2448 -256 ) subway/1_tile_big_green 0 16 -180 0.500000 -0.500000 0 369098752 0 +( 2104 2520 -256 ) ( 2104 2544 -256 ) ( 2080 2544 -256 ) subway/1_tile_big_green -31 31 90 0.500000 0.500000 0 369098752 0 +( 1832 2464 -240 ) ( 2356 2464 -240 ) ( 2336 2448 -240 ) subway/1_tile_big_green -31 31 90 0.500000 0.500000 0 369098752 0 +( 1856 2480 -256 ) ( 1848 2488 -256 ) ( 1852 2484 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 2168 2464 -256 ) ( 2152 2448 -256 ) ( 2160 2456 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 429 +{ +( 1912 2088 -400 ) ( 1912 2088 -352 ) ( 1912 2032 -352 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 1912 2072 -448 ) ( 1920 2064 -448 ) ( 1920 2064 -304 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 1920 2040 -304 ) ( 1920 2064 -304 ) ( 1920 2064 -448 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 1880 2056 -352 ) ( 1904 2056 -352 ) ( 1904 2056 -400 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 1880 1952 -304 ) ( 1880 1976 -304 ) ( 1904 1976 -304 ) subway/clip 32 -16 0 0.500000 0.500000 196608 128 0 +( 1904 1976 -448 ) ( 1880 1976 -448 ) ( 1880 1952 -448 ) subway/clip 32 -16 0 0.500000 0.500000 196608 128 0 +} +// brush 430 +{ +( 2040 2032 -352 ) ( 2040 2088 -352 ) ( 2040 2088 -400 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 2032 2064 -304 ) ( 2032 2064 -448 ) ( 2040 2072 -448 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 2032 2064 -448 ) ( 2032 2064 -304 ) ( 2032 2040 -304 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 2048 2056 -400 ) ( 2048 2056 -352 ) ( 2072 2056 -352 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 2048 1976 -304 ) ( 2072 1976 -304 ) ( 2072 1952 -304 ) subway/clip 0 -16 0 0.500000 0.500000 196608 128 0 +( 2072 1952 -448 ) ( 2072 1976 -448 ) ( 2048 1976 -448 ) subway/clip 0 -16 0 0.500000 0.500000 196608 128 0 +} +// brush 431 +{ +( 1208 2344 -536 ) ( 1208 2320 -536 ) ( 1216 2320 -536 ) subway/clip 0 16 0 1 1 196608 144 0 +( 1208 2336 -536 ) ( 1208 2336 -504 ) ( 1216 2336 -504 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1208 2344 -520 ) ( 1208 2344 -488 ) ( 1208 2320 -488 ) subway/clip -16 0 0 1 1 196608 144 0 +( 1208 2344 -536 ) ( 1216 2336 -536 ) ( 1212 2340 -432 ) subway/clip -16 0 0 1 1 196608 144 0 +( 1216 2344 -440 ) ( 1216 2320 -440 ) ( 1208 2332 -440 ) subway/clip 0 16 0 1 1 196608 144 0 +} +// brush 432 +{ +( 1536 2136 -536 ) ( 1544 2136 -536 ) ( 1544 2160 -536 ) subway/clip 0 -40 0 1 1 196608 144 0 +( 1536 2152 -504 ) ( 1544 2152 -504 ) ( 1544 2152 -536 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1544 2136 -488 ) ( 1544 2160 -488 ) ( 1544 2160 -520 ) subway/clip 40 0 0 1 1 196608 144 0 +( 1540 2156 -432 ) ( 1536 2152 -536 ) ( 1544 2160 -536 ) subway/clip 40 0 0 1 1 196608 144 0 +( 1544 2148 -440 ) ( 1536 2136 -440 ) ( 1536 2160 -440 ) subway/clip 0 -40 0 1 1 196608 144 0 +} +// brush 433 +{ +( 1544 2264 -536 ) ( 1544 2288 -536 ) ( 1536 2288 -536 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1544 2272 -536 ) ( 1544 2272 -504 ) ( 1536 2272 -504 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1544 2264 -520 ) ( 1544 2264 -488 ) ( 1544 2288 -488 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1544 2264 -536 ) ( 1536 2272 -536 ) ( 1540 2268 -432 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1536 2264 -440 ) ( 1536 2288 -440 ) ( 1544 2276 -440 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 434 +{ +( -344 997 -8 ) ( -408 997 -8 ) ( -408 933 -8 ) subway/skip -24 -24 0 1 1 0 656 0 +( -408 933 136 ) ( -408 997 136 ) ( -344 997 136 ) subway/skip -24 -24 0 1 1 0 656 0 +( -496 1053 -128 ) ( -496 1117 -128 ) ( -496 1117 -136 ) subway/hint 24 0 0 1 1 0 400 0 +( -408 1096 -128 ) ( -472 1096 -128 ) ( -472 1096 -136 ) subway/hint -24 0 0 1 1 0 400 0 +( -632 1005 -128 ) ( -632 941 -128 ) ( -632 941 -136 ) subway/hint 24 0 0 1 1 0 400 0 +( -576 936 16 ) ( -608 936 16 ) ( -592 936 24 ) subway/hint -24 0 0 1 1 0 400 0 +} +// brush 435 +{ +( -542 950 28 ) ( -561 965 28 ) ( -576 947 28 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +( -578 948 32 ) ( -562 967 32 ) ( -544 951 32 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +( -695 901 -36 ) ( -737 852 -36 ) ( -737 852 12 ) subway/metal2 -52 16 0 0.382813 0.500000 134217728 16777216 0 +( -683 987 -36 ) ( -683 987 12 ) ( -671 977 12 ) subway/metal2 41 16 0 0.382996 0.500000 134217728 16777216 0 +( -678 991 12 ) ( -678 991 -36 ) ( -662 1009 -36 ) subway/metal2 -59 16 0 0.382935 0.500000 134217728 16777216 0 +( -662 975 32 ) ( -662 975 -16 ) ( -650 965 -16 ) subway/metal2 34 16 0 0.382996 0.500000 134217728 16777216 0 +} +// brush 436 +{ +( -542 950 44 ) ( -561 965 44 ) ( -576 947 44 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +( -578 948 48 ) ( -562 967 48 ) ( -544 951 48 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +( -695 901 -20 ) ( -737 852 -20 ) ( -737 852 28 ) subway/metal2 -52 16 0 0.382813 0.500000 134217728 16777216 0 +( -683 987 -20 ) ( -683 987 28 ) ( -671 977 28 ) subway/metal2 41 16 0 0.382996 0.500000 134217728 16777216 0 +( -678 991 28 ) ( -678 991 -20 ) ( -662 1009 -20 ) subway/metal2 -59 16 0 0.382935 0.500000 134217728 16777216 0 +( -662 975 48 ) ( -662 975 0 ) ( -650 965 0 ) subway/metal2 34 16 0 0.382996 0.500000 134217728 16777216 0 +} +// brush 437 +{ +( -542 950 60 ) ( -561 965 60 ) ( -576 947 60 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +( -578 948 64 ) ( -562 967 64 ) ( -544 951 64 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +( -695 901 -4 ) ( -737 852 -4 ) ( -737 852 44 ) subway/metal2 -52 16 0 0.382813 0.500000 134217728 16777216 0 +( -683 987 -4 ) ( -683 987 44 ) ( -671 977 44 ) subway/metal2 41 16 0 0.382996 0.500000 134217728 16777216 0 +( -678 991 44 ) ( -678 991 -4 ) ( -662 1009 -4 ) subway/metal2 -59 16 0 0.382935 0.500000 134217728 16777216 0 +( -662 975 64 ) ( -662 975 16 ) ( -650 965 16 ) subway/metal2 34 16 0 0.382996 0.500000 134217728 16777216 0 +} +// brush 438 +{ +( -662 975 80 ) ( -662 975 32 ) ( -650 965 32 ) subway/metal2 34 16 0 0.382996 0.500000 134217728 16777216 0 +( -678 991 60 ) ( -678 991 12 ) ( -662 1009 12 ) subway/metal2 -59 16 0 0.382935 0.500000 134217728 16777216 0 +( -683 987 12 ) ( -683 987 60 ) ( -671 977 60 ) subway/metal2 41 16 0 0.382996 0.500000 134217728 16777216 0 +( -695 901 12 ) ( -737 852 12 ) ( -737 852 60 ) subway/metal2 -52 16 0 0.382813 0.500000 134217728 16777216 0 +( -578 948 80 ) ( -562 967 80 ) ( -544 951 80 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +( -542 950 76 ) ( -561 965 76 ) ( -576 947 76 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 439 +{ +( -668 972 100 ) ( -668 972 52 ) ( -657 984 52 ) subway/metal2 -24 16 0 0.383057 0.500000 134217728 16777216 0 +( -668 975 80 ) ( -668 975 32 ) ( -686 990 32 ) subway/metal2 40 16 0 0.382935 0.500000 134217728 16777216 0 +( -680 951 32 ) ( -680 951 80 ) ( -670 963 80 ) subway/metal2 -19 16 0 0.383057 0.500000 134217728 16777216 0 +( -604 926 32 ) ( -555 885 32 ) ( -555 885 80 ) subway/metal2 34 16 0 0.382996 0.500000 134217728 16777216 0 +( -641 1056 100 ) ( -659 1072 100 ) ( -644 1090 100 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +( -641 1093 17 ) ( -657 1075 17 ) ( -638 1059 17 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 440 +{ +( -640 1095 76 ) ( -655 1076 76 ) ( -637 1061 76 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +( -638 1059 80 ) ( -657 1075 80 ) ( -641 1093 80 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +( -591 942 12 ) ( -542 900 12 ) ( -542 900 60 ) subway/metal2 0 16 0 0.382996 0.500000 134217728 16777216 0 +( -677 954 12 ) ( -677 954 60 ) ( -667 966 60 ) subway/metal2 -19 16 0 0.383057 0.500000 134217728 16777216 0 +( -681 959 60 ) ( -681 959 12 ) ( -699 975 12 ) subway/metal2 10 16 0 0.382935 0.500000 134217728 16777216 0 +( -665 975 80 ) ( -665 975 32 ) ( -655 987 32 ) subway/metal2 -26 16 0 0.383118 0.500000 134217728 16777216 0 +} +// brush 441 +{ +( -665 975 64 ) ( -665 975 16 ) ( -655 987 16 ) subway/metal2 -26 16 0 0.383118 0.500000 134217728 16777216 0 +( -681 959 44 ) ( -681 959 -4 ) ( -699 975 -4 ) subway/metal2 10 16 0 0.382935 0.500000 134217728 16777216 0 +( -677 954 -4 ) ( -677 954 44 ) ( -667 966 44 ) subway/metal2 -19 16 0 0.383057 0.500000 134217728 16777216 0 +( -591 942 -4 ) ( -542 900 -4 ) ( -542 900 44 ) subway/metal2 0 16 0 0.382996 0.500000 134217728 16777216 0 +( -638 1059 64 ) ( -657 1075 64 ) ( -641 1093 64 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +( -640 1095 60 ) ( -655 1076 60 ) ( -637 1061 60 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 442 +{ +( -665 975 48 ) ( -665 975 0 ) ( -655 987 0 ) subway/metal2 -26 16 0 0.383118 0.500000 134217728 16777216 0 +( -681 959 28 ) ( -681 959 -20 ) ( -699 975 -20 ) subway/metal2 10 16 0 0.382935 0.500000 134217728 16777216 0 +( -677 954 -20 ) ( -677 954 28 ) ( -667 966 28 ) subway/metal2 -19 16 0 0.383057 0.500000 134217728 16777216 0 +( -591 942 -20 ) ( -542 900 -20 ) ( -542 900 28 ) subway/metal2 0 16 0 0.382996 0.500000 134217728 16777216 0 +( -638 1059 48 ) ( -657 1075 48 ) ( -641 1093 48 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +( -640 1095 44 ) ( -655 1076 44 ) ( -637 1061 44 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 443 +{ +( -665 975 32 ) ( -665 975 -16 ) ( -655 987 -16 ) subway/metal2 -26 16 0 0.383118 0.500000 134217728 16777216 0 +( -681 959 12 ) ( -681 959 -36 ) ( -699 975 -36 ) subway/metal2 10 16 0 0.382935 0.500000 134217728 16777216 0 +( -677 954 -36 ) ( -677 954 12 ) ( -667 966 12 ) subway/metal2 -19 16 0 0.383057 0.500000 134217728 16777216 0 +( -591 942 -36 ) ( -542 900 -36 ) ( -542 900 12 ) subway/metal2 0 16 0 0.382996 0.500000 134217728 16777216 0 +( -638 1059 32 ) ( -657 1075 32 ) ( -641 1093 32 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +( -640 1095 28 ) ( -655 1076 28 ) ( -637 1061 28 ) subway/metal2 61 -25 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 444 +{ +( -556 1098 28 ) ( -580 1098 28 ) ( -580 1074 28 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +( -582 1074 32 ) ( -582 1098 32 ) ( -558 1098 32 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +( -642 962 -36 ) ( -642 898 -36 ) ( -642 898 12 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -688 1036 -36 ) ( -688 1036 12 ) ( -672 1036 12 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -686 1042 12 ) ( -686 1042 -36 ) ( -686 1066 -36 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -664 1040 32 ) ( -664 1040 -16 ) ( -648 1040 -16 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 445 +{ +( -556 1098 44 ) ( -580 1098 44 ) ( -580 1074 44 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +( -582 1074 48 ) ( -582 1098 48 ) ( -558 1098 48 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +( -642 962 -20 ) ( -642 898 -20 ) ( -642 898 28 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -688 1036 -20 ) ( -688 1036 28 ) ( -672 1036 28 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -686 1042 28 ) ( -686 1042 -20 ) ( -686 1066 -20 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -664 1040 48 ) ( -664 1040 0 ) ( -648 1040 0 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 446 +{ +( -556 1098 60 ) ( -580 1098 60 ) ( -580 1074 60 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +( -582 1074 64 ) ( -582 1098 64 ) ( -558 1098 64 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +( -642 962 -4 ) ( -642 898 -4 ) ( -642 898 44 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -688 1036 -4 ) ( -688 1036 44 ) ( -672 1036 44 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -686 1042 44 ) ( -686 1042 -4 ) ( -686 1066 -4 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -664 1040 64 ) ( -664 1040 16 ) ( -648 1040 16 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 447 +{ +( -664 1040 80 ) ( -664 1040 32 ) ( -648 1040 32 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -686 1042 60 ) ( -686 1042 12 ) ( -686 1066 12 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -688 1036 12 ) ( -688 1036 60 ) ( -672 1036 60 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -642 962 12 ) ( -642 898 12 ) ( -642 898 60 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -582 1074 80 ) ( -582 1098 80 ) ( -558 1098 80 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +( -556 1098 76 ) ( -580 1098 76 ) ( -580 1074 76 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 448 +{ +( -666 1034 100 ) ( -666 1034 52 ) ( -666 1050 52 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -668 1036 80 ) ( -668 1036 32 ) ( -692 1036 32 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -662 1010 32 ) ( -662 1010 80 ) ( -662 1026 80 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -588 1040 32 ) ( -524 1040 32 ) ( -524 1040 80 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -700 1116 100 ) ( -724 1116 100 ) ( -724 1140 100 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +( -724 1144 17 ) ( -724 1120 17 ) ( -700 1120 17 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 449 +{ +( -724 1146 76 ) ( -724 1122 76 ) ( -700 1122 76 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +( -700 1120 80 ) ( -724 1120 80 ) ( -724 1144 80 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +( -588 1060 12 ) ( -524 1060 12 ) ( -524 1060 60 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -662 1014 12 ) ( -662 1014 60 ) ( -662 1030 60 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -668 1016 60 ) ( -668 1016 12 ) ( -692 1016 12 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -666 1038 80 ) ( -666 1038 32 ) ( -666 1054 32 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 450 +{ +( -666 1038 64 ) ( -666 1038 16 ) ( -666 1054 16 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -668 1016 44 ) ( -668 1016 -4 ) ( -692 1016 -4 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -662 1014 -4 ) ( -662 1014 44 ) ( -662 1030 44 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -588 1060 -4 ) ( -524 1060 -4 ) ( -524 1060 44 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -700 1120 64 ) ( -724 1120 64 ) ( -724 1144 64 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +( -724 1146 60 ) ( -724 1122 60 ) ( -700 1122 60 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 451 +{ +( -666 1038 48 ) ( -666 1038 0 ) ( -666 1054 0 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -668 1016 28 ) ( -668 1016 -20 ) ( -692 1016 -20 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -662 1014 -20 ) ( -662 1014 28 ) ( -662 1030 28 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -588 1060 -20 ) ( -524 1060 -20 ) ( -524 1060 28 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -700 1120 48 ) ( -724 1120 48 ) ( -724 1144 48 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +( -724 1146 44 ) ( -724 1122 44 ) ( -700 1122 44 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 452 +{ +( -666 1038 32 ) ( -666 1038 -16 ) ( -666 1054 -16 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -668 1016 12 ) ( -668 1016 -36 ) ( -692 1016 -36 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -662 1014 -36 ) ( -662 1014 12 ) ( -662 1030 12 ) subway/metal2 -4 16 0 0.500000 0.500000 134217728 16777216 0 +( -588 1060 -36 ) ( -524 1060 -36 ) ( -524 1060 12 ) subway/metal2 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -700 1120 32 ) ( -724 1120 32 ) ( -724 1144 32 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +( -724 1146 28 ) ( -724 1122 28 ) ( -700 1122 28 ) subway/metal2 16 4 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 453 +{ +( -384 1752 -4 ) ( -384 1744 -4 ) ( -384 1744 -84 ) subway/sign11 -192 -16 0 0.500000 0.500000 134217728 0 0 +( -310 1752 0 ) ( -382 1752 0 ) ( -382 1752 -80 ) subway/sign11 0 -16 0 0.500000 0.500000 134217728 0 0 +( -320 1744 0 ) ( -320 1752 0 ) ( -320 1752 -80 ) subway/sign11 -192 -16 0 0.500000 0.500000 134217728 0 0 +( -380 1750 0 ) ( -308 1750 0 ) ( -308 1750 -80 ) subway/sign6 0 -32 0 0.500000 0.500000 134217728 0 0 +( -382 1744 -48 ) ( -382 1752 -48 ) ( -310 1752 -48 ) subway/sign11 0 192 0 0.500000 0.500000 134217728 0 0 +( -310 1752 -80 ) ( -382 1752 -80 ) ( -382 1744 -80 ) subway/sign11 0 192 0 0.500000 0.500000 134217728 0 0 +} +// brush 454 +{ +( -386 1748 -80 ) ( -386 1752 -80 ) ( -386 1752 -48 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -316 1752 -4 ) ( -388 1752 -4 ) ( -388 1752 -84 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -384 1754 -80 ) ( -384 1748 -80 ) ( -384 1748 -48 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -384 1748 -8 ) ( -312 1748 -8 ) ( -312 1748 -88 ) subway/1_black -512 2 0 0.500000 0.500000 134217728 16777216 0 +( -386 1748 -48 ) ( -386 1752 -48 ) ( -384 1752 -48 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -386 1752 -80 ) ( -386 1748 -80 ) ( -384 1748 -80 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 455 +{ +( -318 1752 -48 ) ( -318 1748 -48 ) ( -318 1748 -46 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -386 1748 -48 ) ( -386 1752 -48 ) ( -386 1752 -46 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -414 1748 -46 ) ( -414 1748 26 ) ( -334 1748 26 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -310 1752 -46 ) ( -310 1744 -46 ) ( -382 1744 -46 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -422 1752 24 ) ( -422 1752 -48 ) ( -342 1752 -48 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -318 1748 -48 ) ( -318 1752 -48 ) ( -386 1752 -48 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 456 +{ +( -320 1748 -80 ) ( -320 1754 -80 ) ( -320 1754 -48 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -248 1752 -4 ) ( -320 1752 -4 ) ( -320 1752 -84 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -318 1748 -48 ) ( -318 1752 -48 ) ( -318 1752 -80 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -316 1748 -8 ) ( -244 1748 -8 ) ( -244 1748 -88 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -318 1752 -48 ) ( -318 1748 -48 ) ( -320 1748 -48 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -318 1748 -80 ) ( -318 1752 -80 ) ( -320 1752 -80 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 457 +{ +( -318 1752 -80 ) ( -318 1748 -80 ) ( -386 1748 -80 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -422 1748 -152 ) ( -422 1748 -80 ) ( -342 1748 -80 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -318 1744 -82 ) ( -318 1752 -82 ) ( -390 1752 -82 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -418 1752 -84 ) ( -418 1752 -156 ) ( -338 1752 -156 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -386 1752 -80 ) ( -386 1748 -80 ) ( -386 1748 -82 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -318 1748 -80 ) ( -318 1752 -80 ) ( -318 1752 -82 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 458 +{ +( -566 1752 -80 ) ( -638 1752 -80 ) ( -638 1744 -80 ) subway/sign11 0 192 0 0.500000 0.500000 134217728 0 0 +( -638 1744 -48 ) ( -638 1752 -48 ) ( -566 1752 -48 ) subway/sign11 0 192 0 0.500000 0.500000 134217728 0 0 +( -636 1750 0 ) ( -564 1750 0 ) ( -564 1750 -80 ) subway/sign11 0 32 0 0.500000 0.500000 134217728 0 0 +( -576 1744 0 ) ( -576 1752 0 ) ( -576 1752 -80 ) subway/sign11 -192 -16 0 0.500000 0.500000 134217728 0 0 +( -566 1752 0 ) ( -638 1752 0 ) ( -638 1752 -80 ) subway/sign11 0 -16 0 0.500000 0.500000 134217728 0 0 +( -640 1752 -4 ) ( -640 1744 -4 ) ( -640 1744 -84 ) subway/sign11 -192 -16 0 0.500000 0.500000 134217728 0 0 +} +// brush 459 +{ +( -640 1748 -80 ) ( -640 1754 -80 ) ( -642 1754 -82 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -640 1752 -48 ) ( -640 1744 -48 ) ( -644 1744 -44 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -640 1748 -8 ) ( -568 1748 -8 ) ( -568 1748 -88 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -640 1754 -80 ) ( -640 1748 -80 ) ( -640 1748 -48 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -572 1752 -4 ) ( -644 1752 -4 ) ( -644 1752 -84 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -642 1750 -4 ) ( -642 1742 -4 ) ( -642 1742 -84 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 460 +{ +( -678 1748 -48 ) ( -678 1740 -48 ) ( -598 1740 -48 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -678 1752 24 ) ( -678 1752 -48 ) ( -598 1752 -48 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -566 1752 -46 ) ( -566 1744 -46 ) ( -638 1744 -46 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -670 1748 -46 ) ( -670 1748 26 ) ( -590 1748 26 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -646 1752 -42 ) ( -646 1744 -42 ) ( -642 1744 -46 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -572 1744 -44 ) ( -572 1752 -44 ) ( -576 1752 -48 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 461 +{ +( -576 1748 -80 ) ( -576 1754 -80 ) ( -576 1754 -48 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -504 1752 -4 ) ( -576 1752 -4 ) ( -576 1752 -84 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -574 1736 0 ) ( -574 1744 0 ) ( -574 1744 -80 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -572 1748 -8 ) ( -500 1748 -8 ) ( -500 1748 -88 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -576 1744 -48 ) ( -576 1752 -48 ) ( -572 1752 -44 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -576 1754 -80 ) ( -576 1748 -80 ) ( -574 1748 -82 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 462 +{ +( -578 1754 -78 ) ( -578 1746 -78 ) ( -582 1746 -74 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -644 1746 -84 ) ( -644 1754 -84 ) ( -640 1754 -80 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -674 1752 -84 ) ( -674 1752 -156 ) ( -594 1752 -156 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -574 1744 -82 ) ( -574 1752 -82 ) ( -646 1752 -82 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -678 1748 -152 ) ( -678 1748 -80 ) ( -598 1748 -80 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -678 1748 -80 ) ( -678 1756 -80 ) ( -598 1756 -80 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 463 +{ +( -280 1392 -92 ) ( -280 1376 -92 ) ( -280 1376 -180 ) subway/clip 0 0 0 1 1 134414336 144 0 +( -170 1384 -92 ) ( -242 1384 -92 ) ( -242 1384 -180 ) subway/clip 0 0 0 1 1 134414336 144 0 +( -120 1372 -92 ) ( -120 1388 -92 ) ( -120 1388 -180 ) subway/clip 0 0 0 1 1 134414336 144 0 +( -186 1380 -92 ) ( -114 1380 -92 ) ( -114 1380 -180 ) subway/clip 0 0 0 1 1 134414336 144 0 +( -242 1376 -48 ) ( -242 1392 -48 ) ( -170 1392 -48 ) subway/clip 0 0 0 1 1 134414336 144 0 +( -174 1392 -168 ) ( -246 1392 -168 ) ( -246 1376 -168 ) subway/clip 0 0 0 1 1 134414336 144 0 +} +// brush 464 +{ +( -496 1085 -8 ) ( -560 1085 -8 ) ( -560 1021 -8 ) subway/skip 0 0 0 1 1 0 656 0 +( -560 1021 136 ) ( -560 1085 136 ) ( -496 1085 136 ) subway/skip 0 0 0 1 1 0 656 0 +( -680 1141 -128 ) ( -680 1205 -128 ) ( -680 1205 -136 ) subway/hint 0 0 0 1 1 0 400 0 +( -560 1184 -128 ) ( -624 1184 -128 ) ( -624 1184 -136 ) subway/hint 0 0 0 1 1 0 400 0 +( -784 1093 -128 ) ( -784 1029 -128 ) ( -784 1029 -136 ) subway/hint 0 0 0 1 1 0 400 0 +( -728 1032 16 ) ( -760 1032 16 ) ( -744 1032 24 ) subway/hint 0 0 0 1 1 0 400 0 +} +// brush 465 +{ +( 2320 2168 -224 ) ( 2320 2160 -224 ) ( 2312 2160 -224 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 2312 2160 -384 ) ( 2320 2160 -384 ) ( 2320 2168 -384 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 2320 2216 -368 ) ( 2320 2216 -312 ) ( 2320 2224 -312 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 2320 2328 -224 ) ( 2312 2320 -224 ) ( 2312 2320 -384 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 2304 2184 -312 ) ( 2304 2184 -256 ) ( 2312 2176 -256 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 2312 2176 -384 ) ( 2312 2320 -384 ) ( 2312 2320 -224 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +} +// brush 466 +{ +( 2168 2160 -224 ) ( 2160 2160 -224 ) ( 2160 2168 -224 ) subway/clip 32 0 0 0.500000 0.500000 196608 128 0 +( 2160 2168 -384 ) ( 2160 2160 -384 ) ( 2168 2160 -384 ) subway/clip 32 0 0 0.500000 0.500000 196608 128 0 +( 2160 2224 -312 ) ( 2160 2216 -312 ) ( 2160 2216 -368 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 2168 2320 -384 ) ( 2168 2320 -224 ) ( 2160 2328 -224 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 2168 2176 -256 ) ( 2176 2184 -256 ) ( 2176 2184 -312 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 2168 2320 -224 ) ( 2168 2320 -384 ) ( 2168 2176 -384 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +} +// brush 467 +{ +( 2312 2000 -224 ) ( 2320 2000 -224 ) ( 2320 1992 -224 ) subway/clip 32 32 0 0.500000 0.500000 196608 128 0 +( 2320 1992 -384 ) ( 2320 2000 -384 ) ( 2312 2000 -384 ) subway/clip 32 32 0 0.500000 0.500000 196608 128 0 +( 2320 1992 -312 ) ( 2320 2000 -312 ) ( 2320 2000 -368 ) subway/clip -32 16 0 0.500000 0.500000 196608 128 0 +( 2312 1992 -312 ) ( 2320 1992 -312 ) ( 2320 1992 -368 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 2320 2000 -312 ) ( 2312 1992 -312 ) ( 2312 1992 -368 ) subway/clip -32 16 0 0.500000 0.500000 196608 128 0 +} +// brush 468 +{ +( 2160 1992 -224 ) ( 2160 2000 -224 ) ( 2168 2000 -224 ) subway/clip 32 32 0 0.500000 0.500000 196608 128 0 +( 2168 2000 -384 ) ( 2160 2000 -384 ) ( 2160 1992 -384 ) subway/clip 32 32 0 0.500000 0.500000 196608 128 0 +( 2160 2000 -368 ) ( 2160 2000 -312 ) ( 2160 1992 -312 ) subway/clip -32 16 0 0.500000 0.500000 196608 128 0 +( 2160 1992 -368 ) ( 2160 1992 -312 ) ( 2168 1992 -312 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 2168 1992 -312 ) ( 2168 1992 -256 ) ( 2160 2000 -256 ) subway/clip -32 16 0 0.500000 0.500000 196608 128 0 +} +// brush 469 +{ +( 976 1300 -540 ) ( 968 1300 -540 ) ( 968 1204 -540 ) subway/clip 0 0 0 1 1 196608 144 0 +( 968 1208 -440 ) ( 968 1304 -440 ) ( 976 1304 -440 ) subway/clip 0 0 0 1 1 196608 144 0 +( 968 1184 -472 ) ( 976 1184 -472 ) ( 976 1184 -504 ) subway/clip 0 0 0 1 1 196608 144 0 +( 976 1184 -472 ) ( 976 1280 -472 ) ( 976 1280 -504 ) subway/clip 0 0 0 1 1 196608 144 0 +( 976 1304 -472 ) ( 968 1304 -472 ) ( 968 1304 -504 ) subway/clip 0 0 0 1 1 196608 144 0 +( 968 1304 -448 ) ( 968 1208 -448 ) ( 968 1208 -480 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 470 +{ +( 1300 1040 -536 ) ( 1292 1040 -536 ) ( 1292 1008 -536 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1292 1012 -440 ) ( 1292 1044 -440 ) ( 1300 1044 -440 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1292 968 -488 ) ( 1300 968 -488 ) ( 1300 968 -496 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1296 1008 -520 ) ( 1296 1040 -520 ) ( 1296 1040 -528 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1300 1088 -520 ) ( 1292 1088 -520 ) ( 1292 1088 -528 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 1292 1004 -488 ) ( 1292 972 -488 ) ( 1292 972 -496 ) subway/clip 0 0 0 1 1 134414336 144 0 +} +// brush 471 +{ +( 8 -536 -400 ) ( 0 -536 -400 ) ( 0 -568 -400 ) subway/clip -8 32 0 1 1 196608 144 0 +( 0 -568 -304 ) ( 0 -536 -304 ) ( 8 -536 -304 ) subway/clip -8 32 0 1 1 196608 144 0 +( 0 -792 -384 ) ( 8 -792 -384 ) ( 8 -792 -400 ) subway/clip -8 0 0 1 1 196608 144 0 +( 8 -520 -384 ) ( 8 -488 -384 ) ( 8 -488 -400 ) subway/clip -32 0 0 1 1 196608 144 0 +( 0 -472 -384 ) ( -8 -472 -384 ) ( -8 -472 -400 ) subway/clip -8 0 0 1 1 196608 144 0 +( 0 -560 -384 ) ( 0 -592 -384 ) ( 0 -592 -400 ) subway/clip -32 0 0 1 1 196608 144 0 +} +// brush 472 +{ +( -128 -536 -400 ) ( -136 -536 -400 ) ( -136 -568 -400 ) subway/clip 0 32 0 1 1 196608 144 0 +( -136 -568 -304 ) ( -136 -536 -304 ) ( -128 -536 -304 ) subway/clip 0 32 0 1 1 196608 144 0 +( -136 -568 -384 ) ( -128 -568 -384 ) ( -128 -568 -400 ) subway/clip 0 0 0 1 1 196608 144 0 +( -128 -520 -384 ) ( -128 -488 -384 ) ( -128 -488 -400 ) subway/clip -32 0 0 1 1 196608 144 0 +( -136 -472 -384 ) ( -144 -472 -384 ) ( -144 -472 -400 ) subway/clip 0 0 0 1 1 196608 144 0 +( -136 -560 -384 ) ( -136 -592 -384 ) ( -136 -592 -400 ) subway/clip -32 0 0 1 1 196608 144 0 +} +// brush 473 +{ +( -128 -760 -400 ) ( -136 -760 -400 ) ( -136 -792 -400 ) subway/clip 0 0 0 1 1 196608 144 0 +( -136 -792 -304 ) ( -136 -760 -304 ) ( -128 -760 -304 ) subway/clip 0 0 0 1 1 196608 144 0 +( -136 -792 -384 ) ( -128 -792 -384 ) ( -128 -792 -400 ) subway/clip 0 0 0 1 1 196608 144 0 +( -128 -792 -384 ) ( -128 -760 -384 ) ( -128 -760 -400 ) subway/clip 0 0 0 1 1 196608 144 0 +( -128 -728 -384 ) ( -136 -728 -384 ) ( -136 -728 -400 ) subway/clip 0 0 0 1 1 196608 144 0 +( -136 -728 -384 ) ( -136 -760 -384 ) ( -136 -760 -400 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 474 +{ +( -456 -1168 -392 ) ( -456 -1176 -392 ) ( -448 -1176 -392 ) subway/clip 56 -48 0 1 1 196608 144 0 +( -448 -1176 -240 ) ( -456 -1176 -240 ) ( -456 -1168 -240 ) subway/clip 56 -48 0 1 1 196608 144 0 +( -456 -1176 -352 ) ( -456 -1176 -336 ) ( -448 -1176 -336 ) subway/clip 56 0 0 1 1 196608 144 0 +( -456 -1168 -352 ) ( -456 -1168 -336 ) ( -456 -1176 -336 ) subway/clip -8 0 0 1 1 196608 144 0 +( -452 -1172 -240 ) ( -456 -1168 -392 ) ( -448 -1176 -392 ) subway/clip -8 0 0 1 1 196608 144 0 +} +// brush 475 +{ +( -288 -1176 -392 ) ( -280 -1176 -392 ) ( -280 -1168 -392 ) subway/clip -40 -48 0 1 1 196608 144 0 +( -280 -1168 -240 ) ( -280 -1176 -240 ) ( -288 -1176 -240 ) subway/clip -40 -48 0 1 1 196608 144 0 +( -288 -1176 -336 ) ( -280 -1176 -336 ) ( -280 -1176 -352 ) subway/clip -40 0 0 1 1 196608 144 0 +( -280 -1176 -336 ) ( -280 -1168 -336 ) ( -280 -1168 -352 ) subway/clip 56 0 0 1 1 196608 144 0 +( -288 -1176 -392 ) ( -280 -1168 -392 ) ( -284 -1172 -240 ) subway/clip 56 0 0 1 1 196608 144 0 +} +// brush 476 +{ +( -280 -992 -392 ) ( -280 -984 -392 ) ( -288 -984 -392 ) subway/clip -40 0 0 1 1 196608 144 0 +( -288 -984 -240 ) ( -280 -984 -240 ) ( -280 -992 -240 ) subway/clip -40 0 0 1 1 196608 144 0 +( -280 -984 -352 ) ( -280 -984 -336 ) ( -288 -984 -336 ) subway/clip -40 0 0 1 1 196608 144 0 +( -280 -992 -352 ) ( -280 -992 -336 ) ( -280 -984 -336 ) subway/clip 8 0 0 1 1 196608 144 0 +( -284 -988 -240 ) ( -280 -992 -392 ) ( -288 -984 -392 ) subway/clip 8 0 0 1 1 196608 144 0 +} +// brush 477 +{ +( -448 -984 -392 ) ( -456 -984 -392 ) ( -456 -992 -392 ) subway/clip 0 0 0 1 1 196608 144 0 +( -456 -992 -240 ) ( -456 -984 -240 ) ( -448 -984 -240 ) subway/clip 0 0 0 1 1 196608 144 0 +( -448 -984 -336 ) ( -456 -984 -336 ) ( -456 -984 -352 ) subway/clip 0 0 0 1 1 196608 144 0 +( -456 -984 -336 ) ( -456 -992 -336 ) ( -456 -992 -352 ) subway/clip 0 0 0 1 1 196608 144 0 +( -448 -984 -392 ) ( -456 -992 -392 ) ( -452 -988 -240 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 478 +{ +( 64 -1176 -200 ) ( 64 -1176 -160 ) ( 104 -1176 -160 ) subway/clip 32 0 0 1 1 196608 144 0 +( -64 -1184 -200 ) ( -64 -1184 -160 ) ( -64 -1216 -160 ) subway/clip 0 0 0 1 1 196608 144 0 +( -16 -1208 -320 ) ( -16 -1168 -320 ) ( -64 -1168 -320 ) subway/clip 32 0 0 1 1 196608 144 0 +( 92 -1168 -168 ) ( 112 -1208 -168 ) ( 72 -1208 -168 ) subway/clip 32 0 0 1 1 196608 144 0 +( -60 -1172 -168 ) ( -64 -1168 -320 ) ( -56 -1176 -320 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 479 +{ +( -56 -1176 -160 ) ( -16 -1176 -160 ) ( -16 -1176 -200 ) subway/clip 0 0 0 1 1 196608 144 0 +( 112 -1216 -160 ) ( 112 -1184 -160 ) ( 112 -1184 -200 ) subway/clip 0 0 0 1 1 196608 144 0 +( 112 -1168 -320 ) ( 64 -1168 -320 ) ( 64 -1208 -320 ) subway/clip 0 0 0 1 1 196608 144 0 +( -24 -1208 -168 ) ( -64 -1208 -168 ) ( -44 -1168 -168 ) subway/clip 0 0 0 1 1 196608 144 0 +( 104 -1176 -320 ) ( 112 -1168 -320 ) ( 108 -1172 -168 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 480 +{ +( 136 -616 -160 ) ( 136 -656 -160 ) ( 136 -656 -200 ) subway/clip -8 0 0 1 1 196608 144 0 +( 176 -672 -184 ) ( 144 -672 -184 ) ( 144 -672 -224 ) subway/clip -8 0 0 1 1 196608 144 0 +( 120 -664 -112 ) ( 120 -624 -112 ) ( 152 -624 -112 ) subway/clip -8 0 0 1 1 196608 144 0 +( 144 -608 -240 ) ( 112 -608 -240 ) ( 112 -648 -240 ) subway/clip -8 0 0 1 1 196608 144 0 +( 144 -688 -240 ) ( 136 -696 -240 ) ( 140 -692 -112 ) subway/clip -8 0 0 1 1 196608 144 0 +( 144 -664 -240 ) ( 144 -704 -240 ) ( 144 -684 -112 ) subway/clip -8 0 0 1 1 196608 144 0 +} +// brush 481 +{ +( 136 -896 -200 ) ( 136 -896 -160 ) ( 136 -936 -160 ) subway/clip 24 0 0 1 1 196608 144 0 +( 144 -888 -224 ) ( 144 -888 -184 ) ( 176 -888 -184 ) subway/clip -8 0 0 1 1 196608 144 0 +( 152 -928 -112 ) ( 120 -928 -112 ) ( 120 -888 -112 ) subway/clip -8 -32 0 1 1 196608 144 0 +( 112 -904 -256 ) ( 112 -944 -256 ) ( 144 -944 -256 ) subway/clip -8 -32 0 1 1 196608 144 0 +( 140 -860 -112 ) ( 136 -856 -240 ) ( 144 -864 -240 ) subway/clip 24 0 0 1 1 196608 144 0 +( 144 -872 -256 ) ( 144 -912 -256 ) ( 144 -892 -112 ) subway/clip 24 0 0 1 1 196608 144 0 +} +// brush 482 +{ +( 264 -896 -216 ) ( 296 -896 -216 ) ( 296 -856 -216 ) subway/clip -8 -8 0 1 1 196608 144 0 +( 296 -848 -104 ) ( 296 -888 -104 ) ( 264 -888 -104 ) subway/clip -8 -8 0 1 1 196608 144 0 +( 264 -848 -144 ) ( 264 -888 -144 ) ( 264 -888 -184 ) subway/clip 8 0 0 1 1 196608 144 0 +( 272 -856 -144 ) ( 304 -856 -144 ) ( 304 -856 -184 ) subway/clip -8 0 0 1 1 196608 144 0 +( 268 -852 -104 ) ( 264 -848 -200 ) ( 272 -856 -200 ) subway/clip 8 0 0 1 1 196608 144 0 +} +// brush 483 +{ +( 296 -696 -216 ) ( 296 -656 -216 ) ( 264 -656 -216 ) subway/clip -8 8 0 1 1 196608 144 0 +( 264 -664 -104 ) ( 296 -664 -104 ) ( 296 -704 -104 ) subway/clip -8 8 0 1 1 196608 144 0 +( 264 -664 -184 ) ( 264 -664 -144 ) ( 264 -704 -144 ) subway/clip -8 0 0 1 1 196608 144 0 +( 304 -696 -184 ) ( 304 -696 -144 ) ( 272 -696 -144 ) subway/clip -8 0 0 1 1 196608 144 0 +( 272 -696 -200 ) ( 264 -704 -200 ) ( 268 -700 -104 ) subway/clip -8 0 0 1 1 196608 144 0 +} +// brush 484 +{ +( 856 -32 -216 ) ( 856 -72 -216 ) ( 888 -72 -216 ) subway/clip -48 0 0 1 1 196608 144 0 +( 888 -64 -120 ) ( 856 -64 -120 ) ( 856 -24 -120 ) subway/clip -48 0 0 1 1 196608 144 0 +( 888 -40 -184 ) ( 888 -40 -144 ) ( 856 -40 -144 ) subway/clip -48 0 0 1 1 196608 144 0 +( 872 -64 -184 ) ( 872 -64 -144 ) ( 872 -24 -144 ) subway/clip -48 0 0 1 1 196608 144 0 +( 864 -48 -136 ) ( 872 -56 -200 ) ( 856 -40 -200 ) subway/clip -48 0 0 1 1 196608 144 0 +} +// brush 485 +{ +( 888 -136 -216 ) ( 856 -136 -216 ) ( 856 -176 -216 ) subway/clip 0 0 0 1 1 196608 144 0 +( 856 -184 -120 ) ( 856 -144 -120 ) ( 888 -144 -120 ) subway/clip 0 0 0 1 1 196608 144 0 +( 856 -168 -144 ) ( 888 -168 -144 ) ( 888 -168 -184 ) subway/clip 0 0 0 1 1 196608 144 0 +( 872 -184 -144 ) ( 872 -144 -144 ) ( 872 -144 -184 ) subway/clip 0 0 0 1 1 196608 144 0 +( 856 -168 -200 ) ( 872 -152 -200 ) ( 864 -160 -136 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 486 +{ +( 888 -152 -216 ) ( 856 -152 -216 ) ( 856 -192 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 856 -200 -200 ) ( 856 -160 -200 ) ( 888 -160 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 856 -200 -160 ) ( 888 -200 -160 ) ( 888 -200 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 872 -200 -160 ) ( 872 -160 -160 ) ( 872 -160 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 888 -168 -160 ) ( 856 -168 -160 ) ( 856 -168 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 856 -160 -160 ) ( 856 -200 -160 ) ( 856 -200 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 487 +{ +( 888 -152 -200 ) ( 856 -152 -200 ) ( 856 -192 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 856 -200 -136 ) ( 856 -160 -136 ) ( 888 -160 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 856 -200 -144 ) ( 888 -200 -144 ) ( 888 -200 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 -200 -144 ) ( 872 -160 -144 ) ( 872 -160 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 888 -168 -144 ) ( 856 -168 -144 ) ( 856 -168 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 856 -160 -144 ) ( 856 -200 -144 ) ( 856 -200 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 488 +{ +( 888 -152 -136 ) ( 856 -152 -136 ) ( 856 -192 -136 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 856 -200 -120 ) ( 856 -160 -120 ) ( 888 -160 -120 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 856 -200 -128 ) ( 888 -200 -128 ) ( 888 -200 -168 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 872 -200 -128 ) ( 872 -160 -128 ) ( 872 -160 -168 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 888 -168 -128 ) ( 856 -168 -128 ) ( 856 -168 -168 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 856 -160 -128 ) ( 856 -200 -128 ) ( 856 -200 -168 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 489 +{ +( 856 -160 -112 ) ( 856 -200 -112 ) ( 856 -200 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 -168 -64 ) ( 856 -168 -64 ) ( 856 -168 -120 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 -200 -112 ) ( 872 -160 -112 ) ( 872 -160 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 856 -200 -64 ) ( 872 -200 -64 ) ( 872 -200 -120 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 -200 -88 ) ( 856 -200 -88 ) ( 856 -168 -88 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 888 -152 -120 ) ( 856 -152 -120 ) ( 856 -192 -120 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 490 +{ +( 888 -152 -88 ) ( 856 -152 -88 ) ( 856 -192 -88 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 -216 -64 ) ( 840 -152 -64 ) ( 872 -152 -64 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 856 -216 -64 ) ( 872 -216 -64 ) ( 872 -200 -88 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 -200 -80 ) ( 872 -160 -80 ) ( 872 -160 -120 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 -152 -64 ) ( 856 -152 -64 ) ( 856 -168 -88 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 -152 -64 ) ( 840 -216 -64 ) ( 856 -200 -88 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 491 +{ +( 840 -160 -96 ) ( 840 -200 -96 ) ( 840 -200 -136 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 888 -152 -96 ) ( 856 -152 -96 ) ( 856 -152 -136 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 872 -184 -96 ) ( 872 -144 -96 ) ( 872 -144 -136 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 856 -216 -96 ) ( 888 -216 -96 ) ( 888 -216 -136 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 856 -200 -48 ) ( 856 -160 -48 ) ( 888 -160 -48 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 888 -152 -64 ) ( 856 -152 -64 ) ( 856 -192 -64 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +} +// brush 492 +{ +( 872 -344 -216 ) ( 864 -344 -216 ) ( 864 -416 -216 ) subway/clip 0 0 0 1 1 196608 144 0 +( 860 -416 -48 ) ( 860 -344 -48 ) ( 868 -344 -48 ) subway/clip 0 0 0 1 1 196608 144 0 +( 868 -600 -152 ) ( 876 -600 -152 ) ( 876 -600 -184 ) subway/clip 0 0 0 1 1 196608 144 0 +( 872 -296 -152 ) ( 872 -224 -152 ) ( 872 -224 -184 ) subway/clip 0 0 0 1 1 196608 144 0 +( 872 -200 -160 ) ( 864 -200 -160 ) ( 864 -200 -192 ) subway/clip 0 0 0 1 1 196608 144 0 +( 870 -436 -152 ) ( 870 -508 -152 ) ( 870 -508 -184 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 493 +{ +( 136 524 -216 ) ( 132 524 -216 ) ( 132 476 -216 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 132 472 -124 ) ( 132 520 -124 ) ( 136 520 -124 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 136 328 -128 ) ( 140 328 -128 ) ( 140 328 -192 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 136 472 -128 ) ( 136 520 -128 ) ( 136 520 -192 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 136 520 -128 ) ( 132 520 -128 ) ( 132 520 -192 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 132 520 -128 ) ( 132 472 -128 ) ( 132 472 -192 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +} +// brush 494 +{ +( 1136 80 -216 ) ( 1132 80 -216 ) ( 1132 64 -216 ) subway/clip -24 0 0 0.500000 0.500000 196608 128 0 +( 1128 64 -148 ) ( 1128 80 -148 ) ( 1132 80 -148 ) subway/clip -24 0 0 0.500000 0.500000 196608 128 0 +( 1132 -28 -148 ) ( 1132 -28 -216 ) ( 1128 -32 -216 ) subway/clip -24 0 0 0.500000 0.500000 196608 128 0 +( 1132 -28 -216 ) ( 1132 -28 -148 ) ( 1132 76 -148 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1132 76 -216 ) ( 1132 76 -148 ) ( 1128 80 -148 ) subway/clip -24 0 0 0.500000 0.500000 196608 128 0 +( 1128 80 -144 ) ( 1128 64 -144 ) ( 1128 64 -176 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +} +// brush 495 +{ +( 1628 656 -216 ) ( 1660 656 -216 ) ( 1660 664 -216 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1644 664 -120 ) ( 1644 656 -120 ) ( 1612 656 -120 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1620 656 -148 ) ( 1620 656 -180 ) ( 1624 660 -180 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1652 660 -176 ) ( 1652 660 -136 ) ( 1620 660 -136 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1696 656 -176 ) ( 1696 656 -136 ) ( 1696 664 -136 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1676 656 -180 ) ( 1676 656 -148 ) ( 1696 656 -148 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +} +// brush 496 +{ +( 1584 1248 -216 ) ( 1584 1280 -216 ) ( 1576 1280 -216 ) subway/clip 24 0 0 1 1 196608 144 0 +( 1576 1264 -120 ) ( 1584 1264 -120 ) ( 1584 1232 -120 ) subway/clip 24 0 0 1 1 196608 144 0 +( 1576 1176 -180 ) ( 1576 1176 -140 ) ( 1584 1176 -140 ) subway/clip 24 0 0 1 1 196608 144 0 +( 1580 1272 -176 ) ( 1580 1272 -136 ) ( 1580 1240 -136 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1580 1260 -180 ) ( 1584 1264 -180 ) ( 1584 1264 -148 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1584 1176 -148 ) ( 1584 1196 -148 ) ( 1584 1196 -180 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 497 +{ +( 1232 1280 -216 ) ( 1224 1280 -216 ) ( 1224 1248 -216 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1224 1232 -120 ) ( 1224 1264 -120 ) ( 1232 1264 -120 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1224 1176 -140 ) ( 1232 1176 -140 ) ( 1232 1176 -180 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1228 1258 -120 ) ( 1228 1258 -216 ) ( 1228 1176 -216 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1228 1258 -216 ) ( 1228 1258 -120 ) ( 1224 1258 -120 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1224 1196 -180 ) ( 1224 1196 -148 ) ( 1224 1176 -148 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 498 +{ +( 876 804 -216 ) ( 872 804 -216 ) ( 872 776 -216 ) subway/clip 0 0 0 1 1 196608 144 0 +( 872 776 -136 ) ( 872 804 -136 ) ( 876 804 -136 ) subway/clip 0 0 0 1 1 196608 144 0 +( 872 784 -152 ) ( 876 784 -152 ) ( 876 784 -184 ) subway/clip 0 0 0 1 1 196608 144 0 +( 876 848 -152 ) ( 876 876 -152 ) ( 876 876 -184 ) subway/clip 0 0 0 1 1 196608 144 0 +( 868 1228 -136 ) ( 864 1228 -136 ) ( 864 1228 -168 ) subway/clip 0 0 0 1 1 196608 144 0 +( 872 964 -136 ) ( 872 936 -136 ) ( 872 936 -168 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 499 +{ +( -120 1544 -80 ) ( -120 1520 -80 ) ( -120 1520 -152 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 16 1544 -80 ) ( -48 1544 -80 ) ( -48 1544 -152 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 192 1520 -80 ) ( 192 1544 -80 ) ( 192 1544 -152 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 56 1542 -80 ) ( 120 1542 -80 ) ( 120 1542 -152 ) subway/clip 0 0 0 1 1 196608 144 0 +( -48 1520 -80 ) ( -48 1544 -80 ) ( 16 1544 -80 ) subway/clip 0 0 0 1 1 134414336 144 0 +( 16 1544 -168 ) ( -48 1544 -168 ) ( -48 1520 -168 ) subway/clip 0 0 0 1 1 134414336 144 0 +} +// brush 500 +{ +( -568 1752 -112 ) ( -696 1752 -112 ) ( -696 1744 -112 ) subway/clip 0 0 0 1 1 196608 144 0 +( -696 1744 -32 ) ( -696 1752 -32 ) ( -568 1752 -32 ) subway/clip 0 0 0 1 1 196608 144 0 +( -592 1748 -48 ) ( -464 1748 -48 ) ( -464 1748 -80 ) subway/clip 0 0 0 1 1 196608 144 0 +( -280 1744 -48 ) ( -280 1752 -48 ) ( -280 1752 -80 ) subway/clip 0 0 0 1 1 196608 144 0 +( -568 1752 -48 ) ( -696 1752 -48 ) ( -696 1752 -80 ) subway/clip 0 0 0 1 1 196608 144 0 +( -696 1752 -48 ) ( -696 1744 -48 ) ( -696 1744 -80 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 501 +{ +( 144 1544 -112 ) ( 208 1544 -112 ) ( 208 1608 -112 ) subway/clip 16 0 0 1 1 196608 144 0 +( 200 1608 -8 ) ( 200 1544 -8 ) ( 136 1544 -8 ) subway/clip 16 0 0 1 1 196608 144 0 +( -280 1560 -112 ) ( -280 1552 -112 ) ( -280 1552 -64 ) subway/clip 0 0 0 1 1 196608 144 0 +( -256 1528 -112 ) ( -296 1528 -112 ) ( -296 1528 -64 ) subway/clip 16 0 0 1 1 196608 144 0 +( -288 1536 -8 ) ( -296 1528 -112 ) ( -280 1544 -112 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 502 +{ +( -1152 1608 -112 ) ( -1152 1544 -112 ) ( -1088 1544 -112 ) subway/clip 0 0 0 1 1 196608 144 0 +( -1080 1544 -8 ) ( -1144 1544 -8 ) ( -1144 1608 -8 ) subway/clip 0 0 0 1 1 196608 144 0 +( -664 1552 -64 ) ( -664 1552 -112 ) ( -664 1560 -112 ) subway/clip 0 0 0 1 1 196608 144 0 +( -648 1528 -64 ) ( -648 1528 -112 ) ( -688 1528 -112 ) subway/clip 0 0 0 1 1 196608 144 0 +( -664 1544 -112 ) ( -648 1528 -112 ) ( -656 1536 -8 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 503 +{ +( -416 1552 0 ) ( -416 1520 0 ) ( -528 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 64 318767104 0 +( -440 1520 0 ) ( -440 1520 -32 ) ( -528 1520 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 64 318767104 0 +( -416 1552 0 ) ( -528 1552 0 ) ( -528 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 64 318767104 0 +( -528 1552 0 ) ( -528 1520 0 ) ( -504 1520 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 64 318767104 0 +( -504 1560 -32 ) ( -504 1512 -32 ) ( -504 1536 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 64 318767104 0 +} +// brush 504 +{ +( -448 1520 -32 ) ( -440 1528 -32 ) ( -504 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -416 1552 0 ) ( -416 1520 0 ) ( -528 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -440 1520 0 ) ( -440 1520 -32 ) ( -528 1520 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -416 1552 0 ) ( -528 1552 0 ) ( -528 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -416 1552 0 ) ( -456 1512 0 ) ( -456 1512 10 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -504 1512 -32 ) ( -504 1560 -32 ) ( -504 1536 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 505 +{ +( -608 1552 0 ) ( -608 1520 0 ) ( -704 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 64 318767104 0 +( -608 1520 0 ) ( -608 1552 0 ) ( -632 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 64 318767104 0 +( -696 1520 -32 ) ( -696 1520 0 ) ( -608 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 64 318767104 0 +( -968 1552 0 ) ( -968 1528 -32 ) ( -600 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 64 318767104 0 +( -632 1536 -32 ) ( -632 1552 -32 ) ( -632 1544 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 64 318767104 0 +} +// brush 506 +{ +( -696 1528 -32 ) ( -704 1520 -32 ) ( -632 1520 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -608 1552 0 ) ( -608 1520 0 ) ( -704 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -696 1520 -32 ) ( -696 1520 0 ) ( -608 1520 0 ) subway/1_tile_damage2 56 32 0 0.500000 0.500000 0 352321536 0 +( -696 1520 0 ) ( -696 1520 -32 ) ( -696 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -968 1552 0 ) ( -968 1528 -32 ) ( -600 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1552 -32 ) ( -632 1536 -32 ) ( -632 1544 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 507 +{ +( 360 -768 -108 ) ( 328 -768 -108 ) ( 328 -792 -108 ) subway/light_tube -16 0 0 0.500000 0.500000 134217728 16777217 6500 +( 328 -792 -104 ) ( 328 -768 -104 ) ( 360 -768 -104 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 328 -784 -104 ) ( 360 -784 -104 ) ( 360 -784 -112 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 372 -792 -104 ) ( 372 -768 -104 ) ( 372 -768 -112 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 360 -768 -104 ) ( 328 -768 -104 ) ( 328 -768 -112 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 328 -768 -104 ) ( 328 -792 -104 ) ( 328 -792 -112 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 508 +{ +( 480 -768 -108 ) ( 448 -768 -108 ) ( 448 -792 -108 ) subway/light_tube 0 0 0 0.500000 0.500000 134217728 16777217 6500 +( 448 -792 -104 ) ( 448 -768 -104 ) ( 480 -768 -104 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 448 -784 -104 ) ( 480 -784 -104 ) ( 480 -784 -112 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 492 -792 -104 ) ( 492 -768 -104 ) ( 492 -768 -112 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 480 -768 -104 ) ( 448 -768 -104 ) ( 448 -768 -112 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 448 -768 -104 ) ( 448 -792 -104 ) ( 448 -792 -112 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 509 +{ +( -304 1504 -48 ) ( -304 1440 -48 ) ( -240 1440 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -304 1272 168 ) ( -304 1552 168 ) ( -304 1552 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -304 1384 64 ) ( -304 1384 72 ) ( -240 1384 72 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -312 1368 64 ) ( -312 1368 72 ) ( -312 1304 72 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -320 1440 -40 ) ( -320 1472 -40 ) ( -304 1472 -40 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -312 1528 -48 ) ( -304 1520 -48 ) ( -308 1524 -40 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 510 +{ +( -312 1368 48 ) ( -312 1368 56 ) ( -312 1304 56 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -304 1376 48 ) ( -304 1376 56 ) ( -240 1376 56 ) subway/1_tile_middle -288 0 0 0.500000 0.500000 0 318767104 0 +( -304 1272 152 ) ( -304 1552 152 ) ( -304 1552 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -240 1432 -48 ) ( -304 1432 -48 ) ( -304 1496 -48 ) subway/1_tile_middle -288 0 0 0.500000 0.500000 0 318767104 0 +( -304 1504 -64 ) ( -304 1440 -64 ) ( -240 1440 -64 ) subway/1_tile_middle -288 0 0 0.500000 0.500000 0 318767104 0 +( -312 1528 -64 ) ( -304 1520 -64 ) ( -308 1524 -48 ) subway/1_tile_middle -288 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 511 +{ +( -312 1392 -128 ) ( -312 1392 -120 ) ( -312 1328 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -304 1376 -112 ) ( -304 1376 -104 ) ( -240 1376 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( -304 1312 -8 ) ( -304 1592 -8 ) ( -304 1592 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -240 1440 -64 ) ( -304 1440 -64 ) ( -304 1504 -64 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -304 1472 -72 ) ( -320 1472 -72 ) ( -320 1440 -72 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -312 1528 -72 ) ( -304 1520 -72 ) ( -308 1524 -64 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 512 +{ +( -240 1544 -48 ) ( -240 1480 -48 ) ( -176 1480 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -240 1760 -48 ) ( -232 1768 -48 ) ( -232 1768 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -240 1792 -48 ) ( -240 1624 -48 ) ( -240 1624 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -248 1448 -96 ) ( -248 1448 -88 ) ( -248 1384 -88 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -256 1608 -40 ) ( -256 1648 -40 ) ( -232 1648 -40 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -240 1520 -48 ) ( -248 1528 -48 ) ( -244 1524 -40 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 513 +{ +( -248 1448 -112 ) ( -248 1448 -104 ) ( -248 1384 -104 ) subway/1_tile_middle 288 0 0 0.500000 0.500000 0 318767104 0 +( -240 1792 -64 ) ( -240 1624 -64 ) ( -240 1624 -48 ) subway/1_tile_middle 288 0 0 0.500000 0.500000 0 318767104 0 +( -240 1760 -64 ) ( -232 1768 -64 ) ( -232 1768 -48 ) subway/1_tile_middle -96 0 0 0.500000 0.500000 0 318767104 0 +( -176 1480 -48 ) ( -240 1480 -48 ) ( -240 1544 -48 ) subway/1_tile_middle -480 96 0 0.500000 0.500000 0 318767104 0 +( -240 1544 -64 ) ( -240 1480 -64 ) ( -176 1480 -64 ) subway/1_tile_middle -480 96 0 0.500000 0.500000 0 318767104 0 +( -240 1520 -64 ) ( -248 1528 -64 ) ( -244 1524 -48 ) subway/1_tile_middle -480 96 0 0.500000 0.500000 0 318767104 0 +} +// brush 514 +{ +( -176 1480 -64 ) ( -240 1480 -64 ) ( -240 1544 -64 ) subway/1_tile 640 2976 0 0.500000 0.500000 0 318767104 0 +( -240 1760 -128 ) ( -232 1768 -128 ) ( -232 1768 -64 ) subway/1_tile -2832 -32 0 0.500000 0.500000 0 318767104 0 +( -240 1792 -112 ) ( -240 1624 -112 ) ( -240 1624 -48 ) subway/1_tile 1264 -32 0 0.500000 0.500000 0 318767104 0 +( -248 1448 -112 ) ( -248 1448 -104 ) ( -248 1384 -104 ) subway/1_tile 1264 -32 0 0.500000 0.500000 0 318767104 0 +( -232 1648 -72 ) ( -256 1648 -72 ) ( -256 1608 -72 ) subway/1_tile 1264 -32 0 0.500000 0.500000 0 318767104 0 +( -240 1520 -72 ) ( -248 1528 -72 ) ( -244 1524 -64 ) subway/1_tile 1264 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 515 +{ +( 512 -96 -144 ) ( 504 -96 -144 ) ( 504 -100 -144 ) subway/light_blue 0 0 0 0.250000 0.250000 134217728 1 20000 +( 512 -100 -136 ) ( 512 -96 -136 ) ( 512 -96 -168 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +( 512 -96 -136 ) ( 504 -96 -136 ) ( 504 -96 -168 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +( 504 -96 -136 ) ( 504 -100 -136 ) ( 504 -100 -168 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +( 504 -104 -144 ) ( 504 -96 -136 ) ( 512 -100 -140 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 516 +{ +( 280 104 -152 ) ( 280 104 -120 ) ( 280 0 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 288 8 -120 ) ( 288 8 -152 ) ( 280 0 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 288 8 -152 ) ( 288 8 -120 ) ( 288 104 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 392 -232 -120 ) ( 392 -168 -120 ) ( 456 -168 -120 ) subway/1_lobby2 -32 16 0 0.500000 0.500000 0 285212672 0 +( 456 -168 -152 ) ( 392 -168 -152 ) ( 392 -232 -152 ) subway/1_lobby2 -32 16 0 0.500000 0.500000 0 285212672 0 +( 184 96 -152 ) ( 304 96 -152 ) ( 244 96 -120 ) subway/1_lobby2 -32 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 517 +{ +( 264 104 -120 ) ( 264 104 -152 ) ( 272 104 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 264 104 -152 ) ( 264 104 -120 ) ( 264 0 -120 ) subway/1_stair_side1 0 0 270 0.500000 0.500000 0 285212672 0 +( 288 8 -152 ) ( 288 8 -120 ) ( 288 104 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 376 -232 -128 ) ( 376 -168 -128 ) ( 440 -168 -128 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 440 -168 -152 ) ( 376 -168 -152 ) ( 376 -232 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 304 96 -152 ) ( 184 96 -152 ) ( 244 96 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 518 +{ +( 456 -168 -184 ) ( 392 -168 -184 ) ( 392 -232 -184 ) subway/1_lobby1a -32 -16 0 0.500000 0.500000 0 285212672 0 +( 392 -232 -152 ) ( 392 -168 -152 ) ( 456 -168 -152 ) subway/1_lobby1a -32 -16 0 0.500000 0.500000 0 285212672 0 +( 288 8 -184 ) ( 288 8 -152 ) ( 288 104 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 288 8 -152 ) ( 288 8 -184 ) ( 280 0 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 280 104 -184 ) ( 280 104 -152 ) ( 280 0 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 184 96 -184 ) ( 304 96 -184 ) ( 244 96 -152 ) subway/1_lobby1a -32 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 519 +{ +( 440 -168 -184 ) ( 376 -168 -184 ) ( 376 -232 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 376 -232 -152 ) ( 376 -168 -152 ) ( 440 -168 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 288 8 -184 ) ( 288 8 -152 ) ( 288 104 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 264 104 -184 ) ( 264 104 -152 ) ( 264 0 -152 ) subway/1_stair_side1 0 0 270 0.500000 0.500000 0 285212672 0 +( 264 104 -152 ) ( 264 104 -184 ) ( 272 104 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 304 96 -184 ) ( 184 96 -184 ) ( 244 96 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 520 +{ +( 456 -168 -216 ) ( 392 -168 -216 ) ( 392 -232 -216 ) subway/1_lobby1 -32 16 0 0.500000 0.500000 0 285212672 0 +( 392 -232 -184 ) ( 392 -168 -184 ) ( 456 -168 -184 ) subway/1_lobby1 -32 16 0 0.500000 0.500000 0 285212672 0 +( 288 8 -216 ) ( 288 8 -184 ) ( 288 104 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 288 8 -184 ) ( 288 8 -216 ) ( 280 0 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 280 104 -216 ) ( 280 104 -184 ) ( 280 0 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 184 96 -216 ) ( 304 96 -216 ) ( 244 96 -184 ) subway/1_lobby1 -32 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 521 +{ +( 440 -168 -216 ) ( 376 -168 -216 ) ( 376 -232 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 376 -232 -184 ) ( 376 -168 -184 ) ( 440 -168 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 288 8 -216 ) ( 288 8 -184 ) ( 288 104 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 264 104 -216 ) ( 264 104 -184 ) ( 264 0 -184 ) subway/1_stair_side1 0 0 270 0.500000 0.500000 0 285212672 0 +( 264 104 -184 ) ( 264 104 -216 ) ( 272 104 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 304 96 -216 ) ( 184 96 -216 ) ( 244 96 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 522 +{ +( 528 -296 -120 ) ( 464 -296 -120 ) ( 464 -360 -120 ) subway/1_concrete_floor -16 0 0 0.500000 0.500000 0 285212672 0 +( 464 -360 -112 ) ( 464 -296 -112 ) ( 528 -296 -112 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 344 -96 -88 ) ( 336 -96 -88 ) ( 336 -96 -56 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 280 -784 -88 ) ( 280 -784 -120 ) ( 280 -928 -120 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 184 -328 -120 ) ( 184 -328 -88 ) ( 184 -712 -88 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 168 96 -120 ) ( 288 96 -120 ) ( 228 96 -112 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 523 +{ +( 528 -296 -128 ) ( 464 -296 -128 ) ( 464 -360 -128 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 464 -360 -112 ) ( 464 -296 -112 ) ( 528 -296 -112 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 288 -784 -88 ) ( 288 -784 -120 ) ( 288 -928 -120 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 456 104 -88 ) ( 456 104 -120 ) ( 464 104 -120 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 192 -328 -120 ) ( 192 -328 -88 ) ( 192 -712 -88 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 288 96 -120 ) ( 168 96 -120 ) ( 228 96 -112 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 524 +{ +( 352 -344 -152 ) ( 288 -344 -152 ) ( 288 -408 -152 ) subway/1_lobby2 32 16 0 0.500000 0.500000 0 285212672 0 +( 288 -408 -120 ) ( 288 -344 -120 ) ( 352 -344 -120 ) subway/1_lobby2 32 16 0 0.500000 0.500000 0 285212672 0 +( 184 -64 -152 ) ( 184 -64 -120 ) ( 184 104 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 184 -96 -120 ) ( 184 -96 -152 ) ( 176 -104 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 176 -72 -152 ) ( 176 248 -152 ) ( 176 248 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 152 96 -152 ) ( 272 96 -152 ) ( 212 96 -120 ) subway/1_lobby2 32 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 525 +{ +( 368 -344 -152 ) ( 304 -344 -152 ) ( 304 -408 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 304 -408 -120 ) ( 304 -344 -120 ) ( 368 -344 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 200 -64 -152 ) ( 200 -64 -120 ) ( 200 104 -120 ) subway/1_stair_side1 0 0 270 0.500000 0.500000 0 285212672 0 +( 176 -40 -152 ) ( 176 280 -152 ) ( 176 280 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 184 104 -152 ) ( 184 104 -120 ) ( 176 104 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 288 96 -152 ) ( 168 96 -152 ) ( 228 96 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 526 +{ +( 176 -72 -184 ) ( 176 248 -184 ) ( 176 248 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 184 -96 -152 ) ( 184 -96 -184 ) ( 176 -104 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 184 -64 -184 ) ( 184 -64 -152 ) ( 184 104 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 288 -408 -152 ) ( 288 -344 -152 ) ( 352 -344 -152 ) subway/1_lobby1a 32 -16 0 0.500000 0.500000 0 285212672 0 +( 352 -344 -184 ) ( 288 -344 -184 ) ( 288 -408 -184 ) subway/1_lobby1a 32 -16 0 0.500000 0.500000 0 285212672 0 +( 152 96 -184 ) ( 272 96 -184 ) ( 212 96 -152 ) subway/1_lobby1a 32 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 527 +{ +( 184 104 -184 ) ( 184 104 -152 ) ( 176 104 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 176 -40 -184 ) ( 176 280 -184 ) ( 176 280 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 200 -64 -184 ) ( 200 -64 -152 ) ( 200 104 -152 ) subway/1_stair_side1 0 0 270 0.500000 0.500000 0 285212672 0 +( 304 -408 -152 ) ( 304 -344 -152 ) ( 368 -344 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 368 -344 -184 ) ( 304 -344 -184 ) ( 304 -408 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 288 96 -184 ) ( 168 96 -184 ) ( 228 96 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 528 +{ +( 176 -72 -216 ) ( 176 248 -216 ) ( 176 248 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 184 -96 -184 ) ( 184 -96 -216 ) ( 176 -104 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 184 -64 -216 ) ( 184 -64 -184 ) ( 184 104 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 288 -408 -184 ) ( 288 -344 -184 ) ( 352 -344 -184 ) subway/1_lobby1 32 16 0 0.500000 0.500000 0 285212672 0 +( 352 -344 -216 ) ( 288 -344 -216 ) ( 288 -408 -216 ) subway/1_lobby1 32 16 0 0.500000 0.500000 0 285212672 0 +( 152 96 -216 ) ( 272 96 -216 ) ( 212 96 -184 ) subway/1_lobby1 32 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 529 +{ +( 184 104 -216 ) ( 184 104 -184 ) ( 176 104 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 176 -40 -216 ) ( 176 280 -216 ) ( 176 280 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 200 -64 -216 ) ( 200 -64 -184 ) ( 200 104 -184 ) subway/1_stair_side1 0 0 270 0.500000 0.500000 0 285212672 0 +( 304 -408 -184 ) ( 304 -344 -184 ) ( 368 -344 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 368 -344 -216 ) ( 304 -344 -216 ) ( 304 -408 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 288 96 -216 ) ( 168 96 -216 ) ( 228 96 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 530 +{ +( 1352 1112 -216 ) ( 1224 1112 -216 ) ( 1224 1096 -216 ) subway/skip 0 0 0 1 1 0 656 0 +( 1224 1096 -88 ) ( 1224 1112 -88 ) ( 1352 1112 -88 ) subway/skip 0 0 0 1 1 0 656 0 +( 1232 1032 -88 ) ( 1360 1032 -88 ) ( 1360 1032 -96 ) subway/skip 0 0 0 1 1 0 656 0 +( 1320 1048 -88 ) ( 1320 1064 -88 ) ( 1320 1064 -96 ) subway/hint -16 0 0 1 1 0 400 0 +( 1352 1104 -88 ) ( 1224 1104 -88 ) ( 1224 1104 -96 ) subway/skip 0 0 0 1 1 0 656 0 +( 1312 1096 -88 ) ( 1312 1080 -88 ) ( 1312 1080 -96 ) subway/skip 0 0 0 1 1 0 656 0 +} +// brush 531 +{ +( 1336 1424 -216 ) ( 1208 1424 -216 ) ( 1208 1408 -216 ) subway/skip -16 0 0 1 1 0 656 0 +( 1208 1408 -88 ) ( 1208 1424 -88 ) ( 1336 1424 -88 ) subway/skip -16 0 0 1 1 0 656 0 +( 1208 1392 -88 ) ( 1336 1392 -88 ) ( 1336 1392 -96 ) subway/skip -16 0 0 1 1 0 656 0 +( 1360 1408 -88 ) ( 1360 1424 -88 ) ( 1360 1424 -96 ) subway/skip 0 0 0 1 1 0 656 0 +( 1336 1416 -88 ) ( 1208 1416 -88 ) ( 1208 1416 -96 ) subway/hint -16 0 0 1 1 0 400 0 +( 1224 1416 -88 ) ( 1224 1400 -88 ) ( 1224 1400 -96 ) subway/skip 0 0 0 1 1 0 656 0 +} +// brush 532 +{ +( -1520 176 512 ) ( -1520 240 512 ) ( -1456 240 512 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1480 -448 128 ) ( -1416 -448 128 ) ( -1416 -448 120 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1424 -440 128 ) ( -1488 -440 128 ) ( -1488 -440 120 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1760 216 128 ) ( -1760 152 128 ) ( -1760 152 120 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -2032 -688 448 ) ( -1976 -688 448 ) ( -2004 -432 448 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1688 -424 216 ) ( -1688 -448 216 ) ( -1688 -436 504 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +} +// brush 533 +{ +( 1888 968 -200 ) ( 1888 968 -168 ) ( 1888 856 -168 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1888 1016 -168 ) ( 1888 1016 -200 ) ( 1896 1016 -200 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1896 960 -200 ) ( 1896 960 -168 ) ( 1896 1016 -168 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1896 928 -168 ) ( 1888 928 -168 ) ( 1888 956 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1888 956 -200 ) ( 1888 928 -200 ) ( 1896 928 -200 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1896 904 -200 ) ( 1888 912 -200 ) ( 1892 908 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +} +// brush 534 +{ +( 1620 656 -128 ) ( 1592 656 -128 ) ( 1592 648 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1592 648 -120 ) ( 1592 656 -120 ) ( 1620 656 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1648 648 -128 ) ( 1552 648 -128 ) ( 1552 648 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1696 656 -120 ) ( 1696 656 -128 ) ( 1704 648 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1800 656 -128 ) ( 1800 656 -120 ) ( 1680 656 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1456 648 -128 ) ( 1464 656 -128 ) ( 1460 652 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 535 +{ +( 1620 656 -168 ) ( 1592 656 -168 ) ( 1592 648 -168 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1592 648 -128 ) ( 1592 656 -128 ) ( 1620 656 -128 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1624 648 -168 ) ( 1528 648 -168 ) ( 1528 648 -128 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1696 656 -128 ) ( 1696 656 -168 ) ( 1704 648 -168 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1688 656 -168 ) ( 1688 656 -128 ) ( 1568 656 -128 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1456 648 -168 ) ( 1464 656 -168 ) ( 1460 652 -128 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 536 +{ +( 1800 656 -200 ) ( 1800 656 -168 ) ( 1680 656 -168 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1696 656 -168 ) ( 1696 656 -200 ) ( 1704 648 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1648 648 -200 ) ( 1552 648 -200 ) ( 1552 648 -168 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1592 648 -168 ) ( 1592 656 -168 ) ( 1620 656 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1620 656 -200 ) ( 1592 656 -200 ) ( 1592 648 -200 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1456 648 -200 ) ( 1464 656 -200 ) ( 1460 652 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +} +// brush 537 +{ +( 1620 656 -216 ) ( 1592 656 -216 ) ( 1592 648 -216 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1592 648 -200 ) ( 1592 656 -200 ) ( 1620 656 -200 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1648 648 -216 ) ( 1552 648 -216 ) ( 1552 648 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1696 656 -200 ) ( 1696 656 -216 ) ( 1704 648 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1800 656 -216 ) ( 1800 656 -200 ) ( 1680 656 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1456 648 -216 ) ( 1464 656 -216 ) ( 1460 652 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +} +// brush 538 +{ +( 680 -496 -184 ) ( 616 -496 -184 ) ( 616 -560 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 616 -560 -120 ) ( 616 -496 -120 ) ( 680 -496 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 392 -416 -184 ) ( 384 -416 -184 ) ( 384 -416 -152 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 576 -392 -152 ) ( 576 -392 -184 ) ( 584 -392 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 566 -416 -184 ) ( 566 -410 -184 ) ( 566 -413 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 568 -412 -184 ) ( 568 -416 -184 ) ( 568 -414 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 539 +{ +( 680 -496 -184 ) ( 616 -496 -184 ) ( 616 -560 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 616 -560 -120 ) ( 616 -496 -120 ) ( 680 -496 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 392 -416 -184 ) ( 384 -416 -184 ) ( 384 -416 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -1152 -152 ) ( 584 -1152 -184 ) ( 584 -1296 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 576 -392 -152 ) ( 576 -392 -184 ) ( 584 -392 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 568 -416 -184 ) ( 568 -412 -184 ) ( 568 -414 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 540 +{ +( 680 -496 -184 ) ( 616 -496 -184 ) ( 616 -560 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 616 -560 -120 ) ( 616 -496 -120 ) ( 680 -496 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 392 -416 -184 ) ( 384 -416 -184 ) ( 384 -416 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 576 -392 -152 ) ( 576 -392 -184 ) ( 584 -392 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 368 128 -184 ) ( 368 128 -152 ) ( 368 -256 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 566 -410 -184 ) ( 566 -416 -184 ) ( 566 -413 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 541 +{ +( 680 -672 -184 ) ( 616 -672 -184 ) ( 616 -736 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 616 -736 -152 ) ( 616 -672 -152 ) ( 680 -672 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 592 -608 -184 ) ( 584 -608 -184 ) ( 584 -608 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -1328 -152 ) ( 584 -1328 -184 ) ( 584 -1472 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 560 -568 -152 ) ( 560 -568 -184 ) ( 568 -568 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 568 -572 -184 ) ( 568 -566 -184 ) ( 568 -569 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 542 +{ +( 680 -672 -216 ) ( 616 -672 -216 ) ( 616 -736 -216 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 616 -736 -152 ) ( 616 -672 -152 ) ( 680 -672 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 592 -608 -184 ) ( 584 -608 -184 ) ( 584 -608 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 560 -568 -152 ) ( 560 -568 -184 ) ( 568 -568 -184 ) subway/1_black 6 0 0 1 1 0 16777216 0 +( 566 -572 -184 ) ( 566 -568 -184 ) ( 566 -570 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 568 -566 -184 ) ( 568 -572 -184 ) ( 568 -569 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 543 +{ +( 568 -568 -120 ) ( 568 -568 -152 ) ( 576 -568 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -1328 -120 ) ( 584 -1328 -152 ) ( 584 -1472 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 592 -608 -168 ) ( 584 -608 -168 ) ( 584 -608 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -736 -120 ) ( 616 -672 -120 ) ( 680 -672 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 680 -672 -152 ) ( 616 -672 -152 ) ( 616 -736 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 -572 -152 ) ( 568 -566 -152 ) ( 568 -569 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 544 +{ +( 568 -568 -120 ) ( 568 -568 -152 ) ( 576 -568 -152 ) subway/1_black 6 0 0 1 1 0 16777216 0 +( 592 -608 -168 ) ( 584 -608 -168 ) ( 584 -608 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -736 -120 ) ( 616 -672 -120 ) ( 680 -672 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 680 -672 -152 ) ( 616 -672 -152 ) ( 616 -736 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 566 -572 -152 ) ( 566 -568 -152 ) ( 566 -570 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 -566 -152 ) ( 568 -572 -152 ) ( 568 -569 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 545 +{ +( 680 -672 -184 ) ( 616 -672 -184 ) ( 616 -736 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 616 -736 -152 ) ( 616 -672 -152 ) ( 680 -672 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 592 -608 -184 ) ( 584 -608 -184 ) ( 584 -608 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 560 -568 -152 ) ( 560 -568 -184 ) ( 568 -568 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 552 -56 -184 ) ( 552 -56 -152 ) ( 552 -440 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 566 -568 -184 ) ( 566 -572 -184 ) ( 566 -570 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 546 +{ +( 552 -56 -168 ) ( 552 -56 -136 ) ( 552 -440 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 -568 -120 ) ( 568 -568 -152 ) ( 576 -568 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 592 -608 -168 ) ( 584 -608 -168 ) ( 584 -608 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -736 -120 ) ( 616 -672 -120 ) ( 680 -672 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 680 -672 -152 ) ( 616 -672 -152 ) ( 616 -736 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 566 -568 -152 ) ( 566 -572 -152 ) ( 566 -570 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 547 +{ +( 680 -496 -136 ) ( 616 -496 -136 ) ( 616 -560 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -560 -120 ) ( 616 -496 -120 ) ( 680 -496 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 400 -432 -152 ) ( 392 -432 -152 ) ( 392 -432 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -1152 -120 ) ( 584 -1152 -152 ) ( 584 -1296 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 -408 -104 ) ( 576 -408 -136 ) ( 584 -408 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 -416 -136 ) ( 568 -406 -136 ) ( 568 -411 -120 ) subway/1_black 6 0 0 1 1 0 16777216 0 +} +// brush 548 +{ +( 680 -496 -136 ) ( 616 -496 -136 ) ( 616 -560 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -560 -120 ) ( 616 -496 -120 ) ( 680 -496 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 400 -432 -152 ) ( 392 -432 -152 ) ( 392 -432 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 -408 -104 ) ( 576 -408 -136 ) ( 584 -408 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 416 128 -136 ) ( 416 128 -104 ) ( 416 -256 -104 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 566 -406 -136 ) ( 566 -416 -136 ) ( 566 -411 -120 ) subway/1_stair_side1 0 -3 -180 0.500000 0.500000 0 285212672 0 +} +// brush 549 +{ +( 576 -432 -120 ) ( 576 -432 -152 ) ( 584 -432 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -1248 -120 ) ( 584 -1248 -152 ) ( 584 -1392 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 592 -568 -152 ) ( 584 -568 -152 ) ( 584 -568 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -664 -120 ) ( 616 -600 -120 ) ( 680 -600 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 680 -600 -136 ) ( 616 -600 -136 ) ( 616 -664 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 568 -440 -136 ) ( 568 -430 -136 ) ( 568 -435 -120 ) subway/1_black 6 0 0 1 1 0 16777216 0 +} +// brush 550 +{ +( 552 16 -152 ) ( 552 16 -120 ) ( 552 -368 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 -432 -120 ) ( 576 -432 -152 ) ( 584 -432 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 592 -568 -152 ) ( 584 -568 -152 ) ( 584 -568 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -664 -120 ) ( 616 -600 -120 ) ( 680 -600 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 680 -600 -136 ) ( 616 -600 -136 ) ( 616 -664 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 566 -430 -136 ) ( 566 -440 -136 ) ( 566 -435 -120 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 551 +{ +( 562 16 -168 ) ( 562 16 -136 ) ( 562 -368 -136 ) subway/1_stair_side1 0 0 90 0.500000 0.500000 134217728 285212672 0 +( 558 -416 -136 ) ( 558 -416 -168 ) ( 566 -416 -168 ) subway/1_stair_side1 0 8 90 0.500000 0.500000 134217728 285212672 0 +( 566 -1248 -136 ) ( 566 -1248 -168 ) ( 566 -1392 -168 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 574 -418 -168 ) ( 566 -418 -168 ) ( 566 -418 -136 ) subway/1_stair_side1 1 8 90 0.500000 0.500000 134217728 285212672 0 +( 598 -664 -136 ) ( 598 -600 -136 ) ( 662 -600 -136 ) subway/1_stair_side1 0 8 90 0.500000 0.500000 134217728 285212672 0 +( 662 -600 -216 ) ( 598 -600 -216 ) ( 598 -664 -216 ) subway/1_stair_side1 0 8 90 0.500000 0.500000 134217728 285212672 0 +} +// brush 552 +{ +( 562 -134 -168 ) ( 562 -134 -136 ) ( 562 -518 -136 ) subway/1_stair_side1 0 -4 90 0.500000 0.500000 134217728 285212672 0 +( 558 -566 -136 ) ( 558 -566 -168 ) ( 566 -566 -168 ) subway/1_stair_side1 1 8 90 0.500000 0.500000 134217728 285212672 0 +( 566 -1398 -136 ) ( 566 -1398 -168 ) ( 566 -1542 -168 ) subway/1_black 6 0 0 1 1 134217728 16777216 0 +( 574 -568 -168 ) ( 566 -568 -168 ) ( 566 -568 -136 ) subway/1_stair_side1 1 8 90 0.500000 0.500000 134217728 285212672 0 +( 598 -814 -136 ) ( 598 -750 -136 ) ( 662 -750 -136 ) subway/1_stair_side1 -4 9 90 0.500000 0.500000 134217728 285212672 0 +( 662 -750 -216 ) ( 598 -750 -216 ) ( 598 -814 -216 ) subway/1_stair_side1 -4 9 90 0.500000 0.500000 134217728 285212672 0 +} +// brush 553 +{ +( 566 -488 -186 ) ( 566 -488 -570 ) ( 566 -520 -570 ) subway/1_stair_side1 0 -3 -180 0.500000 0.500000 134217728 285212672 0 +( 562 -520 -138 ) ( 570 -520 -138 ) ( 570 -488 -138 ) subway/1_stair_side1 1 8 -90 0.500000 -0.500000 134217728 285212672 0 +( 562 -520 838 ) ( 562 -520 694 ) ( 562 -488 694 ) subway/1_black -10 0 90 1 1 134217728 16777216 0 +( 562 -488 -136 ) ( 562 -520 -136 ) ( 554 -520 -136 ) subway/1_stair_side1 1 8 -90 0.500000 -0.500000 134217728 285212672 0 +( 464 -416 46 ) ( 528 -416 46 ) ( 528 -416 110 ) subway/1_stair_side1 -3 8 90 0.500000 0.500000 134217728 285212672 0 +( 530 -568 110 ) ( 530 -568 46 ) ( 466 -568 46 ) subway/1_stair_side1 -3 8 90 0.500000 0.500000 134217728 285212672 0 +} +// brush 554 +{ +( 572 -488 -186 ) ( 572 -488 -570 ) ( 572 -520 -570 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 568 -520 -138 ) ( 576 -520 -138 ) ( 576 -488 -138 ) subway/1_stair_side1 2 -4 -90 0.500000 -0.500000 134217728 285212672 0 +( 568 -520 838 ) ( 568 -520 694 ) ( 568 -488 694 ) subway/1_black -10 0 90 1 1 134217728 16777216 0 +( 568 -488 -136 ) ( 568 -520 -136 ) ( 560 -520 -136 ) subway/1_stair_side1 2 -4 -90 0.500000 -0.500000 134217728 285212672 0 +( 470 -416 46 ) ( 534 -416 46 ) ( 534 -416 110 ) subway/1_stair_side1 -3 -4 90 0.500000 0.500000 134217728 285212672 0 +( 536 -568 110 ) ( 536 -568 46 ) ( 472 -568 46 ) subway/1_stair_side1 -3 -4 90 0.500000 0.500000 134217728 285212672 0 +} +// brush 555 +{ +( 568 -134 -168 ) ( 568 -134 -136 ) ( 568 -518 -136 ) subway/1_stair_side1 0 12 90 0.500000 0.500000 134217728 285212672 0 +( 564 -566 -136 ) ( 564 -566 -168 ) ( 572 -566 -168 ) subway/1_stair_side1 2 -4 90 0.500000 0.500000 134217728 285212672 0 +( 572 -1398 -136 ) ( 572 -1398 -168 ) ( 572 -1542 -168 ) subway/1_black 6 0 0 1 1 134217728 16777216 0 +( 580 -568 -168 ) ( 572 -568 -168 ) ( 572 -568 -136 ) subway/1_stair_side1 2 -4 90 0.500000 0.500000 134217728 285212672 0 +( 604 -814 -136 ) ( 604 -750 -136 ) ( 668 -750 -136 ) subway/1_stair_side1 12 -3 90 0.500000 0.500000 134217728 285212672 0 +( 668 -750 -216 ) ( 604 -750 -216 ) ( 604 -814 -216 ) subway/1_stair_side1 12 -3 90 0.500000 0.500000 134217728 285212672 0 +} +// brush 556 +{ +( 568 16 -168 ) ( 568 16 -136 ) ( 568 -368 -136 ) subway/1_stair_side1 0 0 90 0.500000 0.500000 134217728 285212672 0 +( 564 -416 -136 ) ( 564 -416 -168 ) ( 572 -416 -168 ) subway/1_stair_side1 0 -4 90 0.500000 0.500000 134217728 285212672 0 +( 572 -1248 -136 ) ( 572 -1248 -168 ) ( 572 -1392 -168 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 580 -418 -168 ) ( 572 -418 -168 ) ( 572 -418 -136 ) subway/1_stair_side1 2 -4 90 0.500000 0.500000 134217728 285212672 0 +( 604 -664 -136 ) ( 604 -600 -136 ) ( 668 -600 -136 ) subway/1_stair_side1 0 -4 90 0.500000 0.500000 134217728 285212672 0 +( 668 -600 -216 ) ( 604 -600 -216 ) ( 604 -664 -216 ) subway/1_stair_side1 0 -4 90 0.500000 0.500000 134217728 285212672 0 +} +// brush 557 +{ +( -696 1608 -48 ) ( -696 1608 0 ) ( -696 1672 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -696 1608 0 ) ( -696 1608 -48 ) ( -704 1608 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -704 1584 -32 ) ( -704 1584 -48 ) ( -704 1752 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -704 1608 0 ) ( -704 1544 0 ) ( -768 1544 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -768 1544 -24 ) ( -704 1544 -24 ) ( -704 1608 -24 ) subway/1_stair_side1 0 0 90 0.500000 -0.500000 0 285212672 0 +( -704 1672 -48 ) ( -672 1672 -48 ) ( -688 1672 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 558 +{ +( -696 1656 0 ) ( -696 1656 -48 ) ( -696 1560 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -32 ) ( -704 1520 -48 ) ( -704 1688 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -696 1760 -48 ) ( -696 1760 0 ) ( -704 1760 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -704 1544 0 ) ( -704 1480 0 ) ( -768 1480 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -768 1480 -48 ) ( -704 1480 -48 ) ( -704 1544 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -672 1672 -48 ) ( -704 1672 -48 ) ( -688 1672 0 ) subway/1_stair_side1 0 0 90 0.500000 -0.500000 0 285212672 0 +} +// brush 559 +{ +( -696 1624 0 ) ( -696 1624 -48 ) ( -696 1528 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -48 ) ( -704 1520 -32 ) ( -696 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -32 ) ( -704 1520 -48 ) ( -704 1688 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -704 1544 0 ) ( -704 1480 0 ) ( -768 1480 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -768 1480 -48 ) ( -704 1480 -48 ) ( -704 1544 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -704 1608 -48 ) ( -672 1608 -48 ) ( -688 1608 0 ) subway/1_stair_side1 0 0 90 0.500000 -0.500000 0 285212672 0 +} +// brush 560 +{ +( -768 1480 -64 ) ( -704 1480 -64 ) ( -704 1544 -64 ) subway/1_tile_middle 448 96 0 0.500000 0.500000 0 318767104 0 +( -704 1544 -48 ) ( -704 1480 -48 ) ( -768 1480 -48 ) subway/1_tile_middle 448 96 0 0.500000 0.500000 0 318767104 0 +( -696 1760 -64 ) ( -696 1760 -48 ) ( -704 1760 -48 ) subway/1_tile_middle -96 0 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -48 ) ( -704 1520 -64 ) ( -704 1688 -64 ) subway/1_tile_middle 288 0 0 0.500000 0.500000 0 318767104 0 +( -696 1656 -48 ) ( -696 1656 -64 ) ( -696 1560 -64 ) subway/1_tile_middle 288 0 0 0.500000 0.500000 0 318767104 0 +( -672 1672 -64 ) ( -704 1672 -64 ) ( -688 1672 -48 ) subway/1_stair_side1 0 0 90 0.500000 -0.500000 0 285212672 0 +} +// brush 561 +{ +( -768 1480 -64 ) ( -704 1480 -64 ) ( -704 1544 -64 ) subway/1_tile_middle 448 96 0 0.500000 0.500000 0 318767104 0 +( -704 1544 -48 ) ( -704 1480 -48 ) ( -768 1480 -48 ) subway/1_tile_middle 448 96 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -48 ) ( -704 1520 -64 ) ( -704 1688 -64 ) subway/1_tile_middle 288 0 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -64 ) ( -704 1520 -48 ) ( -696 1528 -48 ) subway/1_tile_middle -96 0 0 0.500000 0.500000 0 318767104 0 +( -696 1624 -48 ) ( -696 1624 -64 ) ( -696 1528 -64 ) subway/1_tile_middle 288 0 0 0.500000 0.500000 0 318767104 0 +( -704 1608 -64 ) ( -672 1608 -64 ) ( -688 1608 -48 ) subway/1_stair_side1 0 0 90 0.500000 -0.500000 0 285212672 0 +} +// brush 562 +{ +( -696 1656 -64 ) ( -696 1656 -96 ) ( -696 1560 -96 ) subway/1_tile 1264 -32 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -48 ) ( -704 1520 -112 ) ( -704 1688 -112 ) subway/1_tile 1264 -32 0 0.500000 0.500000 0 318767104 0 +( -696 1760 -96 ) ( -696 1760 -64 ) ( -704 1760 -64 ) subway/1_tile -2832 -32 0 0.500000 0.500000 0 318767104 0 +( -704 1544 -64 ) ( -704 1480 -64 ) ( -768 1480 -64 ) subway/1_tile 1568 2976 0 0.500000 0.500000 0 318767104 0 +( -768 1480 -96 ) ( -704 1480 -96 ) ( -704 1544 -96 ) subway/1_tile 1568 2976 0 0.500000 0.500000 0 318767104 0 +( -672 1672 -96 ) ( -704 1672 -96 ) ( -688 1672 -64 ) subway/1_stair_side1 0 0 90 0.500000 -0.500000 0 285212672 0 +} +// brush 563 +{ +( -696 1624 -64 ) ( -696 1624 -96 ) ( -696 1528 -96 ) subway/1_tile 1264 -32 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -112 ) ( -704 1520 -48 ) ( -696 1528 -48 ) subway/1_tile -2832 -32 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -48 ) ( -704 1520 -112 ) ( -704 1688 -112 ) subway/1_tile 1264 -32 0 0.500000 0.500000 0 318767104 0 +( -704 1544 -64 ) ( -704 1480 -64 ) ( -768 1480 -64 ) subway/1_tile 1568 2976 0 0.500000 0.500000 0 318767104 0 +( -768 1480 -96 ) ( -704 1480 -96 ) ( -704 1544 -96 ) subway/1_tile 1568 2976 0 0.500000 0.500000 0 318767104 0 +( -704 1608 -96 ) ( -672 1608 -96 ) ( -688 1608 -64 ) subway/1_stair_side1 0 0 90 0.500000 -0.500000 0 285212672 0 +} +// brush 564 +{ +( -768 1480 -112 ) ( -704 1480 -112 ) ( -704 1544 -112 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -704 1544 -96 ) ( -704 1480 -96 ) ( -768 1480 -96 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -696 1760 -112 ) ( -696 1760 -96 ) ( -704 1760 -96 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -64 ) ( -704 1520 -128 ) ( -704 1688 -128 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -696 1656 -96 ) ( -696 1656 -112 ) ( -696 1560 -112 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -672 1672 -112 ) ( -704 1672 -112 ) ( -688 1672 -96 ) subway/1_stair_side1 0 0 90 0.500000 -0.500000 0 285212672 0 +} +// brush 565 +{ +( -768 1480 -112 ) ( -704 1480 -112 ) ( -704 1544 -112 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -704 1544 -96 ) ( -704 1480 -96 ) ( -768 1480 -96 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -64 ) ( -704 1520 -128 ) ( -704 1688 -128 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -128 ) ( -704 1520 -64 ) ( -696 1528 -64 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -696 1624 -96 ) ( -696 1624 -112 ) ( -696 1528 -112 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -704 1608 -112 ) ( -672 1608 -112 ) ( -688 1608 -96 ) subway/1_stair_side1 0 0 90 0.500000 -0.500000 0 285212672 0 +} +// brush 566 +{ +( -680 1672 -112 ) ( -720 1672 -112 ) ( -720 1600 -112 ) subway/3_door4 0 16 0 1 1 0 16777216 0 +( -720 1600 -24 ) ( -720 1672 -24 ) ( -680 1672 -24 ) subway/3_door4 0 16 0 1 1 0 16777216 0 +( -720 1608 -64 ) ( -680 1608 -64 ) ( -680 1608 -96 ) subway/3_door4 0 16 0 1 1 0 16777216 0 +( -704 1600 -64 ) ( -704 1672 -64 ) ( -704 1672 -96 ) subway/3_door4 -8 16 0 1 1 0 16777216 0 +( -680 1672 -64 ) ( -720 1672 -64 ) ( -720 1672 -96 ) subway/3_door4 0 16 0 1 1 0 16777216 0 +( -708 1672 -64 ) ( -708 1600 -64 ) ( -708 1600 -96 ) subway/3_door4 -8 16 0 1 1 0 16777216 0 +} +// brush 567 +{ +( -2464 144 320 ) ( -2528 144 320 ) ( -2528 80 320 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -2528 72 344 ) ( -2528 136 344 ) ( -2464 136 344 ) subway/1_black 8 15 90 2 2 0 16777216 0 +( -2496 -440 160 ) ( -2432 -440 160 ) ( -2432 -440 152 ) subway/3_grocery1 0 32 0 0.500000 0.500000 0 335544320 0 +( -2528 24 232 ) ( -2528 88 232 ) ( -2528 88 224 ) subway/newpipe1 32 16 0 0.500000 0.500000 0 16777216 0 +( -2440 760 160 ) ( -2504 760 160 ) ( -2504 760 152 ) subway/3_grocery1 0 32 0 0.500000 0.500000 0 335544320 0 +( -2680 120 160 ) ( -2680 56 160 ) ( -2680 56 152 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +( -2536 -440 320 ) ( -2528 -440 328 ) ( -2532 760 324 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +} +// brush 568 +{ +( -1936 496 -48 ) ( -2032 496 -48 ) ( -2032 344 -48 ) subway/s_sidewalk 64 64 0 1 1 0 285212672 0 +( -2032 344 32 ) ( -2032 496 32 ) ( -1936 496 32 ) subway/s_sidewalk 64 64 0 1 1 0 285212672 0 +( -2007 252 32 ) ( -2007 252 -48 ) ( -2141 386 -48 ) subway/s_sidewalk 64 -8 0 1 1 0 285212672 0 +( -2007 252 -48 ) ( -2007 252 32 ) ( -1848 411 32 ) subway/s_sidewalk 64 -8 0 1 1 0 285212672 0 +( -1982 545 32 ) ( -1982 545 -48 ) ( -1848 411 -48 ) subway/s_sidewalk 64 -8 0 1 1 0 285212672 0 +( -1982 545 -48 ) ( -1982 545 32 ) ( -2141 386 32 ) subway/s_sidewalk 64 -8 0 1 1 0 285212672 0 +} +// brush 569 +{ +( -56 -1216 -160 ) ( -16 -1216 -160 ) ( -16 -1216 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 144 -1224 -160 ) ( 144 -1192 -160 ) ( 144 -1192 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 144 -1176 -192 ) ( -8 -1176 -192 ) ( -8 -1176 -216 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 104 -1176 -240 ) ( 56 -1176 -240 ) ( 56 -1216 -240 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 96 -1176 -192 ) ( 96 -1216 -192 ) ( 96 -1176 -248 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -24 -1216 -184 ) ( -64 -1216 -184 ) ( -44 -1176 -184 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 570 +{ +( -56 -1216 -160 ) ( -16 -1216 -160 ) ( -16 -1216 -200 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( 144 -1224 -160 ) ( 144 -1192 -160 ) ( 144 -1192 -200 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( 144 -1176 -192 ) ( -8 -1176 -192 ) ( -8 -1176 -216 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( 56 -1216 -168 ) ( 56 -1176 -168 ) ( 104 -1176 -168 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( 96 -1176 -192 ) ( 96 -1216 -192 ) ( 96 -1176 -248 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( -64 -1216 -184 ) ( -24 -1216 -184 ) ( -44 -1176 -184 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 571 +{ +( -64 -1184 -160 ) ( -64 -1216 -160 ) ( -64 -1216 -200 ) subway/1_tile_big_green -16 0 0 0.500000 0.500000 0 369098752 0 +( -48 -1208 -160 ) ( -8 -1208 -160 ) ( -8 -1208 -200 ) subway/1_tile_big_green -16 0 0 0.500000 0.500000 0 369098752 0 +( 152 -1176 -192 ) ( 0 -1176 -192 ) ( 0 -1176 -216 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 112 -1168 -240 ) ( 64 -1168 -240 ) ( 64 -1208 -240 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -48 -1208 -192 ) ( -48 -1168 -192 ) ( -48 -1208 -248 ) subway/1_tile 0 -16 0 0.500000 0.500000 0 318767104 0 +( -24 -1208 -184 ) ( -64 -1208 -184 ) ( -44 -1176 -184 ) subway/1_tile 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 572 +{ +( -64 -1184 -160 ) ( -64 -1216 -160 ) ( -64 -1216 -200 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( -48 -1208 -160 ) ( -8 -1208 -160 ) ( -8 -1208 -200 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( 152 -1176 -192 ) ( 0 -1176 -192 ) ( 0 -1176 -216 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( 64 -1208 -168 ) ( 64 -1168 -168 ) ( 112 -1168 -168 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( -48 -1208 -192 ) ( -48 -1168 -192 ) ( -48 -1208 -248 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( -64 -1208 -184 ) ( -24 -1208 -184 ) ( -44 -1176 -184 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 573 +{ +( 16 -1208 -196 ) ( 16 -1192 -196 ) ( 16 -1192 -180 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 32 -1192 -180 ) ( 32 -1192 -196 ) ( 32 -1208 -196 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 32 -1192 -196 ) ( 0 -1192 -196 ) ( 0 -1208 -196 ) subway/light_yellow 0 -16 0 0.500000 0.500000 134217728 16777217 12000 +( 32 -1208 -196 ) ( 0 -1208 -196 ) ( 0 -1208 -180 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 0 -1192 -196 ) ( 32 -1192 -196 ) ( 32 -1208 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 574 +{ +( -1528 584 336 ) ( -1712 584 336 ) ( -1712 576 336 ) subway/3_market1 32 48 0 0.500000 0.500000 0 385875968 0 +( -1712 576 384 ) ( -1712 584 384 ) ( -1528 584 384 ) subway/3_market1 32 48 0 0.500000 0.500000 0 385875968 0 +( -1712 576 384 ) ( -1528 576 384 ) ( -1528 576 336 ) subway/3_market1 32 48 0 0.500000 0.500000 0 385875968 0 +( -1528 576 384 ) ( -1528 584 384 ) ( -1528 584 336 ) subway/3_market1 32 48 0 0.500000 0.500000 0 385875968 0 +( -1528 584 384 ) ( -1712 584 384 ) ( -1712 584 336 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1712 584 384 ) ( -1712 576 384 ) ( -1712 576 336 ) subway/3_market1 32 48 0 0.500000 0.500000 0 385875968 0 +} +// brush 575 +{ +( -1408 -304 288 ) ( -1344 -304 288 ) ( -1344 -368 288 ) subway/s_asphalt 0 0 0 0.500000 0.500000 0 301989888 0 +( -1900 -712 176 ) ( -1836 -712 176 ) ( -1836 -712 168 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( -1352 -440 176 ) ( -1416 -440 176 ) ( -1416 -440 168 ) subway/metalrib1 0 0 90 0.500000 0.500000 134217728 16777216 0 +( -1792 -432 224 ) ( -1792 -400 224 ) ( -1792 -432 216 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( -2104 -440 280 ) ( -2136 -440 280 ) ( -2120 -456 280 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +( -2176 -456 280 ) ( -2176 -440 280 ) ( -2176 -448 288 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 576 +{ +( -1408 -304 288 ) ( -1344 -304 288 ) ( -1344 -368 288 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2680 -308 176 ) ( -2680 -372 176 ) ( -2680 -372 168 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( -1900 -712 176 ) ( -1836 -712 176 ) ( -1836 -712 168 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( -1352 -440 176 ) ( -1416 -440 176 ) ( -1416 -440 168 ) subway/metalrib1 0 0 90 0.500000 0.500000 134217728 16777216 0 +( -2104 -440 280 ) ( -2136 -440 280 ) ( -2120 -456 280 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +( -2176 -440 280 ) ( -2176 -456 280 ) ( -2176 -448 288 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 577 +{ +( -1536 -320 352 ) ( -1536 -256 352 ) ( -1536 -256 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1536 -112 352 ) ( -1600 -112 352 ) ( -1600 -112 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1600 -256 352 ) ( -1600 -320 352 ) ( -1600 -320 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1584 -336 448 ) ( -1600 -336 448 ) ( -1600 -384 448 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1600 -384 512 ) ( -1600 -336 512 ) ( -1584 -336 512 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1600 -160 512 ) ( -1584 -160 512 ) ( -1600 -160 448 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +} +// brush 578 +{ +( -1536 -320 352 ) ( -1536 -256 352 ) ( -1536 -256 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1600 -256 352 ) ( -1600 -320 352 ) ( -1600 -320 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1584 -336 448 ) ( -1600 -336 448 ) ( -1600 -384 448 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1600 -384 512 ) ( -1600 -336 512 ) ( -1584 -336 512 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1600 -320 512 ) ( -1584 -320 512 ) ( -1600 -320 448 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1584 -224 512 ) ( -1600 -224 512 ) ( -1584 -224 448 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +} +// brush 579 +{ +( -1584 -176 448 ) ( -1600 -176 448 ) ( -1600 -224 448 ) subway/h_cretewall_plain 0 32 0 1 1 0 285212672 0 +( -1600 -224 512 ) ( -1600 -176 512 ) ( -1584 -176 512 ) subway/h_cretewall_plain 0 32 0 1 1 0 285212672 0 +( -1600 -224 512 ) ( -1584 -224 512 ) ( -1584 -224 448 ) subway/h_cretewall_plain 0 0 0 1 1 0 285212672 0 +( -1536 -208 512 ) ( -1536 -160 512 ) ( -1536 -160 448 ) subway/h_cretewall_plain -32 0 0 1 1 0 285212672 0 +( -1584 -160 512 ) ( -1600 -160 512 ) ( -1600 -160 448 ) subway/h_cretewall_plain 0 0 0 1 1 0 285212672 0 +( -1600 -176 512 ) ( -1600 -224 512 ) ( -1600 -224 448 ) subway/3_redbrick_window_ad1 -32 0 0 1 1 0 620756992 0 +} +// brush 580 +{ +( -1600 -440 352 ) ( -1536 -440 352 ) ( -1536 -440 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1536 -320 352 ) ( -1536 -256 352 ) ( -1536 -256 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1600 -256 352 ) ( -1600 -320 352 ) ( -1600 -320 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1584 -336 448 ) ( -1600 -336 448 ) ( -1600 -384 448 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1600 -384 512 ) ( -1600 -336 512 ) ( -1584 -336 512 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1584 -384 512 ) ( -1600 -384 512 ) ( -1584 -384 448 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +} +// brush 581 +{ +( -1600 -440 352 ) ( -1536 -440 352 ) ( -1536 -440 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1536 -320 352 ) ( -1536 -256 352 ) ( -1536 -256 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1536 -112 352 ) ( -1600 -112 352 ) ( -1600 -112 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1600 -256 352 ) ( -1600 -320 352 ) ( -1600 -320 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1520 -440 568 ) ( -1608 -440 568 ) ( -1564 -256 568 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1600 -336 512 ) ( -1600 -384 512 ) ( -1584 -336 512 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +} +// brush 582 +{ +( -1536 -256 320 ) ( -1600 -256 320 ) ( -1600 -320 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1600 -440 352 ) ( -1536 -440 352 ) ( -1536 -440 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1536 -320 352 ) ( -1536 -256 352 ) ( -1536 -256 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1536 -112 352 ) ( -1600 -112 352 ) ( -1600 -112 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1600 -256 352 ) ( -1600 -320 352 ) ( -1600 -320 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1600 -336 448 ) ( -1584 -336 448 ) ( -1600 -384 448 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +} +// brush 583 +{ +( -1584 -336 448 ) ( -1600 -336 448 ) ( -1600 -384 448 ) subway/h_cretewall_plain 0 0 0 1 1 0 285212672 0 +( -1600 -384 512 ) ( -1600 -336 512 ) ( -1584 -336 512 ) subway/h_cretewall_plain 0 0 0 1 1 0 285212672 0 +( -1600 -384 512 ) ( -1584 -384 512 ) ( -1584 -384 448 ) subway/h_cretewall_plain 0 0 0 1 1 0 285212672 0 +( -1536 -368 512 ) ( -1536 -320 512 ) ( -1536 -320 448 ) subway/h_cretewall_plain 0 0 0 1 1 0 285212672 0 +( -1584 -320 512 ) ( -1600 -320 512 ) ( -1600 -320 448 ) subway/h_cretewall_plain 0 0 0 1 1 0 285212672 0 +( -1600 -336 512 ) ( -1600 -384 512 ) ( -1600 -384 448 ) subway/3_redbrick_window_ad1 64 0 0 1 1 0 620756992 0 +} +// brush 584 +{ +( -1536 -256 288 ) ( -1600 -256 288 ) ( -1600 -320 288 ) subway/3_redbrick_bottom1 -40 32 0 1 1 0 0 0 +( -1600 -320 320 ) ( -1600 -256 320 ) ( -1536 -256 320 ) subway/3_redbrick_bottom1 -40 32 0 1 1 0 0 0 +( -1600 -440 320 ) ( -1536 -440 320 ) ( -1536 -440 288 ) subway/3_redbrick_bottom1 -40 -32 0 1 1 0 0 0 +( -1536 -320 320 ) ( -1536 -256 320 ) ( -1536 -256 288 ) subway/3_redbrick_bottom1 -40 -32 0 1 1 0 0 0 +( -1536 -112 320 ) ( -1600 -112 320 ) ( -1600 -112 288 ) subway/3_redbrick_bottom1 -32 -32 0 1 1 0 0 0 +( -1600 -256 320 ) ( -1600 -320 320 ) ( -1600 -320 288 ) subway/3_redbrick_bottom1 -40 -32 0 1 1 0 0 0 +} +// brush 585 +{ +( -1600 -320 576 ) ( -1600 -256 576 ) ( -1536 -256 576 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1600 -440 352 ) ( -1536 -440 352 ) ( -1536 -440 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1536 -320 352 ) ( -1536 -256 352 ) ( -1536 -256 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1536 -112 352 ) ( -1600 -112 352 ) ( -1600 -112 320 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1600 -256 352 ) ( -1600 -320 352 ) ( -1600 -320 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1608 -440 568 ) ( -1520 -440 568 ) ( -1564 -256 568 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +} +// brush 586 +{ +( -1648 192 288 ) ( -1584 192 288 ) ( -1584 256 288 ) subway/sky2 0 -32 0 0.500000 0.500000 0 5 900 +( -1584 248 632 ) ( -1584 184 632 ) ( -1648 184 632 ) subway/sky2 0 -32 0 0.500000 0.500000 0 5 900 +( -1560 592 264 ) ( -1624 592 264 ) ( -1624 592 256 ) subway/sky2 0 32 0 0.500000 0.500000 0 5 900 +( -1536 -16 400 ) ( -1536 -80 400 ) ( -1536 -80 392 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 15 +( -1528 -568 264 ) ( -1528 -504 264 ) ( -1528 -504 256 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 900 +( -1576 -112 288 ) ( -1600 -112 288 ) ( -1588 -112 632 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 900 +} +// brush 587 +{ +( -1648 192 288 ) ( -1584 192 288 ) ( -1584 256 288 ) subway/sky2 0 -32 0 0.500000 0.500000 0 5 900 +( -1584 248 632 ) ( -1584 184 632 ) ( -1648 184 632 ) subway/sky2 0 -32 0 0.500000 0.500000 0 5 900 +( -1536 -16 400 ) ( -1536 -80 400 ) ( -1536 -80 392 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 15 +( -1664 -792 264 ) ( -1600 -792 264 ) ( -1600 -792 256 ) subway/sky2 0 32 0 0.500000 0.500000 0 5 900 +( -1528 -568 264 ) ( -1528 -504 264 ) ( -1528 -504 256 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 900 +( -1600 -112 288 ) ( -1576 -112 288 ) ( -1588 -112 632 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 900 +} +// brush 588 +{ +( -1920 -576 576 ) ( -1920 -512 576 ) ( -1856 -512 576 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1920 -696 352 ) ( -1856 -696 352 ) ( -1856 -696 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1856 -576 352 ) ( -1856 -512 352 ) ( -1856 -512 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1856 -512 352 ) ( -1920 -512 352 ) ( -1920 -512 320 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1920 -512 352 ) ( -1920 -576 352 ) ( -1920 -576 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1928 -696 568 ) ( -1840 -696 568 ) ( -1884 -512 568 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +} +// brush 589 +{ +( -1856 -512 320 ) ( -1920 -512 320 ) ( -1920 -576 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1920 -696 352 ) ( -1856 -696 352 ) ( -1856 -696 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1856 -576 352 ) ( -1856 -512 352 ) ( -1856 -512 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1856 -512 352 ) ( -1920 -512 352 ) ( -1920 -512 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1920 -512 352 ) ( -1920 -576 352 ) ( -1920 -576 320 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1840 -696 568 ) ( -1928 -696 568 ) ( -1884 -512 568 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +} +// brush 590 +{ +( -1856 -512 288 ) ( -1920 -512 288 ) ( -1920 -576 288 ) subway/3_redbrick_bottom1 24 -32 0 1 1 0 0 0 +( -1920 -576 320 ) ( -1920 -512 320 ) ( -1856 -512 320 ) subway/3_redbrick_bottom1 24 -32 0 1 1 0 0 0 +( -1920 -696 320 ) ( -1856 -696 320 ) ( -1856 -696 288 ) subway/3_redbrick_bottom1 24 -32 0 1 1 0 0 0 +( -1856 -576 320 ) ( -1856 -512 320 ) ( -1856 -512 288 ) subway/3_redbrick_bottom1 24 -32 0 1 1 0 0 0 +( -1856 -512 320 ) ( -1920 -512 320 ) ( -1920 -512 288 ) subway/3_redbrick_bottom1 96 -32 0 1 1 0 0 0 +( -1920 -512 320 ) ( -1920 -576 320 ) ( -1920 -576 288 ) subway/3_redbrick_bottom1 24 -32 0 1 1 0 0 0 +} +// brush 591 +{ +( 1424 1304 -216 ) ( 1296 1304 -216 ) ( 1296 1288 -216 ) subway/skip -40 8 0 1 1 0 656 0 +( 1296 1288 -104 ) ( 1296 1304 -104 ) ( 1424 1304 -104 ) subway/skip -40 8 0 1 1 0 656 0 +( 1288 1232 -88 ) ( 1416 1232 -88 ) ( 1416 1232 -96 ) subway/skip -40 0 0 1 1 0 656 0 +( 1360 1288 -88 ) ( 1360 1304 -88 ) ( 1360 1304 -96 ) subway/skip -8 0 0 1 1 0 656 0 +( 1416 1296 -88 ) ( 1288 1296 -88 ) ( 1288 1296 -96 ) subway/hint -40 0 0 1 1 0 400 0 +( 1296 1304 -88 ) ( 1296 1288 -88 ) ( 1296 1288 -96 ) subway/skip -8 0 0 1 1 0 656 0 +} +// brush 592 +{ +( 1064 976 -216 ) ( 936 976 -216 ) ( 936 960 -216 ) subway/skip 0 0 0 1 1 0 656 0 +( 936 960 -88 ) ( 936 976 -88 ) ( 1064 976 -88 ) subway/skip 0 0 0 1 1 0 656 0 +( 936 896 -88 ) ( 1064 896 -88 ) ( 1064 896 -96 ) subway/skip 0 0 0 1 1 0 656 0 +( 1064 960 -88 ) ( 1064 976 -88 ) ( 1064 976 -96 ) subway/skip 0 0 0 1 1 0 656 0 +( 1056 1016 -88 ) ( 928 1016 -88 ) ( 928 1016 -96 ) subway/hint 0 0 0 1 1 0 400 0 +( 936 976 -88 ) ( 936 960 -88 ) ( 936 960 -96 ) subway/skip 0 0 0 1 1 0 656 0 +} +// brush 593 +{ +( -2736 52 408 ) ( -2744 52 408 ) ( -2744 44 408 ) subway/1_black -12 7 90 2 2 0 16777216 0 +( -2744 44 416 ) ( -2744 52 416 ) ( -2736 52 416 ) subway/1_black -12 7 90 2 2 0 16777216 0 +( -2744 44 416 ) ( -2736 44 416 ) ( -2736 44 408 ) subway/1_black 5 7 90 2 2 0 16777216 0 +( -2736 44 416 ) ( -2736 52 416 ) ( -2736 52 408 ) subway/1_black 5 -5 90 2 2 0 16777216 0 +( -2736 52 416 ) ( -2744 52 416 ) ( -2744 52 408 ) subway/1_black 5 7 90 2 2 0 16777216 0 +( -2744 52 416 ) ( -2744 44 416 ) ( -2744 44 408 ) subway/1_black 5 -5 90 2 2 0 16777216 0 +} +// brush 594 +{ +( -2720 52 404 ) ( -2728 52 404 ) ( -2728 44 404 ) subway/1_black -12 -1 90 2 2 0 16777216 0 +( -2728 44 412 ) ( -2728 52 412 ) ( -2720 52 412 ) subway/1_black -12 -1 90 2 2 0 16777216 0 +( -2728 44 412 ) ( -2720 44 412 ) ( -2720 44 404 ) subway/1_black 7 -1 90 2 2 0 16777216 0 +( -2720 44 412 ) ( -2720 52 412 ) ( -2720 52 404 ) subway/1_black 8 -5 90 2 2 0 16777216 0 +( -2720 52 412 ) ( -2728 52 412 ) ( -2728 52 404 ) subway/1_black 7 -1 90 2 2 0 16777216 0 +( -2728 52 412 ) ( -2728 44 412 ) ( -2728 44 404 ) subway/1_black 8 -5 90 2 2 0 16777216 0 +} +// brush 595 +{ +( 1802 -1402 -528 ) ( 1714 -1441 -528 ) ( 1717 -1448 -528 ) subway/metal2 -19 -4 23 0.500125 0.500013 0 16777216 0 +( 1717 -1448 -520 ) ( 1714 -1441 -520 ) ( 1802 -1402 -520 ) subway/metal2 -19 -4 23 0.500125 0.500013 0 16777216 0 +( 1717 -1448 -520 ) ( 1805 -1409 -520 ) ( 1805 -1409 -528 ) subway/metal2 25 32 0 0.456665 0.500000 0 16777216 0 +( 1790 -1415 -520 ) ( 1787 -1408 -520 ) ( 1787 -1408 -528 ) subway/metal2 -28 32 0 0.456787 0.500000 0 16777216 0 +( 1802 -1402 -520 ) ( 1714 -1441 -520 ) ( 1714 -1441 -528 ) subway/metal2 32 32 0 0.456787 0.500000 0 16777216 0 +( 1714 -1441 -520 ) ( 1717 -1448 -520 ) ( 1717 -1448 -528 ) subway/metal2 -21 32 0 0.456787 0.500000 0 16777216 0 +} +// brush 596 +{ +( -2208 768 160 ) ( -2208 768 152 ) ( -2076 768 152 ) subway/con2 -32 29 -180 0.500000 -0.500000 0 285212672 0 +( -2208 440 160 ) ( -2208 440 152 ) ( -2208 568 152 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -1752 720 160 ) ( -1688 720 160 ) ( -1688 656 160 ) subway/s_sidewalk 24 104 0 1 1 0 285212672 0 +( -2072 408 152 ) ( -2072 864 152 ) ( -2144 792 152 ) subway/1_concrete_floor 14 -31 -90 0.500000 0.500000 0 285212672 0 +( -2200 424 152 ) ( -2200 424 160 ) ( -2072 424 160 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2072 424 144 ) ( -2072 424 164 ) ( -2072 768 154 ) subway/s_curb 0 111 -90 0.500000 -0.500000 0 285212672 8001 +} +// brush 597 +{ +( -2200 200 160 ) ( -2200 200 152 ) ( -2068 200 152 ) subway/con2 32 29 -180 0.500000 -0.500000 0 285212672 0 +( -2200 72 160 ) ( -2200 72 152 ) ( -2200 200 152 ) subway/con2 16 31 -180 0.500000 -0.500000 0 285212672 0 +( -1752 368 160 ) ( -1688 368 160 ) ( -1688 304 160 ) subway/s_sidewalk 24 72 0 1 1 0 285212672 0 +( -2072 56 152 ) ( -2072 512 152 ) ( -2144 440 152 ) subway/1_concrete_floor 78 -31 -90 0.500000 0.500000 0 285212672 0 +( -2172 136 152 ) ( -2204 136 152 ) ( -2188 136 160 ) subway/s_curb 0 16 -90 0.500000 -0.500000 0 285212672 0 +( -2072 136 140 ) ( -2072 136 164 ) ( -2072 200 152 ) subway/s_curb 0 47 -90 0.500000 -0.500000 0 285212672 8001 +} +// brush 598 +{ +( -2200 424 160 ) ( -2200 424 152 ) ( -2068 424 152 ) subway/con2 32 29 -180 0.500000 -0.500000 0 285212672 0 +( -2104 208 160 ) ( -2104 208 152 ) ( -2104 336 152 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( -1752 496 160 ) ( -1688 496 160 ) ( -1688 432 160 ) subway/s_sidewalk 24 72 0 1 1 0 285212672 0 +( -2072 184 152 ) ( -2072 640 152 ) ( -2144 568 152 ) subway/1_concrete_floor 78 -31 -90 0.500000 0.500000 0 285212672 0 +( -2200 200 152 ) ( -2200 200 160 ) ( -2072 200 160 ) subway/s_curb 0 16 -90 0.500000 -0.500000 0 285212672 8001 +( -2072 200 140 ) ( -2072 200 164 ) ( -2072 424 152 ) subway/s_curb 0 47 -90 0.500000 -0.500000 0 285212672 8001 +} +// brush 599 +{ +( -2144 -56 160 ) ( -2144 -56 152 ) ( -2064 -56 152 ) subway/s_curb 16 16 270 0.500000 0.500000 0 285212672 8000 +( -2136 16 152 ) ( -2136 16 160 ) ( -2136 -440 160 ) subway/con2 16 32 0 0.500000 0.500000 0 285212672 0 +( -1752 -440 152 ) ( -1752 -440 160 ) ( -1688 -440 160 ) subway/1_concrete_floor -96 31 -180 0.500000 -0.500000 0 285212672 0 +( -1752 -128 160 ) ( -1688 -128 160 ) ( -1688 -192 160 ) subway/s_sidewalk 95 56 -180 1 1 0 285212672 8000 +( -2072 -440 152 ) ( -2072 16 152 ) ( -2144 -56 152 ) subway/1_concrete_floor 16 96 90 0.500000 0.500000 0 285212672 0 +( -2072 -440 144 ) ( -2072 -440 164 ) ( -2072 -56 154 ) subway/s_curb 0 79 270 0.500000 0.500000 0 285212672 8000 +} +// brush 600 +{ +( -1864 768 152 ) ( -1864 768 160 ) ( -1936 768 160 ) subway/con2 0 32 0 0.500000 0.500000 0 285212672 0 +( -1568 24 160 ) ( -1568 24 152 ) ( -1568 -424 152 ) subway/con2 -48 32 0 0.500000 0.500000 0 285212672 0 +( -2296 -440 160 ) ( -2232 -440 160 ) ( -2232 -440 152 ) subway/1_concrete_floor 0 31 -180 0.500000 -0.500000 0 285212672 0 +( -2296 -192 160 ) ( -2296 -128 160 ) ( -2232 -128 160 ) subway/s_sidewalk 135 55 -180 1 1 0 285212672 8000 +( -1840 -56 152 ) ( -1912 16 152 ) ( -1912 -440 152 ) subway/1_concrete_floor 16 0 90 0.500000 0.500000 0 285212672 0 +( -1912 -440 164 ) ( -1912 -440 148 ) ( -1912 768 156 ) subway/s_curb 0 47 -90 0.500000 -0.500000 0 285212672 0 +} +// brush 601 +{ +( -2208 144 160 ) ( -2208 144 192 ) ( -2520 144 192 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2208 144 192 ) ( -2208 144 160 ) ( -2200 136 160 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2040 136 144 ) ( -1976 136 144 ) ( -1976 136 136 ) subway/s_curb 16 16 270 0.500000 0.500000 0 285212672 8000 +( -2520 112 232 ) ( -2520 48 232 ) ( -2520 48 224 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2304 80 152 ) ( -2304 144 152 ) ( -2368 144 152 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2504 136 160 ) ( -2520 136 160 ) ( -2512 144 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 602 +{ +( -2208 144 160 ) ( -2208 144 192 ) ( -2520 144 192 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2208 144 192 ) ( -2208 144 160 ) ( -2200 136 160 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2040 136 144 ) ( -1976 136 144 ) ( -1976 136 136 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2520 112 232 ) ( -2520 48 232 ) ( -2520 48 224 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2464 144 192 ) ( -2400 144 192 ) ( -2400 80 192 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2520 136 160 ) ( -2504 136 160 ) ( -2512 144 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 603 +{ +( -2528 128 64 ) ( -2528 64 64 ) ( -2528 64 56 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2464 144 64 ) ( -2528 144 64 ) ( -2528 144 56 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2520 16 136 ) ( -2520 80 136 ) ( -2520 80 128 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2496 -256 64 ) ( -2432 -256 64 ) ( -2432 -256 56 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2528 80 192 ) ( -2528 144 192 ) ( -2464 144 192 ) subway/3_grocery2_bottom 0 -32 0 0.500000 0.500000 0 352321536 0 +( -2528 -4 160 ) ( -2528 -24 160 ) ( -2520 -14 160 ) subway/3_grocery2_bottom 0 -32 0 0.500000 0.500000 0 352321536 0 +} +// brush 604 +{ +( -2528 128 64 ) ( -2528 64 64 ) ( -2528 64 56 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2464 144 64 ) ( -2528 144 64 ) ( -2528 144 56 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2520 16 136 ) ( -2520 80 136 ) ( -2520 80 128 ) subway/s_curb 16 16 270 0.500000 0.500000 0 285212672 8000 +( -2496 -256 64 ) ( -2432 -256 64 ) ( -2432 -256 56 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2464 144 152 ) ( -2528 144 152 ) ( -2528 80 152 ) subway/3_grocery2_bottom 0 -32 0 0.500000 0.500000 0 352321536 0 +( -2528 -24 160 ) ( -2528 -4 160 ) ( -2520 -14 160 ) subway/3_grocery2_bottom 0 -32 0 0.500000 0.500000 0 352321536 0 +} +// brush 605 +{ +( -2136 -56 136 ) ( -2200 -56 136 ) ( -2200 -56 128 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2208 32 168 ) ( -2208 96 168 ) ( -2208 96 160 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2176 -64 168 ) ( -2112 -64 168 ) ( -2112 -64 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2520 56 168 ) ( -2520 -8 168 ) ( -2520 -8 160 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2200 88 192 ) ( -2136 88 192 ) ( -2136 24 192 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2520 -48 160 ) ( -2520 -68 160 ) ( -2208 -58 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 606 +{ +( -2136 -56 136 ) ( -2200 -56 136 ) ( -2200 -56 128 ) subway/s_curb 16 16 270 0.500000 0.500000 0 285212672 8000 +( -2208 32 168 ) ( -2208 96 168 ) ( -2208 96 160 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2176 -64 168 ) ( -2112 -64 168 ) ( -2112 -64 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2520 56 168 ) ( -2520 -8 168 ) ( -2520 -8 160 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2136 24 152 ) ( -2136 88 152 ) ( -2200 88 152 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2520 -68 160 ) ( -2520 -48 160 ) ( -2208 -58 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 607 +{ +( -2152 -112 164 ) ( -2204 -112 164 ) ( -2204 -64 164 ) subway/3_street 32 -16 0 0.500000 0.500000 0 285212672 0 +( -2152 -56 144 ) ( -2152 -56 176 ) ( -2204 -56 176 ) subway/stair_side 16 -16 0 0.250000 0.250000 0 285212672 0 +( -2136 -112 152 ) ( -2136 -112 184 ) ( -2136 -64 184 ) subway/stair_side 16 -16 0 0.250000 0.250000 0 285212672 0 +( -2200 -128 152 ) ( -2200 -128 184 ) ( -2148 -128 184 ) subway/3_street 32 16 0 0.500000 0.500000 0 285212672 0 +( -2208 -64 152 ) ( -2208 -64 184 ) ( -2208 -112 184 ) subway/3_market_window1 0 48 0 0.500000 0.500000 0 620756992 0 +( -2148 -128 160 ) ( -2136 -128 160 ) ( -2142 -56 160 ) subway/3_market_window1 0 48 0 0.500000 0.500000 0 620756992 0 +} +// brush 608 +{ +( -2196 -64 152 ) ( -2196 -112 152 ) ( -2144 -112 152 ) subway/3_market_window1 16 0 0 0.500000 0.500000 0 620756992 0 +( -2152 -56 144 ) ( -2152 -56 176 ) ( -2204 -56 176 ) subway/s_curb 16 16 270 0.500000 0.500000 0 285212672 8000 +( -2136 -112 152 ) ( -2136 -112 184 ) ( -2136 -64 184 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( -2200 -128 152 ) ( -2200 -128 184 ) ( -2148 -128 184 ) subway/3_street 32 16 0 0.500000 0.500000 0 285212672 0 +( -2208 -64 152 ) ( -2208 -64 184 ) ( -2208 -112 184 ) subway/3_market_window1 0 48 0 0.500000 0.500000 0 620756992 0 +( -2136 -128 160 ) ( -2148 -128 160 ) ( -2142 -56 160 ) subway/3_market_window1 0 48 0 0.500000 0.500000 0 620756992 0 +} +// brush 609 +{ +( -2096 264 48 ) ( -2104 272 48 ) ( -2104 -88 48 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 0 +( -2096 200 152 ) ( -2096 264 152 ) ( -2032 264 152 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 0 +( -2096 128 136 ) ( -2096 128 0 ) ( -2096 -224 0 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -2088 152 16 ) ( -2088 152 0 ) ( -2080 152 0 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 0 +( -2104 184 48 ) ( -2104 184 64 ) ( -2104 -168 64 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -2080 136 48 ) ( -2112 136 48 ) ( -2096 136 152 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 610 +{ +( -2096 264 48 ) ( -2104 272 48 ) ( -2104 -88 48 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 0 +( -2096 200 128 ) ( -2096 264 128 ) ( -2032 264 128 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 0 +( -2016 -64 40 ) ( -1952 -64 40 ) ( -1952 -64 32 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 0 +( -2096 128 136 ) ( -2096 128 0 ) ( -2096 -224 0 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -2104 184 48 ) ( -2104 184 64 ) ( -2104 -168 64 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -2112 136 48 ) ( -2080 136 48 ) ( -2096 136 152 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 611 +{ +( -1848 264 168 ) ( -1848 264 160 ) ( -1856 272 160 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +( -1816 272 168 ) ( -1848 272 168 ) ( -1848 272 160 ) subway/con2 0 32 0 0.500000 0.500000 134217728 285212672 0 +( -1816 264 168 ) ( -1816 392 168 ) ( -1816 392 160 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 264 160 ) ( -1848 264 168 ) ( -1816 264 168 ) subway/con2 0 32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 264 164 ) ( -1848 392 164 ) ( -1816 392 164 ) subway/con2 0 -32 0 0.500000 0.500000 134217728 285212672 0 +( -1816 392 160 ) ( -1848 392 160 ) ( -1848 264 160 ) subway/con2 0 -32 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 612 +{ +( -1728 267 176 ) ( -1856 267 176 ) ( -1856 267 168 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +( -1816 232 176 ) ( -1816 264 176 ) ( -1816 264 168 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1848 265 164 ) ( -1848 265 184 ) ( -1816 265 184 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +( -1848 264 184 ) ( -1848 264 164 ) ( -1852 268 164 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1856 272 184 ) ( -1728 272 184 ) ( -1728 240 184 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -1728 244 164 ) ( -1728 276 164 ) ( -1856 276 164 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 613 +{ +( -1816 264 184 ) ( -1852 264 184 ) ( -1852 264 188 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1816 268 172 ) ( -1816 268 180 ) ( -1816 300 180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -1724 268 172 ) ( -1724 268 180 ) ( -1852 268 180 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1856 272 188 ) ( -1848 264 188 ) ( -1848 264 184 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -1724 292 188 ) ( -1724 260 188 ) ( -1852 260 188 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1852 260 184 ) ( -1724 260 184 ) ( -1724 292 184 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 614 +{ +( -1848 268 188 ) ( -1848 268 184 ) ( -1848 232 184 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1856 136 184 ) ( -1856 136 188 ) ( -1848 144 188 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -1852 136 188 ) ( -1852 136 184 ) ( -1852 272 184 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1848 264 184 ) ( -1848 264 188 ) ( -1856 272 188 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -1844 268 188 ) ( -1844 140 188 ) ( -1876 140 188 ) subway/1_concrete_floor 7 0 90 0.500000 0.500000 134217728 16777216 0 +( -1876 140 184 ) ( -1844 140 184 ) ( -1844 268 184 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 615 +{ +( -1824 264 164 ) ( -1856 264 164 ) ( -1856 136 164 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -1856 136 184 ) ( -1856 264 184 ) ( -1824 264 184 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -1848 144 184 ) ( -1848 144 164 ) ( -1852 140 164 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1849 144 164 ) ( -1849 144 184 ) ( -1849 264 184 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1849 265 164 ) ( -1849 265 184 ) ( -1853 269 184 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1851 264 176 ) ( -1851 136 176 ) ( -1851 136 168 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 616 +{ +( -1856 264 168 ) ( -1856 136 168 ) ( -1856 136 160 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 264 160 ) ( -1848 264 168 ) ( -1856 272 168 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 264 164 ) ( -1848 264 156 ) ( -1848 144 156 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 144 168 ) ( -1848 144 160 ) ( -1856 136 160 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +( -1856 136 164 ) ( -1856 264 164 ) ( -1824 264 164 ) subway/con2 0 -32 0 0.500000 0.500000 134217728 285212672 0 +( -1824 264 160 ) ( -1856 264 160 ) ( -1856 136 160 ) subway/con2 0 -32 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 617 +{ +( -1724 116 184 ) ( -1724 148 184 ) ( -1852 148 184 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -1852 148 188 ) ( -1724 148 188 ) ( -1724 116 188 ) subway/1_concrete_floor 8 0 0 0.500000 -0.500000 134217728 16777216 0 +( -1848 144 184 ) ( -1848 144 188 ) ( -1856 136 188 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -1852 140 180 ) ( -1724 140 180 ) ( -1724 140 172 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1812 108 180 ) ( -1812 140 180 ) ( -1812 140 172 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -1848 144 188 ) ( -1848 144 184 ) ( -1812 144 184 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 618 +{ +( -1724 116 164 ) ( -1724 148 164 ) ( -1852 148 164 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -1852 148 184 ) ( -1724 148 184 ) ( -1724 116 184 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -1852 140 184 ) ( -1852 140 164 ) ( -1848 144 164 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1852 141 164 ) ( -1852 141 184 ) ( -1812 141 184 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +( -1812 108 176 ) ( -1812 140 176 ) ( -1812 140 168 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1724 143 176 ) ( -1852 143 176 ) ( -1852 143 168 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 619 +{ +( -1816 264 160 ) ( -1848 264 160 ) ( -1848 136 160 ) subway/con2 0 -32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 136 164 ) ( -1848 264 164 ) ( -1816 264 164 ) subway/con2 0 -32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 136 168 ) ( -1816 136 168 ) ( -1816 136 160 ) subway/con2 0 32 0 0.500000 0.500000 134217728 285212672 0 +( -1816 136 168 ) ( -1816 264 168 ) ( -1816 264 160 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 144 168 ) ( -1848 144 160 ) ( -1816 144 160 ) subway/con2 0 32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 144 160 ) ( -1848 144 168 ) ( -1856 136 168 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 620 +{ +( -1816 144 160 ) ( -1848 144 160 ) ( -1848 16 160 ) subway/con2 0 -32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 16 164 ) ( -1848 144 164 ) ( -1816 144 164 ) subway/con2 0 -32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 16 160 ) ( -1848 16 168 ) ( -1816 16 168 ) subway/con2 0 32 0 0.500000 0.500000 134217728 285212672 0 +( -1816 16 168 ) ( -1816 144 168 ) ( -1816 144 160 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +( -1816 24 168 ) ( -1848 24 168 ) ( -1848 24 160 ) subway/con2 0 32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 16 168 ) ( -1848 16 160 ) ( -1856 24 160 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 621 +{ +( -1728 -4 164 ) ( -1728 28 164 ) ( -1856 28 164 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -1856 24 184 ) ( -1728 24 184 ) ( -1728 -8 184 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -1848 16 184 ) ( -1848 16 164 ) ( -1852 20 164 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1848 17 164 ) ( -1848 17 184 ) ( -1816 17 184 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +( -1816 -16 176 ) ( -1816 16 176 ) ( -1816 16 168 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1728 19 176 ) ( -1856 19 176 ) ( -1856 19 168 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 622 +{ +( -1852 12 184 ) ( -1724 12 184 ) ( -1724 44 184 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1724 44 188 ) ( -1724 12 188 ) ( -1852 12 188 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1856 24 188 ) ( -1848 16 188 ) ( -1848 16 184 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1724 20 172 ) ( -1724 20 180 ) ( -1852 20 180 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1816 20 172 ) ( -1816 20 180 ) ( -1816 52 180 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1816 16 184 ) ( -1852 16 184 ) ( -1852 16 188 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 623 +{ +( -1848 20 188 ) ( -1848 20 184 ) ( -1848 -16 184 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1856 -112 184 ) ( -1856 -112 188 ) ( -1848 -104 188 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1852 -112 188 ) ( -1852 -112 184 ) ( -1852 24 184 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1848 16 184 ) ( -1848 16 188 ) ( -1856 24 188 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1844 20 188 ) ( -1844 -108 188 ) ( -1876 -108 188 ) subway/1_concrete_floor 7 0 90 0.500000 0.500000 134217728 16777216 0 +( -1876 -108 184 ) ( -1844 -108 184 ) ( -1844 20 184 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 624 +{ +( -1824 16 164 ) ( -1856 16 164 ) ( -1856 -112 164 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1856 -112 184 ) ( -1856 16 184 ) ( -1824 16 184 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1848 -104 184 ) ( -1848 -104 164 ) ( -1852 -108 164 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1849 -104 164 ) ( -1849 -104 184 ) ( -1849 16 184 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1848 16 164 ) ( -1848 16 184 ) ( -1852 20 184 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1851 17 176 ) ( -1851 -111 176 ) ( -1851 -111 168 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 625 +{ +( -1824 16 160 ) ( -1856 16 160 ) ( -1856 -112 160 ) subway/con2 0 -32 0 0.500000 0.500000 134217728 285212672 0 +( -1856 -112 164 ) ( -1856 16 164 ) ( -1824 16 164 ) subway/con2 0 -32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 -104 168 ) ( -1848 -104 160 ) ( -1856 -112 160 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 16 164 ) ( -1848 16 156 ) ( -1848 -104 156 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 16 160 ) ( -1848 16 168 ) ( -1856 24 168 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +( -1856 16 168 ) ( -1856 -112 168 ) ( -1856 -112 160 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 626 +{ +( -1848 -104 160 ) ( -1848 -104 168 ) ( -1856 -112 168 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 -104 168 ) ( -1848 -104 160 ) ( -1816 -104 160 ) subway/con2 0 32 0 0.500000 0.500000 134217728 285212672 0 +( -1816 -112 168 ) ( -1816 16 168 ) ( -1816 16 160 ) subway/con2 32 32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 -112 168 ) ( -1816 -112 168 ) ( -1816 -112 160 ) subway/con2 0 32 0 0.500000 0.500000 134217728 285212672 0 +( -1848 -112 164 ) ( -1848 16 164 ) ( -1816 16 164 ) subway/con2 0 -32 0 0.500000 0.500000 134217728 285212672 0 +( -1816 16 160 ) ( -1848 16 160 ) ( -1848 -112 160 ) subway/con2 0 -32 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 627 +{ +( -1724 -132 184 ) ( -1724 -100 184 ) ( -1852 -100 184 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1852 -100 188 ) ( -1724 -100 188 ) ( -1724 -132 188 ) subway/1_concrete_floor 8 0 0 0.500000 -0.500000 134217728 16777216 0 +( -1848 -104 184 ) ( -1848 -104 188 ) ( -1856 -112 188 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1852 -108 180 ) ( -1724 -108 180 ) ( -1724 -108 172 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1812 -140 180 ) ( -1812 -108 180 ) ( -1812 -108 172 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1848 -104 188 ) ( -1848 -104 184 ) ( -1812 -104 184 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 628 +{ +( -1724 -132 164 ) ( -1724 -100 164 ) ( -1852 -100 164 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -1852 -100 184 ) ( -1724 -100 184 ) ( -1724 -132 184 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -1852 -108 184 ) ( -1852 -108 164 ) ( -1848 -104 164 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1852 -107 164 ) ( -1852 -107 184 ) ( -1812 -107 184 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +( -1812 -140 176 ) ( -1812 -108 176 ) ( -1812 -108 168 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -1724 -105 176 ) ( -1852 -105 176 ) ( -1852 -105 168 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 629 +{ +( -2040 608 352 ) ( -2056 608 352 ) ( -2056 584 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2056 608 464 ) ( -2040 608 464 ) ( -2040 592 464 ) subway/metal2 47 33 90 1 1 0 16777216 0 +( -2056 592 456 ) ( -2040 592 456 ) ( -2040 592 352 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -2040 584 480 ) ( -2040 608 480 ) ( -2040 608 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2040 608 464 ) ( -2056 608 464 ) ( -2056 608 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2056 608 480 ) ( -2056 584 480 ) ( -2056 584 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 630 +{ +( -2380 8 488 ) ( -2283 -88 488 ) ( -2283 -88 464 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( -2283 -54 488 ) ( -2295 -65 488 ) ( -2295 -65 464 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2204 -156 488 ) ( -2300 -60 488 ) ( -2300 -60 464 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( -2295 -77 488 ) ( -2283 -65 488 ) ( -2283 -65 464 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2289 -82 448 ) ( -2385 14 448 ) ( -2374 25 448 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -2368 20 424 ) ( -2380 8 424 ) ( -2283 -88 424 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 631 +{ +( 1304 2152 -440 ) ( 1304 2152 -456 ) ( 1296 2144 -456 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1304 2152 -456 ) ( 1304 2152 -440 ) ( 1304 2304 -440 ) subway/metalrib1 0 0 90 0.500000 -0.500000 0 16777216 0 +( 1304 2336 -440 ) ( 1296 2328 -440 ) ( 1296 2328 -456 ) subway/metalrib1 0 16 90 0.500000 -0.500000 0 16777216 0 +( 1296 2216 -456 ) ( 1296 2296 -456 ) ( 1296 2296 -440 ) subway/metalrib1 0 0 90 0.500000 -0.500000 0 16777216 0 +( 1304 2224 -440 ) ( 1304 2160 -440 ) ( 1296 2160 -440 ) subway/metalrib1 16 0 0 0.500000 0.500000 0 16777216 0 +( 1296 2160 -456 ) ( 1304 2160 -456 ) ( 1304 2224 -456 ) subway/metalrib1 16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 632 +{ +( 1544 2272 -464 ) ( 1544 2280 -464 ) ( 1544 2280 -480 ) subway/metalrib1 0 16 90 0.500000 -0.500000 0 16777216 0 +( 1456 2272 -464 ) ( 1520 2272 -464 ) ( 1520 2272 -480 ) subway/metalrib1 0 0 90 0.500000 -0.500000 0 16777216 0 +( 1432 2280 -456 ) ( 1432 2280 -440 ) ( 1424 2272 -440 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 1432 2280 -440 ) ( 1432 2280 -456 ) ( 1584 2280 -456 ) subway/metalrib1 0 0 90 0.500000 -0.500000 0 16777216 0 +( 1584 2280 -440 ) ( 1584 2272 -440 ) ( 1520 2272 -440 ) subway/metalrib1 1 0 -90 0.500000 0.500000 0 16777216 0 +( 1520 2272 -456 ) ( 1584 2272 -456 ) ( 1584 2280 -456 ) subway/metalrib1 1 0 -90 0.500000 0.500000 0 16777216 0 +} +// brush 633 +{ +( 1544 2144 -480 ) ( 1544 2144 -464 ) ( 1544 2152 -464 ) subway/metalrib1 0 0 90 0.500000 -0.500000 0 16777216 0 +( 1304 2152 -440 ) ( 1304 2152 -456 ) ( 1544 2152 -456 ) subway/metalrib1 0 -15 90 0.500000 -0.500000 0 16777216 0 +( 1304 2152 -456 ) ( 1304 2152 -440 ) ( 1296 2144 -440 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1296 2144 -456 ) ( 1296 2144 -440 ) ( 1544 2144 -440 ) subway/metalrib1 0 -15 90 0.500000 -0.500000 0 16777216 0 +( 1400 2152 -440 ) ( 1464 2152 -440 ) ( 1464 2144 -440 ) subway/metalrib1 -14 -16 -90 0.500000 0.500000 0 16777216 0 +( 1464 2144 -456 ) ( 1464 2152 -456 ) ( 1400 2152 -456 ) subway/metalrib1 -14 -16 -90 0.500000 0.500000 0 16777216 0 +} +// brush 634 +{ +( 1208 1432 -480 ) ( 1208 1424 -480 ) ( 1208 1424 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1280 1432 -480 ) ( 1216 1432 -480 ) ( 1216 1432 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1304 1424 -472 ) ( 1304 1424 -456 ) ( 1296 1432 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 1424 -456 ) ( 1296 1424 -472 ) ( 1208 1424 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1208 1424 -456 ) ( 1208 1432 -456 ) ( 1272 1432 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1272 1432 -472 ) ( 1208 1432 -472 ) ( 1208 1424 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 635 +{ +( 1208 1560 -472 ) ( 1208 1552 -472 ) ( 1272 1552 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1272 1552 -456 ) ( 1208 1552 -456 ) ( 1208 1560 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1288 1560 -472 ) ( 1288 1560 -456 ) ( 1208 1560 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1304 1560 -456 ) ( 1304 1560 -472 ) ( 1296 1552 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1208 1552 -496 ) ( 1208 1552 -480 ) ( 1272 1552 -480 ) subway/1_trim1 0 0 0 -1 1 0 0 0 +( 1208 1560 -496 ) ( 1208 1560 -480 ) ( 1208 1552 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 636 +{ +( 1304 1560 -472 ) ( 1296 1560 -472 ) ( 1296 1496 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 1496 -456 ) ( 1296 1560 -456 ) ( 1304 1560 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1304 1432 -496 ) ( 1304 1432 -480 ) ( 1304 1496 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 1432 -472 ) ( 1296 1432 -456 ) ( 1304 1424 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 1432 -456 ) ( 1296 1432 -472 ) ( 1296 1552 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 1552 -456 ) ( 1296 1552 -472 ) ( 1304 1560 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 637 +{ +( 1056 1176 -480 ) ( 1056 1176 -464 ) ( 1056 1184 -464 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1048 1184 -480 ) ( 1048 1184 -464 ) ( 984 1184 -464 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 968 1184 -440 ) ( 960 1176 -440 ) ( 960 1176 -456 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1056 1176 -456 ) ( 968 1176 -456 ) ( 968 1176 -440 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 992 1184 -440 ) ( 1056 1184 -440 ) ( 1056 1176 -440 ) subway/metalrib1 -16 31 90 0.500000 0.500000 0 16777216 0 +( 1056 1176 -456 ) ( 1056 1184 -456 ) ( 992 1184 -456 ) subway/metalrib1 -16 31 90 0.500000 0.500000 0 16777216 0 +} +// brush 638 +{ +( 968 1248 -456 ) ( 968 1312 -456 ) ( 960 1312 -456 ) subway/metalrib1 -16 31 90 0.500000 0.500000 0 16777216 0 +( 960 1312 -440 ) ( 968 1312 -440 ) ( 968 1248 -440 ) subway/metalrib1 -16 31 90 0.500000 0.500000 0 16777216 0 +( 960 1248 -464 ) ( 960 1184 -464 ) ( 960 1184 -480 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 960 1176 -440 ) ( 968 1184 -440 ) ( 968 1184 -456 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 968 1304 -456 ) ( 968 1184 -456 ) ( 968 1184 -440 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 960 1312 -456 ) ( 968 1304 -456 ) ( 968 1304 -440 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 639 +{ +( 992 1304 -456 ) ( 1056 1304 -456 ) ( 1056 1312 -456 ) subway/metalrib1 -16 31 90 0.500000 0.500000 0 16777216 0 +( 1056 1312 -440 ) ( 1056 1304 -440 ) ( 992 1304 -440 ) subway/metalrib1 -16 31 90 0.500000 0.500000 0 16777216 0 +( 1056 1312 -440 ) ( 976 1312 -440 ) ( 976 1312 -456 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 968 1304 -456 ) ( 960 1312 -456 ) ( 960 1312 -440 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 992 1304 -464 ) ( 1056 1304 -464 ) ( 1056 1304 -480 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1056 1304 -464 ) ( 1056 1312 -464 ) ( 1056 1312 -480 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 640 +{ +( 1208 968 -480 ) ( 1208 960 -480 ) ( 1208 960 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1280 968 -480 ) ( 1216 968 -480 ) ( 1216 968 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1304 960 -472 ) ( 1304 960 -456 ) ( 1296 968 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 960 -456 ) ( 1296 960 -472 ) ( 1208 960 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1208 960 -456 ) ( 1208 968 -456 ) ( 1272 968 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1272 968 -472 ) ( 1208 968 -472 ) ( 1208 960 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 641 +{ +( 1304 1096 -472 ) ( 1296 1096 -472 ) ( 1296 1032 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 1032 -456 ) ( 1296 1096 -456 ) ( 1304 1096 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1304 968 -496 ) ( 1304 968 -480 ) ( 1304 1032 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 968 -472 ) ( 1296 968 -456 ) ( 1304 960 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 968 -464 ) ( 1296 968 -480 ) ( 1296 1088 -480 ) subway/1_trim1 8 0 0 1 1 0 0 0 +( 1296 1088 -456 ) ( 1296 1088 -472 ) ( 1304 1096 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 642 +{ +( 1208 1096 -472 ) ( 1208 1088 -472 ) ( 1272 1088 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1272 1088 -456 ) ( 1208 1088 -456 ) ( 1208 1096 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1288 1096 -472 ) ( 1288 1096 -456 ) ( 1208 1096 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1304 1096 -456 ) ( 1304 1096 -472 ) ( 1296 1088 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1208 1088 -496 ) ( 1208 1088 -480 ) ( 1272 1088 -480 ) subway/1_trim1 -8 0 0 -1 1 0 0 0 +( 1208 1096 -496 ) ( 1208 1096 -480 ) ( 1208 1088 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 643 +{ +( 544 -272 -408 ) ( 544 -272 -456 ) ( 544 -248 -456 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 584 -248 -400 ) ( 536 -248 -400 ) ( 536 -248 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -264 -392 ) ( 576 -232 -392 ) ( 576 -232 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -264 -392 ) ( 336 -264 -392 ) ( 336 -232 -392 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 584 -256 -400 ) ( 576 -256 -400 ) ( 576 -272 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -260 -368 ) ( 584 -260 -368 ) ( 576 -260 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 644 +{ +( 544 -280 -456 ) ( 544 -280 -408 ) ( 584 -280 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 544 -272 -408 ) ( 544 -272 -456 ) ( 544 -248 -456 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -264 -392 ) ( 576 -232 -392 ) ( 576 -232 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -264 -392 ) ( 336 -264 -392 ) ( 336 -232 -392 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 584 -256 -400 ) ( 576 -256 -400 ) ( 576 -272 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 584 -268 -368 ) ( 576 -268 -368 ) ( 584 -268 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 645 +{ +( 544 -280 -456 ) ( 544 -280 -408 ) ( 584 -280 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 544 -272 -408 ) ( 544 -272 -456 ) ( 544 -248 -456 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 584 -248 -400 ) ( 536 -248 -400 ) ( 536 -248 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -264 -392 ) ( 576 -232 -392 ) ( 576 -232 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 328 -240 -432 ) ( 328 -272 -432 ) ( 368 -272 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -256 -400 ) ( 584 -256 -400 ) ( 576 -272 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 646 +{ +( 544 -400 -416 ) ( 544 -400 -464 ) ( 544 -376 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -392 -408 ) ( 576 -360 -408 ) ( 576 -360 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 328 -368 -424 ) ( 328 -400 -424 ) ( 368 -400 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 584 -388 -368 ) ( 576 -388 -368 ) ( 576 -388 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 544 -396 -368 ) ( 552 -396 -368 ) ( 552 -396 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 576 -384 -400 ) ( 584 -384 -400 ) ( 576 -400 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 647 +{ +( 544 -408 -464 ) ( 544 -408 -416 ) ( 584 -408 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 544 -400 -416 ) ( 544 -400 -464 ) ( 544 -376 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -392 -408 ) ( 576 -360 -408 ) ( 576 -360 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -392 -392 ) ( 336 -392 -392 ) ( 336 -360 -392 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 328 -368 -424 ) ( 328 -400 -424 ) ( 368 -400 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 552 -396 -368 ) ( 544 -396 -368 ) ( 552 -396 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 648 +{ +( 544 -400 -416 ) ( 544 -400 -464 ) ( 544 -376 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 584 -376 -416 ) ( 536 -376 -416 ) ( 536 -376 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -392 -408 ) ( 576 -360 -408 ) ( 576 -360 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -392 -392 ) ( 336 -392 -392 ) ( 336 -360 -392 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 328 -368 -424 ) ( 328 -400 -424 ) ( 368 -400 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 576 -388 -368 ) ( 584 -388 -368 ) ( 576 -388 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 649 +{ +( 544 -528 -384 ) ( 544 -528 -432 ) ( 544 -504 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -520 -408 ) ( 576 -488 -408 ) ( 576 -488 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 328 -496 -432 ) ( 328 -528 -432 ) ( 368 -528 -432 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 584 -516 -368 ) ( 576 -516 -368 ) ( 576 -516 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 576 -524 -368 ) ( 584 -524 -368 ) ( 584 -524 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 576 -512 -400 ) ( 584 -512 -400 ) ( 576 -528 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 650 +{ +( 544 -536 -464 ) ( 544 -536 -416 ) ( 584 -536 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 544 -528 -384 ) ( 544 -528 -432 ) ( 544 -504 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -520 -408 ) ( 576 -488 -408 ) ( 576 -488 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -520 -392 ) ( 336 -520 -392 ) ( 336 -488 -392 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 328 -496 -432 ) ( 328 -528 -432 ) ( 368 -528 -432 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 584 -524 -368 ) ( 576 -524 -368 ) ( 584 -524 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 651 +{ +( 544 -528 -384 ) ( 544 -528 -432 ) ( 544 -504 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 584 -504 -416 ) ( 536 -504 -416 ) ( 536 -504 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -520 -408 ) ( 576 -488 -408 ) ( 576 -488 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -520 -392 ) ( 336 -520 -392 ) ( 336 -488 -392 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 328 -496 -432 ) ( 328 -528 -432 ) ( 368 -528 -432 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 576 -516 -368 ) ( 584 -516 -368 ) ( 576 -516 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 652 +{ +( 544 -656 -368 ) ( 544 -656 -416 ) ( 544 -632 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -648 -408 ) ( 576 -616 -408 ) ( 576 -616 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 328 -624 -424 ) ( 328 -656 -424 ) ( 368 -656 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 584 -644 -368 ) ( 576 -644 -368 ) ( 576 -644 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 576 -652 -368 ) ( 584 -652 -368 ) ( 584 -652 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 576 -636 -400 ) ( 584 -636 -400 ) ( 576 -652 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 653 +{ +( 544 -664 -464 ) ( 544 -664 -416 ) ( 584 -664 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 544 -656 -368 ) ( 544 -656 -416 ) ( 544 -632 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -648 -408 ) ( 576 -616 -408 ) ( 576 -616 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -648 -392 ) ( 336 -648 -392 ) ( 336 -616 -392 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 328 -624 -424 ) ( 328 -656 -424 ) ( 368 -656 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 584 -652 -368 ) ( 576 -652 -368 ) ( 584 -652 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 654 +{ +( 544 -656 -368 ) ( 544 -656 -416 ) ( 544 -632 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 584 -632 -416 ) ( 536 -632 -416 ) ( 536 -632 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -648 -408 ) ( 576 -616 -408 ) ( 576 -616 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -648 -392 ) ( 336 -648 -392 ) ( 336 -616 -392 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 328 -624 -424 ) ( 328 -656 -424 ) ( 368 -656 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 576 -644 -368 ) ( 584 -644 -368 ) ( 576 -644 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 655 +{ +( 1132 892 -192 ) ( 1126 892 -192 ) ( 1126 862 -192 ) subway/1_bath_stall 24 -18 0 1 1 0 16777216 0 +( 1126 864 -148 ) ( 1132 864 -148 ) ( 1132 864 -184 ) subway/1_bath_stall 24 -16 0 1 1 0 16777216 0 +( 1129 862 -144 ) ( 1129 892 -144 ) ( 1129 892 -180 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1127 892 -144 ) ( 1127 862 -144 ) ( 1127 862 -180 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1130 866 -180 ) ( 1126 866 -180 ) ( 1126 874 -192 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1126 866 -180 ) ( 1130 866 -180 ) ( 1130 864 -180 ) subway/1_bath_stall 26 -24 0 1 1 0 16777216 0 +} +// brush 656 +{ +( 1126 864 -168 ) ( 1126 894 -168 ) ( 1132 894 -168 ) subway/1_bath_stall 24 -18 0 1 1 0 16777216 0 +( 1126 864 -148 ) ( 1132 864 -148 ) ( 1132 864 -184 ) subway/1_bath_stall 24 -16 0 1 1 0 16777216 0 +( 1129 862 -144 ) ( 1129 892 -144 ) ( 1129 892 -180 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1127 892 -144 ) ( 1127 862 -144 ) ( 1127 862 -180 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1126 866 -180 ) ( 1130 866 -180 ) ( 1130 874 -168 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1130 866 -180 ) ( 1126 866 -180 ) ( 1126 864 -180 ) subway/1_bath_stall 26 -24 0 1 1 0 16777216 0 +} +// brush 657 +{ +( 1126 874 -168 ) ( 1130 874 -168 ) ( 1130 864 -144 ) subway/1_bath_stall 24 -10 0 1 1 0 16777216 0 +( 1126 864 -148 ) ( 1132 864 -148 ) ( 1132 864 -184 ) subway/1_bath_stall 24 -16 0 1 1 0 16777216 0 +( 1129 862 -144 ) ( 1129 892 -144 ) ( 1129 892 -180 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1127 892 -144 ) ( 1127 862 -144 ) ( 1127 862 -180 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1126 874 -168 ) ( 1126 860 -168 ) ( 1130 867 -168 ) subway/1_bath_stall 26 -24 0 1 1 0 16777216 0 +} +// brush 658 +{ +( 1126 856 -168 ) ( 1126 886 -168 ) ( 1132 886 -168 ) subway/1_bath_stall 24 -24 0 1 1 0 16777216 0 +( 1129 856 -144 ) ( 1129 886 -144 ) ( 1129 886 -180 ) subway/1_bath_stall 32 -16 0 1 1 0 16777216 0 +( 1126 908 -188 ) ( 1130 908 -188 ) ( 1130 908 -168 ) subway/1_bath_stall 24 -16 0 1 1 0 16777216 0 +( 1127 886 -144 ) ( 1127 856 -144 ) ( 1127 856 -180 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1130 898 -172 ) ( 1126 898 -172 ) ( 1126 898 -168 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1130 908 -188 ) ( 1126 908 -188 ) ( 1126 898 -172 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +} +// brush 659 +{ +( 1132 886 -168 ) ( 1126 886 -168 ) ( 1126 856 -168 ) subway/1_bath_stall 24 -24 0 1 1 0 16777216 0 +( 1129 856 -144 ) ( 1129 886 -144 ) ( 1129 886 -180 ) subway/1_bath_stall 32 -16 0 1 1 0 16777216 0 +( 1127 886 -144 ) ( 1127 856 -144 ) ( 1127 856 -180 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1126 898 -168 ) ( 1126 908 -158 ) ( 1130 903 -163 ) subway/1_bath_stall 26 -12 0 1 1 0 16777216 0 +( 1126 908 -158 ) ( 1126 908 -168 ) ( 1130 908 -163 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +} +// brush 660 +{ +( 1132 892 -192 ) ( 1126 892 -192 ) ( 1126 862 -192 ) subway/1_bath_stall 24 -18 0 1 1 0 16777216 0 +( 1126 862 -144 ) ( 1126 892 -144 ) ( 1132 892 -144 ) subway/1_bath_stall 24 -18 0 1 1 0 16777216 0 +( 1129 862 -144 ) ( 1129 892 -144 ) ( 1129 892 -180 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1132 920 -144 ) ( 1126 920 -144 ) ( 1126 920 -180 ) subway/1_bath_stall 24 -16 0 1 1 0 16777216 0 +( 1127 892 -144 ) ( 1127 862 -144 ) ( 1127 862 -180 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1136 908 -192 ) ( 1124 908 -192 ) ( 1130 908 -144 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +} +// brush 661 +{ +( 1864 3212 -344 ) ( 1864 2828 -344 ) ( 1864 2828 -376 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 900 +( 2136 2784 -232 ) ( 1664 2784 -232 ) ( 1664 2784 -224 ) subway/1_tile 48 0 0 0.500000 0.500000 0 318767104 900 +( 1528 2816 -344 ) ( 1520 2816 -344 ) ( 1520 2816 -376 ) subway/1_tile 48 0 0 0.500000 0.500000 0 318767104 900 +( 2000 2792 -248 ) ( 1984 2792 -248 ) ( 1984 2776 -248 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 900 +( 1984 2776 -232 ) ( 1984 2792 -232 ) ( 2000 2792 -232 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 900 +( 1992 2776 -232 ) ( 1992 2792 -232 ) ( 1992 2776 -264 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 900 +} +// brush 662 +{ +( 2136 2784 -232 ) ( 1664 2784 -232 ) ( 1664 2784 -224 ) subway/1_tile 48 0 0 0.500000 0.500000 0 318767104 900 +( 1560 2816 -344 ) ( 1552 2816 -344 ) ( 1552 2816 -376 ) subway/1_tile 48 0 0 0.500000 0.500000 0 318767104 900 +( 2136 2912 -232 ) ( 2136 2888 -232 ) ( 2136 2900 -224 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 900 +( 2000 2792 -248 ) ( 1984 2792 -248 ) ( 1984 2776 -248 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 900 +( 1984 2776 -232 ) ( 1984 2792 -232 ) ( 2000 2792 -232 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 900 +( 2008 2792 -232 ) ( 2008 2776 -232 ) ( 2008 2792 -264 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 900 +} +// brush 663 +{ +( 1536 3360 -224 ) ( 1544 3360 -224 ) ( 1544 2976 -224 ) subway/1_tile 48 32 0 0.500000 0.500000 0 318767104 900 +( 1864 3220 -344 ) ( 1864 2836 -344 ) ( 1864 2836 -376 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 900 +( 2136 2784 -232 ) ( 1664 2784 -232 ) ( 1664 2784 -224 ) subway/1_tile 48 0 0 0.500000 0.500000 0 318767104 900 +( 1560 2816 -344 ) ( 1552 2816 -344 ) ( 1552 2816 -376 ) subway/1_tile 48 0 0 0.500000 0.500000 0 318767104 900 +( 2136 2912 -232 ) ( 2136 2888 -232 ) ( 2136 2900 -224 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 900 +( 1984 2792 -232 ) ( 1984 2776 -232 ) ( 2000 2792 -232 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 900 +} +// brush 664 +{ +( 1664 2752 -256 ) ( 2136 2752 -256 ) ( 2136 2912 -256 ) subway/1_tile 48 32 0 0.500000 0.500000 0 318767104 900 +( 1864 3220 -344 ) ( 1864 2836 -344 ) ( 1864 2836 -376 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 900 +( 2136 2784 -232 ) ( 1664 2784 -232 ) ( 1664 2784 -224 ) subway/1_tile 48 0 0 0.500000 0.500000 0 318767104 900 +( 1560 2816 -344 ) ( 1552 2816 -344 ) ( 1552 2816 -376 ) subway/1_tile 48 0 0 0.500000 0.500000 0 318767104 900 +( 2136 2912 -232 ) ( 2136 2888 -232 ) ( 2136 2900 -224 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 900 +( 1984 2792 -248 ) ( 2000 2792 -248 ) ( 1984 2776 -248 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 900 +} +// brush 665 +{ +( 2008 2792 -248 ) ( 1992 2792 -248 ) ( 1992 2776 -248 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1992 2776 -232 ) ( 1992 2792 -232 ) ( 2008 2792 -232 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1992 2784 -232 ) ( 2008 2784 -232 ) ( 2008 2784 -264 ) subway/light_yellow 16 16 0 0.500000 0.500000 0 16777217 10000 +( 2008 2776 -232 ) ( 2008 2792 -232 ) ( 2008 2792 -264 ) subway/1_tile_big -16 0 0 0.500000 0.500000 0 318767104 0 +( 2008 2816 -232 ) ( 1992 2816 -232 ) ( 1992 2816 -264 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 900 +( 1992 2792 -232 ) ( 1992 2776 -232 ) ( 1992 2776 -264 ) subway/1_tile_big -16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 666 +{ +( 2032 2040 -224 ) ( 2008 2040 -224 ) ( 2008 2016 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 2008 2016 -216 ) ( 2008 2040 -216 ) ( 2032 2040 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1832 2424 -224 ) ( 1832 2448 -224 ) ( 1832 2436 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1984 2528 -224 ) ( 2000 2528 -224 ) ( 2000 2528 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2000 2544 -224 ) ( 1984 2544 -224 ) ( 1984 2544 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1984 2528 -224 ) ( 1984 2544 -224 ) ( 1984 2528 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 667 +{ +( 2032 2040 -224 ) ( 2008 2040 -224 ) ( 2008 2016 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 2008 2016 -216 ) ( 2008 2040 -216 ) ( 2032 2040 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2568 -232 ) ( 2024 2568 -232 ) ( 2024 2568 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1832 2424 -224 ) ( 1832 2448 -224 ) ( 1832 2436 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2000 2528 -224 ) ( 2000 2544 -224 ) ( 2000 2544 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1984 2544 -224 ) ( 2000 2544 -224 ) ( 1984 2544 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 668 +{ +( 2032 2040 -224 ) ( 2008 2040 -224 ) ( 2008 2016 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 2008 2016 -216 ) ( 2008 2040 -216 ) ( 2032 2040 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2568 -232 ) ( 2024 2568 -232 ) ( 2024 2568 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2208 2448 -224 ) ( 2208 2432 -224 ) ( 2208 2440 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1984 2528 -224 ) ( 2000 2528 -224 ) ( 2000 2528 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2000 2544 -224 ) ( 2000 2528 -224 ) ( 2000 2544 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 669 +{ +( 2032 2040 -224 ) ( 2008 2040 -224 ) ( 2008 2016 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 2008 2016 -216 ) ( 2008 2040 -216 ) ( 2032 2040 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 2208 2456 -224 ) ( 2208 2440 -224 ) ( 2208 2448 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1832 2424 -224 ) ( 1832 2448 -224 ) ( 1832 2436 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2032 2504 -224 ) ( 1992 2504 -224 ) ( 2012 2504 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2000 2528 -224 ) ( 1984 2528 -224 ) ( 2000 2528 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 670 +{ +( 1936 2040 -224 ) ( 1912 2040 -224 ) ( 1912 2016 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1912 2016 -216 ) ( 1912 2040 -216 ) ( 1936 2040 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1736 2424 -224 ) ( 1736 2448 -224 ) ( 1736 2436 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1784 2528 -224 ) ( 1800 2528 -224 ) ( 1800 2528 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1800 2544 -224 ) ( 1784 2544 -224 ) ( 1784 2544 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1784 2528 -224 ) ( 1784 2544 -224 ) ( 1784 2528 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 671 +{ +( 1936 2040 -224 ) ( 1912 2040 -224 ) ( 1912 2016 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1912 2016 -216 ) ( 1912 2040 -216 ) ( 1936 2040 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1952 2568 -232 ) ( 1928 2568 -232 ) ( 1928 2568 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1736 2424 -224 ) ( 1736 2448 -224 ) ( 1736 2436 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1800 2528 -224 ) ( 1800 2544 -224 ) ( 1800 2544 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1784 2544 -224 ) ( 1800 2544 -224 ) ( 1784 2544 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 672 +{ +( 1936 2040 -224 ) ( 1912 2040 -224 ) ( 1912 2016 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1912 2016 -216 ) ( 1912 2040 -216 ) ( 1936 2040 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1952 2568 -232 ) ( 1928 2568 -232 ) ( 1928 2568 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1832 2448 -224 ) ( 1832 2432 -224 ) ( 1832 2440 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1784 2528 -224 ) ( 1800 2528 -224 ) ( 1800 2528 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1800 2544 -224 ) ( 1800 2528 -224 ) ( 1800 2544 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 673 +{ +( 1936 2040 -224 ) ( 1912 2040 -224 ) ( 1912 2016 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1912 2016 -216 ) ( 1912 2040 -216 ) ( 1936 2040 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1832 2448 -224 ) ( 1832 2432 -224 ) ( 1832 2440 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1736 2424 -224 ) ( 1736 2448 -224 ) ( 1736 2436 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1768 2008 -224 ) ( 1728 2008 -224 ) ( 1748 2008 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1800 2528 -224 ) ( 1784 2528 -224 ) ( 1800 2528 -240 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 674 +{ +( 1672 2752 -336 ) ( 2144 2752 -336 ) ( 2144 2912 -336 ) subway/1_tile_bottom -16 17 -180 0.500000 -0.500000 0 318767104 904 +( 1984 3212 -344 ) ( 1984 2828 -344 ) ( 1984 2828 -376 ) subway/1_tile_bottom 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 2144 2784 -232 ) ( 1672 2784 -232 ) ( 1672 2784 -224 ) subway/1_tile_bottom -16 0 -180 0.500000 -0.500000 0 318767104 904 +( 1568 2816 -344 ) ( 1560 2816 -344 ) ( 1560 2816 -376 ) subway/1_tile_bottom -16 0 -180 0.500000 -0.500000 0 318767104 904 +( 2016 2912 -232 ) ( 2016 2888 -232 ) ( 2016 2900 -224 ) subway/1_tile_bottom 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 2032 2784 -320 ) ( 1984 2784 -320 ) ( 2008 2816 -320 ) subway/1_tile_bottom -16 17 -180 0.500000 -0.500000 0 318767104 904 +} +// brush 675 +{ +( 1984 3212 -344 ) ( 1984 2828 -344 ) ( 1984 2828 -376 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 900 +( 2144 2784 -232 ) ( 1672 2784 -232 ) ( 1672 2784 -224 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 900 +( 1568 2816 -344 ) ( 1560 2816 -344 ) ( 1560 2816 -376 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 900 +( 2016 2912 -232 ) ( 2016 2888 -232 ) ( 2016 2900 -224 ) subway/1_tile -16 0 0 0.500000 0.500000 0 318767104 900 +( 2056 2784 -264 ) ( 1976 2784 -264 ) ( 2016 2816 -264 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1984 2784 -320 ) ( 2032 2784 -320 ) ( 2008 2816 -320 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +} +// brush 676 +{ +( 1544 3360 -256 ) ( 1552 3360 -256 ) ( 1552 2976 -256 ) subway/1_tile_top -16 1 -180 0.500000 -0.500000 0 318767104 904 +( 1984 3212 -344 ) ( 1984 2828 -344 ) ( 1984 2828 -376 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 2144 2784 -232 ) ( 1672 2784 -232 ) ( 1672 2784 -224 ) subway/1_tile_top -16 0 -180 0.500000 -0.500000 0 318767104 904 +( 1568 2816 -344 ) ( 1560 2816 -344 ) ( 1560 2816 -376 ) subway/1_tile_top -16 0 -180 0.500000 -0.500000 0 318767104 904 +( 2016 2912 -232 ) ( 2016 2888 -232 ) ( 2016 2900 -224 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 904 +( 1976 2784 -264 ) ( 2056 2784 -264 ) ( 2016 2816 -264 ) subway/1_tile_top -16 1 -180 0.500000 -0.500000 0 318767104 904 +} +// brush 677 +{ +( 2400 2936 -344 ) ( 2384 2936 -344 ) ( 2384 2792 -344 ) subway/1_tile 16 -16 0 0.500000 0.500000 0 318767104 904 +( 2384 2784 -216 ) ( 2384 2928 -216 ) ( 2400 2928 -216 ) subway/1_tile 16 -16 0 0.500000 0.500000 0 318767104 904 +( 2384 2784 -216 ) ( 2400 2784 -216 ) ( 2400 2784 -224 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 904 +( 2400 2784 -216 ) ( 2400 2928 -216 ) ( 2400 2928 -224 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 904 +( 2400 2944 -216 ) ( 2384 2944 -216 ) ( 2384 2944 -224 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 904 +( 2384 2928 -216 ) ( 2384 2784 -216 ) ( 2384 2784 -224 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 904 +} +// brush 678 +{ +( 2632 2816 -240 ) ( 2112 2816 -240 ) ( 2120 2808 -256 ) subway/1_tile -16 16 -180 0.500000 -0.500000 0 318767104 904 +( 2216 2800 -240 ) ( 2216 2800 -256 ) ( 2032 2800 -256 ) subway/1_tile_big_green 0 15 0 0.500000 0.500000 0 369098752 0 +( 2000 2896 -256 ) ( 1976 2896 -256 ) ( 1976 2872 -256 ) subway/1_tile_big_green 2 -4 -90 0.500000 0.500000 0 369098752 0 +( 1744 2800 -240 ) ( 1724 2816 -240 ) ( 2248 2816 -240 ) subway/1_tile_big_green 2 -4 -90 0.500000 0.500000 0 369098752 0 +( 2136 2800 -256 ) ( 2096 2840 -256 ) ( 2116 2820 -240 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +( 2384 2856 -256 ) ( 2384 2800 -256 ) ( 2384 2828 -240 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 679 +{ +( 1704 2840 -224 ) ( 1728 2816 -240 ) ( 2248 2816 -240 ) subway/1_tile -15 -17 -180 0.500000 0.500000 0 318767104 904 +( 2216 2800 -224 ) ( 2216 2800 -240 ) ( 2032 2800 -240 ) subway/1_tile_big_green 0 15 0 0.500000 0.500000 0 369098752 0 +( 1744 2800 -224 ) ( 1720 2840 -224 ) ( 2248 2840 -224 ) subway/1_tile_big_green 2 -4 -90 0.500000 0.500000 0 369098752 0 +( 2248 2800 -240 ) ( 2248 2816 -240 ) ( 1728 2816 -240 ) subway/1_tile_big_green 2 -4 -90 0.500000 0.500000 0 369098752 0 +( 2136 2800 -240 ) ( 2096 2840 -240 ) ( 2116 2820 -224 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +( 2384 2856 -240 ) ( 2384 2800 -240 ) ( 2384 2828 -224 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 680 +{ +( 1864 2800 -264 ) ( 2184 2800 -264 ) ( 2176 2808 -264 ) subway/1_tile_top -31 13 -180 0.500000 0.500000 0 318767104 0 +( 2256 2712 -256 ) ( 2232 2712 -256 ) ( 2232 2736 -256 ) subway/1_tile_top -31 13 -180 0.500000 0.500000 0 318767104 0 +( 1944 2808 -336 ) ( 2272 2808 -336 ) ( 2272 2808 -256 ) subway/1_tile_top -16 0 -180 0.500000 -0.500000 0 318767104 904 +( 2216 2800 -256 ) ( 2216 2800 -264 ) ( 2032 2800 -264 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 2136 2800 -264 ) ( 2096 2840 -264 ) ( 2116 2820 -256 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2384 2856 -264 ) ( 2384 2800 -264 ) ( 2384 2828 -256 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 681 +{ +( 1864 2800 -320 ) ( 2184 2800 -320 ) ( 2176 2808 -320 ) subway/1_tile_big -15 -1 -180 0.500000 0.500000 0 318767104 0 +( 2248 2712 -264 ) ( 2224 2712 -264 ) ( 2224 2736 -264 ) subway/1_tile_big -15 -1 -180 0.500000 0.500000 0 318767104 0 +( 1944 2808 -336 ) ( 2272 2808 -336 ) ( 2272 2808 -256 ) subway/1_tile -16 16 -180 0.500000 -0.500000 0 318767104 904 +( 2216 2800 -264 ) ( 2216 2800 -320 ) ( 2032 2800 -320 ) subway/1_tile_big 0 16 -180 0.500000 -0.500000 0 318767104 0 +( 2136 2800 -320 ) ( 2096 2840 -320 ) ( 2116 2820 -264 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 2384 2856 -320 ) ( 2384 2800 -320 ) ( 2384 2828 -264 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 682 +{ +( 1872 2800 -336 ) ( 2192 2800 -336 ) ( 2184 2808 -336 ) subway/1_tile_bottom -31 14 -180 0.500000 0.500000 0 318767104 0 +( 2248 2712 -320 ) ( 2224 2712 -320 ) ( 2224 2736 -320 ) subway/1_tile_bottom -31 14 -180 0.500000 0.500000 0 318767104 0 +( 1944 2808 -352 ) ( 2272 2808 -352 ) ( 2272 2808 -272 ) subway/1_tile_bottom -16 0 -180 0.500000 -0.500000 0 318767104 904 +( 2216 2800 -320 ) ( 2216 2800 -336 ) ( 2032 2800 -336 ) subway/1_tile_bottom 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 2136 2800 -336 ) ( 2096 2840 -336 ) ( 2116 2820 -320 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 0 318767104 0 +( 2384 2856 -336 ) ( 2384 2800 -336 ) ( 2384 2828 -320 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 683 +{ +( 1784 2840 -224 ) ( 2256 2840 -224 ) ( 2256 3000 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1656 3448 -216 ) ( 1664 3448 -216 ) ( 1664 3064 -216 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1864 3316 -336 ) ( 1864 2932 -336 ) ( 1864 2932 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 2256 2784 -224 ) ( 1784 2784 -224 ) ( 1784 2784 -216 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1680 2944 -336 ) ( 1672 2944 -336 ) ( 1672 2944 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 2384 2992 -224 ) ( 2384 2968 -224 ) ( 2384 2980 -216 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +} +// brush 684 +{ +( 1688 2616 -224 ) ( 2160 2616 -224 ) ( 2160 2776 -224 ) subway/1_tile_big 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1560 3224 -216 ) ( 1568 3224 -216 ) ( 1568 2840 -216 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1872 3084 -336 ) ( 1872 2700 -336 ) ( 1872 2700 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 2160 2584 -224 ) ( 1688 2584 -224 ) ( 1688 2584 -216 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1576 2784 -336 ) ( 1568 2784 -336 ) ( 1568 2784 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 2136 2768 -224 ) ( 2136 2744 -224 ) ( 2136 2756 -216 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +} +// brush 685 +{ +( 2120 3176 -240 ) ( 2120 2656 -240 ) ( 2128 2664 -256 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 904 +( 2136 2704 -240 ) ( 2136 2704 -256 ) ( 2136 2520 -256 ) subway/1_tile_big_green -16 15 -180 0.500000 -0.500000 0 369098752 0 +( 2040 2488 -256 ) ( 2040 2464 -256 ) ( 2064 2464 -256 ) subway/1_tile_big_green -14 11 -180 0.500000 0.500000 0 369098752 0 +( 2136 2232 -240 ) ( 2120 2212 -240 ) ( 2120 2736 -240 ) subway/1_tile_big_green -14 11 -180 0.500000 0.500000 0 369098752 0 +( 2096 2840 -256 ) ( 2104 2832 -256 ) ( 2100 2836 -240 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +( 2136 2624 -256 ) ( 2096 2584 -256 ) ( 2116 2604 -240 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 686 +{ +( 2096 2192 -224 ) ( 2120 2216 -240 ) ( 2120 2736 -240 ) subway/1_tile 33 62 90 0.500000 0.500000 0 318767104 904 +( 2136 2704 -224 ) ( 2136 2704 -240 ) ( 2136 2520 -240 ) subway/1_tile_big_green -16 15 -180 0.500000 -0.500000 0 369098752 0 +( 2136 2232 -224 ) ( 2096 2208 -224 ) ( 2096 2736 -224 ) subway/1_tile_big_green -14 11 -180 0.500000 0.500000 0 369098752 0 +( 2136 2736 -240 ) ( 2120 2736 -240 ) ( 2120 2216 -240 ) subway/1_tile_big_green -14 11 -180 0.500000 0.500000 0 369098752 0 +( 2096 2840 -240 ) ( 2104 2832 -240 ) ( 2100 2836 -224 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +( 2136 2624 -240 ) ( 2096 2584 -240 ) ( 2116 2604 -224 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 687 +{ +( 2136 2352 -264 ) ( 2136 2672 -264 ) ( 2128 2664 -264 ) subway/1_tile_top -14 13 90 0.500000 0.500000 0 318767104 0 +( 2224 2744 -256 ) ( 2224 2720 -256 ) ( 2200 2720 -256 ) subway/1_tile_top -14 13 90 0.500000 0.500000 0 318767104 0 +( 2128 2432 -336 ) ( 2128 2760 -336 ) ( 2128 2760 -256 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 904 +( 2136 2704 -256 ) ( 2136 2704 -264 ) ( 2136 2520 -264 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2096 2840 -264 ) ( 2104 2832 -264 ) ( 2100 2836 -256 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2136 2624 -264 ) ( 2096 2584 -264 ) ( 2116 2604 -256 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 688 +{ +( 2136 2352 -320 ) ( 2136 2672 -320 ) ( 2128 2664 -320 ) subway/1_tile_big 1 14 90 0.500000 0.500000 0 318767104 0 +( 2224 2736 -264 ) ( 2224 2712 -264 ) ( 2200 2712 -264 ) subway/1_tile_big 1 14 90 0.500000 0.500000 0 318767104 0 +( 2128 2432 -336 ) ( 2128 2760 -336 ) ( 2128 2760 -256 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 904 +( 2136 2704 -264 ) ( 2136 2704 -320 ) ( 2136 2520 -320 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 2096 2840 -320 ) ( 2104 2832 -320 ) ( 2100 2836 -264 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 2136 2624 -320 ) ( 2096 2584 -320 ) ( 2116 2604 -264 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 689 +{ +( 2136 2360 -336 ) ( 2136 2680 -336 ) ( 2128 2672 -336 ) subway/1_tile_bottom -14 31 90 0.500000 0.500000 0 318767104 0 +( 2224 2736 -320 ) ( 2224 2712 -320 ) ( 2200 2712 -320 ) subway/1_tile_bottom -14 31 90 0.500000 0.500000 0 318767104 0 +( 2128 2432 -352 ) ( 2128 2760 -352 ) ( 2128 2760 -272 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 904 +( 2136 2704 -320 ) ( 2136 2704 -336 ) ( 2136 2520 -336 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 0 318767104 0 +( 2096 2840 -336 ) ( 2104 2832 -336 ) ( 2100 2836 -320 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 0 318767104 0 +( 2136 2624 -336 ) ( 2096 2584 -336 ) ( 2116 2604 -320 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 690 +{ +( 1992 2616 -256 ) ( 1984 2608 -240 ) ( 2504 2608 -240 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 904 +( 2216 2624 -256 ) ( 2400 2624 -256 ) ( 2400 2624 -240 ) subway/1_tile_big_green -16 15 -180 0.500000 -0.500000 0 369098752 0 +( 2160 2552 -256 ) ( 2160 2528 -256 ) ( 2184 2528 -256 ) subway/1_tile_big_green -29 13 90 0.500000 0.500000 0 369098752 0 +( 2432 2608 -240 ) ( 1908 2608 -240 ) ( 1928 2624 -240 ) subway/1_tile_big_green -29 13 90 0.500000 0.500000 0 369098752 0 +( 2116 2604 -240 ) ( 2096 2584 -256 ) ( 2136 2624 -256 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 2320 2624 -256 ) ( 2320 2584 -256 ) ( 2320 2604 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 691 +{ +( 2432 2608 -240 ) ( 1912 2608 -240 ) ( 1888 2584 -224 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 904 +( 2216 2624 -240 ) ( 2400 2624 -240 ) ( 2400 2624 -224 ) subway/1_tile_big_green -16 15 -180 0.500000 -0.500000 0 369098752 0 +( 2432 2584 -224 ) ( 1904 2584 -224 ) ( 1928 2624 -224 ) subway/1_tile_big_green -29 13 90 0.500000 0.500000 0 369098752 0 +( 1912 2608 -240 ) ( 2432 2608 -240 ) ( 2432 2624 -240 ) subway/1_tile_big_green -29 13 90 0.500000 0.500000 0 369098752 0 +( 2116 2604 -224 ) ( 2096 2584 -240 ) ( 2136 2624 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 2320 2624 -240 ) ( 2320 2584 -240 ) ( 2320 2604 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 692 +{ +( 2360 2616 -264 ) ( 2368 2624 -264 ) ( 2048 2624 -264 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2416 2688 -256 ) ( 2416 2712 -256 ) ( 2440 2712 -256 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2248 2616 -256 ) ( 2248 2616 -336 ) ( 1920 2616 -336 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 904 +( 2216 2624 -264 ) ( 2400 2624 -264 ) ( 2400 2624 -256 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2116 2604 -256 ) ( 2096 2584 -264 ) ( 2136 2624 -264 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2320 2624 -264 ) ( 2320 2584 -264 ) ( 2320 2604 -256 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 693 +{ +( 2360 2616 -320 ) ( 2368 2624 -320 ) ( 2048 2624 -320 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 2408 2688 -264 ) ( 2408 2712 -264 ) ( 2432 2712 -264 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 2248 2616 -256 ) ( 2248 2616 -336 ) ( 1920 2616 -336 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 904 +( 2216 2624 -320 ) ( 2400 2624 -320 ) ( 2400 2624 -264 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 2116 2604 -264 ) ( 2096 2584 -320 ) ( 2136 2624 -320 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 2320 2624 -320 ) ( 2320 2584 -320 ) ( 2320 2604 -264 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 694 +{ +( 2368 2616 -336 ) ( 2376 2624 -336 ) ( 2056 2624 -336 ) subway/1_tile_bottom 16 16 0 0.500000 0.500000 0 318767104 0 +( 2408 2688 -320 ) ( 2408 2712 -320 ) ( 2432 2712 -320 ) subway/1_tile_bottom 16 16 0 0.500000 0.500000 0 318767104 0 +( 2248 2616 -272 ) ( 2248 2616 -352 ) ( 1920 2616 -352 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 904 +( 2216 2624 -336 ) ( 2400 2624 -336 ) ( 2400 2624 -320 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 0 318767104 0 +( 2116 2604 -320 ) ( 2096 2584 -336 ) ( 2136 2624 -336 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 0 318767104 0 +( 2320 2624 -336 ) ( 2320 2584 -336 ) ( 2320 2604 -320 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 695 +{ +( 1368 2608 -240 ) ( 1888 2608 -240 ) ( 1880 2616 -256 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 904 +( 1696 2624 -240 ) ( 1696 2624 -256 ) ( 1880 2624 -256 ) subway/1_tile_big_green 16 15 -180 0.500000 -0.500000 0 369098752 0 +( 1912 2528 -256 ) ( 1936 2528 -256 ) ( 1936 2552 -256 ) subway/1_tile_big_green -31 14 90 0.500000 0.500000 0 369098752 0 +( 2168 2624 -240 ) ( 2188 2608 -240 ) ( 1664 2608 -240 ) subway/1_tile_big_green -31 14 90 0.500000 0.500000 0 369098752 0 +( 1680 2624 -256 ) ( 1680 2624 -240 ) ( 1696 2608 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1872 2616 -256 ) ( 1912 2576 -256 ) ( 1892 2596 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 696 +{ +( 2208 2584 -224 ) ( 2184 2608 -240 ) ( 1664 2608 -240 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 904 +( 1696 2624 -224 ) ( 1696 2624 -240 ) ( 1880 2624 -240 ) subway/1_tile_big_green 16 15 -180 0.500000 -0.500000 0 369098752 0 +( 2168 2624 -224 ) ( 2192 2584 -224 ) ( 1664 2584 -224 ) subway/1_tile_big_green -31 14 90 0.500000 0.500000 0 369098752 0 +( 1664 2624 -240 ) ( 1664 2608 -240 ) ( 2184 2608 -240 ) subway/1_tile_big_green -31 14 90 0.500000 0.500000 0 369098752 0 +( 1688 2616 -240 ) ( 1680 2624 -240 ) ( 1684 2620 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1872 2616 -240 ) ( 1912 2576 -240 ) ( 1892 2596 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 697 +{ +( 2048 2624 -264 ) ( 1728 2624 -264 ) ( 1736 2616 -264 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1656 2712 -256 ) ( 1680 2712 -256 ) ( 1680 2688 -256 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1680 2624 -264 ) ( 1680 2624 -256 ) ( 1688 2616 -256 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1952 2616 -336 ) ( 1624 2616 -336 ) ( 1624 2616 -256 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 904 +( 1696 2624 -256 ) ( 1696 2624 -264 ) ( 1880 2624 -264 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2616 -264 ) ( 1912 2576 -264 ) ( 1892 2596 -256 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 698 +{ +( 2048 2624 -320 ) ( 1728 2624 -320 ) ( 1736 2616 -320 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1664 2712 -264 ) ( 1688 2712 -264 ) ( 1688 2688 -264 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1680 2624 -320 ) ( 1680 2624 -264 ) ( 1688 2616 -264 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 1952 2616 -336 ) ( 1624 2616 -336 ) ( 1624 2616 -256 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 904 +( 1696 2624 -264 ) ( 1696 2624 -320 ) ( 1880 2624 -320 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 1864 2624 -320 ) ( 1904 2584 -320 ) ( 1884 2604 -264 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 699 +{ +( 2040 2624 -336 ) ( 1720 2624 -336 ) ( 1728 2616 -336 ) subway/1_tile_bottom -16 16 0 0.500000 0.500000 0 318767104 0 +( 1664 2712 -320 ) ( 1688 2712 -320 ) ( 1688 2688 -320 ) subway/1_tile_bottom -16 16 0 0.500000 0.500000 0 318767104 0 +( 1680 2624 -336 ) ( 1680 2624 -320 ) ( 1688 2616 -320 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1952 2616 -352 ) ( 1624 2616 -352 ) ( 1624 2616 -272 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 904 +( 1696 2624 -320 ) ( 1696 2624 -336 ) ( 1880 2624 -336 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 0 318767104 0 +( 1864 2624 -336 ) ( 1904 2584 -336 ) ( 1884 2604 -320 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 700 +{ +( 1904 3144 -224 ) ( 1880 3120 -240 ) ( 1880 2600 -240 ) subway/1_tile -47 -32 -90 0.500000 0.500000 0 318767104 904 +( 1864 2632 -224 ) ( 1864 2632 -240 ) ( 1864 2816 -240 ) subway/1_tile_big_green 0 15 0 0.500000 0.500000 0 369098752 0 +( 1864 3104 -224 ) ( 1904 3128 -224 ) ( 1904 2600 -224 ) subway/1_tile_big_green 18 -3 0 0.500000 0.500000 0 369098752 0 +( 1864 2600 -240 ) ( 1880 2600 -240 ) ( 1880 3120 -240 ) subway/1_tile_big_green 18 -3 0 0.500000 0.500000 0 369098752 0 +( 1904 2584 -240 ) ( 1896 2592 -240 ) ( 1900 2588 -224 ) subway/1_tile_big_green 16 0 0 0.500000 0.500000 0 369098752 0 +( 1856 2952 -240 ) ( 1896 2912 -240 ) ( 1876 2932 -224 ) subway/1_tile_big_green 16 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 701 +{ +( 1864 2976 -336 ) ( 1864 2656 -336 ) ( 1872 2664 -336 ) subway/1_tile_bottom 1 -31 -90 0.500000 0.500000 0 318767104 0 +( 1776 2600 -320 ) ( 1776 2624 -320 ) ( 1800 2624 -320 ) subway/1_tile_bottom 1 -31 -90 0.500000 0.500000 0 318767104 0 +( 1872 3016 -352 ) ( 1872 2688 -352 ) ( 1872 2688 -272 ) subway/1_tile_bottom -16 0 -180 0.500000 -0.500000 0 318767104 904 +( 1864 2688 -320 ) ( 1864 2688 -336 ) ( 1864 2872 -336 ) subway/1_tile_bottom 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 1904 2584 -336 ) ( 1896 2592 -336 ) ( 1900 2588 -320 ) subway/1_tile_bottom 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 1864 2944 -336 ) ( 1904 2904 -336 ) ( 1884 2924 -320 ) subway/1_tile_bottom 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 702 +{ +( 1864 2984 -320 ) ( 1864 2664 -320 ) ( 1872 2672 -320 ) subway/1_tile_big -14 -15 -90 0.500000 0.500000 0 318767104 0 +( 1776 2600 -264 ) ( 1776 2624 -264 ) ( 1800 2624 -264 ) subway/1_tile_big -14 -15 -90 0.500000 0.500000 0 318767104 0 +( 1872 3016 -336 ) ( 1872 2688 -336 ) ( 1872 2688 -256 ) subway/1_tile 16 16 -180 0.500000 -0.500000 0 318767104 904 +( 1864 2632 -264 ) ( 1864 2632 -320 ) ( 1864 2816 -320 ) subway/1_tile_big 0 16 -180 0.500000 -0.500000 0 318767104 0 +( 1904 2584 -320 ) ( 1896 2592 -320 ) ( 1900 2588 -264 ) subway/1_tile_big 0 16 -180 0.500000 -0.500000 0 318767104 0 +( 1864 2944 -320 ) ( 1904 2904 -320 ) ( 1884 2924 -264 ) subway/1_tile_big 0 16 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 703 +{ +( 1864 2984 -264 ) ( 1864 2664 -264 ) ( 1872 2672 -264 ) subway/1_tile_top 1 -15 -90 0.500000 0.500000 0 318767104 0 +( 1776 2592 -256 ) ( 1776 2616 -256 ) ( 1800 2616 -256 ) subway/1_tile_top 1 -15 -90 0.500000 0.500000 0 318767104 0 +( 1872 3008 -336 ) ( 1872 2680 -336 ) ( 1872 2680 -256 ) subway/1_tile_top -16 0 -180 0.500000 -0.500000 0 318767104 904 +( 1864 2704 -256 ) ( 1864 2704 -264 ) ( 1864 2888 -264 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 1904 2584 -264 ) ( 1896 2592 -264 ) ( 1900 2588 -256 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 1864 2944 -264 ) ( 1904 2904 -264 ) ( 1884 2924 -256 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 704 +{ +( 1880 2328 -240 ) ( 1880 2848 -240 ) ( 1872 2840 -256 ) subway/1_tile 16 16 -180 0.500000 -0.500000 0 318767104 904 +( 1864 2632 -240 ) ( 1864 2632 -256 ) ( 1864 2816 -256 ) subway/1_tile_big_green 0 15 0 0.500000 0.500000 0 369098752 0 +( 1960 2848 -256 ) ( 1960 2872 -256 ) ( 1936 2872 -256 ) subway/1_tile_big_green 18 -3 0 0.500000 0.500000 0 369098752 0 +( 1864 3104 -240 ) ( 1880 3124 -240 ) ( 1880 2600 -240 ) subway/1_tile_big_green 18 -3 0 0.500000 0.500000 0 369098752 0 +( 1904 2584 -256 ) ( 1896 2592 -256 ) ( 1900 2588 -240 ) subway/1_tile_big_green 16 0 0 0.500000 0.500000 0 369098752 0 +( 1864 2944 -256 ) ( 1904 2904 -256 ) ( 1884 2924 -240 ) subway/1_tile_big_green 16 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 705 +{ +( 1744 2928 -240 ) ( 2264 2928 -240 ) ( 2256 2936 -256 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 904 +( 2008 2944 -240 ) ( 2008 2944 -256 ) ( 2192 2944 -256 ) subway/1_tile_big_green 0 15 -180 0.500000 -0.500000 0 369098752 0 +( 2224 2848 -256 ) ( 2248 2848 -256 ) ( 2248 2872 -256 ) subway/1_tile_big_green 2 28 90 0.500000 0.500000 0 369098752 0 +( 2480 2944 -240 ) ( 2500 2928 -240 ) ( 1976 2928 -240 ) subway/1_tile_big_green 2 28 90 0.500000 0.500000 0 369098752 0 +( 2384 2932 -240 ) ( 2384 2944 -256 ) ( 2384 2920 -256 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1864 2944 -256 ) ( 1864 2944 -240 ) ( 1880 2928 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 706 +{ +( 2360 2944 -264 ) ( 2040 2944 -264 ) ( 2048 2936 -264 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1968 3032 -256 ) ( 1992 3032 -256 ) ( 1992 3008 -256 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1864 2944 -264 ) ( 1864 2944 -256 ) ( 1872 2936 -256 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2464 2936 -336 ) ( 2136 2936 -336 ) ( 2136 2936 -256 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 904 +( 2384 3000 -352 ) ( 2384 3024 -352 ) ( 2384 3024 -400 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2008 2944 -256 ) ( 2008 2944 -264 ) ( 2192 2944 -264 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 707 +{ +( 2360 2944 -320 ) ( 2040 2944 -320 ) ( 2048 2936 -320 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +( 1976 3032 -264 ) ( 2000 3032 -264 ) ( 2000 3008 -264 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +( 1864 2944 -320 ) ( 1864 2944 -264 ) ( 1872 2936 -264 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 2464 2936 -336 ) ( 2136 2936 -336 ) ( 2136 2936 -256 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 904 +( 2384 3000 -352 ) ( 2384 3024 -352 ) ( 2384 3024 -400 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 2008 2944 -264 ) ( 2008 2944 -320 ) ( 2192 2944 -320 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 708 +{ +( 2352 2944 -336 ) ( 2032 2944 -336 ) ( 2040 2936 -336 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1976 3032 -320 ) ( 2000 3032 -320 ) ( 2000 3008 -320 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1864 2944 -336 ) ( 1864 2944 -320 ) ( 1872 2936 -320 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2464 2936 -352 ) ( 2136 2936 -352 ) ( 2136 2936 -272 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 0 318767104 904 +( 2384 3000 -368 ) ( 2384 3024 -368 ) ( 2384 3024 -416 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2008 2944 -320 ) ( 2008 2944 -336 ) ( 2192 2944 -336 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 709 +{ +( 2520 2904 -224 ) ( 2496 2928 -240 ) ( 1976 2928 -240 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 904 +( 2008 2944 -224 ) ( 2008 2944 -240 ) ( 2192 2944 -240 ) subway/1_tile_big_green 0 15 -180 0.500000 -0.500000 0 369098752 0 +( 2480 2944 -224 ) ( 2504 2904 -224 ) ( 1976 2904 -224 ) subway/1_tile_big_green 2 28 90 0.500000 0.500000 0 369098752 0 +( 1976 2944 -240 ) ( 1976 2928 -240 ) ( 2496 2928 -240 ) subway/1_tile_big_green 2 28 90 0.500000 0.500000 0 369098752 0 +( 2384 2920 -224 ) ( 2384 2944 -240 ) ( 2384 2896 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1872 2936 -240 ) ( 1864 2944 -240 ) ( 1868 2940 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 710 +{ +( 1784 2808 -344 ) ( 2256 2808 -344 ) ( 2256 2968 -344 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1656 3416 -336 ) ( 1664 3416 -336 ) ( 1664 3032 -336 ) subway/1_concrete_floor 96 -16 0 0.500000 0.500000 0 285212672 0 +( 1864 3276 -456 ) ( 1864 2892 -456 ) ( 1864 2892 -488 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2256 2808 -344 ) ( 1784 2808 -344 ) ( 1784 2808 -336 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1680 2936 -456 ) ( 1672 2936 -456 ) ( 1672 2936 -488 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2384 2968 -344 ) ( 2384 2944 -344 ) ( 2384 2956 -336 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 711 +{ +( 1784 2616 -344 ) ( 2256 2616 -344 ) ( 2256 2776 -344 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1656 3224 -336 ) ( 1664 3224 -336 ) ( 1664 2840 -336 ) subway/1_concrete_floor 96 -16 0 0.500000 0.500000 0 285212672 0 +( 1864 3084 -456 ) ( 1864 2700 -456 ) ( 1864 2700 -488 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2256 2616 -344 ) ( 1784 2616 -344 ) ( 1784 2616 -336 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1680 2808 -456 ) ( 1672 2808 -456 ) ( 1672 2808 -488 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2128 2776 -344 ) ( 2128 2752 -344 ) ( 2128 2764 -336 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 712 +{ +( 1048 912 -88 ) ( 1112 912 -88 ) ( 1112 976 -88 ) subway/1_concrete_floor -16 17 0 0.500000 0.500000 0 285212672 0 +( 1112 992 -80 ) ( 1112 928 -80 ) ( 1048 928 -80 ) subway/1_concrete_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 936 1128 -120 ) ( 936 1128 -112 ) ( 936 1064 -112 ) subway/1_concrete_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1096 592 -112 ) ( 1096 592 -104 ) ( 1096 656 -104 ) subway/1_concrete_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1136 696 -112 ) ( 1136 696 -104 ) ( 1200 696 -104 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 896 1192 -88 ) ( 960 1192 -88 ) ( 928 1192 -80 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 713 +{ +( -484 1752 -18 ) ( -484 1752 -74 ) ( -452 1752 -74 ) subway/sign9 0 64 0 0.500000 0.500000 134217728 0 0 +( -516 1750 -74 ) ( -516 1750 -18 ) ( -484 1750 -18 ) subway/sign9 8 56 0 0.500000 0.500000 134217728 0 0 +( -468 1752 -18 ) ( -468 1752 -74 ) ( -468 1744 -74 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +( -500 1744 -90 ) ( -500 1752 -90 ) ( -500 1752 -34 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +( -473 1754 -48 ) ( -473 1746 -48 ) ( -442 1754 -40 ) subway/sign9 -76 208 0 0.500000 0.500000 134217728 0 0 +( -510 1750 -36 ) ( -518 1750 -36 ) ( -514 1752 -36 ) subway/sign9 -76 208 0 0.500000 0.500000 134217728 0 0 +} +// brush 714 +{ +( -484 1752 -18 ) ( -484 1752 -74 ) ( -452 1752 -74 ) subway/sign9 0 64 0 0.500000 0.500000 134217728 0 0 +( -516 1750 -74 ) ( -516 1750 -18 ) ( -484 1750 -18 ) subway/sign9 8 56 0 0.500000 0.500000 134217728 0 0 +( -500 1752 -90 ) ( -500 1744 -90 ) ( -500 1752 -34 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +( -493 1744 -95 ) ( -493 1752 -95 ) ( -508 1752 -41 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +( -473 1754 -48 ) ( -473 1746 -48 ) ( -442 1754 -40 ) subway/sign9 0 284 0 0.500000 0.500000 134217728 0 0 +( -510 1750 -36 ) ( -518 1750 -36 ) ( -514 1752 -36 ) subway/sign9 0 284 0 0.500000 0.500000 134217728 0 0 +} +// brush 715 +{ +( -484 1754 -66 ) ( -484 1746 -66 ) ( -452 1746 -66 ) subway/sign9 -76 208 0 0.500000 0.500000 134217728 0 0 +( -484 1752 -18 ) ( -484 1752 -74 ) ( -452 1752 -74 ) subway/sign9 0 64 0 0.500000 0.500000 134217728 0 0 +( -516 1750 -74 ) ( -516 1750 -18 ) ( -484 1750 -18 ) subway/sign9 8 56 0 0.500000 0.500000 134217728 0 0 +( -516 1744 -74 ) ( -516 1752 -74 ) ( -516 1752 -18 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +( -493 1752 -95 ) ( -493 1744 -95 ) ( -508 1752 -41 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +( -510 1750 -36 ) ( -518 1750 -36 ) ( -514 1752 -36 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +} +// brush 716 +{ +( -452 1752 -18 ) ( -452 1752 -74 ) ( -420 1752 -74 ) subway/sign9 -64 64 0 0.500000 0.500000 134217728 0 0 +( -484 1750 -74 ) ( -484 1750 -18 ) ( -452 1750 -18 ) subway/sign9 8 56 0 0.500000 0.500000 134217728 0 0 +( -452 1752 -18 ) ( -452 1752 -74 ) ( -452 1744 -74 ) subway/sign9 -224 140 0 0.500000 0.500000 134217728 0 0 +( -468 1752 -58 ) ( -468 1752 -2 ) ( -468 1744 -58 ) subway/sign9 -224 140 0 0.500000 0.500000 134217728 0 0 +( -473 1754 -48 ) ( -473 1746 -48 ) ( -442 1754 -40 ) subway/sign9 -64 284 0 0.500000 0.500000 134217728 0 0 +( -510 1750 -36 ) ( -518 1750 -36 ) ( -514 1752 -36 ) subway/sign9 -64 284 0 0.500000 0.500000 134217728 0 0 +} +// brush 717 +{ +( -450 1748 -100 ) ( -452 1748 -98 ) ( -452 1754 -98 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -524 1752 -106 ) ( -520 1752 -102 ) ( -520 1744 -102 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -470 1748 -174 ) ( -550 1748 -174 ) ( -550 1748 -102 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -452 1744 -100 ) ( -532 1744 -100 ) ( -532 1736 -100 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -448 1752 -98 ) ( -528 1752 -98 ) ( -528 1752 -170 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -510 1754 -98 ) ( -478 1754 -98 ) ( -478 1748 -98 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 718 +{ +( -452 1754 -98 ) ( -452 1748 -98 ) ( -450 1748 -100 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -448 1744 -32 ) ( -448 1752 -32 ) ( -444 1752 -28 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -448 1748 0 ) ( -376 1748 0 ) ( -376 1748 -80 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -450 1736 -18 ) ( -450 1744 -18 ) ( -450 1744 -98 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -380 1752 -22 ) ( -452 1752 -22 ) ( -452 1752 -102 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -452 1748 -74 ) ( -452 1754 -74 ) ( -452 1754 -42 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 719 +{ +( -478 1748 -36 ) ( -478 1754 -36 ) ( -510 1754 -36 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -528 1752 36 ) ( -528 1752 -36 ) ( -448 1752 -36 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -532 1736 -34 ) ( -532 1744 -34 ) ( -452 1744 -34 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -550 1748 -32 ) ( -550 1748 40 ) ( -470 1748 40 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -520 1744 -32 ) ( -520 1752 -32 ) ( -524 1752 -28 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -452 1754 -36 ) ( -452 1748 -36 ) ( -450 1748 -34 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 720 +{ +( -516 1754 -40 ) ( -516 1754 -72 ) ( -516 1748 -72 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -516 1752 -102 ) ( -516 1752 -22 ) ( -588 1752 -22 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -518 1744 -98 ) ( -518 1744 -18 ) ( -518 1736 -18 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -592 1748 -80 ) ( -592 1748 0 ) ( -520 1748 0 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -524 1752 -28 ) ( -520 1752 -32 ) ( -520 1744 -32 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -518 1748 -100 ) ( -516 1748 -98 ) ( -516 1754 -98 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 721 +{ +( -500 1752 -90 ) ( -500 1744 -90 ) ( -500 1752 -34 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +( -516 1752 -98 ) ( -516 1744 -98 ) ( -484 1744 -98 ) subway/sign9 -76 208 0 0.500000 0.500000 134217728 0 0 +( -484 1752 -50 ) ( -484 1752 -106 ) ( -452 1752 -106 ) subway/sign9 0 64 0 0.500000 0.500000 134217728 0 0 +( -484 1746 -66 ) ( -484 1754 -66 ) ( -452 1754 -66 ) subway/sign9 -76 208 0 0.500000 0.500000 134217728 0 0 +( -516 1750 -106 ) ( -516 1750 -50 ) ( -484 1750 -50 ) subway/sign9 8 56 0 0.500000 0.500000 134217728 0 0 +( -516 1744 -106 ) ( -516 1752 -106 ) ( -516 1752 -50 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +( -493 1752 -95 ) ( -493 1744 -95 ) ( -508 1752 -41 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +} +// brush 722 +{ +( -516 1750 -106 ) ( -516 1750 -50 ) ( -484 1750 -50 ) subway/sign9 8 56 0 0.500000 0.500000 134217728 0 0 +( -484 1752 -50 ) ( -484 1752 -106 ) ( -452 1752 -106 ) subway/sign9 0 64 0 0.500000 0.500000 134217728 0 0 +( -516 1752 -98 ) ( -516 1744 -98 ) ( -484 1744 -98 ) subway/sign9 -76 208 0 0.500000 0.500000 134217728 0 0 +( -500 1744 -86 ) ( -500 1752 -86 ) ( -500 1752 -30 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +( -493 1752 -95 ) ( -493 1744 -95 ) ( -508 1752 -41 ) subway/sign9 -236 64 0 0.500000 0.500000 134217728 0 0 +} +// brush 723 +{ +( -468 1752 -50 ) ( -468 1752 -106 ) ( -468 1744 -106 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +( -516 1750 -106 ) ( -516 1750 -50 ) ( -484 1750 -50 ) subway/sign9 8 56 0 0.500000 0.500000 134217728 0 0 +( -484 1752 -50 ) ( -484 1752 -106 ) ( -452 1752 -106 ) subway/sign9 0 64 0 0.500000 0.500000 134217728 0 0 +( -516 1752 -98 ) ( -516 1744 -98 ) ( -484 1744 -98 ) subway/sign9 -76 208 0 0.500000 0.500000 134217728 0 0 +( -493 1744 -95 ) ( -493 1752 -95 ) ( -508 1752 -41 ) subway/sign9 -236 64 0 0.500000 0.500000 134217728 0 0 +( -495 1744 -88 ) ( -495 1752 -88 ) ( -464 1744 -79 ) subway/sign9 -76 208 0 0.500000 0.500000 134217728 0 0 +} +// brush 724 +{ +( -452 1752 -50 ) ( -452 1752 -106 ) ( -452 1744 -106 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +( -484 1750 -106 ) ( -484 1750 -50 ) ( -452 1750 -50 ) subway/sign9 8 56 0 0.500000 0.500000 134217728 0 0 +( -452 1746 -66 ) ( -452 1754 -66 ) ( -420 1754 -66 ) subway/sign9 -76 208 0 0.500000 0.500000 134217728 0 0 +( -452 1752 -50 ) ( -452 1752 -106 ) ( -420 1752 -106 ) subway/sign9 0 64 0 0.500000 0.500000 134217728 0 0 +( -495 1752 -88 ) ( -495 1744 -88 ) ( -464 1744 -79 ) subway/sign9 -76 208 0 0.500000 0.500000 134217728 0 0 +( -466 1744 -72 ) ( -466 1752 -72 ) ( -481 1752 -17 ) subway/sign9 -236 64 0 0.500000 0.500000 134217728 0 0 +} +// brush 725 +{ +( -468 1752 -90 ) ( -468 1752 -34 ) ( -468 1744 -90 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +( -452 1752 -50 ) ( -452 1752 -106 ) ( -452 1744 -106 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +( -484 1750 -106 ) ( -484 1750 -50 ) ( -452 1750 -50 ) subway/sign9 8 56 0 0.500000 0.500000 134217728 0 0 +( -452 1752 -50 ) ( -452 1752 -106 ) ( -420 1752 -106 ) subway/sign9 0 64 0 0.500000 0.500000 134217728 0 0 +( -484 1752 -98 ) ( -484 1744 -98 ) ( -452 1744 -98 ) subway/sign9 -76 208 0 0.500000 0.500000 134217728 0 0 +( -495 1744 -88 ) ( -495 1752 -88 ) ( -464 1744 -79 ) subway/sign9 -76 208 0 0.500000 0.500000 134217728 0 0 +} +// brush 726 +{ +( -484 1752 -18 ) ( -484 1752 -74 ) ( -452 1752 -74 ) subway/sign9 0 64 0 0.500000 0.500000 134217728 0 0 +( -516 1750 -74 ) ( -516 1750 -18 ) ( -484 1750 -18 ) subway/sign9 8 56 0 0.500000 0.500000 134217728 0 0 +( -468 1752 -18 ) ( -468 1752 -74 ) ( -468 1744 -74 ) subway/sign9 -160 140 0 0.500000 0.500000 134217728 0 0 +( -473 1746 -48 ) ( -473 1754 -48 ) ( -442 1754 -40 ) subway/sign9 -76 208 0 0.500000 0.500000 134217728 0 0 +( -466 1744 -72 ) ( -466 1752 -72 ) ( -481 1752 -17 ) subway/sign9 -236 64 0 0.500000 0.500000 134217728 0 0 +} +// brush 727 +{ +( -484 1752 -66 ) ( -484 1744 -66 ) ( -452 1744 -66 ) subway/sign9 -76 208 0 0.500000 0.500000 134217728 0 0 +( -452 1752 -18 ) ( -452 1752 -74 ) ( -420 1752 -74 ) subway/sign9 -64 64 0 0.500000 0.500000 134217728 0 0 +( -484 1750 -74 ) ( -484 1750 -18 ) ( -452 1750 -18 ) subway/sign9 8 56 0 0.500000 0.500000 134217728 0 0 +( -452 1752 -18 ) ( -452 1752 -74 ) ( -452 1744 -74 ) subway/sign9 -224 140 0 0.500000 0.500000 134217728 0 0 +( -468 1752 -58 ) ( -468 1752 -2 ) ( -468 1744 -58 ) subway/sign9 -224 140 0 0.500000 0.500000 134217728 0 0 +( -473 1746 -48 ) ( -473 1754 -48 ) ( -442 1754 -40 ) subway/sign9 -64 284 0 0.500000 0.500000 134217728 0 0 +( -466 1744 -72 ) ( -466 1752 -72 ) ( -481 1752 -17 ) subway/sign9 -224 140 0 0.500000 0.500000 134217728 0 0 +} +// brush 728 +{ +( -493 1744 -95 ) ( -493 1752 -95 ) ( -508 1752 -41 ) subway/sign9 -188 140 0 0.500000 0.500000 134217728 0 0 +( -493 1750 -95 ) ( -508 1750 -41 ) ( -477 1750 -33 ) subway/sign9 36 124 17 0.500000 0.500000 134217728 0 0 +( -473 1746 -48 ) ( -473 1754 -48 ) ( -442 1754 -40 ) subway/sign9 -44 208 0 0.500000 0.500000 134217728 0 0 +( -477 1752 -33 ) ( -462 1752 -87 ) ( -431 1752 -79 ) subway/sign9 -28 32 0 0.500000 0.500000 134217728 0 0 +( -495 1752 -88 ) ( -495 1744 -88 ) ( -464 1744 -79 ) subway/sign9 -44 208 0 0.500000 0.500000 134217728 0 0 +( -466 1752 -72 ) ( -466 1744 -72 ) ( -481 1752 -17 ) subway/sign9 -188 140 0 0.500000 0.500000 134217728 0 0 +} +// brush 729 +{ +( 1896 2184 -464 ) ( 1872 2184 -464 ) ( 1872 2160 -464 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1872 2160 -400 ) ( 1872 2184 -400 ) ( 1896 2184 -400 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1872 2248 -376 ) ( 1896 2248 -376 ) ( 1896 2248 -424 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2280 -376 ) ( 1912 2280 -424 ) ( 1912 2096 -424 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2256 -432 ) ( 1888 2256 -384 ) ( 1880 2256 -384 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2280 -424 ) ( 1880 2280 -376 ) ( 1880 2224 -376 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 730 +{ +( 928 -8 -152 ) ( 992 -8 -152 ) ( 992 56 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1120 240 -120 ) ( 1040 240 -120 ) ( 1040 248 -120 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 1056 248 -120 ) ( 1056 248 -152 ) ( 1192 248 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1320 -368 -152 ) ( 1320 -368 -144 ) ( 1320 -304 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 240 -120 ) ( 1288 240 -120 ) ( 1288 240 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 216 -152 ) ( 1208 264 -152 ) ( 1208 240 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 731 +{ +( 928 -8 -152 ) ( 992 -8 -152 ) ( 992 56 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1120 240 -120 ) ( 1040 240 -120 ) ( 1040 248 -120 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 1056 248 -152 ) ( 1056 248 -120 ) ( 1048 240 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 248 -120 ) ( 1056 248 -152 ) ( 1192 248 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 240 -120 ) ( 1288 240 -120 ) ( 1288 240 -152 ) subway/1_lobby2 8 16 0 0.500000 0.500000 0 285212672 0 +( 1208 264 -152 ) ( 1208 216 -152 ) ( 1208 240 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 732 +{ +( 0 -800 -288 ) ( -80 -800 -288 ) ( -80 -896 -288 ) subway/1_concrete_floor 0 0 0 1 1 0 335544320 0 +( -80 -896 -280 ) ( -80 -800 -280 ) ( 0 -800 -280 ) subway/1_concrete_floor 0 0 0 1 1 0 335544320 0 +( -80 -888 -280 ) ( 0 -888 -280 ) ( 0 -888 -288 ) subway/1_concrete_floor 0 0 0 1 1 0 335544320 0 +( 0 -896 -280 ) ( 0 -800 -280 ) ( 0 -800 -288 ) subway/1_concrete_floor 0 0 0 1 1 0 335544320 0 +( 0 -808 -280 ) ( -80 -808 -280 ) ( -80 -808 -288 ) subway/1_concrete_floor 0 0 0 1 1 0 335544320 0 +( -80 -800 -280 ) ( -80 -896 -280 ) ( -80 -896 -288 ) subway/1_concrete_floor 0 0 0 1 1 0 335544320 0 +} +// brush 733 +{ +( 1984 -604 -352 ) ( 1960 -604 -352 ) ( 1960 -676 -352 ) subway/light_yellow 0 16 0 0.250000 0.250000 134217792 16777217 30000 +( 1960 -644 -240 ) ( 1984 -644 -240 ) ( 1984 -644 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1976 -676 -240 ) ( 1976 -604 -240 ) ( 1976 -604 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1992 -636 -240 ) ( 1968 -636 -240 ) ( 1968 -636 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1968 -596 -240 ) ( 1968 -668 -240 ) ( 1968 -668 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1976 -644 -336 ) ( 1968 -644 -344 ) ( 1972 -636 -340 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +} +// brush 734 +{ +( 1984 588 -352 ) ( 1960 588 -352 ) ( 1960 516 -352 ) subway/light_yellow 0 16 0 0.250000 0.250000 134217792 16777217 30000 +( 1960 548 -240 ) ( 1984 548 -240 ) ( 1984 548 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1976 516 -240 ) ( 1976 588 -240 ) ( 1976 588 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1992 556 -240 ) ( 1968 556 -240 ) ( 1968 556 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1968 596 -240 ) ( 1968 524 -240 ) ( 1968 524 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1976 548 -336 ) ( 1968 548 -344 ) ( 1972 556 -340 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +} +// brush 735 +{ +( 1704 1532 -352 ) ( 1704 1604 -352 ) ( 1680 1604 -352 ) subway/light_yellow 0 16 0 0.250000 0.250000 134217792 16777217 30000 +( 1680 1564 -400 ) ( 1680 1564 -240 ) ( 1704 1564 -240 ) subway/1_black 0 0 0 1 1 134217792 16777216 0 +( 1688 1604 -400 ) ( 1688 1604 -240 ) ( 1688 1532 -240 ) subway/1_black -8 0 0 1 1 134217792 16777216 0 +( 1696 1572 -400 ) ( 1696 1572 -240 ) ( 1672 1572 -240 ) subway/1_black 0 0 0 1 1 134217792 16777216 0 +( 1696 1540 -400 ) ( 1696 1540 -240 ) ( 1696 1612 -240 ) subway/1_black 0 0 0 1 1 134217792 16777216 0 +( 1692 1572 -340 ) ( 1696 1564 -344 ) ( 1688 1564 -336 ) subway/1_black 0 0 0 1 1 134217792 16777216 0 +} +// brush 736 +{ +( 1072 1636 -392 ) ( 1072 1708 -392 ) ( 1048 1708 -392 ) subway/light_yellow 0 16 0 0.250000 0.250000 134217728 16777217 30000 +( 1056 1492 -440 ) ( 1056 1492 -280 ) ( 1080 1492 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1532 -440 ) ( 1064 1532 -280 ) ( 1064 1460 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1072 1500 -440 ) ( 1072 1500 -280 ) ( 1048 1500 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1072 1468 -440 ) ( 1072 1468 -280 ) ( 1072 1540 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1068 1500 -380 ) ( 1072 1492 -384 ) ( 1064 1492 -376 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 737 +{ +( 1216 1240 -392 ) ( 1192 1240 -392 ) ( 1192 1168 -392 ) subway/light_yellow 0 0 0 0.250000 0.250000 134217728 16777217 30000 +( 1184 1024 -280 ) ( 1208 1024 -280 ) ( 1208 1024 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1200 1024 -384 ) ( 1200 1032 -384 ) ( 1200 1032 -392 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1216 1032 -280 ) ( 1192 1032 -280 ) ( 1192 1032 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1192 1032 -388 ) ( 1192 1024 -388 ) ( 1192 1024 -392 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1200 1032 -384 ) ( 1200 1024 -384 ) ( 1192 1024 -388 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 738 +{ +( 832 -564 -392 ) ( 808 -564 -392 ) ( 808 -636 -392 ) subway/light_yellow 0 -16 0 0.250000 0.250000 134217728 16777217 30000 +( 808 -604 -280 ) ( 832 -604 -280 ) ( 832 -604 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 824 -636 -280 ) ( 824 -564 -280 ) ( 824 -564 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 840 -596 -280 ) ( 816 -596 -280 ) ( 816 -596 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 816 -556 -280 ) ( 816 -628 -280 ) ( 816 -628 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 824 -604 -376 ) ( 816 -604 -384 ) ( 820 -596 -380 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 739 +{ +( 1880 -1988 -280 ) ( 1880 -2028 -280 ) ( 1880 -2028 -504 ) subway/1_tunnelwall -8 0 0 1 1 0 301989888 0 +( 2000 -1912 -280 ) ( 2000 -1872 -280 ) ( 2000 -1872 -504 ) subway/1_tunnelwall -8 0 0 1 1 0 301989888 0 +( 1928 -1912 -280 ) ( 1928 -1872 -280 ) ( 1992 -1872 -280 ) subway/1_tunnelwall -32 8 0 1 1 0 301989888 0 +( 1992 -1872 -288 ) ( 1928 -1872 -288 ) ( 1928 -1912 -288 ) subway/1_tunnel_ceiling2 16 8 0 1 1 0 16777216 0 +( 1904 -1880 -288 ) ( 1936 -1880 -288 ) ( 1920 -1880 -280 ) subway/1_tunnel_ceiling2 16 0 0 1 1 0 16777216 0 +( 2128 -2752 -288 ) ( 1792 -2752 -288 ) ( 1960 -2752 -280 ) subway/1_tunnel_ceiling2 16 0 0 1 1 0 16777216 0 +} +// brush 740 +{ +( -576 1504 92 ) ( -560 1504 92 ) ( -560 1520 92 ) subway/light_yellow 0 0 0 0.500000 0.500000 134217728 1 15000 +( -576 1512 108 ) ( -576 1520 108 ) ( -568 1520 108 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -560 1504 92 ) ( -576 1504 92 ) ( -576 1516 108 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -560 1512 108 ) ( -560 1520 108 ) ( -560 1520 28 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -568 1520 108 ) ( -576 1520 108 ) ( -576 1520 28 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -576 1520 108 ) ( -576 1512 108 ) ( -576 1512 28 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 741 +{ +( -1848 456 144 ) ( -2168 456 144 ) ( -2168 120 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -2168 120 152 ) ( -2168 456 152 ) ( -1848 456 152 ) subway/s_asphalt 0 0 0 0.500000 0.500000 0 301989888 0 +( -2072 448 152 ) ( -2072 112 152 ) ( -2072 112 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -2040 64 152 ) ( -1976 64 152 ) ( -1976 64 136 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -1944 96 152 ) ( -2008 96 152 ) ( -2008 96 136 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -2008 64 152 ) ( -2008 128 152 ) ( -2008 64 136 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +} +// brush 742 +{ +( -1848 456 144 ) ( -2168 456 144 ) ( -2168 120 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -2168 120 152 ) ( -2168 456 152 ) ( -1848 456 152 ) subway/s_asphalt 0 0 0 0.500000 0.500000 0 301989888 0 +( -1832 760 152 ) ( -2152 760 152 ) ( -2152 760 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -2072 448 152 ) ( -2072 112 152 ) ( -2072 112 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -1976 64 152 ) ( -1976 128 152 ) ( -1976 128 136 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -2008 96 152 ) ( -1944 96 152 ) ( -2008 96 136 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +} +// brush 743 +{ +( -1848 456 144 ) ( -2168 456 144 ) ( -2168 120 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -2168 120 152 ) ( -2168 456 152 ) ( -1848 456 152 ) subway/s_asphalt 0 0 0 0.500000 0.500000 0 301989888 0 +( -1912 136 152 ) ( -1912 472 152 ) ( -1912 472 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -1832 760 152 ) ( -2152 760 152 ) ( -2152 760 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -2040 64 152 ) ( -1976 64 152 ) ( -1976 64 136 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -1976 128 152 ) ( -1976 64 152 ) ( -1976 128 136 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +} +// brush 744 +{ +( -1848 456 144 ) ( -2168 456 144 ) ( -2168 120 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -2168 120 152 ) ( -2168 456 152 ) ( -1848 456 152 ) subway/s_asphalt 0 0 0 0.500000 0.500000 0 301989888 0 +( -2160 -456 152 ) ( -1840 -456 152 ) ( -1840 -456 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -1912 136 152 ) ( -1912 472 152 ) ( -1912 472 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -2072 448 152 ) ( -2072 112 152 ) ( -2072 112 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -1976 64 152 ) ( -2040 64 152 ) ( -1976 64 136 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +} +// brush 745 +{ +( -1944 128 136 ) ( -2008 128 136 ) ( -2008 64 136 ) subway/s_asphalt_hole -40 0 0 1 1 0 301989888 0 +( -2008 64 152 ) ( -2008 128 152 ) ( -1944 128 152 ) subway/s_asphalt_hole -16 0 0 0.500000 0.500000 0 301989888 0 +( -2040 64 152 ) ( -1976 64 152 ) ( -1976 64 136 ) subway/s_asphalt_hole -40 -8 0 1 1 0 301989888 0 +( -1976 64 152 ) ( -1976 128 152 ) ( -1976 128 136 ) subway/s_asphalt_hole 0 -8 0 1 1 0 301989888 0 +( -1944 96 152 ) ( -2008 96 152 ) ( -2008 96 136 ) subway/s_asphalt_hole -40 -8 0 1 1 0 301989888 0 +( -2008 128 152 ) ( -2008 64 152 ) ( -2008 64 136 ) subway/s_asphalt_hole 0 -8 0 1 1 0 301989888 0 +} +// brush 746 +{ +( -1352 -368 152 ) ( -1352 -304 152 ) ( -1416 -304 152 ) subway/3_orange_bottom1 22 47 90 1 1 0 0 0 +( -2144 -308 168 ) ( -2144 -372 168 ) ( -2144 -372 160 ) subway/3_orange_bottom1 24 32 0 1 1 0 0 0 +( -1404 -456 168 ) ( -1340 -456 168 ) ( -1340 -456 160 ) subway/3_orange_bottom1 -16 31 -180 1 -1 0 0 0 +( -1352 -440 168 ) ( -1416 -440 168 ) ( -1416 -440 160 ) subway/s_curb 0 80 270 0.500000 0.500000 134217728 285212672 0 +( -1792 -432 168 ) ( -1792 -400 168 ) ( -1792 -432 160 ) subway/3_orange_bottom1 24 32 0 1 1 0 0 0 +( -2064 -456 160 ) ( -2160 -456 160 ) ( -2112 -440 160 ) subway/3_orange_bottom1 22 47 90 1 1 0 0 0 +} +// brush 747 +{ +( -2144 -308 168 ) ( -2144 -372 168 ) ( -2144 -372 160 ) subway/3_orange_bottom1 24 32 0 1 1 0 0 0 +( -1404 -456 168 ) ( -1340 -456 168 ) ( -1340 -456 160 ) subway/3_orange_bottom1 -16 31 -180 1 -1 0 0 0 +( -1352 -440 168 ) ( -1416 -440 168 ) ( -1416 -440 160 ) subway/3_orange_bottom1 0 32 0 1 1 134217728 0 0 +( -1792 -432 168 ) ( -1792 -400 168 ) ( -1792 -432 160 ) subway/3_orange_bottom1 24 32 0 1 1 0 0 0 +( -2136 -440 224 ) ( -2104 -440 224 ) ( -2120 -456 224 ) subway/3_orange_bottom1 22 47 90 1 1 0 0 0 +( -2160 -456 160 ) ( -2064 -456 160 ) ( -2112 -440 160 ) subway/3_orange_bottom1 22 47 90 1 1 0 0 0 +} +// brush 748 +{ +( 1920 2440 -472 ) ( 1536 2440 -472 ) ( 1536 2440 -504 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 2072 1984 -472 ) ( 2072 1992 -472 ) ( 2072 1992 -504 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1628 1792 -480 ) ( 2012 1792 -480 ) ( 2012 1792 -512 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1512 1984 -480 ) ( 1512 1992 -480 ) ( 1896 1992 -480 ) subway/1_concrete_floor 48 16 0 0.500000 0.500000 0 285212672 0 +( 1904 1856 -488 ) ( 1520 1856 -488 ) ( 1520 1848 -488 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 1832 2416 -488 ) ( 1832 2448 -488 ) ( 1832 2432 -480 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 749 +{ +( 1816 1960 -472 ) ( 1816 1952 -472 ) ( 1816 1952 -504 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1920 2440 -472 ) ( 1536 2440 -472 ) ( 1536 2440 -504 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1628 1792 -480 ) ( 2012 1792 -480 ) ( 2012 1792 -512 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1512 1984 -480 ) ( 1512 1992 -480 ) ( 1896 1992 -480 ) subway/metalrib1b 16 8 0 0.500000 0.500000 0 16777216 0 +( 1904 1856 -488 ) ( 1520 1856 -488 ) ( 1520 1848 -488 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 1832 2448 -488 ) ( 1832 2416 -488 ) ( 1832 2432 -480 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 750 +{ +( 672 -176 -136 ) ( 656 -176 -136 ) ( 656 -232 -136 ) subway/1_black -584 32 0 0.500000 0.500000 134217728 16777216 0 +( 656 -232 -120 ) ( 656 -176 -120 ) ( 672 -176 -120 ) subway/1_black -584 32 0 0.500000 0.500000 134217728 16777216 0 +( 656 -224 -112 ) ( 672 -224 -112 ) ( 672 -224 -136 ) subway/1_black -584 32 0 0.500000 0.500000 134217728 16777216 0 +( 658 -240 -112 ) ( 658 -184 -112 ) ( 658 -184 -136 ) subway/1_sign7 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 672 -192 -112 ) ( 656 -192 -112 ) ( 656 -192 -136 ) subway/1_black -584 32 0 0.500000 0.500000 134217728 16777216 0 +( 656 -176 -112 ) ( 656 -232 -112 ) ( 656 -232 -136 ) subway/1_sign7 0 8 0 1 1 134217728 16777216 0 +} +// brush 751 +{ +( 1628 656 -180 ) ( 1660 656 -180 ) ( 1660 664 -180 ) subway/1_black 8 -7 90 1 1 0 16777216 0 +( 1644 664 -148 ) ( 1644 656 -148 ) ( 1612 656 -148 ) subway/1_black 8 -7 90 1 1 0 16777216 0 +( 1624 664 -180 ) ( 1624 664 -140 ) ( 1624 656 -140 ) subway/1_black 8 0 0 1 1 0 16777216 0 +( 1652 660 -176 ) ( 1652 660 -136 ) ( 1620 660 -136 ) subway/1_bath_towels 32 48 -180 0.250000 -0.250000 0 16777216 0 +( 1640 656 -176 ) ( 1640 656 -136 ) ( 1640 664 -136 ) subway/1_black 8 0 0 1 1 0 16777216 0 +( 1612 656 -180 ) ( 1612 656 -140 ) ( 1644 656 -140 ) subway/1_bath_towels 12 -11 -180 1 -1 0 16777216 0 +} +// brush 752 +{ +( 1648 656 -180 ) ( 1680 656 -180 ) ( 1680 664 -180 ) subway/1_black 8 -3 90 1 1 0 16777216 0 +( 1664 664 -148 ) ( 1664 656 -148 ) ( 1632 656 -148 ) subway/1_black 8 -3 90 1 1 0 16777216 0 +( 1644 664 -180 ) ( 1644 664 -140 ) ( 1644 656 -140 ) subway/1_black 8 0 0 1 1 0 16777216 0 +( 1672 660 -176 ) ( 1672 660 -136 ) ( 1640 660 -136 ) subway/1_bath_towels 48 48 -180 0.250000 -0.250000 0 16777216 0 +( 1660 656 -176 ) ( 1660 656 -136 ) ( 1660 664 -136 ) subway/1_black 8 0 0 1 1 0 16777216 0 +( 1632 656 -180 ) ( 1632 656 -140 ) ( 1664 656 -140 ) subway/1_bath_towels 56 -11 -180 1 -1 0 16777216 0 +} +// brush 753 +{ +( 1236 1268 -164 ) ( 1244 1268 -172 ) ( 1244 1258 -172 ) subway/1_bath_stall 0 12 0 1 1 134217728 16777216 0 +( 1224 1448 -168 ) ( 1224 1444 -168 ) ( 1224 1444 -196 ) subway/1_bath_stallurinal -8 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1244 1448 -168 ) ( 1224 1448 -168 ) ( 1224 1448 -196 ) subway/1_bath_stallurinal 16 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1240 1444 -168 ) ( 1240 1448 -168 ) ( 1240 1448 -196 ) subway/1_bath_stall -12 0 0 1 1 134217728 16777216 0 +( 1224 1446 -168 ) ( 1244 1446 -168 ) ( 1244 1446 -196 ) subway/1_bath_stallurinal 16 -7 0 0.500000 0.500000 134217728 16777216 0 +( 1224 1444 -164 ) ( 1224 1448 -164 ) ( 1244 1448 -164 ) subway/1_bath_stall 0 12 0 1 1 134217728 16777216 0 +( 1244 1448 -196 ) ( 1224 1448 -196 ) ( 1224 1444 -196 ) subway/1_bath_stall 0 12 0 1 1 134217728 16777216 0 +} +// brush 754 +{ +( 1236 1240 -164 ) ( 1244 1240 -172 ) ( 1244 1230 -172 ) subway/1_bath_stall 0 48 0 1 1 134217728 16777216 0 +( 1224 1420 -168 ) ( 1224 1416 -168 ) ( 1224 1416 -196 ) subway/1_bath_stallurinal -16 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1244 1420 -168 ) ( 1224 1420 -168 ) ( 1224 1420 -196 ) subway/1_bath_stallurinal 16 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1240 1416 -168 ) ( 1240 1420 -168 ) ( 1240 1420 -196 ) subway/1_bath_stall -48 0 0 1 1 134217728 16777216 0 +( 1224 1418 -168 ) ( 1244 1418 -168 ) ( 1244 1418 -196 ) subway/1_bath_stallurinal 16 -7 0 0.500000 0.500000 134217728 16777216 0 +( 1224 1416 -164 ) ( 1224 1420 -164 ) ( 1244 1420 -164 ) subway/1_bath_stall 0 48 0 1 1 134217728 16777216 0 +( 1244 1420 -196 ) ( 1224 1420 -196 ) ( 1224 1416 -196 ) subway/1_bath_stall 0 48 0 1 1 134217728 16777216 0 +} +// brush 755 +{ +( 1236 1212 -164 ) ( 1244 1212 -172 ) ( 1244 1202 -172 ) subway/1_bath_stall 0 20 0 1 1 134217728 16777216 0 +( 1224 1392 -168 ) ( 1224 1388 -168 ) ( 1224 1388 -196 ) subway/1_bath_stallurinal -24 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1244 1392 -168 ) ( 1224 1392 -168 ) ( 1224 1392 -196 ) subway/1_bath_stallurinal 16 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1240 1388 -168 ) ( 1240 1392 -168 ) ( 1240 1392 -196 ) subway/1_bath_stall -20 0 0 1 1 134217728 16777216 0 +( 1224 1390 -168 ) ( 1244 1390 -168 ) ( 1244 1390 -196 ) subway/1_bath_stallurinal 16 -7 0 0.500000 0.500000 134217728 16777216 0 +( 1224 1388 -164 ) ( 1224 1392 -164 ) ( 1244 1392 -164 ) subway/1_bath_stall 0 20 0 1 1 134217728 16777216 0 +( 1244 1392 -196 ) ( 1224 1392 -196 ) ( 1224 1388 -196 ) subway/1_bath_stall 0 20 0 1 1 134217728 16777216 0 +} +// brush 756 +{ +( 1236 1184 -164 ) ( 1244 1184 -172 ) ( 1244 1174 -172 ) subway/1_bath_stall 0 56 0 1 1 134217728 16777216 0 +( 1224 1364 -168 ) ( 1224 1360 -168 ) ( 1224 1360 -196 ) subway/1_bath_stallurinal 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1244 1364 -168 ) ( 1224 1364 -168 ) ( 1224 1364 -196 ) subway/1_bath_stallurinal 16 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1240 1360 -168 ) ( 1240 1364 -168 ) ( 1240 1364 -196 ) subway/1_bath_stall -56 0 0 1 1 134217728 16777216 0 +( 1224 1362 -168 ) ( 1244 1362 -168 ) ( 1244 1362 -196 ) subway/1_bath_stallurinal 16 -7 0 0.500000 0.500000 134217728 16777216 0 +( 1224 1360 -164 ) ( 1224 1364 -164 ) ( 1244 1364 -164 ) subway/1_bath_stall 0 56 0 1 1 134217728 16777216 0 +( 1244 1364 -196 ) ( 1224 1364 -196 ) ( 1224 1360 -196 ) subway/1_bath_stall 0 56 0 1 1 134217728 16777216 0 +} +// brush 757 +{ +( 1236 1156 -164 ) ( 1244 1156 -172 ) ( 1244 1146 -172 ) subway/1_bath_stall 0 28 0 1 1 134217728 16777216 0 +( 1224 1336 -168 ) ( 1224 1332 -168 ) ( 1224 1332 -196 ) subway/1_bath_stallurinal -8 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1244 1336 -168 ) ( 1224 1336 -168 ) ( 1224 1336 -196 ) subway/1_bath_stallurinal 16 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1240 1332 -168 ) ( 1240 1336 -168 ) ( 1240 1336 -196 ) subway/1_bath_stall -28 0 0 1 1 134217728 16777216 0 +( 1224 1334 -168 ) ( 1244 1334 -168 ) ( 1244 1334 -196 ) subway/1_bath_stallurinal 16 -7 0 0.500000 0.500000 134217728 16777216 0 +( 1224 1332 -164 ) ( 1224 1336 -164 ) ( 1244 1336 -164 ) subway/1_bath_stall 0 28 0 1 1 134217728 16777216 0 +( 1244 1336 -196 ) ( 1224 1336 -196 ) ( 1224 1332 -196 ) subway/1_bath_stall 0 28 0 1 1 134217728 16777216 0 +} +// brush 758 +{ +( 1584 1228 -180 ) ( 1584 1260 -180 ) ( 1576 1260 -180 ) subway/1_black -8 -8 0 1 1 0 16777216 0 +( 1576 1244 -148 ) ( 1584 1244 -148 ) ( 1584 1212 -148 ) subway/1_black -8 -8 0 1 1 0 16777216 0 +( 1576 1224 -180 ) ( 1576 1224 -140 ) ( 1584 1224 -140 ) subway/1_black -8 0 0 1 1 0 16777216 0 +( 1580 1252 -176 ) ( 1580 1252 -136 ) ( 1580 1220 -136 ) subway/1_bath_towels 32 48 0 0.250000 0.250000 0 16777216 0 +( 1584 1240 -176 ) ( 1584 1240 -136 ) ( 1576 1240 -136 ) subway/1_black -8 0 0 1 1 0 16777216 0 +( 1584 1212 -180 ) ( 1584 1212 -140 ) ( 1584 1244 -140 ) subway/1_bath_towels 12 -12 0 1 1 0 16777216 0 +} +// brush 759 +{ +( 1584 1248 -180 ) ( 1584 1280 -180 ) ( 1576 1280 -180 ) subway/1_black -8 -4 0 1 1 0 16777216 0 +( 1576 1264 -148 ) ( 1584 1264 -148 ) ( 1584 1232 -148 ) subway/1_black -8 -4 0 1 1 0 16777216 0 +( 1576 1244 -180 ) ( 1576 1244 -140 ) ( 1584 1244 -140 ) subway/1_black -8 0 0 1 1 0 16777216 0 +( 1580 1272 -176 ) ( 1580 1272 -136 ) ( 1580 1240 -136 ) subway/1_bath_towels 16 48 0 0.250000 0.250000 0 16777216 0 +( 1584 1260 -176 ) ( 1584 1260 -136 ) ( 1576 1260 -136 ) subway/1_black -8 0 0 1 1 0 16777216 0 +( 1584 1232 -180 ) ( 1584 1232 -140 ) ( 1584 1264 -140 ) subway/1_bath_towels -8 -12 0 1 1 0 16777216 0 +} +// brush 760 +{ +( 1232 1256 -180 ) ( 1224 1256 -180 ) ( 1224 1224 -180 ) subway/1_black 0 -12 0 1 1 0 16777216 0 +( 1224 1208 -148 ) ( 1224 1240 -148 ) ( 1232 1240 -148 ) subway/1_black 0 -12 0 1 1 0 16777216 0 +( 1224 1220 -140 ) ( 1232 1220 -140 ) ( 1232 1220 -180 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1228 1216 -136 ) ( 1228 1248 -136 ) ( 1228 1248 -176 ) subway/1_bath_towels 48 48 0 0.250000 0.250000 0 16777216 0 +( 1232 1236 -136 ) ( 1224 1236 -136 ) ( 1224 1236 -176 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1224 1240 -140 ) ( 1224 1208 -140 ) ( 1224 1208 -180 ) subway/1_bath_towels 16 -12 0 1 1 0 16777216 0 +} +// brush 761 +{ +( 1232 1236 -180 ) ( 1224 1236 -180 ) ( 1224 1204 -180 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1224 1188 -148 ) ( 1224 1220 -148 ) ( 1232 1220 -148 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1224 1200 -140 ) ( 1232 1200 -140 ) ( 1232 1200 -180 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1228 1196 -136 ) ( 1228 1228 -136 ) ( 1228 1228 -176 ) subway/1_bath_towels 0 48 0 0.250000 0.250000 0 16777216 0 +( 1232 1216 -136 ) ( 1224 1216 -136 ) ( 1224 1216 -176 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1224 1220 -140 ) ( 1224 1188 -140 ) ( 1224 1188 -180 ) subway/1_bath_towels 36 -12 0 1 1 0 16777216 0 +} +// brush 762 +{ +( 2014 2320 -480 ) ( 2086 2320 -480 ) ( 2086 2376 -480 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 2086 2374 -464 ) ( 2086 2318 -464 ) ( 2014 2318 -464 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 2082 2376 -450 ) ( 2010 2376 -450 ) ( 2010 2376 -522 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 2038 2384 -424 ) ( 2038 2328 -424 ) ( 2038 2328 -496 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 2014 2330 -452 ) ( 2086 2330 -452 ) ( 2086 2330 -524 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 2072 2318 -450 ) ( 2072 2374 -450 ) ( 2072 2374 -522 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 763 +{ +( -2024 896 264 ) ( -2088 896 264 ) ( -2088 896 256 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -896 664 264 ) ( -896 728 264 ) ( -896 728 256 ) subway/2_oldceiling2 0 0 0 1 1 0 385875968 0 +( -1976 760 336 ) ( -1912 760 336 ) ( -1912 760 328 ) subway/3_orange2 0 0 0 1 1 0 0 0 +( -2680 736 264 ) ( -2680 672 264 ) ( -2680 672 256 ) subway/2_oldceiling2 0 0 0 1 1 0 385875968 0 +( -2192 768 504 ) ( -2128 768 504 ) ( -2128 704 504 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2680 800 416 ) ( -2680 752 416 ) ( -1232 776 416 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +} +// brush 764 +{ +( -2024 896 264 ) ( -2088 896 264 ) ( -2088 896 256 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -896 688 264 ) ( -896 752 264 ) ( -896 752 256 ) subway/2_oldceiling2 0 0 0 1 1 0 385875968 0 +( -1976 760 336 ) ( -1912 760 336 ) ( -1912 760 328 ) subway/3_orange_bottom1 0 32 0 1 1 0 0 0 +( -2680 736 264 ) ( -2680 672 264 ) ( -2680 672 256 ) subway/2_oldceiling2 0 0 0 1 1 0 385875968 0 +( -2128 704 336 ) ( -2128 768 336 ) ( -2192 768 336 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -2680 752 416 ) ( -2680 800 416 ) ( -1232 776 416 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +} +// brush 765 +{ +( -2168 -448 344 ) ( -2168 -448 616 ) ( -2080 -448 616 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1816 -440 192 ) ( -1880 -440 192 ) ( -1880 -440 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -2160 216 128 ) ( -2160 152 128 ) ( -2160 152 120 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1992 -432 360 ) ( -2064 -432 360 ) ( -2064 -440 360 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2064 -440 424 ) ( -2064 -432 424 ) ( -1992 -432 424 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2112 -440 456 ) ( -2112 -432 456 ) ( -2112 -440 360 ) subway/3_redbrick -16 0 0 1 1 0 385875968 0 +} +// brush 766 +{ +( -2168 -448 344 ) ( -2168 -448 616 ) ( -2080 -448 616 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -2080 224 264 ) ( -2080 288 264 ) ( -2080 288 256 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1816 -440 192 ) ( -1880 -440 192 ) ( -1880 -440 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -2160 216 128 ) ( -2160 152 128 ) ( -2160 152 120 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -2384 -688 448 ) ( -2440 -688 448 ) ( -2412 -432 448 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2064 -432 424 ) ( -2064 -440 424 ) ( -1992 -432 424 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +} +// brush 767 +{ +( -2168 -448 344 ) ( -2168 -448 616 ) ( -2080 -448 616 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -2080 224 264 ) ( -2080 288 264 ) ( -2080 288 256 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1816 -440 192 ) ( -1880 -440 192 ) ( -1880 -440 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -2184 -568 344 ) ( -2128 -568 344 ) ( -2156 -440 344 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2160 216 128 ) ( -2160 152 128 ) ( -2160 152 120 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -2064 -432 360 ) ( -1992 -432 360 ) ( -2064 -440 360 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +} +// brush 768 +{ +( -1768 -448 192 ) ( -1704 -448 192 ) ( -1704 -448 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1656 -440 192 ) ( -1720 -440 192 ) ( -1720 -440 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -2080 344 192 ) ( -2080 280 192 ) ( -2080 280 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1768 176 512 ) ( -1768 240 512 ) ( -1704 240 512 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -2000 152 128 ) ( -2000 216 128 ) ( -2000 152 120 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -2064 -432 424 ) ( -2064 -440 424 ) ( -1992 -432 424 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +} +// brush 769 +{ +( -1840 -696 192 ) ( -1776 -696 192 ) ( -1776 -696 184 ) subway/3_redbrick 56 0 0 1 1 0 385875968 0 +( -1656 -440 192 ) ( -1720 -440 192 ) ( -1720 -440 184 ) subway/3_redbrick 56 0 0 1 1 0 385875968 0 +( -2176 344 192 ) ( -2176 280 192 ) ( -2176 280 184 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2024 -568 344 ) ( -1968 -568 344 ) ( -1996 -440 344 ) subway/3_redbrick 56 32 0 1 1 0 385875968 0 +( -2000 152 128 ) ( -2000 216 128 ) ( -2000 152 120 ) subway/3_redbrick 0 0 0 1 1 0 385875968 0 +( -2064 -432 360 ) ( -1992 -432 360 ) ( -2064 -440 360 ) subway/3_redbrick 40 32 0 1 1 0 385875968 0 +} +// brush 770 +{ +( -1960 -568 192 ) ( -1896 -568 192 ) ( -1896 -568 184 ) subway/3_redbrick_trim_a 32 0 0 1 1 0 385875968 0 +( -2016 224 200 ) ( -2016 288 200 ) ( -2016 288 192 ) subway/3_redbrick_trim_a -56 0 0 1 1 0 385875968 0 +( -2080 -336 280 ) ( -2080 -312 280 ) ( -2080 -324 568 ) subway/3_redbrick_trim_a -56 0 0 1 1 0 385875968 0 +( -1992 -432 360 ) ( -2064 -432 360 ) ( -2064 -440 360 ) subway/3_redbrick_trim_a 48 32 0 1 1 0 385875968 0 +( -2064 -440 424 ) ( -2064 -432 424 ) ( -1992 -432 424 ) subway/3_redbrick_trim_a 48 32 0 1 1 0 385875968 0 +( -1992 -448 456 ) ( -2064 -448 456 ) ( -1992 -448 360 ) subway/3_redbrick_trim_a 48 0 0 1 1 0 385875968 0 +} +// brush 771 +{ +( -1928 -448 424 ) ( -1928 -448 360 ) ( -1984 -448 360 ) subway/3_redbrick 56 0 0 1 1 0 385875968 0 +( -1928 -448 360 ) ( -1928 -448 424 ) ( -1920 -440 424 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1656 -440 192 ) ( -1720 -440 192 ) ( -1720 -440 184 ) subway/3_redbrick 56 0 0 1 1 0 385875968 0 +( -1992 -432 360 ) ( -2064 -432 360 ) ( -2064 -440 360 ) subway/3_redbrick 56 32 0 1 1 0 385875968 0 +( -2064 -440 424 ) ( -2064 -432 424 ) ( -1992 -432 424 ) subway/3_redbrick 56 32 0 1 1 0 385875968 0 +( -1984 -432 464 ) ( -1984 -440 464 ) ( -1984 -432 368 ) subway/3_redbrick -48 0 0 1 1 0 385875968 0 +} +// brush 772 +{ +( -1928 -448 448 ) ( -1928 -448 424 ) ( -2000 -448 424 ) subway/3_redbrick 56 0 0 1 1 0 385875968 0 +( -1928 -448 424 ) ( -1928 -448 448 ) ( -1920 -440 448 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1656 -440 192 ) ( -1720 -440 192 ) ( -1720 -440 184 ) subway/3_redbrick 8 0 0 1 1 0 385875968 0 +( -2000 216 128 ) ( -2000 152 128 ) ( -2000 152 120 ) subway/3_redbrick 0 0 0 1 1 0 385875968 0 +( -2224 -688 448 ) ( -2280 -688 448 ) ( -2252 -432 448 ) subway/3_redbrick 56 32 0 1 1 0 385875968 0 +( -2064 -432 424 ) ( -2064 -440 424 ) ( -1992 -432 424 ) subway/3_redbrick 56 32 0 1 1 0 385875968 0 +} +// brush 773 +{ +( -1704 -448 192 ) ( -1640 -448 192 ) ( -1640 -448 184 ) subway/3_redbrick 56 0 0 1 1 0 385875968 0 +( -1920 224 264 ) ( -1920 288 264 ) ( -1920 288 256 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1656 -440 192 ) ( -1720 -440 192 ) ( -1720 -440 184 ) subway/3_redbrick 56 0 0 1 1 0 385875968 0 +( -2024 -568 344 ) ( -1968 -568 344 ) ( -1996 -440 344 ) subway/3_redbrick 56 32 0 1 1 0 385875968 0 +( -2000 216 128 ) ( -2000 152 128 ) ( -2000 152 120 ) subway/3_redbrick 0 0 0 1 1 0 385875968 0 +( -2064 -432 360 ) ( -1992 -432 360 ) ( -2064 -440 360 ) subway/3_redbrick 56 32 0 1 1 0 385875968 0 +} +// brush 774 +{ +( -1992 -432 360 ) ( -2064 -432 360 ) ( -2064 -440 360 ) subway/sign7 64 32 0 1 1 0 0 0 +( -2064 -440 424 ) ( -2064 -432 424 ) ( -1992 -432 424 ) subway/sign7 64 32 0 1 1 0 0 0 +( -2064 -448 456 ) ( -1992 -448 456 ) ( -1992 -448 360 ) subway/sign7 64 40 0 1 1 0 0 0 +( -1984 -440 464 ) ( -1984 -432 464 ) ( -1984 -432 368 ) subway/sign7 -96 40 0 1 1 0 0 0 +( -1992 -440 456 ) ( -2064 -440 456 ) ( -2064 -440 360 ) subway/sign7 -64 40 0 -1 1 0 0 0 +( -2112 -432 456 ) ( -2112 -440 456 ) ( -2112 -440 360 ) subway/sign7 -96 40 0 1 1 0 0 0 +} +// brush 775 +{ +( -1864 192 320 ) ( -1864 256 320 ) ( -1800 256 320 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1712 -280 316 ) ( -1712 -280 320 ) ( -1712 -208 320 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1732 232 292 ) ( -1732 168 292 ) ( -1732 168 284 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -1744 -496 316 ) ( -1744 -528 316 ) ( -1728 -512 316 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1736 -208 316 ) ( -1680 -208 316 ) ( -1708 -208 320 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1712 -280 320 ) ( -1712 -280 316 ) ( -1732 -280 316 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 776 +{ +( -1864 192 320 ) ( -1864 256 320 ) ( -1800 256 320 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1860 -384 292 ) ( -1796 -384 292 ) ( -1796 -384 284 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1712 -296 320 ) ( -1712 -296 316 ) ( -1712 -384 316 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1732 -296 316 ) ( -1732 -296 320 ) ( -1732 -384 320 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -1744 -496 316 ) ( -1744 -528 316 ) ( -1728 -512 316 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1732 -296 320 ) ( -1732 -296 316 ) ( -1712 -296 316 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 777 +{ +( -1864 104 320 ) ( -1864 168 320 ) ( -1800 168 320 ) subway/light_yellow 8 16 0 0.500000 0.500000 0 16777217 30000 +( -1712 252 204 ) ( -1712 316 204 ) ( -1712 316 196 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1732 144 292 ) ( -1732 80 292 ) ( -1732 80 284 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1736 -280 292 ) ( -1768 -280 292 ) ( -1736 -280 284 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1744 -584 316 ) ( -1744 -616 316 ) ( -1728 -600 316 ) subway/1_black 0 8 0 1 1 0 16777216 0 +( -1680 -296 316 ) ( -1736 -296 316 ) ( -1708 -296 320 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 778 +{ +( -1864 16 320 ) ( -1864 80 320 ) ( -1800 80 320 ) subway/light_yellow 8 0 0 0.500000 0.500000 0 16777217 30000 +( -1712 164 204 ) ( -1712 228 204 ) ( -1712 228 196 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1732 56 292 ) ( -1732 -8 292 ) ( -1732 -8 284 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -1736 -368 292 ) ( -1768 -368 292 ) ( -1736 -368 284 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1744 -672 316 ) ( -1744 -704 316 ) ( -1728 -688 316 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1680 -384 316 ) ( -1736 -384 316 ) ( -1708 -384 320 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 779 +{ +( -1864 192 320 ) ( -1864 256 320 ) ( -1800 256 320 ) subway/light_yellow 40 0 0 0.500000 0.500000 0 16777217 30000 +( -1712 340 204 ) ( -1712 404 204 ) ( -1712 404 196 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1732 232 292 ) ( -1732 168 292 ) ( -1732 168 284 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -1736 -192 292 ) ( -1768 -192 292 ) ( -1736 -192 284 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1744 -496 316 ) ( -1744 -528 316 ) ( -1728 -512 316 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1680 -208 316 ) ( -1736 -208 316 ) ( -1708 -208 320 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 780 +{ +( -1864 284 316 ) ( -1864 348 316 ) ( -1800 348 316 ) subway/1_black 0 -4 0 1 1 0 16777216 0 +( -1860 -292 288 ) ( -1796 -292 288 ) ( -1796 -292 280 ) subway/1_black 0 -4 0 1 1 0 16777216 0 +( -1712 432 200 ) ( -1712 496 200 ) ( -1712 496 192 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1716 324 284 ) ( -1716 260 284 ) ( -1716 260 276 ) subway/1_black 4 -4 0 1 1 134217728 16777216 0 +( -1744 -288 312 ) ( -1776 -288 312 ) ( -1744 -288 304 ) subway/1_black 0 -4 0 1 1 0 16777216 0 +( -1736 -404 288 ) ( -1736 -436 288 ) ( -1720 -420 288 ) subway/1_black 0 -4 0 1 1 0 16777216 0 +} +// brush 781 +{ +( -1864 380 316 ) ( -1864 444 316 ) ( -1800 444 316 ) subway/1_black 0 12 0 1 1 0 16777216 0 +( -1860 -196 288 ) ( -1796 -196 288 ) ( -1796 -196 280 ) subway/1_black 0 -4 0 1 1 0 16777216 0 +( -1712 528 200 ) ( -1712 592 200 ) ( -1712 592 192 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1716 420 284 ) ( -1716 356 284 ) ( -1716 356 276 ) subway/1_black -12 -4 0 1 1 134217728 16777216 0 +( -1744 -192 312 ) ( -1776 -192 312 ) ( -1744 -192 304 ) subway/1_black 0 -4 0 1 1 0 16777216 0 +( -1736 -308 288 ) ( -1736 -340 288 ) ( -1720 -324 288 ) subway/1_black 0 12 0 1 1 0 16777216 0 +} +// brush 782 +{ +( -1864 192 316 ) ( -1864 256 316 ) ( -1800 256 316 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1860 -384 288 ) ( -1796 -384 288 ) ( -1796 -384 280 ) subway/1_black 0 -4 0 1 1 0 16777216 0 +( -1712 340 200 ) ( -1712 404 200 ) ( -1712 404 192 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1716 232 284 ) ( -1716 168 284 ) ( -1716 168 276 ) subway/1_black 0 -4 0 1 1 134217728 16777216 0 +( -1736 -380 312 ) ( -1768 -380 312 ) ( -1736 -380 304 ) subway/1_black 0 -4 0 1 1 0 16777216 0 +( -1736 -496 288 ) ( -1736 -528 288 ) ( -1720 -512 288 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 783 +{ +( -1864 192 416 ) ( -1864 256 416 ) ( -1800 256 416 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1860 -384 296 ) ( -1796 -384 296 ) ( -1796 -384 288 ) subway/1_black 0 -4 0 1 1 0 16777216 0 +( -1712 340 296 ) ( -1712 404 296 ) ( -1712 404 288 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1716 232 296 ) ( -1716 168 296 ) ( -1716 168 288 ) subway/sign8 128 21 0 -1.500000 1.500000 134217728 0 0 +( -1736 -192 296 ) ( -1768 -192 296 ) ( -1736 -192 288 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1728 -496 320 ) ( -1728 -528 320 ) ( -1712 -512 320 ) subway/sign8 0 0 0 1 1 0 0 0 +} +// brush 784 +{ +( -2096 -64 16 ) ( -2208 -64 16 ) ( -2208 -72 16 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -2208 -72 128 ) ( -2208 -64 128 ) ( -2096 -64 128 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -2208 -72 128 ) ( -2096 -72 128 ) ( -2096 -72 48 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -2096 -72 128 ) ( -2096 -64 128 ) ( -2096 -64 48 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -2096 -64 128 ) ( -2208 -64 128 ) ( -2208 -64 48 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2208 -64 128 ) ( -2208 -72 128 ) ( -2208 -72 48 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 785 +{ +( -2200 256 24 ) ( -2200 192 24 ) ( -2200 192 16 ) subway/1_concrete_floor 80 16 0 0.500000 0.500000 0 285212672 0 +( -2120 168 24 ) ( -2184 168 24 ) ( -2184 168 16 ) subway/1_concrete_floor 96 16 0 0.500000 0.500000 0 285212672 0 +( -2096 512 24 ) ( -2096 576 24 ) ( -2096 576 16 ) subway/con2 16 16 0 0.500000 0.500000 134217728 285212672 0 +( -2128 152 24 ) ( -2064 152 24 ) ( -2064 152 16 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2184 208 24 ) ( -2184 272 24 ) ( -2120 272 24 ) subway/1_stair_top1 16 20 0 0.500000 -0.400000 0 285212672 0 +( -2120 272 16 ) ( -2184 272 16 ) ( -2184 208 16 ) subway/1_concrete_floor 96 -80 0 0.500000 0.500000 0 285212672 0 +} +// brush 786 +{ +( -1920 104 8 ) ( -1984 104 8 ) ( -1984 40 8 ) subway/metal_rust -32 -32 0 0.500000 0.500000 0 16777216 0 +( -1984 40 16 ) ( -1984 104 16 ) ( -1920 104 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2056 160 -136 ) ( -2056 224 -136 ) ( -2056 224 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -1984 168 -136 ) ( -2048 168 -136 ) ( -2048 168 -144 ) subway/metal_rust -32 0 0 0.500000 0.500000 0 16777216 0 +( -2208 112 -136 ) ( -2208 48 -136 ) ( -2208 48 -144 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -2152 32 8 ) ( -2184 32 8 ) ( -2168 32 16 ) subway/metal_rust -32 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 787 +{ +( -1920 104 8 ) ( -1984 104 8 ) ( -1984 40 8 ) subway/metal_rust -32 -32 0 0.500000 0.500000 0 16777216 0 +( -1984 40 16 ) ( -1984 104 16 ) ( -1920 104 16 ) subway/1_concrete_floor -48 0 0 0.500000 0.500000 0 285212672 0 +( -1920 -64 -144 ) ( -1856 -64 -144 ) ( -1856 -64 -152 ) subway/metal_rust -32 0 0 0.500000 0.500000 0 16777216 0 +( -2056 160 -136 ) ( -2056 224 -136 ) ( -2056 224 -144 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -2208 112 -136 ) ( -2208 48 -136 ) ( -2208 48 -144 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -2176 -32 8 ) ( -2160 -32 8 ) ( -2168 -32 16 ) subway/metal_rust -32 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 788 +{ +( -1992 104 8 ) ( -2056 104 8 ) ( -2056 40 8 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -1984 40 16 ) ( -1984 104 16 ) ( -1920 104 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2056 160 -136 ) ( -2056 224 -136 ) ( -2056 224 -144 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2184 32 8 ) ( -2152 32 8 ) ( -2168 32 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2232 0 8 ) ( -2248 0 8 ) ( -2240 0 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2192 0 8 ) ( -2192 24 8 ) ( -2192 12 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +} +// brush 789 +{ +( -1992 104 8 ) ( -2056 104 8 ) ( -2056 40 8 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -1984 40 16 ) ( -1984 104 16 ) ( -1920 104 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2056 160 -136 ) ( -2056 224 -136 ) ( -2056 224 -144 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2248 0 8 ) ( -2232 0 8 ) ( -2240 0 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2160 -32 8 ) ( -2176 -32 8 ) ( -2168 -32 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2192 0 8 ) ( -2192 24 8 ) ( -2192 12 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +} +// brush 790 +{ +( -2184 120 8 ) ( -2248 120 8 ) ( -2248 56 8 ) subway/metal_rust 48 0 0 0.500000 0.500000 0 16777216 0 +( -2248 56 16 ) ( -2248 120 16 ) ( -2184 120 16 ) subway/1_concrete_floor 96 32 0 0.500000 0.500000 0 285212672 0 +( -2440 16 8 ) ( -2424 16 8 ) ( -2432 16 16 ) subway/metal_rust 48 0 0 0.500000 0.500000 0 16777216 0 +( -2424 -16 8 ) ( -2440 -16 8 ) ( -2432 -16 16 ) subway/metal_rust 48 0 0 0.500000 0.500000 0 16777216 0 +( -2384 40 8 ) ( -2384 16 8 ) ( -2384 28 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -2416 0 8 ) ( -2416 16 8 ) ( -2416 8 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 791 +{ +( -1928 104 8 ) ( -1992 104 8 ) ( -1992 40 8 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -1984 40 16 ) ( -1984 104 16 ) ( -1920 104 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2208 112 -136 ) ( -2208 48 -136 ) ( -2208 48 -144 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2184 32 8 ) ( -2152 32 8 ) ( -2168 32 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2160 0 8 ) ( -2176 0 8 ) ( -2168 0 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2192 24 8 ) ( -2192 0 8 ) ( -2192 12 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +} +// brush 792 +{ +( -1920 104 8 ) ( -1984 104 8 ) ( -1984 40 8 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -1984 40 16 ) ( -1984 104 16 ) ( -1920 104 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2208 112 -136 ) ( -2208 48 -136 ) ( -2208 48 -144 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2184 0 8 ) ( -2168 0 8 ) ( -2176 0 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2160 -32 8 ) ( -2176 -32 8 ) ( -2168 -32 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +( -2192 24 8 ) ( -2192 0 8 ) ( -2192 12 16 ) subway/1_concrete_floor -16 1 0 0.500000 0.500000 0 285212672 0 +} +// brush 793 +{ +( -1920 104 0 ) ( -1984 104 0 ) ( -1984 40 0 ) subway/metal_rust -32 -32 0 0.500000 0.500000 0 16777216 0 +( -1984 40 8 ) ( -1984 104 8 ) ( -1920 104 8 ) subway/metal_rust -32 -32 0 0.500000 0.500000 0 16777216 0 +( -2176 0 0 ) ( -2160 0 0 ) ( -2168 0 8 ) subway/metal_rust -32 -16 0 0.500000 0.500000 0 16777216 0 +( -2160 -32 0 ) ( -2176 -32 0 ) ( -2168 -32 8 ) subway/metal_rust -32 -16 0 0.500000 0.500000 0 16777216 0 +( -2152 0 0 ) ( -2152 -16 0 ) ( -2152 -8 8 ) subway/metal_rust 32 -16 0 0.500000 0.500000 0 16777216 0 +( -2184 0 0 ) ( -2184 24 0 ) ( -2184 12 8 ) subway/metal_rust 32 -16 0 0.500000 0.500000 0 16777216 0 +} +// brush 794 +{ +( -1920 104 0 ) ( -1984 104 0 ) ( -1984 40 0 ) subway/metal_rust -32 -32 0 0.500000 0.500000 0 16777216 0 +( -1984 40 8 ) ( -1984 104 8 ) ( -1920 104 8 ) subway/metal_rust -32 -32 0 0.500000 0.500000 0 16777216 0 +( -2184 32 0 ) ( -2152 32 0 ) ( -2168 32 8 ) subway/metal_rust -32 -16 0 0.500000 0.500000 0 16777216 0 +( -2160 0 0 ) ( -2176 0 0 ) ( -2168 0 8 ) subway/metal_rust -32 -16 0 0.500000 0.500000 0 16777216 0 +( -2184 0 0 ) ( -2184 24 0 ) ( -2184 12 8 ) subway/metal_rust 32 -16 0 0.500000 0.500000 0 16777216 0 +( -2152 24 0 ) ( -2152 8 0 ) ( -2152 16 8 ) subway/metal_rust 32 -16 0 0.500000 0.500000 0 16777216 0 +} +// brush 795 +{ +( -1920 104 0 ) ( -1984 104 0 ) ( -1984 40 0 ) subway/metal_rust -32 -32 0 0.500000 0.500000 0 16777216 0 +( -1984 40 8 ) ( -1984 104 8 ) ( -1920 104 8 ) subway/metal_rust -32 -32 0 0.500000 0.500000 0 16777216 0 +( -2184 32 0 ) ( -2152 32 0 ) ( -2168 32 8 ) subway/metal_rust -32 -16 0 0.500000 0.500000 0 16777216 0 +( -2160 0 0 ) ( -2176 0 0 ) ( -2168 0 8 ) subway/metal_rust -32 -16 0 0.500000 0.500000 0 16777216 0 +( -2120 24 0 ) ( -2120 0 0 ) ( -2120 12 8 ) subway/metal_rust 32 -16 0 0.500000 0.500000 0 16777216 0 +( -2152 8 0 ) ( -2152 24 0 ) ( -2152 16 8 ) subway/metal_rust 32 -16 0 0.500000 0.500000 0 16777216 0 +} +// brush 796 +{ +( -2193 120 8 ) ( -2257 120 8 ) ( -2257 56 8 ) subway/metal_rust 2 0 0 0.500000 0.500000 0 16777216 0 +( -2257 56 16 ) ( -2257 120 16 ) ( -2193 120 16 ) subway/1_concrete_floor 50 96 0 0.500000 0.500000 0 285212672 0 +( -2457 48 8 ) ( -2425 48 8 ) ( -2441 48 16 ) subway/metal_rust 2 0 0 0.500000 0.500000 0 16777216 0 +( -2433 16 8 ) ( -2449 16 8 ) ( -2441 16 16 ) subway/metal_rust 2 0 0 0.500000 0.500000 0 16777216 0 +( -2393 40 8 ) ( -2393 16 8 ) ( -2393 28 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -2425 24 8 ) ( -2425 40 8 ) ( -2425 32 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 797 +{ +( -2419 120 -213 ) ( -2430 120 -150 ) ( -2430 56 -150 ) subway/metal_rust -15 0 -90 0.492340 0.500000 134217728 16777216 0 +( -2422 56 -149 ) ( -2422 120 -149 ) ( -2411 120 -212 ) subway/1_concrete_floor -30 97 -90 0.490000 0.500000 134217728 285212672 0 +( -2465 48 47 ) ( -2459 48 16 ) ( -2454 48 33 ) subway/metal_rust 62 -43 -79 0.500073 0.500043 134217728 16777216 0 +( -2461 16 23 ) ( -2463 16 39 ) ( -2454 16 33 ) subway/metal_rust 62 -43 -79 0.500073 0.500043 134217728 16777216 0 +( -2465 16 47 ) ( -2465 40 47 ) ( -2457 28 48 ) subway/metal_rust -1 -29 90 0.500000 -0.492493 134217728 16777216 0 +( -2459 40 16 ) ( -2459 24 16 ) ( -2451 32 17 ) subway/metal_rust -1 -18 90 0.500000 -0.492493 134217728 16777216 0 +} +// brush 798 +{ +( -2184 98 -35 ) ( -2248 98 -35 ) ( -2248 40 -9 ) subway/metal_rust 48 38 0 0.500000 0.456787 134217728 16777216 0 +( -2248 43 -2 ) ( -2248 101 -28 ) ( -2184 101 -28 ) subway/1_concrete_floor 95 15 0 0.500000 0.460000 134217728 285212672 0 +( -2440 3 7 ) ( -2424 3 7 ) ( -2432 6 14 ) subway/metal_rust 48 -1 0 0.500000 0.456776 134217728 16777216 0 +( -2424 -26 20 ) ( -2440 -26 20 ) ( -2432 -23 27 ) subway/metal_rust 48 27 0 0.500000 0.456772 134217728 16777216 0 +( -2416 3 7 ) ( -2416 -12 13 ) ( -2416 -1 17 ) subway/metal_rust -32 0 -24 0.500023 0.500024 134217728 16777216 0 +( -2448 3 7 ) ( -2448 25 -3 ) ( -2448 17 9 ) subway/metal_rust -32 0 -24 0.500023 0.500024 134217728 16777216 0 +} +// brush 799 +{ +( -2200 264 48 ) ( -2208 272 48 ) ( -2208 -88 48 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2200 200 128 ) ( -2200 264 128 ) ( -2136 264 128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2120 -64 40 ) ( -2056 -64 40 ) ( -2056 -64 32 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2200 72 136 ) ( -2200 72 0 ) ( -2200 -280 0 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -2192 136 16 ) ( -2192 136 0 ) ( -2184 136 0 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2208 240 48 ) ( -2208 240 64 ) ( -2208 -112 64 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 800 +{ +( -2096 -768 40 ) ( -2096 -416 40 ) ( -2096 -416 24 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -2248 216 -24 ) ( -2240 216 -24 ) ( -2240 216 -8 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -2104 -280 -24 ) ( -2104 72 -24 ) ( -2104 72 112 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -2392 -64 8 ) ( -2392 -64 16 ) ( -2328 -64 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -2312 408 32 ) ( -2248 408 32 ) ( -2248 344 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -2240 56 16 ) ( -2240 416 16 ) ( -2248 408 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 801 +{ +( -2208 -440 24 ) ( -2208 -440 40 ) ( -2208 -792 40 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -2064 216 -8 ) ( -2064 216 -24 ) ( -2056 216 -24 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -2200 96 112 ) ( -2200 96 -24 ) ( -2200 -256 -24 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -1976 -64 16 ) ( -1912 -64 16 ) ( -1912 -64 8 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -2056 344 32 ) ( -2056 408 32 ) ( -1992 408 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -2056 408 16 ) ( -2064 416 16 ) ( -2064 56 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 802 +{ +( -2120 528 144 ) ( -2184 528 144 ) ( -2184 464 144 ) subway/1_concrete_floor 96 -80 0 0.500000 0.500000 0 285212672 0 +( -2184 464 152 ) ( -2184 528 152 ) ( -2120 528 152 ) subway/1_stair_top1 16 20 0 0.500000 -0.400000 0 285212672 0 +( -2128 408 152 ) ( -2064 408 152 ) ( -2064 408 144 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2096 768 152 ) ( -2096 832 152 ) ( -2096 832 144 ) subway/con2 16 16 0 0.500000 0.500000 134217728 285212672 0 +( -2112 424 152 ) ( -2176 424 152 ) ( -2176 424 144 ) subway/1_concrete_floor 96 16 0 0.500000 0.500000 0 285212672 0 +( -2200 512 152 ) ( -2200 448 152 ) ( -2200 448 144 ) subway/1_concrete_floor 80 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 803 +{ +( -2120 512 136 ) ( -2184 512 136 ) ( -2184 448 136 ) subway/1_concrete_floor 96 -112 0 0.500000 0.500000 0 285212672 0 +( -2184 448 144 ) ( -2184 512 144 ) ( -2120 512 144 ) subway/1_stair_top1 16 60 0 0.500000 -0.400000 0 285212672 0 +( -2128 392 144 ) ( -2064 392 144 ) ( -2064 392 136 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2096 752 144 ) ( -2096 816 144 ) ( -2096 816 136 ) subway/con2 48 0 0 0.500000 0.500000 134217728 285212672 0 +( -2120 408 144 ) ( -2184 408 144 ) ( -2184 408 136 ) subway/1_concrete_floor 96 0 0 0.500000 0.500000 0 285212672 0 +( -2200 496 144 ) ( -2200 432 144 ) ( -2200 432 136 ) subway/1_concrete_floor 112 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 804 +{ +( -2200 480 136 ) ( -2200 416 136 ) ( -2200 416 128 ) subway/1_concrete_floor 16 112 0 0.500000 0.500000 0 285212672 0 +( -2120 392 136 ) ( -2184 392 136 ) ( -2184 392 128 ) subway/1_concrete_floor 96 112 0 0.500000 0.500000 0 285212672 0 +( -2096 736 136 ) ( -2096 800 136 ) ( -2096 800 128 ) subway/con2 16 48 0 0.500000 0.500000 134217728 285212672 0 +( -2128 376 136 ) ( -2064 376 136 ) ( -2064 376 128 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2184 432 136 ) ( -2184 496 136 ) ( -2120 496 136 ) subway/1_stair_top1 16 36 0 0.500000 -0.400000 0 285212672 0 +( -2120 496 128 ) ( -2184 496 128 ) ( -2184 432 128 ) subway/1_concrete_floor 96 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 805 +{ +( -2120 480 120 ) ( -2184 480 120 ) ( -2184 416 120 ) subway/1_concrete_floor 96 -48 0 0.500000 0.500000 0 285212672 0 +( -2184 416 128 ) ( -2184 480 128 ) ( -2120 480 128 ) subway/1_stair_top1 16 12 0 0.500000 -0.400000 0 285212672 0 +( -2128 360 128 ) ( -2064 360 128 ) ( -2064 360 120 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2096 720 128 ) ( -2096 784 128 ) ( -2096 784 120 ) subway/con2 48 32 0 0.500000 0.500000 134217728 285212672 0 +( -2120 376 128 ) ( -2184 376 128 ) ( -2184 376 120 ) subway/1_concrete_floor 96 96 0 0.500000 0.500000 0 285212672 0 +( -2200 464 128 ) ( -2200 400 128 ) ( -2200 400 120 ) subway/1_concrete_floor 48 96 0 0.500000 0.500000 0 285212672 0 +} +// brush 806 +{ +( -2120 464 112 ) ( -2184 464 112 ) ( -2184 400 112 ) subway/1_concrete_floor 96 -80 0 0.500000 0.500000 0 285212672 0 +( -2184 400 120 ) ( -2184 464 120 ) ( -2120 464 120 ) subway/1_stair_top1 16 52 0 0.500000 -0.400000 0 285212672 0 +( -2128 344 120 ) ( -2064 344 120 ) ( -2064 344 112 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2096 704 120 ) ( -2096 768 120 ) ( -2096 768 112 ) subway/con2 16 16 0 0.500000 0.500000 134217728 285212672 0 +( -2120 360 120 ) ( -2184 360 120 ) ( -2184 360 112 ) subway/1_concrete_floor 96 80 0 0.500000 0.500000 0 285212672 0 +( -2200 448 120 ) ( -2200 384 120 ) ( -2200 384 112 ) subway/1_concrete_floor 80 80 0 0.500000 0.500000 0 285212672 0 +} +// brush 807 +{ +( -2200 432 112 ) ( -2200 368 112 ) ( -2200 368 104 ) subway/1_concrete_floor 112 64 0 0.500000 0.500000 0 285212672 0 +( -2120 344 112 ) ( -2184 344 112 ) ( -2184 344 104 ) subway/1_concrete_floor 96 64 0 0.500000 0.500000 0 285212672 0 +( -2096 688 112 ) ( -2096 752 112 ) ( -2096 752 104 ) subway/con2 48 0 0 0.500000 0.500000 134217728 285212672 0 +( -2128 328 112 ) ( -2064 328 112 ) ( -2064 328 104 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2184 384 112 ) ( -2184 448 112 ) ( -2120 448 112 ) subway/1_stair_top1 16 28 0 0.500000 -0.400000 0 285212672 0 +( -2120 448 104 ) ( -2184 448 104 ) ( -2184 384 104 ) subway/1_concrete_floor 96 -112 0 0.500000 0.500000 0 285212672 0 +} +// brush 808 +{ +( -2120 432 96 ) ( -2184 432 96 ) ( -2184 368 96 ) subway/1_concrete_floor 96 -16 0 0.500000 0.500000 0 285212672 0 +( -2184 368 104 ) ( -2184 432 104 ) ( -2120 432 104 ) subway/1_stair_top1 16 4 0 0.500000 -0.400000 0 285212672 0 +( -2128 312 104 ) ( -2064 312 104 ) ( -2064 312 96 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2096 672 104 ) ( -2096 736 104 ) ( -2096 736 96 ) subway/con2 16 48 0 0.500000 0.500000 134217728 285212672 0 +( -2120 328 104 ) ( -2184 328 104 ) ( -2184 328 96 ) subway/1_concrete_floor 96 48 0 0.500000 0.500000 0 285212672 0 +( -2200 416 104 ) ( -2200 352 104 ) ( -2200 352 96 ) subway/1_concrete_floor 16 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 809 +{ +( -2120 416 88 ) ( -2184 416 88 ) ( -2184 352 88 ) subway/1_concrete_floor 96 -48 0 0.500000 0.500000 0 285212672 0 +( -2184 352 96 ) ( -2184 416 96 ) ( -2120 416 96 ) subway/1_stair_top1 16 44 0 0.500000 -0.400000 0 285212672 0 +( -2128 296 96 ) ( -2064 296 96 ) ( -2064 296 88 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2096 656 96 ) ( -2096 720 96 ) ( -2096 720 88 ) subway/con2 48 32 0 0.500000 0.500000 134217728 285212672 0 +( -2120 312 96 ) ( -2184 312 96 ) ( -2184 312 88 ) subway/1_concrete_floor 96 32 0 0.500000 0.500000 0 285212672 0 +( -2200 400 96 ) ( -2200 336 96 ) ( -2200 336 88 ) subway/1_concrete_floor 48 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 810 +{ +( -2200 384 88 ) ( -2200 320 88 ) ( -2200 320 80 ) subway/1_concrete_floor 80 16 0 0.500000 0.500000 0 285212672 0 +( -2120 296 88 ) ( -2184 296 88 ) ( -2184 296 80 ) subway/1_concrete_floor 96 16 0 0.500000 0.500000 0 285212672 0 +( -2096 640 88 ) ( -2096 704 88 ) ( -2096 704 80 ) subway/con2 16 16 0 0.500000 0.500000 134217728 285212672 0 +( -2128 280 88 ) ( -2064 280 88 ) ( -2064 280 80 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2184 336 88 ) ( -2184 400 88 ) ( -2120 400 88 ) subway/1_stair_top1 16 20 0 0.500000 -0.400000 0 285212672 0 +( -2120 400 80 ) ( -2184 400 80 ) ( -2184 336 80 ) subway/1_concrete_floor 96 -80 0 0.500000 0.500000 0 285212672 0 +} +// brush 811 +{ +( -2120 384 72 ) ( -2184 384 72 ) ( -2184 320 72 ) subway/1_concrete_floor 96 -112 0 0.500000 0.500000 0 285212672 0 +( -2184 320 80 ) ( -2184 384 80 ) ( -2120 384 80 ) subway/1_stair_top1 16 60 0 0.500000 -0.400000 0 285212672 0 +( -2128 264 80 ) ( -2064 264 80 ) ( -2064 264 72 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2096 624 80 ) ( -2096 688 80 ) ( -2096 688 72 ) subway/con2 48 0 0 0.500000 0.500000 134217728 285212672 0 +( -2120 280 80 ) ( -2184 280 80 ) ( -2184 280 72 ) subway/1_concrete_floor 96 0 0 0.500000 0.500000 0 285212672 0 +( -2200 368 80 ) ( -2200 304 80 ) ( -2200 304 72 ) subway/1_concrete_floor 112 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 812 +{ +( -2120 368 64 ) ( -2184 368 64 ) ( -2184 304 64 ) subway/1_concrete_floor 96 -16 0 0.500000 0.500000 0 285212672 0 +( -2184 304 72 ) ( -2184 368 72 ) ( -2120 368 72 ) subway/1_stair_top1 16 36 0 0.500000 -0.400000 0 285212672 0 +( -2128 248 72 ) ( -2064 248 72 ) ( -2064 248 64 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2096 608 72 ) ( -2096 672 72 ) ( -2096 672 64 ) subway/con2 16 48 0 0.500000 0.500000 134217728 285212672 0 +( -2120 264 72 ) ( -2184 264 72 ) ( -2184 264 64 ) subway/1_concrete_floor 96 112 0 0.500000 0.500000 0 285212672 0 +( -2200 352 72 ) ( -2200 288 72 ) ( -2200 288 64 ) subway/1_concrete_floor 16 112 0 0.500000 0.500000 0 285212672 0 +} +// brush 813 +{ +( -2200 336 64 ) ( -2200 272 64 ) ( -2200 272 56 ) subway/1_concrete_floor 48 96 0 0.500000 0.500000 0 285212672 0 +( -2120 248 64 ) ( -2184 248 64 ) ( -2184 248 56 ) subway/1_concrete_floor 96 96 0 0.500000 0.500000 0 285212672 0 +( -2096 592 64 ) ( -2096 656 64 ) ( -2096 656 56 ) subway/con2 48 32 0 0.500000 0.500000 134217728 285212672 0 +( -2128 232 64 ) ( -2064 232 64 ) ( -2064 232 56 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2184 288 64 ) ( -2184 352 64 ) ( -2120 352 64 ) subway/1_stair_top1 16 12 0 0.500000 -0.400000 0 285212672 0 +( -2120 352 56 ) ( -2184 352 56 ) ( -2184 288 56 ) subway/1_concrete_floor 96 -48 0 0.500000 0.500000 0 285212672 0 +} +// brush 814 +{ +( -2200 320 56 ) ( -2200 256 56 ) ( -2200 256 48 ) subway/1_concrete_floor 80 80 0 0.500000 0.500000 0 285212672 0 +( -2120 232 56 ) ( -2184 232 56 ) ( -2184 232 48 ) subway/1_concrete_floor 96 80 0 0.500000 0.500000 0 285212672 0 +( -2096 576 56 ) ( -2096 640 56 ) ( -2096 640 48 ) subway/con2 16 16 0 0.500000 0.500000 134217728 285212672 0 +( -2128 216 56 ) ( -2064 216 56 ) ( -2064 216 48 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2184 272 56 ) ( -2184 336 56 ) ( -2120 336 56 ) subway/1_stair_top1 16 52 0 0.500000 -0.400000 0 285212672 0 +( -2120 336 48 ) ( -2184 336 48 ) ( -2184 272 48 ) subway/1_concrete_floor 96 -80 0 0.500000 0.500000 0 285212672 0 +} +// brush 815 +{ +( -2120 320 40 ) ( -2184 320 40 ) ( -2184 256 40 ) subway/1_concrete_floor 96 -112 0 0.500000 0.500000 0 285212672 0 +( -2184 256 48 ) ( -2184 320 48 ) ( -2120 320 48 ) subway/1_stair_top1 16 28 0 0.500000 -0.400000 0 285212672 0 +( -2128 200 48 ) ( -2064 200 48 ) ( -2064 200 40 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2096 560 48 ) ( -2096 624 48 ) ( -2096 624 40 ) subway/con2 48 0 0 0.500000 0.500000 134217728 285212672 0 +( -2120 216 48 ) ( -2184 216 48 ) ( -2184 216 40 ) subway/1_concrete_floor 96 64 0 0.500000 0.500000 0 285212672 0 +( -2200 304 48 ) ( -2200 240 48 ) ( -2200 240 40 ) subway/1_concrete_floor 112 64 0 0.500000 0.500000 0 285212672 0 +} +// brush 816 +{ +( -2200 288 40 ) ( -2200 224 40 ) ( -2200 224 32 ) subway/1_concrete_floor 16 48 0 0.500000 0.500000 0 285212672 0 +( -2120 200 40 ) ( -2184 200 40 ) ( -2184 200 32 ) subway/1_concrete_floor 96 48 0 0.500000 0.500000 0 285212672 0 +( -2096 544 40 ) ( -2096 608 40 ) ( -2096 608 32 ) subway/con2 16 48 0 0.500000 0.500000 134217728 285212672 0 +( -2128 184 40 ) ( -2064 184 40 ) ( -2064 184 32 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2184 240 40 ) ( -2184 304 40 ) ( -2120 304 40 ) subway/1_stair_top1 16 68 0 0.500000 -0.400000 0 285212672 0 +( -2120 304 32 ) ( -2184 304 32 ) ( -2184 240 32 ) subway/1_concrete_floor 96 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 817 +{ +( -2200 272 32 ) ( -2200 208 32 ) ( -2200 208 24 ) subway/1_concrete_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( -2120 184 32 ) ( -2184 184 32 ) ( -2184 184 24 ) subway/1_concrete_floor 96 32 0 0.500000 0.500000 0 285212672 0 +( -2096 528 32 ) ( -2096 592 32 ) ( -2096 592 24 ) subway/con2 48 32 0 0.500000 0.500000 134217728 285212672 0 +( -2128 168 32 ) ( -2064 168 32 ) ( -2064 168 24 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( -2184 224 32 ) ( -2184 288 32 ) ( -2120 288 32 ) subway/1_stair_top1 16 44 0 0.500000 -0.400000 0 285212672 0 +( -2120 288 24 ) ( -2184 288 24 ) ( -2184 224 24 ) subway/1_concrete_floor 96 -48 0 0.500000 0.500000 0 285212672 0 +} +// brush 818 +{ +( -2104 136 128 ) ( -2208 136 128 ) ( -2208 128 136 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -2200 152 144 ) ( -2056 152 144 ) ( -2056 -216 144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2328 128 144 ) ( -2328 128 152 ) ( -2264 128 152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2208 144 136 ) ( -2208 144 144 ) ( -2208 -224 144 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( -2208 136 128 ) ( -2104 136 128 ) ( -2104 136 152 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -2104 152 144 ) ( -2104 152 136 ) ( -2104 -216 136 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 819 +{ +( -2256 184 256 ) ( -2256 128 256 ) ( -2256 128 248 ) subway/newpipe1 32 0 0 0.500000 0.500000 0 16777216 0 +( -2208 176 256 ) ( -2256 176 256 ) ( -2256 176 248 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2236 128 256 ) ( -2236 184 256 ) ( -2236 184 248 ) subway/newpipe1 32 0 0 0.500000 0.500000 0 16777216 0 +( -2256 160 256 ) ( -2208 160 256 ) ( -2208 160 248 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2256 128 256 ) ( -2256 184 256 ) ( -2208 184 256 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2208 184 248 ) ( -2256 184 248 ) ( -2256 128 248 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 820 +{ +( -2256 168 256 ) ( -2256 112 256 ) ( -2256 112 248 ) subway/newpipe1 32 0 0 0.500000 0.500000 0 16777216 0 +( -2208 160 256 ) ( -2256 160 256 ) ( -2256 160 248 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2208 112 256 ) ( -2208 168 256 ) ( -2208 168 248 ) subway/newpipe1 32 0 0 0.500000 0.500000 0 16777216 0 +( -2256 144 256 ) ( -2208 144 256 ) ( -2208 144 248 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2256 112 256 ) ( -2256 168 256 ) ( -2208 168 256 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2208 168 248 ) ( -2256 168 248 ) ( -2256 112 248 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 821 +{ +( -2256 200 256 ) ( -2256 144 256 ) ( -2256 144 248 ) subway/newpipe1 32 0 0 0.500000 0.500000 0 16777216 0 +( -2208 200 256 ) ( -2256 200 256 ) ( -2256 200 248 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2208 144 256 ) ( -2208 200 256 ) ( -2208 200 248 ) subway/newpipe1 32 0 0 0.500000 0.500000 0 16777216 0 +( -2256 176 256 ) ( -2208 176 256 ) ( -2208 176 248 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2256 144 256 ) ( -2256 200 256 ) ( -2208 200 256 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2208 200 248 ) ( -2256 200 248 ) ( -2256 144 248 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 822 +{ +( -2180 184 248 ) ( -2228 184 248 ) ( -2228 128 248 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2228 128 256 ) ( -2228 184 256 ) ( -2180 184 256 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2228 160 256 ) ( -2180 160 256 ) ( -2180 160 248 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2208 128 256 ) ( -2208 184 256 ) ( -2208 184 248 ) subway/newpipe1 32 0 0 0.500000 0.500000 0 16777216 0 +( -2180 176 256 ) ( -2228 176 256 ) ( -2228 176 248 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2220 184 256 ) ( -2220 128 256 ) ( -2220 128 248 ) subway/newpipe1 32 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 823 +{ +( -1712 112 192 ) ( -1736 112 192 ) ( -1736 80 192 ) subway/3_door6 16 64 0 1 1 0 251658240 0 +( -1736 80 276 ) ( -1736 112 276 ) ( -1712 112 276 ) subway/3_door6 16 64 0 1 1 0 251658240 0 +( -1736 48 192 ) ( -1712 48 192 ) ( -1712 48 184 ) subway/3_door6 16 64 0 1 1 0 251658240 0 +( -1728 72 192 ) ( -1728 104 192 ) ( -1728 104 184 ) subway/3_door6 16 64 0 1 1 0 251658240 0 +( -1712 112 192 ) ( -1736 112 192 ) ( -1736 112 184 ) subway/3_door6 16 64 0 1 1 0 251658240 0 +( -1736 112 192 ) ( -1736 80 192 ) ( -1736 80 184 ) subway/3_door6 48 64 0 -1 1 0 251658240 0 +} +// brush 824 +{ +( -2136 -40 224 ) ( -2136 24 224 ) ( -2136 24 216 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2424 -40 312 ) ( -2472 -40 312 ) ( -2472 -112 312 ) subway/3_redbrick 8 -16 0 1 1 0 385875968 0 +( -2472 -112 376 ) ( -2472 -40 376 ) ( -2424 -40 376 ) subway/3_redbrick 8 -16 0 1 1 0 385875968 0 +( -2208 -48 424 ) ( -2208 -120 424 ) ( -2208 -48 320 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2128 -176 424 ) ( -2200 -176 424 ) ( -2128 -176 320 ) subway/3_redbrick 8 32 0 1 1 0 385875968 0 +( -2520 -312 416 ) ( -2448 -312 416 ) ( -2520 -312 312 ) subway/3_redbrick 8 32 0 1 1 0 385875968 0 +} +// brush 825 +{ +( -2136 -48 224 ) ( -2136 16 224 ) ( -2136 16 216 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2184 -440 224 ) ( -2120 -440 224 ) ( -2120 -440 216 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2424 -48 312 ) ( -2472 -48 312 ) ( -2472 -120 312 ) subway/3_redbrick 8 -16 0 1 1 0 385875968 0 +( -2472 -120 376 ) ( -2472 -48 376 ) ( -2424 -48 376 ) subway/3_redbrick 8 -16 0 1 1 0 385875968 0 +( -2208 -48 424 ) ( -2208 -120 424 ) ( -2208 -48 320 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2128 -376 424 ) ( -2200 -376 424 ) ( -2128 -376 320 ) subway/3_redbrick 8 32 0 1 1 0 385875968 0 +} +// brush 826 +{ +( -2448 -112 416 ) ( -2520 -112 416 ) ( -2520 -112 312 ) subway/1_build_win 48 -8 0 1 1 0 620756992 0 +( -2136 -144 416 ) ( -2136 -96 416 ) ( -2136 -96 312 ) subway/1_build_win 48 -8 0 1 1 0 620756992 0 +( -2208 -176 424 ) ( -2136 -176 424 ) ( -2136 -176 320 ) subway/1_build_win 48 -8 0 1 1 0 620756992 0 +( -2208 -96 416 ) ( -2208 -144 416 ) ( -2208 -144 312 ) subway/1_build_win 48 -8 0 1 1 0 620756992 0 +( -2208 -96 376 ) ( -2136 -96 376 ) ( -2136 -144 376 ) subway/1_build_win 48 -8 0 1 1 0 620756992 0 +( -2136 -144 312 ) ( -2136 -96 312 ) ( -2208 -96 312 ) subway/1_build_win 48 -8 0 1 1 0 620756992 0 +} +// brush 827 +{ +( -2136 -56 224 ) ( -2200 -56 224 ) ( -2200 -56 216 ) subway/3_redbrick 24 56 0 1 1 0 385875968 0 +( -2136 -48 224 ) ( -2136 16 224 ) ( -2136 16 216 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2424 -48 312 ) ( -2472 -48 312 ) ( -2472 -120 312 ) subway/3_redbrick 8 -16 0 1 1 0 385875968 0 +( -2472 -120 376 ) ( -2472 -48 376 ) ( -2424 -48 376 ) subway/3_redbrick 8 -16 0 1 1 0 385875968 0 +( -2200 -48 424 ) ( -2200 -120 424 ) ( -2200 -48 320 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2520 -112 416 ) ( -2448 -112 416 ) ( -2520 -112 312 ) subway/3_redbrick 8 32 0 1 1 0 385875968 0 +} +// brush 828 +{ +( -2264 -368 416 ) ( -2264 -440 416 ) ( -2264 -440 312 ) subway/3_redbrick_window_a 0 32 0 0.500000 0.500000 0 620756992 0 +( -2232 -56 416 ) ( -2280 -56 416 ) ( -2280 -56 312 ) subway/3_redbrick_window_a -40 56 0 1 1 0 620756992 0 +( -2200 -120 424 ) ( -2200 -48 424 ) ( -2200 -48 320 ) subway/3_redbrick_window_a 0 32 0 0.500000 0.500000 0 620756992 0 +( -2280 -440 416 ) ( -2232 -440 416 ) ( -2232 -440 312 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2280 -120 376 ) ( -2280 -48 376 ) ( -2232 -48 376 ) subway/3_redbrick_window_a 0 32 0 0.500000 0.500000 0 620756992 0 +( -2232 -48 312 ) ( -2280 -48 312 ) ( -2280 -120 312 ) subway/3_redbrick_window_a 0 32 0 0.500000 0.500000 0 620756992 0 +} +// brush 829 +{ +( -2136 -56 224 ) ( -2200 -56 224 ) ( -2200 -56 216 ) subway/3_redbrick 24 56 0 1 1 0 385875968 0 +( -2184 -440 224 ) ( -2120 -440 224 ) ( -2120 -440 216 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2424 -48 312 ) ( -2472 -48 312 ) ( -2472 -120 312 ) subway/3_redbrick 8 -16 0 1 1 0 385875968 0 +( -2472 -120 376 ) ( -2472 -48 376 ) ( -2424 -48 376 ) subway/3_redbrick 8 -16 0 1 1 0 385875968 0 +( -2392 -48 424 ) ( -2392 -120 424 ) ( -2392 -48 320 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2264 -440 416 ) ( -2264 -368 416 ) ( -2264 -440 312 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +} +// brush 830 +{ +( -2456 -368 416 ) ( -2456 -440 416 ) ( -2456 -440 312 ) subway/3_redbrick_window_a 0 56 0 1 1 0 620756992 0 +( -2424 -56 416 ) ( -2472 -56 416 ) ( -2472 -56 312 ) subway/3_redbrick_window_ad2 24 -8 0 1 1 0 0 0 +( -2392 -128 424 ) ( -2392 -56 424 ) ( -2392 -56 320 ) subway/3_redbrick 56 48 0 1 1 0 385875968 0 +( -2472 -440 416 ) ( -2424 -440 416 ) ( -2424 -440 312 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2472 -120 376 ) ( -2472 -48 376 ) ( -2424 -48 376 ) subway/3_redbrick_window_a 24 0 0 1 1 0 620756992 0 +( -2424 -48 312 ) ( -2472 -48 312 ) ( -2472 -120 312 ) subway/3_redbrick_window_a 24 0 0 1 1 0 620756992 0 +} +// brush 831 +{ +( -2136 -56 224 ) ( -2200 -56 224 ) ( -2200 -56 216 ) subway/3_redbrick 8 32 0 1 1 0 385875968 0 +( -2184 -440 224 ) ( -2120 -440 224 ) ( -2120 -440 216 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2528 -24 224 ) ( -2528 -88 224 ) ( -2528 -88 216 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2424 -48 312 ) ( -2472 -48 312 ) ( -2472 -120 312 ) subway/3_redbrick 8 -16 0 1 1 0 385875968 0 +( -2472 -120 376 ) ( -2472 -48 376 ) ( -2424 -48 376 ) subway/3_redbrick 8 -16 0 1 1 0 385875968 0 +( -2456 -440 416 ) ( -2456 -368 416 ) ( -2456 -440 312 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +} +// brush 832 +{ +( -2136 -56 224 ) ( -2200 -56 224 ) ( -2200 -56 216 ) subway/3_redbrick 24 56 0 1 1 0 385875968 0 +( -2136 -48 224 ) ( -2136 16 224 ) ( -2136 16 216 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2184 -440 224 ) ( -2120 -440 224 ) ( -2120 -440 216 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2528 -24 224 ) ( -2528 -88 224 ) ( -2528 -88 216 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2200 8 392 ) ( -2136 8 392 ) ( -2136 -56 392 ) subway/3_redbrick 8 -16 0 1 1 0 385875968 0 +( -2472 -48 376 ) ( -2472 -120 376 ) ( -2424 -48 376 ) subway/3_redbrick 8 -16 0 1 1 0 385875968 0 +} +// brush 833 +{ +( -2136 -56 224 ) ( -2200 -56 224 ) ( -2200 -56 216 ) subway/3_redbrick 24 56 0 1 1 0 385875968 0 +( -2136 -48 224 ) ( -2136 16 224 ) ( -2136 16 216 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2184 -440 224 ) ( -2120 -440 224 ) ( -2120 -440 216 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2528 -24 224 ) ( -2528 -88 224 ) ( -2528 -88 216 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2136 -56 288 ) ( -2136 8 288 ) ( -2200 8 288 ) subway/3_redbrick 8 -16 0 1 1 0 385875968 0 +( -2472 -48 312 ) ( -2424 -48 312 ) ( -2472 -120 312 ) subway/3_redbrick 8 -16 0 1 1 0 385875968 0 +} +// brush 834 +{ +( -2136 -344 312 ) ( -2136 -296 312 ) ( -2208 -296 312 ) subway/3_redbrick_window_a 32 0 0 1 1 0 620756992 0 +( -2208 -296 376 ) ( -2136 -296 376 ) ( -2136 -344 376 ) subway/3_redbrick_window_a 32 0 0 1 1 0 620756992 0 +( -2208 -296 416 ) ( -2208 -344 416 ) ( -2208 -344 312 ) subway/3_redbrick_window_a 56 56 0 1 1 0 620756992 0 +( -2200 -376 424 ) ( -2128 -376 424 ) ( -2128 -376 320 ) subway/3_redbrick_window_a 32 56 0 1 1 0 620756992 0 +( -2136 -344 416 ) ( -2136 -296 416 ) ( -2136 -296 312 ) subway/1_build_win -8 -8 0 1 1 0 620756992 0 +( -2456 -312 416 ) ( -2528 -312 416 ) ( -2528 -312 312 ) subway/3_redbrick_window_a 32 56 0 1 1 0 620756992 0 +} +// brush 835 +{ +( -2216 -64 168 ) ( -2216 -96 168 ) ( -2216 -96 160 ) subway/3_door3 24 64 0 1 1 0 16777216 0 +( -2192 -64 168 ) ( -2216 -64 168 ) ( -2216 -64 160 ) subway/3_door3 16 64 0 1 1 0 16777216 0 +( -2208 -104 168 ) ( -2208 -72 168 ) ( -2208 -72 160 ) subway/3_door5 0 40 0 1 1 0 251658240 0 +( -2216 -128 168 ) ( -2192 -128 168 ) ( -2192 -128 160 ) subway/3_door3 16 64 0 1 1 0 16777216 0 +( -2216 -96 252 ) ( -2216 -64 252 ) ( -2192 -64 252 ) subway/3_door3 16 -88 0 1 1 0 16777216 0 +( -2192 -64 168 ) ( -2216 -64 168 ) ( -2216 -96 168 ) subway/3_door3 16 -88 0 1 1 0 16777216 0 +} +// brush 836 +{ +( -1768 456 184 ) ( -1768 392 184 ) ( -1768 392 176 ) subway/con2 32 32 0 0.500000 0.500000 0 285212672 0 +( -1688 144 184 ) ( -1752 144 184 ) ( -1752 144 176 ) subway/con2 0 32 0 0.500000 0.500000 0 285212672 0 +( -1736 384 184 ) ( -1736 448 184 ) ( -1736 448 176 ) subway/con2 32 32 0 0.500000 0.500000 0 285212672 0 +( -1744 136 184 ) ( -1680 136 184 ) ( -1680 136 176 ) subway/con2 0 32 0 0.500000 0.500000 0 285212672 0 +( -1768 392 192 ) ( -1768 456 192 ) ( -1704 456 192 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1704 456 184 ) ( -1768 456 184 ) ( -1768 392 184 ) subway/con2 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 837 +{ +( -1752 448 160 ) ( -1816 448 160 ) ( -1816 384 160 ) subway/con2 0 -32 0 0.500000 0.500000 0 285212672 0 +( -1768 144 192 ) ( -1768 136 192 ) ( -1816 136 168 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1792 136 160 ) ( -1728 136 160 ) ( -1728 136 152 ) subway/con2 0 0 0 0.500000 0.500000 0 285212672 0 +( -1768 136 192 ) ( -1768 144 192 ) ( -1768 144 160 ) subway/con2 32 0 0 0.500000 0.500000 0 285212672 0 +( -1736 144 160 ) ( -1800 144 160 ) ( -1800 144 152 ) subway/con2 0 0 0 0.500000 0.500000 0 285212672 0 +( -1816 448 160 ) ( -1816 384 160 ) ( -1816 384 152 ) subway/con2 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 838 +{ +( -1752 448 160 ) ( -1816 448 160 ) ( -1816 384 160 ) subway/1_concrete_floor 0 -96 0 0.500000 0.500000 0 285212672 0 +( -1816 384 168 ) ( -1816 448 168 ) ( -1752 448 168 ) subway/1_stair_top1 15 52 90 0.500000 0.300000 0 285212672 0 +( -1792 24 160 ) ( -1728 24 160 ) ( -1728 24 152 ) subway/1_concrete_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( -1800 376 160 ) ( -1800 440 160 ) ( -1800 440 152 ) subway/1_concrete_floor 96 32 0 0.500000 0.500000 0 285212672 0 +( -1736 136 160 ) ( -1800 136 160 ) ( -1800 136 152 ) subway/1_concrete_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( -1816 448 160 ) ( -1816 384 160 ) ( -1816 384 152 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 839 +{ +( -1784 448 176 ) ( -1784 384 176 ) ( -1784 384 168 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( -1704 136 176 ) ( -1768 136 176 ) ( -1768 136 168 ) subway/1_concrete_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( -1768 376 176 ) ( -1768 440 176 ) ( -1768 440 168 ) subway/1_concrete_floor 96 32 0 0.500000 0.500000 0 285212672 0 +( -1760 24 176 ) ( -1696 24 176 ) ( -1696 24 168 ) subway/1_concrete_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( -1784 384 184 ) ( -1784 448 184 ) ( -1720 448 184 ) subway/1_stair_top1 15 10 90 0.500000 0.300000 0 285212672 0 +( -1720 448 176 ) ( -1784 448 176 ) ( -1784 384 176 ) subway/1_concrete_floor 0 -96 0 0.500000 0.500000 0 285212672 0 +} +// brush 840 +{ +( -1800 448 168 ) ( -1800 384 168 ) ( -1800 384 160 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( -1720 136 168 ) ( -1784 136 168 ) ( -1784 136 160 ) subway/1_concrete_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( -1784 376 168 ) ( -1784 440 168 ) ( -1784 440 160 ) subway/1_concrete_floor 96 32 0 0.500000 0.500000 0 285212672 0 +( -1776 24 168 ) ( -1712 24 168 ) ( -1712 24 160 ) subway/1_concrete_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( -1800 384 176 ) ( -1800 448 176 ) ( -1736 448 176 ) subway/1_stair_top1 15 62 90 0.500000 0.300000 0 285212672 0 +( -1736 448 168 ) ( -1800 448 168 ) ( -1800 384 168 ) subway/1_concrete_floor 0 -96 0 0.500000 0.500000 0 285212672 0 +} +// brush 841 +{ +( -1768 448 184 ) ( -1768 384 184 ) ( -1768 384 176 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( -1688 136 184 ) ( -1752 136 184 ) ( -1752 136 176 ) subway/1_concrete_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( -1736 376 184 ) ( -1736 440 184 ) ( -1736 440 176 ) subway/1_concrete_floor 96 32 0 0.500000 0.500000 0 285212672 0 +( -1744 24 184 ) ( -1680 24 184 ) ( -1680 24 176 ) subway/1_concrete_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( -1768 384 192 ) ( -1768 448 192 ) ( -1704 448 192 ) subway/3_street 0 -32 0 0.500000 0.500000 0 285212672 0 +( -1704 448 184 ) ( -1768 448 184 ) ( -1768 384 184 ) subway/1_concrete_floor 0 -96 0 0.500000 0.500000 0 285212672 0 +} +// brush 842 +{ +( -1752 464 192 ) ( -1816 464 192 ) ( -1816 400 192 ) subway/3_grocery1 0 -32 0 0.500000 0.500000 0 335544320 0 +( -1816 392 240 ) ( -1816 456 240 ) ( -1752 456 240 ) subway/3_grocery1 0 -32 0 0.500000 0.500000 0 335544320 0 +( -1760 280 224 ) ( -1696 280 224 ) ( -1696 280 216 ) subway/3_grocery1 0 32 0 0.500000 0.500000 0 335544320 0 +( -1592 616 224 ) ( -1592 680 224 ) ( -1592 680 216 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +( -1744 760 224 ) ( -1808 760 224 ) ( -1808 760 216 ) subway/3_grocery1 0 32 0 0.500000 0.500000 0 335544320 0 +( -1816 496 296 ) ( -1816 432 296 ) ( -1816 432 288 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +} +// brush 843 +{ +( -1816 496 240 ) ( -1816 432 240 ) ( -1816 432 232 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -1752 760 168 ) ( -1816 760 168 ) ( -1816 760 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -1592 792 168 ) ( -1592 856 168 ) ( -1592 856 160 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -1760 280 168 ) ( -1696 280 168 ) ( -1696 280 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -1816 392 192 ) ( -1816 456 192 ) ( -1752 456 192 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -1752 464 160 ) ( -1816 464 160 ) ( -1816 400 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 844 +{ +( -1784 608 352 ) ( -1800 608 352 ) ( -1800 584 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -1800 608 464 ) ( -1784 608 464 ) ( -1784 592 464 ) subway/metal2 47 32 90 1 1 0 16777216 0 +( -1800 592 456 ) ( -1784 592 456 ) ( -1784 592 352 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -1784 584 480 ) ( -1784 608 480 ) ( -1784 608 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -1784 608 464 ) ( -1800 608 464 ) ( -1800 608 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1800 608 480 ) ( -1800 584 480 ) ( -1800 584 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 845 +{ +( -1800 608 464 ) ( -1816 608 464 ) ( -1816 608 448 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1816 592 448 ) ( -1816 592 464 ) ( -1800 592 464 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -1800 592 464 ) ( -1832 592 464 ) ( -1832 608 464 ) subway/metal2 47 32 90 1 1 0 16777216 0 +( -1800 608 464 ) ( -1800 608 432 ) ( -1800 592 432 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -1800 608 432 ) ( -1832 608 464 ) ( -1832 592 464 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 846 +{ +( -1800 592 384 ) ( -1832 592 352 ) ( -1832 608 352 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +( -1800 592 352 ) ( -1800 592 384 ) ( -1800 608 384 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -1800 608 352 ) ( -1832 608 352 ) ( -1832 592 352 ) subway/metal_rust 0 -32 0 0.500000 0.500000 0 16777216 0 +( -1816 608 368 ) ( -1816 608 352 ) ( -1800 608 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1800 592 352 ) ( -1816 592 352 ) ( -1816 592 368 ) subway/metal2 0 32 90 1 1 0 16777216 0 +} +// brush 847 +{ +( -1896 592 368 ) ( -1896 592 352 ) ( -1912 592 352 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -1912 608 352 ) ( -1896 608 352 ) ( -1896 608 368 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1880 592 352 ) ( -1880 608 352 ) ( -1912 608 352 ) subway/metal_rust 0 -32 0 0.500000 0.500000 0 16777216 0 +( -1912 608 384 ) ( -1912 592 384 ) ( -1912 592 352 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -1880 608 352 ) ( -1880 592 352 ) ( -1912 592 384 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 848 +{ +( -1880 592 464 ) ( -1880 608 464 ) ( -1912 608 432 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +( -1912 592 432 ) ( -1912 608 432 ) ( -1912 608 464 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -1880 608 464 ) ( -1880 592 464 ) ( -1912 592 464 ) subway/metal2 47 32 90 1 1 0 16777216 0 +( -1912 592 464 ) ( -1896 592 464 ) ( -1896 592 448 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -1896 608 448 ) ( -1896 608 464 ) ( -1912 608 464 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 849 +{ +( -1928 608 464 ) ( -1944 608 464 ) ( -1944 608 448 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1944 592 448 ) ( -1944 592 464 ) ( -1928 592 464 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -1928 592 464 ) ( -1960 592 464 ) ( -1960 608 464 ) subway/metal2 47 32 90 1 1 0 16777216 0 +( -1928 608 464 ) ( -1928 608 432 ) ( -1928 592 432 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -1928 608 432 ) ( -1960 608 464 ) ( -1960 592 464 ) subway/metalrib1 31 1 90 0.500000 0.500000 0 16777216 0 +} +// brush 850 +{ +( -1928 592 384 ) ( -1960 592 352 ) ( -1960 608 352 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +( -1928 592 352 ) ( -1928 592 384 ) ( -1928 608 384 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -1928 608 352 ) ( -1960 608 352 ) ( -1960 592 352 ) subway/metal_rust 0 -32 0 0.500000 0.500000 0 16777216 0 +( -1944 608 368 ) ( -1944 608 352 ) ( -1928 608 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1928 592 352 ) ( -1944 592 352 ) ( -1944 592 368 ) subway/metal2 0 32 90 1 1 0 16777216 0 +} +// brush 851 +{ +( -2024 592 368 ) ( -2024 592 352 ) ( -2040 592 352 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -2040 608 352 ) ( -2024 608 352 ) ( -2024 608 368 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2008 592 352 ) ( -2008 608 352 ) ( -2040 608 352 ) subway/metal_rust 0 -32 0 0.500000 0.500000 0 16777216 0 +( -2040 608 384 ) ( -2040 592 384 ) ( -2040 592 352 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -2008 608 352 ) ( -2008 592 352 ) ( -2040 592 384 ) subway/metalrib1 31 1 90 0.500000 0.500000 0 16777216 0 +} +// brush 852 +{ +( -2008 592 464 ) ( -2008 608 464 ) ( -2040 608 432 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +( -2040 592 432 ) ( -2040 608 432 ) ( -2040 608 464 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -2008 608 464 ) ( -2008 592 464 ) ( -2040 592 464 ) subway/metal2 47 33 90 1 1 0 16777216 0 +( -2040 592 464 ) ( -2024 592 464 ) ( -2024 592 448 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -2024 608 448 ) ( -2024 608 464 ) ( -2040 608 464 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 853 +{ +( -2056 608 464 ) ( -2072 608 464 ) ( -2072 608 448 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2072 592 448 ) ( -2072 592 464 ) ( -2056 592 464 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -2056 592 464 ) ( -2088 592 464 ) ( -2088 608 464 ) subway/metal2 47 32 90 1 1 0 16777216 0 +( -2056 608 464 ) ( -2056 608 432 ) ( -2056 592 432 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -2056 608 432 ) ( -2088 608 464 ) ( -2088 592 464 ) subway/metalrib1 31 1 90 0.500000 0.500000 0 16777216 0 +} +// brush 854 +{ +( -2056 592 384 ) ( -2088 592 352 ) ( -2088 608 352 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +( -2056 592 352 ) ( -2056 592 384 ) ( -2056 608 384 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -2056 608 352 ) ( -2088 608 352 ) ( -2088 592 352 ) subway/metal_rust 0 -32 0 0.500000 0.500000 0 16777216 0 +( -2072 608 368 ) ( -2072 608 352 ) ( -2056 608 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2056 592 352 ) ( -2072 592 352 ) ( -2072 592 368 ) subway/metal2 0 32 90 1 1 0 16777216 0 +} +// brush 855 +{ +( -2152 608 448 ) ( -2152 608 464 ) ( -2168 608 464 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2168 592 464 ) ( -2152 592 464 ) ( -2152 592 448 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -2136 608 464 ) ( -2136 592 464 ) ( -2168 592 464 ) subway/metal2 47 33 90 1 1 0 16777216 0 +( -2168 592 432 ) ( -2168 608 432 ) ( -2168 608 464 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -2136 592 464 ) ( -2136 608 464 ) ( -2168 608 432 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 856 +{ +( -2136 608 352 ) ( -2136 592 352 ) ( -2168 592 384 ) subway/metalrib1 31 1 90 0.500000 0.500000 0 16777216 0 +( -2168 608 384 ) ( -2168 592 384 ) ( -2168 592 352 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -2136 592 352 ) ( -2136 608 352 ) ( -2168 608 352 ) subway/metal_rust 0 -32 0 0.500000 0.500000 0 16777216 0 +( -2168 608 352 ) ( -2152 608 352 ) ( -2152 608 368 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2152 592 368 ) ( -2152 592 352 ) ( -2168 592 352 ) subway/metal2 0 32 90 1 1 0 16777216 0 +} +// brush 857 +{ +( -1672 592 352 ) ( -1688 592 352 ) ( -1688 592 368 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -1688 608 368 ) ( -1688 608 352 ) ( -1672 608 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1672 608 352 ) ( -1704 608 352 ) ( -1704 592 352 ) subway/metal_rust 0 -32 0 0.500000 0.500000 0 16777216 0 +( -1672 592 352 ) ( -1672 592 384 ) ( -1672 608 384 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -1672 592 384 ) ( -1704 592 352 ) ( -1704 608 352 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 858 +{ +( -1672 608 432 ) ( -1704 608 464 ) ( -1704 592 464 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +( -1672 608 464 ) ( -1672 608 432 ) ( -1672 592 432 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -1672 592 464 ) ( -1704 592 464 ) ( -1704 608 464 ) subway/metal2 47 32 90 1 1 0 16777216 0 +( -1688 592 448 ) ( -1688 592 464 ) ( -1672 592 464 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -1672 608 464 ) ( -1688 608 464 ) ( -1688 608 448 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 859 +{ +( -1752 608 352 ) ( -1752 592 352 ) ( -1784 592 384 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +( -1784 608 384 ) ( -1784 592 384 ) ( -1784 592 352 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -1752 592 352 ) ( -1752 608 352 ) ( -1784 608 352 ) subway/metal_rust 0 -32 0 0.500000 0.500000 0 16777216 0 +( -1784 608 352 ) ( -1768 608 352 ) ( -1768 608 368 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1768 592 368 ) ( -1768 592 352 ) ( -1784 592 352 ) subway/metal2 0 32 90 1 1 0 16777216 0 +} +// brush 860 +{ +( -1768 608 448 ) ( -1768 608 464 ) ( -1784 608 464 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1784 592 464 ) ( -1768 592 464 ) ( -1768 592 448 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -1752 608 464 ) ( -1752 592 464 ) ( -1784 592 464 ) subway/metal2 47 32 90 1 1 0 16777216 0 +( -1784 592 432 ) ( -1784 608 432 ) ( -1784 608 464 ) subway/metal_rust 32 0 0 0.500000 0.500000 0 16777216 0 +( -1752 592 464 ) ( -1752 608 464 ) ( -1784 608 432 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 861 +{ +( -2184 608 480 ) ( -2184 584 480 ) ( -2184 584 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2168 608 464 ) ( -2184 608 464 ) ( -2184 608 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2168 584 480 ) ( -2168 608 480 ) ( -2168 608 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2184 592 456 ) ( -2168 592 456 ) ( -2168 592 352 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -2184 608 464 ) ( -2168 608 464 ) ( -2168 592 464 ) subway/metal2 47 32 90 1 1 0 16777216 0 +( -2168 608 352 ) ( -2184 608 352 ) ( -2184 584 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 862 +{ +( -2224 440 464 ) ( -2368 440 464 ) ( -2368 264 464 ) subway/1_black 7 15 90 2 2 0 16777216 0 +( -2368 264 480 ) ( -2368 440 480 ) ( -2224 440 480 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2360 216 384 ) ( -2216 216 384 ) ( -2216 216 368 ) subway/3_redbrick_trim 0 0 0 1 1 0 285212672 0 +( -2240 272 384 ) ( -2240 448 384 ) ( -2240 448 368 ) subway/3_redbrick_trim 0 0 0 1 1 0 285212672 0 +( -2184 528 384 ) ( -2328 528 384 ) ( -2328 528 368 ) subway/3_redbrick_trim 0 0 0 1 1 0 285212672 0 +( -2680 456 384 ) ( -2680 280 384 ) ( -2680 280 368 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 863 +{ +( -2256 360 440 ) ( -2256 312 440 ) ( -2240 360 440 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -2248 408 368 ) ( -2248 232 368 ) ( -2248 232 352 ) subway/2_oldceiling2 0 -8 0 1 1 0 385875968 0 +( -2184 496 368 ) ( -2328 496 368 ) ( -2328 496 352 ) subway/2_oldceiling2 16 -8 0 1 1 0 385875968 0 +( -2240 296 368 ) ( -2240 472 368 ) ( -2240 472 352 ) subway/3_market1_top 0 -32 0 0.500000 0.500000 0 385875968 0 +( -2360 248 368 ) ( -2216 248 368 ) ( -2216 248 352 ) subway/3_market1_top 32 -32 0 0.500000 0.500000 0 385875968 0 +( -2368 264 464 ) ( -2368 440 464 ) ( -2224 440 464 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +} +// brush 864 +{ +( -2416 144 256 ) ( -2416 144 328 ) ( -2512 144 328 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2520 136 184 ) ( -2520 136 224 ) ( -2520 128 224 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2416 136 184 ) ( -2416 136 224 ) ( -2368 136 224 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2416 144 328 ) ( -2416 144 256 ) ( -2416 136 256 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2520 136 328 ) ( -2520 144 328 ) ( -2472 144 328 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2472 144 256 ) ( -2520 144 256 ) ( -2520 136 256 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +} +// brush 865 +{ +( -2520 144 256 ) ( -2208 144 256 ) ( -2208 144 280 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2352 136 184 ) ( -2352 136 224 ) ( -2352 128 224 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2248 136 184 ) ( -2248 136 224 ) ( -2200 136 224 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2200 136 280 ) ( -2208 144 280 ) ( -2208 144 256 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2360 136 328 ) ( -2360 144 328 ) ( -2312 144 328 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2312 144 256 ) ( -2360 144 256 ) ( -2360 136 256 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +} +// brush 866 +{ +( -2208 360 344 ) ( -2208 304 344 ) ( -2208 304 272 ) subway/3_grocery1_window 232 4 0 1 1 0 620756992 0 +( -2192 344 352 ) ( -2208 344 352 ) ( -2208 344 280 ) subway/3_grocery1_window 232 4 0 1 1 0 620756992 0 +( -2200 272 344 ) ( -2200 328 344 ) ( -2200 328 272 ) subway/3_grocery1_window_wide 48 4 0 1 1 0 620756992 0 +( -2208 208 336 ) ( -2192 208 336 ) ( -2192 208 264 ) subway/3_grocery1_window 232 4 0 1 1 0 620756992 0 +( -2208 304 328 ) ( -2208 360 328 ) ( -2192 360 328 ) subway/3_grocery1_window 232 4 0 1 1 0 620756992 0 +( -2192 360 264 ) ( -2208 360 264 ) ( -2208 304 264 ) subway/3_grocery1_window 232 4 0 1 1 0 620756992 0 +} +// brush 867 +{ +( -2208 552 344 ) ( -2208 496 344 ) ( -2208 496 272 ) subway/3_grocery1_window_wide_l -32 0 0 1 1 0 620756992 0 +( -2192 544 352 ) ( -2208 544 352 ) ( -2208 544 280 ) subway/3_grocery1_window_wide_l -32 0 0 1 1 0 620756992 0 +( -2200 472 344 ) ( -2200 528 344 ) ( -2200 528 272 ) subway/3_grocery1_window_wide_l -32 4 0 1 1 0 620756992 0 +( -2208 416 336 ) ( -2192 416 336 ) ( -2192 416 264 ) subway/3_grocery1_window_wide_l -32 0 0 1 1 0 620756992 0 +( -2208 496 328 ) ( -2208 552 328 ) ( -2192 552 328 ) subway/3_grocery1_window_wide_l -32 0 0 1 1 0 620756992 0 +( -2192 552 264 ) ( -2208 552 264 ) ( -2208 496 264 ) subway/3_grocery1_window_wide_l -32 0 0 1 1 0 620756992 0 +} +// brush 868 +{ +( -2208 328 328 ) ( -2208 328 256 ) ( -2208 392 256 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2192 544 224 ) ( -2200 544 224 ) ( -2200 544 184 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2200 240 224 ) ( -2200 288 224 ) ( -2200 288 184 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2208 416 248 ) ( -2208 416 320 ) ( -2200 416 320 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2208 504 264 ) ( -2208 552 264 ) ( -2200 552 264 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2200 552 256 ) ( -2208 552 256 ) ( -2208 504 256 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +} +// brush 869 +{ +( -2208 264 328 ) ( -2208 264 256 ) ( -2208 328 256 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +( -2192 416 224 ) ( -2200 416 224 ) ( -2200 416 184 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +( -2200 80 224 ) ( -2200 128 224 ) ( -2200 128 184 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2208 344 240 ) ( -2208 344 312 ) ( -2200 344 312 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +( -2208 440 328 ) ( -2208 488 328 ) ( -2200 488 328 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +( -2200 488 256 ) ( -2208 488 256 ) ( -2208 440 256 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +} +// brush 870 +{ +( -2240 360 376 ) ( -2256 360 376 ) ( -2256 312 376 ) subway/1_build_win 96 -8 0 1 1 0 620756992 0 +( -2256 312 440 ) ( -2256 360 440 ) ( -2240 360 440 ) subway/1_build_win 96 -8 0 1 1 0 620756992 0 +( -2296 288 520 ) ( -2280 288 520 ) ( -2280 288 400 ) subway/1_build_win 96 -8 0 1 1 0 620756992 0 +( -2240 312 520 ) ( -2240 360 520 ) ( -2240 360 400 ) subway/1_build_win 96 -8 0 1 1 0 620756992 0 +( -2280 352 520 ) ( -2296 352 520 ) ( -2296 352 400 ) subway/1_build_win 96 -8 0 1 1 0 620756992 0 +( -2248 352 520 ) ( -2248 304 520 ) ( -2248 304 400 ) subway/1_build_win 96 -8 0 1 1 0 620756992 0 +} +// brush 871 +{ +( -2672 120 160 ) ( -2672 56 160 ) ( -2672 56 152 ) subway/3_grocery1 8 8 0 0.500000 0.500000 0 335544320 0 +( -2440 760 160 ) ( -2504 760 160 ) ( -2504 760 152 ) subway/3_grocery1 40 8 0 0.500000 0.500000 0 335544320 0 +( -2520 24 232 ) ( -2520 88 232 ) ( -2520 88 224 ) subway/3_grocery1 8 8 0 0.500000 0.500000 0 335544320 0 +( -2496 -256 160 ) ( -2432 -256 160 ) ( -2432 -256 152 ) subway/3_grocery1 40 8 0 0.500000 0.500000 0 335544320 0 +( -2528 72 328 ) ( -2528 136 328 ) ( -2464 136 328 ) subway/3_grocery1 40 -56 0 0.500000 0.500000 0 335544320 0 +( -2464 144 256 ) ( -2528 144 256 ) ( -2528 80 256 ) subway/3_grocery1 40 -56 0 0.500000 0.500000 0 335544320 0 +} +// brush 872 +{ +( -2528 -32 328 ) ( -2528 -80 328 ) ( -2520 -80 328 ) subway/metalrib1 15 31 90 0.500000 0.500000 0 16777216 0 +( -2528 120 344 ) ( -2504 144 344 ) ( -2504 -192 344 ) subway/metal2 20 -52 0 2 2 0 16777216 0 +( -2528 144 344 ) ( -2528 144 328 ) ( -2520 136 328 ) subway/metalrib1 -16 0 90 0.500000 0.500000 0 16777216 0 +( -2520 -184 328 ) ( -2504 -184 344 ) ( -2504 152 344 ) subway/metalrib1 0 -16 0 0.500000 0.500000 0 16777216 0 +( -2504 -56 200 ) ( -2504 -56 240 ) ( -2496 -56 240 ) subway/metalrib1 -15 0 90 0.500000 0.500000 0 16777216 0 +( -2528 104 328 ) ( -2528 104 344 ) ( -2528 -48 344 ) subway/metalrib1 -16 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 873 +{ +( -2552 144 344 ) ( -2552 144 328 ) ( -2208 144 328 ) subway/metalrib1 -15 0 90 0.500000 0.500000 0 16777216 0 +( -2528 144 328 ) ( -2528 144 344 ) ( -2504 120 344 ) subway/metalrib1 -15 0 90 0.500000 0.500000 0 16777216 0 +( -2496 136 328 ) ( -2496 120 344 ) ( -2160 120 344 ) subway/metalrib1 16 31 90 0.500000 0.500000 0 16777216 0 +( -2200 136 336 ) ( -2208 144 336 ) ( -2208 144 328 ) subway/metalrib1 -15 0 90 0.500000 0.500000 0 16777216 0 +( -2216 144 344 ) ( -2192 120 344 ) ( -2528 120 344 ) subway/metal2 4 -52 0 2 2 0 16777216 0 +( -2368 144 328 ) ( -2416 144 328 ) ( -2416 136 328 ) subway/metalrib1 16 31 90 0.500000 0.500000 0 16777216 0 +} +// brush 874 +{ +( -2528 128 128 ) ( -2528 64 128 ) ( -2528 64 120 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +( -2464 144 128 ) ( -2528 144 128 ) ( -2528 144 120 ) subway/3_grocery1 0 32 0 0.500000 0.500000 0 335544320 0 +( -2520 24 200 ) ( -2520 88 200 ) ( -2520 88 192 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +( -2496 -256 128 ) ( -2432 -256 128 ) ( -2432 -256 120 ) subway/3_grocery1 0 32 0 0.500000 0.500000 0 335544320 0 +( -2528 80 248 ) ( -2528 144 248 ) ( -2464 144 248 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -2464 144 192 ) ( -2528 144 192 ) ( -2528 80 192 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +} +// brush 875 +{ +( -2136 -56 232 ) ( -2200 -56 232 ) ( -2200 -56 224 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2136 -48 232 ) ( -2136 16 232 ) ( -2136 16 224 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2184 -440 232 ) ( -2120 -440 232 ) ( -2120 -440 224 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2528 -24 232 ) ( -2528 -88 232 ) ( -2528 -88 224 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2200 8 400 ) ( -2136 8 400 ) ( -2136 -56 400 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2136 -56 392 ) ( -2136 8 392 ) ( -2200 8 392 ) subway/1_black 8 0 0 1 1 0 16777216 0 +} +// brush 876 +{ +( -2136 -56 192 ) ( -2200 -56 192 ) ( -2200 -56 184 ) subway/3_grocery1 32 0 0 0.500000 0.500000 0 335544320 0 +( -2208 32 192 ) ( -2208 96 192 ) ( -2208 96 184 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -2176 -64 192 ) ( -2112 -64 192 ) ( -2112 -64 184 ) subway/3_grocery1 32 0 0 0.500000 0.500000 0 335544320 0 +( -2520 56 192 ) ( -2520 -8 192 ) ( -2520 -8 184 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -2200 88 248 ) ( -2136 88 248 ) ( -2136 24 248 ) subway/3_grocery1 32 0 0 0.500000 0.500000 0 335544320 0 +( -2136 24 192 ) ( -2136 88 192 ) ( -2200 88 192 ) subway/3_grocery1 32 0 0 0.500000 0.500000 0 335544320 0 +} +// brush 877 +{ +( -2128 -56 208 ) ( -2192 -56 208 ) ( -2192 -56 200 ) subway/3_cobble 32 0 0 0.500000 0.500000 0 318767104 0 +( -2136 -48 208 ) ( -2136 16 208 ) ( -2136 16 200 ) subway/3_cobble 0 0 0 0.500000 0.500000 0 318767104 0 +( -2184 -440 208 ) ( -2120 -440 208 ) ( -2120 -440 200 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( -2528 -24 208 ) ( -2528 -88 208 ) ( -2528 -88 200 ) subway/3_street 32 0 0 0.500000 0.500000 0 285212672 0 +( -2200 8 288 ) ( -2136 8 288 ) ( -2136 -56 288 ) subway/3_street 0 -32 0 0.500000 0.500000 0 285212672 0 +( -2136 -56 256 ) ( -2136 8 256 ) ( -2200 8 256 ) subway/3_street 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 878 +{ +( -2472 144 248 ) ( -2536 144 248 ) ( -2536 80 248 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -2536 80 256 ) ( -2536 144 256 ) ( -2472 144 256 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -2504 -256 152 ) ( -2440 -256 152 ) ( -2440 -256 144 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2520 24 224 ) ( -2520 88 224 ) ( -2520 88 216 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2472 144 152 ) ( -2536 144 152 ) ( -2536 144 144 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2536 128 152 ) ( -2536 64 152 ) ( -2536 64 144 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 879 +{ +( -2208 336 328 ) ( -2208 336 256 ) ( -2208 400 256 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2192 584 224 ) ( -2200 584 224 ) ( -2200 584 184 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2200 216 248 ) ( -2200 264 248 ) ( -2200 264 208 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2192 560 256 ) ( -2208 560 256 ) ( -2208 504 256 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2208 504 336 ) ( -2208 560 336 ) ( -2192 560 336 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2208 544 344 ) ( -2192 544 344 ) ( -2208 544 272 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +} +// brush 880 +{ +( -2188 -80 264 ) ( -2188 -92 264 ) ( -2188 -92 248 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( -2180 -80 264 ) ( -2188 -80 264 ) ( -2188 -80 248 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( -2172 -92 264 ) ( -2172 -80 264 ) ( -2172 -80 248 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( -2188 -96 264 ) ( -2180 -96 264 ) ( -2180 -96 248 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( -2188 -92 256 ) ( -2188 -80 256 ) ( -2180 -80 256 ) subway/1_black 8 -8 0 0.500000 0.500000 134217728 16777216 0 +( -2180 -80 248 ) ( -2188 -80 248 ) ( -2188 -92 248 ) subway/light_yellow 24 0 0 0.500000 0.500000 134217728 16777217 30000 +} +// brush 881 +{ +( -1928 608 480 ) ( -1928 584 480 ) ( -1928 584 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -1912 608 464 ) ( -1928 608 464 ) ( -1928 608 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1912 584 480 ) ( -1912 608 480 ) ( -1912 608 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -1928 592 456 ) ( -1912 592 456 ) ( -1912 592 352 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -1928 608 464 ) ( -1912 608 464 ) ( -1912 592 464 ) subway/metal2 47 33 90 1 1 0 16777216 0 +( -1912 608 352 ) ( -1928 608 352 ) ( -1928 584 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 882 +{ +( -1672 608 480 ) ( -1672 584 480 ) ( -1672 584 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -1656 608 464 ) ( -1672 608 464 ) ( -1672 608 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1656 584 480 ) ( -1656 608 480 ) ( -1656 608 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -1672 592 456 ) ( -1656 592 456 ) ( -1656 592 352 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -1672 608 464 ) ( -1656 608 464 ) ( -1656 592 464 ) subway/metal2 47 32 90 1 1 0 16777216 0 +( -1656 608 352 ) ( -1672 608 352 ) ( -1672 584 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 883 +{ +( -2312 608 352 ) ( -2328 608 352 ) ( -2328 584 352 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -2328 608 480 ) ( -2312 608 480 ) ( -2312 592 480 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2560 592 456 ) ( -2544 592 456 ) ( -2544 592 352 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -2312 584 480 ) ( -2312 608 480 ) ( -2312 608 352 ) subway/2_oldceiling2 0 0 0 1 1 0 385875968 0 +( -2312 608 464 ) ( -2328 608 464 ) ( -2328 608 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2680 584 480 ) ( -2680 560 480 ) ( -2680 560 352 ) subway/2_oldceiling2 0 0 0 1 1 0 385875968 0 +} +// brush 884 +{ +( -2128 816 504 ) ( -2128 880 504 ) ( -2192 880 504 ) subway/sky2 0 0 0 0.500000 0.500000 0 4 0 +( -2192 880 672 ) ( -2128 880 672 ) ( -2128 816 672 ) subway/sky2 0 0 0 0.500000 0.500000 0 4 0 +( -2680 848 328 ) ( -2680 784 328 ) ( -2680 784 320 ) subway/sky2 32 32 0 0.500000 0.500000 0 4 0 +( -1616 896 400 ) ( -1552 896 400 ) ( -1552 896 392 ) subway/sky2 0 32 0 0.500000 0.500000 0 5 15 +( -896 808 328 ) ( -896 872 328 ) ( -896 872 320 ) subway/sky2 32 32 0 0.500000 0.500000 0 4 0 +( -2024 904 328 ) ( -2088 904 328 ) ( -2088 904 320 ) subway/sky2 0 32 0 0.500000 0.500000 0 4 0 +} +// brush 885 +{ +( -2200 472 264 ) ( -2208 472 264 ) ( -2208 424 264 ) subway/3_grocery1 24 -40 0 1 1 0 335544320 0 +( -2208 424 328 ) ( -2208 472 328 ) ( -2200 472 328 ) subway/3_grocery1 24 -40 0 1 1 0 335544320 0 +( -2192 584 264 ) ( -2192 584 256 ) ( -2208 584 256 ) subway/3_grocery1 40 8 0 0.500000 0.500000 0 335544320 0 +( -1808 608 256 ) ( -1808 608 264 ) ( -1808 784 264 ) subway/3_grocery1 40 8 0 1 1 0 335544320 0 +( -2192 760 216 ) ( -2200 760 216 ) ( -2200 760 176 ) subway/3_grocery1 24 8 0 1 1 0 335544320 0 +( -2208 320 264 ) ( -2208 320 256 ) ( -2208 632 256 ) subway/3_grocery1 40 8 0 1 1 0 335544320 0 +} +// brush 886 +{ +( -2208 312 272 ) ( -2208 312 264 ) ( -2208 624 264 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -2192 752 224 ) ( -2200 752 224 ) ( -2200 752 184 ) subway/3_grocery1 16 0 0 0.500000 0.500000 0 335544320 0 +( -1808 600 264 ) ( -1808 600 272 ) ( -1808 776 272 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -2192 584 272 ) ( -2192 584 264 ) ( -2208 584 264 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2208 416 336 ) ( -2208 464 336 ) ( -2200 464 336 ) subway/3_grocery1 16 0 0 0.500000 0.500000 0 335544320 0 +( -2200 464 328 ) ( -2208 464 328 ) ( -2208 416 328 ) subway/3_grocery1 16 0 0 0.500000 0.500000 0 335544320 0 +} +// brush 887 +{ +( -2200 472 336 ) ( -2208 472 336 ) ( -2208 424 336 ) subway/3_grocery1 16 -48 0 0.500000 0.500000 0 335544320 0 +( -2208 424 352 ) ( -2208 472 352 ) ( -2200 472 352 ) subway/1_black 7 15 90 2 2 0 16777216 0 +( -2192 584 328 ) ( -2192 584 320 ) ( -2208 584 320 ) subway/metalrib1 31 16 90 0.500000 0.500000 0 16777216 0 +( -896 592 320 ) ( -896 592 328 ) ( -896 768 328 ) subway/3_grocery1 48 48 0 0.500000 0.500000 0 335544320 0 +( -2192 760 280 ) ( -2200 760 280 ) ( -2200 760 240 ) subway/3_grocery1 16 48 0 0.500000 0.500000 0 335544320 0 +( -2520 320 328 ) ( -2520 320 320 ) ( -2520 632 320 ) subway/3_grocery1 48 48 0 0.500000 0.500000 0 335544320 0 +} +// brush 888 +{ +( -2200 472 256 ) ( -2208 472 256 ) ( -2208 424 256 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -2208 424 264 ) ( -2208 472 264 ) ( -2200 472 264 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -2192 584 256 ) ( -2192 584 248 ) ( -2208 584 248 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1808 608 248 ) ( -1808 608 256 ) ( -1808 784 256 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2192 760 208 ) ( -2200 760 208 ) ( -2200 760 168 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2208 320 256 ) ( -2208 320 248 ) ( -2208 632 248 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 889 +{ +( -2200 472 224 ) ( -2208 472 224 ) ( -2208 424 224 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -2176 760 256 ) ( -2176 584 256 ) ( -2208 584 256 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -2208 584 224 ) ( -2208 584 248 ) ( -2200 584 248 ) subway/3_grocery1 0 32 0 0.500000 0.500000 0 335544320 0 +( -2176 584 248 ) ( -2176 760 248 ) ( -2200 760 224 ) subway/3_grocery1 32 16 90 0.500000 0.500000 0 335544320 0 +( -2192 760 192 ) ( -2200 760 192 ) ( -2200 760 152 ) subway/3_grocery1 0 32 0 0.500000 0.500000 0 335544320 0 +( -2208 408 248 ) ( -2208 408 224 ) ( -2208 760 224 ) subway/3_grocery1 0 32 0 0.500000 0.500000 0 335544320 0 +} +// brush 890 +{ +( -2200 296 192 ) ( -2208 296 192 ) ( -2208 248 192 ) subway/3_grocery1 0 -32 0 0.500000 0.500000 0 335544320 0 +( -2208 248 248 ) ( -2208 296 248 ) ( -2200 296 248 ) subway/3_grocery1 0 -32 0 0.500000 0.500000 0 335544320 0 +( -2208 144 192 ) ( -2208 144 248 ) ( -2200 136 248 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +( -2200 472 192 ) ( -2200 520 192 ) ( -2200 520 152 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +( -2184 760 192 ) ( -2192 760 192 ) ( -2192 760 152 ) subway/3_grocery1 0 32 0 0.500000 0.500000 0 335544320 0 +( -2208 144 248 ) ( -2208 144 192 ) ( -2208 760 192 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +} +// brush 891 +{ +( -1712 300 384 ) ( -1712 612 384 ) ( -1712 612 336 ) subway/3_market1 32 48 0 0.500000 0.500000 0 385875968 0 +( -1724 588 384 ) ( -1724 276 384 ) ( -1808 276 336 ) subway/3_shingle 63 16 270 1 1 0 402653184 0 +( -1720 272 336 ) ( -1720 584 336 ) ( -1808 584 336 ) subway/3_market1 0 -16 0 0.500000 0.500000 0 385875968 0 +( -1902 586 336 ) ( -1790 586 336 ) ( -1790 586 424 ) subway/3_market1 0 48 0 0.500000 0.500000 0 385875968 0 +( -1786 280 424 ) ( -1786 280 336 ) ( -1898 280 336 ) subway/newpipe1 16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 892 +{ +( -1820 496 400 ) ( -1820 432 400 ) ( -1820 432 392 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1744 592 320 ) ( -1808 592 320 ) ( -1808 592 312 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1592 488 320 ) ( -1592 552 320 ) ( -1592 552 312 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1760 280 320 ) ( -1696 280 320 ) ( -1696 280 312 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1816 392 336 ) ( -1816 456 336 ) ( -1752 456 336 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1752 464 328 ) ( -1816 464 328 ) ( -1816 400 328 ) subway/3_redbrick_trim 15 0 90 0.500000 0.500000 0 285212672 0 +} +// brush 893 +{ +( -1744 560 280 ) ( -1808 560 280 ) ( -1808 496 280 ) subway/3_market_window1 32 -32 0 0.500000 0.500000 0 620756992 0 +( -1808 496 312 ) ( -1808 560 312 ) ( -1744 560 312 ) subway/3_market_window1 32 -32 0 0.500000 0.500000 0 620756992 0 +( -1536 528 288 ) ( -1472 528 288 ) ( -1472 528 280 ) subway/3_market_window1 32 48 0 0.500000 0.500000 0 620756992 0 +( -1592 568 288 ) ( -1592 632 288 ) ( -1592 632 280 ) subway/3_market_window1 16 48 0 0.500000 0.500000 0 620756992 0 +( -1744 560 288 ) ( -1808 560 288 ) ( -1808 560 280 ) subway/3_market_window1 32 48 0 0.500000 0.500000 0 620756992 0 +( -1816 592 360 ) ( -1816 528 360 ) ( -1816 528 352 ) subway/1_build_win 160 -16 0 0.500000 0.500000 0 620756992 0 +} +// brush 894 +{ +( -1816 520 360 ) ( -1816 456 360 ) ( -1816 456 352 ) subway/1_build_win 112 -16 0 0.500000 0.500000 0 620756992 0 +( -1744 488 288 ) ( -1808 488 288 ) ( -1808 488 280 ) subway/3_market_window1 32 48 0 0.500000 0.500000 0 620756992 0 +( -1592 496 288 ) ( -1592 560 288 ) ( -1592 560 280 ) subway/3_market_window1 32 48 0 0.500000 0.500000 0 620756992 0 +( -1536 456 288 ) ( -1472 456 288 ) ( -1472 456 280 ) subway/3_market_window1 32 48 0 0.500000 0.500000 0 620756992 0 +( -1808 424 312 ) ( -1808 488 312 ) ( -1744 488 312 ) subway/3_market_window1 32 -48 0 0.500000 0.500000 0 620756992 0 +( -1744 488 280 ) ( -1808 488 280 ) ( -1808 424 280 ) subway/3_market_window1 32 -48 0 0.500000 0.500000 0 620756992 0 +} +// brush 895 +{ +( -1816 552 360 ) ( -1816 488 360 ) ( -1816 488 352 ) subway/2_oldceiling2 0 8 0 0.500000 0.500000 0 385875968 0 +( -1752 456 288 ) ( -1816 456 288 ) ( -1816 456 280 ) subway/2_oldceiling2 16 8 0 1 1 0 385875968 0 +( -1592 464 288 ) ( -1592 528 288 ) ( -1592 528 280 ) subway/2_oldceiling2 0 8 0 1 1 0 385875968 0 +( -1752 408 288 ) ( -1688 408 288 ) ( -1688 408 280 ) subway/2_oldceiling2 16 8 0 1 1 0 385875968 0 +( -1816 400 312 ) ( -1816 464 312 ) ( -1752 464 312 ) subway/2_oldceiling2 16 -24 0 1 1 0 385875968 0 +( -1752 464 280 ) ( -1816 464 280 ) ( -1816 400 280 ) subway/2_oldceiling2 16 -24 0 1 1 0 385875968 0 +} +// brush 896 +{ +( -1752 536 280 ) ( -1816 536 280 ) ( -1816 472 280 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -1816 472 312 ) ( -1816 536 312 ) ( -1752 536 312 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -1752 488 288 ) ( -1688 488 288 ) ( -1688 488 280 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -1592 536 288 ) ( -1592 600 288 ) ( -1592 600 280 ) subway/2_oldceiling2 0 0 0 1 1 0 385875968 0 +( -1752 528 288 ) ( -1816 528 288 ) ( -1816 528 280 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -1816 624 360 ) ( -1816 560 360 ) ( -1816 560 352 ) subway/2_oldceiling2 0 8 0 0.500000 0.500000 0 385875968 0 +} +// brush 897 +{ +( -1816 440 360 ) ( -1816 376 360 ) ( -1816 376 352 ) subway/1_build_win 80 -16 0 0.500000 0.500000 0 620756992 0 +( -1744 408 288 ) ( -1808 408 288 ) ( -1808 408 280 ) subway/3_market_window1 32 48 0 0.500000 0.500000 0 620756992 0 +( -1592 416 288 ) ( -1592 480 288 ) ( -1592 480 280 ) subway/3_market_window1 0 48 0 0.500000 0.500000 0 620756992 0 +( -1536 376 288 ) ( -1472 376 288 ) ( -1472 376 280 ) subway/3_market_window1 32 48 0 0.500000 0.500000 0 620756992 0 +( -1808 344 312 ) ( -1808 408 312 ) ( -1744 408 312 ) subway/3_market_window1 32 -16 0 0.500000 0.500000 0 620756992 0 +( -1744 408 280 ) ( -1808 408 280 ) ( -1808 344 280 ) subway/3_market_window1 32 -16 0 0.500000 0.500000 0 620756992 0 +} +// brush 898 +{ +( -1816 632 360 ) ( -1816 568 360 ) ( -1816 568 352 ) subway/2_oldceiling2 0 8 0 0.500000 0.500000 0 385875968 0 +( -1752 584 288 ) ( -1816 584 288 ) ( -1816 584 280 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -1592 544 288 ) ( -1592 608 288 ) ( -1592 608 280 ) subway/2_oldceiling2 0 0 0 1 1 0 385875968 0 +( -1760 560 288 ) ( -1696 560 288 ) ( -1696 560 280 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -1824 480 312 ) ( -1824 544 312 ) ( -1760 544 312 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -1760 544 280 ) ( -1824 544 280 ) ( -1824 480 280 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +} +// brush 899 +{ +( -1816 504 360 ) ( -1816 440 360 ) ( -1816 440 352 ) subway/2_oldceiling2 0 8 0 0.500000 0.500000 0 385875968 0 +( -1536 376 288 ) ( -1600 376 288 ) ( -1600 376 280 ) subway/2_oldceiling2 16 8 0 1 1 0 385875968 0 +( -1592 392 288 ) ( -1592 456 288 ) ( -1592 456 280 ) subway/2_oldceiling2 0 8 0 1 1 0 385875968 0 +( -1752 336 288 ) ( -1688 336 288 ) ( -1688 336 280 ) subway/2_oldceiling2 16 8 0 1 1 0 385875968 0 +( -1816 344 312 ) ( -1816 408 312 ) ( -1752 408 312 ) subway/2_oldceiling2 16 -24 0 1 1 0 385875968 0 +( -1752 408 280 ) ( -1816 408 280 ) ( -1816 344 280 ) subway/2_oldceiling2 16 -24 0 1 1 0 385875968 0 +} +// brush 900 +{ +( -1696 -32 392 ) ( -1760 -32 392 ) ( -1760 -96 392 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1760 -96 400 ) ( -1760 -32 400 ) ( -1696 -32 400 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1704 -112 288 ) ( -1640 -112 288 ) ( -1640 -112 280 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1592 0 288 ) ( -1592 64 288 ) ( -1592 64 280 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1696 24 288 ) ( -1760 24 288 ) ( -1760 24 280 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1752 -96 360 ) ( -1752 -160 360 ) ( -1752 -160 352 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 901 +{ +( -1744 -128 440 ) ( -1744 -192 440 ) ( -1744 -192 432 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 -32 368 ) ( -1720 -32 368 ) ( -1720 -32 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1592 -32 368 ) ( -1592 32 368 ) ( -1592 32 360 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1632 -64 368 ) ( -1568 -64 368 ) ( -1568 -64 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1720 -128 448 ) ( -1720 -64 448 ) ( -1656 -64 448 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1656 -64 416 ) ( -1720 -64 416 ) ( -1720 -128 416 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 902 +{ +( -1656 96 448 ) ( -1720 96 448 ) ( -1720 32 448 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1720 32 472 ) ( -1720 96 472 ) ( -1656 96 472 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1664 16 384 ) ( -1600 16 384 ) ( -1600 16 376 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1536 136 384 ) ( -1536 200 384 ) ( -1536 200 376 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 144 384 ) ( -1720 144 384 ) ( -1720 144 376 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1704 32 456 ) ( -1704 -32 456 ) ( -1704 -32 448 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +} +// brush 903 +{ +( -1656 112 416 ) ( -1720 112 416 ) ( -1720 48 416 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1720 48 448 ) ( -1720 112 448 ) ( -1656 112 448 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1632 128 368 ) ( -1568 128 368 ) ( -1568 128 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1592 144 368 ) ( -1592 208 368 ) ( -1592 208 360 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 144 368 ) ( -1720 144 368 ) ( -1720 144 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1704 48 440 ) ( -1704 -16 440 ) ( -1704 -16 432 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +} +// brush 904 +{ +( -1704 0 440 ) ( -1704 -64 440 ) ( -1704 -64 432 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1616 96 368 ) ( -1680 96 368 ) ( -1680 96 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1592 96 368 ) ( -1592 160 368 ) ( -1592 160 360 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1632 64 368 ) ( -1568 64 368 ) ( -1568 64 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1720 0 448 ) ( -1720 64 448 ) ( -1656 64 448 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1656 64 416 ) ( -1720 64 416 ) ( -1720 0 416 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 905 +{ +( -1656 88 392 ) ( -1720 88 392 ) ( -1720 24 392 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1720 24 400 ) ( -1720 88 400 ) ( -1656 88 400 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1664 24 288 ) ( -1600 24 288 ) ( -1600 24 280 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1592 120 288 ) ( -1592 184 288 ) ( -1592 184 280 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1656 144 288 ) ( -1720 144 288 ) ( -1720 144 280 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1712 24 360 ) ( -1712 -40 360 ) ( -1712 -40 352 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 906 +{ +( -1704 32 360 ) ( -1704 -32 360 ) ( -1704 -32 352 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 144 288 ) ( -1720 144 288 ) ( -1720 144 280 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1592 128 288 ) ( -1592 192 288 ) ( -1592 192 280 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1664 16 288 ) ( -1600 16 288 ) ( -1600 16 280 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1720 32 400 ) ( -1720 96 400 ) ( -1656 96 400 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1656 96 336 ) ( -1720 96 336 ) ( -1720 32 336 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 907 +{ +( -1720 304 440 ) ( -1720 240 440 ) ( -1720 240 432 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1646 592 368 ) ( -1710 592 368 ) ( -1710 592 360 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1536 400 368 ) ( -1536 464 368 ) ( -1536 464 360 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1664 280 368 ) ( -1600 280 368 ) ( -1600 280 360 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1720 304 480 ) ( -1720 368 480 ) ( -1656 368 480 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1656 368 472 ) ( -1720 368 472 ) ( -1720 304 472 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 908 +{ +( -1744 160 360 ) ( -1744 96 360 ) ( -1744 96 352 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 272 288 ) ( -1720 272 288 ) ( -1720 272 280 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1592 256 288 ) ( -1592 320 288 ) ( -1592 320 280 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1664 144 288 ) ( -1600 144 288 ) ( -1600 144 280 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1720 160 400 ) ( -1720 224 400 ) ( -1656 224 400 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1656 224 336 ) ( -1720 224 336 ) ( -1720 160 336 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 909 +{ +( -1656 224 392 ) ( -1720 224 392 ) ( -1720 160 392 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1720 160 400 ) ( -1720 224 400 ) ( -1656 224 400 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1664 136 288 ) ( -1600 136 288 ) ( -1600 136 280 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1592 256 288 ) ( -1592 320 288 ) ( -1592 320 280 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1656 280 288 ) ( -1720 280 288 ) ( -1720 280 280 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1752 160 360 ) ( -1752 96 360 ) ( -1752 96 352 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 910 +{ +( -1656 224 448 ) ( -1720 224 448 ) ( -1720 160 448 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1720 160 472 ) ( -1720 224 472 ) ( -1656 224 472 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1664 144 384 ) ( -1600 144 384 ) ( -1600 144 376 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1592 256 384 ) ( -1592 320 384 ) ( -1592 320 376 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 272 384 ) ( -1720 272 384 ) ( -1720 272 376 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1744 160 456 ) ( -1744 96 456 ) ( -1744 96 448 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +} +// brush 911 +{ +( -1744 128 440 ) ( -1744 64 440 ) ( -1744 64 432 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 224 368 ) ( -1720 224 368 ) ( -1720 224 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1592 224 368 ) ( -1592 288 368 ) ( -1592 288 360 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1672 192 368 ) ( -1608 192 368 ) ( -1608 192 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1720 128 448 ) ( -1720 192 448 ) ( -1656 192 448 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1656 192 416 ) ( -1720 192 416 ) ( -1720 128 416 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 912 +{ +( -1656 240 416 ) ( -1720 240 416 ) ( -1720 176 416 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1720 176 448 ) ( -1720 240 448 ) ( -1656 240 448 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1672 256 368 ) ( -1608 256 368 ) ( -1608 256 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1592 272 368 ) ( -1592 336 368 ) ( -1592 336 360 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 272 368 ) ( -1720 272 368 ) ( -1720 272 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1744 176 440 ) ( -1744 112 440 ) ( -1744 112 432 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +} +// brush 913 +{ +( -1744 48 440 ) ( -1744 -16 440 ) ( -1744 -16 432 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 160 368 ) ( -1720 160 368 ) ( -1720 160 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1592 144 368 ) ( -1592 208 368 ) ( -1592 208 360 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1672 144 368 ) ( -1608 144 368 ) ( -1608 144 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1720 48 448 ) ( -1720 112 448 ) ( -1656 112 448 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1656 112 416 ) ( -1720 112 416 ) ( -1720 48 416 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 914 +{ +( -1656 -32 336 ) ( -1720 -32 336 ) ( -1720 -96 336 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1720 -96 392 ) ( -1720 -32 392 ) ( -1656 -32 392 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1664 -112 288 ) ( -1600 -112 288 ) ( -1600 -112 280 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1592 0 288 ) ( -1592 64 288 ) ( -1592 64 280 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 16 288 ) ( -1720 16 288 ) ( -1720 16 280 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1744 -96 360 ) ( -1744 -160 360 ) ( -1744 -160 352 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +} +// brush 915 +{ +( -1752 -96 440 ) ( -1752 -160 440 ) ( -1752 -160 432 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1696 24 368 ) ( -1760 24 368 ) ( -1760 24 360 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1536 0 368 ) ( -1536 64 368 ) ( -1536 64 360 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1704 -112 368 ) ( -1640 -112 368 ) ( -1640 -112 360 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1760 -96 480 ) ( -1760 -32 480 ) ( -1696 -32 480 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1696 -32 472 ) ( -1760 -32 472 ) ( -1760 -96 472 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 916 +{ +( -1744 -192 440 ) ( -1744 -256 440 ) ( -1744 -256 432 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 -96 368 ) ( -1720 -96 368 ) ( -1720 -96 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1592 -112 368 ) ( -1592 -48 368 ) ( -1592 -48 360 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1672 -112 368 ) ( -1608 -112 368 ) ( -1608 -112 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1720 -208 448 ) ( -1720 -144 448 ) ( -1656 -144 448 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1656 -144 416 ) ( -1720 -144 416 ) ( -1720 -208 416 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 917 +{ +( -1744 -96 456 ) ( -1744 -160 456 ) ( -1744 -160 448 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 16 384 ) ( -1720 16 384 ) ( -1720 16 376 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1592 0 384 ) ( -1592 64 384 ) ( -1592 64 376 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1664 -112 384 ) ( -1600 -112 384 ) ( -1600 -112 376 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1720 -96 472 ) ( -1720 -32 472 ) ( -1656 -32 472 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1656 -32 448 ) ( -1720 -32 448 ) ( -1720 -96 448 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 918 +{ +( -1816 160 272 ) ( -1816 96 272 ) ( -1816 96 264 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1728 256 200 ) ( -1792 256 200 ) ( -1792 256 192 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1784 248 200 ) ( -1784 312 200 ) ( -1784 312 192 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1736 160 200 ) ( -1672 160 200 ) ( -1672 160 192 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1792 160 272 ) ( -1792 224 272 ) ( -1728 224 272 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1728 224 248 ) ( -1792 224 248 ) ( -1792 160 248 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 919 +{ +( -1816 264 152 ) ( -1848 264 152 ) ( -1848 136 152 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1848 136 164 ) ( -1848 264 164 ) ( -1816 264 164 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1864 144 160 ) ( -1832 144 160 ) ( -1832 144 152 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1816 136 160 ) ( -1816 264 160 ) ( -1816 264 152 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1816 264 160 ) ( -1848 264 160 ) ( -1848 264 152 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1848 264 160 ) ( -1848 136 160 ) ( -1848 136 152 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 920 +{ +( -1848 328 152 ) ( -1912 328 152 ) ( -1912 264 152 ) subway/1_concrete_floor 0 -96 0 0.500000 0.500000 0 285212672 0 +( -1912 272 160 ) ( -1912 336 160 ) ( -1848 336 160 ) subway/1_concrete_floor 112 -112 0 0.500000 0.500000 0 285212672 0 +( -1884 -120 160 ) ( -1820 -120 160 ) ( -1820 -120 152 ) subway/1_concrete_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( -1816 276 160 ) ( -1816 340 160 ) ( -1816 340 152 ) subway/1_concrete_floor 96 32 0 0.500000 0.500000 0 285212672 0 +( -1848 336 160 ) ( -1848 272 160 ) ( -1848 272 152 ) subway/1_concrete_floor 96 32 0 0.500000 0.500000 0 285212672 0 +( -1800 -112 160 ) ( -1832 -112 160 ) ( -1800 -112 152 ) subway/1_concrete_floor 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 921 +{ +( -1816 -80 328 ) ( -1816 -144 328 ) ( -1816 -144 320 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1728 -32 256 ) ( -1792 -32 256 ) ( -1792 -32 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1784 8 256 ) ( -1784 72 256 ) ( -1784 72 248 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1736 -64 256 ) ( -1672 -64 256 ) ( -1672 -64 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1792 -80 304 ) ( -1792 -16 304 ) ( -1728 -16 304 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1728 -16 272 ) ( -1792 -16 272 ) ( -1792 -80 272 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 922 +{ +( -1728 0 272 ) ( -1792 0 272 ) ( -1792 -64 272 ) subway/3_redbrick_window_ad2 0 32 0 0.500000 0.500000 0 0 0 +( -1792 -64 304 ) ( -1792 0 304 ) ( -1728 0 304 ) subway/3_redbrick_window_ad2 0 32 0 0.500000 0.500000 0 0 0 +( -1736 -32 256 ) ( -1672 -32 256 ) ( -1672 -32 248 ) subway/3_redbrick_window_ad2 0 32 0 0.500000 0.500000 0 0 0 +( -1784 24 256 ) ( -1784 88 256 ) ( -1784 88 248 ) subway/3_redbrick_window_ad2 0 32 0 0.500000 0.500000 0 0 0 +( -1728 0 256 ) ( -1792 0 256 ) ( -1792 0 248 ) subway/3_redbrick_window_ad2 0 32 0 0.500000 0.500000 0 0 0 +( -1816 -64 328 ) ( -1816 -128 328 ) ( -1816 -128 320 ) subway/3_redbrick_window_ad2 0 32 0 0.500000 0.500000 0 0 0 +} +// brush 923 +{ +( -1816 160 328 ) ( -1816 96 328 ) ( -1816 96 320 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1728 256 256 ) ( -1792 256 256 ) ( -1792 256 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1784 248 256 ) ( -1784 312 256 ) ( -1784 312 248 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1736 160 256 ) ( -1672 160 256 ) ( -1672 160 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1792 160 328 ) ( -1792 224 328 ) ( -1728 224 328 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1728 224 304 ) ( -1792 224 304 ) ( -1792 160 304 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 924 +{ +( -1816 192 328 ) ( -1816 128 328 ) ( -1816 128 320 ) subway/3_redbrick_window_a 0 32 0 0.500000 0.500000 0 620756992 0 +( -1728 256 256 ) ( -1792 256 256 ) ( -1792 256 248 ) subway/3_redbrick_window_a -8 0 0 1 1 0 620756992 0 +( -1784 280 256 ) ( -1784 344 256 ) ( -1784 344 248 ) subway/3_redbrick_window_a -8 0 0 1 1 0 620756992 0 +( -1744 224 256 ) ( -1680 224 256 ) ( -1680 224 248 ) subway/3_redbrick_window_a -8 0 0 1 1 0 620756992 0 +( -1792 192 304 ) ( -1792 256 304 ) ( -1728 256 304 ) subway/3_redbrick_window_a -8 0 0 1 1 0 620756992 0 +( -1728 256 272 ) ( -1792 256 272 ) ( -1792 192 272 ) subway/3_redbrick_window_a -8 0 0 1 1 0 620756992 0 +} +// brush 925 +{ +( -1768 440 184 ) ( -1768 376 184 ) ( -1768 376 176 ) subway/con2 32 32 0 0.500000 0.500000 0 285212672 0 +( -1688 24 184 ) ( -1752 24 184 ) ( -1752 24 176 ) subway/con2 0 32 0 0.500000 0.500000 0 285212672 0 +( -1736 368 184 ) ( -1736 432 184 ) ( -1736 432 176 ) subway/con2 32 32 0 0.500000 0.500000 0 285212672 0 +( -1744 16 184 ) ( -1680 16 184 ) ( -1680 16 176 ) subway/con2 0 32 0 0.500000 0.500000 0 285212672 0 +( -1768 376 192 ) ( -1768 440 192 ) ( -1704 440 192 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1704 440 184 ) ( -1768 440 184 ) ( -1768 376 184 ) subway/con2 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 926 +{ +( -1744 96 328 ) ( -1744 32 328 ) ( -1744 32 320 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1656 144 256 ) ( -1720 144 256 ) ( -1720 144 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1736 192 252 ) ( -1736 256 252 ) ( -1736 256 244 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1656 112 256 ) ( -1592 112 256 ) ( -1592 112 248 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1720 96 276 ) ( -1720 160 276 ) ( -1656 160 276 ) subway/3_redbrick 16 0 0 0.500000 0.500000 0 385875968 0 +( -1656 160 188 ) ( -1720 160 188 ) ( -1720 96 188 ) subway/3_redbrick 16 0 0 0.500000 0.500000 0 385875968 0 +} +// brush 927 +{ +( -1744 96 328 ) ( -1744 32 328 ) ( -1744 32 320 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1656 144 256 ) ( -1720 144 256 ) ( -1720 144 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1736 192 252 ) ( -1736 256 252 ) ( -1736 256 244 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1656 16 256 ) ( -1592 16 256 ) ( -1592 16 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1720 96 328 ) ( -1720 160 328 ) ( -1656 160 328 ) subway/3_redbrick 16 0 0 0.500000 0.500000 0 385875968 0 +( -1656 160 276 ) ( -1720 160 276 ) ( -1720 96 276 ) subway/3_redbrick 16 0 90 0.500000 0.500000 0 385875968 0 +} +// brush 928 +{ +( -1752 328 160 ) ( -1816 328 160 ) ( -1816 264 160 ) subway/con2 0 -32 0 0.500000 0.500000 0 285212672 0 +( -1768 24 192 ) ( -1768 16 192 ) ( -1816 16 168 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1792 16 160 ) ( -1728 16 160 ) ( -1728 16 152 ) subway/con2 0 32 0 0.500000 0.500000 0 285212672 0 +( -1768 16 192 ) ( -1768 24 192 ) ( -1768 24 160 ) subway/con2 32 32 0 0.500000 0.500000 0 285212672 0 +( -1736 24 160 ) ( -1800 24 160 ) ( -1800 24 152 ) subway/con2 0 32 0 0.500000 0.500000 0 285212672 0 +( -1816 328 160 ) ( -1816 264 160 ) ( -1816 264 152 ) subway/con2 32 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 929 +{ +( -1824 368 312 ) ( -1824 304 312 ) ( -1824 304 304 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1752 272 232 ) ( -1816 272 232 ) ( -1816 272 224 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1592 292 232 ) ( -1592 356 232 ) ( -1592 356 224 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1760 136 232 ) ( -1696 136 232 ) ( -1696 136 224 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1816 200 248 ) ( -1816 264 248 ) ( -1752 264 248 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1752 272 240 ) ( -1816 272 240 ) ( -1816 208 240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 930 +{ +( -1752 24 240 ) ( -1816 24 240 ) ( -1816 -40 240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1816 -48 248 ) ( -1816 16 248 ) ( -1752 16 248 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1760 -112 232 ) ( -1696 -112 232 ) ( -1696 -112 224 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1592 48 232 ) ( -1592 112 232 ) ( -1592 112 224 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1752 24 232 ) ( -1816 24 232 ) ( -1816 24 224 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1824 120 312 ) ( -1824 56 312 ) ( -1824 56 304 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 931 +{ +( -1816 80 232 ) ( -1816 16 232 ) ( -1816 16 224 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -1736 272 160 ) ( -1800 272 160 ) ( -1800 272 152 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -1592 172 160 ) ( -1592 236 160 ) ( -1592 236 152 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -1736 144 160 ) ( -1672 144 160 ) ( -1672 144 152 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -1792 80 192 ) ( -1792 144 192 ) ( -1728 144 192 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -1728 144 160 ) ( -1792 144 160 ) ( -1792 80 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 932 +{ +( -2208 -64 160 ) ( -2208 -64 192 ) ( -2208 -112 192 ) subway/3_market_window1 0 48 0 0.500000 0.500000 0 620756992 0 +( -2200 -128 160 ) ( -2200 -128 192 ) ( -2148 -128 192 ) subway/1_concrete_floor 0 8 0 0.500000 0.500000 0 16777216 0 +( -2144 -104 160 ) ( -2144 -104 192 ) ( -2144 -56 192 ) subway/stair_side 16 -16 0 0.250000 0.250000 0 285212672 0 +( -2152 -64 160 ) ( -2152 -64 192 ) ( -2204 -64 192 ) subway/stair_side 16 -16 0 0.250000 0.250000 0 285212672 0 +( -2152 -112 168 ) ( -2204 -112 168 ) ( -2204 -64 168 ) subway/3_street 32 -16 0 0.500000 0.500000 0 285212672 0 +( -2196 -64 164 ) ( -2196 -112 164 ) ( -2144 -112 164 ) subway/3_market_window1 16 0 0 0.500000 0.500000 0 620756992 0 +} +// brush 933 +{ +( -2240 272 376 ) ( -2240 448 376 ) ( -2240 448 360 ) subway/3_market1 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2184 496 368 ) ( -2328 496 368 ) ( -2328 496 352 ) subway/3_market1 32 -16 0 0.500000 0.500000 0 385875968 0 +( -2248 440 368 ) ( -2248 264 368 ) ( -2248 264 352 ) subway/2_oldceiling2 0 -8 0 1 1 0 385875968 0 +( -2240 360 376 ) ( -2256 360 376 ) ( -2256 312 376 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -2256 312 440 ) ( -2256 360 440 ) ( -2240 360 440 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -2296 472 520 ) ( -2280 472 520 ) ( -2296 472 400 ) subway/2_oldceiling2 16 -8 0 1 1 0 385875968 0 +} +// brush 934 +{ +( -2240 272 368 ) ( -2240 448 368 ) ( -2240 448 352 ) subway/3_market1 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2248 448 368 ) ( -2248 272 368 ) ( -2248 272 352 ) subway/2_oldceiling2 0 -8 0 1 1 0 385875968 0 +( -2240 360 376 ) ( -2256 360 376 ) ( -2256 312 376 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -2256 312 440 ) ( -2256 360 440 ) ( -2240 360 440 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -2296 352 520 ) ( -2280 352 520 ) ( -2296 352 400 ) subway/2_oldceiling2 16 -8 0 1 1 0 385875968 0 +( -2280 408 520 ) ( -2296 408 520 ) ( -2280 408 400 ) subway/2_oldceiling2 16 -8 0 1 1 0 385875968 0 +} +// brush 935 +{ +( -2248 472 520 ) ( -2248 424 520 ) ( -2248 424 400 ) subway/1_build_win 104 -8 0 1 1 0 620756992 0 +( -2280 472 520 ) ( -2296 472 520 ) ( -2296 472 400 ) subway/1_build_win 104 -8 0 1 1 0 620756992 0 +( -2240 432 520 ) ( -2240 480 520 ) ( -2240 480 400 ) subway/1_build_win 104 -8 0 1 1 0 620756992 0 +( -1984 408 520 ) ( -1968 408 520 ) ( -1968 408 400 ) subway/1_build_win 104 -8 0 1 1 0 620756992 0 +( -2256 432 440 ) ( -2256 480 440 ) ( -2240 480 440 ) subway/1_build_win 104 -8 0 1 1 0 620756992 0 +( -2240 480 376 ) ( -2256 480 376 ) ( -2256 432 376 ) subway/1_build_win 104 -8 0 1 1 0 620756992 0 +} +// brush 936 +{ +( -2480 216 368 ) ( -2336 216 368 ) ( -2336 216 352 ) subway/3_market1 32 -16 0 0.500000 0.500000 0 385875968 0 +( -2272 272 368 ) ( -2272 448 368 ) ( -2272 448 352 ) subway/3_market1 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2680 448 368 ) ( -2680 272 368 ) ( -2680 272 352 ) subway/2_oldceiling2 0 -8 0 1 1 0 385875968 0 +( -2240 360 376 ) ( -2256 360 376 ) ( -2256 312 376 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -2256 312 440 ) ( -2256 360 440 ) ( -2240 360 440 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -2280 224 520 ) ( -2296 224 520 ) ( -2280 224 400 ) subway/2_oldceiling2 16 -8 0 1 1 0 385875968 0 +} +// brush 937 +{ +( -2224 440 344 ) ( -2368 440 344 ) ( -2368 264 344 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -2512 216 368 ) ( -2368 216 368 ) ( -2368 216 352 ) subway/3_market1_bottom 32 -16 0 0.500000 0.500000 0 385875968 0 +( -2272 272 368 ) ( -2272 448 368 ) ( -2272 448 352 ) subway/3_market1 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2184 224 368 ) ( -2328 224 368 ) ( -2328 224 352 ) subway/2_oldceiling2 16 -8 0 1 1 0 385875968 0 +( -2680 448 368 ) ( -2680 272 368 ) ( -2680 272 352 ) subway/2_oldceiling2 0 -8 0 1 1 0 385875968 0 +( -2256 360 376 ) ( -2240 360 376 ) ( -2256 312 376 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +} +// brush 938 +{ +( -2528 448 344 ) ( -2528 272 344 ) ( -2528 272 328 ) subway/newpipe1 32 16 0 0.500000 0.500000 0 16777216 0 +( -2184 584 344 ) ( -2328 584 344 ) ( -2328 584 328 ) subway/newpipe1 0 16 0 0.500000 0.500000 0 16777216 0 +( -2208 272 344 ) ( -2208 448 344 ) ( -2208 448 328 ) subway/newpipe1 32 16 0 0.500000 0.500000 0 16777216 0 +( -2368 144 344 ) ( -2224 144 344 ) ( -2224 144 328 ) subway/newpipe1 0 16 0 0.500000 0.500000 0 16777216 0 +( -2368 264 344 ) ( -2368 440 344 ) ( -2224 440 344 ) subway/1_black 7 15 90 2 2 0 16777216 0 +( -2224 440 328 ) ( -2368 440 328 ) ( -2368 264 328 ) subway/newpipe1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 939 +{ +( -2336 128 264 ) ( -2336 144 264 ) ( -2392 144 264 ) subway/3_grocery1_window 240 4 0 1 1 0 620756992 0 +( -2392 144 328 ) ( -2336 144 328 ) ( -2336 128 328 ) subway/3_grocery1_window 240 4 0 1 1 0 620756992 0 +( -2416 144 336 ) ( -2416 128 336 ) ( -2416 128 264 ) subway/3_grocery1_window 240 4 0 1 1 0 620756992 0 +( -2416 136 344 ) ( -2360 136 344 ) ( -2360 136 272 ) subway/3_grocery1_window 240 4 0 1 1 0 620756992 0 +( -2352 128 352 ) ( -2352 144 352 ) ( -2352 144 280 ) subway/3_grocery1_window 240 4 0 1 1 0 620756992 0 +( -2336 144 344 ) ( -2392 144 344 ) ( -2392 144 272 ) subway/3_grocery1_window 240 4 0 1 1 0 620756992 0 +} +// brush 940 +{ +( -2136 136 152 ) ( -2200 136 152 ) ( -2200 136 144 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -2072 16 152 ) ( -2072 80 152 ) ( -2072 80 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -2184 -56 152 ) ( -2120 -56 152 ) ( -2120 -56 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -2520 40 152 ) ( -2520 -24 152 ) ( -2520 -24 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +( -2200 72 152 ) ( -2136 72 152 ) ( -2136 8 152 ) subway/s_asphalt 0 0 0 0.500000 0.500000 0 301989888 0 +( -2136 8 144 ) ( -2136 72 144 ) ( -2200 72 144 ) subway/s_asphalt 0 0 0 1 1 0 301989888 0 +} +// brush 941 +{ +( -1752 408 312 ) ( -1816 408 312 ) ( -1816 344 312 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -1816 344 328 ) ( -1816 408 328 ) ( -1752 408 328 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -1752 280 304 ) ( -1688 280 304 ) ( -1688 280 296 ) subway/2_oldceiling2 16 8 0 0.500000 0.500000 0 385875968 0 +( -1592 392 304 ) ( -1592 456 304 ) ( -1592 456 296 ) subway/2_oldceiling2 0 0 0 1 1 0 385875968 0 +( -1752 584 304 ) ( -1816 584 304 ) ( -1816 584 296 ) subway/2_oldceiling2 16 0 0 1 1 0 385875968 0 +( -1816 440 376 ) ( -1816 376 376 ) ( -1816 376 368 ) subway/2_oldceiling2 0 8 0 0.500000 0.500000 0 385875968 0 +} +// brush 942 +{ +( -1816 376 360 ) ( -1816 312 360 ) ( -1816 312 352 ) subway/2_oldceiling2 0 8 0 0.500000 0.500000 0 385875968 0 +( -1752 304 288 ) ( -1816 304 288 ) ( -1816 304 280 ) subway/2_oldceiling2 16 8 0 1 1 0 385875968 0 +( -1592 368 288 ) ( -1592 432 288 ) ( -1592 432 280 ) subway/2_oldceiling2 0 8 0 1 1 0 385875968 0 +( -1752 280 288 ) ( -1688 280 288 ) ( -1688 280 280 ) subway/2_oldceiling2 16 8 0 0.500000 0.500000 0 385875968 0 +( -1816 280 312 ) ( -1816 344 312 ) ( -1752 344 312 ) subway/2_oldceiling2 16 -24 0 1 1 0 385875968 0 +( -1752 344 280 ) ( -1816 344 280 ) ( -1816 280 280 ) subway/2_oldceiling2 16 -24 0 1 1 0 385875968 0 +} +// brush 943 +{ +( -1816 368 360 ) ( -1816 304 360 ) ( -1816 304 352 ) subway/1_build_win 96 -16 0 0.500000 0.500000 0 620756992 0 +( -1536 336 288 ) ( -1600 336 288 ) ( -1600 336 280 ) subway/3_market_window1 32 48 0 0.500000 0.500000 0 620756992 0 +( -1592 344 288 ) ( -1592 408 288 ) ( -1592 408 280 ) subway/3_market_window1 0 48 0 0.500000 0.500000 0 620756992 0 +( -1744 304 288 ) ( -1680 304 288 ) ( -1680 304 280 ) subway/3_market_window1 32 48 0 0.500000 0.500000 0 620756992 0 +( -1808 272 312 ) ( -1808 336 312 ) ( -1744 336 312 ) subway/3_market_window1 32 -16 0 0.500000 0.500000 0 620756992 0 +( -1744 336 280 ) ( -1808 336 280 ) ( -1808 272 280 ) subway/3_market_window1 32 -16 0 0.500000 0.500000 0 620756992 0 +} +// brush 944 +{ +( -1816 496 328 ) ( -1816 432 328 ) ( -1816 432 320 ) subway/2_oldceiling2 0 8 0 0.500000 0.500000 0 385875968 0 +( -1752 584 256 ) ( -1816 584 256 ) ( -1816 584 248 ) subway/2_oldceiling2 16 8 0 1 1 0 385875968 0 +( -1592 500 256 ) ( -1592 564 256 ) ( -1592 564 248 ) subway/2_oldceiling2 0 8 0 1 1 0 385875968 0 +( -1760 280 256 ) ( -1696 280 256 ) ( -1696 280 248 ) subway/2_oldceiling2 16 8 0 0.500000 0.500000 0 385875968 0 +( -1816 400 280 ) ( -1816 464 280 ) ( -1752 464 280 ) subway/2_oldceiling2 16 -24 0 1 1 0 385875968 0 +( -1752 464 248 ) ( -1816 464 248 ) ( -1816 400 248 ) subway/2_oldceiling2 16 -24 0 1 1 0 385875968 0 +} +// brush 945 +{ +( -1824 496 312 ) ( -1824 432 312 ) ( -1824 432 304 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1752 584 232 ) ( -1816 584 232 ) ( -1816 584 224 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1592 608 232 ) ( -1592 672 232 ) ( -1592 672 224 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1760 280 232 ) ( -1696 280 232 ) ( -1696 280 224 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1816 392 248 ) ( -1816 456 248 ) ( -1752 456 248 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1752 464 240 ) ( -1816 464 240 ) ( -1816 400 240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 946 +{ +( -1968 616 264 ) ( -2032 616 264 ) ( -2032 616 256 ) subway/no_draw 0 0 0 1 1 134217728 128 0 +( -1536 544 264 ) ( -1536 608 264 ) ( -1536 608 256 ) subway/no_draw 0 0 0 1 1 134217728 128 0 +( -1816 608 336 ) ( -1752 608 336 ) ( -1752 608 328 ) subway/girdwall2 31 64 90 1 1 134217728 16779264 0 +( -2312 576 264 ) ( -2312 512 264 ) ( -2312 512 256 ) subway/no_draw 0 0 0 1 1 134217728 128 0 +( -2184 616 480 ) ( -2120 616 480 ) ( -2120 552 480 ) subway/no_draw 0 0 0 1 1 134217728 128 0 +( -2120 552 352 ) ( -2120 616 352 ) ( -2184 616 352 ) subway/girdwall 119 64 90 1 1 134217728 16779264 0 +} +// brush 947 +{ +( -2688 -600 264 ) ( -2688 -664 264 ) ( -2688 -664 256 ) subway/sky2 32 32 0 0.500000 0.500000 0 4 0 +( -2600 592 264 ) ( -2664 592 264 ) ( -2664 592 256 ) subway/sky2 48 32 0 0.500000 0.500000 0 4 0 +( -2680 864 400 ) ( -2680 928 400 ) ( -2680 928 392 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 15 +( -2656 -800 264 ) ( -2592 -800 264 ) ( -2592 -800 256 ) subway/sky2 48 32 0 0.500000 0.500000 0 4 0 +( -2680 88 632 ) ( -2680 152 632 ) ( -2616 152 632 ) subway/sky2 48 -32 0 0.500000 0.500000 0 4 0 +( -2616 144 136 ) ( -2680 144 136 ) ( -2680 80 136 ) subway/sky2 48 -32 0 0.500000 0.500000 0 4 0 +} +// brush 948 +{ +( -1824 304 400 ) ( -1824 240 400 ) ( -1824 240 392 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1752 276 320 ) ( -1816 276 320 ) ( -1816 276 312 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1592 296 320 ) ( -1592 360 320 ) ( -1592 360 312 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1760 136 320 ) ( -1696 136 320 ) ( -1696 136 312 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1816 200 336 ) ( -1816 264 336 ) ( -1752 264 336 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1752 272 328 ) ( -1816 272 328 ) ( -1816 208 328 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 949 +{ +( -1656 64 188 ) ( -1720 64 188 ) ( -1720 0 188 ) subway/3_redbrick 16 0 0 0.500000 0.500000 0 385875968 0 +( -1720 0 276 ) ( -1720 64 276 ) ( -1656 64 276 ) subway/3_redbrick 16 0 0 0.500000 0.500000 0 385875968 0 +( -1656 16 256 ) ( -1592 16 256 ) ( -1592 16 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1736 96 252 ) ( -1736 160 252 ) ( -1736 160 244 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1656 48 256 ) ( -1720 48 256 ) ( -1720 48 248 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1744 0 328 ) ( -1744 -64 328 ) ( -1744 -64 320 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +} +// brush 950 +{ +( -1728 208 248 ) ( -1792 208 248 ) ( -1792 144 248 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1792 144 328 ) ( -1792 208 328 ) ( -1728 208 328 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1736 144 256 ) ( -1672 144 256 ) ( -1672 144 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1744 232 256 ) ( -1744 296 256 ) ( -1744 296 248 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1728 160 256 ) ( -1792 160 256 ) ( -1792 160 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1816 144 328 ) ( -1816 80 328 ) ( -1816 80 320 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +} +// brush 951 +{ +( -1736 144 328 ) ( -1800 144 328 ) ( -1800 80 328 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1800 72 336 ) ( -1800 136 336 ) ( -1736 136 336 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1744 16 320 ) ( -1680 16 320 ) ( -1680 16 312 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1592 168 320 ) ( -1592 232 320 ) ( -1592 232 312 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1736 144 320 ) ( -1800 144 320 ) ( -1800 144 312 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1760 176 400 ) ( -1760 112 400 ) ( -1760 112 392 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 952 +{ +( -1728 224 272 ) ( -1792 224 272 ) ( -1792 160 272 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1792 160 304 ) ( -1792 224 304 ) ( -1728 224 304 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1736 192 256 ) ( -1672 192 256 ) ( -1672 192 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1784 248 256 ) ( -1784 312 256 ) ( -1784 312 248 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1728 224 256 ) ( -1792 224 256 ) ( -1792 224 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1816 160 352 ) ( -1816 96 352 ) ( -1816 96 344 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +} +// brush 953 +{ +( -1816 208 328 ) ( -1816 144 328 ) ( -1816 144 320 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1728 272 256 ) ( -1792 272 256 ) ( -1792 272 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1592 296 256 ) ( -1592 360 256 ) ( -1592 360 248 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1736 256 256 ) ( -1672 256 256 ) ( -1672 256 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1792 208 328 ) ( -1792 272 328 ) ( -1728 272 328 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1728 272 248 ) ( -1792 272 248 ) ( -1792 208 248 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 954 +{ +( -1656 -16 416 ) ( -1720 -16 416 ) ( -1720 -80 416 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1720 -80 448 ) ( -1720 -16 448 ) ( -1656 -16 448 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1672 16 368 ) ( -1608 16 368 ) ( -1608 16 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1592 16 368 ) ( -1592 80 368 ) ( -1592 80 360 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1616 32 368 ) ( -1680 32 368 ) ( -1680 32 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1704 -64 440 ) ( -1704 -128 440 ) ( -1704 -128 432 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +} +// brush 955 +{ +( -1728 192 272 ) ( -1792 192 272 ) ( -1792 128 272 ) subway/3_redbrick_window_ad2 0 32 0 0.500000 0.500000 0 0 0 +( -1792 128 304 ) ( -1792 192 304 ) ( -1728 192 304 ) subway/3_redbrick_window_ad2 0 32 0 0.500000 0.500000 0 0 0 +( -1744 160 256 ) ( -1680 160 256 ) ( -1680 160 248 ) subway/3_redbrick_window_ad2 0 32 0 0.500000 0.500000 0 0 0 +( -1784 216 256 ) ( -1784 280 256 ) ( -1784 280 248 ) subway/3_redbrick_window_ad2 0 32 0 0.500000 0.500000 0 0 0 +( -1728 192 256 ) ( -1792 192 256 ) ( -1792 192 248 ) subway/3_redbrick_window_ad2 0 32 0 0.500000 0.500000 0 0 0 +( -1816 128 328 ) ( -1816 64 328 ) ( -1816 64 320 ) subway/3_redbrick_window_ad2 0 32 0 0.500000 0.500000 0 0 0 +} +// brush 956 +{ +( -1728 16 248 ) ( -1792 16 248 ) ( -1792 -48 248 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1792 -48 328 ) ( -1792 16 328 ) ( -1728 16 328 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1736 0 256 ) ( -1672 0 256 ) ( -1672 0 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1744 40 256 ) ( -1744 104 256 ) ( -1744 104 248 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1728 16 256 ) ( -1792 16 256 ) ( -1792 16 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1816 -48 328 ) ( -1816 -112 328 ) ( -1816 -112 320 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +} +// brush 957 +{ +( -1728 -64 272 ) ( -1792 -64 272 ) ( -1792 -128 272 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1792 -128 304 ) ( -1792 -64 304 ) ( -1728 -64 304 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1736 -112 256 ) ( -1672 -112 256 ) ( -1672 -112 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1592 -40 256 ) ( -1592 24 256 ) ( -1592 24 248 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1728 -96 256 ) ( -1792 -96 256 ) ( -1792 -96 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1816 -128 328 ) ( -1816 -192 328 ) ( -1816 -192 320 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +} +// brush 958 +{ +( -1816 -96 328 ) ( -1816 -160 328 ) ( -1816 -160 320 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1728 0 256 ) ( -1792 0 256 ) ( -1792 0 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1592 0 256 ) ( -1592 64 256 ) ( -1592 64 248 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1736 -112 256 ) ( -1672 -112 256 ) ( -1672 -112 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1792 -96 272 ) ( -1792 -32 272 ) ( -1728 -32 272 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1728 -32 248 ) ( -1792 -32 248 ) ( -1792 -96 248 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 959 +{ +( -1816 -96 328 ) ( -1816 -160 328 ) ( -1816 -160 320 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1728 0 256 ) ( -1792 0 256 ) ( -1792 0 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1592 0 256 ) ( -1592 64 256 ) ( -1592 64 248 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1736 -112 256 ) ( -1672 -112 256 ) ( -1672 -112 248 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1792 -96 328 ) ( -1792 -32 328 ) ( -1728 -32 328 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1728 -32 304 ) ( -1792 -32 304 ) ( -1792 -96 304 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 960 +{ +( -1728 16 160 ) ( -1792 16 160 ) ( -1792 -48 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -1792 -48 192 ) ( -1792 16 192 ) ( -1728 16 192 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -1736 -112 152 ) ( -1672 -112 152 ) ( -1672 -112 144 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -1592 48 152 ) ( -1592 112 152 ) ( -1592 112 144 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -1728 16 152 ) ( -1792 16 152 ) ( -1792 16 144 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -1816 -48 224 ) ( -1816 -112 224 ) ( -1816 -112 216 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 961 +{ +( -1816 -128 328 ) ( -1816 -192 328 ) ( -1816 -192 320 ) subway/3_redbrick_window_a 0 32 0 0.500000 0.500000 0 620756992 0 +( -1728 -64 256 ) ( -1792 -64 256 ) ( -1792 -64 248 ) subway/3_redbrick_window_a 0 32 0 0.500000 0.500000 0 620756992 0 +( -1784 -40 256 ) ( -1784 24 256 ) ( -1784 24 248 ) subway/3_redbrick_window_a 0 32 0 0.500000 0.500000 0 620756992 0 +( -1736 -96 256 ) ( -1672 -96 256 ) ( -1672 -96 248 ) subway/3_redbrick_window_a 0 32 0 0.500000 0.500000 0 620756992 0 +( -1792 -128 304 ) ( -1792 -64 304 ) ( -1728 -64 304 ) subway/3_redbrick_window_a 0 32 0 0.500000 0.500000 0 620756992 0 +( -1728 -64 272 ) ( -1792 -64 272 ) ( -1792 -128 272 ) subway/3_redbrick_window_a 0 32 0 0.500000 0.500000 0 620756992 0 +} +// brush 962 +{ +( -1816 760 224 ) ( -1816 408 224 ) ( -1816 408 248 ) subway/3_grocery1 0 32 0 0.500000 0.500000 0 335544320 0 +( -1824 760 152 ) ( -1824 760 192 ) ( -1832 760 192 ) subway/3_grocery1 48 32 0 0.500000 0.500000 0 335544320 0 +( -1824 760 224 ) ( -1848 760 248 ) ( -1848 584 248 ) subway/3_grocery1 63 8 90 0.500000 0.500000 0 335544320 0 +( -1824 584 248 ) ( -1816 584 248 ) ( -1816 584 224 ) subway/3_grocery1 48 32 0 0.500000 0.500000 0 335544320 0 +( -1816 584 256 ) ( -1848 584 256 ) ( -1848 760 256 ) subway/3_grocery1 48 0 0 0.500000 0.500000 0 335544320 0 +( -1816 424 224 ) ( -1816 472 224 ) ( -1824 472 224 ) subway/3_grocery1 48 0 0 0.500000 0.500000 0 335544320 0 +} +// brush 963 +{ +( -2208 144 336 ) ( -2208 144 328 ) ( -2208 456 328 ) subway/metalrib1 -16 16 90 0.500000 0.500000 0 16777216 0 +( -2176 584 240 ) ( -2184 584 240 ) ( -2184 584 200 ) subway/metalrib1 -15 0 90 0.500000 0.500000 0 16777216 0 +( -2184 264 344 ) ( -2184 600 344 ) ( -2200 600 328 ) subway/metalrib1 17 -17 0 0.500000 0.500000 0 16777216 0 +( -2208 144 328 ) ( -2208 144 336 ) ( -2200 136 336 ) subway/metalrib1 -16 16 90 0.500000 0.500000 0 16777216 0 +( -2184 456 344 ) ( -2184 120 344 ) ( -2208 144 344 ) subway/metal2 4 -56 0 2 2 0 16777216 0 +( -2200 344 328 ) ( -2208 344 328 ) ( -2208 296 328 ) subway/metalrib1 31 31 90 0.500000 0.500000 0 16777216 0 +} +// brush 964 +{ +( -2200 440 256 ) ( -2208 440 256 ) ( -2208 392 256 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +( -2208 392 264 ) ( -2208 440 264 ) ( -2200 440 264 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +( -2208 208 256 ) ( -2208 208 328 ) ( -2200 208 328 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +( -2200 -24 224 ) ( -2200 24 224 ) ( -2200 24 184 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2192 344 224 ) ( -2200 344 224 ) ( -2200 344 184 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +( -2208 272 328 ) ( -2208 272 256 ) ( -2208 336 256 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +} +// brush 965 +{ +( -2200 296 256 ) ( -2208 296 256 ) ( -2208 248 256 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +( -2208 248 328 ) ( -2208 296 328 ) ( -2200 296 328 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +( -2208 144 256 ) ( -2208 144 280 ) ( -2200 136 280 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +( -2200 -136 224 ) ( -2200 -88 224 ) ( -2200 -88 184 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2192 208 224 ) ( -2200 208 224 ) ( -2200 208 184 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +( -2208 144 280 ) ( -2208 144 256 ) ( -2208 456 256 ) subway/3_grocery1 8 8 0 1 1 0 335544320 0 +} +// brush 966 +{ +( -2248 320 152 ) ( -2248 320 144 ) ( -2248 632 144 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -2184 768 104 ) ( -2192 768 104 ) ( -2192 768 64 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1776 616 144 ) ( -1776 616 152 ) ( -1776 792 152 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -2208 760 152 ) ( -2208 760 144 ) ( -2224 760 144 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -2208 432 272 ) ( -2208 480 272 ) ( -2200 480 272 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -2200 480 152 ) ( -2208 480 152 ) ( -2208 432 152 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 967 +{ +( -2408 144 256 ) ( -2456 144 256 ) ( -2456 136 256 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2456 136 264 ) ( -2456 144 264 ) ( -2408 144 264 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2352 144 328 ) ( -2352 144 256 ) ( -2352 136 256 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2344 136 184 ) ( -2344 136 224 ) ( -2296 136 224 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2416 136 184 ) ( -2416 136 224 ) ( -2416 128 224 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +( -2352 144 256 ) ( -2352 144 328 ) ( -2448 144 328 ) subway/3_grocery1 8 4 0 1 1 0 335544320 0 +} +// brush 968 +{ +( -2208 144 192 ) ( -2208 144 160 ) ( -2208 760 160 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2144 760 160 ) ( -2208 760 160 ) ( -2208 760 152 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2200 560 232 ) ( -2200 624 232 ) ( -2200 624 224 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2208 144 160 ) ( -2208 144 192 ) ( -2200 136 192 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2208 504 192 ) ( -2208 568 192 ) ( -2144 568 192 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2144 568 160 ) ( -2208 568 160 ) ( -2208 504 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 969 +{ +( -2208 144 192 ) ( -2208 144 248 ) ( -2520 144 248 ) subway/3_grocery1 0 32 0 0.500000 0.500000 0 335544320 0 +( -2520 120 152 ) ( -2520 120 192 ) ( -2520 112 192 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +( -2288 136 152 ) ( -2288 136 192 ) ( -2240 136 192 ) subway/3_grocery1 0 32 0 0.500000 0.500000 0 335544320 0 +( -2208 144 248 ) ( -2208 144 192 ) ( -2200 136 192 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +( -2344 136 248 ) ( -2344 144 248 ) ( -2296 144 248 ) subway/3_grocery1 0 -32 0 0.500000 0.500000 0 335544320 0 +( -2296 144 192 ) ( -2344 144 192 ) ( -2344 136 192 ) subway/3_grocery1 0 -32 0 0.500000 0.500000 0 335544320 0 +} +// brush 970 +{ +( -2200 -776 288 ) ( -2200 -712 288 ) ( -2264 -712 288 ) subway/sky2 32 0 0 0.500000 0.500000 0 5 900 +( -2256 -712 640 ) ( -2192 -712 640 ) ( -2192 -776 640 ) subway/sky2 32 0 0 0.500000 0.500000 0 5 900 +( -2680 -744 320 ) ( -2680 -808 320 ) ( -2680 -808 312 ) subway/sky2 0 32 0 0.500000 0.500000 0 5 900 +( -1168 -712 248 ) ( -1104 -712 248 ) ( -1104 -712 240 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 900 +( -1216 -768 320 ) ( -1216 -704 320 ) ( -1216 -704 312 ) subway/sky2 0 32 0 0.500000 0.500000 0 5 900 +( -2208 -696 248 ) ( -2272 -696 248 ) ( -2272 -696 240 ) subway/sky2 0 32 0 0.500000 0.500000 0 5 15 +} +// brush 971 +{ +( -1820 48 400 ) ( -1820 -16 400 ) ( -1820 -16 392 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1752 24 320 ) ( -1816 24 320 ) ( -1816 24 312 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1592 48 320 ) ( -1592 112 320 ) ( -1592 112 312 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1760 -112 320 ) ( -1696 -112 320 ) ( -1696 -112 312 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1816 -56 336 ) ( -1816 8 336 ) ( -1752 8 336 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1752 16 328 ) ( -1816 16 328 ) ( -1816 -48 328 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 972 +{ +( -1784 16 160 ) ( -1816 16 160 ) ( -1784 16 152 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1848 472 160 ) ( -1848 408 160 ) ( -1848 408 152 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1808 420 160 ) ( -1808 484 160 ) ( -1808 484 152 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1884 -112 160 ) ( -1820 -112 160 ) ( -1820 -112 152 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1912 416 164 ) ( -1912 480 164 ) ( -1848 480 164 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1848 472 152 ) ( -1912 472 152 ) ( -1912 408 152 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 973 +{ +( -2136 -56 400 ) ( -2136 8 400 ) ( -2200 8 400 ) subway/1_black 8 15 90 2 2 0 16777216 0 +( -2128 -40 424 ) ( -2128 -248 424 ) ( -2520 -248 424 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2528 -24 248 ) ( -2528 -88 248 ) ( -2528 -88 240 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( -2184 -440 248 ) ( -2120 -440 248 ) ( -2120 -440 240 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2120 -248 424 ) ( -2120 -40 424 ) ( -2136 -56 400 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( -2136 -40 424 ) ( -2520 -40 424 ) ( -2520 -56 400 ) subway/metalrib1 -31 15 90 0.500000 0.500000 0 16777216 0 +} +// brush 974 +{ +( -1704 0 424 ) ( -1704 -64 424 ) ( -1704 -64 416 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 144 352 ) ( -1720 144 352 ) ( -1720 144 344 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1592 96 352 ) ( -1592 160 352 ) ( -1592 160 344 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1672 16 352 ) ( -1608 16 352 ) ( -1608 16 344 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1720 0 416 ) ( -1720 64 416 ) ( -1656 64 416 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1656 64 400 ) ( -1720 64 400 ) ( -1720 0 400 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 975 +{ +( -1656 -64 400 ) ( -1720 -64 400 ) ( -1720 -128 400 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1720 -128 416 ) ( -1720 -64 416 ) ( -1656 -64 416 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1632 -112 352 ) ( -1568 -112 352 ) ( -1568 -112 344 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1592 -32 352 ) ( -1592 32 352 ) ( -1592 32 344 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 16 352 ) ( -1720 16 352 ) ( -1720 16 344 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1744 -128 424 ) ( -1744 -192 424 ) ( -1744 -192 416 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +} +// brush 976 +{ +( -1656 192 400 ) ( -1720 192 400 ) ( -1720 128 400 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1720 128 416 ) ( -1720 192 416 ) ( -1656 192 416 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1672 144 352 ) ( -1608 144 352 ) ( -1608 144 344 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1592 224 352 ) ( -1592 288 352 ) ( -1592 288 344 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 272 352 ) ( -1720 272 352 ) ( -1720 272 344 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1744 128 424 ) ( -1744 64 424 ) ( -1744 64 416 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +} +// brush 977 +{ +( -2096 408 32 ) ( -2104 416 32 ) ( -2104 56 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -2096 344 48 ) ( -2096 408 48 ) ( -2032 408 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -2096 -64 48 ) ( -2096 -64 32 ) ( -2104 -64 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -2096 -64 32 ) ( -2096 -64 48 ) ( -2096 328 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -2104 328 0 ) ( -2104 328 -16 ) ( -2096 328 -16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -2104 328 32 ) ( -2104 328 48 ) ( -2104 -24 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 978 +{ +( -2200 408 32 ) ( -2208 416 32 ) ( -2208 56 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -2200 344 48 ) ( -2200 408 48 ) ( -2136 408 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -2120 -64 24 ) ( -2056 -64 24 ) ( -2056 -64 16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -2200 184 120 ) ( -2200 184 -16 ) ( -2200 -168 -16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -2208 328 0 ) ( -2208 328 -16 ) ( -2200 328 -16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -2208 384 32 ) ( -2208 384 48 ) ( -2208 32 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 979 +{ +( -2200 408 152 ) ( -2208 416 152 ) ( -2208 56 152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2200 344 160 ) ( -2200 408 160 ) ( -2136 408 160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2120 200 48 ) ( -2056 200 48 ) ( -2056 200 40 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2200 400 144 ) ( -2200 400 8 ) ( -2200 48 8 ) subway/1_concrete_floor 96 32 0 0.500000 0.500000 0 285212672 0 +( -2208 424 24 ) ( -2208 424 8 ) ( -2200 424 8 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2208 408 56 ) ( -2208 408 72 ) ( -2208 56 72 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 980 +{ +( -2200 328 48 ) ( -2208 336 48 ) ( -2208 -24 48 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2200 264 152 ) ( -2200 328 152 ) ( -2136 328 152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2120 136 40 ) ( -2056 136 40 ) ( -2056 136 32 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2200 192 136 ) ( -2200 192 0 ) ( -2200 -160 0 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( -2192 200 16 ) ( -2192 200 0 ) ( -2184 200 0 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2208 328 48 ) ( -2208 328 64 ) ( -2208 -24 64 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 981 +{ +( -1920 512 136 ) ( -1920 512 128 ) ( -1920 144 128 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( -2056 504 104 ) ( -2056 504 136 ) ( -2064 504 136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2064 512 128 ) ( -2064 512 136 ) ( -2064 144 136 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( -2184 144 136 ) ( -2184 144 144 ) ( -2120 144 144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2064 512 136 ) ( -1920 512 136 ) ( -1920 144 136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -1920 512 128 ) ( -2064 512 128 ) ( -2064 144 128 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 982 +{ +( -1920 152 136 ) ( -1920 152 128 ) ( -1920 -216 128 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( -2056 144 104 ) ( -2056 144 136 ) ( -2064 144 136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2056 144 128 ) ( -2056 144 136 ) ( -2056 -224 136 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( -2184 -88 136 ) ( -2184 -88 144 ) ( -2120 -88 144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2064 152 136 ) ( -1920 152 136 ) ( -1920 -216 136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -1920 152 128 ) ( -2064 152 128 ) ( -2064 -216 128 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 983 +{ +( -2056 152 136 ) ( -2056 152 128 ) ( -2056 -216 128 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( -2056 128 136 ) ( -2208 128 136 ) ( -2208 136 128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2208 144 128 ) ( -2208 144 136 ) ( -2208 -224 136 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( -2320 -88 136 ) ( -2320 -88 144 ) ( -2256 -88 144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2208 128 136 ) ( -2056 128 136 ) ( -2056 -88 136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2056 152 128 ) ( -2200 152 128 ) ( -2200 -216 128 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 984 +{ +( -1880 -184 624 ) ( -1880 136 624 ) ( -2216 136 624 ) subway/sky2 0 -32 0 0.500000 0.500000 0 5 15 +( -2216 136 632 ) ( -1880 136 632 ) ( -1880 -184 632 ) subway/sky2 0 -32 0 0.500000 0.500000 0 4 0 +( -2680 120 632 ) ( -2680 -200 632 ) ( -2680 -200 624 ) subway/sky2 32 -48 0 0.500000 0.500000 0 4 0 +( -2152 -800 632 ) ( -1816 -800 632 ) ( -1816 -800 624 ) subway/sky2 0 -48 0 0.500000 0.500000 0 4 0 +( -1232 -200 632 ) ( -1232 120 632 ) ( -1232 120 624 ) subway/sky2 32 -48 0 0.500000 0.500000 0 4 0 +( -1920 896 632 ) ( -2256 896 632 ) ( -2256 896 624 ) subway/sky2 0 -48 0 0.500000 0.500000 0 4 0 +} +// brush 985 +{ +( -2104 408 48 ) ( -2104 408 64 ) ( -2104 56 64 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( -2104 424 16 ) ( -2104 424 0 ) ( -2096 424 0 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2096 240 136 ) ( -2096 240 0 ) ( -2096 -112 0 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( -2008 152 40 ) ( -1944 152 40 ) ( -1944 152 32 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2096 344 152 ) ( -2096 408 152 ) ( -2032 408 152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2096 408 48 ) ( -2104 416 48 ) ( -2104 56 48 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 986 +{ +( -2136 -56 160 ) ( -2136 8 160 ) ( -2200 8 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2200 8 192 ) ( -2136 8 192 ) ( -2136 -56 192 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2528 -24 168 ) ( -2528 -88 168 ) ( -2528 -88 160 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2184 -440 168 ) ( -2120 -440 168 ) ( -2120 -440 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +( -2136 -48 136 ) ( -2136 16 136 ) ( -2136 16 128 ) subway/3_grocery2_bottom 32 0 0 0.500000 0.500000 0 352321536 0 +( -2136 -128 168 ) ( -2200 -128 168 ) ( -2200 -128 160 ) subway/3_grocery2_bottom 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 987 +{ +( -2136 -56 192 ) ( -2136 8 192 ) ( -2200 8 192 ) subway/3_grocery1 32 0 0 0.500000 0.500000 0 335544320 0 +( -2200 8 248 ) ( -2136 8 248 ) ( -2136 -56 248 ) subway/3_grocery1 32 0 0 0.500000 0.500000 0 335544320 0 +( -2528 -24 192 ) ( -2528 -88 192 ) ( -2528 -88 184 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -2184 -440 192 ) ( -2120 -440 192 ) ( -2120 -440 184 ) subway/3_grocery1 32 0 0 0.500000 0.500000 0 335544320 0 +( -2136 -48 192 ) ( -2136 16 192 ) ( -2136 16 184 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -2136 -128 192 ) ( -2200 -128 192 ) ( -2200 -128 184 ) subway/3_grocery1 32 0 0 0.500000 0.500000 0 335544320 0 +} +// brush 988 +{ +( -2136 -56 248 ) ( -2136 8 248 ) ( -2200 8 248 ) subway/1_black 8 0 0 1 1 0 16777216 0 +( -2200 8 256 ) ( -2136 8 256 ) ( -2136 -56 256 ) subway/1_black 8 0 0 1 1 0 16777216 0 +( -2528 -24 200 ) ( -2528 -88 200 ) ( -2528 -88 192 ) subway/1_black 8 8 0 1 1 0 16777216 0 +( -2184 -440 200 ) ( -2120 -440 200 ) ( -2120 -440 192 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2136 -56 200 ) ( -2200 -56 200 ) ( -2200 -56 192 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2188 -92 264 ) ( -2188 -80 264 ) ( -2188 -92 248 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 989 +{ +( -2136 -56 248 ) ( -2136 8 248 ) ( -2200 8 248 ) subway/1_black 8 0 0 1 1 0 16777216 0 +( -2200 8 256 ) ( -2136 8 256 ) ( -2136 -56 256 ) subway/1_black 8 0 0 1 1 0 16777216 0 +( -2136 -48 200 ) ( -2136 16 200 ) ( -2136 16 192 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2136 -56 200 ) ( -2200 -56 200 ) ( -2200 -56 192 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2188 -80 264 ) ( -2188 -92 264 ) ( -2188 -92 248 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2188 -80 264 ) ( -2180 -80 264 ) ( -2188 -80 248 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 990 +{ +( -2136 -56 248 ) ( -2136 8 248 ) ( -2200 8 248 ) subway/1_black 8 0 0 1 1 0 16777216 0 +( -2200 8 256 ) ( -2136 8 256 ) ( -2136 -56 256 ) subway/1_black 8 0 0 1 1 0 16777216 0 +( -2184 -440 200 ) ( -2120 -440 200 ) ( -2120 -440 192 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2136 -48 200 ) ( -2136 16 200 ) ( -2136 16 192 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2180 -80 264 ) ( -2188 -80 264 ) ( -2188 -80 248 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2172 -80 264 ) ( -2172 -92 264 ) ( -2172 -80 248 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 991 +{ +( -2136 -56 248 ) ( -2136 8 248 ) ( -2200 8 248 ) subway/1_black 8 0 0 1 1 0 16777216 0 +( -2200 8 256 ) ( -2136 8 256 ) ( -2136 -56 256 ) subway/1_black 8 0 0 1 1 0 16777216 0 +( -2184 -440 200 ) ( -2120 -440 200 ) ( -2120 -440 192 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2188 -80 264 ) ( -2188 -92 264 ) ( -2188 -92 248 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2172 -92 264 ) ( -2172 -80 264 ) ( -2172 -80 248 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2180 -96 264 ) ( -2188 -96 264 ) ( -2180 -96 248 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 992 +{ +( -2208 408 48 ) ( -2208 408 64 ) ( -2208 56 64 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( -2208 424 16 ) ( -2208 424 0 ) ( -2200 424 0 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2200 400 136 ) ( -2200 400 0 ) ( -2200 48 0 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( -2120 200 40 ) ( -2056 200 40 ) ( -2056 200 32 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2200 344 152 ) ( -2200 408 152 ) ( -2136 408 152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -2200 408 48 ) ( -2208 416 48 ) ( -2208 56 48 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 993 +{ +( -1656 -16 416 ) ( -1720 -16 416 ) ( -1720 -80 416 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1720 -80 448 ) ( -1720 -16 448 ) ( -1656 -16 448 ) subway/3_redbrick 0 -32 0 0.500000 0.500000 0 385875968 0 +( -1672 0 368 ) ( -1608 0 368 ) ( -1608 0 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1592 16 368 ) ( -1592 80 368 ) ( -1592 80 360 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1656 16 368 ) ( -1720 16 368 ) ( -1720 16 360 ) subway/3_redbrick 0 32 0 0.500000 0.500000 0 385875968 0 +( -1744 -80 440 ) ( -1744 -144 440 ) ( -1744 -144 432 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +} +// brush 994 +{ +( -1744 -96 440 ) ( -1744 -160 440 ) ( -1744 -160 432 ) subway/3_redbrick_window_ad2 0 64 0 0.500000 0.500000 0 0 0 +( -1656 0 368 ) ( -1720 0 368 ) ( -1720 0 360 ) subway/3_redbrick_window_ad2 0 64 0 0.500000 0.500000 0 0 0 +( -1592 0 368 ) ( -1592 64 368 ) ( -1592 64 360 ) subway/3_redbrick_window_ad2 0 64 0 0.500000 0.500000 0 0 0 +( -1672 -32 368 ) ( -1608 -32 368 ) ( -1608 -32 360 ) subway/3_redbrick_window_ad2 0 64 0 0.500000 0.500000 0 0 0 +( -1720 -96 448 ) ( -1720 -32 448 ) ( -1656 -32 448 ) subway/3_redbrick_window_ad2 0 64 0 0.500000 0.500000 0 0 0 +( -1656 -32 416 ) ( -1720 -32 416 ) ( -1720 -96 416 ) subway/3_redbrick_window_ad2 0 64 0 0.500000 0.500000 0 0 0 +} +// brush 995 +{ +( -1656 -128 416 ) ( -1720 -128 416 ) ( -1720 -192 416 ) subway/3_redbrick_window_a 0 0 0 1 1 0 620756992 0 +( -1720 -192 448 ) ( -1720 -128 448 ) ( -1656 -128 448 ) subway/3_redbrick_window_a 0 0 0 1 1 0 620756992 0 +( -1672 -96 368 ) ( -1608 -96 368 ) ( -1608 -96 360 ) subway/3_redbrick_window_a 0 0 0 1 1 0 620756992 0 +( -1592 -96 368 ) ( -1592 -32 368 ) ( -1592 -32 360 ) subway/3_redbrick_window_a 0 0 0 1 1 0 620756992 0 +( -1656 -64 368 ) ( -1720 -64 368 ) ( -1720 -64 360 ) subway/3_redbrick_window_a 0 0 0 1 1 0 620756992 0 +( -1744 -176 440 ) ( -1744 -240 440 ) ( -1744 -240 432 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +} +// brush 996 +{ +( -1704 -48 440 ) ( -1704 -112 440 ) ( -1704 -112 432 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1616 64 368 ) ( -1680 64 368 ) ( -1680 64 360 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1592 32 368 ) ( -1592 96 368 ) ( -1592 96 360 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1672 32 368 ) ( -1608 32 368 ) ( -1608 32 360 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1720 -64 448 ) ( -1720 0 448 ) ( -1656 0 448 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1656 0 416 ) ( -1720 0 416 ) ( -1720 -64 416 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +} +// brush 997 +{ +( -1704 32 440 ) ( -1704 -32 440 ) ( -1704 -32 432 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1656 128 368 ) ( -1720 128 368 ) ( -1720 128 360 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1592 128 368 ) ( -1592 192 368 ) ( -1592 192 360 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1632 96 368 ) ( -1568 96 368 ) ( -1568 96 360 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1720 32 448 ) ( -1720 96 448 ) ( -1656 96 448 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1656 96 416 ) ( -1720 96 416 ) ( -1720 32 416 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +} +// brush 998 +{ +( -1656 128 416 ) ( -1720 128 416 ) ( -1720 64 416 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1720 64 448 ) ( -1720 128 448 ) ( -1656 128 448 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1672 160 368 ) ( -1608 160 368 ) ( -1608 160 360 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1592 160 368 ) ( -1592 224 368 ) ( -1592 224 360 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1656 192 368 ) ( -1720 192 368 ) ( -1720 192 360 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1744 64 440 ) ( -1744 0 440 ) ( -1744 0 432 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +} +// brush 999 +{ +( -1744 160 440 ) ( -1744 96 440 ) ( -1744 96 432 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1656 256 368 ) ( -1720 256 368 ) ( -1720 256 360 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1592 256 368 ) ( -1592 320 368 ) ( -1592 320 360 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1672 224 368 ) ( -1608 224 368 ) ( -1608 224 360 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1720 160 448 ) ( -1720 224 448 ) ( -1656 224 448 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +( -1656 224 416 ) ( -1720 224 416 ) ( -1720 160 416 ) subway/3_redbrick_window_a 0 0 0 0.500000 0.500000 0 620756992 0 +} +// brush 1000 +{ +( -2000 16 128 ) ( -2000 -8 128 ) ( -2000 -8 120 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1976 8 128 ) ( -2000 8 128 ) ( -2000 8 120 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1984 -8 128 ) ( -1984 16 128 ) ( -1984 16 120 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -2000 -8 128 ) ( -1976 -8 128 ) ( -1976 -8 120 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -2000 -8 128 ) ( -2000 16 128 ) ( -1976 16 128 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -1976 16 124 ) ( -2000 16 124 ) ( -2000 -8 124 ) subway/light_yellow 0 -16 0 0.500000 0.500000 0 16777217 12000 +} +// brush 1001 +{ +( -2136 16 124 ) ( -2160 16 124 ) ( -2160 -8 124 ) subway/light_yellow 0 -16 0 0.500000 0.500000 134217728 16777217 12000 +( -2160 -8 128 ) ( -2160 16 128 ) ( -2136 16 128 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2160 -8 128 ) ( -2136 -8 128 ) ( -2136 -8 120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2144 -8 128 ) ( -2144 16 128 ) ( -2144 16 120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2136 8 128 ) ( -2160 8 128 ) ( -2160 8 120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2160 16 128 ) ( -2160 -8 128 ) ( -2160 -8 120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1002 +{ +( -2136 608 464 ) ( -2296 608 464 ) ( -2296 592 464 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +( -2296 592 480 ) ( -2296 608 480 ) ( -2136 608 480 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1784 592 504 ) ( -1624 592 504 ) ( -1624 592 464 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -1536 592 504 ) ( -1536 608 504 ) ( -1536 608 464 ) subway/metal2 0 48 90 1 1 0 16777216 0 +( -2088 608 504 ) ( -2248 608 504 ) ( -2248 608 464 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2312 608 504 ) ( -2312 592 504 ) ( -2312 592 464 ) subway/metal2 0 48 90 1 1 0 16777216 0 +} +// brush 1003 +{ +( -1816 -48 272 ) ( -1816 -112 272 ) ( -1816 -112 264 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1728 16 200 ) ( -1792 16 200 ) ( -1792 16 192 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1592 48 200 ) ( -1592 112 200 ) ( -1592 112 192 ) subway/3_redbrick 32 32 0 0.500000 0.500000 0 385875968 0 +( -1736 -112 200 ) ( -1672 -112 200 ) ( -1672 -112 192 ) subway/3_redbrick 16 32 0 0.500000 0.500000 0 385875968 0 +( -1792 -48 240 ) ( -1792 16 240 ) ( -1728 16 240 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +( -1728 16 192 ) ( -1792 16 192 ) ( -1792 -48 192 ) subway/3_redbrick 16 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 1004 +{ +( -1728 144 192 ) ( -1792 144 192 ) ( -1792 80 192 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +( -1792 80 240 ) ( -1792 144 240 ) ( -1728 144 240 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +( -1736 144 200 ) ( -1672 144 200 ) ( -1672 144 192 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +( -1592 172 200 ) ( -1592 236 200 ) ( -1592 236 192 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +( -1736 272 200 ) ( -1800 272 200 ) ( -1800 272 192 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +( -1816 80 272 ) ( -1816 16 272 ) ( -1816 16 264 ) subway/3_grocery1 32 32 0 0.500000 0.500000 0 335544320 0 +} +// brush 1005 +{ +( -2312 608 480 ) ( -2312 584 480 ) ( -2312 584 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2296 608 464 ) ( -2312 608 464 ) ( -2312 608 352 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2296 584 480 ) ( -2296 608 480 ) ( -2296 608 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -2312 592 456 ) ( -2296 592 456 ) ( -2296 592 352 ) subway/metal2 0 32 90 1 1 0 16777216 0 +( -2312 608 464 ) ( -2296 608 464 ) ( -2296 592 464 ) subway/metal2 47 32 90 1 1 0 16777216 0 +( -2296 608 352 ) ( -2312 608 352 ) ( -2312 584 352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1006 +{ +( -1740 512 380 ) ( -1804 512 380 ) ( -1804 448 380 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1804 440 472 ) ( -1804 504 472 ) ( -1740 504 472 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1764 504 376 ) ( -1700 504 376 ) ( -1700 504 368 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1536 536 376 ) ( -1536 600 376 ) ( -1536 600 368 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1732 586 376 ) ( -1796 586 376 ) ( -1796 586 368 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1712 536 456 ) ( -1712 472 456 ) ( -1712 472 448 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +} +// brush 1007 +{ +( -1712 496 456 ) ( -1712 432 456 ) ( -1712 432 448 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1732 504 376 ) ( -1796 504 376 ) ( -1796 504 368 ) subway/3_redbrick 0 16 0 1 1 0 385875968 0 +( -1580 496 376 ) ( -1580 560 376 ) ( -1580 560 368 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1764 440 376 ) ( -1700 440 376 ) ( -1700 440 368 ) subway/3_redbrick 0 16 0 1 1 0 385875968 0 +( -1804 400 472 ) ( -1804 464 472 ) ( -1740 464 472 ) subway/3_redbrick 0 -32 0 1 1 0 385875968 0 +( -1740 472 464 ) ( -1804 472 464 ) ( -1804 408 464 ) subway/3_redbrick 0 -32 0 1 1 0 385875968 0 +} +// brush 1008 +{ +( -1740 472 400 ) ( -1804 472 400 ) ( -1804 408 400 ) subway/3_redbrick_window_b 8 16 0 1 1 0 0 0 +( -1804 400 464 ) ( -1804 464 464 ) ( -1740 464 464 ) subway/3_redbrick_window_b 8 16 0 1 1 0 0 0 +( -1764 440 376 ) ( -1700 440 376 ) ( -1700 440 368 ) subway/3_redbrick_window_b 8 16 0 1 1 0 0 0 +( -1580 496 376 ) ( -1580 560 376 ) ( -1580 560 368 ) subway/3_redbrick_window_b 8 16 0 1 1 0 0 0 +( -1732 504 376 ) ( -1796 504 376 ) ( -1796 504 368 ) subway/3_redbrick_window_b 8 16 0 1 1 0 0 0 +( -1712 496 456 ) ( -1712 432 456 ) ( -1712 432 448 ) subway/3_redbrick_window_b 8 16 0 1 1 0 0 0 +} +// brush 1009 +{ +( -1740 472 380 ) ( -1804 472 380 ) ( -1804 408 380 ) subway/3_redbrick 0 -32 0 1 1 0 385875968 0 +( -1804 400 400 ) ( -1804 464 400 ) ( -1740 464 400 ) subway/3_redbrick 0 -32 0 1 1 0 385875968 0 +( -1764 440 376 ) ( -1700 440 376 ) ( -1700 440 368 ) subway/3_redbrick 0 16 0 1 1 0 385875968 0 +( -1580 496 376 ) ( -1580 560 376 ) ( -1580 560 368 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1732 504 384 ) ( -1796 504 384 ) ( -1796 504 376 ) subway/3_redbrick 0 16 0 1 1 0 385875968 0 +( -1712 496 452 ) ( -1712 432 452 ) ( -1712 432 444 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +} +// brush 1010 +{ +( -1712 408 456 ) ( -1712 344 456 ) ( -1712 344 448 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1732 416 384 ) ( -1796 416 384 ) ( -1796 416 376 ) subway/3_redbrick 0 16 0 1 1 0 385875968 0 +( -1580 416 376 ) ( -1580 480 376 ) ( -1580 480 368 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1764 352 376 ) ( -1700 352 376 ) ( -1700 352 368 ) subway/3_redbrick 0 16 0 1 1 0 385875968 0 +( -1804 320 400 ) ( -1804 384 400 ) ( -1740 384 400 ) subway/3_redbrick 0 -32 0 1 1 0 385875968 0 +( -1740 392 380 ) ( -1804 392 380 ) ( -1804 328 380 ) subway/3_redbrick 0 -32 0 1 1 0 385875968 0 +} +// brush 1011 +{ +( -1740 416 380 ) ( -1804 416 380 ) ( -1804 352 380 ) subway/3_redbrick 0 -32 0 1 1 0 385875968 0 +( -1804 344 472 ) ( -1804 408 472 ) ( -1740 408 472 ) subway/3_redbrick 0 -32 0 1 1 0 385875968 0 +( -1764 416 376 ) ( -1700 416 376 ) ( -1700 416 368 ) subway/3_redbrick 0 16 0 1 1 0 385875968 0 +( -1580 440 376 ) ( -1580 504 376 ) ( -1580 504 368 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1732 440 376 ) ( -1796 440 376 ) ( -1796 440 368 ) subway/3_redbrick 0 16 0 1 1 0 385875968 0 +( -1712 440 456 ) ( -1712 376 456 ) ( -1712 376 448 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +} +// brush 1012 +{ +( -1712 416 456 ) ( -1712 352 456 ) ( -1712 352 448 ) subway/3_redbrick_window_b 32 16 0 1 1 0 0 0 +( -1732 416 376 ) ( -1796 416 376 ) ( -1796 416 368 ) subway/3_redbrick_window_b 32 16 0 1 1 0 0 0 +( -1580 416 376 ) ( -1580 480 376 ) ( -1580 480 368 ) subway/3_redbrick_window_b 32 16 0 1 1 0 0 0 +( -1764 352 376 ) ( -1700 352 376 ) ( -1700 352 368 ) subway/3_redbrick_window_b 32 16 0 1 1 0 0 0 +( -1804 320 464 ) ( -1804 384 464 ) ( -1740 384 464 ) subway/3_redbrick_window_b 32 16 0 1 1 0 0 0 +( -1740 392 400 ) ( -1804 392 400 ) ( -1804 328 400 ) subway/3_redbrick_window_b 32 16 0 1 1 0 0 0 +} +// brush 1013 +{ +( -1596 348 456 ) ( -1596 284 456 ) ( -1596 284 448 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1732 280 376 ) ( -1796 280 376 ) ( -1796 280 368 ) subway/3_redbrick 0 16 0 1 1 0 385875968 0 +( -1592 280 376 ) ( -1592 344 376 ) ( -1592 344 368 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1764 272 376 ) ( -1700 272 376 ) ( -1700 272 368 ) subway/3_redbrick 0 16 0 1 1 0 385875968 0 +( -1804 248 472 ) ( -1804 312 472 ) ( -1740 312 472 ) subway/3_redbrick 0 -32 0 1 1 0 385875968 0 +( -1740 320 152 ) ( -1804 320 152 ) ( -1804 256 152 ) subway/3_redbrick 0 -32 0 1 1 0 385875968 0 +} +// brush 1014 +{ +( -1740 392 464 ) ( -1804 392 464 ) ( -1804 328 464 ) subway/3_redbrick 0 -32 0 1 1 0 385875968 0 +( -1804 320 472 ) ( -1804 384 472 ) ( -1740 384 472 ) subway/3_redbrick 0 -32 0 1 1 0 385875968 0 +( -1764 352 376 ) ( -1700 352 376 ) ( -1700 352 368 ) subway/3_redbrick 0 16 0 1 1 0 385875968 0 +( -1580 416 376 ) ( -1580 480 376 ) ( -1580 480 368 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1732 416 376 ) ( -1796 416 376 ) ( -1796 416 368 ) subway/3_redbrick 0 16 0 1 1 0 385875968 0 +( -1712 416 456 ) ( -1712 352 456 ) ( -1712 352 448 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +} +// brush 1015 +{ +( -1656 224 472 ) ( -1720 224 472 ) ( -1720 160 472 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1720 160 480 ) ( -1720 224 480 ) ( -1656 224 480 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1664 136 368 ) ( -1600 136 368 ) ( -1600 136 360 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1536 256 368 ) ( -1536 320 368 ) ( -1536 320 360 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -1656 280 368 ) ( -1720 280 368 ) ( -1720 280 360 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1752 160 440 ) ( -1752 96 440 ) ( -1752 96 432 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1016 +{ +( -1740 328 336 ) ( -1804 328 336 ) ( -1804 264 336 ) subway/3_redbrick 0 -32 0 1 1 0 385875968 0 +( -1804 256 472 ) ( -1804 320 472 ) ( -1740 320 472 ) subway/3_redbrick 0 -32 0 1 1 0 385875968 0 +( -1764 280 376 ) ( -1700 280 376 ) ( -1700 280 368 ) subway/3_redbrick 0 16 0 1 1 0 385875968 0 +( -1592 352 376 ) ( -1592 416 376 ) ( -1592 416 368 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +( -1732 352 376 ) ( -1796 352 376 ) ( -1796 352 368 ) subway/3_redbrick 0 16 0 1 1 0 385875968 0 +( -1712 352 456 ) ( -1712 288 456 ) ( -1712 288 448 ) subway/3_redbrick 16 16 0 1 1 0 385875968 0 +} +// brush 1017 +{ +( -2112 204 160 ) ( -2240 204 160 ) ( -2240 172 160 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -2240 172 168 ) ( -2240 204 168 ) ( -2112 204 168 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -2116 196 164 ) ( -2116 196 184 ) ( -2116 200 184 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -2036 197 184 ) ( -2036 197 164 ) ( -2132 197 164 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +( -2180 192 168 ) ( -2180 192 176 ) ( -2180 160 176 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -2112 199 172 ) ( -2112 199 180 ) ( -2240 199 180 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1018 +{ +( -2180 196 168 ) ( -2180 188 168 ) ( -2180 188 144 ) subway/1_black 8 8 0 1 1 134217728 16777216 0 +( -2128 202 180 ) ( -2168 202 180 ) ( -2168 202 156 ) subway/1_sign1 -8 16 0 -0.500000 0.500000 134217728 0 0 +( -2116 188 180 ) ( -2116 196 180 ) ( -2116 196 156 ) subway/1_black 8 8 0 1 1 134217728 16777216 0 +( -2168 194 180 ) ( -2128 194 180 ) ( -2128 194 156 ) subway/1_sign1 8 -16 0 0.500000 0.500000 134217728 0 0 +( -2164 188 184 ) ( -2164 196 184 ) ( -2124 196 184 ) subway/1_black 4 -8 0 1 1 134217728 16777216 0 +( -2128 196 168 ) ( -2168 196 168 ) ( -2168 188 168 ) subway/1_black 4 -8 0 1 1 134217728 16777216 0 +} +// brush 1019 +{ +( -2100 199 172 ) ( -2100 199 180 ) ( -2228 199 180 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +( -2116 196 168 ) ( -2116 196 176 ) ( -2116 164 176 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -2024 197 184 ) ( -2024 197 164 ) ( -2120 197 164 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +( -2104 196 164 ) ( -2104 196 184 ) ( -2104 200 184 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -2228 172 188 ) ( -2228 204 188 ) ( -2100 204 188 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -2100 204 160 ) ( -2228 204 160 ) ( -2228 172 160 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1020 +{ +( -2112 199 196 ) ( -2112 199 204 ) ( -2240 199 204 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +( -2180 192 192 ) ( -2180 192 200 ) ( -2180 160 200 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -2036 197 208 ) ( -2036 197 188 ) ( -2132 197 188 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +( -2116 196 188 ) ( -2116 196 208 ) ( -2116 200 208 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -2240 172 188 ) ( -2240 204 188 ) ( -2112 204 188 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -2112 204 184 ) ( -2240 204 184 ) ( -2240 172 184 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1021 +{ +( -2176 204 160 ) ( -2304 204 160 ) ( -2304 172 160 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -2304 172 188 ) ( -2304 204 188 ) ( -2176 204 188 ) subway/bars2 0 -32 0 0.500000 0.500000 134217728 16779264 0 +( -2180 196 164 ) ( -2180 196 184 ) ( -2180 200 184 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -2104 197 184 ) ( -2104 197 164 ) ( -2200 197 164 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +( -2196 196 168 ) ( -2196 196 176 ) ( -2196 164 176 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -2176 199 172 ) ( -2176 199 180 ) ( -2304 199 180 ) subway/bars2 0 32 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1022 +{ +( -2196 200 160 ) ( -2200 200 160 ) ( -2200 196 160 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2200 196 188 ) ( -2200 200 188 ) ( -2196 200 188 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2200 196 168 ) ( -2196 196 168 ) ( -2196 196 164 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2196 196 168 ) ( -2196 200 168 ) ( -2196 200 164 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2196 200 184 ) ( -2200 200 184 ) ( -2200 200 180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2200 200 184 ) ( -2200 196 184 ) ( -2200 196 180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 1023 +{ +( -2140 200 188 ) ( -2104 200 188 ) ( -2104 200 192 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2200 196 176 ) ( -2200 196 184 ) ( -2200 164 184 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2284 196 176 ) ( -2284 196 184 ) ( -2156 196 184 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2096 192 192 ) ( -2104 200 192 ) ( -2104 200 188 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2228 172 192 ) ( -2228 204 192 ) ( -2100 204 192 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2100 204 188 ) ( -2228 204 188 ) ( -2228 172 188 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 1024 +{ +( -2100 200 160 ) ( -2104 200 160 ) ( -2104 196 160 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2104 196 188 ) ( -2104 200 188 ) ( -2100 200 188 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2104 196 168 ) ( -2100 196 168 ) ( -2100 196 164 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2100 196 168 ) ( -2100 200 168 ) ( -2100 200 164 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2100 200 184 ) ( -2104 200 184 ) ( -2104 200 180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2104 200 184 ) ( -2104 196 184 ) ( -2104 196 180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 1025 +{ +( -2101 200 164 ) ( -2101 200 184 ) ( -2101 424 184 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -2104 420 184 ) ( -2104 420 164 ) ( -2100 420 164 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -2103 424 164 ) ( -2103 424 184 ) ( -2103 200 184 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -2100 200 188 ) ( -2100 200 168 ) ( -2104 200 168 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -2128 344 188 ) ( -2096 344 188 ) ( -2096 216 188 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +( -2096 216 160 ) ( -2096 344 160 ) ( -2128 344 160 ) subway/bars2 32 32 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1026 +{ +( -2108 348 188 ) ( -2108 220 188 ) ( -2076 220 188 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2076 220 192 ) ( -2108 220 192 ) ( -2108 348 192 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2104 424 192 ) ( -2104 424 188 ) ( -2100 424 188 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2100 352 188 ) ( -2100 216 188 ) ( -2100 216 192 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2104 200 192 ) ( -2096 192 192 ) ( -2096 192 188 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2104 424 188 ) ( -2104 424 192 ) ( -2104 200 192 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 1027 +{ +( -2104 424 184 ) ( -2104 420 184 ) ( -2104 420 180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2100 424 184 ) ( -2104 424 184 ) ( -2104 424 180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2100 420 168 ) ( -2100 424 168 ) ( -2100 424 164 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2104 420 168 ) ( -2100 420 168 ) ( -2100 420 164 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2104 420 188 ) ( -2104 424 188 ) ( -2100 424 188 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -2100 424 160 ) ( -2104 424 160 ) ( -2104 420 160 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 1028 +{ +( -2160 126 128 ) ( -2160 102 128 ) ( -2160 102 120 ) subway/1_black 4 0 0 0.500000 0.500000 134217728 16777216 0 +( -2136 118 128 ) ( -2160 118 128 ) ( -2160 118 120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2144 102 128 ) ( -2144 126 128 ) ( -2144 126 120 ) subway/1_black 4 0 0 0.500000 0.500000 134217728 16777216 0 +( -2160 102 128 ) ( -2136 102 128 ) ( -2136 102 120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2160 102 128 ) ( -2160 126 128 ) ( -2136 126 128 ) subway/1_black 0 -4 0 0.500000 0.500000 134217728 16777216 0 +( -2136 126 124 ) ( -2160 126 124 ) ( -2160 102 124 ) subway/light_yellow 0 -20 0 0.500000 0.500000 134217728 16777217 12000 +} +// brush 1029 +{ +( -1560 608 352 ) ( -1584 608 352 ) ( -1584 592 352 ) subway/sky2 0 -32 0 0.500000 0.500000 0 4 80 +( -1568 592 632 ) ( -1568 608 632 ) ( -1544 608 632 ) subway/sky2 0 -32 0 0.500000 0.500000 0 4 80 +( -856 592 632 ) ( -832 592 632 ) ( -832 592 616 ) subway/sky2 0 32 0 0.500000 0.500000 0 4 80 +( -896 584 480 ) ( -896 600 480 ) ( -896 600 464 ) subway/sky2 32 32 0 0.500000 0.500000 0 4 80 +( -1560 608 480 ) ( -1584 608 480 ) ( -1584 608 464 ) subway/sky2 0 32 0 0.500000 0.500000 0 5 15 +( -1536 608 520 ) ( -1536 592 520 ) ( -1536 592 504 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 15 +} +// brush 1030 +{ +( -888 896 344 ) ( -904 896 344 ) ( -904 584 344 ) subway/sky2 -16 -32 0 0.500000 0.500000 0 4 80 +( -904 592 640 ) ( -904 904 640 ) ( -888 904 640 ) subway/sky2 -16 -32 0 0.500000 0.500000 0 4 80 +( -904 592 528 ) ( -888 592 528 ) ( -888 592 512 ) subway/sky2 -16 32 0 0.500000 0.500000 0 4 80 +( -896 592 528 ) ( -896 904 528 ) ( -896 904 512 ) subway/sky2 32 32 0 0.500000 0.500000 0 4 80 +( -888 904 528 ) ( -904 904 528 ) ( -904 904 512 ) subway/sky2 -16 32 0 0.500000 0.500000 0 4 80 +( -904 904 528 ) ( -904 592 528 ) ( -904 592 512 ) subway/sky2 32 32 0 0.500000 0.500000 0 4 80 +} +// brush 1031 +{ +( -2264 360 440 ) ( -2264 312 440 ) ( -2248 360 440 ) subway/2_oldceiling2 24 0 0 1 1 0 385875968 0 +( -2680 456 368 ) ( -2680 280 368 ) ( -2680 280 352 ) subway/2_oldceiling2 0 -8 0 1 1 0 385875968 0 +( -2192 224 368 ) ( -2336 224 368 ) ( -2336 224 352 ) subway/2_oldceiling2 24 -8 0 1 1 0 385875968 0 +( -2272 272 368 ) ( -2272 448 368 ) ( -2272 448 352 ) subway/3_market1_top 0 -32 0 0.500000 0.500000 0 385875968 0 +( -2416 216 368 ) ( -2272 216 368 ) ( -2272 216 352 ) subway/3_market1_top 48 -32 0 0.500000 0.500000 0 385875968 0 +( -2376 264 464 ) ( -2376 440 464 ) ( -2232 440 464 ) subway/2_oldceiling2 24 0 0 1 1 0 385875968 0 +} +// brush 1032 +{ +( -2256 336 440 ) ( -2256 288 440 ) ( -2240 336 440 ) subway/2_oldceiling2 16 -24 0 1 1 0 385875968 0 +( -2272 336 368 ) ( -2272 160 368 ) ( -2272 160 352 ) subway/2_oldceiling2 24 -8 0 1 1 0 385875968 0 +( -2176 248 368 ) ( -2320 248 368 ) ( -2320 248 352 ) subway/2_oldceiling2 16 -8 0 1 1 0 385875968 0 +( -2240 264 368 ) ( -2240 440 368 ) ( -2240 440 352 ) subway/3_market2_top 16 -32 0 0.500000 0.500000 0 385875968 0 +( -2360 216 368 ) ( -2216 216 368 ) ( -2216 216 352 ) subway/3_market3_top 0 -32 0 0.500000 0.500000 0 385875968 0 +( -2368 240 464 ) ( -2368 416 464 ) ( -2224 416 464 ) subway/2_oldceiling2 16 -24 0 1 1 0 385875968 0 +} +// brush 1033 +{ +( -2072 216 368 ) ( -1928 216 368 ) ( -1928 216 352 ) subway/3_market3 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2240 272 368 ) ( -2240 448 368 ) ( -2240 448 352 ) subway/3_market2 16 -16 0 0.500000 0.500000 0 385875968 0 +( -2272 448 368 ) ( -2272 272 368 ) ( -2272 272 352 ) subway/3_market2 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2208 360 376 ) ( -2224 360 376 ) ( -2224 312 376 ) subway/3_market2 32 0 0 0.500000 0.500000 0 385875968 0 +( -2224 312 440 ) ( -2224 360 440 ) ( -2208 360 440 ) subway/3_market2 32 0 0 0.500000 0.500000 0 385875968 0 +( -2248 248 520 ) ( -2264 248 520 ) ( -2248 248 400 ) subway/3_market2 32 -16 0 0.500000 0.500000 0 385875968 0 +} +// brush 1034 +{ +( -2192 472 344 ) ( -2336 472 344 ) ( -2336 296 344 ) subway/2_oldceiling2 48 0 0 1 1 0 385875968 0 +( -2360 248 368 ) ( -2216 248 368 ) ( -2216 248 352 ) subway/3_market1 32 -16 0 0.500000 0.500000 0 385875968 0 +( -2240 304 368 ) ( -2240 480 368 ) ( -2240 480 352 ) subway/3_market1_bottom 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2152 472 368 ) ( -2296 472 368 ) ( -2296 472 352 ) subway/2_oldceiling2 48 -8 0 1 1 0 385875968 0 +( -2248 752 368 ) ( -2248 576 368 ) ( -2248 576 352 ) subway/2_oldceiling2 32 -8 0 1 1 0 385875968 0 +( -2224 392 376 ) ( -2208 392 376 ) ( -2224 344 376 ) subway/2_oldceiling2 48 0 0 1 1 0 385875968 0 +} +// brush 1035 +{ +( -2072 248 368 ) ( -1928 248 368 ) ( -1928 248 352 ) subway/3_market1_top 32 -32 0 0.500000 0.500000 0 385875968 0 +( -2240 304 368 ) ( -2240 480 368 ) ( -2240 480 352 ) subway/3_market1 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2248 480 368 ) ( -2248 304 368 ) ( -2248 304 352 ) subway/3_market1_top 0 -32 0 0.500000 0.500000 0 385875968 0 +( -2208 392 376 ) ( -2224 392 376 ) ( -2224 344 376 ) subway/3_market1_top 32 -16 0 0.500000 0.500000 0 385875968 0 +( -2224 344 440 ) ( -2224 392 440 ) ( -2208 392 440 ) subway/3_market1_top 32 -16 0 0.500000 0.500000 0 385875968 0 +( -2248 288 520 ) ( -2264 288 520 ) ( -2248 288 400 ) subway/3_market1_top 32 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 1036 +{ +( -2072 216 336 ) ( -1928 216 336 ) ( -1928 216 320 ) subway/3_market3_bottom 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2240 272 336 ) ( -2240 448 336 ) ( -2240 448 320 ) subway/3_market2_bottom 16 -16 0 0.500000 0.500000 0 385875968 0 +( -2272 448 336 ) ( -2272 272 336 ) ( -2272 272 320 ) subway/3_market2_bottom 16 -16 0 0.500000 0.500000 0 385875968 0 +( -2208 360 344 ) ( -2224 360 344 ) ( -2224 312 344 ) subway/3_market2_bottom 48 0 0 0.500000 0.500000 0 385875968 0 +( -2224 312 376 ) ( -2224 360 376 ) ( -2208 360 376 ) subway/3_market2_bottom 48 0 0 0.500000 0.500000 0 385875968 0 +( -2248 248 488 ) ( -2264 248 488 ) ( -2248 248 368 ) subway/3_market2_bottom 48 -16 0 0.500000 0.500000 0 385875968 0 +} +// brush 1037 +{ +( -2240 272 344 ) ( -2240 448 344 ) ( -2240 448 328 ) subway/3_market1_bottom 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2184 496 336 ) ( -2328 496 336 ) ( -2328 496 320 ) subway/3_market1_bottom 32 -16 0 0.500000 0.500000 0 385875968 0 +( -2560 448 336 ) ( -2560 272 336 ) ( -2560 272 320 ) subway/3_market1_bottom 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2240 360 344 ) ( -2256 360 344 ) ( -2256 312 344 ) subway/3_market1_bottom 32 0 0 0.500000 0.500000 0 385875968 0 +( -2256 312 376 ) ( -2256 360 376 ) ( -2240 360 376 ) subway/3_market1_bottom 32 0 0 0.500000 0.500000 0 385875968 0 +( -2296 472 488 ) ( -2280 472 488 ) ( -2296 472 368 ) subway/3_market1_bottom 32 -16 0 0.500000 0.500000 0 385875968 0 +} +// brush 1038 +{ +( -2240 296 344 ) ( -2240 472 344 ) ( -2240 472 328 ) subway/3_market3_bottom 32 -16 0 0.500000 0.500000 0 385875968 0 +( -2184 528 336 ) ( -2328 528 336 ) ( -2328 528 320 ) subway/3_market3_bottom 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2272 472 336 ) ( -2272 296 336 ) ( -2272 296 320 ) subway/3_market3_bottom 32 -16 0 0.500000 0.500000 0 385875968 0 +( -2240 384 344 ) ( -2256 384 344 ) ( -2256 336 344 ) subway/3_market3_bottom 0 0 0 0.500000 0.500000 0 385875968 0 +( -2256 336 376 ) ( -2256 384 376 ) ( -2240 384 376 ) subway/3_market3_bottom 0 0 0 0.500000 0.500000 0 385875968 0 +( -2280 496 488 ) ( -2264 496 488 ) ( -2280 496 368 ) subway/3_market3_bottom 0 -16 0 0.500000 0.500000 0 385875968 0 +} +// brush 1039 +{ +( -2240 296 376 ) ( -2240 472 376 ) ( -2240 472 360 ) subway/3_market3 32 -16 0 0.500000 0.500000 0 385875968 0 +( -2184 528 368 ) ( -2328 528 368 ) ( -2328 528 352 ) subway/3_market3 0 -24 0 0.500000 0.500000 0 385875968 0 +( -2272 472 368 ) ( -2272 296 368 ) ( -2272 296 352 ) subway/3_market3 32 -16 0 0.500000 0.500000 0 385875968 0 +( -2240 384 376 ) ( -2256 384 376 ) ( -2256 336 376 ) subway/3_market3 0 0 0 0.500000 0.500000 0 385875968 0 +( -2256 336 440 ) ( -2256 384 440 ) ( -2240 384 440 ) subway/3_market3 0 0 0 0.500000 0.500000 0 385875968 0 +( -2280 496 520 ) ( -2264 496 520 ) ( -2280 496 400 ) subway/3_market3 0 -16 0 0.500000 0.500000 0 385875968 0 +} +// brush 1040 +{ +( -2240 296 400 ) ( -2240 472 400 ) ( -2240 472 384 ) subway/3_market3_top 32 -32 0 0.500000 0.500000 0 385875968 0 +( -2184 528 392 ) ( -2328 528 392 ) ( -2328 528 376 ) subway/3_market3_top 0 -32 0 0.500000 0.500000 0 385875968 0 +( -2272 472 392 ) ( -2272 296 392 ) ( -2272 296 376 ) subway/3_market3_top 32 -32 0 0.500000 0.500000 0 385875968 0 +( -2240 384 440 ) ( -2256 384 440 ) ( -2256 336 440 ) subway/3_market3_top 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2256 336 464 ) ( -2256 384 464 ) ( -2240 384 464 ) subway/3_market3_top 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2280 496 544 ) ( -2264 496 544 ) ( -2280 496 424 ) subway/3_market3_top 0 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 1041 +{ +( -2272 296 400 ) ( -2272 472 400 ) ( -2272 472 384 ) subway/3_market1_top 0 -32 0 0.500000 0.500000 0 385875968 0 +( -2456 528 392 ) ( -2600 528 392 ) ( -2600 528 376 ) subway/3_market1_top 32 -32 0 0.500000 0.500000 0 385875968 0 +( -2680 472 392 ) ( -2680 296 392 ) ( -2680 296 376 ) subway/3_market1_top 0 -32 0 0.500000 0.500000 0 385875968 0 +( -2272 384 440 ) ( -2288 384 440 ) ( -2288 336 440 ) subway/3_market1_top 32 -16 0 0.500000 0.500000 0 385875968 0 +( -2288 336 464 ) ( -2288 384 464 ) ( -2272 384 464 ) subway/3_market1_top 32 -16 0 0.500000 0.500000 0 385875968 0 +( -2432 520 544 ) ( -2416 520 544 ) ( -2432 520 424 ) subway/3_market1_top 32 -32 0 0.500000 0.500000 0 385875968 0 +} +// brush 1042 +{ +( -2272 296 376 ) ( -2272 472 376 ) ( -2272 472 360 ) subway/3_market1 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2216 528 368 ) ( -2360 528 368 ) ( -2360 528 352 ) subway/3_market1 32 -16 0 0.500000 0.500000 0 385875968 0 +( -2680 472 368 ) ( -2680 296 368 ) ( -2680 296 352 ) subway/3_market1 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2272 384 376 ) ( -2288 384 376 ) ( -2288 336 376 ) subway/3_market1 32 0 0 0.500000 0.500000 0 385875968 0 +( -2288 336 440 ) ( -2288 384 440 ) ( -2272 384 440 ) subway/3_market1 32 0 0 0.500000 0.500000 0 385875968 0 +( -2440 520 520 ) ( -2424 520 520 ) ( -2440 520 400 ) subway/3_market1 32 -16 0 0.500000 0.500000 0 385875968 0 +} +// brush 1043 +{ +( -2272 296 344 ) ( -2272 472 344 ) ( -2272 472 328 ) subway/3_market1_bottom 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2232 528 336 ) ( -2376 528 336 ) ( -2376 528 320 ) subway/3_market1_bottom 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2680 472 336 ) ( -2680 296 336 ) ( -2680 296 320 ) subway/3_market1_bottom 0 -16 0 0.500000 0.500000 0 385875968 0 +( -2272 384 344 ) ( -2288 384 344 ) ( -2288 336 344 ) subway/3_market1_bottom 32 0 0 0.500000 0.500000 0 385875968 0 +( -2288 336 376 ) ( -2288 384 376 ) ( -2272 384 376 ) subway/3_market1_bottom 32 0 0 0.500000 0.500000 0 385875968 0 +( -2672 520 488 ) ( -2656 520 488 ) ( -2672 520 368 ) subway/3_market1_bottom 32 -16 0 0.500000 0.500000 0 385875968 0 +} +// brush 1044 +{ +( -2200 296 248 ) ( -2208 296 248 ) ( -2208 248 248 ) subway/3_grocery1 0 -32 0 0.500000 0.500000 0 335544320 0 +( -2208 248 256 ) ( -2208 296 256 ) ( -2200 296 256 ) subway/3_grocery1 0 -32 0 0.500000 0.500000 0 335544320 0 +( -2208 136 248 ) ( -2208 136 256 ) ( -2200 136 256 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2200 472 200 ) ( -2200 520 200 ) ( -2200 520 160 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2184 760 200 ) ( -2192 760 200 ) ( -2192 760 160 ) subway/3_grocery1 0 48 0 0.500000 0.500000 0 335544320 0 +( -2520 136 256 ) ( -2520 136 248 ) ( -2520 760 248 ) subway/3_grocery1 32 48 0 0.500000 0.500000 0 335544320 0 +} +// brush 1045 +{ +( -2464 144 280 ) ( -2528 144 280 ) ( -2528 80 280 ) subway/sky2 0 -32 0 0.500000 0.500000 0 5 15 +( -2528 72 632 ) ( -2528 136 632 ) ( -2464 136 632 ) subway/sky2 0 -32 0 0.500000 0.500000 0 5 15 +( -2464 -792 192 ) ( -2400 -792 192 ) ( -2400 -792 184 ) subway/sky2 0 32 0 0.500000 0.500000 0 5 15 +( -2528 24 264 ) ( -2528 88 264 ) ( -2528 88 256 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 15 +( -2448 -72 192 ) ( -2512 -72 192 ) ( -2512 -72 184 ) subway/sky2 0 32 0 0.500000 0.500000 0 5 15 +( -2680 120 192 ) ( -2680 56 192 ) ( -2680 56 184 ) subway/sky2 32 32 0 0.500000 0.500000 0 5 15 +} +// brush 1046 +{ +( -1864 328 160 ) ( -1928 328 160 ) ( -1928 264 160 ) subway/3_orange_bottom1 16 -32 0 1 1 0 0 0 +( -1924 -456 168 ) ( -1860 -456 168 ) ( -1860 -456 160 ) subway/3_orange_bottom1 16 32 0 1 1 0 0 0 +( -1776 276 168 ) ( -1776 340 168 ) ( -1776 340 160 ) subway/3_orange_bottom1 0 32 0 1 1 0 0 0 +( -1792 328 168 ) ( -1792 264 168 ) ( -1792 264 160 ) subway/3_orange_bottom1 0 32 0 1 1 134217728 0 0 +( -1800 -112 168 ) ( -1832 -112 168 ) ( -1800 -112 160 ) subway/3_orange_bottom1 16 32 0 1 1 0 0 0 +( -1792 -456 224 ) ( -1792 -424 224 ) ( -1776 -440 224 ) subway/3_orange_bottom1 16 -32 0 1 1 0 0 0 +} +// brush 1047 +{ +( -1928 272 280 ) ( -1928 336 280 ) ( -1864 336 280 ) subway/3_orange2 16 0 0 1 1 0 0 0 +( -1924 -456 168 ) ( -1860 -456 168 ) ( -1860 -456 160 ) subway/3_orange2 16 0 0 1 1 0 0 0 +( -1776 276 168 ) ( -1776 340 168 ) ( -1776 340 160 ) subway/3_orange2 0 0 0 1 1 0 0 0 +( -1792 328 168 ) ( -1792 264 168 ) ( -1792 264 160 ) subway/3_orange2 0 0 0 1 1 134217728 0 0 +( -1800 -112 168 ) ( -1832 -112 168 ) ( -1800 -112 160 ) subway/3_orange2 16 0 0 1 1 0 0 0 +( -1792 -424 224 ) ( -1792 -456 224 ) ( -1776 -440 224 ) subway/3_orange2 16 0 0 1 1 0 0 0 +} +// brush 1048 +{ +( -1408 -304 280 ) ( -1344 -304 280 ) ( -1344 -368 280 ) subway/3_orange2 22 16 90 1 1 0 0 0 +( -2144 -308 168 ) ( -2144 -372 168 ) ( -2144 -372 160 ) subway/3_orange2 24 0 0 1 1 0 0 0 +( -1404 -456 168 ) ( -1340 -456 168 ) ( -1340 -456 160 ) subway/3_orange2 -16 0 -180 1 -1 0 0 0 +( -1352 -440 168 ) ( -1416 -440 168 ) ( -1416 -440 160 ) subway/3_orange2 0 0 0 1 1 134217728 0 0 +( -1792 -432 168 ) ( -1792 -400 168 ) ( -1792 -432 160 ) subway/3_orange2 24 0 0 1 1 0 0 0 +( -2104 -440 224 ) ( -2136 -440 224 ) ( -2120 -456 224 ) subway/3_orange2 22 16 90 1 1 0 0 0 +} +// brush 1049 +{ +( -1928 272 288 ) ( -1928 336 288 ) ( -1864 336 288 ) subway/s_asphalt 0 0 0 0.500000 0.500000 0 301989888 0 +( -1932 -456 176 ) ( -1868 -456 176 ) ( -1868 -456 168 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( -1528 172 176 ) ( -1528 236 176 ) ( -1528 236 168 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( -1792 328 224 ) ( -1792 264 224 ) ( -1792 264 216 ) subway/metalrib1 0 0 90 0.500000 0.500000 134217728 16777216 0 +( -1800 -112 176 ) ( -1832 -112 176 ) ( -1800 -112 168 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( -1792 -424 280 ) ( -1792 -456 280 ) ( -1776 -440 280 ) subway/metalrib1 31 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 1050 +{ +( -1544 240 288 ) ( -1608 240 288 ) ( -1608 176 288 ) subway/3_redbrick_bottom1 32 0 0 1 1 0 0 0 +( -1544 -696 192 ) ( -1480 -696 192 ) ( -1480 -696 184 ) subway/3_redbrick_bottom1 32 -32 0 1 1 0 0 0 +( -1512 -440 192 ) ( -1576 -440 192 ) ( -1576 -440 184 ) subway/3_redbrick_bottom1 32 -32 0 1 1 0 0 0 +( -1856 216 192 ) ( -1856 152 192 ) ( -1856 152 184 ) subway/3_redbrick_bottom1 -24 -32 0 1 1 0 0 0 +( -2064 -696 344 ) ( -2120 -696 344 ) ( -2092 -440 344 ) subway/3_redbrick_bottom1 32 0 0 1 1 0 0 0 +( -1536 -440 280 ) ( -1536 -456 280 ) ( -1536 -448 344 ) subway/3_redbrick_bottom1 -24 -32 0 1 1 0 0 0 +} +// brush 1051 +{ +( -1592 176 512 ) ( -1592 240 512 ) ( -1528 240 512 ) subway/3_redbrick_window_ad1 32 32 0 1 1 0 620756992 0 +( -1544 -448 128 ) ( -1480 -448 128 ) ( -1480 -448 120 ) subway/3_redbrick_window_ad1 32 0 0 1 1 0 620756992 0 +( -1496 -440 128 ) ( -1560 -440 128 ) ( -1560 -440 120 ) subway/3_redbrick_window_ad2 32 0 0 1 1 0 0 0 +( -1824 216 128 ) ( -1824 152 128 ) ( -1824 152 120 ) subway/3_redbrick_window_ad1 -8 0 0 1 1 0 620756992 0 +( -2104 -688 448 ) ( -2048 -688 448 ) ( -2076 -432 448 ) subway/3_redbrick_window_ad1 32 32 0 1 1 0 620756992 0 +( -1760 -424 216 ) ( -1760 -448 216 ) ( -1760 -436 504 ) subway/3_redbrick_window_ad1 -8 0 0 1 1 0 620756992 0 +} +// brush 1052 +{ +( -1608 168 568 ) ( -1608 232 568 ) ( -1544 232 568 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -1544 -704 192 ) ( -1480 -704 192 ) ( -1480 -704 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1848 -448 344 ) ( -1848 -448 568 ) ( -1856 -440 568 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1856 216 192 ) ( -1856 152 192 ) ( -1856 152 184 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -2120 -696 344 ) ( -2064 -696 344 ) ( -2092 -440 344 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -1848 -448 568 ) ( -1848 -448 344 ) ( -1848 -704 344 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +} +// brush 1053 +{ +( -1608 296 576 ) ( -1608 360 576 ) ( -1544 360 576 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1520 -696 136 ) ( -1456 -696 136 ) ( -1456 -696 128 ) subway/3_redbrick 24 -56 0 1 1 0 385875968 0 +( -1536 224 208 ) ( -1536 288 208 ) ( -1536 288 200 ) subway/3_redbrick -32 -56 0 1 1 0 385875968 0 +( -1496 -440 136 ) ( -1560 -440 136 ) ( -1560 -440 128 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1856 344 136 ) ( -1856 280 136 ) ( -1856 280 128 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1864 -568 568 ) ( -1808 -568 568 ) ( -1836 -440 568 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +} +// brush 1054 +{ +( -1928 296 624 ) ( -1928 360 624 ) ( -1864 360 624 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -1856 -696 192 ) ( -1792 -696 192 ) ( -1792 -696 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1920 224 264 ) ( -1920 288 264 ) ( -1920 288 256 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -1816 -440 192 ) ( -1880 -440 192 ) ( -1880 -440 184 ) subway/3_redbrick_trim 0 0 0 0.500000 0.500000 0 285212672 0 +( -2176 344 192 ) ( -2176 280 192 ) ( -2176 280 184 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2184 -568 616 ) ( -2120 -568 616 ) ( -2152 -440 616 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +} +// brush 1055 +{ +( -1456 176 512 ) ( -1456 240 512 ) ( -1392 240 512 ) subway/3_redbrick_window_ad1 24 32 0 1 1 0 620756992 0 +( -1408 -448 128 ) ( -1344 -448 128 ) ( -1344 -448 120 ) subway/3_redbrick_window_ad1 24 0 0 1 1 0 620756992 0 +( -1360 -440 128 ) ( -1424 -440 128 ) ( -1424 -440 120 ) subway/3_redbrick_window_ad1 24 0 0 1 1 0 620756992 0 +( -1688 224 128 ) ( -1688 160 128 ) ( -1688 160 120 ) subway/3_redbrick_window_ad1 -8 0 0 1 1 0 620756992 0 +( -1968 -688 448 ) ( -1912 -688 448 ) ( -1940 -432 448 ) subway/3_redbrick_window_ad1 24 32 0 1 1 0 620756992 0 +( -1624 -424 216 ) ( -1624 -448 216 ) ( -1624 -436 504 ) subway/3_redbrick_window_ad1 -8 0 0 1 1 0 620756992 0 +} +// brush 1056 +{ +( -1544 -448 192 ) ( -1480 -448 192 ) ( -1480 -448 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1600 96 264 ) ( -1600 160 264 ) ( -1600 160 256 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1512 -440 192 ) ( -1576 -440 192 ) ( -1576 -440 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1456 176 512 ) ( -1456 240 512 ) ( -1392 240 512 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -1968 -688 448 ) ( -1912 -688 448 ) ( -1940 -432 448 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -1624 -448 216 ) ( -1624 -424 216 ) ( -1624 -436 504 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +} +// brush 1057 +{ +( -1608 168 568 ) ( -1608 232 568 ) ( -1544 232 568 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -1624 -448 344 ) ( -1624 -448 568 ) ( -1536 -448 568 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1512 -440 192 ) ( -1576 -440 192 ) ( -1576 -440 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1848 -448 568 ) ( -1848 -448 344 ) ( -1856 -440 344 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1536 -432 280 ) ( -1536 -456 280 ) ( -1536 -444 568 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1592 240 512 ) ( -1592 176 512 ) ( -1528 240 512 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +} +// brush 1058 +{ +( -1848 -448 344 ) ( -1848 -448 568 ) ( -1760 -448 568 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1512 -440 192 ) ( -1576 -440 192 ) ( -1576 -440 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1848 -448 568 ) ( -1848 -448 344 ) ( -1856 -440 344 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -2120 -696 344 ) ( -2064 -696 344 ) ( -2092 -440 344 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -1592 176 512 ) ( -1592 240 512 ) ( -1528 240 512 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -1824 160 128 ) ( -1824 224 128 ) ( -1824 160 120 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +} +// brush 1059 +{ +( -1848 -448 344 ) ( -1848 -448 568 ) ( -1760 -448 568 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1512 -440 192 ) ( -1576 -440 192 ) ( -1576 -440 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -2120 -696 344 ) ( -2064 -696 344 ) ( -2092 -440 344 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -1536 -432 280 ) ( -1536 -456 280 ) ( -1536 -444 568 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1824 224 128 ) ( -1824 160 128 ) ( -1824 160 120 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -2048 -688 448 ) ( -2104 -688 448 ) ( -2076 -432 448 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +} +// brush 1060 +{ +( -1944 -696 192 ) ( -1880 -696 192 ) ( -1880 -696 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -2168 -448 616 ) ( -2168 -448 344 ) ( -2168 -568 344 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -2168 -448 344 ) ( -2168 -448 616 ) ( -2176 -440 616 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -2176 224 192 ) ( -2176 160 192 ) ( -2176 160 184 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -2184 -568 344 ) ( -2128 -568 344 ) ( -2156 -440 344 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2120 -568 616 ) ( -2184 -568 616 ) ( -2152 -440 616 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +} +// brush 1061 +{ +( -1928 176 512 ) ( -1928 240 512 ) ( -1864 240 512 ) subway/3_redbrick_window_ad1 48 32 0 1 1 0 620756992 0 +( -1880 -448 128 ) ( -1816 -448 128 ) ( -1816 -448 120 ) subway/3_redbrick_window_ad1 48 0 0 1 1 0 620756992 0 +( -1832 -440 128 ) ( -1896 -440 128 ) ( -1896 -440 120 ) subway/3_redbrick_window_ad1 48 0 0 1 1 0 620756992 0 +( -2160 216 128 ) ( -2160 152 128 ) ( -2160 152 120 ) subway/3_redbrick_window_ad1 -8 0 0 1 1 0 620756992 0 +( -2440 -688 448 ) ( -2384 -688 448 ) ( -2412 -432 448 ) subway/3_redbrick_window_ad1 48 32 0 1 1 0 620756992 0 +( -2096 -424 216 ) ( -2096 -448 216 ) ( -2096 -436 504 ) subway/3_redbrick_window_ad1 -8 0 0 1 1 0 620756992 0 +} +// brush 1062 +{ +( -1768 176 512 ) ( -1768 240 512 ) ( -1704 240 512 ) subway/3_redbrick_window_ad1 16 32 0 1 1 0 620756992 0 +( -1720 -448 128 ) ( -1656 -448 128 ) ( -1656 -448 120 ) subway/3_redbrick_window_ad1 16 0 0 1 1 0 620756992 0 +( -1672 -440 128 ) ( -1736 -440 128 ) ( -1736 -440 120 ) subway/3_redbrick_window_ad2 16 0 0 1 1 0 0 0 +( -2000 208 128 ) ( -2000 144 128 ) ( -2000 144 120 ) subway/3_redbrick_window_ad1 -8 0 0 1 1 0 620756992 0 +( -2280 -688 448 ) ( -2224 -688 448 ) ( -2252 -432 448 ) subway/3_redbrick_window_ad1 16 32 0 1 1 0 620756992 0 +( -1936 -424 216 ) ( -1936 -448 216 ) ( -1936 -436 504 ) subway/3_redbrick_window_ad1 -8 0 0 1 1 0 620756992 0 +} +// brush 1063 +{ +( -2168 -448 512 ) ( -2168 -448 616 ) ( -1928 -448 616 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1928 -448 512 ) ( -1928 -448 616 ) ( -1920 -440 616 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1656 -440 192 ) ( -1720 -440 192 ) ( -1720 -440 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -2168 -448 616 ) ( -2168 -448 512 ) ( -2176 -440 512 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1960 -568 616 ) ( -2024 -568 616 ) ( -1992 -440 616 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1768 240 512 ) ( -1768 176 512 ) ( -1704 240 512 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +} +// brush 1064 +{ +( -1928 -448 512 ) ( -1928 -448 448 ) ( -1936 -448 448 ) subway/3_redbrick 56 0 0 1 1 0 385875968 0 +( -1928 -448 448 ) ( -1928 -448 512 ) ( -1920 -440 512 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1656 -440 192 ) ( -1720 -440 192 ) ( -1720 -440 184 ) subway/3_redbrick 8 0 0 1 1 0 385875968 0 +( -1768 176 512 ) ( -1768 240 512 ) ( -1704 240 512 ) subway/3_redbrick 56 32 0 1 1 0 385875968 0 +( -2280 -688 448 ) ( -2224 -688 448 ) ( -2252 -432 448 ) subway/3_redbrick 56 32 0 1 1 0 385875968 0 +( -1936 -448 216 ) ( -1936 -424 216 ) ( -1936 -436 504 ) subway/3_redbrick 0 0 0 1 1 0 385875968 0 +} +// brush 1065 +{ +( -2168 -448 344 ) ( -2168 -448 616 ) ( -2080 -448 616 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1816 -440 192 ) ( -1880 -440 192 ) ( -1880 -440 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -2168 -448 616 ) ( -2168 -448 344 ) ( -2176 -440 344 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -2184 -568 344 ) ( -2128 -568 344 ) ( -2156 -440 344 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -1928 176 512 ) ( -1928 240 512 ) ( -1864 240 512 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2160 152 128 ) ( -2160 216 128 ) ( -2160 152 120 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +} +// brush 1066 +{ +( -2168 -448 344 ) ( -2168 -448 616 ) ( -2080 -448 616 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -2080 224 264 ) ( -2080 288 264 ) ( -2080 288 256 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1816 -440 192 ) ( -1880 -440 192 ) ( -1880 -440 184 ) subway/3_redbrick 24 0 0 1 1 0 385875968 0 +( -1928 176 512 ) ( -1928 240 512 ) ( -1864 240 512 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2440 -688 448 ) ( -2384 -688 448 ) ( -2412 -432 448 ) subway/3_redbrick 24 32 0 1 1 0 385875968 0 +( -2096 -448 216 ) ( -2096 -424 216 ) ( -2096 -436 504 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +} +// brush 1067 +{ +( -1704 -696 192 ) ( -1640 -696 192 ) ( -1640 -696 184 ) subway/3_redbrick 56 0 0 1 1 0 385875968 0 +( -1920 104 264 ) ( -1920 168 264 ) ( -1920 168 256 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1928 -448 616 ) ( -1928 -448 512 ) ( -1920 -440 512 ) subway/3_redbrick 0 0 0 1 1 0 385875968 0 +( -1928 -448 512 ) ( -1928 -448 616 ) ( -1928 -568 616 ) subway/3_redbrick -32 0 0 1 1 0 385875968 0 +( -1960 -568 616 ) ( -2024 -568 616 ) ( -1992 -440 616 ) subway/3_redbrick 56 32 0 1 1 0 385875968 0 +( -1768 240 344 ) ( -1768 176 344 ) ( -1704 240 344 ) subway/3_redbrick 56 32 0 1 1 0 385875968 0 +} +// brush 1068 +{ +( -1864 368 288 ) ( -1928 368 288 ) ( -1928 304 288 ) subway/3_redbrick_bottom1 32 0 0 1 1 0 0 0 +( -1864 -696 192 ) ( -1800 -696 192 ) ( -1800 -696 184 ) subway/3_redbrick_bottom1 32 -32 0 1 1 0 0 0 +( -1920 224 264 ) ( -1920 288 264 ) ( -1920 288 256 ) subway/3_redbrick_bottom1 -24 -32 0 1 1 0 0 0 +( -1816 -440 192 ) ( -1880 -440 192 ) ( -1880 -440 184 ) subway/3_redbrick_bottom1 32 -32 0 1 1 0 0 0 +( -2128 -568 344 ) ( -2184 -568 344 ) ( -2156 -440 344 ) subway/3_redbrick_bottom1 32 0 0 1 1 0 0 0 +( -2176 -440 280 ) ( -2176 -424 280 ) ( -2176 -432 344 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 1069 +{ +( -144 -1424 -312 ) ( -144 -1352 -312 ) ( -200 -1352 -312 ) subway/1_soda_front_b 22 -26 0 0.700000 0.700000 0 0 0 +( -198 -1352 -292 ) ( -142 -1352 -292 ) ( -142 -1424 -292 ) subway/1_soda_front_b 22 -26 0 0.700000 0.700000 0 0 0 +( -200 -1356 -282 ) ( -200 -1428 -282 ) ( -200 -1428 -354 ) subway/1_soda_side_b -23 0 0 -0.700000 0.700000 0 16777216 0 +( -208 -1400 -256 ) ( -152 -1400 -256 ) ( -152 -1400 -328 ) subway/1_soda_front_b 28 0 0 0.700000 0.700000 0 1 800 +( -154 -1424 -284 ) ( -154 -1352 -284 ) ( -154 -1352 -356 ) subway/1_soda_side_b 85 0 0 0.700000 0.700000 0 16777216 0 +( -142 -1366 -282 ) ( -198 -1366 -282 ) ( -198 -1366 -354 ) subway/1_soda_front_b -45 0 0 -0.700000 0.700000 0 654311425 900 +} +// brush 1070 +{ +( -144 -1366 -248 ) ( -200 -1366 -248 ) ( -200 -1366 -320 ) subway/1_soda_front_a -45 -34 0 -0.700000 0.700000 0 654311425 900 +( -154 -1424 -248 ) ( -154 -1352 -248 ) ( -154 -1352 -320 ) subway/1_soda_side_a 85 -33 0 0.700000 0.700000 0 0 0 +( -208 -1400 -224 ) ( -152 -1400 -224 ) ( -152 -1400 -296 ) subway/1_soda_front_a 28 -32 0 0.700000 0.700000 0 1 800 +( -200 -1352 -248 ) ( -200 -1424 -248 ) ( -200 -1424 -320 ) subway/1_soda_side_a -23 -33 0 -0.700000 0.700000 0 0 0 +( -200 -1352 -248 ) ( -144 -1352 -248 ) ( -144 -1424 -248 ) subway/1_soda_top 27 -24 0 0.700000 0.700000 0 0 0 +( -144 -1424 -292 ) ( -144 -1352 -292 ) ( -200 -1352 -292 ) subway/1_soda_front_a 62 -6 0 0.700000 0.700000 0 0 0 +} +// brush 1071 +{ +( -144 -1424 -328 ) ( -144 -1352 -328 ) ( -200 -1352 -328 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -198 -1352 -312 ) ( -142 -1352 -312 ) ( -142 -1424 -312 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -200 -1356 -302 ) ( -200 -1428 -302 ) ( -200 -1428 -374 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -208 -1400 -276 ) ( -152 -1400 -276 ) ( -152 -1400 -348 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -154 -1424 -304 ) ( -154 -1352 -304 ) ( -154 -1352 -376 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -142 -1366 -302 ) ( -198 -1366 -302 ) ( -198 -1366 -374 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 1072 +{ +( 1064 272 -152 ) ( 1032 272 -152 ) ( 1032 232 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1032 232 -136 ) ( 1032 272 -136 ) ( 1064 272 -136 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1032 232 -144 ) ( 1064 232 -144 ) ( 1064 232 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1064 240 -144 ) ( 1064 280 -144 ) ( 1064 280 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1064 264 -144 ) ( 1032 264 -144 ) ( 1032 264 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1032 272 -144 ) ( 1032 232 -144 ) ( 1032 232 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1073 +{ +( 1032 544 -216 ) ( 1032 616 -216 ) ( 976 616 -216 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 978 616 -200 ) ( 1034 616 -200 ) ( 1034 544 -200 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 976 612 -186 ) ( 976 540 -186 ) ( 976 540 -258 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 968 568 -160 ) ( 1024 568 -160 ) ( 1024 568 -232 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 1022 544 -188 ) ( 1022 616 -188 ) ( 1022 616 -260 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 1034 602 -186 ) ( 978 602 -186 ) ( 978 602 -258 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 1074 +{ +( -176 -288 -388 ) ( -176 -320 -388 ) ( -104 -320 -388 ) subway/light_tube 64 16 0 0.500000 0.500000 134217728 16777217 5200 +( -104 -320 -384 ) ( -176 -320 -384 ) ( -176 -288 -384 ) subway/light_tube 64 0 0 0.500000 0.500000 134217728 16777217 30000 +( -108 -296 -384 ) ( -108 -296 -376 ) ( -180 -296 -376 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -116 -312 -384 ) ( -116 -312 -376 ) ( -116 -280 -376 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -176 -312 -384 ) ( -176 -312 -376 ) ( -104 -312 -376 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -160 -288 -376 ) ( -160 -288 -368 ) ( -160 -320 -368 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1075 +{ +( 880 -624 -216 ) ( 880 -552 -216 ) ( 824 -552 -216 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 826 -552 -200 ) ( 882 -552 -200 ) ( 882 -624 -200 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 824 -556 -190 ) ( 824 -628 -190 ) ( 824 -628 -262 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 816 -600 -164 ) ( 872 -600 -164 ) ( 872 -600 -236 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 870 -624 -192 ) ( 870 -552 -192 ) ( 870 -552 -264 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 882 -566 -190 ) ( 826 -566 -190 ) ( 826 -566 -262 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 1076 +{ +( 112 1066 -138 ) ( 112 1010 -138 ) ( 112 1010 -210 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 170 1054 -140 ) ( 98 1054 -140 ) ( 98 1054 -212 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 146 1000 -112 ) ( 146 1056 -112 ) ( 146 1056 -184 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 102 1008 -138 ) ( 174 1008 -138 ) ( 174 1008 -210 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 98 1010 -152 ) ( 98 1066 -152 ) ( 170 1066 -152 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 170 1064 -168 ) ( 98 1064 -168 ) ( 98 1008 -168 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 1077 +{ +( 560 -316 -216 ) ( 668 -316 -216 ) ( 668 -292 -216 ) subway/1_duct 16 0 -180 0.499939 0.500000 0 16777216 0 +( 668 -292 -192 ) ( 668 -316 -192 ) ( 560 -316 -192 ) subway/1_duct 16 0 -180 0.499939 0.500000 0 16777216 0 +( 668 -296 -160 ) ( 560 -296 -160 ) ( 560 -296 -224 ) subway/1_duct 16 -15 -180 0.500000 -0.500000 0 16777216 0 +( 496 -300 -160 ) ( 496 -324 -160 ) ( 496 -324 -224 ) subway/1_duct 16 -16 -180 0.500000 -0.500000 0 16777216 0 +( 560 -320 -160 ) ( 668 -320 -160 ) ( 668 -320 -224 ) subway/1_duct 16 -15 -180 0.500000 -0.500000 0 16777216 0 +( 560 -324 -160 ) ( 560 -300 -160 ) ( 560 -300 -224 ) subway/1_duct 16 -16 -180 0.500000 -0.500000 0 16777216 0 +} +// brush 1078 +{ +( 560 -324 -152 ) ( 560 -300 -152 ) ( 560 -300 -216 ) subway/stair_side 0 0 -180 0.500000 -0.500000 0 285212672 0 +( 560 -320 -152 ) ( 668 -320 -152 ) ( 668 -320 -216 ) subway/1_black 0 0 -180 0.500000 -0.500000 0 16777216 0 +( 496 -300 -152 ) ( 496 -324 -152 ) ( 496 -324 -216 ) subway/1_concrete_floor 0 0 -180 0.500000 -0.500000 0 16777216 0 +( 668 -288 -152 ) ( 560 -288 -152 ) ( 560 -288 -216 ) subway/1_concrete_floor 0 0 -180 0.500000 -0.500000 0 16777216 0 +( 668 -292 -184 ) ( 668 -316 -184 ) ( 560 -316 -184 ) subway/con5 16 -15 -180 0.499939 0.500000 0 285212672 0 +( 560 -316 -192 ) ( 668 -316 -192 ) ( 668 -292 -192 ) subway/1_black -15 0 -180 0.499939 0.500000 0 16777216 0 +} +// brush 1079 +{ +( 720 1008 -184 ) ( 656 1008 -184 ) ( 656 944 -184 ) subway/1_concrete_floor -48 -32 0 0.500000 0.500000 0 285212672 0 +( 656 928 -176 ) ( 656 992 -176 ) ( 720 992 -176 ) subway/1_stair_top1 0 31 90 0.500000 -0.500000 0 285212672 0 +( 744 792 -192 ) ( 744 792 -184 ) ( 744 856 -184 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 536 640 -192 ) ( 536 640 -184 ) ( 600 640 -184 ) subway/1_concrete_floor -16 -16 0 0.500000 0.500000 0 285212672 0 +( 720 1384 -184 ) ( 720 1384 -176 ) ( 720 1320 -176 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 720 784 -184 ) ( 720 784 -176 ) ( 656 784 -176 ) subway/1_concrete_floor -16 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 1080 +{ +( 744 1008 -192 ) ( 680 1008 -192 ) ( 680 944 -192 ) subway/1_concrete_floor -32 -32 0 0.500000 0.500000 0 285212672 0 +( 680 928 -184 ) ( 680 992 -184 ) ( 744 992 -184 ) subway/1_stair_top1 0 15 90 0.500000 -0.500000 0 285212672 0 +( 768 792 -200 ) ( 768 792 -192 ) ( 768 856 -192 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 560 640 -200 ) ( 560 640 -192 ) ( 624 640 -192 ) subway/1_concrete_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 744 1384 -192 ) ( 744 1384 -184 ) ( 744 1320 -184 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 744 784 -192 ) ( 744 784 -184 ) ( 680 784 -184 ) subway/1_concrete_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1081 +{ +( 768 1008 -200 ) ( 704 1008 -200 ) ( 704 944 -200 ) subway/1_concrete_floor -16 -32 0 0.500000 0.500000 0 285212672 0 +( 704 928 -192 ) ( 704 992 -192 ) ( 768 992 -192 ) subway/1_stair_top1 0 63 90 0.500000 -0.500000 0 285212672 0 +( 792 792 -208 ) ( 792 792 -200 ) ( 792 856 -200 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 584 640 -208 ) ( 584 640 -200 ) ( 648 640 -200 ) subway/1_concrete_floor -48 -48 0 0.500000 0.500000 0 285212672 0 +( 768 1384 -200 ) ( 768 1384 -192 ) ( 768 1320 -192 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 768 784 -200 ) ( 768 784 -192 ) ( 704 784 -192 ) subway/1_concrete_floor -48 -48 0 0.500000 0.500000 0 285212672 0 +} +// brush 1082 +{ +( 792 1008 -208 ) ( 728 1008 -208 ) ( 728 944 -208 ) subway/1_concrete_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 728 928 -200 ) ( 728 992 -200 ) ( 792 992 -200 ) subway/1_stair_top1 0 47 90 0.500000 -0.500000 0 285212672 0 +( 816 792 -216 ) ( 816 792 -208 ) ( 816 856 -208 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 608 640 -216 ) ( 608 640 -208 ) ( 672 640 -208 ) subway/1_concrete_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 792 1384 -208 ) ( 792 1384 -200 ) ( 792 1320 -200 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 792 784 -208 ) ( 792 784 -200 ) ( 728 784 -200 ) subway/1_concrete_floor -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1083 +{ +( 816 1160 -216 ) ( 752 1160 -216 ) ( 752 1096 -216 ) subway/metal2 0 -32 0 0.500000 0.500000 0 16777216 0 +( 840 792 -200 ) ( 840 784 -200 ) ( 720 784 -168 ) subway/metal2 0 -32 0 0.500000 0.500000 0 16777216 0 +( 840 784 -200 ) ( 840 792 -200 ) ( 840 792 -216 ) subway/metal2 32 0 0 0.500000 0.500000 0 16777216 0 +( 536 784 -184 ) ( 536 784 -176 ) ( 600 784 -176 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 720 1536 -176 ) ( 720 1536 -168 ) ( 720 1472 -168 ) subway/metal2 32 0 0 0.500000 0.500000 0 16777216 0 +( 816 792 -208 ) ( 816 792 -200 ) ( 752 792 -200 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1084 +{ +( 816 784 -216 ) ( 816 784 -208 ) ( 752 784 -208 ) subway/1_concrete_floor -16 -16 0 0.500000 0.500000 0 285212672 0 +( 816 1384 -216 ) ( 816 1384 -208 ) ( 816 1320 -208 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 632 640 -224 ) ( 632 640 -216 ) ( 696 640 -216 ) subway/1_concrete_floor -16 -16 0 0.500000 0.500000 0 285212672 0 +( 840 792 -224 ) ( 840 792 -216 ) ( 840 856 -216 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 752 928 -208 ) ( 752 992 -208 ) ( 816 992 -208 ) subway/1_stair_top1 0 31 90 0.500000 -0.500000 0 285212672 0 +( 816 1008 -216 ) ( 752 1008 -216 ) ( 752 944 -216 ) subway/1_concrete_floor -48 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1085 +{ +( 816 640 -208 ) ( 816 640 -200 ) ( 752 640 -200 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 720 1384 -176 ) ( 720 1384 -168 ) ( 720 1320 -168 ) subway/metal2 32 0 0 0.500000 0.500000 0 16777216 0 +( 536 632 -184 ) ( 536 632 -176 ) ( 600 632 -176 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 840 632 -200 ) ( 840 640 -200 ) ( 840 640 -216 ) subway/metal2 32 0 0 0.500000 0.500000 0 16777216 0 +( 840 640 -200 ) ( 840 632 -200 ) ( 720 632 -168 ) subway/metal2 0 -32 0 0.500000 0.500000 0 16777216 0 +( 816 1008 -216 ) ( 752 1008 -216 ) ( 752 944 -216 ) subway/metal2 0 -32 0 0.500000 0.500000 0 16777216 0 +} +// brush 1086 +{ +( 2000 -672 -384 ) ( 2000 -600 -384 ) ( 1976 -600 -384 ) subway/1_tunnelwall_2 -24 -8 0 1 1 0 301989888 0 +( 1976 -600 -352 ) ( 2000 -600 -352 ) ( 2000 -672 -352 ) subway/1_tunnelwall_2 -24 -8 0 1 1 0 301989888 0 +( 1976 -672 -416 ) ( 1976 -672 -256 ) ( 2000 -672 -256 ) subway/1_tunnelwall_2 -24 32 0 1 1 0 301989888 0 +( 1976 -592 -416 ) ( 1976 -592 -256 ) ( 1976 -664 -256 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 2000 -608 -416 ) ( 2000 -608 -256 ) ( 1976 -608 -256 ) subway/1_tunnelwall_2 -24 32 0 1 1 0 301989888 0 +( 1992 -672 -416 ) ( 1992 -672 -256 ) ( 1992 -600 -256 ) subway/1_tunnelwall_2 -32 32 0 -1 1 0 301989888 0 +} +// brush 1087 +{ +( 1680 232 -384 ) ( 1656 232 -384 ) ( 1656 160 -384 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1656 160 -352 ) ( 1656 232 -352 ) ( 1680 232 -352 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1656 160 -256 ) ( 1680 160 -256 ) ( 1680 160 -416 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1688 168 -256 ) ( 1688 240 -256 ) ( 1688 240 -416 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1680 224 -256 ) ( 1656 224 -256 ) ( 1656 224 -416 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1672 232 -256 ) ( 1672 160 -256 ) ( 1672 160 -416 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +} +// brush 1088 +{ +( 1672 580 -344 ) ( 1672 556 -344 ) ( 1672 556 -352 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +( 2012 424 -376 ) ( 1892 424 -376 ) ( 1892 424 -384 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -296 -432 ) ( 1688 -272 -432 ) ( 1688 -272 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1992 76 -448 ) ( 1872 76 -448 ) ( 1872 52 -448 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1656 232 -416 ) ( 1680 232 -416 ) ( 1656 160 -416 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1728 224 -448 ) ( 1672 224 -448 ) ( 1700 224 -416 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1089 +{ +( 1672 580 -344 ) ( 1672 556 -344 ) ( 1672 556 -352 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -296 -432 ) ( 1688 -272 -432 ) ( 1688 -272 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1992 76 -448 ) ( 1872 76 -448 ) ( 1872 52 -448 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1704 -344 -448 ) ( 1696 -344 -336 ) ( 1704 -344 -336 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1656 232 -416 ) ( 1680 232 -416 ) ( 1656 160 -416 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1664 160 -448 ) ( 1720 160 -448 ) ( 1692 160 -416 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1090 +{ +( 1720 -872 -384 ) ( 1720 -800 -384 ) ( 1696 -800 -384 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1696 -800 -352 ) ( 1720 -800 -352 ) ( 1720 -872 -352 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1696 -872 -416 ) ( 1696 -872 -256 ) ( 1720 -872 -256 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1672 -800 -416 ) ( 1672 -800 -256 ) ( 1672 -872 -256 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1720 -808 -416 ) ( 1720 -808 -256 ) ( 1696 -808 -256 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1688 -872 -416 ) ( 1688 -872 -256 ) ( 1688 -800 -256 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +} +// brush 1091 +{ +( 1672 -188 -344 ) ( 1672 -212 -344 ) ( 1672 -212 -352 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 2012 -344 -376 ) ( 1892 -344 -376 ) ( 1892 -344 -384 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -1064 -432 ) ( 1688 -1040 -432 ) ( 1688 -1040 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1992 -692 -448 ) ( 1872 -692 -448 ) ( 1872 -716 -448 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1720 -800 -416 ) ( 1720 -872 -416 ) ( 1696 -800 -416 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1720 -808 -448 ) ( 1664 -808 -448 ) ( 1692 -808 -416 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1092 +{ +( 1672 -188 -344 ) ( 1672 -212 -344 ) ( 1672 -212 -352 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -1064 -432 ) ( 1688 -1040 -432 ) ( 1688 -1040 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1992 -692 -448 ) ( 1872 -692 -448 ) ( 1872 -716 -448 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1704 -1112 -448 ) ( 1696 -1112 -336 ) ( 1704 -1112 -336 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1720 -800 -416 ) ( 1720 -872 -416 ) ( 1696 -800 -416 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1664 -872 -448 ) ( 1720 -872 -448 ) ( 1692 -872 -416 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1093 +{ +( 1688 1576 -424 ) ( 1672 1576 -424 ) ( 1672 1528 -424 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1672 1536 -400 ) ( 1672 1584 -400 ) ( 1688 1584 -400 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1672 1552 -296 ) ( 1688 1552 -296 ) ( 1688 1552 -456 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1688 1528 -296 ) ( 1688 1576 -296 ) ( 1688 1576 -456 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1688 1584 -296 ) ( 1672 1584 -296 ) ( 1672 1584 -456 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1672 1576 -296 ) ( 1672 1528 -296 ) ( 1672 1528 -456 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +} +// brush 1094 +{ +( 1688 1576 -368 ) ( 1672 1576 -368 ) ( 1672 1528 -368 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1672 1536 -360 ) ( 1672 1584 -360 ) ( 1688 1584 -360 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1672 1552 -256 ) ( 1688 1552 -256 ) ( 1688 1552 -416 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1688 1528 -256 ) ( 1688 1576 -256 ) ( 1688 1576 -416 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1688 1584 -256 ) ( 1672 1584 -256 ) ( 1672 1584 -416 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1672 1576 -256 ) ( 1672 1528 -256 ) ( 1672 1528 -416 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +} +// brush 1095 +{ +( 1200 1044 -392 ) ( 1192 1044 -392 ) ( 1192 1012 -392 ) subway/2_stair_side2 0 0 90 0.500000 0.500000 0 285212672 0 +( 1192 1012 -384 ) ( 1192 1044 -384 ) ( 1200 1044 -384 ) subway/2_stair_side2 0 0 90 0.500000 0.500000 0 285212672 0 +( 1192 1012 -400 ) ( 1200 1012 -400 ) ( 1200 1012 -408 ) subway/2_stair_side2 -8 15 90 0.500000 0.500000 0 285212672 0 +( 1208 1012 -400 ) ( 1208 1044 -400 ) ( 1208 1044 -408 ) subway/2_open_box 8 0 0 0.500000 0.500000 0 16777216 0 +( 1200 1044 -400 ) ( 1192 1044 -400 ) ( 1192 1044 -408 ) subway/2_stair_side2 -8 15 90 0.500000 0.500000 0 285212672 0 +( 1200 1044 -400 ) ( 1200 1012 -400 ) ( 1200 1012 -408 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +} +// brush 1096 +{ +( -136 376 -48 ) ( -184 376 -48 ) ( -184 360 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -184 304 -88 ) ( -184 304 -72 ) ( -184 296 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -184 312 -48 ) ( -136 312 -48 ) ( -152 328 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -136 328 -48 ) ( -136 360 -48 ) ( -152 360 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -184 376 -48 ) ( -136 376 -48 ) ( -136 312 -48 ) subway/1_lobby4 0 -32 0 0.500000 0.500000 0 285212672 0 +( -192 328 -80 ) ( -112 328 -80 ) ( -152 360 -80 ) subway/1_lobby4 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1097 +{ +( -136 568 -48 ) ( -184 568 -48 ) ( -184 552 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -184 496 -88 ) ( -184 496 -72 ) ( -184 488 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -184 504 -48 ) ( -136 504 -48 ) ( -152 520 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -136 520 -48 ) ( -136 552 -48 ) ( -152 552 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -184 568 -48 ) ( -136 568 -48 ) ( -136 504 -48 ) subway/1_lobby4 0 -32 0 0.500000 0.500000 0 285212672 0 +( -192 520 -80 ) ( -112 520 -80 ) ( -152 552 -80 ) subway/1_lobby4 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1098 +{ +( 392 744 -120 ) ( 392 744 -88 ) ( 136 744 -88 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( -184 688 -88 ) ( -184 688 -72 ) ( -184 680 -72 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( -152 712 -88 ) ( -152 712 -120 ) ( -184 712 -120 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( -152 712 -120 ) ( -152 712 -88 ) ( -152 744 -88 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( 240 712 -120 ) ( 176 712 -120 ) ( 176 648 -120 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( -112 712 -80 ) ( -192 712 -80 ) ( -152 744 -80 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1099 +{ +( 392 744 -120 ) ( 392 744 -88 ) ( 136 744 -88 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -184 688 -88 ) ( -184 688 -72 ) ( -184 680 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -184 696 -48 ) ( -136 696 -48 ) ( -152 712 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -136 712 -48 ) ( -136 744 -48 ) ( -152 744 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -136 696 -48 ) ( -184 696 -48 ) ( -184 744 -48 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -192 712 -80 ) ( -112 712 -80 ) ( -152 744 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1100 +{ +( 328 -240 -480 ) ( 328 -272 -480 ) ( 368 -272 -480 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 376 -272 -464 ) ( 336 -272 -464 ) ( 336 -240 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 576 -264 -424 ) ( 576 -232 -424 ) ( 576 -232 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 584 -248 -464 ) ( 544 -248 -464 ) ( 544 -248 -480 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 544 -272 -464 ) ( 544 -272 -480 ) ( 544 -240 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 544 -280 -480 ) ( 544 -280 -464 ) ( 576 -280 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 1101 +{ +( 544 -408 -480 ) ( 544 -408 -464 ) ( 576 -408 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 544 -400 -464 ) ( 544 -400 -480 ) ( 544 -368 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 584 -376 -464 ) ( 544 -376 -464 ) ( 544 -376 -480 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 576 -392 -424 ) ( 576 -360 -424 ) ( 576 -360 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 376 -400 -464 ) ( 336 -400 -464 ) ( 336 -368 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 328 -368 -480 ) ( 328 -400 -480 ) ( 368 -400 -480 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1102 +{ +( 544 -536 -480 ) ( 544 -536 -464 ) ( 576 -536 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 544 -528 -464 ) ( 544 -528 -480 ) ( 544 -496 -480 ) subway/1_tile_bottom 80 32 0 -0.500000 0.500000 0 318767104 0 +( 584 -504 -464 ) ( 544 -504 -464 ) ( 544 -504 -480 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 576 -520 -424 ) ( 576 -488 -424 ) ( 576 -488 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 376 -528 -464 ) ( 336 -528 -464 ) ( 336 -496 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 328 -496 -480 ) ( 328 -528 -480 ) ( 368 -528 -480 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1103 +{ +( 544 -664 -480 ) ( 544 -664 -464 ) ( 576 -664 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 544 -656 -464 ) ( 544 -656 -480 ) ( 544 -624 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 584 -632 -464 ) ( 544 -632 -464 ) ( 544 -632 -480 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 576 -648 -424 ) ( 576 -616 -424 ) ( 576 -616 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 376 -656 -464 ) ( 336 -656 -464 ) ( 336 -624 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 328 -624 -480 ) ( 328 -656 -480 ) ( 368 -656 -480 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1104 +{ +( -114 1415 -133 ) ( -120 1415 -133 ) ( -120 1414 -133 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -120 1414 -132 ) ( -120 1415 -132 ) ( -114 1415 -132 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -119 1399 -132 ) ( -113 1399 -132 ) ( -113 1399 -156 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -111 1414 -132 ) ( -111 1415 -132 ) ( -111 1415 -156 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -114 1415 -132 ) ( -120 1415 -132 ) ( -120 1415 -156 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -120 1415 -132 ) ( -120 1414 -132 ) ( -120 1414 -156 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1105 +{ +( -114 1415 -132 ) ( -120 1415 -132 ) ( -120 1414 -132 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -120 1414 -104 ) ( -120 1415 -104 ) ( -114 1415 -104 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -120 1414 -104 ) ( -114 1414 -104 ) ( -114 1414 -128 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -111 1414 -104 ) ( -111 1415 -104 ) ( -111 1415 -128 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -112 1415 -104 ) ( -118 1415 -104 ) ( -118 1415 -128 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -120 1415 -104 ) ( -120 1414 -104 ) ( -120 1414 -128 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1106 +{ +( -114 1400 -132 ) ( -120 1400 -132 ) ( -120 1399 -132 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -120 1399 -104 ) ( -120 1400 -104 ) ( -114 1400 -104 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -120 1399 -104 ) ( -114 1399 -104 ) ( -114 1399 -128 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -111 1399 -104 ) ( -111 1400 -104 ) ( -111 1400 -128 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -112 1400 -104 ) ( -118 1400 -104 ) ( -118 1400 -128 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -120 1400 -104 ) ( -120 1399 -104 ) ( -120 1399 -128 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1107 +{ +( -114 1415 -104 ) ( -120 1415 -104 ) ( -120 1414 -104 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -120 1414 -103 ) ( -120 1415 -103 ) ( -114 1415 -103 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -119 1399 -103 ) ( -113 1399 -103 ) ( -113 1399 -127 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -111 1414 -103 ) ( -111 1415 -103 ) ( -111 1415 -127 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -114 1415 -103 ) ( -120 1415 -103 ) ( -120 1415 -127 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -120 1415 -103 ) ( -120 1414 -103 ) ( -120 1414 -127 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1108 +{ +( -120 1415 -128 ) ( -120 1414 -128 ) ( -120 1414 -152 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -114 1414 -128 ) ( -120 1414 -128 ) ( -120 1414 -152 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -119 1413 -128 ) ( -119 1414 -128 ) ( -119 1414 -152 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -119 1400 -125 ) ( -113 1400 -125 ) ( -113 1400 -149 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -120 1414 -104 ) ( -120 1415 -104 ) ( -114 1415 -104 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -114 1415 -132 ) ( -120 1415 -132 ) ( -120 1414 -132 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1109 +{ +( 1824 1112 -176 ) ( 1824 1104 -176 ) ( 1824 1104 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1888 1108 -176 ) ( 1824 1108 -176 ) ( 1824 1108 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1888 1104 -176 ) ( 1888 1112 -176 ) ( 1888 1112 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 1104 -176 ) ( 1888 1104 -176 ) ( 1888 1104 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 1104 -144 ) ( 1824 1112 -144 ) ( 1888 1112 -144 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1888 1112 -208 ) ( 1824 1112 -208 ) ( 1824 1104 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 1110 +{ +( 1588 888 -216 ) ( 1524 888 -216 ) ( 1524 880 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 876 -140 ) ( 1524 884 -140 ) ( 1588 884 -140 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 876 -176 ) ( 1588 876 -176 ) ( 1588 876 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1528 872 -176 ) ( 1528 880 -176 ) ( 1528 880 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1588 880 -176 ) ( 1524 880 -176 ) ( 1524 880 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 884 -176 ) ( 1524 876 -176 ) ( 1524 876 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 1111 +{ +( 1588 936 -216 ) ( 1524 936 -216 ) ( 1524 928 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 924 -140 ) ( 1524 932 -140 ) ( 1588 932 -140 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 924 -176 ) ( 1588 924 -176 ) ( 1588 924 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1528 920 -176 ) ( 1528 928 -176 ) ( 1528 928 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1588 928 -176 ) ( 1524 928 -176 ) ( 1524 928 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 932 -176 ) ( 1524 924 -176 ) ( 1524 924 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 1112 +{ +( 1588 984 -216 ) ( 1524 984 -216 ) ( 1524 976 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 972 -140 ) ( 1524 980 -140 ) ( 1588 980 -140 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 972 -176 ) ( 1588 972 -176 ) ( 1588 972 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1528 968 -176 ) ( 1528 976 -176 ) ( 1528 976 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1588 976 -176 ) ( 1524 976 -176 ) ( 1524 976 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 980 -176 ) ( 1524 972 -176 ) ( 1524 972 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 1113 +{ +( 1588 1032 -216 ) ( 1524 1032 -216 ) ( 1524 1024 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 1020 -140 ) ( 1524 1028 -140 ) ( 1588 1028 -140 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 1020 -176 ) ( 1588 1020 -176 ) ( 1588 1020 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1528 1016 -176 ) ( 1528 1024 -176 ) ( 1528 1024 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1588 1024 -176 ) ( 1524 1024 -176 ) ( 1524 1024 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 1028 -176 ) ( 1524 1020 -176 ) ( 1524 1020 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 1114 +{ +( 1588 1080 -216 ) ( 1524 1080 -216 ) ( 1524 1072 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 1068 -140 ) ( 1524 1076 -140 ) ( 1588 1076 -140 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 1068 -176 ) ( 1588 1068 -176 ) ( 1588 1068 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1528 1064 -176 ) ( 1528 1072 -176 ) ( 1528 1072 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1588 1072 -176 ) ( 1524 1072 -176 ) ( 1524 1072 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1524 1076 -176 ) ( 1524 1068 -176 ) ( 1524 1068 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 1115 +{ +( 1408 1540 -120 ) ( 1408 1568 -120 ) ( 1400 1568 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1408 1568 -104 ) ( 1416 1568 -104 ) ( 1416 1540 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1336 1336 -104 ) ( 1336 1336 -120 ) ( 1336 1360 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1416 1336 -104 ) ( 1416 1336 -120 ) ( 1336 1336 -120 ) subway/1_bathroom_floor 8 -32 0 0.500000 0.500000 0 285212672 0 +( 1416 1336 -120 ) ( 1416 1336 -104 ) ( 1416 1360 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1336 1360 -104 ) ( 1336 1360 -120 ) ( 1360 1360 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1416 1348 -120 ) ( 1412 1336 -120 ) ( 1414 1342 -104 ) subway/1_bathroom_floor 8 -32 0 0.500000 0.500000 0 285212672 0 +( 1416 1340 -120 ) ( 1404 1336 -120 ) ( 1410 1338 -104 ) subway/1_bathroom_floor 8 -32 0 0.500000 0.500000 0 285212672 0 +( 1340 1336 -120 ) ( 1336 1348 -120 ) ( 1338 1342 -104 ) subway/1_bathroom_floor 8 -32 0 0.500000 0.500000 0 285212672 0 +( 1348 1336 -120 ) ( 1336 1340 -120 ) ( 1342 1338 -104 ) subway/1_bathroom_floor 8 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1116 +{ +( 1884 924 -216 ) ( 1820 924 -216 ) ( 1820 916 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 912 -140 ) ( 1820 920 -140 ) ( 1884 920 -140 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 912 -176 ) ( 1884 912 -176 ) ( 1884 912 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1824 908 -176 ) ( 1824 916 -176 ) ( 1824 916 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1884 916 -176 ) ( 1820 916 -176 ) ( 1820 916 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 920 -176 ) ( 1820 912 -176 ) ( 1820 912 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 1117 +{ +( 1884 972 -216 ) ( 1820 972 -216 ) ( 1820 964 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 960 -140 ) ( 1820 968 -140 ) ( 1884 968 -140 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 960 -176 ) ( 1884 960 -176 ) ( 1884 960 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1824 956 -176 ) ( 1824 964 -176 ) ( 1824 964 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1884 964 -176 ) ( 1820 964 -176 ) ( 1820 964 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 968 -176 ) ( 1820 960 -176 ) ( 1820 960 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 1118 +{ +( 1884 1020 -216 ) ( 1820 1020 -216 ) ( 1820 1012 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 1008 -140 ) ( 1820 1016 -140 ) ( 1884 1016 -140 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 1008 -176 ) ( 1884 1008 -176 ) ( 1884 1008 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1824 1004 -176 ) ( 1824 1012 -176 ) ( 1824 1012 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1884 1012 -176 ) ( 1820 1012 -176 ) ( 1820 1012 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 1016 -176 ) ( 1820 1008 -176 ) ( 1820 1008 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 1119 +{ +( 1884 1068 -216 ) ( 1820 1068 -216 ) ( 1820 1060 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 1056 -140 ) ( 1820 1064 -140 ) ( 1884 1064 -140 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 1056 -176 ) ( 1884 1056 -176 ) ( 1884 1056 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1824 1052 -176 ) ( 1824 1060 -176 ) ( 1824 1060 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1884 1060 -176 ) ( 1820 1060 -176 ) ( 1820 1060 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 1064 -176 ) ( 1820 1056 -176 ) ( 1820 1056 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 1120 +{ +( 1884 1116 -216 ) ( 1820 1116 -216 ) ( 1820 1108 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 1104 -140 ) ( 1820 1112 -140 ) ( 1884 1112 -140 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 1104 -176 ) ( 1884 1104 -176 ) ( 1884 1104 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1824 1100 -176 ) ( 1824 1108 -176 ) ( 1824 1108 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1884 1108 -176 ) ( 1820 1108 -176 ) ( 1820 1108 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1820 1112 -176 ) ( 1820 1104 -176 ) ( 1820 1104 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 1121 +{ +( 1580 1316 -216 ) ( 1516 1316 -216 ) ( 1516 1308 -216 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1516 1304 -140 ) ( 1516 1312 -140 ) ( 1580 1312 -140 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1516 1304 -176 ) ( 1580 1304 -176 ) ( 1580 1304 -192 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1520 1300 -176 ) ( 1520 1308 -176 ) ( 1520 1308 -192 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1580 1308 -176 ) ( 1516 1308 -176 ) ( 1516 1308 -192 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1516 1312 -176 ) ( 1516 1304 -176 ) ( 1516 1304 -192 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +} +// brush 1122 +{ +( 1580 1364 -216 ) ( 1516 1364 -216 ) ( 1516 1356 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1516 1352 -140 ) ( 1516 1360 -140 ) ( 1580 1360 -140 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1516 1352 -176 ) ( 1580 1352 -176 ) ( 1580 1352 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1520 1348 -176 ) ( 1520 1356 -176 ) ( 1520 1356 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1580 1356 -176 ) ( 1516 1356 -176 ) ( 1516 1356 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1516 1360 -176 ) ( 1516 1352 -176 ) ( 1516 1352 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 1123 +{ +( 1580 1412 -216 ) ( 1516 1412 -216 ) ( 1516 1404 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1516 1400 -140 ) ( 1516 1408 -140 ) ( 1580 1408 -140 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1516 1400 -176 ) ( 1580 1400 -176 ) ( 1580 1400 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1520 1396 -176 ) ( 1520 1404 -176 ) ( 1520 1404 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1580 1404 -176 ) ( 1516 1404 -176 ) ( 1516 1404 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1516 1408 -176 ) ( 1516 1400 -176 ) ( 1516 1400 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 1124 +{ +( 1580 1460 -216 ) ( 1516 1460 -216 ) ( 1516 1452 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1516 1448 -140 ) ( 1516 1456 -140 ) ( 1580 1456 -140 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1516 1448 -176 ) ( 1580 1448 -176 ) ( 1580 1448 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1520 1444 -176 ) ( 1520 1452 -176 ) ( 1520 1452 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1580 1452 -176 ) ( 1516 1452 -176 ) ( 1516 1452 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1516 1456 -176 ) ( 1516 1448 -176 ) ( 1516 1448 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 1125 +{ +( 648 1032 -52 ) ( 720 1032 -52 ) ( 720 1072 -52 ) subway/light_tube -96 -16 0 0.500000 0.500000 134217728 1 5000 +( 720 1072 -48 ) ( 720 1032 -48 ) ( 648 1032 -48 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 720 1064 -48 ) ( 648 1064 -48 ) ( 648 1064 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 688 1072 -48 ) ( 688 1032 -48 ) ( 688 1032 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 648 1048 -48 ) ( 720 1048 -48 ) ( 720 1048 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 732 1032 -48 ) ( 732 1072 -48 ) ( 732 1072 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1126 +{ +( 1472 3120 -384 ) ( 1200 2984 -384 ) ( 1200 2984 -352 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1472 3128 -360 ) ( 1200 2992 -360 ) ( 1200 2984 -384 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1472 3120 -352 ) ( 1200 2984 -352 ) ( 1200 2992 -360 ) subway/1_tunnelwall 16 -8 -90 0.500000 0.500000 0 301989888 0 +( 1472 3128 -352 ) ( 1472 3152 -384 ) ( 1472 3104 -384 ) subway/1_tunnelwall 16 0 -180 0.500000 -0.500000 0 301989888 0 +( 1296 3024 -352 ) ( 1304 3016 -384 ) ( 1288 3032 -384 ) subway/1_tunnelwall 16 0 -180 0.500000 -0.500000 0 301989888 0 +} +// brush 1127 +{ +( 1472 3120 -352 ) ( 1168 2968 -352 ) ( 1168 3000 -352 ) subway/1_tunnelwall 16 -8 -90 0.500000 0.500000 0 301989888 0 +( 1472 3152 -352 ) ( 1168 3000 -352 ) ( 1168 2976 -360 ) subway/1_tunnelwall 16 78 27 0.500000 0.500000 0 301989888 0 +( 1472 3128 -360 ) ( 1168 2976 -360 ) ( 1168 2968 -352 ) subway/1_tunnelwall 16 -8 -90 0.500000 0.500000 0 301989888 0 +( 1472 3128 -352 ) ( 1472 3152 -360 ) ( 1472 3104 -360 ) subway/1_tunnelwall 16 0 -180 0.500000 -0.500000 0 301989888 0 +( 1280 3040 -352 ) ( 1288 3032 -360 ) ( 1272 3048 -360 ) subway/1_tunnelwall 16 0 -180 0.500000 -0.500000 0 301989888 0 +} +// brush 1128 +{ +( 1472 3236 -254 ) ( 1472 3236 -264 ) ( 1472 3156 -264 ) subway/1_tunneltrack_1 -45 -41 -14 1.000134 -0.999979 0 16777216 0 +( 1472 3212 -352 ) ( 1136 3044 -352 ) ( 1136 2996 -352 ) subway/1_tunnel_ceiling2 323 334 -62 0.900000 1 0 16777216 0 +( 1472 3164 -336 ) ( 1136 2996 -336 ) ( 1136 3044 -336 ) subway/1_tunnel_ceiling2 32 63 -90 0.500000 0.500000 0 16777216 0 +( 1472 3220 -336 ) ( 1136 3052 -336 ) ( 1136 3052 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1136 2876 -312 ) ( 1136 2828 -312 ) ( 1136 2828 -344 ) subway/1_tunnel_ceiling2 32 0 -180 0.500000 -0.500000 0 16777216 0 +( 1472 3156 -344 ) ( 1136 2988 -344 ) ( 1136 2988 -336 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 2160 3076 -344 ) ( 2160 3028 -344 ) ( 2160 3028 -312 ) subway/1_tunnel_ceiling2 32 0 -180 0.500000 -0.500000 0 16777216 0 +( 1256 3064 10 ) ( 1256 3064 0 ) ( 1192 3128 0 ) subway/1_trim1 0 0 -180 0.500000 -0.500000 0 0 0 +} +// brush 1129 +{ +( 1320 3152 -352 ) ( 1352 3152 -352 ) ( 1200 2848 -352 ) subway/1_tunnelwall -16 24 0 0.500000 0.500000 0 301989888 0 +( 1344 3152 -360 ) ( 1320 3152 -352 ) ( 1168 2848 -352 ) subway/1_tunnelwall 8 78 63 0.500000 0.500000 0 301989888 0 +( 1352 3152 -352 ) ( 1344 3152 -360 ) ( 1192 2848 -360 ) subway/1_tunnelwall -16 24 0 0.500000 0.500000 0 301989888 0 +( 1216 2848 -360 ) ( 1168 2848 -360 ) ( 1192 2848 -352 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 1272 3048 -360 ) ( 1288 3032 -360 ) ( 1280 3040 -352 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1130 +{ +( 1336 3120 -352 ) ( 1336 3120 -384 ) ( 1200 2848 -384 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1336 3120 -384 ) ( 1328 3120 -360 ) ( 1192 2848 -360 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1328 3120 -360 ) ( 1336 3120 -352 ) ( 1200 2848 -352 ) subway/1_tunnelwall -16 24 0 0.500000 0.500000 0 301989888 0 +( 1216 2848 -384 ) ( 1168 2848 -384 ) ( 1192 2848 -352 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 1288 3032 -384 ) ( 1304 3016 -384 ) ( 1296 3024 -352 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1131 +{ +( 1472 3256 -352 ) ( 1168 3104 -352 ) ( 1168 3104 -384 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1472 3256 -384 ) ( 1168 3104 -384 ) ( 1168 3096 -360 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1472 3248 -360 ) ( 1168 3096 -360 ) ( 1168 3104 -352 ) subway/1_tunnelwall 32 -8 -90 0.500000 0.500000 0 301989888 0 +( 1472 3272 -384 ) ( 1472 3224 -384 ) ( 1472 3248 -352 ) subway/1_tunnelwall 32 0 -180 0.500000 -0.500000 0 301989888 0 +( 1208 3112 -352 ) ( 1216 3104 -384 ) ( 1200 3120 -384 ) subway/1_tunnelwall 0 0 -180 0.500000 -0.500000 0 301989888 0 +} +// brush 1132 +{ +( 1472 3224 -352 ) ( 1168 3072 -352 ) ( 1168 3104 -352 ) subway/1_tunnelwall 32 -8 -90 0.500000 0.500000 0 301989888 0 +( 1472 3248 -360 ) ( 1168 3096 -360 ) ( 1168 3072 -352 ) subway/1_tunnelwall 7 37 27 0.500000 0.500000 0 301989888 0 +( 1472 3256 -352 ) ( 1168 3104 -352 ) ( 1168 3096 -360 ) subway/1_tunnelwall 32 -8 -90 0.500000 0.500000 0 301989888 0 +( 1472 3272 -360 ) ( 1472 3224 -360 ) ( 1472 3248 -352 ) subway/1_tunnelwall 32 0 -180 0.500000 -0.500000 0 301989888 0 +( 1212 3108 -352 ) ( 1224 3096 -360 ) ( 1200 3120 -360 ) subway/1_tunnelwall 0 0 -180 0.500000 -0.500000 0 301989888 0 +} +// brush 1133 +{ +( 1216 3152 -352 ) ( 1248 3152 -352 ) ( 1096 2848 -352 ) subway/1_tunnelwall 0 24 0 0.500000 0.500000 0 301989888 0 +( 1248 3152 -352 ) ( 1224 3152 -360 ) ( 1072 2848 -360 ) subway/1_tunnelwall 7 37 63 0.500000 0.500000 0 301989888 0 +( 1224 3152 -360 ) ( 1216 3152 -352 ) ( 1064 2848 -352 ) subway/1_tunnelwall 0 24 0 0.500000 0.500000 0 301989888 0 +( 1072 2848 -352 ) ( 1096 2848 -360 ) ( 1048 2848 -360 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 3120 -360 ) ( 1224 3096 -360 ) ( 1212 3108 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1134 +{ +( 1216 3152 -384 ) ( 1216 3152 -352 ) ( 1064 2848 -352 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1224 3152 -360 ) ( 1216 3152 -384 ) ( 1064 2848 -384 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1216 3152 -352 ) ( 1224 3152 -360 ) ( 1072 2848 -360 ) subway/1_tunnelwall 0 24 0 0.500000 0.500000 0 301989888 0 +( 1072 2848 -352 ) ( 1096 2848 -384 ) ( 1048 2848 -384 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 3120 -384 ) ( 1216 3104 -384 ) ( 1208 3112 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1135 +{ +( 1224 2040 -352 ) ( 1192 2040 -352 ) ( 1192 2040 -384 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 1200 992 -352 ) ( 1168 992 -352 ) ( 1168 1008 -352 ) subway/1_tunnelwall -16 56 0 0.500000 0.500000 0 301989888 0 +( 1192 428 -360 ) ( 1192 460 -360 ) ( 1168 460 -352 ) subway/1_tunnelwall -48 -17 90 0.500000 0.500000 0 301989888 0 +( 1192 1040 -360 ) ( 1192 1008 -360 ) ( 1200 1008 -352 ) subway/1_tunnelwall -16 56 0 0.500000 0.500000 0 301989888 0 +( 1216 960 -360 ) ( 1168 960 -360 ) ( 1192 960 -352 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1136 +{ +( 1200 1620 -384 ) ( 1200 1620 -352 ) ( 1200 1636 -352 ) subway/1_tunnelwall -56 0 0 0.500000 0.500000 0 301989888 0 +( 1192 836 -360 ) ( 1192 804 -360 ) ( 1200 804 -384 ) subway/1_tunnelwall -56 0 0 0.500000 0.500000 0 301989888 0 +( 1192 1604 -360 ) ( 1192 1636 -360 ) ( 1200 1636 -352 ) subway/1_tunnelwall -16 56 0 0.500000 0.500000 0 301989888 0 +( 1216 2040 -352 ) ( 1204 2040 -384 ) ( 1228 2040 -384 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 1216 960 -384 ) ( 1168 960 -384 ) ( 1192 960 -352 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1137 +{ +( 1200 2420 -384 ) ( 1200 2420 -352 ) ( 1200 2436 -352 ) subway/1_tunnelwall -8 0 0 0.500000 0.500000 0 301989888 0 +( 1192 1924 -360 ) ( 1192 1892 -360 ) ( 1200 1892 -384 ) subway/1_tunnelwall -8 0 0 0.500000 0.500000 0 301989888 0 +( 1192 2404 -360 ) ( 1192 2436 -360 ) ( 1200 2436 -352 ) subway/1_tunnelwall -16 8 0 0.500000 0.500000 0 301989888 0 +( 1216 2848 -352 ) ( 1204 2848 -384 ) ( 1228 2848 -384 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 1216 2040 -384 ) ( 1168 2040 -384 ) ( 1192 2040 -352 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1138 +{ +( 1224 2848 -352 ) ( 1192 2848 -352 ) ( 1192 2848 -384 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1800 -352 ) ( 1168 1800 -352 ) ( 1168 1816 -352 ) subway/1_tunnelwall -16 8 0 0.500000 0.500000 0 301989888 0 +( 1192 1236 -360 ) ( 1192 1268 -360 ) ( 1168 1268 -352 ) subway/1_tunnelwall -48 -17 90 0.500000 0.500000 0 301989888 0 +( 1192 1840 -360 ) ( 1192 1808 -360 ) ( 1200 1808 -352 ) subway/1_tunnelwall -16 8 0 0.500000 0.500000 0 301989888 0 +( 1216 2040 -360 ) ( 1168 2040 -360 ) ( 1192 2040 -352 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1139 +{ +( 1072 2848 -384 ) ( 1072 2848 -352 ) ( 1040 2848 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1096 1816 -352 ) ( 1096 1800 -352 ) ( 1064 1800 -352 ) subway/1_tunnelwall 0 8 0 0.500000 0.500000 0 301989888 0 +( 1096 1268 -352 ) ( 1072 1268 -360 ) ( 1072 1236 -360 ) subway/1_tunnelwall -1 30 90 0.500000 0.500000 0 301989888 0 +( 1064 1808 -352 ) ( 1072 1808 -360 ) ( 1072 1840 -360 ) subway/1_tunnelwall 0 8 0 0.500000 0.500000 0 301989888 0 +( 1072 2040 -352 ) ( 1096 2040 -360 ) ( 1048 2040 -360 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1140 +{ +( 1064 2436 -352 ) ( 1064 2420 -352 ) ( 1064 2420 -384 ) subway/1_tunnelwall -8 0 0 0.500000 0.500000 0 301989888 0 +( 1064 1892 -384 ) ( 1072 1892 -360 ) ( 1072 1924 -360 ) subway/1_tunnelwall -8 0 0 0.500000 0.500000 0 301989888 0 +( 1064 2436 -352 ) ( 1072 2436 -360 ) ( 1072 2404 -360 ) subway/1_tunnelwall 0 8 0 0.500000 0.500000 0 301989888 0 +( 1036 2848 -384 ) ( 1060 2848 -384 ) ( 1048 2848 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1072 2040 -352 ) ( 1096 2040 -384 ) ( 1048 2040 -384 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1141 +{ +( 1064 1568 -352 ) ( 1064 1552 -352 ) ( 1064 1552 -384 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 1064 1084 -384 ) ( 1072 1084 -360 ) ( 1072 1116 -360 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 1064 1568 -352 ) ( 1072 1568 -360 ) ( 1072 1536 -360 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1036 2040 -384 ) ( 1060 2040 -384 ) ( 1048 2040 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1072 1180 -352 ) ( 1096 1180 -384 ) ( 1048 1180 -384 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1142 +{ +( 1072 2040 -384 ) ( 1072 2040 -352 ) ( 1040 2040 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1096 956 -352 ) ( 1096 940 -352 ) ( 1064 940 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1096 408 -352 ) ( 1072 408 -360 ) ( 1072 376 -360 ) subway/1_tunnelwall 39 33 90 0.500000 0.500000 0 301989888 0 +( 1064 940 -352 ) ( 1072 940 -360 ) ( 1072 972 -360 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1072 1180 -352 ) ( 1096 1180 -360 ) ( 1048 1180 -360 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1143 +{ +( 1072 1180 -384 ) ( 1072 1180 -352 ) ( 1040 1180 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1096 96 -352 ) ( 1096 80 -352 ) ( 1064 80 -352 ) subway/1_tunnelwall 0 24 0 0.500000 0.500000 0 301989888 0 +( 1096 -452 -352 ) ( 1072 -452 -360 ) ( 1072 -484 -360 ) subway/1_tunnelwall 39 33 90 0.500000 0.500000 0 301989888 0 +( 1064 80 -352 ) ( 1072 80 -360 ) ( 1072 112 -360 ) subway/1_tunnelwall 0 24 0 0.500000 0.500000 0 301989888 0 +( 1072 320 -352 ) ( 1096 320 -360 ) ( 1048 320 -360 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1144 +{ +( 1064 708 -352 ) ( 1064 692 -352 ) ( 1064 692 -384 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1064 224 -384 ) ( 1072 224 -360 ) ( 1072 256 -360 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1064 708 -352 ) ( 1072 708 -360 ) ( 1072 676 -360 ) subway/1_tunnelwall 0 24 0 0.500000 0.500000 0 301989888 0 +( 1036 1180 -384 ) ( 1060 1180 -384 ) ( 1048 1180 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1072 320 -352 ) ( 1096 320 -384 ) ( 1048 320 -384 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1145 +{ +( 1064 -152 -352 ) ( 1064 -168 -352 ) ( 1064 -168 -384 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1064 -232 -384 ) ( 1072 -232 -360 ) ( 1072 -200 -360 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1064 -152 -352 ) ( 1072 -152 -360 ) ( 1072 -184 -360 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1036 320 -384 ) ( 1060 320 -384 ) ( 1048 320 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1072 -136 -352 ) ( 1096 -136 -384 ) ( 1048 -136 -384 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1146 +{ +( 1072 320 -384 ) ( 1072 320 -352 ) ( 1040 320 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1096 -764 -352 ) ( 1096 -780 -352 ) ( 1064 -780 -352 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1096 -1312 -352 ) ( 1072 -1312 -360 ) ( 1072 -1344 -360 ) subway/1_tunnelwall 39 33 90 0.500000 0.500000 0 301989888 0 +( 1064 -780 -352 ) ( 1072 -780 -360 ) ( 1072 -748 -360 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1072 -136 -352 ) ( 1096 -136 -360 ) ( 1048 -136 -360 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1147 +{ +( 1224 960 -352 ) ( 1192 960 -352 ) ( 1192 960 -384 ) subway/1_tunnelwall -48 0 0 0.500000 0.500000 0 301989888 0 +( 1200 -780 -352 ) ( 1168 -780 -352 ) ( 1168 -764 -352 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +( 1192 -1344 -360 ) ( 1192 -1312 -360 ) ( 1168 -1312 -352 ) subway/1_tunnelwall -48 -17 90 0.500000 0.500000 0 301989888 0 +( 1192 -748 -360 ) ( 1192 -780 -360 ) ( 1200 -780 -352 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +( 1216 -136 -360 ) ( 1168 -136 -360 ) ( 1192 -136 -352 ) subway/1_tunnelwall -48 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1148 +{ +( 1200 -168 -384 ) ( 1200 -168 -352 ) ( 1200 -152 -352 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1192 440 -360 ) ( 1192 408 -360 ) ( 1200 408 -384 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1192 -184 -360 ) ( 1192 -152 -360 ) ( 1200 -152 -352 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +( 1216 960 -352 ) ( 1204 960 -384 ) ( 1228 960 -384 ) subway/1_tunnelwall -48 0 0 0.500000 0.500000 0 301989888 0 +( 1216 -136 -384 ) ( 1168 -136 -384 ) ( 1192 -136 -352 ) subway/1_tunnelwall -48 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1149 +{ +( 1051 169 -352 ) ( 1051 169 -384 ) ( 919 81 -384 ) subway/1_tunnelwall 14 0 -180 0.500000 -0.500000 0 301989888 0 +( 1047 165 -384 ) ( 1047 173 -360 ) ( 915 85 -360 ) subway/1_tunnelwall 14 0 -180 0.500000 -0.500000 0 301989888 0 +( 1051 177 -360 ) ( 1051 169 -352 ) ( 919 81 -352 ) subway/1_tunnelwall 7 -13 90 0.500000 0.500000 0 301989888 0 +( 1047 165 -352 ) ( 1047 177 -384 ) ( 1047 153 -384 ) subway/1_tunnelwall 6 0 0 0.500000 0.500000 0 301989888 0 +( 919 65 -384 ) ( 919 113 -384 ) ( 919 89 -352 ) subway/1_tunnelwall 6 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1150 +{ +( 1047 157 -352 ) ( 1047 189 -352 ) ( 1047 189 -384 ) subway/1_tunnelwall 6 0 0 0.500000 0.500000 0 301989888 0 +( 1051 201 -352 ) ( 1051 169 -352 ) ( 919 81 -352 ) subway/1_tunnelwall 7 -13 90 0.500000 0.500000 0 301989888 0 +( 1051 177 -360 ) ( 1051 201 -352 ) ( 919 113 -352 ) subway/1_tunnelwall 21 21 -180 0.500000 0.500000 0 301989888 0 +( 1051 169 -352 ) ( 1051 177 -360 ) ( 919 89 -360 ) subway/1_tunnelwall 7 -13 90 0.500000 0.500000 0 301989888 0 +( 919 65 -360 ) ( 919 113 -360 ) ( 919 89 -352 ) subway/1_tunnelwall 6 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1151 +{ +( 824 -56 -384 ) ( 824 -56 -352 ) ( 824 -40 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 816 376 -360 ) ( 816 344 -360 ) ( 824 344 -384 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 816 -72 -360 ) ( 816 -40 -360 ) ( 824 -40 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 840 896 -352 ) ( 828 896 -384 ) ( 852 896 -384 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 840 -24 -384 ) ( 792 -24 -384 ) ( 816 -24 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1152 +{ +( 848 896 -352 ) ( 816 896 -352 ) ( 816 896 -384 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 -668 -352 ) ( 792 -668 -352 ) ( 792 -652 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 816 -1232 -360 ) ( 816 -1200 -360 ) ( 792 -1200 -352 ) subway/1_tunnelwall 7 16 90 0.500000 0.500000 0 301989888 0 +( 816 -636 -360 ) ( 816 -668 -360 ) ( 824 -668 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 840 -24 -360 ) ( 792 -24 -360 ) ( 816 -24 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1153 +{ +( 832 -24 -352 ) ( 800 -24 -352 ) ( 800 -24 -384 ) subway/1_tunnelwall -48 0 0 1 1 0 301989888 0 +( 824 -700 -352 ) ( 792 -700 -352 ) ( 792 -684 -352 ) subway/1_tunnelwall -48 4 0 1 1 0 301989888 0 +( 816 -1264 -360 ) ( 816 -1232 -360 ) ( 792 -1232 -352 ) subway/metal1 16 0 90 0.500000 0.500000 0 16777216 0 +( 816 -668 -360 ) ( 816 -700 -360 ) ( 824 -700 -352 ) subway/1_tunnelwall -48 4 0 1 1 0 301989888 0 +( 840 -56 -360 ) ( 792 -56 -360 ) ( 816 -56 -352 ) subway/1_tunnelwall -48 4 0 1 1 0 301989888 0 +} +// brush 1154 +{ +( 824 -700 -352 ) ( 792 -700 -352 ) ( 792 -684 -352 ) subway/1_tunnelwall -48 4 0 1 1 0 301989888 0 +( 816 -1264 -360 ) ( 816 -1232 -360 ) ( 792 -1232 -352 ) subway/1_tunnelwall 7 16 90 0.500000 0.500000 0 301989888 0 +( 816 -668 -360 ) ( 816 -700 -360 ) ( 824 -700 -352 ) subway/1_tunnelwall -48 4 0 1 1 0 301989888 0 +( 840 -912 -360 ) ( 784 -912 -360 ) ( 812 -912 -352 ) subway/1_tunnelwall -48 4 0 1 1 0 301989888 0 +( 792 -56 -360 ) ( 840 -56 -360 ) ( 816 -56 -352 ) subway/1_tunnelwall -48 4 0 1 1 0 301989888 0 +} +// brush 1155 +{ +( 824 -88 -384 ) ( 824 -88 -352 ) ( 824 -72 -352 ) subway/1_tunnelwall 40 0 0 1 1 0 301989888 0 +( 816 -472 -360 ) ( 816 -504 -360 ) ( 824 -504 -384 ) subway/metal1 16 0 0 0.500000 0.500000 0 16777216 0 +( 816 -104 -360 ) ( 816 -72 -360 ) ( 824 -72 -352 ) subway/1_tunnelwall -48 -40 0 1 1 0 301989888 0 +( 824 -24 -352 ) ( 812 -24 -384 ) ( 836 -24 -384 ) subway/1_tunnelwall -48 -24 0 1 1 0 301989888 0 +( 840 -56 -384 ) ( 792 -56 -384 ) ( 816 -56 -352 ) subway/1_tunnelwall -48 -24 0 1 1 0 301989888 0 +} +// brush 1156 +{ +( 824 -88 -384 ) ( 824 -88 -352 ) ( 824 -72 -352 ) subway/1_tunnelwall 40 0 0 1 1 0 301989888 0 +( 816 -472 -360 ) ( 816 -504 -360 ) ( 824 -504 -384 ) subway/1_tunnelwall 24 0 0 0.500000 0.500000 0 301989888 0 +( 816 -104 -360 ) ( 816 -72 -360 ) ( 824 -72 -352 ) subway/1_tunnelwall -48 -40 0 1 1 0 301989888 0 +( 840 -912 -384 ) ( 784 -912 -384 ) ( 812 -912 -352 ) subway/1_tunnelwall -48 -24 0 1 1 0 301989888 0 +( 792 -56 -384 ) ( 840 -56 -384 ) ( 816 -56 -352 ) subway/1_tunnelwall -48 -24 0 1 1 0 301989888 0 +} +// brush 1157 +{ +( 792 -1264 -384 ) ( 792 -1264 -352 ) ( 824 -1264 -352 ) subway/1_tunnelwall -48 0 0 1 1 0 301989888 0 +( 824 -88 -384 ) ( 824 -88 -352 ) ( 824 -72 -352 ) subway/1_tunnelwall 40 0 0 1 1 0 301989888 0 +( 816 -1144 -360 ) ( 816 -1176 -360 ) ( 824 -1176 -384 ) subway/1_tunnelwall 24 0 0 0.500000 0.500000 0 301989888 0 +( 816 -104 -360 ) ( 816 -72 -360 ) ( 824 -72 -352 ) subway/1_tunnelwall -48 -40 0 1 1 0 301989888 0 +( 784 -944 -384 ) ( 840 -944 -384 ) ( 812 -944 -352 ) subway/1_tunnelwall -48 -24 0 1 1 0 301989888 0 +} +// brush 1158 +{ +( 792 -1264 -384 ) ( 792 -1264 -352 ) ( 824 -1264 -352 ) subway/1_tunnelwall -48 0 0 1 1 0 301989888 0 +( 824 -700 -352 ) ( 792 -700 -352 ) ( 792 -684 -352 ) subway/1_tunnelwall -48 4 0 1 1 0 301989888 0 +( 816 -1264 -360 ) ( 816 -1232 -360 ) ( 792 -1232 -352 ) subway/1_tunnelwall 7 16 90 0.500000 0.500000 0 301989888 0 +( 816 -668 -360 ) ( 816 -700 -360 ) ( 824 -700 -352 ) subway/1_tunnelwall -48 4 0 1 1 0 301989888 0 +( 784 -944 -360 ) ( 840 -944 -360 ) ( 812 -944 -352 ) subway/1_tunnelwall -48 4 0 1 1 0 301989888 0 +} +// brush 1159 +{ +( 840 -944 -536 ) ( 840 -920 -536 ) ( 816 -920 -536 ) subway/metalrib1 0 16 0 0.500000 0.500000 0 16777216 0 +( 808 -920 -352 ) ( 832 -920 -352 ) ( 832 -944 -352 ) subway/metalrib1 0 16 0 0.500000 0.500000 0 16777216 0 +( 808 -944 -480 ) ( 808 -944 -448 ) ( 832 -944 -448 ) subway/metal2 -32 0 0 0.500000 0.500000 0 16777216 0 +( 824 -904 -480 ) ( 824 -904 -448 ) ( 824 -928 -448 ) subway/metal1 -32 0 0 0.500000 0.500000 0 16777216 0 +( 832 -912 -584 ) ( 832 -912 -552 ) ( 808 -912 -552 ) subway/metal2 -32 0 0 0.500000 0.500000 0 16777216 0 +( 832 -944 -480 ) ( 832 -944 -448 ) ( 832 -920 -448 ) subway/metalrib1 -16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1160 +{ +( 824 -72 -384 ) ( 824 -72 -352 ) ( 824 -56 -352 ) subway/1_tunnelwall 40 0 0 1 1 0 301989888 0 +( 816 -1096 -360 ) ( 816 -1128 -360 ) ( 824 -1128 -384 ) subway/metal1 -32 0 0 0.500000 0.500000 0 16777216 0 +( 816 -104 -360 ) ( 816 -72 -360 ) ( 824 -72 -352 ) subway/1_tunnelwall 0 -40 0 1 1 0 301989888 0 +( 820 -912 -352 ) ( 800 -912 -384 ) ( 840 -912 -384 ) subway/1_tunnelwall 0 -24 0 1 1 0 301989888 0 +( 800 -944 -352 ) ( 832 -944 -384 ) ( 768 -944 -384 ) subway/1_tunnelwall 0 -24 0 1 1 0 301989888 0 +} +// brush 1161 +{ +( 824 -700 -352 ) ( 792 -700 -352 ) ( 792 -684 -352 ) subway/1_tunnelwall 0 4 0 1 1 0 301989888 0 +( 816 -1264 -360 ) ( 816 -1232 -360 ) ( 792 -1232 -352 ) subway/metal1 -31 16 90 0.500000 0.500000 0 16777216 0 +( 816 -668 -360 ) ( 816 -700 -360 ) ( 824 -700 -352 ) subway/1_tunnelwall 0 4 0 1 1 0 301989888 0 +( 796 -912 -352 ) ( 760 -912 -360 ) ( 832 -912 -360 ) subway/1_tunnelwall 0 -60 0 1 1 0 301989888 0 +( 800 -944 -352 ) ( 832 -944 -360 ) ( 768 -944 -360 ) subway/1_tunnelwall 0 -60 0 1 1 0 301989888 0 +} +// brush 1162 +{ +( 696 -400 -352 ) ( 696 -1384 -352 ) ( 728 -1384 -352 ) subway/metal1 -32 0 90 0.500000 0.500000 0 16777216 0 +( 728 -600 -336 ) ( 728 -1272 -336 ) ( 696 -1272 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 688 -1384 -352 ) ( 688 -400 -352 ) ( 688 -400 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 720 -912 -352 ) ( 720 -912 -344 ) ( 688 -912 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 724 -1280 -336 ) ( 724 -608 -336 ) ( 724 -608 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 712 -944 -352 ) ( 680 -944 -352 ) ( 696 -944 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1163 +{ +( 696 -400 -352 ) ( 696 -1384 -352 ) ( 728 -1384 -352 ) subway/1_tunnelwall 7 16 90 0.500000 0.500000 0 301989888 0 +( 728 -600 -336 ) ( 728 -1272 -336 ) ( 696 -1272 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 688 -1384 -352 ) ( 688 -400 -352 ) ( 688 -400 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 724 -1280 -336 ) ( 724 -608 -336 ) ( 724 -608 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 736 -1264 -344 ) ( 736 -1264 -352 ) ( 704 -1264 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 680 -944 -352 ) ( 712 -944 -352 ) ( 696 -944 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1164 +{ +( 720 -684 -352 ) ( 720 -700 -352 ) ( 688 -700 -352 ) subway/1_tunnelwall 56 -60 0 1 1 0 301989888 0 +( 720 -1232 -352 ) ( 696 -1232 -360 ) ( 696 -1264 -360 ) subway/metal1 -32 0 90 0.500000 0.500000 0 16777216 0 +( 688 -700 -352 ) ( 696 -700 -360 ) ( 696 -668 -360 ) subway/1_tunnelwall 56 -60 0 1 1 0 301989888 0 +( 680 -912 -360 ) ( 752 -912 -360 ) ( 716 -912 -352 ) subway/1_tunnelwall 56 -60 0 1 1 0 301989888 0 +( 744 -944 -360 ) ( 680 -944 -360 ) ( 712 -944 -352 ) subway/1_tunnelwall 56 -60 0 1 1 0 301989888 0 +} +// brush 1165 +{ +( 688 -1264 -352 ) ( 720 -1264 -352 ) ( 720 -1264 -384 ) subway/1_tunnelwall 56 0 0 1 1 0 301989888 0 +( 720 -684 -352 ) ( 720 -700 -352 ) ( 688 -700 -352 ) subway/1_tunnelwall 56 -60 0 1 1 0 301989888 0 +( 720 -1232 -352 ) ( 696 -1232 -360 ) ( 696 -1264 -360 ) subway/1_tunnelwall 7 32 90 0.500000 0.500000 0 301989888 0 +( 688 -700 -352 ) ( 696 -700 -360 ) ( 696 -668 -360 ) subway/1_tunnelwall 56 -60 0 1 1 0 301989888 0 +( 680 -944 -360 ) ( 744 -944 -360 ) ( 712 -944 -352 ) subway/1_tunnelwall 56 -60 0 1 1 0 301989888 0 +} +// brush 1166 +{ +( 688 -56 -352 ) ( 688 -72 -352 ) ( 688 -72 -384 ) subway/1_tunnelwall 40 0 0 1 1 0 301989888 0 +( 688 -1128 -384 ) ( 696 -1128 -360 ) ( 696 -1096 -360 ) subway/metal1 -32 0 0 0.500000 0.500000 0 16777216 0 +( 688 -72 -352 ) ( 696 -72 -360 ) ( 696 -104 -360 ) subway/1_tunnelwall 56 -40 0 1 1 0 301989888 0 +( 672 -912 -384 ) ( 712 -912 -384 ) ( 692 -912 -352 ) subway/1_tunnelwall 56 -24 0 1 1 0 301989888 0 +( 744 -944 -384 ) ( 680 -944 -384 ) ( 712 -944 -352 ) subway/1_tunnelwall 56 -24 0 1 1 0 301989888 0 +} +// brush 1167 +{ +( 688 -1264 -352 ) ( 720 -1264 -352 ) ( 720 -1264 -384 ) subway/1_tunnelwall 56 0 0 1 1 0 301989888 0 +( 688 -56 -352 ) ( 688 -72 -352 ) ( 688 -72 -384 ) subway/1_tunnelwall 40 0 0 1 1 0 301989888 0 +( 688 -1128 -384 ) ( 696 -1128 -360 ) ( 696 -1096 -360 ) subway/1_tunnelwall 24 0 0 0.500000 0.500000 0 301989888 0 +( 688 -72 -352 ) ( 696 -72 -360 ) ( 696 -104 -360 ) subway/1_tunnelwall 56 -40 0 1 1 0 301989888 0 +( 680 -944 -384 ) ( 744 -944 -384 ) ( 712 -944 -352 ) subway/1_tunnelwall 56 -24 0 1 1 0 301989888 0 +} +// brush 1168 +{ +( 720 -760 -384 ) ( 720 -760 -352 ) ( 688 -760 -352 ) subway/1_tunnelwall 56 0 0 1 1 0 301989888 0 +( 720 -684 -352 ) ( 720 -700 -352 ) ( 688 -700 -352 ) subway/1_tunnelwall 56 -60 0 1 1 0 301989888 0 +( 720 -1232 -352 ) ( 696 -1232 -360 ) ( 696 -1264 -360 ) subway/1_tunnelwall 7 32 90 0.500000 0.500000 0 301989888 0 +( 688 -700 -352 ) ( 696 -700 -360 ) ( 696 -668 -360 ) subway/1_tunnelwall 56 -60 0 1 1 0 301989888 0 +( 752 -912 -360 ) ( 680 -912 -360 ) ( 716 -912 -352 ) subway/1_tunnelwall 56 -60 0 1 1 0 301989888 0 +} +// brush 1169 +{ +( 688 -72 -352 ) ( 688 -88 -352 ) ( 688 -88 -384 ) subway/1_tunnelwall 40 0 0 1 1 0 301989888 0 +( 688 -1104 -384 ) ( 696 -1104 -360 ) ( 696 -1072 -360 ) subway/1_tunnelwall 24 0 0 0.500000 0.500000 0 301989888 0 +( 688 -72 -352 ) ( 696 -72 -360 ) ( 696 -104 -360 ) subway/1_tunnelwall 56 -40 0 1 1 0 301989888 0 +( 684 -760 -384 ) ( 708 -760 -384 ) ( 696 -760 -352 ) subway/1_tunnelwall 56 -24 0 1 1 0 301989888 0 +( 712 -912 -384 ) ( 672 -912 -384 ) ( 692 -912 -352 ) subway/1_tunnelwall 56 -24 0 1 1 0 301989888 0 +} +// brush 1170 +{ +( 1000 -728 -448 ) ( 880 -728 -448 ) ( 880 -752 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 888 -776 -352 ) ( 888 -752 -352 ) ( 1008 -752 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 688 -712 -432 ) ( 688 -688 -432 ) ( 688 -688 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1016 -760 -384 ) ( 896 -760 -384 ) ( 896 -760 -392 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 680 -896 -344 ) ( 680 -920 -344 ) ( 680 -920 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 712 -912 -448 ) ( 672 -912 -448 ) ( 692 -912 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 1171 +{ +( 1000 -728 -448 ) ( 880 -728 -448 ) ( 880 -752 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 888 -776 -352 ) ( 888 -752 -352 ) ( 1008 -752 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 832 -1264 -464 ) ( 952 -1264 -464 ) ( 952 -1264 -472 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 688 -696 -432 ) ( 688 -672 -432 ) ( 688 -672 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 680 -896 -344 ) ( 680 -920 -344 ) ( 680 -920 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 672 -944 -448 ) ( 712 -944 -448 ) ( 692 -944 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 1172 +{ +( 680 -904 -392 ) ( 680 -928 -392 ) ( 680 -928 -400 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1024 -760 -424 ) ( 904 -760 -424 ) ( 904 -760 -432 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 688 -704 -480 ) ( 688 -680 -480 ) ( 688 -680 -488 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 880 -776 -448 ) ( 880 -752 -448 ) ( 1000 -752 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 992 -736 -480 ) ( 872 -736 -480 ) ( 872 -760 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 712 -912 -480 ) ( 672 -912 -480 ) ( 692 -912 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 1173 +{ +( 680 -896 -392 ) ( 680 -920 -392 ) ( 680 -920 -400 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 688 -688 -480 ) ( 688 -664 -480 ) ( 688 -664 -488 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 816 -1264 -512 ) ( 936 -1264 -512 ) ( 936 -1264 -520 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 880 -776 -448 ) ( 880 -752 -448 ) ( 1000 -752 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 992 -736 -480 ) ( 872 -736 -480 ) ( 872 -760 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 672 -944 -480 ) ( 712 -944 -480 ) ( 692 -944 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 1174 +{ +( 992 -736 -520 ) ( 872 -736 -520 ) ( 872 -760 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 880 -776 -496 ) ( 880 -752 -496 ) ( 1000 -752 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 688 -608 -504 ) ( 688 -584 -504 ) ( 688 -584 -512 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( 1024 -752 -464 ) ( 904 -752 -464 ) ( 904 -752 -472 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 680 -888 -432 ) ( 680 -912 -432 ) ( 680 -912 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 712 -912 -520 ) ( 672 -912 -520 ) ( 692 -912 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1175 +{ +( 992 -736 -520 ) ( 872 -736 -520 ) ( 872 -760 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 880 -776 -496 ) ( 880 -752 -496 ) ( 1000 -752 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 -1264 -552 ) ( 944 -1264 -552 ) ( 944 -1264 -560 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 688 -608 -504 ) ( 688 -584 -504 ) ( 688 -584 -512 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( 680 -872 -432 ) ( 680 -896 -432 ) ( 680 -896 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 672 -944 -520 ) ( 712 -944 -520 ) ( 692 -944 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1176 +{ +( 680 -880 -448 ) ( 680 -904 -448 ) ( 680 -904 -456 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 688 -416 -520 ) ( 688 -392 -520 ) ( 688 -392 -528 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 880 -776 -520 ) ( 880 -752 -520 ) ( 1000 -752 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 992 -736 -536 ) ( 872 -736 -536 ) ( 872 -760 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 688 -744 -488 ) ( 688 -744 -536 ) ( 704 -744 -488 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 712 -912 -536 ) ( 672 -912 -536 ) ( 692 -912 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1177 +{ +( 680 -864 -448 ) ( 680 -888 -448 ) ( 680 -888 -456 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 688 -416 -520 ) ( 688 -392 -520 ) ( 688 -392 -528 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 824 -1264 -568 ) ( 944 -1264 -568 ) ( 944 -1264 -576 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 880 -776 -520 ) ( 880 -752 -520 ) ( 1000 -752 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 992 -736 -536 ) ( 872 -736 -536 ) ( 872 -760 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 672 -944 -536 ) ( 712 -944 -536 ) ( 692 -944 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1178 +{ +( 680 -1176 -408 ) ( 680 -1200 -408 ) ( 680 -1200 -416 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1016 -944 -440 ) ( 896 -944 -440 ) ( 896 -944 -448 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 688 -1176 -496 ) ( 688 -1152 -496 ) ( 688 -1152 -504 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 880 -1320 -480 ) ( 880 -1296 -480 ) ( 1000 -1296 -480 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 992 -1280 -496 ) ( 872 -1280 -496 ) ( 872 -1304 -496 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 712 -960 -496 ) ( 672 -960 -496 ) ( 692 -960 -480 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1179 +{ +( 680 -1176 -408 ) ( 680 -1200 -408 ) ( 680 -1200 -416 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 688 -1176 -496 ) ( 688 -1152 -496 ) ( 688 -1152 -504 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 816 -1264 -528 ) ( 936 -1264 -528 ) ( 936 -1264 -536 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 880 -1320 -480 ) ( 880 -1296 -480 ) ( 1000 -1296 -480 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 992 -1280 -496 ) ( 872 -1280 -496 ) ( 872 -1304 -496 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 672 -960 -496 ) ( 712 -960 -496 ) ( 692 -960 -480 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1180 +{ +( 688 472 -352 ) ( 720 472 -352 ) ( 720 472 -384 ) subway/1_tunnelwall 56 0 0 1 1 0 301989888 0 +( 688 1776 -352 ) ( 688 1760 -352 ) ( 688 1760 -384 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 688 384 -384 ) ( 696 384 -360 ) ( 696 416 -360 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 688 1776 -352 ) ( 696 1776 -360 ) ( 696 1744 -360 ) subway/1_tunnelwall 56 32 0 1 1 0 301989888 0 +( 684 896 -384 ) ( 708 896 -384 ) ( 696 896 -352 ) subway/1_tunnelwall 56 -24 0 1 1 0 301989888 0 +} +// brush 1181 +{ +( 688 472 -352 ) ( 720 472 -352 ) ( 720 472 -384 ) subway/1_tunnelwall 56 0 0 1 1 0 301989888 0 +( 720 896 -384 ) ( 720 896 -352 ) ( 688 896 -352 ) subway/1_tunnelwall 56 0 0 1 1 0 301989888 0 +( 720 1052 -352 ) ( 720 1036 -352 ) ( 688 1036 -352 ) subway/1_tunnelwall 56 12 0 1 1 0 301989888 0 +( 720 504 -352 ) ( 696 504 -360 ) ( 696 472 -360 ) subway/1_tunnelwall 7 32 90 0.500000 0.500000 0 301989888 0 +( 688 1148 -352 ) ( 696 1148 -360 ) ( 696 1180 -360 ) subway/1_tunnelwall 56 12 0 1 1 0 301989888 0 +} +// brush 1182 +{ +( 688 -144 -352 ) ( 720 -144 -352 ) ( 720 -144 -384 ) subway/1_tunnelwall 56 0 0 1 1 0 301989888 0 +( 720 472 -384 ) ( 720 472 -352 ) ( 688 472 -352 ) subway/1_tunnelwall 56 0 0 1 1 0 301989888 0 +( 720 436 -352 ) ( 720 420 -352 ) ( 688 420 -352 ) subway/1_tunnelwall 56 36 0 1 1 0 301989888 0 +( 720 -112 -352 ) ( 696 -112 -360 ) ( 696 -144 -360 ) subway/1_tunnelwall 7 32 90 0.500000 0.500000 0 301989888 0 +( 688 532 -352 ) ( 696 532 -360 ) ( 696 564 -360 ) subway/1_tunnelwall 56 36 0 1 1 0 301989888 0 +} +// brush 1183 +{ +( 688 -144 -352 ) ( 720 -144 -352 ) ( 720 -144 -384 ) subway/1_tunnelwall 56 0 0 1 1 0 301989888 0 +( 688 1160 -352 ) ( 688 1144 -352 ) ( 688 1144 -384 ) subway/1_tunnelwall -56 0 0 1 1 0 301989888 0 +( 688 -40 -384 ) ( 696 -40 -360 ) ( 696 -8 -360 ) subway/1_tunnelwall -40 0 0 0.500000 0.500000 0 301989888 0 +( 688 1160 -352 ) ( 696 1160 -360 ) ( 696 1128 -360 ) subway/1_tunnelwall 56 56 0 1 1 0 301989888 0 +( 684 472 -384 ) ( 708 472 -384 ) ( 696 472 -352 ) subway/1_tunnelwall 56 -24 0 1 1 0 301989888 0 +} +// brush 1184 +{ +( 688 -760 -352 ) ( 720 -760 -352 ) ( 720 -760 -384 ) subway/1_tunnelwall -8 0 0 1 1 0 301989888 0 +( 688 544 -352 ) ( 688 528 -352 ) ( 688 528 -384 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 688 -656 -384 ) ( 696 -656 -360 ) ( 696 -624 -360 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 688 544 -352 ) ( 696 544 -360 ) ( 696 512 -360 ) subway/1_tunnelwall -8 16 0 1 1 0 301989888 0 +( 684 -144 -384 ) ( 708 -144 -384 ) ( 696 -144 -352 ) subway/1_tunnelwall -8 -24 0 1 1 0 301989888 0 +} +// brush 1185 +{ +( 688 -760 -352 ) ( 720 -760 -352 ) ( 720 -760 -384 ) subway/1_tunnelwall -8 0 0 1 1 0 301989888 0 +( 720 -144 -384 ) ( 720 -144 -352 ) ( 688 -144 -352 ) subway/1_tunnelwall -8 0 0 1 1 0 301989888 0 +( 720 -180 -352 ) ( 720 -196 -352 ) ( 688 -196 -352 ) subway/1_tunnelwall -8 60 0 1 1 0 301989888 0 +( 720 -728 -352 ) ( 696 -728 -360 ) ( 696 -760 -360 ) subway/1_tunnelwall 7 32 90 0.500000 0.500000 0 301989888 0 +( 688 -84 -352 ) ( 696 -84 -360 ) ( 696 -52 -360 ) subway/1_tunnelwall -8 60 0 1 1 0 301989888 0 +} +// brush 1186 +{ +( 1472 3120 -496 ) ( 1152 2960 -496 ) ( 1152 2952 -496 ) subway/metal2 48 0 -90 0.500000 0.500000 0 16777216 0 +( 1472 3112 -480 ) ( 1152 2952 -480 ) ( 1152 2960 -480 ) subway/metal2 48 0 -90 0.500000 0.500000 0 16777216 0 +( 1472 3120 -480 ) ( 1152 2960 -480 ) ( 1152 2960 -496 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 1472 3120 -496 ) ( 1472 3112 -496 ) ( 1472 3112 -480 ) subway/metalrib1 0 0 90 0.500000 -0.500000 0 16777216 0 +( 1472 3112 -496 ) ( 1152 2952 -496 ) ( 1152 2952 -480 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1296 3024 -480 ) ( 1304 3016 -496 ) ( 1288 3032 -496 ) subway/1_tunnelwall 16 0 -180 1 -1 0 301989888 0 +} +// brush 1187 +{ +( 1368 3168 -496 ) ( 1360 3168 -496 ) ( 1200 2848 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 1360 3168 -480 ) ( 1368 3168 -480 ) ( 1208 2848 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 1360 3168 -496 ) ( 1360 3168 -480 ) ( 1200 2848 -480 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 1208 2848 -480 ) ( 1208 2848 -496 ) ( 1200 2848 -496 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1368 3168 -480 ) ( 1368 3168 -496 ) ( 1208 2848 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1288 3032 -496 ) ( 1304 3016 -496 ) ( 1296 3024 -480 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +} +// brush 1188 +{ +( 1152 3104 -480 ) ( 1152 3096 -480 ) ( 1152 3096 -496 ) subway/1_tunnelwall 48 0 -180 0.500000 -0.500000 0 301989888 0 +( 1464 3264 -480 ) ( 1144 3104 -480 ) ( 1144 3104 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1472 3264 -496 ) ( 1472 3256 -496 ) ( 1472 3256 -480 ) subway/metalrib1 0 0 90 0.500000 -0.500000 0 16777216 0 +( 1472 3256 -496 ) ( 1152 3096 -496 ) ( 1152 3096 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1472 3256 -480 ) ( 1152 3096 -480 ) ( 1152 3104 -480 ) subway/metal2 48 0 -90 0.500000 0.500000 0 16777216 0 +( 1472 3264 -496 ) ( 1152 3104 -496 ) ( 1152 3096 -496 ) subway/metal2 48 0 -90 0.500000 0.500000 0 16777216 0 +( 1304 3016 10 ) ( 1304 3016 0 ) ( 1264 3056 0 ) subway/1_tunnelwall 32 0 -180 1 -1 0 301989888 0 +} +// brush 1189 +{ +( 978 590 -496 ) ( 970 590 -496 ) ( 884 460 -496 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1054 724 -472 ) ( 1054 724 -480 ) ( 1062 724 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 964 594 -480 ) ( 964 594 -472 ) ( 878 464 -472 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 974 590 -468 ) ( 974 590 -476 ) ( 884 456 -476 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 884 444 0 ) ( 884 480 0 ) ( 884 480 10 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 904 456 -480 ) ( 880 456 -480 ) ( 892 724 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +} +// brush 1190 +{ +( 968 590 -448 ) ( 976 590 -448 ) ( 886 456 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1054 724 -472 ) ( 1054 724 -480 ) ( 1062 724 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 964 594 -480 ) ( 964 594 -472 ) ( 878 464 -472 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 974 590 -468 ) ( 974 590 -476 ) ( 884 456 -476 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 884 444 0 ) ( 884 480 0 ) ( 884 480 10 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 880 456 -480 ) ( 904 456 -480 ) ( 892 724 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +} +// brush 1191 +{ +( 1032 224 32 ) ( 984 272 32 ) ( 984 272 42 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 968 224 -496 ) ( 984 224 -496 ) ( 1048 320 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 984 224 -480 ) ( 968 224 -480 ) ( 1032 320 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1312 632 -528 ) ( 1312 632 -520 ) ( 1192 632 -520 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 984 224 -488 ) ( 984 224 -464 ) ( 1048 320 -464 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 984 224 -464 ) ( 984 224 -488 ) ( 968 224 -488 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 968 224 -464 ) ( 968 224 -488 ) ( 1032 320 -488 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1048 320 -488 ) ( 1048 320 -464 ) ( 1032 320 -464 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +} +// brush 1192 +{ +( 936 208 -464 ) ( 840 144 -464 ) ( 840 144 -400 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 840 484 -424 ) ( 840 364 -424 ) ( 840 364 -432 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 936 224 -432 ) ( 840 160 -432 ) ( 840 160 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 936 224 -496 ) ( 840 160 -496 ) ( 840 144 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 936 208 -480 ) ( 840 144 -480 ) ( 840 160 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 936 224 -576 ) ( 936 216 -464 ) ( 936 224 -464 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1032 16 -6 ) ( 1032 16 -16 ) ( 848 200 -16 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +} +// brush 1193 +{ +( 984 272 98 ) ( 984 272 88 ) ( 1032 224 88 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 936 208 -496 ) ( 1032 272 -496 ) ( 1032 288 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 936 224 -480 ) ( 1032 288 -480 ) ( 1032 272 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 624 64 -512 ) ( 624 -56 -512 ) ( 624 -56 -520 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 936 208 -456 ) ( 1032 272 -456 ) ( 1032 272 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1032 288 -480 ) ( 1032 272 -480 ) ( 1032 272 -456 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 936 224 -480 ) ( 1032 288 -480 ) ( 1032 288 -456 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 936 224 -536 ) ( 936 208 -536 ) ( 936 208 -560 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +} +// brush 1194 +{ +( 1688 2456 -344 ) ( 2160 2456 -344 ) ( 2160 2616 -344 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1560 3064 -336 ) ( 1568 3064 -336 ) ( 1568 2680 -336 ) subway/1_concrete_floor 32 48 0 0.500000 0.500000 0 285212672 0 +( 2160 2680 -456 ) ( 2160 3064 -456 ) ( 2160 3064 -488 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1576 2616 -456 ) ( 1568 2616 -456 ) ( 1568 2616 -488 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2032 2592 -344 ) ( 2032 2616 -344 ) ( 2032 2604 -336 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2128 2456 -344 ) ( 2080 2456 -344 ) ( 2104 2456 -336 ) subway/1_concrete_floor 32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 1195 +{ +( 2040 2032 -432 ) ( 2040 1936 -432 ) ( 2072 1936 -432 ) subway/metal2 48 32 0 0.500000 0.500000 0 16777216 0 +( 2160 1928 -384 ) ( 2160 1920 -384 ) ( 2040 1920 -424 ) subway/metal2 48 32 0 0.500000 0.500000 0 16777216 0 +( 2160 1920 -384 ) ( 2160 1928 -384 ) ( 2160 1928 -432 ) subway/metal2 -48 48 0 0.500000 0.500000 0 16777216 0 +( 2080 1928 -424 ) ( 2048 1928 -424 ) ( 2048 1928 -432 ) subway/metal2 0 48 0 0.500000 0.500000 0 16777216 0 +( 2040 2032 -424 ) ( 2040 1936 -424 ) ( 2040 1936 -432 ) subway/metal2 -48 48 0 0.500000 0.500000 0 16777216 0 +( 2040 1920 -424 ) ( 2072 1920 -424 ) ( 2072 1920 -432 ) subway/metal2 0 48 0 0.500000 0.500000 0 16777216 0 +} +// brush 1196 +{ +( 2160 1920 -356 ) ( 2040 1920 -396 ) ( 2040 1928 -396 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 2040 1928 -336 ) ( 2040 1920 -336 ) ( 2040 1920 -360 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 2160 1928 -360 ) ( 2040 1928 -400 ) ( 2040 1920 -400 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 2160 1928 -320 ) ( 2160 1920 -320 ) ( 2160 1920 -296 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 2160 1920 -360 ) ( 2040 1920 -400 ) ( 2040 1920 -376 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 2160 1928 -336 ) ( 2040 1928 -376 ) ( 2040 1928 -400 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 1197 +{ +( 2100 1646 -416 ) ( 2100 1656 -416 ) ( 2100 1656 -380 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 2160 1920 -360 ) ( 2040 1920 -400 ) ( 2040 1928 -400 ) subway/bars2 48 32 0 0.500000 0.500000 134217728 16779264 0 +( 2044 1928 -360 ) ( 2044 1920 -360 ) ( 2044 1920 -384 ) subway/bars2 -48 48 0 0.500000 0.500000 134217728 16779264 0 +( 2160 1928 -384 ) ( 2040 1928 -424 ) ( 2040 1920 -424 ) subway/bars2 48 32 0 0.500000 0.500000 134217728 16779264 0 +( 2156 1928 -344 ) ( 2156 1920 -344 ) ( 2156 1920 -320 ) subway/bars2 -48 48 0 0.500000 0.500000 134217728 16779264 0 +( 2160 1922 -384 ) ( 2040 1922 -424 ) ( 2040 1922 -400 ) subway/bars2 0 48 0 0.500000 0.500000 134217728 16779264 0 +( 2160 1926 -360 ) ( 2040 1926 -400 ) ( 2040 1926 -424 ) subway/bars2 0 48 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1198 +{ +( 2160 1646 -384 ) ( 2160 1656 -384 ) ( 2148 1656 -388 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2148 1646 -364 ) ( 2148 1656 -364 ) ( 2160 1656 -360 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2160 1928 -360 ) ( 2160 1920 -360 ) ( 2156 1920 -360 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2156 1928 -360 ) ( 2156 1920 -360 ) ( 2156 1920 -384 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 2156 1928 -388 ) ( 2156 1920 -388 ) ( 2160 1920 -388 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2160 1928 -384 ) ( 2160 1920 -384 ) ( 2160 1920 -360 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 2156 1922 -384 ) ( 2156 1922 -360 ) ( 2160 1922 -360 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 2160 1926 -360 ) ( 2156 1926 -360 ) ( 2156 1926 -384 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1199 +{ +( 2100 1646 -404 ) ( 2100 1656 -404 ) ( 2076 1656 -412 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2088 1646 -384 ) ( 2088 1656 -384 ) ( 2100 1656 -380 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2104 1928 -380 ) ( 2104 1920 -380 ) ( 2096 1920 -380 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2096 1928 -384 ) ( 2096 1920 -384 ) ( 2096 1920 -408 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 2096 1928 -408 ) ( 2096 1920 -408 ) ( 2104 1920 -408 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2100 1928 -408 ) ( 2100 1920 -408 ) ( 2100 1920 -384 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 2096 1922 -408 ) ( 2096 1922 -384 ) ( 2104 1922 -384 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 2104 1926 -384 ) ( 2096 1926 -384 ) ( 2096 1926 -408 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1200 +{ +( 2096 1646 -376 ) ( 2096 1656 -376 ) ( 2096 1656 -404 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 2160 1926 -360 ) ( 2040 1926 -400 ) ( 2040 1926 -424 ) subway/bars2 0 48 0 0.500000 0.500000 134217728 16779264 0 +( 2160 1922 -384 ) ( 2040 1922 -424 ) ( 2040 1922 -400 ) subway/bars2 0 48 0 0.500000 0.500000 134217728 16779264 0 +( 2156 1928 -344 ) ( 2156 1920 -344 ) ( 2156 1920 -320 ) subway/bars2 -48 48 0 0.500000 0.500000 134217728 16779264 0 +( 2160 1928 -384 ) ( 2040 1928 -424 ) ( 2040 1920 -424 ) subway/bars2 48 32 0 0.500000 0.500000 134217728 16779264 0 +( 2044 1928 -360 ) ( 2044 1920 -360 ) ( 2044 1920 -384 ) subway/bars2 -48 48 0 0.500000 0.500000 134217728 16779264 0 +( 2160 1920 -360 ) ( 2040 1920 -400 ) ( 2040 1928 -400 ) subway/bars2 48 32 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1201 +{ +( 2052 1646 -420 ) ( 2052 1656 -420 ) ( 2040 1656 -424 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2040 1646 -400 ) ( 2040 1656 -400 ) ( 2052 1656 -396 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2044 1928 -396 ) ( 2044 1920 -396 ) ( 2040 1920 -396 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2040 1928 -396 ) ( 2040 1920 -396 ) ( 2040 1920 -420 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 2040 1928 -424 ) ( 2040 1920 -424 ) ( 2044 1920 -424 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2044 1928 -424 ) ( 2044 1920 -424 ) ( 2044 1920 -400 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 2040 1922 -424 ) ( 2040 1922 -400 ) ( 2044 1922 -400 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 2044 1926 -400 ) ( 2040 1926 -400 ) ( 2040 1926 -424 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1202 +{ +( 2040 1800 -424 ) ( 2072 1800 -424 ) ( 2072 1800 -432 ) subway/metal2 0 48 0 0.500000 0.500000 0 16777216 0 +( 2040 1912 -424 ) ( 2040 1816 -424 ) ( 2040 1816 -432 ) subway/metal2 -48 48 0 0.500000 0.500000 0 16777216 0 +( 2080 1808 -424 ) ( 2048 1808 -424 ) ( 2048 1808 -432 ) subway/metal2 0 48 0 0.500000 0.500000 0 16777216 0 +( 2160 1800 -384 ) ( 2160 1808 -384 ) ( 2160 1808 -432 ) subway/metal2 -48 48 0 0.500000 0.500000 0 16777216 0 +( 2160 1808 -384 ) ( 2160 1800 -384 ) ( 2040 1800 -424 ) subway/metal2 48 32 0 0.500000 0.500000 0 16777216 0 +( 2040 1912 -432 ) ( 2040 1816 -432 ) ( 2072 1816 -432 ) subway/metal2 48 32 0 0.500000 0.500000 0 16777216 0 +} +// brush 1203 +{ +( 2160 1808 -336 ) ( 2040 1808 -376 ) ( 2040 1808 -400 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 2160 1800 -360 ) ( 2040 1800 -400 ) ( 2040 1800 -376 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 2160 1808 -320 ) ( 2160 1800 -320 ) ( 2160 1800 -296 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 2160 1808 -360 ) ( 2040 1808 -400 ) ( 2040 1800 -400 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 2040 1808 -336 ) ( 2040 1800 -336 ) ( 2040 1800 -360 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 2160 1800 -356 ) ( 2040 1800 -396 ) ( 2040 1808 -396 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 1204 +{ +( 2160 1806 -360 ) ( 2040 1806 -400 ) ( 2040 1806 -424 ) subway/bars2 0 48 0 0.500000 0.500000 134217728 16779264 0 +( 2160 1802 -384 ) ( 2040 1802 -424 ) ( 2040 1802 -400 ) subway/bars2 0 48 0 0.500000 0.500000 134217728 16779264 0 +( 2156 1808 -344 ) ( 2156 1800 -344 ) ( 2156 1800 -320 ) subway/bars2 -48 48 0 0.500000 0.500000 134217728 16779264 0 +( 2160 1808 -384 ) ( 2040 1808 -424 ) ( 2040 1800 -424 ) subway/bars2 48 32 0 0.500000 0.500000 134217728 16779264 0 +( 2044 1808 -360 ) ( 2044 1800 -360 ) ( 2044 1800 -384 ) subway/bars2 -48 48 0 0.500000 0.500000 134217728 16779264 0 +( 2160 1800 -360 ) ( 2040 1800 -400 ) ( 2040 1808 -400 ) subway/bars2 48 32 0 0.500000 0.500000 134217728 16779264 0 +( 2100 1526 -416 ) ( 2100 1536 -416 ) ( 2100 1536 -380 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1205 +{ +( 2160 1806 -360 ) ( 2156 1806 -360 ) ( 2156 1806 -384 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 2156 1802 -384 ) ( 2156 1802 -360 ) ( 2160 1802 -360 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 2160 1808 -384 ) ( 2160 1800 -384 ) ( 2160 1800 -360 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 2156 1808 -388 ) ( 2156 1800 -388 ) ( 2160 1800 -388 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2156 1808 -360 ) ( 2156 1800 -360 ) ( 2156 1800 -384 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 2160 1808 -360 ) ( 2160 1800 -360 ) ( 2156 1800 -360 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2148 1526 -364 ) ( 2148 1536 -364 ) ( 2160 1536 -360 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2160 1526 -384 ) ( 2160 1536 -384 ) ( 2148 1536 -388 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1206 +{ +( 2104 1806 -384 ) ( 2096 1806 -384 ) ( 2096 1806 -408 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 2096 1802 -408 ) ( 2096 1802 -384 ) ( 2104 1802 -384 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 2100 1808 -408 ) ( 2100 1800 -408 ) ( 2100 1800 -384 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 2096 1808 -408 ) ( 2096 1800 -408 ) ( 2104 1800 -408 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2096 1808 -384 ) ( 2096 1800 -384 ) ( 2096 1800 -408 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 2104 1808 -380 ) ( 2104 1800 -380 ) ( 2096 1800 -380 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2088 1526 -384 ) ( 2088 1536 -384 ) ( 2100 1536 -380 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2100 1526 -404 ) ( 2100 1536 -404 ) ( 2076 1536 -412 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1207 +{ +( 2160 1800 -360 ) ( 2040 1800 -400 ) ( 2040 1808 -400 ) subway/bars2 48 32 0 0.500000 0.500000 134217728 16779264 0 +( 2044 1808 -360 ) ( 2044 1800 -360 ) ( 2044 1800 -384 ) subway/bars2 -48 48 0 0.500000 0.500000 134217728 16779264 0 +( 2160 1808 -384 ) ( 2040 1808 -424 ) ( 2040 1800 -424 ) subway/bars2 48 32 0 0.500000 0.500000 134217728 16779264 0 +( 2156 1808 -344 ) ( 2156 1800 -344 ) ( 2156 1800 -320 ) subway/bars2 -48 48 0 0.500000 0.500000 134217728 16779264 0 +( 2160 1802 -384 ) ( 2040 1802 -424 ) ( 2040 1802 -400 ) subway/bars2 0 48 0 0.500000 0.500000 134217728 16779264 0 +( 2160 1806 -360 ) ( 2040 1806 -400 ) ( 2040 1806 -424 ) subway/bars2 0 48 0 0.500000 0.500000 134217728 16779264 0 +( 2096 1526 -376 ) ( 2096 1536 -376 ) ( 2096 1536 -404 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1208 +{ +( 2044 1806 -400 ) ( 2040 1806 -400 ) ( 2040 1806 -424 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 2040 1802 -424 ) ( 2040 1802 -400 ) ( 2044 1802 -400 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 2044 1808 -424 ) ( 2044 1800 -424 ) ( 2044 1800 -400 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 2040 1808 -424 ) ( 2040 1800 -424 ) ( 2044 1800 -424 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2040 1808 -396 ) ( 2040 1800 -396 ) ( 2040 1800 -420 ) subway/metal2 -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 2044 1808 -396 ) ( 2044 1800 -396 ) ( 2040 1800 -396 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2040 1526 -400 ) ( 2040 1536 -400 ) ( 2052 1536 -396 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +( 2052 1526 -420 ) ( 2052 1536 -420 ) ( 2040 1536 -424 ) subway/metal2 48 32 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1209 +{ +( 1912 2176 -472 ) ( 1912 2144 -472 ) ( 1912 2144 -480 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 2024 2176 -472 ) ( 1928 2176 -472 ) ( 1928 2176 -480 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1920 2136 -472 ) ( 1920 2168 -472 ) ( 1920 2168 -480 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 1912 2056 -432 ) ( 1920 2056 -432 ) ( 1920 2056 -480 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1920 2056 -432 ) ( 1912 2056 -432 ) ( 1912 2176 -472 ) subway/metal2 32 0 0 0.500000 0.500000 0 16777216 0 +( 2024 2176 -480 ) ( 1928 2176 -480 ) ( 1928 2144 -480 ) subway/metal2 32 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1210 +{ +( 1920 2056 -384 ) ( 1920 2176 -424 ) ( 1920 2176 -448 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 1912 2056 -408 ) ( 1912 2176 -448 ) ( 1912 2176 -424 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2056 -368 ) ( 1912 2056 -368 ) ( 1912 2056 -344 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2056 -408 ) ( 1920 2176 -448 ) ( 1912 2176 -448 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2176 -384 ) ( 1912 2176 -384 ) ( 1912 2176 -408 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( 1912 2056 -404 ) ( 1912 2176 -444 ) ( 1920 2176 -444 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1211 +{ +( 1918 2056 -408 ) ( 1918 2176 -448 ) ( 1918 2176 -472 ) subway/bars2 0 16 0 0.500000 0.500000 134217728 16779264 0 +( 1914 2056 -432 ) ( 1914 2176 -472 ) ( 1914 2176 -448 ) subway/bars2 0 16 0 0.500000 0.500000 134217728 16779264 0 +( 1920 2060 -392 ) ( 1912 2060 -392 ) ( 1912 2060 -368 ) subway/bars2 32 16 0 0.500000 0.500000 134217728 16779264 0 +( 1920 2056 -432 ) ( 1920 2176 -472 ) ( 1912 2176 -472 ) subway/bars2 32 0 0 0.500000 0.500000 134217728 16779264 0 +( 1920 2172 -408 ) ( 1912 2172 -408 ) ( 1912 2172 -432 ) subway/bars2 32 16 0 0.500000 0.500000 134217728 16779264 0 +( 1912 2056 -408 ) ( 1912 2176 -448 ) ( 1920 2176 -448 ) subway/bars2 32 0 0 0.500000 0.500000 134217728 16779264 0 +( 1638 2116 -464 ) ( 1648 2116 -464 ) ( 1648 2116 -428 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1212 +{ +( 1918 2056 -408 ) ( 1918 2060 -408 ) ( 1918 2060 -432 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 1914 2060 -432 ) ( 1914 2060 -408 ) ( 1914 2056 -408 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2056 -432 ) ( 1912 2056 -432 ) ( 1912 2056 -408 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2060 -436 ) ( 1912 2060 -436 ) ( 1912 2056 -436 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2060 -408 ) ( 1912 2060 -408 ) ( 1912 2060 -432 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2056 -408 ) ( 1912 2056 -408 ) ( 1912 2060 -408 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 1638 2068 -412 ) ( 1648 2068 -412 ) ( 1648 2056 -408 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 1638 2056 -432 ) ( 1648 2056 -432 ) ( 1648 2068 -436 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1213 +{ +( 1918 2112 -432 ) ( 1918 2120 -432 ) ( 1918 2120 -456 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 1914 2120 -456 ) ( 1914 2120 -432 ) ( 1914 2112 -432 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2116 -456 ) ( 1912 2116 -456 ) ( 1912 2116 -432 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2120 -456 ) ( 1912 2120 -456 ) ( 1912 2112 -456 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2120 -432 ) ( 1912 2120 -432 ) ( 1912 2120 -456 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2112 -428 ) ( 1912 2112 -428 ) ( 1912 2120 -428 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 1638 2128 -432 ) ( 1648 2128 -432 ) ( 1648 2116 -428 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 1638 2116 -452 ) ( 1648 2116 -452 ) ( 1648 2140 -460 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1214 +{ +( 1912 2056 -408 ) ( 1912 2176 -448 ) ( 1920 2176 -448 ) subway/bars2 32 0 0 0.500000 0.500000 134217728 16779264 0 +( 1920 2172 -408 ) ( 1912 2172 -408 ) ( 1912 2172 -432 ) subway/bars2 32 16 0 0.500000 0.500000 134217728 16779264 0 +( 1920 2056 -432 ) ( 1920 2176 -472 ) ( 1912 2176 -472 ) subway/bars2 32 0 0 0.500000 0.500000 134217728 16779264 0 +( 1920 2060 -392 ) ( 1912 2060 -392 ) ( 1912 2060 -368 ) subway/bars2 32 16 0 0.500000 0.500000 134217728 16779264 0 +( 1914 2056 -432 ) ( 1914 2176 -472 ) ( 1914 2176 -448 ) subway/bars2 0 16 0 0.500000 0.500000 134217728 16779264 0 +( 1918 2056 -408 ) ( 1918 2176 -448 ) ( 1918 2176 -472 ) subway/bars2 0 16 0 0.500000 0.500000 134217728 16779264 0 +( 1638 2120 -424 ) ( 1648 2120 -424 ) ( 1648 2120 -452 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1215 +{ +( 1918 2172 -448 ) ( 1918 2176 -448 ) ( 1918 2176 -472 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 1914 2176 -472 ) ( 1914 2176 -448 ) ( 1914 2172 -448 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2172 -472 ) ( 1912 2172 -472 ) ( 1912 2172 -448 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2176 -472 ) ( 1912 2176 -472 ) ( 1912 2172 -472 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2176 -444 ) ( 1912 2176 -444 ) ( 1912 2176 -468 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 1920 2172 -444 ) ( 1912 2172 -444 ) ( 1912 2176 -444 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 1638 2176 -448 ) ( 1648 2176 -448 ) ( 1648 2164 -444 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 1638 2164 -468 ) ( 1648 2164 -468 ) ( 1648 2176 -472 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1216 +{ +( 2144 2176 -480 ) ( 2048 2176 -480 ) ( 2048 2144 -480 ) subway/metal2 32 0 0 0.500000 0.500000 0 16777216 0 +( 2040 2056 -432 ) ( 2032 2056 -432 ) ( 2032 2176 -472 ) subway/metal2 32 0 0 0.500000 0.500000 0 16777216 0 +( 2032 2056 -432 ) ( 2040 2056 -432 ) ( 2040 2056 -480 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 2040 2136 -472 ) ( 2040 2168 -472 ) ( 2040 2168 -480 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 2144 2176 -472 ) ( 2048 2176 -472 ) ( 2048 2176 -480 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 2032 2176 -472 ) ( 2032 2144 -472 ) ( 2032 2144 -480 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 1217 +{ +( 2032 2056 -404 ) ( 2032 2176 -444 ) ( 2040 2176 -444 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( 2040 2176 -384 ) ( 2032 2176 -384 ) ( 2032 2176 -408 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( 2040 2056 -408 ) ( 2040 2176 -448 ) ( 2032 2176 -448 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2056 -368 ) ( 2032 2056 -368 ) ( 2032 2056 -344 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 2032 2056 -408 ) ( 2032 2176 -448 ) ( 2032 2176 -424 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2056 -384 ) ( 2040 2176 -424 ) ( 2040 2176 -448 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1218 +{ +( 1758 2116 -464 ) ( 1768 2116 -464 ) ( 1768 2116 -428 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 2032 2056 -408 ) ( 2032 2176 -448 ) ( 2040 2176 -448 ) subway/bars2 32 0 0 0.500000 0.500000 134217728 16779264 0 +( 2040 2172 -408 ) ( 2032 2172 -408 ) ( 2032 2172 -432 ) subway/bars2 32 16 0 0.500000 0.500000 134217728 16779264 0 +( 2040 2056 -432 ) ( 2040 2176 -472 ) ( 2032 2176 -472 ) subway/bars2 32 0 0 0.500000 0.500000 134217728 16779264 0 +( 2040 2060 -392 ) ( 2032 2060 -392 ) ( 2032 2060 -368 ) subway/bars2 32 16 0 0.500000 0.500000 134217728 16779264 0 +( 2034 2056 -432 ) ( 2034 2176 -472 ) ( 2034 2176 -448 ) subway/bars2 0 16 0 0.500000 0.500000 134217728 16779264 0 +( 2038 2056 -408 ) ( 2038 2176 -448 ) ( 2038 2176 -472 ) subway/bars2 0 16 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1219 +{ +( 1758 2056 -432 ) ( 1768 2056 -432 ) ( 1768 2068 -436 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 1758 2068 -412 ) ( 1768 2068 -412 ) ( 1768 2056 -408 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2056 -408 ) ( 2032 2056 -408 ) ( 2032 2060 -408 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2060 -408 ) ( 2032 2060 -408 ) ( 2032 2060 -432 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2060 -436 ) ( 2032 2060 -436 ) ( 2032 2056 -436 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2056 -432 ) ( 2032 2056 -432 ) ( 2032 2056 -408 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 2034 2060 -432 ) ( 2034 2060 -408 ) ( 2034 2056 -408 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 2038 2056 -408 ) ( 2038 2060 -408 ) ( 2038 2060 -432 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1220 +{ +( 1758 2116 -452 ) ( 1768 2116 -452 ) ( 1768 2140 -460 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 1758 2128 -432 ) ( 1768 2128 -432 ) ( 1768 2116 -428 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2112 -428 ) ( 2032 2112 -428 ) ( 2032 2120 -428 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2120 -432 ) ( 2032 2120 -432 ) ( 2032 2120 -456 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2120 -456 ) ( 2032 2120 -456 ) ( 2032 2112 -456 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2116 -456 ) ( 2032 2116 -456 ) ( 2032 2116 -432 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 2034 2120 -456 ) ( 2034 2120 -432 ) ( 2034 2112 -432 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 2038 2112 -432 ) ( 2038 2120 -432 ) ( 2038 2120 -456 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1221 +{ +( 1758 2120 -424 ) ( 1768 2120 -424 ) ( 1768 2120 -452 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 2038 2056 -408 ) ( 2038 2176 -448 ) ( 2038 2176 -472 ) subway/bars2 0 16 0 0.500000 0.500000 134217728 16779264 0 +( 2034 2056 -432 ) ( 2034 2176 -472 ) ( 2034 2176 -448 ) subway/bars2 0 16 0 0.500000 0.500000 134217728 16779264 0 +( 2040 2060 -392 ) ( 2032 2060 -392 ) ( 2032 2060 -368 ) subway/bars2 32 16 0 0.500000 0.500000 134217728 16779264 0 +( 2040 2056 -432 ) ( 2040 2176 -472 ) ( 2032 2176 -472 ) subway/bars2 32 0 0 0.500000 0.500000 134217728 16779264 0 +( 2040 2172 -408 ) ( 2032 2172 -408 ) ( 2032 2172 -432 ) subway/bars2 32 16 0 0.500000 0.500000 134217728 16779264 0 +( 2032 2056 -408 ) ( 2032 2176 -448 ) ( 2040 2176 -448 ) subway/bars2 32 0 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1222 +{ +( 1758 2164 -468 ) ( 1768 2164 -468 ) ( 1768 2176 -472 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 1758 2176 -448 ) ( 1768 2176 -448 ) ( 1768 2164 -444 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2172 -444 ) ( 2032 2172 -444 ) ( 2032 2176 -444 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2176 -444 ) ( 2032 2176 -444 ) ( 2032 2176 -468 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2176 -472 ) ( 2032 2176 -472 ) ( 2032 2172 -472 ) subway/metal2 32 0 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2172 -472 ) ( 2032 2172 -472 ) ( 2032 2172 -448 ) subway/metal2 32 16 0 0.500000 0.500000 134217728 16777216 0 +( 2034 2176 -472 ) ( 2034 2176 -448 ) ( 2034 2172 -448 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +( 2038 2172 -448 ) ( 2038 2176 -448 ) ( 2038 2176 -472 ) subway/metal2 0 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1223 +{ +( 28 -672 -408 ) ( 28 -696 -400 ) ( 38 -696 -400 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( 28 -696 -376 ) ( 28 -672 -384 ) ( 38 -672 -384 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -388 -692 -376 ) ( -388 -696 -376 ) ( -396 -696 -376 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -388 -692 -404 ) ( -388 -692 -376 ) ( -396 -692 -376 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -388 -696 -404 ) ( -388 -692 -404 ) ( -396 -692 -404 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -388 -696 -376 ) ( -388 -696 -404 ) ( -396 -696 -404 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -390 -696 -376 ) ( -390 -692 -376 ) ( -390 -692 -404 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -394 -692 -404 ) ( -394 -692 -376 ) ( -394 -696 -376 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1224 +{ +( 28 -624 -424 ) ( 28 -660 -412 ) ( 38 -660 -412 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +( 28 -660 -388 ) ( 28 -624 -400 ) ( 38 -624 -400 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -388 -644 -388 ) ( -388 -648 -388 ) ( -396 -648 -388 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -388 -644 -420 ) ( -388 -644 -392 ) ( -396 -644 -392 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -388 -648 -420 ) ( -388 -644 -420 ) ( -396 -644 -420 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -404 -648 -392 ) ( -404 -648 -420 ) ( -412 -648 -420 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -390 -648 -392 ) ( -390 -644 -392 ) ( -390 -644 -420 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -394 -644 -420 ) ( -394 -644 -392 ) ( -394 -648 -392 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1225 +{ +( -396 -600 -404 ) ( -388 -600 -404 ) ( -388 -696 -372 ) subway/1_black 8 0 0 1 1 134217728 16777216 0 +( -396 -600 -436 ) ( -388 -600 -436 ) ( -388 -600 -396 ) subway/1_black 8 0 0 1 1 134217728 16777216 0 +( -388 -600 -408 ) ( -396 -600 -408 ) ( -396 -696 -376 ) subway/1_black 8 0 0 1 1 134217728 16777216 0 +( -388 -696 -404 ) ( -396 -696 -404 ) ( -396 -696 -364 ) subway/1_black 8 0 0 1 1 134217728 16777216 0 +( -388 -600 -396 ) ( -388 -600 -428 ) ( -388 -696 -396 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -396 -600 -428 ) ( -396 -600 -396 ) ( -396 -696 -364 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 1226 +{ +( 28 -600 -432 ) ( 28 -624 -424 ) ( 38 -624 -424 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( 28 -624 -400 ) ( 28 -600 -408 ) ( 38 -600 -408 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -388 -600 -404 ) ( -388 -604 -404 ) ( -396 -604 -404 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -388 -600 -440 ) ( -388 -600 -408 ) ( -396 -600 -408 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -388 -604 -436 ) ( -388 -600 -436 ) ( -396 -600 -436 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -388 -604 -408 ) ( -388 -604 -440 ) ( -396 -604 -440 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -390 -604 -408 ) ( -390 -600 -408 ) ( -390 -600 -440 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -394 -600 -440 ) ( -394 -600 -408 ) ( -394 -604 -408 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1227 +{ +( 26 -644 -424 ) ( 26 -644 -380 ) ( 36 -644 -380 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -396 -600 -408 ) ( -388 -600 -408 ) ( -388 -696 -376 ) subway/bars2 16 0 0 0.500000 0.500000 134217728 16779264 0 +( -396 -604 -440 ) ( -388 -604 -440 ) ( -388 -604 -400 ) subway/bars2 16 0 0 0.500000 0.500000 134217728 16779264 0 +( -388 -600 -432 ) ( -396 -600 -432 ) ( -396 -696 -400 ) subway/bars2 16 0 0 0.500000 0.500000 134217728 16779264 0 +( -388 -692 -408 ) ( -396 -692 -408 ) ( -396 -692 -368 ) subway/bars2 16 0 0 0.500000 0.500000 134217728 16779264 0 +( -390 -600 -400 ) ( -390 -600 -432 ) ( -390 -696 -400 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -394 -600 -432 ) ( -394 -600 -400 ) ( -394 -696 -368 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1228 +{ +( 28 -648 -384 ) ( 28 -648 -436 ) ( 38 -648 -436 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -394 -600 -432 ) ( -394 -600 -400 ) ( -394 -696 -368 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -390 -600 -400 ) ( -390 -600 -432 ) ( -390 -696 -400 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -388 -692 -408 ) ( -396 -692 -408 ) ( -396 -692 -368 ) subway/bars2 16 0 0 0.500000 0.500000 134217728 16779264 0 +( -388 -600 -432 ) ( -396 -600 -432 ) ( -396 -696 -400 ) subway/bars2 16 0 0 0.500000 0.500000 134217728 16779264 0 +( -396 -604 -440 ) ( -388 -604 -440 ) ( -388 -604 -400 ) subway/bars2 16 0 0 0.500000 0.500000 134217728 16779264 0 +( -396 -600 -408 ) ( -388 -600 -408 ) ( -388 -696 -376 ) subway/bars2 16 0 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1229 +{ +( 268 -856 -440 ) ( 268 -792 -440 ) ( 204 -792 -440 ) subway/metal_rust 16 0 0 0.500000 0.500000 0 16777216 0 +( -388 -696 -400 ) ( -396 -696 -400 ) ( -396 -600 -432 ) subway/metal_rust 16 0 0 0.500000 0.500000 0 16777216 0 +( -396 -696 -400 ) ( -388 -696 -400 ) ( -388 -696 -440 ) subway/metal_rust 16 0 0 0.500000 0.500000 0 16777216 0 +( -396 -680 -440 ) ( -396 -680 -432 ) ( -396 -744 -432 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( 612 -600 -440 ) ( 612 -600 -432 ) ( 548 -600 -432 ) subway/metal_rust 16 0 0 0.500000 0.500000 0 16777216 0 +( -388 -872 -440 ) ( -388 -872 -432 ) ( -388 -808 -432 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1230 +{ +( 8 -1072 -416 ) ( 8 -1072 -408 ) ( 8 -1008 -408 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 0 285212672 0 +( 920 -800 -416 ) ( 920 -800 -408 ) ( 856 -800 -408 ) subway/1_stair_side1 840 -368 0 0.500000 0.500000 0 285212672 0 +( -120 -880 -416 ) ( -120 -880 -408 ) ( -120 -944 -408 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 0 285212672 0 +( 8 -824 -424 ) ( 8 -824 -416 ) ( 72 -824 -416 ) subway/1_stair_side1 328 -368 0 0.500000 0.500000 0 285212672 0 +( 456 -992 -408 ) ( 520 -992 -408 ) ( 520 -1056 -408 ) subway/1_stair_top1 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 -1056 -416 ) ( 536 -992 -416 ) ( 472 -992 -416 ) subway/1_lobby_floor 448 -880 0 0.500000 0.500000 0 285212672 0 +} +// brush 1231 +{ +( 8 -1048 -424 ) ( 8 -1048 -416 ) ( 8 -984 -416 ) subway/1_lobby_floor 576 -368 0 0.500000 0.500000 0 285212672 0 +( 920 -776 -424 ) ( 920 -776 -416 ) ( 856 -776 -416 ) subway/1_stair_side1 840 -384 0 0.500000 0.500000 0 285212672 0 +( -120 -856 -424 ) ( -120 -856 -416 ) ( -120 -920 -416 ) subway/1_lobby_floor 576 -368 0 0.500000 0.500000 0 285212672 0 +( 48 -800 -432 ) ( 48 -800 -424 ) ( 112 -800 -424 ) subway/1_stair_side1 328 -384 0 0.500000 0.500000 0 285212672 0 +( 456 -968 -416 ) ( 520 -968 -416 ) ( 520 -1032 -416 ) subway/1_stair_top1 0 64 0 0.500000 0.500000 0 285212672 0 +( 536 -1032 -424 ) ( 536 -968 -424 ) ( 472 -968 -424 ) subway/1_lobby_floor 448 -832 0 0.500000 0.500000 0 285212672 0 +} +// brush 1232 +{ +( 8 -1024 -432 ) ( 8 -1024 -424 ) ( 8 -960 -424 ) subway/1_lobby_floor 528 -384 0 0.500000 0.500000 0 285212672 0 +( 920 -752 -432 ) ( 920 -752 -424 ) ( 856 -752 -424 ) subway/1_stair_side1 840 -400 0 0.500000 0.500000 0 285212672 0 +( -120 -832 -432 ) ( -120 -832 -424 ) ( -120 -896 -424 ) subway/1_lobby_floor 528 -384 0 0.500000 0.500000 0 285212672 0 +( 48 -776 -440 ) ( 48 -776 -432 ) ( 112 -776 -432 ) subway/1_stair_side1 328 -400 0 0.500000 0.500000 0 285212672 0 +( 456 -944 -424 ) ( 520 -944 -424 ) ( 520 -1008 -424 ) subway/1_stair_top1 0 112 0 0.500000 0.500000 0 285212672 0 +( 536 -1008 -432 ) ( 536 -944 -432 ) ( 472 -944 -432 ) subway/1_lobby_floor 448 -784 0 0.500000 0.500000 0 285212672 0 +} +// brush 1233 +{ +( 536 -984 -440 ) ( 536 -920 -440 ) ( 472 -920 -440 ) subway/1_lobby_floor 448 -736 0 0.500000 0.500000 0 285212672 0 +( 456 -920 -432 ) ( 520 -920 -432 ) ( 520 -984 -432 ) subway/1_stair_top1 0 160 0 0.500000 0.500000 0 285212672 0 +( 48 -752 -448 ) ( 48 -752 -440 ) ( 112 -752 -440 ) subway/1_stair_side1 328 -416 0 0.500000 0.500000 0 285212672 0 +( -120 -808 -440 ) ( -120 -808 -432 ) ( -120 -872 -432 ) subway/1_lobby_floor 480 -400 0 0.500000 0.500000 0 285212672 0 +( 880 -728 -440 ) ( 880 -728 -432 ) ( 816 -728 -432 ) subway/1_stair_side1 840 -416 0 0.500000 0.500000 0 285212672 0 +( 8 -1000 -440 ) ( 8 -1000 -432 ) ( 8 -936 -432 ) subway/1_lobby_floor 480 -400 0 0.500000 0.500000 0 285212672 0 +} +// brush 1234 +{ +( 536 -984 -440 ) ( 536 -920 -440 ) ( 472 -920 -440 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -120 -824 -400 ) ( -128 -824 -400 ) ( -128 -728 -432 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -128 -824 -400 ) ( -120 -824 -400 ) ( -120 -824 -440 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -128 -808 -440 ) ( -128 -808 -432 ) ( -128 -872 -432 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( 880 -728 -440 ) ( 880 -728 -432 ) ( 816 -728 -432 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -120 -1000 -440 ) ( -120 -1000 -432 ) ( -120 -936 -432 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1235 +{ +( 0 -1000 -440 ) ( 0 -1000 -432 ) ( 0 -936 -432 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( 1000 -728 -440 ) ( 1000 -728 -432 ) ( 936 -728 -432 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -8 -808 -440 ) ( -8 -808 -432 ) ( -8 -872 -432 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -8 -824 -400 ) ( 0 -824 -400 ) ( 0 -824 -440 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( 0 -824 -400 ) ( -8 -824 -400 ) ( -8 -728 -432 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( 656 -984 -440 ) ( 656 -920 -440 ) ( 592 -920 -440 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1236 +{ +( -150 -984 -392 ) ( -160 -984 -392 ) ( -160 -1008 -384 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -150 -1008 -360 ) ( -160 -1008 -360 ) ( -160 -984 -368 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -456 -984 -364 ) ( -448 -984 -364 ) ( -448 -988 -364 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -456 -988 -364 ) ( -448 -988 -364 ) ( -448 -988 -396 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -456 -988 -396 ) ( -448 -988 -396 ) ( -448 -984 -396 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -456 -984 -396 ) ( -448 -984 -396 ) ( -448 -984 -364 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -448 -988 -396 ) ( -448 -988 -364 ) ( -448 -984 -364 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -456 -984 -364 ) ( -456 -988 -364 ) ( -456 -988 -396 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1237 +{ +( -150 -1084 -372 ) ( -160 -1084 -372 ) ( -160 -1084 -332 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -454 -1128 -296 ) ( -454 -1176 -296 ) ( -454 -1176 -328 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -450 -1176 -328 ) ( -450 -1176 -296 ) ( -450 -1128 -296 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -448 -988 -392 ) ( -448 -988 -360 ) ( -456 -988 -360 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -456 -984 -392 ) ( -456 -1176 -328 ) ( -448 -1176 -328 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -448 -1172 -296 ) ( -448 -1172 -328 ) ( -456 -1172 -328 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -456 -1176 -304 ) ( -456 -984 -368 ) ( -448 -984 -368 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1238 +{ +( -88 -1536 -400 ) ( -88 -1600 -400 ) ( -24 -1600 -400 ) subway/metal_rust 1192 -704 0 0.500000 0.500000 0 16777216 0 +( -448 -1080 -360 ) ( -448 -1176 -328 ) ( -456 -1176 -328 ) subway/metal_rust 1192 -704 0 0.500000 0.500000 0 16777216 0 +( -448 -1432 -368 ) ( -448 -1368 -368 ) ( -448 -1368 -376 ) subway/metal_rust 256 -248 0 0.500000 0.500000 0 16777216 0 +( -152 -984 -368 ) ( -216 -984 -368 ) ( -216 -984 -376 ) subway/metal_rust 1144 -200 0 0.500000 0.500000 0 16777216 0 +( -456 -1912 -360 ) ( -456 -1976 -360 ) ( -456 -1976 -368 ) subway/metal_rust 256 -248 0 0.500000 0.500000 0 16777216 0 +( -456 -1176 -368 ) ( -456 -1176 -328 ) ( -448 -1176 -328 ) subway/metal_rust 1144 -200 0 0.500000 0.500000 0 16777216 0 +} +// brush 1239 +{ +( -150 -1088 -320 ) ( -160 -1088 -320 ) ( -160 -1088 -368 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -456 -1176 -304 ) ( -456 -984 -368 ) ( -448 -984 -368 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -448 -1172 -296 ) ( -448 -1172 -328 ) ( -456 -1172 -328 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -456 -984 -392 ) ( -456 -1176 -328 ) ( -448 -1176 -328 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -448 -988 -392 ) ( -448 -988 -360 ) ( -456 -988 -360 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -450 -1176 -328 ) ( -450 -1176 -296 ) ( -450 -1128 -296 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -454 -1128 -296 ) ( -454 -1176 -296 ) ( -454 -1176 -328 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1240 +{ +( -450 -1084 -328 ) ( -450 -1084 -364 ) ( -450 -1088 -364 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -454 -1088 -364 ) ( -454 -1084 -364 ) ( -454 -1084 -328 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -456 -1088 -360 ) ( -456 -1088 -324 ) ( -448 -1088 -324 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -456 -1088 -332 ) ( -456 -1084 -332 ) ( -448 -1084 -332 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -456 -1084 -328 ) ( -456 -1084 -364 ) ( -448 -1084 -364 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -456 -1084 -360 ) ( -456 -1088 -360 ) ( -448 -1088 -360 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -728 -1104 -352 ) ( -728 -1080 -360 ) ( -738 -1080 -360 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -728 -1080 -336 ) ( -728 -1128 -320 ) ( -738 -1128 -320 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1241 +{ +( -150 -1152 -336 ) ( -160 -1152 -336 ) ( -160 -1176 -328 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -150 -1176 -304 ) ( -160 -1176 -304 ) ( -160 -1152 -312 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -456 -1172 -300 ) ( -448 -1172 -300 ) ( -448 -1176 -300 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -456 -1176 -304 ) ( -448 -1176 -304 ) ( -448 -1176 -328 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -456 -1176 -332 ) ( -448 -1176 -332 ) ( -448 -1172 -332 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -456 -1172 -328 ) ( -448 -1172 -328 ) ( -448 -1172 -304 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -450 -1176 -328 ) ( -450 -1176 -304 ) ( -450 -1172 -304 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -454 -1172 -304 ) ( -454 -1176 -304 ) ( -454 -1176 -328 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1242 +{ +( -456 -1176 -300 ) ( -456 -984 -364 ) ( -448 -984 -364 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -456 -984 -368 ) ( -456 -1176 -304 ) ( -448 -1176 -304 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -448 -984 -368 ) ( -448 -984 -336 ) ( -456 -984 -336 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -448 -1176 -304 ) ( -448 -1176 -272 ) ( -448 -1128 -272 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -456 -1128 -272 ) ( -456 -1176 -272 ) ( -456 -1176 -304 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -456 -1072 -304 ) ( -440 -1072 -304 ) ( -456 -1112 -304 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 1243 +{ +( -456 -1176 -300 ) ( -456 -984 -364 ) ( -448 -984 -364 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -448 -1176 -272 ) ( -448 -1176 -304 ) ( -456 -1176 -304 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -448 -1176 -304 ) ( -448 -1176 -272 ) ( -448 -1128 -272 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -456 -1128 -272 ) ( -456 -1176 -272 ) ( -456 -1176 -304 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -440 -1072 -304 ) ( -456 -1072 -304 ) ( -456 -1112 -304 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 1244 +{ +( -330 -960 -392 ) ( -340 -960 -392 ) ( -340 -984 -384 ) subway/metal_rust 16 48 0 0.500000 0.500000 134217728 16777216 0 +( -330 -984 -360 ) ( -340 -984 -360 ) ( -340 -960 -368 ) subway/metal_rust 16 48 0 0.500000 0.500000 134217728 16777216 0 +( -636 -960 -364 ) ( -628 -960 -364 ) ( -628 -964 -364 ) subway/metal_rust 16 48 0 0.500000 0.500000 134217728 16777216 0 +( -636 -964 -364 ) ( -628 -964 -364 ) ( -628 -964 -396 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -636 -964 -396 ) ( -628 -964 -396 ) ( -628 -960 -396 ) subway/metal_rust 16 48 0 0.500000 0.500000 134217728 16777216 0 +( -636 -960 -396 ) ( -628 -960 -396 ) ( -628 -960 -364 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -628 -964 -396 ) ( -628 -964 -364 ) ( -628 -960 -364 ) subway/metal_rust -48 0 0 0.500000 0.500000 134217728 16777216 0 +( -636 -960 -364 ) ( -636 -964 -364 ) ( -636 -964 -396 ) subway/metal_rust -48 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1245 +{ +( -330 -1060 -372 ) ( -340 -1060 -372 ) ( -340 -1060 -332 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -634 -1104 -296 ) ( -634 -1152 -296 ) ( -634 -1152 -328 ) subway/bars2 -48 0 0 0.500000 0.500000 134217728 16779264 0 +( -630 -1152 -328 ) ( -630 -1152 -296 ) ( -630 -1104 -296 ) subway/bars2 -48 0 0 0.500000 0.500000 134217728 16779264 0 +( -628 -964 -392 ) ( -628 -964 -360 ) ( -636 -964 -360 ) subway/bars2 16 0 0 0.500000 0.500000 134217728 16779264 0 +( -636 -960 -392 ) ( -636 -1152 -328 ) ( -628 -1152 -328 ) subway/bars2 16 48 0 0.500000 0.500000 134217728 16779264 0 +( -628 -1148 -296 ) ( -628 -1148 -328 ) ( -636 -1148 -328 ) subway/bars2 16 0 0 0.500000 0.500000 134217728 16779264 0 +( -636 -1152 -304 ) ( -636 -960 -368 ) ( -628 -960 -368 ) subway/bars2 16 48 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1246 +{ +( -636 -1152 -300 ) ( -636 -960 -364 ) ( -628 -960 -364 ) subway/1_black 8 8 0 1 1 134217728 16777216 0 +( -628 -1152 -272 ) ( -628 -1152 -304 ) ( -636 -1152 -304 ) subway/1_black 8 0 0 1 1 134217728 16777216 0 +( -636 -960 -368 ) ( -636 -1152 -304 ) ( -628 -1152 -304 ) subway/1_black 8 8 0 1 1 134217728 16777216 0 +( -628 -960 -368 ) ( -628 -960 -336 ) ( -636 -960 -336 ) subway/1_black 8 0 0 1 1 134217728 16777216 0 +( -628 -1152 -304 ) ( -628 -1152 -272 ) ( -628 -1104 -272 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -636 -1104 -272 ) ( -636 -1152 -272 ) ( -636 -1152 -304 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +} +// brush 1247 +{ +( -268 -1512 -400 ) ( -268 -1576 -400 ) ( -204 -1576 -400 ) subway/metal_rust 16 48 0 0.500000 0.500000 0 16777216 0 +( -628 -1056 -360 ) ( -628 -1152 -328 ) ( -636 -1152 -328 ) subway/metal_rust 16 48 0 0.500000 0.500000 0 16777216 0 +( -628 -1408 -368 ) ( -628 -1344 -368 ) ( -628 -1344 -376 ) subway/metal_rust -48 -56 0 0.500000 0.500000 0 16777216 0 +( -332 -960 -368 ) ( -396 -960 -368 ) ( -396 -960 -376 ) subway/metal_rust 32 -8 0 0.500000 0.500000 0 16777216 0 +( -636 -1888 -360 ) ( -636 -1952 -360 ) ( -636 -1952 -368 ) subway/metal_rust -48 -56 0 0.500000 0.500000 0 16777216 0 +( -636 -1152 -368 ) ( -636 -1152 -328 ) ( -628 -1152 -328 ) subway/metal_rust 32 -8 0 0.500000 0.500000 0 16777216 0 +} +// brush 1248 +{ +( -330 -1064 -320 ) ( -340 -1064 -320 ) ( -340 -1064 -368 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -636 -1152 -304 ) ( -636 -960 -368 ) ( -628 -960 -368 ) subway/bars2 16 48 0 0.500000 0.500000 134217728 16779264 0 +( -628 -1148 -296 ) ( -628 -1148 -328 ) ( -636 -1148 -328 ) subway/bars2 16 0 0 0.500000 0.500000 134217728 16779264 0 +( -636 -960 -392 ) ( -636 -1152 -328 ) ( -628 -1152 -328 ) subway/bars2 16 48 0 0.500000 0.500000 134217728 16779264 0 +( -628 -964 -392 ) ( -628 -964 -360 ) ( -636 -964 -360 ) subway/bars2 16 0 0 0.500000 0.500000 134217728 16779264 0 +( -630 -1152 -328 ) ( -630 -1152 -296 ) ( -630 -1104 -296 ) subway/bars2 -48 0 0 0.500000 0.500000 134217728 16779264 0 +( -634 -1104 -296 ) ( -634 -1152 -296 ) ( -634 -1152 -328 ) subway/bars2 -48 0 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 1249 +{ +( -630 -1060 -328 ) ( -630 -1060 -364 ) ( -630 -1064 -364 ) subway/metal_rust -48 -40 0 0.500000 0.500000 134217728 16777216 0 +( -634 -1064 -364 ) ( -634 -1060 -364 ) ( -634 -1060 -328 ) subway/metal_rust -48 -40 0 0.500000 0.500000 134217728 16777216 0 +( -636 -1064 -360 ) ( -636 -1064 -324 ) ( -628 -1064 -324 ) subway/metal_rust 16 -40 0 0.500000 0.500000 134217728 16777216 0 +( -636 -1064 -332 ) ( -636 -1060 -332 ) ( -628 -1060 -332 ) subway/metal_rust 16 8 0 0.500000 0.500000 134217728 16777216 0 +( -636 -1060 -328 ) ( -636 -1060 -364 ) ( -628 -1060 -364 ) subway/metal_rust 16 -40 0 0.500000 0.500000 134217728 16777216 0 +( -636 -1060 -360 ) ( -636 -1064 -360 ) ( -628 -1064 -360 ) subway/metal_rust 16 8 0 0.500000 0.500000 134217728 16777216 0 +( -908 -1080 -352 ) ( -908 -1056 -360 ) ( -918 -1056 -360 ) subway/metal_rust 16 8 0 0.500000 0.500000 134217728 16777216 0 +( -908 -1056 -336 ) ( -908 -1104 -320 ) ( -918 -1104 -320 ) subway/metal_rust 16 8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1250 +{ +( -330 -1128 -336 ) ( -340 -1128 -336 ) ( -340 -1152 -328 ) subway/metal_rust 16 48 0 0.500000 0.500000 134217728 16777216 0 +( -330 -1152 -304 ) ( -340 -1152 -304 ) ( -340 -1128 -312 ) subway/metal_rust 16 48 0 0.500000 0.500000 134217728 16777216 0 +( -636 -1148 -300 ) ( -628 -1148 -300 ) ( -628 -1152 -300 ) subway/metal_rust 16 48 0 0.500000 0.500000 134217728 16777216 0 +( -636 -1152 -304 ) ( -628 -1152 -304 ) ( -628 -1152 -328 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -636 -1152 -332 ) ( -628 -1152 -332 ) ( -628 -1148 -332 ) subway/metal_rust 16 48 0 0.500000 0.500000 134217728 16777216 0 +( -636 -1148 -328 ) ( -628 -1148 -328 ) ( -628 -1148 -304 ) subway/metal_rust 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -630 -1152 -328 ) ( -630 -1152 -304 ) ( -630 -1148 -304 ) subway/metal_rust -48 0 0 0.500000 0.500000 134217728 16777216 0 +( -634 -1148 -304 ) ( -634 -1152 -304 ) ( -634 -1152 -328 ) subway/metal_rust -48 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1251 +{ +( -288 -984 -364 ) ( -288 -988 -364 ) ( -288 -988 -396 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -280 -988 -396 ) ( -280 -988 -364 ) ( -280 -984 -364 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -288 -984 -396 ) ( -280 -984 -396 ) ( -280 -984 -364 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -288 -988 -396 ) ( -280 -988 -396 ) ( -280 -984 -396 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -288 -988 -364 ) ( -280 -988 -364 ) ( -280 -988 -396 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -288 -984 -364 ) ( -280 -984 -364 ) ( -280 -988 -364 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 18 -1008 -360 ) ( 8 -1008 -360 ) ( 8 -984 -368 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 18 -984 -392 ) ( 8 -984 -392 ) ( 8 -1008 -384 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1252 +{ +( -288 -1176 -304 ) ( -288 -984 -368 ) ( -280 -984 -368 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -280 -1172 -296 ) ( -280 -1172 -328 ) ( -288 -1172 -328 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -288 -984 -392 ) ( -288 -1176 -328 ) ( -280 -1176 -328 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -280 -988 -392 ) ( -280 -988 -360 ) ( -288 -988 -360 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -282 -1176 -328 ) ( -282 -1176 -296 ) ( -282 -1128 -296 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -286 -1128 -296 ) ( -286 -1176 -296 ) ( -286 -1176 -328 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 18 -1084 -372 ) ( 8 -1084 -372 ) ( 8 -1084 -332 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1253 +{ +( -288 -1128 -272 ) ( -288 -1176 -272 ) ( -288 -1176 -304 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -280 -1176 -304 ) ( -280 -1176 -272 ) ( -280 -1128 -272 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -280 -984 -368 ) ( -280 -984 -336 ) ( -288 -984 -336 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -288 -984 -368 ) ( -288 -1176 -304 ) ( -280 -1176 -304 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -280 -1176 -272 ) ( -280 -1176 -304 ) ( -288 -1176 -304 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -288 -1176 -300 ) ( -288 -984 -364 ) ( -280 -984 -364 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 1254 +{ +( -288 -1176 -368 ) ( -288 -1176 -328 ) ( -280 -1176 -328 ) subway/metal_rust 808 -200 0 0.500000 0.500000 0 16777216 0 +( -288 -1912 -360 ) ( -288 -1976 -360 ) ( -288 -1976 -368 ) subway/metal_rust 256 -248 0 0.500000 0.500000 0 16777216 0 +( 16 -984 -368 ) ( -48 -984 -368 ) ( -48 -984 -376 ) subway/metal_rust 808 -200 0 0.500000 0.500000 0 16777216 0 +( -280 -1432 -368 ) ( -280 -1368 -368 ) ( -280 -1368 -376 ) subway/metal_rust 256 -248 0 0.500000 0.500000 0 16777216 0 +( -280 -1080 -360 ) ( -280 -1176 -328 ) ( -288 -1176 -328 ) subway/metal_rust 856 -704 0 0.500000 0.500000 0 16777216 0 +( 80 -1536 -400 ) ( 80 -1600 -400 ) ( 144 -1600 -400 ) subway/metal_rust 856 -704 0 0.500000 0.500000 0 16777216 0 +} +// brush 1255 +{ +( -286 -1128 -296 ) ( -286 -1176 -296 ) ( -286 -1176 -328 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -282 -1176 -328 ) ( -282 -1176 -296 ) ( -282 -1128 -296 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -280 -988 -392 ) ( -280 -988 -360 ) ( -288 -988 -360 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -288 -984 -392 ) ( -288 -1176 -328 ) ( -280 -1176 -328 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -280 -1172 -296 ) ( -280 -1172 -328 ) ( -288 -1172 -328 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -288 -1176 -304 ) ( -288 -984 -368 ) ( -280 -984 -368 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 18 -1088 -320 ) ( 8 -1088 -320 ) ( 8 -1088 -368 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1256 +{ +( -560 -1080 -336 ) ( -560 -1128 -320 ) ( -570 -1128 -320 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -560 -1104 -352 ) ( -560 -1080 -360 ) ( -570 -1080 -360 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -288 -1084 -360 ) ( -288 -1088 -360 ) ( -280 -1088 -360 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -288 -1084 -328 ) ( -288 -1084 -364 ) ( -280 -1084 -364 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -288 -1088 -332 ) ( -288 -1084 -332 ) ( -280 -1084 -332 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -288 -1088 -360 ) ( -288 -1088 -324 ) ( -280 -1088 -324 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -286 -1088 -364 ) ( -286 -1084 -364 ) ( -286 -1084 -328 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -282 -1084 -328 ) ( -282 -1084 -364 ) ( -282 -1088 -364 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1257 +{ +( -286 -1172 -304 ) ( -286 -1176 -304 ) ( -286 -1176 -328 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -282 -1176 -328 ) ( -282 -1176 -304 ) ( -282 -1172 -304 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -288 -1172 -328 ) ( -280 -1172 -328 ) ( -280 -1172 -304 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -288 -1176 -332 ) ( -280 -1176 -332 ) ( -280 -1172 -332 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -288 -1176 -304 ) ( -280 -1176 -304 ) ( -280 -1176 -328 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -288 -1172 -300 ) ( -280 -1172 -300 ) ( -280 -1176 -300 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 18 -1176 -304 ) ( 8 -1176 -304 ) ( 8 -1152 -312 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 18 -1152 -336 ) ( 8 -1152 -336 ) ( 8 -1176 -328 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1258 +{ +( 1296 840 -120 ) ( 1232 840 -120 ) ( 1232 776 -120 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1232 776 -112 ) ( 1232 840 -112 ) ( 1296 840 -112 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1232 712 -88 ) ( 1296 712 -88 ) ( 1296 712 -120 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1464 776 -88 ) ( 1464 840 -88 ) ( 1464 840 -120 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1296 848 -88 ) ( 1232 848 -88 ) ( 1232 848 -120 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1320 832 -88 ) ( 1320 768 -88 ) ( 1320 768 -120 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1259 +{ +( 1516 712 -216 ) ( 1544 712 -216 ) ( 1544 720 -216 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1544 720 -200 ) ( 1544 712 -200 ) ( 1516 712 -200 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1328 720 -200 ) ( 1328 720 -216 ) ( 1544 720 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1320 712 -200 ) ( 1320 712 -216 ) ( 1328 720 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1200 712 -216 ) ( 1200 712 -200 ) ( 1424 712 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1464 704 -124 ) ( 1464 712 -124 ) ( 1464 712 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +} +// brush 1260 +{ +( 1464 704 -108 ) ( 1464 712 -108 ) ( 1464 712 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1200 712 -200 ) ( 1200 712 -168 ) ( 1424 712 -168 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1320 712 -168 ) ( 1320 712 -200 ) ( 1328 720 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1328 720 -168 ) ( 1328 720 -200 ) ( 1544 720 -200 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1544 720 -168 ) ( 1544 712 -168 ) ( 1516 712 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1516 712 -200 ) ( 1544 712 -200 ) ( 1544 720 -200 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +} +// brush 1261 +{ +( 1516 712 -128 ) ( 1544 712 -128 ) ( 1544 720 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1544 720 -120 ) ( 1544 712 -120 ) ( 1516 712 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1328 720 -120 ) ( 1328 720 -128 ) ( 1544 720 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1320 712 -120 ) ( 1320 712 -128 ) ( 1328 720 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1456 712 -120 ) ( 1456 712 -128 ) ( 1320 712 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1456 712 -128 ) ( 1456 712 -120 ) ( 1464 720 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 1262 +{ +( 1464 704 -76 ) ( 1464 712 -76 ) ( 1464 712 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1200 712 -168 ) ( 1200 712 -128 ) ( 1424 712 -128 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1320 712 -128 ) ( 1320 712 -168 ) ( 1328 720 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1328 720 -128 ) ( 1328 720 -168 ) ( 1544 720 -168 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1544 720 -128 ) ( 1544 712 -128 ) ( 1516 712 -128 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1516 712 -168 ) ( 1544 712 -168 ) ( 1544 720 -168 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +} +// brush 1263 +{ +( 1424 808 -128 ) ( 1424 808 -120 ) ( 1416 800 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1456 808 -128 ) ( 1456 808 -120 ) ( 1424 808 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1464 800 -128 ) ( 1464 800 -120 ) ( 1456 808 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1464 800 -120 ) ( 1464 800 -128 ) ( 1416 800 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1416 800 -120 ) ( 1416 808 -120 ) ( 1444 808 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1444 808 -128 ) ( 1416 808 -128 ) ( 1416 800 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 1264 +{ +( 1444 808 -168 ) ( 1416 808 -168 ) ( 1416 800 -168 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1416 800 -128 ) ( 1416 808 -128 ) ( 1444 808 -128 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1464 800 -128 ) ( 1464 800 -168 ) ( 1416 800 -168 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1456 808 -128 ) ( 1456 808 -168 ) ( 1464 800 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1456 808 -168 ) ( 1456 808 -128 ) ( 1424 808 -128 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1424 808 -168 ) ( 1424 808 -128 ) ( 1416 800 -128 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +} +// brush 1265 +{ +( 1444 808 -200 ) ( 1416 808 -200 ) ( 1416 800 -200 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1416 800 -168 ) ( 1416 808 -168 ) ( 1444 808 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1464 800 -168 ) ( 1464 800 -200 ) ( 1416 800 -200 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1456 808 -168 ) ( 1456 808 -200 ) ( 1464 800 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1456 808 -200 ) ( 1456 808 -168 ) ( 1424 808 -168 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1424 808 -200 ) ( 1424 808 -168 ) ( 1416 800 -168 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +} +// brush 1266 +{ +( 1424 808 -216 ) ( 1424 808 -200 ) ( 1416 800 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1456 808 -216 ) ( 1456 808 -200 ) ( 1424 808 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1456 808 -200 ) ( 1456 808 -216 ) ( 1464 800 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1464 800 -200 ) ( 1464 800 -216 ) ( 1416 800 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1416 800 -200 ) ( 1416 808 -200 ) ( 1444 808 -200 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1444 808 -216 ) ( 1416 808 -216 ) ( 1416 800 -216 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +} +// brush 1267 +{ +( 1360 752 -224 ) ( 1360 752 -216 ) ( 1328 720 -216 ) subway/1_bathroom_floor_edge -32 0 0 0.500000 -0.500000 0 285212672 0 +( 1360 752 -216 ) ( 1360 752 -224 ) ( 1496 752 -224 ) subway/1_bathroom_floor_edge 32 0 0 0.500000 -0.500000 0 285212672 0 +( 1496 752 -216 ) ( 1496 752 -224 ) ( 1464 720 -224 ) subway/1_bathroom_floor_edge -32 0 0 0.500000 -0.500000 0 285212672 0 +( 1376 720 -216 ) ( 1376 720 -224 ) ( 1328 720 -224 ) subway/1_bathroom_floor_edge 32 0 0 0.500000 -0.500000 0 285212672 0 +( 1232 808 -216 ) ( 1232 872 -216 ) ( 1296 872 -216 ) subway/1_bathroom_floor_edge 32 -32 0 0.500000 -0.500000 0 285212672 0 +( 1296 872 -224 ) ( 1232 872 -224 ) ( 1232 808 -224 ) subway/1_bathroom_floor_edge 32 -32 0 0.500000 -0.500000 0 285212672 0 +} +// brush 1268 +{ +( 1264 840 -224 ) ( 1200 840 -224 ) ( 1200 776 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1200 776 -216 ) ( 1200 840 -216 ) ( 1264 840 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1200 752 -192 ) ( 1264 752 -192 ) ( 1264 752 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1496 776 -192 ) ( 1496 840 -192 ) ( 1496 840 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1272 768 -192 ) ( 1208 768 -192 ) ( 1208 768 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1384 832 -192 ) ( 1384 768 -192 ) ( 1384 768 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1269 +{ +( 1384 768 -216 ) ( 1384 768 -224 ) ( 1416 800 -224 ) subway/1_bathroom_floor_edge -16 48 0 0.500000 0.500000 0 285212672 0 +( 1384 768 -224 ) ( 1384 768 -216 ) ( 1496 768 -216 ) subway/1_bathroom_floor_edge 32 48 0 0.500000 0.500000 0 285212672 0 +( 1496 768 -224 ) ( 1496 768 -216 ) ( 1464 800 -216 ) subway/1_bathroom_floor_edge -16 48 0 0.500000 0.500000 0 285212672 0 +( 1464 800 -224 ) ( 1464 800 -216 ) ( 1416 800 -216 ) subway/1_bathroom_floor_edge 32 48 0 0.500000 0.500000 0 285212672 0 +( 1328 648 -216 ) ( 1264 648 -216 ) ( 1264 712 -216 ) subway/1_bathroom_floor_edge 32 0 0 0.500000 0.500000 0 285212672 0 +( 1264 712 -224 ) ( 1264 648 -224 ) ( 1328 648 -224 ) subway/1_bathroom_floor_edge 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1270 +{ +( 1416 772 -120 ) ( 1416 740 -120 ) ( 1416 740 -128 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1464 764 -120 ) ( 1416 764 -120 ) ( 1416 764 -128 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1460 740 -120 ) ( 1460 772 -120 ) ( 1460 772 -128 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1416 748 -120 ) ( 1464 748 -120 ) ( 1464 748 -128 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1416 740 -120 ) ( 1416 772 -120 ) ( 1464 772 -120 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1448 772 -124 ) ( 1400 772 -124 ) ( 1400 740 -124 ) subway/light_tube -16 24 0 0.500000 0.500000 134217728 1 3500 +} +// brush 1271 +{ +( 1200 848 -108 ) ( 1200 840 -108 ) ( 1200 840 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1328 848 -200 ) ( 1328 848 -168 ) ( 1200 848 -168 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1328 848 -168 ) ( 1328 848 -200 ) ( 1320 840 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1320 840 -168 ) ( 1320 840 -200 ) ( 1200 840 -200 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1200 840 -168 ) ( 1200 848 -168 ) ( 1228 848 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1228 848 -200 ) ( 1200 848 -200 ) ( 1200 840 -200 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +} +// brush 1272 +{ +( 1228 848 -216 ) ( 1200 848 -216 ) ( 1200 840 -216 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1200 840 -200 ) ( 1200 848 -200 ) ( 1228 848 -200 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1320 840 -200 ) ( 1320 840 -216 ) ( 1200 840 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1328 848 -200 ) ( 1328 848 -216 ) ( 1320 840 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1328 848 -216 ) ( 1328 848 -200 ) ( 1200 848 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1200 848 -124 ) ( 1200 840 -124 ) ( 1200 840 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +} +// brush 1273 +{ +( 1200 848 -76 ) ( 1200 840 -76 ) ( 1200 840 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1328 848 -168 ) ( 1328 848 -128 ) ( 1200 848 -128 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1328 848 -128 ) ( 1328 848 -168 ) ( 1320 840 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1320 840 -128 ) ( 1320 840 -168 ) ( 1200 840 -168 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1200 840 -128 ) ( 1200 848 -128 ) ( 1228 848 -128 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1228 848 -168 ) ( 1200 848 -168 ) ( 1200 840 -168 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +} +// brush 1274 +{ +( 1228 848 -128 ) ( 1200 848 -128 ) ( 1200 840 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1200 840 -120 ) ( 1200 848 -120 ) ( 1228 848 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1320 840 -120 ) ( 1320 840 -128 ) ( 1200 840 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1328 848 -120 ) ( 1328 848 -128 ) ( 1320 840 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1328 848 -128 ) ( 1328 848 -120 ) ( 1200 848 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1200 848 -60 ) ( 1200 840 -60 ) ( 1200 840 -152 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 1275 +{ +( 1320 712 -168 ) ( 1320 712 -128 ) ( 1328 720 -128 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1320 712 -128 ) ( 1320 712 -168 ) ( 1320 840 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1320 840 -128 ) ( 1320 840 -168 ) ( 1328 848 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1328 884 -52 ) ( 1328 912 -52 ) ( 1328 912 -144 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1328 720 -128 ) ( 1320 720 -128 ) ( 1320 748 -128 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1320 748 -168 ) ( 1320 720 -168 ) ( 1328 720 -168 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +} +// brush 1276 +{ +( 1320 748 -128 ) ( 1320 720 -128 ) ( 1328 720 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1328 720 -120 ) ( 1320 720 -120 ) ( 1320 748 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1328 884 -44 ) ( 1328 912 -44 ) ( 1328 912 -136 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1320 840 -120 ) ( 1320 840 -128 ) ( 1328 848 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1320 712 -120 ) ( 1320 712 -128 ) ( 1320 840 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1320 712 -128 ) ( 1320 712 -120 ) ( 1328 720 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 1277 +{ +( 1320 712 -200 ) ( 1320 712 -168 ) ( 1328 720 -168 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1320 712 -168 ) ( 1320 712 -200 ) ( 1320 840 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1320 840 -168 ) ( 1320 840 -200 ) ( 1328 848 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1328 884 -92 ) ( 1328 912 -92 ) ( 1328 912 -184 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1328 720 -168 ) ( 1320 720 -168 ) ( 1320 748 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1320 748 -200 ) ( 1320 720 -200 ) ( 1328 720 -200 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +} +// brush 1278 +{ +( 1320 748 -216 ) ( 1320 720 -216 ) ( 1328 720 -216 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1328 720 -200 ) ( 1320 720 -200 ) ( 1320 748 -200 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1328 884 -124 ) ( 1328 912 -124 ) ( 1328 912 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1320 840 -200 ) ( 1320 840 -216 ) ( 1328 848 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1320 712 -200 ) ( 1320 712 -216 ) ( 1320 840 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1320 712 -216 ) ( 1320 712 -200 ) ( 1328 720 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +} +// brush 1279 +{ +( 1360 864 -192 ) ( 1360 800 -192 ) ( 1360 800 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1272 816 -192 ) ( 1208 816 -192 ) ( 1208 816 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1384 792 -192 ) ( 1384 856 -192 ) ( 1384 856 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1088 752 -192 ) ( 1152 752 -192 ) ( 1152 752 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1200 792 -216 ) ( 1200 856 -216 ) ( 1264 856 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1264 856 -224 ) ( 1200 856 -224 ) ( 1200 792 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1280 +{ +( 1228 928 -128 ) ( 1200 928 -128 ) ( 1200 920 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1200 920 -120 ) ( 1200 928 -120 ) ( 1228 928 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1416 920 -120 ) ( 1416 920 -128 ) ( 1200 920 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1424 928 -120 ) ( 1424 928 -128 ) ( 1416 920 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1424 928 -128 ) ( 1424 928 -120 ) ( 1200 928 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1200 928 -60 ) ( 1200 920 -60 ) ( 1200 920 -152 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 1281 +{ +( 1200 928 -76 ) ( 1200 920 -76 ) ( 1200 920 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1424 928 -168 ) ( 1424 928 -128 ) ( 1200 928 -128 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1424 928 -128 ) ( 1424 928 -168 ) ( 1416 920 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1416 920 -128 ) ( 1416 920 -168 ) ( 1200 920 -168 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1200 920 -128 ) ( 1200 928 -128 ) ( 1228 928 -128 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1228 928 -168 ) ( 1200 928 -168 ) ( 1200 920 -168 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +} +// brush 1282 +{ +( 1228 928 -216 ) ( 1200 928 -216 ) ( 1200 920 -216 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1200 920 -200 ) ( 1200 928 -200 ) ( 1228 928 -200 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1416 920 -200 ) ( 1416 920 -216 ) ( 1200 920 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1424 928 -200 ) ( 1424 928 -216 ) ( 1416 920 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1424 928 -216 ) ( 1424 928 -200 ) ( 1200 928 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1200 928 -124 ) ( 1200 920 -124 ) ( 1200 920 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +} +// brush 1283 +{ +( 1200 928 -108 ) ( 1200 920 -108 ) ( 1200 920 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1424 928 -200 ) ( 1424 928 -168 ) ( 1200 928 -168 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1424 928 -168 ) ( 1424 928 -200 ) ( 1416 920 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1416 920 -168 ) ( 1416 920 -200 ) ( 1200 920 -200 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1200 920 -168 ) ( 1200 928 -168 ) ( 1228 928 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1228 928 -200 ) ( 1200 928 -200 ) ( 1200 920 -200 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +} +// brush 1284 +{ +( 1416 828 -128 ) ( 1416 800 -128 ) ( 1424 800 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1424 800 -120 ) ( 1416 800 -120 ) ( 1416 828 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1424 808 -128 ) ( 1424 808 -120 ) ( 1424 928 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1416 920 -120 ) ( 1416 920 -128 ) ( 1424 928 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1416 920 -128 ) ( 1416 920 -120 ) ( 1416 800 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1424 808 -120 ) ( 1424 808 -128 ) ( 1416 800 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 1285 +{ +( 1424 808 -128 ) ( 1424 808 -168 ) ( 1416 800 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1416 920 -168 ) ( 1416 920 -128 ) ( 1416 800 -128 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1416 920 -128 ) ( 1416 920 -168 ) ( 1424 928 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1424 808 -168 ) ( 1424 808 -128 ) ( 1424 928 -128 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1424 800 -128 ) ( 1416 800 -128 ) ( 1416 828 -128 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1416 828 -168 ) ( 1416 800 -168 ) ( 1424 800 -168 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +} +// brush 1286 +{ +( 1416 828 -216 ) ( 1416 800 -216 ) ( 1424 800 -216 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1424 800 -200 ) ( 1416 800 -200 ) ( 1416 828 -200 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1424 808 -216 ) ( 1424 808 -200 ) ( 1424 928 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1416 920 -200 ) ( 1416 920 -216 ) ( 1424 928 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1416 920 -216 ) ( 1416 920 -200 ) ( 1416 800 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1424 808 -200 ) ( 1424 808 -216 ) ( 1416 800 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +} +// brush 1287 +{ +( 1192 960 -224 ) ( 1128 960 -224 ) ( 1128 896 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1128 896 -216 ) ( 1128 960 -216 ) ( 1192 960 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1128 896 -192 ) ( 1192 896 -192 ) ( 1192 896 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1288 896 -192 ) ( 1288 960 -192 ) ( 1288 960 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1160 920 -192 ) ( 1096 920 -192 ) ( 1096 920 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1256 952 -192 ) ( 1256 888 -192 ) ( 1256 888 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1288 +{ +( 1272 912 -120 ) ( 1208 912 -120 ) ( 1208 848 -120 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1208 848 -112 ) ( 1208 912 -112 ) ( 1272 912 -112 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1208 848 -88 ) ( 1272 848 -88 ) ( 1272 848 -120 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1416 848 -88 ) ( 1416 912 -88 ) ( 1416 912 -120 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1272 920 -88 ) ( 1208 920 -88 ) ( 1208 920 -120 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1200 912 -88 ) ( 1200 848 -88 ) ( 1200 848 -120 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1289 +{ +( 1272 968 -224 ) ( 1208 968 -224 ) ( 1208 904 -224 ) subway/1_bathroom_floor_edge 16 32 0 0.500000 0.500000 0 285212672 0 +( 1208 904 -216 ) ( 1208 968 -216 ) ( 1272 968 -216 ) subway/1_bathroom_floor_edge 16 32 0 0.500000 0.500000 0 285212672 0 +( 1360 816 -216 ) ( 1408 816 -216 ) ( 1408 816 -224 ) subway/1_bathroom_floor_edge 16 48 0 0.500000 0.500000 0 285212672 0 +( 1384 816 -216 ) ( 1416 848 -216 ) ( 1416 848 -224 ) subway/1_bathroom_floor_edge -48 48 0 0.500000 0.500000 0 285212672 0 +( 1440 848 -216 ) ( 1328 848 -216 ) ( 1328 848 -224 ) subway/1_bathroom_floor_edge 16 48 0 0.500000 0.500000 0 285212672 0 +( 1360 816 -224 ) ( 1328 848 -224 ) ( 1328 848 -216 ) subway/1_bathroom_floor_edge -48 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 1290 +{ +( 1128 920 -224 ) ( 1064 920 -224 ) ( 1064 856 -224 ) subway/1_bathroom_floor_edge 0 -47 90 0.500000 -0.500000 0 285212672 0 +( 1064 856 -216 ) ( 1064 920 -216 ) ( 1128 920 -216 ) subway/1_bathroom_floor_edge 0 -47 90 0.500000 -0.500000 0 285212672 0 +( 1416 800 -216 ) ( 1416 800 -224 ) ( 1384 768 -224 ) subway/1_bathroom_floor_edge 0 0 90 0.500000 -0.500000 0 285212672 0 +( 1416 800 -224 ) ( 1416 800 -216 ) ( 1416 848 -216 ) subway/1_bathroom_floor_edge 0 0 90 0.500000 -0.500000 0 285212672 0 +( 1416 848 -224 ) ( 1416 848 -216 ) ( 1384 816 -216 ) subway/1_bathroom_floor_edge 0 0 90 0.500000 -0.500000 0 285212672 0 +( 1384 1024 -224 ) ( 1384 1024 -216 ) ( 1384 768 -216 ) subway/1_bathroom_floor_edge 0 0 90 0.500000 -0.500000 0 285212672 0 +} +// brush 1291 +{ +( 1200 760 -224 ) ( 1136 760 -224 ) ( 1136 696 -224 ) subway/1_bathroom_floor_edge 0 31 90 0.500000 0.500000 0 285212672 0 +( 1136 696 -216 ) ( 1136 760 -216 ) ( 1200 760 -216 ) subway/1_bathroom_floor_edge 0 31 90 0.500000 0.500000 0 285212672 0 +( 1360 752 -216 ) ( 1360 752 -224 ) ( 1328 720 -224 ) subway/1_bathroom_floor_edge 0 -48 90 0.500000 0.500000 0 285212672 0 +( 1360 552 -224 ) ( 1360 552 -216 ) ( 1360 816 -216 ) subway/1_bathroom_floor_edge 0 -48 90 0.500000 0.500000 0 285212672 0 +( 1360 816 -224 ) ( 1360 816 -216 ) ( 1328 848 -216 ) subway/1_bathroom_floor_edge 0 -48 90 0.500000 0.500000 0 285212672 0 +( 1328 720 -216 ) ( 1328 720 -224 ) ( 1328 1048 -224 ) subway/1_bathroom_floor_edge 0 -48 90 0.500000 0.500000 0 285212672 0 +} +// brush 1292 +{ +( 1192 912 -192 ) ( 1192 848 -192 ) ( 1192 848 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1176 920 -192 ) ( 1112 920 -192 ) ( 1112 920 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1256 848 -192 ) ( 1256 912 -192 ) ( 1256 912 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1080 848 -192 ) ( 1144 848 -192 ) ( 1144 848 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1112 848 -216 ) ( 1112 912 -216 ) ( 1176 912 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1176 912 -224 ) ( 1112 912 -224 ) ( 1112 848 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1293 +{ +( 1256 904 -192 ) ( 1256 840 -192 ) ( 1256 840 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1160 864 -192 ) ( 1096 864 -192 ) ( 1096 864 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1288 848 -192 ) ( 1288 912 -192 ) ( 1288 912 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1128 848 -192 ) ( 1192 848 -192 ) ( 1192 848 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1128 848 -216 ) ( 1128 912 -216 ) ( 1192 912 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1192 912 -224 ) ( 1128 912 -224 ) ( 1128 848 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1294 +{ +( 1264 912 -224 ) ( 1200 912 -224 ) ( 1200 848 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1200 848 -216 ) ( 1200 912 -216 ) ( 1264 912 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1168 848 -192 ) ( 1232 848 -192 ) ( 1232 848 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1424 848 -192 ) ( 1424 912 -192 ) ( 1424 912 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1264 920 -192 ) ( 1200 920 -192 ) ( 1200 920 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1288 912 -192 ) ( 1288 848 -192 ) ( 1288 848 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1295 +{ +( 1284 900 -124 ) ( 1236 900 -124 ) ( 1236 868 -124 ) subway/light_tube 56 24 0 0.500000 0.500000 134217728 1 3500 +( 1252 868 -120 ) ( 1252 900 -120 ) ( 1300 900 -120 ) subway/1_black 8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1252 876 -120 ) ( 1300 876 -120 ) ( 1300 876 -128 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1296 868 -120 ) ( 1296 900 -120 ) ( 1296 900 -128 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1300 892 -120 ) ( 1252 892 -120 ) ( 1252 892 -128 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1252 900 -120 ) ( 1252 868 -120 ) ( 1252 868 -128 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1296 +{ +( 1416 828 -200 ) ( 1416 800 -200 ) ( 1424 800 -200 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1424 800 -168 ) ( 1416 800 -168 ) ( 1416 828 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1424 880 -168 ) ( 1424 880 -200 ) ( 1424 832 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1424 872 -200 ) ( 1424 872 -168 ) ( 1416 872 -168 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1416 920 -200 ) ( 1416 920 -168 ) ( 1416 800 -168 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1424 808 -168 ) ( 1424 808 -200 ) ( 1416 800 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +} +// brush 1297 +{ +( 1416 908 -200 ) ( 1416 880 -200 ) ( 1424 880 -200 ) subway/1_bathroom_women_graf1 0 0 0 -0.500000 0.500000 0 0 0 +( 1424 880 -168 ) ( 1416 880 -168 ) ( 1416 908 -168 ) subway/1_bathroom_women_graf1 0 0 0 -0.500000 0.500000 0 0 0 +( 1424 928 -168 ) ( 1424 928 -200 ) ( 1424 904 -200 ) subway/1_bathroom_women_graf1 16 -16 0 -0.500000 0.500000 0 0 0 +( 1424 928 -200 ) ( 1424 928 -168 ) ( 1416 920 -168 ) subway/1_bathroom_women_graf1 32 -16 0 -0.500000 0.500000 0 0 0 +( 1416 1000 -200 ) ( 1416 1000 -168 ) ( 1416 880 -168 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1424 904 -168 ) ( 1424 904 -200 ) ( 1416 904 -200 ) subway/1_bathroom_women_graf1 0 -16 0 -0.500000 0.500000 0 0 0 +} +// brush 1298 +{ +( 1424 872 -168 ) ( 1424 872 -200 ) ( 1416 872 -200 ) subway/1_bathroom_women_graf1 0 -16 0 -0.500000 0.500000 0 0 0 +( 1416 968 -200 ) ( 1416 968 -168 ) ( 1416 848 -168 ) subway/1_bathroom_women_graf1 16 -16 0 -0.500000 0.500000 0 0 0 +( 1424 904 -200 ) ( 1424 904 -168 ) ( 1416 904 -168 ) subway/1_bathroom_women_graf1 0 -16 0 -0.500000 0.500000 0 0 0 +( 1424 848 -200 ) ( 1424 848 -168 ) ( 1424 904 -168 ) subway/1_bathroom_women_graf1 16 -16 0 -0.500000 0.500000 0 0 0 +( 1424 848 -168 ) ( 1416 848 -168 ) ( 1416 876 -168 ) subway/1_bathroom_women_graf1 0 0 0 -0.500000 0.500000 0 0 0 +( 1416 876 -200 ) ( 1416 848 -200 ) ( 1424 848 -200 ) subway/1_bathroom_women_graf1 0 0 0 -0.500000 0.500000 0 0 0 +} +// brush 1299 +{ +( 1256 896 -216 ) ( 1256 864 -216 ) ( 1256 864 -224 ) subway/1_bathroom_floor_drain -16 0 0 0.500000 0.500000 0 285212672 0 +( 1304 896 -216 ) ( 1256 896 -216 ) ( 1256 896 -224 ) subway/1_bathroom_floor_drain 0 0 0 0.500000 0.500000 0 285212672 0 +( 1288 864 -216 ) ( 1288 896 -216 ) ( 1288 896 -224 ) subway/1_bathroom_floor_drain -16 0 0 0.500000 0.500000 0 285212672 0 +( 1256 864 -216 ) ( 1304 864 -216 ) ( 1304 864 -224 ) subway/1_bathroom_floor_drain 0 0 0 0.500000 0.500000 0 285212672 0 +( 1256 864 -216 ) ( 1256 896 -216 ) ( 1304 896 -216 ) subway/1_bathroom_floor_drain 48 0 0 0.500000 0.500000 0 285212672 0 +( 1304 896 -224 ) ( 1256 896 -224 ) ( 1256 864 -224 ) subway/1_bathroom_floor_drain 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 1300 +{ +( 1200 852 -216 ) ( 1204 848 -216 ) ( 1204 848 -120 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1200 852 -120 ) ( 1200 848 -120 ) ( 1200 848 -216 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1200 848 -120 ) ( 1204 848 -120 ) ( 1204 848 -216 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1204 848 -216 ) ( 1204 856 -216 ) ( 1200 856 -216 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +( 1200 856 -120 ) ( 1204 856 -120 ) ( 1204 848 -120 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +} +// brush 1301 +{ +( 1204 920 -120 ) ( 1204 920 -216 ) ( 1200 916 -216 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1200 920 -216 ) ( 1200 920 -120 ) ( 1200 916 -120 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1204 920 -216 ) ( 1204 920 -120 ) ( 1200 920 -120 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1200 912 -216 ) ( 1204 912 -216 ) ( 1204 920 -216 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +( 1204 920 -120 ) ( 1204 912 -120 ) ( 1200 912 -120 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +} +// brush 1302 +{ +( 1384 900 -124 ) ( 1336 900 -124 ) ( 1336 868 -124 ) subway/light_tube 136 24 0 0.500000 0.500000 134217728 1 3500 +( 1352 868 -120 ) ( 1352 900 -120 ) ( 1400 900 -120 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1352 876 -120 ) ( 1400 876 -120 ) ( 1400 876 -128 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1384 868 -120 ) ( 1384 900 -120 ) ( 1384 900 -128 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1400 892 -120 ) ( 1352 892 -120 ) ( 1352 892 -128 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1340 900 -120 ) ( 1340 868 -120 ) ( 1340 868 -128 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1303 +{ +( 1328 1204 -216 ) ( 1328 1232 -216 ) ( 1320 1232 -216 ) subway/1_bathroom_men_bottom 0 -16 0 0.500000 0.500000 0 369098752 0 +( 1320 1232 -200 ) ( 1328 1232 -200 ) ( 1328 1204 -200 ) subway/1_bathroom_men_bottom 0 -16 0 0.500000 0.500000 0 369098752 0 +( 1320 1104 -200 ) ( 1320 1104 -216 ) ( 1320 1168 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1320 1104 -216 ) ( 1320 1104 -200 ) ( 1328 1104 -200 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1328 1204 -124 ) ( 1328 1232 -124 ) ( 1328 1232 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1320 1168 -200 ) ( 1320 1168 -216 ) ( 1328 1176 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1304 +{ +( 1320 1168 -168 ) ( 1320 1168 -200 ) ( 1328 1176 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1328 1204 -108 ) ( 1328 1232 -108 ) ( 1328 1232 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1320 1104 -200 ) ( 1320 1104 -168 ) ( 1328 1104 -168 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1320 1104 -168 ) ( 1320 1104 -200 ) ( 1320 1168 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1320 1232 -168 ) ( 1328 1232 -168 ) ( 1328 1204 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1328 1204 -200 ) ( 1328 1232 -200 ) ( 1320 1232 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1305 +{ +( 1328 1204 -128 ) ( 1328 1232 -128 ) ( 1320 1232 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1320 1232 -120 ) ( 1328 1232 -120 ) ( 1328 1204 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1320 1104 -120 ) ( 1320 1104 -128 ) ( 1320 1168 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1320 1104 -128 ) ( 1320 1104 -120 ) ( 1328 1104 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1328 1204 -60 ) ( 1328 1232 -60 ) ( 1328 1232 -152 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1320 1168 -120 ) ( 1320 1168 -128 ) ( 1328 1176 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1306 +{ +( 1320 1168 -128 ) ( 1320 1168 -168 ) ( 1328 1176 -168 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1328 1204 -76 ) ( 1328 1232 -76 ) ( 1328 1232 -168 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1320 1104 -168 ) ( 1320 1104 -128 ) ( 1328 1104 -128 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 0 285212672 0 +( 1320 1104 -128 ) ( 1320 1104 -168 ) ( 1320 1168 -168 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1320 1232 -128 ) ( 1328 1232 -128 ) ( 1328 1204 -128 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1328 1204 -168 ) ( 1328 1232 -168 ) ( 1320 1232 -168 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1307 +{ +( 1196 1176 -224 ) ( 1168 1176 -224 ) ( 1168 1168 -224 ) subway/1_bathroom_floor_edge 31 31 90 0.500000 0.500000 0 285212672 0 +( 1168 1176 -216 ) ( 1168 1184 -216 ) ( 1196 1184 -216 ) subway/1_bathroom_floor_edge 31 31 90 0.500000 0.500000 0 285212672 0 +( 1360 1064 -216 ) ( 1360 1064 -224 ) ( 1328 1032 -224 ) subway/1_bathroom_floor_edge 0 0 90 0.500000 0.500000 0 285212672 0 +( 1360 1064 -224 ) ( 1360 1064 -216 ) ( 1360 1208 -216 ) subway/1_bathroom_floor_edge 0 0 90 0.500000 0.500000 0 285212672 0 +( 1328 1176 -216 ) ( 1328 1176 -224 ) ( 1360 1208 -224 ) subway/1_bathroom_floor_edge 0 0 90 0.500000 0.500000 0 285212672 0 +( 1328 1032 -216 ) ( 1328 1032 -224 ) ( 1328 1176 -224 ) subway/1_bathroom_floor_edge 0 0 90 0.500000 0.500000 0 285212672 0 +} +// brush 1308 +{ +( 1228 1176 -224 ) ( 1200 1176 -224 ) ( 1200 1168 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1200 1176 -216 ) ( 1200 1184 -216 ) ( 1228 1184 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1244 1064 -132 ) ( 1272 1064 -132 ) ( 1272 1064 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1384 1192 -132 ) ( 1384 1200 -132 ) ( 1384 1200 -224 ) subway/1_bathroom_floor 32 0 0 0.500000 0.500000 0 285212672 0 +( 1228 1208 -132 ) ( 1200 1208 -132 ) ( 1200 1208 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1360 1144 -132 ) ( 1360 1136 -132 ) ( 1360 1136 -224 ) subway/1_bathroom_floor 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1309 +{ +( 1576 1168 -224 ) ( 1576 1176 -224 ) ( 1548 1176 -224 ) subway/1_bathroom_floor_edge -24 -47 90 0.500000 -0.500000 0 285212672 0 +( 1548 1184 -216 ) ( 1576 1184 -216 ) ( 1576 1176 -216 ) subway/1_bathroom_floor_edge -16 -47 90 0.500000 -0.500000 0 285212672 0 +( 1384 1064 -224 ) ( 1384 1064 -216 ) ( 1416 1032 -216 ) subway/1_bathroom_floor_edge 8 -16 90 0.500000 -0.500000 0 285212672 0 +( 1384 1064 -216 ) ( 1384 1064 -224 ) ( 1384 1208 -224 ) subway/1_bathroom_floor_edge 8 -16 90 0.500000 -0.500000 0 285212672 0 +( 1384 1208 -224 ) ( 1416 1176 -224 ) ( 1416 1176 -216 ) subway/1_bathroom_floor_edge 8 -16 90 0.500000 -0.500000 0 285212672 0 +( 1416 1032 -224 ) ( 1416 1032 -216 ) ( 1416 1176 -216 ) subway/1_bathroom_floor_edge 8 -16 90 0.500000 -0.500000 0 285212672 0 +} +// brush 1310 +{ +( 1424 1168 -216 ) ( 1424 1168 -200 ) ( 1416 1176 -200 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1424 1168 -200 ) ( 1424 1168 -216 ) ( 1424 1024 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1416 1032 -216 ) ( 1416 1032 -200 ) ( 1424 1024 -200 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1416 1040 -200 ) ( 1416 1040 -216 ) ( 1416 1104 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1416 1160 -200 ) ( 1424 1160 -200 ) ( 1424 1132 -200 ) subway/1_bathroom_men_bottom 0 -16 0 0.500000 0.500000 0 369098752 0 +( 1424 1132 -216 ) ( 1424 1160 -216 ) ( 1416 1160 -216 ) subway/1_bathroom_men_bottom 0 -16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1311 +{ +( 1424 1168 -200 ) ( 1424 1168 -168 ) ( 1416 1176 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1424 1088 -200 ) ( 1424 1088 -168 ) ( 1424 1168 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1424 1088 -168 ) ( 1424 1088 -200 ) ( 1416 1088 -200 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1416 1040 -168 ) ( 1416 1040 -200 ) ( 1416 1104 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1416 1160 -168 ) ( 1424 1160 -168 ) ( 1424 1132 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1424 1132 -200 ) ( 1424 1160 -200 ) ( 1416 1160 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1312 +{ +( 1228 1176 -120 ) ( 1200 1176 -120 ) ( 1200 1168 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1200 1176 -112 ) ( 1200 1184 -112 ) ( 1228 1184 -112 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1244 1104 -28 ) ( 1272 1104 -28 ) ( 1272 1104 -120 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1416 1168 -28 ) ( 1416 1176 -28 ) ( 1416 1176 -120 ) subway/1_bathroom_floor 32 0 0 0.500000 0.500000 0 285212672 0 +( 1228 1176 -28 ) ( 1200 1176 -28 ) ( 1200 1176 -120 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1328 1176 -28 ) ( 1328 1168 -28 ) ( 1328 1168 -120 ) subway/1_bathroom_floor 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1313 +{ +( 1424 1176 -60 ) ( 1416 1176 -60 ) ( 1416 1176 -152 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1204 -60 ) ( 1424 1232 -60 ) ( 1424 1232 -152 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1416 1032 -128 ) ( 1416 1032 -120 ) ( 1424 1024 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1416 1040 -120 ) ( 1416 1040 -128 ) ( 1416 1104 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1416 1160 -120 ) ( 1424 1160 -120 ) ( 1424 1132 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1132 -128 ) ( 1424 1160 -128 ) ( 1416 1160 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1314 +{ +( 1424 1132 -168 ) ( 1424 1160 -168 ) ( 1416 1160 -168 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1416 1160 -128 ) ( 1424 1160 -128 ) ( 1424 1132 -128 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1416 1040 -128 ) ( 1416 1040 -168 ) ( 1416 1104 -168 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1416 1032 -168 ) ( 1416 1032 -128 ) ( 1424 1024 -128 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1168 -128 ) ( 1424 1168 -168 ) ( 1424 1024 -168 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1168 -168 ) ( 1424 1168 -128 ) ( 1416 1176 -128 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1315 +{ +( 1228 1104 -120 ) ( 1200 1104 -120 ) ( 1200 1096 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1200 1104 -112 ) ( 1200 1112 -112 ) ( 1228 1112 -112 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1244 1032 -28 ) ( 1272 1032 -28 ) ( 1272 1032 -120 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1416 1096 -28 ) ( 1416 1104 -28 ) ( 1416 1104 -120 ) subway/1_bathroom_floor 32 0 0 0.500000 0.500000 0 285212672 0 +( 1228 1104 -28 ) ( 1200 1104 -28 ) ( 1200 1104 -120 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1200 1104 -28 ) ( 1200 1096 -28 ) ( 1200 1096 -120 ) subway/1_bathroom_floor 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1316 +{ +( 1228 1032 -128 ) ( 1200 1032 -128 ) ( 1200 1024 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1200 1024 -120 ) ( 1200 1032 -120 ) ( 1228 1032 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1024 -120 ) ( 1424 1024 -128 ) ( 1200 1024 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1024 -128 ) ( 1424 1024 -120 ) ( 1416 1032 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1228 1032 -60 ) ( 1200 1032 -60 ) ( 1200 1032 -152 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1200 1032 -60 ) ( 1200 1024 -60 ) ( 1200 1024 -152 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1317 +{ +( 1200 1032 -108 ) ( 1200 1024 -108 ) ( 1200 1024 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1228 1032 -108 ) ( 1200 1032 -108 ) ( 1200 1032 -200 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1424 1024 -200 ) ( 1424 1024 -168 ) ( 1416 1032 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1424 1024 -168 ) ( 1424 1024 -200 ) ( 1200 1024 -200 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1200 1024 -168 ) ( 1200 1032 -168 ) ( 1228 1032 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1228 1032 -200 ) ( 1200 1032 -200 ) ( 1200 1024 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1318 +{ +( 1228 1032 -216 ) ( 1200 1032 -216 ) ( 1200 1024 -216 ) subway/1_bathroom_men_bottom 0 -16 0 0.500000 0.500000 0 369098752 0 +( 1200 1024 -200 ) ( 1200 1032 -200 ) ( 1228 1032 -200 ) subway/1_bathroom_men_bottom 0 -16 0 0.500000 0.500000 0 369098752 0 +( 1300 1024 -124 ) ( 1328 1024 -124 ) ( 1328 1024 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1416 1032 -200 ) ( 1416 1032 -216 ) ( 1424 1024 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1416 1032 -216 ) ( 1416 1032 -200 ) ( 1200 1032 -200 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1200 1032 -124 ) ( 1200 1024 -124 ) ( 1200 1024 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1319 +{ +( 1424 1052 -200 ) ( 1424 1080 -200 ) ( 1416 1080 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1416 1080 -168 ) ( 1424 1080 -168 ) ( 1424 1052 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1416 1032 -168 ) ( 1416 1032 -200 ) ( 1416 1056 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1416 1032 -200 ) ( 1416 1032 -168 ) ( 1424 1024 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1424 1072 -168 ) ( 1424 1072 -200 ) ( 1424 1024 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1424 1056 -200 ) ( 1424 1056 -168 ) ( 1416 1056 -168 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +} +// brush 1320 +{ +( 1248 1152 -132 ) ( 1248 1144 -132 ) ( 1248 1144 -224 ) subway/1_bathroom_floor 32 0 0 0.500000 0.500000 0 285212672 0 +( 1188 1104 -132 ) ( 1160 1104 -132 ) ( 1160 1104 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1280 1144 -132 ) ( 1280 1152 -132 ) ( 1280 1152 -224 ) subway/1_bathroom_floor 32 0 0 0.500000 0.500000 0 285212672 0 +( 1196 1080 -132 ) ( 1224 1080 -132 ) ( 1224 1080 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1152 1152 -216 ) ( 1152 1160 -216 ) ( 1180 1160 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1180 1152 -224 ) ( 1152 1152 -224 ) ( 1152 1144 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1321 +{ +( 1200 1032 -76 ) ( 1200 1024 -76 ) ( 1200 1024 -168 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1228 1032 -76 ) ( 1200 1032 -76 ) ( 1200 1032 -168 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1024 -168 ) ( 1424 1024 -128 ) ( 1416 1032 -128 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1024 -128 ) ( 1424 1024 -168 ) ( 1200 1024 -168 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 0 285212672 0 +( 1416 1032 -128 ) ( 1416 1024 -128 ) ( 1200 1024 -128 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1416 1024 -168 ) ( 1416 1032 -168 ) ( 1200 1032 -168 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1322 +{ +( 1360 1064 -224 ) ( 1360 1064 -216 ) ( 1328 1032 -216 ) subway/1_bathroom_floor_edge -16 16 0 0.500000 -0.500000 0 285212672 0 +( 1384 1064 -224 ) ( 1384 1064 -216 ) ( 1360 1064 -216 ) subway/1_bathroom_floor_edge 16 16 0 0.500000 -0.500000 0 285212672 0 +( 1384 1064 -216 ) ( 1384 1064 -224 ) ( 1416 1032 -224 ) subway/1_bathroom_floor_edge -16 16 0 0.500000 -0.500000 0 285212672 0 +( 1212 1032 -132 ) ( 1240 1032 -132 ) ( 1240 1032 -224 ) subway/1_bathroom_floor_edge 16 16 0 0.500000 -0.500000 0 285212672 0 +( 1168 1136 -216 ) ( 1168 1144 -216 ) ( 1196 1144 -216 ) subway/1_bathroom_floor_edge 16 -16 0 0.500000 -0.500000 0 285212672 0 +( 1196 1136 -224 ) ( 1168 1136 -224 ) ( 1168 1128 -224 ) subway/1_bathroom_floor_edge 16 -16 0 0.500000 -0.500000 0 285212672 0 +} +// brush 1323 +{ +( 1248 1096 -216 ) ( 1248 1048 -216 ) ( 1248 1048 -224 ) subway/1_bathroom_floor_drain 0 0 0 0.500000 0.500000 0 285212672 0 +( 1288 1080 -216 ) ( 1248 1080 -216 ) ( 1248 1080 -224 ) subway/1_bathroom_floor_drain 32 0 0 0.500000 0.500000 0 285212672 0 +( 1280 1048 -216 ) ( 1280 1096 -216 ) ( 1280 1096 -224 ) subway/1_bathroom_floor_drain 0 0 0 0.500000 0.500000 0 285212672 0 +( 1248 1048 -216 ) ( 1288 1048 -216 ) ( 1288 1048 -224 ) subway/1_bathroom_floor_drain 32 0 0 0.500000 0.500000 0 285212672 0 +( 1248 1048 -216 ) ( 1248 1096 -216 ) ( 1288 1096 -216 ) subway/1_bathroom_floor_drain 0 -16 0 0.500000 0.500000 0 285212672 0 +( 1288 1096 -224 ) ( 1248 1096 -224 ) ( 1248 1048 -224 ) subway/1_bathroom_floor_drain 32 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 1324 +{ +( 1424 1088 -200 ) ( 1424 1088 -168 ) ( 1416 1088 -168 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1424 1104 -168 ) ( 1424 1104 -200 ) ( 1424 1056 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1424 1056 -168 ) ( 1424 1056 -200 ) ( 1416 1056 -200 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1416 992 -168 ) ( 1416 992 -200 ) ( 1416 1056 -200 ) subway/1_bathroom_men_graf4 0 -16 0 -0.500000 0.500000 0 285212672 0 +( 1416 1112 -168 ) ( 1424 1112 -168 ) ( 1424 1084 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1424 1084 -200 ) ( 1424 1112 -200 ) ( 1416 1112 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1325 +{ +( 1388 1092 -124 ) ( 1388 1140 -124 ) ( 1356 1140 -124 ) subway/light_tube -9 23 90 0.500000 0.500000 134217728 1 3500 +( 1356 1136 -120 ) ( 1388 1136 -120 ) ( 1388 1088 -120 ) subway/1_black 8 15 90 0.500000 0.500000 134217728 16777216 0 +( 1364 1136 -120 ) ( 1364 1088 -120 ) ( 1364 1088 -128 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1356 1092 -120 ) ( 1388 1092 -120 ) ( 1388 1092 -128 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1380 1088 -120 ) ( 1380 1136 -120 ) ( 1380 1136 -128 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1388 1136 -120 ) ( 1356 1136 -120 ) ( 1356 1136 -128 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1326 +{ +( 1228 1112 -128 ) ( 1200 1112 -128 ) ( 1200 1104 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1200 1104 -120 ) ( 1200 1112 -120 ) ( 1228 1112 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1320 1104 -120 ) ( 1320 1104 -128 ) ( 1200 1104 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1320 1104 -128 ) ( 1320 1104 -120 ) ( 1320 1112 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1320 1112 -128 ) ( 1320 1112 -120 ) ( 1200 1112 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1200 1112 -60 ) ( 1200 1104 -60 ) ( 1200 1104 -152 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1327 +{ +( 1200 1112 -76 ) ( 1200 1104 -76 ) ( 1200 1104 -168 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1320 1112 -168 ) ( 1320 1112 -128 ) ( 1200 1112 -128 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 0 285212672 0 +( 1320 1104 -168 ) ( 1320 1104 -128 ) ( 1320 1112 -128 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1320 1104 -128 ) ( 1320 1104 -168 ) ( 1200 1104 -168 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 0 285212672 0 +( 1200 1104 -128 ) ( 1200 1112 -128 ) ( 1228 1112 -128 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1228 1112 -168 ) ( 1200 1112 -168 ) ( 1200 1104 -168 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1328 +{ +( 1200 1112 -108 ) ( 1200 1104 -108 ) ( 1200 1104 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1320 1112 -200 ) ( 1320 1112 -168 ) ( 1200 1112 -168 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1320 1104 -200 ) ( 1320 1104 -168 ) ( 1320 1112 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1320 1104 -168 ) ( 1320 1104 -200 ) ( 1200 1104 -200 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1200 1104 -168 ) ( 1200 1112 -168 ) ( 1228 1112 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1228 1112 -200 ) ( 1200 1112 -200 ) ( 1200 1104 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1329 +{ +( 1228 1112 -216 ) ( 1200 1112 -216 ) ( 1200 1104 -216 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1200 1104 -200 ) ( 1200 1112 -200 ) ( 1228 1112 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1320 1104 -200 ) ( 1320 1104 -216 ) ( 1200 1104 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1320 1104 -216 ) ( 1320 1104 -200 ) ( 1320 1112 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1320 1112 -216 ) ( 1320 1112 -200 ) ( 1200 1112 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1200 1112 -124 ) ( 1200 1104 -124 ) ( 1200 1104 -216 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1330 +{ +( 1148 1104 -224 ) ( 1120 1104 -224 ) ( 1120 1096 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1120 1104 -216 ) ( 1120 1112 -216 ) ( 1148 1112 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1164 1032 -132 ) ( 1192 1032 -132 ) ( 1192 1032 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1248 1096 -132 ) ( 1248 1104 -132 ) ( 1248 1104 -224 ) subway/1_bathroom_floor 32 0 0 0.500000 0.500000 0 285212672 0 +( 1156 1104 -132 ) ( 1128 1104 -132 ) ( 1128 1104 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1192 1104 -132 ) ( 1192 1096 -132 ) ( 1192 1096 -224 ) subway/1_bathroom_floor 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1331 +{ +( 1180 1104 -224 ) ( 1152 1104 -224 ) ( 1152 1096 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1152 1104 -216 ) ( 1152 1112 -216 ) ( 1180 1112 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1196 1032 -132 ) ( 1224 1032 -132 ) ( 1224 1032 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1280 1096 -132 ) ( 1280 1104 -132 ) ( 1280 1104 -224 ) subway/1_bathroom_floor 32 0 0 0.500000 0.500000 0 285212672 0 +( 1188 1048 -132 ) ( 1160 1048 -132 ) ( 1160 1048 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1248 1104 -132 ) ( 1248 1096 -132 ) ( 1248 1096 -224 ) subway/1_bathroom_floor 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1332 +{ +( 1280 1104 -132 ) ( 1280 1096 -132 ) ( 1280 1096 -224 ) subway/1_bathroom_floor 32 0 0 0.500000 0.500000 0 285212672 0 +( 1236 1104 -132 ) ( 1208 1104 -132 ) ( 1208 1104 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1328 1096 -132 ) ( 1328 1104 -132 ) ( 1328 1104 -224 ) subway/1_bathroom_floor 32 0 0 0.500000 0.500000 0 285212672 0 +( 1244 1032 -132 ) ( 1272 1032 -132 ) ( 1272 1032 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1200 1104 -216 ) ( 1200 1112 -216 ) ( 1228 1112 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1228 1104 -224 ) ( 1200 1104 -224 ) ( 1200 1096 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1333 +{ +( 1280 1084 -124 ) ( 1232 1084 -124 ) ( 1232 1052 -124 ) subway/light_tube 64 -24 0 0.500000 0.500000 134217728 1 3500 +( 1248 1052 -120 ) ( 1248 1084 -120 ) ( 1296 1084 -120 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1248 1060 -120 ) ( 1296 1060 -120 ) ( 1296 1060 -128 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1292 1052 -120 ) ( 1292 1084 -120 ) ( 1292 1084 -128 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1296 1076 -120 ) ( 1248 1076 -120 ) ( 1248 1076 -128 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1248 1084 -120 ) ( 1248 1052 -120 ) ( 1248 1052 -128 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1334 +{ +( 1200 1104 -216 ) ( 1204 1104 -216 ) ( 1204 1104 -120 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1200 1104 -120 ) ( 1200 1100 -120 ) ( 1200 1100 -216 ) subway/clip 32 0 0 0.500000 0.500000 196608 128 0 +( 1200 1100 -120 ) ( 1204 1104 -120 ) ( 1204 1104 -216 ) subway/clip 32 0 0 0.500000 0.500000 196608 128 0 +( 1212 1088 -216 ) ( 1212 1104 -216 ) ( 1200 1104 -216 ) subway/clip 0 -32 0 0.500000 0.500000 196608 128 0 +( 1200 1104 -120 ) ( 1212 1104 -120 ) ( 1212 1088 -120 ) subway/clip 0 -32 0 0.500000 0.500000 196608 128 0 +} +// brush 1335 +{ +( 1212 1048 -120 ) ( 1212 1032 -120 ) ( 1200 1032 -120 ) subway/clip 0 -32 0 0.500000 0.500000 196608 128 0 +( 1200 1032 -216 ) ( 1212 1032 -216 ) ( 1212 1048 -216 ) subway/clip 0 -32 0 0.500000 0.500000 196608 128 0 +( 1204 1032 -216 ) ( 1204 1032 -120 ) ( 1200 1036 -120 ) subway/clip 32 0 0 0.500000 0.500000 196608 128 0 +( 1200 1036 -216 ) ( 1200 1036 -120 ) ( 1200 1032 -120 ) subway/clip 32 0 0 0.500000 0.500000 196608 128 0 +( 1204 1032 -120 ) ( 1204 1032 -216 ) ( 1200 1032 -216 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 1336 +{ +( 72 1552 -48 ) ( 312 1512 -48 ) ( 312 1472 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -120 1544 -80 ) ( -120 1560 -80 ) ( -120 1560 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 208 1512 -48 ) ( 208 1544 -80 ) ( -32 1544 -80 ) subway/1_tile_middle 0 48 0 0.500000 0.500000 0 318767104 0 +( 312 1552 -48 ) ( 72 1552 -48 ) ( 72 1552 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 258 1592 -64 ) ( 248 1592 -64 ) ( 248 1520 -64 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 160 1552 -64 ) ( 160 1544 -64 ) ( 160 1548 -48 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1337 +{ +( 72 1552 -48 ) ( 312 1512 -48 ) ( 312 1472 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 208 1512 -48 ) ( 208 1544 -80 ) ( -32 1544 -80 ) subway/1_tile_middle 0 48 0 0.500000 0.500000 0 318767104 9 +( 192 1536 -80 ) ( 192 1472 -48 ) ( 192 1512 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 312 1552 -48 ) ( 72 1552 -48 ) ( 72 1552 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 258 1592 -64 ) ( 248 1592 -64 ) ( 248 1520 -64 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 160 1544 -64 ) ( 160 1552 -64 ) ( 160 1548 -48 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1338 +{ +( 72 1552 -80 ) ( 72 1544 -80 ) ( 312 1544 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 1552 -64 ) ( 312 1512 -64 ) ( 312 1472 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -120 1544 -80 ) ( -120 1560 -80 ) ( -120 1560 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 208 1512 -48 ) ( 208 1544 -80 ) ( -32 1544 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 312 1552 -48 ) ( 72 1552 -48 ) ( 72 1552 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 160 1552 -80 ) ( 160 1544 -80 ) ( 160 1548 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 1339 +{ +( 72 1552 -80 ) ( 72 1544 -80 ) ( 312 1544 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 1552 -64 ) ( 312 1512 -64 ) ( 312 1472 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 208 1512 -48 ) ( 208 1544 -80 ) ( -32 1544 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 9 +( 192 1536 -80 ) ( 192 1472 -48 ) ( 192 1512 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 312 1552 -48 ) ( 72 1552 -48 ) ( 72 1552 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 160 1544 -80 ) ( 160 1552 -80 ) ( 160 1548 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 1340 +{ +( 224 80 -116 ) ( 224 56 -116 ) ( 224 56 -124 ) subway/1_black 1920 80 0 0.500000 0.500000 134217728 16777216 0 +( 244 80 -116 ) ( 220 80 -116 ) ( 220 80 -124 ) subway/1_black 3168 80 0 0.500000 0.500000 134217728 16777216 0 +( 240 60 -116 ) ( 240 84 -116 ) ( 240 84 -124 ) subway/1_black 1920 80 0 0.500000 0.500000 134217728 16777216 0 +( 224 64 -116 ) ( 248 64 -116 ) ( 248 64 -124 ) subway/1_black 3168 80 0 0.500000 0.500000 134217728 16777216 0 +( 220 56 -120 ) ( 220 80 -120 ) ( 244 80 -120 ) subway/1_black 3168 -336 0 0.500000 0.500000 134217728 16777216 0 +( 244 80 -124 ) ( 220 80 -124 ) ( 220 56 -124 ) subway/light_yellow 448 416 0 0.500000 0.500000 134217728 16777217 3000 +} +// brush 1341 +{ +( 1592 1276 -128 ) ( 1592 1304 -128 ) ( 1584 1304 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1584 1304 -120 ) ( 1592 1304 -120 ) ( 1592 1276 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1584 1204 -44 ) ( 1584 1176 -44 ) ( 1584 1176 -136 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1584 1176 -120 ) ( 1592 1168 -120 ) ( 1592 1168 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1592 1560 -120 ) ( 1592 1560 -128 ) ( 1592 1296 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1592 1560 -128 ) ( 1592 1560 -120 ) ( 1584 1552 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1342 +{ +( 1592 1560 -168 ) ( 1592 1560 -128 ) ( 1584 1552 -128 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1592 1560 -128 ) ( 1592 1560 -168 ) ( 1592 1296 -168 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1584 1176 -128 ) ( 1592 1168 -128 ) ( 1592 1168 -168 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1584 1204 -52 ) ( 1584 1176 -52 ) ( 1584 1176 -144 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1584 1304 -128 ) ( 1592 1304 -128 ) ( 1592 1276 -128 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1592 1276 -168 ) ( 1592 1304 -168 ) ( 1584 1304 -168 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1343 +{ +( 1592 1276 -216 ) ( 1592 1304 -216 ) ( 1584 1304 -216 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1584 1304 -200 ) ( 1592 1304 -200 ) ( 1592 1276 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1584 1204 -124 ) ( 1584 1176 -124 ) ( 1584 1176 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1584 1176 -200 ) ( 1592 1168 -200 ) ( 1592 1168 -216 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1592 1560 -200 ) ( 1592 1560 -216 ) ( 1592 1296 -216 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1592 1560 -216 ) ( 1592 1560 -200 ) ( 1584 1552 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1344 +{ +( 1584 1232 -168 ) ( 1584 1232 -200 ) ( 1592 1232 -200 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1592 1232 -168 ) ( 1592 1232 -200 ) ( 1592 968 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1584 1176 -200 ) ( 1584 1176 -168 ) ( 1592 1168 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1584 1176 -168 ) ( 1584 1176 -200 ) ( 1584 1232 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1584 976 -168 ) ( 1592 976 -168 ) ( 1592 948 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1592 948 -200 ) ( 1592 976 -200 ) ( 1584 976 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1345 +{ +( 1368 1436 -128 ) ( 1368 1464 -128 ) ( 1360 1464 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1360 1464 -120 ) ( 1368 1464 -120 ) ( 1368 1436 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1360 1400 -128 ) ( 1360 1400 -120 ) ( 1360 1344 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1368 1344 -120 ) ( 1368 1344 -128 ) ( 1360 1344 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1392 1344 -128 ) ( 1392 1344 -120 ) ( 1392 1400 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1376 1376 -128 ) ( 1376 1376 -120 ) ( 1368 1376 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1392 1360 0 ) ( 1384 1344 0 ) ( 1384 1344 10 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1368 1344 0 ) ( 1360 1360 0 ) ( 1360 1360 10 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 1346 +{ +( 1584 1176 -216 ) ( 1584 1552 -216 ) ( 1584 1552 -224 ) subway/1_bathroom_floor_edge 0 0 90 0.500000 -0.500000 0 285212672 0 +( 1552 1520 -224 ) ( 1584 1552 -224 ) ( 1584 1552 -216 ) subway/1_bathroom_floor_edge 0 0 90 0.500000 -0.500000 0 285212672 0 +( 1552 1520 -216 ) ( 1552 1208 -216 ) ( 1552 1208 -224 ) subway/1_bathroom_floor_edge 0 0 90 0.500000 -0.500000 0 285212672 0 +( 1584 1176 -224 ) ( 1552 1208 -224 ) ( 1552 1208 -216 ) subway/1_bathroom_floor_edge 0 0 90 0.500000 -0.500000 0 285212672 0 +( 1612 1256 -216 ) ( 1640 1256 -216 ) ( 1640 1248 -216 ) subway/1_bathroom_floor_edge 31 -31 90 0.500000 -0.500000 0 285212672 0 +( 1632 1240 -224 ) ( 1632 1248 -224 ) ( 1604 1248 -224 ) subway/1_bathroom_floor_edge 31 -31 90 0.500000 -0.500000 0 285212672 0 +} +// brush 1347 +{ +( 1584 1176 -128 ) ( 1592 1168 -128 ) ( 1592 1168 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1168 -120 ) ( 1528 1168 -120 ) ( 1528 1168 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1168 -120 ) ( 1424 1168 -128 ) ( 1416 1176 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1508 1176 -44 ) ( 1480 1176 -44 ) ( 1480 1176 -136 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1544 1176 -120 ) ( 1544 1168 -120 ) ( 1516 1168 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1516 1168 -128 ) ( 1544 1168 -128 ) ( 1544 1176 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1348 +{ +( 1516 1168 -168 ) ( 1544 1168 -168 ) ( 1544 1176 -168 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1544 1176 -128 ) ( 1544 1168 -128 ) ( 1516 1168 -128 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1508 1176 -52 ) ( 1480 1176 -52 ) ( 1480 1176 -144 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1168 -128 ) ( 1424 1168 -168 ) ( 1416 1176 -168 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1168 -128 ) ( 1528 1168 -128 ) ( 1528 1168 -168 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 0 285212672 0 +( 1584 1176 -168 ) ( 1592 1168 -168 ) ( 1592 1168 -128 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1349 +{ +( 1584 1176 -216 ) ( 1592 1168 -216 ) ( 1592 1168 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1424 1168 -200 ) ( 1528 1168 -200 ) ( 1528 1168 -216 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1424 1168 -200 ) ( 1424 1168 -216 ) ( 1416 1176 -216 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1508 1176 -124 ) ( 1480 1176 -124 ) ( 1480 1176 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1544 1176 -200 ) ( 1544 1168 -200 ) ( 1516 1168 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1516 1168 -216 ) ( 1544 1168 -216 ) ( 1544 1176 -216 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1350 +{ +( 1228 1560 -216 ) ( 1200 1560 -216 ) ( 1200 1552 -216 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1200 1552 -200 ) ( 1200 1560 -200 ) ( 1228 1560 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1556 1552 -124 ) ( 1584 1552 -124 ) ( 1584 1552 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1592 1560 -200 ) ( 1592 1560 -216 ) ( 1584 1552 -216 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1528 1560 -216 ) ( 1528 1560 -200 ) ( 1216 1560 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1224 1552 -216 ) ( 1216 1560 -216 ) ( 1216 1560 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1351 +{ +( 1224 1552 -200 ) ( 1216 1560 -200 ) ( 1216 1560 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1528 1560 -200 ) ( 1528 1560 -168 ) ( 1216 1560 -168 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1592 1560 -168 ) ( 1592 1560 -200 ) ( 1584 1552 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1556 1552 -92 ) ( 1584 1552 -92 ) ( 1584 1552 -184 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1200 1552 -168 ) ( 1200 1560 -168 ) ( 1228 1560 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1228 1560 -200 ) ( 1200 1560 -200 ) ( 1200 1552 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1352 +{ +( 1224 1552 -168 ) ( 1216 1560 -168 ) ( 1216 1560 -128 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1528 1560 -168 ) ( 1528 1560 -128 ) ( 1216 1560 -128 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 0 285212672 0 +( 1592 1560 -128 ) ( 1592 1560 -168 ) ( 1584 1552 -168 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1556 1552 -52 ) ( 1584 1552 -52 ) ( 1584 1552 -144 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 0 285212672 0 +( 1200 1552 -128 ) ( 1200 1560 -128 ) ( 1228 1560 -128 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1228 1560 -168 ) ( 1200 1560 -168 ) ( 1200 1552 -168 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1353 +{ +( 1228 1560 -128 ) ( 1200 1560 -128 ) ( 1200 1552 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1200 1552 -120 ) ( 1200 1560 -120 ) ( 1228 1560 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1556 1552 -44 ) ( 1584 1552 -44 ) ( 1584 1552 -136 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1592 1560 -120 ) ( 1592 1560 -128 ) ( 1584 1552 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1528 1560 -128 ) ( 1528 1560 -120 ) ( 1216 1560 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1224 1552 -128 ) ( 1216 1560 -128 ) ( 1216 1560 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1354 +{ +( 1216 1560 -200 ) ( 1216 1560 -216 ) ( 1224 1552 -216 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1216 1432 -216 ) ( 1216 1432 -200 ) ( 1216 1168 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1216 1168 -216 ) ( 1216 1168 -200 ) ( 1224 1176 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1224 1304 -216 ) ( 1224 1304 -124 ) ( 1224 1332 -124 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1216 1276 -200 ) ( 1216 1304 -200 ) ( 1224 1304 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1224 1304 -216 ) ( 1216 1304 -216 ) ( 1216 1276 -216 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1355 +{ +( 1224 1304 -200 ) ( 1216 1304 -200 ) ( 1216 1276 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1216 1276 -168 ) ( 1216 1304 -168 ) ( 1224 1304 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1224 1304 -184 ) ( 1224 1304 -92 ) ( 1224 1332 -92 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1216 1168 -200 ) ( 1216 1168 -168 ) ( 1224 1176 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1216 1432 -200 ) ( 1216 1432 -168 ) ( 1216 1168 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1216 1560 -168 ) ( 1216 1560 -200 ) ( 1224 1552 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +} +// brush 1356 +{ +( 1224 1304 -168 ) ( 1216 1304 -168 ) ( 1216 1276 -168 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1216 1276 -128 ) ( 1216 1304 -128 ) ( 1224 1304 -128 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1224 1304 -144 ) ( 1224 1304 -52 ) ( 1224 1332 -52 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1216 1168 -168 ) ( 1216 1168 -128 ) ( 1224 1176 -128 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1216 1432 -168 ) ( 1216 1432 -128 ) ( 1216 1168 -128 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1216 1560 -128 ) ( 1216 1560 -168 ) ( 1224 1552 -168 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1357 +{ +( 1216 1560 -120 ) ( 1216 1560 -128 ) ( 1224 1552 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1216 1432 -128 ) ( 1216 1432 -120 ) ( 1216 1168 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1216 1168 -128 ) ( 1216 1168 -120 ) ( 1224 1176 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1224 1304 -136 ) ( 1224 1304 -44 ) ( 1224 1332 -44 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1216 1276 -120 ) ( 1216 1304 -120 ) ( 1224 1304 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1224 1304 -128 ) ( 1216 1304 -128 ) ( 1216 1276 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1358 +{ +( 1216 1168 -200 ) ( 1216 1168 -216 ) ( 1224 1176 -216 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1216 1168 -216 ) ( 1216 1168 -200 ) ( 1320 1168 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1328 1176 -216 ) ( 1320 1168 -216 ) ( 1320 1168 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1328 1176 -216 ) ( 1328 1176 -124 ) ( 1300 1176 -124 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 0 369098752 0 +( 1228 1168 -200 ) ( 1200 1168 -200 ) ( 1200 1176 -200 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +( 1200 1176 -216 ) ( 1200 1168 -216 ) ( 1228 1168 -216 ) subway/1_bathroom_men_bottom 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1359 +{ +( 1200 1176 -200 ) ( 1200 1168 -200 ) ( 1228 1168 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1228 1168 -168 ) ( 1200 1168 -168 ) ( 1200 1176 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1328 1176 -184 ) ( 1328 1176 -92 ) ( 1300 1176 -92 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1328 1176 -200 ) ( 1320 1168 -200 ) ( 1320 1168 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1216 1168 -200 ) ( 1216 1168 -168 ) ( 1320 1168 -168 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1216 1168 -168 ) ( 1216 1168 -200 ) ( 1224 1176 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +} +// brush 1360 +{ +( 1200 1176 -168 ) ( 1200 1168 -168 ) ( 1228 1168 -168 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1228 1168 -128 ) ( 1200 1168 -128 ) ( 1200 1176 -128 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1328 1176 -144 ) ( 1328 1176 -52 ) ( 1300 1176 -52 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 0 285212672 0 +( 1328 1176 -168 ) ( 1320 1168 -168 ) ( 1320 1168 -128 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +( 1216 1168 -168 ) ( 1216 1168 -128 ) ( 1320 1168 -128 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 0 285212672 0 +( 1216 1168 -128 ) ( 1216 1168 -168 ) ( 1224 1176 -168 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1361 +{ +( 1216 1168 -120 ) ( 1216 1168 -128 ) ( 1224 1176 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1216 1168 -128 ) ( 1216 1168 -120 ) ( 1320 1168 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1328 1176 -128 ) ( 1320 1168 -128 ) ( 1320 1168 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1328 1176 -136 ) ( 1328 1176 -44 ) ( 1300 1176 -44 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1228 1168 -120 ) ( 1200 1168 -120 ) ( 1200 1176 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +( 1200 1176 -128 ) ( 1200 1168 -128 ) ( 1228 1168 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1362 +{ +( 1248 1176 -104 ) ( 1248 1176 -120 ) ( 1248 1200 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1312 1200 -104 ) ( 1312 1200 -120 ) ( 1560 1200 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1560 1176 -120 ) ( 1560 1176 -104 ) ( 1560 1200 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1560 1176 -104 ) ( 1560 1176 -120 ) ( 1248 1176 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1200 1248 -104 ) ( 1200 1256 -104 ) ( 1228 1256 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1228 1248 -120 ) ( 1200 1248 -120 ) ( 1200 1240 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1363 +{ +( 1368 1552 -120 ) ( 1368 1552 -128 ) ( 1376 1552 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1392 1436 -60 ) ( 1392 1464 -60 ) ( 1392 1464 -152 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1360 1376 -128 ) ( 1360 1376 -120 ) ( 1368 1376 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1360 1416 -128 ) ( 1360 1416 -120 ) ( 1360 1344 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1360 1472 -120 ) ( 1368 1472 -120 ) ( 1368 1444 -120 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1368 1444 -128 ) ( 1368 1472 -128 ) ( 1360 1472 -128 ) subway/1_bathroom_men_top 0 0 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 1364 +{ +( 1368 1444 -168 ) ( 1368 1472 -168 ) ( 1360 1472 -168 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 134217728 285212672 0 +( 1360 1472 -128 ) ( 1368 1472 -128 ) ( 1368 1444 -128 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 134217728 285212672 0 +( 1360 1416 -168 ) ( 1360 1416 -128 ) ( 1360 1344 -128 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 134217728 285212672 0 +( 1360 1376 -168 ) ( 1360 1376 -128 ) ( 1368 1376 -128 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1392 1436 -76 ) ( 1392 1464 -76 ) ( 1392 1464 -168 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 134217728 285212672 0 +( 1368 1552 -128 ) ( 1368 1552 -168 ) ( 1376 1552 -168 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 1365 +{ +( 1368 1444 -200 ) ( 1368 1472 -200 ) ( 1360 1472 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 134217728 369098752 0 +( 1360 1472 -168 ) ( 1368 1472 -168 ) ( 1368 1444 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 134217728 369098752 0 +( 1360 1416 -200 ) ( 1360 1416 -168 ) ( 1360 1344 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 134217728 369098752 0 +( 1360 1376 -200 ) ( 1360 1376 -168 ) ( 1368 1376 -168 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 134217728 369098752 0 +( 1392 1436 -108 ) ( 1392 1464 -108 ) ( 1392 1464 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 134217728 369098752 0 +( 1368 1552 -168 ) ( 1368 1552 -200 ) ( 1376 1552 -200 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 134217728 369098752 0 +} +// brush 1366 +{ +( 1368 1552 -200 ) ( 1368 1552 -216 ) ( 1376 1552 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 134217728 369098752 0 +( 1392 1436 -124 ) ( 1392 1464 -124 ) ( 1392 1464 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 134217728 369098752 0 +( 1360 1376 -216 ) ( 1360 1376 -200 ) ( 1368 1376 -200 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 134217728 369098752 0 +( 1360 1416 -216 ) ( 1360 1416 -200 ) ( 1360 1344 -200 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 134217728 369098752 0 +( 1360 1472 -200 ) ( 1368 1472 -200 ) ( 1368 1444 -200 ) subway/1_bathroom_men_bottom 0 -16 0 0.500000 0.500000 134217728 369098752 0 +( 1368 1444 -216 ) ( 1368 1472 -216 ) ( 1360 1472 -216 ) subway/1_bathroom_men_bottom 0 -16 0 0.500000 0.500000 134217728 369098752 0 +} +// brush 1367 +{ +( 1368 1436 -216 ) ( 1368 1464 -216 ) ( 1360 1464 -216 ) subway/1_bathroom_men_bottom 0 -16 0 0.500000 0.500000 134217728 369098752 0 +( 1360 1464 -200 ) ( 1368 1464 -200 ) ( 1368 1436 -200 ) subway/1_bathroom_men_bottom 0 -16 0 0.500000 0.500000 134217728 369098752 0 +( 1360 1400 -216 ) ( 1360 1400 -200 ) ( 1360 1344 -200 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 134217728 369098752 0 +( 1368 1344 -200 ) ( 1368 1344 -216 ) ( 1360 1344 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 134217728 369098752 0 +( 1392 1400 -200 ) ( 1392 1400 -216 ) ( 1392 1344 -216 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 134217728 369098752 0 +( 1376 1376 -216 ) ( 1376 1376 -200 ) ( 1368 1376 -200 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 134217728 369098752 0 +( 1368 1344 0 ) ( 1360 1360 0 ) ( 1360 1360 10 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 134217728 369098752 0 +( 1392 1360 0 ) ( 1384 1344 0 ) ( 1384 1344 10 ) subway/1_bathroom_men_bottom 0 16 0 0.500000 0.500000 134217728 369098752 0 +} +// brush 1368 +{ +( 1368 1436 -168 ) ( 1368 1464 -168 ) ( 1360 1464 -168 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 134217728 285212672 0 +( 1360 1464 -128 ) ( 1368 1464 -128 ) ( 1368 1436 -128 ) subway/1_bathroom_men_nos 0 -32 0 0.500000 0.500000 134217728 285212672 0 +( 1360 1400 -168 ) ( 1360 1400 -128 ) ( 1360 1344 -128 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 134217728 285212672 0 +( 1368 1344 -128 ) ( 1368 1344 -168 ) ( 1360 1344 -168 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1392 1344 -168 ) ( 1392 1344 -128 ) ( 1392 1400 -128 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 134217728 285212672 0 +( 1376 1376 -168 ) ( 1376 1376 -128 ) ( 1368 1376 -128 ) subway/1_bathroom_men_nos 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 1368 1344 0 ) ( 1360 1360 0 ) ( 1360 1360 10 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 134217728 285212672 0 +( 1392 1360 0 ) ( 1384 1344 0 ) ( 1384 1344 10 ) subway/1_bathroom_men_nos 32 0 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 1369 +{ +( 1376 1376 -208 ) ( 1376 1376 -168 ) ( 1368 1376 -168 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 134217728 369098752 0 +( 1392 1344 -208 ) ( 1392 1344 -168 ) ( 1392 1400 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 134217728 369098752 0 +( 1368 1344 -168 ) ( 1368 1344 -208 ) ( 1360 1344 -208 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 134217728 369098752 0 +( 1360 1400 -208 ) ( 1360 1400 -168 ) ( 1360 1344 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 134217728 369098752 0 +( 1360 1464 -168 ) ( 1368 1464 -168 ) ( 1368 1436 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 134217728 369098752 0 +( 1368 1436 -200 ) ( 1368 1464 -200 ) ( 1360 1464 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 134217728 369098752 0 +( 1368 1344 0 ) ( 1360 1360 0 ) ( 1360 1360 10 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 134217728 369098752 0 +( 1392 1360 0 ) ( 1384 1344 0 ) ( 1384 1344 10 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 134217728 369098752 0 +} +// brush 1370 +{ +( 1296 1468 -120 ) ( 1296 1496 -120 ) ( 1288 1496 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1296 1496 -104 ) ( 1304 1496 -104 ) ( 1304 1468 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1224 1452 -28 ) ( 1224 1424 -28 ) ( 1224 1424 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1248 1176 -104 ) ( 1248 1176 -120 ) ( 1224 1176 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1248 1552 -104 ) ( 1248 1552 -120 ) ( 1248 1176 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1248 1552 -120 ) ( 1248 1552 -104 ) ( 1224 1552 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1371 +{ +( 1336 1560 -104 ) ( 1336 1560 -120 ) ( 1360 1560 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1416 1464 -104 ) ( 1416 1464 -120 ) ( 1416 1264 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1336 1360 -120 ) ( 1336 1360 -104 ) ( 1360 1360 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1336 1328 -104 ) ( 1336 1328 -120 ) ( 1336 1448 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1408 1560 -104 ) ( 1416 1560 -104 ) ( 1416 1532 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1408 1532 -120 ) ( 1408 1560 -120 ) ( 1400 1560 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1372 +{ +( 1396 1280 -224 ) ( 1368 1280 -224 ) ( 1368 1272 -224 ) subway/1_bathroom_floor_edge 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1368 1280 -216 ) ( 1368 1288 -216 ) ( 1396 1288 -216 ) subway/1_bathroom_floor_edge 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1496 1520 -216 ) ( 1496 1520 -224 ) ( 1424 1520 -224 ) subway/1_bathroom_floor_edge 0 0 0 0.500000 0.500000 0 285212672 0 +( 1552 1520 -224 ) ( 1552 1520 -216 ) ( 1584 1552 -216 ) subway/1_bathroom_floor_edge 32 0 0 0.500000 0.500000 0 285212672 0 +( 1396 1552 -132 ) ( 1368 1552 -132 ) ( 1368 1552 -224 ) subway/1_bathroom_floor_edge 0 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1520 -216 ) ( 1424 1520 -224 ) ( 1392 1552 -224 ) subway/1_bathroom_floor_edge 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1373 +{ +( 1552 1208 -224 ) ( 1584 1176 -224 ) ( 1584 1176 -216 ) subway/1_bathroom_floor_edge 32 48 0 0.500000 -0.500000 0 285212672 0 +( 1488 1208 -216 ) ( 1384 1208 -216 ) ( 1384 1208 -224 ) subway/1_bathroom_floor_edge 0 48 0 0.500000 -0.500000 0 285212672 0 +( 1424 1168 -224 ) ( 1384 1208 -224 ) ( 1384 1208 -216 ) subway/1_bathroom_floor_edge 32 48 0 0.500000 -0.500000 0 285212672 0 +( 1528 1168 -224 ) ( 1424 1168 -224 ) ( 1424 1168 -216 ) subway/1_bathroom_floor_edge 0 48 0 0.500000 -0.500000 0 285212672 0 +( 1516 1224 -216 ) ( 1544 1224 -216 ) ( 1544 1216 -216 ) subway/1_bathroom_floor_edge 0 16 0 0.500000 -0.500000 0 285212672 0 +( 1544 1208 -224 ) ( 1544 1216 -224 ) ( 1516 1216 -224 ) subway/1_bathroom_floor_edge 0 16 0 0.500000 -0.500000 0 285212672 0 +} +// brush 1374 +{ +( 1396 1248 -224 ) ( 1368 1248 -224 ) ( 1368 1240 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1368 1248 -216 ) ( 1368 1256 -216 ) ( 1396 1256 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1412 1272 -132 ) ( 1440 1272 -132 ) ( 1440 1272 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1552 1264 -132 ) ( 1552 1272 -132 ) ( 1552 1272 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1396 1520 -132 ) ( 1368 1520 -132 ) ( 1368 1520 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1424 1256 -132 ) ( 1424 1248 -132 ) ( 1424 1248 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +} +// brush 1375 +{ +( 1228 1216 -224 ) ( 1200 1216 -224 ) ( 1200 1208 -224 ) subway/1_bathroom_floor_edge 0 16 0 0.500000 -0.500000 0 285212672 0 +( 1200 1216 -216 ) ( 1200 1224 -216 ) ( 1228 1224 -216 ) subway/1_bathroom_floor_edge 0 16 0 0.500000 -0.500000 0 285212672 0 +( 1320 1168 -216 ) ( 1320 1168 -224 ) ( 1216 1168 -224 ) subway/1_bathroom_floor_edge 0 48 0 0.500000 -0.500000 0 285212672 0 +( 1360 1208 -216 ) ( 1360 1208 -224 ) ( 1320 1168 -224 ) subway/1_bathroom_floor_edge 32 48 0 0.500000 -0.500000 0 285212672 0 +( 1360 1208 -224 ) ( 1360 1208 -216 ) ( 1256 1208 -216 ) subway/1_bathroom_floor_edge 0 48 0 0.500000 -0.500000 0 285212672 0 +( 1224 1176 -216 ) ( 1224 1176 -224 ) ( 1256 1208 -224 ) subway/1_bathroom_floor_edge 32 48 0 0.500000 -0.500000 0 285212672 0 +} +// brush 1376 +{ +( 1372 1248 -224 ) ( 1344 1248 -224 ) ( 1344 1240 -224 ) subway/1_bathroom_floor_edge -24 31 90 0.500000 0.500000 0 285212672 0 +( 1336 1248 -216 ) ( 1336 1256 -216 ) ( 1364 1256 -216 ) subway/1_bathroom_floor_edge -16 31 90 0.500000 0.500000 0 285212672 0 +( 1392 1344 -224 ) ( 1392 1344 -216 ) ( 1424 1312 -216 ) subway/1_bathroom_floor_edge 8 0 90 0.500000 0.500000 0 285212672 0 +( 1424 1192 -224 ) ( 1424 1192 -216 ) ( 1424 1504 -216 ) subway/1_bathroom_floor_edge 8 0 90 0.500000 0.500000 0 285212672 0 +( 1392 1552 -216 ) ( 1392 1552 -224 ) ( 1424 1520 -224 ) subway/1_bathroom_floor_edge 8 0 90 0.500000 0.500000 0 285212672 0 +( 1392 1344 -216 ) ( 1392 1344 -224 ) ( 1392 1544 -224 ) subway/1_bathroom_floor_edge 8 0 90 0.500000 0.500000 0 285212672 0 +} +// brush 1377 +{ +( 1224 1552 -224 ) ( 1224 1552 -216 ) ( 1224 1176 -216 ) subway/1_bathroom_floor_edge 31 47 90 0.500000 0.500000 0 285212672 0 +( 1224 1552 -216 ) ( 1224 1552 -224 ) ( 1256 1520 -224 ) subway/1_bathroom_floor_edge 31 47 90 0.500000 0.500000 0 285212672 0 +( 1256 1208 -224 ) ( 1256 1208 -216 ) ( 1256 1520 -216 ) subway/1_bathroom_floor_edge 31 47 90 0.500000 0.500000 0 285212672 0 +( 1256 1208 -216 ) ( 1256 1208 -224 ) ( 1224 1176 -224 ) subway/1_bathroom_floor_edge 31 47 90 0.500000 0.500000 0 285212672 0 +( 1168 1248 -216 ) ( 1168 1256 -216 ) ( 1196 1256 -216 ) subway/1_bathroom_floor_edge 31 47 90 0.500000 0.500000 0 285212672 0 +( 1204 1248 -224 ) ( 1176 1248 -224 ) ( 1176 1240 -224 ) subway/1_bathroom_floor_edge 31 47 90 0.500000 0.500000 0 285212672 0 +} +// brush 1378 +{ +( 1360 1352 -224 ) ( 1360 1352 -216 ) ( 1360 1552 -216 ) subway/1_bathroom_floor_edge 0 32 90 0.500000 0.500000 0 285212672 0 +( 1328 1520 -224 ) ( 1360 1552 -224 ) ( 1360 1552 -216 ) subway/1_bathroom_floor_edge 0 32 90 0.500000 0.500000 0 285212672 0 +( 1328 1520 -216 ) ( 1328 1208 -216 ) ( 1328 1208 -224 ) subway/1_bathroom_floor_edge 0 32 90 0.500000 0.500000 0 285212672 0 +( 1360 1344 -216 ) ( 1360 1344 -224 ) ( 1328 1312 -224 ) subway/1_bathroom_floor_edge 0 32 90 0.500000 0.500000 0 285212672 0 +( 1388 1256 -216 ) ( 1416 1256 -216 ) ( 1416 1248 -216 ) subway/1_bathroom_floor_edge 31 -31 90 0.500000 -0.500000 0 285212672 0 +( 1408 1240 -224 ) ( 1408 1248 -224 ) ( 1380 1248 -224 ) subway/1_bathroom_floor_edge 31 63 90 0.500000 0.500000 0 285212672 0 +} +// brush 1379 +{ +( 1360 1344 -216 ) ( 1360 1344 -224 ) ( 1360 1376 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1384 1552 -224 ) ( 1384 1552 -216 ) ( 1352 1552 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1392 1344 -224 ) ( 1392 1344 -216 ) ( 1392 1376 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1392 1344 -216 ) ( 1392 1344 -224 ) ( 1360 1344 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1304 1104 -216 ) ( 1304 1112 -216 ) ( 1332 1112 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1332 1104 -224 ) ( 1304 1104 -224 ) ( 1304 1096 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +} +// brush 1380 +{ +( 1228 1280 -224 ) ( 1200 1280 -224 ) ( 1200 1272 -224 ) subway/1_bathroom_floor_edge 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1200 1280 -216 ) ( 1200 1288 -216 ) ( 1228 1288 -216 ) subway/1_bathroom_floor_edge 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1328 1520 -216 ) ( 1328 1520 -224 ) ( 1256 1520 -224 ) subway/1_bathroom_floor_edge 0 0 0 0.500000 0.500000 0 285212672 0 +( 1328 1520 -224 ) ( 1328 1520 -216 ) ( 1360 1552 -216 ) subway/1_bathroom_floor_edge 32 0 0 0.500000 0.500000 0 285212672 0 +( 1228 1552 -132 ) ( 1200 1552 -132 ) ( 1200 1552 -224 ) subway/1_bathroom_floor_edge 0 0 0 0.500000 0.500000 0 285212672 0 +( 1256 1520 -216 ) ( 1256 1520 -224 ) ( 1224 1552 -224 ) subway/1_bathroom_floor_edge 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1381 +{ +( 1332 1072 -224 ) ( 1304 1072 -224 ) ( 1304 1064 -224 ) subway/1_bathroom_floor_edge 0 0 0 0.500000 0.500000 0 285212672 0 +( 1304 1072 -216 ) ( 1304 1080 -216 ) ( 1332 1080 -216 ) subway/1_bathroom_floor_edge 0 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1312 -216 ) ( 1424 1312 -224 ) ( 1328 1312 -224 ) subway/1_bathroom_floor_edge 0 32 0 0.500000 0.500000 0 285212672 0 +( 1424 1312 -224 ) ( 1424 1312 -216 ) ( 1392 1344 -216 ) subway/1_bathroom_floor_edge 32 32 0 0.500000 0.500000 0 285212672 0 +( 1392 1344 -224 ) ( 1392 1344 -216 ) ( 1360 1344 -216 ) subway/1_bathroom_floor_edge 0 32 0 0.500000 0.500000 0 285212672 0 +( 1328 1312 -216 ) ( 1328 1312 -224 ) ( 1360 1344 -224 ) subway/1_bathroom_floor_edge 32 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1382 +{ +( 1360 1184 -132 ) ( 1360 1176 -132 ) ( 1360 1176 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1340 1240 -132 ) ( 1312 1240 -132 ) ( 1312 1240 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1392 1192 -132 ) ( 1392 1200 -132 ) ( 1392 1200 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1348 1208 -132 ) ( 1376 1208 -132 ) ( 1376 1208 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1304 1176 -216 ) ( 1304 1184 -216 ) ( 1332 1184 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1332 1176 -224 ) ( 1304 1176 -224 ) ( 1304 1168 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +} +// brush 1383 +{ +( 1252 1184 -224 ) ( 1224 1184 -224 ) ( 1224 1176 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1224 1184 -216 ) ( 1224 1192 -216 ) ( 1252 1192 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1276 1208 -132 ) ( 1304 1208 -132 ) ( 1304 1208 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1304 1200 -132 ) ( 1304 1208 -132 ) ( 1304 1208 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1252 1240 -132 ) ( 1224 1240 -132 ) ( 1224 1240 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1272 1192 -132 ) ( 1272 1184 -132 ) ( 1272 1184 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +} +// brush 1384 +{ +( 1400 1468 -104 ) ( 1400 1496 -104 ) ( 1392 1496 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1400 1496 -96 ) ( 1408 1496 -96 ) ( 1408 1468 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1328 1200 -88 ) ( 1328 1200 -104 ) ( 1328 1400 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1328 1328 -104 ) ( 1328 1328 -88 ) ( 1352 1328 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1424 1400 -88 ) ( 1424 1400 -104 ) ( 1424 1200 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1336 1528 -88 ) ( 1336 1528 -104 ) ( 1360 1528 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1385 +{ +( 1416 1320 -104 ) ( 1440 1320 -104 ) ( 1440 1320 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1320 1216 -104 ) ( 1320 1416 -104 ) ( 1320 1416 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1416 1216 -88 ) ( 1440 1216 -88 ) ( 1440 1216 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1432 1408 -104 ) ( 1432 1208 -104 ) ( 1432 1208 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1360 1460 -96 ) ( 1360 1488 -96 ) ( 1368 1488 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1376 1488 -104 ) ( 1368 1488 -104 ) ( 1368 1460 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1386 +{ +( 1424 1520 -104 ) ( 1432 1512 -104 ) ( 1432 1512 -96 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +( 1424 1256 -104 ) ( 1424 1456 -104 ) ( 1424 1456 -88 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +( 1424 1328 -96 ) ( 1432 1320 -96 ) ( 1432 1320 -104 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +( 1432 1304 -96 ) ( 1432 1512 -96 ) ( 1432 1512 -104 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +( 1352 1468 -96 ) ( 1352 1496 -96 ) ( 1360 1496 -96 ) subway/1_bathroom_floor_edge -16 47 90 0.500000 0.500000 0 285212672 0 +( 1368 1496 -104 ) ( 1360 1496 -104 ) ( 1360 1468 -104 ) subway/1_bathroom_floor_edge -16 31 90 0.500000 0.500000 0 285212672 0 +} +// brush 1387 +{ +( 1392 1468 -104 ) ( 1392 1496 -104 ) ( 1384 1496 -104 ) subway/1_bathroom_floor_edge -16 47 90 0.500000 0.500000 0 285212672 0 +( 1392 1496 -96 ) ( 1400 1496 -96 ) ( 1400 1468 -96 ) subway/1_duct2 0 -32 0 0.500000 0.500000 0 16777216 0 +( 1320 1512 -104 ) ( 1320 1512 -96 ) ( 1320 1304 -96 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +( 1320 1320 -104 ) ( 1320 1320 -96 ) ( 1328 1328 -96 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +( 1328 1456 -88 ) ( 1328 1456 -104 ) ( 1328 1256 -104 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +( 1320 1512 -96 ) ( 1320 1512 -104 ) ( 1328 1520 -104 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +} +// brush 1388 +{ +( 1488 1496 -104 ) ( 1480 1496 -104 ) ( 1480 1468 -104 ) subway/1_bathroom_floor_edge -16 47 90 0.500000 0.500000 0 285212672 0 +( 1472 1468 -96 ) ( 1472 1496 -96 ) ( 1480 1496 -96 ) subway/1_bathroom_floor_edge -16 47 90 0.500000 0.500000 0 285212672 0 +( 1552 1400 -104 ) ( 1552 1200 -104 ) ( 1552 1200 -88 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +( 1552 1208 -104 ) ( 1544 1216 -104 ) ( 1544 1216 -96 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +( 1544 1512 -96 ) ( 1544 1216 -96 ) ( 1544 1216 -104 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +( 1552 1520 -96 ) ( 1544 1512 -96 ) ( 1544 1512 -104 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +} +// brush 1389 +{ +( 1264 1512 -104 ) ( 1264 1512 -96 ) ( 1256 1520 -96 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +( 1264 1216 -104 ) ( 1264 1216 -96 ) ( 1264 1512 -96 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +( 1264 1216 -96 ) ( 1264 1216 -104 ) ( 1256 1208 -104 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +( 1256 1200 -88 ) ( 1256 1200 -104 ) ( 1256 1400 -104 ) subway/1_bathroom_floor_edge 16 16 90 0.500000 0.500000 0 285212672 0 +( 1328 1496 -96 ) ( 1336 1496 -96 ) ( 1336 1468 -96 ) subway/1_duct2 0 -32 0 0.500000 0.500000 0 16777216 0 +( 1328 1468 -104 ) ( 1328 1496 -104 ) ( 1320 1496 -104 ) subway/1_bathroom_floor_edge -16 47 90 0.500000 0.500000 0 285212672 0 +} +// brush 1390 +{ +( 1320 1468 -104 ) ( 1320 1496 -104 ) ( 1312 1496 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1320 1496 -96 ) ( 1328 1496 -96 ) ( 1328 1468 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1248 1200 -88 ) ( 1248 1200 -104 ) ( 1248 1400 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1248 1200 -104 ) ( 1248 1200 -88 ) ( 1272 1200 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1256 1432 -88 ) ( 1256 1432 -104 ) ( 1256 1232 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1256 1528 -88 ) ( 1256 1528 -104 ) ( 1280 1528 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1391 +{ +( 1384 1468 -104 ) ( 1384 1496 -104 ) ( 1376 1496 -104 ) subway/1_bathroom_floor_edge 32 -32 0 0.500000 0.500000 0 285212672 0 +( 1384 1496 -96 ) ( 1392 1496 -96 ) ( 1392 1468 -96 ) subway/1_bathroom_floor_edge 32 -32 0 0.500000 0.500000 0 285212672 0 +( 1256 1520 -104 ) ( 1256 1520 -96 ) ( 1264 1512 -96 ) subway/1_bathroom_floor_edge 32 -32 0 0.500000 0.500000 0 285212672 0 +( 1248 1512 -104 ) ( 1248 1512 -88 ) ( 1272 1512 -88 ) subway/1_bathroom_floor_edge 32 -32 0 0.500000 0.500000 0 285212672 0 +( 1328 1520 -96 ) ( 1328 1520 -104 ) ( 1320 1512 -104 ) subway/1_bathroom_floor_edge 32 -32 0 0.500000 0.500000 0 285212672 0 +( 1256 1520 -96 ) ( 1256 1520 -104 ) ( 1328 1520 -104 ) subway/1_bathroom_floor_edge 32 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1392 +{ +( 1552 1468 -104 ) ( 1552 1496 -104 ) ( 1544 1496 -104 ) subway/1_bathroom_floor_edge 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1552 1496 -96 ) ( 1560 1496 -96 ) ( 1560 1468 -96 ) subway/1_bathroom_floor_edge 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1424 1520 -104 ) ( 1424 1520 -96 ) ( 1432 1512 -96 ) subway/1_bathroom_floor_edge -16 0 0 0.500000 0.500000 0 285212672 0 +( 1472 1512 -104 ) ( 1472 1512 -88 ) ( 1496 1512 -88 ) subway/1_bathroom_floor_edge 0 0 0 0.500000 0.500000 0 285212672 0 +( 1552 1520 -96 ) ( 1552 1520 -104 ) ( 1544 1512 -104 ) subway/1_bathroom_floor_edge -16 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1520 -96 ) ( 1424 1520 -104 ) ( 1496 1520 -104 ) subway/1_bathroom_floor_edge 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1393 +{ +( 1256 1208 -104 ) ( 1256 1208 -96 ) ( 1552 1208 -96 ) subway/1_bathroom_floor_edge 0 32 0 0.500000 0.500000 0 285212672 0 +( 1544 1216 -104 ) ( 1552 1208 -104 ) ( 1552 1208 -96 ) subway/1_bathroom_floor_edge 32 32 0 0.500000 0.500000 0 285212672 0 +( 1408 1216 -96 ) ( 1408 1216 -104 ) ( 1544 1216 -104 ) subway/1_bathroom_floor_edge 0 32 0 0.500000 0.500000 0 285212672 0 +( 1256 1208 -96 ) ( 1256 1208 -104 ) ( 1264 1216 -104 ) subway/1_bathroom_floor_edge 32 32 0 0.500000 0.500000 0 285212672 0 +( 1272 1208 -96 ) ( 1264 1216 -96 ) ( 1544 1216 -96 ) subway/1_bathroom_floor_edge 0 0 0 0.500000 0.500000 0 285212672 0 +( 1544 1232 -104 ) ( 1552 1232 -104 ) ( 1552 1260 -104 ) subway/1_bathroom_floor_edge 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1394 +{ +( 1328 1148 -104 ) ( 1328 1176 -104 ) ( 1320 1176 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1328 1176 -96 ) ( 1336 1176 -96 ) ( 1336 1148 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1256 880 -88 ) ( 1256 880 -104 ) ( 1256 1080 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1416 1200 -104 ) ( 1416 1200 -88 ) ( 1440 1200 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1552 1416 -88 ) ( 1552 1416 -104 ) ( 1552 1216 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1264 1208 -88 ) ( 1264 1208 -104 ) ( 1288 1208 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1395 +{ +( 1328 1328 -96 ) ( 1328 1328 -104 ) ( 1424 1328 -104 ) subway/1_bathroom_floor_edge 32 0 0 0.500000 0.500000 0 285212672 0 +( 1432 1320 -104 ) ( 1432 1320 -96 ) ( 1424 1328 -96 ) subway/1_bathroom_floor_edge -16 0 0 0.500000 0.500000 0 285212672 0 +( 1432 1320 -96 ) ( 1432 1320 -104 ) ( 1320 1320 -104 ) subway/1_bathroom_floor_edge 32 0 0 0.500000 0.500000 0 285212672 0 +( 1328 1328 -104 ) ( 1328 1328 -96 ) ( 1320 1320 -96 ) subway/1_bathroom_floor_edge -16 0 0 0.500000 0.500000 0 285212672 0 +( 1440 1304 -96 ) ( 1448 1304 -96 ) ( 1448 1276 -96 ) subway/1_bathroom_floor_edge 32 -32 0 0.500000 0.500000 0 285212672 0 +( 1440 1276 -104 ) ( 1440 1304 -104 ) ( 1432 1304 -104 ) subway/1_bathroom_floor_edge 32 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1396 +{ +( 1488 1528 -88 ) ( 1488 1528 -104 ) ( 1512 1528 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1552 1752 -88 ) ( 1552 1752 -104 ) ( 1552 1552 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1488 1520 -104 ) ( 1488 1520 -88 ) ( 1512 1520 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1424 1200 -88 ) ( 1424 1200 -104 ) ( 1424 1400 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1496 1496 -96 ) ( 1504 1496 -96 ) ( 1504 1468 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1496 1468 -104 ) ( 1496 1496 -104 ) ( 1488 1496 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1397 +{ +( 1496 1496 -104 ) ( 1488 1496 -104 ) ( 1488 1468 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1480 1468 -96 ) ( 1480 1496 -96 ) ( 1488 1496 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1560 1400 -104 ) ( 1560 1200 -104 ) ( 1560 1200 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1536 1200 -88 ) ( 1560 1200 -88 ) ( 1560 1200 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1552 1232 -104 ) ( 1552 1432 -104 ) ( 1552 1432 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1528 1528 -104 ) ( 1552 1528 -104 ) ( 1552 1528 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1398 +{ +( 1328 1468 -104 ) ( 1328 1496 -104 ) ( 1320 1496 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1328 1496 -96 ) ( 1336 1496 -96 ) ( 1336 1468 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1256 1200 -88 ) ( 1256 1200 -104 ) ( 1256 1400 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1320 1520 -104 ) ( 1320 1520 -88 ) ( 1344 1520 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1328 1752 -88 ) ( 1328 1752 -104 ) ( 1328 1552 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1264 1528 -88 ) ( 1264 1528 -104 ) ( 1288 1528 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1399 +{ +( 1512 1288 -224 ) ( 1472 1288 -224 ) ( 1472 1240 -224 ) subway/1_bathroom_floor_drain 64 -16 0 0.500000 0.500000 0 0 0 +( 1472 1240 -216 ) ( 1472 1288 -216 ) ( 1512 1288 -216 ) subway/1_bathroom_floor_drain 64 -16 0 0.500000 0.500000 0 0 0 +( 1472 1240 -216 ) ( 1512 1240 -216 ) ( 1512 1240 -224 ) subway/1_bathroom_floor_drain 64 -16 0 0.500000 0.500000 0 0 0 +( 1504 1240 -216 ) ( 1504 1288 -216 ) ( 1504 1288 -224 ) subway/1_bathroom_floor_drain 64 -16 0 0.500000 0.500000 0 0 0 +( 1512 1272 -216 ) ( 1472 1272 -216 ) ( 1472 1272 -224 ) subway/1_bathroom_floor_drain 64 -16 0 0.500000 0.500000 0 0 0 +( 1472 1288 -216 ) ( 1472 1240 -216 ) ( 1472 1240 -224 ) subway/1_bathroom_floor_drain 64 -16 0 0.500000 0.500000 0 0 0 +} +// brush 1400 +{ +( 1300 1248 -224 ) ( 1272 1248 -224 ) ( 1272 1240 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1272 1248 -216 ) ( 1272 1256 -216 ) ( 1300 1256 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1316 1208 -132 ) ( 1344 1208 -132 ) ( 1344 1208 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1360 1264 -132 ) ( 1360 1272 -132 ) ( 1360 1272 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1308 1312 -132 ) ( 1280 1312 -132 ) ( 1280 1312 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1328 1256 -132 ) ( 1328 1248 -132 ) ( 1328 1248 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +} +// brush 1401 +{ +( 1436 1256 -224 ) ( 1408 1256 -224 ) ( 1408 1248 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1408 1256 -216 ) ( 1408 1264 -216 ) ( 1436 1264 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1452 1208 -132 ) ( 1480 1208 -132 ) ( 1480 1208 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1504 1272 -132 ) ( 1504 1280 -132 ) ( 1504 1280 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1444 1240 -132 ) ( 1416 1240 -132 ) ( 1416 1240 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1472 1264 -132 ) ( 1472 1256 -132 ) ( 1472 1256 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +} +// brush 1402 +{ +( 1332 1248 -224 ) ( 1304 1248 -224 ) ( 1304 1240 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1304 1248 -216 ) ( 1304 1256 -216 ) ( 1332 1256 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1348 1272 -132 ) ( 1376 1272 -132 ) ( 1376 1272 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1392 1264 -132 ) ( 1392 1272 -132 ) ( 1392 1272 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1340 1312 -132 ) ( 1312 1312 -132 ) ( 1312 1312 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1360 1256 -132 ) ( 1360 1248 -132 ) ( 1360 1248 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +} +// brush 1403 +{ +( 1256 1256 -132 ) ( 1256 1248 -132 ) ( 1256 1248 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1228 1520 -132 ) ( 1200 1520 -132 ) ( 1200 1520 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1328 1264 -132 ) ( 1328 1272 -132 ) ( 1328 1272 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1252 1272 -132 ) ( 1280 1272 -132 ) ( 1280 1272 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1200 1248 -216 ) ( 1200 1256 -216 ) ( 1228 1256 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1228 1248 -224 ) ( 1200 1248 -224 ) ( 1200 1240 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +} +// brush 1404 +{ +( 1256 1192 -132 ) ( 1256 1184 -132 ) ( 1256 1184 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1228 1272 -132 ) ( 1200 1272 -132 ) ( 1200 1272 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1272 1200 -132 ) ( 1272 1208 -132 ) ( 1272 1208 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1252 1208 -132 ) ( 1280 1208 -132 ) ( 1280 1208 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1200 1184 -216 ) ( 1200 1192 -216 ) ( 1228 1192 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1228 1184 -224 ) ( 1200 1184 -224 ) ( 1200 1176 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +} +// brush 1405 +{ +( 1304 1192 -132 ) ( 1304 1184 -132 ) ( 1304 1184 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1276 1272 -132 ) ( 1248 1272 -132 ) ( 1248 1272 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1328 1200 -132 ) ( 1328 1208 -132 ) ( 1328 1208 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1300 1208 -132 ) ( 1328 1208 -132 ) ( 1328 1208 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1248 1184 -216 ) ( 1248 1192 -216 ) ( 1276 1192 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1276 1184 -224 ) ( 1248 1184 -224 ) ( 1248 1176 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +} +// brush 1406 +{ +( 1272 1288 -216 ) ( 1272 1240 -216 ) ( 1272 1240 -224 ) subway/1_bathroom_floor_drain 16 -16 0 0.500000 0.500000 0 0 0 +( 1312 1272 -216 ) ( 1272 1272 -216 ) ( 1272 1272 -224 ) subway/1_bathroom_floor_drain 16 -16 0 0.500000 0.500000 0 0 0 +( 1304 1240 -216 ) ( 1304 1288 -216 ) ( 1304 1288 -224 ) subway/1_bathroom_floor_drain 16 -16 0 0.500000 0.500000 0 0 0 +( 1272 1240 -216 ) ( 1312 1240 -216 ) ( 1312 1240 -224 ) subway/1_bathroom_floor_drain 16 -16 0 0.500000 0.500000 0 0 0 +( 1272 1240 -216 ) ( 1272 1288 -216 ) ( 1312 1288 -216 ) subway/1_bathroom_floor_drain 16 -16 0 0.500000 0.500000 0 0 0 +( 1312 1288 -224 ) ( 1272 1288 -224 ) ( 1272 1240 -224 ) subway/1_bathroom_floor_drain 16 -16 0 0.500000 0.500000 0 0 0 +} +// brush 1407 +{ +( 1392 1256 -132 ) ( 1392 1248 -132 ) ( 1392 1248 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1372 1312 -132 ) ( 1344 1312 -132 ) ( 1344 1312 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1424 1264 -132 ) ( 1424 1272 -132 ) ( 1424 1272 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1380 1208 -132 ) ( 1408 1208 -132 ) ( 1408 1208 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1336 1248 -216 ) ( 1336 1256 -216 ) ( 1364 1256 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1364 1248 -224 ) ( 1336 1248 -224 ) ( 1336 1240 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +} +// brush 1408 +{ +( 1424 1264 -132 ) ( 1424 1256 -132 ) ( 1424 1256 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1404 1272 -132 ) ( 1376 1272 -132 ) ( 1376 1272 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1472 1272 -132 ) ( 1472 1280 -132 ) ( 1472 1280 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1412 1208 -132 ) ( 1440 1208 -132 ) ( 1440 1208 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1368 1256 -216 ) ( 1368 1264 -216 ) ( 1396 1264 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1396 1256 -224 ) ( 1368 1256 -224 ) ( 1368 1248 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +} +// brush 1409 +{ +( 1504 1264 -132 ) ( 1504 1256 -132 ) ( 1504 1256 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1484 1272 -132 ) ( 1456 1272 -132 ) ( 1456 1272 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1552 1264 -132 ) ( 1552 1272 -132 ) ( 1552 1272 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1492 1208 -132 ) ( 1520 1208 -132 ) ( 1520 1208 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1448 1256 -216 ) ( 1448 1264 -216 ) ( 1476 1264 -216 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +( 1476 1256 -224 ) ( 1448 1256 -224 ) ( 1448 1248 -224 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 0 0 +} +// brush 1410 +{ +( 1364 1552 -120 ) ( 1332 1552 -120 ) ( 1332 1344 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1332 1344 -96 ) ( 1332 1552 -96 ) ( 1364 1552 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1336 1528 -96 ) ( 1336 1528 -120 ) ( 1248 1528 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1336 1552 -96 ) ( 1336 1552 -120 ) ( 1336 1528 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1336 1552 -120 ) ( 1336 1552 -96 ) ( 1248 1552 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1248 1552 -120 ) ( 1248 1552 -96 ) ( 1248 1528 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1411 +{ +( 1560 1552 -96 ) ( 1560 1344 -96 ) ( 1560 1344 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1592 1560 -96 ) ( 1560 1560 -96 ) ( 1560 1560 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1592 1344 -96 ) ( 1592 1552 -96 ) ( 1592 1552 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1568 1168 -96 ) ( 1600 1168 -96 ) ( 1600 1168 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1560 1344 -96 ) ( 1560 1552 -96 ) ( 1592 1552 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1592 1552 -120 ) ( 1560 1552 -120 ) ( 1560 1344 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1412 +{ +( 1532 1168 -200 ) ( 1560 1168 -200 ) ( 1560 1176 -200 ) subway/1_bathroom_men_graf2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1480 1168 -168 ) ( 1472 1176 -168 ) ( 1600 1176 -168 ) subway/1_bathroom_men_graf2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1528 1176 -200 ) ( 1528 1176 -168 ) ( 1480 1176 -168 ) subway/1_bathroom_men_graf2 0 -16 0 -0.500000 0.500000 0 285212672 0 +( 1504 1168 -168 ) ( 1504 1168 -200 ) ( 1504 1176 -200 ) subway/1_bathroom_men_graf2 32 -16 0 0.500000 0.500000 0 285212672 0 +( 1496 1168 -200 ) ( 1496 1168 -168 ) ( 1528 1168 -168 ) subway/1_bathroom_men_graf2 0 -16 0 0.500000 0.500000 0 285212672 0 +( 1536 1176 -168 ) ( 1536 1176 -200 ) ( 1536 1168 -200 ) subway/1_bathroom_men_graf2 32 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 1413 +{ +( 1504 1168 -200 ) ( 1504 1168 -168 ) ( 1504 1176 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1504 1168 -168 ) ( 1504 1168 -200 ) ( 1456 1168 -200 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1448 1176 -200 ) ( 1448 1176 -168 ) ( 1448 1168 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1376 1176 -168 ) ( 1376 1176 -200 ) ( 1496 1176 -200 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1376 1168 -168 ) ( 1368 1176 -168 ) ( 1496 1176 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1428 1168 -200 ) ( 1456 1168 -200 ) ( 1456 1176 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1414 +{ +( 1448 1176 -168 ) ( 1448 1176 -200 ) ( 1448 1168 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1424 1168 -200 ) ( 1424 1168 -168 ) ( 1448 1168 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1424 1168 -168 ) ( 1424 1168 -200 ) ( 1416 1176 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1448 1176 -200 ) ( 1448 1176 -168 ) ( 1400 1176 -168 ) subway/1_bathroom_men_damage -48 -16 0 -0.500000 0.500000 0 285212672 0 +( 1400 1168 -168 ) ( 1392 1176 -168 ) ( 1520 1176 -168 ) subway/1_bathroom_men 32 16 0 0.500000 0.500000 0 369098752 0 +( 1452 1168 -200 ) ( 1480 1168 -200 ) ( 1480 1176 -200 ) subway/1_bathroom_men 32 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1415 +{ +( 1516 1168 -200 ) ( 1544 1168 -200 ) ( 1544 1176 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1464 1168 -168 ) ( 1456 1176 -168 ) ( 1584 1176 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1464 1176 -168 ) ( 1464 1176 -200 ) ( 1584 1176 -200 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1536 1176 -200 ) ( 1536 1176 -168 ) ( 1536 1168 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1496 1168 -168 ) ( 1600 1168 -168 ) ( 1600 1168 -200 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1584 1176 -200 ) ( 1592 1168 -200 ) ( 1592 1168 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +} +// brush 1416 +{ +( 1236 1128 -164 ) ( 1244 1128 -172 ) ( 1244 1118 -172 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1224 1308 -168 ) ( 1224 1304 -168 ) ( 1224 1304 -196 ) subway/1_bath_stallurinal 16 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1244 1308 -168 ) ( 1224 1308 -168 ) ( 1224 1308 -196 ) subway/1_bath_stallurinal 16 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1240 1304 -168 ) ( 1240 1308 -168 ) ( 1240 1308 -196 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1224 1306 -168 ) ( 1244 1306 -168 ) ( 1244 1306 -196 ) subway/1_bath_stallurinal 16 -7 0 0.500000 0.500000 134217728 16777216 0 +( 1224 1304 -164 ) ( 1224 1308 -164 ) ( 1244 1308 -164 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1244 1308 -196 ) ( 1224 1308 -196 ) ( 1224 1304 -196 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +} +// brush 1417 +{ +( 1584 1408 -208 ) ( 1520 1408 -208 ) ( 1520 1400 -208 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1520 1400 -144 ) ( 1520 1408 -144 ) ( 1584 1408 -144 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1520 1400 -176 ) ( 1584 1400 -176 ) ( 1584 1400 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1584 1400 -176 ) ( 1584 1408 -176 ) ( 1584 1408 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1584 1404 -176 ) ( 1520 1404 -176 ) ( 1520 1404 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1520 1408 -176 ) ( 1520 1400 -176 ) ( 1520 1400 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +} +// brush 1418 +{ +( 1584 1312 -208 ) ( 1520 1312 -208 ) ( 1520 1304 -208 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1520 1304 -144 ) ( 1520 1312 -144 ) ( 1584 1312 -144 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1520 1304 -176 ) ( 1584 1304 -176 ) ( 1584 1304 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1584 1304 -176 ) ( 1584 1312 -176 ) ( 1584 1312 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1584 1308 -176 ) ( 1520 1308 -176 ) ( 1520 1308 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1520 1312 -176 ) ( 1520 1304 -176 ) ( 1520 1304 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +} +// brush 1419 +{ +( 1520 1360 -176 ) ( 1520 1352 -176 ) ( 1520 1352 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1584 1356 -176 ) ( 1520 1356 -176 ) ( 1520 1356 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1584 1352 -176 ) ( 1584 1360 -176 ) ( 1584 1360 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1520 1352 -176 ) ( 1584 1352 -176 ) ( 1584 1352 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1520 1352 -144 ) ( 1520 1360 -144 ) ( 1584 1360 -144 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1584 1360 -208 ) ( 1520 1360 -208 ) ( 1520 1352 -208 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +} +// brush 1420 +{ +( 1416 1552 -96 ) ( 1416 1344 -96 ) ( 1416 1344 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1560 1560 -96 ) ( 1528 1560 -96 ) ( 1528 1560 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1560 1344 -96 ) ( 1560 1552 -96 ) ( 1560 1552 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1496 1528 -96 ) ( 1528 1528 -96 ) ( 1528 1528 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1528 1344 -96 ) ( 1528 1552 -96 ) ( 1560 1552 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1560 1552 -120 ) ( 1528 1552 -120 ) ( 1528 1344 -120 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1421 +{ +( 1484 1472 -104 ) ( 1484 1448 -104 ) ( 1484 1448 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1508 1472 -104 ) ( 1492 1472 -104 ) ( 1492 1472 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1500 1448 -104 ) ( 1500 1472 -104 ) ( 1500 1472 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1492 1456 -104 ) ( 1508 1456 -104 ) ( 1508 1456 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1492 1448 -104 ) ( 1492 1472 -104 ) ( 1508 1472 -104 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1508 1472 -108 ) ( 1492 1472 -108 ) ( 1492 1448 -108 ) subway/light_yellow 8 0 0 0.500000 0.500000 134217728 1 10000 +} +// brush 1422 +{ +( 1308 1472 -108 ) ( 1292 1472 -108 ) ( 1292 1448 -108 ) subway/light_yellow 24 0 0 0.500000 0.500000 134217728 1 10000 +( 1292 1448 -104 ) ( 1292 1472 -104 ) ( 1308 1472 -104 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1292 1456 -104 ) ( 1308 1456 -104 ) ( 1308 1456 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1300 1448 -104 ) ( 1300 1472 -104 ) ( 1300 1472 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1308 1472 -104 ) ( 1292 1472 -104 ) ( 1292 1472 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1284 1472 -104 ) ( 1284 1448 -104 ) ( 1284 1448 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1423 +{ +( 1284 1328 -104 ) ( 1284 1304 -104 ) ( 1284 1304 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1308 1328 -104 ) ( 1292 1328 -104 ) ( 1292 1328 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1300 1304 -104 ) ( 1300 1328 -104 ) ( 1300 1328 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1292 1312 -104 ) ( 1308 1312 -104 ) ( 1308 1312 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1292 1304 -104 ) ( 1292 1328 -104 ) ( 1308 1328 -104 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1308 1328 -108 ) ( 1292 1328 -108 ) ( 1292 1304 -108 ) subway/light_yellow 24 0 0 0.500000 0.500000 134217728 1 10000 +} +// brush 1424 +{ +( 1592 1276 -200 ) ( 1592 1304 -200 ) ( 1584 1304 -200 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1584 1304 -168 ) ( 1592 1304 -168 ) ( 1592 1276 -168 ) subway/1_bathroom_men 0 16 0 0.500000 0.500000 0 369098752 0 +( 1584 1232 -168 ) ( 1584 1232 -200 ) ( 1584 1552 -200 ) subway/1_bathroom_men -24 48 0 0.500000 0.500000 0 369098752 0 +( 1584 1264 -200 ) ( 1584 1264 -168 ) ( 1592 1264 -168 ) subway/1_bathroom_men 0 48 0 0.500000 0.500000 0 369098752 0 +( 1592 1560 -168 ) ( 1592 1560 -200 ) ( 1592 1296 -200 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +( 1592 1560 -200 ) ( 1592 1560 -168 ) ( 1584 1552 -168 ) subway/1_bathroom_men 32 48 0 0.500000 0.500000 0 369098752 0 +} +// brush 1425 +{ +( 1592 980 -200 ) ( 1592 1008 -200 ) ( 1584 1008 -200 ) subway/1_bathroom_men_graf3 0 16 0 -0.500000 0.500000 0 285212672 0 +( 1584 1008 -168 ) ( 1592 1008 -168 ) ( 1592 980 -168 ) subway/1_bathroom_men_graf3 0 16 0 -0.500000 0.500000 0 285212672 0 +( 1584 1264 -200 ) ( 1584 1264 -168 ) ( 1584 968 -168 ) subway/1_bathroom_men_graf3 -32 48 0 -0.500000 0.500000 0 285212672 0 +( 1576 1232 -200 ) ( 1576 1232 -168 ) ( 1584 1232 -168 ) subway/1_bathroom_men_graf3 0 48 0 -0.500000 0.500000 0 285212672 0 +( 1592 1264 -168 ) ( 1592 1264 -200 ) ( 1592 1000 -200 ) subway/1_bathroom_men_graf3 -32 48 0 -0.500000 0.500000 0 285212672 0 +( 1584 1264 -168 ) ( 1584 1264 -200 ) ( 1592 1264 -200 ) subway/1_bathroom_men_graf3 0 48 0 -0.500000 0.500000 0 285212672 0 +} +// brush 1426 +{ +( 1400 1288 -224 ) ( 1360 1288 -224 ) ( 1360 1240 -224 ) subway/1_bathroom_floor_drain 32 -16 0 0.500000 0.500000 0 0 0 +( 1360 1240 -216 ) ( 1360 1288 -216 ) ( 1400 1288 -216 ) subway/1_bathroom_floor_drain 32 -16 0 0.500000 0.500000 0 0 0 +( 1360 1240 -216 ) ( 1400 1240 -216 ) ( 1400 1240 -224 ) subway/1_bathroom_floor_drain 32 -16 0 0.500000 0.500000 0 0 0 +( 1392 1240 -216 ) ( 1392 1288 -216 ) ( 1392 1288 -224 ) subway/1_bathroom_floor_drain 32 -16 0 0.500000 0.500000 0 0 0 +( 1400 1272 -216 ) ( 1360 1272 -216 ) ( 1360 1272 -224 ) subway/1_bathroom_floor_drain 32 -16 0 0.500000 0.500000 0 0 0 +( 1360 1288 -216 ) ( 1360 1240 -216 ) ( 1360 1240 -224 ) subway/1_bathroom_floor_drain 32 -16 0 0.500000 0.500000 0 0 0 +} +// brush 1427 +{ +( 1520 1456 -176 ) ( 1520 1448 -176 ) ( 1520 1448 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1584 1452 -176 ) ( 1520 1452 -176 ) ( 1520 1452 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1584 1448 -176 ) ( 1584 1456 -176 ) ( 1584 1456 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1516 1448 -176 ) ( 1580 1448 -176 ) ( 1580 1448 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1520 1448 -144 ) ( 1520 1456 -144 ) ( 1584 1456 -144 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1584 1456 -208 ) ( 1520 1456 -208 ) ( 1520 1448 -208 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +} +// brush 1428 +{ +( 1584 1504 -208 ) ( 1520 1504 -208 ) ( 1520 1496 -208 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1520 1496 -144 ) ( 1520 1504 -144 ) ( 1584 1504 -144 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1524 1496 -176 ) ( 1588 1496 -176 ) ( 1588 1496 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1584 1496 -176 ) ( 1584 1504 -176 ) ( 1584 1504 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1580 1500 -176 ) ( 1516 1500 -176 ) ( 1516 1500 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1520 1504 -176 ) ( 1520 1496 -176 ) ( 1520 1496 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +} +// brush 1429 +{ +( 1580 1508 -216 ) ( 1516 1508 -216 ) ( 1516 1500 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1516 1496 -140 ) ( 1516 1504 -140 ) ( 1580 1504 -140 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1516 1496 -176 ) ( 1580 1496 -176 ) ( 1580 1496 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1520 1492 -176 ) ( 1520 1500 -176 ) ( 1520 1500 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1580 1500 -176 ) ( 1516 1500 -176 ) ( 1516 1500 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1516 1504 -176 ) ( 1516 1496 -176 ) ( 1516 1496 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 1430 +{ +( 1508 1328 -108 ) ( 1492 1328 -108 ) ( 1492 1304 -108 ) subway/light_yellow 8 0 0 0.500000 0.500000 134217728 1 10000 +( 1492 1304 -104 ) ( 1492 1328 -104 ) ( 1508 1328 -104 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1492 1312 -104 ) ( 1508 1312 -104 ) ( 1508 1312 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1500 1304 -104 ) ( 1500 1328 -104 ) ( 1500 1328 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1508 1328 -104 ) ( 1492 1328 -104 ) ( 1492 1328 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1484 1328 -104 ) ( 1484 1304 -104 ) ( 1484 1304 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1431 +{ +( 1248 1496 -440 ) ( 1248 1472 -440 ) ( 1248 1472 -456 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1264 1496 -440 ) ( 1240 1496 -440 ) ( 1240 1496 -456 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1264 1472 -440 ) ( 1264 1496 -440 ) ( 1264 1496 -456 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1240 1480 -440 ) ( 1264 1480 -440 ) ( 1264 1480 -456 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1240 1472 -440 ) ( 1240 1496 -440 ) ( 1264 1496 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1264 1496 -444 ) ( 1240 1496 -444 ) ( 1240 1472 -444 ) subway/light_yellow 0 16 0 0.500000 0.500000 134217728 16777217 10000 +} +// brush 1432 +{ +( 1296 1504 -504 ) ( 1288 1504 -504 ) ( 1288 1472 -504 ) subway/2_stair_side2 -856 -16 90 0.500000 0.500000 134217728 285212672 0 +( 1288 1472 -472 ) ( 1288 1504 -472 ) ( 1296 1504 -472 ) subway/2_stair_side2 -856 -16 90 0.500000 0.500000 134217728 285212672 0 +( 1288 1472 -488 ) ( 1296 1472 -488 ) ( 1296 1472 -496 ) subway/2_stair_side2 40 -16 90 0.500000 0.500000 134217728 285212672 0 +( 1296 1472 -488 ) ( 1296 1504 -488 ) ( 1296 1504 -496 ) subway/2_open_box -912 16 0 0.500000 0.500000 134217728 16777216 0 +( 1296 1504 -488 ) ( 1288 1504 -488 ) ( 1288 1504 -496 ) subway/2_stair_side2 40 -16 90 0.500000 0.500000 134217728 285212672 0 +( 1292 1504 -488 ) ( 1292 1472 -488 ) ( 1292 1472 -496 ) subway/2_open_box2 0 16 0 0.500000 0.500000 0 536870912 0 +} +// brush 1433 +{ +( 1304 1560 -536 ) ( 1304 1560 -504 ) ( 1296 1552 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 1496 -504 ) ( 1288 1496 -536 ) ( 1288 1560 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 1424 -504 ) ( 1304 1424 -536 ) ( 1288 1440 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 1560 -504 ) ( 1304 1560 -536 ) ( 1304 1416 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 1496 -504 ) ( 1296 1560 -504 ) ( 1304 1560 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 1560 -536 ) ( 1288 1560 -536 ) ( 1288 1496 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 1434 +{ +( 1264 1416 -520 ) ( 1264 1392 -520 ) ( 1264 1392 -528 ) subway/1_tunneltrack_plain -896 0 0 0.500000 0.500000 0 301989888 0 +( 1288 1544 -544 ) ( 1288 1544 -536 ) ( 1272 1528 -536 ) subway/1_tunneltrack_plain -896 0 0 0.500000 0.500000 0 301989888 0 +( 1288 1440 -544 ) ( 1288 1440 -536 ) ( 1288 1544 -536 ) subway/1_tunneltrack_plain -896 0 0 0.500000 0.500000 0 301989888 0 +( 1288 1440 -536 ) ( 1288 1440 -544 ) ( 1272 1456 -544 ) subway/1_tunneltrack_plain -896 0 0 0.500000 0.500000 0 301989888 0 +( 1248 904 -536 ) ( 1248 928 -536 ) ( 1368 928 -536 ) subway/1_tunnelfloor_2 -455 -8 90 1 1 0 285212672 0 +( 1344 904 -544 ) ( 1224 904 -544 ) ( 1224 880 -544 ) subway/1_tunneltrack_plain 32 896 0 0.500000 0.500000 0 301989888 0 +} +// brush 1435 +{ +( 1304 1560 -456 ) ( 1296 1560 -456 ) ( 1296 1496 -456 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1296 1496 -440 ) ( 1296 1560 -440 ) ( 1304 1560 -440 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1304 1432 -480 ) ( 1304 1432 -464 ) ( 1304 1496 -464 ) subway/metalrib1 0 -15 90 0.500000 0.500000 0 16777216 0 +( 1296 1432 -456 ) ( 1296 1432 -440 ) ( 1304 1424 -440 ) subway/metalrib1 0 -15 90 0.500000 0.500000 0 16777216 0 +( 1296 1432 -440 ) ( 1296 1432 -456 ) ( 1296 1552 -456 ) subway/metalrib1 0 -15 90 0.500000 0.500000 0 16777216 0 +( 1296 1552 -440 ) ( 1296 1552 -456 ) ( 1304 1560 -456 ) subway/metalrib1 0 -15 90 0.500000 0.500000 0 16777216 0 +} +// brush 1436 +{ +( 1296 1552 -472 ) ( 1296 1552 -504 ) ( 1304 1560 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 1432 -472 ) ( 1296 1432 -504 ) ( 1296 1552 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 1432 -504 ) ( 1296 1432 -472 ) ( 1304 1424 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 1432 -504 ) ( 1304 1432 -488 ) ( 1304 1496 -488 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 1496 -472 ) ( 1296 1560 -472 ) ( 1304 1560 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 1560 -504 ) ( 1296 1560 -504 ) ( 1296 1496 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 1437 +{ +( 1312 1488 -104 ) ( 1304 1488 -104 ) ( 1304 1460 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1296 1460 -96 ) ( 1296 1488 -96 ) ( 1304 1488 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1320 1408 -104 ) ( 1320 1208 -104 ) ( 1320 1208 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1352 1216 -88 ) ( 1376 1216 -88 ) ( 1376 1216 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1264 1224 -104 ) ( 1264 1424 -104 ) ( 1264 1424 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1312 1512 -96 ) ( 1280 1512 -96 ) ( 1312 1512 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1438 +{ +( 1269 1552 -144 ) ( 1269 1552 -136 ) ( 1269 1544 -136 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1301 1544 -136 ) ( 1301 1552 -136 ) ( 1301 1552 -144 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1301 1552 -136 ) ( 1261 1552 -136 ) ( 1261 1552 -144 ) subway/1_black 6 0 0 0.500000 0.500000 134217728 16777216 0 +( 1269 1544 -144 ) ( 1295 1544 -144 ) ( 1295 1552 -144 ) subway/light_small 11 -12 0 1 1 0 1 4800 +( 1295 1544 -144 ) ( 1269 1544 -144 ) ( 1269 1552 -136 ) subway/1_black 6 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1439 +{ +( 1241 1184 -136 ) ( 1241 1176 -136 ) ( 1241 1176 -144 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1273 1176 -144 ) ( 1273 1176 -136 ) ( 1273 1184 -136 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1233 1176 -144 ) ( 1233 1176 -136 ) ( 1273 1176 -136 ) subway/1_black 14 0 0 0.500000 0.500000 134217728 16777216 0 +( 1267 1176 -144 ) ( 1267 1184 -144 ) ( 1241 1184 -144 ) subway/light_small 7 -12 0 1 1 0 1 4800 +( 1241 1176 -136 ) ( 1241 1184 -144 ) ( 1267 1184 -144 ) subway/1_black 14 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1440 +{ +( 1291 1184 -136 ) ( 1291 1176 -136 ) ( 1291 1176 -144 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1323 1176 -144 ) ( 1323 1176 -136 ) ( 1323 1184 -136 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1283 1176 -144 ) ( 1283 1176 -136 ) ( 1323 1176 -136 ) subway/1_black 10 0 0 0.500000 0.500000 134217728 16777216 0 +( 1317 1176 -144 ) ( 1317 1184 -144 ) ( 1291 1184 -144 ) subway/light_small 21 -12 0 1 1 0 1 4800 +( 1291 1176 -136 ) ( 1291 1184 -144 ) ( 1317 1184 -144 ) subway/1_black 10 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1441 +{ +( 1455 1184 -136 ) ( 1455 1176 -136 ) ( 1455 1176 -144 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1487 1176 -144 ) ( 1487 1176 -136 ) ( 1487 1184 -136 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1447 1176 -144 ) ( 1447 1176 -136 ) ( 1487 1176 -136 ) subway/1_black 2 0 0 0.500000 0.500000 134217728 16777216 0 +( 1481 1176 -144 ) ( 1481 1184 -144 ) ( 1455 1184 -144 ) subway/light_small 17 -12 0 1 1 0 1 4800 +( 1455 1176 -136 ) ( 1455 1184 -144 ) ( 1481 1184 -144 ) subway/1_black 2 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1442 +{ +( 1535 1184 -136 ) ( 1535 1176 -136 ) ( 1535 1176 -144 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1567 1176 -144 ) ( 1567 1176 -136 ) ( 1567 1184 -136 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1527 1176 -144 ) ( 1527 1176 -136 ) ( 1567 1176 -136 ) subway/1_black 2 0 0 0.500000 0.500000 134217728 16777216 0 +( 1561 1176 -144 ) ( 1561 1184 -144 ) ( 1535 1184 -144 ) subway/light_small 1 -12 0 1 1 0 1 4800 +( 1535 1176 -136 ) ( 1535 1184 -144 ) ( 1561 1184 -144 ) subway/1_black 2 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1443 +{ +( 1480 1488 -104 ) ( 1472 1488 -104 ) ( 1472 1460 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1464 1460 -96 ) ( 1464 1488 -96 ) ( 1472 1488 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1544 1408 -104 ) ( 1544 1208 -104 ) ( 1544 1208 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1520 1216 -88 ) ( 1544 1216 -88 ) ( 1544 1216 -104 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1432 1224 -104 ) ( 1432 1424 -104 ) ( 1432 1424 -88 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1424 1512 -104 ) ( 1456 1512 -104 ) ( 1440 1512 -96 ) subway/1_bathroom_floor 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 1444 +{ +( 1132 916 -136 ) ( 1130 916 -136 ) ( 1130 920 -136 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +( 1130 920 -216 ) ( 1130 916 -216 ) ( 1132 916 -216 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +( 1132 920 -136 ) ( 1130 920 -136 ) ( 1130 920 -184 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1132 920 -192 ) ( 1130 918 -192 ) ( 1130 918 -144 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1130 920 -144 ) ( 1130 918 -144 ) ( 1130 918 -192 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +} +// brush 1445 +{ +( 1126 918 -192 ) ( 1126 918 -144 ) ( 1126 920 -144 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1126 918 -144 ) ( 1126 918 -192 ) ( 1124 920 -192 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1126 920 -184 ) ( 1126 920 -136 ) ( 1124 920 -136 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1124 916 -216 ) ( 1126 916 -216 ) ( 1126 920 -216 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +( 1126 920 -136 ) ( 1126 916 -136 ) ( 1124 916 -136 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +} +// brush 1446 +{ +( -648 1076 16 ) ( -680 1076 16 ) ( -680 1060 16 ) subway/1_tile_bottom 0 -8 0 0.500000 0.500000 0 318767104 0 +( -680 1060 32 ) ( -680 1076 32 ) ( -648 1076 32 ) subway/1_tile_bottom 0 -8 0 0.500000 0.500000 0 318767104 0 +( -680 1061 32 ) ( -648 1061 32 ) ( -648 1061 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -648 1060 32 ) ( -648 1076 32 ) ( -648 1076 16 ) subway/1_tile_bottom 8 0 0 0.500000 0.500000 0 318767104 0 +( -648 1080 32 ) ( -680 1080 32 ) ( -680 1080 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 1076 32 ) ( -680 1060 32 ) ( -680 1060 16 ) subway/1_tile_bottom 8 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1447 +{ +( -648 1076 32 ) ( -680 1076 32 ) ( -680 1060 32 ) subway/1_tile_big_blue 0 -8 0 0.500000 0.500000 0 285212672 0 +( -680 1060 48 ) ( -680 1076 48 ) ( -648 1076 48 ) subway/1_tile_big_blue 0 -8 0 0.500000 0.500000 0 285212672 0 +( -680 1061 48 ) ( -648 1061 48 ) ( -648 1061 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -648 1060 48 ) ( -648 1076 48 ) ( -648 1076 32 ) subway/1_tile_big_blue 8 0 0 0.500000 0.500000 0 285212672 0 +( -648 1080 48 ) ( -680 1080 48 ) ( -680 1080 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -680 1076 48 ) ( -680 1060 48 ) ( -680 1060 32 ) subway/1_tile_big_blue 8 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1448 +{ +( -648 1076 48 ) ( -680 1076 48 ) ( -680 1060 48 ) subway/1_tile -32 -8 0 0.500000 0.500000 0 318767104 0 +( -680 1060 96 ) ( -680 1076 96 ) ( -648 1076 96 ) subway/1_tile -32 -8 0 0.500000 0.500000 0 318767104 0 +( -680 1061 136 ) ( -648 1061 136 ) ( -648 1061 48 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -648 1060 136 ) ( -648 1076 136 ) ( -648 1076 48 ) subway/1_tile -24 0 0 0.500000 0.500000 0 318767104 0 +( -648 1080 136 ) ( -680 1080 136 ) ( -680 1080 48 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -680 1076 136 ) ( -680 1060 136 ) ( -680 1060 48 ) subway/1_tile -24 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1449 +{ +( -648 952 48 ) ( -680 952 48 ) ( -680 936 48 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -680 936 96 ) ( -680 952 96 ) ( -648 952 96 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -680 936 136 ) ( -648 936 136 ) ( -648 936 48 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -648 936 136 ) ( -648 952 136 ) ( -648 952 48 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( -648 952 136 ) ( -680 952 136 ) ( -680 952 48 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( -680 952 136 ) ( -680 936 136 ) ( -680 936 48 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1450 +{ +( -648 952 32 ) ( -680 952 32 ) ( -680 936 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -680 936 48 ) ( -680 952 48 ) ( -648 952 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -680 936 48 ) ( -648 936 48 ) ( -648 936 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -648 936 48 ) ( -648 952 48 ) ( -648 952 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -648 952 48 ) ( -680 952 48 ) ( -680 952 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -680 952 48 ) ( -680 936 48 ) ( -680 936 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1451 +{ +( -648 952 16 ) ( -680 952 16 ) ( -680 936 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 936 32 ) ( -680 952 32 ) ( -648 952 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 936 32 ) ( -648 936 32 ) ( -648 936 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -648 936 32 ) ( -648 952 32 ) ( -648 952 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -648 952 32 ) ( -680 952 32 ) ( -680 952 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 952 32 ) ( -680 936 32 ) ( -680 936 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1452 +{ +( -648 1016 16 ) ( -680 1016 16 ) ( -680 1000 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 1000 32 ) ( -680 1016 32 ) ( -648 1016 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 1000 32 ) ( -648 1000 32 ) ( -648 1000 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -648 1000 32 ) ( -648 1016 32 ) ( -648 1016 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -648 1016 32 ) ( -680 1016 32 ) ( -680 1016 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 1016 32 ) ( -680 1000 32 ) ( -680 1000 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1453 +{ +( -648 1016 32 ) ( -680 1016 32 ) ( -680 1000 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -680 1000 48 ) ( -680 1016 48 ) ( -648 1016 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -680 1000 48 ) ( -648 1000 48 ) ( -648 1000 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -648 1000 48 ) ( -648 1016 48 ) ( -648 1016 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -648 1016 48 ) ( -680 1016 48 ) ( -680 1016 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -680 1016 48 ) ( -680 1000 48 ) ( -680 1000 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 1454 +{ +( -648 1016 48 ) ( -680 1016 48 ) ( -680 1000 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -680 1000 96 ) ( -680 1016 96 ) ( -648 1016 96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -680 1000 136 ) ( -648 1000 136 ) ( -648 1000 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -648 1000 136 ) ( -648 1016 136 ) ( -648 1016 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -648 1016 136 ) ( -680 1016 136 ) ( -680 1016 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -680 1016 136 ) ( -680 1000 136 ) ( -680 1000 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 1455 +{ +( -648 1088 96 ) ( -680 1088 96 ) ( -680 936 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 936 104 ) ( -648 936 104 ) ( -648 936 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -648 936 104 ) ( -648 1088 104 ) ( -648 1088 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -648 1088 104 ) ( -680 1088 104 ) ( -680 1088 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 1088 104 ) ( -680 936 104 ) ( -680 936 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -664 936 112 ) ( -680 936 112 ) ( -672 1088 112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1456 +{ +( -680 936 128 ) ( -680 1088 128 ) ( -648 1088 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 936 104 ) ( -648 936 104 ) ( -648 936 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -648 936 104 ) ( -648 1088 104 ) ( -648 1088 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -648 1088 104 ) ( -680 1088 104 ) ( -680 1088 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 1088 104 ) ( -680 936 104 ) ( -680 936 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 936 112 ) ( -664 936 112 ) ( -672 1088 112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1457 +{ +( -496 1090 -35 ) ( -560 1090 -35 ) ( -560 1032 -9 ) subway/metal_rust 0 34 0 0.500000 0.456787 134217728 16777216 0 +( -560 1035 -2 ) ( -560 1093 -28 ) ( -496 1093 -28 ) subway/1_concrete_floor 47 -4 0 0.500000 0.460000 134217728 285212672 0 +( -752 995 7 ) ( -736 995 7 ) ( -744 998 14 ) subway/metal_rust 0 -1 0 0.500000 0.456776 134217728 16777216 0 +( -736 966 20 ) ( -752 966 20 ) ( -744 969 27 ) subway/metal_rust 0 27 0 0.500000 0.456772 134217728 16777216 0 +( -728 995 7 ) ( -728 980 13 ) ( -728 991 17 ) subway/metal_rust 11 -26 -24 0.500023 0.500024 134217728 16777216 0 +( -760 995 7 ) ( -760 1017 -3 ) ( -760 1009 9 ) subway/metal_rust 11 -26 -24 0.500023 0.500024 134217728 16777216 0 +} +// brush 1458 +{ +( -731 1112 -213 ) ( -742 1112 -150 ) ( -742 1048 -150 ) subway/metal_rust -16 0 -90 0.492340 0.500000 134217728 16777216 0 +( -734 1048 -149 ) ( -734 1112 -149 ) ( -723 1112 -212 ) subway/1_concrete_floor -31 33 -90 0.490000 0.500000 134217728 285212672 0 +( -777 1040 47 ) ( -771 1040 16 ) ( -766 1040 33 ) subway/metal_rust -5 -57 -79 0.500073 0.500043 134217728 16777216 0 +( -773 1008 23 ) ( -775 1008 39 ) ( -766 1008 33 ) subway/metal_rust -5 -57 -79 0.500073 0.500043 134217728 16777216 0 +( -777 1008 47 ) ( -777 1032 47 ) ( -769 1020 48 ) subway/metal_rust 0 6 90 0.500000 -0.492493 134217728 16777216 0 +( -771 1032 16 ) ( -771 1016 16 ) ( -763 1024 17 ) subway/metal_rust 0 18 90 0.500000 -0.492493 134217728 16777216 0 +} +// brush 1459 +{ +( -505 1112 8 ) ( -569 1112 8 ) ( -569 1048 8 ) subway/metal_rust 18 0 0 0.500000 0.500000 0 16777216 0 +( -569 1048 16 ) ( -569 1112 16 ) ( -505 1112 16 ) subway/1_concrete_floor 2 32 0 0.500000 0.500000 0 285212672 0 +( -769 1040 8 ) ( -737 1040 8 ) ( -753 1040 16 ) subway/metal_rust 18 0 0 0.500000 0.500000 0 16777216 0 +( -745 1008 8 ) ( -761 1008 8 ) ( -753 1008 16 ) subway/metal_rust 18 0 0 0.500000 0.500000 0 16777216 0 +( -705 1032 8 ) ( -705 1008 8 ) ( -705 1020 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -737 1016 8 ) ( -737 1032 8 ) ( -737 1024 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1460 +{ +( -496 1112 0 ) ( -560 1112 0 ) ( -560 1048 0 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -560 1048 8 ) ( -560 1112 8 ) ( -496 1112 8 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -760 1040 0 ) ( -728 1040 0 ) ( -744 1040 8 ) subway/metal_rust 0 -16 0 0.500000 0.500000 0 16777216 0 +( -736 1008 0 ) ( -752 1008 0 ) ( -744 1008 8 ) subway/metal_rust 0 -16 0 0.500000 0.500000 0 16777216 0 +( -696 1032 0 ) ( -696 1008 0 ) ( -696 1020 8 ) subway/metal_rust 0 -16 0 0.500000 0.500000 0 16777216 0 +( -728 1016 0 ) ( -728 1032 0 ) ( -728 1024 8 ) subway/metal_rust 0 -16 0 0.500000 0.500000 0 16777216 0 +} +// brush 1461 +{ +( -496 1112 0 ) ( -560 1112 0 ) ( -560 1048 0 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -560 1048 8 ) ( -560 1112 8 ) ( -496 1112 8 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -760 1040 0 ) ( -728 1040 0 ) ( -744 1040 8 ) subway/metal_rust 0 -16 0 0.500000 0.500000 0 16777216 0 +( -736 1008 0 ) ( -752 1008 0 ) ( -744 1008 8 ) subway/metal_rust 0 -16 0 0.500000 0.500000 0 16777216 0 +( -760 1008 0 ) ( -760 1032 0 ) ( -760 1020 8 ) subway/metal_rust 0 -16 0 0.500000 0.500000 0 16777216 0 +( -728 1032 0 ) ( -728 1016 0 ) ( -728 1024 8 ) subway/metal_rust 0 -16 0 0.500000 0.500000 0 16777216 0 +} +// brush 1462 +{ +( -496 1112 0 ) ( -560 1112 0 ) ( -560 1048 0 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -560 1048 8 ) ( -560 1112 8 ) ( -496 1112 8 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -752 1008 0 ) ( -736 1008 0 ) ( -744 1008 8 ) subway/metal_rust 0 -16 0 0.500000 0.500000 0 16777216 0 +( -736 976 0 ) ( -752 976 0 ) ( -744 976 8 ) subway/metal_rust 0 -16 0 0.500000 0.500000 0 16777216 0 +( -728 1008 0 ) ( -728 992 0 ) ( -728 1000 8 ) subway/metal_rust 0 -16 0 0.500000 0.500000 0 16777216 0 +( -760 1008 0 ) ( -760 1032 0 ) ( -760 1020 8 ) subway/metal_rust 0 -16 0 0.500000 0.500000 0 16777216 0 +} +// brush 1463 +{ +( -496 1112 8 ) ( -560 1112 8 ) ( -560 1048 8 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -560 1048 16 ) ( -560 1112 16 ) ( -496 1112 16 ) subway/1_concrete_floor 944 2528 0 0.500000 0.500000 0 285212672 0 +( -784 1120 -136 ) ( -784 1056 -136 ) ( -784 1056 -144 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -752 1008 8 ) ( -736 1008 8 ) ( -744 1008 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -736 976 8 ) ( -752 976 8 ) ( -744 976 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -760 1032 8 ) ( -760 1008 8 ) ( -760 1020 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1464 +{ +( -496 1112 8 ) ( -560 1112 8 ) ( -560 1048 8 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -560 1048 16 ) ( -560 1112 16 ) ( -496 1112 16 ) subway/1_concrete_floor 944 2528 0 0.500000 0.500000 0 285212672 0 +( -784 1120 -136 ) ( -784 1056 -136 ) ( -784 1056 -144 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -760 1040 8 ) ( -728 1040 8 ) ( -744 1040 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -736 1008 8 ) ( -752 1008 8 ) ( -744 1008 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -760 1032 8 ) ( -760 1008 8 ) ( -760 1020 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1465 +{ +( -496 1112 8 ) ( -560 1112 8 ) ( -560 1048 8 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -560 1048 16 ) ( -560 1112 16 ) ( -496 1112 16 ) subway/1_concrete_floor 944 2528 0 0.500000 0.500000 0 285212672 0 +( -752 1008 8 ) ( -736 1008 8 ) ( -744 1008 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -736 976 8 ) ( -752 976 8 ) ( -744 976 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -696 1032 8 ) ( -696 1008 8 ) ( -696 1020 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -728 992 8 ) ( -728 1008 8 ) ( -728 1000 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1466 +{ +( -496 1112 8 ) ( -560 1112 8 ) ( -560 1048 8 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -560 1048 16 ) ( -560 1112 16 ) ( -496 1112 16 ) subway/1_concrete_floor 944 2528 0 0.500000 0.500000 0 285212672 0 +( -632 1168 -136 ) ( -632 1232 -136 ) ( -632 1232 -144 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -752 1008 8 ) ( -736 1008 8 ) ( -744 1008 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -736 976 8 ) ( -752 976 8 ) ( -744 976 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -696 1008 8 ) ( -696 1032 8 ) ( -696 1020 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1467 +{ +( -496 1112 8 ) ( -560 1112 8 ) ( -560 1048 8 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -560 1048 16 ) ( -560 1112 16 ) ( -496 1112 16 ) subway/1_concrete_floor 944 2528 0 0.500000 0.500000 0 285212672 0 +( -632 1168 -136 ) ( -632 1232 -136 ) ( -632 1232 -144 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -760 1040 8 ) ( -728 1040 8 ) ( -744 1040 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -736 1008 8 ) ( -752 1008 8 ) ( -744 1008 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -696 1008 8 ) ( -696 1032 8 ) ( -696 1020 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1468 +{ +( -496 1112 8 ) ( -560 1112 8 ) ( -560 1048 8 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -560 1048 16 ) ( -560 1112 16 ) ( -496 1112 16 ) subway/1_concrete_floor 944 2528 0 0.500000 0.500000 0 285212672 0 +( -496 944 -144 ) ( -432 944 -144 ) ( -432 944 -152 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -632 1168 -136 ) ( -632 1232 -136 ) ( -632 1232 -144 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -784 1120 -136 ) ( -784 1056 -136 ) ( -784 1056 -144 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -752 976 8 ) ( -736 976 8 ) ( -744 976 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1469 +{ +( -496 1112 8 ) ( -560 1112 8 ) ( -560 1048 8 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -560 1048 16 ) ( -560 1112 16 ) ( -496 1112 16 ) subway/1_concrete_floor 944 2529 0 0.500000 0.500000 0 285212672 0 +( -632 1168 -136 ) ( -632 1232 -136 ) ( -632 1232 -144 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -560 1176 -136 ) ( -624 1176 -136 ) ( -624 1176 -144 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -784 1120 -136 ) ( -784 1056 -136 ) ( -784 1056 -144 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -728 1040 8 ) ( -760 1040 8 ) ( -744 1040 16 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1470 +{ +( -172 -832 -336 ) ( -172 -832 -344 ) ( -172 -824 -344 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -140 -824 -344 ) ( -140 -832 -344 ) ( -140 -832 -336 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -172 -832 -344 ) ( -140 -832 -344 ) ( -140 -824 -344 ) subway/light_small -148 12 0 1 1 134217728 1 3000 +( -172 -824 -336 ) ( -172 -824 -344 ) ( -168 -824 -344 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( -140 -832 -344 ) ( -172 -832 -344 ) ( -172 -824 -336 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1471 +{ +( -496 1128 8 ) ( -560 1128 8 ) ( -560 1064 8 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -560 1064 136 ) ( -560 1128 136 ) ( -496 1128 136 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1176 -144 ) ( -432 1176 -144 ) ( -432 1176 -152 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -672 1184 -136 ) ( -672 1248 -136 ) ( -672 1248 -144 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -560 1184 -136 ) ( -624 1184 -136 ) ( -624 1184 -144 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -784 1136 -136 ) ( -784 1072 -136 ) ( -784 1072 -144 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 1472 +{ +( -144 -616 -304 ) ( -264 -616 -304 ) ( -264 -696 -304 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( -264 -696 -296 ) ( -264 -616 -296 ) ( -144 -616 -296 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( -272 -616 -296 ) ( -272 -696 -296 ) ( -272 -696 -376 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -200 -656 -304 ) ( -184 -656 -304 ) ( -184 -656 -312 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -184 -640 -304 ) ( -200 -640 -304 ) ( -200 -640 -312 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -200 -656 -304 ) ( -200 -640 -304 ) ( -200 -656 -312 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1473 +{ +( -144 -616 -304 ) ( -264 -616 -304 ) ( -264 -696 -304 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( -264 -696 -296 ) ( -264 -616 -296 ) ( -144 -616 -296 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( -136 -592 -296 ) ( -256 -592 -296 ) ( -256 -592 -376 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -272 -616 -296 ) ( -272 -696 -296 ) ( -272 -696 -376 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -184 -656 -304 ) ( -184 -640 -304 ) ( -184 -640 -312 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -200 -640 -304 ) ( -184 -640 -304 ) ( -200 -640 -312 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1474 +{ +( -144 -616 -304 ) ( -264 -616 -304 ) ( -264 -696 -304 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( -264 -696 -296 ) ( -264 -616 -296 ) ( -144 -616 -296 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( -144 -696 -296 ) ( -144 -616 -296 ) ( -144 -616 -376 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -136 -592 -296 ) ( -256 -592 -296 ) ( -256 -592 -376 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -200 -656 -304 ) ( -184 -656 -304 ) ( -184 -656 -312 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -184 -640 -304 ) ( -184 -656 -304 ) ( -184 -640 -312 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1475 +{ +( -144 -616 -304 ) ( -264 -616 -304 ) ( -264 -696 -304 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( -264 -696 -296 ) ( -264 -616 -296 ) ( -144 -616 -296 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( -264 -704 -296 ) ( -144 -704 -296 ) ( -144 -704 -376 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -144 -696 -296 ) ( -144 -616 -296 ) ( -144 -616 -376 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -272 -616 -296 ) ( -272 -696 -296 ) ( -272 -696 -376 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -184 -656 -304 ) ( -200 -656 -304 ) ( -184 -656 -312 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1476 +{ +( -184 -640 -304 ) ( -200 -640 -304 ) ( -200 -656 -304 ) subway/light_yellow 16 0 0 0.500000 0.500000 0 16777217 6000 +( -200 -656 -296 ) ( -200 -640 -296 ) ( -184 -640 -296 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -200 -656 -304 ) ( -184 -656 -304 ) ( -184 -656 -312 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -184 -656 -304 ) ( -184 -640 -304 ) ( -184 -640 -312 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -184 -640 -304 ) ( -200 -640 -304 ) ( -200 -640 -312 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -200 -640 -304 ) ( -200 -656 -304 ) ( -200 -656 -312 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1477 +{ +( -250 -592 -362 ) ( -266 -592 -362 ) ( -266 -648 -362 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -266 -682 -360 ) ( -266 -626 -360 ) ( -250 -626 -360 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -266 -666 -344 ) ( -250 -666 -344 ) ( -250 -666 -424 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -256 -682 -344 ) ( -256 -626 -344 ) ( -256 -626 -424 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -250 -630 -344 ) ( -266 -630 -344 ) ( -266 -630 -424 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -264 -626 -344 ) ( -264 -682 -344 ) ( -264 -682 -424 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +} +// brush 1478 +{ +( -250 -592 -328 ) ( -266 -592 -328 ) ( -266 -648 -328 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -266 -682 -326 ) ( -266 -626 -326 ) ( -250 -626 -326 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -266 -666 -310 ) ( -250 -666 -310 ) ( -250 -666 -390 ) subway/greenbox_side 0 2 0 1 1 134217728 16777216 0 +( -256 -682 -310 ) ( -256 -626 -310 ) ( -256 -626 -390 ) subway/greenbox_side 0 2 0 1 1 134217728 16777216 0 +( -250 -630 -310 ) ( -266 -630 -310 ) ( -266 -630 -390 ) subway/greenbox_side 0 2 0 1 1 134217728 16777216 0 +( -264 -626 -310 ) ( -264 -682 -310 ) ( -264 -682 -390 ) subway/greenbox_side 0 2 0 1 1 134217728 16777216 0 +} +// brush 1479 +{ +( -250 -592 -360 ) ( -266 -592 -360 ) ( -266 -648 -360 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -266 -648 -328 ) ( -266 -592 -328 ) ( -250 -592 -328 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -266 -632 -312 ) ( -250 -632 -312 ) ( -250 -632 -392 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -256 -648 -312 ) ( -256 -592 -312 ) ( -256 -592 -392 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -250 -630 -312 ) ( -266 -630 -312 ) ( -266 -630 -392 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -264 -592 -312 ) ( -264 -648 -312 ) ( -264 -648 -392 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +} +// brush 1480 +{ +( -250 -626 -360 ) ( -266 -626 -360 ) ( -266 -682 -360 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -266 -682 -328 ) ( -266 -626 -328 ) ( -250 -626 -328 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -266 -666 -312 ) ( -250 -666 -312 ) ( -250 -666 -392 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -256 -682 -312 ) ( -256 -626 -312 ) ( -256 -626 -392 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -250 -664 -312 ) ( -266 -664 -312 ) ( -266 -664 -392 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +( -264 -626 -312 ) ( -264 -682 -312 ) ( -264 -682 -392 ) subway/greenbox_side 0 0 0 1 1 134217728 16777216 0 +} +// brush 1481 +{ +( -250 -624 -360 ) ( -266 -624 -360 ) ( -266 -680 -360 ) subway/greenbox_side 2 0 0 1 1 134217728 16777216 0 +( -266 -680 -328 ) ( -266 -624 -328 ) ( -250 -624 -328 ) subway/greenbox_side 2 0 0 1 1 134217728 16777216 0 +( -266 -664 -312 ) ( -250 -664 -312 ) ( -250 -664 -392 ) subway/greenbox_side 2 8 0 1 1 134217728 16777216 0 +( -258 -680 -312 ) ( -258 -624 -312 ) ( -258 -624 -392 ) subway/greenbox_front3 48 -16 0 0.500000 0.500000 134217728 536870912 0 +( -250 -632 -312 ) ( -266 -632 -312 ) ( -266 -632 -392 ) subway/greenbox_side 2 8 0 1 1 134217728 16777216 0 +( -264 -624 -312 ) ( -264 -680 -312 ) ( -264 -680 -392 ) subway/greenbox_front2 40 48 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1482 +{ +( -229 -676 -388 ) ( -229 -676 -404 ) ( -270 -637 -404 ) subway/greenbox_side -4 -15 -90 1 0.719421 134217728 16777216 0 +( -247 -614 -404 ) ( -207 -653 -404 ) ( -207 -653 -388 ) subway/greenbox_side -4 0 -90 1 0.719238 134217728 16777216 0 +( -225 -613 -404 ) ( -225 -613 -388 ) ( -280 -671 -388 ) subway/greenbox_side -3 5 -90 1.000031 -0.719299 134217728 16777216 0 +( -236 -602 -396 ) ( -196 -641 -396 ) ( -252 -699 -396 ) subway/greenbox_front2 -47 12 136 0.499991 0.499917 134217728 16777216 0 +( -202 -636 -388 ) ( -202 -636 -404 ) ( -257 -693 -404 ) subway/greenbox_side -3 4 -90 1 -0.719543 134217728 16777216 0 +( -196 -641 -398 ) ( -236 -602 -398 ) ( -292 -660 -398 ) subway/greenbox_front2 39 12 -43 0.499991 -0.499991 134217728 16777216 0 +} +// brush 1483 +{ +( -288 -896 -304 ) ( 128 -896 -304 ) ( 128 -704 -304 ) subway/con14 192 176 0 0.500000 0.500000 0 285212672 0 +( -264 -880 -296 ) ( -112 -880 -296 ) ( -112 -904 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -136 -768 -304 ) ( -120 -768 -304 ) ( -120 -768 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -72 -416 -304 ) ( -72 -432 -304 ) ( -72 -432 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -56 -432 -304 ) ( -56 -416 -304 ) ( -56 -416 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -56 -432 -304 ) ( -72 -432 -304 ) ( -56 -432 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1484 +{ +( -288 -896 -304 ) ( 128 -896 -304 ) ( 128 -704 -304 ) subway/con14 192 176 0 0.500000 0.500000 0 285212672 0 +( -264 -880 -296 ) ( -112 -880 -296 ) ( -112 -904 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -136 -768 -304 ) ( -120 -768 -304 ) ( -120 -768 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -16 -768 -304 ) ( -16 -752 -304 ) ( -16 -768 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -56 -408 -304 ) ( -72 -408 -304 ) ( -72 -408 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -56 -416 -304 ) ( -56 -432 -304 ) ( -56 -416 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1485 +{ +( -288 -896 -304 ) ( 128 -896 -304 ) ( 128 -704 -304 ) subway/con14 192 176 0 0.500000 0.500000 0 285212672 0 +( -264 -880 -296 ) ( -112 -880 -296 ) ( -112 -904 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -16 -408 -216 ) ( -168 -408 -216 ) ( -168 -408 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -56 -768 -304 ) ( -56 -752 -304 ) ( -56 -768 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -72 -416 -304 ) ( -72 -432 -304 ) ( -72 -432 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -72 -416 -304 ) ( -56 -416 -304 ) ( -72 -416 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1486 +{ +( -288 -896 -304 ) ( 128 -896 -304 ) ( 128 -704 -304 ) subway/con14 192 176 0 0.500000 0.500000 0 285212672 0 +( -264 -880 -296 ) ( -112 -880 -296 ) ( -112 -904 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -16 -408 -216 ) ( -168 -408 -216 ) ( -168 -408 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -136 -768 -304 ) ( -120 -768 -304 ) ( -120 -768 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -120 -752 -304 ) ( -120 -768 -304 ) ( -120 -752 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -72 -432 -304 ) ( -72 -416 -304 ) ( -72 -432 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1487 +{ +( -288 -896 -304 ) ( 128 -896 -304 ) ( 128 -704 -304 ) subway/con14 192 176 0 0.500000 0.500000 0 285212672 0 +( -264 -880 -296 ) ( -112 -880 -296 ) ( -112 -904 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -16 -408 -216 ) ( -168 -408 -216 ) ( -168 -408 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -16 -752 -304 ) ( -16 -768 -304 ) ( -16 -768 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 0 -656 -304 ) ( 0 -640 -304 ) ( 0 -640 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -16 -640 -304 ) ( 0 -640 -304 ) ( -16 -640 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1488 +{ +( -288 -896 -304 ) ( 128 -896 -304 ) ( 128 -704 -304 ) subway/con14 192 176 0 0.500000 0.500000 0 285212672 0 +( -264 -880 -296 ) ( -112 -880 -296 ) ( -112 -904 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 16 -920 -184 ) ( 16 -888 -184 ) ( 16 -888 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -16 -408 -216 ) ( -168 -408 -216 ) ( -168 -408 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -16 -656 -304 ) ( 0 -656 -304 ) ( 0 -656 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 0 -640 -304 ) ( 0 -656 -304 ) ( 0 -640 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1489 +{ +( -288 -896 -304 ) ( 128 -896 -304 ) ( 128 -704 -304 ) subway/con14 192 176 0 0.500000 0.500000 0 285212672 0 +( -264 -880 -296 ) ( -112 -880 -296 ) ( -112 -904 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 16 -920 -184 ) ( 16 -888 -184 ) ( 16 -888 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -16 -752 -304 ) ( -16 -768 -304 ) ( -16 -768 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -16 -752 -304 ) ( 0 -752 -304 ) ( -16 -752 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 0 -656 -304 ) ( -16 -656 -304 ) ( 0 -656 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1490 +{ +( -144 -784 -296 ) ( -144 -816 -296 ) ( -144 -816 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -288 -896 -304 ) ( 128 -896 -304 ) ( 128 -704 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -264 -880 -296 ) ( -112 -880 -296 ) ( -112 -904 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -136 -656 -304 ) ( -120 -656 -304 ) ( -120 -656 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -120 -640 -304 ) ( -136 -640 -304 ) ( -136 -640 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -136 -656 -304 ) ( -136 -640 -304 ) ( -136 -656 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1491 +{ +( -144 -784 -296 ) ( -144 -816 -296 ) ( -144 -816 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -288 -896 -304 ) ( 128 -896 -304 ) ( 128 -704 -304 ) subway/con14 192 176 0 0.500000 0.500000 0 285212672 0 +( -264 -880 -296 ) ( -112 -880 -296 ) ( -112 -904 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -16 -408 -216 ) ( -168 -408 -216 ) ( -168 -408 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -120 -768 -304 ) ( -120 -752 -304 ) ( -120 -752 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -136 -640 -304 ) ( -120 -640 -304 ) ( -136 -640 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1492 +{ +( -144 -784 -296 ) ( -144 -816 -296 ) ( -144 -816 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -288 -896 -304 ) ( 128 -896 -304 ) ( 128 -704 -304 ) subway/con14 192 176 0 0.500000 0.500000 0 285212672 0 +( -264 -880 -296 ) ( -112 -880 -296 ) ( -112 -904 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -120 -768 -304 ) ( -120 -752 -304 ) ( -120 -752 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -136 -752 -304 ) ( -120 -752 -304 ) ( -136 -752 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -120 -656 -304 ) ( -136 -656 -304 ) ( -120 -656 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1493 +{ +( -288 -896 -304 ) ( 128 -896 -304 ) ( 128 -704 -304 ) subway/con14 192 176 0 0.500000 0.500000 0 285212672 0 +( -264 -880 -296 ) ( -112 -880 -296 ) ( -112 -904 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 16 -920 -184 ) ( 16 -888 -184 ) ( 16 -888 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -136 -768 -304 ) ( -120 -768 -304 ) ( -120 -768 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 0 -752 -304 ) ( -16 -752 -304 ) ( -16 -752 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 0 -752 -304 ) ( 0 -768 -304 ) ( 0 -752 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1494 +{ +( -144 -784 -296 ) ( -144 -816 -296 ) ( -144 -816 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -288 -896 -304 ) ( 128 -896 -304 ) ( 128 -704 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -264 -880 -296 ) ( -112 -880 -296 ) ( -112 -904 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -136 -768 -304 ) ( -120 -768 -304 ) ( -120 -768 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -120 -752 -304 ) ( -136 -752 -304 ) ( -136 -752 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -136 -768 -304 ) ( -136 -752 -304 ) ( -136 -768 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1495 +{ +( -176 -792 -296 ) ( -104 -792 -296 ) ( -176 -792 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -144 -784 -296 ) ( -144 -816 -296 ) ( -144 -816 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -288 -896 -304 ) ( 128 -896 -304 ) ( 128 -704 -304 ) subway/con14 192 176 0 0.500000 0.500000 0 285212672 0 +( -264 -880 -296 ) ( -112 -880 -296 ) ( -112 -904 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 16 -920 -184 ) ( 16 -888 -184 ) ( 16 -888 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -120 -768 -304 ) ( -136 -768 -304 ) ( -120 -768 -312 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1496 +{ +( -144 -568 -312 ) ( -144 -600 -312 ) ( -144 -600 -352 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -152 -472 -296 ) ( -192 -472 -296 ) ( -192 -472 -336 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -136 -644 -312 ) ( -136 -612 -312 ) ( -136 -612 -352 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -296 -784 -304 ) ( -336 -784 -304 ) ( -336 -752 -304 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -344 -760 -320 ) ( -344 -792 -320 ) ( -304 -792 -320 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -616 -320 ) ( -144 -616 -320 ) ( -140 -616 -304 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 1497 +{ +( -380 -792 -288 ) ( -340 -792 -288 ) ( -340 -792 -328 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -144 -640 -312 ) ( -144 -672 -312 ) ( -144 -672 -352 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -136 -636 -312 ) ( -136 -604 -312 ) ( -136 -604 -352 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -296 -784 -304 ) ( -336 -784 -304 ) ( -336 -752 -304 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -344 -760 -320 ) ( -344 -792 -320 ) ( -304 -792 -320 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -144 -680 -320 ) ( -136 -680 -320 ) ( -140 -680 -304 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 1498 +{ +( -248 -592 -304 ) ( -272 -592 -304 ) ( -248 -592 -368 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( -248 -524 -400 ) ( -272 -524 -400 ) ( -272 -628 -400 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( -264 -584 -328 ) ( -264 -552 -328 ) ( -264 -552 -368 ) subway/1_tunnelwall_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( -272 -556 -328 ) ( -272 -588 -328 ) ( -272 -588 -368 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( -500 -704 -304 ) ( -460 -704 -304 ) ( -460 -704 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( -232 -704 -384 ) ( -280 -704 -384 ) ( -256 -608 -384 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1499 +{ +( -248 -592 -304 ) ( -272 -592 -304 ) ( -248 -592 -368 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( -272 -628 -304 ) ( -272 -524 -304 ) ( -248 -524 -304 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( -264 -584 -328 ) ( -264 -552 -328 ) ( -264 -552 -368 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( -272 -556 -328 ) ( -272 -588 -328 ) ( -272 -588 -368 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( -500 -704 -304 ) ( -460 -704 -304 ) ( -460 -704 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( -280 -704 -384 ) ( -232 -704 -384 ) ( -256 -608 -384 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1500 +{ +( -144 -616 -408 ) ( -264 -616 -408 ) ( -264 -696 -408 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -264 -696 -400 ) ( -264 -616 -400 ) ( -144 -616 -400 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( -264 -704 -400 ) ( -144 -704 -400 ) ( -144 -704 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -136 -696 -400 ) ( -136 -616 -400 ) ( -136 -616 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -144 -600 -400 ) ( -264 -600 -400 ) ( -264 -600 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -272 -624 -400 ) ( -272 -704 -400 ) ( -272 -704 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 1501 +{ +( -128 -592 -304 ) ( -152 -592 -304 ) ( -128 -592 -368 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -128 -452 -400 ) ( -152 -452 -400 ) ( -152 -556 -400 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( -144 -528 -328 ) ( -144 -496 -328 ) ( -144 -496 -368 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 0 318767104 0 +( -264 -484 -328 ) ( -264 -516 -328 ) ( -264 -516 -368 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 0 318767104 0 +( -388 -600 -304 ) ( -348 -600 -304 ) ( -348 -600 -344 ) subway/1_tunnelwall_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( -264 -608 -384 ) ( -264 -576 -384 ) ( -144 -592 -384 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1502 +{ +( -128 -592 -304 ) ( -152 -592 -304 ) ( -128 -592 -368 ) subway/1_tile 0 -48 0 0.500000 0.500000 0 318767104 0 +( -152 -556 -304 ) ( -152 -452 -304 ) ( -128 -452 -304 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( -144 -528 -328 ) ( -144 -496 -328 ) ( -144 -496 -368 ) subway/1_tile -16 -48 0 0.500000 0.500000 0 318767104 0 +( -264 -484 -328 ) ( -264 -516 -328 ) ( -264 -516 -368 ) subway/1_tile -16 -48 0 0.500000 0.500000 0 318767104 0 +( -388 -600 -304 ) ( -348 -600 -304 ) ( -348 -600 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( -264 -576 -384 ) ( -264 -608 -384 ) ( -144 -592 -384 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 1503 +{ +( -128 -696 -304 ) ( -152 -696 -304 ) ( -128 -696 -368 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( -152 -660 -304 ) ( -152 -556 -304 ) ( -128 -556 -304 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( -144 -632 -328 ) ( -144 -600 -328 ) ( -144 -600 -368 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( -264 -588 -328 ) ( -264 -620 -328 ) ( -264 -620 -368 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( -388 -704 -304 ) ( -348 -704 -304 ) ( -348 -704 -344 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( -264 -680 -384 ) ( -264 -712 -384 ) ( -144 -696 -384 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +} +// brush 1504 +{ +( -128 -696 -304 ) ( -152 -696 -304 ) ( -128 -696 -368 ) subway/1_tunnelwall_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( -128 -556 -400 ) ( -152 -556 -400 ) ( -152 -660 -400 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -144 -632 -328 ) ( -144 -600 -328 ) ( -144 -600 -368 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -264 -588 -328 ) ( -264 -620 -328 ) ( -264 -620 -368 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -388 -704 -304 ) ( -348 -704 -304 ) ( -348 -704 -344 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -264 -712 -384 ) ( -264 -680 -384 ) ( -144 -696 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 1505 +{ +( -144 -600 -328 ) ( -144 -632 -328 ) ( -144 -632 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -152 -488 -312 ) ( -192 -488 -312 ) ( -192 -488 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -708 -328 ) ( -136 -676 -328 ) ( -136 -676 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -296 -784 -320 ) ( -336 -784 -320 ) ( -336 -752 -320 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -144 -576 -336 ) ( -144 -680 -336 ) ( -120 -576 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -88 -616 -336 ) ( -152 -616 -336 ) ( -120 -616 -320 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 1506 +{ +( -380 -792 -304 ) ( -340 -792 -304 ) ( -340 -792 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -144 -656 -328 ) ( -144 -688 -328 ) ( -144 -688 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -700 -328 ) ( -136 -668 -328 ) ( -136 -668 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -296 -784 -320 ) ( -336 -784 -320 ) ( -336 -752 -320 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -144 -576 -336 ) ( -144 -680 -336 ) ( -120 -576 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -152 -680 -336 ) ( -88 -680 -336 ) ( -120 -680 -320 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 1507 +{ +( -144 -592 -344 ) ( -144 -624 -344 ) ( -144 -624 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -208 -488 -344 ) ( -248 -488 -344 ) ( -248 -488 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( -136 -660 -344 ) ( -136 -628 -344 ) ( -136 -628 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -296 -792 -384 ) ( -336 -792 -384 ) ( -336 -760 -384 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -344 -760 -400 ) ( -344 -792 -400 ) ( -304 -792 -400 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -104 -616 -400 ) ( -152 -616 -400 ) ( -128 -616 -384 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1508 +{ +( -380 -792 -344 ) ( -340 -792 -344 ) ( -340 -792 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( -144 -648 -344 ) ( -144 -680 -344 ) ( -144 -680 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -136 -652 -344 ) ( -136 -620 -344 ) ( -136 -620 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -296 -792 -384 ) ( -336 -792 -384 ) ( -336 -760 -384 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -344 -760 -400 ) ( -344 -792 -400 ) ( -304 -792 -400 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -152 -680 -400 ) ( -104 -680 -400 ) ( -128 -680 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 1509 +{ +( -144 -592 -328 ) ( -144 -624 -328 ) ( -144 -624 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -208 -488 -328 ) ( -248 -488 -328 ) ( -248 -488 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -660 -328 ) ( -136 -628 -328 ) ( -136 -628 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -296 -792 -368 ) ( -336 -792 -368 ) ( -336 -760 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -344 -760 -384 ) ( -344 -792 -384 ) ( -304 -792 -384 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -128 -616 -384 ) ( -152 -616 -384 ) ( -140 -616 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 1510 +{ +( -380 -792 -328 ) ( -340 -792 -328 ) ( -340 -792 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -144 -568 -328 ) ( -144 -600 -328 ) ( -144 -600 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -652 -328 ) ( -136 -620 -328 ) ( -136 -620 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -296 -792 -368 ) ( -336 -792 -368 ) ( -336 -760 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -344 -760 -384 ) ( -344 -792 -384 ) ( -304 -792 -384 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -680 -384 ) ( -112 -680 -384 ) ( -124 -680 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 1511 +{ +( 1488 2224 -444 ) ( 1472 2224 -444 ) ( 1472 2208 -444 ) subway/light_yellow 0 0 0 0.500000 0.500000 134217728 16777217 4000 +( 1472 2208 -440 ) ( 1472 2224 -440 ) ( 1488 2224 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1472 2208 -440 ) ( 1488 2208 -440 ) ( 1488 2208 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1488 2208 -440 ) ( 1488 2224 -440 ) ( 1488 2224 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1488 2224 -440 ) ( 1472 2224 -440 ) ( 1472 2224 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1472 2224 -440 ) ( 1472 2208 -440 ) ( 1472 2208 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1512 +{ +( 1376 2224 -444 ) ( 1360 2224 -444 ) ( 1360 2208 -444 ) subway/light_yellow 0 0 0 0.500000 0.500000 134217728 16777217 4000 +( 1360 2208 -440 ) ( 1360 2224 -440 ) ( 1376 2224 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1360 2208 -440 ) ( 1376 2208 -440 ) ( 1376 2208 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1376 2208 -440 ) ( 1376 2224 -440 ) ( 1376 2224 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1376 2224 -440 ) ( 1360 2224 -440 ) ( 1360 2224 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1360 2224 -440 ) ( 1360 2208 -440 ) ( 1360 2208 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1513 +{ +( 1616 -1912 -552 ) ( 1616 -2056 -552 ) ( 1688 -2056 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1688 -2056 -536 ) ( 1616 -2056 -536 ) ( 1616 -1912 -536 ) subway/1_tunnelfloor_2 11 0 0 1 -1 0 285212672 0 +( 1624 -1888 -552 ) ( 1688 -1888 -552 ) ( 1688 -1888 -536 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1712 -1920 -536 ) ( 1688 -1888 -536 ) ( 1688 -1888 -552 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 1624 -1920 -552 ) ( 1624 -1920 -536 ) ( 1712 -1920 -536 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1544 -1920 -536 ) ( 1544 -1920 -552 ) ( 1544 -1888 -552 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1514 +{ +( 1688 -1912 -552 ) ( 1616 -1912 -552 ) ( 1616 -2056 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1616 -2056 -536 ) ( 1616 -1912 -536 ) ( 1688 -1912 -536 ) subway/1_tunnelfloor_2 43 0 0 1 1 0 285212672 0 +( 1608 -2080 -536 ) ( 1608 -2080 -552 ) ( 1544 -2080 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1688 -2080 -552 ) ( 1688 -2080 -536 ) ( 1712 -2048 -536 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1624 -2048 -536 ) ( 1624 -2048 -552 ) ( 1712 -2048 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1544 -2048 -552 ) ( 1544 -2048 -536 ) ( 1544 -2080 -536 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1515 +{ +( 2120 -2368 -552 ) ( 2000 -2368 -552 ) ( 2000 -2392 -552 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 2024 -2368 -536 ) ( 2024 -2344 -536 ) ( 2144 -2344 -536 ) subway/1_tunnelfloor_2 -16 9 90 1 1 0 285212672 0 +( 1976 -2080 -536 ) ( 1976 -2080 -552 ) ( 1976 -2752 -552 ) subway/1_tunneltrack_plain -16 -48 0 0.500000 0.500000 0 301989888 0 +( 1952 -2048 -536 ) ( 1952 -2048 -552 ) ( 1976 -2080 -552 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1952 -2752 -536 ) ( 1952 -2752 -552 ) ( 1952 -2048 -552 ) subway/1_tunneltrack_plain -16 -48 0 0.500000 0.500000 0 301989888 0 +( 1952 -2752 -552 ) ( 1952 -2752 -536 ) ( 1976 -2752 -536 ) subway/1_tunneltrack_plain -16 -48 0 0.500000 0.500000 0 301989888 0 +} +// brush 1516 +{ +( 2064 -2312 -536 ) ( 2064 -2304 -536 ) ( 2016 -2304 -536 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1960 -2448 -528 ) ( 1960 -2184 -528 ) ( 1992 -2184 -528 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1872 -2316 -516 ) ( 1872 -2580 -516 ) ( 1872 -2580 -548 ) subway/metal2 -16 -48 0 0.500000 0.500000 0 16777216 0 +( 2064 -1880 -536 ) ( 2064 -1880 -504 ) ( 2016 -1880 -504 ) subway/metal2 32 -48 0 0.500000 0.500000 0 16777216 0 +( 1880 -2648 -728 ) ( 1880 -2648 -768 ) ( 1880 -2656 -768 ) subway/metal2 -16 -48 0 0.500000 0.500000 0 16777216 0 +( 1896 -2532 -536 ) ( 1856 -2532 -536 ) ( 1876 -2532 -528 ) subway/metal2 32 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 1517 +{ +( 1952 -2088 -728 ) ( 1952 -2088 -768 ) ( 1952 -2096 -768 ) subway/metal2 -16 -48 0 0.500000 0.500000 0 16777216 0 +( 2136 -1880 -536 ) ( 2136 -1880 -504 ) ( 2088 -1880 -504 ) subway/metal2 -24 -48 0 0.500000 0.500000 0 16777216 0 +( 1944 -2884 -516 ) ( 1944 -3148 -516 ) ( 1944 -3148 -548 ) subway/metal2 -16 -48 0 0.500000 0.500000 0 16777216 0 +( 2032 -2448 -528 ) ( 2032 -2184 -528 ) ( 2064 -2184 -528 ) subway/metal2 -24 16 0 0.500000 0.500000 0 16777216 0 +( 2136 -2312 -536 ) ( 2136 -2304 -536 ) ( 2088 -2304 -536 ) subway/metal2 -24 16 0 0.500000 0.500000 0 16777216 0 +( 1976 -2532 -536 ) ( 1936 -2532 -536 ) ( 1956 -2532 -528 ) subway/metal2 -24 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 1518 +{ +( 1544 -1928 -504 ) ( 1544 -1896 -504 ) ( 1544 -1896 -536 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 1440 -1888 -448 ) ( 1440 -1888 -480 ) ( 1552 -1888 -480 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1888 -480 ) ( 1440 -1888 -448 ) ( 1408 -1920 -448 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -1968 -480 ) ( 1536 -2024 -480 ) ( 1544 -1996 -480 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -2016 -448 ) ( 1536 -1944 -448 ) ( 1544 -1980 -448 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -1920 -408 ) ( 1568 -1920 -408 ) ( 1536 -1920 -536 ) subway/1_tunnelwall_pipe -16 -56 0 0.500000 0.500000 0 16777216 0 +} +// brush 1519 +{ +( 1544 -2080 -504 ) ( 1576 -2080 -504 ) ( 1576 -2080 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1544 -1928 -504 ) ( 1544 -1896 -504 ) ( 1544 -1896 -536 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 1280 -2048 -480 ) ( 1280 -2048 -448 ) ( 1248 -2080 -448 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -1968 -480 ) ( 1536 -2024 -480 ) ( 1544 -1996 -480 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -2016 -448 ) ( 1536 -1944 -448 ) ( 1544 -1980 -448 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -2048 -448 ) ( 1280 -2048 -480 ) ( 1552 -2048 -480 ) subway/1_tunnelwall_pipe -16 -56 0 0.500000 0.500000 0 16777216 0 +} +// brush 1520 +{ +( 1568 -1888 -536 ) ( 1536 -1888 -536 ) ( 1536 -1920 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1544 -1928 -504 ) ( 1544 -1896 -504 ) ( 1544 -1896 -536 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1440 -1888 -512 ) ( 1440 -1888 -528 ) ( 1552 -1888 -528 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1888 -528 ) ( 1440 -1888 -512 ) ( 1408 -1920 -512 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -2024 -520 ) ( 1536 -1976 -520 ) ( 1544 -2000 -520 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -1920 -408 ) ( 1568 -1920 -408 ) ( 1536 -1920 -536 ) subway/1_tunnelwall_floor 24 -16 0 1 0.500000 0 285212672 0 +} +// brush 1521 +{ +( 1568 -1888 -536 ) ( 1536 -1888 -536 ) ( 1536 -1920 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1544 -2080 -504 ) ( 1576 -2080 -504 ) ( 1576 -2080 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1544 -1928 -504 ) ( 1544 -1896 -504 ) ( 1544 -1896 -536 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1280 -2048 -528 ) ( 1280 -2048 -512 ) ( 1248 -2080 -512 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -2024 -520 ) ( 1536 -1976 -520 ) ( 1544 -2000 -520 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -2048 -512 ) ( 1280 -2048 -528 ) ( 1552 -2048 -528 ) subway/1_tunnelwall_floor 24 -16 0 1 0.500000 0 285212672 0 +} +// brush 1522 +{ +( 1544 -1928 -504 ) ( 1544 -1896 -504 ) ( 1544 -1896 -536 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1440 -1888 -480 ) ( 1440 -1888 -512 ) ( 1552 -1888 -512 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1888 -512 ) ( 1440 -1888 -480 ) ( 1408 -1920 -480 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -1976 -520 ) ( 1536 -2024 -520 ) ( 1544 -2000 -520 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -2040 -488 ) ( 1536 -1936 -488 ) ( 1544 -1988 -488 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -1920 -408 ) ( 1568 -1920 -408 ) ( 1536 -1920 -536 ) subway/1_tunnelwall 24 -8 0 1 1 0 301989888 0 +} +// brush 1523 +{ +( 1544 -2080 -504 ) ( 1576 -2080 -504 ) ( 1576 -2080 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1544 -1928 -504 ) ( 1544 -1896 -504 ) ( 1544 -1896 -536 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1280 -2048 -512 ) ( 1280 -2048 -480 ) ( 1248 -2080 -480 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -1976 -520 ) ( 1536 -2024 -520 ) ( 1544 -2000 -520 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -2040 -488 ) ( 1536 -1936 -488 ) ( 1544 -1988 -488 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1280 -2048 -480 ) ( 1280 -2048 -512 ) ( 1552 -2048 -512 ) subway/1_tunnelwall 24 -8 0 1 1 0 301989888 0 +} +// brush 1524 +{ +( 1688 -1880 -416 ) ( 1616 -1880 -416 ) ( 1616 -2024 -416 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1616 -2024 -400 ) ( 1616 -1880 -400 ) ( 1688 -1880 -400 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1624 -2088 -400 ) ( 1696 -2088 -400 ) ( 1696 -2088 -416 ) subway/1_tunneltrack_plain 32 16 0 0.500000 0.500000 0 301989888 0 +( 1680 -2024 -400 ) ( 1680 -1880 -400 ) ( 1680 -1880 -416 ) subway/1_tunneltrack_plain 32 16 0 0.500000 0.500000 0 301989888 0 +( 1696 -1880 -400 ) ( 1624 -1880 -400 ) ( 1624 -1880 -416 ) subway/1_tunneltrack_plain 32 16 0 0.500000 0.500000 0 301989888 0 +( 1544 -1896 -424 ) ( 1544 -1856 -424 ) ( 1544 -1876 -408 ) subway/1_tunneltrack_plain 32 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 1525 +{ +( 1688 -1880 -552 ) ( 1616 -1880 -552 ) ( 1616 -2024 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1616 -2024 -536 ) ( 1616 -1880 -536 ) ( 1688 -1880 -536 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1624 -2048 -536 ) ( 1696 -2048 -536 ) ( 1696 -2048 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1712 -2024 -536 ) ( 1712 -1880 -536 ) ( 1712 -1880 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1688 -1920 -536 ) ( 1616 -1920 -536 ) ( 1616 -1920 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -1880 -536 ) ( 1536 -2024 -536 ) ( 1536 -2024 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1526 +{ +( 1688 -1856 -408 ) ( 1688 -1888 -408 ) ( 1656 -1888 -408 ) subway/1_tunnelwall -24 14 90 0.500000 0.500000 0 301989888 0 +( 1536 -1856 -536 ) ( 1536 -1856 -504 ) ( 1536 -1888 -504 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1616 -1880 -448 ) ( 1680 -1880 -448 ) ( 1680 -1880 -408 ) subway/1_tunnelwall -8 0 -180 0.500000 -0.500000 0 301989888 0 +( 1688 -1888 -408 ) ( 1680 -1880 -408 ) ( 1680 -1880 -448 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1576 -1888 -536 ) ( 1576 -1888 -504 ) ( 1608 -1888 -504 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1596 -1880 -448 ) ( 1560 -1888 -448 ) ( 1632 -1888 -448 ) subway/1_tunnelwall -56 14 90 0.500000 0.500000 0 301989888 0 +} +// brush 1527 +{ +( 1536 -1856 -536 ) ( 1536 -1856 -504 ) ( 1536 -1888 -504 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1616 -1880 -480 ) ( 1680 -1880 -480 ) ( 1680 -1880 -448 ) subway/1_tunnelwall -8 0 -180 0.500000 -0.500000 0 301989888 0 +( 1688 -1888 -448 ) ( 1680 -1880 -448 ) ( 1680 -1880 -480 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1576 -1888 -536 ) ( 1576 -1888 -504 ) ( 1608 -1888 -504 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 1580 -1880 -480 ) ( 1552 -1888 -480 ) ( 1608 -1888 -480 ) subway/1_tunnelwall -56 14 90 0.500000 0.500000 0 301989888 0 +( 1596 -1880 -448 ) ( 1632 -1888 -448 ) ( 1560 -1888 -448 ) subway/1_tunnelwall -56 14 90 0.500000 0.500000 0 301989888 0 +} +// brush 1528 +{ +( 1536 -1856 -536 ) ( 1536 -1856 -504 ) ( 1536 -1888 -504 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1616 -1880 -488 ) ( 1680 -1880 -488 ) ( 1680 -1880 -480 ) subway/1_tunnelwall -8 0 -180 0.500000 -0.500000 0 301989888 0 +( 1688 -1888 -480 ) ( 1680 -1880 -480 ) ( 1680 -1880 -488 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1576 -1888 -536 ) ( 1576 -1888 -504 ) ( 1608 -1888 -504 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1588 -1880 -488 ) ( 1536 -1888 -488 ) ( 1640 -1888 -488 ) subway/1_tunnelwall -56 14 90 0.500000 0.500000 0 301989888 0 +( 1580 -1880 -480 ) ( 1608 -1888 -480 ) ( 1552 -1888 -480 ) subway/1_tunnelwall -56 14 90 0.500000 0.500000 0 301989888 0 +} +// brush 1529 +{ +( 1536 -1856 -536 ) ( 1536 -1856 -504 ) ( 1536 -1888 -504 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1616 -1880 -520 ) ( 1680 -1880 -520 ) ( 1680 -1880 -488 ) subway/1_tunnelwall -8 0 -180 0.500000 -0.500000 0 301989888 0 +( 1688 -1888 -488 ) ( 1680 -1880 -488 ) ( 1680 -1880 -520 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1576 -1888 -536 ) ( 1576 -1888 -504 ) ( 1608 -1888 -504 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1576 -1880 -520 ) ( 1552 -1888 -520 ) ( 1600 -1888 -520 ) subway/1_tunnelwall -56 14 90 0.500000 0.500000 0 301989888 0 +( 1588 -1880 -488 ) ( 1640 -1888 -488 ) ( 1536 -1888 -488 ) subway/1_tunnelwall -56 14 90 0.500000 0.500000 0 301989888 0 +} +// brush 1530 +{ +( 1656 -1888 -536 ) ( 1688 -1888 -536 ) ( 1688 -1856 -536 ) subway/1_tunnelwall -24 14 90 0.500000 0.500000 0 301989888 0 +( 1536 -1856 -536 ) ( 1536 -1856 -504 ) ( 1536 -1888 -504 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1616 -1880 -536 ) ( 1680 -1880 -536 ) ( 1680 -1880 -520 ) subway/1_tunnelwall -8 0 -180 0.500000 -0.500000 0 301989888 0 +( 1688 -1888 -520 ) ( 1680 -1880 -520 ) ( 1680 -1880 -536 ) subway/1_tunnelwall -24 0 0 0.500000 0.500000 0 301989888 0 +( 1576 -1888 -536 ) ( 1576 -1888 -504 ) ( 1608 -1888 -504 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1576 -1880 -520 ) ( 1600 -1888 -520 ) ( 1552 -1888 -520 ) subway/1_tunnelwall -56 14 90 0.500000 0.500000 0 301989888 0 +} +// brush 1531 +{ +( 1688 -2112 -536 ) ( 1688 -2080 -536 ) ( 1656 -2080 -536 ) subway/1_tunnelwall 8 16 90 0.500000 0.500000 0 301989888 0 +( 1536 -2080 -504 ) ( 1536 -2112 -504 ) ( 1536 -2112 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1600 -2088 -520 ) ( 1600 -2088 -536 ) ( 1536 -2088 -536 ) subway/1_tunnelwall -8 0 -180 0.500000 -0.500000 0 301989888 0 +( 1680 -2088 -536 ) ( 1680 -2088 -520 ) ( 1688 -2080 -520 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1688 -2080 -504 ) ( 1656 -2080 -504 ) ( 1656 -2080 -536 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1552 -2080 -520 ) ( 1600 -2080 -520 ) ( 1576 -2088 -520 ) subway/1_tunnelwall 40 16 90 0.500000 0.500000 0 301989888 0 +} +// brush 1532 +{ +( 1536 -2080 -504 ) ( 1536 -2112 -504 ) ( 1536 -2112 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1600 -2088 -488 ) ( 1600 -2088 -520 ) ( 1536 -2088 -520 ) subway/1_tunnelwall -8 0 -180 0.500000 -0.500000 0 301989888 0 +( 1680 -2088 -520 ) ( 1680 -2088 -488 ) ( 1688 -2080 -488 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1688 -2080 -504 ) ( 1656 -2080 -504 ) ( 1656 -2080 -536 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1600 -2080 -520 ) ( 1552 -2080 -520 ) ( 1576 -2088 -520 ) subway/1_tunnelwall 40 16 90 0.500000 0.500000 0 301989888 0 +( 1536 -2080 -488 ) ( 1640 -2080 -488 ) ( 1588 -2088 -488 ) subway/1_tunnelwall 40 16 90 0.500000 0.500000 0 301989888 0 +} +// brush 1533 +{ +( 1536 -2080 -504 ) ( 1536 -2112 -504 ) ( 1536 -2112 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1600 -2088 -480 ) ( 1600 -2088 -488 ) ( 1536 -2088 -488 ) subway/1_tunnelwall -8 0 -180 0.500000 -0.500000 0 301989888 0 +( 1680 -2088 -488 ) ( 1680 -2088 -480 ) ( 1688 -2080 -480 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1688 -2080 -504 ) ( 1656 -2080 -504 ) ( 1656 -2080 -536 ) subway/1_trim1 0 0 0 -0.500000 0.500000 0 0 0 +( 1640 -2080 -488 ) ( 1536 -2080 -488 ) ( 1588 -2088 -488 ) subway/1_tunnelwall 40 16 90 0.500000 0.500000 0 301989888 0 +( 1552 -2080 -480 ) ( 1608 -2080 -480 ) ( 1580 -2088 -480 ) subway/1_tunnelwall 40 16 90 0.500000 0.500000 0 301989888 0 +} +// brush 1534 +{ +( 1536 -2080 -504 ) ( 1536 -2112 -504 ) ( 1536 -2112 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1600 -2088 -448 ) ( 1600 -2088 -480 ) ( 1536 -2088 -480 ) subway/1_tunnelwall -8 0 -180 0.500000 -0.500000 0 301989888 0 +( 1680 -2088 -480 ) ( 1680 -2088 -448 ) ( 1688 -2080 -448 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1688 -2080 -504 ) ( 1656 -2080 -504 ) ( 1656 -2080 -536 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 1608 -2080 -480 ) ( 1552 -2080 -480 ) ( 1580 -2088 -480 ) subway/1_tunnelwall 40 16 90 0.500000 0.500000 0 301989888 0 +( 1560 -2080 -448 ) ( 1632 -2080 -448 ) ( 1596 -2088 -448 ) subway/1_tunnelwall 40 16 90 0.500000 0.500000 0 301989888 0 +} +// brush 1535 +{ +( 1656 -2080 -408 ) ( 1688 -2080 -408 ) ( 1688 -2112 -408 ) subway/1_tunnelwall 8 16 90 0.500000 0.500000 0 301989888 0 +( 1536 -2080 -504 ) ( 1536 -2112 -504 ) ( 1536 -2112 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1600 -2088 -408 ) ( 1600 -2088 -448 ) ( 1536 -2088 -448 ) subway/1_tunnelwall -8 0 -180 0.500000 -0.500000 0 301989888 0 +( 1680 -2088 -448 ) ( 1680 -2088 -408 ) ( 1688 -2080 -408 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1688 -2080 -504 ) ( 1656 -2080 -504 ) ( 1656 -2080 -536 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1632 -2080 -448 ) ( 1560 -2080 -448 ) ( 1596 -2088 -448 ) subway/1_tunnelwall 40 16 90 0.500000 0.500000 0 301989888 0 +} +// brush 1536 +{ +( 1536 -1920 -376 ) ( 1536 -1888 -376 ) ( 1568 -1888 -376 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1544 -2048 -472 ) ( 1576 -2048 -472 ) ( 1576 -2048 -504 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1544 -1928 -472 ) ( 1544 -1896 -472 ) ( 1544 -1896 -504 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1552 -1920 -472 ) ( 1520 -1920 -472 ) ( 1520 -1920 -504 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1488 -1888 -472 ) ( 1488 -1920 -472 ) ( 1488 -1920 -504 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1536 -1944 -416 ) ( 1536 -2016 -416 ) ( 1544 -1980 -416 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1537 +{ +( 1664 -1872 -280 ) ( 1664 -1912 -280 ) ( 1664 -1912 -504 ) subway/1_tunnelwall -8 0 0 1 1 0 301989888 0 +( 1784 -2192 -280 ) ( 1784 -2152 -280 ) ( 1784 -2152 -504 ) subway/1_tunnelwall -8 0 0 1 1 0 301989888 0 +( 1720 -2752 -280 ) ( 1784 -2752 -280 ) ( 1784 -2752 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1768 -1912 -280 ) ( 1768 -1872 -280 ) ( 1832 -1872 -280 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +( 1832 -1872 -288 ) ( 1768 -1872 -288 ) ( 1768 -1912 -288 ) subway/1_tunnel_ceiling2 48 8 0 1 1 0 16777216 0 +( 1744 -1880 -288 ) ( 1776 -1880 -288 ) ( 1760 -1880 -280 ) subway/1_tunnel_ceiling2 48 0 0 1 1 0 16777216 0 +} +// brush 1538 +{ +( 1832 -2760 -38 ) ( 1832 -2760 -48 ) ( 1784 -2760 -48 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1856 -2760 -224 ) ( 1856 -2760 -216 ) ( 1856 -2736 -216 ) subway/1_tunnelwall 32 -24 0 1 1 0 301989888 0 +( 1608 -1880 -256 ) ( 1608 -1880 -248 ) ( 1488 -1880 -248 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1808 -2848 -296 ) ( 1808 -2848 -288 ) ( 1808 -2872 -288 ) subway/1_tunnelwall 32 -24 0 1 1 0 301989888 0 +( 1560 -2788 -344 ) ( 1560 -2788 -336 ) ( 1680 -2788 -336 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1504 -2732 -280 ) ( 1624 -2732 -280 ) ( 1624 -2756 -280 ) subway/1_tunnelwall 16 -40 0 1 1 0 301989888 0 +( 1640 -2740 -296 ) ( 1640 -2716 -296 ) ( 1520 -2716 -296 ) subway/1_tunnelwall 7 -10 90 0.500000 0.500000 0 301989888 0 +} +// brush 1539 +{ +( 1848 -2760 -288 ) ( 1880 -2760 -288 ) ( 1880 -2760 -320 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1880 -1880 -320 ) ( 1880 -1880 -288 ) ( 1848 -1880 -288 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1880 -1896 -288 ) ( 1880 -1912 -288 ) ( 1848 -1912 -288 ) subway/1_tunnelwall -16 8 0 1 1 0 301989888 0 +( 1880 -2284 -288 ) ( 1856 -2284 -296 ) ( 1856 -2316 -296 ) subway/1_tunnelwall 0 0 90 0.500000 0.500000 0 301989888 0 +( 1848 -2128 -288 ) ( 1856 -2128 -296 ) ( 1856 -2096 -296 ) subway/1_tunnelwall -16 8 0 1 1 0 301989888 0 +} +// brush 1540 +{ +( 1848 -2760 -288 ) ( 1880 -2760 -288 ) ( 1880 -2760 -320 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +( 1848 -1348 -288 ) ( 1848 -1364 -288 ) ( 1848 -1364 -320 ) subway/1_tunnelwall 12 0 0 1 1 0 301989888 0 +( 1848 -2556 -320 ) ( 1856 -2556 -296 ) ( 1856 -2524 -296 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1848 -1388 -288 ) ( 1856 -1388 -296 ) ( 1856 -1420 -296 ) subway/1_tunnelwall -24 -12 0 1 1 0 301989888 0 +( 1840 -2532 -288 ) ( 1792 -2532 -320 ) ( 1888 -2532 -320 ) subway/1_tunnelwall -24 -24 0 1 1 0 301989888 0 +} +// brush 1541 +{ +( 1784 -2760 -320 ) ( 1784 -2760 -288 ) ( 1816 -2760 -288 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1816 -1300 -320 ) ( 1816 -1300 -288 ) ( 1816 -1284 -288 ) subway/1_tunnelwall 12 0 0 1 1 0 301989888 0 +( 1808 -2428 -296 ) ( 1808 -2460 -296 ) ( 1816 -2460 -320 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1808 -1420 -296 ) ( 1808 -1388 -296 ) ( 1816 -1388 -288 ) subway/1_tunnelwall -16 -12 0 1 1 0 301989888 0 +( 1776 -2532 -320 ) ( 1872 -2532 -320 ) ( 1824 -2532 -288 ) subway/1_tunnelwall -16 -24 0 1 1 0 301989888 0 +} +// brush 1542 +{ +( 1832 -2592 -480 ) ( 1816 -2592 -480 ) ( 1816 -2560 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1832 -2424 -504 ) ( 1832 -2424 -376 ) ( 1816 -2424 -376 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1848 -2592 -512 ) ( 1848 -2592 -384 ) ( 1848 -2560 -384 ) subway/1_trim1 0 0 0 -0.500000 0.500000 0 0 0 +( 1840 -2760 -512 ) ( 1840 -2760 -384 ) ( 1856 -2760 -384 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1816 -2560 -480 ) ( 1816 -2560 -352 ) ( 1816 -2592 -352 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1816 -2568 -488 ) ( 1816 -2664 -488 ) ( 1848 -2616 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 1543 +{ +( 1816 -2560 -536 ) ( 1816 -2592 -536 ) ( 1832 -2592 -536 ) subway/1_tunnelwall 8 -16 0 0.500000 0.500000 0 301989888 0 +( 1832 -2424 -504 ) ( 1832 -2424 -376 ) ( 1816 -2424 -376 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1848 -2592 -512 ) ( 1848 -2592 -384 ) ( 1848 -2560 -384 ) subway/1_tunnelwall 24 0 0 0.500000 0.500000 0 301989888 0 +( 1840 -2760 -512 ) ( 1840 -2760 -384 ) ( 1856 -2760 -384 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1002 +( 1816 -2560 -480 ) ( 1816 -2560 -352 ) ( 1816 -2592 -352 ) subway/1_tunnelwall 24 0 0 0.500000 0.500000 0 301989888 0 +( 1816 -2664 -488 ) ( 1816 -2568 -488 ) ( 1848 -2616 -488 ) subway/1_tunnelwall 24 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1544 +{ +( 1848 -2520 -448 ) ( 1848 -2520 -320 ) ( 1848 -2488 -320 ) subway/1_tunnelwall_pipe 16 8 0 0.500000 0.500000 0 16777216 0 +( 1824 -2760 -448 ) ( 1824 -2760 -320 ) ( 1840 -2760 -320 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1816 -2504 -416 ) ( 1816 -2504 -288 ) ( 1816 -2536 -288 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 1848 -2424 -480 ) ( 1848 -2532 -320 ) ( 1816 -2532 -320 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 1848 -2460 -480 ) ( 1816 -2408 -480 ) ( 1816 -2512 -480 ) subway/1_tunnelwall 8 -32 0 0.500000 0.500000 0 301989888 0 +( 1848 -2484 -448 ) ( 1816 -2536 -448 ) ( 1816 -2432 -448 ) subway/1_tunnelwall 8 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1545 +{ +( 1848 -2520 -448 ) ( 1848 -2520 -320 ) ( 1848 -2488 -320 ) subway/1_tunnelwall 40 0 0 0.500000 0.500000 0 301989888 0 +( 1824 -2760 -448 ) ( 1824 -2760 -320 ) ( 1840 -2760 -320 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1816 -2504 -416 ) ( 1816 -2504 -288 ) ( 1816 -2536 -288 ) subway/1_tunnelwall 40 0 0 0.500000 0.500000 0 301989888 0 +( 1848 -2424 -480 ) ( 1848 -2532 -320 ) ( 1816 -2532 -320 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1816 -2552 -320 ) ( 1816 -2532 -320 ) ( 1848 -2532 -320 ) subway/1_tunnelwall 8 -32 0 0.500000 0.500000 0 301989888 0 +( 1848 -2484 -448 ) ( 1816 -2432 -448 ) ( 1816 -2536 -448 ) subway/1_tunnelwall 8 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1546 +{ +( 1776 -2532 -56 ) ( 1824 -2532 -56 ) ( 1824 -2532 -46 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1848 -2164 -224 ) ( 1848 -2140 -224 ) ( 1848 -2140 -232 ) subway/1_tunnelwall 16 -32 0 1 1 0 301989888 0 +( 1816 -2192 -296 ) ( 1816 -2216 -296 ) ( 1816 -2216 -304 ) subway/1_tunnelwall 16 -32 0 1 1 0 301989888 0 +( 1632 -2252 -288 ) ( 1632 -2276 -288 ) ( 1512 -2276 -288 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1520 -2292 -320 ) ( 1640 -2292 -320 ) ( 1640 -2268 -320 ) subway/1_tunnelfloor_1 0 -16 0 1 1 0 285212672 1002 +( 1840 -2648 -288 ) ( 1872 -2648 -320 ) ( 1808 -2648 -320 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 0 +} +// brush 1547 +{ +( 1944 -2432 -320 ) ( 1944 -2432 -288 ) ( 1976 -2432 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1976 -1300 -320 ) ( 1976 -1300 -288 ) ( 1976 -1284 -288 ) subway/1_tunnelwall 12 0 0 1 1 0 301989888 0 +( 1968 -2208 -296 ) ( 1968 -2240 -296 ) ( 1976 -2240 -320 ) subway/1_tunnelwall -32 0 0 0.500000 0.500000 0 301989888 0 +( 1968 -1420 -296 ) ( 1968 -1388 -296 ) ( 1976 -1388 -288 ) subway/1_tunnelwall 0 -12 0 1 1 0 301989888 0 +( 1968 -1880 -288 ) ( 1956 -1880 -320 ) ( 1980 -1880 -320 ) subway/1_tunnelwall 0 -24 0 1 1 0 301989888 0 +} +// brush 1548 +{ +( 1984 -1844 -520 ) ( 1864 -1844 -520 ) ( 1864 -1868 -520 ) subway/1_tunnelwall -32 -16 0 0.500000 0.500000 0 301989888 0 +( 1872 -1860 -488 ) ( 1872 -1836 -488 ) ( 1992 -1836 -488 ) subway/1_tunnelwall -32 -16 0 0.500000 0.500000 0 301989888 0 +( 1840 -2760 -552 ) ( 1960 -2760 -552 ) ( 1960 -2760 -560 ) subway/1_tunnelwall -32 -48 0 0.500000 0.500000 0 301989888 0 +( 1688 -2016 -504 ) ( 1688 -1992 -504 ) ( 1688 -1992 -512 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1680 -2024 -520 ) ( 1680 -2024 -488 ) ( 1680 -2648 -488 ) subway/1_tunnelwall 16 -48 0 0.500000 0.500000 0 301989888 0 +( 1688 -2080 -488 ) ( 1688 -2080 -520 ) ( 1696 -2072 -520 ) subway/1_tunneltrack_1 -28 -54 195 1 1 0 16777216 0 +} +// brush 1549 +{ +( 1984 -1820 -536 ) ( 1864 -1820 -536 ) ( 1864 -1844 -536 ) subway/con6 -32 -48 0 0.500000 0.500000 0 285212672 0 +( 1872 -1860 -520 ) ( 1872 -1836 -520 ) ( 1992 -1836 -520 ) subway/con6 -32 -48 0 0.500000 0.500000 0 285212672 0 +( 1688 -2032 -520 ) ( 1688 -2008 -520 ) ( 1688 -2008 -528 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1680 -2024 -536 ) ( 1680 -2024 -520 ) ( 1680 -2648 -520 ) subway/con6 16 -16 0 0.500000 0.500000 0 285212672 0 +( 1712 -2752 -264 ) ( 1656 -2752 -264 ) ( 1656 -2752 -254 ) subway/1_tunneltrack_1 -28 -54 195 1 1 0 16777216 0 +( 1688 -2080 -520 ) ( 1688 -2080 -536 ) ( 1696 -2072 -536 ) subway/1_tunneltrack_1 -28 -54 195 1 1 0 16777216 0 +} +// brush 1550 +{ +( 1672 -1724 -344 ) ( 1672 -1748 -344 ) ( 1672 -1748 -352 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 2012 -1888 -376 ) ( 1892 -1888 -376 ) ( 1892 -1888 -384 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -2712 -432 ) ( 1688 -2688 -432 ) ( 1688 -2688 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1688 -2788 -288 ) ( 1696 -2788 -288 ) ( 1696 -2836 -288 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1704 -2760 -448 ) ( 1696 -2760 -336 ) ( 1704 -2760 -336 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1720 -2336 -352 ) ( 1696 -2336 -352 ) ( 1720 -2408 -352 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1551 +{ +( 1688 -2760 -288 ) ( 1720 -2760 -288 ) ( 1720 -2760 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1688 -1396 -288 ) ( 1688 -1412 -288 ) ( 1688 -1412 -320 ) subway/1_tunnelwall 12 0 0 1 1 0 301989888 0 +( 1688 -2456 -320 ) ( 1696 -2456 -296 ) ( 1696 -2424 -296 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1688 -1388 -288 ) ( 1696 -1388 -296 ) ( 1696 -1420 -296 ) subway/1_tunnelwall 16 -12 0 1 1 0 301989888 0 +( 1684 -1880 -320 ) ( 1708 -1880 -320 ) ( 1696 -1880 -288 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +} +// brush 1552 +{ +( 1680 -1724 -344 ) ( 1680 -1748 -344 ) ( 1680 -1748 -352 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -2192 -432 ) ( 1688 -2168 -432 ) ( 1688 -2168 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1704 -2760 -448 ) ( 1696 -2760 -336 ) ( 1704 -2760 -336 ) subway/1_tunnelwall -32 -32 0 0.500000 0.500000 0 301989888 0 +( 1720 -2408 -416 ) ( 1720 -2336 -416 ) ( 1696 -2336 -416 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1696 -2336 -352 ) ( 1720 -2336 -352 ) ( 1720 -2408 -352 ) subway/1_tunnelwall -32 -32 0 0.500000 0.500000 0 301989888 0 +( 1696 -1888 -256 ) ( 1696 -1888 -416 ) ( 1720 -1888 -256 ) subway/1_tunnelwall -32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1553 +{ +( 1680 -2024 -448 ) ( 1680 -2024 -416 ) ( 1680 -2648 -416 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -2080 -416 ) ( 1688 -2080 -448 ) ( 1696 -2072 -448 ) subway/1_tunnelwall -32 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -2712 -432 ) ( 1688 -2688 -432 ) ( 1688 -2688 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1992 -2228 -448 ) ( 1872 -2228 -448 ) ( 1872 -2252 -448 ) subway/1_tunnelwall -32 0 0 0.500000 0.500000 0 301989888 0 +( 1704 -2760 -448 ) ( 1696 -2760 -336 ) ( 1704 -2760 -336 ) subway/1_tunnelwall -32 -32 0 0.500000 0.500000 0 301989888 0 +( 1720 -2336 -416 ) ( 1720 -2408 -416 ) ( 1696 -2336 -416 ) subway/1_tunnelwall -32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1554 +{ +( 1984 -2588 -480 ) ( 1864 -2588 -480 ) ( 1864 -2612 -480 ) subway/1_tunnelwall_pipe 32 0 0 0.500000 0.500000 0 16777216 0 +( 1872 -2668 -448 ) ( 1872 -2644 -448 ) ( 1992 -2644 -448 ) subway/1_tunnelwall_pipe 32 0 0 0.500000 0.500000 0 16777216 0 +( 1824 -3004 -512 ) ( 1944 -3004 -512 ) ( 1944 -3004 -520 ) subway/1_tunnelwall_pipe 32 -32 0 0.500000 0.500000 0 16777216 0 +( 1688 -3080 -480 ) ( 1688 -3056 -480 ) ( 1688 -3056 -488 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 1688 -2080 -448 ) ( 1688 -2080 -480 ) ( 1696 -2072 -480 ) subway/1_tunnelwall_pipe 32 -32 0 0.500000 0.500000 0 16777216 0 +( 1680 -2024 -480 ) ( 1680 -2024 -448 ) ( 1680 -2648 -448 ) subway/1_tunnelwall_pipe 16 -32 0 0.500000 0.500000 0 16777216 0 +( 1688 -2760 -264 ) ( 1656 -2760 -264 ) ( 1656 -2760 -254 ) subway/1_tunneltrack_1 -29 -54 195 1 1 0 16777216 0 +} +// brush 1555 +{ +( 1680 -2024 -488 ) ( 1680 -2024 -480 ) ( 1680 -2648 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1688 -2760 -480 ) ( 1688 -2760 -496 ) ( 1680 -2760 -496 ) subway/1_trim1 -16 0 0 0.500000 0.500000 0 0 0 +( 1688 -2096 -496 ) ( 1688 -2096 -480 ) ( 1688 -1808 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1664 -1636 -480 ) ( 1664 -1460 -480 ) ( 1688 -1460 -480 ) subway/1_trim1 -16 0 0 0.500000 0.500000 0 0 0 +( 1688 -1460 -488 ) ( 1664 -1460 -488 ) ( 1664 -1636 -488 ) subway/1_trim1 -16 0 0 0.500000 0.500000 0 0 0 +( 1688 -2080 -480 ) ( 1688 -2080 -488 ) ( 1696 -2072 -488 ) subway/1_trim1 -16 0 0 0.500000 0.500000 0 0 0 +} +// brush 1556 +{ +( 2116 -1856 -544 ) ( 1996 -1856 -544 ) ( 1996 -1880 -544 ) subway/1_tunneltrack_1 -4 0 0 1 1 0 16777216 0 +( 1996 -1896 -536 ) ( 1996 -1872 -536 ) ( 2116 -1872 -536 ) subway/1_tunneltrack_1 20 0 0 1 1 0 16777216 0 +( 1916 -2532 -568 ) ( 2036 -2532 -568 ) ( 2036 -2532 -576 ) subway/1_tunneltrack_1 -4 -56 0 1 1 0 16777216 0 +( 1944 -1592 -520 ) ( 1944 -1568 -520 ) ( 1944 -1568 -528 ) subway/1_tunneltrack_1 20 -56 0 1 1 0 16777216 0 +( 2136 -1880 -480 ) ( 2016 -1880 -480 ) ( 2016 -1880 -488 ) subway/1_tunneltrack_1 -4 -56 0 1 1 0 16777216 0 +( 1880 -1600 -512 ) ( 1880 -1624 -512 ) ( 1880 -1624 -520 ) subway/1_tunneltrack_1 20 -56 0 1 1 0 16777216 0 +} +// brush 1557 +{ +( 1688 -2080 -552 ) ( 1688 -2080 -536 ) ( 1688 -2648 -536 ) subway/1_tunneltrack_plain -48 -48 0 0.500000 0.500000 0 301989888 0 +( 1688 -2080 -536 ) ( 1688 -2080 -552 ) ( 1712 -2048 -552 ) subway/1_tunneltrack_plain 16 -48 0 0.500000 0.500000 0 301989888 0 +( 1712 -2048 -536 ) ( 1712 -2048 -552 ) ( 1712 -2648 -552 ) subway/1_tunneltrack_plain -48 -48 0 0.500000 0.500000 0 301989888 0 +( 1680 -2752 -552 ) ( 1680 -2752 -536 ) ( 1712 -2752 -536 ) subway/1_tunneltrack_plain 16 -48 0 0.500000 0.500000 0 301989888 0 +( 1744 -2184 -536 ) ( 1744 -2160 -536 ) ( 1864 -2160 -536 ) subway/1_tunnelfloor_2 25 -9 90 -1 -1 0 285212672 0 +( 1872 -2152 -552 ) ( 1752 -2152 -552 ) ( 1752 -2176 -552 ) subway/1_tunneltrack_plain 16 48 0 0.500000 0.500000 0 301989888 0 +} +// brush 1558 +{ +( 1744 -2752 -264 ) ( 1680 -2752 -264 ) ( 1680 -2752 -254 ) subway/1_tunneltrack_1 29 -19 195 1 1 0 16777216 0 +( 1904 -2720 -536 ) ( 1904 -2712 -536 ) ( 1856 -2712 -536 ) subway/metal2 32 32 0 0.500000 0.500000 0 16777216 0 +( 1800 -2856 -528 ) ( 1800 -2592 -528 ) ( 1832 -2592 -528 ) subway/metal2 32 32 0 0.500000 0.500000 0 16777216 0 +( 1712 -2720 -516 ) ( 1712 -2984 -516 ) ( 1712 -2984 -548 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1904 -1880 -536 ) ( 1904 -1880 -504 ) ( 1856 -1880 -504 ) subway/metal2 32 -48 0 0.500000 0.500000 0 16777216 0 +( 1720 -2480 -728 ) ( 1720 -2480 -768 ) ( 1720 -2488 -768 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1904 -3136 -504 ) ( 1904 -3136 -536 ) ( 1856 -3136 -536 ) subway/metal2 32 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 1559 +{ +( 1712 -1408 -512 ) ( 1712 -1432 -512 ) ( 1712 -1432 -520 ) subway/1_tunneltrack_1 28 -24 0 1 1 0 16777216 0 +( 1976 -1880 -480 ) ( 1856 -1880 -480 ) ( 1856 -1880 -488 ) subway/1_tunneltrack_1 28 -24 0 1 1 0 16777216 0 +( 1792 -1448 -520 ) ( 1792 -1424 -520 ) ( 1792 -1424 -528 ) subway/1_tunneltrack_1 28 -24 0 1 1 0 16777216 0 +( 1772 -2752 -568 ) ( 1892 -2752 -568 ) ( 1892 -2752 -576 ) subway/1_tunneltrack_1 28 -24 0 1 1 0 16777216 0 +( 1836 -2304 -536 ) ( 1836 -2280 -536 ) ( 1956 -2280 -536 ) subway/1_tunneltrack_1 -12 40 0 1 1 0 16777216 0 +( 1948 -2264 -552 ) ( 1828 -2264 -552 ) ( 1828 -2288 -552 ) subway/1_tunneltrack_1 28 -24 0 1 1 0 16777216 0 +} +// brush 1560 +{ +( 1792 -2752 -264 ) ( 1752 -2752 -264 ) ( 1752 -2752 -254 ) subway/1_tunneltrack_1 25 -20 195 1 1 0 16777216 0 +( 1976 -3136 -504 ) ( 1976 -3136 -536 ) ( 1928 -3136 -536 ) subway/metal2 -24 -48 0 0.500000 0.500000 0 16777216 0 +( 1792 -2568 -728 ) ( 1792 -2568 -768 ) ( 1792 -2576 -768 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1976 -1880 -536 ) ( 1976 -1880 -504 ) ( 1928 -1880 -504 ) subway/metal2 -24 -48 0 0.500000 0.500000 0 16777216 0 +( 1784 -2016 -516 ) ( 1784 -2280 -516 ) ( 1784 -2280 -548 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1872 -2856 -528 ) ( 1872 -2592 -528 ) ( 1904 -2592 -528 ) subway/metal2 -24 32 0 0.500000 0.500000 0 16777216 0 +( 1976 -2720 -536 ) ( 1976 -2712 -536 ) ( 1928 -2712 -536 ) subway/metal2 -24 32 0 0.500000 0.500000 0 16777216 0 +} +// brush 1561 +{ +( 1784 -2024 -520 ) ( 1784 -2048 -520 ) ( 1784 -2048 -528 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 2016 -1880 -480 ) ( 1896 -1880 -480 ) ( 1896 -1880 -488 ) subway/1_tunneltrack_plain 32 -48 0 0.500000 0.500000 0 301989888 0 +( 1880 -2816 -520 ) ( 1880 -2792 -520 ) ( 1880 -2792 -528 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1808 -2752 -568 ) ( 1928 -2752 -568 ) ( 1928 -2752 -576 ) subway/1_tunneltrack_plain 32 -48 0 0.500000 0.500000 0 301989888 0 +( 1864 -2776 -536 ) ( 1864 -2752 -536 ) ( 1984 -2752 -536 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1960 -2776 -552 ) ( 1840 -2776 -552 ) ( 1840 -2800 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1562 +{ +( 1800 -1076 -536 ) ( 1800 -1052 -536 ) ( 1680 -1052 -536 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1672 -1068 -520 ) ( 1792 -1068 -520 ) ( 1792 -1092 -520 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1976 -1136 -528 ) ( 1976 -1136 -520 ) ( 1976 -1160 -520 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1992 -1872 -536 ) ( 1992 -1872 -520 ) ( 1992 -1360 -520 ) subway/con6 16 -16 0 0.500000 0.500000 0 285212672 0 +( 1992 -1872 -520 ) ( 1992 -1872 -536 ) ( 1976 -1888 -536 ) subway/1_tunneltrack_1 42 16 195 1 1 0 16777216 0 +( 1964 -1360 -520 ) ( 1964 -1360 -536 ) ( 1988 -1360 -520 ) subway/1_tunneltrack_1 42 16 195 1 1 0 16777216 0 +} +// brush 1563 +{ +( 1800 -1076 -536 ) ( 1800 -1052 -536 ) ( 1680 -1052 -536 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1672 -1068 -520 ) ( 1792 -1068 -520 ) ( 1792 -1092 -520 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1976 -1136 -528 ) ( 1976 -1136 -520 ) ( 1976 -1160 -520 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1992 -1156 -456 ) ( 1992 -1156 -448 ) ( 1992 -1132 -448 ) subway/con6 16 -16 0 0.500000 0.500000 0 285212672 0 +( 1988 -1112 -520 ) ( 1960 -1112 -536 ) ( 2016 -1112 -536 ) subway/1_tunneltrack_1 42 16 195 1 1 0 16777216 0 +( 2000 -1344 -520 ) ( 2000 -1344 -536 ) ( 1976 -1344 -520 ) subway/1_tunneltrack_1 42 16 195 1 1 0 16777216 0 +} +// brush 1564 +{ +( 1992 -1368 -536 ) ( 1992 -1368 -520 ) ( 1992 -1336 -520 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 15000 +( 2000 -1344 -536 ) ( 2000 -1344 -520 ) ( 1976 -1344 -520 ) subway/light_red -16 16 0 0.500000 0.500000 0 16777217 30000 +( 1976 -1328 -536 ) ( 1976 -1328 -520 ) ( 1976 -1360 -520 ) subway/light_yellow 0 16 0 0.500000 0.500000 0 16777217 22000 +( 1964 -1360 -536 ) ( 1964 -1360 -520 ) ( 1988 -1360 -520 ) subway/light_red -16 16 0 0.500000 0.500000 0 16777217 30000 +( 1968 -1328 -520 ) ( 1992 -1328 -520 ) ( 1992 -1360 -520 ) subway/light_red -16 16 0 0.500000 0.500000 0 16777217 30000 +( 1992 -1360 -536 ) ( 1992 -1328 -536 ) ( 1968 -1328 -536 ) subway/light_red -16 16 0 0.500000 0.500000 0 16777217 30000 +} +// brush 1565 +{ +( 1984 -1052 -536 ) ( 1864 -1052 -536 ) ( 1864 -1076 -536 ) subway/con6 -32 -48 0 0.500000 0.500000 0 285212672 0 +( 1872 -1092 -520 ) ( 1872 -1068 -520 ) ( 1992 -1068 -520 ) subway/con6 -32 -48 0 0.500000 0.500000 0 285212672 0 +( 1688 -1168 -520 ) ( 1688 -1144 -520 ) ( 1688 -1144 -528 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1680 -1880 -520 ) ( 1680 -1880 -536 ) ( 1680 -1360 -536 ) subway/con6 16 -16 0 0.500000 0.500000 0 285212672 0 +( 1680 -1880 -536 ) ( 1680 -1880 -520 ) ( 1688 -1888 -520 ) subway/1_tunneltrack_1 -28 -54 195 1 1 0 16777216 0 +( 1700 -1360 -520 ) ( 1676 -1360 -520 ) ( 1700 -1360 -536 ) subway/1_tunneltrack_1 -28 -54 195 1 1 0 16777216 0 +} +// brush 1566 +{ +( 1984 -1052 -536 ) ( 1864 -1052 -536 ) ( 1864 -1076 -536 ) subway/con6 -32 -48 0 0.500000 0.500000 0 285212672 0 +( 1872 -1092 -520 ) ( 1872 -1068 -520 ) ( 1992 -1068 -520 ) subway/con6 -32 -48 0 0.500000 0.500000 0 285212672 0 +( 1688 -1160 -520 ) ( 1688 -1136 -520 ) ( 1688 -1136 -528 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1672 -1132 -448 ) ( 1672 -1156 -448 ) ( 1672 -1156 -456 ) subway/con6 16 -16 0 0.500000 0.500000 0 285212672 0 +( 1648 -1112 -536 ) ( 1704 -1112 -536 ) ( 1676 -1112 -520 ) subway/1_tunneltrack_1 -28 -54 195 1 1 0 16777216 0 +( 1664 -1344 -520 ) ( 1688 -1344 -520 ) ( 1664 -1344 -536 ) subway/1_tunneltrack_1 -28 -54 195 1 1 0 16777216 0 +} +// brush 1567 +{ +( 1672 -1336 -520 ) ( 1672 -1368 -520 ) ( 1672 -1368 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 15000 +( 1688 -1344 -520 ) ( 1664 -1344 -520 ) ( 1664 -1344 -536 ) subway/light_red 16 16 0 0.500000 0.500000 0 16777217 30000 +( 1688 -1360 -520 ) ( 1688 -1328 -520 ) ( 1688 -1328 -536 ) subway/light_yellow 0 16 0 0.500000 0.500000 0 16777217 22000 +( 1676 -1360 -520 ) ( 1700 -1360 -520 ) ( 1700 -1360 -536 ) subway/light_red 16 16 0 0.500000 0.500000 0 16777217 30000 +( 1672 -1360 -520 ) ( 1672 -1328 -520 ) ( 1696 -1328 -520 ) subway/light_red 16 -16 0 0.500000 0.500000 0 16777217 30000 +( 1696 -1328 -536 ) ( 1672 -1328 -536 ) ( 1672 -1360 -536 ) subway/light_red 16 -16 0 0.500000 0.500000 0 16777217 30000 +} +// brush 1568 +{ +( 1976 -1072 -408 ) ( 1968 -1072 -408 ) ( 1968 -1088 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 -1088 -392 ) ( 1968 -1072 -392 ) ( 1976 -1072 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 -1088 -392 ) ( 1976 -1088 -392 ) ( 1976 -1088 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 -1088 -392 ) ( 1976 -1072 -392 ) ( 1976 -1072 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 -1072 -392 ) ( 1968 -1072 -392 ) ( 1968 -1072 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1974 -1072 -392 ) ( 1974 -1088 -392 ) ( 1974 -1088 -408 ) subway/light_red 0 -16 0 0.500000 0.500000 134217728 16777217 19000 +} +// brush 1569 +{ +( 1974 -1104 -392 ) ( 1974 -1120 -392 ) ( 1974 -1120 -408 ) subway/light_red 0 -16 0 0.500000 0.500000 134217728 16777217 19000 +( 1976 -1104 -392 ) ( 1968 -1104 -392 ) ( 1968 -1104 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 -1120 -392 ) ( 1976 -1104 -392 ) ( 1976 -1104 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 -1120 -392 ) ( 1976 -1120 -392 ) ( 1976 -1120 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 -1120 -392 ) ( 1968 -1104 -392 ) ( 1976 -1104 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 -1104 -408 ) ( 1968 -1104 -408 ) ( 1968 -1120 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1570 +{ +( 1690 -1120 -408 ) ( 1690 -1120 -392 ) ( 1690 -1104 -392 ) subway/light_red 0 -16 0 0.500000 0.500000 134217792 16777217 19000 +( 1696 -1104 -408 ) ( 1696 -1104 -392 ) ( 1688 -1104 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -1104 -408 ) ( 1688 -1104 -392 ) ( 1688 -1120 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -1120 -408 ) ( 1688 -1120 -392 ) ( 1696 -1120 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -1104 -392 ) ( 1696 -1104 -392 ) ( 1696 -1120 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 -1120 -408 ) ( 1696 -1104 -408 ) ( 1688 -1104 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +} +// brush 1571 +{ +( 1696 -1088 -408 ) ( 1696 -1072 -408 ) ( 1688 -1072 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -1072 -392 ) ( 1696 -1072 -392 ) ( 1696 -1088 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -1088 -408 ) ( 1688 -1088 -392 ) ( 1696 -1088 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -1072 -408 ) ( 1688 -1072 -392 ) ( 1688 -1088 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 -1072 -408 ) ( 1696 -1072 -392 ) ( 1688 -1072 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1690 -1088 -408 ) ( 1690 -1088 -392 ) ( 1690 -1072 -392 ) subway/light_red 0 -16 0 0.500000 0.500000 134217792 16777217 19000 +} +// brush 1572 +{ +( 1992 -980 -352 ) ( 1992 -980 -344 ) ( 1992 -956 -344 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 1772 -1112 -384 ) ( 1772 -1112 -376 ) ( 1652 -1112 -376 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -1808 -440 ) ( 1976 -1808 -432 ) ( 1976 -1832 -432 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1968 -2068 -288 ) ( 1968 -2020 -288 ) ( 1976 -2020 -288 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1960 -1880 -336 ) ( 1968 -1880 -336 ) ( 1960 -1880 -448 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1944 -1640 -352 ) ( 1968 -1568 -352 ) ( 1944 -1568 -352 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1573 +{ +( 1944 -1880 -320 ) ( 1944 -1880 -288 ) ( 1976 -1880 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1976 -532 -320 ) ( 1976 -532 -288 ) ( 1976 -516 -288 ) subway/1_tunnelwall 12 0 0 1 1 0 301989888 0 +( 1968 -1656 -296 ) ( 1968 -1688 -296 ) ( 1976 -1688 -320 ) subway/1_tunnelwall -32 0 0 0.500000 0.500000 0 301989888 0 +( 1968 -652 -296 ) ( 1968 -620 -296 ) ( 1976 -620 -288 ) subway/1_tunnelwall 0 -12 0 1 1 0 301989888 0 +( 1968 -1112 -288 ) ( 1956 -1112 -320 ) ( 1980 -1112 -320 ) subway/1_tunnelwall 0 -24 0 1 1 0 301989888 0 +} +// brush 1574 +{ +( 1992 -980 -352 ) ( 1992 -980 -344 ) ( 1992 -956 -344 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -1280 -440 ) ( 1976 -1280 -432 ) ( 1976 -1304 -432 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1960 -1880 -336 ) ( 1968 -1880 -336 ) ( 1960 -1880 -448 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1968 -1568 -416 ) ( 1944 -1568 -416 ) ( 1944 -1640 -416 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1944 -1640 -352 ) ( 1944 -1568 -352 ) ( 1968 -1568 -352 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1944 -1112 -256 ) ( 1968 -1112 -416 ) ( 1968 -1112 -256 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1575 +{ +( 1992 -980 -352 ) ( 1992 -980 -344 ) ( 1992 -956 -344 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 1772 -1112 -384 ) ( 1772 -1112 -376 ) ( 1652 -1112 -376 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -1808 -440 ) ( 1976 -1808 -432 ) ( 1976 -1832 -432 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1792 -1484 -448 ) ( 1792 -1460 -448 ) ( 1672 -1460 -448 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1960 -1880 -336 ) ( 1968 -1880 -336 ) ( 1960 -1880 -448 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1968 -1568 -416 ) ( 1944 -1640 -416 ) ( 1944 -1568 -416 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1576 +{ +( 1800 -1844 -480 ) ( 1800 -1820 -480 ) ( 1680 -1820 -480 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1672 -1876 -448 ) ( 1792 -1876 -448 ) ( 1792 -1900 -448 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1720 -2236 -520 ) ( 1720 -2236 -512 ) ( 1840 -2236 -512 ) subway/1_tunnelwall_pipe 0 -32 0 0.500000 0.500000 0 16777216 0 +( 1976 -2176 -488 ) ( 1976 -2176 -480 ) ( 1976 -2200 -480 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 1776 -1112 -432 ) ( 1776 -1112 -424 ) ( 1656 -1112 -424 ) subway/1_tunnelwall_pipe 0 -32 0 0.500000 0.500000 0 16777216 0 +( 1992 -1872 -480 ) ( 1992 -1872 -448 ) ( 1992 -1112 -448 ) subway/1_tunnelwall_pipe 16 -32 0 0.500000 0.500000 0 16777216 0 +( 1992 -1872 -448 ) ( 1992 -1872 -480 ) ( 1976 -1888 -480 ) subway/1_tunneltrack_1 41 16 195 1 1 0 16777216 0 +} +// brush 1577 +{ +( 1984 -1880 -488 ) ( 1984 -1880 -480 ) ( 1984 -1112 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1984 -1880 -480 ) ( 1984 -1880 -488 ) ( 1976 -1888 -488 ) subway/1_trim1 -16 0 0 0.500000 0.500000 0 0 0 +( 1976 -928 -480 ) ( 1976 -1216 -480 ) ( 1976 -1216 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1976 -692 -480 ) ( 2000 -692 -480 ) ( 2000 -868 -480 ) subway/1_trim1 -16 0 0 0.500000 0.500000 0 0 0 +( 2000 -868 -488 ) ( 2000 -692 -488 ) ( 1976 -692 -488 ) subway/1_trim1 -16 0 0 0.500000 0.500000 0 0 0 +( 1944 -1112 -480 ) ( 1872 -1112 -488 ) ( 2016 -1112 -488 ) subway/1_trim1 -16 0 0 0.500000 0.500000 0 0 0 +} +// brush 1578 +{ +( 1800 -1100 -520 ) ( 1800 -1076 -520 ) ( 1680 -1076 -520 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1672 -1068 -488 ) ( 1792 -1068 -488 ) ( 1792 -1092 -488 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1984 -1880 -488 ) ( 1984 -1880 -520 ) ( 1976 -1888 -520 ) subway/1_tunnelwall 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1976 -1112 -512 ) ( 1976 -1112 -504 ) ( 1976 -1136 -504 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1984 -1880 -520 ) ( 1984 -1880 -488 ) ( 1984 -1112 -488 ) subway/1_tunnelwall 16 -48 0 0.500000 0.500000 0 301989888 0 +( 1988 -1112 -488 ) ( 1960 -1112 -520 ) ( 2016 -1112 -520 ) subway/1_tunneltrack_1 42 16 195 1 1 0 16777216 0 +} +// brush 1579 +{ +( 1944 -1880 -320 ) ( 1944 -1880 -288 ) ( 1976 -1880 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1976 -1112 -288 ) ( 1944 -1112 -288 ) ( 1944 -1112 -320 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1976 -1144 -288 ) ( 1944 -1144 -288 ) ( 1944 -1128 -288 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +( 1968 -1880 -296 ) ( 1968 -1848 -296 ) ( 1944 -1848 -288 ) subway/1_tunnelwall 0 -31 90 0.500000 0.500000 0 301989888 0 +( 1968 -1112 -296 ) ( 1968 -1144 -296 ) ( 1976 -1144 -288 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +} +// brush 1580 +{ +( 1880 -1220 -280 ) ( 1880 -1260 -280 ) ( 1880 -1260 -504 ) subway/1_tunnelwall -8 0 0 1 1 0 301989888 0 +( 2000 -1144 -280 ) ( 2000 -1104 -280 ) ( 2000 -1104 -504 ) subway/1_tunnelwall -8 0 0 1 1 0 301989888 0 +( 1864 -1880 -280 ) ( 1928 -1880 -280 ) ( 1928 -1880 -504 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1928 -1144 -280 ) ( 1928 -1104 -280 ) ( 1992 -1104 -280 ) subway/1_tunnelwall -32 8 0 1 1 0 301989888 0 +( 1992 -1104 -288 ) ( 1928 -1104 -288 ) ( 1928 -1144 -288 ) subway/1_tunnel_ceiling2 16 8 0 1 1 0 16777216 0 +( 1904 -1112 -288 ) ( 1936 -1112 -288 ) ( 1920 -1112 -280 ) subway/1_tunnel_ceiling2 16 0 0 1 1 0 16777216 0 +} +// brush 1581 +{ +( 1848 -1880 -288 ) ( 1880 -1880 -288 ) ( 1880 -1880 -320 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1880 -1112 -320 ) ( 1880 -1112 -288 ) ( 1848 -1112 -288 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1880 -1128 -288 ) ( 1880 -1144 -288 ) ( 1848 -1144 -288 ) subway/1_tunnelwall -16 8 0 1 1 0 301989888 0 +( 1880 -1732 -288 ) ( 1856 -1732 -296 ) ( 1856 -1764 -296 ) subway/1_tunnelwall 0 0 90 0.500000 0.500000 0 301989888 0 +( 1848 -1144 -288 ) ( 1856 -1144 -296 ) ( 1856 -1112 -296 ) subway/1_tunnelwall -16 8 0 1 1 0 301989888 0 +} +// brush 1582 +{ +( 1944 -1880 -320 ) ( 1944 -1880 -288 ) ( 1976 -1880 -288 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1976 -1112 -288 ) ( 1944 -1112 -288 ) ( 1944 -1112 -320 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1976 -1144 -288 ) ( 1944 -1144 -288 ) ( 1944 -1128 -288 ) subway/1_tunnelwall -32 8 0 1 1 0 301989888 0 +( 1968 -1880 -296 ) ( 1968 -1848 -296 ) ( 1944 -1848 -288 ) subway/1_tunnelwall 0 -27 90 0.500000 0.500000 0 301989888 0 +( 1968 -1112 -296 ) ( 1968 -1144 -296 ) ( 1976 -1144 -288 ) subway/1_tunnelwall -32 8 0 1 1 0 301989888 0 +} +// brush 1583 +{ +( 1976 -644 -320 ) ( 1976 -644 -288 ) ( 1976 -628 -288 ) subway/1_tunnelwall 36 0 0 1 1 0 301989888 0 +( 1968 -1420 -296 ) ( 1968 -1452 -296 ) ( 1976 -1452 -320 ) subway/1_tunnelwall 16 0 0 0.500000 0.500000 0 301989888 0 +( 1968 -548 -296 ) ( 1968 -516 -296 ) ( 1976 -516 -288 ) subway/1_tunnelwall -32 -36 0 1 1 0 301989888 0 +( 1968 -1880 -336 ) ( 1968 -1880 -280 ) ( 1976 -1880 -308 ) subway/1_tunnelwall -32 -24 0 1 1 0 301989888 0 +( 1964 -1112 -320 ) ( 1982 -1112 -320 ) ( 1973 -1112 -288 ) subway/1_tunnelwall -32 -24 0 1 1 0 301989888 0 +} +// brush 1584 +{ +( 1824 -1880 -38 ) ( 1824 -1880 -48 ) ( 1776 -1880 -48 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1856 -2208 -224 ) ( 1856 -2208 -216 ) ( 1856 -2184 -216 ) subway/1_tunnelwall 32 -24 0 1 1 0 301989888 0 +( 1608 -1112 -256 ) ( 1608 -1112 -248 ) ( 1488 -1112 -248 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1808 -2080 -296 ) ( 1808 -2080 -288 ) ( 1808 -2104 -288 ) subway/1_tunnelwall 32 -24 0 1 1 0 301989888 0 +( 1552 -1908 -344 ) ( 1552 -1908 -336 ) ( 1672 -1908 -336 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1504 -1964 -280 ) ( 1624 -1964 -280 ) ( 1624 -1988 -280 ) subway/1_tunnelwall 16 -40 0 1 1 0 301989888 0 +( 1640 -1972 -296 ) ( 1640 -1948 -296 ) ( 1520 -1948 -296 ) subway/1_tunnelwall 7 -11 90 0.500000 0.500000 0 301989888 0 +} +// brush 1585 +{ +( 1784 -1880 -320 ) ( 1784 -1880 -288 ) ( 1816 -1880 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 -1112 -288 ) ( 1784 -1112 -288 ) ( 1784 -1112 -320 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 -1144 -288 ) ( 1784 -1144 -288 ) ( 1784 -1128 -288 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +( 1808 -1776 -296 ) ( 1808 -1744 -296 ) ( 1784 -1744 -288 ) subway/1_tunnelwall 0 -27 90 0.500000 0.500000 0 301989888 0 +( 1808 -1216 -296 ) ( 1808 -1248 -296 ) ( 1816 -1248 -288 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +} +// brush 1586 +{ +( 1688 -1880 -288 ) ( 1720 -1880 -288 ) ( 1720 -1880 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 -1112 -320 ) ( 1720 -1112 -288 ) ( 1688 -1112 -288 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 -1128 -288 ) ( 1720 -1144 -288 ) ( 1688 -1144 -288 ) subway/1_tunnelwall 16 8 0 1 1 0 301989888 0 +( 1720 -1848 -288 ) ( 1696 -1848 -296 ) ( 1696 -1880 -296 ) subway/1_tunnelwall 0 0 90 0.500000 0.500000 0 301989888 0 +( 1688 -1144 -288 ) ( 1696 -1144 -296 ) ( 1696 -1112 -296 ) subway/1_tunnelwall 16 8 0 1 1 0 301989888 0 +} +// brush 1587 +{ +( 1720 -1104 -280 ) ( 1720 -1144 -280 ) ( 1720 -1144 -504 ) subway/1_tunnelwall -8 0 0 1 1 0 301989888 0 +( 1784 -1248 -280 ) ( 1784 -1208 -280 ) ( 1784 -1208 -504 ) subway/1_tunnelwall -8 0 0 1 1 0 301989888 0 +( 1704 -1880 -280 ) ( 1768 -1880 -280 ) ( 1768 -1880 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1768 -1144 -280 ) ( 1768 -1104 -280 ) ( 1832 -1104 -280 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +( 1832 -1104 -288 ) ( 1768 -1104 -288 ) ( 1768 -1144 -288 ) subway/1_tunnel_ceiling2 48 8 0 1 1 0 16777216 0 +( 1744 -1112 -288 ) ( 1776 -1112 -288 ) ( 1760 -1112 -280 ) subway/1_tunnel_ceiling2 48 0 0 1 1 0 16777216 0 +} +// brush 1588 +{ +( 1984 -1076 -520 ) ( 1864 -1076 -520 ) ( 1864 -1100 -520 ) subway/1_tunnelwall -32 -16 0 0.500000 0.500000 0 301989888 0 +( 1872 -1092 -488 ) ( 1872 -1068 -488 ) ( 1992 -1068 -488 ) subway/1_tunnelwall -32 -16 0 0.500000 0.500000 0 301989888 0 +( 1688 -1136 -504 ) ( 1688 -1112 -504 ) ( 1688 -1112 -512 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 2008 -344 -464 ) ( 1888 -344 -464 ) ( 1888 -344 -472 ) subway/1_tunnelwall -32 -48 0 0.500000 0.500000 0 301989888 0 +( 1680 -1452 -432 ) ( 1680 -1476 -432 ) ( 1680 -1476 -440 ) subway/1_tunnelwall 16 -48 0 0.500000 0.500000 0 301989888 0 +( 1704 -1112 -520 ) ( 1648 -1112 -520 ) ( 1676 -1112 -488 ) subway/1_tunneltrack_1 -28 -54 195 1 1 0 16777216 0 +} +// brush 1589 +{ +( 1984 -1076 -520 ) ( 1864 -1076 -520 ) ( 1864 -1100 -520 ) subway/1_tunnelwall -32 -16 0 0.500000 0.500000 0 301989888 0 +( 1872 -1092 -488 ) ( 1872 -1068 -488 ) ( 1992 -1068 -488 ) subway/1_tunnelwall -32 -16 0 0.500000 0.500000 0 301989888 0 +( 1680 -1880 -520 ) ( 1680 -1880 -488 ) ( 1688 -1888 -488 ) subway/1_tunnelwall -32 -48 0 0.500000 0.500000 0 301989888 0 +( 1688 -1144 -504 ) ( 1688 -1120 -504 ) ( 1688 -1120 -512 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1680 -1880 -488 ) ( 1680 -1880 -520 ) ( 1680 -1112 -520 ) subway/1_tunnelwall 16 -48 0 0.500000 0.500000 0 301989888 0 +( 1648 -1112 -520 ) ( 1704 -1112 -520 ) ( 1676 -1112 -488 ) subway/1_tunneltrack_1 -28 -54 195 1 1 0 16777216 0 +} +// brush 1590 +{ +( 1984 -1052 -536 ) ( 1864 -1052 -536 ) ( 1864 -1076 -536 ) subway/con6 -32 -48 0 0.500000 0.500000 0 285212672 0 +( 1872 -1092 -520 ) ( 1872 -1068 -520 ) ( 1992 -1068 -520 ) subway/con6 -32 -48 0 0.500000 0.500000 0 285212672 0 +( 1688 -1160 -520 ) ( 1688 -1136 -520 ) ( 1688 -1136 -528 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1672 -1132 -448 ) ( 1672 -1156 -448 ) ( 1672 -1156 -456 ) subway/con6 16 -16 0 0.500000 0.500000 0 285212672 0 +( 1700 -648 -520 ) ( 1676 -648 -520 ) ( 1700 -648 -536 ) subway/1_tunneltrack_1 -28 -54 195 1 1 0 16777216 0 +( 1704 -1112 -536 ) ( 1648 -1112 -536 ) ( 1676 -1112 -520 ) subway/1_tunneltrack_1 -28 -54 195 1 1 0 16777216 0 +} +// brush 1591 +{ +( 1688 -344 -496 ) ( 1688 -344 -480 ) ( 1680 -344 -480 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1680 -944 -480 ) ( 1680 -1280 -480 ) ( 1680 -1280 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1688 -1216 -496 ) ( 1688 -1216 -480 ) ( 1688 -928 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1664 -868 -480 ) ( 1664 -692 -480 ) ( 1688 -692 -480 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1688 -692 -488 ) ( 1664 -692 -488 ) ( 1664 -868 -488 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1792 -1112 -488 ) ( 1648 -1112 -488 ) ( 1720 -1112 -480 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +} +// brush 1592 +{ +( 1680 -1880 -480 ) ( 1680 -1880 -488 ) ( 1680 -1112 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1680 -1880 -488 ) ( 1680 -1880 -480 ) ( 1688 -1888 -480 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1688 -1224 -496 ) ( 1688 -1224 -480 ) ( 1688 -936 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1664 -868 -480 ) ( 1664 -692 -480 ) ( 1688 -692 -480 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1688 -692 -488 ) ( 1664 -692 -488 ) ( 1664 -868 -488 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1648 -1112 -488 ) ( 1792 -1112 -488 ) ( 1720 -1112 -480 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +} +// brush 1593 +{ +( 1984 -1820 -480 ) ( 1864 -1820 -480 ) ( 1864 -1844 -480 ) subway/1_tunnelwall_pipe 32 0 0 0.500000 0.500000 0 16777216 0 +( 1872 -1900 -448 ) ( 1872 -1876 -448 ) ( 1992 -1876 -448 ) subway/1_tunnelwall_pipe 32 0 0 0.500000 0.500000 0 16777216 0 +( 1824 -2236 -512 ) ( 1944 -2236 -512 ) ( 1944 -2236 -520 ) subway/1_tunnelwall_pipe 32 -32 0 0.500000 0.500000 0 16777216 0 +( 1688 -2216 -480 ) ( 1688 -2192 -480 ) ( 1688 -2192 -488 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 2008 -1112 -424 ) ( 1888 -1112 -424 ) ( 1888 -1112 -432 ) subway/1_tunnelwall_pipe 32 -32 0 0.500000 0.500000 0 16777216 0 +( 1680 -1880 -448 ) ( 1680 -1880 -480 ) ( 1680 -1112 -480 ) subway/1_tunnelwall_pipe 16 -32 0 0.500000 0.500000 0 16777216 0 +( 1680 -1880 -480 ) ( 1680 -1880 -448 ) ( 1688 -1888 -448 ) subway/1_tunneltrack_1 -29 -54 195 1 1 0 16777216 0 +} +// brush 1594 +{ +( 1680 -1880 -416 ) ( 1680 -1880 -448 ) ( 1680 -1112 -448 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 2012 -1112 -376 ) ( 1892 -1112 -376 ) ( 1892 -1112 -384 ) subway/1_tunnelwall -32 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -1840 -432 ) ( 1688 -1816 -432 ) ( 1688 -1816 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1992 -1460 -448 ) ( 1872 -1460 -448 ) ( 1872 -1484 -448 ) subway/1_tunnelwall -32 0 0 0.500000 0.500000 0 301989888 0 +( 1680 -1880 -448 ) ( 1680 -1880 -416 ) ( 1688 -1888 -416 ) subway/1_tunnelwall -32 -32 0 0.500000 0.500000 0 301989888 0 +( 1720 -1568 -416 ) ( 1720 -1640 -416 ) ( 1696 -1568 -416 ) subway/1_tunnelwall -32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1595 +{ +( 1672 -956 -344 ) ( 1672 -980 -344 ) ( 1672 -980 -352 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -1312 -432 ) ( 1688 -1288 -432 ) ( 1688 -1288 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1704 -1888 -448 ) ( 1696 -1888 -336 ) ( 1704 -1888 -336 ) subway/1_tunnelwall -32 -32 0 0.500000 0.500000 0 301989888 0 +( 1720 -1640 -416 ) ( 1720 -1568 -416 ) ( 1696 -1568 -416 ) subway/1_tunnelwall -32 -32 0 0.500000 0.500000 0 301989888 0 +( 1696 -1568 -352 ) ( 1720 -1568 -352 ) ( 1720 -1640 -352 ) subway/1_tunnelwall -32 -32 0 0.500000 0.500000 0 301989888 0 +( 1696 -1112 -256 ) ( 1696 -1112 -416 ) ( 1720 -1112 -256 ) subway/1_tunnelwall -32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1596 +{ +( 1688 -1880 -288 ) ( 1720 -1880 -288 ) ( 1720 -1880 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1688 -516 -288 ) ( 1688 -532 -288 ) ( 1688 -532 -320 ) subway/1_tunnelwall 12 0 0 1 1 0 301989888 0 +( 1688 -1688 -320 ) ( 1696 -1688 -296 ) ( 1696 -1656 -296 ) subway/1_tunnelwall -32 0 0 0.500000 0.500000 0 301989888 0 +( 1688 -620 -288 ) ( 1696 -620 -296 ) ( 1696 -652 -296 ) subway/1_tunnelwall 16 -12 0 1 1 0 301989888 0 +( 1684 -1112 -320 ) ( 1708 -1112 -320 ) ( 1696 -1112 -288 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +} +// brush 1597 +{ +( 1672 -956 -344 ) ( 1672 -980 -344 ) ( 1672 -980 -352 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 2012 -1112 -376 ) ( 1892 -1112 -376 ) ( 1892 -1112 -384 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -1832 -432 ) ( 1688 -1808 -432 ) ( 1688 -1808 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1688 -2020 -288 ) ( 1696 -2020 -288 ) ( 1696 -2068 -288 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1704 -1888 -448 ) ( 1696 -1888 -336 ) ( 1704 -1888 -336 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1720 -1568 -352 ) ( 1696 -1568 -352 ) ( 1720 -1640 -352 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1598 +{ +( 1784 -1256 -520 ) ( 1784 -1280 -520 ) ( 1784 -1280 -528 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 2016 -1112 -480 ) ( 1896 -1112 -480 ) ( 1896 -1112 -488 ) subway/1_tunneltrack_plain -32 -48 0 0.500000 0.500000 0 301989888 0 +( 1872 -2048 -520 ) ( 1872 -2024 -520 ) ( 1872 -2024 -528 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1816 -1880 -568 ) ( 1936 -1880 -568 ) ( 1936 -1880 -576 ) subway/1_tunneltrack_plain -32 -48 0 0.500000 0.500000 0 301989888 0 +( 1864 -2008 -536 ) ( 1864 -1984 -536 ) ( 1984 -1984 -536 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 1960 -2008 -552 ) ( 1840 -2008 -552 ) ( 1840 -2032 -552 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1599 +{ +( 1800 -1880 -264 ) ( 1760 -1880 -264 ) ( 1760 -1880 -254 ) subway/1_tunneltrack_1 26 -20 195 1 1 0 16777216 0 +( 1976 -2368 -504 ) ( 1976 -2368 -536 ) ( 1928 -2368 -536 ) subway/metal2 -24 -48 0 0.500000 0.500000 0 16777216 0 +( 1792 -1800 -728 ) ( 1792 -1800 -768 ) ( 1792 -1808 -768 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1976 -1112 -536 ) ( 1976 -1112 -504 ) ( 1928 -1112 -504 ) subway/metal2 -24 -48 0 0.500000 0.500000 0 16777216 0 +( 1784 -1248 -516 ) ( 1784 -1512 -516 ) ( 1784 -1512 -548 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1872 -2088 -528 ) ( 1872 -1824 -528 ) ( 1904 -1824 -528 ) subway/metal2 -24 32 0 0.500000 0.500000 0 16777216 0 +( 1976 -1952 -536 ) ( 1976 -1944 -536 ) ( 1928 -1944 -536 ) subway/metal2 -24 32 0 0.500000 0.500000 0 16777216 0 +} +// brush 1600 +{ +( 1720 -640 -512 ) ( 1720 -664 -512 ) ( 1720 -664 -520 ) subway/1_tunneltrack_1 -20 -56 0 1 1 0 16777216 0 +( 1976 -1112 -480 ) ( 1856 -1112 -480 ) ( 1856 -1112 -488 ) subway/1_tunneltrack_1 28 -56 0 1 1 0 16777216 0 +( 1792 -680 -520 ) ( 1792 -656 -520 ) ( 1792 -656 -528 ) subway/1_tunneltrack_1 -20 -56 0 1 1 0 16777216 0 +( 1772 -1880 -568 ) ( 1892 -1880 -568 ) ( 1892 -1880 -576 ) subway/1_tunneltrack_1 28 -56 0 1 1 0 16777216 0 +( 1836 -1536 -536 ) ( 1836 -1512 -536 ) ( 1956 -1512 -536 ) subway/1_tunneltrack_1 -12 40 0 1 1 0 16777216 0 +( 1956 -1496 -544 ) ( 1836 -1496 -544 ) ( 1836 -1520 -544 ) subway/1_tunneltrack_1 28 40 0 1 1 0 16777216 0 +} +// brush 1601 +{ +( 1744 -1880 -264 ) ( 1680 -1880 -264 ) ( 1680 -1880 -254 ) subway/1_tunneltrack_1 30 -19 195 1 1 0 16777216 0 +( 1904 -1952 -536 ) ( 1904 -1944 -536 ) ( 1856 -1944 -536 ) subway/metal2 -32 32 0 0.500000 0.500000 0 16777216 0 +( 1800 -2088 -528 ) ( 1800 -1824 -528 ) ( 1832 -1824 -528 ) subway/metal2 -32 32 0 0.500000 0.500000 0 16777216 0 +( 1712 -1952 -516 ) ( 1712 -2216 -516 ) ( 1712 -2216 -548 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1904 -1112 -536 ) ( 1904 -1112 -504 ) ( 1856 -1112 -504 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1720 -1608 -728 ) ( 1720 -1608 -768 ) ( 1720 -1616 -768 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1904 -2368 -504 ) ( 1904 -2368 -536 ) ( 1856 -2368 -536 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 1602 +{ +( 1688 -1112 -552 ) ( 1688 -1112 -536 ) ( 1688 -1888 -536 ) subway/1_tunneltrack_plain -48 -48 0 0.500000 0.500000 0 301989888 0 +( 1688 -1112 -536 ) ( 1688 -1112 -552 ) ( 1712 -1112 -552 ) subway/1_tunneltrack_plain -48 -48 0 0.500000 0.500000 0 301989888 0 +( 1712 -1920 -552 ) ( 1712 -1920 -536 ) ( 1712 -1112 -536 ) subway/1_tunneltrack_plain -48 -48 0 0.500000 0.500000 0 301989888 0 +( 1688 -1888 -552 ) ( 1688 -1888 -536 ) ( 1712 -1920 -536 ) subway/1_tunneltrack_plain -48 -48 0 0.500000 0.500000 0 301989888 0 +( 1752 -1416 -536 ) ( 1752 -1392 -536 ) ( 1872 -1392 -536 ) subway/1_tunnelfloor_2 25 23 90 -1 -1 0 285212672 0 +( 1872 -1392 -552 ) ( 1752 -1392 -552 ) ( 1752 -1416 -552 ) subway/1_tunneltrack_plain -48 48 0 0.500000 0.500000 0 301989888 0 +} +// brush 1603 +{ +( 2120 -1600 -552 ) ( 2000 -1600 -552 ) ( 2000 -1624 -552 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 2024 -1600 -536 ) ( 2024 -1576 -536 ) ( 2144 -1576 -536 ) subway/1_tunnelfloor_2 -16 -23 90 1 1 0 285212672 0 +( 1952 -1920 -552 ) ( 1952 -1920 -536 ) ( 1976 -1888 -536 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1976 -1576 -552 ) ( 1976 -1576 -536 ) ( 1976 -1112 -536 ) subway/1_tunneltrack_plain -16 -48 0 0.500000 0.500000 0 301989888 0 +( 2184 -1112 -480 ) ( 2064 -1112 -480 ) ( 2064 -1112 -488 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1952 -1920 -536 ) ( 1952 -1920 -552 ) ( 1952 -1112 -552 ) subway/1_tunneltrack_plain -16 -48 0 0.500000 0.500000 0 301989888 0 +} +// brush 1604 +{ +( 2116 -1088 -544 ) ( 1996 -1088 -544 ) ( 1996 -1112 -544 ) subway/1_tunneltrack_1 -4 0 0 1 1 0 16777216 0 +( 1996 -1128 -536 ) ( 1996 -1104 -536 ) ( 2116 -1104 -536 ) subway/1_tunneltrack_1 20 0 0 1 1 0 16777216 0 +( 1932 -1880 -568 ) ( 2052 -1880 -568 ) ( 2052 -1880 -576 ) subway/1_tunneltrack_1 -4 -56 0 1 1 0 16777216 0 +( 1944 -1048 -520 ) ( 1944 -1024 -520 ) ( 1944 -1024 -528 ) subway/1_tunneltrack_1 -44 -56 0 1 1 0 16777216 0 +( 2136 -1112 -480 ) ( 2016 -1112 -480 ) ( 2016 -1112 -488 ) subway/1_tunneltrack_1 -4 -56 0 1 1 0 16777216 0 +( 1880 -1008 -512 ) ( 1880 -1032 -512 ) ( 1880 -1032 -520 ) subway/1_tunneltrack_1 -44 -56 0 1 1 0 16777216 0 +} +// brush 1605 +{ +( 1960 -1880 -264 ) ( 1920 -1880 -264 ) ( 1920 -1880 -254 ) subway/1_tunneltrack_1 -11 -44 195 1 1 0 16777216 0 +( 2136 -1960 -504 ) ( 2136 -1960 -536 ) ( 2088 -1960 -536 ) subway/metal2 -24 -48 0 0.500000 0.500000 0 16777216 0 +( 1952 -1392 -728 ) ( 1952 -1392 -768 ) ( 1952 -1400 -768 ) subway/metal2 -16 -48 0 0.500000 0.500000 0 16777216 0 +( 2136 -1112 -536 ) ( 2136 -1112 -504 ) ( 2088 -1112 -504 ) subway/metal2 -24 -48 0 0.500000 0.500000 0 16777216 0 +( 1944 -1656 -516 ) ( 1944 -1920 -516 ) ( 1944 -1920 -548 ) subway/metal2 -16 -48 0 0.500000 0.500000 0 16777216 0 +( 2032 -1680 -528 ) ( 2032 -1416 -528 ) ( 2064 -1416 -528 ) subway/metal2 -24 16 0 0.500000 0.500000 0 16777216 0 +( 2136 -1544 -536 ) ( 2136 -1536 -536 ) ( 2088 -1536 -536 ) subway/metal2 -24 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 1606 +{ +( 1904 -1880 -264 ) ( 1840 -1880 -264 ) ( 1840 -1880 -254 ) subway/1_tunneltrack_1 -8 -43 195 1 1 0 16777216 0 +( 2064 -1544 -536 ) ( 2064 -1536 -536 ) ( 2016 -1536 -536 ) subway/metal2 -32 16 0 0.500000 0.500000 0 16777216 0 +( 1960 -1680 -528 ) ( 1960 -1416 -528 ) ( 1992 -1416 -528 ) subway/metal2 -32 16 0 0.500000 0.500000 0 16777216 0 +( 1872 -1544 -516 ) ( 1872 -1808 -516 ) ( 1872 -1808 -548 ) subway/metal2 -16 -48 0 0.500000 0.500000 0 16777216 0 +( 2064 -1112 -536 ) ( 2064 -1112 -504 ) ( 2016 -1112 -504 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1880 -2016 -728 ) ( 1880 -2016 -768 ) ( 1880 -2024 -768 ) subway/metal2 -16 -48 0 0.500000 0.500000 0 16777216 0 +( 2064 -1960 -504 ) ( 2064 -1960 -536 ) ( 2016 -1960 -536 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 1607 +{ +( 1848 364 -232 ) ( 1848 364 -224 ) ( 1848 388 -224 ) subway/1_tunnelwall 0 -32 0 1 1 0 301989888 0 +( 1608 1352 -264 ) ( 1608 1352 -256 ) ( 1488 1352 -256 ) subway/1_tunnelwall 16 -32 0 1 1 0 301989888 0 +( 1816 440 -304 ) ( 1816 440 -296 ) ( 1816 416 -296 ) subway/1_tunnelwall 0 -32 0 1 1 0 301989888 0 +( 1512 500 -288 ) ( 1632 500 -288 ) ( 1632 476 -288 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +( 1640 492 -320 ) ( 1640 516 -320 ) ( 1520 516 -320 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1001 +( 1872 1000 -320 ) ( 1808 1000 -320 ) ( 1840 1000 -288 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 0 +} +// brush 1608 +{ +( 1824 756 -46 ) ( 1824 756 -56 ) ( 1776 756 -56 ) subway/1_tunnelwall 16 -32 0 1 1 0 301989888 0 +( 1848 364 -232 ) ( 1848 364 -224 ) ( 1848 388 -224 ) subway/1_tunnelwall 0 -32 0 1 1 0 301989888 0 +( 1816 440 -304 ) ( 1816 440 -296 ) ( 1816 416 -296 ) subway/1_tunnelwall 0 -32 0 1 1 0 301989888 0 +( 1512 500 -288 ) ( 1632 500 -288 ) ( 1632 476 -288 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +( 1640 492 -320 ) ( 1640 516 -320 ) ( 1520 516 -320 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1002 +( 1808 1000 -320 ) ( 1872 1000 -320 ) ( 1840 1000 -288 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 0 +} +// brush 1609 +{ +( 1848 728 -320 ) ( 1848 760 -320 ) ( 1848 760 -448 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1832 776 -320 ) ( 1816 776 -320 ) ( 1816 776 -448 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1816 760 -288 ) ( 1816 728 -288 ) ( 1816 728 -416 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1816 756 -320 ) ( 1848 756 -320 ) ( 1848 648 -480 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1848 756 -320 ) ( 1816 756 -320 ) ( 1816 776 -320 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1816 760 -448 ) ( 1816 656 -448 ) ( 1848 708 -448 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +} +// brush 1610 +{ +( 1848 728 -320 ) ( 1848 760 -320 ) ( 1848 760 -448 ) subway/1_tunnelwall_pipe -16 8 0 0.500000 0.500000 0 16777216 0 +( 1832 776 -320 ) ( 1816 776 -320 ) ( 1816 776 -448 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1816 760 -288 ) ( 1816 728 -288 ) ( 1816 728 -416 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1816 756 -320 ) ( 1848 756 -320 ) ( 1848 648 -480 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1816 736 -480 ) ( 1816 632 -480 ) ( 1848 684 -480 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1816 656 -448 ) ( 1816 760 -448 ) ( 1848 708 -448 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +} +// brush 1611 +{ +( 1848 1352 -536 ) ( 2000 1352 -536 ) ( 2000 1352 -544 ) subway/1_tunnelwall_pipe -16 8 0 0.500000 0.500000 0 16777216 0 +( 2000 1352 -536 ) ( 2000 1360 -536 ) ( 2000 1360 -544 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +( 2000 1360 -536 ) ( 1848 1360 -536 ) ( 1848 1360 -544 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +( 1832 1360 -536 ) ( 1832 1352 -536 ) ( 1832 1352 -544 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +( 1976 1352 -480 ) ( 2016 1352 -480 ) ( 1996 1360 -480 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +( 2024 1352 -448 ) ( 1952 1352 -448 ) ( 1988 1360 -448 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +} +// brush 1612 +{ +( 1848 1352 -280 ) ( 1848 1360 -280 ) ( 2000 1360 -280 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +( 1848 1352 -536 ) ( 2000 1352 -536 ) ( 2000 1352 -544 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 2000 1352 -536 ) ( 2000 1360 -536 ) ( 2000 1360 -544 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +( 2000 1360 -536 ) ( 1848 1360 -536 ) ( 1848 1360 -544 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +( 1832 1360 -536 ) ( 1832 1352 -536 ) ( 1832 1352 -544 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +( 1952 1352 -448 ) ( 2024 1352 -448 ) ( 1988 1360 -448 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +} +// brush 1613 +{ +( 1848 1352 -536 ) ( 2000 1352 -536 ) ( 2000 1352 -544 ) subway/1_trim1 0 0 0 -0.500000 0.500000 0 0 0 +( 2000 1352 -536 ) ( 2000 1360 -536 ) ( 2000 1360 -544 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 2000 1360 -536 ) ( 1848 1360 -536 ) ( 1848 1360 -544 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1832 1360 -536 ) ( 1832 1352 -536 ) ( 1832 1352 -544 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1960 1352 -488 ) ( 2008 1352 -488 ) ( 1984 1360 -488 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 2016 1352 -480 ) ( 1976 1352 -480 ) ( 1996 1360 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 1614 +{ +( 1848 1352 -536 ) ( 2000 1352 -536 ) ( 2000 1352 -544 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +( 2000 1352 -536 ) ( 2000 1360 -536 ) ( 2000 1360 -544 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +( 2000 1360 -536 ) ( 1848 1360 -536 ) ( 1848 1360 -544 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +( 1832 1360 -536 ) ( 1832 1352 -536 ) ( 1832 1352 -544 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +( 1960 1352 -520 ) ( 2016 1352 -520 ) ( 1988 1360 -520 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +( 2008 1352 -488 ) ( 1960 1352 -488 ) ( 1984 1360 -488 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +} +// brush 1615 +{ +( 2000 1360 -544 ) ( 1848 1360 -544 ) ( 1848 1352 -544 ) subway/1_tunnelwall_floor -48 16 0 1 0.500000 0 285212672 0 +( 1848 1352 -536 ) ( 2000 1352 -536 ) ( 2000 1352 -544 ) subway/1_tunnelwall_floor -48 16 0 1 0.500000 0 285212672 0 +( 2000 1352 -536 ) ( 2000 1360 -536 ) ( 2000 1360 -544 ) subway/1_tunnelwall_floor -48 16 0 1 0.500000 0 285212672 0 +( 2000 1360 -536 ) ( 1848 1360 -536 ) ( 1848 1360 -544 ) subway/1_tunnelwall_floor -48 16 0 1 0.500000 0 285212672 0 +( 1832 1360 -536 ) ( 1832 1352 -536 ) ( 1832 1352 -544 ) subway/1_tunnelwall_floor -48 16 0 1 0.500000 0 285212672 0 +( 2016 1352 -520 ) ( 1960 1352 -520 ) ( 1988 1360 -520 ) subway/1_tunnelwall_floor -48 16 0 1 0.500000 0 285212672 0 +} +// brush 1616 +{ +( 1688 1360 -432 ) ( 1688 1384 -432 ) ( 1688 1384 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 2012 1760 -376 ) ( 1892 1760 -376 ) ( 1892 1760 -384 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1672 1940 -344 ) ( 1672 1916 -344 ) ( 1672 1916 -352 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1688 1592 -424 ) ( 1672 1592 -424 ) ( 1672 1544 -424 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1672 1552 -360 ) ( 1672 1600 -360 ) ( 1688 1600 -360 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1672 1584 -264 ) ( 1688 1584 -264 ) ( 1672 1584 -424 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1617 +{ +( 1688 1352 -448 ) ( 1680 1352 -336 ) ( 1688 1352 -336 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1688 1376 -432 ) ( 1688 1400 -432 ) ( 1688 1400 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1672 1940 -344 ) ( 1672 1916 -344 ) ( 1672 1916 -352 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1688 1592 -424 ) ( 1672 1592 -424 ) ( 1672 1544 -424 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1672 1552 -360 ) ( 1672 1600 -360 ) ( 1688 1600 -360 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1688 1552 -264 ) ( 1672 1552 -264 ) ( 1688 1552 -424 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1618 +{ +( 1688 1352 -448 ) ( 1680 1352 -336 ) ( 1688 1352 -336 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1688 884 -288 ) ( 1696 884 -288 ) ( 1696 836 -288 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1688 1376 -432 ) ( 1688 1400 -432 ) ( 1688 1400 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 2012 1760 -376 ) ( 1892 1760 -376 ) ( 1892 1760 -384 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1672 1940 -344 ) ( 1672 1916 -344 ) ( 1672 1916 -352 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1672 1600 -360 ) ( 1672 1552 -360 ) ( 1688 1600 -360 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1619 +{ +( 1688 1352 -448 ) ( 1680 1352 -336 ) ( 1688 1352 -336 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1992 1484 -448 ) ( 1872 1484 -448 ) ( 1872 1460 -448 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1688 1376 -432 ) ( 1688 1400 -432 ) ( 1688 1400 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 2012 1760 -376 ) ( 1892 1760 -376 ) ( 1892 1760 -384 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1672 1940 -344 ) ( 1672 1916 -344 ) ( 1672 1916 -352 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1672 1592 -424 ) ( 1688 1592 -424 ) ( 1672 1544 -424 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1620 +{ +( 1688 1576 -400 ) ( 1672 1576 -400 ) ( 1672 1528 -400 ) subway/sign4 0 -16 0 1 1 0 0 0 +( 1672 1536 -368 ) ( 1672 1584 -368 ) ( 1688 1584 -368 ) subway/sign4 0 -16 0 1 1 0 0 0 +( 1672 1552 -264 ) ( 1688 1552 -264 ) ( 1688 1552 -424 ) subway/sign4 0 24 0 1 1 0 0 0 +( 1688 1528 -264 ) ( 1688 1576 -264 ) ( 1688 1576 -424 ) subway/sign4 32 32 0 0.500000 0.500000 0 0 0 +( 1688 1584 -264 ) ( 1672 1584 -264 ) ( 1672 1584 -424 ) subway/sign4 0 24 0 1 1 0 0 0 +( 1672 1576 -264 ) ( 1672 1528 -264 ) ( 1672 1528 -424 ) subway/sign4 16 24 0 1 1 0 0 0 +} +// brush 1621 +{ +( 1868 640 -292 ) ( 1756 640 -292 ) ( 1756 592 -292 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1756 592 -288 ) ( 1756 640 -288 ) ( 1868 640 -288 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1668 592 -296 ) ( 1780 592 -296 ) ( 1780 592 -312 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1780 592 -304 ) ( 1780 640 -304 ) ( 1780 640 -320 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1868 596 -304 ) ( 1756 596 -304 ) ( 1756 596 -320 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1776 640 -296 ) ( 1776 592 -296 ) ( 1776 592 -312 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1622 +{ +( 1816 640 -292 ) ( 1704 640 -292 ) ( 1704 592 -292 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1704 592 -288 ) ( 1704 640 -288 ) ( 1816 640 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1616 592 -296 ) ( 1728 592 -296 ) ( 1728 592 -312 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1728 592 -296 ) ( 1728 640 -296 ) ( 1728 640 -312 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1816 596 -304 ) ( 1704 596 -304 ) ( 1704 596 -320 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1724 640 -304 ) ( 1724 592 -304 ) ( 1724 592 -320 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1623 +{ +( 1800 -1076 -536 ) ( 1800 -1052 -536 ) ( 1680 -1052 -536 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1672 -1068 -520 ) ( 1792 -1068 -520 ) ( 1792 -1092 -520 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1976 -1136 -528 ) ( 1976 -1136 -520 ) ( 1976 -1160 -520 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1992 -1156 -456 ) ( 1992 -1156 -448 ) ( 1992 -1132 -448 ) subway/con6 -48 -16 0 0.500000 0.500000 0 285212672 0 +( 2008 -1112 -254 ) ( 2008 -1112 -264 ) ( 1952 -1112 -264 ) subway/1_tunneltrack_1 -54 24 195 1 1 0 16777216 0 +( 1972 -648 -520 ) ( 1972 -648 -536 ) ( 1996 -648 -520 ) subway/1_tunneltrack_1 -54 24 195 1 1 0 16777216 0 +} +// brush 1624 +{ +( 1972 -344 -536 ) ( 1996 -344 -520 ) ( 1972 -344 -520 ) subway/con6 0 -16 0 0.500000 0.500000 0 285212672 0 +( 1800 -1076 -536 ) ( 1800 -1052 -536 ) ( 1680 -1052 -536 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1672 -1068 -520 ) ( 1792 -1068 -520 ) ( 1792 -1092 -520 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1976 -1136 -528 ) ( 1976 -1136 -520 ) ( 1976 -1160 -520 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1992 -1156 -456 ) ( 1992 -1156 -448 ) ( 1992 -1132 -448 ) subway/con6 -48 -16 0 0.500000 0.500000 0 285212672 0 +( 2008 -632 -520 ) ( 2008 -632 -536 ) ( 1984 -632 -520 ) subway/1_tunneltrack_1 -54 24 195 1 1 0 16777216 0 +} +// brush 1625 +{ +( 1992 -656 -536 ) ( 1992 -656 -520 ) ( 1992 -624 -520 ) subway/light_red 16 16 0 0.500000 0.500000 0 16777217 15000 +( 2008 -632 -536 ) ( 2008 -632 -520 ) ( 1984 -632 -520 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1976 -616 -536 ) ( 1976 -616 -520 ) ( 1976 -648 -520 ) subway/light_yellow 16 16 0 0.500000 0.500000 0 16777217 22000 +( 1972 -648 -536 ) ( 1972 -648 -520 ) ( 1996 -648 -520 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1976 -616 -520 ) ( 2000 -616 -520 ) ( 2000 -648 -520 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +( 2000 -648 -536 ) ( 2000 -616 -536 ) ( 1976 -616 -536 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +} +// brush 1626 +{ +( 1692 -344 -520 ) ( 1668 -344 -520 ) ( 1692 -344 -536 ) subway/con6 -32 -16 0 0.500000 0.500000 0 285212672 0 +( 1984 -1052 -536 ) ( 1864 -1052 -536 ) ( 1864 -1076 -536 ) subway/con6 -32 -48 0 0.500000 0.500000 0 285212672 0 +( 1872 -1092 -520 ) ( 1872 -1068 -520 ) ( 1992 -1068 -520 ) subway/con6 -32 -48 0 0.500000 0.500000 0 285212672 0 +( 1688 -1160 -520 ) ( 1688 -1136 -520 ) ( 1688 -1136 -528 ) subway/1_tunnelwall_floor 8 -16 0 1 0.500000 0 285212672 0 +( 1672 -1132 -448 ) ( 1672 -1156 -448 ) ( 1672 -1156 -456 ) subway/con6 16 -16 0 0.500000 0.500000 0 285212672 0 +( 1664 -632 -520 ) ( 1688 -632 -520 ) ( 1664 -632 -536 ) subway/1_tunneltrack_1 -28 -54 195 1 1 0 16777216 0 +} +// brush 1627 +{ +( 1672 -624 -520 ) ( 1672 -656 -520 ) ( 1672 -656 -536 ) subway/light_red -16 16 0 0.500000 0.500000 0 16777217 15000 +( 1688 -632 -520 ) ( 1664 -632 -520 ) ( 1664 -632 -536 ) subway/light_red 16 16 0 0.500000 0.500000 0 16777217 30000 +( 1688 -648 -520 ) ( 1688 -616 -520 ) ( 1688 -616 -536 ) subway/light_yellow -16 16 0 0.500000 0.500000 0 16777217 22000 +( 1676 -648 -520 ) ( 1700 -648 -520 ) ( 1700 -648 -536 ) subway/light_red 16 16 0 0.500000 0.500000 0 16777217 30000 +( 1672 -648 -520 ) ( 1672 -616 -520 ) ( 1696 -616 -520 ) subway/light_red 16 0 0 0.500000 0.500000 0 16777217 30000 +( 1696 -616 -536 ) ( 1672 -616 -536 ) ( 1672 -648 -536 ) subway/light_red 16 0 0 0.500000 0.500000 0 16777217 30000 +} +// brush 1628 +{ +( 1672 -188 -344 ) ( 1672 -212 -344 ) ( 1672 -212 -352 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 2012 -344 -376 ) ( 1892 -344 -376 ) ( 1892 -344 -384 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -1064 -432 ) ( 1688 -1040 -432 ) ( 1688 -1040 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1720 -872 -416 ) ( 1720 -800 -416 ) ( 1696 -800 -416 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1696 -800 -352 ) ( 1720 -800 -352 ) ( 1720 -872 -352 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1720 -808 -256 ) ( 1720 -808 -416 ) ( 1696 -808 -256 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1629 +{ +( 1672 -188 -344 ) ( 1672 -212 -344 ) ( 1672 -212 -352 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -1064 -432 ) ( 1688 -1040 -432 ) ( 1688 -1040 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1704 -1112 -448 ) ( 1696 -1112 -336 ) ( 1704 -1112 -336 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1720 -872 -416 ) ( 1720 -800 -416 ) ( 1696 -800 -416 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1696 -800 -352 ) ( 1720 -800 -352 ) ( 1720 -872 -352 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1696 -872 -256 ) ( 1696 -872 -416 ) ( 1720 -872 -256 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1630 +{ +( 1672 -188 -344 ) ( 1672 -212 -344 ) ( 1672 -212 -352 ) subway/1_tunnelwall 16 -32 0 0.500000 0.500000 0 301989888 0 +( 2012 -344 -376 ) ( 1892 -344 -376 ) ( 1892 -344 -384 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -1064 -432 ) ( 1688 -1040 -432 ) ( 1688 -1040 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1688 -1252 -288 ) ( 1696 -1252 -288 ) ( 1696 -1300 -288 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1704 -1112 -448 ) ( 1696 -1112 -336 ) ( 1704 -1112 -336 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1720 -800 -352 ) ( 1696 -800 -352 ) ( 1720 -872 -352 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1631 +{ +( 1720 -872 -448 ) ( 1720 -800 -448 ) ( 1696 -800 -448 ) subway/1_tunnelwall_2 16 -16 0 1 1 0 301989888 0 +( 1696 -800 -384 ) ( 1720 -800 -384 ) ( 1720 -872 -384 ) subway/1_tunnelwall_2 16 -16 0 1 1 0 301989888 0 +( 1696 -872 -448 ) ( 1696 -872 -288 ) ( 1720 -872 -288 ) subway/1_tunnelwall_2 16 0 0 1 1 0 301989888 0 +( 1672 -800 -448 ) ( 1672 -800 -288 ) ( 1672 -872 -288 ) subway/1_tunnelwall_2 40 0 0 1 1 0 301989888 0 +( 1720 -808 -448 ) ( 1720 -808 -288 ) ( 1696 -808 -288 ) subway/1_tunnelwall_2 16 0 0 1 1 0 301989888 0 +( 1688 -872 -448 ) ( 1688 -872 -288 ) ( 1688 -800 -288 ) subway/1_tunnelwall_2 -24 0 0 1 1 0 301989888 0 +} +// brush 1632 +{ +( 1992 -212 -352 ) ( 1992 -212 -344 ) ( 1992 -188 -344 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +( 1772 -344 -416 ) ( 1772 -344 -408 ) ( 1652 -344 -408 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -1040 -472 ) ( 1976 -1040 -464 ) ( 1976 -1064 -464 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 2000 -672 -448 ) ( 2000 -600 -448 ) ( 1976 -600 -448 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -600 -352 ) ( 2000 -600 -352 ) ( 2000 -672 -352 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 2000 -608 -288 ) ( 2000 -608 -448 ) ( 1976 -608 -288 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1633 +{ +( 1992 -204 -352 ) ( 1992 -204 -344 ) ( 1992 -180 -344 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -1040 -472 ) ( 1976 -1040 -464 ) ( 1976 -1064 -464 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1960 -1112 -368 ) ( 1968 -1112 -368 ) ( 1960 -1112 -480 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 2000 -672 -448 ) ( 2000 -600 -448 ) ( 1976 -600 -448 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -592 -352 ) ( 2000 -592 -352 ) ( 2000 -664 -352 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -672 -288 ) ( 1976 -672 -448 ) ( 2000 -672 -288 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1634 +{ +( 1992 -212 -352 ) ( 1992 -212 -344 ) ( 1992 -188 -344 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +( 1772 -344 -384 ) ( 1772 -344 -376 ) ( 1652 -344 -376 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -1040 -440 ) ( 1976 -1040 -432 ) ( 1976 -1064 -432 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1968 -1300 -288 ) ( 1968 -1252 -288 ) ( 1976 -1252 -288 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1960 -1112 -336 ) ( 1968 -1112 -336 ) ( 1960 -1112 -448 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 2000 -600 -352 ) ( 1976 -600 -352 ) ( 2000 -672 -352 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1635 +{ +( 2000 -672 -448 ) ( 2000 -600 -448 ) ( 1976 -600 -448 ) subway/1_tunnelwall_2 -24 -8 0 1 1 0 301989888 0 +( 1976 -600 -384 ) ( 2000 -600 -384 ) ( 2000 -672 -384 ) subway/1_tunnelwall_2 -24 -8 0 1 1 0 301989888 0 +( 1976 -672 -448 ) ( 1976 -672 -288 ) ( 2000 -672 -288 ) subway/1_tunnelwall_2 -24 0 0 1 1 0 301989888 0 +( 1976 -592 -448 ) ( 1976 -592 -288 ) ( 1976 -664 -288 ) subway/1_tunnelwall_3 32 0 0 -1 1 0 301989888 0 +( 2000 -608 -448 ) ( 2000 -608 -288 ) ( 1976 -608 -288 ) subway/1_tunnelwall_2 -24 0 0 1 1 0 301989888 0 +( 1992 -672 -448 ) ( 1992 -672 -288 ) ( 1992 -600 -288 ) subway/1_tunnelwall_2 -32 0 0 -1 1 0 301989888 0 +} +// brush 1636 +{ +( 1744 -632 -288 ) ( 1744 -648 -288 ) ( 1744 -648 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 -632 -288 ) ( 1744 -632 -288 ) ( 1744 -632 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 -648 -288 ) ( 1760 -632 -288 ) ( 1760 -632 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 -648 -288 ) ( 1760 -648 -288 ) ( 1760 -648 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 -648 -288 ) ( 1744 -632 -288 ) ( 1760 -632 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 -632 -292 ) ( 1744 -632 -292 ) ( 1744 -648 -292 ) subway/light_orange 0 -16 0 0.500000 0.500000 134217728 1 13000 +} +// brush 1637 +{ +( 1904 -632 -288 ) ( 1904 -648 -288 ) ( 1904 -648 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 -632 -288 ) ( 1904 -632 -288 ) ( 1904 -632 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 -648 -288 ) ( 1920 -632 -288 ) ( 1920 -632 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1904 -648 -288 ) ( 1920 -648 -288 ) ( 1920 -648 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1904 -648 -288 ) ( 1904 -632 -288 ) ( 1920 -632 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 -632 -292 ) ( 1904 -632 -292 ) ( 1904 -648 -292 ) subway/light_orange 0 -16 0 0.500000 0.500000 134217728 1 13000 +} +// brush 1638 +{ +( 1696 -432 -408 ) ( 1696 -416 -408 ) ( 1688 -416 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -416 -392 ) ( 1696 -416 -392 ) ( 1696 -432 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -432 -408 ) ( 1688 -432 -392 ) ( 1696 -432 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -416 -408 ) ( 1688 -416 -392 ) ( 1688 -432 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 -416 -408 ) ( 1696 -416 -392 ) ( 1688 -416 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1690 -432 -408 ) ( 1690 -432 -392 ) ( 1690 -416 -392 ) subway/light_red 0 -16 0 0.500000 0.500000 134217792 16777217 19000 +} +// brush 1639 +{ +( 1690 -464 -408 ) ( 1690 -464 -392 ) ( 1690 -448 -392 ) subway/light_red 0 -16 0 0.500000 0.500000 134217792 16777217 19000 +( 1696 -448 -408 ) ( 1696 -448 -392 ) ( 1688 -448 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -448 -408 ) ( 1688 -448 -392 ) ( 1688 -464 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -464 -408 ) ( 1688 -464 -392 ) ( 1696 -464 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -448 -392 ) ( 1696 -448 -392 ) ( 1696 -464 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 -464 -408 ) ( 1696 -448 -408 ) ( 1688 -448 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +} +// brush 1640 +{ +( 1974 -448 -392 ) ( 1974 -464 -392 ) ( 1974 -464 -408 ) subway/light_red 0 -16 0 0.500000 0.500000 134217728 16777217 19000 +( 1976 -448 -392 ) ( 1968 -448 -392 ) ( 1968 -448 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 -464 -392 ) ( 1976 -448 -392 ) ( 1976 -448 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 -464 -392 ) ( 1976 -464 -392 ) ( 1976 -464 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 -464 -392 ) ( 1968 -448 -392 ) ( 1976 -448 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 -448 -408 ) ( 1968 -448 -408 ) ( 1968 -464 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1641 +{ +( 1976 -416 -408 ) ( 1968 -416 -408 ) ( 1968 -432 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 -432 -392 ) ( 1968 -416 -392 ) ( 1976 -416 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 -432 -392 ) ( 1976 -432 -392 ) ( 1976 -432 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 -432 -392 ) ( 1976 -416 -392 ) ( 1976 -416 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 -416 -392 ) ( 1968 -416 -392 ) ( 1968 -416 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1974 -416 -392 ) ( 1974 -432 -392 ) ( 1974 -432 -408 ) subway/light_red 0 -16 0 0.500000 0.500000 134217728 16777217 19000 +} +// brush 1642 +{ +( 2000 -344 -254 ) ( 2000 -344 -264 ) ( 1944 -344 -264 ) subway/1_tunneltrack_1 -54 -40 195 1 1 0 16777216 0 +( 1992 -388 -456 ) ( 1992 -388 -448 ) ( 1992 -364 -448 ) subway/con6 -48 -16 0 0.500000 0.500000 0 285212672 0 +( 1976 -640 -528 ) ( 1976 -640 -520 ) ( 1976 -664 -520 ) subway/1_tunnelwall_floor -56 -16 0 1 0.500000 0 285212672 0 +( 1672 -300 -520 ) ( 1792 -300 -520 ) ( 1792 -324 -520 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1800 -308 -536 ) ( 1800 -284 -536 ) ( 1680 -284 -536 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1964 -200 -520 ) ( 1964 -200 -536 ) ( 1988 -200 -520 ) subway/con6 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 1643 +{ +( 1992 -388 -456 ) ( 1992 -388 -448 ) ( 1992 -364 -448 ) subway/con6 -48 -16 0 0.500000 0.500000 0 285212672 0 +( 1976 -640 -528 ) ( 1976 -640 -520 ) ( 1976 -664 -520 ) subway/1_tunnelwall_floor -56 -16 0 1 0.500000 0 285212672 0 +( 1672 -300 -520 ) ( 1792 -300 -520 ) ( 1792 -324 -520 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1800 -308 -536 ) ( 1800 -284 -536 ) ( 1680 -284 -536 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1972 184 -520 ) ( 1972 184 -536 ) ( 1996 184 -520 ) subway/con6 0 -16 0 0.500000 0.500000 0 285212672 0 +( 2000 -184 -520 ) ( 2000 -184 -536 ) ( 1976 -184 -520 ) subway/con6 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 1644 +{ +( 1992 -208 -536 ) ( 1992 -208 -520 ) ( 1992 -176 -520 ) subway/light_red 16 16 0 0.500000 0.500000 0 16777217 15000 +( 2008 -184 -536 ) ( 2008 -184 -520 ) ( 1984 -184 -520 ) subway/light_red 16 16 0 0.500000 0.500000 0 16777217 30000 +( 1976 -168 -536 ) ( 1976 -168 -520 ) ( 1976 -200 -520 ) subway/light_yellow 16 16 0 0.500000 0.500000 0 16777217 22000 +( 1964 -200 -536 ) ( 1964 -200 -520 ) ( 1988 -200 -520 ) subway/light_red 16 16 0 0.500000 0.500000 0 16777217 30000 +( 1968 -168 -520 ) ( 1992 -168 -520 ) ( 1992 -200 -520 ) subway/light_red 16 0 0 0.500000 0.500000 0 16777217 30000 +( 1992 -200 -536 ) ( 1992 -168 -536 ) ( 1968 -168 -536 ) subway/light_red 16 0 0 0.500000 0.500000 0 16777217 30000 +} +// brush 1645 +{ +( 1984 -284 -536 ) ( 1864 -284 -536 ) ( 1864 -308 -536 ) subway/con6 32 16 0 0.500000 0.500000 0 285212672 0 +( 1872 -324 -520 ) ( 1872 -300 -520 ) ( 1992 -300 -520 ) subway/con6 32 16 0 0.500000 0.500000 0 285212672 0 +( 1688 -392 -520 ) ( 1688 -368 -520 ) ( 1688 -368 -528 ) subway/1_tunnelwall_floor -56 -16 0 1 0.500000 0 285212672 0 +( 1672 -364 -448 ) ( 1672 -388 -448 ) ( 1672 -388 -456 ) subway/con6 -48 -16 0 0.500000 0.500000 0 285212672 0 +( 1712 -344 -264 ) ( 1656 -344 -264 ) ( 1656 -344 -254 ) subway/1_tunneltrack_1 -29 -54 195 1 1 0 16777216 0 +( 1700 -200 -520 ) ( 1676 -200 -520 ) ( 1700 -200 -536 ) subway/1_tunneltrack_1 -29 -54 195 1 1 0 16777216 0 +} +// brush 1646 +{ +( 1984 -284 -536 ) ( 1864 -284 -536 ) ( 1864 -308 -536 ) subway/con6 32 16 0 0.500000 0.500000 0 285212672 0 +( 1872 -324 -520 ) ( 1872 -300 -520 ) ( 1992 -300 -520 ) subway/con6 32 16 0 0.500000 0.500000 0 285212672 0 +( 1688 -392 -520 ) ( 1688 -368 -520 ) ( 1688 -368 -528 ) subway/1_tunnelwall_floor -56 -16 0 1 0.500000 0 285212672 0 +( 1672 -364 -448 ) ( 1672 -388 -448 ) ( 1672 -388 -456 ) subway/con6 -48 -16 0 0.500000 0.500000 0 285212672 0 +( 1700 184 -520 ) ( 1676 184 -520 ) ( 1700 184 -536 ) subway/1_tunneltrack_1 -29 -54 195 1 1 0 16777216 0 +( 1664 -184 -520 ) ( 1688 -184 -520 ) ( 1664 -184 -536 ) subway/1_tunneltrack_1 -29 -54 195 1 1 0 16777216 0 +} +// brush 1647 +{ +( 1672 -176 -520 ) ( 1672 -208 -520 ) ( 1672 -208 -536 ) subway/light_red -16 16 0 0.500000 0.500000 0 16777217 15000 +( 1688 -184 -520 ) ( 1664 -184 -520 ) ( 1664 -184 -536 ) subway/light_red 16 16 0 0.500000 0.500000 0 16777217 30000 +( 1688 -200 -520 ) ( 1688 -168 -520 ) ( 1688 -168 -536 ) subway/light_yellow -16 16 0 0.500000 0.500000 0 16777217 22000 +( 1676 -200 -520 ) ( 1700 -200 -520 ) ( 1700 -200 -536 ) subway/light_red 16 16 0 0.500000 0.500000 0 16777217 30000 +( 1672 -200 -520 ) ( 1672 -168 -520 ) ( 1696 -168 -520 ) subway/light_red 16 0 0 0.500000 0.500000 0 16777217 30000 +( 1696 -168 -536 ) ( 1672 -168 -536 ) ( 1672 -200 -536 ) subway/light_red 16 0 0 0.500000 0.500000 0 16777217 30000 +} +// brush 1648 +{ +( 1692 424 -520 ) ( 1668 424 -520 ) ( 1692 424 -536 ) subway/con6 32 -16 0 0.500000 0.500000 0 285212672 0 +( 1984 -284 -536 ) ( 1864 -284 -536 ) ( 1864 -308 -536 ) subway/con6 32 16 0 0.500000 0.500000 0 285212672 0 +( 1872 -324 -520 ) ( 1872 -300 -520 ) ( 1992 -300 -520 ) subway/con6 32 16 0 0.500000 0.500000 0 285212672 0 +( 1688 -392 -520 ) ( 1688 -368 -520 ) ( 1688 -368 -528 ) subway/1_tunnelwall_floor -56 -16 0 1 0.500000 0 285212672 0 +( 1672 -364 -448 ) ( 1672 -388 -448 ) ( 1672 -388 -456 ) subway/con6 -48 -16 0 0.500000 0.500000 0 285212672 0 +( 1664 200 -520 ) ( 1688 200 -520 ) ( 1664 200 -536 ) subway/1_tunneltrack_1 -29 -54 195 1 1 0 16777216 0 +} +// brush 1649 +{ +( 1672 208 -520 ) ( 1672 176 -520 ) ( 1672 176 -536 ) subway/light_red -16 16 0 0.500000 0.500000 0 16777217 15000 +( 1688 200 -520 ) ( 1664 200 -520 ) ( 1664 200 -536 ) subway/light_red 16 16 0 0.500000 0.500000 0 16777217 30000 +( 1688 184 -520 ) ( 1688 216 -520 ) ( 1688 216 -536 ) subway/light_yellow -16 16 0 0.500000 0.500000 0 16777217 22000 +( 1676 184 -520 ) ( 1700 184 -520 ) ( 1700 184 -536 ) subway/light_red 16 16 0 0.500000 0.500000 0 16777217 30000 +( 1672 184 -520 ) ( 1672 216 -520 ) ( 1696 216 -520 ) subway/light_red 16 0 0 0.500000 0.500000 0 16777217 30000 +( 1696 216 -536 ) ( 1672 216 -536 ) ( 1672 184 -536 ) subway/light_red 16 0 0 0.500000 0.500000 0 16777217 30000 +} +// brush 1650 +{ +( 1992 -388 -456 ) ( 1992 -388 -448 ) ( 1992 -364 -448 ) subway/con6 -48 -16 0 0.500000 0.500000 0 285212672 0 +( 1976 -640 -528 ) ( 1976 -640 -520 ) ( 1976 -664 -520 ) subway/1_tunnelwall_floor -56 -16 0 1 0.500000 0 285212672 0 +( 1672 -300 -520 ) ( 1792 -300 -520 ) ( 1792 -324 -520 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1800 -308 -536 ) ( 1800 -284 -536 ) ( 1680 -284 -536 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1972 424 -536 ) ( 1996 424 -520 ) ( 1972 424 -520 ) subway/con6 0 -16 0 0.500000 0.500000 0 285212672 0 +( 2000 200 -520 ) ( 2000 200 -536 ) ( 1976 200 -520 ) subway/con6 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 1651 +{ +( 1992 176 -536 ) ( 1992 176 -520 ) ( 1992 208 -520 ) subway/light_red -16 16 0 0.500000 0.500000 0 16777217 15000 +( 2000 200 -536 ) ( 2000 200 -520 ) ( 1976 200 -520 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1976 216 -536 ) ( 1976 216 -520 ) ( 1976 184 -520 ) subway/light_yellow -16 16 0 0.500000 0.500000 0 16777217 22000 +( 1972 184 -536 ) ( 1972 184 -520 ) ( 1996 184 -520 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1976 216 -520 ) ( 2000 216 -520 ) ( 2000 184 -520 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +( 2000 184 -536 ) ( 2000 216 -536 ) ( 1976 216 -536 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +} +// brush 1652 +{ +( 1800 156 -536 ) ( 1800 180 -536 ) ( 1680 180 -536 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1672 164 -520 ) ( 1792 164 -520 ) ( 1792 140 -520 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1976 96 -528 ) ( 1976 96 -520 ) ( 1976 72 -520 ) subway/1_tunnelwall_floor -56 16 0 1 0.500000 0 285212672 0 +( 1992 76 -456 ) ( 1992 76 -448 ) ( 1992 100 -448 ) subway/con6 -48 48 0 0.500000 0.500000 0 285212672 0 +( 2000 424 -254 ) ( 2000 424 -264 ) ( 1944 424 -264 ) subway/1_tunneltrack_1 -53 -40 195 1 1 0 16777216 0 +( 1972 608 -520 ) ( 1972 608 -536 ) ( 1996 608 -520 ) subway/1_tunneltrack_1 -53 -40 195 1 1 0 16777216 0 +} +// brush 1653 +{ +( 1972 888 -536 ) ( 1996 888 -520 ) ( 1972 888 -520 ) subway/con6 0 48 0 0.500000 0.500000 0 285212672 0 +( 1800 156 -536 ) ( 1800 180 -536 ) ( 1680 180 -536 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1672 164 -520 ) ( 1792 164 -520 ) ( 1792 140 -520 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 1976 96 -528 ) ( 1976 96 -520 ) ( 1976 72 -520 ) subway/1_tunnelwall_floor -56 16 0 1 0.500000 0 285212672 0 +( 1992 76 -456 ) ( 1992 76 -448 ) ( 1992 100 -448 ) subway/con6 -48 48 0 0.500000 0.500000 0 285212672 0 +( 2000 624 -520 ) ( 2000 624 -536 ) ( 1976 624 -520 ) subway/1_tunneltrack_1 -53 -40 195 1 1 0 16777216 0 +} +// brush 1654 +{ +( 1992 600 -536 ) ( 1992 600 -520 ) ( 1992 632 -520 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 15000 +( 2000 624 -536 ) ( 2000 624 -520 ) ( 1976 624 -520 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1976 640 -536 ) ( 1976 640 -520 ) ( 1976 608 -520 ) subway/light_yellow 0 16 0 0.500000 0.500000 0 16777217 22000 +( 1972 608 -536 ) ( 1972 608 -520 ) ( 1996 608 -520 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1976 640 -520 ) ( 2000 640 -520 ) ( 2000 608 -520 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 2000 608 -536 ) ( 2000 640 -536 ) ( 1976 640 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +} +// brush 1655 +{ +( 1720 424 -264 ) ( 1664 424 -264 ) ( 1664 424 -254 ) subway/1_tunneltrack_1 -28 -55 195 1 1 0 16777216 0 +( 1672 100 -448 ) ( 1672 76 -448 ) ( 1672 76 -456 ) subway/con6 -48 48 0 0.500000 0.500000 0 285212672 0 +( 1688 72 -520 ) ( 1688 96 -520 ) ( 1688 96 -528 ) subway/1_tunnelwall_floor -56 16 0 1 0.500000 0 285212672 0 +( 1872 140 -520 ) ( 1872 164 -520 ) ( 1992 164 -520 ) subway/con6 32 16 0 0.500000 0.500000 0 285212672 0 +( 1984 180 -536 ) ( 1864 180 -536 ) ( 1864 156 -536 ) subway/con6 32 16 0 0.500000 0.500000 0 285212672 0 +( 1692 608 -520 ) ( 1668 608 -520 ) ( 1692 608 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 1656 +{ +( 1672 100 -448 ) ( 1672 76 -448 ) ( 1672 76 -456 ) subway/con6 -48 48 0 0.500000 0.500000 0 285212672 0 +( 1688 72 -520 ) ( 1688 96 -520 ) ( 1688 96 -528 ) subway/1_tunnelwall_floor -56 16 0 1 0.500000 0 285212672 0 +( 1872 140 -520 ) ( 1872 164 -520 ) ( 1992 164 -520 ) subway/con6 32 16 0 0.500000 0.500000 0 285212672 0 +( 1984 180 -536 ) ( 1864 180 -536 ) ( 1864 156 -536 ) subway/con6 32 16 0 0.500000 0.500000 0 285212672 0 +( 1692 888 -520 ) ( 1668 888 -520 ) ( 1692 888 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1664 624 -520 ) ( 1688 624 -520 ) ( 1664 624 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 1657 +{ +( 1672 632 -520 ) ( 1672 600 -520 ) ( 1672 600 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 15000 +( 1688 624 -520 ) ( 1664 624 -520 ) ( 1664 624 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1688 608 -520 ) ( 1688 640 -520 ) ( 1688 640 -536 ) subway/light_yellow 0 16 0 0.500000 0.500000 0 16777217 22000 +( 1668 608 -520 ) ( 1692 608 -520 ) ( 1692 608 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1664 608 -520 ) ( 1664 640 -520 ) ( 1688 640 -520 ) subway/light_red 0 -16 0 0.500000 0.500000 0 16777217 30000 +( 1688 640 -536 ) ( 1664 640 -536 ) ( 1664 608 -536 ) subway/light_red 0 -16 0 0.500000 0.500000 0 16777217 30000 +} +// brush 1658 +{ +( 1904 -184 -288 ) ( 1904 -200 -288 ) ( 1904 -200 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 -184 -288 ) ( 1904 -184 -288 ) ( 1904 -184 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 -200 -288 ) ( 1920 -184 -288 ) ( 1920 -184 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1904 -200 -288 ) ( 1920 -200 -288 ) ( 1920 -200 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1904 -200 -288 ) ( 1904 -184 -288 ) ( 1920 -184 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 -184 -292 ) ( 1904 -184 -292 ) ( 1904 -200 -292 ) subway/light_orange 0 -16 0 0.500000 0.500000 134217728 1 13000 +} +// brush 1659 +{ +( 1744 -184 -288 ) ( 1744 -200 -288 ) ( 1744 -200 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 -184 -288 ) ( 1744 -184 -288 ) ( 1744 -184 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 -200 -288 ) ( 1760 -184 -288 ) ( 1760 -184 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 -200 -288 ) ( 1760 -200 -288 ) ( 1760 -200 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 -200 -288 ) ( 1744 -184 -288 ) ( 1760 -184 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 -184 -292 ) ( 1744 -184 -292 ) ( 1744 -200 -292 ) subway/light_orange 0 -16 0 0.500000 0.500000 134217728 1 13000 +} +// brush 1660 +{ +( 1744 200 -288 ) ( 1744 184 -288 ) ( 1744 184 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 200 -288 ) ( 1744 200 -288 ) ( 1744 200 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 184 -288 ) ( 1760 200 -288 ) ( 1760 200 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 184 -288 ) ( 1760 184 -288 ) ( 1760 184 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 184 -288 ) ( 1744 200 -288 ) ( 1760 200 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 200 -292 ) ( 1744 200 -292 ) ( 1744 184 -292 ) subway/light_orange 0 16 0 0.500000 0.500000 134217728 1 13000 +} +// brush 1661 +{ +( 1904 200 -288 ) ( 1904 184 -288 ) ( 1904 184 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 200 -288 ) ( 1904 200 -288 ) ( 1904 200 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 184 -288 ) ( 1920 200 -288 ) ( 1920 200 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1904 184 -288 ) ( 1920 184 -288 ) ( 1920 184 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1904 184 -288 ) ( 1904 200 -288 ) ( 1920 200 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 200 -292 ) ( 1904 200 -292 ) ( 1904 184 -292 ) subway/light_orange 0 16 0 0.500000 0.500000 134217728 1 13000 +} +// brush 1662 +{ +( 1904 1352 -288 ) ( 1904 1336 -288 ) ( 1904 1336 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 1352 -288 ) ( 1904 1352 -288 ) ( 1904 1352 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 1336 -288 ) ( 1920 1352 -288 ) ( 1920 1352 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1904 1336 -288 ) ( 1920 1336 -288 ) ( 1920 1336 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1904 1336 -288 ) ( 1904 1352 -288 ) ( 1920 1352 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 1352 -292 ) ( 1904 1352 -292 ) ( 1904 1336 -292 ) subway/light_orange 0 -16 0 0.500000 0.500000 134217728 1 13000 +} +// brush 1663 +{ +( 1904 1120 -288 ) ( 1904 1104 -288 ) ( 1904 1104 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 1120 -288 ) ( 1904 1120 -288 ) ( 1904 1120 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 1104 -288 ) ( 1920 1120 -288 ) ( 1920 1120 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1904 1104 -288 ) ( 1920 1104 -288 ) ( 1920 1104 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1904 1104 -288 ) ( 1904 1120 -288 ) ( 1920 1120 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 1120 -292 ) ( 1904 1120 -292 ) ( 1904 1104 -292 ) subway/light_orange 0 0 0 0.500000 0.500000 134217728 1 13000 +} +// brush 1664 +{ +( 1904 704 -288 ) ( 1904 688 -288 ) ( 1904 688 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 704 -288 ) ( 1904 704 -288 ) ( 1904 704 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 688 -288 ) ( 1920 704 -288 ) ( 1920 704 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1904 688 -288 ) ( 1920 688 -288 ) ( 1920 688 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1904 688 -288 ) ( 1904 704 -288 ) ( 1920 704 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1920 704 -292 ) ( 1904 704 -292 ) ( 1904 688 -292 ) subway/light_orange 0 0 0 0.500000 0.500000 134217728 1 13000 +} +// brush 1665 +{ +( 1744 704 -288 ) ( 1744 688 -288 ) ( 1744 688 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 704 -288 ) ( 1744 704 -288 ) ( 1744 704 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 688 -288 ) ( 1760 704 -288 ) ( 1760 704 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 688 -288 ) ( 1760 688 -288 ) ( 1760 688 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 688 -288 ) ( 1744 704 -288 ) ( 1760 704 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 704 -292 ) ( 1744 704 -292 ) ( 1744 688 -292 ) subway/light_orange 0 0 0 0.500000 0.500000 134217728 1 13000 +} +// brush 1666 +{ +( 1672 580 -344 ) ( 1672 556 -344 ) ( 1672 556 -352 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +( 2012 424 -376 ) ( 1892 424 -376 ) ( 1892 424 -384 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -296 -432 ) ( 1688 -272 -432 ) ( 1688 -272 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1680 232 -416 ) ( 1656 232 -416 ) ( 1656 160 -416 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1656 160 -352 ) ( 1656 232 -352 ) ( 1680 232 -352 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1656 224 -256 ) ( 1680 224 -256 ) ( 1656 224 -416 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1667 +{ +( 1672 580 -344 ) ( 1672 556 -344 ) ( 1672 556 -352 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -296 -432 ) ( 1688 -272 -432 ) ( 1688 -272 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1704 -344 -448 ) ( 1696 -344 -336 ) ( 1704 -344 -336 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1680 232 -416 ) ( 1656 232 -416 ) ( 1656 160 -416 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1656 160 -352 ) ( 1656 232 -352 ) ( 1680 232 -352 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1680 160 -256 ) ( 1656 160 -256 ) ( 1680 160 -416 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1668 +{ +( 1672 580 -344 ) ( 1672 556 -344 ) ( 1672 556 -352 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +( 2012 424 -376 ) ( 1892 424 -376 ) ( 1892 424 -384 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1688 -296 -432 ) ( 1688 -272 -432 ) ( 1688 -272 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1688 -484 -288 ) ( 1696 -484 -288 ) ( 1696 -532 -288 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1704 -344 -448 ) ( 1696 -344 -336 ) ( 1704 -344 -336 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1656 232 -352 ) ( 1656 160 -352 ) ( 1680 232 -352 ) subway/1_tunnelwall 32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1669 +{ +( 1680 232 -448 ) ( 1656 232 -448 ) ( 1656 160 -448 ) subway/1_tunnelwall_2 0 -8 0 1 1 0 301989888 0 +( 1656 160 -384 ) ( 1656 232 -384 ) ( 1680 232 -384 ) subway/1_tunnelwall_2 0 -8 0 1 1 0 301989888 0 +( 1656 160 -288 ) ( 1680 160 -288 ) ( 1680 160 -448 ) subway/1_tunnelwall_2 0 0 0 1 1 0 301989888 0 +( 1688 168 -288 ) ( 1688 240 -288 ) ( 1688 240 -448 ) subway/1_tunnelwall_3 32 0 0 1 1 0 301989888 0 +( 1680 224 -288 ) ( 1656 224 -288 ) ( 1656 224 -448 ) subway/1_tunnelwall_2 0 0 0 1 1 0 301989888 0 +( 1672 232 -288 ) ( 1672 160 -288 ) ( 1672 160 -448 ) subway/1_tunnelwall_2 -32 0 0 -1 1 0 301989888 0 +} +// brush 1670 +{ +( 1832 760 -536 ) ( 1816 760 -536 ) ( 1816 728 -536 ) subway/1_tunnelwall 16 16 0 1 1 0 301989888 0 +( 1824 648 -320 ) ( 1840 648 -320 ) ( 1840 648 -448 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1816 760 -288 ) ( 1816 728 -288 ) ( 1816 728 -416 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1816 760 -520 ) ( 1816 776 -520 ) ( 1848 768 -520 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +( 1840 664 -504 ) ( 1824 664 -504 ) ( 1824 664 -536 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +( 1824 640 -504 ) ( 1824 648 -504 ) ( 1824 640 -536 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +} +// brush 1671 +{ +( 1832 760 -536 ) ( 1816 760 -536 ) ( 1816 728 -536 ) subway/1_tunnelwall 16 16 0 1 1 0 301989888 0 +( 1832 776 -320 ) ( 1816 776 -320 ) ( 1816 776 -448 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1816 760 -288 ) ( 1816 728 -288 ) ( 1816 728 -416 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1816 760 -520 ) ( 1816 776 -520 ) ( 1848 768 -520 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +( 1840 640 -504 ) ( 1840 648 -504 ) ( 1840 648 -536 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +( 1824 664 -504 ) ( 1840 664 -504 ) ( 1824 664 -536 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +} +// brush 1672 +{ +( 1832 760 -536 ) ( 1816 760 -536 ) ( 1816 728 -536 ) subway/1_tunnelwall 16 16 0 1 1 0 301989888 0 +( 1824 648 -320 ) ( 1840 648 -320 ) ( 1840 648 -448 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1848 728 -320 ) ( 1848 760 -320 ) ( 1848 760 -448 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1832 776 -320 ) ( 1816 776 -320 ) ( 1816 776 -448 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1816 760 -520 ) ( 1816 776 -520 ) ( 1848 768 -520 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +( 1840 648 -504 ) ( 1840 640 -504 ) ( 1840 648 -536 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +} +// brush 1673 +{ +( 1840 648 -536 ) ( 1824 648 -536 ) ( 1824 640 -536 ) subway/button2a 0 16 0 0.500000 0.500000 0 16777217 5000 +( 1824 640 -520 ) ( 1824 648 -520 ) ( 1840 648 -520 ) subway/button2a 0 16 0 0.500000 0.500000 0 16777217 5000 +( 1824 648 -504 ) ( 1840 648 -504 ) ( 1840 648 -536 ) subway/light_yellow 0 16 0 0.500000 0.500000 0 16777217 22000 +( 1840 640 -504 ) ( 1840 648 -504 ) ( 1840 648 -536 ) subway/button2a 0 -16 0 0.500000 0.500000 0 16777217 5000 +( 1840 664 -504 ) ( 1824 664 -504 ) ( 1824 664 -536 ) subway/button2a 0 -16 0 0.500000 0.500000 0 16777217 5000 +( 1824 648 -504 ) ( 1824 640 -504 ) ( 1824 640 -536 ) subway/button2a 0 -16 0 0.500000 0.500000 0 16777217 5000 +} +// brush 1674 +{ +( 1744 1120 -288 ) ( 1744 1104 -288 ) ( 1744 1104 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 1120 -288 ) ( 1744 1120 -288 ) ( 1744 1120 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 1104 -288 ) ( 1760 1120 -288 ) ( 1760 1120 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 1104 -288 ) ( 1760 1104 -288 ) ( 1760 1104 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 1104 -288 ) ( 1744 1120 -288 ) ( 1760 1120 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 1120 -292 ) ( 1744 1120 -292 ) ( 1744 1104 -292 ) subway/light_orange 0 0 0 0.500000 0.500000 134217728 1 13000 +} +// brush 1675 +{ +( 1744 1360 -288 ) ( 1744 1344 -288 ) ( 1744 1344 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 1360 -288 ) ( 1744 1360 -288 ) ( 1744 1360 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 1344 -288 ) ( 1760 1360 -288 ) ( 1760 1360 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 1344 -288 ) ( 1760 1344 -288 ) ( 1760 1344 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 1344 -288 ) ( 1744 1360 -288 ) ( 1760 1360 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 1360 -292 ) ( 1744 1360 -292 ) ( 1744 1344 -292 ) subway/light_orange 0 0 0 0.500000 0.500000 134217728 1 13000 +} +// brush 1676 +{ +( 1976 464 -472 ) ( 1976 464 -464 ) ( 1976 440 -464 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1772 920 -416 ) ( 1772 920 -408 ) ( 1652 920 -408 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1992 1020 -384 ) ( 1992 1020 -376 ) ( 1992 1044 -376 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +( 1984 592 -448 ) ( 1960 592 -448 ) ( 1960 520 -448 ) subway/1_tunnelwall -48 32 0 0.500000 0.500000 0 301989888 0 +( 1960 520 -384 ) ( 1960 592 -384 ) ( 1984 592 -384 ) subway/1_tunnelwall -48 32 0 0.500000 0.500000 0 301989888 0 +( 1960 584 -288 ) ( 1984 584 -288 ) ( 1960 584 -448 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1677 +{ +( 1984 432 -368 ) ( 1992 432 -368 ) ( 1984 432 -480 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 464 -472 ) ( 1976 464 -464 ) ( 1976 440 -464 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1992 1020 -384 ) ( 1992 1020 -376 ) ( 1992 1044 -376 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +( 1984 592 -448 ) ( 1960 592 -448 ) ( 1960 520 -448 ) subway/1_tunnelwall -48 32 0 0.500000 0.500000 0 301989888 0 +( 1960 520 -384 ) ( 1960 592 -384 ) ( 1984 592 -384 ) subway/1_tunnelwall -48 32 0 0.500000 0.500000 0 301989888 0 +( 1984 520 -288 ) ( 1960 520 -288 ) ( 1984 520 -448 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1678 +{ +( 1984 432 -336 ) ( 1992 432 -336 ) ( 1984 432 -448 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1968 -68 -288 ) ( 1968 -20 -288 ) ( 1976 -20 -288 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1976 464 -440 ) ( 1976 464 -432 ) ( 1976 440 -432 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1772 920 -384 ) ( 1772 920 -376 ) ( 1652 920 -376 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1992 1020 -352 ) ( 1992 1020 -344 ) ( 1992 1044 -344 ) subway/1_tunnelwall -48 32 0 0.500000 0.500000 0 301989888 0 +( 1960 592 -384 ) ( 1960 520 -384 ) ( 1984 592 -384 ) subway/1_tunnelwall -48 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 1679 +{ +( 1984 592 -448 ) ( 1960 592 -448 ) ( 1960 520 -448 ) subway/1_tunnelwall_2 16 -32 0 1 1 0 301989888 0 +( 1960 520 -384 ) ( 1960 592 -384 ) ( 1984 592 -384 ) subway/1_tunnelwall_2 16 -32 0 1 1 0 301989888 0 +( 1960 520 -288 ) ( 1984 520 -288 ) ( 1984 520 -448 ) subway/1_tunnelwall_2 16 0 0 1 1 0 301989888 0 +( 1992 520 -288 ) ( 1992 592 -288 ) ( 1992 592 -448 ) subway/1_tunnelwall_2 56 0 0 1 1 0 301989888 0 +( 1984 584 -288 ) ( 1960 584 -288 ) ( 1960 584 -448 ) subway/1_tunnelwall_2 16 0 0 1 1 0 301989888 0 +( 1976 592 -288 ) ( 1976 520 -288 ) ( 1976 520 -448 ) subway/1_tunnelwall_2 8 0 0 -1 1 0 301989888 0 +} +// brush 1680 +{ +( 1688 -1112 -288 ) ( 1720 -1112 -288 ) ( 1720 -1112 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1688 148 -288 ) ( 1688 132 -288 ) ( 1688 132 -320 ) subway/1_tunnelwall 12 0 0 1 1 0 301989888 0 +( 1688 -920 -320 ) ( 1696 -920 -296 ) ( 1696 -888 -296 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1688 148 -288 ) ( 1696 148 -296 ) ( 1696 116 -296 ) subway/1_tunnelwall 16 -12 0 1 1 0 301989888 0 +( 1684 -448 -320 ) ( 1708 -448 -320 ) ( 1696 -448 -288 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +} +// brush 1681 +{ +( 1720 -440 -280 ) ( 1720 -480 -280 ) ( 1720 -480 -504 ) subway/1_tunnelwall 32 0 0 1 1 0 301989888 0 +( 1784 -480 -280 ) ( 1784 -440 -280 ) ( 1784 -440 -504 ) subway/1_tunnelwall 32 0 0 1 1 0 301989888 0 +( 1704 -1112 -280 ) ( 1768 -1112 -280 ) ( 1768 -1112 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1768 -480 -280 ) ( 1768 -440 -280 ) ( 1832 -440 -280 ) subway/1_tunnelwall 0 -32 0 1 1 0 301989888 0 +( 1832 -440 -288 ) ( 1768 -440 -288 ) ( 1768 -480 -288 ) subway/1_tunnel_ceiling2 48 -32 0 1 1 0 16777216 0 +( 1744 -448 -288 ) ( 1776 -448 -288 ) ( 1760 -448 -280 ) subway/1_tunnel_ceiling2 48 0 0 1 1 0 16777216 0 +} +// brush 1682 +{ +( 1688 -1112 -288 ) ( 1720 -1112 -288 ) ( 1720 -1112 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 -448 -320 ) ( 1720 -448 -288 ) ( 1688 -448 -288 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 -464 -288 ) ( 1720 -480 -288 ) ( 1688 -480 -288 ) subway/1_tunnelwall 16 -32 0 1 1 0 301989888 0 +( 1720 -1080 -288 ) ( 1696 -1080 -296 ) ( 1696 -1112 -296 ) subway/1_tunnelwall 16 0 90 0.500000 0.500000 0 301989888 0 +( 1688 -480 -288 ) ( 1696 -480 -296 ) ( 1696 -448 -296 ) subway/1_tunnelwall 16 -32 0 1 1 0 301989888 0 +} +// brush 1683 +{ +( 1784 -1112 -320 ) ( 1784 -1112 -288 ) ( 1816 -1112 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 -448 -288 ) ( 1784 -448 -288 ) ( 1784 -448 -320 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 -480 -288 ) ( 1784 -480 -288 ) ( 1784 -464 -288 ) subway/1_tunnelwall 0 -32 0 1 1 0 301989888 0 +( 1808 -1112 -296 ) ( 1808 -1080 -296 ) ( 1784 -1080 -288 ) subway/1_tunnelwall 16 -28 90 0.500000 0.500000 0 301989888 0 +( 1808 -448 -296 ) ( 1808 -480 -296 ) ( 1816 -480 -288 ) subway/1_tunnelwall 0 -32 0 1 1 0 301989888 0 +} +// brush 1684 +{ +( 1824 -1112 -38 ) ( 1824 -1112 -48 ) ( 1776 -1112 -48 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1856 -1440 -224 ) ( 1856 -1440 -216 ) ( 1856 -1416 -216 ) subway/1_tunnelwall 8 -24 0 1 1 0 301989888 0 +( 1608 -448 -256 ) ( 1608 -448 -248 ) ( 1488 -448 -248 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1808 -1416 -296 ) ( 1808 -1416 -288 ) ( 1808 -1440 -288 ) subway/1_tunnelwall 8 -24 0 1 1 0 301989888 0 +( 1552 -1244 -344 ) ( 1552 -1244 -336 ) ( 1672 -1244 -336 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1504 -1300 -280 ) ( 1624 -1300 -280 ) ( 1624 -1324 -280 ) subway/1_tunnelwall 16 -16 0 1 1 0 301989888 0 +( 1640 -1308 -296 ) ( 1640 -1284 -296 ) ( 1520 -1284 -296 ) subway/1_tunnelwall 24 -12 90 0.500000 0.500000 0 301989888 0 +} +// brush 1685 +{ +( 1976 20 -320 ) ( 1976 20 -288 ) ( 1976 36 -288 ) subway/1_tunnelwall 12 0 0 1 1 0 301989888 0 +( 1968 -652 -296 ) ( 1968 -684 -296 ) ( 1976 -684 -320 ) subway/1_tunnelwall -32 0 0 0.500000 0.500000 0 301989888 0 +( 1968 116 -296 ) ( 1968 148 -296 ) ( 1976 148 -288 ) subway/1_tunnelwall -32 -12 0 1 1 0 301989888 0 +( 1968 -1112 -336 ) ( 1968 -1112 -280 ) ( 1976 -1112 -308 ) subway/1_tunnelwall -32 -24 0 1 1 0 301989888 0 +( 1964 -448 -320 ) ( 1982 -448 -320 ) ( 1973 -448 -288 ) subway/1_tunnelwall -32 -24 0 1 1 0 301989888 0 +} +// brush 1686 +{ +( 1944 -1112 -320 ) ( 1944 -1112 -288 ) ( 1976 -1112 -288 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1976 -448 -288 ) ( 1944 -448 -288 ) ( 1944 -448 -320 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1976 -480 -288 ) ( 1944 -480 -288 ) ( 1944 -464 -288 ) subway/1_tunnelwall -32 -32 0 1 1 0 301989888 0 +( 1968 -1112 -296 ) ( 1968 -1080 -296 ) ( 1944 -1080 -288 ) subway/1_tunnelwall 17 -28 90 0.500000 0.500000 0 301989888 0 +( 1968 -448 -296 ) ( 1968 -480 -296 ) ( 1976 -480 -288 ) subway/1_tunnelwall -32 -32 0 1 1 0 301989888 0 +} +// brush 1687 +{ +( 1848 -1112 -288 ) ( 1880 -1112 -288 ) ( 1880 -1112 -320 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1880 -448 -320 ) ( 1880 -448 -288 ) ( 1848 -448 -288 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1880 -464 -288 ) ( 1880 -480 -288 ) ( 1848 -480 -288 ) subway/1_tunnelwall -16 -32 0 1 1 0 301989888 0 +( 1880 -1068 -288 ) ( 1856 -1068 -296 ) ( 1856 -1100 -296 ) subway/1_tunnelwall 17 0 90 0.500000 0.500000 0 301989888 0 +( 1848 -480 -288 ) ( 1856 -480 -296 ) ( 1856 -448 -296 ) subway/1_tunnelwall -16 -32 0 1 1 0 301989888 0 +} +// brush 1688 +{ +( 1880 -452 -280 ) ( 1880 -492 -280 ) ( 1880 -492 -504 ) subway/1_tunnelwall 32 0 0 1 1 0 301989888 0 +( 2000 -480 -280 ) ( 2000 -440 -280 ) ( 2000 -440 -504 ) subway/1_tunnelwall 32 0 0 1 1 0 301989888 0 +( 1864 -1112 -280 ) ( 1928 -1112 -280 ) ( 1928 -1112 -504 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1928 -480 -280 ) ( 1928 -440 -280 ) ( 1992 -440 -280 ) subway/1_tunnelwall -32 -32 0 1 1 0 301989888 0 +( 1992 -440 -288 ) ( 1928 -440 -288 ) ( 1928 -480 -288 ) subway/1_tunnel_ceiling2 16 -32 0 1 1 0 16777216 0 +( 1904 -448 -288 ) ( 1936 -448 -288 ) ( 1920 -448 -280 ) subway/1_tunnel_ceiling2 16 0 0 1 1 0 16777216 0 +} +// brush 1689 +{ +( 1880 156 -280 ) ( 1880 116 -280 ) ( 1880 116 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 2000 128 -280 ) ( 2000 168 -280 ) ( 2000 168 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1864 -448 -280 ) ( 1928 -448 -280 ) ( 1928 -448 -504 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1928 128 -280 ) ( 1928 168 -280 ) ( 1992 168 -280 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1992 168 -288 ) ( 1928 168 -288 ) ( 1928 128 -288 ) subway/1_tunnel_ceiling2 16 0 0 1 1 0 16777216 0 +( 1904 160 -288 ) ( 1936 160 -288 ) ( 1920 160 -280 ) subway/1_tunnel_ceiling2 16 0 0 1 1 0 16777216 0 +} +// brush 1690 +{ +( 1848 -448 -288 ) ( 1880 -448 -288 ) ( 1880 -448 -320 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1880 160 -320 ) ( 1880 160 -288 ) ( 1848 160 -288 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1880 144 -288 ) ( 1880 128 -288 ) ( 1848 128 -288 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1880 -404 -288 ) ( 1856 -404 -296 ) ( 1856 -436 -296 ) subway/1_tunnelwall 17 0 90 0.500000 0.500000 0 301989888 0 +( 1848 128 -288 ) ( 1856 128 -296 ) ( 1856 160 -296 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +} +// brush 1691 +{ +( 1944 -448 -320 ) ( 1944 -448 -288 ) ( 1976 -448 -288 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1976 160 -288 ) ( 1944 160 -288 ) ( 1944 160 -320 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1976 128 -288 ) ( 1944 128 -288 ) ( 1944 144 -288 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1968 -448 -296 ) ( 1968 -416 -296 ) ( 1944 -416 -288 ) subway/1_tunnelwall 17 -29 90 0.500000 0.500000 0 301989888 0 +( 1968 160 -296 ) ( 1968 128 -296 ) ( 1976 128 -288 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +} +// brush 1692 +{ +( 1976 628 -320 ) ( 1976 628 -288 ) ( 1976 644 -288 ) subway/1_tunnelwall -20 0 0 1 1 0 301989888 0 +( 1968 12 -296 ) ( 1968 -20 -296 ) ( 1976 -20 -320 ) subway/1_tunnelwall -32 0 0 0.500000 0.500000 0 301989888 0 +( 1968 724 -296 ) ( 1968 756 -296 ) ( 1976 756 -288 ) subway/1_tunnelwall -32 20 0 1 1 0 301989888 0 +( 1968 -448 -336 ) ( 1968 -448 -280 ) ( 1976 -448 -308 ) subway/1_tunnelwall -32 -24 0 1 1 0 301989888 0 +( 1964 160 -320 ) ( 1982 160 -320 ) ( 1973 160 -288 ) subway/1_tunnelwall -32 -24 0 1 1 0 301989888 0 +} +// brush 1693 +{ +( 1824 -448 -38 ) ( 1824 -448 -48 ) ( 1776 -448 -48 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1856 -832 -224 ) ( 1856 -832 -216 ) ( 1856 -808 -216 ) subway/1_tunnelwall -24 -24 0 1 1 0 301989888 0 +( 1608 160 -256 ) ( 1608 160 -248 ) ( 1488 160 -248 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1808 -752 -296 ) ( 1808 -752 -288 ) ( 1808 -776 -288 ) subway/1_tunnelwall -24 -24 0 1 1 0 301989888 0 +( 1552 -636 -344 ) ( 1552 -636 -336 ) ( 1672 -636 -336 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1504 -692 -280 ) ( 1624 -692 -280 ) ( 1624 -716 -280 ) subway/1_tunnelwall 16 16 0 1 1 0 301989888 0 +( 1640 -700 -296 ) ( 1640 -676 -296 ) ( 1520 -676 -296 ) subway/1_tunnelwall 24 -13 90 0.500000 0.500000 0 301989888 0 +} +// brush 1694 +{ +( 1784 -448 -320 ) ( 1784 -448 -288 ) ( 1816 -448 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 160 -288 ) ( 1784 160 -288 ) ( 1784 160 -320 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 128 -288 ) ( 1784 128 -288 ) ( 1784 144 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1808 -448 -296 ) ( 1808 -416 -296 ) ( 1784 -416 -288 ) subway/1_tunnelwall 16 -29 90 0.500000 0.500000 0 301989888 0 +( 1808 160 -296 ) ( 1808 128 -296 ) ( 1816 128 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +} +// brush 1695 +{ +( 1688 -448 -288 ) ( 1720 -448 -288 ) ( 1720 -448 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 160 -320 ) ( 1720 160 -288 ) ( 1688 160 -288 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 144 -288 ) ( 1720 128 -288 ) ( 1688 128 -288 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 -416 -288 ) ( 1696 -416 -296 ) ( 1696 -448 -296 ) subway/1_tunnelwall 16 0 90 0.500000 0.500000 0 301989888 0 +( 1688 128 -288 ) ( 1696 128 -296 ) ( 1696 160 -296 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +} +// brush 1696 +{ +( 1720 168 -280 ) ( 1720 128 -280 ) ( 1720 128 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1784 128 -280 ) ( 1784 168 -280 ) ( 1784 168 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1704 -448 -280 ) ( 1768 -448 -280 ) ( 1768 -448 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1768 128 -280 ) ( 1768 168 -280 ) ( 1832 168 -280 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1832 168 -288 ) ( 1768 168 -288 ) ( 1768 128 -288 ) subway/1_tunnel_ceiling2 48 0 0 1 1 0 16777216 0 +( 1744 160 -288 ) ( 1776 160 -288 ) ( 1760 160 -280 ) subway/1_tunnel_ceiling2 48 0 0 1 1 0 16777216 0 +} +// brush 1697 +{ +( 1688 -448 -288 ) ( 1720 -448 -288 ) ( 1720 -448 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1688 756 -288 ) ( 1688 740 -288 ) ( 1688 740 -320 ) subway/1_tunnelwall 44 0 0 1 1 0 301989888 0 +( 1688 -256 -320 ) ( 1696 -256 -296 ) ( 1696 -224 -296 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1688 756 -288 ) ( 1696 756 -296 ) ( 1696 724 -296 ) subway/1_tunnelwall 16 -44 0 1 1 0 301989888 0 +( 1684 160 -320 ) ( 1708 160 -320 ) ( 1696 160 -288 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +} +// brush 1698 +{ +( 1824 160 -38 ) ( 1824 160 -48 ) ( 1776 160 -48 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1856 -232 -224 ) ( 1856 -232 -216 ) ( 1856 -208 -216 ) subway/1_tunnelwall 20 -24 0 1 1 0 301989888 0 +( 1608 756 -256 ) ( 1608 756 -248 ) ( 1488 756 -248 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1808 -156 -296 ) ( 1808 -156 -288 ) ( 1808 -180 -288 ) subway/1_tunnelwall 20 -24 0 1 1 0 301989888 0 +( 1552 -40 -344 ) ( 1552 -40 -336 ) ( 1672 -40 -336 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1504 -96 -280 ) ( 1624 -96 -280 ) ( 1624 -120 -280 ) subway/1_tunnelwall 16 -28 0 1 1 0 301989888 0 +( 1640 -104 -296 ) ( 1640 -80 -296 ) ( 1520 -80 -296 ) subway/1_tunnelwall -16 -14 90 0.500000 0.500000 0 301989888 0 +} +// brush 1699 +{ +( 1976 1352 -288 ) ( 1944 1352 -288 ) ( 1944 1352 -320 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1976 1320 -320 ) ( 1976 1320 -288 ) ( 1976 1336 -288 ) subway/1_tunnelwall 24 0 0 1 1 0 301989888 0 +( 1968 620 -296 ) ( 1968 588 -296 ) ( 1976 588 -320 ) subway/1_tunnelwall -8 0 0 0.500000 0.500000 0 301989888 0 +( 1968 1320 -296 ) ( 1968 1352 -296 ) ( 1976 1352 -288 ) subway/1_tunnelwall -32 -24 0 1 1 0 301989888 0 +( 1982 756 -320 ) ( 1964 756 -320 ) ( 1973 756 -288 ) subway/1_tunnelwall -32 -24 0 1 1 0 301989888 0 +} +// brush 1700 +{ +( 1976 1224 -320 ) ( 1976 1224 -288 ) ( 1976 1240 -288 ) subway/1_tunnelwall 24 0 0 1 1 0 301989888 0 +( 1968 620 -296 ) ( 1968 588 -296 ) ( 1976 588 -320 ) subway/1_tunnelwall -8 0 0 0.500000 0.500000 0 301989888 0 +( 1968 1320 -296 ) ( 1968 1352 -296 ) ( 1976 1352 -288 ) subway/1_tunnelwall -32 -24 0 1 1 0 301989888 0 +( 1968 160 -336 ) ( 1968 160 -280 ) ( 1976 160 -308 ) subway/1_tunnelwall -32 -24 0 1 1 0 301989888 0 +( 1964 756 -320 ) ( 1982 756 -320 ) ( 1973 756 -288 ) subway/1_tunnelwall -32 -24 0 1 1 0 301989888 0 +} +// brush 1701 +{ +( 1720 1352 -320 ) ( 1720 1352 -288 ) ( 1688 1352 -288 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1688 1352 -288 ) ( 1688 1336 -288 ) ( 1688 1336 -320 ) subway/1_tunnelwall 24 0 0 1 1 0 301989888 0 +( 1688 352 -320 ) ( 1696 352 -296 ) ( 1696 384 -296 ) subway/1_tunnelwall 56 0 0 0.500000 0.500000 0 301989888 0 +( 1688 1352 -288 ) ( 1696 1352 -296 ) ( 1696 1320 -296 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1708 756 -320 ) ( 1684 756 -320 ) ( 1696 756 -288 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +} +// brush 1702 +{ +( 1688 160 -288 ) ( 1720 160 -288 ) ( 1720 160 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1688 1352 -288 ) ( 1688 1336 -288 ) ( 1688 1336 -320 ) subway/1_tunnelwall 24 0 0 1 1 0 301989888 0 +( 1688 352 -320 ) ( 1696 352 -296 ) ( 1696 384 -296 ) subway/1_tunnelwall 56 0 0 0.500000 0.500000 0 301989888 0 +( 1688 1352 -288 ) ( 1696 1352 -296 ) ( 1696 1320 -296 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1684 756 -320 ) ( 1708 756 -320 ) ( 1696 756 -288 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +} +// brush 1703 +{ +( 1944 160 -320 ) ( 1944 160 -288 ) ( 1976 160 -288 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1976 756 -288 ) ( 1944 756 -288 ) ( 1944 756 -320 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1976 724 -288 ) ( 1944 724 -288 ) ( 1944 740 -288 ) subway/1_tunnelwall -32 -44 0 1 1 0 301989888 0 +( 1968 160 -296 ) ( 1968 192 -296 ) ( 1944 192 -288 ) subway/1_tunnelwall -23 -30 90 0.500000 0.500000 0 301989888 0 +( 1968 756 -296 ) ( 1968 724 -296 ) ( 1976 724 -288 ) subway/1_tunnelwall -32 -44 0 1 1 0 301989888 0 +} +// brush 1704 +{ +( 1848 160 -288 ) ( 1880 160 -288 ) ( 1880 160 -320 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1880 756 -320 ) ( 1880 756 -288 ) ( 1848 756 -288 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1880 740 -288 ) ( 1880 724 -288 ) ( 1848 724 -288 ) subway/1_tunnelwall -16 -44 0 1 1 0 301989888 0 +( 1880 192 -288 ) ( 1856 192 -296 ) ( 1856 160 -296 ) subway/1_tunnelwall -23 0 90 0.500000 0.500000 0 301989888 0 +( 1848 724 -288 ) ( 1856 724 -296 ) ( 1856 756 -296 ) subway/1_tunnelwall -16 -44 0 1 1 0 301989888 0 +} +// brush 1705 +{ +( 1880 764 -280 ) ( 1880 724 -280 ) ( 1880 724 -504 ) subway/1_tunnelwall 44 0 0 1 1 0 301989888 0 +( 2000 716 -280 ) ( 2000 756 -280 ) ( 2000 756 -504 ) subway/1_tunnelwall 44 0 0 1 1 0 301989888 0 +( 1864 160 -280 ) ( 1928 160 -280 ) ( 1928 160 -504 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1928 724 -280 ) ( 1928 764 -280 ) ( 1992 764 -280 ) subway/1_tunnelwall -32 -44 0 1 1 0 301989888 0 +( 1992 764 -288 ) ( 1928 764 -288 ) ( 1928 724 -288 ) subway/1_tunnel_ceiling2 16 -44 0 1 1 0 16777216 0 +( 1904 756 -288 ) ( 1936 756 -288 ) ( 1920 756 -280 ) subway/1_tunnel_ceiling2 16 0 0 1 1 0 16777216 0 +} +// brush 1706 +{ +( 1720 764 -280 ) ( 1720 724 -280 ) ( 1720 724 -504 ) subway/1_tunnelwall 44 0 0 1 1 0 301989888 0 +( 1784 724 -280 ) ( 1784 764 -280 ) ( 1784 764 -504 ) subway/1_tunnelwall 44 0 0 1 1 0 301989888 0 +( 1704 160 -280 ) ( 1768 160 -280 ) ( 1768 160 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1768 724 -280 ) ( 1768 764 -280 ) ( 1832 764 -280 ) subway/1_tunnelwall 0 -44 0 1 1 0 301989888 0 +( 1832 764 -288 ) ( 1768 764 -288 ) ( 1768 724 -288 ) subway/1_tunnel_ceiling2 48 -44 0 1 1 0 16777216 0 +( 1744 756 -288 ) ( 1776 756 -288 ) ( 1760 756 -280 ) subway/1_tunnel_ceiling2 48 0 0 1 1 0 16777216 0 +} +// brush 1707 +{ +( 1688 160 -288 ) ( 1720 160 -288 ) ( 1720 160 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 756 -320 ) ( 1720 756 -288 ) ( 1688 756 -288 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 740 -288 ) ( 1720 724 -288 ) ( 1688 724 -288 ) subway/1_tunnelwall 16 -44 0 1 1 0 301989888 0 +( 1720 192 -288 ) ( 1696 192 -296 ) ( 1696 160 -296 ) subway/1_tunnelwall -24 0 90 0.500000 0.500000 0 301989888 0 +( 1688 724 -288 ) ( 1696 724 -296 ) ( 1696 756 -296 ) subway/1_tunnelwall 16 -44 0 1 1 0 301989888 0 +} +// brush 1708 +{ +( 1784 160 -320 ) ( 1784 160 -288 ) ( 1816 160 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 756 -288 ) ( 1784 756 -288 ) ( 1784 756 -320 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 724 -288 ) ( 1784 724 -288 ) ( 1784 740 -288 ) subway/1_tunnelwall 0 -44 0 1 1 0 301989888 0 +( 1808 160 -296 ) ( 1808 192 -296 ) ( 1784 192 -288 ) subway/1_tunnelwall -24 -30 90 0.500000 0.500000 0 301989888 0 +( 1808 756 -296 ) ( 1808 724 -296 ) ( 1816 724 -288 ) subway/1_tunnelwall 0 -44 0 1 1 0 301989888 0 +} +// brush 1709 +{ +( 1680 2144 -384 ) ( 1680 2120 -384 ) ( 1680 2120 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1624 2440 -352 ) ( 1600 2440 -352 ) ( 1600 2440 -400 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1688 2336 -352 ) ( 1688 2360 -352 ) ( 1688 2360 -400 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1600 1792 -352 ) ( 1624 1792 -352 ) ( 1624 1792 -400 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1680 2416 -368 ) ( 1680 2384 -368 ) ( 1704 2416 -368 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1704 1792 -336 ) ( 1680 1792 -336 ) ( 1692 2440 -336 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1710 +{ +( 1680 2144 -384 ) ( 1680 2120 -384 ) ( 1680 2120 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1624 2440 -352 ) ( 1600 2440 -352 ) ( 1600 2440 -400 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1688 2336 -352 ) ( 1688 2360 -352 ) ( 1688 2360 -400 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1600 1792 -352 ) ( 1624 1792 -352 ) ( 1624 1792 -400 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1704 1792 -320 ) ( 1672 1792 -320 ) ( 1688 2440 -320 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1680 1792 -336 ) ( 1704 1792 -336 ) ( 1692 2440 -336 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1711 +{ +( 1680 2144 -384 ) ( 1680 2120 -384 ) ( 1680 2120 -432 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1624 2440 -352 ) ( 1600 2440 -352 ) ( 1600 2440 -400 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1688 2336 -352 ) ( 1688 2360 -352 ) ( 1688 2360 -400 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1600 1792 -352 ) ( 1624 1792 -352 ) ( 1624 1792 -400 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1704 1792 -264 ) ( 1672 1792 -264 ) ( 1688 2440 -264 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +( 1672 1792 -320 ) ( 1704 1792 -320 ) ( 1688 2440 -320 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1712 +{ +( 1616 2296 -336 ) ( 1616 2680 -336 ) ( 1608 2680 -336 ) subway/1_tile 32 32 0 0.500000 0.500000 0 318767104 0 +( 1824 1952 -224 ) ( 1824 1952 -336 ) ( 1816 1960 -336 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 1824 1952 -368 ) ( 1824 1952 -256 ) ( 1888 1952 -256 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 1960 -360 ) ( 1880 1960 -368 ) ( 1888 1952 -368 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 1896 1960 -368 ) ( 1896 1960 -360 ) ( 1816 1960 -360 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 905 +( 1832 1952 -320 ) ( 1816 1952 -320 ) ( 1824 1960 -320 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1713 +{ +( 1824 1952 -224 ) ( 1824 1952 -336 ) ( 1816 1960 -336 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 1824 1952 -368 ) ( 1824 1952 -256 ) ( 1888 1952 -256 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 1960 -360 ) ( 1880 1960 -368 ) ( 1888 1952 -368 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 1896 1960 -368 ) ( 1896 1960 -360 ) ( 1816 1960 -360 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1856 1952 -264 ) ( 1800 1952 -264 ) ( 1828 1960 -264 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1816 1952 -320 ) ( 1832 1952 -320 ) ( 1824 1960 -320 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1714 +{ +( 1824 1792 -328 ) ( 1824 1872 -328 ) ( 1824 1872 -336 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1816 1960 -336 ) ( 1824 1952 -336 ) ( 1824 1952 -328 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1816 1536 -464 ) ( 1816 1536 -432 ) ( 1816 1528 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 905 +( 2044 1792 -464 ) ( 2044 1792 -432 ) ( 2428 1792 -432 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2544 1664 -336 ) ( 2544 1672 -336 ) ( 2160 1672 -336 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1832 1792 -320 ) ( 1816 1792 -320 ) ( 1824 1960 -320 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1715 +{ +( 1824 1792 -328 ) ( 1824 1872 -328 ) ( 1824 1872 -336 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1816 1960 -336 ) ( 1824 1952 -336 ) ( 1824 1952 -328 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1816 1536 -464 ) ( 1816 1536 -432 ) ( 1816 1528 -432 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2044 1792 -464 ) ( 2044 1792 -432 ) ( 2428 1792 -432 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1856 1792 -264 ) ( 1800 1792 -264 ) ( 1828 1960 -264 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1816 1792 -320 ) ( 1832 1792 -320 ) ( 1824 1960 -320 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1716 +{ +( 1880 2256 -376 ) ( 1880 2256 -264 ) ( 1880 1800 -264 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2456 -256 ) ( 1880 2456 -368 ) ( 1888 2448 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2328 -352 ) ( 1888 2352 -352 ) ( 1888 2352 -400 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1896 2240 -368 ) ( 1872 2240 -368 ) ( 1872 2144 -368 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1872 1952 -272 ) ( 1896 1952 -272 ) ( 1872 1952 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1896 2240 -336 ) ( 1880 2240 -336 ) ( 1888 2456 -336 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1717 +{ +( 1880 2256 -368 ) ( 1880 2256 -256 ) ( 1880 1800 -256 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 905 +( 1880 2456 -256 ) ( 1880 2456 -368 ) ( 1888 2448 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2328 -352 ) ( 1888 2352 -352 ) ( 1888 2352 -400 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1872 2144 -320 ) ( 1872 2240 -320 ) ( 1896 2240 -320 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1872 1952 -272 ) ( 1896 1952 -272 ) ( 1872 1952 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2240 -336 ) ( 1896 2240 -336 ) ( 1888 2456 -336 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1718 +{ +( 1720 2912 -344 ) ( 1720 2872 -344 ) ( 1720 2872 -568 ) subway/1_tunnelwall -56 0 0 1 1 0 301989888 0 +( 1784 2872 -344 ) ( 1784 2912 -344 ) ( 1784 2912 -568 ) subway/1_tunnelwall -56 0 0 1 1 0 301989888 0 +( 1768 2872 -344 ) ( 1768 2912 -344 ) ( 1832 2912 -344 ) subway/1_tunnelwall 0 56 0 1 1 0 301989888 0 +( 1832 2912 -352 ) ( 1768 2912 -352 ) ( 1768 2872 -352 ) subway/1_tunnel_ceiling2 48 56 0 1 1 0 16777216 0 +( 1744 2904 -352 ) ( 1776 2904 -352 ) ( 1760 2904 -344 ) subway/1_tunnel_ceiling2 48 0 0 1 1 0 16777216 0 +( 1760 2520 -352 ) ( 1712 2520 -352 ) ( 1736 2520 -344 ) subway/1_tunnel_ceiling2 48 0 0 1 1 0 16777216 0 +} +// brush 1719 +{ +( 1720 2912 -344 ) ( 1720 2872 -344 ) ( 1720 2872 -568 ) subway/1_tunnelwall -56 0 0 1 1 0 301989888 0 +( 1784 2872 -344 ) ( 1784 2912 -344 ) ( 1784 2912 -568 ) subway/1_tunnelwall -56 0 0 1 1 0 301989888 0 +( 1704 2456 -344 ) ( 1768 2456 -344 ) ( 1768 2456 -568 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1768 2872 -344 ) ( 1768 2912 -344 ) ( 1832 2912 -344 ) subway/1_tunnelwall 0 56 0 1 1 0 301989888 0 +( 1832 2912 -352 ) ( 1768 2912 -352 ) ( 1768 2872 -352 ) subway/1_tunnel_ceiling3 48 40 0 1 1 0 16777216 0 +( 1712 2520 -352 ) ( 1760 2520 -352 ) ( 1736 2520 -344 ) subway/1_tunnel_ceiling2 48 0 0 1 1 0 16777216 0 +} +// brush 1720 +{ +( 1784 2440 -384 ) ( 1784 2440 -352 ) ( 1816 2440 -352 ) subway/1_tunnelwall 32 0 0 1 1 0 301989888 0 +( 1816 2872 -384 ) ( 1816 2872 -352 ) ( 1816 2888 -352 ) subway/1_tunnelwall -56 0 0 1 1 0 301989888 0 +( 1808 2472 -360 ) ( 1808 2440 -360 ) ( 1816 2440 -384 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1808 2872 -360 ) ( 1808 2904 -360 ) ( 1816 2904 -352 ) subway/1_tunnelwall 32 56 0 1 1 0 301989888 0 +( 1800 2456 -352 ) ( 1776 2456 -384 ) ( 1824 2456 -384 ) subway/1_tunnelwall 32 56 0 1 1 0 301989888 0 +} +// brush 1721 +{ +( 1784 2440 -384 ) ( 1784 2440 -352 ) ( 1816 2440 -352 ) subway/1_tunnelwall 32 0 0 1 1 0 301989888 0 +( 1816 2872 -352 ) ( 1784 2872 -352 ) ( 1784 2888 -352 ) subway/1_tunnelwall 32 56 0 1 1 0 301989888 0 +( 1808 2528 -360 ) ( 1808 2560 -360 ) ( 1784 2560 -352 ) subway/metalrib1 0 8 90 0.500000 0.500000 0 16777216 0 +( 1808 2904 -360 ) ( 1808 2872 -360 ) ( 1816 2872 -352 ) subway/1_tunnelwall 32 56 0 1 1 0 301989888 0 +( 1800 2456 -352 ) ( 1776 2456 -360 ) ( 1824 2456 -360 ) subway/1_tunnelwall 32 56 0 1 1 0 301989888 0 +} +// brush 1722 +{ +( 1720 2904 -384 ) ( 1720 2904 -352 ) ( 1688 2904 -352 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 2888 -352 ) ( 1720 2872 -352 ) ( 1688 2872 -352 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +( 1720 2560 -352 ) ( 1696 2560 -360 ) ( 1696 2528 -360 ) subway/1_tunnelwall -32 63 90 0.500000 0.500000 0 301989888 0 +( 1688 2872 -352 ) ( 1696 2872 -360 ) ( 1696 2904 -360 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +( 1728 2456 -360 ) ( 1680 2456 -360 ) ( 1704 2456 -352 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +} +// brush 1723 +{ +( 1688 2440 -352 ) ( 1720 2440 -352 ) ( 1720 2440 -384 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 2888 -352 ) ( 1720 2872 -352 ) ( 1688 2872 -352 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +( 1720 2560 -352 ) ( 1696 2560 -360 ) ( 1696 2528 -360 ) subway/metalrib1 0 8 90 0.500000 0.500000 0 16777216 0 +( 1688 2872 -352 ) ( 1696 2872 -360 ) ( 1696 2904 -360 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +( 1680 2456 -360 ) ( 1728 2456 -360 ) ( 1704 2456 -352 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +} +// brush 1724 +{ +( 1720 2904 -384 ) ( 1720 2904 -352 ) ( 1688 2904 -352 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1688 2888 -352 ) ( 1688 2872 -352 ) ( 1688 2872 -384 ) subway/1_tunnelwall -56 0 0 1 1 0 301989888 0 +( 1688 2440 -384 ) ( 1696 2440 -360 ) ( 1696 2472 -360 ) subway/1_tunnelwall -40 0 0 0.500000 0.500000 0 301989888 0 +( 1688 2904 -352 ) ( 1696 2904 -360 ) ( 1696 2872 -360 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +( 1728 2456 -384 ) ( 1680 2456 -384 ) ( 1704 2456 -352 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +} +// brush 1725 +{ +( 1688 2440 -352 ) ( 1720 2440 -352 ) ( 1720 2440 -384 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1688 2888 -352 ) ( 1688 2872 -352 ) ( 1688 2872 -384 ) subway/1_tunnelwall -56 0 0 1 1 0 301989888 0 +( 1688 2440 -384 ) ( 1696 2440 -360 ) ( 1696 2472 -360 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1688 2904 -352 ) ( 1696 2904 -360 ) ( 1696 2872 -360 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +( 1680 2456 -384 ) ( 1728 2456 -384 ) ( 1704 2456 -352 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +} +// brush 1726 +{ +( 1784 2456 -384 ) ( 1784 2456 -352 ) ( 1816 2456 -352 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 2904 -352 ) ( 1784 2904 -352 ) ( 1784 2904 -384 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 2872 -384 ) ( 1816 2872 -352 ) ( 1816 2888 -352 ) subway/1_tunnelwall -56 0 0 1 1 0 301989888 0 +( 1808 2488 -360 ) ( 1808 2456 -360 ) ( 1816 2456 -384 ) subway/1_tunnelwall -40 0 0 0.500000 0.500000 0 301989888 0 +( 1808 2872 -360 ) ( 1808 2904 -360 ) ( 1816 2904 -352 ) subway/1_tunnelwall 0 56 0 1 1 0 301989888 0 +} +// brush 1727 +{ +( 1784 2456 -384 ) ( 1784 2456 -352 ) ( 1816 2456 -352 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 2904 -352 ) ( 1784 2904 -352 ) ( 1784 2904 -384 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 2872 -352 ) ( 1784 2872 -352 ) ( 1784 2888 -352 ) subway/1_tunnelwall 0 56 0 1 1 0 301989888 0 +( 1808 2528 -360 ) ( 1808 2560 -360 ) ( 1784 2560 -352 ) subway/1_tunnelwall -32 31 90 0.500000 0.500000 0 301989888 0 +( 1808 2904 -360 ) ( 1808 2872 -360 ) ( 1816 2872 -352 ) subway/1_tunnelwall 0 56 0 1 1 0 301989888 0 +} +// brush 1728 +{ +( 1960 24 -552 ) ( 1840 24 -552 ) ( 1840 0 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1864 24 -536 ) ( 1864 48 -536 ) ( 1984 48 -536 ) subway/1_tunnelfloor_2 -16 -8 180 1 1 0 285212672 0 +( 1880 616 -536 ) ( 1880 616 -552 ) ( 1784 616 -552 ) subway/1_tunneltrack_plain 32 16 0 0.500000 0.500000 0 301989888 0 +( 1880 616 -552 ) ( 1880 616 -536 ) ( 1848 648 -536 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 1848 648 -552 ) ( 1848 648 -536 ) ( 1816 648 -536 ) subway/1_tunneltrack_plain 32 16 0 0.500000 0.500000 0 301989888 0 +( 1816 648 -552 ) ( 1816 648 -536 ) ( 1784 616 -536 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 1729 +{ +( 1880 1360 -280 ) ( 1880 1320 -280 ) ( 1880 1320 -504 ) subway/1_tunnelwall 24 0 0 1 1 0 301989888 0 +( 2000 1312 -280 ) ( 2000 1352 -280 ) ( 2000 1352 -504 ) subway/1_tunnelwall 24 0 0 1 1 0 301989888 0 +( 1864 756 -280 ) ( 1928 756 -280 ) ( 1928 756 -504 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1928 1320 -280 ) ( 1928 1360 -280 ) ( 1992 1360 -280 ) subway/1_tunnelwall -32 -24 0 1 1 0 301989888 0 +( 1992 1360 -288 ) ( 1928 1360 -288 ) ( 1928 1320 -288 ) subway/1_tunnel_ceiling2 -48 -24 0 1 1 0 16777216 0 +( 1904 1352 -288 ) ( 1936 1352 -288 ) ( 1920 1352 -280 ) subway/1_tunnel_ceiling2 -48 0 0 1 1 0 16777216 0 +} +// brush 1730 +{ +( 1848 756 -288 ) ( 1880 756 -288 ) ( 1880 756 -320 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1880 1352 -320 ) ( 1880 1352 -288 ) ( 1848 1352 -288 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1848 1456 -288 ) ( 1848 1440 -288 ) ( 1848 1440 -320 ) subway/1_tunnelwall 24 0 0 1 1 0 301989888 0 +( 1848 628 -320 ) ( 1856 628 -296 ) ( 1856 660 -296 ) subway/1_tunnelwall -8 0 0 0.500000 0.500000 0 301989888 0 +( 1848 1352 -288 ) ( 1856 1352 -296 ) ( 1856 1320 -296 ) subway/1_tunnelwall -16 -24 0 1 1 0 301989888 0 +} +// brush 1731 +{ +( 1848 756 -288 ) ( 1880 756 -288 ) ( 1880 756 -320 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1880 1352 -320 ) ( 1880 1352 -288 ) ( 1848 1352 -288 ) subway/1_tunnelwall -16 0 0 1 1 0 301989888 0 +( 1880 1336 -288 ) ( 1880 1320 -288 ) ( 1848 1320 -288 ) subway/1_tunnelwall -16 -24 0 1 1 0 301989888 0 +( 1880 788 -288 ) ( 1856 788 -296 ) ( 1856 756 -296 ) subway/1_tunnelwall 0 0 90 0.500000 0.500000 0 301989888 0 +( 1848 1320 -288 ) ( 1856 1320 -296 ) ( 1856 1352 -296 ) subway/1_tunnelwall -16 -24 0 1 1 0 301989888 0 +} +// brush 1732 +{ +( 1944 756 -320 ) ( 1944 756 -288 ) ( 1976 756 -288 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1976 1352 -288 ) ( 1944 1352 -288 ) ( 1944 1352 -320 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1976 1320 -288 ) ( 1944 1320 -288 ) ( 1944 1336 -288 ) subway/1_tunnelwall -32 -24 0 1 1 0 301989888 0 +( 1968 756 -296 ) ( 1968 788 -296 ) ( 1944 788 -288 ) subway/1_tunnelwall 0 -31 90 0.500000 0.500000 0 301989888 0 +( 1968 1352 -296 ) ( 1968 1320 -296 ) ( 1976 1320 -288 ) subway/1_tunnelwall -32 -24 0 1 1 0 301989888 0 +} +// brush 1733 +{ +( 1816 1352 -288 ) ( 1784 1352 -288 ) ( 1784 1352 -320 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 1320 -320 ) ( 1816 1320 -288 ) ( 1816 1336 -288 ) subway/1_tunnelwall 24 0 0 1 1 0 301989888 0 +( 1808 792 -296 ) ( 1808 760 -296 ) ( 1816 760 -320 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1808 1320 -296 ) ( 1808 1352 -296 ) ( 1816 1352 -288 ) subway/1_tunnelwall 0 -24 0 1 1 0 301989888 0 +( 1808 756 -336 ) ( 1808 756 -280 ) ( 1816 756 -308 ) subway/1_tunnelwall 0 -24 0 1 1 0 301989888 0 +} +// brush 1734 +{ +( 1784 756 -320 ) ( 1784 756 -288 ) ( 1816 756 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 1352 -288 ) ( 1784 1352 -288 ) ( 1784 1352 -320 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 1320 -288 ) ( 1784 1320 -288 ) ( 1784 1336 -288 ) subway/1_tunnelwall 0 -24 0 1 1 0 301989888 0 +( 1808 756 -296 ) ( 1808 788 -296 ) ( 1784 788 -288 ) subway/1_tunnelwall 0 -31 90 0.500000 0.500000 0 301989888 0 +( 1808 1352 -296 ) ( 1808 1320 -296 ) ( 1816 1320 -288 ) subway/1_tunnelwall 0 -24 0 1 1 0 301989888 0 +} +// brush 1735 +{ +( 1688 756 -288 ) ( 1720 756 -288 ) ( 1720 756 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 1352 -320 ) ( 1720 1352 -288 ) ( 1688 1352 -288 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 1336 -288 ) ( 1720 1320 -288 ) ( 1688 1320 -288 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1720 788 -288 ) ( 1696 788 -296 ) ( 1696 756 -296 ) subway/1_tunnelwall 0 0 90 0.500000 0.500000 0 301989888 0 +( 1688 1320 -288 ) ( 1696 1320 -296 ) ( 1696 1352 -296 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +} +// brush 1736 +{ +( 1720 1360 -280 ) ( 1720 1320 -280 ) ( 1720 1320 -504 ) subway/1_tunnelwall 24 0 0 1 1 0 301989888 0 +( 1784 1320 -280 ) ( 1784 1360 -280 ) ( 1784 1360 -504 ) subway/1_tunnelwall 24 0 0 1 1 0 301989888 0 +( 1704 756 -280 ) ( 1768 756 -280 ) ( 1768 756 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1768 1320 -280 ) ( 1768 1360 -280 ) ( 1832 1360 -280 ) subway/1_tunnelwall 0 -24 0 1 1 0 301989888 0 +( 1832 1360 -288 ) ( 1768 1360 -288 ) ( 1768 1320 -288 ) subway/1_tunnel_ceiling2 48 -24 0 1 1 0 16777216 0 +( 1744 1352 -288 ) ( 1776 1352 -288 ) ( 1760 1352 -280 ) subway/1_tunnel_ceiling2 48 0 0 1 1 0 16777216 0 +} +// brush 1737 +{ +( 1720 1768 -280 ) ( 1720 1728 -280 ) ( 1720 1728 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1832 1760 -280 ) ( 1768 1760 -280 ) ( 1768 1760 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1784 1728 -280 ) ( 1784 1768 -280 ) ( 1784 1768 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1768 1728 -280 ) ( 1768 1768 -280 ) ( 1832 1768 -280 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1832 1768 -288 ) ( 1768 1768 -288 ) ( 1768 1728 -288 ) subway/1_tunnel_ceiling3 48 32 0 1 1 0 16777216 0 +( 1776 1696 -288 ) ( 1744 1696 -288 ) ( 1760 1696 -280 ) subway/1_tunnel_ceiling2 48 0 0 1 1 0 16777216 0 +} +// brush 1738 +{ +( 1720 1768 -280 ) ( 1720 1728 -280 ) ( 1720 1728 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1784 1728 -280 ) ( 1784 1768 -280 ) ( 1784 1768 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1704 1352 -280 ) ( 1768 1352 -280 ) ( 1768 1352 -504 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1768 1728 -280 ) ( 1768 1768 -280 ) ( 1832 1768 -280 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1832 1768 -288 ) ( 1768 1768 -288 ) ( 1768 1728 -288 ) subway/1_tunnel_ceiling2 48 0 0 1 1 0 16777216 0 +( 1744 1696 -288 ) ( 1776 1696 -288 ) ( 1760 1696 -280 ) subway/1_tunnel_ceiling2 48 0 0 1 1 0 16777216 0 +} +// brush 1739 +{ +( 1688 1800 -264 ) ( 1688 1760 -264 ) ( 1688 1760 -488 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1832 1792 -264 ) ( 1768 1792 -264 ) ( 1768 1792 -488 ) subway/1_tile 32 32 0 0.500000 0.500000 0 318767104 0 +( 1816 1760 -264 ) ( 1816 1800 -264 ) ( 1816 1800 -488 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1672 1784 -264 ) ( 1736 1784 -264 ) ( 1736 1784 -488 ) subway/1_tile 32 32 0 0.500000 0.500000 0 318767104 0 +( 1832 1800 -280 ) ( 1768 1800 -280 ) ( 1768 1760 -280 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1736 1784 -264 ) ( 1680 1784 -264 ) ( 1708 1792 -264 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1740 +{ +( 1688 1800 -272 ) ( 1688 1760 -272 ) ( 1688 1760 -496 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1832 1792 -272 ) ( 1768 1792 -272 ) ( 1768 1792 -496 ) subway/1_tile 32 32 0 0.500000 0.500000 0 318767104 0 +( 1816 1760 -272 ) ( 1816 1800 -272 ) ( 1816 1800 -496 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1680 1760 -272 ) ( 1744 1760 -272 ) ( 1744 1760 -496 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1832 1800 -288 ) ( 1768 1800 -288 ) ( 1768 1760 -288 ) subway/metal1 -31 16 90 0.500000 0.500000 0 16777216 0 +( 1736 1784 -280 ) ( 1680 1784 -280 ) ( 1708 1792 -280 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +} +// brush 1741 +{ +( 1696 1760 -288 ) ( 1728 1760 -288 ) ( 1728 1760 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 1792 -320 ) ( 1720 1792 -288 ) ( 1688 1792 -288 ) subway/1_tile 32 32 0 0.500000 0.500000 0 318767104 0 +( 1720 1776 -288 ) ( 1720 1760 -288 ) ( 1688 1760 -288 ) subway/1_tunnelwall 16 32 0 1 1 0 301989888 0 +( 1720 1448 -288 ) ( 1696 1448 -296 ) ( 1696 1416 -296 ) subway/metal1 -31 48 90 0.500000 0.500000 0 16777216 0 +( 1688 1760 -288 ) ( 1696 1760 -296 ) ( 1696 1792 -296 ) subway/1_tunnelwall 16 32 0 1 1 0 301989888 0 +} +// brush 1742 +{ +( 1696 1760 -288 ) ( 1728 1760 -288 ) ( 1728 1760 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 1792 -320 ) ( 1720 1792 -288 ) ( 1688 1792 -288 ) subway/1_tile 32 32 0 0.500000 0.500000 0 318767104 0 +( 1688 1776 -288 ) ( 1688 1760 -288 ) ( 1688 1760 -320 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1688 1496 -320 ) ( 1696 1496 -296 ) ( 1696 1528 -296 ) subway/metal1 -31 16 0 0.500000 0.500000 0 16777216 0 +( 1688 1792 -288 ) ( 1696 1792 -296 ) ( 1696 1760 -296 ) subway/1_tunnelwall 16 32 0 1 1 0 301989888 0 +} +// brush 1743 +{ +( 1776 1760 -320 ) ( 1776 1760 -288 ) ( 1808 1760 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 1792 -288 ) ( 1784 1792 -288 ) ( 1784 1792 -320 ) subway/1_tile 32 32 0 0.500000 0.500000 0 318767104 0 +( 1816 1760 -320 ) ( 1816 1760 -288 ) ( 1816 1776 -288 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1808 1528 -296 ) ( 1808 1496 -296 ) ( 1816 1496 -320 ) subway/metal1 -31 16 0 0.500000 0.500000 0 16777216 0 +( 1808 1760 -296 ) ( 1808 1792 -296 ) ( 1816 1792 -288 ) subway/1_tunnelwall 0 32 0 1 1 0 301989888 0 +} +// brush 1744 +{ +( 1776 1760 -320 ) ( 1776 1760 -288 ) ( 1808 1760 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 1792 -288 ) ( 1784 1792 -288 ) ( 1784 1792 -320 ) subway/1_tile 32 32 0 0.500000 0.500000 0 318767104 0 +( 1816 1760 -288 ) ( 1784 1760 -288 ) ( 1784 1776 -288 ) subway/1_tunnelwall 0 32 0 1 1 0 301989888 0 +( 1808 1416 -296 ) ( 1808 1448 -296 ) ( 1784 1448 -288 ) subway/metal1 -31 16 90 0.500000 0.500000 0 16777216 0 +( 1808 1792 -296 ) ( 1808 1760 -296 ) ( 1816 1760 -288 ) subway/1_tunnelwall 0 32 0 1 1 0 301989888 0 +} +// brush 1745 +{ +( 1688 1352 -288 ) ( 1720 1352 -288 ) ( 1720 1352 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 1760 -320 ) ( 1720 1760 -288 ) ( 1688 1760 -288 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1688 1744 -288 ) ( 1688 1728 -288 ) ( 1688 1728 -320 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1688 1352 -320 ) ( 1696 1352 -296 ) ( 1696 1384 -296 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1688 1760 -288 ) ( 1696 1760 -296 ) ( 1696 1728 -296 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +} +// brush 1746 +{ +( 1688 1352 -288 ) ( 1720 1352 -288 ) ( 1720 1352 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 1760 -320 ) ( 1720 1760 -288 ) ( 1688 1760 -288 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 1744 -288 ) ( 1720 1728 -288 ) ( 1688 1728 -288 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1720 1416 -288 ) ( 1696 1416 -296 ) ( 1696 1384 -296 ) subway/1_tunnelwall 16 0 90 0.500000 0.500000 0 301989888 0 +( 1688 1728 -288 ) ( 1696 1728 -296 ) ( 1696 1760 -296 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +} +// brush 1747 +{ +( 1784 1352 -320 ) ( 1784 1352 -288 ) ( 1816 1352 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 1760 -288 ) ( 1784 1760 -288 ) ( 1784 1760 -320 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 1728 -288 ) ( 1784 1728 -288 ) ( 1784 1744 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1808 1384 -296 ) ( 1808 1416 -296 ) ( 1784 1416 -288 ) subway/1_tunnelwall 16 -32 90 0.500000 0.500000 0 301989888 0 +( 1808 1760 -296 ) ( 1808 1728 -296 ) ( 1816 1728 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +} +// brush 1748 +{ +( 1784 1352 -320 ) ( 1784 1352 -288 ) ( 1816 1352 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 1760 -288 ) ( 1784 1760 -288 ) ( 1784 1760 -320 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1816 1728 -320 ) ( 1816 1728 -288 ) ( 1816 1744 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1808 1416 -296 ) ( 1808 1384 -296 ) ( 1816 1384 -320 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1808 1728 -296 ) ( 1808 1760 -296 ) ( 1816 1760 -288 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +} +// brush 1749 +{ +( 1824 648 -320 ) ( 1840 648 -320 ) ( 1840 648 -448 ) subway/1_tunnelwall -8 -8 0 1 1 0 301989888 0 +( 1848 728 -320 ) ( 1848 760 -320 ) ( 1848 760 -448 ) subway/1_tunnelwall -8 -8 0 1 1 0 301989888 0 +( 1832 776 -320 ) ( 1816 776 -320 ) ( 1816 776 -448 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1816 760 -288 ) ( 1816 728 -288 ) ( 1816 728 -416 ) subway/1_tunnelwall -8 -8 0 1 1 0 301989888 0 +( 1816 776 -520 ) ( 1816 760 -520 ) ( 1848 768 -520 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +( 1816 632 -488 ) ( 1816 736 -488 ) ( 1848 684 -488 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +} +// brush 1750 +{ +( 1816 992 -416 ) ( 1816 992 -288 ) ( 1816 960 -288 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1848 968 -448 ) ( 1848 968 -320 ) ( 1848 1000 -320 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1832 960 -320 ) ( 1816 960 -320 ) ( 1816 992 -320 ) subway/1_tunnelwall 16 -8 0 1 1 0 301989888 0 +( 1816 976 -312 ) ( 1816 912 -376 ) ( 1848 944 -344 ) subway/1_tunnelwall 16 -8 0 1 1 0 301989888 0 +( 1816 976 -344 ) ( 1816 912 -312 ) ( 1848 944 -328 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1002 +} +// brush 1751 +{ +( 1816 984 -408 ) ( 1816 984 -280 ) ( 1816 952 -280 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1848 960 -440 ) ( 1848 960 -312 ) ( 1848 992 -312 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1832 968 -440 ) ( 1832 968 -312 ) ( 1816 968 -312 ) subway/1_tunnelwall 16 8 0 1 1 0 301989888 0 +( 1816 912 -376 ) ( 1816 976 -312 ) ( 1848 944 -344 ) subway/1_tunnelwall 16 -16 0 1 1 0 301989888 0 +( 1816 976 -376 ) ( 1816 936 -296 ) ( 1848 956 -336 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1002 +} +// brush 1752 +{ +( 1816 856 -280 ) ( 1816 824 -280 ) ( 1816 824 -408 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1848 816 -312 ) ( 1848 848 -312 ) ( 1848 848 -440 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1816 840 -312 ) ( 1832 840 -312 ) ( 1832 840 -440 ) subway/1_tunnelwall 16 8 0 1 1 0 301989888 0 +( 1848 864 -344 ) ( 1816 832 -312 ) ( 1816 896 -376 ) subway/1_tunnelwall 16 -32 0 1 1 0 301989888 0 +( 1848 852 -336 ) ( 1816 872 -296 ) ( 1816 832 -376 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1002 +} +// brush 1753 +{ +( 1816 848 -288 ) ( 1816 816 -288 ) ( 1816 816 -416 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1848 808 -320 ) ( 1848 840 -320 ) ( 1848 840 -448 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1816 816 -320 ) ( 1816 848 -320 ) ( 1832 848 -320 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1848 864 -344 ) ( 1816 896 -376 ) ( 1816 832 -312 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1848 864 -328 ) ( 1816 896 -312 ) ( 1816 832 -344 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1002 +} +// brush 1754 +{ +( 1836 968 -448 ) ( 1804 968 -448 ) ( 1804 928 -448 ) subway/2_wirewindow 12 0 0 1 1 0 16779264 0 +( 1804 928 -320 ) ( 1804 968 -320 ) ( 1836 968 -320 ) subway/2_wirewindow 12 0 0 1 1 0 16779264 0 +( 1804 840 -320 ) ( 1836 840 -320 ) ( 1836 840 -448 ) subway/2_wirewindow 12 0 0 1 1 0 16779264 0 +( 1833 928 -320 ) ( 1833 968 -320 ) ( 1833 968 -448 ) subway/2_wirewindow 56 0 0 1 1 0 16779264 0 +( 1836 968 -320 ) ( 1804 968 -320 ) ( 1804 968 -448 ) subway/2_wirewindow 12 0 0 1 1 0 16779264 0 +( 1831 976 -320 ) ( 1831 936 -320 ) ( 1831 936 -448 ) subway/2_wirewindow 56 0 0 1 1 0 16779264 0 +} +// brush 1755 +{ +( 1816 1040 -288 ) ( 1816 1008 -288 ) ( 1816 1008 -416 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1848 1000 -320 ) ( 1848 1032 -320 ) ( 1848 1032 -448 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1816 1008 -320 ) ( 1816 1040 -320 ) ( 1832 1040 -320 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1848 1056 -344 ) ( 1816 1088 -376 ) ( 1816 1024 -312 ) subway/1_tunnelwall 16 -24 0 1 1 0 301989888 0 +( 1848 1056 -328 ) ( 1816 1088 -312 ) ( 1816 1024 -344 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1001 +} +// brush 1756 +{ +( 1816 1048 -280 ) ( 1816 1016 -280 ) ( 1816 1016 -408 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1848 1008 -312 ) ( 1848 1040 -312 ) ( 1848 1040 -440 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1816 1032 -312 ) ( 1832 1032 -312 ) ( 1832 1032 -440 ) subway/1_tunnelwall 16 8 0 1 1 0 301989888 0 +( 1848 1056 -344 ) ( 1816 1024 -312 ) ( 1816 1088 -376 ) subway/1_tunnelwall 16 -32 0 1 1 0 301989888 0 +( 1848 1044 -336 ) ( 1816 1064 -296 ) ( 1816 1024 -376 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1001 +} +// brush 1757 +{ +( 1816 1176 -408 ) ( 1816 1176 -280 ) ( 1816 1144 -280 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1848 1152 -440 ) ( 1848 1152 -312 ) ( 1848 1184 -312 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1832 1160 -440 ) ( 1832 1160 -312 ) ( 1816 1160 -312 ) subway/1_tunnelwall 16 8 0 1 1 0 301989888 0 +( 1816 1104 -376 ) ( 1816 1168 -312 ) ( 1848 1136 -344 ) subway/1_tunnelwall 16 -16 0 1 1 0 301989888 0 +( 1816 1168 -376 ) ( 1816 1128 -296 ) ( 1848 1148 -336 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1001 +} +// brush 1758 +{ +( 1816 1184 -416 ) ( 1816 1184 -288 ) ( 1816 1152 -288 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1848 1160 -448 ) ( 1848 1160 -320 ) ( 1848 1192 -320 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1832 1152 -320 ) ( 1816 1152 -320 ) ( 1816 1184 -320 ) subway/1_tunnelwall 16 -8 0 1 1 0 301989888 0 +( 1816 1168 -312 ) ( 1816 1104 -376 ) ( 1848 1136 -344 ) subway/1_tunnelwall 16 -8 0 1 1 0 301989888 0 +( 1816 1168 -344 ) ( 1816 1104 -312 ) ( 1848 1136 -328 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1001 +} +// brush 1759 +{ +( 1836 1160 -448 ) ( 1804 1160 -448 ) ( 1804 1120 -448 ) subway/2_wirewindow 12 0 0 1 1 0 16779264 0 +( 1804 1120 -320 ) ( 1804 1160 -320 ) ( 1836 1160 -320 ) subway/2_wirewindow 12 0 0 1 1 0 16779264 0 +( 1804 1032 -320 ) ( 1836 1032 -320 ) ( 1836 1032 -448 ) subway/2_wirewindow 12 0 0 1 1 0 16779264 0 +( 1834 1120 -320 ) ( 1834 1160 -320 ) ( 1834 1160 -448 ) subway/2_wirewindow -8 0 0 1 1 0 16779264 0 +( 1836 1160 -320 ) ( 1804 1160 -320 ) ( 1804 1160 -448 ) subway/2_wirewindow 12 0 0 1 1 0 16779264 0 +( 1830 1168 -320 ) ( 1830 1128 -320 ) ( 1830 1128 -448 ) subway/2_wirewindow -8 0 0 1 1 0 16779264 0 +} +// brush 1760 +{ +( 1800 -1076 -480 ) ( 1800 -1052 -480 ) ( 1680 -1052 -480 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1672 -1108 -448 ) ( 1792 -1108 -448 ) ( 1792 -1132 -448 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1720 -1468 -520 ) ( 1720 -1468 -512 ) ( 1840 -1468 -512 ) subway/1_tunnelwall_pipe 0 -32 0 0.500000 0.500000 0 16777216 0 +( 1976 -1408 -488 ) ( 1976 -1408 -480 ) ( 1976 -1432 -480 ) subway/1_tunnelwall_pipe -48 -56 0 0.500000 0.500000 0 16777216 0 +( 1776 -344 -432 ) ( 1776 -344 -424 ) ( 1656 -344 -424 ) subway/1_tunnelwall_pipe 0 -32 0 0.500000 0.500000 0 16777216 0 +( 1992 -548 -400 ) ( 1992 -548 -392 ) ( 1992 -524 -392 ) subway/1_tunnelwall_pipe -48 -32 0 0.500000 0.500000 0 16777216 0 +( 2008 -1112 -254 ) ( 2008 -1112 -264 ) ( 1976 -1112 -264 ) subway/1_tunneltrack_1 -55 24 195 1 1 0 16777216 0 +} +// brush 1761 +{ +( 1984 -344 -480 ) ( 1976 -344 -480 ) ( 1976 -344 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1984 -928 -496 ) ( 1984 -928 -480 ) ( 1984 -592 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1984 -1112 -496 ) ( 1976 -1112 -496 ) ( 1976 -1112 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1976 -512 -480 ) ( 1976 -800 -480 ) ( 1976 -800 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1976 -692 -480 ) ( 2000 -692 -480 ) ( 2000 -868 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 2000 -868 -488 ) ( 2000 -692 -488 ) ( 1976 -692 -488 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 1762 +{ +( 1800 -1100 -520 ) ( 1800 -1076 -520 ) ( 1680 -1076 -520 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( 1672 -1068 -488 ) ( 1792 -1068 -488 ) ( 1792 -1092 -488 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( 1704 -1112 -560 ) ( 1704 -1112 -552 ) ( 1824 -1112 -552 ) subway/1_tunnelwall 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1976 -1112 -512 ) ( 1976 -1112 -504 ) ( 1976 -1136 -504 ) subway/1_tunnelwall 8 -8 0 1 1 0 301989888 0 +( 1776 -344 -472 ) ( 1776 -344 -464 ) ( 1656 -344 -464 ) subway/1_tunnelwall 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1984 -1260 -440 ) ( 1984 -1260 -432 ) ( 1984 -1236 -432 ) subway/1_tunnelwall -48 -48 0 0.500000 0.500000 0 301989888 0 +( 1984 -1116 -254 ) ( 1984 -1116 -264 ) ( 1936 -1116 -264 ) subway/1_tunneltrack_1 -54 24 195 1 1 0 16777216 0 +} +// brush 1763 +{ +( 1984 -1052 -480 ) ( 1864 -1052 -480 ) ( 1864 -1076 -480 ) subway/1_tunnelwall_pipe 32 0 0 0.500000 0.500000 0 16777216 0 +( 1872 -1132 -448 ) ( 1872 -1108 -448 ) ( 1992 -1108 -448 ) subway/1_tunnelwall_pipe 32 0 0 0.500000 0.500000 0 16777216 0 +( 1824 -1468 -512 ) ( 1944 -1468 -512 ) ( 1944 -1468 -520 ) subway/1_tunnelwall_pipe 32 -32 0 0.500000 0.500000 0 16777216 0 +( 1688 -1432 -480 ) ( 1688 -1408 -480 ) ( 1688 -1408 -488 ) subway/1_tunnelwall_pipe 16 -56 0 0.500000 0.500000 0 16777216 0 +( 2008 -344 -424 ) ( 1888 -344 -424 ) ( 1888 -344 -432 ) subway/1_tunnelwall_pipe 32 -32 0 0.500000 0.500000 0 16777216 0 +( 1672 -524 -392 ) ( 1672 -548 -392 ) ( 1672 -548 -400 ) subway/1_tunnelwall_pipe 16 -32 0 0.500000 0.500000 0 16777216 0 +( 1688 -1112 -264 ) ( 1656 -1112 -264 ) ( 1656 -1112 -254 ) subway/1_tunneltrack_1 -29 -54 195 1 1 0 16777216 0 +} +// brush 1764 +{ +( 1904 -1112 -264 ) ( 1840 -1112 -264 ) ( 1840 -1112 -254 ) subway/1_tunneltrack_1 -8 -43 195 1 1 0 16777216 0 +( 2064 -776 -536 ) ( 2064 -768 -536 ) ( 2016 -768 -536 ) subway/metal2 32 -48 0 0.500000 0.500000 0 16777216 0 +( 1960 -912 -528 ) ( 1960 -648 -528 ) ( 1992 -648 -528 ) subway/metal2 32 -48 0 0.500000 0.500000 0 16777216 0 +( 1872 -776 -516 ) ( 1872 -1040 -516 ) ( 1872 -1040 -548 ) subway/metal2 48 -48 0 0.500000 0.500000 0 16777216 0 +( 2064 -344 -536 ) ( 2064 -344 -504 ) ( 2016 -344 -504 ) subway/metal2 32 -48 0 0.500000 0.500000 0 16777216 0 +( 1880 -1248 -728 ) ( 1880 -1248 -768 ) ( 1880 -1256 -768 ) subway/metal2 48 -48 0 0.500000 0.500000 0 16777216 0 +( 2064 -1192 -504 ) ( 2064 -1192 -536 ) ( 2016 -1192 -536 ) subway/metal2 32 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 1765 +{ +( 1960 -1112 -264 ) ( 1920 -1112 -264 ) ( 1920 -1112 -254 ) subway/1_tunneltrack_1 -11 -44 195 1 1 0 16777216 0 +( 2136 -1192 -504 ) ( 2136 -1192 -536 ) ( 2088 -1192 -536 ) subway/metal2 40 -48 0 0.500000 0.500000 0 16777216 0 +( 1952 -624 -728 ) ( 1952 -624 -768 ) ( 1952 -632 -768 ) subway/metal2 48 -48 0 0.500000 0.500000 0 16777216 0 +( 2136 -344 -536 ) ( 2136 -344 -504 ) ( 2088 -344 -504 ) subway/metal2 40 -48 0 0.500000 0.500000 0 16777216 0 +( 1944 -888 -516 ) ( 1944 -1152 -516 ) ( 1944 -1152 -548 ) subway/metal2 48 -48 0 0.500000 0.500000 0 16777216 0 +( 2032 -912 -528 ) ( 2032 -648 -528 ) ( 2064 -648 -528 ) subway/metal2 40 -48 0 0.500000 0.500000 0 16777216 0 +( 2136 -776 -536 ) ( 2136 -768 -536 ) ( 2088 -768 -536 ) subway/metal2 40 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 1766 +{ +( 2116 -320 -544 ) ( 1996 -320 -544 ) ( 1996 -344 -544 ) subway/1_tunneltrack_1 -4 0 0 1 1 0 16777216 0 +( 1996 -360 -536 ) ( 1996 -336 -536 ) ( 2116 -336 -536 ) subway/1_tunneltrack_1 20 0 0 1 1 0 16777216 0 +( 1932 -1112 -568 ) ( 2052 -1112 -568 ) ( 2052 -1112 -576 ) subway/1_tunneltrack_1 -4 -56 0 1 1 0 16777216 0 +( 1944 -280 -520 ) ( 1944 -256 -520 ) ( 1944 -256 -528 ) subway/1_tunneltrack_1 20 -56 0 1 1 0 16777216 0 +( 2136 -344 -480 ) ( 2016 -344 -480 ) ( 2016 -344 -488 ) subway/1_tunneltrack_1 -4 -56 0 1 1 0 16777216 0 +( 1880 -240 -512 ) ( 1880 -264 -512 ) ( 1880 -264 -520 ) subway/1_tunneltrack_1 20 -56 0 1 1 0 16777216 0 +} +// brush 1767 +{ +( 2120 -832 -552 ) ( 2000 -832 -552 ) ( 2000 -856 -552 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 2024 -832 -536 ) ( 2024 -808 -536 ) ( 2144 -808 -536 ) subway/1_tunnelfloor_2 16 8 90 1 1 0 285212672 0 +( 1976 -1112 -536 ) ( 1976 -1112 -552 ) ( 1944 -1112 -552 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1976 -808 -552 ) ( 1976 -808 -536 ) ( 1976 -344 -536 ) subway/1_tunneltrack_plain 48 -48 0 0.500000 0.500000 0 301989888 0 +( 2184 -344 -480 ) ( 2064 -344 -480 ) ( 2064 -344 -488 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1952 -848 -520 ) ( 1952 -872 -520 ) ( 1952 -872 -528 ) subway/1_tunneltrack_plain 48 -48 0 0.500000 0.500000 0 301989888 0 +} +// brush 1768 +{ +( 1680 -616 -520 ) ( 1680 -640 -520 ) ( 1680 -640 -528 ) subway/1_tunneltrack_plain 16 -48 0 0.500000 0.500000 0 301989888 0 +( 1880 -344 -480 ) ( 1760 -344 -480 ) ( 1760 -344 -488 ) subway/1_tunneltrack_plain 16 -48 0 0.500000 0.500000 0 301989888 0 +( 1712 400 -520 ) ( 1712 424 -520 ) ( 1712 424 -528 ) subway/1_tunneltrack_plain 16 -48 0 0.500000 0.500000 0 301989888 0 +( 1704 -1112 -568 ) ( 1824 -1112 -568 ) ( 1824 -1112 -576 ) subway/1_tunneltrack_plain 16 -48 0 0.500000 0.500000 0 301989888 0 +( 1752 -648 -536 ) ( 1752 -624 -536 ) ( 1872 -624 -536 ) subway/1_tunnelfloor_2 -7 -8 90 -1 -1 0 285212672 0 +( 1872 -616 -552 ) ( 1752 -616 -552 ) ( 1752 -640 -552 ) subway/1_tunneltrack_plain 16 -16 0 0.500000 0.500000 0 301989888 0 +} +// brush 1769 +{ +( 1744 -1112 -264 ) ( 1680 -1112 -264 ) ( 1680 -1112 -254 ) subway/1_tunneltrack_1 -34 -19 195 1 1 0 16777216 0 +( 1904 -1184 -536 ) ( 1904 -1176 -536 ) ( 1856 -1176 -536 ) subway/metal2 -32 -32 0 0.500000 0.500000 0 16777216 0 +( 1800 -1320 -528 ) ( 1800 -1056 -528 ) ( 1832 -1056 -528 ) subway/metal2 -32 -32 0 0.500000 0.500000 0 16777216 0 +( 1712 -1184 -516 ) ( 1712 -1448 -516 ) ( 1712 -1448 -548 ) subway/metal2 32 -48 0 0.500000 0.500000 0 16777216 0 +( 1904 -344 -536 ) ( 1904 -344 -504 ) ( 1856 -344 -504 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1720 -840 -728 ) ( 1720 -840 -768 ) ( 1720 -848 -768 ) subway/metal2 32 -48 0 0.500000 0.500000 0 16777216 0 +( 1904 -1600 -504 ) ( 1904 -1600 -536 ) ( 1856 -1600 -536 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 1770 +{ +( 1720 128 -512 ) ( 1720 104 -512 ) ( 1720 104 -520 ) subway/1_tunneltrack_1 44 -56 0 1 1 0 16777216 0 +( 1976 -344 -480 ) ( 1856 -344 -480 ) ( 1856 -344 -488 ) subway/1_tunneltrack_1 28 -56 0 1 1 0 16777216 0 +( 1792 88 -520 ) ( 1792 112 -520 ) ( 1792 112 -528 ) subway/1_tunneltrack_1 44 -56 0 1 1 0 16777216 0 +( 1772 -1112 -568 ) ( 1892 -1112 -568 ) ( 1892 -1112 -576 ) subway/1_tunneltrack_1 28 -56 0 1 1 0 16777216 0 +( 1836 -768 -536 ) ( 1836 -744 -536 ) ( 1956 -744 -536 ) subway/1_tunneltrack_1 -12 -24 0 1 1 0 16777216 0 +( 1956 -728 -544 ) ( 1836 -728 -544 ) ( 1836 -752 -544 ) subway/1_tunneltrack_1 28 -24 0 1 1 0 16777216 0 +} +// brush 1771 +{ +( 1800 -1112 -264 ) ( 1760 -1112 -264 ) ( 1760 -1112 -254 ) subway/1_tunneltrack_1 -38 -20 195 1 1 0 16777216 0 +( 1976 -1600 -504 ) ( 1976 -1600 -536 ) ( 1928 -1600 -536 ) subway/metal2 -24 -48 0 0.500000 0.500000 0 16777216 0 +( 1792 -1032 -728 ) ( 1792 -1032 -768 ) ( 1792 -1040 -768 ) subway/metal2 32 -48 0 0.500000 0.500000 0 16777216 0 +( 1976 -344 -536 ) ( 1976 -344 -504 ) ( 1928 -344 -504 ) subway/metal2 -24 -48 0 0.500000 0.500000 0 16777216 0 +( 1784 -480 -516 ) ( 1784 -744 -516 ) ( 1784 -744 -548 ) subway/metal2 32 -48 0 0.500000 0.500000 0 16777216 0 +( 1872 -1320 -528 ) ( 1872 -1056 -528 ) ( 1904 -1056 -528 ) subway/metal2 -24 -32 0 0.500000 0.500000 0 16777216 0 +( 1976 -1184 -536 ) ( 1976 -1176 -536 ) ( 1928 -1176 -536 ) subway/metal2 -24 -32 0 0.500000 0.500000 0 16777216 0 +} +// brush 1772 +{ +( 1784 -488 -520 ) ( 1784 -512 -520 ) ( 1784 -512 -528 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 2016 -344 -480 ) ( 1896 -344 -480 ) ( 1896 -344 -488 ) subway/1_tunneltrack_plain 32 -48 0 0.500000 0.500000 0 301989888 0 +( 1872 -1280 -520 ) ( 1872 -1256 -520 ) ( 1872 -1256 -528 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1816 -1112 -568 ) ( 1936 -1112 -568 ) ( 1936 -1112 -576 ) subway/1_tunneltrack_plain 32 -48 0 0.500000 0.500000 0 301989888 0 +( 1864 -1240 -536 ) ( 1864 -1216 -536 ) ( 1984 -1216 -536 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1960 -1240 -552 ) ( 1840 -1240 -552 ) ( 1840 -1264 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1773 +{ +( 856 -324 -112 ) ( 856 -324 -128 ) ( 872 -324 -128 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 872 -356 -128 ) ( 856 -356 -128 ) ( 856 -356 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 864 -324 -120 ) ( 864 -356 -120 ) ( 872 -356 -120 ) subway/light_small 4 4 90 1 1 134217728 1 3000 +( 872 -296 -112 ) ( 872 -296 -120 ) ( 872 -312 -120 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 864 -356 -120 ) ( 864 -324 -120 ) ( 872 -324 -112 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1774 +{ +( 864 -444 -120 ) ( 864 -412 -120 ) ( 872 -412 -112 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 872 -384 -112 ) ( 872 -384 -120 ) ( 872 -400 -120 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 864 -412 -120 ) ( 864 -444 -120 ) ( 872 -444 -120 ) subway/light_small -4 4 90 1 1 134217728 1 3000 +( 872 -444 -128 ) ( 856 -444 -128 ) ( 856 -444 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 856 -412 -112 ) ( 856 -412 -128 ) ( 872 -412 -128 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1775 +{ +( 1096 992 -136 ) ( 1088 992 -136 ) ( 1088 976 -136 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1088 976 -120 ) ( 1088 992 -120 ) ( 1096 992 -120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1088 976 -120 ) ( 1096 976 -120 ) ( 1096 976 -144 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1096 976 -120 ) ( 1096 992 -120 ) ( 1096 992 -144 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1096 992 -120 ) ( 1088 992 -120 ) ( 1088 992 -144 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1094 992 -120 ) ( 1094 976 -120 ) ( 1094 976 -144 ) subway/light_yellow 0 16 0 0.500000 0.500000 134217728 16777217 12000 +} +// brush 1776 +{ +( 720 720 -52 ) ( 720 696 -52 ) ( 720 696 -60 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 740 720 -52 ) ( 716 720 -52 ) ( 716 720 -60 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 736 700 -52 ) ( 736 724 -52 ) ( 736 724 -60 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 720 704 -52 ) ( 744 704 -52 ) ( 744 704 -60 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 716 696 -56 ) ( 716 720 -56 ) ( 740 720 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 740 720 -60 ) ( 716 720 -60 ) ( 716 696 -60 ) subway/light_yellow 0 0 0 0.500000 0.500000 134217728 16777217 12000 +} +// brush 1777 +{ +( 808 720 -52 ) ( 808 696 -52 ) ( 808 696 -60 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 828 720 -52 ) ( 804 720 -52 ) ( 804 720 -60 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 824 700 -52 ) ( 824 724 -52 ) ( 824 724 -60 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 808 704 -52 ) ( 832 704 -52 ) ( 832 704 -60 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 804 696 -56 ) ( 804 720 -56 ) ( 828 720 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 828 720 -60 ) ( 804 720 -60 ) ( 804 696 -60 ) subway/light_yellow 16 0 0 0.500000 0.500000 134217728 16777217 12000 +} +// brush 1778 +{ +( 992 1224 -116 ) ( 992 1200 -116 ) ( 992 1200 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1012 1224 -116 ) ( 988 1224 -116 ) ( 988 1224 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1008 1204 -116 ) ( 1008 1228 -116 ) ( 1008 1228 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 992 1208 -116 ) ( 1016 1208 -116 ) ( 1016 1208 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 988 1200 -120 ) ( 988 1224 -120 ) ( 1012 1224 -120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1012 1224 -124 ) ( 988 1224 -124 ) ( 988 1200 -124 ) subway/light_yellow 0 -16 0 0.500000 0.500000 134217728 16777217 12000 +} +// brush 1779 +{ +( 1040 720 -92 ) ( 1040 792 -92 ) ( 1000 792 -92 ) subway/light_tube 17 -30 90 0.500000 0.500000 0 1 8000 +( 1000 792 -88 ) ( 1040 792 -88 ) ( 1040 720 -88 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 1008 792 -88 ) ( 1008 720 -88 ) ( 1008 720 -96 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 1000 760 -88 ) ( 1040 760 -88 ) ( 1040 760 -96 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 1024 720 -88 ) ( 1024 792 -88 ) ( 1024 792 -96 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 1044 804 -88 ) ( 1004 804 -88 ) ( 1004 804 -96 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1780 +{ +( 1080 880 -120 ) ( 1144 880 -120 ) ( 1144 944 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 15 +( 1144 960 -88 ) ( 1144 896 -88 ) ( 1080 896 -88 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1096 -128 ) ( 1096 1096 -120 ) ( 1096 1032 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 976 1240 -120 ) ( 976 1240 -112 ) ( 912 1240 -112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 584 -120 ) ( 1200 584 -112 ) ( 1200 648 -112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1152 992 -120 ) ( 1088 992 -120 ) ( 1120 992 -88 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1781 +{ +( 1080 880 -120 ) ( 1144 880 -120 ) ( 1144 944 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 14 +( 1144 960 -88 ) ( 1144 896 -88 ) ( 1080 896 -88 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1096 -128 ) ( 1096 1096 -120 ) ( 1096 1032 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 584 -120 ) ( 1200 584 -112 ) ( 1200 648 -112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1168 664 -120 ) ( 1168 664 -112 ) ( 1232 664 -112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1088 992 -120 ) ( 1152 992 -120 ) ( 1120 992 -88 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1782 +{ +( 1032 1056 -92 ) ( 1032 1128 -92 ) ( 992 1128 -92 ) subway/light_tube -14 -15 90 0.500000 0.500000 0 1 8000 +( 992 1128 -88 ) ( 1032 1128 -88 ) ( 1032 1056 -88 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 1000 1128 -88 ) ( 1000 1056 -88 ) ( 1000 1056 -96 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 992 1096 -88 ) ( 1032 1096 -88 ) ( 1032 1096 -96 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 1016 1056 -88 ) ( 1016 1128 -88 ) ( 1016 1128 -96 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 1032 1140 -88 ) ( 992 1140 -88 ) ( 992 1140 -96 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1783 +{ +( -224 1368 -76 ) ( -224 1368 -92 ) ( -224 1384 -92 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -192 1384 -92 ) ( -192 1368 -92 ) ( -192 1368 -76 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -224 1374 -84 ) ( -192 1374 -84 ) ( -192 1384 -84 ) subway/light_small 0 -5 0 1 1 134217728 1 3000 +( -252 1384 -76 ) ( -252 1384 -84 ) ( -236 1384 -84 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -192 1374 -84 ) ( -224 1374 -84 ) ( -224 1384 -76 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1784 +{ +( 400 1552 0 ) ( 200 1352 0 ) ( 200 1352 10 ) subway/1_concrete_floor 48 16 -180 0.500000 -0.500000 0 285212672 0 +( 400 1448 -152 ) ( 400 1448 -80 ) ( 192 1552 -80 ) subway/1_tile 0 -31 -180 0.500000 -0.500000 0 318767104 0 +( 192 1552 -152 ) ( 192 1552 -80 ) ( 192 1544 -80 ) subway/1_tile -48 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1440 -80 ) ( 400 1440 -152 ) ( 192 1544 -152 ) subway/1_tile 0 -31 -180 0.500000 -0.500000 0 318767104 9 +( 400 1448 -80 ) ( 400 1448 -152 ) ( 400 1440 -152 ) subway/1_tile -16 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1448 -80 ) ( 400 1440 -80 ) ( 192 1544 -80 ) subway/1_tile -63 47 90 0.500000 0.500000 0 318767104 0 +( 400 1440 -152 ) ( 400 1448 -152 ) ( 192 1552 -152 ) subway/1_tile -63 47 90 0.500000 0.500000 0 318767104 0 +} +// brush 1785 +{ +( 112 1534 -92 ) ( 80 1534 -92 ) ( 80 1544 -84 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 52 1544 -84 ) ( 52 1544 -92 ) ( 68 1544 -92 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 80 1534 -92 ) ( 112 1534 -92 ) ( 112 1544 -92 ) subway/light_small -16 -5 0 1 1 134217728 1 3000 +( 112 1544 -100 ) ( 112 1528 -100 ) ( 112 1528 -84 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 80 1528 -84 ) ( 80 1528 -100 ) ( 80 1544 -100 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1786 +{ +( 0 1534 -92 ) ( -32 1534 -92 ) ( -32 1544 -84 ) subway/1_black -1184 -416 0 0.500000 0.500000 134217728 16777216 0 +( -60 1544 -84 ) ( -60 1544 -92 ) ( -44 1544 -92 ) subway/1_black -1184 -104 0 0.500000 0.500000 134217728 16777216 0 +( -32 1534 -92 ) ( 0 1534 -92 ) ( 0 1544 -92 ) subway/light_small -576 -181 0 1 1 134217728 1 3000 +( 0 1544 -100 ) ( 0 1528 -100 ) ( 0 1528 -84 ) subway/1_black 416 -104 0 0.500000 0.500000 134217728 16777216 0 +( -32 1528 -84 ) ( -32 1528 -100 ) ( -32 1544 -100 ) subway/1_black 416 -104 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1787 +{ +( 128 364 -120 ) ( 128 396 -120 ) ( 136 396 -112 ) subway/1_black -1472 -2728 0 0.500000 0.500000 134217728 16777216 0 +( 136 424 -112 ) ( 136 424 -120 ) ( 136 408 -120 ) subway/1_black -1368 -160 0 0.500000 0.500000 134217728 16777216 0 +( 128 396 -120 ) ( 128 364 -120 ) ( 136 364 -120 ) subway/light_small 20 20 90 1 1 134217728 1 3000 +( 136 364 -128 ) ( 120 364 -128 ) ( 120 364 -112 ) subway/1_black 2624 -160 0 0.500000 0.500000 134217728 16777216 0 +( 120 396 -112 ) ( 120 396 -128 ) ( 136 396 -128 ) subway/1_black 2624 -160 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1788 +{ +( 120 484 -112 ) ( 120 484 -128 ) ( 136 484 -128 ) subway/1_black 2624 -160 0 0.500000 0.500000 134217728 16777216 0 +( 136 452 -128 ) ( 120 452 -128 ) ( 120 452 -112 ) subway/1_black 2624 -160 0 0.500000 0.500000 134217728 16777216 0 +( 128 484 -120 ) ( 128 452 -120 ) ( 136 452 -120 ) subway/light_small -68 20 90 1 1 134217728 1 3000 +( 136 512 -112 ) ( 136 512 -120 ) ( 136 496 -120 ) subway/1_black -1544 -160 0 0.500000 0.500000 134217728 16777216 0 +( 128 452 -120 ) ( 128 484 -120 ) ( 136 484 -112 ) subway/1_black -1472 -2552 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1789 +{ +( 1688 1800 -272 ) ( 1688 1760 -272 ) ( 1688 1760 -496 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1832 1792 -272 ) ( 1768 1792 -272 ) ( 1768 1792 -496 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1816 1760 -272 ) ( 1816 1800 -272 ) ( 1816 1800 -496 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1672 1784 -272 ) ( 1736 1784 -272 ) ( 1736 1784 -496 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1768 1760 -256 ) ( 1768 1800 -256 ) ( 1832 1800 -256 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1664 1784 -264 ) ( 1752 1784 -264 ) ( 1708 1792 -264 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1790 +{ +( 1608 2688 -256 ) ( 1616 2688 -256 ) ( 1616 2304 -256 ) subway/1_tile 32 32 0 0.500000 0.500000 0 318767104 0 +( 1824 1952 -256 ) ( 1824 1952 -368 ) ( 1816 1960 -368 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 1824 1952 -368 ) ( 1824 1952 -256 ) ( 1888 1952 -256 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 1960 -360 ) ( 1880 1960 -368 ) ( 1888 1952 -368 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 1896 1960 -368 ) ( 1896 1960 -360 ) ( 1816 1960 -360 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1800 1952 -264 ) ( 1856 1952 -264 ) ( 1828 1960 -264 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1791 +{ +( 1824 1792 -360 ) ( 1824 1872 -360 ) ( 1824 1872 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1816 1960 -368 ) ( 1824 1952 -368 ) ( 1824 1952 -360 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1816 1536 -464 ) ( 1816 1536 -432 ) ( 1816 1528 -432 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2044 1792 -464 ) ( 2044 1792 -432 ) ( 2428 1792 -432 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2168 1672 -256 ) ( 2552 1672 -256 ) ( 2552 1664 -256 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1800 1792 -264 ) ( 1856 1792 -264 ) ( 1828 1960 -264 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1792 +{ +( 2032 2048 -296 ) ( 2032 2056 -296 ) ( 2032 2056 -328 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2000 2024 -328 ) ( 2000 2024 -296 ) ( 2032 2024 -296 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2032 2056 -296 ) ( 2000 2056 -296 ) ( 2000 2056 -328 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2020 2056 -308 ) ( 2032 2024 -296 ) ( 2008 2024 -320 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2024 2056 -312 ) ( 2016 2024 -296 ) ( 2032 2024 -328 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 902 +} +// brush 1793 +{ +( 2000 2048 -296 ) ( 2000 2056 -296 ) ( 2032 2056 -296 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2000 2024 -328 ) ( 2000 2024 -296 ) ( 2032 2024 -296 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2032 2056 -296 ) ( 2000 2056 -296 ) ( 2000 2056 -328 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2020 2056 -308 ) ( 2008 2024 -320 ) ( 2032 2024 -296 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2016 2056 -304 ) ( 2000 2024 -296 ) ( 2032 2024 -312 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 902 +} +// brush 1794 +{ +( 1920 2056 -296 ) ( 1952 2056 -296 ) ( 1952 2048 -296 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1920 2024 -296 ) ( 1952 2024 -296 ) ( 1952 2024 -328 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1952 2056 -328 ) ( 1952 2056 -296 ) ( 1920 2056 -296 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1920 2024 -296 ) ( 1944 2024 -320 ) ( 1932 2056 -308 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1920 2024 -312 ) ( 1952 2024 -296 ) ( 1936 2056 -304 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 902 +} +// brush 1795 +{ +( 1920 2056 -328 ) ( 1920 2056 -296 ) ( 1920 2048 -296 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1920 2024 -296 ) ( 1952 2024 -296 ) ( 1952 2024 -328 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1952 2056 -328 ) ( 1952 2056 -296 ) ( 1920 2056 -296 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1944 2024 -320 ) ( 1920 2024 -296 ) ( 1932 2056 -308 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1920 2024 -328 ) ( 1936 2024 -296 ) ( 1928 2056 -312 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 902 +} +// brush 1796 +{ +( 1656 2448 -336 ) ( 1504 2448 -336 ) ( 1504 2432 -336 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1508 2432 -308 ) ( 1508 2448 -308 ) ( 1660 2448 -308 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1532 2442 -320 ) ( 1684 2442 -320 ) ( 1684 2442 -328 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1692 2432 -320 ) ( 1692 2448 -320 ) ( 1692 2448 -328 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1644 2446 -320 ) ( 1492 2446 -320 ) ( 1492 2446 -328 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1688 2448 -320 ) ( 1688 2432 -320 ) ( 1688 2432 -328 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1797 +{ +( 1844 2448 -336 ) ( 1692 2448 -336 ) ( 1692 2432 -336 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1696 2432 -308 ) ( 1696 2448 -308 ) ( 1848 2448 -308 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1720 2442 -320 ) ( 1872 2442 -320 ) ( 1872 2442 -328 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1880 2432 -320 ) ( 1880 2448 -320 ) ( 1880 2448 -328 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1832 2446 -320 ) ( 1680 2446 -320 ) ( 1680 2446 -328 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1876 2448 -320 ) ( 1876 2432 -320 ) ( 1876 2432 -328 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1798 +{ +( 2232 2264 -164 ) ( 2232 2232 -164 ) ( 2232 2232 -228 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 2252 2264 -164 ) ( 2228 2264 -164 ) ( 2228 2264 -228 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2248 2232 -164 ) ( 2248 2264 -164 ) ( 2248 2264 -228 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 2228 2220 -164 ) ( 2252 2220 -164 ) ( 2252 2220 -228 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2228 2232 -224 ) ( 2228 2264 -224 ) ( 2252 2264 -224 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 2252 2264 -228 ) ( 2228 2264 -228 ) ( 2228 2232 -228 ) subway/light_tube -88 16 90 0.500000 0.500000 134217728 16777217 7000 +} +// brush 1799 +{ +( 2232 2104 -164 ) ( 2232 2072 -164 ) ( 2232 2072 -228 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 2252 2104 -164 ) ( 2228 2104 -164 ) ( 2228 2104 -228 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2248 2072 -164 ) ( 2248 2104 -164 ) ( 2248 2104 -228 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 2228 2060 -164 ) ( 2252 2060 -164 ) ( 2252 2060 -228 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2228 2072 -224 ) ( 2228 2104 -224 ) ( 2252 2104 -224 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 2252 2104 -228 ) ( 2228 2104 -228 ) ( 2228 2072 -228 ) subway/light_tube 104 -15 90 0.500000 0.500000 134217728 16777217 7000 +} +// brush 1800 +{ +( 1688 2440 -344 ) ( 2160 2440 -344 ) ( 2160 2600 -344 ) subway/metalrib1 24 24 90 0.500000 0.500000 0 16777216 0 +( 1560 3048 -336 ) ( 1568 3048 -336 ) ( 1568 2664 -336 ) subway/metalrib1b 16 8 90 0.500000 0.500000 0 16777216 0 +( 1688 2924 -456 ) ( 1688 2540 -456 ) ( 1688 2540 -488 ) subway/metalrib1 24 24 90 0.500000 0.500000 0 16777216 0 +( 2160 2440 -344 ) ( 1688 2440 -344 ) ( 1688 2440 -336 ) subway/2_warning -16 24 90 0.500000 0.500000 0 0 0 +( 1584 2456 -456 ) ( 1576 2456 -456 ) ( 1576 2456 -488 ) subway/metalrib1 24 24 90 0.500000 0.500000 0 16777216 0 +( 1880 2600 -344 ) ( 1880 2576 -344 ) ( 1880 2588 -336 ) subway/metalrib1 24 24 90 0.500000 0.500000 0 16777216 0 +} +// brush 1801 +{ +( 2288 1856 -432 ) ( 2288 1824 -432 ) ( 2288 1824 -440 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2408 1992 -432 ) ( 2312 1992 -432 ) ( 2312 1992 -440 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1888 -432 ) ( 2328 1920 -432 ) ( 2328 1920 -440 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2312 1792 -432 ) ( 2408 1792 -432 ) ( 2408 1792 -440 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2416 1912 -280 ) ( 2320 1912 -280 ) ( 2320 1880 -280 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2328 1792 -264 ) ( 2312 1792 -264 ) ( 2320 1992 -264 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +} +// brush 1802 +{ +( 2288 1856 -432 ) ( 2288 1824 -432 ) ( 2288 1824 -440 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2408 1992 -432 ) ( 2312 1992 -432 ) ( 2312 1992 -440 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2328 1888 -432 ) ( 2328 1920 -432 ) ( 2328 1920 -440 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2312 1792 -432 ) ( 2408 1792 -432 ) ( 2408 1792 -440 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2312 1880 -248 ) ( 2312 1912 -248 ) ( 2408 1912 -248 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2312 1792 -264 ) ( 2328 1792 -264 ) ( 2320 1992 -264 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +} +// brush 1803 +{ +( 2360 1944 -280 ) ( 2264 1944 -280 ) ( 2264 1912 -280 ) subway/1_tile 0 16 903 0.500000 0.500000 0 318767104 0 +( 2264 1960 -424 ) ( 2360 1960 -424 ) ( 2360 1960 -432 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2288 1920 -424 ) ( 2288 1952 -424 ) ( 2288 1952 -432 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2360 1992 -424 ) ( 2264 1992 -424 ) ( 2264 1992 -432 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2192 1944 -424 ) ( 2192 1912 -424 ) ( 2192 1912 -432 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2328 1960 -264 ) ( 2312 1960 -264 ) ( 2320 1992 -264 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1804 +{ +( 2264 1912 -248 ) ( 2264 1944 -248 ) ( 2360 1944 -248 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 2264 1960 -424 ) ( 2360 1960 -424 ) ( 2360 1960 -432 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2288 1920 -424 ) ( 2288 1952 -424 ) ( 2288 1952 -432 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2360 1992 -424 ) ( 2264 1992 -424 ) ( 2264 1992 -432 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2192 1944 -424 ) ( 2192 1912 -424 ) ( 2192 1912 -432 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2312 1960 -264 ) ( 2328 1960 -264 ) ( 2320 1992 -264 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1805 +{ +( 2288 1912 -280 ) ( 2192 1912 -280 ) ( 2192 1880 -280 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2184 1792 -432 ) ( 2280 1792 -432 ) ( 2280 1792 -440 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2192 1888 -432 ) ( 2192 1920 -432 ) ( 2192 1920 -440 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2280 1992 -432 ) ( 2184 1992 -432 ) ( 2184 1992 -440 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2160 1920 -432 ) ( 2160 1888 -432 ) ( 2160 1888 -440 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2328 1792 -264 ) ( 2312 1792 -264 ) ( 2320 1992 -264 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +} +// brush 1806 +{ +( 2192 1880 -248 ) ( 2192 1912 -248 ) ( 2288 1912 -248 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2184 1792 -432 ) ( 2280 1792 -432 ) ( 2280 1792 -440 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2192 1888 -432 ) ( 2192 1920 -432 ) ( 2192 1920 -440 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2280 1992 -432 ) ( 2184 1992 -432 ) ( 2184 1992 -440 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2160 1920 -432 ) ( 2160 1888 -432 ) ( 2160 1888 -440 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2312 1792 -264 ) ( 2328 1792 -264 ) ( 2320 1992 -264 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +} +// brush 1807 +{ +( 2280 1984 -280 ) ( 2280 1992 -280 ) ( 2312 1992 -280 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2280 1960 -312 ) ( 2280 1960 -280 ) ( 2312 1960 -280 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2312 1992 -280 ) ( 2280 1992 -280 ) ( 2280 1992 -312 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2300 1992 -292 ) ( 2288 1960 -304 ) ( 2312 1960 -280 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2296 1992 -288 ) ( 2280 1960 -280 ) ( 2312 1960 -296 ) subway/1_tile 0 16 903 0.500000 0.500000 0 318767104 0 +} +// brush 1808 +{ +( 2312 1984 -280 ) ( 2312 1992 -280 ) ( 2312 1992 -312 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2280 1960 -312 ) ( 2280 1960 -280 ) ( 2312 1960 -280 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2312 1992 -280 ) ( 2280 1992 -280 ) ( 2280 1992 -312 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2300 1992 -292 ) ( 2312 1960 -280 ) ( 2288 1960 -304 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2304 1992 -296 ) ( 2296 1960 -280 ) ( 2312 1960 -312 ) subway/1_tile 0 16 903 0.500000 0.500000 0 318767104 0 +} +// brush 1809 +{ +( 2168 1992 -312 ) ( 2168 1992 -280 ) ( 2168 1984 -280 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2168 1960 -280 ) ( 2200 1960 -280 ) ( 2200 1960 -312 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2200 1992 -312 ) ( 2200 1992 -280 ) ( 2168 1992 -280 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2192 1960 -304 ) ( 2168 1960 -280 ) ( 2180 1992 -292 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2168 1960 -312 ) ( 2184 1960 -280 ) ( 2176 1992 -296 ) subway/1_tile 0 16 903 0.500000 0.500000 0 318767104 0 +} +// brush 1810 +{ +( 2168 1992 -280 ) ( 2200 1992 -280 ) ( 2200 1984 -280 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2168 1960 -280 ) ( 2200 1960 -280 ) ( 2200 1960 -312 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2200 1992 -312 ) ( 2200 1992 -280 ) ( 2168 1992 -280 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2168 1960 -280 ) ( 2192 1960 -304 ) ( 2180 1992 -292 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2168 1960 -296 ) ( 2200 1960 -280 ) ( 2184 1992 -288 ) subway/1_tile 0 16 903 0.500000 0.500000 0 318767104 0 +} +// brush 1811 +{ +( 2040 2024 -224 ) ( 2064 2000 -240 ) ( 2584 2000 -240 ) subway/1_tile 2 -19 -90 0.500000 0.500000 0 318767104 900 +( 2384 1984 -224 ) ( 2544 1984 -224 ) ( 2544 1984 -240 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2080 1984 -224 ) ( 2056 2024 -224 ) ( 2584 2024 -224 ) subway/1_tile_big_green 2 29 -90 0.500000 0.500000 0 369098752 0 +( 2584 1984 -240 ) ( 2584 2000 -240 ) ( 2064 2000 -240 ) subway/1_tile_big_green 2 29 -90 0.500000 0.500000 0 369098752 0 +( 2152 2000 -224 ) ( 2152 1976 -240 ) ( 2152 2024 -240 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +( 2328 1992 -240 ) ( 2328 1976 -240 ) ( 2328 1976 -224 ) subway/1_tile_big_green 16 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 1812 +{ +( 2576 2000 -240 ) ( 2056 2000 -240 ) ( 2064 1992 -256 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 900 +( 2384 1984 -240 ) ( 2560 1984 -240 ) ( 2560 1984 -256 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2336 2080 -256 ) ( 2312 2080 -256 ) ( 2312 2056 -256 ) subway/1_tile_big_green 2 29 -90 0.500000 0.500000 0 369098752 0 +( 2080 1984 -240 ) ( 2060 2000 -240 ) ( 2584 2000 -240 ) subway/1_tile_big_green 2 29 -90 0.500000 0.500000 0 369098752 0 +( 2152 1988 -240 ) ( 2152 1976 -256 ) ( 2152 2000 -256 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +( 2328 1984 -256 ) ( 2328 1976 -256 ) ( 2328 1976 -240 ) subway/1_tile_big_green 16 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 1813 +{ +( 1744 2160 -224 ) ( 1744 2184 -224 ) ( 1720 2184 -224 ) subway/1_tile_bottom -31 16 0 0.500000 0.500000 0 318767104 0 +( 1720 2184 -216 ) ( 1744 2184 -216 ) ( 1744 2160 -216 ) subway/1_tile_big -31 16 90 0.500000 0.500000 0 318767104 0 +( 2272 2040 -216 ) ( 2272 2040 -224 ) ( 2288 2024 -224 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2168 2024 -224 ) ( 2152 2024 -224 ) ( 2160 2024 -216 ) subway/1_tile_big -16 16 -180 0.500000 -0.500000 0 318767104 0 +( 2208 2040 -224 ) ( 2208 2040 -216 ) ( 2192 2024 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2272 2040 -224 ) ( 2272 2040 -216 ) ( 2208 2040 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1814 +{ +( 2320 2104 -384 ) ( 2320 1968 -384 ) ( 2320 1968 -416 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 904 +( 2320 1992 -416 ) ( 2312 1992 -416 ) ( 2312 1992 -384 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2328 2160 -336 ) ( 2328 2160 -384 ) ( 2328 1992 -384 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 2328 2328 -384 ) ( 2328 2328 -336 ) ( 2320 2328 -336 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2248 1968 -336 ) ( 2224 1968 -336 ) ( 2224 1992 -336 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 2216 1992 -384 ) ( 2216 1968 -384 ) ( 2240 1968 -384 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1815 +{ +( 2328 1960 -264 ) ( 2328 2280 -264 ) ( 2320 2272 -264 ) subway/1_tile_top 0 15 90 0.500000 0.500000 0 318767104 0 +( 2416 2352 -256 ) ( 2416 2328 -256 ) ( 2392 2328 -256 ) subway/1_tile_top 0 15 90 0.500000 0.500000 0 318767104 0 +( 2312 2624 -264 ) ( 2320 2624 -264 ) ( 2320 2624 -256 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 2320 1992 -336 ) ( 2320 2320 -336 ) ( 2320 2320 -256 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 904 +( 2384 1992 -352 ) ( 2408 1992 -352 ) ( 2408 1992 -400 ) subway/1_tile_top -16 0 -180 0.500000 -0.500000 0 318767104 0 +( 2328 1992 -256 ) ( 2328 2176 -256 ) ( 2328 2176 -264 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1816 +{ +( 2328 1960 -320 ) ( 2328 2280 -320 ) ( 2320 2272 -320 ) subway/1_tile_big -15 15 90 0.500000 0.500000 0 318767104 0 +( 2416 2344 -264 ) ( 2416 2320 -264 ) ( 2392 2320 -264 ) subway/1_tile_big -15 15 90 0.500000 0.500000 0 318767104 0 +( 2312 2624 -320 ) ( 2320 2624 -320 ) ( 2320 2624 -264 ) subway/1_tile_big -16 16 -180 0.500000 -0.500000 0 318767104 0 +( 2320 1992 -336 ) ( 2320 2320 -336 ) ( 2320 2320 -256 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 904 +( 2384 1992 -352 ) ( 2408 1992 -352 ) ( 2408 1992 -400 ) subway/1_tile_big 0 16 -180 0.500000 -0.500000 0 318767104 0 +( 2328 1992 -264 ) ( 2328 2176 -264 ) ( 2328 2176 -320 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1817 +{ +( 2328 1968 -336 ) ( 2328 2288 -336 ) ( 2320 2280 -336 ) subway/1_tile_bottom 0 0 90 0.500000 0.500000 0 318767104 0 +( 2416 2344 -320 ) ( 2416 2320 -320 ) ( 2392 2320 -320 ) subway/1_tile_bottom 0 0 90 0.500000 0.500000 0 318767104 0 +( 2312 2624 -336 ) ( 2320 2624 -336 ) ( 2320 2624 -320 ) subway/1_tile_bottom 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 2320 1992 -352 ) ( 2320 2320 -352 ) ( 2320 2320 -272 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 904 +( 2384 1992 -368 ) ( 2408 1992 -368 ) ( 2408 1992 -416 ) subway/1_tile_bottom -16 0 -180 0.500000 -0.500000 0 318767104 0 +( 2328 1992 -320 ) ( 2328 2176 -320 ) ( 2328 2176 -336 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1818 +{ +( 2312 2624 -240 ) ( 2312 2104 -240 ) ( 2320 2112 -256 ) subway/1_tile -32 16 -180 0.500000 -0.500000 0 318767104 904 +( 2328 2144 -240 ) ( 2328 2320 -240 ) ( 2328 2320 -256 ) subway/1_tile_big_green 0 16 -180 0.500000 -0.500000 0 369098752 0 +( 2232 2096 -256 ) ( 2232 2072 -256 ) ( 2256 2072 -256 ) subway/1_tile_big_green 18 -2 -180 0.500000 0.500000 0 369098752 0 +( 2328 1840 -240 ) ( 2312 1820 -240 ) ( 2312 2344 -240 ) subway/1_tile_big_green 18 -2 -180 0.500000 0.500000 0 369098752 0 +( 2324 1992 -240 ) ( 2336 1992 -256 ) ( 2312 1992 -256 ) subway/1_tile_big_green 16 0 -180 0.500000 -0.500000 0 369098752 0 +( 2312 2624 -256 ) ( 2320 2624 -256 ) ( 2320 2624 -240 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 1819 +{ +( 2288 1800 -224 ) ( 2312 1824 -240 ) ( 2312 2344 -240 ) subway/1_tile 18 45 -180 0.500000 0.500000 0 318767104 904 +( 2328 2144 -224 ) ( 2328 2304 -224 ) ( 2328 2304 -240 ) subway/1_tile_big_green 0 16 -180 0.500000 -0.500000 0 369098752 0 +( 2328 1840 -224 ) ( 2288 1816 -224 ) ( 2288 2344 -224 ) subway/1_tile_big_green 18 -2 -180 0.500000 0.500000 0 369098752 0 +( 2328 2344 -240 ) ( 2312 2344 -240 ) ( 2312 1824 -240 ) subway/1_tile_big_green 18 -2 -180 0.500000 0.500000 0 369098752 0 +( 2312 1992 -224 ) ( 2336 1992 -240 ) ( 2288 1992 -240 ) subway/1_tile_big_green 16 0 -180 0.500000 -0.500000 0 369098752 0 +( 2304 2624 -240 ) ( 2320 2624 -240 ) ( 2320 2624 -224 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 1820 +{ +( 2160 2280 -336 ) ( 2152 2288 -336 ) ( 2152 1968 -336 ) subway/1_tile_bottom 0 0 90 0.500000 0.500000 0 318767104 0 +( 2088 2320 -320 ) ( 2064 2320 -320 ) ( 2064 2344 -320 ) subway/1_tile_bottom 0 0 90 0.500000 0.500000 0 318767104 0 +( 2152 2448 -320 ) ( 2152 2448 -336 ) ( 2160 2456 -336 ) subway/1_tile_bottom 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 2160 2248 -272 ) ( 2160 2248 -352 ) ( 2160 1920 -352 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 905 +( 2072 2144 -416 ) ( 2072 2144 -368 ) ( 2096 2144 -368 ) subway/1_tile_bottom -16 0 -180 0.500000 -0.500000 0 318767104 0 +( 2152 2448 -336 ) ( 2152 2448 -320 ) ( 2152 2144 -320 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1821 +{ +( 2160 2272 -320 ) ( 2152 2280 -320 ) ( 2152 1960 -320 ) subway/1_tile_big 16 16 90 0.500000 0.500000 0 318767104 0 +( 2088 2320 -264 ) ( 2064 2320 -264 ) ( 2064 2344 -264 ) subway/1_tile_big 16 16 90 0.500000 0.500000 0 318767104 0 +( 2152 2448 -264 ) ( 2152 2448 -320 ) ( 2160 2456 -320 ) subway/1_tile_big -16 16 -180 0.500000 -0.500000 0 318767104 0 +( 2160 2248 -256 ) ( 2160 2248 -336 ) ( 2160 1920 -336 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 905 +( 2072 2088 -400 ) ( 2072 2088 -352 ) ( 2096 2088 -352 ) subway/1_tile_big 0 16 -180 0.500000 -0.500000 0 318767104 0 +( 2152 2448 -320 ) ( 2152 2448 -264 ) ( 2152 2088 -264 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1822 +{ +( 2160 2272 -264 ) ( 2152 2280 -264 ) ( 2152 1960 -264 ) subway/1_tile_top 0 0 90 0.500000 0.500000 0 318767104 0 +( 2088 2328 -256 ) ( 2064 2328 -256 ) ( 2064 2352 -256 ) subway/1_tile_top 0 0 90 0.500000 0.500000 0 318767104 0 +( 2152 2448 -256 ) ( 2152 2448 -264 ) ( 2160 2456 -264 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 2160 2248 -256 ) ( 2160 2248 -336 ) ( 2160 1920 -336 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 905 +( 2088 1992 -400 ) ( 2088 1992 -352 ) ( 2112 1992 -352 ) subway/1_tile_top -16 0 -180 0.500000 -0.500000 0 318767104 0 +( 2152 2448 -264 ) ( 2152 2448 -256 ) ( 2152 1992 -256 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1823 +{ +( 2162 2180 -352 ) ( 2162 2176 -352 ) ( 2162 2176 -376 ) subway/metal2 0 48 -180 0.500000 -0.500000 134217728 16777216 0 +( 2166 2176 -376 ) ( 2166 2176 -352 ) ( 2166 2180 -352 ) subway/metal2 0 48 -180 0.500000 -0.500000 134217728 16777216 0 +( 2160 2180 -376 ) ( 2168 2180 -376 ) ( 2168 2180 -352 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 2160 2176 -376 ) ( 2168 2176 -376 ) ( 2168 2180 -376 ) subway/metal2 -15 -15 -90 0.500000 0.500000 134217728 16777216 0 +( 2160 2176 -348 ) ( 2168 2176 -348 ) ( 2168 2176 -372 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 2160 2180 -348 ) ( 2168 2180 -348 ) ( 2168 2176 -348 ) subway/metal2 -15 -15 -90 0.500000 0.500000 134217728 16777216 0 +( 2442 2176 -352 ) ( 2432 2176 -352 ) ( 2432 2188 -348 ) subway/metal2 -15 -15 -90 0.500000 0.500000 134217728 16777216 0 +( 2442 2188 -372 ) ( 2432 2188 -372 ) ( 2432 2176 -376 ) subway/metal2 -15 -15 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1824 +{ +( 2168 2296 -312 ) ( 2168 2176 -352 ) ( 2160 2176 -352 ) subway/bars2 -15 -15 -90 0.500000 0.500000 134217728 16779264 0 +( 2160 2180 -312 ) ( 2168 2180 -312 ) ( 2168 2180 -336 ) subway/bars2 0 48 0 0.500000 0.500000 134217728 16779264 0 +( 2160 2296 -336 ) ( 2160 2176 -376 ) ( 2168 2176 -376 ) subway/bars2 -15 -15 -90 0.500000 0.500000 134217728 16779264 0 +( 2160 2296 -296 ) ( 2168 2296 -296 ) ( 2168 2296 -272 ) subway/bars2 0 48 0 0.500000 0.500000 134217728 16779264 0 +( 2166 2296 -336 ) ( 2166 2176 -376 ) ( 2166 2176 -352 ) subway/bars2 0 48 -180 0.500000 -0.500000 134217728 16779264 0 +( 2162 2296 -312 ) ( 2162 2176 -352 ) ( 2162 2176 -376 ) subway/bars2 0 48 -180 0.500000 -0.500000 134217728 16779264 0 +( 2442 2292 -316 ) ( 2432 2292 -316 ) ( 2432 2292 -344 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1825 +{ +( 2162 2296 -312 ) ( 2162 2292 -312 ) ( 2162 2292 -336 ) subway/metal2 0 48 -180 0.500000 -0.500000 134217728 16777216 0 +( 2166 2292 -336 ) ( 2166 2292 -312 ) ( 2166 2296 -312 ) subway/metal2 0 48 -180 0.500000 -0.500000 134217728 16777216 0 +( 2160 2296 -336 ) ( 2168 2296 -336 ) ( 2168 2296 -312 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 2160 2292 -340 ) ( 2168 2292 -340 ) ( 2168 2296 -340 ) subway/metal2 -15 -15 -90 0.500000 0.500000 134217728 16777216 0 +( 2160 2292 -312 ) ( 2168 2292 -312 ) ( 2168 2292 -336 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 2160 2296 -312 ) ( 2168 2296 -312 ) ( 2168 2292 -312 ) subway/metal2 -15 -15 -90 0.500000 0.500000 134217728 16777216 0 +( 2442 2284 -316 ) ( 2432 2284 -316 ) ( 2432 2296 -312 ) subway/metal2 -15 -15 -90 0.500000 0.500000 134217728 16777216 0 +( 2442 2296 -336 ) ( 2432 2296 -336 ) ( 2432 2284 -340 ) subway/metal2 -15 -15 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1826 +{ +( 2160 2296 -288 ) ( 2160 2176 -328 ) ( 2160 2176 -352 ) subway/metal2 0 48 -180 0.500000 -0.500000 134217728 16777216 0 +( 2168 2296 -312 ) ( 2168 2176 -352 ) ( 2168 2176 -328 ) subway/metal2 0 48 -180 0.500000 -0.500000 134217728 16777216 0 +( 2160 2296 -272 ) ( 2168 2296 -272 ) ( 2168 2296 -248 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( 2160 2296 -312 ) ( 2160 2176 -352 ) ( 2168 2176 -352 ) subway/metal2 -15 -15 -90 0.500000 0.500000 134217728 16777216 0 +( 2160 2176 -288 ) ( 2168 2176 -288 ) ( 2168 2176 -312 ) subway/1_concrete_floor -12 1 90 0.500000 0.500000 134217728 16777216 0 +( 2168 2296 -308 ) ( 2168 2176 -348 ) ( 2160 2176 -348 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1827 +{ +( 2168 2176 -376 ) ( 2168 2208 -376 ) ( 2168 2208 -384 ) subway/metal2 0 48 -180 0.500000 -0.500000 0 16777216 0 +( 2056 2176 -376 ) ( 2152 2176 -376 ) ( 2152 2176 -384 ) subway/metal2 0 48 0 0.500000 0.500000 0 16777216 0 +( 2160 2216 -376 ) ( 2160 2184 -376 ) ( 2160 2184 -384 ) subway/metal2 0 48 -180 0.500000 -0.500000 0 16777216 0 +( 2168 2296 -336 ) ( 2160 2296 -336 ) ( 2160 2296 -384 ) subway/metal2 0 48 0 0.500000 0.500000 0 16777216 0 +( 2160 2296 -336 ) ( 2168 2296 -336 ) ( 2168 2176 -376 ) subway/metal2 -15 -15 -90 0.500000 0.500000 0 16777216 0 +( 2056 2176 -384 ) ( 2152 2176 -384 ) ( 2152 2208 -384 ) subway/metal2 -15 -15 -90 0.500000 0.500000 0 16777216 0 +} +// brush 1828 +{ +( 2320 2176 -376 ) ( 2320 2208 -376 ) ( 2320 2208 -384 ) subway/metal2 0 48 -180 0.500000 -0.500000 0 16777216 0 +( 2208 2176 -376 ) ( 2304 2176 -376 ) ( 2304 2176 -384 ) subway/metal2 16 48 0 0.500000 0.500000 0 16777216 0 +( 2312 2216 -376 ) ( 2312 2184 -376 ) ( 2312 2184 -384 ) subway/metal2 0 48 -180 0.500000 -0.500000 0 16777216 0 +( 2320 2296 -336 ) ( 2312 2296 -336 ) ( 2312 2296 -384 ) subway/metal2 16 48 0 0.500000 0.500000 0 16777216 0 +( 2312 2296 -336 ) ( 2320 2296 -336 ) ( 2320 2176 -376 ) subway/metal2 -15 -32 -90 0.500000 0.500000 0 16777216 0 +( 2208 2176 -384 ) ( 2304 2176 -384 ) ( 2304 2208 -384 ) subway/metal2 -15 -32 -90 0.500000 0.500000 0 16777216 0 +} +// brush 1829 +{ +( 2312 2296 -288 ) ( 2312 2176 -328 ) ( 2312 2176 -352 ) subway/metal2 0 48 -180 0.500000 -0.500000 134217728 16777216 0 +( 2320 2296 -312 ) ( 2320 2176 -352 ) ( 2320 2176 -328 ) subway/metal2 0 48 -180 0.500000 -0.500000 134217728 16777216 0 +( 2312 2296 -272 ) ( 2320 2296 -272 ) ( 2320 2296 -248 ) subway/metal2 16 48 0 0.500000 0.500000 134217728 16777216 0 +( 2312 2296 -312 ) ( 2312 2176 -352 ) ( 2320 2176 -352 ) subway/metal2 -15 -32 -90 0.500000 0.500000 134217728 16777216 0 +( 2312 2176 -288 ) ( 2320 2176 -288 ) ( 2320 2176 -312 ) subway/1_concrete_floor -12 1 90 0.500000 0.500000 134217728 16777216 0 +( 2320 2296 -308 ) ( 2320 2176 -348 ) ( 2312 2176 -348 ) subway/1_concrete_floor -15 0 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1830 +{ +( 2314 2296 -312 ) ( 2314 2292 -312 ) ( 2314 2292 -336 ) subway/metal2 0 48 -180 0.500000 -0.500000 134217728 16777216 0 +( 2318 2292 -336 ) ( 2318 2292 -312 ) ( 2318 2296 -312 ) subway/metal2 0 48 -180 0.500000 -0.500000 134217728 16777216 0 +( 2312 2296 -336 ) ( 2320 2296 -336 ) ( 2320 2296 -312 ) subway/metal2 16 48 0 0.500000 0.500000 134217728 16777216 0 +( 2312 2292 -340 ) ( 2320 2292 -340 ) ( 2320 2296 -340 ) subway/metal2 -15 -32 -90 0.500000 0.500000 134217728 16777216 0 +( 2312 2292 -312 ) ( 2320 2292 -312 ) ( 2320 2292 -336 ) subway/metal2 16 48 0 0.500000 0.500000 134217728 16777216 0 +( 2312 2296 -312 ) ( 2320 2296 -312 ) ( 2320 2292 -312 ) subway/metal2 -15 -32 -90 0.500000 0.500000 134217728 16777216 0 +( 2594 2284 -316 ) ( 2584 2284 -316 ) ( 2584 2296 -312 ) subway/metal2 -15 -32 -90 0.500000 0.500000 134217728 16777216 0 +( 2594 2296 -336 ) ( 2584 2296 -336 ) ( 2584 2284 -340 ) subway/metal2 -15 -32 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1831 +{ +( 2320 2296 -312 ) ( 2320 2176 -352 ) ( 2312 2176 -352 ) subway/bars2 -15 -32 -90 0.500000 0.500000 134217728 16779264 0 +( 2312 2180 -312 ) ( 2320 2180 -312 ) ( 2320 2180 -336 ) subway/bars2 16 48 0 0.500000 0.500000 134217728 16779264 0 +( 2312 2296 -336 ) ( 2312 2176 -376 ) ( 2320 2176 -376 ) subway/bars2 -15 -32 -90 0.500000 0.500000 134217728 16779264 0 +( 2312 2296 -296 ) ( 2320 2296 -296 ) ( 2320 2296 -272 ) subway/bars2 16 48 0 0.500000 0.500000 134217728 16779264 0 +( 2318 2296 -336 ) ( 2318 2176 -376 ) ( 2318 2176 -352 ) subway/bars2 0 48 -180 0.500000 -0.500000 134217728 16779264 0 +( 2314 2296 -312 ) ( 2314 2176 -352 ) ( 2314 2176 -376 ) subway/bars2 0 48 -180 0.500000 -0.500000 134217728 16779264 0 +( 2594 2292 -316 ) ( 2584 2292 -316 ) ( 2584 2292 -344 ) subway/metal2 16 48 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1832 +{ +( 2314 2180 -352 ) ( 2314 2176 -352 ) ( 2314 2176 -376 ) subway/metal2 0 48 -180 0.500000 -0.500000 134217728 16777216 0 +( 2318 2176 -376 ) ( 2318 2176 -352 ) ( 2318 2180 -352 ) subway/metal2 0 48 -180 0.500000 -0.500000 134217728 16777216 0 +( 2312 2180 -376 ) ( 2320 2180 -376 ) ( 2320 2180 -352 ) subway/metal2 16 48 0 0.500000 0.500000 134217728 16777216 0 +( 2312 2176 -376 ) ( 2320 2176 -376 ) ( 2320 2180 -376 ) subway/metal2 -15 -32 -90 0.500000 0.500000 134217728 16777216 0 +( 2312 2176 -348 ) ( 2320 2176 -348 ) ( 2320 2176 -372 ) subway/metal2 16 48 0 0.500000 0.500000 134217728 16777216 0 +( 2312 2180 -348 ) ( 2320 2180 -348 ) ( 2320 2176 -348 ) subway/metal2 -15 -32 -90 0.500000 0.500000 134217728 16777216 0 +( 2594 2176 -352 ) ( 2584 2176 -352 ) ( 2584 2188 -348 ) subway/metal2 -15 -32 -90 0.500000 0.500000 134217728 16777216 0 +( 2594 2188 -372 ) ( 2584 2188 -372 ) ( 2584 2176 -376 ) subway/metal2 -15 -32 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1833 +{ +( 1688 2456 -344 ) ( 2160 2456 -344 ) ( 2160 2616 -344 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1560 3064 -336 ) ( 1568 3064 -336 ) ( 1568 2680 -336 ) subway/1_concrete_floor 32 48 0 0.500000 0.500000 0 285212672 0 +( 1688 2940 -456 ) ( 1688 2556 -456 ) ( 1688 2556 -488 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2160 2456 -344 ) ( 1688 2456 -344 ) ( 1688 2456 -336 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1576 2616 -456 ) ( 1568 2616 -456 ) ( 1568 2616 -488 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2032 2616 -344 ) ( 2032 2592 -344 ) ( 2032 2604 -336 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1834 +{ +( 1936 2040 -224 ) ( 1912 2040 -224 ) ( 1912 2016 -224 ) subway/1_tile_bottom 16 16 -90 0.500000 0.500000 0 318767104 0 +( 1912 2016 -216 ) ( 1912 2040 -216 ) ( 1936 2040 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1736 2008 -216 ) ( 1736 2008 -224 ) ( 1720 1992 -224 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1720 2112 -232 ) ( 1720 2088 -232 ) ( 1720 2088 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1736 2008 -224 ) ( 1736 2008 -216 ) ( 1736 2448 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1720 2584 -224 ) ( 1736 2568 -224 ) ( 1728 2576 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1835 +{ +( 1720 2472 -224 ) ( 1696 2448 -240 ) ( 1696 1928 -240 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1680 1984 -256 ) ( 1680 2432 -256 ) ( 1680 2432 -224 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1736 1928 -288 ) ( 1736 1928 -240 ) ( 1760 1928 -240 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1680 2432 -224 ) ( 1720 2456 -224 ) ( 1720 1928 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1680 1928 -240 ) ( 1696 1928 -240 ) ( 1696 2448 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1680 2624 -240 ) ( 1688 2616 -240 ) ( 1684 2620 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1836 +{ +( 1872 1928 -240 ) ( 1872 2448 -240 ) ( 1848 2472 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1888 2432 -224 ) ( 1888 2432 -256 ) ( 1888 1984 -256 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1808 1928 -240 ) ( 1832 1928 -240 ) ( 1832 1928 -288 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1848 1928 -224 ) ( 1848 2456 -224 ) ( 1888 2432 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1872 2448 -240 ) ( 1872 1928 -240 ) ( 1888 1928 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1848 2488 -240 ) ( 1856 2480 -240 ) ( 1852 2484 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1837 +{ +( 1880 2472 -256 ) ( 1872 2480 -240 ) ( 1872 1960 -240 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1888 2432 -224 ) ( 1888 2432 -256 ) ( 1888 1984 -256 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1808 1928 -240 ) ( 1832 1928 -240 ) ( 1832 1928 -288 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1816 2200 -256 ) ( 1792 2200 -256 ) ( 1792 2176 -256 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1872 1928 -240 ) ( 1872 2452 -240 ) ( 1888 2432 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1848 2488 -256 ) ( 1856 2480 -256 ) ( 1852 2484 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1838 +{ +( 1880 1960 -256 ) ( 1880 1960 -328 ) ( 1880 2456 -328 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2456 -256 ) ( 1880 2456 -368 ) ( 1888 2448 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2336 -352 ) ( 1888 2360 -352 ) ( 1888 2360 -400 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 1944 -328 ) ( 1880 1944 -256 ) ( 1888 1936 -256 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1872 2240 -320 ) ( 1872 2144 -320 ) ( 1896 2240 -320 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1888 1936 -264 ) ( 1880 1936 -264 ) ( 1884 2456 -264 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1839 +{ +( 1880 1960 -256 ) ( 1880 1960 -328 ) ( 1880 2456 -328 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1880 2456 -256 ) ( 1880 2456 -368 ) ( 1888 2448 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2336 -352 ) ( 1888 2360 -352 ) ( 1888 2360 -400 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 1944 -328 ) ( 1880 1944 -256 ) ( 1888 1936 -256 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1792 2176 -256 ) ( 1792 2200 -256 ) ( 1816 2200 -256 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1880 1936 -264 ) ( 1888 1936 -264 ) ( 1884 2456 -264 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1840 +{ +( 1680 2152 -352 ) ( 1680 2128 -352 ) ( 1680 2128 -400 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1624 2440 -352 ) ( 1600 2440 -352 ) ( 1600 2440 -400 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1688 2336 -352 ) ( 1688 2360 -352 ) ( 1688 2360 -400 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1600 1792 -352 ) ( 1624 1792 -352 ) ( 1624 1792 -400 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1592 2176 -256 ) ( 1592 2200 -256 ) ( 1616 2200 -256 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +( 1672 1792 -264 ) ( 1704 1792 -264 ) ( 1688 2440 -264 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1841 +{ +( 1936 2040 -224 ) ( 1912 2040 -224 ) ( 1912 2016 -224 ) subway/1_tile_bottom 16 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2016 -216 ) ( 1912 2040 -216 ) ( 1936 2040 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1960 1992 -232 ) ( 1984 1992 -232 ) ( 1984 1992 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1832 2008 -216 ) ( 1832 2008 -224 ) ( 1848 1992 -224 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1736 2008 -224 ) ( 1736 2008 -216 ) ( 1720 1992 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1832 2008 -224 ) ( 1832 2008 -216 ) ( 1736 2008 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1842 +{ +( 1936 2040 -224 ) ( 1912 2040 -224 ) ( 1912 2016 -224 ) subway/1_tile_bottom 16 16 90 0.500000 0.500000 0 318767104 0 +( 1912 2016 -216 ) ( 1912 2040 -216 ) ( 1936 2040 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1832 2008 -224 ) ( 1832 2008 -216 ) ( 1848 1992 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1848 2400 -240 ) ( 1848 2424 -240 ) ( 1848 2424 -288 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1832 2504 -216 ) ( 1832 2504 -224 ) ( 1848 2488 -224 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1832 2504 -224 ) ( 1832 2504 -216 ) ( 1832 2008 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1843 +{ +( -1384 1588 -328 ) ( -1384 1468 -328 ) ( -1384 1468 -336 ) subway/1_tunnelwall 8 48 0 1 1 0 301989888 0 +( -992 1728 -280 ) ( -968 1728 -280 ) ( -968 1728 -288 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 320 1408 -240 ) ( 320 1528 -240 ) ( 320 1528 -248 ) subway/1_tunnelwall 8 48 0 1 1 0 301989888 0 +( 568 1736 -272 ) ( 544 1736 -272 ) ( 544 1736 -280 ) subway/1_tunnelwall 0 48 0 1 1 0 301989888 0 +( -1400 1728 -272 ) ( -1336 1728 -272 ) ( -1368 1736 -272 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +( -1344 1728 -240 ) ( -1392 1728 -240 ) ( -1368 1736 -240 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +} +// brush 1844 +{ +( -1384 1588 -328 ) ( -1384 1468 -328 ) ( -1384 1468 -336 ) subway/1_tunnelwall 8 48 0 1 1 0 301989888 0 +( -800 1728 -280 ) ( -776 1728 -280 ) ( -776 1728 -288 ) subway/1_tunnelwall_pipe 0 32 0 0.500000 0.500000 0 16777216 0 +( 320 1408 -240 ) ( 320 1528 -240 ) ( 320 1528 -248 ) subway/1_tunnelwall 8 48 0 1 1 0 301989888 0 +( 376 1736 -272 ) ( 352 1736 -272 ) ( 352 1736 -280 ) subway/1_tunnelwall 0 48 0 1 1 0 301989888 0 +( -1376 1728 -208 ) ( -1392 1728 -208 ) ( -1384 1736 -208 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +( -1392 1728 -240 ) ( -1344 1728 -240 ) ( -1368 1736 -240 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +} +// brush 1845 +{ +( 336 1420 -288 ) ( 336 1540 -288 ) ( 312 1540 -288 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +( -1384 1588 -312 ) ( -1384 1468 -312 ) ( -1384 1468 -320 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( -992 1728 -264 ) ( -968 1728 -264 ) ( -968 1728 -272 ) subway/1_tunnelwall_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 320 1408 -224 ) ( 320 1528 -224 ) ( 320 1528 -232 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 568 1736 -256 ) ( 544 1736 -256 ) ( 544 1736 -264 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( -1336 1728 -272 ) ( -1400 1728 -272 ) ( -1368 1736 -272 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +} +// brush 1846 +{ +( 296 1540 -120 ) ( 320 1540 -120 ) ( 320 1420 -120 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +( -1384 1588 -328 ) ( -1384 1468 -328 ) ( -1384 1468 -336 ) subway/1_tunnelwall 8 48 0 1 1 0 301989888 0 +( -800 1728 -280 ) ( -776 1728 -280 ) ( -776 1728 -288 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 320 1408 -240 ) ( 320 1528 -240 ) ( 320 1528 -248 ) subway/1_tunnelwall 8 48 0 1 1 0 301989888 0 +( 376 1736 -272 ) ( 352 1736 -272 ) ( 352 1736 -280 ) subway/1_tunnelwall 0 48 0 1 1 0 301989888 0 +( -1392 1728 -208 ) ( -1376 1728 -208 ) ( -1384 1736 -208 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +} +// brush 1847 +{ +( -1256 1696 -280 ) ( -1256 1696 -272 ) ( -1232 1696 -272 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( -64 1824 -240 ) ( -64 1824 -232 ) ( -64 1944 -232 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( -224 1728 -288 ) ( -880 1728 -288 ) ( -880 1728 -304 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( -1384 1688 -304 ) ( -1384 1720 -304 ) ( -1384 1720 -288 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( -1144 1896 -288 ) ( -1144 1776 -288 ) ( -1168 1776 -288 ) subway/1_tunnelfloor_2 24 0 0 1 -1 0 285212672 0 +( -1192 1752 -304 ) ( -1168 1752 -304 ) ( -1168 1872 -304 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1848 +{ +( -936 1672 -104 ) ( -936 1608 -104 ) ( -936 1608 -112 ) subway/1_concrete_floor -2560 -32 0 0.500000 0.500000 0 285212672 0 +( -640 1752 -96 ) ( -704 1752 -96 ) ( -704 1752 -104 ) subway/1_concrete_floor 944 -32 0 0.500000 0.500000 0 285212672 0 +( -696 1792 -104 ) ( -696 1856 -104 ) ( -696 1856 -112 ) subway/1_concrete_floor -2560 -32 0 0.500000 0.500000 0 285212672 0 +( -664 1568 -104 ) ( -600 1568 -104 ) ( -600 1568 -112 ) subway/1_stair_side1 944 0 0 0.500000 0.500000 0 285212672 0 +( -736 1632 -112 ) ( -736 1696 -112 ) ( -672 1696 -112 ) subway/1_concrete_floor 944 2544 0 0.500000 0.500000 0 285212672 0 +( -672 1696 -120 ) ( -736 1696 -120 ) ( -736 1632 -120 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 1849 +{ +( -1304 1496 -256 ) ( -1304 1496 -288 ) ( -1304 1544 -288 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -552 1688 -480 ) ( -552 1688 -520 ) ( -560 1688 -520 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 288 1496 -288 ) ( 288 1496 -256 ) ( 288 1544 -256 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -408 1696 -268 ) ( -672 1696 -268 ) ( -672 1696 -300 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -544 1608 -280 ) ( -280 1608 -280 ) ( -280 1576 -280 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +( -408 1504 -288 ) ( -400 1504 -288 ) ( -400 1552 -288 ) subway/metal2 0 48 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1850 +{ +( -408 1428 -288 ) ( -400 1428 -288 ) ( -400 1476 -288 ) subway/metal2 24 48 0 0.500000 0.500000 134217728 16777216 0 +( -544 1532 -280 ) ( -280 1532 -280 ) ( -280 1500 -280 ) subway/metal2 24 48 0 0.500000 0.500000 134217728 16777216 0 +( 272 1620 -268 ) ( 8 1620 -268 ) ( 8 1620 -300 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 288 1436 -288 ) ( 288 1436 -256 ) ( 288 1484 -256 ) subway/metal2 -24 0 0 0.500000 0.500000 134217728 16777216 0 +( -1016 1612 -480 ) ( -1016 1612 -520 ) ( -1024 1612 -520 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1304 1428 -256 ) ( -1304 1428 -288 ) ( -1304 1476 -288 ) subway/metal2 -24 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1851 +{ +( 472 -480 -344 ) ( 472 -560 -344 ) ( 472 -560 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 480 -488 -344 ) ( 472 -488 -344 ) ( 472 -488 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 480 -552 -344 ) ( 480 -472 -344 ) ( 480 -472 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 472 -552 -344 ) ( 480 -552 -344 ) ( 480 -552 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 472 -560 -352 ) ( 472 -480 -352 ) ( 480 -480 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 480 -480 -356 ) ( 472 -480 -356 ) ( 472 -560 -356 ) subway/1_florescent -1 0 0 0.500000 0.500000 134217728 1 9000 +} +// brush 1852 +{ +( 1220 296 -504 ) ( 1220 272 -504 ) ( 1340 272 -504 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 1124 -112 -488 ) ( 1124 -80 -488 ) ( 1140 -80 -488 ) subway/metalfloor1 16 0 0 0.500000 0.500000 134217728 0 0 +( 1276 816 -560 ) ( 1276 816 -552 ) ( 1156 816 -552 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 1140 -64 -512 ) ( 1140 -64 -504 ) ( 1140 -40 -504 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 134217728 0 0 +( 1220 -104 -440 ) ( 1220 -104 -432 ) ( 1340 -104 -432 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 1124 -56 -496 ) ( 1124 -56 -488 ) ( 1124 -80 -488 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 134217728 0 0 +( 1140 -80 -504 ) ( 1140 -88 -488 ) ( 1124 -88 -488 ) subway/light_orange 24 16 0 0.500000 0.500000 0 16777217 12000 +} +// brush 1853 +{ +( 764 -1224 -504 ) ( 764 -1232 -488 ) ( 748 -1232 -488 ) subway/light_orange 8 16 0 0.500000 0.500000 134217728 16777217 12000 +( 748 -1200 -496 ) ( 748 -1200 -488 ) ( 748 -1224 -488 ) subway/1_tunnelwall 384 32 0 0.500000 0.500000 134217728 0 0 +( 844 -1248 -440 ) ( 844 -1248 -432 ) ( 964 -1248 -432 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 764 -1208 -512 ) ( 764 -1208 -504 ) ( 764 -1184 -504 ) subway/1_tunnelwall 384 32 0 0.500000 0.500000 134217728 0 0 +( 900 -328 -560 ) ( 900 -328 -552 ) ( 780 -328 -552 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 748 -1256 -488 ) ( 748 -1224 -488 ) ( 764 -1224 -488 ) subway/metalfloor1 16 -384 0 0.500000 0.500000 134217728 0 0 +( 844 -848 -504 ) ( 844 -872 -504 ) ( 964 -872 -504 ) subway/1_tunnelwall 16 -352 0 0.500000 0.500000 134217728 0 0 +} +// brush 1854 +{ +( 72 1232 -8 ) ( 72 1232 -112 ) ( 72 1192 -112 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -16 1192 -32 ) ( 48 1192 -32 ) ( 48 1192 -40 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 40 1600 -152 ) ( 40 1600 64 ) ( 40 1320 64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 40 1232 -64 ) ( 72 1232 -64 ) ( 72 1256 -48 ) subway/1_tile_middle 0 9 0 0.500000 0.500000 0 318767104 8 +( 40 1256 -48 ) ( 72 1256 -48 ) ( 72 1192 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 72 1232 -64 ) ( 40 1232 -64 ) ( 40 1192 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1855 +{ +( -24 1448 -80 ) ( 40 1448 -80 ) ( 40 1512 -80 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1232 -64 ) ( 72 1232 -64 ) ( 72 1192 -64 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( 72 1232 -64 ) ( 40 1232 -64 ) ( 40 1224 -80 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 8 +( 40 1600 -168 ) ( 40 1600 48 ) ( 40 1320 48 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -16 1192 -32 ) ( 48 1192 -32 ) ( 48 1192 -40 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( 72 1232 -8 ) ( 72 1232 -112 ) ( 72 1192 -112 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 1856 +{ +( -120 1448 -80 ) ( -56 1448 -80 ) ( -56 1512 -80 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -56 1232 -64 ) ( -24 1232 -64 ) ( -24 1192 -64 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -24 1232 -64 ) ( -56 1232 -64 ) ( -56 1224 -80 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 6 +( -56 1600 -168 ) ( -56 1600 48 ) ( -56 1320 48 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -112 1192 -32 ) ( -48 1192 -32 ) ( -48 1192 -40 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -24 1232 -8 ) ( -24 1232 -112 ) ( -24 1192 -112 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 1857 +{ +( -24 1232 -8 ) ( -24 1232 -112 ) ( -24 1192 -112 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -112 1192 -32 ) ( -48 1192 -32 ) ( -48 1192 -40 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -56 1600 -152 ) ( -56 1600 64 ) ( -56 1320 64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -56 1232 -64 ) ( -24 1232 -64 ) ( -24 1256 -48 ) subway/1_tile_middle 0 9 0 0.500000 0.500000 0 318767104 6 +( -56 1256 -48 ) ( -24 1256 -48 ) ( -24 1192 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -24 1232 -64 ) ( -56 1232 -64 ) ( -56 1192 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1858 +{ +( -120 1232 -8 ) ( -120 1232 -112 ) ( -120 1192 -112 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -208 1192 -32 ) ( -144 1192 -32 ) ( -144 1192 -40 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -152 1600 -152 ) ( -152 1600 64 ) ( -152 1320 64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -152 1232 -64 ) ( -120 1232 -64 ) ( -120 1256 -48 ) subway/1_tile_middle 0 9 0 0.500000 0.500000 0 318767104 5 +( -152 1256 -48 ) ( -120 1256 -48 ) ( -120 1192 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -120 1232 -64 ) ( -152 1232 -64 ) ( -152 1192 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1859 +{ +( -216 1448 -80 ) ( -152 1448 -80 ) ( -152 1512 -80 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -152 1232 -64 ) ( -120 1232 -64 ) ( -120 1192 -64 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -120 1232 -64 ) ( -152 1232 -64 ) ( -152 1224 -80 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 5 +( -152 1600 -168 ) ( -152 1600 48 ) ( -152 1320 48 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -208 1192 -32 ) ( -144 1192 -32 ) ( -144 1192 -40 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -120 1232 -8 ) ( -120 1232 -112 ) ( -120 1192 -112 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 1860 +{ +( -312 1448 -80 ) ( -248 1448 -80 ) ( -248 1512 -80 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -248 1232 -64 ) ( -216 1232 -64 ) ( -216 1192 -64 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -216 1232 -64 ) ( -248 1232 -64 ) ( -248 1224 -80 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 4 +( -248 1600 -168 ) ( -248 1600 48 ) ( -248 1320 48 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -304 1192 -32 ) ( -240 1192 -32 ) ( -240 1192 -40 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -216 1232 -8 ) ( -216 1232 -112 ) ( -216 1192 -112 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 1861 +{ +( -216 1232 -8 ) ( -216 1232 -112 ) ( -216 1192 -112 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -304 1192 -32 ) ( -240 1192 -32 ) ( -240 1192 -40 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -248 1600 -152 ) ( -248 1600 64 ) ( -248 1320 64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -248 1232 -64 ) ( -216 1232 -64 ) ( -216 1256 -48 ) subway/1_tile_middle 0 9 0 0.500000 0.500000 0 318767104 4 +( -248 1256 -48 ) ( -216 1256 -48 ) ( -216 1192 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -216 1232 -64 ) ( -248 1232 -64 ) ( -248 1192 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1862 +{ +( -312 1232 -8 ) ( -312 1232 -112 ) ( -312 1192 -112 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -400 1192 -32 ) ( -336 1192 -32 ) ( -336 1192 -40 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -344 1600 -152 ) ( -344 1600 64 ) ( -344 1320 64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -344 1232 -64 ) ( -312 1232 -64 ) ( -312 1256 -48 ) subway/1_tile_middle 0 9 0 0.500000 0.500000 0 318767104 3 +( -344 1256 -48 ) ( -312 1256 -48 ) ( -312 1192 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -312 1232 -64 ) ( -344 1232 -64 ) ( -344 1192 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1863 +{ +( -408 1448 -80 ) ( -344 1448 -80 ) ( -344 1512 -80 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -344 1232 -64 ) ( -312 1232 -64 ) ( -312 1192 -64 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -312 1232 -64 ) ( -344 1232 -64 ) ( -344 1224 -80 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 3 +( -344 1600 -168 ) ( -344 1600 48 ) ( -344 1320 48 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -400 1192 -32 ) ( -336 1192 -32 ) ( -336 1192 -40 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( -312 1232 -8 ) ( -312 1232 -112 ) ( -312 1192 -112 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 1864 +{ +( -504 1448 -80 ) ( -440 1448 -80 ) ( -440 1512 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1232 -64 ) ( -408 1232 -64 ) ( -408 1192 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -408 1232 -64 ) ( -440 1232 -64 ) ( -440 1224 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 2 +( -440 1600 -168 ) ( -440 1600 48 ) ( -440 1320 48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -496 1192 -32 ) ( -432 1192 -32 ) ( -432 1192 -40 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -408 1232 -8 ) ( -408 1232 -112 ) ( -408 1192 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 1865 +{ +( -408 1232 -8 ) ( -408 1232 -112 ) ( -408 1192 -112 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -496 1192 -32 ) ( -432 1192 -32 ) ( -432 1192 -40 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -440 1600 -152 ) ( -440 1600 64 ) ( -440 1320 64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -440 1232 -64 ) ( -408 1232 -64 ) ( -408 1256 -48 ) subway/1_tile_middle 0 9 0 0.500000 0.500000 0 318767104 2 +( -440 1256 -48 ) ( -408 1256 -48 ) ( -408 1192 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 1232 -64 ) ( -440 1232 -64 ) ( -440 1192 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1866 +{ +( 2008 2168 -312 ) ( 2008 2168 -280 ) ( 2008 2136 -280 ) subway/1_cork_ceiling 0 -49 -180 0.500000 0.500000 0 352321536 0 +( 2008 2168 -312 ) ( 2040 2152 -312 ) ( 2040 2152 -280 ) subway/1_tile_big 15 17 -90 0.500000 0.500000 0 318767104 901 +( 2008 2157 -291 ) ( 2040 2141 -291 ) ( 2040 2152 -312 ) subway/1_tile_big 15 17 -90 0.500000 0.500000 0 318767104 901 +( 2008 2168 -280 ) ( 2040 2152 -280 ) ( 2040 2141 -291 ) subway/1_tile_big 15 16 -90 0.500000 0.500000 0 318767104 901 +( 2034 2162 -280 ) ( 2040 2168 -312 ) ( 2028 2156 -312 ) subway/1_tile_big 15 16 -90 0.500000 0.500000 0 318767104 901 +} +// brush 1867 +{ +( 2008 2168 -312 ) ( 2008 2168 -280 ) ( 2008 2136 -280 ) subway/1_cork_ceiling 48 15 -90 0.500000 0.500000 0 352321536 0 +( 2008 2168 -280 ) ( 2040 2152 -280 ) ( 2040 2120 -280 ) subway/1_tile_big -14 17 90 0.500000 -0.500000 0 318767104 901 +( 2008 2136 -280 ) ( 2040 2120 -280 ) ( 2040 2141 -291 ) subway/1_tile_big -14 17 90 0.500000 -0.500000 0 318767104 901 +( 2008 2157 -291 ) ( 2040 2141 -291 ) ( 2040 2152 -280 ) subway/1_tile_big -14 17 90 0.500000 -0.500000 0 318767104 901 +( 2034 2162 -280 ) ( 2040 2168 -291 ) ( 2028 2156 -291 ) subway/1_tile_big -15 -15 90 0.500000 -0.500000 0 318767104 901 +} +// brush 1868 +{ +( 2008 2136 -280 ) ( 2040 2136 -280 ) ( 2040 2136 -312 ) subway/1_tile_big 15 -31 -90 0.500000 -0.500000 0 318767104 901 +( 1992 2168 -280 ) ( 2024 2168 -280 ) ( 2040 2136 -280 ) subway/1_tile_big -31 -30 0 0.500000 -0.500000 0 318767104 901 +( 2013 2168 -291 ) ( 1992 2168 -280 ) ( 2008 2136 -280 ) subway/1_tile_big -31 -30 0 0.500000 -0.500000 0 318767104 901 +( 2024 2168 -280 ) ( 2013 2168 -291 ) ( 2029 2136 -291 ) subway/1_tile_big -31 -30 0 0.500000 -0.500000 0 318767104 901 +( 2028 2156 -291 ) ( 2040 2168 -291 ) ( 2034 2162 -280 ) subway/1_tile_big -14 -15 90 0.500000 0.500000 0 318767104 901 +} +// brush 1869 +{ +( 2008 2136 -280 ) ( 2040 2136 -280 ) ( 2040 2136 -312 ) subway/1_tile_big 15 -31 -90 0.500000 -0.500000 0 318767104 901 +( 2024 2168 -280 ) ( 2024 2168 -312 ) ( 2040 2136 -312 ) subway/1_tile_big 15 -31 -90 0.500000 -0.500000 0 318767104 901 +( 2024 2168 -312 ) ( 2013 2168 -291 ) ( 2029 2136 -291 ) subway/1_tile_big 15 -31 -90 0.500000 -0.500000 0 318767104 901 +( 2013 2168 -291 ) ( 2024 2168 -280 ) ( 2040 2136 -280 ) subway/1_tile_big 0 0 -180 0.500000 0.500000 0 318767104 901 +( 2028 2156 -312 ) ( 2040 2168 -312 ) ( 2034 2162 -280 ) subway/1_tile_big 15 -15 -90 0.500000 -0.500000 0 318767104 901 +} +// brush 1870 +{ +( 2040 2136 -312 ) ( 2040 2136 -280 ) ( 2008 2136 -280 ) subway/1_cork_ceiling 48 15 -90 0.500000 0.500000 0 352321536 0 +( 2008 2056 -280 ) ( 2040 2056 -280 ) ( 2040 2056 -312 ) subway/1_tile_big 0 0 -90 0.500000 0.500000 0 318767104 901 +( 2040 2072 -280 ) ( 2008 2072 -280 ) ( 2008 2136 -280 ) subway/1_tile_big -15 -15 0 0.500000 -0.500000 0 318767104 901 +( 2040 2136 -296 ) ( 2008 2136 -280 ) ( 2024 2072 -288 ) subway/1_tile_big -15 -15 0 0.500000 -0.500000 0 318767104 901 +( 2040 2136 -280 ) ( 2028 2136 -292 ) ( 2034 2072 -286 ) subway/1_tile_big -15 -15 0 0.500000 -0.500000 0 318767104 901 +} +// brush 1871 +{ +( 2040 2136 -312 ) ( 2040 2136 -280 ) ( 2008 2136 -280 ) subway/1_cork_ceiling 0 -49 -180 0.500000 0.500000 0 352321536 0 +( 2008 2056 -280 ) ( 2040 2056 -280 ) ( 2040 2056 -312 ) subway/1_tile_big 15 0 -180 0.500000 0.500000 0 318767104 901 +( 2040 2136 -312 ) ( 2040 2072 -312 ) ( 2040 2072 -280 ) subway/1_tile_big 16 -15 -90 0.500000 -0.500000 0 318767104 901 +( 2032 2072 -296 ) ( 2040 2136 -312 ) ( 2024 2136 -280 ) subway/1_tile_big 16 -15 -90 0.500000 -0.500000 0 318767104 901 +( 2034 2072 -286 ) ( 2028 2136 -292 ) ( 2040 2136 -280 ) subway/1_tile_big 16 14 -180 0.500000 0.500000 0 318767104 901 +} +// brush 1872 +{ +( 1944 2136 -280 ) ( 1912 2136 -280 ) ( 1912 2136 -312 ) subway/1_cork_ceiling 0 -49 -180 0.500000 0.500000 0 352321536 0 +( 1912 2056 -312 ) ( 1912 2056 -280 ) ( 1944 2056 -280 ) subway/1_tile_big -17 0 -180 0.500000 0.500000 0 318767104 901 +( 1912 2072 -280 ) ( 1912 2072 -312 ) ( 1912 2136 -312 ) subway/1_tile_big 16 17 -90 0.500000 -0.500000 0 318767104 901 +( 1928 2136 -280 ) ( 1912 2136 -312 ) ( 1920 2072 -296 ) subway/1_tile_big 16 17 -90 0.500000 -0.500000 0 318767104 901 +( 1912 2136 -280 ) ( 1924 2136 -292 ) ( 1918 2072 -286 ) subway/1_tile_big -16 15 -180 0.500000 0.500000 0 318767104 901 +} +// brush 1873 +{ +( 1944 2136 -280 ) ( 1912 2136 -280 ) ( 1912 2136 -312 ) subway/1_cork_ceiling 48 -49 -90 0.500000 0.500000 0 352321536 0 +( 1912 2056 -312 ) ( 1912 2056 -280 ) ( 1944 2056 -280 ) subway/1_tile_big 0 0 -90 0.500000 0.500000 0 318767104 901 +( 1944 2136 -280 ) ( 1944 2072 -280 ) ( 1912 2072 -280 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 1928 2072 -288 ) ( 1944 2136 -280 ) ( 1912 2136 -296 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 1918 2072 -286 ) ( 1924 2136 -292 ) ( 1912 2136 -280 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +} +// brush 1874 +{ +( 1912 2136 -312 ) ( 1912 2136 -280 ) ( 1944 2136 -280 ) subway/1_tile_big 15 -31 -90 0.500000 -0.500000 0 318767104 901 +( 1912 2136 -312 ) ( 1928 2168 -312 ) ( 1928 2168 -280 ) subway/1_tile_big 15 -31 -90 0.500000 -0.500000 0 318767104 901 +( 1923 2136 -291 ) ( 1939 2168 -291 ) ( 1928 2168 -312 ) subway/1_tile_big 15 -31 -90 0.500000 -0.500000 0 318767104 901 +( 1912 2136 -280 ) ( 1928 2168 -280 ) ( 1939 2168 -291 ) subway/1_tile_big 0 0 -180 0.500000 0.500000 0 318767104 901 +( 1918 2162 -280 ) ( 1912 2168 -312 ) ( 1924 2156 -312 ) subway/1_tile_big 15 -15 -90 0.500000 -0.500000 0 318767104 901 +} +// brush 1875 +{ +( 1912 2136 -312 ) ( 1912 2136 -280 ) ( 1944 2136 -280 ) subway/1_tile_big 15 -31 -90 0.500000 -0.500000 0 318767104 901 +( 1912 2136 -280 ) ( 1928 2168 -280 ) ( 1960 2168 -280 ) subway/1_tile_big 1 -30 0 0.500000 -0.500000 0 318767104 901 +( 1944 2136 -280 ) ( 1960 2168 -280 ) ( 1939 2168 -291 ) subway/1_tile_big 1 -30 0 0.500000 -0.500000 0 318767104 901 +( 1923 2136 -291 ) ( 1939 2168 -291 ) ( 1928 2168 -280 ) subway/1_tile_big 1 -30 0 0.500000 -0.500000 0 318767104 901 +( 1918 2162 -280 ) ( 1912 2168 -291 ) ( 1924 2156 -291 ) subway/1_tile_big -14 -15 90 0.500000 0.500000 0 318767104 901 +} +// brush 1876 +{ +( 1944 2136 -280 ) ( 1944 2168 -280 ) ( 1944 2168 -312 ) subway/1_cork_ceiling 48 15 -90 0.500000 0.500000 0 352321536 0 +( 1912 2120 -280 ) ( 1912 2152 -280 ) ( 1944 2168 -280 ) subway/1_tile_big -15 -15 90 0.500000 -0.500000 0 318767104 901 +( 1912 2141 -291 ) ( 1912 2120 -280 ) ( 1944 2136 -280 ) subway/1_tile_big -15 -15 90 0.500000 -0.500000 0 318767104 901 +( 1912 2152 -280 ) ( 1912 2141 -291 ) ( 1944 2157 -291 ) subway/1_tile_big -15 -15 90 0.500000 -0.500000 0 318767104 901 +( 1924 2156 -291 ) ( 1912 2168 -291 ) ( 1918 2162 -280 ) subway/1_tile_big -15 -15 90 0.500000 -0.500000 0 318767104 901 +} +// brush 1877 +{ +( 1944 2136 -280 ) ( 1944 2168 -280 ) ( 1944 2168 -312 ) subway/1_cork_ceiling 0 -49 -180 0.500000 0.500000 0 352321536 0 +( 1912 2152 -280 ) ( 1912 2152 -312 ) ( 1944 2168 -312 ) subway/1_tile_big 15 -15 -90 0.500000 0.500000 0 318767104 901 +( 1912 2152 -312 ) ( 1912 2141 -291 ) ( 1944 2157 -291 ) subway/1_tile_big 15 -15 -90 0.500000 0.500000 0 318767104 901 +( 1912 2141 -291 ) ( 1912 2152 -280 ) ( 1944 2168 -280 ) subway/1_tile_big 15 -16 -90 0.500000 0.500000 0 318767104 901 +( 1924 2156 -312 ) ( 1912 2168 -312 ) ( 1918 2162 -280 ) subway/1_tile_big 15 -16 -90 0.500000 0.500000 0 318767104 901 +} +// brush 1878 +{ +( 2008 2136 -280 ) ( 2008 2168 -280 ) ( 2008 2168 -312 ) subway/1_cork_ceiling 48 15 -90 0.500000 0.500000 0 352321536 0 +( 1944 2168 -312 ) ( 1944 2168 -280 ) ( 1944 2136 -280 ) subway/1_tile_big 0 0 -90 0.500000 0.500000 0 318767104 901 +( 2008 2136 -280 ) ( 1944 2136 -280 ) ( 1944 2168 -280 ) subway/1_tile_big -15 -15 90 0.500000 -0.500000 0 318767104 901 +( 1944 2152 -288 ) ( 2008 2136 -280 ) ( 2008 2168 -296 ) subway/1_tile_big -15 -15 90 0.500000 -0.500000 0 318767104 901 +( 1944 2162 -286 ) ( 2008 2156 -292 ) ( 2008 2168 -280 ) subway/1_tile_big -15 -15 90 0.500000 -0.500000 0 318767104 901 +} +// brush 1879 +{ +( 2008 2136 -280 ) ( 2008 2168 -280 ) ( 2008 2168 -312 ) subway/1_cork_ceiling 0 -49 -180 0.500000 0.500000 0 352321536 0 +( 1944 2168 -312 ) ( 1944 2168 -280 ) ( 1944 2136 -280 ) subway/1_tile_big 15 0 -180 0.500000 0.500000 0 318767104 901 +( 1944 2168 -280 ) ( 1944 2168 -312 ) ( 2008 2168 -312 ) subway/1_tile_big 16 -15 -90 0.500000 0.500000 0 318767104 901 +( 2008 2152 -280 ) ( 2008 2168 -312 ) ( 1944 2160 -296 ) subway/1_tile_big 16 -15 -90 0.500000 0.500000 0 318767104 901 +( 2008 2168 -280 ) ( 2008 2156 -292 ) ( 1944 2162 -286 ) subway/1_tile_big 16 -16 -90 0.500000 0.500000 0 318767104 901 +} +// brush 1880 +{ +( 2040 2136 -376 ) ( 2040 2168 -376 ) ( 2008 2168 -376 ) subway/con14 -16 32 0 0.500000 0.500000 0 285212672 0 +( 2008 2168 -312 ) ( 2040 2168 -312 ) ( 2040 2136 -312 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 901 +( 2040 2136 -376 ) ( 2040 2136 -312 ) ( 2040 2168 -312 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 901 +( 2032 2152 -312 ) ( 2040 2136 -376 ) ( 2024 2168 -376 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 901 +( 2034 2162 -312 ) ( 2028 2156 -376 ) ( 2040 2168 -376 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 901 +} +// brush 1881 +{ +( 2040 2136 -376 ) ( 2040 2168 -376 ) ( 2008 2168 -376 ) subway/con14 -16 32 0 0.500000 0.500000 0 285212672 0 +( 2008 2168 -312 ) ( 2040 2168 -312 ) ( 2040 2136 -312 ) subway/1_tile_big 16 0 -90 0.500000 0.500000 0 318767104 901 +( 2040 2168 -312 ) ( 2008 2168 -312 ) ( 2008 2168 -376 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 901 +( 2040 2152 -376 ) ( 2008 2168 -376 ) ( 2024 2160 -312 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 901 +( 2040 2168 -376 ) ( 2028 2156 -376 ) ( 2034 2162 -312 ) subway/1_tile_big 16 16 -180 0.500000 -0.500000 0 318767104 901 +} +// brush 1882 +{ +( 1944 2168 -376 ) ( 1912 2168 -376 ) ( 1912 2136 -376 ) subway/con14 -16 32 0 0.500000 0.500000 0 285212672 0 +( 1912 2136 -312 ) ( 1912 2168 -312 ) ( 1944 2168 -312 ) subway/1_tile_big 16 0 -90 0.500000 0.500000 0 318767104 901 +( 1944 2168 -376 ) ( 1944 2168 -312 ) ( 1912 2168 -312 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 901 +( 1928 2160 -312 ) ( 1944 2168 -376 ) ( 1912 2152 -376 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 901 +( 1918 2162 -312 ) ( 1924 2156 -376 ) ( 1912 2168 -376 ) subway/1_tile_big 16 16 -180 0.500000 -0.500000 0 318767104 901 +} +// brush 1883 +{ +( 1944 2168 -376 ) ( 1912 2168 -376 ) ( 1912 2136 -376 ) subway/con14 -16 32 0 0.500000 0.500000 0 285212672 0 +( 1912 2136 -312 ) ( 1912 2168 -312 ) ( 1944 2168 -312 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 901 +( 1912 2168 -312 ) ( 1912 2136 -312 ) ( 1912 2136 -376 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 901 +( 1928 2168 -376 ) ( 1912 2136 -376 ) ( 1920 2152 -312 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 901 +( 1912 2168 -376 ) ( 1924 2156 -376 ) ( 1918 2162 -312 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 901 +} +// brush 1884 +{ +( 1544 2352 -392 ) ( 1544 2368 -392 ) ( 1560 2368 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1544 2352 -392 ) ( 1560 2352 -392 ) ( 1560 2352 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1560 2368 -392 ) ( 1544 2368 -392 ) ( 1544 2368 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1544 2368 -392 ) ( 1544 2352 -392 ) ( 1544 2352 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1544 2352 -408 ) ( 1552 2352 -400 ) ( 1548 2368 -404 ) subway/light_square 16 0 0 0.500000 0.500000 134217728 16777217 20000 +} +// brush 1885 +{ +( 1544 2056 -392 ) ( 1544 2072 -392 ) ( 1560 2072 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1544 2056 -392 ) ( 1560 2056 -392 ) ( 1560 2056 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1560 2072 -392 ) ( 1544 2072 -392 ) ( 1544 2072 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1544 2072 -392 ) ( 1544 2056 -392 ) ( 1544 2056 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1544 2056 -408 ) ( 1552 2056 -400 ) ( 1548 2072 -404 ) subway/light_square 16 16 0 0.500000 0.500000 134217728 16777217 20000 +} +// brush 1886 +{ +( 1896 1992 -480 ) ( 1872 1992 -480 ) ( 1872 1968 -480 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1872 1968 -464 ) ( 1872 1992 -464 ) ( 1896 1992 -464 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1872 2056 -432 ) ( 1896 2056 -432 ) ( 1896 2056 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 2088 -464 ) ( 1912 2088 -480 ) ( 1912 1904 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1888 2088 -480 ) ( 1888 2088 -464 ) ( 1880 2088 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1880 2088 -480 ) ( 1880 2088 -464 ) ( 1880 2032 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1887 +{ +( 1906 2080 -408 ) ( 1898 2080 -408 ) ( 1898 2064 -408 ) subway/1_tile -16 -48 0 0.500000 0.500000 0 318767104 0 +( 1898 2064 -392 ) ( 1906 2064 -392 ) ( 1906 2064 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2064 -392 ) ( 1912 2080 -392 ) ( 1912 2080 -408 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +( 1906 2080 -392 ) ( 1898 2080 -392 ) ( 1898 2080 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1904 1928 -392 ) ( 1904 1912 -392 ) ( 1904 1912 -408 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +( 1928 2064 -400 ) ( 1896 2064 -400 ) ( 1912 2080 -400 ) subway/1_tile -16 -48 0 0.500000 0.500000 0 318767104 0 +} +// brush 1888 +{ +( 1898 2064 -392 ) ( 1898 2080 -392 ) ( 1906 2080 -392 ) subway/1_tile -16 -48 0 0.500000 0.500000 0 318767104 0 +( 1898 2064 -392 ) ( 1906 2064 -392 ) ( 1906 2064 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2064 -392 ) ( 1912 2080 -392 ) ( 1912 2080 -408 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1906 2080 -392 ) ( 1898 2080 -392 ) ( 1898 2080 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1904 1928 -392 ) ( 1904 1912 -392 ) ( 1904 1912 -408 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +( 1896 2064 -400 ) ( 1928 2064 -400 ) ( 1912 2080 -400 ) subway/1_tile -16 -48 0 0.500000 0.500000 0 318767104 0 +} +// brush 1889 +{ +( 1880 2112 -408 ) ( 1880 2112 -392 ) ( 1880 2056 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1888 2088 -408 ) ( 1888 2088 -392 ) ( 1880 2088 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1912 2112 -392 ) ( 1912 2112 -408 ) ( 1912 1928 -408 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2080 -392 ) ( 1896 2080 -392 ) ( 1896 2080 -440 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1872 1992 -392 ) ( 1872 2016 -392 ) ( 1896 2016 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1896 2016 -400 ) ( 1872 2016 -400 ) ( 1872 1992 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1890 +{ +( 1882 2080 -408 ) ( 1874 2080 -408 ) ( 1874 2064 -408 ) subway/1_black 12 0 0 0.500000 0.500000 0 16777216 0 +( 1874 2064 -392 ) ( 1874 2080 -392 ) ( 1882 2080 -392 ) subway/1_black 12 0 0 0.500000 0.500000 0 16777216 0 +( 1874 2064 -392 ) ( 1882 2064 -392 ) ( 1882 2064 -408 ) subway/1_black 12 0 0 0.500000 0.500000 0 16777216 0 +( 1888 2064 -392 ) ( 1888 2080 -392 ) ( 1888 2080 -408 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1882 2080 -392 ) ( 1874 2080 -392 ) ( 1874 2080 -408 ) subway/1_black 12 0 0 0.500000 0.500000 0 16777216 0 +( 1880 1928 -392 ) ( 1880 1912 -392 ) ( 1880 1912 -408 ) subway/light_yellow 0 16 0 0.500000 0.500000 0 16777217 8000 +} +// brush 1891 +{ +( 1880 2088 -408 ) ( 1880 2088 -392 ) ( 1880 2032 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1888 2064 -408 ) ( 1888 2064 -392 ) ( 1880 2064 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1912 2088 -392 ) ( 1912 2088 -408 ) ( 1912 1904 -408 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2056 -392 ) ( 1896 2056 -392 ) ( 1896 2056 -440 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1872 1968 -392 ) ( 1872 1992 -392 ) ( 1896 1992 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1896 1992 -400 ) ( 1872 1992 -400 ) ( 1872 1968 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1892 +{ +( 1880 2280 -408 ) ( 1880 2280 -392 ) ( 1880 2224 -392 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1888 2256 -408 ) ( 1888 2256 -392 ) ( 1880 2256 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1912 2280 -392 ) ( 1912 2280 -408 ) ( 1912 2096 -408 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2248 -392 ) ( 1896 2248 -392 ) ( 1896 2248 -440 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2160 -392 ) ( 1872 2184 -392 ) ( 1896 2184 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1896 2184 -400 ) ( 1872 2184 -400 ) ( 1872 2160 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1893 +{ +( 1882 2272 -408 ) ( 1874 2272 -408 ) ( 1874 2256 -408 ) subway/1_black 12 0 0 0.500000 0.500000 0 16777216 0 +( 1874 2256 -392 ) ( 1874 2272 -392 ) ( 1882 2272 -392 ) subway/1_black 12 0 0 0.500000 0.500000 0 16777216 0 +( 1874 2256 -392 ) ( 1882 2256 -392 ) ( 1882 2256 -408 ) subway/1_black 12 0 0 0.500000 0.500000 0 16777216 0 +( 1888 2256 -392 ) ( 1888 2272 -392 ) ( 1888 2272 -408 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1882 2272 -392 ) ( 1874 2272 -392 ) ( 1874 2272 -408 ) subway/1_black 12 0 0 0.500000 0.500000 0 16777216 0 +( 1880 2120 -392 ) ( 1880 2104 -392 ) ( 1880 2104 -408 ) subway/light_yellow 0 16 0 0.500000 0.500000 0 16777217 8000 +} +// brush 1894 +{ +( 1896 2208 -464 ) ( 1872 2208 -464 ) ( 1872 2184 -464 ) subway/1_tile 32 -16 0 0.500000 0.500000 0 318767104 0 +( 1872 2184 -400 ) ( 1872 2208 -400 ) ( 1896 2208 -400 ) subway/1_tile 32 -16 0 0.500000 0.500000 0 318767104 0 +( 1872 2272 -376 ) ( 1896 2272 -376 ) ( 1896 2272 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2304 -376 ) ( 1912 2304 -424 ) ( 1912 2120 -424 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2280 -432 ) ( 1888 2280 -384 ) ( 1880 2280 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2304 -424 ) ( 1880 2304 -376 ) ( 1880 2248 -376 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1895 +{ +( 1896 2192 -464 ) ( 1872 2192 -464 ) ( 1872 2168 -464 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1872 2168 -408 ) ( 1872 2192 -408 ) ( 1896 2192 -408 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1872 2256 -376 ) ( 1896 2256 -376 ) ( 1896 2256 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2288 -376 ) ( 1912 2288 -424 ) ( 1912 2104 -424 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2272 -432 ) ( 1888 2272 -384 ) ( 1880 2272 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2288 -424 ) ( 1880 2288 -376 ) ( 1880 2232 -376 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1896 +{ +( 1880 2304 -408 ) ( 1880 2304 -392 ) ( 1880 2248 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1888 2280 -408 ) ( 1888 2280 -392 ) ( 1880 2280 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1912 2304 -392 ) ( 1912 2304 -408 ) ( 1912 2120 -408 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2272 -392 ) ( 1896 2272 -392 ) ( 1896 2272 -440 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2184 -392 ) ( 1872 2208 -392 ) ( 1896 2208 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1896 2208 -400 ) ( 1872 2208 -400 ) ( 1872 2184 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1897 +{ +( 1898 2256 -392 ) ( 1898 2272 -392 ) ( 1906 2272 -392 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1898 2256 -392 ) ( 1906 2256 -392 ) ( 1906 2256 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2256 -392 ) ( 1912 2272 -392 ) ( 1912 2272 -408 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1906 2272 -392 ) ( 1898 2272 -392 ) ( 1898 2272 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1904 2120 -392 ) ( 1904 2104 -392 ) ( 1904 2104 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1896 2256 -400 ) ( 1928 2256 -400 ) ( 1912 2272 -400 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1898 +{ +( 1906 2272 -408 ) ( 1898 2272 -408 ) ( 1898 2256 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1898 2256 -392 ) ( 1906 2256 -392 ) ( 1906 2256 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2256 -392 ) ( 1912 2272 -392 ) ( 1912 2272 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1906 2272 -392 ) ( 1898 2272 -392 ) ( 1898 2272 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1904 2120 -392 ) ( 1904 2104 -392 ) ( 1904 2104 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1928 2256 -400 ) ( 1896 2256 -400 ) ( 1912 2272 -400 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1899 +{ +( 1906 2432 -408 ) ( 1898 2432 -408 ) ( 1898 2416 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1898 2416 -392 ) ( 1906 2416 -392 ) ( 1906 2416 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2416 -392 ) ( 1912 2432 -392 ) ( 1912 2432 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1906 2432 -392 ) ( 1898 2432 -392 ) ( 1898 2432 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1904 2280 -392 ) ( 1904 2264 -392 ) ( 1904 2264 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1928 2416 -400 ) ( 1896 2416 -400 ) ( 1912 2432 -400 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1900 +{ +( 1898 2416 -392 ) ( 1898 2432 -392 ) ( 1906 2432 -392 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1898 2416 -392 ) ( 1906 2416 -392 ) ( 1906 2416 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2416 -392 ) ( 1912 2432 -392 ) ( 1912 2432 -408 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1906 2432 -392 ) ( 1898 2432 -392 ) ( 1898 2432 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1904 2280 -392 ) ( 1904 2264 -392 ) ( 1904 2264 -408 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1896 2416 -400 ) ( 1928 2416 -400 ) ( 1912 2432 -400 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1901 +{ +( 1880 2464 -408 ) ( 1880 2464 -392 ) ( 1880 2408 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1888 2440 -408 ) ( 1888 2440 -392 ) ( 1880 2440 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1912 2464 -392 ) ( 1912 2464 -408 ) ( 1912 2280 -408 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2432 -392 ) ( 1896 2432 -392 ) ( 1896 2432 -440 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2344 -392 ) ( 1872 2368 -392 ) ( 1896 2368 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1896 2368 -400 ) ( 1872 2368 -400 ) ( 1872 2344 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1902 +{ +( 1896 2352 -464 ) ( 1872 2352 -464 ) ( 1872 2328 -464 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1872 2328 -408 ) ( 1872 2352 -408 ) ( 1896 2352 -408 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1872 2416 -376 ) ( 1896 2416 -376 ) ( 1896 2416 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2448 -376 ) ( 1912 2448 -424 ) ( 1912 2264 -424 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2432 -432 ) ( 1888 2432 -384 ) ( 1880 2432 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2448 -424 ) ( 1880 2448 -376 ) ( 1880 2392 -376 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1903 +{ +( 1896 2368 -464 ) ( 1872 2368 -464 ) ( 1872 2344 -464 ) subway/1_tile 32 48 0 0.500000 0.500000 0 318767104 0 +( 1872 2344 -400 ) ( 1872 2368 -400 ) ( 1896 2368 -400 ) subway/1_tile 32 48 0 0.500000 0.500000 0 318767104 0 +( 1872 2432 -376 ) ( 1896 2432 -376 ) ( 1896 2432 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2464 -376 ) ( 1912 2464 -424 ) ( 1912 2280 -424 ) subway/1_tile -48 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2440 -432 ) ( 1888 2440 -384 ) ( 1880 2440 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2464 -424 ) ( 1880 2464 -376 ) ( 1880 2408 -376 ) subway/1_tile -48 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1904 +{ +( 1648 1992 -224 ) ( 1672 1968 -240 ) ( 2192 1968 -240 ) subway/1_tile -31 31 -90 0.500000 0.500000 0 318767104 906 +( 2136 1952 -256 ) ( 1688 1952 -256 ) ( 1688 1952 -224 ) subway/1_tile_big_green 16 16 0 0.500000 0.500000 0 369098752 0 +( 1880 2008 -288 ) ( 1880 2008 -240 ) ( 1880 2032 -240 ) subway/1_tile_big_green 0 16 -180 0.500000 -0.500000 0 369098752 0 +( 1688 1952 -224 ) ( 1664 1992 -224 ) ( 2192 1992 -224 ) subway/1_tile_big_green 0 15 -90 0.500000 0.500000 0 369098752 0 +( 2192 1952 -240 ) ( 2192 1968 -240 ) ( 1672 1968 -240 ) subway/1_tile_big_green 0 15 -90 0.500000 0.500000 0 369098752 0 +( 1680 1976 -224 ) ( 1680 1952 -240 ) ( 1680 2000 -240 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 1905 +{ +( 2200 1968 -240 ) ( 1680 1968 -240 ) ( 1688 1960 -256 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 906 +( 2136 1952 -256 ) ( 1688 1952 -256 ) ( 1688 1952 -224 ) subway/1_tile_big_green 16 16 0 0.500000 0.500000 0 369098752 0 +( 1880 2008 -288 ) ( 1880 2008 -240 ) ( 1880 2032 -240 ) subway/1_tile_big_green 0 16 -180 0.500000 -0.500000 0 369098752 0 +( 1944 2048 -256 ) ( 1920 2048 -256 ) ( 1920 2024 -256 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +( 1688 1952 -240 ) ( 1668 1968 -240 ) ( 2192 1968 -240 ) subway/1_tile_big_green 0 15 -90 0.500000 0.500000 0 369098752 0 +( 1680 1964 -240 ) ( 1680 1952 -256 ) ( 1680 1976 -256 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 1906 +{ +( 1696 2112 -240 ) ( 1696 2632 -240 ) ( 1688 2624 -256 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1680 2632 -256 ) ( 1680 2632 -240 ) ( 1680 1928 -240 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1736 1928 -288 ) ( 1736 1928 -240 ) ( 1760 1928 -240 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1776 2176 -256 ) ( 1776 2200 -256 ) ( 1752 2200 -256 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1680 2432 -240 ) ( 1696 2452 -240 ) ( 1696 1928 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1680 2624 -240 ) ( 1680 2624 -256 ) ( 1688 2616 -256 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 1907 +{ +( 2040 2280 -480 ) ( 2040 2280 -464 ) ( 2040 2224 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2280 -480 ) ( 2048 2280 -464 ) ( 2040 2280 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2072 2280 -464 ) ( 2072 2280 -480 ) ( 2072 2096 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2032 2248 -432 ) ( 2056 2248 -432 ) ( 2056 2248 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2032 2160 -464 ) ( 2032 2184 -464 ) ( 2056 2184 -464 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 2056 2184 -480 ) ( 2032 2184 -480 ) ( 2032 2160 -480 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1908 +{ +( 2056 2344 -480 ) ( 2032 2344 -480 ) ( 2032 2320 -480 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 2032 2320 -464 ) ( 2032 2344 -464 ) ( 2056 2344 -464 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 2032 2408 -432 ) ( 2056 2408 -432 ) ( 2056 2408 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2072 2440 -464 ) ( 2072 2440 -480 ) ( 2072 2256 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2440 -480 ) ( 2048 2440 -464 ) ( 2040 2440 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2040 2440 -480 ) ( 2040 2440 -464 ) ( 2040 2384 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1909 +{ +( 1360 2632 -480 ) ( 1360 3016 -480 ) ( 1352 3016 -480 ) subway/1_tile_bottom 16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1352 3024 -464 ) ( 1360 3024 -464 ) ( 1360 2640 -464 ) subway/1_tile_bottom 16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2900 -528 ) ( 1544 2516 -528 ) ( 1544 2516 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1200 2408 -528 ) ( 1208 2408 -528 ) ( 1208 2408 -560 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2616 -528 ) ( 1576 3000 -528 ) ( 1576 3000 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1368 2440 -528 ) ( 1360 2440 -528 ) ( 1360 2440 -560 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1910 +{ +( 1368 2440 -496 ) ( 1360 2440 -496 ) ( 1360 2440 -528 ) subway/1_tile -16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2616 -496 ) ( 1576 3000 -496 ) ( 1576 3000 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 134217728 318767104 0 +( 1200 2408 -496 ) ( 1208 2408 -496 ) ( 1208 2408 -528 ) subway/1_tile -16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2900 -496 ) ( 1544 2516 -496 ) ( 1544 2516 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 134217728 318767104 0 +( 1352 3024 -416 ) ( 1360 3024 -416 ) ( 1360 2640 -416 ) subway/1_tile -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1360 2632 -464 ) ( 1360 3016 -464 ) ( 1352 3016 -464 ) subway/1_tile -16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1911 +{ +( 1368 2440 -472 ) ( 1360 2440 -472 ) ( 1360 2440 -504 ) subway/1_tile_middle 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2616 -472 ) ( 1576 3000 -472 ) ( 1576 3000 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1200 2408 -480 ) ( 1208 2408 -480 ) ( 1208 2408 -512 ) subway/1_tile_middle 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2900 -472 ) ( 1544 2516 -472 ) ( 1544 2516 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1352 3024 -400 ) ( 1360 3024 -400 ) ( 1360 2640 -400 ) subway/1_tile_middle 16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1360 2632 -416 ) ( 1360 3016 -416 ) ( 1352 3016 -416 ) subway/1_tile_middle 16 16 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1912 +{ +( 1360 2632 -488 ) ( 1360 3016 -488 ) ( 1352 3016 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1352 3024 -480 ) ( 1360 3024 -480 ) ( 1360 2640 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1544 2900 -544 ) ( 1544 2516 -544 ) ( 1544 2516 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1200 2408 -544 ) ( 1208 2408 -544 ) ( 1208 2408 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1576 2616 -544 ) ( 1576 3000 -544 ) ( 1576 3000 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1368 2440 -544 ) ( 1360 2440 -544 ) ( 1360 2440 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +} +// brush 1913 +{ +( 1360 2632 -520 ) ( 1360 3016 -520 ) ( 1352 3016 -520 ) subway/1_tunnelwall 0 16 0 1 1 134217728 301989888 0 +( 1352 3024 -488 ) ( 1360 3024 -488 ) ( 1360 2640 -488 ) subway/1_tunnelwall 0 16 0 1 1 134217728 301989888 0 +( 1544 2900 -568 ) ( 1544 2516 -568 ) ( 1544 2516 -600 ) subway/1_tunnelwall -24 -8 0 1 1 134217728 301989888 0 +( 1200 2408 -568 ) ( 1208 2408 -568 ) ( 1208 2408 -600 ) subway/1_tunnelwall 0 -8 0 1 1 134217728 301989888 0 +( 1576 2616 -560 ) ( 1576 3000 -560 ) ( 1576 3000 -592 ) subway/1_tunnelwall -24 -8 0 1 1 134217728 301989888 0 +( 1368 2440 -560 ) ( 1360 2440 -560 ) ( 1360 2440 -592 ) subway/1_tunnelwall 0 -8 0 1 1 134217728 301989888 0 +} +// brush 1914 +{ +( 1360 2632 -536 ) ( 1360 3016 -536 ) ( 1352 3016 -536 ) subway/1_tunnelwall_floor 0 0 0 1 0.500000 134217728 285212672 0 +( 1352 3024 -520 ) ( 1360 3024 -520 ) ( 1360 2640 -520 ) subway/1_tunnelwall_floor 0 0 0 1 0.500000 134217728 285212672 0 +( 1544 2900 -584 ) ( 1544 2516 -584 ) ( 1544 2516 -616 ) subway/1_tunnelwall_floor -24 16 0 1 0.500000 134217728 285212672 0 +( 1200 2408 -584 ) ( 1208 2408 -584 ) ( 1208 2408 -616 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 134217728 285212672 0 +( 1576 2616 -576 ) ( 1576 3000 -576 ) ( 1576 3000 -608 ) subway/1_tunnelwall_floor -24 16 0 1 0.500000 134217728 285212672 0 +( 1368 2440 -576 ) ( 1360 2440 -576 ) ( 1360 2440 -608 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 134217728 285212672 0 +} +// brush 1915 +{ +( 1472 2632 -536 ) ( 1472 3016 -536 ) ( 1464 3016 -536 ) subway/1_tunnelwall_floor 16 0 0 1 0.500000 134217728 285212672 0 +( 1464 3024 -520 ) ( 1472 3024 -520 ) ( 1472 2640 -520 ) subway/1_tunnelwall_floor 16 0 0 1 0.500000 134217728 285212672 0 +( 1656 2900 -584 ) ( 1656 2516 -584 ) ( 1656 2516 -616 ) subway/1_tunnelwall_floor -24 16 0 1 0.500000 134217728 285212672 0 +( 1312 2408 -584 ) ( 1320 2408 -584 ) ( 1320 2408 -616 ) subway/1_tunnelwall_floor 16 16 0 1 0.500000 134217728 285212672 0 +( 1688 2616 -576 ) ( 1688 3000 -576 ) ( 1688 3000 -608 ) subway/1_tunnelwall_floor -24 16 0 1 0.500000 134217728 285212672 0 +( 1480 2440 -576 ) ( 1472 2440 -576 ) ( 1472 2440 -608 ) subway/1_tunnelwall_floor 16 16 0 1 0.500000 134217728 285212672 0 +} +// brush 1916 +{ +( 1472 2632 -520 ) ( 1472 3016 -520 ) ( 1464 3016 -520 ) subway/1_tunnelwall 16 16 0 1 1 134217728 301989888 0 +( 1464 3024 -488 ) ( 1472 3024 -488 ) ( 1472 2640 -488 ) subway/1_tunnelwall 16 16 0 1 1 134217728 301989888 0 +( 1656 2900 -568 ) ( 1656 2516 -568 ) ( 1656 2516 -600 ) subway/1_tunnelwall -24 -8 0 1 1 134217728 301989888 0 +( 1312 2408 -568 ) ( 1320 2408 -568 ) ( 1320 2408 -600 ) subway/1_tunnelwall 16 -8 0 1 1 134217728 301989888 0 +( 1688 2616 -560 ) ( 1688 3000 -560 ) ( 1688 3000 -592 ) subway/1_tunnelwall -24 -8 0 1 1 134217728 301989888 0 +( 1480 2440 -560 ) ( 1472 2440 -560 ) ( 1472 2440 -592 ) subway/1_tunnelwall 16 -8 0 1 1 134217728 301989888 0 +} +// brush 1917 +{ +( 1472 2632 -488 ) ( 1472 3016 -488 ) ( 1464 3016 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1464 3024 -480 ) ( 1472 3024 -480 ) ( 1472 2640 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1656 2900 -544 ) ( 1656 2516 -544 ) ( 1656 2516 -576 ) subway/1_trim1 0 0 0 -0.500000 0.500000 134217728 0 0 +( 1312 2408 -544 ) ( 1320 2408 -544 ) ( 1320 2408 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1688 2616 -544 ) ( 1688 3000 -544 ) ( 1688 3000 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1480 2440 -544 ) ( 1472 2440 -544 ) ( 1472 2440 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +} +// brush 1918 +{ +( 1480 2440 -472 ) ( 1472 2440 -472 ) ( 1472 2440 -504 ) subway/1_tile_middle 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1688 2616 -472 ) ( 1688 3000 -472 ) ( 1688 3000 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1312 2408 -480 ) ( 1320 2408 -480 ) ( 1320 2408 -512 ) subway/1_tile_middle 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1656 2900 -472 ) ( 1656 2516 -472 ) ( 1656 2516 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1464 3024 -400 ) ( 1472 3024 -400 ) ( 1472 2640 -400 ) subway/1_tile_middle 16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1472 2632 -416 ) ( 1472 3016 -416 ) ( 1464 3016 -416 ) subway/1_tile_middle 16 16 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1919 +{ +( 1480 2440 -496 ) ( 1472 2440 -496 ) ( 1472 2440 -528 ) subway/1_tile 16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1688 2616 -496 ) ( 1688 3000 -496 ) ( 1688 3000 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 134217728 318767104 0 +( 1312 2408 -496 ) ( 1320 2408 -496 ) ( 1320 2408 -528 ) subway/1_tile 16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1656 2900 -496 ) ( 1656 2516 -496 ) ( 1656 2516 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 134217728 318767104 0 +( 1464 3024 -416 ) ( 1472 3024 -416 ) ( 1472 2640 -416 ) subway/1_tile 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1472 2632 -464 ) ( 1472 3016 -464 ) ( 1464 3016 -464 ) subway/1_tile 16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1920 +{ +( 1472 2632 -480 ) ( 1472 3016 -480 ) ( 1464 3016 -480 ) subway/1_tile_bottom 16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1464 3024 -464 ) ( 1472 3024 -464 ) ( 1472 2640 -464 ) subway/1_tile_bottom 16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1656 2900 -528 ) ( 1656 2516 -528 ) ( 1656 2516 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1312 2408 -528 ) ( 1320 2408 -528 ) ( 1320 2408 -560 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1688 2616 -528 ) ( 1688 3000 -528 ) ( 1688 3000 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1480 2440 -528 ) ( 1472 2440 -528 ) ( 1472 2440 -560 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1921 +{ +( 1480 2440 -464 ) ( 1472 2440 -464 ) ( 1472 2440 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1688 2616 -464 ) ( 1688 3000 -464 ) ( 1688 3000 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1312 2408 -472 ) ( 1320 2408 -472 ) ( 1320 2408 -504 ) subway/1_tile_top 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1656 2900 -456 ) ( 1656 2516 -456 ) ( 1656 2516 -488 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1464 3024 -392 ) ( 1472 3024 -392 ) ( 1472 2640 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1472 2632 -400 ) ( 1472 3016 -400 ) ( 1464 3016 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1922 +{ +( 1368 2440 -464 ) ( 1360 2440 -464 ) ( 1360 2440 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2616 -464 ) ( 1576 3000 -464 ) ( 1576 3000 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1200 2408 -472 ) ( 1208 2408 -472 ) ( 1208 2408 -504 ) subway/1_tile_top 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2900 -464 ) ( 1544 2516 -464 ) ( 1544 2516 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1352 3024 -392 ) ( 1360 3024 -392 ) ( 1360 2640 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1360 2632 -400 ) ( 1360 3016 -400 ) ( 1352 3016 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1923 +{ +( 1368 2312 -464 ) ( 1360 2312 -464 ) ( 1360 2312 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2488 -464 ) ( 1576 2872 -464 ) ( 1576 2872 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1200 2280 -472 ) ( 1208 2280 -472 ) ( 1208 2280 -504 ) subway/1_tile_top 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2772 -464 ) ( 1544 2388 -464 ) ( 1544 2388 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1352 2896 -392 ) ( 1360 2896 -392 ) ( 1360 2512 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1360 2504 -400 ) ( 1360 2888 -400 ) ( 1352 2888 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1924 +{ +( 1360 2504 -536 ) ( 1360 2888 -536 ) ( 1352 2888 -536 ) subway/1_tunnelwall_floor 0 0 0 1 0.500000 134217728 285212672 0 +( 1352 2896 -520 ) ( 1360 2896 -520 ) ( 1360 2512 -520 ) subway/1_tunnelwall_floor 0 0 0 1 0.500000 134217728 285212672 0 +( 1544 2772 -584 ) ( 1544 2388 -584 ) ( 1544 2388 -616 ) subway/1_tunnelwall_floor -24 16 0 1 0.500000 134217728 285212672 0 +( 1200 2280 -584 ) ( 1208 2280 -584 ) ( 1208 2280 -616 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 134217728 285212672 0 +( 1576 2488 -576 ) ( 1576 2872 -576 ) ( 1576 2872 -608 ) subway/1_tunnelwall_floor -24 16 0 1 0.500000 134217728 285212672 0 +( 1368 2312 -576 ) ( 1360 2312 -576 ) ( 1360 2312 -608 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 134217728 285212672 0 +} +// brush 1925 +{ +( 1360 2504 -520 ) ( 1360 2888 -520 ) ( 1352 2888 -520 ) subway/1_tunnelwall 0 16 0 1 1 134217728 301989888 0 +( 1352 2896 -488 ) ( 1360 2896 -488 ) ( 1360 2512 -488 ) subway/1_tunnelwall 0 16 0 1 1 134217728 301989888 0 +( 1544 2772 -568 ) ( 1544 2388 -568 ) ( 1544 2388 -600 ) subway/1_tunnelwall -24 -8 0 1 1 134217728 301989888 0 +( 1200 2280 -568 ) ( 1208 2280 -568 ) ( 1208 2280 -600 ) subway/1_tunnelwall 0 -8 0 1 1 134217728 301989888 0 +( 1576 2488 -560 ) ( 1576 2872 -560 ) ( 1576 2872 -592 ) subway/1_tunnelwall -24 -8 0 1 1 134217728 301989888 0 +( 1368 2312 -560 ) ( 1360 2312 -560 ) ( 1360 2312 -592 ) subway/1_tunnelwall 0 -8 0 1 1 134217728 301989888 0 +} +// brush 1926 +{ +( 1360 2504 -488 ) ( 1360 2888 -488 ) ( 1352 2888 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1352 2896 -480 ) ( 1360 2896 -480 ) ( 1360 2512 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1544 2772 -544 ) ( 1544 2388 -544 ) ( 1544 2388 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1200 2280 -544 ) ( 1208 2280 -544 ) ( 1208 2280 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1576 2488 -544 ) ( 1576 2872 -544 ) ( 1576 2872 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1368 2312 -544 ) ( 1360 2312 -544 ) ( 1360 2312 -576 ) subway/1_trim1 0 0 0 -0.500000 0.500000 134217728 0 0 +} +// brush 1927 +{ +( 1368 2312 -472 ) ( 1360 2312 -472 ) ( 1360 2312 -504 ) subway/1_tile_middle 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2488 -472 ) ( 1576 2872 -472 ) ( 1576 2872 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1200 2280 -480 ) ( 1208 2280 -480 ) ( 1208 2280 -512 ) subway/1_tile_middle 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2772 -472 ) ( 1544 2388 -472 ) ( 1544 2388 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1352 2896 -400 ) ( 1360 2896 -400 ) ( 1360 2512 -400 ) subway/1_tile_middle 16 -16 0 0.500000 0.500000 134217728 318767104 0 +( 1360 2504 -416 ) ( 1360 2888 -416 ) ( 1352 2888 -416 ) subway/1_tile_middle 16 -16 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1928 +{ +( 1368 2312 -496 ) ( 1360 2312 -496 ) ( 1360 2312 -528 ) subway/1_tile -16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2488 -496 ) ( 1576 2872 -496 ) ( 1576 2872 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 134217728 318767104 0 +( 1200 2280 -496 ) ( 1208 2280 -496 ) ( 1208 2280 -528 ) subway/1_tile -16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2772 -496 ) ( 1544 2388 -496 ) ( 1544 2388 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 134217728 318767104 0 +( 1352 2896 -416 ) ( 1360 2896 -416 ) ( 1360 2512 -416 ) subway/1_tile -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1360 2504 -464 ) ( 1360 2888 -464 ) ( 1352 2888 -464 ) subway/1_tile -16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1929 +{ +( 1360 2504 -480 ) ( 1360 2888 -480 ) ( 1352 2888 -480 ) subway/1_tile_bottom 16 -16 0 0.500000 0.500000 134217728 318767104 0 +( 1352 2896 -464 ) ( 1360 2896 -464 ) ( 1360 2512 -464 ) subway/1_tile_bottom 16 -16 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2772 -528 ) ( 1544 2388 -528 ) ( 1544 2388 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1200 2280 -528 ) ( 1208 2280 -528 ) ( 1208 2280 -560 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2488 -528 ) ( 1576 2872 -528 ) ( 1576 2872 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1368 2312 -528 ) ( 1360 2312 -528 ) ( 1360 2312 -560 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1930 +{ +( 1360 2336 -480 ) ( 1360 2720 -480 ) ( 1352 2720 -480 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1352 2728 -464 ) ( 1360 2728 -464 ) ( 1360 2344 -464 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2604 -528 ) ( 1544 2220 -528 ) ( 1544 2220 -560 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1200 2112 -528 ) ( 1208 2112 -528 ) ( 1208 2112 -560 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2320 -528 ) ( 1576 2704 -528 ) ( 1576 2704 -560 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1368 2144 -528 ) ( 1360 2144 -528 ) ( 1360 2144 -560 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1931 +{ +( 1368 2144 -496 ) ( 1360 2144 -496 ) ( 1360 2144 -528 ) subway/1_tile -16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2320 -496 ) ( 1576 2704 -496 ) ( 1576 2704 -528 ) subway/1_tile -48 16 0 0.500000 0.500000 134217728 318767104 0 +( 1200 2112 -496 ) ( 1208 2112 -496 ) ( 1208 2112 -528 ) subway/1_tile -16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2604 -496 ) ( 1544 2220 -496 ) ( 1544 2220 -528 ) subway/1_tile -48 16 0 0.500000 0.500000 134217728 318767104 0 +( 1352 2728 -416 ) ( 1360 2728 -416 ) ( 1360 2344 -416 ) subway/1_tile -16 48 0 0.500000 0.500000 134217728 318767104 0 +( 1360 2336 -464 ) ( 1360 2720 -464 ) ( 1352 2720 -464 ) subway/1_tile -16 48 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1932 +{ +( 1368 2144 -472 ) ( 1360 2144 -472 ) ( 1360 2144 -504 ) subway/1_tile_middle -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2320 -472 ) ( 1576 2704 -472 ) ( 1576 2704 -504 ) subway/1_tile_middle -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1200 2112 -480 ) ( 1208 2112 -480 ) ( 1208 2112 -512 ) subway/1_tile_middle -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2604 -472 ) ( 1544 2220 -472 ) ( 1544 2220 -504 ) subway/1_tile_middle -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1352 2728 -400 ) ( 1360 2728 -400 ) ( 1360 2344 -400 ) subway/1_tile_middle -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1360 2336 -416 ) ( 1360 2720 -416 ) ( 1352 2720 -416 ) subway/1_tile_middle -16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1933 +{ +( 1360 2336 -488 ) ( 1360 2720 -488 ) ( 1352 2720 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1352 2728 -480 ) ( 1360 2728 -480 ) ( 1360 2344 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1544 2604 -544 ) ( 1544 2220 -544 ) ( 1544 2220 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1200 2112 -544 ) ( 1208 2112 -544 ) ( 1208 2112 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1576 2320 -544 ) ( 1576 2704 -544 ) ( 1576 2704 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1368 2144 -544 ) ( 1360 2144 -544 ) ( 1360 2144 -576 ) subway/1_trim1 0 0 0 -0.500000 0.500000 134217728 0 0 +} +// brush 1934 +{ +( 1360 2336 -520 ) ( 1360 2720 -520 ) ( 1352 2720 -520 ) subway/1_tunnelwall 0 40 0 1 1 134217728 301989888 0 +( 1352 2728 -488 ) ( 1360 2728 -488 ) ( 1360 2344 -488 ) subway/1_tunnelwall 0 40 0 1 1 134217728 301989888 0 +( 1544 2604 -568 ) ( 1544 2220 -568 ) ( 1544 2220 -600 ) subway/1_tunnelwall -48 -8 0 1 1 134217728 301989888 0 +( 1200 2112 -568 ) ( 1208 2112 -568 ) ( 1208 2112 -600 ) subway/1_tunnelwall 0 -8 0 1 1 134217728 301989888 0 +( 1576 2320 -560 ) ( 1576 2704 -560 ) ( 1576 2704 -592 ) subway/1_tunnelwall -48 -8 0 1 1 134217728 301989888 0 +( 1368 2144 -560 ) ( 1360 2144 -560 ) ( 1360 2144 -592 ) subway/1_tunnelwall 0 -8 0 1 1 134217728 301989888 0 +} +// brush 1935 +{ +( 1360 2336 -536 ) ( 1360 2720 -536 ) ( 1352 2720 -536 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 134217728 285212672 0 +( 1352 2728 -520 ) ( 1360 2728 -520 ) ( 1360 2344 -520 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 134217728 285212672 0 +( 1544 2604 -584 ) ( 1544 2220 -584 ) ( 1544 2220 -616 ) subway/1_tunnelwall_floor -48 16 0 1 0.500000 134217728 285212672 0 +( 1200 2112 -584 ) ( 1208 2112 -584 ) ( 1208 2112 -616 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 134217728 285212672 0 +( 1576 2320 -576 ) ( 1576 2704 -576 ) ( 1576 2704 -608 ) subway/1_tunnelwall_floor -48 16 0 1 0.500000 134217728 285212672 0 +( 1368 2144 -576 ) ( 1360 2144 -576 ) ( 1360 2144 -608 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 134217728 285212672 0 +} +// brush 1936 +{ +( 1368 2144 -464 ) ( 1360 2144 -464 ) ( 1360 2144 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2320 -464 ) ( 1576 2704 -464 ) ( 1576 2704 -496 ) subway/1_tile_top 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1200 2112 -472 ) ( 1208 2112 -472 ) ( 1208 2112 -504 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2604 -464 ) ( 1544 2220 -464 ) ( 1544 2220 -496 ) subway/1_tile_top 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1352 2728 -392 ) ( 1360 2728 -392 ) ( 1360 2344 -392 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1360 2336 -400 ) ( 1360 2720 -400 ) ( 1352 2720 -400 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1937 +{ +( 1368 2024 -464 ) ( 1360 2024 -464 ) ( 1360 2024 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2200 -464 ) ( 1576 2584 -464 ) ( 1576 2584 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1200 1992 -472 ) ( 1208 1992 -472 ) ( 1208 1992 -504 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2484 -464 ) ( 1544 2100 -464 ) ( 1544 2100 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1352 2608 -392 ) ( 1360 2608 -392 ) ( 1360 2224 -392 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1360 2216 -400 ) ( 1360 2600 -400 ) ( 1352 2600 -400 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1938 +{ +( 1480 2024 -464 ) ( 1472 2024 -464 ) ( 1472 2024 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1688 2200 -464 ) ( 1688 2584 -464 ) ( 1688 2584 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1312 1992 -472 ) ( 1320 1992 -472 ) ( 1320 1992 -504 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1656 2484 -456 ) ( 1656 2100 -456 ) ( 1656 2100 -488 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1464 2608 -392 ) ( 1472 2608 -392 ) ( 1472 2224 -392 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1472 2216 -400 ) ( 1472 2600 -400 ) ( 1464 2600 -400 ) subway/1_tile_top -16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1939 +{ +( 1472 2216 -480 ) ( 1472 2600 -480 ) ( 1464 2600 -480 ) subway/1_tile_bottom 16 -16 0 0.500000 0.500000 134217728 318767104 0 +( 1464 2608 -464 ) ( 1472 2608 -464 ) ( 1472 2224 -464 ) subway/1_tile_bottom 16 -16 0 0.500000 0.500000 134217728 318767104 0 +( 1656 2484 -528 ) ( 1656 2100 -528 ) ( 1656 2100 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1312 1992 -528 ) ( 1320 1992 -528 ) ( 1320 1992 -560 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1688 2200 -528 ) ( 1688 2584 -528 ) ( 1688 2584 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1480 2024 -528 ) ( 1472 2024 -528 ) ( 1472 2024 -560 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1940 +{ +( 1480 2024 -496 ) ( 1472 2024 -496 ) ( 1472 2024 -528 ) subway/1_tile 16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1688 2200 -496 ) ( 1688 2584 -496 ) ( 1688 2584 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 134217728 318767104 0 +( 1312 1992 -496 ) ( 1320 1992 -496 ) ( 1320 1992 -528 ) subway/1_tile 16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1656 2484 -496 ) ( 1656 2100 -496 ) ( 1656 2100 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 134217728 318767104 0 +( 1464 2608 -416 ) ( 1472 2608 -416 ) ( 1472 2224 -416 ) subway/1_tile 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1472 2216 -464 ) ( 1472 2600 -464 ) ( 1464 2600 -464 ) subway/1_tile 16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1941 +{ +( 1480 2024 -472 ) ( 1472 2024 -472 ) ( 1472 2024 -504 ) subway/1_tile_middle 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1688 2200 -472 ) ( 1688 2584 -472 ) ( 1688 2584 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1312 1992 -480 ) ( 1320 1992 -480 ) ( 1320 1992 -512 ) subway/1_tile_middle 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1656 2484 -472 ) ( 1656 2100 -472 ) ( 1656 2100 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1464 2608 -400 ) ( 1472 2608 -400 ) ( 1472 2224 -400 ) subway/1_tile_middle 16 -16 0 0.500000 0.500000 134217728 318767104 0 +( 1472 2216 -416 ) ( 1472 2600 -416 ) ( 1464 2600 -416 ) subway/1_tile_middle 16 -16 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1942 +{ +( 1472 2216 -488 ) ( 1472 2600 -488 ) ( 1464 2600 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1464 2608 -480 ) ( 1472 2608 -480 ) ( 1472 2224 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1656 2484 -544 ) ( 1656 2100 -544 ) ( 1656 2100 -576 ) subway/1_trim1 0 0 0 -0.500000 0.500000 134217728 0 0 +( 1312 1984 -544 ) ( 1320 1984 -544 ) ( 1320 1984 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1688 2200 -544 ) ( 1688 2584 -544 ) ( 1688 2584 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1480 2024 -544 ) ( 1472 2024 -544 ) ( 1472 2024 -576 ) subway/1_trim1 0 0 0 -0.500000 0.500000 134217728 0 0 +} +// brush 1943 +{ +( 1472 2216 -520 ) ( 1472 2600 -520 ) ( 1464 2600 -520 ) subway/1_tunnelwall 16 -16 0 1 1 134217728 301989888 0 +( 1464 2608 -488 ) ( 1472 2608 -488 ) ( 1472 2224 -488 ) subway/1_tunnelwall 16 -16 0 1 1 134217728 301989888 0 +( 1656 2484 -568 ) ( 1656 2100 -568 ) ( 1656 2100 -600 ) subway/1_tunnelwall 8 -8 0 1 1 134217728 301989888 0 +( 1312 1992 -568 ) ( 1320 1992 -568 ) ( 1320 1992 -600 ) subway/1_tunnelwall 16 -8 0 1 1 134217728 301989888 0 +( 1688 2200 -560 ) ( 1688 2584 -560 ) ( 1688 2584 -592 ) subway/1_tunnelwall 8 -8 0 1 1 134217728 301989888 0 +( 1480 2024 -560 ) ( 1472 2024 -560 ) ( 1472 2024 -592 ) subway/1_tunnelwall 16 -8 0 1 1 134217728 301989888 0 +} +// brush 1944 +{ +( 1472 2216 -536 ) ( 1472 2600 -536 ) ( 1464 2600 -536 ) subway/1_tunnelwall_floor 16 0 0 1 0.500000 134217728 285212672 0 +( 1464 2608 -520 ) ( 1472 2608 -520 ) ( 1472 2224 -520 ) subway/1_tunnelwall_floor 16 0 0 1 0.500000 134217728 285212672 0 +( 1656 2484 -584 ) ( 1656 2100 -584 ) ( 1656 2100 -616 ) subway/1_tunnelwall_floor 8 16 0 1 0.500000 134217728 285212672 0 +( 1312 1992 -584 ) ( 1320 1992 -584 ) ( 1320 1992 -616 ) subway/1_tunnelwall_floor 16 16 0 1 0.500000 134217728 285212672 0 +( 1688 2200 -576 ) ( 1688 2584 -576 ) ( 1688 2584 -608 ) subway/1_tunnelwall_floor 8 16 0 1 0.500000 134217728 285212672 0 +( 1480 2024 -576 ) ( 1472 2024 -576 ) ( 1472 2024 -608 ) subway/1_tunnelwall_floor 16 16 0 1 0.500000 134217728 285212672 0 +} +// brush 1945 +{ +( 1360 2216 -536 ) ( 1360 2600 -536 ) ( 1352 2600 -536 ) subway/1_tunnelwall_floor 0 0 0 1 0.500000 134217728 285212672 0 +( 1352 2608 -520 ) ( 1360 2608 -520 ) ( 1360 2224 -520 ) subway/1_tunnelwall_floor 0 0 0 1 0.500000 134217728 285212672 0 +( 1544 2484 -584 ) ( 1544 2100 -584 ) ( 1544 2100 -616 ) subway/1_tunnelwall_floor 8 16 0 1 0.500000 134217728 285212672 0 +( 1200 1992 -584 ) ( 1208 1992 -584 ) ( 1208 1992 -616 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 134217728 285212672 0 +( 1576 2200 -576 ) ( 1576 2584 -576 ) ( 1576 2584 -608 ) subway/1_tunnelwall_floor 8 16 0 1 0.500000 134217728 285212672 0 +( 1368 2024 -576 ) ( 1360 2024 -576 ) ( 1360 2024 -608 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 134217728 285212672 0 +} +// brush 1946 +{ +( 1360 2216 -520 ) ( 1360 2600 -520 ) ( 1352 2600 -520 ) subway/1_tunnelwall 0 -16 0 1 1 134217728 301989888 0 +( 1352 2608 -488 ) ( 1360 2608 -488 ) ( 1360 2224 -488 ) subway/1_tunnelwall 0 -16 0 1 1 134217728 301989888 0 +( 1544 2484 -568 ) ( 1544 2100 -568 ) ( 1544 2100 -600 ) subway/1_tunnelwall 8 -8 0 1 1 134217728 301989888 0 +( 1200 1992 -568 ) ( 1208 1992 -568 ) ( 1208 1992 -600 ) subway/1_tunnelwall 0 -8 0 1 1 134217728 301989888 0 +( 1576 2200 -560 ) ( 1576 2584 -560 ) ( 1576 2584 -592 ) subway/1_tunnelwall 8 -8 0 1 1 134217728 301989888 0 +( 1368 2024 -560 ) ( 1360 2024 -560 ) ( 1360 2024 -592 ) subway/1_tunnelwall 0 -8 0 1 1 134217728 301989888 0 +} +// brush 1947 +{ +( 1360 2216 -488 ) ( 1360 2600 -488 ) ( 1352 2600 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1352 2608 -480 ) ( 1360 2608 -480 ) ( 1360 2224 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1544 2484 -544 ) ( 1544 2100 -544 ) ( 1544 2100 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1200 1992 -544 ) ( 1208 1992 -544 ) ( 1208 1992 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1576 2200 -544 ) ( 1576 2584 -544 ) ( 1576 2584 -576 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1368 2024 -544 ) ( 1360 2024 -544 ) ( 1360 2024 -576 ) subway/1_trim1 0 0 0 -0.500000 0.500000 134217728 0 0 +} +// brush 1948 +{ +( 1368 2024 -472 ) ( 1360 2024 -472 ) ( 1360 2024 -504 ) subway/1_tile_middle 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2200 -472 ) ( 1576 2584 -472 ) ( 1576 2584 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1200 1992 -480 ) ( 1208 1992 -480 ) ( 1208 1992 -512 ) subway/1_tile_middle 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2484 -472 ) ( 1544 2100 -472 ) ( 1544 2100 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1352 2608 -400 ) ( 1360 2608 -400 ) ( 1360 2224 -400 ) subway/1_tile_middle 16 -16 0 0.500000 0.500000 134217728 318767104 0 +( 1360 2216 -416 ) ( 1360 2600 -416 ) ( 1352 2600 -416 ) subway/1_tile_middle 16 -16 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1949 +{ +( 1368 2024 -496 ) ( 1360 2024 -496 ) ( 1360 2024 -528 ) subway/1_tile -16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2200 -496 ) ( 1576 2584 -496 ) ( 1576 2584 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 134217728 318767104 0 +( 1200 1992 -496 ) ( 1208 1992 -496 ) ( 1208 1992 -528 ) subway/1_tile -16 16 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2484 -496 ) ( 1544 2100 -496 ) ( 1544 2100 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 134217728 318767104 0 +( 1352 2608 -416 ) ( 1360 2608 -416 ) ( 1360 2224 -416 ) subway/1_tile -16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1360 2216 -464 ) ( 1360 2600 -464 ) ( 1352 2600 -464 ) subway/1_tile -16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1950 +{ +( 1360 2216 -480 ) ( 1360 2600 -480 ) ( 1352 2600 -480 ) subway/1_tile_bottom 16 -16 0 0.500000 0.500000 134217728 318767104 0 +( 1352 2608 -464 ) ( 1360 2608 -464 ) ( 1360 2224 -464 ) subway/1_tile_bottom 16 -16 0 0.500000 0.500000 134217728 318767104 0 +( 1544 2484 -528 ) ( 1544 2100 -528 ) ( 1544 2100 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1200 1992 -528 ) ( 1208 1992 -528 ) ( 1208 1992 -560 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 134217728 318767104 0 +( 1576 2200 -528 ) ( 1576 2584 -528 ) ( 1576 2584 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 1368 2024 -528 ) ( 1360 2024 -528 ) ( 1360 2024 -560 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 1951 +{ +( 1880 2440 -480 ) ( 1880 2440 -464 ) ( 1880 2384 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1888 2440 -480 ) ( 1888 2440 -464 ) ( 1880 2440 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 2440 -464 ) ( 1912 2440 -480 ) ( 1912 2256 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2408 -432 ) ( 1896 2408 -432 ) ( 1896 2408 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2320 -464 ) ( 1872 2344 -464 ) ( 1896 2344 -464 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1896 2344 -480 ) ( 1872 2344 -480 ) ( 1872 2320 -480 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1952 +{ +( 1896 2184 -480 ) ( 1872 2184 -480 ) ( 1872 2160 -480 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1872 2160 -464 ) ( 1872 2184 -464 ) ( 1896 2184 -464 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1872 2248 -432 ) ( 1896 2248 -432 ) ( 1896 2248 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 2280 -464 ) ( 1912 2280 -480 ) ( 1912 2096 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1888 2280 -480 ) ( 1888 2280 -464 ) ( 1880 2280 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1880 2280 -480 ) ( 1880 2280 -464 ) ( 1880 2224 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1953 +{ +( 2192 2416 -544 ) ( 2168 2416 -544 ) ( 2168 2296 -544 ) subway/1_tunnelfloor_2 2 -7 -90 1 -1 0 285212672 0 +( 2152 2272 -536 ) ( 2152 2392 -536 ) ( 2176 2392 -536 ) subway/1_tunnelfloor_2 -10 7 -90 1 1 0 285212672 0 +( 1568 2248 -536 ) ( 1568 2424 -536 ) ( 1568 2424 -544 ) subway/1_tunnelfloor_2 0 22 -180 1 1 0 285212672 0 +( 1568 2240 -536 ) ( 1568 2240 -544 ) ( 1544 2264 -544 ) subway/1_tunnelfloor_2 -8 22 -180 1 1 0 285212672 0 +( 1544 2264 -544 ) ( 1544 2416 -544 ) ( 1544 2416 -536 ) subway/1_tunnelfloor_2 0 22 -180 1 1 0 285212672 0 +( 1568 2424 -536 ) ( 1544 2448 -536 ) ( 1544 2448 -544 ) subway/1_tunnelfloor_2 0 22 -180 1 1 0 285212672 0 +} +// brush 1954 +{ +( 1568 2424 -544 ) ( 1544 2448 -544 ) ( 1544 2448 -536 ) subway/1_tunneltrack_plain -32 0 0 1 1 0 301989888 0 +( 1712 2424 -536 ) ( 1712 2424 -544 ) ( 1568 2424 -544 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1712 2424 -544 ) ( 1712 2424 -536 ) ( 1680 2448 -536 ) subway/1_tunneltrack_plain -32 0 0 1 1 0 301989888 0 +( 1704 2448 -536 ) ( 1544 2448 -536 ) ( 1544 2448 -544 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1648 2472 -536 ) ( 1264 2472 -536 ) ( 1264 2480 -536 ) subway/1_tunnelfloor_2 19 16 0 1 -1 0 285212672 0 +( 1264 2480 -544 ) ( 1264 2472 -544 ) ( 1648 2472 -544 ) subway/1_tunneltrack_plain 0 32 0 1 1 0 301989888 0 +} +// brush 1955 +{ +( 1536 2968 -432 ) ( 1536 2944 -432 ) ( 1536 2944 -440 ) subway/1_tunnelwall -48 16 0 0.500000 0.500000 0 301989888 0 +( 1544 3096 -504 ) ( 1544 3120 -504 ) ( 1544 3120 -512 ) subway/1_tunnelwall -56 -8 0 1 1 0 301989888 0 +( 1824 2280 -552 ) ( 1944 2280 -552 ) ( 1944 2280 -560 ) subway/1_tunnelwall 16 -8 0 1 1 0 301989888 0 +( 1880 3016 -488 ) ( 1880 3040 -488 ) ( 2000 3040 -488 ) subway/1_tunnelwall 32 48 0 0.500000 0.500000 0 301989888 0 +( 1992 3056 -520 ) ( 1872 3056 -520 ) ( 1872 3032 -520 ) subway/1_tunnelwall 32 48 0 0.500000 0.500000 0 301989888 0 +( 1672 2448 -520 ) ( 1688 2448 -520 ) ( 1680 2448 -488 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +} +// brush 1956 +{ +( 1992 2424 -536 ) ( 1872 2424 -536 ) ( 1872 2400 -536 ) subway/con6 32 16 0 0.500000 0.500000 0 285212672 0 +( 1880 2384 -520 ) ( 1880 2408 -520 ) ( 2000 2408 -520 ) subway/con6 32 16 0 0.500000 0.500000 0 285212672 0 +( 1544 2712 -520 ) ( 1544 2736 -520 ) ( 1544 2736 -528 ) subway/1_tunnelwall_floor -56 16 0 1 0.500000 0 285212672 0 +( 1536 2336 -448 ) ( 1536 2312 -448 ) ( 1536 2312 -456 ) subway/con6 -48 48 0 0.500000 0.500000 0 285212672 0 +( 1692 2448 -520 ) ( 1668 2448 -520 ) ( 1692 2448 -536 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1656 2280 -520 ) ( 1680 2280 -520 ) ( 1656 2280 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 1957 +{ +( 1680 2296 -488 ) ( 1560 2296 -488 ) ( 1560 2288 -488 ) subway/2_warning 16 16 0 0.500000 0.500000 0 0 0 +( 1560 2288 -480 ) ( 1560 2296 -480 ) ( 1680 2296 -480 ) subway/2_warning -1 7 90 0.500000 0.500000 0 0 0 +( 1424 2280 -480 ) ( 1544 2280 -480 ) ( 1544 2280 -496 ) subway/1_tunnelfloor_2 27 -16 0 1 1 0 285212672 0 +( 1544 2376 -480 ) ( 1544 2376 -496 ) ( 1544 2368 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1552 2448 -496 ) ( 1552 2448 -480 ) ( 1544 2448 -480 ) subway/2_warning 16 16 0 0.500000 0.500000 0 0 0 +( 1536 2312 -480 ) ( 1536 2304 -480 ) ( 1536 2304 -496 ) subway/1_tunnelfloor_2 -21 -16 0 1 1 0 285212672 0 +} +// brush 1958 +{ +( 1680 2008 -488 ) ( 1560 2008 -488 ) ( 1560 2000 -488 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1560 2000 -480 ) ( 1560 2008 -480 ) ( 1680 2008 -480 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1424 1992 -480 ) ( 1544 1992 -480 ) ( 1544 1992 -496 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1544 2072 -480 ) ( 1544 2072 -496 ) ( 1544 2064 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1552 2144 -496 ) ( 1552 2144 -480 ) ( 1544 2144 -480 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1536 2008 -480 ) ( 1536 2000 -480 ) ( 1536 2000 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 1959 +{ +( 1992 2136 -536 ) ( 1872 2136 -536 ) ( 1872 2112 -536 ) subway/con6 -32 16 0 0.500000 0.500000 0 285212672 0 +( 1880 2096 -520 ) ( 1880 2120 -520 ) ( 2000 2120 -520 ) subway/con6 -32 16 0 0.500000 0.500000 0 285212672 0 +( 1544 2408 -520 ) ( 1544 2432 -520 ) ( 1544 2432 -528 ) subway/1_tunnelwall_floor 40 16 0 1 0.500000 0 285212672 0 +( 1536 2048 -448 ) ( 1536 2024 -448 ) ( 1536 2024 -456 ) subway/con6 16 48 0 0.500000 0.500000 0 285212672 0 +( 1692 2144 -520 ) ( 1668 2144 -520 ) ( 1692 2144 -536 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1656 1992 -520 ) ( 1680 1992 -520 ) ( 1656 1992 -536 ) subway/con6 -32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 1960 +{ +( 1536 2680 -432 ) ( 1536 2656 -432 ) ( 1536 2656 -440 ) subway/1_tunnelwall 16 16 0 0.500000 0.500000 0 301989888 0 +( 1544 2792 -504 ) ( 1544 2816 -504 ) ( 1544 2816 -512 ) subway/1_tunnelwall 40 -8 0 1 1 0 301989888 0 +( 1824 1992 -552 ) ( 1944 1992 -552 ) ( 1944 1992 -560 ) subway/1_tunnelwall 16 -8 0 1 1 0 301989888 0 +( 1880 2728 -488 ) ( 1880 2752 -488 ) ( 2000 2752 -488 ) subway/1_tunnelwall -32 -16 0 0.500000 0.500000 0 301989888 0 +( 1992 2768 -520 ) ( 1872 2768 -520 ) ( 1872 2744 -520 ) subway/1_tunnelwall -32 -16 0 0.500000 0.500000 0 301989888 0 +( 1672 2144 -520 ) ( 1688 2144 -520 ) ( 1680 2144 -488 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +} +// brush 1961 +{ +( 1352 2504 -480 ) ( 1352 2888 -480 ) ( 1344 2888 -480 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1344 2896 -464 ) ( 1352 2896 -464 ) ( 1352 2512 -464 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1536 2772 -528 ) ( 1536 2388 -528 ) ( 1536 2388 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 2280 -528 ) ( 1200 2280 -528 ) ( 1200 2280 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1544 2488 -528 ) ( 1544 2872 -528 ) ( 1544 2872 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1360 2448 -528 ) ( 1352 2448 -528 ) ( 1352 2448 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1962 +{ +( 1608 2200 -392 ) ( 1584 2200 -392 ) ( 1584 2176 -392 ) subway/con10 16 0 0 0.500000 0.500000 0 285212672 0 +( 1584 2176 -368 ) ( 1584 2200 -368 ) ( 1608 2200 -368 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1592 1792 -376 ) ( 1616 1792 -376 ) ( 1616 1792 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1688 2336 -376 ) ( 1688 2360 -376 ) ( 1688 2360 -424 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1544 2160 -376 ) ( 1544 2136 -376 ) ( 1544 2136 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1656 2440 -392 ) ( 1688 2440 -392 ) ( 1672 2440 -368 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 1963 +{ +( 1360 2448 -496 ) ( 1352 2448 -496 ) ( 1352 2448 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1544 2472 -472 ) ( 1544 2856 -472 ) ( 1544 2856 -504 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 1192 2280 -496 ) ( 1200 2280 -496 ) ( 1200 2280 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1536 2756 -496 ) ( 1536 2372 -496 ) ( 1536 2372 -528 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 1344 2880 -416 ) ( 1352 2880 -416 ) ( 1352 2496 -416 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1352 2488 -464 ) ( 1352 2872 -464 ) ( 1344 2872 -464 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 1964 +{ +( 1360 2448 -472 ) ( 1352 2448 -472 ) ( 1352 2448 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1544 2472 -472 ) ( 1544 2856 -472 ) ( 1544 2856 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 2280 -480 ) ( 1200 2280 -480 ) ( 1200 2280 -512 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1536 2756 -472 ) ( 1536 2372 -472 ) ( 1536 2372 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1344 2880 -400 ) ( 1352 2880 -400 ) ( 1352 2496 -400 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 1352 2488 -416 ) ( 1352 2872 -416 ) ( 1344 2872 -416 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1965 +{ +( 1360 2448 -464 ) ( 1352 2448 -464 ) ( 1352 2448 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1544 2472 -464 ) ( 1544 2856 -464 ) ( 1544 2856 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1192 2280 -464 ) ( 1200 2280 -464 ) ( 1200 2280 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1536 2756 -464 ) ( 1536 2372 -464 ) ( 1536 2372 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1344 2880 -392 ) ( 1352 2880 -392 ) ( 1352 2496 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1352 2488 -400 ) ( 1352 2872 -400 ) ( 1344 2872 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1966 +{ +( 1360 2280 -464 ) ( 1352 2280 -464 ) ( 1352 2280 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1544 2336 -464 ) ( 1544 2720 -464 ) ( 1544 2720 -496 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 2144 -464 ) ( 1200 2144 -464 ) ( 1200 2144 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1536 2620 -464 ) ( 1536 2236 -464 ) ( 1536 2236 -496 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1344 2744 -392 ) ( 1352 2744 -392 ) ( 1352 2360 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1352 2352 -400 ) ( 1352 2736 -400 ) ( 1344 2736 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1967 +{ +( 1360 2280 -472 ) ( 1352 2280 -472 ) ( 1352 2280 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1544 2336 -472 ) ( 1544 2720 -472 ) ( 1544 2720 -504 ) subway/1_tile_middle -16 0 0 0.500000 0.500000 0 318767104 0 +( 1192 2144 -480 ) ( 1200 2144 -480 ) ( 1200 2144 -512 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1536 2620 -472 ) ( 1536 2236 -472 ) ( 1536 2236 -504 ) subway/1_tile_middle -16 0 0 0.500000 0.500000 0 318767104 0 +( 1344 2744 -400 ) ( 1352 2744 -400 ) ( 1352 2360 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1352 2352 -416 ) ( 1352 2736 -416 ) ( 1344 2736 -416 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1968 +{ +( 1360 2280 -496 ) ( 1352 2280 -496 ) ( 1352 2280 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1544 2336 -472 ) ( 1544 2720 -472 ) ( 1544 2720 -504 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1192 2144 -496 ) ( 1200 2144 -496 ) ( 1200 2144 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1536 2620 -496 ) ( 1536 2236 -496 ) ( 1536 2236 -528 ) subway/1_tile -16 16 0 0.500000 0.500000 0 318767104 0 +( 1344 2744 -416 ) ( 1352 2744 -416 ) ( 1352 2360 -416 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1352 2352 -440 ) ( 1352 2736 -440 ) ( 1344 2736 -440 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1969 +{ +( 1688 1992 -488 ) ( 1568 1992 -488 ) ( 1568 1984 -488 ) subway/1_trim1 0 -16 0 0.500000 0.500000 0 0 0 +( 1568 1984 -480 ) ( 1568 1992 -480 ) ( 1688 1992 -480 ) subway/1_trim1 0 -16 0 0.500000 0.500000 0 0 0 +( 1688 1984 -480 ) ( 1688 1984 -488 ) ( 1536 1984 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1680 1984 -488 ) ( 1680 1984 -480 ) ( 1680 1992 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1696 1992 -496 ) ( 1696 1992 -480 ) ( 1568 1992 -480 ) subway/1_trim1 0 0 0 -0.500000 0.500000 0 0 0 +( 1544 1992 -480 ) ( 1544 1984 -480 ) ( 1544 1984 -496 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +} +// brush 1970 +{ +( 1352 2216 -480 ) ( 1352 2600 -480 ) ( 1344 2600 -480 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1344 2608 -464 ) ( 1352 2608 -464 ) ( 1352 2224 -464 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1536 2484 -528 ) ( 1536 2100 -528 ) ( 1536 2100 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1992 -528 ) ( 1200 1992 -528 ) ( 1200 1992 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1544 2200 -528 ) ( 1544 2584 -528 ) ( 1544 2584 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1360 2144 -528 ) ( 1352 2144 -528 ) ( 1352 2144 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1971 +{ +( 1360 2144 -496 ) ( 1352 2144 -496 ) ( 1352 2144 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1544 2200 -496 ) ( 1544 2584 -496 ) ( 1544 2584 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1192 1992 -496 ) ( 1200 1992 -496 ) ( 1200 1992 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1536 2484 -496 ) ( 1536 2100 -496 ) ( 1536 2100 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1344 2608 -416 ) ( 1352 2608 -416 ) ( 1352 2224 -416 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1352 2216 -464 ) ( 1352 2600 -464 ) ( 1344 2600 -464 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1972 +{ +( 1360 2144 -472 ) ( 1352 2144 -472 ) ( 1352 2144 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1544 2200 -472 ) ( 1544 2584 -472 ) ( 1544 2584 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1992 -480 ) ( 1200 1992 -480 ) ( 1200 1992 -512 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1536 2484 -472 ) ( 1536 2100 -472 ) ( 1536 2100 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1344 2608 -400 ) ( 1352 2608 -400 ) ( 1352 2224 -400 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 1352 2216 -416 ) ( 1352 2600 -416 ) ( 1344 2600 -416 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1973 +{ +( 1360 2144 -464 ) ( 1352 2144 -464 ) ( 1352 2144 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1544 2200 -464 ) ( 1544 2584 -464 ) ( 1544 2584 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1992 -464 ) ( 1200 1992 -464 ) ( 1200 1992 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1536 2484 -464 ) ( 1536 2100 -464 ) ( 1536 2100 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1344 2608 -392 ) ( 1352 2608 -392 ) ( 1352 2224 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1352 2216 -400 ) ( 1352 2600 -400 ) ( 1344 2600 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1974 +{ +( 1544 1992 -536 ) ( 1544 1992 -544 ) ( 1568 2016 -544 ) subway/1_tunneltrack_plain 24 0 0 1 1 0 301989888 0 +( 1672 2016 -528 ) ( 1288 2016 -528 ) ( 1288 2016 -560 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1680 1992 -544 ) ( 1680 1992 -536 ) ( 1712 2016 -536 ) subway/1_tunneltrack_plain 24 0 0 1 1 0 301989888 0 +( 1680 1992 -536 ) ( 1680 1992 -544 ) ( 1544 1992 -544 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1264 1960 -536 ) ( 1264 1968 -536 ) ( 1648 1968 -536 ) subway/1_tunnelfloor_2 35 -24 0 1 1 0 285212672 0 +( 1648 1968 -544 ) ( 1264 1968 -544 ) ( 1264 1960 -544 ) subway/1_tunneltrack_plain 0 -24 0 1 1 0 301989888 0 +} +// brush 1975 +{ +( 2168 2128 -544 ) ( 2168 2008 -544 ) ( 2192 2008 -544 ) subway/1_tunnelfloor_2 -22 -8 -90 1 -1 0 285212672 0 +( 2176 2032 -536 ) ( 2152 2032 -536 ) ( 2152 2152 -536 ) subway/1_tunnelfloor_2 -2 8 -90 1 1 0 285212672 0 +( 1568 2008 -544 ) ( 1568 2008 -536 ) ( 1568 2184 -536 ) subway/1_tunnelfloor_2 -24 23 -180 1 1 0 285212672 0 +( 1544 2160 -544 ) ( 1568 2184 -544 ) ( 1568 2184 -536 ) subway/1_tunnelfloor_2 0 23 -180 1 1 0 285212672 0 +( 1544 2008 -536 ) ( 1544 2008 -544 ) ( 1544 2160 -544 ) subway/1_tunnelfloor_2 -24 23 -180 1 1 0 285212672 0 +( 1544 1992 -544 ) ( 1544 1992 -536 ) ( 1568 2016 -536 ) subway/1_tunnelfloor_2 -24 23 -180 1 1 0 285212672 0 +} +// brush 1976 +{ +( 1872 2632 -552 ) ( 1752 2632 -552 ) ( 1752 2608 -552 ) subway/1_tunneltrack_plain 16 16 0 0.500000 0.500000 0 301989888 0 +( 1752 2600 -536 ) ( 1752 2624 -536 ) ( 1872 2624 -536 ) subway/1_tunnelfloor_2 8 -8 90 -1 -1 0 285212672 0 +( 1712 3504 -520 ) ( 1712 3528 -520 ) ( 1712 3528 -528 ) subway/1_tunneltrack_plain -16 16 0 0.500000 0.500000 0 301989888 0 +( 1880 2904 -480 ) ( 1760 2904 -480 ) ( 1760 2904 -488 ) subway/1_tunneltrack_plain 16 16 0 0.500000 0.500000 0 301989888 0 +( 1680 2448 -536 ) ( 1680 2448 -552 ) ( 1680 2904 -552 ) subway/1_tunneltrack_plain -16 16 0 0.500000 0.500000 0 301989888 0 +( 1680 2448 -552 ) ( 1680 2448 -536 ) ( 1712 2424 -536 ) subway/1_tunneltrack_plain -16 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 1977 +{ +( 1536 2464 -432 ) ( 1536 2440 -432 ) ( 1536 2440 -440 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1688 2640 -504 ) ( 1688 2664 -504 ) ( 1688 2664 -512 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1816 1792 -552 ) ( 1936 1792 -552 ) ( 1936 1792 -560 ) subway/1_tunnelwall 16 -8 0 1 1 0 301989888 0 +( 1880 2576 -488 ) ( 1880 2600 -488 ) ( 2000 2600 -488 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1992 2616 -520 ) ( 1872 2616 -520 ) ( 1872 2592 -520 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1672 1992 -520 ) ( 1688 1992 -520 ) ( 1680 1992 -488 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +} +// brush 1978 +{ +( 1680 1984 -488 ) ( 1680 1984 -480 ) ( 1680 1544 -480 ) subway/2_warning 0 16 0 0.500000 0.500000 0 0 0 +( 1680 1984 -480 ) ( 1680 1984 -488 ) ( 1688 1984 -488 ) subway/2_warning 16 16 0 0.500000 0.500000 0 0 0 +( 1688 1320 -472 ) ( 1688 1328 -472 ) ( 1688 1328 -504 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1264 1536 -480 ) ( 1264 1544 -480 ) ( 1648 1544 -480 ) subway/2_warning 14 8 90 0.500000 0.500000 0 0 0 +( 1648 1544 -488 ) ( 1264 1544 -488 ) ( 1264 1536 -488 ) subway/2_warning 16 0 0 0.500000 0.500000 0 0 0 +( 1736 1352 -496 ) ( 1680 1352 -496 ) ( 1708 1352 -480 ) subway/2_warning 16 0 0 0.500000 0.500000 0 0 0 +} +// brush 1979 +{ +( 1552 2144 -536 ) ( 1552 2168 -536 ) ( 1544 2168 -536 ) subway/metalrib1 32 24 0 0.500000 0.500000 134217728 16777216 0 +( 1544 2144 -424 ) ( 1544 2160 -440 ) ( 1552 2160 -440 ) subway/metalrib1 32 24 0 0.500000 0.500000 134217728 16777216 0 +( 1544 2144 -520 ) ( 1544 2144 -488 ) ( 1552 2144 -488 ) subway/metalrib1 32 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1544 2168 -520 ) ( 1544 2168 -488 ) ( 1544 2144 -488 ) subway/metalrib1 -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1552 2160 -536 ) ( 1552 2160 -456 ) ( 1544 2160 -456 ) subway/metalrib1 32 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1552 2144 -536 ) ( 1552 2144 -504 ) ( 1552 2168 -504 ) subway/metalrib1 -16 -24 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1980 +{ +( 1552 2264 -536 ) ( 1552 2288 -536 ) ( 1544 2288 -536 ) subway/metalrib1 32 24 0 0.500000 0.500000 134217728 16777216 0 +( 1552 2280 -424 ) ( 1552 2264 -440 ) ( 1544 2264 -440 ) subway/metalrib1 32 24 0 0.500000 0.500000 134217728 16777216 0 +( 1544 2264 -536 ) ( 1544 2264 -456 ) ( 1552 2264 -456 ) subway/metalrib1 32 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1544 2288 -536 ) ( 1544 2288 -504 ) ( 1544 2264 -504 ) subway/metalrib1 -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1552 2280 -536 ) ( 1552 2280 -504 ) ( 1544 2280 -504 ) subway/metalrib1 32 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1552 2264 -520 ) ( 1552 2264 -488 ) ( 1552 2288 -488 ) subway/metalrib1 -16 -24 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1981 +{ +( 1552 2192 -424 ) ( 1552 2224 -424 ) ( 1552 2224 -448 ) subway/metalrib1 0 -8 90 0.500000 0.500000 134217728 16777216 0 +( 1544 2264 -440 ) ( 1544 2160 -440 ) ( 1552 2160 -440 ) subway/metalrib1 0 24 0 0.500000 0.500000 134217728 16777216 0 +( 1544 2192 -448 ) ( 1544 2224 -448 ) ( 1544 2224 -424 ) subway/metalrib1 0 -8 90 0.500000 0.500000 134217728 16777216 0 +( 1544 2192 -424 ) ( 1544 2224 -424 ) ( 1552 2224 -424 ) subway/metalrib1 -7 8 180 0.500000 0.500000 134217728 16777216 0 +( 1544 2280 -424 ) ( 1544 2264 -440 ) ( 1552 2264 -440 ) subway/metalrib1 -15 8 90 0.500000 0.500000 134217728 16777216 0 +( 1552 2144 -424 ) ( 1552 2160 -440 ) ( 1544 2160 -440 ) subway/metalrib1 -15 8 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1982 +{ +( 1432 2432 -440 ) ( 1432 2424 -440 ) ( 1496 2424 -440 ) subway/con10 16 0 0 0.500000 0.500000 0 285212672 0 +( 1496 2424 -432 ) ( 1432 2424 -432 ) ( 1432 2432 -432 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1520 2280 -440 ) ( 1520 2280 -424 ) ( 1440 2280 -424 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1544 2424 -440 ) ( 1544 2424 -432 ) ( 1544 2432 -432 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1560 2144 -432 ) ( 1560 2144 -440 ) ( 1472 2144 -440 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1432 2432 -464 ) ( 1432 2432 -448 ) ( 1432 2424 -448 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +} +// brush 1983 +{ +( 1376 2808 -544 ) ( 1376 2784 -544 ) ( 1496 2784 -544 ) subway/1_tunnelfloor_2 16 16 0 1 -1 0 285212672 0 +( 1520 2768 -536 ) ( 1400 2768 -536 ) ( 1400 2792 -536 ) subway/1_tunnelfloor_2 19 -16 0 1 1 0 285212672 0 +( 1568 2184 -544 ) ( 1568 2184 -536 ) ( 1336 2184 -536 ) subway/1_tunnelfloor_2 16 24 0 1 -1 0 285212672 0 +( 1568 2184 -536 ) ( 1568 2184 -544 ) ( 1544 2160 -544 ) subway/1_tunnelfloor_2 0 24 0 1 -1 0 285212672 0 +( 1544 2160 -536 ) ( 1544 2160 -544 ) ( 1312 2160 -544 ) subway/1_tunnelfloor_2 16 24 0 1 -1 0 285212672 0 +( 1312 2160 -536 ) ( 1312 2160 -544 ) ( 1336 2184 -544 ) subway/1_tunnelfloor_2 0 24 0 1 -1 0 285212672 0 +} +// brush 1984 +{ +( 1392 2240 -536 ) ( 1392 2240 -544 ) ( 1416 2264 -544 ) subway/1_tunnelfloor_2 -24 24 0 1 -1 0 285212672 0 +( 1544 2264 -544 ) ( 1544 2264 -536 ) ( 1416 2264 -536 ) subway/1_tunnelfloor_2 24 24 0 1 -1 0 285212672 0 +( 1544 2264 -536 ) ( 1544 2264 -544 ) ( 1568 2240 -544 ) subway/1_tunnelfloor_2 1 24 0 1 -1 0 285212672 0 +( 1568 2240 -536 ) ( 1568 2240 -544 ) ( 1392 2240 -544 ) subway/1_tunnelfloor_2 24 24 0 1 -1 0 285212672 0 +( 1456 1640 -536 ) ( 1456 1664 -536 ) ( 1576 1664 -536 ) subway/1_tunnelfloor_2 0 8 0 1 -1 0 285212672 0 +( 1552 1632 -544 ) ( 1432 1632 -544 ) ( 1432 1608 -544 ) subway/1_tunnelfloor_2 24 17 0 1 -1 0 285212672 0 +} +// brush 1985 +{ +( 1360 1720 -544 ) ( 1240 1720 -544 ) ( 1240 1696 -544 ) subway/1_tunneltrack_plain 16 16 0 0.500000 0.500000 0 301989888 0 +( 1240 1720 -536 ) ( 1240 1744 -536 ) ( 1360 1744 -536 ) subway/1_tunneltrack_plain 32 896 0 1 1 0 301989888 0 +( 1176 2184 -568 ) ( 1296 2184 -568 ) ( 1296 2184 -576 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( 1568 1664 -520 ) ( 1568 1688 -520 ) ( 1568 1688 -528 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +( 1416 2240 -480 ) ( 1296 2240 -480 ) ( 1296 2240 -488 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( 1392 2224 -520 ) ( 1392 2200 -520 ) ( 1392 2200 -528 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1986 +{ +( 1464 2144 -504 ) ( 1464 2152 -504 ) ( 1400 2152 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1400 2152 -472 ) ( 1464 2152 -472 ) ( 1464 2144 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 2144 -504 ) ( 1296 2144 -472 ) ( 1544 2144 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 2152 -504 ) ( 1304 2152 -472 ) ( 1296 2144 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 2152 -472 ) ( 1304 2152 -504 ) ( 1544 2152 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1544 2144 -504 ) ( 1544 2144 -488 ) ( 1544 2152 -488 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 1987 +{ +( 1544 2144 -496 ) ( 1544 2144 -480 ) ( 1544 2152 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1304 2152 -456 ) ( 1304 2152 -472 ) ( 1544 2152 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1304 2152 -472 ) ( 1304 2152 -456 ) ( 1296 2144 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 2144 -472 ) ( 1296 2144 -456 ) ( 1544 2144 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1400 2152 -456 ) ( 1464 2152 -456 ) ( 1464 2144 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1464 2144 -472 ) ( 1464 2152 -472 ) ( 1400 2152 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 1988 +{ +( 1544 2272 -480 ) ( 1544 2280 -480 ) ( 1544 2280 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1456 2272 -480 ) ( 1520 2272 -480 ) ( 1520 2272 -496 ) subway/1_trim1 16 0 0 -1 1 0 0 0 +( 1432 2280 -472 ) ( 1432 2280 -456 ) ( 1424 2272 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1432 2280 -456 ) ( 1432 2280 -472 ) ( 1584 2280 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1584 2280 -456 ) ( 1584 2272 -456 ) ( 1520 2272 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1520 2272 -472 ) ( 1584 2272 -472 ) ( 1584 2280 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 1989 +{ +( 1520 2272 -504 ) ( 1584 2272 -504 ) ( 1584 2280 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1584 2280 -472 ) ( 1584 2272 -472 ) ( 1520 2272 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1432 2280 -472 ) ( 1432 2280 -504 ) ( 1584 2280 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1432 2280 -504 ) ( 1432 2280 -472 ) ( 1424 2272 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1456 2272 -488 ) ( 1520 2272 -488 ) ( 1520 2272 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1544 2272 -488 ) ( 1544 2280 -488 ) ( 1544 2280 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 1990 +{ +( 1936 2280 -544 ) ( 1936 2160 -544 ) ( 1960 2160 -544 ) subway/1_tunnelfloor_2 -31 0 -90 1 -1 0 285212672 0 +( 1944 2184 -536 ) ( 1920 2184 -536 ) ( 1920 2304 -536 ) subway/1_tunnelfloor_2 -11 0 -90 1 1 0 285212672 0 +( 1336 2160 -544 ) ( 1336 2160 -536 ) ( 1336 2336 -536 ) subway/1_tunnelfloor_2 0 23 -180 1 1 0 285212672 0 +( 1312 2344 -544 ) ( 1336 2368 -544 ) ( 1336 2368 -536 ) subway/1_tunnelfloor_2 -8 23 -180 1 1 0 285212672 0 +( 1312 2160 -536 ) ( 1312 2160 -544 ) ( 1312 2312 -544 ) subway/1_tunnelfloor_2 0 23 -180 1 1 0 285212672 0 +( 1312 2160 -544 ) ( 1312 2160 -536 ) ( 1336 2184 -536 ) subway/1_tunnelfloor_2 0 23 -180 1 1 0 285212672 0 +} +// brush 1991 +{ +( 1304 2152 -456 ) ( 1304 2152 -472 ) ( 1296 2144 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1304 2152 -472 ) ( 1304 2152 -456 ) ( 1304 2304 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1304 2336 -456 ) ( 1296 2328 -456 ) ( 1296 2328 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 2216 -472 ) ( 1296 2296 -472 ) ( 1296 2296 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1304 2224 -456 ) ( 1304 2160 -456 ) ( 1296 2160 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1296 2160 -472 ) ( 1304 2160 -472 ) ( 1304 2224 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 1992 +{ +( 1296 2160 -504 ) ( 1304 2160 -504 ) ( 1304 2224 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 2224 -472 ) ( 1304 2160 -472 ) ( 1296 2160 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 2248 -504 ) ( 1296 2328 -504 ) ( 1296 2328 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 2336 -472 ) ( 1296 2328 -472 ) ( 1296 2328 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 2152 -504 ) ( 1304 2152 -472 ) ( 1304 2304 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 2152 -472 ) ( 1304 2152 -504 ) ( 1296 2144 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 1993 +{ +( 1904 1648 -504 ) ( 1904 1648 -536 ) ( 1856 1648 -536 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1720 2264 -728 ) ( 1720 2264 -768 ) ( 1720 2256 -768 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 1904 2904 -536 ) ( 1904 2904 -504 ) ( 1856 2904 -504 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1712 2064 -516 ) ( 1712 1800 -516 ) ( 1712 1800 -548 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 1800 1928 -528 ) ( 1800 2192 -528 ) ( 1832 2192 -528 ) subway/metal2 32 0 0 0.500000 0.500000 0 16777216 0 +( 1904 2064 -536 ) ( 1904 2072 -536 ) ( 1856 2072 -536 ) subway/metal2 32 0 0 0.500000 0.500000 0 16777216 0 +( 1744 1992 -264 ) ( 1680 1992 -264 ) ( 1680 1992 -254 ) subway/1_tunneltrack_1 -33 -20 195 1 1 0 16777216 0 +} +// brush 1994 +{ +( 1784 2624 -520 ) ( 1784 2600 -520 ) ( 1784 2600 -528 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 2024 2904 -480 ) ( 1904 2904 -480 ) ( 1904 2904 -488 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 1816 1968 -520 ) ( 1816 1992 -520 ) ( 1816 1992 -528 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 1808 1992 -568 ) ( 1928 1992 -568 ) ( 1928 1992 -576 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 1864 2008 -536 ) ( 1864 2032 -536 ) ( 1984 2032 -536 ) subway/1_tunnelfloor_2 -8 8 90 1 1 0 285212672 0 +( 1960 2008 -552 ) ( 1840 2008 -552 ) ( 1840 1984 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1995 +{ +( 1976 2064 -536 ) ( 1976 2072 -536 ) ( 1928 2072 -536 ) subway/metal2 40 0 0 0.500000 0.500000 0 16777216 0 +( 1872 1928 -528 ) ( 1872 2192 -528 ) ( 1904 2192 -528 ) subway/metal2 40 0 0 0.500000 0.500000 0 16777216 0 +( 1784 2600 -516 ) ( 1784 2336 -516 ) ( 1784 2336 -548 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 1976 2904 -536 ) ( 1976 2904 -504 ) ( 1928 2904 -504 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 1792 2240 -728 ) ( 1792 2240 -768 ) ( 1792 2232 -768 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 1976 1648 -504 ) ( 1976 1648 -536 ) ( 1928 1648 -536 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 1800 1992 -264 ) ( 1760 1992 -264 ) ( 1760 1992 -254 ) subway/1_tunneltrack_1 -37 -21 195 1 1 0 16777216 0 +} +// brush 1996 +{ +( 1720 3232 -512 ) ( 1720 3208 -512 ) ( 1720 3208 -520 ) subway/1_tunneltrack_1 -36 8 0 1 1 0 16777216 0 +( 1976 2904 -480 ) ( 1856 2904 -480 ) ( 1856 2904 -488 ) subway/1_tunneltrack_1 28 8 0 1 1 0 16777216 0 +( 1784 3192 -520 ) ( 1784 3216 -520 ) ( 1784 3216 -528 ) subway/1_tunneltrack_1 -36 8 0 1 1 0 16777216 0 +( 1772 1992 -568 ) ( 1892 1992 -568 ) ( 1892 1992 -576 ) subway/1_tunneltrack_1 28 8 0 1 1 0 16777216 0 +( 1836 2480 -536 ) ( 1836 2504 -536 ) ( 1956 2504 -536 ) subway/1_tunneltrack_1 52 56 0 1 1 0 16777216 0 +( 1956 2520 -544 ) ( 1836 2520 -544 ) ( 1836 2496 -544 ) subway/1_tunneltrack_1 28 56 0 1 1 0 16777216 0 +} +// brush 1997 +{ +( 888 960 -136 ) ( 888 960 -152 ) ( 872 960 -152 ) subway/1_black 0 -15 0 0.500000 0.500000 134217728 16777216 0 +( 872 992 -152 ) ( 888 992 -152 ) ( 888 992 -136 ) subway/1_black 0 -15 0 0.500000 0.500000 134217728 16777216 0 +( 882 960 -144 ) ( 882 992 -144 ) ( 872 992 -144 ) subway/light_small 1 3 -90 1 1 134217728 1 3000 +( 872 932 -136 ) ( 872 932 -144 ) ( 872 948 -144 ) subway/1_black 0 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 882 992 -144 ) ( 882 960 -144 ) ( 872 960 -136 ) subway/1_black 0 -14 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1998 +{ +( 888 1120 -136 ) ( 888 1120 -152 ) ( 872 1120 -152 ) subway/1_black 0 -15 0 0.500000 0.500000 134217728 16777216 0 +( 872 1152 -152 ) ( 888 1152 -152 ) ( 888 1152 -136 ) subway/1_black 0 -15 0 0.500000 0.500000 134217728 16777216 0 +( 882 1120 -144 ) ( 882 1152 -144 ) ( 872 1152 -144 ) subway/light_small 33 3 -90 1 1 134217728 1 3000 +( 872 1092 -136 ) ( 872 1092 -144 ) ( 872 1108 -144 ) subway/1_black 0 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 882 1152 -144 ) ( 882 1120 -144 ) ( 872 1120 -136 ) subway/1_black 0 0 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1999 +{ +( 888 816 -136 ) ( 888 816 -152 ) ( 872 816 -152 ) subway/1_black 0 -15 0 0.500000 0.500000 134217728 16777216 0 +( 872 848 -152 ) ( 888 848 -152 ) ( 888 848 -136 ) subway/1_black 0 -15 0 0.500000 0.500000 134217728 16777216 0 +( 882 816 -144 ) ( 882 848 -144 ) ( 872 848 -144 ) subway/light_small -15 4 -90 1 1 134217728 1 3000 +( 872 788 -136 ) ( 872 788 -144 ) ( 872 804 -144 ) subway/1_black 0 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 882 848 -144 ) ( 882 816 -144 ) ( 872 816 -136 ) subway/1_black 0 0 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 2000 +{ +( 688 816 -176 ) ( 680 816 -176 ) ( 680 816 -144 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 688 816 -40 ) ( 688 824 -40 ) ( 688 824 -72 ) subway/clip 16 0 0 0.500000 0.500000 196608 128 0 +( 688 824 -120 ) ( 680 816 -120 ) ( 680 816 -152 ) subway/clip 16 0 0 0.500000 0.500000 196608 128 0 +( 672 824 -168 ) ( 672 816 -168 ) ( 688 816 -168 ) subway/clip 0 -16 0 0.500000 0.500000 196608 128 0 +( 688 816 -48 ) ( 672 816 -48 ) ( 672 824 -48 ) subway/clip 0 -16 0 0.500000 0.500000 196608 128 0 +} +// brush 2001 +{ +( 680 608 -144 ) ( 680 608 -176 ) ( 688 608 -176 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 688 600 -72 ) ( 688 600 -40 ) ( 688 608 -40 ) subway/clip -48 0 0 0.500000 0.500000 196608 128 0 +( 680 608 -152 ) ( 680 608 -120 ) ( 688 600 -120 ) subway/clip -48 0 0 0.500000 0.500000 196608 128 0 +( 688 608 -168 ) ( 672 608 -168 ) ( 672 600 -168 ) subway/clip 0 48 0 0.500000 0.500000 196608 128 0 +( 672 600 -48 ) ( 672 608 -48 ) ( 688 608 -48 ) subway/clip 0 48 0 0.500000 0.500000 196608 128 0 +} +// brush 2002 +{ +( 1048 80 -120 ) ( 1048 144 -120 ) ( 984 144 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 984 128 -104 ) ( 1048 128 -104 ) ( 1048 64 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 832 -48 -112 ) ( 896 -48 -112 ) ( 896 -48 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 1328 424 -112 ) ( 1328 488 -112 ) ( 1328 488 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1144 56 -112 ) ( 1080 56 -112 ) ( 1080 56 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1096 -40 -120 ) ( 1096 8 -120 ) ( 1096 -16 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2003 +{ +( 1048 80 -120 ) ( 1048 144 -120 ) ( 984 144 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 984 128 -104 ) ( 1048 128 -104 ) ( 1048 64 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 880 -16 -120 ) ( 880 -80 -120 ) ( 880 -80 -128 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 832 -48 -112 ) ( 896 -48 -112 ) ( 896 -48 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 1136 8 -112 ) ( 1072 8 -112 ) ( 1072 8 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1096 8 -120 ) ( 1096 -40 -120 ) ( 1096 -16 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2004 +{ +( 1336 256 -136 ) ( 1304 256 -136 ) ( 1304 216 -136 ) subway/1_lobby2 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1304 216 -120 ) ( 1304 256 -120 ) ( 1336 256 -120 ) subway/1_lobby2 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1304 216 -128 ) ( 1336 216 -128 ) ( 1336 216 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1336 216 -128 ) ( 1336 256 -128 ) ( 1336 256 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1336 248 -128 ) ( 1304 248 -128 ) ( 1304 248 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 256 -128 ) ( 1304 216 -128 ) ( 1304 216 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2005 +{ +( 1304 256 -144 ) ( 1304 216 -144 ) ( 1304 216 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1336 248 -144 ) ( 1304 248 -144 ) ( 1304 248 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1336 216 -144 ) ( 1336 256 -144 ) ( 1336 256 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1304 216 -144 ) ( 1336 216 -144 ) ( 1336 216 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1304 216 -136 ) ( 1304 256 -136 ) ( 1336 256 -136 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1336 264 -200 ) ( 1304 264 -200 ) ( 1304 224 -200 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2006 +{ +( 1336 264 -216 ) ( 1304 264 -216 ) ( 1304 224 -216 ) subway/1_lobby1 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1304 216 -200 ) ( 1304 256 -200 ) ( 1336 256 -200 ) subway/1_lobby1 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1304 216 -160 ) ( 1336 216 -160 ) ( 1336 216 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1336 216 -160 ) ( 1336 256 -160 ) ( 1336 256 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1336 248 -160 ) ( 1304 248 -160 ) ( 1304 248 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 256 -160 ) ( 1304 216 -160 ) ( 1304 216 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2007 +{ +( 1848 -184 -224 ) ( 1912 -184 -224 ) ( 1912 -120 -224 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1904 -96 -216 ) ( 1904 -160 -216 ) ( 1840 -160 -216 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 1736 72 -224 ) ( 1672 72 -224 ) ( 1672 72 -232 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 2200 -184 -216 ) ( 2264 -184 -216 ) ( 2264 -184 -224 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1328 -200 -216 ) ( 1328 -136 -216 ) ( 1328 -136 -224 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1096 8 -224 ) ( 1096 24 -224 ) ( 1096 16 -216 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2008 +{ +( 1848 -184 -224 ) ( 1912 -184 -224 ) ( 1912 -120 -224 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1904 -96 -216 ) ( 1904 -160 -216 ) ( 1840 -160 -216 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 1728 16 -224 ) ( 1664 16 -224 ) ( 1664 16 -232 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 -248 -216 ) ( 872 -312 -216 ) ( 872 -312 -224 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 2200 -184 -216 ) ( 2264 -184 -216 ) ( 2264 -184 -224 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1096 24 -224 ) ( 1096 8 -224 ) ( 1096 16 -216 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2009 +{ +( 1416 -160 -120 ) ( 1480 -160 -120 ) ( 1480 -96 -120 ) subway/1_lobby3 -32 0 0 1 1 0 285212672 0 +( 1464 -96 -104 ) ( 1464 -160 -104 ) ( 1400 -160 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1320 -40 -120 ) ( 1256 -40 -120 ) ( 1256 -40 -128 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 1296 72 -112 ) ( 1296 8 -112 ) ( 1296 8 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 1760 -160 -112 ) ( 1824 -160 -112 ) ( 1824 -160 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1328 -296 -112 ) ( 1328 -232 -112 ) ( 1328 -232 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 2010 +{ +( 1192 1480 -88 ) ( 1192 1624 -88 ) ( 1192 1624 -192 ) subway/1_tile -32 -48 0 -0.500000 0.500000 0 318767104 0 +( 1096 488 -264 ) ( 1096 488 -48 ) ( 1096 208 -48 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1208 -144 ) ( 1192 1208 -128 ) ( 1096 1208 -128 ) subway/1_tile 32 -48 0 -0.500000 0.500000 0 318767104 0 +( 1160 1200 -128 ) ( 1192 1200 -128 ) ( 1192 1208 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 15 +( 1096 1200 -128 ) ( 1096 1208 -128 ) ( 1192 1208 -128 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2011 +{ +( 1192 1184 -120 ) ( 1096 1184 -120 ) ( 1096 1208 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1208 -120 ) ( 1096 1208 -128 ) ( 1192 1208 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1184 -128 ) ( 1192 1184 -120 ) ( 1192 1208 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1184 -120 ) ( 1192 1200 -128 ) ( 1096 1200 -128 ) subway/1_tile_top 0 0 0 0.500000 -0.500000 0 318767104 15 +( 1096 1208 -128 ) ( 1096 1208 -120 ) ( 1096 1184 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1198 -124 ) ( 1096 1208 -124 ) ( 1096 1188 -124 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2012 +{ +( 1192 1200 -128 ) ( 1192 1208 -128 ) ( 1096 1208 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1208 -120 ) ( 1096 1208 -128 ) ( 1192 1208 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1184 -128 ) ( 1192 1184 -120 ) ( 1192 1208 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1184 -120 ) ( 1192 1200 -128 ) ( 1096 1200 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 15 +( 1096 1208 -128 ) ( 1096 1208 -120 ) ( 1096 1184 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1198 -124 ) ( 1096 1188 -124 ) ( 1096 1208 -124 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2013 +{ +( 1096 1016 -128 ) ( 1192 1016 -128 ) ( 1192 1024 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1016 -128 ) ( 1096 1016 -128 ) ( 1096 1016 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1016 -120 ) ( 1192 1040 -120 ) ( 1192 1040 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1024 -128 ) ( 1192 1024 -128 ) ( 1192 1040 -120 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 15 +( 1096 1040 -120 ) ( 1096 1016 -120 ) ( 1096 1016 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1016 -124 ) ( 1096 1036 -124 ) ( 1192 1026 -124 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2014 +{ +( 1096 1016 -120 ) ( 1096 1040 -120 ) ( 1192 1040 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1016 -128 ) ( 1096 1016 -128 ) ( 1096 1016 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1016 -120 ) ( 1192 1040 -120 ) ( 1192 1040 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1024 -128 ) ( 1192 1024 -128 ) ( 1192 1040 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 15 +( 1096 1040 -120 ) ( 1096 1016 -120 ) ( 1096 1016 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1036 -124 ) ( 1096 1016 -124 ) ( 1192 1026 -124 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2015 +{ +( 1192 600 -192 ) ( 1192 600 -88 ) ( 1192 744 -88 ) subway/1_tile 0 -48 0 -0.500000 0.500000 0 318767104 0 +( 1096 2016 -48 ) ( 1096 1736 -48 ) ( 1096 1736 -264 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1016 -128 ) ( 1192 1016 -128 ) ( 1192 1016 -144 ) subway/1_tile 32 -48 0 -0.500000 0.500000 0 318767104 0 +( 1192 1016 -144 ) ( 1192 1024 -128 ) ( 1160 1024 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 15 +( 1192 1016 -128 ) ( 1096 1016 -128 ) ( 1096 1024 -128 ) subway/1_tile 32 -32 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2016 +{ +( 1192 1224 -88 ) ( 1192 1368 -88 ) ( 1192 1368 -192 ) subway/1_tile 0 -48 0 -0.500000 0.500000 0 318767104 0 +( 1096 232 -264 ) ( 1096 232 -48 ) ( 1096 -48 -48 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 952 -144 ) ( 1192 952 -128 ) ( 1096 952 -128 ) subway/1_tile 32 -48 0 -0.500000 0.500000 0 318767104 0 +( 1160 944 -128 ) ( 1192 944 -128 ) ( 1192 952 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 14 +( 1096 944 -128 ) ( 1096 952 -128 ) ( 1192 952 -128 ) subway/1_tile 32 32 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2017 +{ +( 1192 928 -120 ) ( 1096 928 -120 ) ( 1096 952 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 952 -120 ) ( 1096 952 -128 ) ( 1192 952 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 928 -128 ) ( 1192 928 -120 ) ( 1192 952 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 928 -120 ) ( 1192 944 -128 ) ( 1096 944 -128 ) subway/1_tile_top 0 0 0 0.500000 -0.500000 0 318767104 14 +( 1096 952 -128 ) ( 1096 952 -120 ) ( 1096 928 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 942 -124 ) ( 1096 952 -124 ) ( 1096 932 -124 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2018 +{ +( 1192 944 -128 ) ( 1192 952 -128 ) ( 1096 952 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 952 -120 ) ( 1096 952 -128 ) ( 1192 952 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 928 -128 ) ( 1192 928 -120 ) ( 1192 952 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 928 -120 ) ( 1192 944 -128 ) ( 1096 944 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 14 +( 1096 952 -128 ) ( 1096 952 -120 ) ( 1096 928 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 942 -124 ) ( 1096 932 -124 ) ( 1096 952 -124 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2019 +{ +( 1096 696 -128 ) ( 1192 696 -128 ) ( 1192 704 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 696 -128 ) ( 1096 696 -128 ) ( 1096 696 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 696 -120 ) ( 1192 720 -120 ) ( 1192 720 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 704 -128 ) ( 1192 704 -128 ) ( 1192 720 -120 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 14 +( 1096 720 -120 ) ( 1096 696 -120 ) ( 1096 696 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 696 -124 ) ( 1096 716 -124 ) ( 1192 706 -124 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2020 +{ +( 1096 696 -120 ) ( 1096 720 -120 ) ( 1192 720 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 696 -128 ) ( 1096 696 -128 ) ( 1096 696 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 696 -120 ) ( 1192 720 -120 ) ( 1192 720 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 704 -128 ) ( 1192 704 -128 ) ( 1192 720 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 14 +( 1096 720 -120 ) ( 1096 696 -120 ) ( 1096 696 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 716 -124 ) ( 1096 696 -124 ) ( 1192 706 -124 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2021 +{ +( 1192 280 -192 ) ( 1192 280 -88 ) ( 1192 424 -88 ) subway/1_tile 32 -48 0 -0.500000 0.500000 0 318767104 0 +( 1096 1696 -48 ) ( 1096 1416 -48 ) ( 1096 1416 -264 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1096 696 -128 ) ( 1192 696 -128 ) ( 1192 696 -144 ) subway/1_tile 32 -48 0 -0.500000 0.500000 0 318767104 0 +( 1192 696 -144 ) ( 1192 704 -128 ) ( 1160 704 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 14 +( 1192 696 -128 ) ( 1096 696 -128 ) ( 1096 704 -128 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2022 +{ +( 872 1216 -128 ) ( 904 1264 -128 ) ( 896 1264 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 1216 -120 ) ( 896 1264 -120 ) ( 904 1264 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 1216 -120 ) ( 904 1264 -120 ) ( 904 1264 -128 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 16 +( 864 1216 -128 ) ( 864 1216 -120 ) ( 872 1216 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 1216 -128 ) ( 896 1264 -128 ) ( 896 1264 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 884 1228 -120 ) ( 880 1232 -128 ) ( 888 1224 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2023 +{ +( 872 1216 -160 ) ( 904 1264 -160 ) ( 896 1264 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 1216 -128 ) ( 896 1264 -128 ) ( 904 1264 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 1216 -128 ) ( 904 1264 -128 ) ( 904 1264 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 864 1216 -136 ) ( 864 1216 -128 ) ( 872 1216 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 1216 -160 ) ( 896 1264 -160 ) ( 896 1264 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 884 1228 -128 ) ( 880 1232 -160 ) ( 888 1224 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2024 +{ +( 872 1216 -176 ) ( 904 1264 -176 ) ( 896 1264 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 1216 -160 ) ( 896 1264 -160 ) ( 904 1264 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 1216 -160 ) ( 904 1264 -160 ) ( 904 1264 -176 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 16 +( 864 1216 -152 ) ( 864 1216 -144 ) ( 872 1216 -144 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 1216 -176 ) ( 896 1264 -176 ) ( 896 1264 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 884 1228 -160 ) ( 880 1232 -176 ) ( 888 1224 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2025 +{ +( 872 1216 -200 ) ( 904 1264 -200 ) ( 896 1264 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 1216 -176 ) ( 896 1264 -176 ) ( 904 1264 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 1216 -176 ) ( 904 1264 -176 ) ( 904 1264 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 864 1216 -168 ) ( 864 1216 -160 ) ( 872 1216 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 1216 -200 ) ( 896 1264 -200 ) ( 896 1264 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 884 1228 -176 ) ( 880 1232 -200 ) ( 888 1224 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2026 +{ +( 872 1216 -216 ) ( 904 1264 -216 ) ( 896 1264 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 864 1216 -200 ) ( 896 1264 -200 ) ( 904 1264 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 872 1216 -200 ) ( 904 1264 -200 ) ( 904 1264 -216 ) subway/1_tile_bottom 0 16 -180 0.500000 -0.500000 0 318767104 16 +( 864 1216 -176 ) ( 864 1216 -168 ) ( 872 1216 -168 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 864 1216 -216 ) ( 896 1264 -216 ) ( 896 1264 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 884 1228 -200 ) ( 880 1232 -216 ) ( 888 1224 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2027 +{ +( 848 1216 -216 ) ( 848 1208 -216 ) ( 896 1240 -216 ) subway/1_tile_bottom 0 15 90 0.500000 0.500000 0 318767104 0 +( 848 1208 -200 ) ( 848 1216 -200 ) ( 896 1248 -200 ) subway/1_tile_bottom 0 15 90 0.500000 0.500000 0 318767104 0 +( 848 1208 -216 ) ( 848 1208 -200 ) ( 896 1240 -200 ) subway/1_tile_bottom 0 16 -180 0.500000 -0.500000 0 318767104 16 +( 896 1240 -168 ) ( 896 1248 -168 ) ( 896 1248 -176 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 848 1216 -200 ) ( 848 1216 -216 ) ( 896 1248 -216 ) subway/1_tile_bottom 0 16 -180 0.500000 -0.500000 0 318767104 0 +( 888 1224 -216 ) ( 880 1232 -216 ) ( 884 1228 -200 ) subway/1_tile_bottom 0 16 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2028 +{ +( 848 1216 -200 ) ( 848 1208 -200 ) ( 896 1240 -200 ) subway/1_tile -32 0 90 0.500000 0.500000 0 318767104 0 +( 848 1208 -176 ) ( 848 1216 -176 ) ( 896 1248 -176 ) subway/1_tile -32 0 90 0.500000 0.500000 0 318767104 0 +( 848 1208 -200 ) ( 848 1208 -176 ) ( 896 1240 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 896 1240 -160 ) ( 896 1248 -160 ) ( 896 1248 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 848 1216 -176 ) ( 848 1216 -200 ) ( 896 1248 -200 ) subway/1_tile 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 888 1224 -200 ) ( 880 1232 -200 ) ( 884 1228 -176 ) subway/1_tile 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2029 +{ +( 848 1216 -176 ) ( 848 1208 -176 ) ( 896 1240 -176 ) subway/1_tile_middle 0 31 90 0.500000 0.500000 0 318767104 0 +( 848 1208 -160 ) ( 848 1216 -160 ) ( 896 1248 -160 ) subway/1_tile_middle 0 31 90 0.500000 0.500000 0 318767104 0 +( 848 1208 -176 ) ( 848 1208 -160 ) ( 896 1240 -160 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 16 +( 896 1240 -144 ) ( 896 1248 -144 ) ( 896 1248 -152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 848 1216 -160 ) ( 848 1216 -176 ) ( 896 1248 -176 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 888 1224 -176 ) ( 880 1232 -176 ) ( 884 1228 -160 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2030 +{ +( 848 1216 -160 ) ( 848 1208 -160 ) ( 896 1240 -160 ) subway/1_tile -32 0 90 0.500000 0.500000 0 318767104 0 +( 848 1208 -128 ) ( 848 1216 -128 ) ( 896 1248 -128 ) subway/1_tile -32 0 90 0.500000 0.500000 0 318767104 0 +( 848 1208 -160 ) ( 848 1208 -128 ) ( 896 1240 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 896 1240 -128 ) ( 896 1248 -128 ) ( 896 1248 -136 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 848 1216 -128 ) ( 848 1216 -160 ) ( 896 1248 -160 ) subway/1_tile 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 888 1224 -160 ) ( 880 1232 -160 ) ( 884 1228 -128 ) subway/1_tile 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2031 +{ +( 848 1216 -128 ) ( 848 1208 -128 ) ( 896 1240 -128 ) subway/1_tile_top 0 15 90 0.500000 0.500000 0 318767104 0 +( 848 1208 -120 ) ( 848 1216 -120 ) ( 896 1248 -120 ) subway/1_tile_top 0 15 90 0.500000 0.500000 0 318767104 0 +( 848 1208 -128 ) ( 848 1208 -120 ) ( 896 1240 -120 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 16 +( 896 1240 -120 ) ( 896 1248 -120 ) ( 896 1248 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 848 1216 -120 ) ( 848 1216 -128 ) ( 896 1248 -128 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 888 1224 -128 ) ( 880 1232 -128 ) ( 884 1228 -120 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2032 +{ +( 1072 1240 -128 ) ( 1120 1208 -128 ) ( 1120 1216 -128 ) subway/1_tile_top 0 15 90 0.500000 0.500000 0 318767104 0 +( 1072 1248 -120 ) ( 1120 1216 -120 ) ( 1120 1208 -120 ) subway/1_tile_top 0 15 90 0.500000 0.500000 0 318767104 0 +( 1072 1240 -120 ) ( 1120 1208 -120 ) ( 1120 1208 -128 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 16 +( 1072 1248 -128 ) ( 1072 1248 -120 ) ( 1072 1240 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1072 1248 -128 ) ( 1120 1216 -128 ) ( 1120 1216 -120 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 1084 1228 -120 ) ( 1088 1232 -128 ) ( 1080 1224 -128 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2033 +{ +( 1072 1240 -160 ) ( 1120 1208 -160 ) ( 1120 1216 -160 ) subway/1_tile -32 31 90 0.500000 0.500000 0 318767104 0 +( 1072 1248 -128 ) ( 1120 1216 -128 ) ( 1120 1208 -128 ) subway/1_tile -32 31 90 0.500000 0.500000 0 318767104 0 +( 1072 1240 -128 ) ( 1120 1208 -128 ) ( 1120 1208 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 1072 1248 -136 ) ( 1072 1248 -128 ) ( 1072 1240 -128 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1072 1248 -160 ) ( 1120 1216 -160 ) ( 1120 1216 -128 ) subway/1_tile -32 0 -180 0.500000 -0.500000 0 318767104 0 +( 1084 1228 -128 ) ( 1088 1232 -160 ) ( 1080 1224 -160 ) subway/1_tile 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2034 +{ +( 1072 1240 -176 ) ( 1120 1208 -176 ) ( 1120 1216 -176 ) subway/1_tile_middle 0 31 90 0.500000 0.500000 0 318767104 0 +( 1072 1248 -160 ) ( 1120 1216 -160 ) ( 1120 1208 -160 ) subway/1_tile_middle 0 31 90 0.500000 0.500000 0 318767104 0 +( 1072 1240 -160 ) ( 1120 1208 -160 ) ( 1120 1208 -176 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 16 +( 1072 1248 -152 ) ( 1072 1248 -144 ) ( 1072 1240 -144 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1072 1248 -176 ) ( 1120 1216 -176 ) ( 1120 1216 -160 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 1084 1228 -160 ) ( 1088 1232 -176 ) ( 1080 1224 -176 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2035 +{ +( 1072 1240 -200 ) ( 1120 1208 -200 ) ( 1120 1216 -200 ) subway/1_tile -32 31 90 0.500000 0.500000 0 318767104 0 +( 1072 1248 -176 ) ( 1120 1216 -176 ) ( 1120 1208 -176 ) subway/1_tile -32 31 90 0.500000 0.500000 0 318767104 0 +( 1072 1240 -176 ) ( 1120 1208 -176 ) ( 1120 1208 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 1072 1248 -168 ) ( 1072 1248 -160 ) ( 1072 1240 -160 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1072 1248 -200 ) ( 1120 1216 -200 ) ( 1120 1216 -176 ) subway/1_tile -32 0 -180 0.500000 -0.500000 0 318767104 0 +( 1084 1228 -176 ) ( 1088 1232 -200 ) ( 1080 1224 -200 ) subway/1_tile 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2036 +{ +( 1072 1240 -216 ) ( 1120 1208 -216 ) ( 1120 1216 -216 ) subway/1_tile_bottom 0 15 90 0.500000 0.500000 0 318767104 0 +( 1072 1248 -200 ) ( 1120 1216 -200 ) ( 1120 1208 -200 ) subway/1_tile_bottom 0 15 90 0.500000 0.500000 0 318767104 0 +( 1072 1240 -200 ) ( 1120 1208 -200 ) ( 1120 1208 -216 ) subway/1_tile_bottom 0 16 -180 0.500000 -0.500000 0 318767104 16 +( 1072 1248 -176 ) ( 1072 1248 -168 ) ( 1072 1240 -168 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1072 1248 -216 ) ( 1120 1216 -216 ) ( 1120 1216 -200 ) subway/1_tile_bottom 0 16 -180 0.500000 -0.500000 0 318767104 0 +( 1084 1228 -200 ) ( 1088 1232 -216 ) ( 1080 1224 -216 ) subway/1_tile_bottom 0 16 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2037 +{ +( 1072 1264 -216 ) ( 1064 1264 -216 ) ( 1096 1216 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1064 1264 -200 ) ( 1072 1264 -200 ) ( 1104 1216 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1064 1264 -216 ) ( 1064 1264 -200 ) ( 1096 1216 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 16 +( 1096 1216 -168 ) ( 1104 1216 -168 ) ( 1104 1216 -176 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1072 1264 -200 ) ( 1072 1264 -216 ) ( 1104 1216 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1080 1224 -216 ) ( 1088 1232 -216 ) ( 1084 1228 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2038 +{ +( 1072 1264 -200 ) ( 1064 1264 -200 ) ( 1096 1216 -200 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1064 1264 -176 ) ( 1072 1264 -176 ) ( 1104 1216 -176 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1064 1264 -200 ) ( 1064 1264 -176 ) ( 1096 1216 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 1096 1216 -160 ) ( 1104 1216 -160 ) ( 1104 1216 -168 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1072 1264 -176 ) ( 1072 1264 -200 ) ( 1104 1216 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1080 1224 -200 ) ( 1088 1232 -200 ) ( 1084 1228 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2039 +{ +( 1072 1264 -176 ) ( 1064 1264 -176 ) ( 1096 1216 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 1264 -160 ) ( 1072 1264 -160 ) ( 1104 1216 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 1264 -176 ) ( 1064 1264 -160 ) ( 1096 1216 -160 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 16 +( 1096 1216 -144 ) ( 1104 1216 -144 ) ( 1104 1216 -152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1072 1264 -160 ) ( 1072 1264 -176 ) ( 1104 1216 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1080 1224 -176 ) ( 1088 1232 -176 ) ( 1084 1228 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2040 +{ +( 1072 1264 -160 ) ( 1064 1264 -160 ) ( 1096 1216 -160 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1064 1264 -128 ) ( 1072 1264 -128 ) ( 1104 1216 -128 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1064 1264 -160 ) ( 1064 1264 -128 ) ( 1096 1216 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 1096 1216 -128 ) ( 1104 1216 -128 ) ( 1104 1216 -136 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1072 1264 -128 ) ( 1072 1264 -160 ) ( 1104 1216 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1080 1224 -160 ) ( 1088 1232 -160 ) ( 1084 1228 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2041 +{ +( 1072 1264 -128 ) ( 1064 1264 -128 ) ( 1096 1216 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 1264 -120 ) ( 1072 1264 -120 ) ( 1104 1216 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 1264 -128 ) ( 1064 1264 -120 ) ( 1096 1216 -120 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 16 +( 1096 1216 -120 ) ( 1104 1216 -120 ) ( 1104 1216 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1072 1264 -120 ) ( 1072 1264 -128 ) ( 1104 1216 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1080 1224 -128 ) ( 1088 1232 -128 ) ( 1084 1228 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2042 +{ +( 1096 592 -128 ) ( 1064 544 -128 ) ( 1072 544 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1104 592 -120 ) ( 1072 544 -120 ) ( 1064 544 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 592 -120 ) ( 1064 544 -120 ) ( 1064 544 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 17 +( 1104 592 -128 ) ( 1104 592 -120 ) ( 1096 592 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1104 592 -128 ) ( 1072 544 -128 ) ( 1072 544 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1084 580 -120 ) ( 1088 576 -128 ) ( 1080 584 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2043 +{ +( 1096 592 -160 ) ( 1064 544 -160 ) ( 1072 544 -160 ) subway/1_tile -32 -32 0 0.500000 0.500000 0 318767104 0 +( 1104 592 -128 ) ( 1072 544 -128 ) ( 1064 544 -128 ) subway/1_tile -32 -32 0 0.500000 0.500000 0 318767104 0 +( 1096 592 -128 ) ( 1064 544 -128 ) ( 1064 544 -160 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 17 +( 1104 592 -136 ) ( 1104 592 -128 ) ( 1096 592 -128 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1104 592 -160 ) ( 1072 544 -160 ) ( 1072 544 -128 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1084 580 -128 ) ( 1088 576 -160 ) ( 1080 584 -160 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2044 +{ +( 1096 592 -176 ) ( 1064 544 -176 ) ( 1072 544 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1104 592 -160 ) ( 1072 544 -160 ) ( 1064 544 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 592 -160 ) ( 1064 544 -160 ) ( 1064 544 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 17 +( 1104 592 -152 ) ( 1104 592 -144 ) ( 1096 592 -144 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1104 592 -176 ) ( 1072 544 -176 ) ( 1072 544 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1084 580 -160 ) ( 1088 576 -176 ) ( 1080 584 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2045 +{ +( 1096 592 -200 ) ( 1064 544 -200 ) ( 1072 544 -200 ) subway/1_tile -32 -32 0 0.500000 0.500000 0 318767104 0 +( 1104 592 -176 ) ( 1072 544 -176 ) ( 1064 544 -176 ) subway/1_tile -32 -32 0 0.500000 0.500000 0 318767104 0 +( 1096 592 -176 ) ( 1064 544 -176 ) ( 1064 544 -200 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 17 +( 1104 592 -168 ) ( 1104 592 -160 ) ( 1096 592 -160 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1104 592 -200 ) ( 1072 544 -200 ) ( 1072 544 -176 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1084 580 -176 ) ( 1088 576 -200 ) ( 1080 584 -200 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2046 +{ +( 1096 592 -216 ) ( 1064 544 -216 ) ( 1072 544 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1104 592 -200 ) ( 1072 544 -200 ) ( 1064 544 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1096 592 -200 ) ( 1064 544 -200 ) ( 1064 544 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 17 +( 1104 592 -176 ) ( 1104 592 -168 ) ( 1096 592 -168 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1104 592 -216 ) ( 1072 544 -216 ) ( 1072 544 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1084 580 -200 ) ( 1088 576 -216 ) ( 1080 584 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2047 +{ +( 1120 592 -216 ) ( 1120 600 -216 ) ( 1072 568 -216 ) subway/1_tile_bottom 0 -16 90 0.500000 0.500000 0 318767104 0 +( 1120 600 -200 ) ( 1120 592 -200 ) ( 1072 560 -200 ) subway/1_tile_bottom 0 -16 90 0.500000 0.500000 0 318767104 0 +( 1120 600 -216 ) ( 1120 600 -200 ) ( 1072 568 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 17 +( 1072 568 -168 ) ( 1072 560 -168 ) ( 1072 560 -176 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1120 592 -200 ) ( 1120 592 -216 ) ( 1072 560 -216 ) subway/1_tile_bottom 0 16 -180 0.500000 -0.500000 0 318767104 0 +( 1080 584 -216 ) ( 1088 576 -216 ) ( 1084 580 -200 ) subway/1_tile_bottom 0 16 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2048 +{ +( 1120 592 -200 ) ( 1120 600 -200 ) ( 1072 568 -200 ) subway/1_tile 0 -32 90 0.500000 0.500000 0 318767104 0 +( 1120 600 -176 ) ( 1120 592 -176 ) ( 1072 560 -176 ) subway/1_tile 0 -32 90 0.500000 0.500000 0 318767104 0 +( 1120 600 -200 ) ( 1120 600 -176 ) ( 1072 568 -176 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 17 +( 1072 568 -160 ) ( 1072 560 -160 ) ( 1072 560 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1120 592 -176 ) ( 1120 592 -200 ) ( 1072 560 -200 ) subway/1_tile 32 0 -180 0.500000 -0.500000 0 318767104 0 +( 1080 584 -200 ) ( 1088 576 -200 ) ( 1084 580 -176 ) subway/1_tile 32 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2049 +{ +( 1120 592 -176 ) ( 1120 600 -176 ) ( 1072 568 -176 ) subway/1_tile_middle 0 0 90 0.500000 0.500000 0 318767104 0 +( 1120 600 -160 ) ( 1120 592 -160 ) ( 1072 560 -160 ) subway/1_tile_middle 0 0 90 0.500000 0.500000 0 318767104 0 +( 1120 600 -176 ) ( 1120 600 -160 ) ( 1072 568 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 17 +( 1072 568 -144 ) ( 1072 560 -144 ) ( 1072 560 -152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1120 592 -160 ) ( 1120 592 -176 ) ( 1072 560 -176 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 1080 584 -176 ) ( 1088 576 -176 ) ( 1084 580 -160 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2050 +{ +( 1120 592 -160 ) ( 1120 600 -160 ) ( 1072 568 -160 ) subway/1_tile 0 -32 90 0.500000 0.500000 0 318767104 0 +( 1120 600 -128 ) ( 1120 592 -128 ) ( 1072 560 -128 ) subway/1_tile 0 -32 90 0.500000 0.500000 0 318767104 0 +( 1120 600 -160 ) ( 1120 600 -128 ) ( 1072 568 -128 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 17 +( 1072 568 -128 ) ( 1072 560 -128 ) ( 1072 560 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1120 592 -128 ) ( 1120 592 -160 ) ( 1072 560 -160 ) subway/1_tile 32 0 -180 0.500000 -0.500000 0 318767104 0 +( 1080 584 -160 ) ( 1088 576 -160 ) ( 1084 580 -128 ) subway/1_tile 32 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2051 +{ +( 1120 592 -128 ) ( 1120 600 -128 ) ( 1072 568 -128 ) subway/1_tile_top 0 0 90 0.500000 0.500000 0 318767104 0 +( 1120 600 -120 ) ( 1120 592 -120 ) ( 1072 560 -120 ) subway/1_tile_top 0 0 90 0.500000 0.500000 0 318767104 0 +( 1120 600 -128 ) ( 1120 600 -120 ) ( 1072 568 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 17 +( 1072 568 -120 ) ( 1072 560 -120 ) ( 1072 560 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1120 592 -120 ) ( 1120 592 -128 ) ( 1072 560 -128 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 1080 584 -128 ) ( 1088 576 -128 ) ( 1084 580 -120 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2052 +{ +( 872 1096 -40 ) ( 872 1240 -40 ) ( 872 1240 -144 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 16 +( 840 104 -216 ) ( 840 104 0 ) ( 840 -176 0 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 712 -120 ) ( 840 648 -120 ) ( 776 648 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 776 648 -128 ) ( 840 648 -128 ) ( 840 712 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 832 784 -112 ) ( 848 784 -112 ) ( 832 784 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 848 816 -112 ) ( 840 816 -112 ) ( 848 816 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2053 +{ +( 872 1096 -80 ) ( 872 1240 -80 ) ( 872 1240 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 840 96 -248 ) ( 840 96 -32 ) ( 840 -184 -32 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 744 704 -176 ) ( 744 640 -176 ) ( 680 640 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 680 640 -200 ) ( 744 640 -200 ) ( 744 704 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 736 784 -152 ) ( 752 784 -152 ) ( 736 784 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 752 816 -152 ) ( 744 816 -152 ) ( 752 816 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2054 +{ +( 896 568 -128 ) ( 848 600 -128 ) ( 848 592 -128 ) subway/1_tile_top 0 0 90 0.500000 0.500000 0 318767104 0 +( 896 560 -120 ) ( 848 592 -120 ) ( 848 600 -120 ) subway/1_tile_top 0 0 90 0.500000 0.500000 0 318767104 0 +( 896 568 -120 ) ( 848 600 -120 ) ( 848 600 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 17 +( 896 560 -128 ) ( 896 560 -120 ) ( 896 568 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 896 560 -128 ) ( 848 592 -128 ) ( 848 592 -120 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 884 580 -120 ) ( 880 576 -128 ) ( 888 584 -128 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2055 +{ +( 896 568 -160 ) ( 848 600 -160 ) ( 848 592 -160 ) subway/1_tile 0 0 90 0.500000 0.500000 0 318767104 0 +( 896 560 -128 ) ( 848 592 -128 ) ( 848 600 -128 ) subway/1_tile 0 0 90 0.500000 0.500000 0 318767104 0 +( 896 568 -128 ) ( 848 600 -128 ) ( 848 600 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 896 560 -136 ) ( 896 560 -128 ) ( 896 568 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 896 560 -160 ) ( 848 592 -160 ) ( 848 592 -128 ) subway/1_tile 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 884 580 -128 ) ( 880 576 -160 ) ( 888 584 -160 ) subway/1_tile 32 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2056 +{ +( 896 568 -176 ) ( 848 600 -176 ) ( 848 592 -176 ) subway/1_tile_middle 0 0 90 0.500000 0.500000 0 318767104 0 +( 896 560 -160 ) ( 848 592 -160 ) ( 848 600 -160 ) subway/1_tile_middle 0 0 90 0.500000 0.500000 0 318767104 0 +( 896 568 -160 ) ( 848 600 -160 ) ( 848 600 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 17 +( 896 560 -152 ) ( 896 560 -144 ) ( 896 568 -144 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 896 560 -176 ) ( 848 592 -176 ) ( 848 592 -160 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 884 580 -160 ) ( 880 576 -176 ) ( 888 584 -176 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2057 +{ +( 896 568 -200 ) ( 848 600 -200 ) ( 848 592 -200 ) subway/1_tile 0 0 90 0.500000 0.500000 0 318767104 0 +( 896 560 -176 ) ( 848 592 -176 ) ( 848 600 -176 ) subway/1_tile 0 0 90 0.500000 0.500000 0 318767104 0 +( 896 568 -176 ) ( 848 600 -176 ) ( 848 600 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 896 560 -168 ) ( 896 560 -160 ) ( 896 568 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 896 560 -200 ) ( 848 592 -200 ) ( 848 592 -176 ) subway/1_tile 0 0 -180 0.500000 -0.500000 0 318767104 0 +( 884 580 -176 ) ( 880 576 -200 ) ( 888 584 -200 ) subway/1_tile 32 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2058 +{ +( 896 568 -216 ) ( 848 600 -216 ) ( 848 592 -216 ) subway/1_tile_bottom 0 -16 90 0.500000 0.500000 0 318767104 0 +( 896 560 -200 ) ( 848 592 -200 ) ( 848 600 -200 ) subway/1_tile_bottom 0 -16 90 0.500000 0.500000 0 318767104 0 +( 896 568 -200 ) ( 848 600 -200 ) ( 848 600 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 17 +( 896 560 -176 ) ( 896 560 -168 ) ( 896 568 -168 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 896 560 -216 ) ( 848 592 -216 ) ( 848 592 -200 ) subway/1_tile_bottom 0 16 -180 0.500000 -0.500000 0 318767104 0 +( 884 580 -200 ) ( 880 576 -216 ) ( 888 584 -216 ) subway/1_tile_bottom 0 16 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2059 +{ +( 896 544 -216 ) ( 904 544 -216 ) ( 872 592 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 904 544 -200 ) ( 896 544 -200 ) ( 864 592 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 904 544 -216 ) ( 904 544 -200 ) ( 872 592 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 17 +( 872 592 -168 ) ( 864 592 -168 ) ( 864 592 -176 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 896 544 -200 ) ( 896 544 -216 ) ( 864 592 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 888 584 -216 ) ( 880 576 -216 ) ( 884 580 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2060 +{ +( 896 544 -200 ) ( 904 544 -200 ) ( 872 592 -200 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( 904 544 -176 ) ( 896 544 -176 ) ( 864 592 -176 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( 904 544 -200 ) ( 904 544 -176 ) ( 872 592 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 592 -160 ) ( 864 592 -160 ) ( 864 592 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 896 544 -176 ) ( 896 544 -200 ) ( 864 592 -200 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 888 584 -200 ) ( 880 576 -200 ) ( 884 580 -176 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2061 +{ +( 896 544 -176 ) ( 904 544 -176 ) ( 872 592 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 904 544 -160 ) ( 896 544 -160 ) ( 864 592 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 904 544 -176 ) ( 904 544 -160 ) ( 872 592 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 17 +( 872 592 -144 ) ( 864 592 -144 ) ( 864 592 -152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 896 544 -160 ) ( 896 544 -176 ) ( 864 592 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 888 584 -176 ) ( 880 576 -176 ) ( 884 580 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2062 +{ +( 896 544 -160 ) ( 904 544 -160 ) ( 872 592 -160 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( 904 544 -128 ) ( 896 544 -128 ) ( 864 592 -128 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( 904 544 -160 ) ( 904 544 -128 ) ( 872 592 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 592 -128 ) ( 864 592 -128 ) ( 864 592 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 896 544 -128 ) ( 896 544 -160 ) ( 864 592 -160 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 888 584 -160 ) ( 880 576 -160 ) ( 884 580 -128 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2063 +{ +( 896 544 -128 ) ( 904 544 -128 ) ( 872 592 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 904 544 -120 ) ( 896 544 -120 ) ( 864 592 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 904 544 -128 ) ( 904 544 -120 ) ( 872 592 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 17 +( 872 592 -120 ) ( 864 592 -120 ) ( 864 592 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 896 544 -120 ) ( 896 544 -128 ) ( 864 592 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 888 584 -128 ) ( 880 576 -128 ) ( 884 580 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2064 +{ +( 872 920 -40 ) ( 872 1064 -40 ) ( 872 1064 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 -72 -216 ) ( 840 -72 0 ) ( 840 -352 0 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 536 -120 ) ( 840 472 -120 ) ( 776 472 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 776 472 -128 ) ( 840 472 -128 ) ( 840 536 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 832 608 -112 ) ( 848 608 -112 ) ( 832 608 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 848 640 -112 ) ( 840 640 -112 ) ( 848 640 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2065 +{ +( 872 920 -80 ) ( 872 1064 -80 ) ( 872 1064 -184 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 -72 -256 ) ( 840 -72 -40 ) ( 840 -352 -40 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 536 -160 ) ( 840 472 -160 ) ( 776 472 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 776 472 -176 ) ( 840 472 -176 ) ( 840 536 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 832 608 -152 ) ( 848 608 -152 ) ( 832 608 -184 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 848 640 -152 ) ( 840 640 -152 ) ( 848 640 -184 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2066 +{ +( 872 856 -128 ) ( 864 856 -128 ) ( 864 816 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 816 -120 ) ( 864 856 -120 ) ( 872 856 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 816 -120 ) ( 872 816 -120 ) ( 872 816 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 1008 -120 ) ( 872 1048 -120 ) ( 872 1048 -128 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 16 +( 872 1240 -120 ) ( 864 1240 -120 ) ( 864 1240 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 936 -120 ) ( 864 896 -120 ) ( 864 896 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2067 +{ +( 872 856 -160 ) ( 864 856 -160 ) ( 864 816 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 816 -128 ) ( 864 856 -128 ) ( 872 856 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 816 -128 ) ( 872 816 -128 ) ( 872 816 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 1008 -128 ) ( 872 1048 -128 ) ( 872 1048 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 872 1240 -128 ) ( 864 1240 -128 ) ( 864 1240 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 936 -128 ) ( 864 896 -128 ) ( 864 896 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2068 +{ +( 872 856 -176 ) ( 864 856 -176 ) ( 864 816 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 816 -160 ) ( 864 856 -160 ) ( 872 856 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 816 -144 ) ( 872 816 -144 ) ( 872 816 -152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 1008 -144 ) ( 872 1048 -144 ) ( 872 1048 -152 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 16 +( 872 1240 -144 ) ( 864 1240 -144 ) ( 864 1240 -152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 936 -144 ) ( 864 896 -144 ) ( 864 896 -152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2069 +{ +( 872 856 -200 ) ( 864 856 -200 ) ( 864 816 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 816 -176 ) ( 864 856 -176 ) ( 872 856 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 816 -160 ) ( 872 816 -160 ) ( 872 816 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 1008 -160 ) ( 872 1048 -160 ) ( 872 1048 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 872 1240 -160 ) ( 864 1240 -160 ) ( 864 1240 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 936 -160 ) ( 864 896 -160 ) ( 864 896 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2070 +{ +( 872 856 -216 ) ( 864 856 -216 ) ( 864 816 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 864 816 -200 ) ( 864 856 -200 ) ( 872 856 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 864 816 -168 ) ( 872 816 -168 ) ( 872 816 -176 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 872 1008 -168 ) ( 872 1048 -168 ) ( 872 1048 -176 ) subway/1_tile_bottom 0 16 -180 0.500000 -0.500000 0 318767104 16 +( 872 1240 -168 ) ( 864 1240 -168 ) ( 864 1240 -176 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 864 936 -160 ) ( 864 896 -160 ) ( 864 896 -168 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2071 +{ +( 872 600 -216 ) ( 864 600 -216 ) ( 864 560 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 864 560 -200 ) ( 864 600 -200 ) ( 872 600 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 864 592 -168 ) ( 872 592 -168 ) ( 872 592 -176 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 872 560 -168 ) ( 872 600 -168 ) ( 872 600 -176 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 17 +( 872 608 -168 ) ( 864 608 -168 ) ( 864 608 -176 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 864 600 -160 ) ( 864 560 -160 ) ( 864 560 -168 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2072 +{ +( 872 600 -200 ) ( 864 600 -200 ) ( 864 560 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 560 -176 ) ( 864 600 -176 ) ( 872 600 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 592 -160 ) ( 872 592 -160 ) ( 872 592 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 560 -160 ) ( 872 600 -160 ) ( 872 600 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 608 -160 ) ( 864 608 -160 ) ( 864 608 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 600 -160 ) ( 864 560 -160 ) ( 864 560 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2073 +{ +( 872 600 -176 ) ( 864 600 -176 ) ( 864 560 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 560 -160 ) ( 864 600 -160 ) ( 872 600 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 592 -144 ) ( 872 592 -144 ) ( 872 592 -152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 560 -144 ) ( 872 600 -144 ) ( 872 600 -152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 608 -144 ) ( 864 608 -144 ) ( 864 608 -152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 600 -144 ) ( 864 560 -144 ) ( 864 560 -152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2074 +{ +( 872 600 -160 ) ( 864 600 -160 ) ( 864 560 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 560 -128 ) ( 864 600 -128 ) ( 872 600 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 592 -128 ) ( 872 592 -128 ) ( 872 592 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 560 -128 ) ( 872 600 -128 ) ( 872 600 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 608 -128 ) ( 864 608 -128 ) ( 864 608 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 600 -128 ) ( 864 560 -128 ) ( 864 560 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2075 +{ +( 872 600 -128 ) ( 864 600 -128 ) ( 864 560 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 560 -120 ) ( 864 600 -120 ) ( 872 600 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 592 -120 ) ( 872 592 -120 ) ( 872 592 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 560 -120 ) ( 872 600 -120 ) ( 872 600 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 608 -120 ) ( 864 608 -120 ) ( 864 608 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 864 600 -120 ) ( 864 560 -120 ) ( 864 560 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2076 +{ +( 1104 1384 -200 ) ( 1040 1384 -200 ) ( 1040 1320 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1040 1304 -176 ) ( 1040 1368 -176 ) ( 1104 1368 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 968 1152 -200 ) ( 968 1152 -192 ) ( 968 1216 -192 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 928 560 -192 ) ( 928 560 -184 ) ( 992 560 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 1744 -192 ) ( 840 1744 -184 ) ( 840 1680 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1080 568 -184 ) ( 1080 568 -176 ) ( 1016 568 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2077 +{ +( 1104 1384 -160 ) ( 1040 1384 -160 ) ( 1040 1320 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1040 1304 -128 ) ( 1040 1368 -128 ) ( 1104 1368 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 968 1144 -176 ) ( 968 1144 -168 ) ( 968 1208 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 992 560 -168 ) ( 992 560 -160 ) ( 1056 560 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 1744 -168 ) ( 840 1744 -160 ) ( 840 1680 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1080 568 -160 ) ( 1080 568 -152 ) ( 1016 568 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2078 +{ +( 824 880 -120 ) ( 888 880 -120 ) ( 888 944 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 888 952 -64 ) ( 888 888 -64 ) ( 824 888 -64 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 872 1104 -128 ) ( 872 1104 -120 ) ( 872 1040 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 720 1240 -120 ) ( 720 1240 -112 ) ( 656 1240 -112 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 936 584 -120 ) ( 936 584 -112 ) ( 936 648 -112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 920 560 -120 ) ( 920 560 -112 ) ( 984 560 -112 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 2079 +{ +( 1184 600 -224 ) ( 1184 600 -216 ) ( 1120 600 -216 ) subway/1_lobby_floor_edge -16 48 0 0.500000 -0.500000 0 301989888 0 +( 840 2288 -224 ) ( 840 2288 -216 ) ( 840 2224 -216 ) subway/1_lobby_floor_edge -32 48 0 0.500000 -0.500000 0 301989888 0 +( 952 560 -224 ) ( 952 560 -216 ) ( 1016 560 -216 ) subway/1_lobby_floor_edge -16 48 0 0.500000 -0.500000 0 301989888 0 +( 1160 1680 -232 ) ( 1160 1680 -224 ) ( 1160 1744 -224 ) subway/1_lobby_floor_edge -32 48 0 0.500000 -0.500000 0 301989888 0 +( 1096 1840 -216 ) ( 1096 1904 -216 ) ( 1160 1904 -216 ) subway/1_lobby_floor_edge -16 16 0 0.500000 -0.500000 0 301989888 0 +( 1160 1928 -224 ) ( 1096 1928 -224 ) ( 1096 1864 -224 ) subway/1_lobby_floor_edge -16 -32 0 0.500000 -0.500000 0 301989888 0 +} +// brush 2080 +{ +( 1080 1240 -224 ) ( 1080 1240 -216 ) ( 1016 1240 -216 ) subway/1_lobby_floor_edge -16 16 0 0.500000 0.500000 0 301989888 0 +( 840 2448 -224 ) ( 840 2448 -216 ) ( 840 2384 -216 ) subway/1_lobby_floor_edge 16 16 0 0.500000 0.500000 0 301989888 0 +( 968 1208 -224 ) ( 968 1208 -216 ) ( 1032 1208 -216 ) subway/1_lobby_floor_edge -16 16 0 0.500000 0.500000 0 301989888 0 +( 1128 1856 -232 ) ( 1128 1856 -224 ) ( 1128 1920 -224 ) subway/1_lobby_floor_edge 16 16 0 0.500000 0.500000 0 301989888 0 +( 1096 2008 -216 ) ( 1096 2072 -216 ) ( 1160 2072 -216 ) subway/1_lobby_floor_edge -16 -16 0 0.500000 0.500000 0 301989888 0 +( 1160 2088 -224 ) ( 1096 2088 -224 ) ( 1096 2024 -224 ) subway/1_lobby_floor_edge -16 -16 0 0.500000 0.500000 0 301989888 0 +} +// brush 2081 +{ +( 1160 2056 -224 ) ( 1096 2056 -224 ) ( 1096 1992 -224 ) subway/1_lobby_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1096 1976 -216 ) ( 1096 2040 -216 ) ( 1160 2040 -216 ) subway/1_lobby_floor -16 -16 0 0.500000 0.500000 0 285212672 0 +( 1160 1816 -232 ) ( 1160 1816 -224 ) ( 1160 1880 -224 ) subway/1_lobby_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 952 600 -224 ) ( 952 600 -216 ) ( 1016 600 -216 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 840 2416 -224 ) ( 840 2416 -216 ) ( 840 2352 -216 ) subway/1_lobby_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1176 1208 -224 ) ( 1176 1208 -216 ) ( 1112 1208 -216 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2082 +{ +( 1122 1092 -136 ) ( 1122 1088 -136 ) ( 1120 1088 -136 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +( 1120 1088 -216 ) ( 1122 1088 -216 ) ( 1122 1092 -216 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +( 1122 1092 -184 ) ( 1122 1092 -136 ) ( 1120 1092 -136 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1122 1090 -144 ) ( 1122 1090 -192 ) ( 1120 1092 -192 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1122 1090 -192 ) ( 1122 1090 -144 ) ( 1122 1092 -144 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2083 +{ +( 1126 1092 -144 ) ( 1126 1090 -144 ) ( 1126 1090 -192 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1128 1092 -192 ) ( 1126 1090 -192 ) ( 1126 1090 -144 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1128 1092 -136 ) ( 1126 1092 -136 ) ( 1126 1092 -184 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1126 1092 -216 ) ( 1126 1088 -216 ) ( 1128 1088 -216 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +( 1128 1088 -136 ) ( 1126 1088 -136 ) ( 1126 1092 -136 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +} +// brush 2084 +{ +( 1122 1036 -144 ) ( 1122 1038 -144 ) ( 1122 1038 -192 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1120 1036 -192 ) ( 1122 1038 -192 ) ( 1122 1038 -144 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1120 1036 -136 ) ( 1122 1036 -136 ) ( 1122 1036 -184 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1122 1036 -216 ) ( 1122 1040 -216 ) ( 1120 1040 -216 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +( 1120 1040 -136 ) ( 1122 1040 -136 ) ( 1122 1036 -136 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +} +// brush 2085 +{ +( 1126 1036 -136 ) ( 1126 1040 -136 ) ( 1128 1040 -136 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +( 1128 1040 -216 ) ( 1126 1040 -216 ) ( 1126 1036 -216 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +( 1126 1036 -184 ) ( 1126 1036 -136 ) ( 1128 1036 -136 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1126 1038 -144 ) ( 1126 1038 -192 ) ( 1128 1036 -192 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1126 1038 -192 ) ( 1126 1038 -144 ) ( 1126 1036 -144 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2086 +{ +( 1124 868 -136 ) ( 1126 868 -136 ) ( 1126 864 -136 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +( 1126 864 -216 ) ( 1126 868 -216 ) ( 1124 868 -216 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +( 1124 864 -136 ) ( 1126 864 -136 ) ( 1126 864 -184 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1124 864 -192 ) ( 1126 866 -192 ) ( 1126 866 -144 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1126 864 -144 ) ( 1126 866 -144 ) ( 1126 866 -192 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2087 +{ +( 1130 866 -192 ) ( 1130 866 -144 ) ( 1130 864 -144 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1130 866 -144 ) ( 1130 866 -192 ) ( 1132 864 -192 ) subway/clip -32 0 0 0.500000 0.500000 196608 128 0 +( 1130 864 -184 ) ( 1130 864 -136 ) ( 1132 864 -136 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1132 868 -216 ) ( 1130 868 -216 ) ( 1130 864 -216 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +( 1130 864 -136 ) ( 1130 868 -136 ) ( 1132 868 -136 ) subway/clip 0 32 0 0.500000 0.500000 196608 128 0 +} +// brush 2088 +{ +( 1144 568 -184 ) ( 1144 568 -176 ) ( 1080 568 -176 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 17 +( 1000 1744 -192 ) ( 1000 1744 -184 ) ( 1000 1680 -184 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1024 560 -192 ) ( 1024 560 -184 ) ( 1088 560 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1160 1152 -200 ) ( 1160 1152 -192 ) ( 1160 1216 -192 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1104 1304 -176 ) ( 1104 1368 -176 ) ( 1168 1368 -176 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1168 1384 -200 ) ( 1104 1384 -200 ) ( 1104 1320 -200 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2089 +{ +( 1144 568 -160 ) ( 1144 568 -152 ) ( 1080 568 -152 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 17 +( 1000 1744 -168 ) ( 1000 1744 -160 ) ( 1000 1680 -160 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1056 560 -168 ) ( 1056 560 -160 ) ( 1120 560 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1160 1152 -176 ) ( 1160 1152 -168 ) ( 1160 1216 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1104 1304 -128 ) ( 1104 1368 -128 ) ( 1168 1368 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1168 1384 -160 ) ( 1104 1384 -160 ) ( 1104 1320 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2090 +{ +( 1200 944 -184 ) ( 1200 944 -176 ) ( 1200 1008 -176 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2376 848 -192 ) ( 2376 848 -184 ) ( 2312 848 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 784 -192 ) ( 1192 784 -184 ) ( 1192 720 -184 ) subway/1_tile 16 -32 0 -0.500000 0.500000 0 318767104 0 +( 1936 856 -176 ) ( 2000 856 -176 ) ( 2000 792 -176 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 2016 792 -200 ) ( 2016 856 -200 ) ( 1952 856 -200 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1184 776 -176 ) ( 1192 776 -176 ) ( 1184 776 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2091 +{ +( 1200 944 -184 ) ( 1200 944 -176 ) ( 1200 1008 -176 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1192 784 -192 ) ( 1192 784 -184 ) ( 1192 720 -184 ) subway/1_tile 16 -32 0 -0.500000 0.500000 0 318767104 0 +( 1768 664 -200 ) ( 1768 664 -192 ) ( 1832 664 -192 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 856 -176 ) ( 2000 856 -176 ) ( 2000 792 -176 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 2016 792 -200 ) ( 2016 856 -200 ) ( 1952 856 -200 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1192 744 -176 ) ( 1184 744 -176 ) ( 1192 744 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2092 +{ +( 1192 776 -200 ) ( 1184 776 -200 ) ( 1184 736 -200 ) subway/1_tile 0 32 0 -0.500000 0.500000 0 318767104 0 +( 1184 736 -176 ) ( 1184 776 -176 ) ( 1192 776 -176 ) subway/1_tile 0 32 0 -0.500000 0.500000 0 318767104 0 +( 1184 744 -176 ) ( 1192 744 -176 ) ( 1192 744 -200 ) subway/1_tile 0 0 0 -0.500000 0.500000 0 318767104 0 +( 1200 736 -176 ) ( 1200 776 -176 ) ( 1200 776 -200 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 1192 776 -176 ) ( 1184 776 -176 ) ( 1184 776 -200 ) subway/1_tile 0 0 0 -0.500000 0.500000 0 318767104 0 +( 1192 776 -176 ) ( 1192 736 -176 ) ( 1192 736 -200 ) subway/1_tile_graf1 16 -32 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2093 +{ +( 1200 946 -160 ) ( 1200 946 -152 ) ( 1200 1010 -152 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2376 816 -168 ) ( 2376 816 -160 ) ( 2312 816 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 816 -168 ) ( 1192 816 -160 ) ( 1192 752 -160 ) subway/1_tile_graf6 32 0 0 -0.500000 0.500000 0 352321536 0 +( 1768 784 -176 ) ( 1768 784 -168 ) ( 1832 784 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 888 -128 ) ( 2000 888 -128 ) ( 2000 824 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 2016 824 -160 ) ( 2016 888 -160 ) ( 1952 888 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2094 +{ +( 1200 914 -160 ) ( 1200 914 -152 ) ( 1200 978 -152 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2376 784 -168 ) ( 2376 784 -160 ) ( 2312 784 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 784 -168 ) ( 1192 784 -160 ) ( 1192 720 -160 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 1768 664 -176 ) ( 1768 664 -168 ) ( 1832 664 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 856 -128 ) ( 2000 856 -128 ) ( 2000 792 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 2016 792 -160 ) ( 2016 856 -160 ) ( 1952 856 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2095 +{ +( 1112 1248 -184 ) ( 1112 1248 -176 ) ( 1048 1248 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 2424 -192 ) ( 840 2424 -184 ) ( 840 2360 -184 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 992 1240 -192 ) ( 992 1240 -184 ) ( 1056 1240 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 1064 1832 -200 ) ( 1064 1832 -192 ) ( 1064 1896 -192 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1984 -176 ) ( 1096 2048 -176 ) ( 1160 2048 -176 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1160 2064 -200 ) ( 1096 2064 -200 ) ( 1096 2000 -200 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2096 +{ +( 1160 2064 -160 ) ( 1096 2064 -160 ) ( 1096 2000 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1096 1984 -128 ) ( 1096 2048 -128 ) ( 1160 2048 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 864 1240 -168 ) ( 864 1240 -160 ) ( 928 1240 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 840 2424 -168 ) ( 840 2424 -160 ) ( 840 2360 -160 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1176 1248 -160 ) ( 1176 1248 -152 ) ( 1112 1248 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1120 1232 -128 ) ( 1120 1256 -128 ) ( 1120 1232 -160 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2097 +{ +( 1152 2064 -160 ) ( 1088 2064 -160 ) ( 1088 2000 -160 ) subway/1_tile 16 32 0 0.500000 0.500000 0 318767104 0 +( 1088 1984 -128 ) ( 1088 2048 -128 ) ( 1152 2048 -128 ) subway/1_tile 16 32 0 0.500000 0.500000 0 318767104 0 +( 1120 1832 -176 ) ( 1120 1832 -168 ) ( 1120 1896 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 984 1240 -168 ) ( 984 1240 -160 ) ( 1048 1240 -160 ) subway/1_tile 16 0 0 0.500000 0.500000 0 318767104 0 +( 1168 1248 -160 ) ( 1168 1248 -152 ) ( 1104 1248 -152 ) subway/1_tile 16 0 0 0.500000 0.500000 0 318767104 0 +( 1088 1256 -128 ) ( 1088 1232 -128 ) ( 1088 1256 -160 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2098 +{ +( 2016 1256 -216 ) ( 2016 1320 -216 ) ( 1952 1320 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1936 1320 -200 ) ( 2000 1320 -200 ) ( 2000 1256 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1768 1104 -224 ) ( 1768 1104 -216 ) ( 1832 1104 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1192 1448 -216 ) ( 1192 1448 -208 ) ( 1192 1384 -208 ) subway/1_tile_bottom 0 16 0 -0.500000 0.500000 0 318767104 0 +( 1200 1256 -208 ) ( 1200 1256 -200 ) ( 1200 1320 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1768 1240 -192 ) ( 1768 1240 -200 ) ( 1832 1240 -192 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2099 +{ +( 2016 1256 -176 ) ( 2016 1320 -176 ) ( 1952 1320 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 1320 -160 ) ( 2000 1320 -160 ) ( 2000 1256 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1768 1104 -184 ) ( 1768 1104 -176 ) ( 1832 1104 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1448 -176 ) ( 1192 1448 -168 ) ( 1192 1384 -168 ) subway/1_tile_middle 0 0 0 -0.500000 0.500000 0 318767104 0 +( 1200 1184 -168 ) ( 1200 1184 -160 ) ( 1200 1248 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1768 1240 -192 ) ( 1768 1240 -200 ) ( 1832 1240 -192 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2100 +{ +( 1200 1216 -184 ) ( 1200 1216 -176 ) ( 1200 1280 -176 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2376 1240 -192 ) ( 2376 1240 -184 ) ( 2312 1240 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1448 -192 ) ( 1192 1448 -184 ) ( 1192 1384 -184 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 1768 1104 -200 ) ( 1768 1104 -192 ) ( 1832 1104 -192 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 1320 -176 ) ( 2000 1320 -176 ) ( 2000 1256 -176 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 2016 1256 -200 ) ( 2016 1320 -200 ) ( 1952 1320 -200 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2101 +{ +( 2016 1222 -160 ) ( 2016 1286 -160 ) ( 1952 1286 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1936 1286 -128 ) ( 2000 1286 -128 ) ( 2000 1222 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1768 1134 -176 ) ( 1768 1134 -168 ) ( 1832 1134 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1446 -168 ) ( 1192 1446 -160 ) ( 1192 1382 -160 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2376 1136 -168 ) ( 2376 1136 -160 ) ( 2312 1136 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 1182 -160 ) ( 1200 1182 -152 ) ( 1200 1246 -152 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2102 +{ +( 2016 1256 -160 ) ( 2016 1320 -160 ) ( 1952 1320 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1936 1320 -128 ) ( 2000 1320 -128 ) ( 2000 1256 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1768 1168 -176 ) ( 1768 1168 -168 ) ( 1832 1168 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1480 -168 ) ( 1192 1480 -160 ) ( 1192 1416 -160 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 2376 1240 -168 ) ( 2376 1240 -160 ) ( 2312 1240 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 1216 -160 ) ( 1200 1216 -152 ) ( 1200 1280 -152 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2103 +{ +( 1032 602 -136 ) ( 976 602 -136 ) ( 976 602 -208 ) subway/1_soda_front_a 51 -1 0 -0.700000 0.700000 134217728 654311425 900 +( 1022 544 -136 ) ( 1022 616 -136 ) ( 1022 616 -208 ) subway/1_soda_side_a 26 -1 0 0.700000 0.700000 134217728 0 0 +( 968 568 -112 ) ( 1024 568 -112 ) ( 1024 568 -184 ) subway/1_soda_front_a 13 -1 0 0.700000 0.700000 134217728 1 800 +( 976 616 -136 ) ( 976 544 -136 ) ( 976 544 -208 ) subway/1_soda_side_a -28 -1 0 -0.700000 0.700000 134217728 0 0 +( 976 616 -136 ) ( 1032 616 -136 ) ( 1032 544 -136 ) subway/1_soda_top 12 36 0 0.700000 0.700000 134217728 0 0 +( 1032 544 -180 ) ( 1032 616 -180 ) ( 976 616 -180 ) subway/1_soda_front_a 46 52 0 0.700000 0.700000 134217728 0 0 +} +// brush 2104 +{ +( 1032 544 -200 ) ( 1032 616 -200 ) ( 976 616 -200 ) subway/1_soda_front_b 6 0 0 0.700000 0.700000 134217728 0 0 +( 978 616 -180 ) ( 1034 616 -180 ) ( 1034 544 -180 ) subway/1_soda_front_b 6 0 0 0.700000 0.700000 134217728 0 0 +( 976 612 -170 ) ( 976 540 -170 ) ( 976 540 -242 ) subway/1_soda_side_b -28 -1 0 -0.700000 0.700000 134217728 16777216 0 +( 968 568 -144 ) ( 1024 568 -144 ) ( 1024 568 -216 ) subway/1_soda_front_b 13 0 0 0.700000 0.700000 134217728 1 800 +( 1022 544 -172 ) ( 1022 616 -172 ) ( 1022 616 -244 ) subway/1_soda_side_b 26 -1 0 0.700000 0.700000 134217728 16777216 0 +( 1034 602 -170 ) ( 978 602 -170 ) ( 978 602 -242 ) subway/1_soda_front_b 51 -1 0 -0.700000 0.700000 134217728 654311425 900 +} +// brush 2105 +{ +( 1164 848 -124 ) ( 1140 848 -124 ) ( 1140 824 -124 ) subway/light_blue -16 0 0 0.500000 0.500000 134217728 1 10000 +( 1140 824 -120 ) ( 1140 848 -120 ) ( 1164 848 -120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1144 832 -116 ) ( 1168 832 -116 ) ( 1168 832 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1160 828 -116 ) ( 1160 852 -116 ) ( 1160 852 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1164 848 -116 ) ( 1140 848 -116 ) ( 1140 848 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1144 848 -116 ) ( 1144 824 -116 ) ( 1144 824 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2106 +{ +( 1144 568 -136 ) ( 1144 568 -128 ) ( 1080 568 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 17 +( 840 1744 -144 ) ( 840 1744 -136 ) ( 840 1680 -136 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 992 560 -144 ) ( 992 560 -136 ) ( 1056 560 -136 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1160 1152 -152 ) ( 1160 1152 -144 ) ( 1160 1216 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1104 1304 -120 ) ( 1104 1368 -120 ) ( 1168 1368 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1168 1384 -128 ) ( 1104 1384 -128 ) ( 1104 1320 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2107 +{ +( 1136 1384 -160 ) ( 1072 1384 -160 ) ( 1072 1320 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1072 1304 -128 ) ( 1072 1368 -128 ) ( 1136 1368 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1000 1144 -176 ) ( 1000 1144 -168 ) ( 1000 1208 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1024 560 -168 ) ( 1024 560 -160 ) ( 1088 560 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 968 1744 -168 ) ( 968 1744 -160 ) ( 968 1680 -160 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1112 568 -160 ) ( 1112 568 -152 ) ( 1048 568 -152 ) subway/1_tile_damage2 16 0 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2108 +{ +( 1168 1384 -176 ) ( 1104 1384 -176 ) ( 1104 1320 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1104 1304 -160 ) ( 1104 1368 -160 ) ( 1168 1368 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1160 1152 -184 ) ( 1160 1152 -176 ) ( 1160 1216 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 896 560 -176 ) ( 896 560 -168 ) ( 960 560 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 1744 -176 ) ( 840 1744 -168 ) ( 840 1680 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1144 568 -168 ) ( 1144 568 -160 ) ( 1080 568 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 17 +} +// brush 2109 +{ +( 1136 1384 -200 ) ( 1072 1384 -200 ) ( 1072 1320 -200 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1072 1304 -176 ) ( 1072 1368 -176 ) ( 1136 1368 -176 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1000 1152 -200 ) ( 1000 1152 -192 ) ( 1000 1216 -192 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 992 560 -192 ) ( 992 560 -184 ) ( 1056 560 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 968 1744 -192 ) ( 968 1744 -184 ) ( 968 1680 -184 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1112 568 -184 ) ( 1112 568 -176 ) ( 1048 568 -176 ) subway/1_tile_damage1 -16 -24 0 0.500000 0.500000 0 352321536 0 +} +// brush 2110 +{ +( 1168 1384 -216 ) ( 1104 1384 -216 ) ( 1104 1320 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1104 1304 -200 ) ( 1104 1368 -200 ) ( 1168 1368 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1160 1152 -224 ) ( 1160 1152 -216 ) ( 1160 1216 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 896 560 -216 ) ( 896 560 -208 ) ( 960 560 -208 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 840 1744 -216 ) ( 840 1744 -208 ) ( 840 1680 -208 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1144 568 -208 ) ( 1144 568 -200 ) ( 1080 568 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 17 +} +// brush 2111 +{ +( 1164 1112 -124 ) ( 1140 1112 -124 ) ( 1140 1088 -124 ) subway/light_blue -16 -16 0 0.500000 0.500000 134217728 1 10000 +( 1140 1088 -120 ) ( 1140 1112 -120 ) ( 1164 1112 -120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1144 1096 -116 ) ( 1168 1096 -116 ) ( 1168 1096 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1160 1092 -116 ) ( 1160 1116 -116 ) ( 1160 1116 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1164 1112 -116 ) ( 1140 1112 -116 ) ( 1140 1112 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1144 1112 -116 ) ( 1144 1088 -116 ) ( 1144 1088 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2112 +{ +( 2016 816 -144 ) ( 2016 880 -144 ) ( 1952 880 -144 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1936 880 -128 ) ( 2000 880 -128 ) ( 2000 816 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1768 818 -176 ) ( 1768 818 -168 ) ( 1832 818 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 936 -168 ) ( 1192 936 -160 ) ( 1192 872 -160 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 2376 830 -168 ) ( 2376 830 -160 ) ( 2312 830 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 936 -160 ) ( 1200 936 -152 ) ( 1200 1000 -152 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2113 +{ +( 2016 826 -160 ) ( 2016 890 -160 ) ( 1952 890 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1936 890 -128 ) ( 2000 890 -128 ) ( 2000 826 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1768 816 -176 ) ( 1768 816 -168 ) ( 1832 816 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 818 -168 ) ( 1192 818 -160 ) ( 1192 754 -160 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 2376 818 -168 ) ( 2376 818 -160 ) ( 2312 818 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 948 -160 ) ( 1200 948 -152 ) ( 1200 1012 -152 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2114 +{ +( 1200 840 -160 ) ( 1184 840 -160 ) ( 1184 816 -160 ) subway/1_restroom1 0 0 0 0.500000 0.500000 0 16777216 0 +( 1184 816 -144 ) ( 1184 840 -144 ) ( 1200 840 -144 ) subway/1_restroom1 0 0 0 0.500000 0.500000 0 16777216 0 +( 1184 818 -128 ) ( 1200 818 -128 ) ( 1200 818 -160 ) subway/1_restroom1 0 0 0 0.500000 0.500000 0 16777216 0 +( 1200 816 -128 ) ( 1200 840 -128 ) ( 1200 840 -160 ) subway/1_restroom1 0 0 0 0.500000 0.500000 0 16777216 0 +( 1200 830 -128 ) ( 1184 830 -128 ) ( 1184 830 -160 ) subway/1_restroom1 0 0 0 0.500000 0.500000 0 16777216 0 +( 1192 840 -128 ) ( 1192 816 -128 ) ( 1192 816 -160 ) subway/1_restroom2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2115 +{ +( 1272 988 -192 ) ( 1272 1036 -192 ) ( 1128 1036 -192 ) subway/1_bath_stall 56 -16 0 1 1 134217728 16777216 0 +( 1128 1036 -144 ) ( 1272 1036 -144 ) ( 1272 988 -144 ) subway/1_bath_stall 56 -16 0 1 1 134217728 16777216 0 +( 1128 1036 -160 ) ( 1128 988 -160 ) ( 1128 988 -192 ) subway/1_bath_stall 56 -16 0 1 1 134217728 16777216 0 +( 1108 1032 -160 ) ( 1252 1032 -160 ) ( 1252 1032 -192 ) subway/1_bath_stall 56 -16 0 1 1 134217728 16777216 0 +( 1184 988 -160 ) ( 1184 1036 -160 ) ( 1184 1036 -192 ) subway/1_bath_stall 56 -16 0 1 1 134217728 16777216 0 +( 1184 1036 -160 ) ( 1040 1036 -160 ) ( 1040 1036 -192 ) subway/1_bath_stall 96 -16 0 1 1 134217728 16777216 0 +} +// brush 2116 +{ +( 1234 1176 -216 ) ( 1186 1176 -216 ) ( 1186 1032 -216 ) subway/1_bath_stallurinal -4 48 0 1 1 134217728 16777216 0 +( 1186 1032 -136 ) ( 1186 1176 -136 ) ( 1234 1176 -136 ) subway/1_bath_stallurinal -4 48 0 1 1 134217728 16777216 0 +( 1186 1032 -160 ) ( 1234 1032 -160 ) ( 1234 1032 -192 ) subway/1_bath_stallurinal -4 48 0 1 1 134217728 16777216 0 +( 1192 1016 -160 ) ( 1192 1160 -160 ) ( 1192 1160 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1234 1036 -160 ) ( 1186 1036 -160 ) ( 1186 1036 -192 ) subway/1_bath_stallurinal 4 48 0 1 1 134217728 16777216 0 +( 1184 1088 -160 ) ( 1184 944 -160 ) ( 1184 944 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 2117 +{ +( 1120 1084 -160 ) ( 1120 940 -160 ) ( 1120 940 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1168 1036 -160 ) ( 1120 1036 -160 ) ( 1120 1036 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1128 1012 -160 ) ( 1128 1156 -160 ) ( 1128 1156 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1122 1032 -160 ) ( 1170 1032 -160 ) ( 1170 1032 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1122 1028 -136 ) ( 1122 1172 -136 ) ( 1170 1172 -136 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1170 1172 -216 ) ( 1122 1172 -216 ) ( 1122 1028 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 2118 +{ +( 1122 1092 -160 ) ( 1122 948 -160 ) ( 1122 948 -192 ) subway/1_bath_stall 56 -16 0 1 1 134217728 16777216 0 +( 1170 1092 -160 ) ( 1122 1092 -160 ) ( 1122 1092 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1126 1020 -160 ) ( 1126 1164 -160 ) ( 1126 1164 -192 ) subway/1_bath_stall 56 -16 0 1 1 134217728 16777216 0 +( 1122 1036 -160 ) ( 1170 1036 -160 ) ( 1170 1036 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1122 1036 -144 ) ( 1122 1180 -144 ) ( 1170 1180 -144 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1170 1180 -192 ) ( 1122 1180 -192 ) ( 1122 1036 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +} +// brush 2119 +{ +( 1120 1148 -160 ) ( 1120 1004 -160 ) ( 1120 1004 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1170 1096 -160 ) ( 1122 1096 -160 ) ( 1122 1096 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1128 1076 -160 ) ( 1128 1220 -160 ) ( 1128 1220 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1122 1092 -160 ) ( 1170 1092 -160 ) ( 1170 1092 -192 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1122 1092 -136 ) ( 1122 1236 -136 ) ( 1170 1236 -136 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1170 1236 -216 ) ( 1122 1236 -216 ) ( 1122 1092 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 2120 +{ +( 2016 1184 -124 ) ( 2016 1248 -124 ) ( 1952 1248 -124 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 1248 -120 ) ( 2000 1248 -120 ) ( 2000 1184 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1772 1032 -152 ) ( 1772 1032 -144 ) ( 1836 1032 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1376 -144 ) ( 1192 1376 -136 ) ( 1192 1312 -136 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2380 1104 -144 ) ( 2380 1104 -136 ) ( 2316 1104 -136 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 1112 -136 ) ( 1200 1112 -128 ) ( 1200 1176 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2121 +{ +( 1192 1104 -128 ) ( 1192 1096 -128 ) ( 1192 1096 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1200 1104 -128 ) ( 1184 1104 -128 ) ( 1184 1104 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1200 1096 -128 ) ( 1200 1104 -128 ) ( 1200 1104 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1192 1100 -132 ) ( 1204 1100 -132 ) ( 1204 1100 -216 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1200 1100 -128 ) ( 1188 1100 -128 ) ( 1188 1104 -124 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1200 1112 -216 ) ( 1184 1112 -216 ) ( 1184 1104 -216 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 2122 +{ +( 1188 1036 -128 ) ( 1200 1036 -128 ) ( 1200 1100 -128 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1184 1096 -124 ) ( 1184 1104 -124 ) ( 1200 1104 -124 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1200 1036 -128 ) ( 1188 1036 -128 ) ( 1188 1032 -124 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1200 1096 -124 ) ( 1200 1104 -124 ) ( 1200 1104 -156 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1188 1100 -128 ) ( 1200 1100 -128 ) ( 1200 1104 -124 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1192 1104 -124 ) ( 1192 1096 -124 ) ( 1192 1096 -156 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 2123 +{ +( 1192 1036 -128 ) ( 1192 1028 -128 ) ( 1192 1028 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1204 1036 -132 ) ( 1192 1036 -132 ) ( 1192 1036 -216 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1200 1028 -128 ) ( 1200 1036 -128 ) ( 1200 1036 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1188 1032 -128 ) ( 1204 1032 -128 ) ( 1204 1032 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1188 1036 -128 ) ( 1200 1036 -128 ) ( 1200 1032 -124 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1200 1044 -216 ) ( 1184 1044 -216 ) ( 1184 1036 -216 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 2124 +{ +( 2016 1048 -216 ) ( 2016 1112 -216 ) ( 1952 1112 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1936 1112 -200 ) ( 2000 1112 -200 ) ( 2000 1048 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1768 920 -224 ) ( 1768 920 -216 ) ( 1832 920 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1192 1040 -216 ) ( 1192 1040 -208 ) ( 1192 976 -208 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 2376 1032 -216 ) ( 2376 1032 -208 ) ( 2312 1032 -208 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1200 1200 -208 ) ( 1200 1200 -200 ) ( 1200 1264 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2125 +{ +( 2016 1048 -200 ) ( 2016 1112 -200 ) ( 1952 1112 -200 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1936 1112 -176 ) ( 2000 1112 -176 ) ( 2000 1048 -176 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1768 920 -200 ) ( 1768 920 -192 ) ( 1832 920 -192 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1040 -192 ) ( 1192 1040 -184 ) ( 1192 976 -184 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2376 1032 -192 ) ( 2376 1032 -184 ) ( 2312 1032 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 1200 -184 ) ( 1200 1200 -176 ) ( 1200 1264 -176 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2126 +{ +( 2016 1048 -176 ) ( 2016 1112 -176 ) ( 1952 1112 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 1112 -160 ) ( 2000 1112 -160 ) ( 2000 1048 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1768 920 -184 ) ( 1768 920 -176 ) ( 1832 920 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1040 -176 ) ( 1192 1040 -168 ) ( 1192 976 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2376 1032 -176 ) ( 2376 1032 -168 ) ( 2312 1032 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 1200 -168 ) ( 1200 1200 -160 ) ( 1200 1264 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2127 +{ +( 2016 1048 -160 ) ( 2016 1112 -160 ) ( 1952 1112 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1936 1112 -128 ) ( 2000 1112 -128 ) ( 2000 1048 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1768 920 -176 ) ( 1768 920 -168 ) ( 1832 920 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1040 -168 ) ( 1192 1040 -160 ) ( 1192 976 -160 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2376 1032 -168 ) ( 2376 1032 -160 ) ( 2312 1032 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 1200 -160 ) ( 1200 1200 -152 ) ( 1200 1264 -152 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2128 +{ +( 1200 1200 -136 ) ( 1200 1200 -128 ) ( 1200 1264 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2376 1032 -144 ) ( 2376 1032 -136 ) ( 2312 1032 -136 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1040 -144 ) ( 1192 1040 -136 ) ( 1192 976 -136 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1768 920 -152 ) ( 1768 920 -144 ) ( 1832 920 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 1112 -120 ) ( 2000 1112 -120 ) ( 2000 1048 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2016 1048 -128 ) ( 2016 1112 -128 ) ( 1952 1112 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2129 +{ +( 1200 1166 -160 ) ( 1200 1166 -152 ) ( 1200 1230 -152 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2368 1134 -168 ) ( 2368 1134 -160 ) ( 2304 1134 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1464 -168 ) ( 1192 1464 -160 ) ( 1192 1400 -160 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 1768 1122 -176 ) ( 1768 1122 -168 ) ( 1832 1122 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 1304 -128 ) ( 2000 1304 -128 ) ( 2000 1240 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 2016 1240 -144 ) ( 2016 1304 -144 ) ( 1952 1304 -144 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2130 +{ +( 1200 1184 -160 ) ( 1200 1184 -152 ) ( 1200 1248 -152 ) subway/1_tile_graf5 32 0 0 -0.500000 0.500000 0 352321536 0 +( 2376 1168 -168 ) ( 2376 1168 -160 ) ( 2312 1168 -160 ) subway/1_tile_graf5 0 0 0 -0.500000 0.500000 0 352321536 0 +( 1192 1448 -168 ) ( 1192 1448 -160 ) ( 1192 1384 -160 ) subway/1_tile_graf5 32 0 0 -0.500000 0.500000 0 352321536 0 +( 1768 1136 -176 ) ( 1768 1136 -168 ) ( 1832 1136 -168 ) subway/1_tile_graf5 0 0 0 -0.500000 0.500000 0 352321536 0 +( 1936 1288 -128 ) ( 2000 1288 -128 ) ( 2000 1224 -128 ) subway/1_tile_graf5 0 32 0 -0.500000 0.500000 0 352321536 0 +( 2016 1224 -160 ) ( 2016 1288 -160 ) ( 1952 1288 -160 ) subway/1_tile_graf5 0 32 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2131 +{ +( 1200 1136 -160 ) ( 1184 1136 -160 ) ( 1184 1120 -160 ) subway/1_restroom1 0 -16 0 0.500000 0.500000 0 16777216 0 +( 1184 1120 -144 ) ( 1184 1136 -144 ) ( 1200 1136 -144 ) subway/1_restroom1 0 -16 0 0.500000 0.500000 0 16777216 0 +( 1184 1122 -144 ) ( 1200 1122 -144 ) ( 1200 1122 -176 ) subway/1_restroom1 0 0 0 0.500000 0.500000 0 16777216 0 +( 1200 1120 -144 ) ( 1200 1136 -144 ) ( 1200 1136 -176 ) subway/1_restroom1 16 0 0 0.500000 0.500000 0 16777216 0 +( 1200 1134 -144 ) ( 1184 1134 -144 ) ( 1184 1134 -176 ) subway/1_restroom1 0 0 0 0.500000 0.500000 0 16777216 0 +( 1192 1136 -128 ) ( 1192 1120 -128 ) ( 1192 1120 -160 ) subway/1_restroom1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2132 +{ +( 2016 1256 -128 ) ( 2016 1320 -128 ) ( 1952 1320 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 1320 -120 ) ( 2000 1320 -120 ) ( 2000 1256 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1772 1104 -152 ) ( 1772 1104 -144 ) ( 1836 1104 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1448 -144 ) ( 1192 1448 -136 ) ( 1192 1384 -136 ) subway/1_tile_top 0 0 0 -0.500000 0.500000 0 318767104 0 +( 2376 1240 -144 ) ( 2376 1240 -136 ) ( 2312 1240 -136 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 1184 -136 ) ( 1200 1184 -128 ) ( 1200 1248 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2133 +{ +( 1200 928 -216 ) ( 1184 928 -216 ) ( 1184 920 -216 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1200 916 -128 ) ( 1188 916 -128 ) ( 1188 920 -124 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1192 916 -132 ) ( 1204 916 -132 ) ( 1204 916 -216 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1200 912 -128 ) ( 1200 920 -128 ) ( 1200 920 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1200 920 -128 ) ( 1184 920 -128 ) ( 1184 920 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1192 920 -128 ) ( 1192 912 -128 ) ( 1192 912 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 2134 +{ +( 1192 920 -124 ) ( 1192 912 -124 ) ( 1192 912 -156 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1188 916 -128 ) ( 1200 916 -128 ) ( 1200 920 -124 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1200 912 -124 ) ( 1200 920 -124 ) ( 1200 920 -156 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1200 852 -128 ) ( 1188 852 -128 ) ( 1188 848 -124 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1184 912 -124 ) ( 1184 920 -124 ) ( 1200 920 -124 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1188 852 -128 ) ( 1200 852 -128 ) ( 1200 916 -128 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 2135 +{ +( 1200 860 -216 ) ( 1184 860 -216 ) ( 1184 852 -216 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1188 852 -128 ) ( 1200 852 -128 ) ( 1200 848 -124 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1188 848 -128 ) ( 1204 848 -128 ) ( 1204 848 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1200 844 -128 ) ( 1200 852 -128 ) ( 1200 852 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1204 852 -132 ) ( 1192 852 -132 ) ( 1192 852 -216 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 1192 852 -128 ) ( 1192 844 -128 ) ( 1192 844 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 2136 +{ +( 1200 944 -208 ) ( 1200 944 -200 ) ( 1200 1008 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 2376 848 -216 ) ( 2376 848 -208 ) ( 2312 848 -208 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1192 784 -216 ) ( 1192 784 -208 ) ( 1192 720 -208 ) subway/1_tile_bottom -16 -16 0 -0.500000 0.500000 0 318767104 0 +( 1768 664 -224 ) ( 1768 664 -216 ) ( 1832 664 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1936 856 -200 ) ( 2000 856 -200 ) ( 2000 792 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 2016 792 -216 ) ( 2016 856 -216 ) ( 1952 856 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2137 +{ +( 1200 944 -168 ) ( 1200 944 -160 ) ( 1200 1008 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2376 848 -176 ) ( 2376 848 -168 ) ( 2312 848 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 784 -176 ) ( 1192 784 -168 ) ( 1192 720 -168 ) subway/1_tile_middle 0 0 0 -0.500000 0.500000 0 318767104 0 +( 1768 664 -184 ) ( 1768 664 -176 ) ( 1832 664 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 856 -160 ) ( 2000 856 -160 ) ( 2000 792 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2016 792 -176 ) ( 2016 856 -176 ) ( 1952 856 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2138 +{ +( 1200 952 -160 ) ( 1200 952 -152 ) ( 1200 1016 -152 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2376 848 -168 ) ( 2376 848 -160 ) ( 2312 848 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 952 -168 ) ( 1192 952 -160 ) ( 1192 888 -160 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 1768 830 -176 ) ( 1768 830 -168 ) ( 1832 830 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 896 -128 ) ( 2000 896 -128 ) ( 2000 832 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 2016 832 -160 ) ( 2016 896 -160 ) ( 1952 896 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2139 +{ +( 2016 792 -128 ) ( 2016 856 -128 ) ( 1952 856 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 856 -120 ) ( 2000 856 -120 ) ( 2000 792 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1768 664 -152 ) ( 1768 664 -144 ) ( 1832 664 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 784 -144 ) ( 1192 784 -136 ) ( 1192 720 -136 ) subway/1_tile_top 0 0 0 -0.500000 0.500000 0 318767104 0 +( 2376 848 -144 ) ( 2376 848 -136 ) ( 2312 848 -136 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 944 -136 ) ( 1200 944 -128 ) ( 1200 1008 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2140 +{ +( 1126 864 -216 ) ( 1126 720 -216 ) ( 1174 720 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1174 720 -136 ) ( 1126 720 -136 ) ( 1126 864 -136 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1174 864 -192 ) ( 1174 864 -160 ) ( 1126 864 -160 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1132 736 -192 ) ( 1132 736 -160 ) ( 1132 880 -160 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1126 860 -192 ) ( 1126 860 -160 ) ( 1174 860 -160 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1124 952 -192 ) ( 1124 952 -160 ) ( 1124 808 -160 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 2141 +{ +( 1184 1012 -192 ) ( 1184 1012 -160 ) ( 1184 868 -160 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1186 920 -192 ) ( 1186 920 -160 ) ( 1234 920 -160 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1192 796 -192 ) ( 1192 796 -160 ) ( 1192 940 -160 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1234 924 -192 ) ( 1234 924 -160 ) ( 1186 924 -160 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1234 780 -136 ) ( 1186 780 -136 ) ( 1186 924 -136 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1186 924 -216 ) ( 1186 780 -216 ) ( 1234 780 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 2142 +{ +( 1044 920 -192 ) ( 1044 920 -160 ) ( 1188 920 -160 ) subway/1_bath_stall 88 -16 0 1 1 134217728 16777216 0 +( 1184 920 -192 ) ( 1184 920 -160 ) ( 1184 968 -160 ) subway/1_bath_stall 56 -16 0 1 1 134217728 16777216 0 +( 1256 924 -192 ) ( 1256 924 -160 ) ( 1112 924 -160 ) subway/1_bath_stall 56 -16 0 1 1 134217728 16777216 0 +( 1132 968 -192 ) ( 1132 968 -160 ) ( 1132 920 -160 ) subway/1_bath_stall 56 -16 0 1 1 134217728 16777216 0 +( 1276 968 -144 ) ( 1276 920 -144 ) ( 1132 920 -144 ) subway/1_bath_stall 56 -16 0 1 1 134217728 16777216 0 +( 1132 920 -192 ) ( 1276 920 -192 ) ( 1276 968 -192 ) subway/1_bath_stall 56 -16 0 1 1 134217728 16777216 0 +} +// brush 2143 +{ +( 1126 928 -216 ) ( 1126 784 -216 ) ( 1174 784 -216 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1174 784 -136 ) ( 1126 784 -136 ) ( 1126 928 -136 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1174 924 -192 ) ( 1174 924 -160 ) ( 1126 924 -160 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1132 800 -192 ) ( 1132 800 -160 ) ( 1132 944 -160 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1124 920 -192 ) ( 1124 920 -160 ) ( 1172 920 -160 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +( 1124 1016 -192 ) ( 1124 1016 -160 ) ( 1124 872 -160 ) subway/1_bath_stallurinal 0 48 0 1 1 134217728 16777216 0 +} +// brush 2144 +{ +( 992 656 -116 ) ( 992 632 -116 ) ( 992 632 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1012 656 -116 ) ( 988 656 -116 ) ( 988 656 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1008 636 -116 ) ( 1008 660 -116 ) ( 1008 660 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 992 640 -116 ) ( 1016 640 -116 ) ( 1016 640 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 988 632 -120 ) ( 988 656 -120 ) ( 1012 656 -120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1012 656 -124 ) ( 988 656 -124 ) ( 988 632 -124 ) subway/light_yellow 0 0 0 0.500000 0.500000 134217728 16777217 12000 +} +// brush 2145 +{ +( 1192 872 -128 ) ( 1192 936 -128 ) ( 1192 936 -136 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2216 568 -136 ) ( 2280 568 -136 ) ( 2280 568 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 664 -128 ) ( 1096 704 -128 ) ( 1096 704 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 696 -120 ) ( 1096 696 -120 ) ( 1096 696 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 696 -120 ) ( 1192 696 -120 ) ( 1192 568 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1856 792 -128 ) ( 1920 792 -128 ) ( 1920 856 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2146 +{ +( 1128 664 -160 ) ( 1128 696 -160 ) ( 1096 696 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1096 696 -128 ) ( 1192 696 -128 ) ( 1192 568 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1192 696 -128 ) ( 1096 696 -128 ) ( 1096 696 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 14 +( 1096 752 -160 ) ( 1096 688 -160 ) ( 1096 688 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2216 568 -160 ) ( 2280 568 -160 ) ( 2280 568 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 872 -152 ) ( 1192 936 -152 ) ( 1192 936 -160 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2147 +{ +( 1856 792 -176 ) ( 1920 792 -176 ) ( 1920 856 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1904 856 -160 ) ( 1904 792 -160 ) ( 1840 792 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1736 696 -176 ) ( 1672 696 -176 ) ( 1672 696 -184 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 752 -168 ) ( 1096 688 -168 ) ( 1096 688 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2216 568 -168 ) ( 2280 568 -168 ) ( 2280 568 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 872 -160 ) ( 1192 936 -160 ) ( 1192 936 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2148 +{ +( 1856 792 -216 ) ( 1920 792 -216 ) ( 1920 856 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1904 856 -200 ) ( 1904 792 -200 ) ( 1840 792 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1736 696 -216 ) ( 1672 696 -216 ) ( 1672 696 -224 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1096 752 -208 ) ( 1096 688 -208 ) ( 1096 688 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 2216 568 -208 ) ( 2280 568 -208 ) ( 2280 568 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1192 872 -200 ) ( 1192 936 -200 ) ( 1192 936 -208 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2149 +{ +( 1856 792 -200 ) ( 1920 792 -200 ) ( 1920 856 -200 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1904 856 -176 ) ( 1904 792 -176 ) ( 1840 792 -176 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1736 696 -192 ) ( 1672 696 -192 ) ( 1672 696 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 752 -184 ) ( 1096 688 -184 ) ( 1096 688 -192 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2216 568 -184 ) ( 2280 568 -184 ) ( 2280 568 -192 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 872 -176 ) ( 1192 936 -176 ) ( 1192 936 -184 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2150 +{ +( 1920 1048 -216 ) ( 1920 1112 -216 ) ( 1856 1112 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1840 1112 -200 ) ( 1904 1112 -200 ) ( 1904 1048 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1672 1208 -224 ) ( 1672 1208 -216 ) ( 1736 1208 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1096 1216 -216 ) ( 1096 1216 -208 ) ( 1096 1152 -208 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 2280 1240 -216 ) ( 2280 1240 -208 ) ( 2216 1240 -208 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1192 968 -208 ) ( 1192 968 -200 ) ( 1192 1032 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2151 +{ +( 1928 1048 -200 ) ( 1928 1112 -200 ) ( 1864 1112 -200 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1848 1112 -176 ) ( 1912 1112 -176 ) ( 1912 1048 -176 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1680 1208 -200 ) ( 1680 1208 -192 ) ( 1744 1208 -192 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1216 -192 ) ( 1096 1216 -184 ) ( 1096 1152 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 2288 1240 -192 ) ( 2288 1240 -184 ) ( 2224 1240 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 968 -184 ) ( 1192 968 -176 ) ( 1192 1032 -176 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2152 +{ +( 1096 1208 -160 ) ( 1128 1208 -160 ) ( 1128 1240 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1192 1208 -128 ) ( 1096 1208 -128 ) ( 1096 1240 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1096 1208 -128 ) ( 1192 1208 -128 ) ( 1192 1208 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 15 +( 1096 1216 -168 ) ( 1096 1216 -160 ) ( 1096 1152 -160 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2280 1240 -168 ) ( 2280 1240 -160 ) ( 2216 1240 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 968 -160 ) ( 1192 968 -152 ) ( 1192 1032 -152 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2153 +{ +( 1920 1048 -176 ) ( 1920 1112 -176 ) ( 1856 1112 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1840 1112 -160 ) ( 1904 1112 -160 ) ( 1904 1048 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1672 1208 -184 ) ( 1672 1208 -176 ) ( 1736 1208 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1216 -176 ) ( 1096 1216 -168 ) ( 1096 1152 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2280 1240 -176 ) ( 2280 1240 -168 ) ( 2216 1240 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 968 -168 ) ( 1192 968 -160 ) ( 1192 1032 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2154 +{ +( 1192 968 -136 ) ( 1192 968 -128 ) ( 1192 1032 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2280 1240 -144 ) ( 2280 1240 -136 ) ( 2216 1240 -136 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1200 -120 ) ( 1096 1200 -128 ) ( 1096 1240 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1208 -120 ) ( 1192 1208 -120 ) ( 1192 1208 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1208 -120 ) ( 1096 1208 -120 ) ( 1096 1240 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1920 1048 -128 ) ( 1920 1112 -128 ) ( 1856 1112 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2155 +{ +( 1200 928 -136 ) ( 1200 928 -128 ) ( 1200 992 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2380 920 -144 ) ( 2380 920 -136 ) ( 2316 920 -136 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1192 -144 ) ( 1192 1192 -136 ) ( 1192 1128 -136 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1772 848 -152 ) ( 1772 848 -144 ) ( 1836 848 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 1064 -120 ) ( 2000 1064 -120 ) ( 2000 1000 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2016 1000 -124 ) ( 2016 1064 -124 ) ( 1952 1064 -124 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2156 +{ +( 2016 1224 -160 ) ( 2016 1288 -160 ) ( 1952 1288 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1936 1288 -128 ) ( 2000 1288 -128 ) ( 2000 1224 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1768 1104 -176 ) ( 1768 1104 -168 ) ( 1832 1104 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1448 -168 ) ( 1192 1448 -160 ) ( 1192 1384 -160 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2368 1122 -168 ) ( 2368 1122 -160 ) ( 2304 1122 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 1152 -160 ) ( 1200 1152 -152 ) ( 1200 1216 -152 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2157 +{ +( 1136 560 -120 ) ( 1136 560 -112 ) ( 1200 560 -112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 560 -120 ) ( 1096 560 -112 ) ( 1096 624 -112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 960 712 -120 ) ( 960 712 -112 ) ( 896 712 -112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 936 1104 -128 ) ( 936 1104 -120 ) ( 936 1040 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1112 960 -88 ) ( 1112 896 -88 ) ( 1048 896 -88 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1048 880 -120 ) ( 1112 880 -120 ) ( 1112 944 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2158 +{ +( 1192 2056 -224 ) ( 1128 2056 -224 ) ( 1128 1992 -224 ) subway/1_lobby_floor_edge 15 16 90 0.500000 -0.500000 0 301989888 0 +( 1128 1976 -216 ) ( 1128 2040 -216 ) ( 1192 2040 -216 ) subway/1_lobby_floor -16 -16 0 0.500000 0.500000 0 285212672 0 +( 1192 1816 -232 ) ( 1192 1816 -224 ) ( 1192 1880 -224 ) subway/1_lobby_floor_edge -15 -16 90 0.500000 -0.500000 0 301989888 0 +( 984 664 -224 ) ( 984 664 -216 ) ( 1048 664 -216 ) subway/1_lobby_floor_edge -16 16 90 0.500000 -0.500000 0 301989888 0 +( 1160 2400 -224 ) ( 1160 2400 -216 ) ( 1160 2336 -216 ) subway/1_lobby_floor_edge -15 -16 90 0.500000 -0.500000 0 301989888 0 +( 1208 1208 -224 ) ( 1208 1208 -216 ) ( 1144 1208 -216 ) subway/1_lobby_floor_edge -16 16 90 0.500000 -0.500000 0 301989888 0 +} +// brush 2159 +{ +( 1176 1248 -136 ) ( 1176 1248 -128 ) ( 1112 1248 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 2424 -144 ) ( 840 2424 -136 ) ( 840 2360 -136 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 992 1240 -144 ) ( 992 1240 -136 ) ( 1056 1240 -136 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 16 +( 1128 1832 -152 ) ( 1128 1832 -144 ) ( 1128 1896 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1984 -120 ) ( 1096 2048 -120 ) ( 1160 2048 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1160 2064 -128 ) ( 1096 2064 -128 ) ( 1096 2000 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2160 +{ +( 1160 2064 -176 ) ( 1096 2064 -176 ) ( 1096 2000 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1984 -160 ) ( 1096 2048 -160 ) ( 1160 2048 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1128 1832 -184 ) ( 1128 1832 -176 ) ( 1128 1896 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 992 1240 -176 ) ( 992 1240 -168 ) ( 1056 1240 -168 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 16 +( 840 2424 -176 ) ( 840 2424 -168 ) ( 840 2360 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1176 1248 -168 ) ( 1176 1248 -160 ) ( 1112 1248 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2161 +{ +( 1192 2064 -200 ) ( 1128 2064 -200 ) ( 1128 2000 -200 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1128 1984 -176 ) ( 1128 2048 -176 ) ( 1192 2048 -176 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1096 1832 -200 ) ( 1096 1832 -192 ) ( 1096 1896 -192 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1024 1240 -192 ) ( 1024 1240 -184 ) ( 1088 1240 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 1064 2424 -192 ) ( 1064 2424 -184 ) ( 1064 2360 -184 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1144 1248 -184 ) ( 1144 1248 -176 ) ( 1080 1248 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2162 +{ +( 1160 2064 -216 ) ( 1096 2064 -216 ) ( 1096 2000 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1096 1984 -200 ) ( 1096 2048 -200 ) ( 1160 2048 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1128 1832 -224 ) ( 1128 1832 -216 ) ( 1128 1896 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 864 1240 -216 ) ( 864 1240 -208 ) ( 928 1240 -208 ) subway/1_tile_bottom 0 16 -180 0.500000 -0.500000 0 318767104 16 +( 840 2424 -216 ) ( 840 2424 -208 ) ( 840 2360 -208 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1176 1248 -208 ) ( 1176 1248 -200 ) ( 1112 1248 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2163 +{ +( 1136 1192 -120 ) ( 1136 1192 -112 ) ( 1200 1192 -112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1104 -120 ) ( 1096 1104 -112 ) ( 1096 1168 -112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 960 1240 -120 ) ( 960 1240 -112 ) ( 896 1240 -112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 936 1648 -128 ) ( 936 1648 -120 ) ( 936 1584 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1112 1504 -88 ) ( 1112 1440 -88 ) ( 1048 1440 -88 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1048 1424 -120 ) ( 1112 1424 -120 ) ( 1112 1488 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2164 +{ +( 1192 1020 -128 ) ( 1096 1020 -128 ) ( 1096 952 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1020 -120 ) ( 1192 1020 -120 ) ( 1192 952 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1020 -120 ) ( 1096 1020 -120 ) ( 1096 1020 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 976 -128 ) ( 1096 1016 -128 ) ( 1096 1016 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 952 -120 ) ( 1192 952 -120 ) ( 1192 952 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1184 -128 ) ( 1192 1248 -128 ) ( 1192 1248 -136 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2165 +{ +( 1096 1072 -160 ) ( 1096 1008 -160 ) ( 1096 1008 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1104 1016 -128 ) ( 1096 1016 -128 ) ( 1096 1016 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 15 +( 1096 1016 -128 ) ( 1104 1016 -128 ) ( 1104 1000 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1128 984 -160 ) ( 1128 1016 -160 ) ( 1096 1016 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1104 1184 -160 ) ( 1104 1248 -160 ) ( 1104 1248 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1672 1000 -176 ) ( 1736 1000 -176 ) ( 1672 1000 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2166 +{ +( 1192 1184 -152 ) ( 1192 1248 -152 ) ( 1192 1248 -160 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1104 952 -128 ) ( 1192 952 -128 ) ( 1192 952 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 14 +( 1192 1016 -128 ) ( 1104 1016 -128 ) ( 1104 1016 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 15 +( 1104 1016 -128 ) ( 1192 1016 -128 ) ( 1192 952 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1128 984 -160 ) ( 1128 1016 -160 ) ( 1096 1016 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1104 1248 -160 ) ( 1104 1184 -160 ) ( 1104 1248 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2167 +{ +( 1856 1112 -176 ) ( 1920 1112 -176 ) ( 1920 1176 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1176 -160 ) ( 1904 1112 -160 ) ( 1840 1112 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1736 1016 -176 ) ( 1672 1016 -176 ) ( 1672 1016 -184 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2216 952 -168 ) ( 2280 952 -168 ) ( 2280 952 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1192 1184 -160 ) ( 1192 1248 -160 ) ( 1192 1248 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1104 1248 -160 ) ( 1104 1184 -160 ) ( 1104 1248 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2168 +{ +( 1856 1112 -176 ) ( 1920 1112 -176 ) ( 1920 1176 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1176 -160 ) ( 1904 1112 -160 ) ( 1840 1112 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1736 1016 -176 ) ( 1672 1016 -176 ) ( 1672 1016 -184 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1040 -168 ) ( 1096 976 -168 ) ( 1096 976 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1104 1184 -160 ) ( 1104 1248 -160 ) ( 1104 1248 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1672 1000 -176 ) ( 1736 1000 -176 ) ( 1672 1000 -184 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2169 +{ +( 1192 1184 -176 ) ( 1192 1248 -176 ) ( 1192 1248 -184 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2216 952 -184 ) ( 2280 952 -184 ) ( 2280 952 -192 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1736 1016 -192 ) ( 1672 1016 -192 ) ( 1672 1016 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1176 -176 ) ( 1904 1112 -176 ) ( 1840 1112 -176 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1856 1112 -200 ) ( 1920 1112 -200 ) ( 1920 1176 -200 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1104 1248 -160 ) ( 1104 1184 -160 ) ( 1104 1248 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2170 +{ +( 1096 1040 -184 ) ( 1096 976 -184 ) ( 1096 976 -192 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1736 1016 -192 ) ( 1672 1016 -192 ) ( 1672 1016 -200 ) subway/1_tile_damage2 -32 0 0 0.500000 0.500000 0 352321536 0 +( 1904 1176 -176 ) ( 1904 1112 -176 ) ( 1840 1112 -176 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1856 1112 -200 ) ( 1920 1112 -200 ) ( 1920 1176 -200 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1104 1184 -160 ) ( 1104 1248 -160 ) ( 1104 1248 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1672 1000 -176 ) ( 1736 1000 -176 ) ( 1672 1000 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2171 +{ +( 1096 1040 -184 ) ( 1096 976 -184 ) ( 1096 976 -192 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1856 1112 -200 ) ( 1920 1112 -200 ) ( 1920 1176 -200 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1104 1184 -160 ) ( 1104 1248 -160 ) ( 1104 1248 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2208 968 -168 ) ( 2272 968 -168 ) ( 2272 968 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1736 1000 -176 ) ( 1672 1000 -176 ) ( 1672 1000 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1128 -184 ) ( 1848 1128 -184 ) ( 1912 1192 -184 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2172 +{ +( 1192 1184 -200 ) ( 1192 1248 -200 ) ( 1192 1248 -208 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 2216 952 -208 ) ( 2280 952 -208 ) ( 2280 952 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1096 1040 -208 ) ( 1096 976 -208 ) ( 1096 976 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1736 1016 -216 ) ( 1672 1016 -216 ) ( 1672 1016 -224 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1904 1176 -200 ) ( 1904 1112 -200 ) ( 1840 1112 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 1856 1112 -216 ) ( 1920 1112 -216 ) ( 1920 1176 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2173 +{ +( 1096 952 -128 ) ( 1104 952 -128 ) ( 1104 952 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 14 +( 1096 1072 -160 ) ( 1096 1008 -160 ) ( 1096 1008 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1104 952 -128 ) ( 1096 952 -128 ) ( 1096 968 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1128 984 -160 ) ( 1128 1016 -160 ) ( 1096 1016 -160 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1104 1184 -160 ) ( 1104 1248 -160 ) ( 1104 1248 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2272 968 -168 ) ( 2208 968 -168 ) ( 2272 968 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2174 +{ +( 1856 1112 -176 ) ( 1920 1112 -176 ) ( 1920 1176 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1176 -160 ) ( 1904 1112 -160 ) ( 1840 1112 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1096 1040 -168 ) ( 1096 976 -168 ) ( 1096 976 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2216 952 -168 ) ( 2280 952 -168 ) ( 2280 952 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1104 1184 -160 ) ( 1104 1248 -160 ) ( 1104 1248 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2272 968 -168 ) ( 2208 968 -168 ) ( 2272 968 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2175 +{ +( 1096 1072 -160 ) ( 1096 1008 -160 ) ( 1096 1008 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1128 944 -128 ) ( 1096 944 -128 ) ( 1096 1024 -128 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1104 1184 -160 ) ( 1104 1248 -160 ) ( 1104 1248 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2208 968 -168 ) ( 2272 968 -168 ) ( 2272 968 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1736 1000 -176 ) ( 1672 1000 -176 ) ( 1672 1000 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 1896 1128 -152 ) ( 1896 1192 -152 ) ( 1832 1128 -152 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2176 +{ +( 1848 1128 -184 ) ( 1912 1128 -184 ) ( 1912 1192 -184 ) subway/1_tile_graf7 0 -16 0 0.500000 0.500000 0 352321536 0 +( 1896 1192 -152 ) ( 1896 1128 -152 ) ( 1832 1128 -152 ) subway/1_tile_graf7 0 -16 0 0.500000 0.500000 0 352321536 0 +( 1736 1000 -176 ) ( 1672 1000 -176 ) ( 1672 1000 -184 ) subway/1_tile_graf7 0 16 0 0.500000 0.500000 0 352321536 0 +( 1096 1056 -168 ) ( 1096 992 -168 ) ( 1096 992 -176 ) subway/1_tile_graf7 16 16 0 -0.500000 0.500000 0 352321536 0 +( 2208 968 -168 ) ( 2272 968 -168 ) ( 2272 968 -176 ) subway/1_tile_graf7 0 16 0 0.500000 0.500000 0 352321536 0 +( 1104 1184 -160 ) ( 1104 1248 -160 ) ( 1104 1248 -168 ) subway/1_tile_graf7 -32 16 0 0.500000 0.500000 0 352321536 0 +} +// brush 2177 +{ +( 2216 952 -184 ) ( 2280 952 -184 ) ( 2280 952 -192 ) subway/1_tile_damage1 -8 40 0 0.500000 0.500000 0 352321536 0 +( 1096 1040 -184 ) ( 1096 976 -184 ) ( 1096 976 -192 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1176 -176 ) ( 1904 1112 -176 ) ( 1840 1112 -176 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1856 1112 -200 ) ( 1920 1112 -200 ) ( 1920 1176 -200 ) subway/1_tile 0 32 0 0.500000 0.500000 0 318767104 0 +( 1104 1184 -160 ) ( 1104 1248 -160 ) ( 1104 1248 -168 ) subway/1_tile -32 0 0 0.500000 0.500000 0 318767104 0 +( 2272 968 -168 ) ( 2208 968 -168 ) ( 2272 968 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2178 +{ +( 872 1096 -96 ) ( 872 1240 -96 ) ( 872 1240 -200 ) subway/1_tile_bottom 0 16 -180 0.500000 -0.500000 0 318767104 16 +( 840 96 -272 ) ( 840 96 -56 ) ( 840 -184 -56 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 744 704 -200 ) ( 744 640 -200 ) ( 680 640 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 680 640 -216 ) ( 744 640 -216 ) ( 744 704 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 736 784 -168 ) ( 752 784 -168 ) ( 736 784 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 752 816 -168 ) ( 744 816 -168 ) ( 752 816 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2179 +{ +( 872 920 -96 ) ( 872 1064 -96 ) ( 872 1064 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 840 -80 -264 ) ( 840 -80 -48 ) ( 840 -360 -48 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 744 536 -200 ) ( 744 472 -200 ) ( 680 472 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 680 464 -216 ) ( 744 464 -216 ) ( 744 528 -216 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 736 608 -168 ) ( 752 608 -168 ) ( 736 608 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 752 640 -168 ) ( 744 640 -168 ) ( 752 640 -200 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2180 +{ +( 872 1096 -48 ) ( 872 1240 -48 ) ( 872 1240 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 16 +( 840 104 -224 ) ( 840 104 -8 ) ( 840 -176 -8 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( 840 712 -128 ) ( 840 648 -128 ) ( 776 648 -128 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( 776 648 -160 ) ( 840 648 -160 ) ( 840 712 -160 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( 832 784 -120 ) ( 848 784 -120 ) ( 832 784 -152 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( 848 816 -120 ) ( 840 816 -120 ) ( 848 816 -152 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2181 +{ +( 872 1096 -64 ) ( 872 1240 -64 ) ( 872 1240 -168 ) subway/1_tile_middle 0 0 -180 0.500000 -0.500000 0 318767104 16 +( 840 104 -240 ) ( 840 104 -24 ) ( 840 -176 -24 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 712 -160 ) ( 840 648 -160 ) ( 776 648 -160 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 776 648 -176 ) ( 840 648 -176 ) ( 840 712 -176 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 832 784 -136 ) ( 848 784 -136 ) ( 832 784 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 848 816 -136 ) ( 840 816 -136 ) ( 848 816 -168 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2182 +{ +( 872 1096 -32 ) ( 872 1240 -32 ) ( 872 1240 -136 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 104 -208 ) ( 840 104 8 ) ( 840 -176 8 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 712 -104 ) ( 840 648 -104 ) ( 776 648 -104 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 776 648 -120 ) ( 840 648 -120 ) ( 840 712 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 832 784 -104 ) ( 848 784 -104 ) ( 832 784 -136 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 848 816 -104 ) ( 840 816 -104 ) ( 848 816 -136 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2183 +{ +( 872 1096 -32 ) ( 872 1240 -32 ) ( 872 1240 -136 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 840 104 -208 ) ( 840 104 8 ) ( 840 -176 8 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 840 712 -64 ) ( 840 648 -64 ) ( 776 648 -64 ) subway/1_tile 16 16 0 -0.500000 0.500000 0 318767104 0 +( 776 648 -104 ) ( 840 648 -104 ) ( 840 712 -104 ) subway/1_tile 16 16 0 -0.500000 0.500000 0 318767104 0 +( 832 784 -104 ) ( 848 784 -104 ) ( 832 784 -136 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 13 +( 848 816 -104 ) ( 840 816 -104 ) ( 848 816 -136 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2184 +{ +( 872 1056 -16 ) ( 872 1200 -16 ) ( 872 1200 -120 ) subway/1_tile_middle 0 0 0 -0.500000 0.500000 0 318767104 0 +( 840 64 -192 ) ( 840 64 24 ) ( 840 -216 24 ) subway/1_tile_middle 0 0 0 -0.500000 0.500000 0 318767104 0 +( 856 680 -48 ) ( 856 616 -48 ) ( 792 616 -48 ) subway/1_tile_middle 16 16 0 -0.500000 0.500000 0 318767104 0 +( 792 616 -64 ) ( 856 616 -64 ) ( 856 680 -64 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 13 +( 856 608 -88 ) ( 872 608 -88 ) ( 856 608 -120 ) subway/1_tile_middle 16 0 0 -0.500000 0.500000 0 318767104 0 +( 864 816 -88 ) ( 856 816 -88 ) ( 864 816 -120 ) subway/1_tile_middle 16 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2185 +{ +( 872 920 -32 ) ( 872 1064 -32 ) ( 872 1064 -136 ) subway/1_tile 0 0 0 -0.500000 0.500000 0 318767104 0 +( 840 -72 -208 ) ( 840 -72 8 ) ( 840 -352 8 ) subway/1_tile 0 0 0 -0.500000 0.500000 0 318767104 0 +( 840 536 -64 ) ( 840 472 -64 ) ( 776 472 -64 ) subway/1_tile 16 -16 0 -0.500000 0.500000 0 318767104 0 +( 776 472 -104 ) ( 840 472 -104 ) ( 840 536 -104 ) subway/1_tile 16 -16 0 -0.500000 0.500000 0 318767104 0 +( 832 608 -104 ) ( 848 608 -104 ) ( 832 608 -136 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 0 +( 848 640 -104 ) ( 840 640 -104 ) ( 848 640 -136 ) subway/1_tile 32 16 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2186 +{ +( 872 920 -32 ) ( 872 1064 -32 ) ( 872 1064 -136 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 -72 -208 ) ( 840 -72 8 ) ( 840 -352 8 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 536 -104 ) ( 840 472 -104 ) ( 776 472 -104 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 776 472 -120 ) ( 840 472 -120 ) ( 840 536 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 832 608 -104 ) ( 848 608 -104 ) ( 832 608 -136 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 848 640 -104 ) ( 840 640 -104 ) ( 848 640 -136 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2187 +{ +( 872 920 -96 ) ( 872 1064 -96 ) ( 872 1064 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 -72 -272 ) ( 840 -72 -56 ) ( 840 -352 -56 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 536 -176 ) ( 840 472 -176 ) ( 776 472 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 776 472 -200 ) ( 840 472 -200 ) ( 840 536 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 832 608 -168 ) ( 848 608 -168 ) ( 832 608 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 848 640 -168 ) ( 840 640 -168 ) ( 848 640 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2188 +{ +( 872 920 -48 ) ( 872 1064 -48 ) ( 872 1064 -152 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( 840 -72 -224 ) ( 840 -72 -8 ) ( 840 -352 -8 ) subway/1_tile -16 16 0 -0.500000 0.500000 0 318767104 0 +( 840 536 -128 ) ( 840 472 -128 ) ( 776 472 -128 ) subway/1_tile -16 -16 0 0.500000 0.500000 0 318767104 0 +( 776 472 -160 ) ( 840 472 -160 ) ( 840 536 -160 ) subway/1_tile -16 -16 0 0.500000 0.500000 0 318767104 0 +( 832 608 -120 ) ( 848 608 -120 ) ( 832 608 -152 ) subway/1_tile -16 48 0 0.500000 0.500000 0 318767104 0 +( 848 640 -120 ) ( 840 640 -120 ) ( 848 640 -152 ) subway/1_tile -16 48 0 0.500000 0.500000 0 318767104 0 +} +// brush 2189 +{ +( 872 1056 -32 ) ( 872 1200 -32 ) ( 872 1200 -136 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 840 64 -208 ) ( 840 64 8 ) ( 840 -216 8 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 840 672 -64 ) ( 840 608 -64 ) ( 776 608 -64 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 872 776 -72 ) ( 840 776 -72 ) ( 840 760 -64 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 13 +( 840 776 -72 ) ( 872 776 -72 ) ( 872 784 -64 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2190 +{ +( 872 1056 -32 ) ( 872 1200 -32 ) ( 872 1200 -136 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 840 64 -208 ) ( 840 64 8 ) ( 840 -216 8 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 848 784 -104 ) ( 840 784 -104 ) ( 848 784 -136 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 840 776 -72 ) ( 872 776 -72 ) ( 872 784 -88 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 13 +( 872 776 -72 ) ( 840 776 -72 ) ( 840 784 -64 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2191 +{ +( 872 224 -136 ) ( 872 224 -32 ) ( 872 368 -32 ) subway/1_tile -16 0 0 -0.500000 0.500000 0 318767104 0 +( 840 1640 8 ) ( 840 1360 8 ) ( 840 1360 -208 ) subway/1_tile -16 0 0 -0.500000 0.500000 0 318767104 0 +( 848 640 -136 ) ( 840 640 -104 ) ( 848 640 -104 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 872 640 -88 ) ( 872 648 -72 ) ( 840 648 -72 ) subway/1_tile 32 16 0 -0.500000 0.500000 0 318767104 0 +( 840 640 -64 ) ( 840 648 -72 ) ( 872 648 -72 ) subway/1_tile 32 16 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2192 +{ +( 872 224 -136 ) ( 872 224 -32 ) ( 872 368 -32 ) subway/1_tile -16 0 0 -0.500000 0.500000 0 318767104 0 +( 840 1640 8 ) ( 840 1360 8 ) ( 840 1360 -208 ) subway/1_tile -16 0 0 -0.500000 0.500000 0 318767104 0 +( 776 816 -64 ) ( 840 816 -64 ) ( 840 752 -64 ) subway/1_tile 32 16 0 -0.500000 0.500000 0 318767104 0 +( 840 664 -64 ) ( 840 648 -72 ) ( 872 648 -72 ) subway/1_tile 32 16 0 -0.500000 0.500000 0 318767104 0 +( 872 640 -64 ) ( 872 648 -72 ) ( 840 648 -72 ) subway/1_tile 32 16 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2193 +{ +( 840 912 -96 ) ( 840 1056 -96 ) ( 840 1056 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 712 -80 -272 ) ( 712 -80 -56 ) ( 712 -360 -56 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 712 528 -168 ) ( 712 464 -168 ) ( 648 464 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 648 464 -216 ) ( 712 464 -216 ) ( 712 528 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 704 608 -168 ) ( 720 608 -168 ) ( 704 608 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 720 632 -168 ) ( 712 632 -168 ) ( 720 632 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2194 +{ +( 840 1096 -96 ) ( 840 1240 -96 ) ( 840 1240 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 712 104 -272 ) ( 712 104 -56 ) ( 712 -176 -56 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 712 712 -168 ) ( 712 648 -168 ) ( 648 648 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 648 648 -216 ) ( 712 648 -216 ) ( 712 712 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 704 792 -168 ) ( 720 792 -168 ) ( 704 792 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 720 816 -168 ) ( 712 816 -168 ) ( 720 816 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2195 +{ +( 840 184 -144 ) ( 840 184 -40 ) ( 840 328 -40 ) subway/1_lobby1a -32 8 0 1 1 0 285212672 0 +( 712 1600 16 ) ( 712 1320 16 ) ( 712 1320 -200 ) subway/1_lobby1a -32 8 0 1 1 0 285212672 0 +( 648 776 -48 ) ( 712 776 -48 ) ( 712 712 -48 ) subway/1_lobby1a 0 32 0 1 1 0 285212672 0 +( 712 712 -56 ) ( 712 776 -56 ) ( 648 776 -56 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 12 +( 712 816 -144 ) ( 728 816 -112 ) ( 712 816 -112 ) subway/1_lobby1a 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 608 -120 ) ( 712 608 -88 ) ( 720 608 -88 ) subway/1_lobby1a 0 8 0 1 1 0 285212672 0 +} +// brush 2196 +{ +( 840 184 -152 ) ( 840 184 -48 ) ( 840 328 -48 ) subway/1_lobby1a -32 0 0 1 1 0 285212672 0 +( 712 1600 8 ) ( 712 1320 8 ) ( 712 1320 -208 ) subway/1_lobby1a -32 0 0 1 1 0 285212672 0 +( 648 776 -56 ) ( 712 776 -56 ) ( 712 712 -56 ) subway/1_lobby1a 0 32 0 1 1 0 285212672 0 +( 712 712 -136 ) ( 712 776 -136 ) ( 648 776 -136 ) subway/1_lobby1a 0 32 0 1 1 0 285212672 0 +( 704 632 -152 ) ( 720 632 -120 ) ( 704 632 -120 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 12 +( 720 608 -128 ) ( 712 608 -96 ) ( 720 608 -96 ) subway/1_lobby1a 0 0 0 1 1 0 285212672 0 +} +// brush 2197 +{ +( 840 184 -168 ) ( 840 184 -64 ) ( 840 328 -64 ) subway/1_lobby1 0 48 0 0.500000 0.500000 0 285212672 0 +( 712 1600 -24 ) ( 712 1320 -24 ) ( 712 1320 -240 ) subway/1_lobby1 0 48 0 0.500000 0.500000 0 285212672 0 +( 648 776 -136 ) ( 712 776 -136 ) ( 712 712 -136 ) subway/1_lobby1 0 -16 0 0.500000 0.500000 0 285212672 0 +( 712 712 -168 ) ( 712 776 -168 ) ( 648 776 -168 ) subway/1_lobby1 0 -16 0 0.500000 0.500000 0 285212672 0 +( 704 632 -168 ) ( 720 632 -136 ) ( 704 632 -136 ) subway/1_lobby1 0 48 0 0.500000 0.500000 0 285212672 12 +( 720 608 -168 ) ( 712 608 -136 ) ( 720 608 -136 ) subway/1_lobby1 0 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 2198 +{ +( 840 216 -128 ) ( 840 216 -24 ) ( 840 360 -24 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 712 1632 16 ) ( 712 1352 16 ) ( 712 1352 -200 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 720 632 -128 ) ( 712 632 -96 ) ( 720 632 -96 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 840 632 -80 ) ( 840 640 -64 ) ( 808 640 -64 ) subway/1_lobby2 0 -32 0 0.500000 0.500000 0 285212672 12 +( 712 632 -56 ) ( 712 640 -64 ) ( 744 640 -64 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2199 +{ +( 840 216 -128 ) ( 840 216 -24 ) ( 840 360 -24 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 712 1632 16 ) ( 712 1352 16 ) ( 712 1352 -200 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 648 808 -56 ) ( 712 808 -56 ) ( 712 744 -56 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 712 656 -56 ) ( 712 640 -64 ) ( 744 640 -64 ) subway/1_lobby2 0 -32 0 0.500000 0.500000 0 285212672 12 +( 744 632 -56 ) ( 744 640 -64 ) ( 712 640 -64 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2200 +{ +( 840 1064 -24 ) ( 840 1208 -24 ) ( 840 1208 -128 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 712 72 -200 ) ( 712 72 16 ) ( 712 -208 16 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 712 680 -56 ) ( 712 616 -56 ) ( 648 616 -56 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 744 784 -64 ) ( 712 784 -64 ) ( 712 768 -56 ) subway/1_lobby2 0 0 0 0.500000 -0.500000 0 285212672 12 +( 712 784 -64 ) ( 744 784 -64 ) ( 744 792 -56 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2201 +{ +( 840 1064 -24 ) ( 840 1208 -24 ) ( 840 1208 -128 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 712 72 -200 ) ( 712 72 16 ) ( 712 -208 16 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 720 792 -96 ) ( 712 792 -96 ) ( 720 792 -128 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 808 784 -64 ) ( 840 784 -64 ) ( 840 792 -80 ) subway/1_lobby2 0 0 0 0.500000 -0.500000 0 285212672 12 +( 744 784 -64 ) ( 712 784 -64 ) ( 712 792 -56 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2202 +{ +( 840 1096 -64 ) ( 840 1240 -64 ) ( 840 1240 -168 ) subway/1_lobby1 0 48 0 0.500000 0.500000 0 285212672 0 +( 712 104 -240 ) ( 712 104 -24 ) ( 712 -176 -24 ) subway/1_lobby1 0 48 0 0.500000 0.500000 0 285212672 0 +( 712 712 -136 ) ( 712 648 -136 ) ( 648 648 -136 ) subway/1_lobby1 0 48 0 0.500000 0.500000 0 285212672 0 +( 648 648 -168 ) ( 712 648 -168 ) ( 712 712 -168 ) subway/1_lobby1 0 48 0 0.500000 0.500000 0 285212672 0 +( 704 792 -136 ) ( 720 792 -136 ) ( 704 792 -168 ) subway/1_lobby1 0 48 0 0.500000 0.500000 0 285212672 12 +( 720 816 -136 ) ( 712 816 -136 ) ( 720 816 -168 ) subway/1_lobby1 0 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 2203 +{ +( 840 1096 -48 ) ( 840 1240 -48 ) ( 840 1240 -152 ) subway/1_lobby1a 0 0 0 1 1 0 285212672 0 +( 712 104 -208 ) ( 712 104 8 ) ( 712 -176 8 ) subway/1_lobby1a 0 0 0 1 1 0 285212672 0 +( 712 712 -56 ) ( 712 648 -56 ) ( 648 648 -56 ) subway/1_lobby1a 0 0 0 1 1 0 285212672 0 +( 648 648 -136 ) ( 712 648 -136 ) ( 712 712 -136 ) subway/1_lobby1a 0 0 0 1 1 0 285212672 0 +( 704 792 -120 ) ( 720 792 -120 ) ( 704 792 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 12 +( 720 816 -96 ) ( 712 816 -96 ) ( 720 816 -128 ) subway/1_lobby1a 0 0 0 1 1 0 285212672 0 +} +// brush 2204 +{ +( 712 224 -136 ) ( 712 224 -32 ) ( 712 368 -32 ) subway/1_tile -16 0 0 -0.500000 0.500000 0 318767104 0 +( 680 1640 8 ) ( 680 1360 8 ) ( 680 1360 -208 ) subway/1_tile -16 0 0 -0.500000 0.500000 0 318767104 0 +( 616 816 -64 ) ( 680 816 -64 ) ( 680 752 -64 ) subway/1_tile 32 -48 0 -0.500000 0.500000 0 318767104 0 +( 680 664 -64 ) ( 680 648 -72 ) ( 712 648 -72 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 11 +( 712 640 -64 ) ( 712 648 -72 ) ( 680 648 -72 ) subway/1_tile 32 -48 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2205 +{ +( 712 224 -136 ) ( 712 224 -32 ) ( 712 368 -32 ) subway/1_tile -16 0 0 -0.500000 0.500000 0 318767104 0 +( 680 1640 8 ) ( 680 1360 8 ) ( 680 1360 -208 ) subway/1_tile -16 0 0 -0.500000 0.500000 0 318767104 0 +( 688 640 -136 ) ( 680 640 -104 ) ( 688 640 -104 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 712 640 -88 ) ( 712 648 -72 ) ( 680 648 -72 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 11 +( 680 640 -64 ) ( 680 648 -72 ) ( 712 648 -72 ) subway/1_tile 32 -48 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2206 +{ +( 712 1056 -32 ) ( 712 1200 -32 ) ( 712 1200 -136 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 680 64 -208 ) ( 680 64 8 ) ( 680 -216 8 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 688 784 -104 ) ( 680 784 -104 ) ( 688 784 -136 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 680 776 -72 ) ( 712 776 -72 ) ( 712 784 -88 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 11 +( 712 776 -72 ) ( 680 776 -72 ) ( 680 784 -64 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2207 +{ +( 712 1056 -32 ) ( 712 1200 -32 ) ( 712 1200 -136 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 680 64 -208 ) ( 680 64 8 ) ( 680 -216 8 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 680 672 -64 ) ( 680 608 -64 ) ( 616 608 -64 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 712 776 -72 ) ( 680 776 -72 ) ( 680 760 -64 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 11 +( 680 776 -72 ) ( 712 776 -72 ) ( 712 784 -64 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2208 +{ +( 728 784 -176 ) ( 696 784 -176 ) ( 696 752 -176 ) subway/1_concrete_floor 32 16 0 0.500000 0.500000 0 285212672 0 +( 696 744 -168 ) ( 696 776 -168 ) ( 728 776 -168 ) subway/1_concrete_floor 352 2960 0 0.500000 0.500000 0 285212672 0 +( 688 608 -160 ) ( 720 608 -160 ) ( 720 608 -176 ) subway/1_concrete_floor 32 0 0 0.500000 0.500000 0 285212672 0 +( 720 608 -160 ) ( 720 640 -160 ) ( 720 640 -176 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 728 792 -160 ) ( 696 792 -160 ) ( 696 792 -176 ) subway/1_concrete_floor 32 0 0 0.500000 0.500000 0 285212672 0 +( 688 784 -160 ) ( 688 752 -160 ) ( 688 752 -176 ) subway/1_concrete_floor 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2209 +{ +( 624 624 -152 ) ( 688 624 -152 ) ( 688 688 -152 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 688 688 -120 ) ( 688 624 -120 ) ( 624 624 -120 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 688 80 -224 ) ( 688 80 -8 ) ( 688 -200 -8 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 632 584 -104 ) ( 696 584 -104 ) ( 696 584 -112 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 696 792 -48 ) ( 696 936 -48 ) ( 696 936 -152 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 688 608 -120 ) ( 672 608 -120 ) ( 688 608 -160 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2210 +{ +( 712 920 -48 ) ( 712 1064 -48 ) ( 712 1064 -152 ) subway/1_tile 0 -32 0 0.500000 0.500000 0 318767104 0 +( 680 -72 -224 ) ( 680 -72 -8 ) ( 680 -352 -8 ) subway/1_tile -16 16 0 -0.500000 0.500000 0 318767104 0 +( 680 536 -120 ) ( 680 472 -120 ) ( 616 472 -120 ) subway/1_tile 48 -16 0 0.500000 0.500000 0 318767104 0 +( 616 472 -152 ) ( 680 472 -152 ) ( 680 536 -152 ) subway/1_tile 48 -16 0 0.500000 0.500000 0 318767104 0 +( 672 608 -120 ) ( 688 608 -120 ) ( 672 608 -152 ) subway/1_tile 48 48 0 0.500000 0.500000 0 318767104 0 +( 688 640 -120 ) ( 680 640 -120 ) ( 688 640 -152 ) subway/1_tile 48 48 0 0.500000 0.500000 0 318767104 0 +} +// brush 2211 +{ +( 712 920 -64 ) ( 712 1064 -64 ) ( 712 1064 -168 ) subway/1_tile_bottom -16 -16 0 -0.500000 0.500000 0 318767104 0 +( 680 -72 -240 ) ( 680 -72 -24 ) ( 680 -352 -24 ) subway/1_tile_bottom -16 -16 0 -0.500000 0.500000 0 318767104 0 +( 680 536 -152 ) ( 680 472 -152 ) ( 616 472 -152 ) subway/1_tile_bottom 0 0 0 -0.500000 0.500000 0 318767104 0 +( 616 472 -168 ) ( 680 472 -168 ) ( 680 536 -168 ) subway/1_tile_bottom 0 0 0 -0.500000 0.500000 0 318767104 0 +( 672 608 -136 ) ( 688 608 -136 ) ( 672 608 -168 ) subway/1_tile_bottom 0 -16 0 -0.500000 0.500000 0 318767104 0 +( 688 640 -136 ) ( 680 640 -136 ) ( 688 640 -168 ) subway/1_tile_bottom 0 -16 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2212 +{ +( 712 920 -32 ) ( 712 1064 -32 ) ( 712 1064 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 680 -72 -208 ) ( 680 -72 8 ) ( 680 -352 8 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 680 536 -104 ) ( 680 472 -104 ) ( 616 472 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 472 -120 ) ( 680 472 -120 ) ( 680 536 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 672 608 -104 ) ( 688 608 -104 ) ( 672 608 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 688 640 -104 ) ( 680 640 -104 ) ( 688 640 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2213 +{ +( 712 920 -32 ) ( 712 1064 -32 ) ( 712 1064 -136 ) subway/1_tile 0 0 0 -0.500000 0.500000 0 318767104 0 +( 680 -72 -208 ) ( 680 -72 8 ) ( 680 -352 8 ) subway/1_tile 0 0 0 -0.500000 0.500000 0 318767104 0 +( 680 536 -64 ) ( 680 472 -64 ) ( 616 472 -64 ) subway/1_tile 16 -16 0 -0.500000 0.500000 0 318767104 0 +( 616 472 -104 ) ( 680 472 -104 ) ( 680 536 -104 ) subway/1_tile 16 -16 0 -0.500000 0.500000 0 318767104 0 +( 672 608 -104 ) ( 688 608 -104 ) ( 672 608 -136 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 0 +( 688 640 -104 ) ( 680 640 -104 ) ( 688 640 -136 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 11 +} +// brush 2214 +{ +( 696 912 -16 ) ( 696 1056 -16 ) ( 696 1056 -120 ) subway/1_tile_middle 0 0 0 -0.500000 0.500000 0 318767104 0 +( 680 -72 -192 ) ( 680 -72 24 ) ( 680 -352 24 ) subway/1_tile_middle 0 0 0 -0.500000 0.500000 0 318767104 0 +( 680 536 -48 ) ( 680 472 -48 ) ( 616 472 -48 ) subway/1_tile_middle 16 -16 0 -0.500000 0.500000 0 318767104 0 +( 616 472 -64 ) ( 680 472 -64 ) ( 680 536 -64 ) subway/1_tile_middle 16 -16 0 -0.500000 0.500000 0 318767104 0 +( 672 608 -88 ) ( 688 608 -88 ) ( 672 608 -120 ) subway/1_tile_middle 16 0 0 -0.500000 0.500000 0 318767104 0 +( 688 640 -88 ) ( 680 640 -88 ) ( 688 640 -120 ) subway/1_tile_middle 16 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2215 +{ +( 712 1056 -16 ) ( 712 1200 -16 ) ( 712 1200 -120 ) subway/1_tile_middle 0 0 0 -0.500000 0.500000 0 318767104 0 +( 680 64 -192 ) ( 680 64 24 ) ( 680 -216 24 ) subway/1_tile_middle 0 0 0 -0.500000 0.500000 0 318767104 0 +( 696 680 -48 ) ( 696 616 -48 ) ( 632 616 -48 ) subway/1_tile_middle 16 -16 0 -0.500000 0.500000 0 318767104 0 +( 632 616 -64 ) ( 696 616 -64 ) ( 696 680 -64 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 11 +( 696 608 -88 ) ( 712 608 -88 ) ( 696 608 -120 ) subway/1_tile_middle 16 0 0 -0.500000 0.500000 0 318767104 0 +( 704 816 -88 ) ( 696 816 -88 ) ( 704 816 -120 ) subway/1_tile_middle 16 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2216 +{ +( 696 1088 -16 ) ( 696 1232 -16 ) ( 696 1232 -120 ) subway/1_tile_middle 0 0 0 -0.500000 0.500000 0 318767104 0 +( 680 104 -192 ) ( 680 104 24 ) ( 680 -176 24 ) subway/1_tile_middle 0 0 0 -0.500000 0.500000 0 318767104 0 +( 680 712 -48 ) ( 680 648 -48 ) ( 616 648 -48 ) subway/1_tile_middle 16 16 0 -0.500000 0.500000 0 318767104 0 +( 616 648 -64 ) ( 680 648 -64 ) ( 680 712 -64 ) subway/1_tile_middle 16 16 0 -0.500000 0.500000 0 318767104 0 +( 672 784 -88 ) ( 688 784 -88 ) ( 672 784 -120 ) subway/1_tile_middle 16 0 0 -0.500000 0.500000 0 318767104 0 +( 688 816 -88 ) ( 680 816 -88 ) ( 688 816 -120 ) subway/1_tile_middle 16 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2217 +{ +( 712 1096 -32 ) ( 712 1240 -32 ) ( 712 1240 -136 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 680 104 -208 ) ( 680 104 8 ) ( 680 -176 8 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( 680 712 -64 ) ( 680 648 -64 ) ( 616 648 -64 ) subway/1_tile 16 16 0 -0.500000 0.500000 0 318767104 0 +( 616 648 -104 ) ( 680 648 -104 ) ( 680 712 -104 ) subway/1_tile 16 16 0 -0.500000 0.500000 0 318767104 0 +( 672 784 -104 ) ( 688 784 -104 ) ( 672 784 -136 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 11 +( 688 816 -104 ) ( 680 816 -104 ) ( 688 816 -136 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2218 +{ +( 712 1096 -32 ) ( 712 1240 -32 ) ( 712 1240 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 680 104 -208 ) ( 680 104 8 ) ( 680 -176 8 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 680 712 -104 ) ( 680 648 -104 ) ( 616 648 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 648 -120 ) ( 680 648 -120 ) ( 680 712 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 672 784 -104 ) ( 688 784 -104 ) ( 672 784 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 688 816 -104 ) ( 680 816 -104 ) ( 688 816 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2219 +{ +( 712 1096 -64 ) ( 712 1240 -64 ) ( 712 1240 -168 ) subway/1_tile_bottom 16 -16 0 -0.500000 0.500000 0 318767104 0 +( 680 104 -240 ) ( 680 104 -24 ) ( 680 -176 -24 ) subway/1_tile_bottom 16 -16 0 -0.500000 0.500000 0 318767104 0 +( 680 712 -152 ) ( 680 648 -152 ) ( 616 648 -152 ) subway/1_tile_bottom 0 0 0 -0.500000 0.500000 0 318767104 0 +( 616 648 -168 ) ( 680 648 -168 ) ( 680 712 -168 ) subway/1_tile_bottom 0 0 0 -0.500000 0.500000 0 318767104 0 +( 672 784 -136 ) ( 688 784 -136 ) ( 672 784 -168 ) subway/1_tile_bottom 0 -16 0 -0.500000 0.500000 0 318767104 0 +( 688 816 -136 ) ( 680 816 -136 ) ( 688 816 -168 ) subway/1_tile_bottom 0 -16 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2220 +{ +( 712 1096 -48 ) ( 712 1240 -48 ) ( 712 1240 -152 ) subway/1_tile -32 -32 0 0.500000 0.500000 0 318767104 0 +( 680 104 -224 ) ( 680 104 -8 ) ( 680 -176 -8 ) subway/1_tile 16 16 0 -0.500000 0.500000 0 318767104 0 +( 680 712 -120 ) ( 680 648 -120 ) ( 616 648 -120 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +( 616 648 -152 ) ( 680 648 -152 ) ( 680 712 -152 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +( 672 784 -120 ) ( 688 784 -120 ) ( 672 784 -152 ) subway/1_tile 48 48 0 0.500000 0.500000 0 318767104 0 +( 688 816 -120 ) ( 680 816 -120 ) ( 688 816 -152 ) subway/1_tile 48 48 0 0.500000 0.500000 0 318767104 0 +} +// brush 2221 +{ +( 696 776 -64 ) ( 696 776 -48 ) ( 696 936 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 688 160 -144 ) ( 688 160 72 ) ( 688 -120 72 ) subway/1_tile_middle 80 0 0 -0.500000 0.500000 0 318767104 0 +( 680 936 -72 ) ( 688 936 -72 ) ( 688 936 32 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 688 696 -48 ) ( 688 632 -48 ) ( 624 632 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 624 632 -64 ) ( 688 632 -64 ) ( 688 696 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 696 808 -48 ) ( 696 808 -64 ) ( 688 808 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2222 +{ +( 696 648 -48 ) ( 696 648 -64 ) ( 696 552 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 632 552 -24 ) ( 696 552 -24 ) ( 696 552 -32 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 688 88 -144 ) ( 688 88 72 ) ( 688 -192 72 ) subway/1_tile_middle 80 0 0 -0.500000 0.500000 0 318767104 0 +( 688 696 -48 ) ( 688 632 -48 ) ( 624 632 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 624 632 -64 ) ( 688 632 -64 ) ( 688 696 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 704 608 -64 ) ( 704 608 -48 ) ( 696 608 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2223 +{ +( 688 936 -176 ) ( 688 936 -168 ) ( 624 936 -168 ) subway/1_concrete_floor -3792 -320 0 0.500000 0.500000 0 285212672 0 +( 480 1552 -176 ) ( 480 1552 -168 ) ( 480 1488 -168 ) subway/1_stair_side1 1568 -320 0 0.500000 0.500000 0 285212672 0 +( 688 952 -184 ) ( 688 952 -176 ) ( 688 1016 -176 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 656 1096 -168 ) ( 656 1160 -168 ) ( 720 1160 -168 ) subway/1_concrete_floor 352 2960 0 0.500000 0.500000 0 285212672 0 +( 688 1176 -176 ) ( 624 1176 -176 ) ( 624 1112 -176 ) subway/1_concrete_floor -368 1856 0 0.500000 0.500000 0 285212672 0 +( 600 552 -176 ) ( 472 552 -176 ) ( 536 552 -168 ) subway/1_concrete_floor -368 1856 0 0.500000 0.500000 0 285212672 0 +} +// brush 2224 +{ +( 480 1552 -176 ) ( 480 1552 -168 ) ( 480 1488 -168 ) subway/1_stair_side1 1568 -320 0 0.500000 0.500000 0 285212672 0 +( 504 328 -184 ) ( 504 328 -176 ) ( 568 328 -176 ) subway/1_concrete_floor -3792 -320 0 0.500000 0.500000 0 285212672 0 +( 720 960 -184 ) ( 720 960 -176 ) ( 720 1024 -176 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 656 1096 -168 ) ( 656 1160 -168 ) ( 720 1160 -168 ) subway/1_concrete_floor 352 2960 0 0.500000 0.500000 0 285212672 0 +( 688 1176 -176 ) ( 624 1176 -176 ) ( 624 1112 -176 ) subway/1_concrete_floor -368 1856 0 0.500000 0.500000 0 285212672 0 +( 464 552 -176 ) ( 592 552 -176 ) ( 528 552 -168 ) subway/1_concrete_floor -368 1856 0 0.500000 0.500000 0 285212672 0 +} +// brush 2225 +{ +( 696 1120 -64 ) ( 696 1264 -64 ) ( 696 1264 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 688 72 -240 ) ( 688 72 -24 ) ( 688 -208 -24 ) subway/1_tile_bottom 0 -16 0 -0.500000 0.500000 0 318767104 0 +( 680 936 -168 ) ( 688 936 -168 ) ( 688 936 -64 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 688 696 -152 ) ( 688 632 -152 ) ( 624 632 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 624 632 -168 ) ( 688 632 -168 ) ( 688 696 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 728 808 -168 ) ( 680 808 -168 ) ( 704 808 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2226 +{ +( 696 1120 -64 ) ( 696 1264 -64 ) ( 696 1264 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 632 552 -120 ) ( 696 552 -120 ) ( 696 552 -128 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 688 -16 -240 ) ( 688 -16 -24 ) ( 688 -296 -24 ) subway/1_tile_bottom 0 -16 0 -0.500000 0.500000 0 318767104 0 +( 688 696 -152 ) ( 688 632 -152 ) ( 624 632 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 624 632 -168 ) ( 688 632 -168 ) ( 688 696 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 688 608 -168 ) ( 736 608 -168 ) ( 712 608 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2227 +{ +( 624 632 -120 ) ( 688 632 -120 ) ( 688 696 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 688 696 -104 ) ( 688 632 -104 ) ( 624 632 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 680 936 -136 ) ( 688 936 -136 ) ( 688 936 -32 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 688 88 -208 ) ( 688 88 8 ) ( 688 -192 8 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 696 1072 -32 ) ( 696 1216 -32 ) ( 696 1216 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 808 -120 ) ( 664 808 -120 ) ( 692 808 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2228 +{ +( 624 632 -120 ) ( 688 632 -120 ) ( 688 696 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 688 696 -104 ) ( 688 632 -104 ) ( 624 632 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 688 88 -208 ) ( 688 88 8 ) ( 688 -192 8 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 632 552 -88 ) ( 696 552 -88 ) ( 696 552 -96 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 696 1064 -32 ) ( 696 1208 -32 ) ( 696 1208 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 688 608 -120 ) ( 744 608 -120 ) ( 716 608 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2229 +{ +( 624 632 -104 ) ( 688 632 -104 ) ( 688 696 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 680 936 -104 ) ( 688 936 -104 ) ( 688 936 0 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 688 88 -176 ) ( 688 88 40 ) ( 688 -192 40 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 696 1072 0 ) ( 696 1216 0 ) ( 696 1216 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 672 936 -96 ) ( 688 936 -96 ) ( 672 904 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 680 808 -104 ) ( 672 808 -104 ) ( 676 808 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2230 +{ +( 1208 2848 -536 ) ( 1072 2848 -536 ) ( 1072 2840 -536 ) subway/clip 0 0 0 1 1 196608 128 0 +( 1072 2840 -344 ) ( 1072 2848 -344 ) ( 1208 2848 -344 ) subway/clip 0 0 0 1 1 196608 128 0 +( 1064 2840 -352 ) ( 1200 2840 -352 ) ( 1200 2840 -448 ) subway/clip 0 0 0 1 1 196608 128 0 +( 1200 2840 -352 ) ( 1200 2848 -352 ) ( 1200 2848 -448 ) subway/clip 0 0 0 1 1 196608 128 0 +( 1208 2848 -352 ) ( 1072 2848 -352 ) ( 1072 2848 -448 ) subway/clip 0 0 0 1 1 196608 128 0 +( 1064 2848 -352 ) ( 1064 2840 -352 ) ( 1064 2840 -448 ) subway/clip 0 0 0 1 1 196608 128 0 +} +// brush 2231 +{ +( 1200 2380 -420 ) ( 1184 2380 -420 ) ( 1184 2356 -420 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1184 2356 -404 ) ( 1184 2380 -404 ) ( 1200 2380 -404 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1184 2356 -372 ) ( 1200 2356 -372 ) ( 1200 2356 -420 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1200 2356 -372 ) ( 1200 2380 -372 ) ( 1200 2380 -420 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1200 2372 -372 ) ( 1184 2372 -372 ) ( 1184 2372 -420 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1196 2380 -372 ) ( 1196 2356 -372 ) ( 1196 2356 -420 ) subway/light_red -8 -8 0 0.500000 0.500000 134217728 16777217 13000 +} +// brush 2232 +{ +( -1304 1696 -288 ) ( -1304 1640 -288 ) ( -1304 1640 -296 ) subway/1_tunneltrack_end1 0 32 90 1 1 0 536870912 0 +( -1248 1696 -288 ) ( -1304 1696 -288 ) ( -1304 1696 -296 ) subway/1_tunneltrack_end1 0 32 90 1 1 0 536870912 0 +( -1256 1640 -288 ) ( -1256 1696 -288 ) ( -1256 1696 -296 ) subway/1_tunneltrack_end1 0 32 90 1 1 0 536870912 0 +( -1304 1616 -288 ) ( -1248 1616 -288 ) ( -1248 1616 -296 ) subway/1_tunneltrack_end1 0 32 90 1 1 0 536870912 0 +( -1304 1640 -288 ) ( -1304 1696 -288 ) ( -1248 1696 -288 ) subway/1_tunneltrack_end1 40 32 90 1 1 0 536870912 0 +( -1248 1696 -296 ) ( -1304 1696 -296 ) ( -1304 1640 -296 ) subway/1_tunneltrack_end1 40 32 90 1 1 0 536870912 0 +} +// brush 2233 +{ +( -1296 1696 -296 ) ( -1352 1696 -296 ) ( -1352 1640 -296 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( -1352 1640 -288 ) ( -1352 1696 -288 ) ( -1296 1696 -288 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( -1352 1616 -288 ) ( -1296 1616 -288 ) ( -1296 1616 -296 ) subway/1_tunneltrack_plain 0 40 0 1 1 0 301989888 0 +( -1304 1640 -288 ) ( -1304 1696 -288 ) ( -1304 1696 -296 ) subway/1_tunneltrack_plain 0 40 0 1 1 0 301989888 0 +( -1296 1696 -288 ) ( -1352 1696 -288 ) ( -1352 1696 -296 ) subway/1_tunneltrack_plain 0 40 0 1 1 0 301989888 0 +( -1384 1696 -288 ) ( -1384 1640 -288 ) ( -1384 1640 -296 ) subway/1_tunneltrack_plain 0 40 0 1 1 0 301989888 0 +} +// brush 2234 +{ +( -80 1452 -296 ) ( -80 1572 -296 ) ( -104 1572 -296 ) subway/1_tunneltrack_1 -15 0 90 1 1 0 16777216 0 +( -120 1572 -288 ) ( -96 1572 -288 ) ( -96 1452 -288 ) subway/1_tunneltrack_1 -23 0 90 1 1 0 16777216 0 +( -1256 1620 -320 ) ( -1256 1500 -320 ) ( -1256 1500 -328 ) subway/1_tunneltrack_1 -55 0 90 1 1 0 16777216 0 +( -88 1616 -272 ) ( -64 1616 -272 ) ( -64 1616 -280 ) subway/1_tunneltrack_1 -55 0 90 1 1 0 16777216 0 +( -64 1432 -232 ) ( -64 1552 -232 ) ( -64 1552 -240 ) subway/1_tunneltrack_1 -55 0 90 1 1 0 16777216 0 +( -48 1696 -264 ) ( -72 1696 -264 ) ( -72 1696 -272 ) subway/1_tunneltrack_1 -55 0 90 1 1 0 16777216 0 +} +// brush 2235 +{ +( 1696 -48 -408 ) ( 1696 -32 -408 ) ( 1688 -32 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -32 -392 ) ( 1696 -32 -392 ) ( 1696 -48 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -48 -408 ) ( 1688 -48 -392 ) ( 1696 -48 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -32 -408 ) ( 1688 -32 -392 ) ( 1688 -48 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 -32 -408 ) ( 1696 -32 -392 ) ( 1688 -32 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1690 -48 -408 ) ( 1690 -48 -392 ) ( 1690 -32 -392 ) subway/light_red 0 -16 0 0.500000 0.500000 134217792 16777217 19000 +} +// brush 2236 +{ +( 1690 -16 -408 ) ( 1690 -16 -392 ) ( 1690 0 -392 ) subway/light_red 0 -16 0 0.500000 0.500000 134217792 16777217 19000 +( 1696 0 -408 ) ( 1696 0 -392 ) ( 1688 0 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 0 -408 ) ( 1688 0 -392 ) ( 1688 -16 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 -16 -408 ) ( 1688 -16 -392 ) ( 1696 -16 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 0 -392 ) ( 1696 0 -392 ) ( 1696 -16 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 -16 -408 ) ( 1696 0 -408 ) ( 1688 0 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +} +// brush 2237 +{ +( 1976 0 -408 ) ( 1968 0 -408 ) ( 1968 -16 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 -16 -392 ) ( 1968 0 -392 ) ( 1976 0 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 -16 -392 ) ( 1976 -16 -392 ) ( 1976 -16 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 -16 -392 ) ( 1976 0 -392 ) ( 1976 0 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 0 -392 ) ( 1968 0 -392 ) ( 1968 0 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1974 0 -392 ) ( 1974 -16 -392 ) ( 1974 -16 -408 ) subway/light_red 0 -16 0 0.500000 0.500000 134217728 16777217 19000 +} +// brush 2238 +{ +( 1974 -32 -392 ) ( 1974 -48 -392 ) ( 1974 -48 -408 ) subway/light_red 0 -16 0 0.500000 0.500000 134217728 16777217 19000 +( 1976 -32 -392 ) ( 1968 -32 -392 ) ( 1968 -32 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 -48 -392 ) ( 1976 -32 -392 ) ( 1976 -32 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 -48 -392 ) ( 1976 -48 -392 ) ( 1976 -48 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 -48 -392 ) ( 1968 -32 -392 ) ( 1976 -32 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 -32 -408 ) ( 1968 -32 -408 ) ( 1968 -48 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2239 +{ +( 1984 432 -408 ) ( 1976 432 -408 ) ( 1976 416 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 416 -392 ) ( 1976 432 -392 ) ( 1984 432 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 416 -392 ) ( 1984 416 -392 ) ( 1984 416 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1984 416 -392 ) ( 1984 432 -392 ) ( 1984 432 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1984 432 -392 ) ( 1976 432 -392 ) ( 1976 432 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1982 432 -392 ) ( 1982 416 -392 ) ( 1982 416 -408 ) subway/light_red 0 -16 0 0.500000 0.500000 134217728 16777217 19000 +} +// brush 2240 +{ +( 1982 400 -392 ) ( 1982 384 -392 ) ( 1982 384 -408 ) subway/light_red 0 -16 0 0.500000 0.500000 134217728 16777217 19000 +( 1984 400 -392 ) ( 1976 400 -392 ) ( 1976 400 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1984 384 -392 ) ( 1984 400 -392 ) ( 1984 400 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 384 -392 ) ( 1984 384 -392 ) ( 1984 384 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 384 -392 ) ( 1976 400 -392 ) ( 1984 400 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1984 400 -408 ) ( 1976 400 -408 ) ( 1976 384 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2241 +{ +( 1984 -284 -480 ) ( 1864 -284 -480 ) ( 1864 -308 -480 ) subway/1_tunnelwall_pipe 32 0 0 0.500000 0.500000 0 16777216 0 +( 1872 -364 -448 ) ( 1872 -340 -448 ) ( 1992 -340 -448 ) subway/1_tunnelwall_pipe 32 0 0 0.500000 0.500000 0 16777216 0 +( 1824 -700 -512 ) ( 1944 -700 -512 ) ( 1944 -700 -520 ) subway/1_tunnelwall_pipe 32 -32 0 0.500000 0.500000 0 16777216 0 +( 1688 -664 -480 ) ( 1688 -640 -480 ) ( 1688 -640 -488 ) subway/1_tunnelwall_pipe -48 -56 0 0.500000 0.500000 0 16777216 0 +( 2008 424 -424 ) ( 1888 424 -424 ) ( 1888 424 -432 ) subway/1_tunnelwall_pipe 32 -32 0 0.500000 0.500000 0 16777216 0 +( 1672 244 -392 ) ( 1672 220 -392 ) ( 1672 220 -400 ) subway/1_tunnelwall_pipe -48 -32 0 0.500000 0.500000 0 16777216 0 +( 1688 -344 -264 ) ( 1656 -344 -264 ) ( 1656 -344 -254 ) subway/1_tunneltrack_1 -29 -54 195 1 1 0 16777216 0 +} +// brush 2242 +{ +( 1688 424 -496 ) ( 1688 424 -480 ) ( 1680 424 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1680 176 -480 ) ( 1680 -160 -480 ) ( 1680 -160 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1688 -344 -480 ) ( 1688 -344 -496 ) ( 1680 -344 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1688 -32 -496 ) ( 1688 -32 -480 ) ( 1688 256 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1664 -100 -480 ) ( 1664 76 -480 ) ( 1688 76 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1688 76 -488 ) ( 1664 76 -488 ) ( 1664 -100 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 2243 +{ +( 1784 280 -520 ) ( 1784 256 -520 ) ( 1784 256 -528 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 2016 424 -480 ) ( 1896 424 -480 ) ( 1896 424 -488 ) subway/1_tunneltrack_plain 32 -48 0 0.500000 0.500000 0 301989888 0 +( 1872 -512 -520 ) ( 1872 -488 -520 ) ( 1872 -488 -528 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1816 -344 -568 ) ( 1936 -344 -568 ) ( 1936 -344 -576 ) subway/1_tunneltrack_plain 32 -48 0 0.500000 0.500000 0 301989888 0 +( 1864 -472 -536 ) ( 1864 -448 -536 ) ( 1984 -448 -536 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1960 -472 -552 ) ( 1840 -472 -552 ) ( 1840 -496 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 2244 +{ +( 1800 -344 -264 ) ( 1760 -344 -264 ) ( 1760 -344 -254 ) subway/1_tunneltrack_1 -38 -20 195 1 1 0 16777216 0 +( 1976 -832 -504 ) ( 1976 -832 -536 ) ( 1928 -832 -536 ) subway/metal2 -24 -48 0 0.500000 0.500000 0 16777216 0 +( 1792 -264 -728 ) ( 1792 -264 -768 ) ( 1792 -272 -768 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1976 424 -536 ) ( 1976 424 -504 ) ( 1928 424 -504 ) subway/metal2 -24 -48 0 0.500000 0.500000 0 16777216 0 +( 1784 288 -516 ) ( 1784 24 -516 ) ( 1784 24 -548 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1872 -552 -528 ) ( 1872 -288 -528 ) ( 1904 -288 -528 ) subway/metal2 -24 32 0 0.500000 0.500000 0 16777216 0 +( 1976 -416 -536 ) ( 1976 -408 -536 ) ( 1928 -408 -536 ) subway/metal2 -24 32 0 0.500000 0.500000 0 16777216 0 +} +// brush 2245 +{ +( 1720 736 -512 ) ( 1720 712 -512 ) ( 1720 712 -520 ) subway/1_tunneltrack_1 -20 -56 0 1 1 0 16777216 0 +( 2008 424 -480 ) ( 1888 424 -480 ) ( 1888 424 -488 ) subway/1_tunneltrack_1 28 -56 0 1 1 0 16777216 0 +( 1792 856 -520 ) ( 1792 880 -520 ) ( 1792 880 -528 ) subway/1_tunneltrack_1 -20 -56 0 1 1 0 16777216 0 +( 1772 -344 -568 ) ( 1892 -344 -568 ) ( 1892 -344 -576 ) subway/1_tunneltrack_1 28 -56 0 1 1 0 16777216 0 +( 1836 0 -536 ) ( 1836 24 -536 ) ( 1956 24 -536 ) subway/1_tunneltrack_1 -12 40 0 1 1 0 16777216 0 +( 1956 40 -552 ) ( 1836 40 -552 ) ( 1836 16 -552 ) subway/1_tunneltrack_1 28 40 0 1 1 0 16777216 0 +} +// brush 2246 +{ +( 1744 -344 -264 ) ( 1680 -344 -264 ) ( 1680 -344 -254 ) subway/1_tunneltrack_1 -34 -19 195 1 1 0 16777216 0 +( 1904 -416 -536 ) ( 1904 -408 -536 ) ( 1856 -408 -536 ) subway/metal2 -32 32 0 0.500000 0.500000 0 16777216 0 +( 1800 -552 -528 ) ( 1800 -288 -528 ) ( 1832 -288 -528 ) subway/metal2 -32 32 0 0.500000 0.500000 0 16777216 0 +( 1712 -416 -516 ) ( 1712 -680 -516 ) ( 1712 -680 -548 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1904 424 -536 ) ( 1904 424 -504 ) ( 1856 424 -504 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1720 -72 -728 ) ( 1720 -72 -768 ) ( 1720 -80 -768 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +( 1904 -832 -504 ) ( 1904 -832 -536 ) ( 1856 -832 -536 ) subway/metal2 -32 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 2247 +{ +( 1680 152 -520 ) ( 1680 128 -520 ) ( 1680 128 -528 ) subway/1_tunneltrack_plain -48 -48 0 0.500000 0.500000 0 301989888 0 +( 1880 424 -480 ) ( 1760 424 -480 ) ( 1760 424 -488 ) subway/1_tunneltrack_plain 16 -48 0 0.500000 0.500000 0 301989888 0 +( 1712 1168 -520 ) ( 1712 1192 -520 ) ( 1712 1192 -528 ) subway/1_tunneltrack_plain -48 -48 0 0.500000 0.500000 0 301989888 0 +( 1704 -344 -568 ) ( 1824 -344 -568 ) ( 1824 -344 -576 ) subway/1_tunneltrack_plain 16 -48 0 0.500000 0.500000 0 301989888 0 +( 1752 120 -536 ) ( 1752 144 -536 ) ( 1872 144 -536 ) subway/1_tunnelfloor_2 25 -8 90 -1 -1 0 285212672 0 +( 1872 152 -552 ) ( 1752 152 -552 ) ( 1752 128 -552 ) subway/1_tunneltrack_plain 16 48 0 0.500000 0.500000 0 301989888 0 +} +// brush 2248 +{ +( 1872 616 -552 ) ( 1752 616 -552 ) ( 1752 592 -552 ) subway/1_tunneltrack_plain 16 48 0 0.500000 0.500000 0 301989888 0 +( 1752 584 -536 ) ( 1752 608 -536 ) ( 1872 608 -536 ) subway/1_tunnelfloor_2 25 -8 90 -1 -1 0 285212672 0 +( 1704 424 -568 ) ( 1824 424 -568 ) ( 1824 424 -576 ) subway/1_tunneltrack_plain 16 16 0 0.500000 0.500000 0 301989888 0 +( 1712 1936 -520 ) ( 1712 1960 -520 ) ( 1712 1960 -528 ) subway/1_tunneltrack_plain -48 16 0 0.500000 0.500000 0 301989888 0 +( 1880 888 -480 ) ( 1760 888 -480 ) ( 1760 888 -488 ) subway/1_tunneltrack_plain 16 16 0 0.500000 0.500000 0 301989888 0 +( 1688 616 -520 ) ( 1688 592 -520 ) ( 1688 592 -528 ) subway/1_tunneltrack_plain -48 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 2249 +{ +( 1956 504 -544 ) ( 1836 504 -544 ) ( 1836 480 -544 ) subway/1_tunneltrack_1 52 40 0 1 1 0 16777216 0 +( 1836 464 -536 ) ( 1836 488 -536 ) ( 1956 488 -536 ) subway/1_tunneltrack_1 52 40 0 1 1 0 16777216 0 +( 1772 424 -568 ) ( 1892 424 -568 ) ( 1892 424 -576 ) subway/1_tunneltrack_1 52 40 0 1 1 0 16777216 0 +( 1792 1624 -520 ) ( 1792 1648 -520 ) ( 1792 1648 -528 ) subway/1_tunneltrack_1 60 40 0 1 1 0 16777216 0 +( 1976 888 -480 ) ( 1856 888 -480 ) ( 1856 888 -488 ) subway/1_tunneltrack_1 52 40 0 1 1 0 16777216 0 +( 1720 1664 -512 ) ( 1720 1640 -512 ) ( 1720 1640 -520 ) subway/1_tunneltrack_1 60 40 0 1 1 0 16777216 0 +} +// brush 2250 +{ +( 1904 -368 -504 ) ( 1904 -368 -536 ) ( 1856 -368 -536 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1720 696 -728 ) ( 1720 696 -768 ) ( 1720 688 -768 ) subway/metal2 -32 16 0 0.500000 0.500000 0 16777216 0 +( 1904 888 -536 ) ( 1904 888 -504 ) ( 1856 888 -504 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1712 48 -516 ) ( 1712 -216 -516 ) ( 1712 -216 -548 ) subway/metal2 -32 16 0 0.500000 0.500000 0 16777216 0 +( 1800 -88 -528 ) ( 1800 176 -528 ) ( 1832 176 -528 ) subway/metal2 32 32 0 0.500000 0.500000 0 16777216 0 +( 1904 48 -536 ) ( 1904 56 -536 ) ( 1856 56 -536 ) subway/metal2 32 32 0 0.500000 0.500000 0 16777216 0 +( 1744 424 -264 ) ( 1680 424 -264 ) ( 1680 424 -254 ) subway/1_tunneltrack_1 -33 -20 195 1 1 0 16777216 0 +} +// brush 2251 +{ +( 1976 48 -536 ) ( 1976 56 -536 ) ( 1928 56 -536 ) subway/metal2 40 32 0 0.500000 0.500000 0 16777216 0 +( 1872 -88 -528 ) ( 1872 176 -528 ) ( 1904 176 -528 ) subway/metal2 40 32 0 0.500000 0.500000 0 16777216 0 +( 1784 1056 -516 ) ( 1784 792 -516 ) ( 1784 792 -548 ) subway/metal2 -32 16 0 0.500000 0.500000 0 16777216 0 +( 1976 888 -536 ) ( 1976 888 -504 ) ( 1928 888 -504 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 1792 200 -728 ) ( 1792 200 -768 ) ( 1792 192 -768 ) subway/metal2 -32 16 0 0.500000 0.500000 0 16777216 0 +( 1976 -368 -504 ) ( 1976 -368 -536 ) ( 1928 -368 -536 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 1800 424 -264 ) ( 1760 424 -264 ) ( 1760 424 -254 ) subway/1_tunneltrack_1 -37 -21 195 1 1 0 16777216 0 +} +// brush 2252 +{ +( 1960 -8 -552 ) ( 1840 -8 -552 ) ( 1840 -32 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1864 -8 -536 ) ( 1864 16 -536 ) ( 1984 16 -536 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1816 424 -568 ) ( 1936 424 -568 ) ( 1936 424 -576 ) subway/1_tunneltrack_plain 32 16 0 0.500000 0.500000 0 301989888 0 +( 1872 -48 -520 ) ( 1872 -24 -520 ) ( 1872 -24 -528 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 2024 616 -480 ) ( 1904 616 -480 ) ( 1904 616 -488 ) subway/1_tunneltrack_plain 32 16 0 0.500000 0.500000 0 301989888 0 +( 1784 1048 -520 ) ( 1784 1024 -520 ) ( 1784 1024 -528 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 2253 +{ +( 2064 40 -504 ) ( 2064 40 -536 ) ( 2016 40 -536 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1880 288 -728 ) ( 1880 288 -768 ) ( 1880 280 -768 ) subway/metal2 -16 16 0 0.500000 0.500000 0 16777216 0 +( 2064 888 -536 ) ( 2064 888 -504 ) ( 2016 888 -504 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1872 456 -516 ) ( 1872 192 -516 ) ( 1872 192 -548 ) subway/metal2 -16 16 0 0.500000 0.500000 0 16777216 0 +( 1960 320 -528 ) ( 1960 584 -528 ) ( 1992 584 -528 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 2064 456 -536 ) ( 2064 464 -536 ) ( 2016 464 -536 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1904 424 -264 ) ( 1840 424 -264 ) ( 1840 424 -254 ) subway/1_tunneltrack_1 -7 -43 195 1 1 0 16777216 0 +} +// brush 2254 +{ +( 1880 1296 -512 ) ( 1880 1272 -512 ) ( 1880 1272 -520 ) subway/1_tunneltrack_1 -44 8 0 1 1 0 16777216 0 +( 2136 888 -480 ) ( 2016 888 -480 ) ( 2016 888 -488 ) subway/1_tunneltrack_1 60 8 0 1 1 0 16777216 0 +( 1944 1256 -520 ) ( 1944 1280 -520 ) ( 1944 1280 -528 ) subway/1_tunneltrack_1 -44 8 0 1 1 0 16777216 0 +( 1932 424 -568 ) ( 2052 424 -568 ) ( 2052 424 -576 ) subway/1_tunneltrack_1 60 8 0 1 1 0 16777216 0 +( 1996 872 -536 ) ( 1996 896 -536 ) ( 2116 896 -536 ) subway/1_tunneltrack_1 20 0 0 1 1 0 16777216 0 +( 2116 912 -544 ) ( 1996 912 -544 ) ( 1996 888 -544 ) subway/1_tunneltrack_1 60 0 0 1 1 0 16777216 0 +} +// brush 2255 +{ +( 2136 456 -536 ) ( 2136 464 -536 ) ( 2088 464 -536 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 2032 320 -528 ) ( 2032 584 -528 ) ( 2064 584 -528 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 1944 648 -516 ) ( 1944 384 -516 ) ( 1944 384 -548 ) subway/metal2 -16 16 0 0.500000 0.500000 0 16777216 0 +( 2136 888 -536 ) ( 2136 888 -504 ) ( 2088 888 -504 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 1952 608 -728 ) ( 1952 608 -768 ) ( 1952 600 -768 ) subway/metal2 -16 16 0 0.500000 0.500000 0 16777216 0 +( 2136 40 -504 ) ( 2136 40 -536 ) ( 2088 40 -536 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 1960 424 -264 ) ( 1920 424 -264 ) ( 1920 424 -254 ) subway/1_tunneltrack_1 -10 -44 195 1 1 0 16777216 0 +} +// brush 2256 +{ +( 1952 688 -520 ) ( 1952 664 -520 ) ( 1952 664 -528 ) subway/1_tunneltrack_plain -16 16 0 0.500000 0.500000 0 301989888 0 +( 2184 888 -480 ) ( 2064 888 -480 ) ( 2064 888 -488 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 1976 424 -552 ) ( 1976 424 -536 ) ( 1976 888 -536 ) subway/1_tunneltrack_plain -16 16 0 0.500000 0.500000 0 301989888 0 +( 1976 424 -536 ) ( 1976 424 -552 ) ( 1944 424 -552 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 2024 400 -536 ) ( 2024 424 -536 ) ( 2144 424 -536 ) subway/1_tunnelfloor_2 -16 8 90 1 1 0 285212672 0 +( 2120 400 -552 ) ( 2000 400 -552 ) ( 2000 376 -552 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 2257 +{ +( 1982 816 -392 ) ( 1982 800 -392 ) ( 1982 800 -408 ) subway/light_red 0 16 0 0.500000 0.500000 134217728 16777217 19000 +( 1984 816 -392 ) ( 1976 816 -392 ) ( 1976 816 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1984 800 -392 ) ( 1984 816 -392 ) ( 1984 816 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 800 -392 ) ( 1984 800 -392 ) ( 1984 800 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 800 -392 ) ( 1976 816 -392 ) ( 1984 816 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1984 816 -408 ) ( 1976 816 -408 ) ( 1976 800 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2258 +{ +( 1984 784 -408 ) ( 1976 784 -408 ) ( 1976 768 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 768 -392 ) ( 1976 784 -392 ) ( 1984 784 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 768 -392 ) ( 1984 768 -392 ) ( 1984 768 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1984 768 -392 ) ( 1984 784 -392 ) ( 1984 784 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1984 784 -392 ) ( 1976 784 -392 ) ( 1976 784 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1982 784 -392 ) ( 1982 768 -392 ) ( 1982 768 -408 ) subway/light_red 0 16 0 0.500000 0.500000 134217728 16777217 19000 +} +// brush 2259 +{ +( 2000 364 -488 ) ( 2000 540 -488 ) ( 1976 540 -488 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1976 540 -480 ) ( 2000 540 -480 ) ( 2000 364 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1976 720 -480 ) ( 1976 432 -480 ) ( 1976 432 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1984 424 -496 ) ( 1976 424 -496 ) ( 1976 424 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1984 576 -496 ) ( 1984 576 -480 ) ( 1984 912 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1984 888 -480 ) ( 1976 888 -480 ) ( 1976 888 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 2260 +{ +( 1800 156 -480 ) ( 1800 180 -480 ) ( 1680 180 -480 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1672 124 -448 ) ( 1792 124 -448 ) ( 1792 100 -448 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1720 -236 -520 ) ( 1720 -236 -512 ) ( 1840 -236 -512 ) subway/1_tunnelwall_pipe 0 32 0 0.500000 0.500000 0 16777216 0 +( 1976 120 -488 ) ( 1976 120 -480 ) ( 1976 96 -480 ) subway/1_tunnelwall_pipe -48 8 0 0.500000 0.500000 0 16777216 0 +( 1776 920 -432 ) ( 1776 920 -424 ) ( 1656 920 -424 ) subway/1_tunnelwall_pipe 0 32 0 0.500000 0.500000 0 16777216 0 +( 1992 660 -400 ) ( 1992 660 -392 ) ( 1992 684 -392 ) subway/1_tunnelwall_pipe -48 32 0 0.500000 0.500000 0 16777216 0 +( 2008 424 -254 ) ( 2008 424 -264 ) ( 1976 424 -264 ) subway/1_tunneltrack_1 -53 -40 195 1 1 0 16777216 0 +} +// brush 2261 +{ +( 1800 132 -520 ) ( 1800 156 -520 ) ( 1680 156 -520 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( 1672 164 -488 ) ( 1792 164 -488 ) ( 1792 140 -488 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( 1712 220 -560 ) ( 1712 220 -552 ) ( 1832 220 -552 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1976 120 -512 ) ( 1976 120 -504 ) ( 1976 96 -504 ) subway/1_tunnelwall -56 -8 0 1 1 0 301989888 0 +( 1776 888 -472 ) ( 1776 888 -464 ) ( 1656 888 -464 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1992 4 -440 ) ( 1992 4 -432 ) ( 1992 28 -432 ) subway/1_tunnelwall -48 16 0 0.500000 0.500000 0 301989888 0 +( 1984 424 -254 ) ( 1984 424 -264 ) ( 1936 424 -264 ) subway/1_tunneltrack_1 -53 -40 195 1 1 0 16777216 0 +} +// brush 2262 +{ +( 1696 424 -448 ) ( 1688 424 -336 ) ( 1696 424 -336 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1688 -20 -288 ) ( 1696 -20 -288 ) ( 1696 -68 -288 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1992 540 -448 ) ( 1872 540 -448 ) ( 1872 516 -448 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1688 440 -432 ) ( 1688 464 -432 ) ( 1688 464 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 2012 888 -376 ) ( 1892 888 -376 ) ( 1892 888 -384 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1672 1044 -344 ) ( 1672 1020 -344 ) ( 1672 1020 -352 ) subway/1_tunnelwall -48 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 2263 +{ +( 1688 424 -264 ) ( 1656 424 -264 ) ( 1656 424 -254 ) subway/1_tunneltrack_1 -28 -55 195 1 1 0 16777216 0 +( 1672 708 -392 ) ( 1672 684 -392 ) ( 1672 684 -400 ) subway/1_tunnelwall_pipe -48 32 0 0.500000 0.500000 0 16777216 0 +( 2008 888 -424 ) ( 1888 888 -424 ) ( 1888 888 -432 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1688 72 -480 ) ( 1688 96 -480 ) ( 1688 96 -488 ) subway/1_tunnelwall_pipe -48 8 0 0.500000 0.500000 0 16777216 0 +( 1824 -236 -512 ) ( 1944 -236 -512 ) ( 1944 -236 -520 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1872 100 -448 ) ( 1872 124 -448 ) ( 1992 124 -448 ) subway/1_tunnelwall_pipe 32 0 0 0.500000 0.500000 0 16777216 0 +( 1984 180 -480 ) ( 1864 180 -480 ) ( 1864 156 -480 ) subway/1_tunnelwall_pipe 32 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2264 +{ +( 1688 540 -488 ) ( 1664 540 -488 ) ( 1664 364 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1664 364 -480 ) ( 1664 540 -480 ) ( 1688 540 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1688 432 -496 ) ( 1688 432 -480 ) ( 1688 720 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1688 424 -480 ) ( 1688 424 -496 ) ( 1680 424 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1680 912 -480 ) ( 1680 576 -480 ) ( 1680 576 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1688 888 -496 ) ( 1688 888 -480 ) ( 1680 888 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 2265 +{ +( 1728 424 -264 ) ( 1680 424 -264 ) ( 1680 424 -254 ) subway/1_tunneltrack_1 -28 -55 195 1 1 0 16777216 0 +( 1672 28 -432 ) ( 1672 4 -432 ) ( 1672 4 -440 ) subway/1_tunnelwall -48 16 0 0.500000 0.500000 0 301989888 0 +( 2008 888 -464 ) ( 1888 888 -464 ) ( 1888 888 -472 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1688 96 -504 ) ( 1688 120 -504 ) ( 1688 120 -512 ) subway/1_tunnelwall -56 -8 0 1 1 0 301989888 0 +( 1832 220 -552 ) ( 1952 220 -552 ) ( 1952 220 -560 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1872 140 -488 ) ( 1872 164 -488 ) ( 1992 164 -488 ) subway/1_tunnelwall 32 48 0 0.500000 0.500000 0 301989888 0 +( 1984 156 -520 ) ( 1864 156 -520 ) ( 1864 132 -520 ) subway/1_tunnelwall 32 48 0 0.500000 0.500000 0 301989888 0 +} +// brush 2266 +{ +( 1844 -276 -536 ) ( 1820 -276 -536 ) ( 1820 -300 -536 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1820 -300 -472 ) ( 1820 -276 -472 ) ( 1844 -276 -472 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1820 -300 -472 ) ( 1844 -300 -472 ) ( 1844 -300 -488 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1844 -300 -472 ) ( 1844 -276 -472 ) ( 1844 -276 -488 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1844 -276 -472 ) ( 1820 -276 -472 ) ( 1820 -276 -488 ) subway/clip 0 0 0 1 1 196608 144 0 +( 1820 -276 -472 ) ( 1820 -300 -472 ) ( 1820 -300 -488 ) subway/clip 0 0 0 1 1 196608 144 0 +} +// brush 2267 +{ +( 1472 3272 -480 ) ( 1120 3096 -480 ) ( 1120 3080 -480 ) subway/1_tunnelwall_pipe 0 832 0 0.500000 0.500000 0 16777216 0 +( 1472 3256 -448 ) ( 1120 3080 -448 ) ( 1120 3096 -448 ) subway/1_tunnelwall_pipe 0 832 0 0.500000 0.500000 0 16777216 0 +( 1472 3272 -448 ) ( 1120 3096 -448 ) ( 1120 3096 -464 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1472 3256 -480 ) ( 1120 3080 -480 ) ( 1120 3080 -464 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1472 3304 -208 ) ( 1472 3248 -208 ) ( 1472 3248 -198 ) subway/1_tunnelwall_pipe -768 64 0 0.500000 0.500000 0 16777216 0 +( 1120 3048 -424 ) ( 1120 3104 -440 ) ( 1120 3104 -424 ) subway/1_tunnelwall_pipe -768 64 0 0.500000 0.500000 0 16777216 0 +( 1512 2632 66 ) ( 1512 2632 56 ) ( 1000 3144 56 ) subway/1_tunnelwall_pipe -768 64 0 0.500000 0.500000 0 16777216 0 +( 1320 3000 66 ) ( 1320 3000 56 ) ( 1264 3056 56 ) subway/1_tunnelwall_pipe -768 64 0 0.500000 0.500000 0 16777216 0 +} +// brush 2268 +{ +( 1288 3032 10 ) ( 1288 3032 0 ) ( 1264 3056 0 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1472 3224 -544 ) ( 1184 3080 -544 ) ( 1184 3008 -544 ) subway/1_tunneltrack_1 -228 592 0 1 1 0 16777216 0 +( 1472 3152 -536 ) ( 1184 3008 -536 ) ( 1184 3080 -536 ) subway/1_tunneltrack_1 386 128 -64 0.900000 1 0 16777216 0 +( 1472 3060 -576 ) ( 1472 3060 -568 ) ( 1472 3180 -568 ) subway/1_tunneltrack_1 -612 0 0 1 1 0 16777216 0 +( 1472 3152 -544 ) ( 1184 3008 -544 ) ( 1184 3008 -536 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +( 1184 2920 -488 ) ( 1184 2920 -480 ) ( 1184 2800 -480 ) subway/1_tunneltrack_1 -612 0 0 1 1 0 16777216 0 +( 1472 3224 -536 ) ( 1184 3080 -536 ) ( 1184 3080 -544 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +} +// brush 2269 +{ +( 1472 3264 -254 ) ( 1472 3264 -264 ) ( 1472 3200 -264 ) subway/1_tunneltrack_1 792 -15 195 1 1 0 16777216 0 +( 1472 3232 -536 ) ( 1184 3088 -536 ) ( 1184 3080 -536 ) subway/metal2 -712 1184 0 0.500000 0.500000 0 16777216 0 +( 1472 3224 -528 ) ( 1184 3080 -528 ) ( 1184 3088 -528 ) subway/metal2 -712 1184 0 0.500000 0.500000 0 16777216 0 +( 1472 3232 -528 ) ( 1184 3088 -528 ) ( 1184 3088 -536 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1184 2952 -504 ) ( 1184 2904 -504 ) ( 1184 2904 -536 ) subway/metal2 -1480 0 0 0.500000 0.500000 0 16777216 0 +( 1472 3224 -536 ) ( 1184 3080 -536 ) ( 1184 3080 -528 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 2232 3088 -536 ) ( 2232 3040 -536 ) ( 2232 3040 -504 ) subway/metal2 -1480 0 0 0.500000 0.500000 0 16777216 0 +( 1232 3088 10 ) ( 1232 3088 0 ) ( 1200 3120 0 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +} +// brush 2270 +{ +( 1280 3040 10 ) ( 1280 3040 0 ) ( 1256 3064 0 ) subway/1_trim1 -768 0 0 0.500000 0.500000 0 0 0 +( 1232 3012 10 ) ( 1232 3012 0 ) ( 1200 3044 0 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 2232 3012 -536 ) ( 2232 2964 -536 ) ( 2232 2964 -504 ) subway/metal2 -1480 0 0 0.500000 0.500000 0 16777216 0 +( 1472 3148 -536 ) ( 1184 3004 -536 ) ( 1184 3004 -528 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1184 2876 -504 ) ( 1184 2828 -504 ) ( 1184 2828 -536 ) subway/metal2 -1480 0 0 0.500000 0.500000 0 16777216 0 +( 1472 3156 -528 ) ( 1184 3012 -528 ) ( 1184 3012 -536 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1472 3148 -528 ) ( 1184 3004 -528 ) ( 1184 3012 -528 ) subway/metal2 -712 1184 0 0.500000 0.500000 0 16777216 0 +( 1472 3156 -536 ) ( 1184 3012 -536 ) ( 1184 3004 -536 ) subway/metal2 -712 1184 0 0.500000 0.500000 0 16777216 0 +( 1472 3188 -254 ) ( 1472 3188 -264 ) ( 1472 3124 -264 ) subway/1_tunneltrack_1 792 -15 195 1 1 0 16777216 0 +} +// brush 2271 +{ +( 1312 3008 10 ) ( 1312 3008 0 ) ( 1264 3056 0 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1472 3152 -536 ) ( 1248 3040 -536 ) ( 1248 3040 -552 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1248 3008 -552 ) ( 1248 3040 -552 ) ( 1248 3040 -536 ) subway/1_tunneltrack_plain -1552 0 0 0.500000 0.500000 0 301989888 0 +( 1472 3120 -552 ) ( 1248 3008 -552 ) ( 1248 3008 -536 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1472 3120 -536 ) ( 1472 3152 -536 ) ( 1472 3152 -552 ) subway/1_tunneltrack_plain -1552 0 0 0.500000 0.500000 0 301989888 0 +( 1472 3120 -536 ) ( 1248 3008 -536 ) ( 1248 3040 -536 ) subway/1_tunnelfloor_2 -168 364 26 1 1 0 285212672 0 +( 1472 3152 -552 ) ( 1248 3040 -552 ) ( 1248 3008 -552 ) subway/1_tunneltrack_plain -784 1184 0 0.500000 0.500000 0 301989888 0 +} +// brush 2272 +{ +( 1304 3016 10 ) ( 1304 3016 0 ) ( 1280 3040 0 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1472 3256 -544 ) ( 1168 3104 -544 ) ( 1168 3080 -544 ) subway/1_tunnelfloor_2 160 -1200 0 1 -1 0 285212672 0 +( 1472 3232 -536 ) ( 1168 3080 -536 ) ( 1168 3104 -536 ) subway/1_tunnelfloor_2 -168 -294 26 1 -1 0 285212672 0 +( 1472 3232 -544 ) ( 1168 3080 -544 ) ( 1168 3080 -536 ) subway/1_tunnelfloor_2 -455 56 0 1 -1 0 285212672 0 +( 1168 3080 -544 ) ( 1168 3104 -544 ) ( 1168 3104 -536 ) subway/1_tunnelfloor_2 -632 56 0 1 -1 0 285212672 0 +( 1472 3256 -536 ) ( 1168 3104 -536 ) ( 1168 3104 -544 ) subway/1_tunnelfloor_2 -455 56 0 1 -1 0 285212672 0 +( 1472 3232 -536 ) ( 1472 3256 -536 ) ( 1472 3256 -544 ) subway/1_tunnelfloor_2 -551 56 0 1 -1 0 285212672 0 +} +// brush 2273 +{ +( 1472 3272 -536 ) ( 1120 3096 -536 ) ( 1120 3080 -536 ) subway/con6 0 736 0 0.500000 0.500000 0 285212672 0 +( 1472 3256 -520 ) ( 1120 3080 -520 ) ( 1120 3096 -520 ) subway/con6 0 736 0 0.500000 0.500000 0 285212672 0 +( 1472 3272 -520 ) ( 1120 3096 -520 ) ( 1120 3096 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1472 3256 -536 ) ( 1120 3080 -536 ) ( 1120 3080 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1472 3304 -264 ) ( 1472 3248 -264 ) ( 1472 3248 -254 ) subway/1_tunneltrack_1 449 -108 195 1 1 0 16777216 0 +( 1120 3048 -496 ) ( 1120 3104 -512 ) ( 1120 3104 -496 ) subway/1_tunnelwall_floor -384 -48 0 1 0.500000 0 285212672 0 +( 1512 2632 10 ) ( 1512 2632 0 ) ( 1000 3144 0 ) subway/1_tunneltrack_plain -2456 -8 0 0.500000 0.500000 0 301989888 0 +( 1320 3000 10 ) ( 1320 3000 0 ) ( 1264 3056 0 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +} +// brush 2274 +{ +( 1472 3272 -520 ) ( 1120 3096 -520 ) ( 1120 3080 -520 ) subway/1_tunnelwall 0 376 0 1 1 0 301989888 0 +( 1472 3256 -496 ) ( 1120 3080 -496 ) ( 1120 3096 -496 ) subway/1_tunnelwall 0 376 0 1 1 0 301989888 0 +( 1472 3272 -504 ) ( 1120 3096 -504 ) ( 1120 3096 -520 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1472 3256 -520 ) ( 1120 3080 -520 ) ( 1120 3080 -504 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1472 3304 -248 ) ( 1472 3248 -248 ) ( 1472 3248 -238 ) subway/1_tunnelwall -384 -8 0 1 1 0 301989888 0 +( 1120 3048 -480 ) ( 1120 3104 -496 ) ( 1120 3104 -480 ) subway/1_tunnelwall -384 -8 0 1 1 0 301989888 0 +( 1512 2632 26 ) ( 1512 2632 16 ) ( 1000 3144 16 ) subway/1_tunnelwall -384 -8 0 1 1 0 301989888 0 +( 1320 3000 26 ) ( 1320 3000 16 ) ( 1264 3056 16 ) subway/1_tunnelwall -384 -8 0 1 1 0 301989888 0 +} +// brush 2275 +{ +( 1320 3000 106 ) ( 1320 3000 96 ) ( 1264 3056 96 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1512 2632 106 ) ( 1512 2632 96 ) ( 1000 3144 96 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1120 3048 -384 ) ( 1120 3104 -400 ) ( 1120 3104 -384 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1472 3304 -168 ) ( 1472 3248 -168 ) ( 1472 3248 -158 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1472 3256 -448 ) ( 1120 3080 -448 ) ( 1120 3080 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1472 3272 -408 ) ( 1120 3096 -408 ) ( 1120 3096 -424 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1472 3256 -352 ) ( 1120 3080 -352 ) ( 1120 3096 -352 ) subway/1_tunnelwall 0 384 0 1 1 0 301989888 0 +( 1472 3272 -448 ) ( 1120 3096 -448 ) ( 1120 3080 -448 ) subway/1_tunnelwall 0 384 0 1 1 0 301989888 0 +} +// brush 2276 +{ +( 1472 3120 -536 ) ( 1120 2944 -536 ) ( 1120 2928 -536 ) subway/con6 0 736 0 0.500000 0.500000 0 285212672 0 +( 1472 3104 -520 ) ( 1120 2928 -520 ) ( 1120 2944 -520 ) subway/con6 0 736 0 0.500000 0.500000 0 285212672 0 +( 1472 3120 -520 ) ( 1120 2944 -520 ) ( 1120 2944 -536 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1472 3104 -536 ) ( 1120 2928 -536 ) ( 1120 2928 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1472 3152 -264 ) ( 1472 3096 -264 ) ( 1472 3096 -254 ) subway/1_tunneltrack_1 449 -108 195 1 1 0 16777216 0 +( 1120 2896 -496 ) ( 1120 2952 -512 ) ( 1120 2952 -496 ) subway/1_tunnelwall_floor -384 -48 0 1 0.500000 0 285212672 0 +( 1728 2592 10 ) ( 1728 2592 0 ) ( 1216 3104 0 ) subway/1_tunneltrack_plain -2456 -8 0 0.500000 0.500000 0 301989888 0 +} +// brush 2277 +{ +( 1472 3120 -520 ) ( 1120 2944 -520 ) ( 1120 2928 -520 ) subway/1_tunnelwall 0 376 0 1 1 0 301989888 0 +( 1472 3104 -496 ) ( 1120 2928 -496 ) ( 1120 2944 -496 ) subway/1_tunnelwall 0 376 0 1 1 0 301989888 0 +( 1472 3120 -504 ) ( 1120 2944 -504 ) ( 1120 2944 -520 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1472 3104 -520 ) ( 1120 2928 -520 ) ( 1120 2928 -504 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1472 3152 -248 ) ( 1472 3096 -248 ) ( 1472 3096 -238 ) subway/1_tunnelwall -384 -8 0 1 1 0 301989888 0 +( 1120 2896 -480 ) ( 1120 2952 -496 ) ( 1120 2952 -480 ) subway/1_tunnelwall -384 -8 0 1 1 0 301989888 0 +( 1728 2592 34 ) ( 1728 2592 24 ) ( 1216 3104 24 ) subway/1_tunnelwall -384 -8 0 1 1 0 301989888 0 +} +// brush 2278 +{ +( 1472 3120 -480 ) ( 1120 2944 -480 ) ( 1120 2928 -480 ) subway/1_tunnelwall_pipe 0 832 0 0.500000 0.500000 0 16777216 0 +( 1472 3104 -448 ) ( 1120 2928 -448 ) ( 1120 2944 -448 ) subway/1_tunnelwall_pipe 0 832 0 0.500000 0.500000 0 16777216 0 +( 1472 3120 -464 ) ( 1120 2944 -464 ) ( 1120 2944 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1472 3104 -472 ) ( 1120 2928 -472 ) ( 1120 2928 -456 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1472 3152 -208 ) ( 1472 3096 -208 ) ( 1472 3096 -198 ) subway/1_tunnelwall_pipe -768 64 0 0.500000 0.500000 0 16777216 0 +( 1120 2896 -440 ) ( 1120 2952 -456 ) ( 1120 2952 -440 ) subway/1_tunnelwall_pipe -768 64 0 0.500000 0.500000 0 16777216 0 +( 1728 2592 74 ) ( 1728 2592 64 ) ( 1216 3104 64 ) subway/1_tunnelwall_pipe -768 64 0 0.500000 0.500000 0 16777216 0 +} +// brush 2279 +{ +( 1728 2592 106 ) ( 1728 2592 96 ) ( 1216 3104 96 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1120 2896 -408 ) ( 1120 2952 -424 ) ( 1120 2952 -408 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1472 3152 -176 ) ( 1472 3096 -176 ) ( 1472 3096 -166 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1472 3104 -440 ) ( 1120 2928 -440 ) ( 1120 2928 -424 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1472 3120 -432 ) ( 1120 2944 -432 ) ( 1120 2944 -448 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1472 3104 -352 ) ( 1120 2928 -352 ) ( 1120 2944 -352 ) subway/1_tunnelwall 0 384 0 1 1 0 301989888 0 +( 1472 3120 -448 ) ( 1120 2944 -448 ) ( 1120 2928 -448 ) subway/1_tunnelwall 0 384 0 1 1 0 301989888 0 +} +// brush 2280 +{ +( 1288 3032 10 ) ( 1288 3032 0 ) ( 1264 3056 0 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1472 3152 -344 ) ( 1472 3120 -352 ) ( 1472 3120 -344 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1472 3120 -352 ) ( 1200 2984 -352 ) ( 1200 2984 -336 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1200 3036 -336 ) ( 1200 3004 -344 ) ( 1200 3004 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1472 3156 -336 ) ( 1200 3020 -336 ) ( 1200 3020 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1472 3120 -336 ) ( 1200 2984 -336 ) ( 1200 3020 -336 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1472 3156 -352 ) ( 1200 3020 -352 ) ( 1200 2984 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +} +// brush 2281 +{ +( 1216 3104 10 ) ( 1216 3104 0 ) ( 1188 3132 0 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1472 3248 -344 ) ( 1472 3216 -352 ) ( 1472 3216 -344 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1472 3220 -352 ) ( 1168 3068 -352 ) ( 1168 3068 -336 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1168 3120 -336 ) ( 1168 3088 -344 ) ( 1168 3088 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1472 3256 -336 ) ( 1168 3104 -336 ) ( 1168 3104 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1472 3220 -336 ) ( 1168 3068 -336 ) ( 1168 3104 -336 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1472 3256 -352 ) ( 1168 3104 -352 ) ( 1168 3068 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +} +// brush 2282 +{ +( 1264 3056 0 ) ( 1320 3000 0 ) ( 1320 3000 10 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1176 3320 0 ) ( 1688 2808 0 ) ( 1688 2808 10 ) subway/1_tunneltrack_plain -2456 -8 0 0.500000 0.500000 0 301989888 0 +( 1216 3200 -496 ) ( 1216 3200 -512 ) ( 1272 3200 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1072 2848 -254 ) ( 1072 2848 -264 ) ( 1016 2848 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1240 3200 -520 ) ( 1240 3200 -536 ) ( 1064 2848 -536 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1224 3200 -536 ) ( 1224 3200 -520 ) ( 1048 2848 -520 ) subway/1_tunnelwall_floor -384 -48 0 1 0.500000 0 285212672 0 +( 1224 3200 -520 ) ( 1240 3200 -520 ) ( 1064 2848 -520 ) subway/con6 0 736 0 0.500000 0.500000 0 285212672 0 +( 1240 3200 -536 ) ( 1224 3200 -536 ) ( 1048 2848 -536 ) subway/con6 0 736 0 0.500000 0.500000 0 285212672 0 +} +// brush 2283 +{ +( 1264 3056 16 ) ( 1320 3000 16 ) ( 1320 3000 26 ) subway/1_tunnelwall -384 -8 0 1 1 0 301989888 0 +( 1176 3320 16 ) ( 1688 2808 16 ) ( 1688 2808 26 ) subway/1_tunnelwall -384 -8 0 1 1 0 301989888 0 +( 1216 3200 -480 ) ( 1216 3200 -496 ) ( 1272 3200 -480 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1072 2848 -238 ) ( 1072 2848 -248 ) ( 1016 2848 -248 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1240 3200 -504 ) ( 1240 3200 -520 ) ( 1064 2848 -520 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1224 3200 -520 ) ( 1224 3200 -504 ) ( 1048 2848 -504 ) subway/1_tunnelwall -384 -8 0 1 1 0 301989888 0 +( 1224 3200 -496 ) ( 1240 3200 -496 ) ( 1064 2848 -496 ) subway/1_tunnelwall 0 376 0 1 1 0 301989888 0 +( 1240 3200 -520 ) ( 1224 3200 -520 ) ( 1048 2848 -520 ) subway/1_tunnelwall 0 376 0 1 1 0 301989888 0 +} +// brush 2284 +{ +( 1224 3168 -496 ) ( 1224 3168 -480 ) ( 1216 3168 -480 ) subway/1_tunnelwall 16 0 0 0.500000 0.500000 0 301989888 0 +( 1216 3176 -496 ) ( 1216 3176 -480 ) ( 1056 2856 -480 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 2848 -480 ) ( 1064 2848 -496 ) ( 1056 2848 -496 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1224 3168 -480 ) ( 1224 3168 -496 ) ( 1064 2848 -496 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 1216 3168 -480 ) ( 1224 3168 -480 ) ( 1064 2848 -480 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 1224 3168 -496 ) ( 1216 3168 -496 ) ( 1056 2848 -496 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 1264 3056 0 ) ( 1304 3016 0 ) ( 1304 3016 10 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +} +// brush 2285 +{ +( 1264 3056 56 ) ( 1320 3000 56 ) ( 1320 3000 66 ) subway/1_tunnelwall_pipe -768 64 0 0.500000 0.500000 0 16777216 0 +( 1176 3320 56 ) ( 1688 2808 56 ) ( 1688 2808 66 ) subway/1_tunnelwall_pipe -768 64 0 0.500000 0.500000 0 16777216 0 +( 1216 3200 -440 ) ( 1216 3200 -456 ) ( 1272 3200 -440 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1072 2848 -198 ) ( 1072 2848 -208 ) ( 1016 2848 -208 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1240 3200 -464 ) ( 1240 3200 -480 ) ( 1064 2848 -480 ) subway/1_tunnelwall_pipe -768 64 0 0.500000 0.500000 0 16777216 0 +( 1224 3200 -480 ) ( 1224 3200 -464 ) ( 1048 2848 -464 ) subway/1_tunnelwall_pipe -768 64 0 0.500000 0.500000 0 16777216 0 +( 1232 3200 -448 ) ( 1248 3200 -448 ) ( 1072 2848 -448 ) subway/1_tunnelwall_pipe 0 832 0 0.500000 0.500000 0 16777216 0 +( 1240 3200 -480 ) ( 1224 3200 -480 ) ( 1048 2848 -480 ) subway/1_tunnelwall_pipe 0 832 0 0.500000 0.500000 0 16777216 0 +} +// brush 2286 +{ +( 1240 3200 -448 ) ( 1224 3200 -448 ) ( 1048 2848 -448 ) subway/1_tunnelwall 0 384 0 1 1 0 301989888 0 +( 1224 3200 -352 ) ( 1240 3200 -352 ) ( 1064 2848 -352 ) subway/1_tunnelwall 0 384 0 1 1 0 301989888 0 +( 1224 3200 -448 ) ( 1224 3200 -432 ) ( 1048 2848 -432 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1240 3200 -376 ) ( 1240 3200 -392 ) ( 1064 2848 -392 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1072 2848 -158 ) ( 1072 2848 -168 ) ( 1016 2848 -168 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1216 3200 -400 ) ( 1216 3200 -416 ) ( 1272 3200 -400 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1176 3320 96 ) ( 1688 2808 96 ) ( 1688 2808 106 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1264 3056 96 ) ( 1320 3000 96 ) ( 1320 3000 106 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +} +// brush 2287 +{ +( 1064 2848 -544 ) ( 1064 2848 -536 ) ( 1088 2848 -536 ) subway/1_tunnelfloor_2 -167 56 0 1 -1 0 285212672 0 +( 1216 3152 -544 ) ( 1216 3152 -536 ) ( 1064 2848 -536 ) subway/1_tunnelfloor_2 -839 56 0 1 -1 0 285212672 0 +( 1216 3152 -536 ) ( 1216 3152 -544 ) ( 1240 3152 -544 ) subway/1_tunnelfloor_2 -248 56 0 1 -1 0 285212672 0 +( 1240 3152 -536 ) ( 1240 3152 -544 ) ( 1088 2848 -544 ) subway/1_tunnelfloor_2 -839 56 0 1 -1 0 285212672 0 +( 1216 3152 -536 ) ( 1240 3152 -536 ) ( 1088 2848 -536 ) subway/1_tunnelfloor_2 -345 -100 64 1 -1 0 285212672 0 +( 1240 3152 -544 ) ( 1216 3152 -544 ) ( 1064 2848 -544 ) subway/1_tunnelfloor_2 160 -1200 0 1 -1 0 285212672 0 +( 1280 3040 0 ) ( 1304 3016 0 ) ( 1304 3016 10 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +} +// brush 2288 +{ +( 1120 2848 -264 ) ( 1056 2848 -264 ) ( 1056 2848 -254 ) subway/1_tunneltrack_1 422 -115 195 1 1 0 16777216 0 +( 1240 3136 -536 ) ( 1232 3136 -536 ) ( 1088 2848 -536 ) subway/metal2 -712 1184 0 0.500000 0.500000 0 16777216 0 +( 1232 3136 -528 ) ( 1240 3136 -528 ) ( 1096 2848 -528 ) subway/metal2 -712 1184 0 0.500000 0.500000 0 16777216 0 +( 1232 3136 -536 ) ( 1232 3136 -528 ) ( 1088 2848 -528 ) subway/metal2 -1184 0 0 0.500000 0.500000 0 16777216 0 +( 1416 3136 -536 ) ( 1416 3136 -504 ) ( 1368 3136 -504 ) subway/metal2 -712 0 0 0.500000 0.500000 0 16777216 0 +( 1240 3136 -528 ) ( 1240 3136 -536 ) ( 1096 2848 -536 ) subway/metal2 -1184 0 0 0.500000 0.500000 0 16777216 0 +( 1280 2088 -504 ) ( 1280 2088 -536 ) ( 1232 2088 -536 ) subway/metal2 -712 0 0 0.500000 0.500000 0 16777216 0 +( 1200 3120 0 ) ( 1232 3088 0 ) ( 1232 3088 10 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +} +// brush 2289 +{ +( 1240 3136 -544 ) ( 1240 3136 -536 ) ( 1096 2848 -536 ) subway/1_tunneltrack_1 -444 0 0 1 1 0 16777216 0 +( 1520 3136 -480 ) ( 1400 3136 -480 ) ( 1400 3136 -488 ) subway/1_tunneltrack_1 -228 0 0 1 1 0 16777216 0 +( 1312 3136 -536 ) ( 1312 3136 -544 ) ( 1168 2848 -544 ) subway/1_tunneltrack_1 -444 0 0 1 1 0 16777216 0 +( 1140 2848 -568 ) ( 1260 2848 -568 ) ( 1260 2848 -576 ) subway/1_tunneltrack_1 -228 0 0 1 1 0 16777216 0 +( 1240 3136 -536 ) ( 1312 3136 -536 ) ( 1168 2848 -536 ) subway/1_tunneltrack_1 289 289 -26 0.900000 1 0 16777216 0 +( 1312 3136 -544 ) ( 1240 3136 -544 ) ( 1096 2848 -544 ) subway/1_tunneltrack_1 -228 592 0 1 1 0 16777216 0 +( 1264 3056 0 ) ( 1288 3032 0 ) ( 1288 3032 10 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +} +// brush 2290 +{ +( 1196 2848 -264 ) ( 1132 2848 -264 ) ( 1132 2848 -254 ) subway/1_tunneltrack_1 422 -115 195 1 1 0 16777216 0 +( 1316 3136 -536 ) ( 1308 3136 -536 ) ( 1164 2848 -536 ) subway/metal2 -712 1184 0 0.500000 0.500000 0 16777216 0 +( 1308 3136 -528 ) ( 1316 3136 -528 ) ( 1172 2848 -528 ) subway/metal2 -712 1184 0 0.500000 0.500000 0 16777216 0 +( 1308 3136 -536 ) ( 1308 3136 -528 ) ( 1164 2848 -528 ) subway/metal2 -1184 0 0 0.500000 0.500000 0 16777216 0 +( 1492 3136 -536 ) ( 1492 3136 -504 ) ( 1444 3136 -504 ) subway/metal2 -712 0 0 0.500000 0.500000 0 16777216 0 +( 1316 3136 -528 ) ( 1316 3136 -536 ) ( 1172 2848 -536 ) subway/metal2 -1184 0 0 0.500000 0.500000 0 16777216 0 +( 1356 2088 -504 ) ( 1356 2088 -536 ) ( 1308 2088 -536 ) subway/metal2 -712 0 0 0.500000 0.500000 0 16777216 0 +( 1276 3120 0 ) ( 1308 3088 0 ) ( 1308 3088 10 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1256 3064 0 ) ( 1280 3040 0 ) ( 1280 3040 10 ) subway/1_trim1 -768 0 0 0.500000 0.500000 0 0 0 +} +// brush 2291 +{ +( 1312 3072 -552 ) ( 1280 3072 -552 ) ( 1168 2848 -552 ) subway/1_tunneltrack_plain -784 1184 0 0.500000 0.500000 0 301989888 0 +( 1280 3072 -536 ) ( 1312 3072 -536 ) ( 1200 2848 -536 ) subway/1_tunnelfloor_2 -345 200 64 1 1 0 285212672 0 +( 1168 2848 -552 ) ( 1168 2848 -536 ) ( 1200 2848 -536 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1312 3072 -536 ) ( 1312 3072 -552 ) ( 1200 2848 -552 ) subway/1_tunneltrack_plain -1184 0 0 0.500000 0.500000 0 301989888 0 +( 1280 3072 -536 ) ( 1280 3072 -552 ) ( 1312 3072 -552 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1280 3072 -552 ) ( 1280 3072 -536 ) ( 1168 2848 -536 ) subway/1_tunneltrack_plain -1184 0 0 0.500000 0.500000 0 301989888 0 +( 1264 3056 0 ) ( 1312 3008 0 ) ( 1312 3008 10 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +} +// brush 2292 +{ +( 1392 3200 -536 ) ( 1376 3200 -536 ) ( 1200 2848 -536 ) subway/con6 0 736 0 0.500000 0.500000 0 285212672 0 +( 1376 3200 -520 ) ( 1392 3200 -520 ) ( 1216 2848 -520 ) subway/con6 0 736 0 0.500000 0.500000 0 285212672 0 +( 1376 3200 -536 ) ( 1376 3200 -520 ) ( 1200 2848 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1392 3200 -520 ) ( 1392 3200 -536 ) ( 1216 2848 -536 ) subway/con6 -768 -32 0 0.500000 0.500000 0 285212672 0 +( 1224 2848 -254 ) ( 1224 2848 -264 ) ( 1168 2848 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1368 3200 -496 ) ( 1368 3200 -512 ) ( 1424 3200 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1216 3104 0 ) ( 1728 2592 0 ) ( 1728 2592 10 ) subway/1_tunneltrack_plain -2456 -8 0 0.500000 0.500000 0 301989888 0 +} +// brush 2293 +{ +( 1216 3104 24 ) ( 1728 2592 24 ) ( 1728 2592 34 ) subway/1_tunnelwall -384 -8 0 1 1 0 301989888 0 +( 1368 3200 -480 ) ( 1368 3200 -496 ) ( 1424 3200 -480 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1224 2848 -238 ) ( 1224 2848 -248 ) ( 1168 2848 -248 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1392 3200 -496 ) ( 1392 3200 -512 ) ( 1216 2848 -512 ) subway/1_tunnelwall -384 -8 0 1 1 0 301989888 0 +( 1376 3200 -520 ) ( 1376 3200 -504 ) ( 1200 2848 -504 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1376 3200 -496 ) ( 1392 3200 -496 ) ( 1216 2848 -496 ) subway/1_tunnelwall 0 376 0 1 1 0 301989888 0 +( 1392 3200 -520 ) ( 1376 3200 -520 ) ( 1200 2848 -520 ) subway/1_tunnelwall 0 376 0 1 1 0 301989888 0 +} +// brush 2294 +{ +( 1216 3104 64 ) ( 1728 2592 64 ) ( 1728 2592 74 ) subway/1_tunnelwall_pipe -768 64 0 0.500000 0.500000 0 16777216 0 +( 1368 3200 -440 ) ( 1368 3200 -456 ) ( 1424 3200 -440 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1224 2848 -198 ) ( 1224 2848 -208 ) ( 1168 2848 -208 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1392 3200 -456 ) ( 1392 3200 -472 ) ( 1216 2848 -472 ) subway/1_tunnelwall_pipe -768 64 0 0.500000 0.500000 0 16777216 0 +( 1376 3200 -480 ) ( 1376 3200 -464 ) ( 1200 2848 -464 ) subway/1_tunnelwall_pipe -768 64 0 0.500000 0.500000 0 16777216 0 +( 1376 3200 -448 ) ( 1392 3200 -448 ) ( 1216 2848 -448 ) subway/1_tunnelwall_pipe 0 832 0 0.500000 0.500000 0 16777216 0 +( 1392 3200 -480 ) ( 1376 3200 -480 ) ( 1200 2848 -480 ) subway/1_tunnelwall_pipe 0 832 0 0.500000 0.500000 0 16777216 0 +} +// brush 2295 +{ +( 1392 3200 -448 ) ( 1376 3200 -448 ) ( 1200 2848 -448 ) subway/1_tunnelwall 0 384 0 1 1 0 301989888 0 +( 1376 3200 -352 ) ( 1392 3200 -352 ) ( 1216 2848 -352 ) subway/1_tunnelwall 0 384 0 1 1 0 301989888 0 +( 1376 3200 -448 ) ( 1376 3200 -432 ) ( 1200 2848 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1392 3200 -424 ) ( 1392 3200 -440 ) ( 1216 2848 -440 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +( 1224 2848 -166 ) ( 1224 2848 -176 ) ( 1168 2848 -176 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1368 3200 -408 ) ( 1368 3200 -424 ) ( 1424 3200 -408 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1216 3104 96 ) ( 1728 2592 96 ) ( 1728 2592 106 ) subway/1_tunnelwall -384 0 0 1 1 0 301989888 0 +} +// brush 2296 +{ +( 1336 3120 -352 ) ( 1300 3120 -352 ) ( 1164 2848 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1300 3120 -336 ) ( 1336 3120 -336 ) ( 1200 2848 -336 ) subway/1_tunnelwall 0 768 0 0.500000 0.500000 0 301989888 0 +( 1300 3120 -352 ) ( 1300 3120 -336 ) ( 1164 2848 -336 ) subway/1_tunnelwall -768 0 0 0.500000 0.500000 0 301989888 0 +( 1316 3120 -352 ) ( 1316 3120 -344 ) ( 1284 3120 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1336 3120 -336 ) ( 1336 3120 -352 ) ( 1200 2848 -352 ) subway/1_tunnelwall -768 0 0 0.500000 0.500000 0 301989888 0 +( 1200 2848 -344 ) ( 1200 2848 -352 ) ( 1168 2848 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1264 3056 0 ) ( 1288 3032 0 ) ( 1288 3032 10 ) subway/1_trim1 -768 0 0 0.500000 0.500000 0 0 0 +} +// brush 2297 +{ +( 1164 2848 -264 ) ( 1084 2848 -264 ) ( 1084 2848 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1324 3184 -352 ) ( 1276 3184 -352 ) ( 1108 2848 -352 ) subway/1_tunnel_ceiling2 323 334 -27 0.900000 1 0 16777216 0 +( 1276 3184 -336 ) ( 1324 3184 -336 ) ( 1156 2848 -336 ) subway/1_tunnel_ceiling2 0 768 0 0.500000 0.500000 0 16777216 0 +( 1268 3184 -344 ) ( 1268 3184 -336 ) ( 1100 2848 -336 ) subway/1_tunnel_ceiling2 -768 0 0 0.500000 0.500000 0 16777216 0 +( 1492 3184 -344 ) ( 1492 3184 -312 ) ( 1444 3184 -312 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1332 3184 -336 ) ( 1332 3184 -344 ) ( 1164 2848 -344 ) subway/1_tunnel_ceiling2 -768 0 0 0.500000 0.500000 0 16777216 0 +( 1292 2160 -312 ) ( 1292 2160 -344 ) ( 1244 2160 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1192 3128 0 ) ( 1256 3064 0 ) ( 1256 3064 10 ) subway/1_trim1 -768 0 0 0.500000 0.500000 0 0 0 +} +// brush 2298 +{ +( 1252 3152 -352 ) ( 1216 3152 -352 ) ( 1064 2848 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1216 3152 -336 ) ( 1252 3152 -336 ) ( 1100 2848 -336 ) subway/1_tunnelwall 0 768 0 0.500000 0.500000 0 301989888 0 +( 1216 3152 -352 ) ( 1216 3152 -336 ) ( 1064 2848 -336 ) subway/1_tunnelwall -768 0 0 0.500000 0.500000 0 301989888 0 +( 1232 3152 -352 ) ( 1232 3152 -344 ) ( 1200 3152 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1252 3152 -336 ) ( 1252 3152 -352 ) ( 1100 2848 -352 ) subway/1_tunnelwall -768 0 0 0.500000 0.500000 0 301989888 0 +( 1104 2848 -344 ) ( 1104 2848 -352 ) ( 1072 2848 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1188 3132 0 ) ( 1216 3104 0 ) ( 1216 3104 10 ) subway/1_trim1 -768 0 0 0.500000 0.500000 0 0 0 +} +// brush 2299 +{ +( 1196 2444 -372 ) ( 1196 2420 -372 ) ( 1196 2420 -420 ) subway/light_red -8 -8 0 0.500000 0.500000 134217728 16777217 12000 +( 1200 2436 -372 ) ( 1184 2436 -372 ) ( 1184 2436 -420 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1200 2420 -372 ) ( 1200 2444 -372 ) ( 1200 2444 -420 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1184 2420 -372 ) ( 1200 2420 -372 ) ( 1200 2420 -420 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1184 2420 -404 ) ( 1184 2444 -404 ) ( 1200 2444 -404 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1200 2444 -420 ) ( 1184 2444 -420 ) ( 1184 2420 -420 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2300 +{ +( 1072 1992 -352 ) ( 1072 1008 -352 ) ( 1104 1008 -352 ) subway/1_tunnel_ceiling2 156 0 0 1 1 0 16777216 0 +( 1104 1792 -336 ) ( 1104 1120 -336 ) ( 1072 1120 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 1008 -352 ) ( 1064 1992 -352 ) ( 1064 1992 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1080 2464 -352 ) ( 1080 2464 -344 ) ( 1048 2464 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1100 2104 -336 ) ( 1100 2776 -336 ) ( 1100 2776 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1104 2176 -344 ) ( 1104 2176 -352 ) ( 1072 2176 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 2301 +{ +( 1164 2176 -264 ) ( 1084 2176 -264 ) ( 1084 2176 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1284 1912 -352 ) ( 1284 1920 -352 ) ( 1236 1920 -352 ) subway/1_tunnel_ceiling2 156 0 0 1 1 0 16777216 0 +( 1180 1768 -336 ) ( 1180 2032 -336 ) ( 1212 2032 -336 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1100 1840 -312 ) ( 1100 1576 -312 ) ( 1100 1576 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1324 2464 -344 ) ( 1324 2464 -312 ) ( 1276 2464 -312 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1164 1800 -536 ) ( 1164 1800 -576 ) ( 1164 1792 -576 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1292 1488 -312 ) ( 1292 1488 -344 ) ( 1244 1488 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2302 +{ +( 1168 1992 -352 ) ( 1168 1008 -352 ) ( 1200 1008 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1192 1792 -336 ) ( 1192 1120 -336 ) ( 1160 1120 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1164 3016 -352 ) ( 1164 4000 -352 ) ( 1164 4000 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1180 2464 -352 ) ( 1180 2464 -344 ) ( 1148 2464 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1120 -336 ) ( 1200 1792 -336 ) ( 1200 1792 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 2176 -344 ) ( 1200 2176 -352 ) ( 1168 2176 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 2303 +{ +( 1064 2464 -448 ) ( 1056 2464 -336 ) ( 1064 2464 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 2020 -352 ) ( 1072 2020 -352 ) ( 1072 1972 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1368 2620 -448 ) ( 1248 2620 -448 ) ( 1248 2596 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 2400 -432 ) ( 1064 2424 -432 ) ( 1064 2424 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1388 2848 -376 ) ( 1268 2848 -376 ) ( 1268 2848 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1048 3108 -344 ) ( 1048 3084 -344 ) ( 1048 3084 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 2304 +{ +( 1360 2220 -480 ) ( 1240 2220 -480 ) ( 1240 2196 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1248 2180 -448 ) ( 1248 2204 -448 ) ( 1368 2204 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1200 1804 -512 ) ( 1320 1804 -512 ) ( 1320 1804 -520 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1064 2056 -480 ) ( 1064 2080 -480 ) ( 1064 2080 -488 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1384 2848 -424 ) ( 1264 2848 -424 ) ( 1264 2848 -432 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1048 2748 -392 ) ( 1048 2724 -392 ) ( 1048 2724 -400 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1064 2464 -264 ) ( 1032 2464 -264 ) ( 1032 2464 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 2305 +{ +( 1064 2848 -496 ) ( 1064 2848 -480 ) ( 1056 2848 -480 ) subway/1_tunnelwall 16 0 0 0.500000 0.500000 0 301989888 0 +( 1048 2848 -480 ) ( 1048 2512 -480 ) ( 1048 2512 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 2464 -480 ) ( 1064 2464 -496 ) ( 1056 2464 -496 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1064 2464 -496 ) ( 1064 2464 -480 ) ( 1064 2752 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1040 2404 -480 ) ( 1040 2580 -480 ) ( 1064 2580 -480 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 1064 2580 -496 ) ( 1040 2580 -496 ) ( 1040 2404 -496 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2306 +{ +( 1360 2220 -520 ) ( 1240 2220 -520 ) ( 1240 2196 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1248 2180 -496 ) ( 1248 2204 -496 ) ( 1368 2204 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1208 2260 -552 ) ( 1328 2260 -552 ) ( 1328 2260 -560 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 2032 -504 ) ( 1064 2056 -504 ) ( 1064 2056 -512 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1384 2848 -464 ) ( 1264 2848 -464 ) ( 1264 2848 -472 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1048 2092 -432 ) ( 1048 2068 -432 ) ( 1048 2068 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1104 2464 -264 ) ( 1056 2464 -264 ) ( 1056 2464 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 2307 +{ +( 1360 2220 -536 ) ( 1240 2220 -536 ) ( 1240 2196 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1248 2180 -520 ) ( 1248 2204 -520 ) ( 1368 2204 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1064 2008 -520 ) ( 1064 2032 -520 ) ( 1064 2032 -528 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1048 2140 -448 ) ( 1048 2116 -448 ) ( 1048 2116 -456 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1096 2464 -264 ) ( 1040 2464 -264 ) ( 1040 2464 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1016 2848 -496 ) ( 1072 2848 -512 ) ( 1072 2848 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +} +// brush 2308 +{ +( 1360 1932 -480 ) ( 1240 1932 -480 ) ( 1240 1908 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1248 1892 -448 ) ( 1248 1916 -448 ) ( 1368 1916 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1200 1516 -512 ) ( 1320 1516 -512 ) ( 1320 1516 -520 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1064 1672 -480 ) ( 1064 1696 -480 ) ( 1064 1696 -488 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1384 2464 -424 ) ( 1264 2464 -424 ) ( 1264 2464 -432 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1048 2460 -392 ) ( 1048 2436 -392 ) ( 1048 2436 -400 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1064 2176 -264 ) ( 1032 2176 -264 ) ( 1032 2176 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 2309 +{ +( 1064 2176 -448 ) ( 1056 2176 -336 ) ( 1064 2176 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1732 -352 ) ( 1072 1732 -352 ) ( 1072 1684 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1368 2332 -448 ) ( 1248 2332 -448 ) ( 1248 2308 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 2016 -432 ) ( 1064 2040 -432 ) ( 1064 2040 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1388 2464 -376 ) ( 1268 2464 -376 ) ( 1268 2464 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1048 2820 -344 ) ( 1048 2796 -344 ) ( 1048 2796 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 2310 +{ +( 1064 2464 -496 ) ( 1064 2464 -480 ) ( 1056 2464 -480 ) subway/1_tunnelwall 16 0 0 0.500000 0.500000 0 301989888 0 +( 1048 2464 -480 ) ( 1048 2128 -480 ) ( 1048 2128 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 2176 -480 ) ( 1064 2176 -496 ) ( 1056 2176 -496 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1064 2176 -496 ) ( 1064 2176 -480 ) ( 1064 2464 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1040 2116 -480 ) ( 1040 2292 -480 ) ( 1064 2292 -480 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 1064 2292 -496 ) ( 1040 2292 -496 ) ( 1040 2116 -496 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2311 +{ +( 1360 1932 -520 ) ( 1240 1932 -520 ) ( 1240 1908 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1248 1892 -496 ) ( 1248 1916 -496 ) ( 1368 1916 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1208 1972 -552 ) ( 1328 1972 -552 ) ( 1328 1972 -560 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 1648 -504 ) ( 1064 1672 -504 ) ( 1064 1672 -512 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1384 2464 -464 ) ( 1264 2464 -464 ) ( 1264 2464 -472 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1048 1804 -432 ) ( 1048 1780 -432 ) ( 1048 1780 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1104 2176 -264 ) ( 1056 2176 -264 ) ( 1056 2176 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 2312 +{ +( 1360 1932 -536 ) ( 1240 1932 -536 ) ( 1240 1908 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1248 1892 -520 ) ( 1248 1916 -520 ) ( 1368 1916 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1064 1624 -520 ) ( 1064 1648 -520 ) ( 1064 1648 -528 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1048 1852 -448 ) ( 1048 1828 -448 ) ( 1048 1828 -456 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1096 2176 -264 ) ( 1040 2176 -264 ) ( 1040 2176 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1016 2464 -496 ) ( 1072 2464 -512 ) ( 1072 2464 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +} +// brush 2313 +{ +( 1096 1400 -512 ) ( 1096 1376 -512 ) ( 1096 1376 -520 ) subway/1_tunneltrack_2 36 0 0 1 1 0 16777216 0 +( 1376 2464 -480 ) ( 1256 2464 -480 ) ( 1256 2464 -488 ) subway/1_tunneltrack_2 36 0 0 1 1 0 16777216 0 +( 1168 2288 -520 ) ( 1168 2312 -520 ) ( 1168 2312 -528 ) subway/1_tunneltrack_2 36 0 0 1 1 0 16777216 0 +( 1140 2400 -568 ) ( 1260 2400 -568 ) ( 1260 2400 -576 ) subway/1_tunneltrack_2 36 0 0 1 1 0 16777216 0 +( 1212 1680 -536 ) ( 1212 1704 -536 ) ( 1332 1704 -536 ) subway/1_tunneltrack_2 52 24 0 1 1 0 16777216 0 +( 1332 1720 -544 ) ( 1212 1720 -544 ) ( 1212 1696 -544 ) subway/1_tunneltrack_2 36 0 0 1 1 0 16777216 0 +} +// brush 2314 +{ +( 836 -840 -520 ) ( 836 -864 -520 ) ( 956 -864 -520 ) subway/1_tunnelwall 16 -352 0 0.500000 0.500000 134217728 0 0 +( 972 -848 -504 ) ( 852 -848 -504 ) ( 852 -824 -504 ) subway/metalfloor1 16 -384 0 0.500000 0.500000 134217728 0 0 +( 900 -328 -552 ) ( 900 -328 -544 ) ( 780 -328 -544 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 780 -1200 -504 ) ( 780 -1200 -496 ) ( 780 -1176 -496 ) subway/1_trim1 384 0 0 0.500000 0.500000 134217728 0 0 +( 844 -1256 -440 ) ( 844 -1256 -432 ) ( 964 -1256 -432 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 732 -1208 -496 ) ( 732 -1208 -488 ) ( 732 -1232 -488 ) subway/1_trim1 -384 32 0 -0.500000 0.500000 134217728 0 0 +( 724 -1216 -230 ) ( 724 -1216 -240 ) ( 844 -1216 -240 ) subway/1_trim1 16 0 0 0.500000 0.500000 134217728 0 0 +} +// brush 2315 +{ +( 724 -1224 -246 ) ( 724 -1224 -256 ) ( 844 -1224 -256 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 740 -1208 -512 ) ( 740 -1208 -504 ) ( 740 -1232 -504 ) subway/1_tunnelwall 384 32 0 0.500000 0.500000 134217728 0 0 +( 844 -1256 -456 ) ( 844 -1256 -448 ) ( 964 -1256 -448 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 772 -1200 -520 ) ( 772 -1200 -512 ) ( 772 -1176 -512 ) subway/1_tunnelwall 384 32 0 0.500000 0.500000 134217728 0 0 +( 900 -328 -568 ) ( 900 -328 -560 ) ( 780 -328 -560 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 972 -848 -520 ) ( 852 -848 -520 ) ( 852 -824 -520 ) subway/metalfloor1 16 -384 0 0.500000 0.500000 134217728 0 0 +( 836 -840 -536 ) ( 836 -864 -536 ) ( 956 -864 -536 ) subway/1_tunnelwall 16 -352 0 0.500000 0.500000 134217728 0 0 +} +// brush 2316 +{ +( 1100 -72 -230 ) ( 1100 -72 -240 ) ( 1220 -72 -240 ) subway/1_trim1 16 0 0 0.500000 0.500000 134217728 0 0 +( 1108 -64 -496 ) ( 1108 -64 -488 ) ( 1108 -88 -488 ) subway/1_trim1 0 32 0 -0.500000 0.500000 134217728 0 0 +( 1220 -112 -440 ) ( 1220 -112 -432 ) ( 1340 -112 -432 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 1156 -56 -504 ) ( 1156 -56 -496 ) ( 1156 -32 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 134217728 0 0 +( 1276 816 -552 ) ( 1276 816 -544 ) ( 1156 816 -544 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 1348 296 -504 ) ( 1228 296 -504 ) ( 1228 320 -504 ) subway/metalfloor1 16 0 0 0.500000 0.500000 134217728 0 0 +( 1212 304 -520 ) ( 1212 280 -520 ) ( 1332 280 -520 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +} +// brush 2317 +{ +( 1212 304 -536 ) ( 1212 280 -536 ) ( 1332 280 -536 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 1348 296 -520 ) ( 1228 296 -520 ) ( 1228 320 -520 ) subway/metalfloor1 16 0 0 0.500000 0.500000 134217728 0 0 +( 1276 816 -568 ) ( 1276 816 -560 ) ( 1156 816 -560 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 1148 -56 -520 ) ( 1148 -56 -512 ) ( 1148 -32 -512 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 134217728 0 0 +( 1220 -112 -456 ) ( 1220 -112 -448 ) ( 1340 -112 -448 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +( 1116 -64 -512 ) ( 1116 -64 -504 ) ( 1116 -88 -504 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 134217728 0 0 +( 1100 -80 -246 ) ( 1100 -80 -256 ) ( 1220 -80 -256 ) subway/1_tunnelwall 16 32 0 0.500000 0.500000 134217728 0 0 +} +// brush 2318 +{ +( 1204 -80 -264 ) ( 1084 -80 -264 ) ( 1084 -80 -254 ) subway/1_tunneltrack_end1 -84 15 0 1 -1 0 536870912 0 +( 1096 40 -512 ) ( 1096 16 -512 ) ( 1096 16 -520 ) subway/1_tunneltrack_end1 -412 15 0 1 -1 0 536870912 0 +( 1340 -32 -480 ) ( 1220 -32 -480 ) ( 1220 -32 -488 ) subway/1_tunneltrack_end1 -84 15 0 1 -1 0 536870912 0 +( 1168 -16 -520 ) ( 1168 8 -520 ) ( 1168 8 -528 ) subway/1_tunneltrack_end1 -412 15 0 1 -1 0 536870912 0 +( 1156 -864 -568 ) ( 1276 -864 -568 ) ( 1276 -864 -576 ) subway/1_tunneltrack_end1 -84 15 0 1 -1 0 536870912 0 +( 1220 -368 -536 ) ( 1220 -344 -536 ) ( 1340 -344 -536 ) subway/1_tunneltrack_end1 52 -305 0 1 -1 0 536870912 0 +( 1332 -328 -544 ) ( 1212 -328 -544 ) ( 1212 -352 -544 ) subway/1_tunneltrack_end1 -84 -313 0 1 -1 0 536870912 0 +} +// brush 2319 +{ +( 828 -1264 -264 ) ( 708 -1264 -264 ) ( 708 -1264 -254 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 720 -1144 -512 ) ( 720 -1168 -512 ) ( 720 -1168 -520 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 964 -1208 -480 ) ( 844 -1208 -480 ) ( 844 -1208 -488 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 792 -1200 -520 ) ( 792 -1176 -520 ) ( 792 -1176 -528 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 780 -2048 -568 ) ( 900 -2048 -568 ) ( 900 -2048 -576 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 844 -1552 -536 ) ( 844 -1528 -536 ) ( 964 -1528 -536 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 956 -1512 -544 ) ( 836 -1512 -544 ) ( 836 -1536 -544 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +} +// brush 2320 +{ +( 1216 -128 -520 ) ( 1040 -128 -520 ) ( 1040 -144 -520 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1032 -144 -496 ) ( 1032 -128 -496 ) ( 1208 -128 -496 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1040 -144 -704 ) ( 1216 -144 -704 ) ( 1216 -144 -712 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1208 -144 -704 ) ( 1208 -128 -704 ) ( 1208 -128 -712 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1216 -136 -704 ) ( 1040 -136 -704 ) ( 1040 -136 -712 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1040 -128 -704 ) ( 1040 -144 -704 ) ( 1040 -144 -712 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +} +// brush 2321 +{ +( 1216 -128 -480 ) ( 1040 -128 -480 ) ( 1040 -144 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1032 -144 -448 ) ( 1032 -128 -448 ) ( 1208 -128 -448 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1040 -144 -656 ) ( 1216 -144 -656 ) ( 1216 -144 -664 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1208 -144 -656 ) ( 1208 -128 -656 ) ( 1208 -128 -664 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1216 -136 -656 ) ( 1040 -136 -656 ) ( 1040 -136 -664 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1040 -128 -656 ) ( 1040 -144 -656 ) ( 1040 -144 -664 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +} +// brush 2322 +{ +( 1040 -128 -728 ) ( 1040 -144 -728 ) ( 1040 -144 -736 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1216 -136 -728 ) ( 1040 -136 -728 ) ( 1040 -136 -736 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1208 -144 -728 ) ( 1208 -128 -728 ) ( 1208 -128 -736 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1040 -144 -728 ) ( 1216 -144 -728 ) ( 1216 -144 -736 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1032 -144 -520 ) ( 1032 -128 -520 ) ( 1208 -128 -520 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1216 -128 -544 ) ( 1040 -128 -544 ) ( 1040 -144 -544 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +} +// brush 2323 +{ +( 1040 -128 -536 ) ( 1040 -144 -536 ) ( 1040 -144 -544 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1216 -136 -536 ) ( 1040 -136 -536 ) ( 1040 -136 -544 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1208 -144 -536 ) ( 1208 -128 -536 ) ( 1208 -128 -544 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1040 -144 -536 ) ( 1216 -144 -536 ) ( 1216 -144 -544 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1032 -144 -328 ) ( 1032 -128 -328 ) ( 1208 -128 -328 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1216 -128 -448 ) ( 1040 -128 -448 ) ( 1040 -144 -448 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +} +// brush 2324 +{ +( 872 -497 -182 ) ( 864 -497 -182 ) ( 864 -529 -182 ) subway/1_black 0 0 0 1 1 134217728 0 0 +( 864 -529 -138 ) ( 864 -497 -138 ) ( 872 -497 -138 ) subway/1_black 0 0 0 1 1 134217728 0 0 +( 865 -519 -136 ) ( 873 -519 -136 ) ( 873 -519 -152 ) subway/1_black 0 0 0 1 1 134217728 0 0 +( 872 -488 -136 ) ( 872 -456 -136 ) ( 872 -456 -152 ) subway/sign13 0 0 0 1 1 134217728 0 0 +( 872 -481 -136 ) ( 864 -481 -136 ) ( 864 -481 -152 ) subway/1_black 0 0 0 1 1 134217728 0 0 +( 871 -497 -136 ) ( 871 -529 -136 ) ( 871 -529 -152 ) subway/sign13 88 0 0 -0.500000 0.500000 134217728 0 0 +} +// brush 2325 +{ +( 1696 803 -144 ) ( 1696 803 -136 ) ( 1688 803 -136 ) subway/1_black 4 0 0 0.500000 0.500000 134217728 16777216 0 +( 1688 771 -136 ) ( 1696 771 -136 ) ( 1696 771 -144 ) subway/1_black 4 0 0 0.500000 0.500000 134217728 16777216 0 +( 1696 771 -136 ) ( 1696 811 -136 ) ( 1696 811 -144 ) subway/1_black -14 0 0 0.500000 0.500000 134217728 16777216 0 +( 1688 803 -144 ) ( 1688 777 -144 ) ( 1696 777 -144 ) subway/light_small -2 11 90 1 1 0 1 4800 +( 1688 777 -144 ) ( 1688 803 -144 ) ( 1696 803 -136 ) subway/1_black 6 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2326 +{ +( 1696 875 -144 ) ( 1696 875 -136 ) ( 1688 875 -136 ) subway/1_black 4 0 0 0.500000 0.500000 134217728 16777216 0 +( 1688 843 -136 ) ( 1696 843 -136 ) ( 1696 843 -144 ) subway/1_black 4 0 0 0.500000 0.500000 134217728 16777216 0 +( 1696 843 -136 ) ( 1696 883 -136 ) ( 1696 883 -144 ) subway/1_black -14 0 0 0.500000 0.500000 134217728 16777216 0 +( 1688 875 -144 ) ( 1688 849 -144 ) ( 1696 849 -144 ) subway/light_small -10 11 90 1 1 0 1 4800 +( 1688 849 -144 ) ( 1688 875 -144 ) ( 1696 875 -136 ) subway/1_black 6 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2327 +{ +( 1688 705 -144 ) ( 1688 731 -144 ) ( 1696 731 -136 ) subway/1_black 6 0 0 0.500000 0.500000 134217728 16777216 0 +( 1688 731 -144 ) ( 1688 705 -144 ) ( 1696 705 -144 ) subway/light_small -26 11 90 1 1 0 1 4800 +( 1696 699 -136 ) ( 1696 739 -136 ) ( 1696 739 -144 ) subway/1_black -14 0 0 0.500000 0.500000 134217728 16777216 0 +( 1688 699 -136 ) ( 1696 699 -136 ) ( 1696 699 -144 ) subway/1_black 4 0 0 0.500000 0.500000 134217728 16777216 0 +( 1696 731 -144 ) ( 1696 731 -136 ) ( 1688 731 -136 ) subway/1_black 4 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2328 +{ +( 44 -952 -336 ) ( 44 -944 -344 ) ( 76 -944 -344 ) subway/1_black -752 -240 0 0.500000 0.500000 134217728 16777216 0 +( 48 -952 -344 ) ( 44 -952 -344 ) ( 44 -952 -336 ) subway/1_black -752 0 0 0.500000 0.500000 134217728 16777216 0 +( 76 -952 -344 ) ( 76 -944 -344 ) ( 44 -944 -344 ) subway/light_small -364 -108 0 1 1 134217728 1 3000 +( 76 -944 -336 ) ( 76 -944 -344 ) ( 76 -952 -344 ) subway/1_black 240 0 0 0.500000 0.500000 134217728 16777216 0 +( 44 -952 -344 ) ( 44 -944 -344 ) ( 44 -944 -336 ) subway/1_black 240 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2329 +{ +( 56 -832 -344 ) ( 24 -832 -344 ) ( 24 -824 -336 ) subway/1_black -712 0 0 0.500000 0.500000 134217728 16777216 0 +( 24 -824 -336 ) ( 24 -824 -344 ) ( 28 -824 -344 ) subway/1_black -712 0 0 0.500000 0.500000 134217728 16777216 0 +( 24 -832 -344 ) ( 56 -832 -344 ) ( 56 -824 -344 ) subway/light_small -344 12 0 1 1 134217728 1 3000 +( 56 -824 -344 ) ( 56 -832 -344 ) ( 56 -832 -336 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 24 -832 -336 ) ( 24 -832 -344 ) ( 24 -824 -344 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2330 +{ +( -280 -952 -344 ) ( -280 -944 -344 ) ( -280 -944 -336 ) subway/1_black 240 0 0 0.500000 0.500000 134217728 16777216 0 +( -248 -944 -336 ) ( -248 -944 -344 ) ( -248 -952 -344 ) subway/1_black 240 0 0 0.500000 0.500000 134217728 16777216 0 +( -248 -952 -344 ) ( -248 -944 -344 ) ( -280 -944 -344 ) subway/light_small -40 -108 0 1 1 134217728 1 3000 +( -276 -952 -344 ) ( -280 -952 -344 ) ( -280 -952 -336 ) subway/1_black -104 0 0 0.500000 0.500000 134217728 16777216 0 +( -280 -952 -336 ) ( -280 -944 -344 ) ( -248 -944 -344 ) subway/1_black -104 -240 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2331 +{ +( -332 -832 -336 ) ( -332 -832 -344 ) ( -332 -824 -344 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -300 -824 -344 ) ( -300 -832 -344 ) ( -300 -832 -336 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -332 -832 -344 ) ( -300 -832 -344 ) ( -300 -824 -344 ) subway/light_small 12 12 0 1 1 134217728 1 3000 +( -332 -824 -336 ) ( -332 -824 -344 ) ( -328 -824 -344 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -300 -832 -344 ) ( -332 -832 -344 ) ( -332 -824 -336 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2332 +{ +( 104 424 -64 ) ( 104 488 -64 ) ( 40 488 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 488 -48 ) ( 104 488 -48 ) ( 104 424 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 104 520 -120 ) ( 104 520 -72 ) ( 168 520 -72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 104 528 -72 ) ( 104 528 -120 ) ( 104 552 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 88 744 -104 ) ( 88 744 -88 ) ( 80 744 -88 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 136 816 -72 ) ( 136 816 -88 ) ( 136 752 -88 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2333 +{ +( 136 816 -168 ) ( 136 816 -184 ) ( 136 752 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 88 744 -184 ) ( 88 744 -168 ) ( 80 744 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 104 720 -168 ) ( 104 720 -216 ) ( 104 744 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 104 712 -216 ) ( 104 712 -168 ) ( 168 712 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 40 680 -168 ) ( 104 680 -168 ) ( 104 616 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 104 616 -216 ) ( 104 680 -216 ) ( 40 680 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2334 +{ +( 104 616 -168 ) ( 104 680 -168 ) ( 40 680 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 40 680 -152 ) ( 104 680 -152 ) ( 104 616 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 104 712 -200 ) ( 104 712 -152 ) ( 168 712 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 104 720 -152 ) ( 104 720 -200 ) ( 104 744 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 88 744 -168 ) ( 88 744 -152 ) ( 80 744 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 136 816 -152 ) ( 136 816 -168 ) ( 136 752 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2335 +{ +( 104 616 -152 ) ( 104 680 -152 ) ( 40 680 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 680 -120 ) ( 104 680 -120 ) ( 104 616 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 712 -160 ) ( 104 712 -112 ) ( 168 712 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 720 -112 ) ( 104 720 -160 ) ( 104 744 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 88 744 -144 ) ( 88 744 -128 ) ( 80 744 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 816 -112 ) ( 136 816 -128 ) ( 136 752 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2336 +{ +( 104 616 -120 ) ( 104 680 -120 ) ( 40 680 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 40 680 -104 ) ( 104 680 -104 ) ( 104 616 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 104 712 -152 ) ( 104 712 -104 ) ( 168 712 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 104 720 -104 ) ( 104 720 -152 ) ( 104 744 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 88 744 -136 ) ( 88 744 -120 ) ( 80 744 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 136 816 -104 ) ( 136 816 -120 ) ( 136 752 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2337 +{ +( 136 704 -104 ) ( 136 640 -104 ) ( 136 640 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 688 -64 ) ( 136 712 -104 ) ( 104 712 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 712 -136 ) ( 104 736 -136 ) ( 104 736 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 168 744 -88 ) ( 104 744 -88 ) ( 104 744 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 128 736 -64 ) ( 128 688 -64 ) ( 96 688 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 744 -104 ) ( 104 712 -104 ) ( 136 712 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2338 +{ +( 136 552 -104 ) ( 104 552 -104 ) ( 104 520 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 96 576 -64 ) ( 128 576 -64 ) ( 128 528 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 520 -136 ) ( 104 520 -88 ) ( 168 520 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 528 -88 ) ( 104 528 -136 ) ( 104 552 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 552 -104 ) ( 136 552 -104 ) ( 136 576 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 624 -88 ) ( 136 624 -104 ) ( 136 560 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2339 +{ +( 136 624 -112 ) ( 136 624 -128 ) ( 136 560 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 88 552 -144 ) ( 88 552 -128 ) ( 80 552 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 528 -112 ) ( 104 528 -160 ) ( 104 552 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 520 -160 ) ( 104 520 -112 ) ( 168 520 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 488 -120 ) ( 104 488 -120 ) ( 104 424 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 424 -152 ) ( 104 488 -152 ) ( 40 488 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2340 +{ +( 136 624 -104 ) ( 136 624 -120 ) ( 136 560 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 88 552 -136 ) ( 88 552 -120 ) ( 80 552 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 104 528 -104 ) ( 104 528 -152 ) ( 104 552 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 104 520 -152 ) ( 104 520 -104 ) ( 168 520 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 40 488 -104 ) ( 104 488 -104 ) ( 104 424 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 104 424 -120 ) ( 104 488 -120 ) ( 40 488 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2341 +{ +( 136 624 -152 ) ( 136 624 -168 ) ( 136 560 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 88 552 -168 ) ( 88 552 -152 ) ( 80 552 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 104 528 -152 ) ( 104 528 -200 ) ( 104 552 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 104 520 -200 ) ( 104 520 -152 ) ( 168 520 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 40 488 -152 ) ( 104 488 -152 ) ( 104 424 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 104 424 -168 ) ( 104 488 -168 ) ( 40 488 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2342 +{ +( 136 624 -168 ) ( 136 624 -184 ) ( 136 560 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 88 552 -184 ) ( 88 552 -168 ) ( 80 552 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 104 528 -168 ) ( 104 528 -216 ) ( 104 552 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 104 520 -216 ) ( 104 520 -168 ) ( 168 520 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 40 488 -168 ) ( 104 488 -168 ) ( 104 424 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 104 424 -216 ) ( 104 488 -216 ) ( 40 488 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2343 +{ +( -368 1736 -32 ) ( -368 1736 -48 ) ( -368 1752 -48 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -336 1752 -48 ) ( -336 1736 -48 ) ( -336 1736 -32 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -368 1742 -40 ) ( -336 1742 -40 ) ( -336 1752 -40 ) subway/light_small -240 27 0 1 1 134217728 1 3000 +( -396 1752 -32 ) ( -396 1752 -40 ) ( -380 1752 -40 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +( -336 1742 -40 ) ( -368 1742 -40 ) ( -368 1752 -32 ) subway/1_black -512 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2344 +{ +( -624 1736 -32 ) ( -624 1736 -48 ) ( -624 1752 -48 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -592 1752 -48 ) ( -592 1736 -48 ) ( -592 1736 -32 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -624 1742 -40 ) ( -592 1742 -40 ) ( -592 1752 -40 ) subway/light_small 16 27 0 1 1 134217728 1 3000 +( -652 1752 -32 ) ( -652 1752 -40 ) ( -636 1752 -40 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -592 1742 -40 ) ( -624 1742 -40 ) ( -624 1752 -32 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2345 +{ +( 600 1384 -88 ) ( 600 1376 -88 ) ( 600 1376 -128 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 616 1384 -88 ) ( 600 1384 -88 ) ( 600 1384 -128 ) subway/2_fuse2 16 0 0 0.500000 0.500000 134217728 536870912 0 +( 616 1376 -88 ) ( 616 1384 -88 ) ( 616 1384 -128 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 600 1380 -88 ) ( 616 1380 -88 ) ( 616 1380 -128 ) subway/2_fuse2 16 0 0 0.500000 0.500000 134217728 536870912 0 +( 600 1376 -96 ) ( 600 1384 -96 ) ( 616 1384 -96 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 616 1384 -128 ) ( 600 1384 -128 ) ( 600 1376 -128 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2346 +{ +( 1740 1032 -60 ) ( 1736 1032 -60 ) ( 1736 1016 -60 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1736 1016 -44 ) ( 1736 1032 -44 ) ( 1740 1032 -44 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1736 1016 4 ) ( 1740 1016 4 ) ( 1740 1016 -60 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1740 1016 4 ) ( 1740 1032 4 ) ( 1740 1032 -60 ) subway/light_red -16 8 0 0.500000 0.500000 134217728 16777217 9000 +( 1740 1032 4 ) ( 1736 1032 4 ) ( 1736 1032 -60 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1736 1032 4 ) ( 1736 1016 4 ) ( 1736 1016 -60 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2347 +{ +( 1800 1008 -88 ) ( 1800 976 -88 ) ( 1800 976 -96 ) subway/1_duct -32 0 0 0.500000 0.500000 0 16777216 0 +( 1832 1048 -88 ) ( 1800 1048 -88 ) ( 1800 1048 -96 ) subway/1_duct 0 0 0 0.500000 0.500000 0 16777216 0 +( 1808 976 -88 ) ( 1808 1008 -88 ) ( 1808 1008 -96 ) subway/1_duct -32 0 0 0.500000 0.500000 0 16777216 0 +( 1800 1000 -88 ) ( 1832 1000 -88 ) ( 1832 1000 -96 ) subway/1_duct 0 0 0 0.500000 0.500000 0 16777216 0 +( 1800 976 -32 ) ( 1800 1008 -32 ) ( 1832 1008 -32 ) subway/1_duct 0 32 0 0.500000 0.500000 0 16777216 0 +( 1832 1008 -96 ) ( 1800 1008 -96 ) ( 1800 976 -96 ) subway/1_duct 0 32 0 0.500000 0.500000 0 16777216 0 +} +// brush 2348 +{ +( 1728 1008 -88 ) ( 1728 976 -88 ) ( 1728 976 -96 ) subway/1_duct -16 0 0 0.500000 0.500000 0 16777216 0 +( 1760 1048 -88 ) ( 1728 1048 -88 ) ( 1728 1048 -96 ) subway/1_duct 16 0 0 0.500000 0.500000 0 16777216 0 +( 1736 976 -88 ) ( 1736 1008 -88 ) ( 1736 1008 -96 ) subway/1_duct -16 0 0 0.500000 0.500000 0 16777216 0 +( 1728 1000 -88 ) ( 1760 1000 -88 ) ( 1760 1000 -96 ) subway/1_duct 16 0 0 0.500000 0.500000 0 16777216 0 +( 1728 976 -32 ) ( 1728 1008 -32 ) ( 1760 1008 -32 ) subway/1_duct 16 16 0 0.500000 0.500000 0 16777216 0 +( 1760 1008 -96 ) ( 1728 1008 -96 ) ( 1728 976 -96 ) subway/1_duct 16 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 2349 +{ +( 1736 1008 -88 ) ( 1736 976 -88 ) ( 1736 976 -96 ) subway/1_duct -16 0 0 0.500000 0.500000 0 16777216 0 +( 1768 1008 -88 ) ( 1736 1008 -88 ) ( 1736 1008 -96 ) subway/1_duct 0 0 0 0.500000 0.500000 0 16777216 0 +( 1800 976 -88 ) ( 1800 1008 -88 ) ( 1800 1008 -96 ) subway/1_duct -16 0 0 0.500000 0.500000 0 16777216 0 +( 1736 1000 -88 ) ( 1768 1000 -88 ) ( 1768 1000 -96 ) subway/1_duct 0 0 0 0.500000 0.500000 0 16777216 0 +( 1736 976 -32 ) ( 1736 1008 -32 ) ( 1768 1008 -32 ) subway/1_duct 0 16 0 0.500000 0.500000 0 16777216 0 +( 1768 1008 -96 ) ( 1736 1008 -96 ) ( 1736 976 -96 ) subway/1_duct 0 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 2350 +{ +( 1736 1048 -88 ) ( 1736 1016 -88 ) ( 1736 1016 -96 ) subway/1_duct -32 0 0 0.500000 0.500000 0 16777216 0 +( 1768 1048 -88 ) ( 1736 1048 -88 ) ( 1736 1048 -96 ) subway/1_duct 0 0 0 0.500000 0.500000 0 16777216 0 +( 1800 1016 -88 ) ( 1800 1048 -88 ) ( 1800 1048 -96 ) subway/1_duct -32 0 0 0.500000 0.500000 0 16777216 0 +( 1768 1040 -88 ) ( 1800 1040 -88 ) ( 1800 1040 -96 ) subway/1_duct 0 0 0 0.500000 0.500000 0 16777216 0 +( 1736 1016 -32 ) ( 1736 1048 -32 ) ( 1768 1048 -32 ) subway/1_duct 0 32 0 0.500000 0.500000 0 16777216 0 +( 1768 1048 -96 ) ( 1736 1048 -96 ) ( 1736 1016 -96 ) subway/1_duct 0 32 0 0.500000 0.500000 0 16777216 0 +} +// brush 2351 +{ +( 1736 1040 -96 ) ( 1736 1008 -96 ) ( 1736 1008 -104 ) subway/grating1 -32 0 0 0.500000 0.500000 0 16779264 0 +( 1768 1040 -96 ) ( 1736 1040 -96 ) ( 1736 1040 -104 ) subway/grating1 0 0 0 0.500000 0.500000 0 16779264 0 +( 1768 1008 -96 ) ( 1768 1040 -96 ) ( 1768 1040 -104 ) subway/grating1 -32 0 0 0.500000 0.500000 0 16779264 0 +( 1736 1008 -96 ) ( 1768 1008 -96 ) ( 1768 1008 -104 ) subway/grating1 0 0 0 0.500000 0.500000 0 16779264 0 +( 1736 1008 -96 ) ( 1736 1040 -96 ) ( 1768 1040 -96 ) subway/grating1 48 32 0 0.500000 0.500000 0 16779264 0 +( 1768 1040 -100 ) ( 1736 1040 -100 ) ( 1736 1008 -100 ) subway/grating1 48 32 0 0.500000 0.500000 0 16779264 0 +} +// brush 2352 +{ +( 1672 992 -104 ) ( 1608 992 -104 ) ( 1608 928 -104 ) subway/1_bathroom_floor 48 16 0 0.500000 0.500000 0 285212672 0 +( 1608 928 -96 ) ( 1608 992 -96 ) ( 1672 992 -96 ) subway/1_bathroom_floor 48 16 0 0.500000 0.500000 0 285212672 0 +( 1504 648 -72 ) ( 1504 584 -72 ) ( 1504 584 -104 ) subway/1_bathroom_floor -16 32 0 0.500000 0.500000 0 285212672 0 +( 1736 1008 -96 ) ( 1768 1008 -96 ) ( 1768 1008 -104 ) subway/1_bathroom_floor 16 32 0 0.500000 0.500000 0 285212672 0 +( 1768 1040 -96 ) ( 1736 1040 -96 ) ( 1736 1040 -104 ) subway/1_bathroom_floor 16 32 0 0.500000 0.500000 0 285212672 0 +( 1736 1008 -96 ) ( 1736 1040 -96 ) ( 1736 1008 -104 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2353 +{ +( 1672 992 -104 ) ( 1608 992 -104 ) ( 1608 928 -104 ) subway/1_bathroom_floor 48 16 0 0.500000 0.500000 0 285212672 0 +( 1608 928 -96 ) ( 1608 992 -96 ) ( 1672 992 -96 ) subway/1_bathroom_floor 48 16 0 0.500000 0.500000 0 285212672 0 +( 1704 1088 -72 ) ( 1640 1088 -72 ) ( 1640 1088 -104 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1504 648 -72 ) ( 1504 584 -72 ) ( 1504 584 -104 ) subway/1_bathroom_floor -16 32 0 0.500000 0.500000 0 285212672 0 +( 1768 1008 -96 ) ( 1768 1040 -96 ) ( 1768 1040 -104 ) subway/1_bathroom_floor -16 32 0 0.500000 0.500000 0 285212672 0 +( 1736 1040 -96 ) ( 1768 1040 -96 ) ( 1736 1040 -104 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2354 +{ +( 1672 992 -104 ) ( 1608 992 -104 ) ( 1608 928 -104 ) subway/1_bathroom_floor 48 16 0 0.500000 0.500000 0 285212672 0 +( 1608 928 -96 ) ( 1608 992 -96 ) ( 1672 992 -96 ) subway/1_duct2 0 32 0 0.500000 0.500000 0 16777216 0 +( 1848 912 -72 ) ( 1848 976 -72 ) ( 1848 976 -104 ) subway/1_tile_big -16 0 0 0.500000 0.500000 0 318767104 0 +( 1704 1088 -72 ) ( 1640 1088 -72 ) ( 1640 1088 -104 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1736 1008 -96 ) ( 1768 1008 -96 ) ( 1768 1008 -104 ) subway/1_bathroom_floor 16 32 0 0.500000 0.500000 0 285212672 0 +( 1768 1040 -96 ) ( 1768 1008 -96 ) ( 1768 1040 -104 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2355 +{ +( 1672 992 -104 ) ( 1608 992 -104 ) ( 1608 928 -104 ) subway/1_bathroom_floor 48 16 0 0.500000 0.500000 0 285212672 0 +( 1608 928 -96 ) ( 1608 992 -96 ) ( 1672 992 -96 ) subway/1_bathroom_floor 48 16 0 0.500000 0.500000 0 285212672 0 +( 1616 952 -72 ) ( 1680 952 -72 ) ( 1680 952 -104 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1848 912 -72 ) ( 1848 976 -72 ) ( 1848 976 -104 ) subway/1_tile_big -16 0 0 0.500000 0.500000 0 318767104 0 +( 1504 648 -72 ) ( 1504 584 -72 ) ( 1504 584 -104 ) subway/1_bathroom_floor -16 32 0 0.500000 0.500000 0 285212672 0 +( 1768 1008 -96 ) ( 1736 1008 -96 ) ( 1768 1008 -104 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2356 +{ +( 1832 1008 -32 ) ( 1800 1008 -32 ) ( 1800 976 -32 ) subway/1_duct2 0 32 0 0.500000 0.500000 0 16777216 0 +( 1800 976 -24 ) ( 1800 1008 -24 ) ( 1832 1008 -24 ) subway/1_duct2 0 32 0 0.500000 0.500000 0 16777216 0 +( 1800 1000 -80 ) ( 1832 1000 -80 ) ( 1832 1000 -88 ) subway/1_duct2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1808 976 -80 ) ( 1808 1008 -80 ) ( 1808 1008 -88 ) subway/1_duct2 -32 0 0 0.500000 0.500000 0 16777216 0 +( 1832 1048 -80 ) ( 1800 1048 -80 ) ( 1800 1048 -88 ) subway/1_duct2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1728 1000 -80 ) ( 1728 968 -80 ) ( 1728 968 -88 ) subway/1_duct2 -32 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2357 +{ +( -131 296 -180 ) ( -130 296 -180 ) ( -130 296 -204 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -131 302 -180 ) ( -131 296 -180 ) ( -131 296 -204 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -130 305 -180 ) ( -131 305 -180 ) ( -131 305 -204 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -115 297 -180 ) ( -115 303 -180 ) ( -115 303 -204 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -130 296 -180 ) ( -131 296 -180 ) ( -131 302 -180 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -131 302 -181 ) ( -131 296 -181 ) ( -130 296 -181 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2358 +{ +( -131 296 -152 ) ( -130 296 -152 ) ( -130 296 -176 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -131 304 -152 ) ( -131 298 -152 ) ( -131 298 -176 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -130 305 -152 ) ( -131 305 -152 ) ( -131 305 -176 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -130 296 -152 ) ( -130 302 -152 ) ( -130 302 -176 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -130 296 -152 ) ( -131 296 -152 ) ( -131 302 -152 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -131 302 -180 ) ( -131 296 -180 ) ( -130 296 -180 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2359 +{ +( -116 296 -152 ) ( -115 296 -152 ) ( -115 296 -176 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -116 304 -152 ) ( -116 298 -152 ) ( -116 298 -176 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -115 305 -152 ) ( -116 305 -152 ) ( -116 305 -176 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -115 296 -152 ) ( -115 302 -152 ) ( -115 302 -176 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -115 296 -152 ) ( -116 296 -152 ) ( -116 302 -152 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -116 302 -180 ) ( -116 296 -180 ) ( -115 296 -180 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2360 +{ +( -131 296 -151 ) ( -130 296 -151 ) ( -130 296 -175 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -131 302 -151 ) ( -131 296 -151 ) ( -131 296 -175 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -130 305 -151 ) ( -131 305 -151 ) ( -131 305 -175 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -115 297 -151 ) ( -115 303 -151 ) ( -115 303 -175 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -130 296 -151 ) ( -131 296 -151 ) ( -131 302 -151 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -131 302 -152 ) ( -131 296 -152 ) ( -130 296 -152 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2361 +{ +( -131 302 -180 ) ( -131 296 -180 ) ( -130 296 -180 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -130 296 -152 ) ( -131 296 -152 ) ( -131 302 -152 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -116 297 -177 ) ( -116 303 -177 ) ( -116 303 -201 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -129 297 -180 ) ( -130 297 -180 ) ( -130 297 -204 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -130 302 -180 ) ( -130 296 -180 ) ( -130 296 -204 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -131 296 -180 ) ( -130 296 -180 ) ( -130 296 -204 ) subway/1_fusebox_side 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2362 +{ +( -1384 1568 -14 ) ( -1384 1568 -24 ) ( -1384 1624 -24 ) subway/1_tunneltrack_1 11 -23 195 1 1 0 16777216 0 +( 240 1568 -112 ) ( 240 1568 -104 ) ( 264 1568 -104 ) subway/1_tunnelwall 0 24 0 1 1 0 301989888 0 +( 136 1584 -200 ) ( 136 1584 -192 ) ( 112 1584 -192 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 832 1768 -208 ) ( 856 1768 -208 ) ( 856 1888 -208 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 208 1592 -120 ) ( 256 1592 -120 ) ( 256 1584 -120 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( -64 1576 -104 ) ( -64 1584 -104 ) ( -64 1576 -216 ) subway/1_tunnelwall -48 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 2363 +{ +( 376 1744 -88 ) ( 352 1744 -88 ) ( 352 1744 -96 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 328 1416 -56 ) ( 328 1536 -56 ) ( 328 1536 -64 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 328 1568 -96 ) ( 352 1568 -96 ) ( 352 1568 -104 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( -64 1596 -144 ) ( -64 1476 -144 ) ( -64 1476 -152 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 296 1548 -112 ) ( 320 1548 -112 ) ( 320 1428 -112 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 336 1428 -120 ) ( 336 1548 -120 ) ( 312 1548 -120 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 2364 +{ +( 376 1728 -264 ) ( 352 1728 -264 ) ( 352 1728 -272 ) subway/1_tunneltrack_plain -63 0 90 1 1 0 301989888 0 +( 328 1424 -232 ) ( 328 1544 -232 ) ( 328 1544 -240 ) subway/1_tunneltrack_plain -63 0 90 1 1 0 301989888 0 +( 328 1568 -272 ) ( 352 1568 -272 ) ( 352 1568 -280 ) subway/1_tunneltrack_plain -63 0 90 1 1 0 301989888 0 +( -64 1596 -320 ) ( -64 1476 -320 ) ( -64 1476 -328 ) subway/1_tunneltrack_plain -63 0 90 1 1 0 301989888 0 +( 296 1548 -288 ) ( 320 1548 -288 ) ( 320 1428 -288 ) subway/1_tunneltrack_plain -23 0 90 1 1 0 301989888 0 +( 336 1428 -296 ) ( 336 1548 -296 ) ( 312 1548 -296 ) subway/1_tunneltrack_plain -23 0 90 1 1 0 301989888 0 +} +// brush 2365 +{ +( 600 1428 -296 ) ( 600 1548 -296 ) ( 576 1548 -296 ) subway/no_draw 0 0 0 1 1 0 128 0 +( 560 1548 -120 ) ( 584 1548 -120 ) ( 584 1428 -120 ) subway/no_draw 0 0 0 1 1 0 128 0 +( 320 1588 -96 ) ( 320 1468 -96 ) ( 320 1468 -104 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 592 1568 -48 ) ( 616 1568 -48 ) ( 616 1568 -56 ) subway/no_draw 0 0 0 1 1 0 128 0 +( 328 1416 -8 ) ( 328 1536 -8 ) ( 328 1536 -16 ) subway/no_draw 0 0 0 1 1 0 128 0 +( 640 1744 -40 ) ( 616 1744 -40 ) ( 616 1744 -48 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 2366 +{ +( -912 1696 -120 ) ( -976 1696 -120 ) ( -976 1632 -120 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -976 1632 -112 ) ( -976 1696 -112 ) ( -912 1696 -112 ) subway/1_concrete_floor 944 2544 0 0.500000 0.500000 0 285212672 0 +( -904 1568 -104 ) ( -840 1568 -104 ) ( -840 1568 -112 ) subway/1_stair_side1 944 0 0 0.500000 0.500000 0 285212672 0 +( -936 1792 -104 ) ( -936 1856 -104 ) ( -936 1856 -112 ) subway/1_concrete_floor -2560 -32 0 0.500000 0.500000 0 285212672 0 +( -880 1752 -96 ) ( -944 1752 -96 ) ( -944 1752 -104 ) subway/1_concrete_floor 944 -32 0 0.500000 0.500000 0 285212672 0 +( -1384 1664 -104 ) ( -1384 1600 -104 ) ( -1384 1600 -112 ) subway/1_concrete_floor -2560 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 2367 +{ +( -496 1776 -120 ) ( -560 1776 -120 ) ( -560 1712 -120 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -560 1704 -112 ) ( -560 1768 -112 ) ( -496 1768 -112 ) subway/1_concrete_floor 944 2544 0 0.500000 0.500000 0 285212672 0 +( -496 1688 -104 ) ( -432 1688 -104 ) ( -432 1688 -112 ) subway/1_stair_side1 944 0 0 0.500000 0.500000 0 285212672 0 +( -248 1848 -104 ) ( -248 1912 -104 ) ( -248 1912 -112 ) subway/1_concrete_floor -2672 -32 0 0.500000 0.500000 0 285212672 0 +( -488 1752 -96 ) ( -552 1752 -96 ) ( -552 1752 -104 ) subway/1_concrete_floor 944 -32 0 0.500000 0.500000 0 285212672 0 +( -696 1768 -104 ) ( -696 1704 -104 ) ( -696 1704 -112 ) subway/1_concrete_floor -2672 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 2368 +{ +( 376 1584 -264 ) ( 352 1584 -264 ) ( 352 1584 -272 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 320 1256 -232 ) ( 320 1376 -232 ) ( 320 1376 -240 ) subway/1_tunnelwall 0 56 0 1 1 0 301989888 0 +( 584 1576 -280 ) ( 608 1576 -280 ) ( 608 1576 -288 ) subway/1_tunnelwall 0 56 0 1 1 0 301989888 0 +( -64 1436 -320 ) ( -64 1316 -320 ) ( -64 1316 -328 ) subway/1_tunnelwall 0 56 0 1 1 0 301989888 0 +( 296 1388 -120 ) ( 320 1388 -120 ) ( 320 1268 -120 ) subway/1_tunnelwall 0 16 0 1 1 0 301989888 0 +( 336 1268 -296 ) ( 336 1388 -296 ) ( 312 1388 -296 ) subway/1_tunnelwall 0 16 0 1 1 0 301989888 0 +} +// brush 2369 +{ +( -1384 1560 -208 ) ( -1384 1560 -240 ) ( -1384 1576 -240 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( -728 1560 -240 ) ( -728 1560 -208 ) ( -88 1560 -208 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -64 1776 -192 ) ( -64 1776 -184 ) ( -64 1896 -184 ) subway/1_tunnelwall_pipe -48 0 0 0.500000 0.500000 0 16777216 0 +( 72 1584 -248 ) ( 72 1584 -240 ) ( 48 1584 -240 ) subway/1_tunnelwall_pipe 0 32 0 0.500000 0.500000 0 16777216 0 +( -1440 1864 -280 ) ( -1440 1864 -272 ) ( -1440 1744 -272 ) subway/1_tunnelwall_pipe -48 0 0 0.500000 0.500000 0 16777216 0 +( 440 1888 -208 ) ( 440 1768 -208 ) ( 416 1768 -208 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 408 1760 -240 ) ( 432 1760 -240 ) ( 432 1880 -240 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2370 +{ +( 408 1760 -272 ) ( 432 1760 -272 ) ( 432 1880 -272 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( 440 1888 -240 ) ( 440 1768 -240 ) ( 416 1768 -240 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( -1384 1848 -320 ) ( -1384 1848 -312 ) ( -1384 1728 -312 ) subway/1_tunnelwall -48 48 0 0.500000 0.500000 0 301989888 0 +( -32 1584 -272 ) ( -32 1584 -264 ) ( -56 1584 -264 ) subway/1_tunnelwall 0 40 0 1 1 0 301989888 0 +( -64 1776 -232 ) ( -64 1776 -224 ) ( -64 1896 -224 ) subway/1_tunnelwall -48 48 0 0.500000 0.500000 0 301989888 0 +( -1000 1568 -200 ) ( -1000 1568 -192 ) ( -976 1568 -192 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( -1464 1584 -14 ) ( -1464 1584 -24 ) ( -1464 1632 -24 ) subway/1_tunneltrack_1 11 -23 195 1 1 0 16777216 0 +} +// brush 2371 +{ +( -546 1584 -160 ) ( -546 1600 -160 ) ( -546 1584 -288 ) subway/1_tunneltrack_1 13 -31 195 1 1 0 16777216 0 +( -1384 1560 -14 ) ( -1384 1560 -24 ) ( -1384 1616 -24 ) subway/1_tunneltrack_1 13 -31 195 1 1 0 16777216 0 +( -1000 1568 -208 ) ( -1000 1568 -200 ) ( -976 1568 -200 ) subway/con6 0 32 0 0.500000 0.500000 0 285212672 0 +( 40 1584 -280 ) ( 40 1584 -272 ) ( 16 1584 -272 ) subway/1_tunnelwall_floor 0 0 0 1 0.500000 0 285212672 0 +( 440 1888 -272 ) ( 440 1768 -272 ) ( 416 1768 -272 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 432 1760 -288 ) ( 456 1760 -288 ) ( 456 1880 -288 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2372 +{ +( -1232 1616 -272 ) ( -1256 1616 -272 ) ( -1256 1616 -280 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( -64 1368 -232 ) ( -64 1488 -232 ) ( -64 1488 -240 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +( -880 1584 -304 ) ( -880 1584 -288 ) ( -224 1584 -288 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( -1384 1592 -288 ) ( -1384 1592 -304 ) ( -1384 1624 -304 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +( -1168 1536 -288 ) ( -1144 1536 -288 ) ( -1144 1416 -288 ) subway/1_tunnelfloor_2 24 16 0 1 1 0 285212672 0 +( -1168 1440 -304 ) ( -1168 1560 -304 ) ( -1192 1560 -304 ) subway/1_tunneltrack_plain -32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 2373 +{ +( 2160 2424 -344 ) ( 2160 2392 -344 ) ( 2160 2392 -352 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2280 2616 -344 ) ( 2184 2616 -344 ) ( 2184 2616 -352 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2320 2400 -344 ) ( 2320 2432 -344 ) ( 2320 2432 -352 ) subway/1_stair_top1 0 48 0 0.500000 0.500000 0 285212672 0 +( 2176 2296 -344 ) ( 2272 2296 -344 ) ( 2272 2296 -352 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2176 2392 -336 ) ( 2176 2424 -336 ) ( 2272 2424 -336 ) subway/1_concrete_floor 32 48 0 0.500000 0.500000 0 285212672 0 +( 2280 2424 -344 ) ( 2184 2424 -344 ) ( 2184 2392 -344 ) subway/1_stair_top1 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 2374 +{ +( 1680 2424 -368 ) ( 1680 2400 -368 ) ( 1680 2400 -416 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1688 2616 -384 ) ( 1688 2616 -304 ) ( 1680 2624 -304 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1688 2616 -272 ) ( 1688 2616 -352 ) ( 1688 2424 -352 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1600 2440 -368 ) ( 1624 2440 -368 ) ( 1624 2440 -416 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1592 2448 -320 ) ( 1592 2472 -320 ) ( 1616 2472 -320 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1616 2472 -336 ) ( 1592 2472 -336 ) ( 1592 2448 -336 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2375 +{ +( 1680 2424 -352 ) ( 1680 2400 -352 ) ( 1680 2400 -400 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1688 2616 -312 ) ( 1688 2616 -232 ) ( 1680 2624 -232 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1688 2616 -256 ) ( 1688 2616 -336 ) ( 1688 2424 -336 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1600 2440 -352 ) ( 1624 2440 -352 ) ( 1624 2440 -400 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1592 2448 -264 ) ( 1592 2472 -264 ) ( 1616 2472 -264 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1616 2472 -320 ) ( 1592 2472 -320 ) ( 1592 2448 -320 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2376 +{ +( 1680 2424 -336 ) ( 1680 2400 -336 ) ( 1680 2400 -384 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1688 2616 -304 ) ( 1688 2616 -224 ) ( 1680 2624 -224 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1688 2616 -256 ) ( 1688 2616 -336 ) ( 1688 2424 -336 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1600 2440 -336 ) ( 1624 2440 -336 ) ( 1624 2440 -384 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1592 2448 -256 ) ( 1592 2472 -256 ) ( 1616 2472 -256 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1616 2472 -264 ) ( 1592 2472 -264 ) ( 1592 2448 -264 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2377 +{ +( 2168 1952 -280 ) ( 2160 1952 -280 ) ( 2160 1960 -280 ) subway/clip 32 0 0 0.500000 0.500000 196608 128 0 +( 2160 1960 -384 ) ( 2160 1952 -384 ) ( 2168 1952 -384 ) subway/clip 32 0 0 0.500000 0.500000 196608 128 0 +( 2160 1960 -312 ) ( 2160 1952 -312 ) ( 2160 1952 -368 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 2168 1960 -312 ) ( 2160 1960 -312 ) ( 2160 1960 -368 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 2160 1952 -312 ) ( 2168 1960 -312 ) ( 2168 1960 -368 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +} +// brush 2378 +{ +( 2320 1960 -280 ) ( 2320 1952 -280 ) ( 2312 1952 -280 ) subway/clip 32 0 0 0.500000 0.500000 196608 128 0 +( 2312 1952 -384 ) ( 2320 1952 -384 ) ( 2320 1960 -384 ) subway/clip 32 0 0 0.500000 0.500000 196608 128 0 +( 2320 1952 -368 ) ( 2320 1952 -312 ) ( 2320 1960 -312 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 2320 1960 -368 ) ( 2320 1960 -312 ) ( 2312 1960 -312 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 2312 1960 -368 ) ( 2312 1960 -312 ) ( 2320 1952 -312 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +} +// brush 2379 +{ +( 2160 1976 -256 ) ( 2160 2144 -256 ) ( 2160 2144 -368 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 905 +( 2152 1992 -384 ) ( 2144 1992 -384 ) ( 2144 1992 -352 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2152 2104 -352 ) ( 2152 1968 -352 ) ( 2152 1968 -384 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2168 2096 -312 ) ( 2152 2096 -312 ) ( 2152 2056 -312 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 2152 2056 -280 ) ( 2152 2096 -280 ) ( 2168 2096 -280 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 2168 2056 -272 ) ( 2152 2056 -272 ) ( 2168 2056 -320 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2380 +{ +( 2080 1968 -264 ) ( 2056 1968 -264 ) ( 2056 1992 -264 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 2160 2088 -280 ) ( 2160 2088 -272 ) ( 2152 2088 -272 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2160 2144 -264 ) ( 2160 2144 -272 ) ( 2160 1992 -272 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 905 +( 2152 1992 -384 ) ( 2144 1992 -384 ) ( 2144 1992 -352 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2152 2104 -352 ) ( 2152 1968 -352 ) ( 2152 1968 -384 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2152 2096 -280 ) ( 2152 2056 -280 ) ( 2168 2096 -280 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2381 +{ +( 2048 1992 -320 ) ( 2048 1968 -320 ) ( 2072 1968 -320 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 2160 2088 -320 ) ( 2160 2088 -312 ) ( 2152 2088 -312 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2160 2144 -312 ) ( 2160 2144 -320 ) ( 2160 1992 -320 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 905 +( 2152 1992 -384 ) ( 2144 1992 -384 ) ( 2144 1992 -352 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2152 2104 -352 ) ( 2152 1968 -352 ) ( 2152 1968 -384 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2152 2096 -312 ) ( 2168 2096 -312 ) ( 2152 2056 -312 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2382 +{ +( 2168 2096 -312 ) ( 2152 2096 -312 ) ( 2152 2056 -312 ) subway/1_tile_graf4 16 0 0 0.500000 0.500000 0 352321536 0 +( 2152 2056 -280 ) ( 2152 2096 -280 ) ( 2168 2096 -280 ) subway/1_tile_graf4 16 0 0 0.500000 0.500000 0 352321536 0 +( 2152 2056 -272 ) ( 2168 2056 -272 ) ( 2168 2056 -320 ) subway/1_tile_graf4 16 16 0 0.500000 0.500000 0 352321536 0 +( 2160 2056 -272 ) ( 2160 2096 -272 ) ( 2160 2096 -320 ) subway/1_tile_graf4 -16 16 0 0.500000 0.500000 0 352321536 0 +( 2168 2088 -272 ) ( 2152 2088 -272 ) ( 2152 2088 -320 ) subway/1_tile_graf4 16 16 0 0.500000 0.500000 0 352321536 0 +( 2152 2096 -272 ) ( 2152 2056 -272 ) ( 2152 2056 -320 ) subway/1_tile_graf4 -16 16 0 0.500000 0.500000 0 352321536 0 +} +// brush 2383 +{ +( 2360 1768 -384 ) ( 2360 1792 -384 ) ( 2336 1792 -384 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +( 2336 1792 -352 ) ( 2360 1792 -352 ) ( 2360 1768 -352 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +( 2320 1800 -352 ) ( 2320 1800 -384 ) ( 2320 1912 -384 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1984 -384 ) ( 2328 1984 -352 ) ( 2320 1992 -352 ) subway/1_tile -48 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1984 -352 ) ( 2328 1984 -384 ) ( 2328 1792 -384 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1960 -352 ) ( 2336 1960 -352 ) ( 2328 1960 -384 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2384 +{ +( 2360 1768 -384 ) ( 2360 1792 -384 ) ( 2336 1792 -384 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +( 2336 1792 -352 ) ( 2360 1792 -352 ) ( 2360 1768 -352 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +( 2320 1800 -352 ) ( 2320 1800 -384 ) ( 2320 1912 -384 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1984 -352 ) ( 2328 1984 -384 ) ( 2328 1792 -384 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1912 -352 ) ( 2336 1912 -352 ) ( 2328 1912 -384 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1928 -352 ) ( 2320 1928 -352 ) ( 2328 1928 -384 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2385 +{ +( 2320 1912 -352 ) ( 2320 1880 -352 ) ( 2320 1880 -384 ) subway/1_tilegraf17 48 0 0 -0.500000 0.500000 0 318767104 0 +( 2336 1912 -352 ) ( 2328 1912 -352 ) ( 2328 1912 -384 ) subway/1_tilegraf17 -48 0 0 -0.500000 0.500000 0 318767104 0 +( 2328 1880 -352 ) ( 2328 1912 -352 ) ( 2328 1912 -384 ) subway/1_tilegraf17 48 0 0 -0.500000 0.500000 0 318767104 0 +( 2320 1880 -352 ) ( 2328 1880 -352 ) ( 2328 1880 -384 ) subway/1_tilegraf17 -48 0 0 -0.500000 0.500000 0 318767104 0 +( 2320 1880 -352 ) ( 2320 1912 -352 ) ( 2328 1912 -352 ) subway/1_tilegraf17 -48 48 0 -0.500000 0.500000 0 318767104 0 +( 2328 1912 -384 ) ( 2320 1912 -384 ) ( 2320 1880 -384 ) subway/1_tilegraf17 -48 48 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2386 +{ +( 2360 1768 -384 ) ( 2360 1792 -384 ) ( 2336 1792 -384 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +( 2336 1792 -352 ) ( 2360 1792 -352 ) ( 2360 1768 -352 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +( 2320 1800 -352 ) ( 2320 1800 -384 ) ( 2320 1912 -384 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1984 -352 ) ( 2328 1984 -384 ) ( 2328 1792 -384 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2320 1848 -352 ) ( 2328 1848 -352 ) ( 2320 1848 -384 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1880 -352 ) ( 2320 1880 -352 ) ( 2328 1880 -384 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2387 +{ +( 2320 1848 -352 ) ( 2320 1816 -352 ) ( 2320 1816 -384 ) subway/1_tilegraf16 48 0 0 -0.500000 0.500000 0 318767104 0 +( 2336 1848 -352 ) ( 2328 1848 -352 ) ( 2328 1848 -384 ) subway/1_tilegraf16 -48 0 0 -0.500000 0.500000 0 318767104 0 +( 2328 1816 -352 ) ( 2328 1848 -352 ) ( 2328 1848 -384 ) subway/1_tilegraf16 48 0 0 -0.500000 0.500000 0 318767104 0 +( 2320 1816 -352 ) ( 2328 1816 -352 ) ( 2328 1816 -384 ) subway/1_tilegraf16 -48 0 0 -0.500000 0.500000 0 318767104 0 +( 2320 1816 -352 ) ( 2320 1848 -352 ) ( 2328 1848 -352 ) subway/1_tilegraf16 -48 48 0 -0.500000 0.500000 0 318767104 0 +( 2328 1848 -384 ) ( 2320 1848 -384 ) ( 2320 1816 -384 ) subway/1_tilegraf16 -48 48 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2388 +{ +( 2360 1768 -384 ) ( 2360 1792 -384 ) ( 2336 1792 -384 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +( 2336 1792 -352 ) ( 2360 1792 -352 ) ( 2360 1768 -352 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +( 2320 1800 -384 ) ( 2320 1800 -352 ) ( 2328 1792 -352 ) subway/1_tile -48 16 0 0.500000 0.500000 0 318767104 0 +( 2320 1800 -352 ) ( 2320 1800 -384 ) ( 2320 1912 -384 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1984 -352 ) ( 2328 1984 -384 ) ( 2328 1792 -384 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1816 -352 ) ( 2320 1816 -352 ) ( 2328 1816 -384 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2389 +{ +( 2328 1960 -384 ) ( 2320 1960 -384 ) ( 2320 1928 -384 ) subway/1_tilegraf17 -48 48 0 -0.500000 0.500000 0 318767104 0 +( 2320 1928 -352 ) ( 2320 1960 -352 ) ( 2328 1960 -352 ) subway/1_tilegraf17 -48 48 0 -0.500000 0.500000 0 318767104 0 +( 2320 1928 -352 ) ( 2328 1928 -352 ) ( 2328 1928 -384 ) subway/1_tilegraf17 -48 0 0 -0.500000 0.500000 0 318767104 0 +( 2328 1928 -352 ) ( 2328 1960 -352 ) ( 2328 1960 -384 ) subway/1_tilegraf17 48 0 0 -0.500000 0.500000 0 318767104 0 +( 2336 1960 -352 ) ( 2328 1960 -352 ) ( 2328 1960 -384 ) subway/1_tilegraf17 -48 0 0 -0.500000 0.500000 0 318767104 0 +( 2320 1960 -352 ) ( 2320 1928 -352 ) ( 2320 1928 -384 ) subway/1_tile_damage1 16 0 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2390 +{ +( 2328 1792 -352 ) ( 2328 1792 -384 ) ( 1936 1792 -384 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -352 ) ( 1912 1800 -384 ) ( 2024 1800 -384 ) subway/1_tile -48 16 0 -0.500000 0.500000 0 318767104 0 +( 1904 1784 -352 ) ( 1904 1760 -352 ) ( 1880 1760 -352 ) subway/1_tile 16 32 0 0.500000 0.500000 0 318767104 0 +( 1880 1760 -384 ) ( 1904 1760 -384 ) ( 1904 1784 -384 ) subway/1_tile 16 32 0 0.500000 0.500000 0 318767104 0 +( 1960 1816 -356 ) ( 1960 1768 -356 ) ( 1960 1816 -388 ) subway/1_tile -16 48 0 0.500000 0.500000 0 318767104 0 +( 2192 1784 -352 ) ( 2192 1808 -352 ) ( 2192 1784 -384 ) subway/1_tile -16 48 0 0.500000 0.500000 0 318767104 0 +} +// brush 2391 +{ +( 2328 1792 -352 ) ( 2328 1792 -384 ) ( 1936 1792 -384 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1792 -384 ) ( 2328 1792 -352 ) ( 2320 1800 -352 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -352 ) ( 1912 1800 -384 ) ( 2024 1800 -384 ) subway/1_tile -48 16 0 -0.500000 0.500000 0 318767104 0 +( 1904 1784 -352 ) ( 1904 1760 -352 ) ( 1880 1760 -352 ) subway/1_tile 16 32 0 0.500000 0.500000 0 318767104 0 +( 1880 1760 -384 ) ( 1904 1760 -384 ) ( 1904 1784 -384 ) subway/1_tile 16 32 0 0.500000 0.500000 0 318767104 0 +( 2256 1808 -352 ) ( 2256 1784 -352 ) ( 2256 1808 -384 ) subway/1_tile -16 48 0 0.500000 0.500000 0 318767104 0 +} +// brush 2392 +{ +( 2280 1808 -384 ) ( 2192 1808 -384 ) ( 2192 1784 -384 ) subway/1_tilegraf19 -96 48 0 -0.500000 0.500000 0 318767104 0 +( 2192 1784 -352 ) ( 2192 1808 -352 ) ( 2280 1808 -352 ) subway/1_tilegraf19 -96 48 0 -0.500000 0.500000 0 318767104 0 +( 2192 1792 -352 ) ( 2280 1792 -352 ) ( 2280 1792 -384 ) subway/1_tilegraf19 -96 0 0 -0.500000 0.500000 0 318767104 0 +( 2256 1784 -352 ) ( 2256 1808 -352 ) ( 2256 1808 -384 ) subway/1_tilegraf19 64 0 0 -0.500000 0.500000 0 318767104 0 +( 2280 1800 -352 ) ( 2192 1800 -352 ) ( 2192 1800 -384 ) subway/1_tilegraf19 -96 0 0 -0.500000 0.500000 0 318767104 0 +( 2192 1808 -352 ) ( 2192 1784 -352 ) ( 2192 1784 -384 ) subway/1_tilegraf19 64 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2393 +{ +( 2048 1992 -336 ) ( 2048 1968 -336 ) ( 2072 1968 -336 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 2080 1968 -320 ) ( 2056 1968 -320 ) ( 2056 1992 -320 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 2160 2144 -336 ) ( 2160 2144 -320 ) ( 2152 2144 -320 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2160 2144 -320 ) ( 2160 2144 -336 ) ( 2160 1992 -336 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 905 +( 2152 1992 -400 ) ( 2144 1992 -400 ) ( 2144 1992 -368 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2152 2104 -368 ) ( 2152 1968 -368 ) ( 2152 1968 -400 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2394 +{ +( 2328 1968 -384 ) ( 2328 1968 -352 ) ( 2328 1992 -352 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2312 1992 -352 ) ( 2312 1992 -384 ) ( 2320 1992 -384 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2312 1984 -384 ) ( 2312 1984 -352 ) ( 2312 1960 -352 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2320 1960 -352 ) ( 2320 1960 -384 ) ( 2312 1960 -384 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2328 1952 -368 ) ( 2352 1952 -368 ) ( 2352 1928 -368 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 2352 1928 -384 ) ( 2352 1952 -384 ) ( 2328 1952 -384 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2395 +{ +( 2352 1928 -368 ) ( 2352 1952 -368 ) ( 2328 1952 -368 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 2328 1952 -312 ) ( 2352 1952 -312 ) ( 2352 1928 -312 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 2320 1960 -336 ) ( 2320 1960 -368 ) ( 2312 1960 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2312 1984 -368 ) ( 2312 1984 -336 ) ( 2312 1960 -336 ) subway/1_tile 0 16 903 0.500000 0.500000 0 318767104 0 +( 2312 1992 -336 ) ( 2312 1992 -368 ) ( 2320 1992 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1968 -368 ) ( 2328 1968 -336 ) ( 2328 1992 -336 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2396 +{ +( 2328 2192 -248 ) ( 2328 2192 -264 ) ( 2328 2160 -264 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2320 2192 -216 ) ( 2320 2192 -264 ) ( 2328 2192 -264 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2320 2168 -264 ) ( 2320 2192 -264 ) ( 2320 2192 -216 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2328 2160 -248 ) ( 2328 2160 -264 ) ( 2320 2168 -264 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2312 2104 -248 ) ( 2336 2104 -248 ) ( 2336 2080 -248 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2320 2192 -256 ) ( 2320 2168 -256 ) ( 2328 2160 -256 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2397 +{ +( 2168 1968 -384 ) ( 2168 1968 -352 ) ( 2168 1992 -352 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2152 1992 -352 ) ( 2152 1992 -384 ) ( 2160 1992 -384 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2152 1984 -384 ) ( 2152 1984 -352 ) ( 2152 1960 -352 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2160 1960 -352 ) ( 2160 1960 -384 ) ( 2152 1960 -384 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2168 1952 -368 ) ( 2192 1952 -368 ) ( 2192 1928 -368 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 2192 1928 -384 ) ( 2192 1952 -384 ) ( 2168 1952 -384 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2398 +{ +( 2168 1968 -368 ) ( 2168 1968 -336 ) ( 2168 1992 -336 ) subway/1_tile 0 16 903 0.500000 0.500000 0 318767104 0 +( 2152 1992 -336 ) ( 2152 1992 -368 ) ( 2160 1992 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2152 1984 -368 ) ( 2152 1984 -336 ) ( 2152 1960 -336 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2160 1960 -336 ) ( 2160 1960 -368 ) ( 2152 1960 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2168 1952 -312 ) ( 2192 1952 -312 ) ( 2192 1928 -312 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 2192 1928 -368 ) ( 2192 1952 -368 ) ( 2168 1952 -368 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2399 +{ +( 2352 1928 -312 ) ( 2352 1952 -312 ) ( 2328 1952 -312 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1952 -280 ) ( 2352 1952 -280 ) ( 2352 1928 -280 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2320 1960 -280 ) ( 2320 1960 -312 ) ( 2312 1960 -312 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2312 1984 -312 ) ( 2312 1984 -280 ) ( 2312 1960 -280 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2312 1992 -280 ) ( 2312 1992 -312 ) ( 2320 1992 -312 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1968 -312 ) ( 2328 1968 -280 ) ( 2328 1992 -280 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2400 +{ +( 2192 1904 -384 ) ( 2192 1928 -384 ) ( 2168 1928 -384 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +( 2168 1928 -352 ) ( 2192 1928 -352 ) ( 2192 1904 -352 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +( 2152 1936 -384 ) ( 2152 1936 -352 ) ( 2160 1928 -352 ) subway/1_tile -48 16 0 0.500000 0.500000 0 318767104 0 +( 2152 1960 -384 ) ( 2152 1960 -352 ) ( 2152 1936 -352 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 2152 1960 -352 ) ( 2152 1960 -384 ) ( 2160 1960 -384 ) subway/1_tile 48 16 0 0.500000 0.500000 0 318767104 0 +( 2160 1784 -328 ) ( 2160 1840 -328 ) ( 2160 1840 -376 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2401 +{ +( 2152 2104 -384 ) ( 2152 1968 -384 ) ( 2152 1968 -416 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 2152 1992 -416 ) ( 2144 1992 -416 ) ( 2144 1992 -384 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 2160 2160 -336 ) ( 2160 2160 -384 ) ( 2160 1992 -384 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 905 +( 2160 2328 -384 ) ( 2160 2328 -336 ) ( 2152 2328 -336 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 2080 1968 -336 ) ( 2056 1968 -336 ) ( 2056 1992 -336 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1992 -384 ) ( 2048 1968 -384 ) ( 2072 1968 -384 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2402 +{ +( 2256 2048 -344 ) ( 2256 2072 -344 ) ( 2232 2072 -344 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2224 2072 -280 ) ( 2248 2072 -280 ) ( 2248 2048 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2152 1936 -344 ) ( 2152 1936 -280 ) ( 2160 1928 -280 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 2152 1960 -344 ) ( 2152 1960 -280 ) ( 2152 1936 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2152 1960 -280 ) ( 2152 1960 -344 ) ( 2160 1960 -344 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 2160 1960 -280 ) ( 2160 1960 -344 ) ( 2160 1736 -344 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2403 +{ +( 2360 1912 -272 ) ( 2264 1912 -272 ) ( 2264 1880 -272 ) subway/con14 -96 80 0 0.500000 0.500000 0 285212672 0 +( 2264 1880 -264 ) ( 2264 1912 -264 ) ( 2360 1912 -264 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2256 1824 -424 ) ( 2352 1824 -424 ) ( 2352 1824 -432 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2288 1888 -424 ) ( 2288 1920 -424 ) ( 2288 1920 -432 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 2360 1960 -424 ) ( 2264 1960 -424 ) ( 2264 1960 -432 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2192 1912 -424 ) ( 2192 1880 -424 ) ( 2192 1880 -432 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2404 +{ +( 392 1344 -176 ) ( 328 1344 -176 ) ( 328 1280 -176 ) subway/1_concrete_floor 224 1856 0 0.500000 0.500000 0 285212672 0 +( 328 1264 -168 ) ( 328 1328 -168 ) ( 392 1328 -168 ) subway/1_concrete_floor 944 2960 0 0.500000 0.500000 0 285212672 0 +( 400 1128 -176 ) ( 400 1128 -168 ) ( 400 1192 -168 ) subway/1_concrete_floor 1568 -320 0 0.500000 0.500000 0 285212672 0 +( 192 960 -184 ) ( 192 960 -176 ) ( 256 960 -176 ) subway/1_concrete_floor -3200 -320 0 0.500000 0.500000 0 285212672 0 +( 104 1720 -176 ) ( 104 1720 -168 ) ( 104 1656 -168 ) subway/1_stair_side1 1568 -320 0 0.500000 0.500000 0 285212672 0 +( 392 1192 -176 ) ( 392 1192 -168 ) ( 328 1192 -168 ) subway/1_concrete_floor -3200 -320 0 0.500000 0.500000 0 285212672 0 +} +// brush 2405 +{ +( 176 1008 -152 ) ( 112 1008 -152 ) ( 112 944 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 944 -64 ) ( 112 1008 -64 ) ( 176 1008 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 968 -64 ) ( 112 968 -152 ) ( 104 960 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 968 -152 ) ( 112 968 -64 ) ( 112 1192 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 1192 -152 ) ( 112 1192 -80 ) ( 104 1200 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 1064 -80 ) ( 104 1064 -152 ) ( 104 1200 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2406 +{ +( 176 1008 -168 ) ( 112 1008 -168 ) ( 112 944 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 112 944 -152 ) ( 112 1008 -152 ) ( 176 1008 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 112 968 -152 ) ( 112 968 -168 ) ( 104 960 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 112 968 -168 ) ( 112 968 -152 ) ( 112 1192 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 112 1192 -168 ) ( 112 1192 -96 ) ( 104 1200 -96 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 104 960 -152 ) ( 104 960 -168 ) ( 104 1128 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2407 +{ +( 104 960 -40 ) ( 104 960 -112 ) ( 104 1128 -112 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 0 352321536 0 +( 112 1192 -112 ) ( 112 1192 -40 ) ( 104 1200 -40 ) subway/1_tile_middle 0 114 0 0.500000 -0.500000 0 318767104 0 +( 112 1200 -24 ) ( 112 1200 -96 ) ( 112 1064 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 104 960 -112 ) ( 104 960 -40 ) ( 112 968 -40 ) subway/1_tile_middle 0 114 0 0.500000 -0.500000 0 318767104 0 +( 112 944 -40 ) ( 112 1008 -40 ) ( 176 1008 -40 ) subway/1_tile_middle 0 114 0 0.500000 -0.500000 0 318767104 0 +( 176 1008 -64 ) ( 112 1008 -64 ) ( 112 944 -64 ) subway/1_tile_middle 0 114 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2408 +{ +( 208 -432 -416 ) ( 208 -432 -376 ) ( 248 -432 -376 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 240 -208 -416 ) ( 240 -208 -464 ) ( 352 -432 -464 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 264 -208 -440 ) ( 264 -208 -400 ) ( 224 -208 -400 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 208 -208 -464 ) ( 208 -208 -416 ) ( 320 -432 -416 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 208 -208 -416 ) ( 240 -208 -416 ) ( 352 -432 -416 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 240 -208 -464 ) ( 208 -208 -464 ) ( 320 -432 -464 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 96 -472 -80 ) ( 168 -400 -80 ) ( 168 -400 -70 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( -146 -336 -408 ) ( -136 -336 -408 ) ( -136 -336 -472 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2409 +{ +( -146 -336 -472 ) ( -136 -336 -472 ) ( -136 -336 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -146 -400 -440 ) ( -136 -400 -440 ) ( -136 -400 -472 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 208 -432 -456 ) ( 208 -432 -416 ) ( 248 -432 -416 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 240 -208 -456 ) ( 240 -208 -504 ) ( 352 -432 -504 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 264 -208 -480 ) ( 264 -208 -440 ) ( 224 -208 -440 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 208 -208 -504 ) ( 208 -208 -456 ) ( 320 -432 -456 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 208 -208 -456 ) ( 240 -208 -456 ) ( 352 -432 -456 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 240 -208 -464 ) ( 208 -208 -464 ) ( 320 -432 -464 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 96 -472 -120 ) ( 168 -400 -120 ) ( 168 -400 -110 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2410 +{ +( -146 -336 -432 ) ( -136 -336 -432 ) ( -136 -336 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -146 -400 -400 ) ( -136 -400 -400 ) ( -136 -400 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 208 -432 -416 ) ( 208 -432 -376 ) ( 248 -432 -376 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 240 -208 -416 ) ( 240 -208 -464 ) ( 352 -432 -464 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 264 -208 -440 ) ( 264 -208 -400 ) ( 224 -208 -400 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 208 -208 -464 ) ( 208 -208 -416 ) ( 320 -432 -416 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 208 -208 -416 ) ( 240 -208 -416 ) ( 352 -432 -416 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 240 -208 -424 ) ( 208 -208 -424 ) ( 320 -432 -424 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 96 -472 -80 ) ( 168 -400 -80 ) ( 168 -400 -70 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2411 +{ +( 96 -472 -88 ) ( 168 -400 -88 ) ( 168 -400 -78 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 240 -216 -456 ) ( 208 -216 -456 ) ( 320 -440 -456 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 208 -208 -424 ) ( 240 -208 -424 ) ( 352 -432 -424 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 208 -208 -472 ) ( 208 -208 -424 ) ( 320 -432 -424 ) subway/1_tilegraf19 -32 -16 0 -0.500000 0.500000 0 318767104 0 +( 264 -208 -448 ) ( 264 -208 -408 ) ( 224 -208 -408 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 240 -208 -424 ) ( 240 -208 -472 ) ( 352 -432 -472 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 208 -432 -424 ) ( 208 -432 -384 ) ( 248 -432 -384 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( -146 -400 -408 ) ( -136 -400 -408 ) ( -136 -400 -440 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -146 -336 -440 ) ( -136 -336 -440 ) ( -136 -336 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2412 +{ +( 96 -472 -80 ) ( 168 -400 -80 ) ( 168 -400 -70 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 240 -208 -464 ) ( 208 -208 -464 ) ( 320 -432 -464 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 208 -208 -416 ) ( 240 -208 -416 ) ( 352 -432 -416 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 208 -208 -464 ) ( 208 -208 -416 ) ( 320 -432 -416 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 264 -208 -440 ) ( 264 -208 -400 ) ( 224 -208 -400 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 240 -208 -416 ) ( 240 -208 -464 ) ( 352 -432 -464 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 208 -432 -416 ) ( 208 -432 -376 ) ( 248 -432 -376 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( -146 -400 -472 ) ( -136 -400 -472 ) ( -136 -400 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2413 +{ +( 232 -704 -472 ) ( 232 -704 -408 ) ( 232 -714 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 168 -400 -70 ) ( 168 -400 -80 ) ( 96 -472 -80 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 136 -248 -464 ) ( 360 -360 -464 ) ( 360 -328 -464 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -416 ) ( 360 -328 -416 ) ( 360 -360 -416 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -248 -416 ) ( 360 -360 -416 ) ( 360 -360 -464 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 360 -344 -400 ) ( 360 -304 -400 ) ( 360 -304 -440 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -464 ) ( 360 -328 -464 ) ( 360 -328 -416 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -320 -376 ) ( 136 -360 -376 ) ( 136 -360 -416 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2414 +{ +( 168 -400 -110 ) ( 168 -400 -120 ) ( 96 -472 -120 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 136 -248 -464 ) ( 360 -360 -464 ) ( 360 -328 -464 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -456 ) ( 360 -328 -456 ) ( 360 -360 -456 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -248 -456 ) ( 360 -360 -456 ) ( 360 -360 -504 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 360 -344 -440 ) ( 360 -304 -440 ) ( 360 -304 -480 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -504 ) ( 360 -328 -504 ) ( 360 -328 -456 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -320 -416 ) ( 136 -360 -416 ) ( 136 -360 -456 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 168 -704 -472 ) ( 168 -704 -440 ) ( 168 -714 -440 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 232 -704 -448 ) ( 232 -704 -472 ) ( 232 -714 -472 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2415 +{ +( 168 -400 -70 ) ( 168 -400 -80 ) ( 96 -472 -80 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 136 -248 -424 ) ( 360 -360 -424 ) ( 360 -328 -424 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -416 ) ( 360 -328 -416 ) ( 360 -360 -416 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -248 -416 ) ( 360 -360 -416 ) ( 360 -360 -464 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 360 -344 -400 ) ( 360 -304 -400 ) ( 360 -304 -440 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -464 ) ( 360 -328 -464 ) ( 360 -328 -416 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -320 -376 ) ( 136 -360 -376 ) ( 136 -360 -416 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 168 -704 -432 ) ( 168 -704 -400 ) ( 168 -714 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 232 -704 -408 ) ( 232 -704 -432 ) ( 232 -714 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2416 +{ +( 232 -704 -416 ) ( 232 -704 -440 ) ( 232 -714 -440 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 168 -704 -440 ) ( 168 -704 -408 ) ( 168 -714 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -320 -384 ) ( 136 -360 -384 ) ( 136 -360 -424 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -472 ) ( 360 -328 -472 ) ( 360 -328 -424 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 360 -344 -408 ) ( 360 -304 -408 ) ( 360 -304 -448 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -248 -424 ) ( 360 -360 -424 ) ( 360 -360 -472 ) subway/1_tilegraf20 48 -16 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -424 ) ( 360 -328 -424 ) ( 360 -360 -424 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 128 -248 -456 ) ( 352 -360 -456 ) ( 352 -328 -456 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 168 -400 -78 ) ( 168 -400 -88 ) ( 96 -472 -88 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2417 +{ +( 168 -704 -416 ) ( 168 -704 -472 ) ( 168 -714 -472 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -320 -376 ) ( 136 -360 -376 ) ( 136 -360 -416 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -464 ) ( 360 -328 -464 ) ( 360 -328 -416 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 360 -344 -400 ) ( 360 -304 -400 ) ( 360 -304 -440 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -248 -416 ) ( 360 -360 -416 ) ( 360 -360 -464 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -416 ) ( 360 -328 -416 ) ( 360 -360 -416 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -248 -464 ) ( 360 -360 -464 ) ( 360 -328 -464 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 168 -400 -70 ) ( 168 -400 -80 ) ( 96 -472 -80 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2418 +{ +( -256 -296 -416 ) ( -256 -392 -416 ) ( -256 -392 -464 ) subway/1_tilegraf20 48 -16 0 0.500000 0.500000 0 318767104 0 +( -224 -296 -416 ) ( -256 -296 -416 ) ( -256 -296 -464 ) subway/1_tilegraf20 48 -16 0 0.500000 0.500000 0 318767104 0 +( -224 -392 -416 ) ( -224 -296 -416 ) ( -224 -296 -464 ) subway/1_tilegraf14 -48 0 0 0.500000 0.500000 0 318767104 0 +( -256 -328 -416 ) ( -224 -328 -416 ) ( -224 -328 -464 ) subway/1_tilegraf20 48 -16 0 0.500000 0.500000 0 318767104 0 +( -256 -392 -416 ) ( -256 -296 -416 ) ( -224 -296 -416 ) subway/1_tilegraf20 48 -16 0 0.500000 0.500000 0 318767104 0 +( -224 -296 -448 ) ( -256 -296 -448 ) ( -256 -392 -448 ) subway/1_tilegraf20 48 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2419 +{ +( -224 -296 -464 ) ( -256 -296 -464 ) ( -256 -392 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -392 -448 ) ( -256 -296 -448 ) ( -224 -296 -448 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -328 -432 ) ( -224 -328 -432 ) ( -224 -328 -480 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -224 -392 -432 ) ( -224 -296 -432 ) ( -224 -296 -480 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -224 -296 -432 ) ( -256 -296 -432 ) ( -256 -296 -480 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -296 -432 ) ( -256 -392 -432 ) ( -256 -392 -480 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2420 +{ +( -224 -48 -464 ) ( -224 -8 -464 ) ( -256 -8 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -264 -16 -416 ) ( -232 -16 -416 ) ( -232 -56 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -224 -376 -416 ) ( -224 -376 -464 ) ( -256 -408 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -360 -464 ) ( -256 -360 -416 ) ( -256 -408 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -328 -416 ) ( -256 -328 -464 ) ( -224 -328 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -224 -376 -464 ) ( -224 -376 -416 ) ( -224 -248 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2421 +{ +( -224 -376 -416 ) ( -224 -248 -416 ) ( -224 -248 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -224 -296 -464 ) ( -256 -296 -464 ) ( -256 -296 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -416 ) ( -256 -264 -416 ) ( -256 -264 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -464 ) ( -224 -248 -464 ) ( -224 -248 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -232 -568 -416 ) ( -232 -608 -416 ) ( -264 -608 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -256 -616 -464 ) ( -224 -616 -464 ) ( -224 -576 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2422 +{ +( -192 -800 -384 ) ( -192 -832 -384 ) ( -152 -832 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 16 -596 -328 ) ( 16 -564 -328 ) ( 16 -564 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -912 -328 ) ( 8 -944 -328 ) ( 8 -944 -368 ) subway/1_tilegraf15 112 64 0 -0.500000 0.500000 0 318767104 0 +( -220 -776 -312 ) ( -180 -776 -312 ) ( -180 -776 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -8 -696 -352 ) ( 8 -696 -352 ) ( -8 -736 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 16 -744 -352 ) ( 8 -744 -352 ) ( 16 -744 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2423 +{ +( -192 -760 -384 ) ( -192 -792 -384 ) ( -152 -792 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 16 -564 -328 ) ( 16 -532 -328 ) ( 16 -532 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -808 -328 ) ( 8 -840 -328 ) ( 8 -840 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -220 -744 -312 ) ( -180 -744 -312 ) ( -180 -744 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -8 -656 -352 ) ( 8 -656 -352 ) ( -8 -696 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 16 -640 -352 ) ( 8 -640 -352 ) ( 16 -640 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2424 +{ +( -280 -1128 -264 ) ( -280 -1152 -264 ) ( -280 -1152 -312 ) subway/1_tile_graf5 112 48 0 -0.500000 0.500000 0 352321536 0 +( -272 -1096 -264 ) ( -296 -1096 -264 ) ( -296 -1096 -312 ) subway/1_tile_graf5 0 0 0 0.500000 0.500000 0 352321536 0 +( -272 -1120 -264 ) ( -272 -1096 -264 ) ( -272 -1096 -312 ) subway/1_tile_graf5 0 0 0 0.500000 0.500000 0 352321536 0 +( -296 -1128 -264 ) ( -272 -1128 -264 ) ( -272 -1128 -312 ) subway/1_tile_graf5 0 0 0 0.500000 0.500000 0 352321536 0 +( -296 -1120 -264 ) ( -296 -1096 -264 ) ( -272 -1096 -264 ) subway/1_tile_graf5 0 0 0 0.500000 0.500000 0 352321536 0 +( -272 -1096 -296 ) ( -296 -1096 -296 ) ( -296 -1120 -296 ) subway/1_tile_graf5 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2425 +{ +( -280 -992 -160 ) ( -280 -1176 -160 ) ( -280 -1176 -184 ) subway/1_tile 112 48 0 -0.500000 0.500000 0 318767104 0 +( -264 -984 -160 ) ( -280 -984 -160 ) ( -280 -984 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -272 -1168 -160 ) ( -272 -984 -160 ) ( -272 -984 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -272 -1096 -296 ) ( -296 -1096 -296 ) ( -296 -1120 -296 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -296 -1120 -264 ) ( -296 -1096 -264 ) ( -272 -1096 -264 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -296 -1064 -264 ) ( -272 -1064 -264 ) ( -296 -1064 -312 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2426 +{ +( -280 -992 -160 ) ( -280 -1176 -160 ) ( -280 -1176 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -272 -1168 -160 ) ( -272 -984 -160 ) ( -272 -984 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -280 -1176 -160 ) ( -264 -1176 -160 ) ( -264 -1176 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -272 -1096 -296 ) ( -296 -1096 -296 ) ( -296 -1120 -296 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -296 -1120 -264 ) ( -296 -1096 -264 ) ( -272 -1096 -264 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -272 -1128 -264 ) ( -296 -1128 -264 ) ( -272 -1128 -312 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2427 +{ +( -280 -992 -160 ) ( -280 -1176 -160 ) ( -280 -1176 -184 ) subway/1_tile 112 48 0 -0.500000 0.500000 0 318767104 0 +( -264 -984 -160 ) ( -280 -984 -160 ) ( -280 -984 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -272 -1168 -160 ) ( -272 -984 -160 ) ( -272 -984 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -280 -1176 -160 ) ( -264 -1176 -160 ) ( -264 -1176 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -280 -1176 -256 ) ( -280 -992 -256 ) ( -264 -992 -256 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -296 -1096 -264 ) ( -296 -1120 -264 ) ( -272 -1096 -264 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2428 +{ +( -280 -992 -160 ) ( -280 -1176 -160 ) ( -280 -1176 -184 ) subway/1_tile 112 48 0 -0.500000 0.500000 0 318767104 0 +( -264 -984 -160 ) ( -280 -984 -160 ) ( -280 -984 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -272 -1168 -160 ) ( -272 -984 -160 ) ( -272 -984 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -280 -1176 -160 ) ( -264 -1176 -160 ) ( -264 -1176 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -264 -992 -304 ) ( -280 -992 -304 ) ( -280 -1176 -304 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -296 -1096 -296 ) ( -272 -1096 -296 ) ( -296 -1120 -296 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2429 +{ +( -272 -1064 -296 ) ( -296 -1064 -296 ) ( -296 -1088 -296 ) subway/1_tile_graf5 0 0 0 0.500000 0.500000 0 352321536 0 +( -296 -1088 -264 ) ( -296 -1064 -264 ) ( -272 -1064 -264 ) subway/1_tile_graf5 0 0 0 0.500000 0.500000 0 352321536 0 +( -296 -1096 -264 ) ( -272 -1096 -264 ) ( -272 -1096 -312 ) subway/1_tile_graf5 0 0 0 0.500000 0.500000 0 352321536 0 +( -272 -1088 -264 ) ( -272 -1064 -264 ) ( -272 -1064 -312 ) subway/1_tile_graf5 0 0 0 0.500000 0.500000 0 352321536 0 +( -272 -1064 -264 ) ( -296 -1064 -264 ) ( -296 -1064 -312 ) subway/1_tile_graf5 0 0 0 0.500000 0.500000 0 352321536 0 +( -280 -1096 -264 ) ( -280 -1120 -264 ) ( -280 -1120 -312 ) subway/1_tilegraf18 112 48 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2430 +{ +( -144 -1168 -296 ) ( -208 -1168 -296 ) ( -208 -1184 -296 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +( -208 -1184 -264 ) ( -208 -1168 -264 ) ( -144 -1168 -264 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +( -208 -1176 -240 ) ( -144 -1176 -240 ) ( -144 -1176 -296 ) subway/1_tilegraf17 32 -24 0 0.500000 0.500000 0 318767104 0 +( -176 -1184 -240 ) ( -176 -1168 -240 ) ( -176 -1168 -296 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +( -144 -1168 -240 ) ( -208 -1168 -240 ) ( -208 -1168 -296 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +( -208 -1168 -240 ) ( -208 -1184 -240 ) ( -208 -1184 -296 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2431 +{ +( -216 -1176 -272 ) ( -216 -1176 -232 ) ( -176 -1176 -232 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -256 -1168 -288 ) ( -256 -1168 -248 ) ( -296 -1168 -248 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -208 -1176 -312 ) ( -168 -1176 -312 ) ( -168 -1144 -312 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -208 -1168 -240 ) ( -208 -1184 -240 ) ( -208 -1184 -296 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -144 -1184 -240 ) ( -144 -1168 -240 ) ( -144 -1168 -296 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -208 -1168 -296 ) ( -144 -1168 -296 ) ( -208 -1184 -296 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2432 +{ +( -216 -1176 -272 ) ( -216 -1176 -232 ) ( -176 -1176 -232 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -256 -1168 -288 ) ( -256 -1168 -248 ) ( -296 -1168 -248 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -176 -1136 -256 ) ( -176 -1168 -256 ) ( -216 -1168 -256 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -208 -1168 -240 ) ( -208 -1184 -240 ) ( -208 -1184 -296 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -144 -1184 -240 ) ( -144 -1168 -240 ) ( -144 -1168 -296 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -208 -1168 -264 ) ( -208 -1184 -264 ) ( -144 -1168 -264 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2433 +{ +( -216 -1176 -272 ) ( -216 -1176 -232 ) ( -176 -1176 -232 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -72 -1184 -296 ) ( -72 -1184 -256 ) ( -72 -1152 -256 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -256 -1168 -288 ) ( -256 -1168 -248 ) ( -296 -1168 -248 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -176 -1136 -256 ) ( -176 -1168 -256 ) ( -216 -1168 -256 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -208 -1176 -312 ) ( -168 -1176 -312 ) ( -168 -1144 -312 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -144 -1168 -240 ) ( -144 -1184 -240 ) ( -144 -1168 -296 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2434 +{ +( -216 -1176 -272 ) ( -216 -1176 -232 ) ( -176 -1176 -232 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -256 -1168 -288 ) ( -256 -1168 -248 ) ( -296 -1168 -248 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -256 -1144 -296 ) ( -256 -1144 -256 ) ( -256 -1176 -256 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -176 -1136 -256 ) ( -176 -1168 -256 ) ( -216 -1168 -256 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -208 -1176 -312 ) ( -168 -1176 -312 ) ( -168 -1144 -312 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -208 -1184 -240 ) ( -208 -1168 -240 ) ( -208 -1184 -296 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2435 +{ +( -176 -1168 -240 ) ( -176 -1184 -240 ) ( -176 -1184 -296 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +( -112 -1168 -240 ) ( -176 -1168 -240 ) ( -176 -1168 -296 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +( -144 -1184 -240 ) ( -144 -1168 -240 ) ( -144 -1168 -296 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +( -176 -1176 -240 ) ( -112 -1176 -240 ) ( -112 -1176 -296 ) subway/1_tilegraf18 32 -8 0 0.500000 0.500000 0 318767104 0 +( -176 -1184 -264 ) ( -176 -1168 -264 ) ( -112 -1168 -264 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +( -112 -1168 -296 ) ( -176 -1168 -296 ) ( -176 -1184 -296 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2436 +{ +( -512 -1304 -312 ) ( -480 -1304 -312 ) ( -480 -1264 -312 ) subway/1_tile 672 -624 0 0.500000 0.500000 0 318767104 0 +( -480 -1216 -256 ) ( -512 -1216 -256 ) ( -512 -1216 -296 ) subway/1_tile 672 -224 0 0.500000 0.500000 0 318767104 0 +( -488 -1176 -248 ) ( -488 -1216 -248 ) ( -488 -1216 -288 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -480 -1296 -232 ) ( -480 -1256 -232 ) ( -480 -1256 -272 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -488 -1336 -280 ) ( -488 -1256 -280 ) ( -480 -1256 -280 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -488 -1256 -256 ) ( -480 -1256 -256 ) ( -488 -1256 -312 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2437 +{ +( -512 -1304 -312 ) ( -480 -1304 -312 ) ( -480 -1264 -312 ) subway/1_tile 672 -624 0 0.500000 0.500000 0 318767104 0 +( -488 -1176 -248 ) ( -488 -1216 -248 ) ( -488 -1216 -288 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -504 -1400 -256 ) ( -472 -1400 -256 ) ( -472 -1400 -296 ) subway/1_tile 672 -224 0 0.500000 0.500000 0 318767104 0 +( -480 -1296 -232 ) ( -480 -1256 -232 ) ( -480 -1256 -272 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -488 -1336 -280 ) ( -488 -1256 -280 ) ( -480 -1256 -280 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -480 -1320 -256 ) ( -488 -1320 -256 ) ( -480 -1320 -312 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2438 +{ +( -488 -1256 -256 ) ( -488 -1296 -256 ) ( -520 -1296 -256 ) subway/1_tile 672 -624 0 0.500000 0.500000 0 318767104 0 +( -480 -1216 -256 ) ( -512 -1216 -256 ) ( -512 -1216 -296 ) subway/1_tile 672 -224 0 0.500000 0.500000 0 318767104 0 +( -488 -1176 -248 ) ( -488 -1216 -248 ) ( -488 -1216 -288 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -504 -1400 -256 ) ( -472 -1400 -256 ) ( -472 -1400 -296 ) subway/1_tile 672 -224 0 0.500000 0.500000 0 318767104 0 +( -480 -1296 -232 ) ( -480 -1256 -232 ) ( -480 -1256 -272 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( -488 -1256 -280 ) ( -488 -1336 -280 ) ( -480 -1256 -280 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2439 +{ +( -480 -1256 -312 ) ( -488 -1256 -312 ) ( -488 -1336 -312 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +( -488 -1336 -280 ) ( -488 -1256 -280 ) ( -480 -1256 -280 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +( -488 -1320 -256 ) ( -480 -1320 -256 ) ( -480 -1320 -312 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +( -480 -1336 -256 ) ( -480 -1256 -256 ) ( -480 -1256 -312 ) subway/1_tilegraf20 -48 16 0 0.500000 0.500000 0 318767104 0 +( -480 -1256 -256 ) ( -488 -1256 -256 ) ( -488 -1256 -312 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +( -488 -1256 -256 ) ( -488 -1336 -256 ) ( -488 -1336 -312 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2440 +{ +( 104 -984 -184 ) ( 104 -984 -240 ) ( 104 -888 -240 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -888 -184 ) ( 104 -888 -184 ) ( 104 -888 -224 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 120 -984 -240 ) ( 120 -984 -184 ) ( 120 -888 -184 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 104 -904 -184 ) ( 104 -864 -184 ) ( 136 -864 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 136 -912 -216 ) ( 104 -912 -216 ) ( 104 -944 -216 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 104 -912 -184 ) ( 136 -912 -184 ) ( 104 -912 -240 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2441 +{ +( 104 -984 -184 ) ( 104 -984 -240 ) ( 104 -888 -240 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 120 -984 -240 ) ( 120 -984 -184 ) ( 120 -888 -184 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 112 -984 -184 ) ( 112 -984 -240 ) ( 104 -984 -240 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 104 -904 -184 ) ( 104 -864 -184 ) ( 136 -864 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 136 -912 -216 ) ( 104 -912 -216 ) ( 104 -944 -216 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 136 -944 -184 ) ( 104 -944 -184 ) ( 136 -944 -240 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2442 +{ +( 104 -984 -184 ) ( 104 -984 -240 ) ( 104 -888 -240 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -888 -184 ) ( 104 -888 -184 ) ( 104 -888 -224 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 120 -984 -240 ) ( 120 -984 -184 ) ( 120 -888 -184 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 112 -984 -184 ) ( 112 -984 -240 ) ( 104 -984 -240 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -856 -240 ) ( 104 -856 -240 ) ( 104 -896 -240 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 104 -912 -216 ) ( 136 -912 -216 ) ( 104 -944 -216 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2443 +{ +( 136 -912 -216 ) ( 104 -912 -216 ) ( 104 -944 -216 ) subway/1_tilegraf16 -16 72 0 -0.500000 0.500000 0 318767104 0 +( 104 -944 -184 ) ( 104 -912 -184 ) ( 136 -912 -184 ) subway/1_tilegraf16 -16 72 0 -0.500000 0.500000 0 318767104 0 +( 104 -944 -184 ) ( 136 -944 -184 ) ( 136 -944 -240 ) subway/1_tilegraf16 -16 72 0 -0.500000 0.500000 0 318767104 0 +( 120 -944 -184 ) ( 120 -912 -184 ) ( 120 -912 -240 ) subway/1_tilegraf16 -16 72 0 -0.500000 0.500000 0 318767104 0 +( 136 -912 -184 ) ( 104 -912 -184 ) ( 104 -912 -240 ) subway/1_tilegraf16 -16 72 0 -0.500000 0.500000 0 318767104 0 +( 104 -912 -184 ) ( 104 -944 -184 ) ( 104 -944 -240 ) subway/1_tilegraf16 24 72 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2444 +{ +( 112 -992 -88 ) ( 112 -1176 -88 ) ( 112 -1176 -112 ) subway/1_tile 64 16 0 -0.500000 0.500000 0 318767104 0 +( 128 -984 -88 ) ( 112 -984 -88 ) ( 112 -984 -112 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 120 -1168 -88 ) ( 120 -984 -88 ) ( 120 -984 -112 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 112 -1176 -184 ) ( 112 -992 -184 ) ( 128 -992 -184 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 120 -1048 -216 ) ( 96 -1048 -216 ) ( 96 -1120 -216 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 96 -1048 -184 ) ( 120 -1048 -184 ) ( 96 -1048 -232 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2445 +{ +( 112 -992 -88 ) ( 112 -1176 -88 ) ( 112 -1176 -112 ) subway/1_tile 64 16 0 -0.500000 0.500000 0 318767104 0 +( 120 -1168 -88 ) ( 120 -984 -88 ) ( 120 -984 -112 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 112 -1176 -88 ) ( 128 -1176 -88 ) ( 128 -1176 -112 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 112 -1176 -184 ) ( 112 -992 -184 ) ( 128 -992 -184 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 120 -1048 -216 ) ( 96 -1048 -216 ) ( 96 -1120 -216 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 120 -1120 -184 ) ( 96 -1120 -184 ) ( 120 -1120 -232 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2446 +{ +( 112 -992 -88 ) ( 112 -1176 -88 ) ( 112 -1176 -112 ) subway/1_tile 64 16 0 -0.500000 0.500000 0 318767104 0 +( 128 -984 -88 ) ( 112 -984 -88 ) ( 112 -984 -112 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 120 -1168 -88 ) ( 120 -984 -88 ) ( 120 -984 -112 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 112 -1176 -88 ) ( 128 -1176 -88 ) ( 128 -1176 -112 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 128 -992 -232 ) ( 112 -992 -232 ) ( 112 -1176 -232 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 96 -1048 -216 ) ( 120 -1048 -216 ) ( 96 -1120 -216 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2447 +{ +( 120 -1048 -216 ) ( 96 -1048 -216 ) ( 96 -1120 -216 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +( 96 -1120 -184 ) ( 96 -1048 -184 ) ( 120 -1048 -184 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +( 96 -1120 -184 ) ( 120 -1120 -184 ) ( 120 -1120 -232 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +( 120 -1120 -184 ) ( 120 -1048 -184 ) ( 120 -1048 -232 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +( 120 -1048 -184 ) ( 96 -1048 -184 ) ( 96 -1048 -232 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +( 112 -1048 -184 ) ( 112 -1120 -184 ) ( 112 -1120 -232 ) subway/1_tilegraf20 64 16 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2448 +{ +( 48 -656 -184 ) ( 48 -664 -184 ) ( 48 -656 -240 ) subway/1_tile 80 544 0 0.500000 0.500000 0 318767104 0 +( -16 -664 -208 ) ( -16 -656 -208 ) ( 16 -656 -208 ) subway/1_tile 80 544 0 0.500000 0.500000 0 318767104 0 +( 8 -632 -240 ) ( 8 -664 -240 ) ( 48 -664 -240 ) subway/1_tile 80 544 0 0.500000 0.500000 0 318767104 0 +( 104 -664 -184 ) ( 104 -632 -184 ) ( 104 -632 -224 ) subway/1_tile -544 -80 0 0.500000 0.500000 0 318767104 0 +( 104 -656 -176 ) ( 64 -656 -176 ) ( 64 -656 -216 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 16 -664 -160 ) ( 56 -664 -160 ) ( 56 -664 -200 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2449 +{ +( -120 -792 -240 ) ( -88 -792 -240 ) ( -88 -752 -240 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -96 -696 -176 ) ( -96 -736 -176 ) ( -96 -736 -216 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -120 -816 -184 ) ( -88 -816 -184 ) ( -88 -816 -224 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -88 -784 -160 ) ( -88 -744 -160 ) ( -88 -744 -200 ) subway/1_tilegraf19 104 -32 0 0.500000 0.500000 0 318767104 0 +( -88 -728 -208 ) ( -88 -696 -208 ) ( -80 -696 -208 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -80 -752 -184 ) ( -88 -752 -184 ) ( -80 -752 -240 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2450 +{ +( -80 -728 -184 ) ( -88 -728 -184 ) ( -80 -728 -240 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -88 -704 -208 ) ( -88 -672 -208 ) ( -80 -672 -208 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -88 -760 -160 ) ( -88 -720 -160 ) ( -88 -720 -200 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -120 -752 -184 ) ( -88 -752 -184 ) ( -88 -752 -224 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -96 -672 -176 ) ( -96 -712 -176 ) ( -96 -712 -216 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -120 -768 -240 ) ( -88 -768 -240 ) ( -88 -728 -240 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2451 +{ +( 696 -864 -144 ) ( 696 -864 -184 ) ( 536 -864 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 464 -864 -144 ) ( 464 -864 -184 ) ( 464 -856 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 664 -856 -176 ) ( 600 -856 -176 ) ( 600 -856 -184 ) subway/1_lobby1ad 32 16 0 -0.500000 0.500000 0 285212672 0 +( 496 -864 -184 ) ( 496 -864 -144 ) ( 496 -856 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 712 -864 -144 ) ( 384 -864 -144 ) ( 392 -856 -152 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 392 -856 -184 ) ( 400 -864 -184 ) ( 480 -864 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2452 +{ +( 664 -864 -144 ) ( 664 -864 -184 ) ( 504 -864 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 432 -864 -144 ) ( 432 -864 -184 ) ( 432 -856 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 632 -856 -176 ) ( 568 -856 -176 ) ( 568 -856 -184 ) subway/1_lobby1ac 32 16 0 -0.500000 0.500000 0 285212672 0 +( 464 -864 -184 ) ( 464 -864 -144 ) ( 464 -856 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 680 -864 -144 ) ( 352 -864 -144 ) ( 360 -856 -152 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 360 -856 -184 ) ( 368 -864 -184 ) ( 448 -864 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2453 +{ +( 632 -864 -144 ) ( 632 -864 -184 ) ( 472 -864 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 368 -864 -144 ) ( 368 -864 -184 ) ( 368 -856 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 568 -856 -176 ) ( 504 -856 -176 ) ( 504 -856 -184 ) subway/1_lobby1af 96 24 0 -0.500000 0.500000 0 285212672 0 +( 432 -864 -184 ) ( 432 -864 -144 ) ( 432 -856 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 616 -864 -144 ) ( 288 -864 -144 ) ( 296 -856 -152 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 296 -856 -184 ) ( 304 -864 -184 ) ( 384 -864 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2454 +{ +( 424 -856 -184 ) ( 432 -864 -184 ) ( 512 -864 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 744 -864 -144 ) ( 416 -864 -144 ) ( 424 -856 -152 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 536 -864 -184 ) ( 536 -864 -144 ) ( 536 -856 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 696 -856 -176 ) ( 632 -856 -176 ) ( 632 -856 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 496 -864 -144 ) ( 496 -864 -184 ) ( 496 -856 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 728 -864 -144 ) ( 728 -864 -184 ) ( 568 -864 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2455 +{ +( 512 -864 -144 ) ( 512 -864 -184 ) ( 352 -864 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 248 -864 -144 ) ( 248 -864 -184 ) ( 248 -856 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 448 -856 -176 ) ( 384 -856 -176 ) ( 384 -856 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 368 -864 -184 ) ( 368 -864 -144 ) ( 368 -856 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 496 -864 -144 ) ( 168 -864 -144 ) ( 176 -856 -152 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 176 -856 -184 ) ( 184 -864 -184 ) ( 264 -864 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2456 +{ +( 552 -1000 -184 ) ( 560 -992 -184 ) ( 560 -912 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 560 -680 -144 ) ( 560 -1008 -144 ) ( 552 -1000 -152 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 560 -744 -184 ) ( 560 -744 -144 ) ( 552 -744 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 552 -728 -176 ) ( 552 -792 -176 ) ( 552 -792 -184 ) subway/1_lobby1ab 40 16 0 -0.500000 0.500000 0 285212672 0 +( 568 -776 -144 ) ( 568 -776 -184 ) ( 560 -776 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 560 -736 -144 ) ( 560 -736 -184 ) ( 560 -896 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2457 +{ +( 552 -872 -184 ) ( 560 -864 -184 ) ( 560 -784 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 560 -552 -144 ) ( 560 -880 -144 ) ( 552 -872 -152 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 560 -616 -184 ) ( 560 -616 -144 ) ( 552 -616 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 552 -600 -176 ) ( 552 -664 -176 ) ( 552 -664 -184 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 568 -744 -144 ) ( 568 -744 -184 ) ( 560 -744 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 560 -704 -144 ) ( 560 -704 -184 ) ( 560 -864 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2458 +{ +( 560 -768 -144 ) ( 560 -768 -184 ) ( 560 -928 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 568 -840 -144 ) ( 568 -840 -184 ) ( 560 -840 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 552 -792 -176 ) ( 552 -856 -176 ) ( 552 -856 -184 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 560 -776 -184 ) ( 560 -776 -144 ) ( 552 -776 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 560 -712 -144 ) ( 560 -1040 -144 ) ( 552 -1032 -152 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 552 -1032 -184 ) ( 560 -1024 -184 ) ( 560 -944 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2459 +{ +( 610 -202 -124 ) ( 586 -202 -124 ) ( 586 -226 -124 ) subway/light_yellow 4 44 0 0.500000 0.500000 134217728 16777217 7000 +( 586 -226 -120 ) ( 586 -202 -120 ) ( 610 -202 -120 ) subway/1_black 2724 -692 0 0.500000 0.500000 134217728 16777216 0 +( 590 -218 -116 ) ( 614 -218 -116 ) ( 614 -218 -124 ) subway/1_black 2724 80 0 0.500000 0.500000 134217728 16777216 0 +( 606 -222 -116 ) ( 606 -198 -116 ) ( 606 -198 -124 ) subway/1_black 2276 80 0 0.500000 0.500000 134217728 16777216 0 +( 610 -202 -116 ) ( 586 -202 -116 ) ( 586 -202 -124 ) subway/1_black 2724 80 0 0.500000 0.500000 134217728 16777216 0 +( 590 -202 -116 ) ( 590 -226 -116 ) ( 590 -226 -124 ) subway/1_black 2276 80 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2460 +{ +( 1104 128 -108 ) ( 1104 168 -108 ) ( 1048 168 -108 ) subway/light_tube 1616 512 0 0.500000 0.500000 0 16777217 5200 +( 1048 168 -104 ) ( 1104 168 -104 ) ( 1104 128 -104 ) subway/1_black -160 976 0 0.500000 0.500000 0 16777216 0 +( 1048 168 -104 ) ( 1048 128 -104 ) ( 1048 128 -112 ) subway/1_black -784 32 0 0.500000 0.500000 0 16777216 0 +( 1040 144 -104 ) ( 1096 144 -104 ) ( 1096 144 -112 ) subway/1_black -352 32 0 0.500000 0.500000 0 16777216 0 +( 1092 128 -104 ) ( 1092 168 -104 ) ( 1092 168 -112 ) subway/1_black -784 0 0 0.500000 0.500000 0 16777216 0 +( 1104 160 -104 ) ( 1048 160 -104 ) ( 1048 160 -112 ) subway/1_black -352 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2461 +{ +( 1280 128 -108 ) ( 1280 168 -108 ) ( 1224 168 -108 ) subway/light_tube 112 0 0 0.500000 0.500000 134217728 16777217 5200 +( 1224 168 -104 ) ( 1280 168 -104 ) ( 1280 128 -104 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1224 168 -104 ) ( 1224 128 -104 ) ( 1224 128 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1216 144 -104 ) ( 1272 144 -104 ) ( 1272 144 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1268 124 -104 ) ( 1268 164 -104 ) ( 1268 164 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1280 160 -104 ) ( 1224 160 -104 ) ( 1224 160 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2462 +{ +( 1176 -128 -108 ) ( 1176 -88 -108 ) ( 1120 -88 -108 ) subway/light_tube 1472 0 0 0.500000 0.500000 134217728 16777217 5200 +( 1120 -88 -104 ) ( 1176 -88 -104 ) ( 1176 -128 -104 ) subway/1_black -304 464 0 0.500000 0.500000 134217728 16777216 0 +( 1120 -88 -104 ) ( 1120 -128 -104 ) ( 1120 -128 -112 ) subway/1_black -272 32 0 0.500000 0.500000 134217728 16777216 0 +( 1112 -112 -104 ) ( 1168 -112 -104 ) ( 1168 -112 -112 ) subway/1_black -496 32 0 0.500000 0.500000 134217728 16777216 0 +( 1164 -124 -104 ) ( 1164 -84 -104 ) ( 1164 -84 -112 ) subway/1_black -272 0 0 0.500000 0.500000 134217728 16777216 0 +( 1176 -96 -104 ) ( 1120 -96 -104 ) ( 1120 -96 -112 ) subway/1_black -496 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2463 +{ +( 600 -408 -168 ) ( 600 -368 -168 ) ( 568 -368 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 568 -376 -136 ) ( 600 -376 -136 ) ( 600 -416 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 568 -416 -184 ) ( 568 -416 -144 ) ( 600 -416 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -376 -184 ) ( 584 -376 -144 ) ( 584 -416 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -384 -184 ) ( 600 -384 -144 ) ( 568 -384 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -416 -176 ) ( 600 -416 -136 ) ( 600 -376 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2464 +{ +( 600 -416 -200 ) ( 600 -416 -160 ) ( 600 -376 -160 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 600 -384 -200 ) ( 600 -384 -160 ) ( 568 -384 -160 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 584 -376 -200 ) ( 584 -376 -160 ) ( 584 -416 -160 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 568 -416 -200 ) ( 568 -416 -160 ) ( 600 -416 -160 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 568 -376 -200 ) ( 600 -376 -200 ) ( 600 -416 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 600 -408 -216 ) ( 600 -368 -216 ) ( 568 -368 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2465 +{ +( 600 -416 -208 ) ( 600 -416 -168 ) ( 600 -376 -168 ) subway/1_tile_damage1 0 -16 0 0.500000 0.500000 0 352321536 0 +( 600 -384 -208 ) ( 600 -384 -168 ) ( 568 -384 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -376 -208 ) ( 584 -376 -168 ) ( 584 -416 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 568 -416 -208 ) ( 568 -416 -168 ) ( 600 -416 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 568 -376 -168 ) ( 600 -376 -168 ) ( 600 -416 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -408 -200 ) ( 600 -368 -200 ) ( 568 -368 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2466 +{ +( 600 -416 -168 ) ( 600 -416 -128 ) ( 600 -376 -128 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 600 -384 -168 ) ( 600 -384 -128 ) ( 568 -384 -128 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 584 -376 -168 ) ( 584 -376 -128 ) ( 584 -416 -128 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 568 -416 -168 ) ( 568 -416 -128 ) ( 600 -416 -128 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 568 -376 -120 ) ( 600 -376 -120 ) ( 600 -416 -120 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 600 -408 -136 ) ( 600 -368 -136 ) ( 568 -368 -136 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2467 +{ +( 600 -408 -120 ) ( 600 -368 -120 ) ( 568 -368 -120 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -384 -88 ) ( 600 -416 -88 ) ( 584 -416 -88 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -416 -120 ) ( 584 -416 -64 ) ( 600 -416 -64 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -376 -152 ) ( 584 -376 -112 ) ( 584 -416 -112 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -384 -120 ) ( 600 -384 -64 ) ( 584 -384 -64 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -416 -152 ) ( 600 -416 -112 ) ( 600 -376 -112 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2468 +{ +( 600 -416 -88 ) ( 616 -432 -64 ) ( 616 -368 -64 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -384 -88 ) ( 600 -368 -64 ) ( 584 -368 -64 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -376 -120 ) ( 584 -376 -80 ) ( 584 -416 -80 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -416 -88 ) ( 584 -432 -64 ) ( 600 -432 -64 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -368 -64 ) ( 616 -368 -64 ) ( 616 -432 -64 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -408 -88 ) ( 600 -368 -88 ) ( 568 -368 -88 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2469 +{ +( 600 -408 -64 ) ( 600 -368 -64 ) ( 568 -368 -64 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 568 -376 -48 ) ( 600 -376 -48 ) ( 600 -416 -48 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 568 -432 -136 ) ( 568 -432 -96 ) ( 600 -432 -96 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 584 -360 -136 ) ( 584 -360 -96 ) ( 584 -400 -96 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 600 -368 -136 ) ( 600 -368 -96 ) ( 568 -368 -96 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 616 -416 -136 ) ( 616 -416 -96 ) ( 616 -376 -96 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2470 +{ +( 472 -304 -216 ) ( 432 -304 -216 ) ( 432 -328 -216 ) subway/file_side -9 48 0 0.700000 0.700000 134217728 0 0 +( 432 -320 -172 ) ( 432 -296 -172 ) ( 472 -296 -172 ) subway/file_side -9 48 0 0.700000 0.700000 134217728 0 0 +( 432 -320 -152 ) ( 472 -320 -152 ) ( 472 -320 -184 ) subway/file_side -9 48 0 0.700000 0.700000 134217728 0 0 +( 472 -328 -144 ) ( 472 -304 -144 ) ( 472 -304 -176 ) subway/file_side 0 8 0 0.700000 0.700000 134217728 0 0 +( 472 -288 -152 ) ( 432 -288 -152 ) ( 432 -288 -184 ) subway/file_front 30 8 0 0.700000 0.700000 134217728 0 0 +( 428 -296 -152 ) ( 428 -320 -152 ) ( 428 -320 -184 ) subway/file_side 0 8 0 0.700000 0.700000 134217728 0 0 +} +// brush 2471 +{ +( 576 -272 -184 ) ( 576 -272 -152 ) ( 576 -656 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 576 -336 -152 ) ( 576 -336 -184 ) ( 584 -336 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -888 -152 ) ( 584 -888 -184 ) ( 584 -1032 -184 ) subway/1_lobby1ah 32 16 0 0.500000 0.500000 0 285212672 0 +( 584 -368 -188 ) ( 576 -368 -188 ) ( 576 -368 -156 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 608 -504 -152 ) ( 608 -440 -152 ) ( 672 -440 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 672 -440 -184 ) ( 608 -440 -184 ) ( 608 -504 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2472 +{ +( 576 -288 -184 ) ( 576 -288 -152 ) ( 576 -672 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 576 -368 -152 ) ( 576 -368 -184 ) ( 584 -368 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -904 -152 ) ( 584 -904 -184 ) ( 584 -1048 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -384 -188 ) ( 576 -384 -188 ) ( 576 -384 -156 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 608 -520 -152 ) ( 608 -456 -152 ) ( 672 -456 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 672 -456 -184 ) ( 608 -456 -184 ) ( 608 -520 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2473 +{ +( 704 -512 -184 ) ( 704 -576 -184 ) ( 768 -576 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 768 -576 -152 ) ( 704 -576 -152 ) ( 704 -512 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 808 -600 -184 ) ( 808 -608 -184 ) ( 808 -608 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 1336 -600 -152 ) ( 1336 -600 -184 ) ( 1480 -600 -184 ) subway/1_lobby1ae 16 16 0 -0.500000 0.500000 0 285212672 0 +( 776 -608 -152 ) ( 776 -608 -184 ) ( 776 -600 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -32 -608 -184 ) ( -32 -608 -152 ) ( 352 -608 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2474 +{ +( 744 -512 -184 ) ( 744 -576 -184 ) ( 808 -576 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 808 -576 -152 ) ( 744 -576 -152 ) ( 744 -512 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 872 -600 -184 ) ( 872 -608 -184 ) ( 872 -608 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 1400 -600 -152 ) ( 1400 -600 -184 ) ( 1544 -600 -184 ) subway/1_lobby1a 16 16 0 -0.500000 0.500000 0 285212672 0 +( 808 -608 -152 ) ( 808 -608 -184 ) ( 808 -600 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 0 -608 -184 ) ( 0 -608 -152 ) ( 384 -608 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2475 +{ +( -80 -608 -184 ) ( -80 -608 -152 ) ( 304 -608 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 648 -608 -152 ) ( 648 -608 -184 ) ( 648 -600 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 1312 -600 -152 ) ( 1312 -600 -184 ) ( 1456 -600 -184 ) subway/1_lobby1af 16 24 0 -0.500000 0.500000 0 285212672 0 +( 712 -600 -184 ) ( 712 -608 -184 ) ( 712 -608 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 720 -576 -152 ) ( 656 -576 -152 ) ( 656 -512 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 656 -512 -184 ) ( 656 -576 -184 ) ( 720 -576 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2476 +{ +( -64 -608 -184 ) ( -64 -608 -152 ) ( 320 -608 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 712 -608 -152 ) ( 712 -608 -184 ) ( 712 -600 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 1304 -600 -152 ) ( 1304 -600 -184 ) ( 1448 -600 -184 ) subway/1_lobby1a 16 16 0 -0.500000 0.500000 0 285212672 0 +( 776 -600 -184 ) ( 776 -608 -184 ) ( 776 -608 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 736 -576 -152 ) ( 672 -576 -152 ) ( 672 -512 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 672 -512 -184 ) ( 672 -576 -184 ) ( 736 -576 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2477 +{ +( 880 -288 -136 ) ( 872 -288 -136 ) ( 880 -288 -200 ) subway/1_lobby1a 64 16 0 -0.500000 0.500000 0 285212672 0 +( 872 -304 -152 ) ( 872 -224 -152 ) ( 880 -224 -152 ) subway/1_lobby1a 64 16 0 -0.500000 0.500000 0 285212672 0 +( 880 -224 -184 ) ( 872 -224 -184 ) ( 872 -304 -184 ) subway/1_lobby1a 64 16 0 -0.500000 0.500000 0 285212672 0 +( 880 -512 -168 ) ( 880 -512 -128 ) ( 880 -472 -128 ) subway/1_lobby1a 64 16 0 -0.500000 0.500000 0 285212672 0 +( 864 -608 -184 ) ( 864 -608 -144 ) ( 896 -608 -144 ) subway/1_lobby1a 64 16 0 -0.500000 0.500000 0 285212672 0 +( 872 -176 -192 ) ( 872 -176 -152 ) ( 872 -216 -152 ) subway/1_lobby1a 64 16 0 -0.500000 0.500000 0 285212672 0 +} +// brush 2478 +{ +( 872 -328 -192 ) ( 872 -328 -152 ) ( 872 -368 -152 ) subway/1_lobby1a 64 16 0 -0.500000 0.500000 0 285212672 0 +( 880 -512 -168 ) ( 880 -512 -128 ) ( 880 -472 -128 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 912 -200 -184 ) ( 912 -200 -144 ) ( 880 -200 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 880 -224 -184 ) ( 872 -224 -184 ) ( 872 -304 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 -304 -152 ) ( 872 -224 -152 ) ( 880 -224 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 -224 -136 ) ( 880 -224 -136 ) ( 872 -224 -200 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2479 +{ +( 872 -328 -184 ) ( 872 -328 -144 ) ( 872 -368 -144 ) subway/1_lobby2 64 16 0 -0.500000 0.500000 0 285212672 0 +( 872 -600 -184 ) ( 872 -600 -144 ) ( 904 -600 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 880 -512 -168 ) ( 880 -512 -128 ) ( 880 -472 -128 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 912 -200 -184 ) ( 912 -200 -144 ) ( 880 -200 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 -272 -136 ) ( 872 -272 -136 ) ( 872 -232 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -224 -152 ) ( 872 -304 -152 ) ( 880 -224 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2480 +{ +( 872 -328 -184 ) ( 872 -328 -144 ) ( 872 -368 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 -600 -184 ) ( 872 -600 -144 ) ( 904 -600 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 880 -512 -168 ) ( 880 -512 -128 ) ( 880 -472 -128 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 912 -200 -184 ) ( 912 -200 -144 ) ( 880 -200 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 -240 -200 ) ( 872 -280 -200 ) ( 904 -280 -200 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 -224 -184 ) ( 880 -224 -184 ) ( 872 -304 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2481 +{ +( 880 -224 -184 ) ( 872 -224 -184 ) ( 872 -304 -184 ) subway/1_lobby1ag 64 32 0 -0.500000 0.500000 0 285212672 0 +( 872 -304 -152 ) ( 872 -224 -152 ) ( 880 -224 -152 ) subway/1_lobby1ag 64 32 0 -0.500000 0.500000 0 285212672 0 +( 872 -288 -144 ) ( 880 -288 -144 ) ( 880 -288 -208 ) subway/1_lobby1ag 64 16 0 -0.500000 0.500000 0 285212672 0 +( 880 -304 -144 ) ( 880 -224 -144 ) ( 880 -224 -208 ) subway/1_lobby1ag 64 16 0 -0.500000 0.500000 0 285212672 0 +( 880 -224 -144 ) ( 872 -224 -144 ) ( 872 -224 -208 ) subway/1_lobby1ag 64 16 0 -0.500000 0.500000 0 285212672 0 +( 872 -224 -144 ) ( 872 -304 -144 ) ( 872 -304 -208 ) subway/1_lobby1ag 64 16 0 -0.500000 0.500000 0 285212672 0 +} +// brush 2482 +{ +( 576 0 -184 ) ( 576 0 -152 ) ( 576 -384 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 576 -32 -152 ) ( 576 -32 -184 ) ( 584 -32 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -592 -152 ) ( 584 -592 -184 ) ( 584 -736 -184 ) subway/1_lobby1ab 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -64 -184 ) ( 576 -64 -184 ) ( 576 -64 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 608 -232 -152 ) ( 608 -168 -152 ) ( 672 -168 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 672 -168 -184 ) ( 608 -168 -184 ) ( 608 -232 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2483 +{ +( 576 -24 -184 ) ( 576 -24 -152 ) ( 576 -408 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 576 -64 -152 ) ( 576 -64 -184 ) ( 584 -64 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -616 -152 ) ( 584 -616 -184 ) ( 584 -760 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -88 -184 ) ( 576 -88 -184 ) ( 576 -88 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 608 -256 -152 ) ( 608 -192 -152 ) ( 672 -192 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 672 -192 -184 ) ( 608 -192 -184 ) ( 608 -256 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2484 +{ +( 712 -184 -184 ) ( 720 -192 -184 ) ( 800 -192 -184 ) subway/1_lobby1a 48 0 0 0.500000 0.500000 0 285212672 0 +( 1032 -192 -144 ) ( 704 -192 -144 ) ( 712 -184 -152 ) subway/1_lobby1af 16 16 0 -0.500000 0.500000 0 285212672 0 +( 1032 -184 -184 ) ( 1032 -192 -184 ) ( 1032 -192 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 984 -184 -176 ) ( 920 -184 -176 ) ( 920 -184 -184 ) subway/1_lobby1af 16 16 0 -0.500000 0.500000 0 285212672 0 +( 968 -192 -144 ) ( 968 -192 -184 ) ( 968 -184 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1032 -192 -144 ) ( 1216 -192 -144 ) ( 1216 -192 -184 ) subway/1_lobby1a 48 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2485 +{ +( 944 -192 -144 ) ( 1128 -192 -144 ) ( 1128 -192 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 -192 -144 ) ( 904 -192 -184 ) ( 904 -184 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 944 -184 -176 ) ( 880 -184 -176 ) ( 880 -184 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 968 -184 -184 ) ( 968 -192 -184 ) ( 968 -192 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 992 -192 -144 ) ( 664 -192 -144 ) ( 672 -184 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 672 -184 -184 ) ( 680 -192 -184 ) ( 760 -192 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2486 +{ +( 1256 -192 -144 ) ( 1440 -192 -144 ) ( 1440 -192 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1032 -192 -144 ) ( 1032 -192 -184 ) ( 1032 -184 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1088 -184 -176 ) ( 1024 -184 -176 ) ( 1024 -184 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1304 -184 -184 ) ( 1304 -192 -184 ) ( 1304 -192 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1128 -192 -144 ) ( 800 -192 -144 ) ( 808 -184 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 816 -184 -184 ) ( 824 -192 -184 ) ( 904 -192 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2487 +{ +( 896 -16 -184 ) ( 816 -16 -184 ) ( 808 -24 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 808 -24 -152 ) ( 800 -16 -144 ) ( 1128 -16 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1104 -16 -144 ) ( 1104 -16 -184 ) ( 1104 -24 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1152 -24 -184 ) ( 1152 -24 -176 ) ( 1216 -24 -176 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 -24 -184 ) ( 904 -16 -184 ) ( 904 -16 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1328 -16 -184 ) ( 1328 -16 -144 ) ( 1144 -16 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2488 +{ +( 824 72 -184 ) ( 832 64 -184 ) ( 912 64 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1144 64 -144 ) ( 816 64 -144 ) ( 824 72 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 944 -8 -184 ) ( 944 56 -184 ) ( 944 56 -192 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 912 72 -152 ) ( 912 72 -184 ) ( 944 72 -184 ) subway/1_lobby1ac 16 16 0 0.500000 0.500000 0 285212672 0 +( 912 72 -184 ) ( 912 72 -152 ) ( 912 64 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1048 64 -144 ) ( 1376 64 -144 ) ( 1376 64 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2489 +{ +( 1336 488 -184 ) ( 1272 488 -184 ) ( 1272 424 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1176 240 -144 ) ( 1328 240 -144 ) ( 1328 232 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1248 256 -192 ) ( 1248 256 -184 ) ( 1248 320 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1160 232 -184 ) ( 1160 232 -152 ) ( 1312 232 -152 ) subway/1_lobby1aa 0 16 0 0.500000 0.500000 0 285212672 0 +( 1216 240 -184 ) ( 1216 240 -144 ) ( 1216 232 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1216 240 -144 ) ( 1216 240 -184 ) ( 1320 240 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2490 +{ +( 1304 488 -184 ) ( 1240 488 -184 ) ( 1240 424 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1144 240 -144 ) ( 1296 240 -144 ) ( 1296 232 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1216 256 -192 ) ( 1216 256 -184 ) ( 1216 320 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1136 232 -184 ) ( 1136 232 -152 ) ( 1288 232 -152 ) subway/1_lobby1ab 0 16 0 0.500000 0.500000 0 285212672 0 +( 1184 240 -184 ) ( 1184 240 -144 ) ( 1184 232 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1184 240 -144 ) ( 1184 240 -184 ) ( 1288 240 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2491 +{ +( 1200 488 -184 ) ( 1136 488 -184 ) ( 1136 424 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1040 240 -144 ) ( 1192 240 -144 ) ( 1192 232 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1184 256 -192 ) ( 1184 256 -184 ) ( 1184 320 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1024 232 -184 ) ( 1024 232 -152 ) ( 1176 232 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1040 240 -184 ) ( 1040 240 -144 ) ( 1032 232 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1200 240 -144 ) ( 1200 240 -184 ) ( 1352 240 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2492 +{ +( 1248 240 -144 ) ( 1248 240 -184 ) ( 1352 240 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1248 240 -184 ) ( 1248 240 -144 ) ( 1248 232 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1192 232 -184 ) ( 1192 232 -152 ) ( 1344 232 -152 ) subway/1_lobby1aa 0 16 0 0.500000 0.500000 0 285212672 0 +( 1320 256 -192 ) ( 1320 256 -184 ) ( 1320 320 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1208 240 -144 ) ( 1360 240 -144 ) ( 1360 232 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1368 488 -184 ) ( 1304 488 -184 ) ( 1304 424 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2493 +{ +( 792 72 -184 ) ( 800 64 -184 ) ( 880 64 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1112 64 -144 ) ( 784 64 -144 ) ( 792 72 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 912 -8 -184 ) ( 912 56 -184 ) ( 912 56 -192 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 72 -152 ) ( 872 72 -184 ) ( 912 72 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 72 -184 ) ( 872 72 -152 ) ( 864 64 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1016 64 -144 ) ( 1344 64 -144 ) ( 1344 64 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2494 +{ +( 872 72 -184 ) ( 880 64 -184 ) ( 960 64 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1192 64 -144 ) ( 864 64 -144 ) ( 872 72 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1104 -8 -184 ) ( 1104 56 -184 ) ( 1104 56 -192 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 928 72 -152 ) ( 928 72 -184 ) ( 1328 72 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 944 72 -184 ) ( 944 72 -152 ) ( 944 64 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 64 -144 ) ( 1200 64 -144 ) ( 1200 64 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2495 +{ +( 680 296 -184 ) ( 616 296 -184 ) ( 616 232 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 864 160 -144 ) ( 864 424 -144 ) ( 872 424 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 160 -152 ) ( 872 160 -184 ) ( 864 160 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 160 -184 ) ( 872 160 -152 ) ( 872 256 -152 ) subway/1_lobby1ad 0 16 0 0.500000 0.500000 0 285212672 0 +( 320 192 -176 ) ( 256 192 -176 ) ( 256 192 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 864 424 -144 ) ( 864 160 -144 ) ( 864 160 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2496 +{ +( 680 200 -184 ) ( 616 200 -184 ) ( 616 136 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 864 64 -144 ) ( 864 328 -144 ) ( 872 328 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 864 64 -184 ) ( 864 64 -152 ) ( 872 72 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 72 -176 ) ( 872 136 -176 ) ( 872 136 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 320 160 -176 ) ( 256 160 -176 ) ( 256 160 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 864 328 -144 ) ( 864 64 -144 ) ( 864 64 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2497 +{ +( 1040 264 -184 ) ( 1040 264 -144 ) ( 1040 328 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1648 328 -184 ) ( 1648 328 -176 ) ( 1584 328 -176 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1032 256 -152 ) ( 1032 256 -184 ) ( 1032 304 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1040 264 -144 ) ( 1040 264 -184 ) ( 1032 264 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1040 328 -144 ) ( 1040 240 -144 ) ( 1032 232 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1288 136 -184 ) ( 1288 200 -184 ) ( 1224 200 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2498 +{ +( 1312 272 -184 ) ( 1312 336 -184 ) ( 1248 336 -184 ) subway/1_sign5 32 16 0 -0.500000 0.500000 0 0 0 +( 1232 336 -152 ) ( 1296 336 -152 ) ( 1296 272 -152 ) subway/1_sign5 32 16 0 -0.500000 0.500000 0 0 0 +( 1080 432 -192 ) ( 1080 432 -184 ) ( 1144 432 -184 ) subway/1_sign5 32 16 0 -0.500000 0.500000 0 0 0 +( 1056 424 -184 ) ( 1056 424 -176 ) ( 1056 360 -176 ) subway/1_sign5 32 16 0 0.500000 0.500000 0 0 0 +( 1672 464 -184 ) ( 1672 464 -176 ) ( 1608 464 -176 ) subway/1_sign5 32 16 0 -0.500000 0.500000 0 0 0 +( 1064 272 -184 ) ( 1064 272 -176 ) ( 1064 336 -176 ) subway/1_sign5 32 16 0 -0.500000 0.500000 0 0 0 +} +// brush 2499 +{ +( 1000 552 -184 ) ( 968 552 -184 ) ( 968 544 -184 ) subway/1_lobby1ae -16 16 0 0.500000 0.500000 0 285212672 0 +( 968 544 -152 ) ( 968 552 -152 ) ( 1000 552 -152 ) subway/1_lobby1ae -16 16 0 0.500000 0.500000 0 285212672 0 +( 968 544 -152 ) ( 1000 544 -152 ) ( 1000 544 -184 ) subway/1_lobby1ae -16 16 0 0.500000 0.500000 0 285212672 0 +( 1000 544 -152 ) ( 1000 552 -152 ) ( 1000 552 -184 ) subway/1_lobby1ae -16 16 0 0.500000 0.500000 0 285212672 0 +( 1000 552 -152 ) ( 968 552 -152 ) ( 968 552 -184 ) subway/1_lobby1ae -16 16 0 0.500000 0.500000 0 285212672 0 +( 968 552 -152 ) ( 968 544 -152 ) ( 968 544 -184 ) subway/1_lobby1ae -16 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2500 +{ +( 968 552 -184 ) ( 936 552 -184 ) ( 936 544 -184 ) subway/1_lobby1ab 112 16 0 0.500000 0.500000 0 285212672 0 +( 936 544 -152 ) ( 936 552 -152 ) ( 968 552 -152 ) subway/1_lobby1ab 112 16 0 0.500000 0.500000 0 285212672 0 +( 936 544 -152 ) ( 968 544 -152 ) ( 968 544 -184 ) subway/1_lobby1ab 112 16 0 0.500000 0.500000 0 285212672 0 +( 968 544 -152 ) ( 968 552 -152 ) ( 968 552 -184 ) subway/1_lobby1ab 176 16 0 0.500000 0.500000 0 285212672 0 +( 968 552 -152 ) ( 936 552 -152 ) ( 936 552 -184 ) subway/1_lobby1ab 112 16 0 0.500000 0.500000 0 285212672 0 +( 936 552 -152 ) ( 936 544 -152 ) ( 936 544 -184 ) subway/1_lobby1ab 176 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2501 +{ +( 1000 552 -152 ) ( 1000 544 -152 ) ( 1000 544 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1032 552 -152 ) ( 1000 552 -152 ) ( 1000 552 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1032 544 -152 ) ( 1032 552 -152 ) ( 1032 552 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1000 544 -152 ) ( 1032 544 -152 ) ( 1032 544 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1000 544 -152 ) ( 1000 552 -152 ) ( 1032 552 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1032 552 -184 ) ( 1000 552 -184 ) ( 1000 544 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2502 +{ +( 936 552 -184 ) ( 904 552 -184 ) ( 904 544 -184 ) subway/1_lobby1ac -16 16 0 0.500000 0.500000 0 285212672 0 +( 904 544 -152 ) ( 904 552 -152 ) ( 936 552 -152 ) subway/1_lobby1ac -16 16 0 0.500000 0.500000 0 285212672 0 +( 904 544 -152 ) ( 936 544 -152 ) ( 936 544 -184 ) subway/1_lobby1ac -16 16 0 0.500000 0.500000 0 285212672 0 +( 936 544 -152 ) ( 936 552 -152 ) ( 936 552 -184 ) subway/1_lobby1ac -16 16 0 0.500000 0.500000 0 285212672 0 +( 936 552 -152 ) ( 904 552 -152 ) ( 904 552 -184 ) subway/1_lobby1ac -16 16 0 0.500000 0.500000 0 285212672 0 +( 904 552 -152 ) ( 904 544 -152 ) ( 904 544 -184 ) subway/1_lobby1ac -16 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2503 +{ +( 1168 552 -184 ) ( 1168 552 -176 ) ( 1104 552 -176 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 1160 -184 ) ( 872 1160 -176 ) ( 872 1096 -176 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 968 544 -184 ) ( 968 544 -176 ) ( 1032 544 -176 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 560 -192 ) ( 904 560 -184 ) ( 904 624 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1000 720 -152 ) ( 1000 784 -152 ) ( 1064 784 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1064 800 -184 ) ( 1000 800 -184 ) ( 1000 736 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2504 +{ +( 536 304 -88 ) ( 536 280 -88 ) ( 536 304 -160 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 184 288 -128 ) ( 184 312 -128 ) ( 256 312 -128 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 256 312 -160 ) ( 184 312 -160 ) ( 184 288 -160 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 160 296 -168 ) ( 160 296 -64 ) ( 296 296 -64 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 568 296 -96 ) ( 568 304 -96 ) ( 568 304 -168 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 624 304 -168 ) ( 688 304 -168 ) ( 688 304 -96 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2505 +{ +( 536 304 -120 ) ( 536 280 -120 ) ( 536 304 -192 ) subway/1_tile_damage1 16 0 0 0.500000 0.500000 0 352321536 0 +( 184 288 -160 ) ( 184 312 -160 ) ( 256 312 -160 ) subway/1_tile_damage1 16 0 0 0.500000 0.500000 0 352321536 0 +( 256 312 -192 ) ( 184 312 -192 ) ( 184 288 -192 ) subway/1_tile_damage1 16 0 0 0.500000 0.500000 0 352321536 0 +( 160 296 -200 ) ( 160 296 -96 ) ( 296 296 -96 ) subway/1_tile_damage1 16 0 0 0.500000 0.500000 0 352321536 0 +( 568 296 -128 ) ( 568 304 -128 ) ( 568 304 -200 ) subway/1_tile_damage1 16 0 0 0.500000 0.500000 0 352321536 0 +( 624 304 -200 ) ( 688 304 -200 ) ( 688 304 -128 ) subway/1_tile_damage1 16 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2506 +{ +( 296 312 -120 ) ( 296 288 -120 ) ( 296 312 -192 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 152 288 -128 ) ( 152 312 -128 ) ( 224 312 -128 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 224 312 -192 ) ( 152 312 -192 ) ( 152 288 -192 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 128 296 -200 ) ( 128 296 -96 ) ( 264 296 -96 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 536 296 -128 ) ( 536 304 -128 ) ( 536 304 -200 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 592 304 -200 ) ( 656 304 -200 ) ( 656 304 -128 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2507 +{ +( 448 144 -136 ) ( 448 120 -136 ) ( 512 144 -136 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 480 128 -120 ) ( 480 128 -192 ) ( 416 128 -192 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 464 128 -192 ) ( 464 128 -120 ) ( 464 136 -120 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 328 136 -88 ) ( 192 136 -88 ) ( 192 136 -192 ) subway/1_tile 32 -16 0 -0.500000 0.500000 0 318767104 0 +( 432 128 -120 ) ( 432 128 -192 ) ( 432 136 -192 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 880 200 -128 ) ( 880 136 -128 ) ( 816 136 -128 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2508 +{ +( 448 144 -168 ) ( 448 120 -168 ) ( 512 144 -168 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 480 128 -128 ) ( 480 128 -200 ) ( 416 128 -200 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 464 128 -200 ) ( 464 128 -128 ) ( 464 136 -128 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 328 136 -96 ) ( 192 136 -96 ) ( 192 136 -200 ) subway/1_tile_graf5 32 -16 0 -0.500000 0.500000 0 352321536 0 +( 432 128 -128 ) ( 432 128 -200 ) ( 432 136 -200 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 880 200 -136 ) ( 880 136 -136 ) ( 816 136 -136 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +} +// brush 2509 +{ +( 312 144 -168 ) ( 312 120 -168 ) ( 376 144 -168 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 344 128 -128 ) ( 344 128 -200 ) ( 280 128 -200 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 432 136 -200 ) ( 432 136 -128 ) ( 432 144 -128 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 192 136 -96 ) ( 56 136 -96 ) ( 56 136 -200 ) subway/1_tile 32 -16 0 -0.500000 0.500000 0 318767104 0 +( 296 128 -128 ) ( 296 128 -200 ) ( 296 136 -200 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 744 200 -128 ) ( 744 136 -128 ) ( 680 136 -128 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +} +// brush 2510 +{ +( 216 312 -120 ) ( 216 288 -120 ) ( 216 288 -192 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 256 304 -120 ) ( 184 304 -120 ) ( 184 304 -192 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 264 288 -120 ) ( 264 312 -120 ) ( 264 312 -192 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 216 296 -120 ) ( 288 296 -120 ) ( 288 296 -192 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 216 288 -160 ) ( 216 312 -160 ) ( 288 312 -160 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 288 312 -192 ) ( 216 312 -192 ) ( 216 288 -192 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2511 +{ +( 152 312 -120 ) ( 152 288 -120 ) ( 152 288 -192 ) subway/1_tilegraf19 -40 0 0 0.500000 0.500000 0 318767104 0 +( 224 304 -120 ) ( 152 304 -120 ) ( 152 304 -192 ) subway/1_tilegraf19 -40 0 0 0.500000 0.500000 0 318767104 0 +( 216 288 -120 ) ( 216 312 -120 ) ( 216 312 -192 ) subway/1_tilegraf19 -40 0 0 0.500000 0.500000 0 318767104 0 +( 152 296 -120 ) ( 224 296 -120 ) ( 224 296 -192 ) subway/1_tilegraf19 -40 0 0 0.500000 0.500000 0 318767104 0 +( 152 288 -160 ) ( 152 312 -160 ) ( 224 312 -160 ) subway/1_tilegraf19 -40 0 0 0.500000 0.500000 0 318767104 0 +( 224 312 -192 ) ( 152 312 -192 ) ( 152 288 -192 ) subway/1_tilegraf19 -40 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2512 +{ +( 152 312 -160 ) ( 152 288 -160 ) ( 224 312 -160 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 456 296 -128 ) ( 520 296 -128 ) ( 520 232 -128 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 136 296 -200 ) ( 136 304 -200 ) ( 136 304 -128 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 64 296 -200 ) ( 64 296 -96 ) ( 200 296 -96 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 240 280 -128 ) ( 240 288 -128 ) ( 240 288 -200 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 592 304 -200 ) ( 656 304 -200 ) ( 656 304 -128 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2513 +{ +( 212 1072 -52 ) ( 212 1064 -52 ) ( 212 1064 -68 ) subway/light_yellow -16 24 0 0.500000 0.500000 134217728 1 12000 +( 224 1080 -52 ) ( 208 1080 -52 ) ( 208 1080 -68 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 216 1064 -52 ) ( 216 1072 -52 ) ( 216 1072 -68 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 200 1064 -52 ) ( 216 1064 -52 ) ( 216 1064 -68 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 208 1064 -52 ) ( 208 1072 -52 ) ( 224 1072 -52 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 224 1072 -68 ) ( 208 1072 -68 ) ( 208 1064 -68 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2514 +{ +( -448 1520 -8 ) ( -448 1520 -224 ) ( -440 1528 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1176 -48 ) ( -448 1176 -152 ) ( -448 1520 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1000 -104 ) ( -440 1064 -104 ) ( -440 1064 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -416 1360 -136 ) ( -440 1360 -136 ) ( -440 1264 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1264 -104 ) ( -440 1360 -104 ) ( -416 1360 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1328 -80 ) ( -416 1328 -80 ) ( -440 1328 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2515 +{ +( -448 1176 -48 ) ( -448 1176 -152 ) ( -448 1520 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1184 -152 ) ( -448 1184 -48 ) ( -440 1192 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1000 -104 ) ( -440 1064 -104 ) ( -440 1064 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -416 1360 -136 ) ( -440 1360 -136 ) ( -440 1264 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1264 -104 ) ( -440 1360 -104 ) ( -416 1360 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -416 1264 -80 ) ( -440 1264 -80 ) ( -416 1264 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2516 +{ +( -448 1520 -8 ) ( -448 1520 -224 ) ( -440 1528 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1176 -48 ) ( -448 1176 -152 ) ( -448 1520 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1184 -152 ) ( -448 1184 -48 ) ( -440 1192 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1000 -104 ) ( -440 1064 -104 ) ( -440 1064 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1424 -72 ) ( -416 1424 -72 ) ( -440 1392 -72 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1360 -104 ) ( -440 1264 -104 ) ( -416 1360 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2517 +{ +( -512 1440 -152 ) ( -448 1440 -152 ) ( -448 1504 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1520 -8 ) ( -448 1520 -224 ) ( -440 1528 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1176 -48 ) ( -448 1176 -152 ) ( -448 1520 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1184 -152 ) ( -448 1184 -48 ) ( -440 1192 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1000 -104 ) ( -440 1064 -104 ) ( -440 1064 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1360 -136 ) ( -416 1360 -136 ) ( -440 1264 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2518 +{ +( -416 1360 -136 ) ( -440 1360 -136 ) ( -440 1264 -136 ) subway/1_tilegraf20 -32 64 0 0.500000 0.500000 0 318767104 0 +( -440 1264 -104 ) ( -440 1360 -104 ) ( -416 1360 -104 ) subway/1_tilegraf20 -32 64 0 0.500000 0.500000 0 318767104 0 +( -440 1264 -80 ) ( -416 1264 -80 ) ( -416 1264 -160 ) subway/1_tilegraf20 -32 -16 0 0.500000 0.500000 0 318767104 0 +( -440 1272 -80 ) ( -440 1368 -80 ) ( -440 1368 -160 ) subway/1_tilegraf20 -96 -16 0 0.500000 0.500000 0 318767104 0 +( -416 1328 -80 ) ( -440 1328 -80 ) ( -440 1328 -160 ) subway/1_tilegraf20 -32 -16 0 0.500000 0.500000 0 318767104 0 +( -448 1320 -80 ) ( -448 1224 -80 ) ( -448 1224 -160 ) subway/1_tilegraf20 -96 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2519 +{ +( 592 304 -200 ) ( 656 304 -200 ) ( 656 304 -128 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 40 296 -200 ) ( 40 296 -96 ) ( 176 296 -96 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 136 296 -200 ) ( 136 304 -200 ) ( 136 304 -128 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 224 312 -192 ) ( 152 312 -192 ) ( 152 288 -192 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 152 288 -160 ) ( 152 312 -160 ) ( 224 312 -160 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 152 288 -120 ) ( 152 312 -120 ) ( 152 288 -192 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +} +// brush 2520 +{ +( 640 304 -168 ) ( 704 304 -168 ) ( 704 304 -96 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 584 296 -96 ) ( 584 304 -96 ) ( 584 304 -168 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 176 296 -168 ) ( 176 296 -64 ) ( 312 296 -64 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 272 312 -192 ) ( 200 312 -192 ) ( 200 288 -192 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 200 288 -128 ) ( 200 312 -128 ) ( 272 312 -128 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 568 304 -88 ) ( 568 280 -88 ) ( 568 304 -160 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2521 +{ +( 696 304 -200 ) ( 760 304 -200 ) ( 760 304 -128 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 296 280 -128 ) ( 296 288 -128 ) ( 296 288 -200 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 144 296 -200 ) ( 144 296 -96 ) ( 280 296 -96 ) subway/1_tilegraf20 32 0 0 0.500000 0.500000 0 318767104 0 +( 240 296 -200 ) ( 240 304 -200 ) ( 240 304 -128 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 560 296 -128 ) ( 624 296 -128 ) ( 624 232 -128 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 256 312 -160 ) ( 256 288 -160 ) ( 328 312 -160 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +} +// brush 2522 +{ +( 592 304 -200 ) ( 656 304 -200 ) ( 656 304 -128 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 584 296 -128 ) ( 584 304 -128 ) ( 584 304 -200 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 40 296 -200 ) ( 40 296 -96 ) ( 176 296 -96 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 136 296 -200 ) ( 136 304 -200 ) ( 136 304 -128 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 520 232 -200 ) ( 520 296 -200 ) ( 456 296 -200 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 152 312 -192 ) ( 224 312 -192 ) ( 152 288 -192 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +} +// brush 2523 +{ +( 336 312 -192 ) ( 264 312 -192 ) ( 264 288 -192 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 264 288 -160 ) ( 264 312 -160 ) ( 336 312 -160 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 264 296 -120 ) ( 336 296 -120 ) ( 336 296 -192 ) subway/1_tilegraf18 48 0 0 0.500000 0.500000 0 318767104 0 +( 296 288 -120 ) ( 296 312 -120 ) ( 296 312 -192 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 304 304 -120 ) ( 232 304 -120 ) ( 232 304 -192 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 264 312 -120 ) ( 264 288 -120 ) ( 264 288 -192 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2524 +{ +( -32 320 -40 ) ( -32 336 -40 ) ( -32 320 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -32 320 -56 ) ( -32 336 -56 ) ( 72 336 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 336 -88 ) ( -32 336 -88 ) ( -32 320 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 272 -104 ) ( 104 272 -104 ) ( 104 272 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 120 328 -120 ) ( 112 328 -120 ) ( 112 328 -136 ) subway/1_tile_damage1 0 16 0 -0.500000 0.500000 0 352321536 0 +( -64 488 -120 ) ( -64 552 -120 ) ( -64 552 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2525 +{ +( 0 320 -40 ) ( 0 336 -40 ) ( 0 320 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 0 320 -56 ) ( 0 336 -56 ) ( 104 336 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 336 -88 ) ( 0 336 -88 ) ( 0 320 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 272 -104 ) ( 136 272 -104 ) ( 136 272 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 152 328 -120 ) ( 144 328 -120 ) ( 144 328 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -32 488 -120 ) ( -32 552 -120 ) ( -32 552 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2526 +{ +( 96 336 -40 ) ( 96 320 -40 ) ( 96 336 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 32 320 -56 ) ( 32 336 -56 ) ( 136 336 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 336 -88 ) ( 32 336 -88 ) ( 32 320 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 272 -104 ) ( 168 272 -104 ) ( 168 272 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 128 304 -152 ) ( 128 280 -152 ) ( 128 280 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 184 328 -120 ) ( 176 328 -120 ) ( 176 328 -136 ) subway/1_tile_damage2 0 16 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2527 +{ +( 64 336 -40 ) ( 64 320 -40 ) ( 64 336 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 0 320 -56 ) ( 0 336 -56 ) ( 104 336 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 336 -88 ) ( 0 336 -88 ) ( 0 320 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 272 -104 ) ( 136 272 -104 ) ( 136 272 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 96 304 -152 ) ( 96 280 -152 ) ( 96 280 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 152 328 -120 ) ( 144 328 -120 ) ( 144 328 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2528 +{ +( -88 488 -120 ) ( -88 552 -120 ) ( -88 552 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 96 328 -120 ) ( 88 328 -120 ) ( 88 328 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 16 272 -104 ) ( 80 272 -104 ) ( 80 272 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 48 336 -88 ) ( -56 336 -88 ) ( -56 320 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -56 320 -56 ) ( -56 336 -56 ) ( 48 336 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -64 320 -40 ) ( -64 336 -40 ) ( -64 320 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2529 +{ +( 192 328 -120 ) ( 184 328 -120 ) ( 184 328 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 144 304 -152 ) ( 144 280 -152 ) ( 144 280 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 272 -104 ) ( 176 272 -104 ) ( 176 272 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 144 336 -88 ) ( 40 336 -88 ) ( 40 320 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 320 -56 ) ( 40 336 -56 ) ( 144 336 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 128 336 -40 ) ( 128 320 -40 ) ( 128 336 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2530 +{ +( -88 488 -120 ) ( -88 552 -120 ) ( -88 552 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 152 328 -120 ) ( 144 328 -120 ) ( 144 328 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 304 -152 ) ( 136 280 -152 ) ( 136 280 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 272 -104 ) ( 136 272 -104 ) ( 136 272 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 176 -48 ) ( 136 240 -48 ) ( 200 240 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 0 336 -56 ) ( 0 320 -56 ) ( 104 336 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2531 +{ +( -88 488 -120 ) ( -88 552 -120 ) ( -88 552 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 152 328 -120 ) ( 144 328 -120 ) ( 144 328 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 304 -152 ) ( 136 280 -152 ) ( 136 280 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 272 -104 ) ( 136 272 -104 ) ( 136 272 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 200 240 -96 ) ( 136 240 -96 ) ( 136 176 -96 ) subway/con14 176 16 0 0.500000 0.500000 0 285212672 0 +( 0 336 -88 ) ( 104 336 -88 ) ( 0 320 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2532 +{ +( 104 336 -88 ) ( 0 336 -88 ) ( 0 320 -88 ) subway/1_tile_graf10 0 0 0 0.500000 0.500000 0 318767104 0 +( 0 320 -56 ) ( 0 336 -56 ) ( 104 336 -56 ) subway/1_tile_graf10 0 0 0 0.500000 0.500000 0 318767104 0 +( 0 272 -40 ) ( 104 272 -40 ) ( 104 272 -88 ) subway/1_tile_graf10 0 16 0 0.500000 0.500000 0 318767104 0 +( 64 320 -40 ) ( 64 336 -40 ) ( 64 336 -88 ) subway/1_tile_graf10 0 16 0 0.500000 0.500000 0 318767104 0 +( 104 328 -40 ) ( 0 328 -40 ) ( 0 328 -88 ) subway/1_tile_graf10 0 16 0 0.500000 0.500000 0 318767104 0 +( 0 336 -40 ) ( 0 320 -40 ) ( 0 320 -88 ) subway/1_tile_graf10 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2533 +{ +( 648 416 -48 ) ( 648 416 -120 ) ( 648 352 -120 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 624 328 -96 ) ( 624 328 -24 ) ( 616 328 -24 ) subway/1_tilegraf15 80 -72 0 -0.500000 0.500000 0 318767104 0 +( 616 288 -72 ) ( 616 152 -72 ) ( 616 152 -176 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 568 320 -48 ) ( 568 320 -120 ) ( 560 320 -120 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 616 280 -64 ) ( 680 280 -64 ) ( 680 216 -64 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 680 216 -104 ) ( 680 280 -104 ) ( 616 280 -104 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2534 +{ +( 616 416 -48 ) ( 616 416 -120 ) ( 616 352 -120 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 584 328 -96 ) ( 584 328 -24 ) ( 576 328 -24 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 520 296 -72 ) ( 520 160 -72 ) ( 520 160 -176 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 528 320 -48 ) ( 528 320 -120 ) ( 520 320 -120 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 576 280 -64 ) ( 640 280 -64 ) ( 640 216 -64 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 640 216 -104 ) ( 640 280 -104 ) ( 576 280 -104 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2535 +{ +( 640 216 -152 ) ( 640 280 -152 ) ( 576 280 -152 ) subway/1_tile -2480 -1264 0 0.500000 0.500000 0 318767104 0 +( 576 280 -120 ) ( 640 280 -120 ) ( 640 216 -120 ) subway/1_tile -2480 -1264 0 0.500000 0.500000 0 318767104 0 +( 528 320 -80 ) ( 528 320 -152 ) ( 520 320 -152 ) subway/1_tile -2480 -32 0 0.500000 0.500000 0 318767104 0 +( 520 296 -104 ) ( 520 160 -104 ) ( 520 160 -208 ) subway/1_tile -1392 -32 0 0.500000 0.500000 0 318767104 0 +( 648 328 -152 ) ( 648 328 -80 ) ( 640 328 -80 ) subway/1_tile -2480 -32 0 0.500000 0.500000 0 318767104 0 +( 568 320 -120 ) ( 568 344 -120 ) ( 568 320 -152 ) subway/1_tile -1392 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2536 +{ +( 640 216 -152 ) ( 640 280 -152 ) ( 576 280 -152 ) subway/1_tile -2480 -1264 0 0.500000 0.500000 0 318767104 0 +( 576 280 -120 ) ( 640 280 -120 ) ( 640 216 -120 ) subway/1_tile -2480 -1264 0 0.500000 0.500000 0 318767104 0 +( 528 320 -80 ) ( 528 320 -152 ) ( 520 320 -152 ) subway/1_tile -2480 -32 0 0.500000 0.500000 0 318767104 0 +( 648 328 -152 ) ( 648 328 -80 ) ( 640 328 -80 ) subway/1_tile -2480 -32 0 0.500000 0.500000 0 318767104 0 +( 680 416 -80 ) ( 680 416 -152 ) ( 680 352 -152 ) subway/1_tile -1392 -32 0 0.500000 0.500000 0 318767104 0 +( 600 344 -120 ) ( 600 320 -120 ) ( 600 344 -152 ) subway/1_tile -1392 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2537 +{ +( 640 344 -152 ) ( 568 344 -152 ) ( 568 320 -152 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +( 568 320 -120 ) ( 568 344 -120 ) ( 640 344 -120 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +( 568 320 -120 ) ( 640 320 -120 ) ( 640 320 -152 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 320 -120 ) ( 600 344 -120 ) ( 600 344 -152 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +( 640 328 -120 ) ( 568 328 -120 ) ( 568 328 -152 ) subway/1_tilegraf18 48 -56 0 -0.500000 0.500000 0 318767104 0 +( 568 344 -120 ) ( 568 320 -120 ) ( 568 320 -152 ) subway/1_tilegraf18 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2538 +{ +( 792 552 -104 ) ( 792 488 -104 ) ( 856 488 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 1128 -64 ) ( 784 1128 -104 ) ( 792 1128 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 792 208 40 ) ( 792 488 40 ) ( 792 488 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 968 -64 ) ( 784 968 -104 ) ( 784 1128 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 768 1024 -72 ) ( 768 1120 -72 ) ( 800 1120 -72 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 768 1088 -64 ) ( 800 1088 -64 ) ( 768 1088 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2539 +{ +( 792 552 -104 ) ( 792 488 -104 ) ( 856 488 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 792 208 40 ) ( 792 488 40 ) ( 792 488 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 968 -104 ) ( 784 968 -64 ) ( 792 960 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 968 -64 ) ( 784 968 -104 ) ( 784 1128 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 768 1024 -72 ) ( 768 1120 -72 ) ( 800 1120 -72 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 800 1024 -64 ) ( 768 1024 -64 ) ( 800 1024 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2540 +{ +( 856 488 -64 ) ( 792 488 -64 ) ( 792 552 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 1128 -64 ) ( 784 1128 -104 ) ( 792 1128 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 792 208 40 ) ( 792 488 40 ) ( 792 488 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 968 -104 ) ( 784 968 -64 ) ( 792 960 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 968 -64 ) ( 784 968 -104 ) ( 784 1128 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 768 1120 -72 ) ( 768 1024 -72 ) ( 800 1120 -72 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2541 +{ +( 800 1120 -104 ) ( 768 1120 -104 ) ( 768 1024 -104 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +( 768 1024 -72 ) ( 768 1120 -72 ) ( 800 1120 -72 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +( 768 1024 -64 ) ( 800 1024 -64 ) ( 800 1024 -104 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +( 792 1024 -64 ) ( 792 1120 -64 ) ( 792 1120 -104 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +( 800 1088 -64 ) ( 768 1088 -64 ) ( 768 1088 -104 ) subway/1_tilegraf20 0 0 0 0.500000 0.500000 0 318767104 0 +( 784 1048 -64 ) ( 784 952 -64 ) ( 784 952 -104 ) subway/1_tilegraf20 0 -80 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2542 +{ +( 784 1296 -104 ) ( 784 1296 -64 ) ( 784 1128 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 1128 -64 ) ( 784 1128 -56 ) ( 848 1128 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 792 472 40 ) ( 792 752 40 ) ( 792 752 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 1384 -64 ) ( 784 1384 -104 ) ( 792 1392 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 856 656 -64 ) ( 792 656 -64 ) ( 792 720 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 792 720 -104 ) ( 792 656 -104 ) ( 856 656 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2543 +{ +( 360 720 -184 ) ( 296 720 -184 ) ( 296 656 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 296 656 -152 ) ( 296 720 -152 ) ( 360 720 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -40 744 -152 ) ( -40 744 -184 ) ( -40 736 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 136 744 -152 ) ( 136 744 -184 ) ( -64 744 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -64 696 -152 ) ( -64 696 -136 ) ( -64 688 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 200 752 -184 ) ( 200 752 -152 ) ( -120 752 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2544 +{ +( 256 752 -184 ) ( 256 752 -152 ) ( -64 752 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -8 696 -152 ) ( -8 696 -136 ) ( -8 688 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 312 744 -152 ) ( 312 744 -184 ) ( 112 744 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 136 744 -152 ) ( 136 744 -184 ) ( 136 736 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 352 656 -152 ) ( 352 720 -152 ) ( 416 720 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 416 720 -184 ) ( 352 720 -184 ) ( 352 656 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2545 +{ +( 168 752 -184 ) ( 168 752 -152 ) ( -152 752 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -96 696 -152 ) ( -96 696 -136 ) ( -96 688 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 104 744 -152 ) ( 104 744 -184 ) ( -96 744 -184 ) subway/1_lobby1ab 0 16 0 0.500000 0.500000 0 285212672 0 +( -64 744 -152 ) ( -64 744 -184 ) ( -64 736 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 264 656 -152 ) ( 264 720 -152 ) ( 328 720 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 328 720 -184 ) ( 264 720 -184 ) ( 264 656 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2546 +{ +( 136 752 -184 ) ( 136 752 -152 ) ( -184 752 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -184 696 -152 ) ( -184 696 -136 ) ( -184 688 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 16 744 -152 ) ( 16 744 -184 ) ( -184 744 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -96 744 -152 ) ( -96 744 -184 ) ( -96 736 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 176 656 -152 ) ( 176 720 -152 ) ( 240 720 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 240 720 -184 ) ( 176 720 -184 ) ( 176 656 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2547 +{ +( 784 1176 -168 ) ( 752 1176 -168 ) ( 752 1160 -168 ) subway/file_side 0 48 0 0.700000 0.700000 134217728 0 0 +( 752 1160 -124 ) ( 752 1176 -124 ) ( 784 1176 -124 ) subway/file_side 8 60 90 0.700000 0.700000 134217728 0 0 +( 752 1136 -112 ) ( 784 1136 -112 ) ( 784 1136 -144 ) subway/file_side 0 48 0 0.700000 0.700000 134217728 0 0 +( 784 1164 -112 ) ( 784 1180 -112 ) ( 784 1180 -144 ) subway/file_side 0 48 0 0.700000 0.700000 134217728 0 0 +( 784 1184 -112 ) ( 752 1184 -112 ) ( 752 1184 -144 ) subway/file_side 0 48 0 0.700000 0.700000 134217728 0 0 +( 768 1160 -112 ) ( 768 1144 -112 ) ( 768 1144 -144 ) subway/file_front 8 16 0 0.700000 0.700000 134217728 0 0 +} +// brush 2548 +{ +( 400 784 -112 ) ( 392 784 -112 ) ( 400 784 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 864 -120 ) ( 392 896 -120 ) ( 400 896 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 920 -80 ) ( 400 920 -152 ) ( 400 856 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 768 -48 ) ( 392 632 -48 ) ( 392 632 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 12 +( 400 752 -80 ) ( 400 752 -152 ) ( 392 752 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 768 -152 ) ( 392 832 -152 ) ( 328 832 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2549 +{ +( 400 848 -120 ) ( 392 848 -120 ) ( 400 848 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 896 -120 ) ( 392 928 -120 ) ( 400 928 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1032 -80 ) ( 400 1032 -152 ) ( 400 968 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 800 -48 ) ( 392 664 -48 ) ( 392 664 -152 ) subway/1_tilegraf19 32 24 0 -0.500000 0.500000 0 318767104 12 +( 400 784 -80 ) ( 400 784 -152 ) ( 392 784 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 800 -152 ) ( 392 864 -152 ) ( 328 864 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2550 +{ +( 232 824 -120 ) ( 232 768 -120 ) ( 240 824 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 760 -80 ) ( 232 824 -80 ) ( 296 824 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 240 896 -152 ) ( 232 896 -152 ) ( 232 896 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 600 -152 ) ( 232 600 -48 ) ( 232 736 -48 ) subway/1_tilegraf15 0 24 0 0.500000 0.500000 0 318767104 11 +( 224 928 -80 ) ( 224 928 -120 ) ( 232 928 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 928 -120 ) ( 224 928 -80 ) ( 224 888 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2551 +{ +( 232 864 -120 ) ( 232 808 -120 ) ( 240 864 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 800 -80 ) ( 232 864 -80 ) ( 296 864 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 240 928 -152 ) ( 232 928 -152 ) ( 232 928 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 632 -152 ) ( 232 632 -48 ) ( 232 768 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 11 +( 232 968 -80 ) ( 224 960 -80 ) ( 224 960 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 792 -152 ) ( 224 944 -152 ) ( 224 944 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2552 +{ +( 240 1240 -64 ) ( 232 1240 -64 ) ( 240 1240 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1256 -104 ) ( 232 1344 -104 ) ( 240 1344 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 240 1344 -136 ) ( 232 1344 -136 ) ( 232 1256 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1288 -48 ) ( 232 1424 -48 ) ( 232 1424 -152 ) subway/1_tilegraf18 16 -16 0 0.500000 0.500000 0 318767104 10 +( 224 1208 -136 ) ( 224 1208 -104 ) ( 232 1208 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1192 -104 ) ( 224 1192 -136 ) ( 224 1208 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2553 +{ +( 240 1208 -64 ) ( 232 1208 -64 ) ( 240 1208 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1256 -104 ) ( 232 1344 -104 ) ( 240 1344 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 240 1344 -136 ) ( 232 1344 -136 ) ( 232 1256 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1256 -48 ) ( 232 1392 -48 ) ( 232 1392 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 224 1200 -152 ) ( 224 1200 -80 ) ( 232 1192 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1192 -80 ) ( 224 1192 -152 ) ( 224 1344 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2554 +{ +( 224 1192 -80 ) ( 224 1192 -152 ) ( 224 1344 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1256 -48 ) ( 232 1392 -48 ) ( 232 1392 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 224 1344 -80 ) ( 224 1344 -152 ) ( 232 1344 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 240 1344 -136 ) ( 232 1344 -136 ) ( 232 1256 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1256 -104 ) ( 232 1344 -104 ) ( 240 1344 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1320 -64 ) ( 240 1320 -64 ) ( 232 1320 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2555 +{ +( 224 1208 -104 ) ( 224 1208 -136 ) ( 224 1224 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1240 -136 ) ( 224 1240 -104 ) ( 232 1240 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1304 -48 ) ( 232 1440 -48 ) ( 232 1440 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 240 1360 -136 ) ( 232 1360 -136 ) ( 232 1272 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1272 -104 ) ( 232 1360 -104 ) ( 240 1360 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 240 1256 -64 ) ( 232 1256 -64 ) ( 240 1256 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2556 +{ +( 224 1192 -80 ) ( 224 1192 -152 ) ( 224 1344 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1200 -152 ) ( 224 1200 -80 ) ( 232 1192 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1256 -48 ) ( 232 1392 -48 ) ( 232 1392 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 224 1344 -80 ) ( 224 1344 -152 ) ( 232 1344 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 296 1296 -80 ) ( 232 1296 -80 ) ( 232 1360 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1344 -104 ) ( 232 1256 -104 ) ( 240 1344 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2557 +{ +( 224 1192 -80 ) ( 224 1192 -152 ) ( 224 1344 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1200 -152 ) ( 224 1200 -80 ) ( 232 1192 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1256 -48 ) ( 232 1392 -48 ) ( 232 1392 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 224 1344 -80 ) ( 224 1344 -152 ) ( 232 1344 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1360 -152 ) ( 232 1296 -152 ) ( 296 1296 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1344 -136 ) ( 240 1344 -136 ) ( 232 1256 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2558 +{ +( 240 1344 -136 ) ( 232 1344 -136 ) ( 232 1256 -136 ) subway/1_tilegraf20 0 48 0 0.500000 0.500000 0 318767104 0 +( 232 1256 -104 ) ( 232 1344 -104 ) ( 240 1344 -104 ) subway/1_tilegraf20 0 48 0 0.500000 0.500000 0 318767104 0 +( 232 1256 -64 ) ( 240 1256 -64 ) ( 240 1256 -136 ) subway/1_tilegraf20 0 32 0 0.500000 0.500000 0 318767104 0 +( 232 1256 -64 ) ( 232 1344 -64 ) ( 232 1344 -136 ) subway/1_tilegraf20 -80 48 0 0.500000 0.500000 0 318767104 10 +( 240 1320 -64 ) ( 232 1320 -64 ) ( 232 1320 -136 ) subway/1_tilegraf20 0 32 0 0.500000 0.500000 0 318767104 0 +( 224 1344 -64 ) ( 224 1256 -64 ) ( 224 1256 -136 ) subway/1_tilegraf20 -48 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2559 +{ +( -320 1528 -168 ) ( -320 1528 -160 ) ( -320 1464 -160 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -312 1224 -168 ) ( -312 1224 -160 ) ( -312 1288 -160 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -312 1528 -112 ) ( -320 1528 -112 ) ( -320 1528 -168 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -320 1528 -112 ) ( -312 1528 -112 ) ( -312 1384 -160 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -312 1424 -136 ) ( -320 1424 -136 ) ( -320 1384 -136 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2560 +{ +( -320 1528 -168 ) ( -320 1528 -160 ) ( -320 1464 -160 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -248 1384 -168 ) ( -248 1384 -160 ) ( -184 1384 -160 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -312 1224 -168 ) ( -312 1224 -160 ) ( -312 1288 -160 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -312 1528 -112 ) ( -320 1528 -112 ) ( -320 1528 -168 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -320 1528 -112 ) ( -312 1528 -112 ) ( -312 1384 -160 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -312 1408 -168 ) ( -312 1344 -168 ) ( -248 1344 -168 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -320 1424 -136 ) ( -312 1424 -136 ) ( -320 1384 -136 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2561 +{ +( -312 1392 -128 ) ( -312 1392 -120 ) ( -312 1328 -120 ) subway/1_tile 0 0 0 -0.500000 0.500000 0 318767104 0 +( -304 1312 -8 ) ( -304 1592 -8 ) ( -304 1592 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -312 1528 -240 ) ( -304 1520 -240 ) ( -304 1520 -24 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -312 1424 -136 ) ( -320 1424 -136 ) ( -320 1384 -136 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -320 1384 -104 ) ( -320 1424 -104 ) ( -312 1424 -104 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -320 1416 -104 ) ( -312 1416 -104 ) ( -320 1416 -184 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2562 +{ +( -312 1392 -128 ) ( -312 1392 -120 ) ( -312 1328 -120 ) subway/1_tile 0 0 0 -0.500000 0.500000 0 318767104 0 +( -304 1376 -112 ) ( -304 1376 -104 ) ( -240 1376 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( -304 1312 -8 ) ( -304 1592 -8 ) ( -304 1592 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -312 1424 -136 ) ( -320 1424 -136 ) ( -320 1384 -136 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -320 1384 -104 ) ( -320 1424 -104 ) ( -312 1424 -104 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -312 1384 -104 ) ( -320 1384 -104 ) ( -312 1384 -184 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2563 +{ +( -312 1392 -128 ) ( -312 1392 -120 ) ( -312 1328 -120 ) subway/1_tile 0 0 0 -0.500000 0.500000 0 318767104 0 +( -304 1376 -112 ) ( -304 1376 -104 ) ( -240 1376 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( -304 1312 -8 ) ( -304 1592 -8 ) ( -304 1592 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -312 1528 -240 ) ( -304 1520 -240 ) ( -304 1520 -24 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -320 1472 -72 ) ( -304 1472 -72 ) ( -320 1440 -72 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -320 1424 -104 ) ( -320 1384 -104 ) ( -312 1424 -104 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2564 +{ +( -312 1392 -128 ) ( -312 1392 -120 ) ( -312 1328 -120 ) subway/1_tile 0 0 0 -0.500000 0.500000 0 318767104 0 +( -304 1376 -112 ) ( -304 1376 -104 ) ( -240 1376 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( -304 1312 -8 ) ( -304 1592 -8 ) ( -304 1592 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -312 1528 -240 ) ( -304 1520 -240 ) ( -304 1520 -24 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -304 1504 -152 ) ( -304 1440 -152 ) ( -240 1440 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -320 1424 -136 ) ( -312 1424 -136 ) ( -320 1384 -136 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2565 +{ +( -312 1424 -136 ) ( -320 1424 -136 ) ( -320 1384 -136 ) subway/1_tilegraf16 0 0 0 0.500000 0.500000 0 318767104 0 +( -320 1384 -104 ) ( -320 1424 -104 ) ( -312 1424 -104 ) subway/1_tilegraf16 0 0 0 0.500000 0.500000 0 318767104 0 +( -320 1384 -104 ) ( -312 1384 -104 ) ( -312 1384 -184 ) subway/1_tilegraf16 0 -64 0 0.500000 0.500000 0 318767104 0 +( -304 1376 -104 ) ( -304 1416 -104 ) ( -304 1416 -184 ) subway/1_tilegraf16 0 -64 0 0.500000 0.500000 0 318767104 0 +( -312 1416 -104 ) ( -320 1416 -104 ) ( -320 1416 -184 ) subway/1_tilegraf16 0 -64 0 0.500000 0.500000 0 318767104 0 +( -312 1424 -104 ) ( -312 1384 -104 ) ( -312 1384 -184 ) subway/1_tilegraf16 8 -24 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2566 +{ +( 528 512 -48 ) ( 544 512 -48 ) ( 544 504 -48 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 544 504 -168 ) ( 544 512 -168 ) ( 528 512 -168 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 528 504 -120 ) ( 536 512 -120 ) ( 536 512 -152 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 528 512 -40 ) ( 528 504 -40 ) ( 528 504 -72 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 528 512 -176 ) ( 536 512 -176 ) ( 536 512 -144 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2567 +{ +( 1920 2016 -280 ) ( 1912 2016 -280 ) ( 1912 2024 -280 ) subway/clip 32 0 0 0.500000 0.500000 196608 128 0 +( 1912 2024 -432 ) ( 1912 2016 -432 ) ( 1920 2016 -432 ) subway/clip 32 0 0 0.500000 0.500000 196608 128 0 +( 1912 2024 -400 ) ( 1912 2016 -400 ) ( 1912 2016 -416 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 1920 2024 -400 ) ( 1912 2024 -400 ) ( 1912 2024 -416 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 1912 2016 -400 ) ( 1920 2024 -400 ) ( 1920 2024 -416 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +} +// brush 2568 +{ +( 2032 2024 -416 ) ( 2032 2024 -400 ) ( 2040 2016 -400 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 2040 2024 -416 ) ( 2040 2024 -400 ) ( 2032 2024 -400 ) subway/clip 32 16 0 0.500000 0.500000 196608 128 0 +( 2040 2016 -416 ) ( 2040 2016 -400 ) ( 2040 2024 -400 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 2032 2016 -432 ) ( 2040 2016 -432 ) ( 2040 2024 -432 ) subway/clip 32 0 0 0.500000 0.500000 196608 128 0 +( 2040 2024 -280 ) ( 2040 2016 -280 ) ( 2032 2016 -280 ) subway/clip 32 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2569 +{ +( -88 -1264 -328 ) ( -56 -1264 -328 ) ( -56 -1224 -328 ) subway/1_tile_bottom 320 -592 0 0.500000 0.500000 0 318767104 0 +( -64 -1216 -312 ) ( -64 -1256 -312 ) ( -96 -1256 -312 ) subway/1_tile_bottom 320 -592 0 0.500000 0.500000 0 318767104 0 +( -64 -1176 -272 ) ( -96 -1176 -272 ) ( -96 -1176 -312 ) subway/1_tile_bottom 320 -272 0 0.500000 0.500000 0 318767104 0 +( -96 -1136 -272 ) ( -96 -1176 -272 ) ( -96 -1176 -312 ) subway/1_tile_bottom 544 -272 0 0.500000 0.500000 0 318767104 0 +( -88 -1216 -272 ) ( -56 -1216 -272 ) ( -56 -1216 -312 ) subway/1_tile_bottom 320 -272 0 0.500000 0.500000 0 318767104 0 +( -56 -1256 -272 ) ( -56 -1216 -272 ) ( -56 -1216 -312 ) subway/1_tile_bottom 544 -272 0 0.500000 0.500000 0 318767104 0 +} +// brush 2570 +{ +( -96 -1264 -312 ) ( -64 -1264 -312 ) ( -64 -1224 -312 ) subway/1_tile 320 -544 0 0.500000 0.500000 0 318767104 0 +( -64 -1216 -272 ) ( -64 -1256 -272 ) ( -96 -1256 -272 ) subway/1_tile 320 -544 0 0.500000 0.500000 0 318767104 0 +( -64 -1176 -256 ) ( -96 -1176 -256 ) ( -96 -1176 -296 ) subway/1_tile 320 -224 0 0.500000 0.500000 0 318767104 0 +( -96 -1136 -248 ) ( -96 -1176 -248 ) ( -96 -1176 -288 ) subway/1_tile 544 -224 0 0.500000 0.500000 0 318767104 0 +( -88 -1216 -256 ) ( -56 -1216 -256 ) ( -56 -1216 -296 ) subway/1_tile 320 -224 0 0.500000 0.500000 0 318767104 0 +( -56 -1256 -232 ) ( -56 -1216 -232 ) ( -56 -1216 -272 ) subway/1_tile 544 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2571 +{ +( 104 -1216 -272 ) ( 104 -1216 -232 ) ( 104 -1256 -232 ) subway/1_tile 544 -224 0 0.500000 0.500000 0 318767104 0 +( 104 -1216 -296 ) ( 104 -1216 -256 ) ( 136 -1216 -256 ) subway/1_tile 0 -224 0 0.500000 0.500000 0 318767104 0 +( 136 -1176 -288 ) ( 136 -1176 -248 ) ( 136 -1136 -248 ) subway/1_tile 544 -224 0 0.500000 0.500000 0 318767104 0 +( 136 -1176 -296 ) ( 136 -1176 -256 ) ( 104 -1176 -256 ) subway/1_tile 0 -224 0 0.500000 0.500000 0 318767104 0 +( 144 -1256 -272 ) ( 112 -1256 -272 ) ( 112 -1216 -272 ) subway/1_tile 0 -544 0 0.500000 0.500000 0 318767104 0 +( 104 -1224 -312 ) ( 104 -1264 -312 ) ( 136 -1264 -312 ) subway/1_tile 0 -544 0 0.500000 0.500000 0 318767104 0 +} +// brush 2572 +{ +( -48 -952 -240 ) ( -48 -952 -184 ) ( -56 -944 -184 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( -56 -952 -240 ) ( -56 -952 -184 ) ( -48 -952 -184 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( -56 -944 -240 ) ( -56 -944 -184 ) ( -56 -952 -184 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( -48 -944 -256 ) ( -56 -944 -256 ) ( -56 -952 -256 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( -56 -952 -168 ) ( -56 -944 -168 ) ( -48 -944 -168 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2573 +{ +( 96 -944 -168 ) ( 104 -944 -168 ) ( 104 -952 -168 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 104 -952 -256 ) ( 104 -944 -256 ) ( 96 -944 -256 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 104 -952 -184 ) ( 104 -944 -184 ) ( 104 -944 -240 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 96 -952 -184 ) ( 104 -952 -184 ) ( 104 -952 -240 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 104 -944 -184 ) ( 96 -952 -184 ) ( 96 -952 -240 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2574 +{ +( 576 144 -120 ) ( 584 144 -120 ) ( 584 136 -120 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 584 136 -216 ) ( 584 144 -216 ) ( 576 144 -216 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 584 136 -176 ) ( 584 144 -176 ) ( 584 144 -200 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 576 136 -176 ) ( 584 136 -176 ) ( 584 136 -200 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 584 144 -176 ) ( 576 136 -176 ) ( 576 136 -200 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2575 +{ +( 136 136 -120 ) ( 136 144 -120 ) ( 144 144 -120 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 144 144 -216 ) ( 136 144 -216 ) ( 136 136 -216 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 136 144 -200 ) ( 136 144 -176 ) ( 136 136 -176 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 136 136 -200 ) ( 136 136 -176 ) ( 144 136 -176 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 144 136 -200 ) ( 144 136 -176 ) ( 136 144 -176 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2576 +{ +( 576 296 -200 ) ( 576 296 -176 ) ( 584 288 -176 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 584 296 -200 ) ( 584 296 -176 ) ( 576 296 -176 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 584 288 -200 ) ( 584 288 -176 ) ( 584 296 -176 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 576 288 -216 ) ( 584 288 -216 ) ( 584 296 -216 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 584 296 -120 ) ( 584 288 -120 ) ( 576 288 -120 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2577 +{ +( 536 368 -144 ) ( 536 368 -176 ) ( 528 368 -176 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 528 376 -72 ) ( 528 376 -40 ) ( 528 368 -40 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 536 368 -152 ) ( 536 368 -120 ) ( 528 376 -120 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 528 368 -168 ) ( 544 368 -168 ) ( 544 376 -168 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 544 376 -48 ) ( 544 368 -48 ) ( 528 368 -48 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2578 +{ +( 536 552 -144 ) ( 536 552 -176 ) ( 528 552 -176 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 528 560 -72 ) ( 528 560 -40 ) ( 528 552 -40 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 536 552 -152 ) ( 536 552 -120 ) ( 528 560 -120 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 528 552 -168 ) ( 544 552 -168 ) ( 544 560 -168 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 544 560 -48 ) ( 544 552 -48 ) ( 528 552 -48 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2579 +{ +( 688 552 -176 ) ( 680 552 -176 ) ( 680 552 -144 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 688 552 -40 ) ( 688 560 -40 ) ( 688 560 -72 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 688 560 -120 ) ( 680 552 -120 ) ( 680 552 -152 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 672 560 -168 ) ( 672 552 -168 ) ( 688 552 -168 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 688 552 -48 ) ( 672 552 -48 ) ( 672 560 -48 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2580 +{ +( 408 1128 -48 ) ( 408 1112 -48 ) ( 400 1112 -48 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 400 1112 -168 ) ( 408 1112 -168 ) ( 408 1128 -168 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 408 1128 -152 ) ( 408 1128 -120 ) ( 400 1128 -120 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 400 1128 -152 ) ( 400 1128 -120 ) ( 400 1120 -120 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 408 1128 -120 ) ( 408 1128 -152 ) ( 400 1120 -152 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2581 +{ +( 400 976 -152 ) ( 408 968 -152 ) ( 408 968 -120 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 400 976 -120 ) ( 400 968 -120 ) ( 400 968 -152 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 400 968 -120 ) ( 408 968 -120 ) ( 408 968 -152 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 408 968 -168 ) ( 408 984 -168 ) ( 400 984 -168 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 400 984 -48 ) ( 408 984 -48 ) ( 408 968 -48 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 2582 +{ +( -496 1360 32 ) ( -536 1360 32 ) ( -496 1360 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -536 1336 0 ) ( -536 1424 0 ) ( -496 1424 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 -32 ) ( -504 1528 -32 ) ( -504 1168 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -416 936 8 ) ( -352 936 8 ) ( -352 936 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 104 ) ( -496 1520 -32 ) ( -496 1168 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -504 1288 -32 ) ( -504 1288 -16 ) ( -504 936 -16 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2583 +{ +( -504 1424 32 ) ( -504 1336 32 ) ( -504 1336 -32 ) subway/1_tile_graf10 32 0 0 -0.500000 0.500000 0 318767104 0 +( -496 1424 32 ) ( -536 1424 32 ) ( -536 1424 -32 ) subway/1_tile_graf10 32 0 0 -0.500000 0.500000 0 318767104 0 +( -496 1336 32 ) ( -496 1424 32 ) ( -496 1424 -32 ) subway/1_tile_graf10 32 0 0 -0.500000 0.500000 0 318767104 0 +( -536 1360 32 ) ( -496 1360 32 ) ( -496 1360 -32 ) subway/1_tile_graf10 32 0 0 -0.500000 0.500000 0 318767104 0 +( -536 1336 0 ) ( -536 1424 0 ) ( -496 1424 0 ) subway/1_tile_graf10 32 0 0 -0.500000 0.500000 0 318767104 0 +( -496 1424 -32 ) ( -536 1424 -32 ) ( -536 1336 -32 ) subway/1_tile_graf10 32 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2584 +{ +( -496 1528 0 ) ( -632 1528 0 ) ( -632 1520 0 ) subway/1_concrete_floor2 32 0 0 0.500000 0.500000 0 285212672 0 +( -632 1520 16 ) ( -632 1528 16 ) ( -496 1528 16 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -640 1520 8 ) ( -504 1520 8 ) ( -504 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -504 1520 32 ) ( -504 1528 32 ) ( -504 1528 24 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1528 32 ) ( -632 1528 32 ) ( -632 1528 24 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1528 8 ) ( -632 1520 8 ) ( -632 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2585 +{ +( -432 944 24 ) ( -432 944 40 ) ( -784 944 40 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -496 944 -8 ) ( -496 944 -24 ) ( -496 936 -24 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -584 936 112 ) ( -584 936 -24 ) ( -936 936 -24 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -784 856 16 ) ( -784 792 16 ) ( -784 792 8 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -496 936 32 ) ( -432 936 32 ) ( -432 872 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -432 936 16 ) ( -424 944 16 ) ( -784 944 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2586 +{ +( -736 1150 128 ) ( -736 1126 128 ) ( -736 1126 120 ) subway/1_black 4 0 0 0.500000 0.500000 134217728 16777216 0 +( -712 1142 128 ) ( -736 1142 128 ) ( -736 1142 120 ) subway/1_black 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -720 1126 128 ) ( -720 1150 128 ) ( -720 1150 120 ) subway/1_black 4 0 0 0.500000 0.500000 134217728 16777216 0 +( -736 1126 128 ) ( -712 1126 128 ) ( -712 1126 120 ) subway/1_black 16 0 0 0.500000 0.500000 134217728 16777216 0 +( -736 1126 128 ) ( -736 1150 128 ) ( -712 1150 128 ) subway/1_black 16 -4 0 0.500000 0.500000 134217728 16777216 0 +( -712 1150 124 ) ( -736 1150 124 ) ( -736 1126 124 ) subway/light_yellow 32 12 0 0.500000 0.500000 134217728 16777217 12000 +} +// brush 2587 +{ +( 340 1200 -132 ) ( 340 1224 -132 ) ( 316 1224 -132 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 316 1224 -128 ) ( 340 1224 -128 ) ( 340 1200 -128 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 672 1128 -76 ) ( 672 1128 -132 ) ( 672 1136 -132 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 484 1128 -132 ) ( 484 1128 -76 ) ( 724 1128 -76 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 724 1136 -76 ) ( 724 1136 -132 ) ( 724 1128 -132 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 932 1136 -132 ) ( 932 1136 -76 ) ( 676 1136 -76 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2588 +{ +( 884 1136 -128 ) ( 884 1136 -72 ) ( 628 1136 -72 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 676 1136 -72 ) ( 676 1136 -128 ) ( 676 1128 -128 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 484 1128 -128 ) ( 484 1128 -72 ) ( 724 1128 -72 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 672 1128 -72 ) ( 672 1128 -128 ) ( 672 1136 -128 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 316 1224 -88 ) ( 340 1224 -88 ) ( 340 1200 -88 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 340 1200 -128 ) ( 340 1224 -128 ) ( 316 1224 -128 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2589 +{ +( 932 1136 -88 ) ( 932 1136 -32 ) ( 676 1136 -32 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 724 1136 -32 ) ( 724 1136 -88 ) ( 724 1128 -88 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 484 1128 -88 ) ( 484 1128 -32 ) ( 724 1128 -32 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 672 1128 -32 ) ( 672 1128 -88 ) ( 672 1136 -88 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 316 1224 -84 ) ( 340 1224 -84 ) ( 340 1200 -84 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 340 1200 -88 ) ( 340 1224 -88 ) ( 316 1224 -88 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2590 +{ +( 392 1200 -132 ) ( 392 1224 -132 ) ( 368 1224 -132 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 368 1224 -84 ) ( 392 1224 -84 ) ( 392 1200 -84 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 724 1128 -72 ) ( 724 1128 -128 ) ( 724 1136 -128 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 536 1128 -128 ) ( 536 1128 -72 ) ( 776 1128 -72 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 728 1136 -72 ) ( 728 1136 -128 ) ( 728 1128 -128 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 936 1136 -128 ) ( 936 1136 -72 ) ( 680 1136 -72 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2591 +{ +( 724 1136 -132 ) ( 724 1136 -76 ) ( 468 1136 -76 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 516 1136 -76 ) ( 516 1136 -132 ) ( 516 1128 -132 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 276 1128 -132 ) ( 276 1128 -76 ) ( 516 1128 -76 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 464 1128 -76 ) ( 464 1128 -132 ) ( 464 1136 -132 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 108 1224 -128 ) ( 132 1224 -128 ) ( 132 1200 -128 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 132 1200 -132 ) ( 132 1224 -132 ) ( 108 1224 -132 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2592 +{ +( 132 1200 -128 ) ( 132 1224 -128 ) ( 108 1224 -128 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 108 1224 -88 ) ( 132 1224 -88 ) ( 132 1200 -88 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 464 1128 -72 ) ( 464 1128 -128 ) ( 464 1136 -128 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 276 1128 -128 ) ( 276 1128 -72 ) ( 516 1128 -72 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 468 1136 -72 ) ( 468 1136 -128 ) ( 468 1128 -128 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 676 1136 -128 ) ( 676 1136 -72 ) ( 420 1136 -72 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2593 +{ +( 132 1200 -88 ) ( 132 1224 -88 ) ( 108 1224 -88 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 108 1224 -84 ) ( 132 1224 -84 ) ( 132 1200 -84 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 464 1128 -32 ) ( 464 1128 -88 ) ( 464 1136 -88 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 276 1128 -88 ) ( 276 1128 -32 ) ( 516 1128 -32 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 516 1136 -32 ) ( 516 1136 -88 ) ( 516 1128 -88 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 724 1136 -88 ) ( 724 1136 -32 ) ( 468 1136 -32 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2594 +{ +( 728 1136 -128 ) ( 728 1136 -72 ) ( 472 1136 -72 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 520 1136 -72 ) ( 520 1136 -128 ) ( 520 1128 -128 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 328 1128 -128 ) ( 328 1128 -72 ) ( 568 1128 -72 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 516 1128 -72 ) ( 516 1128 -128 ) ( 516 1136 -128 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 160 1224 -84 ) ( 184 1224 -84 ) ( 184 1200 -84 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 184 1200 -132 ) ( 184 1224 -132 ) ( 160 1224 -132 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2595 +{ +( 500 1120 -48 ) ( 500 1128 -48 ) ( 500 1128 -64 ) subway/metal_clean 16 0 0 0.500000 0.500000 134217728 16777216 0 +( 480 1124 -48 ) ( 496 1124 -48 ) ( 496 1124 -64 ) subway/light_yellow 56 0 0 0.500000 0.500000 134217728 16777217 20000 +( 484 1128 -48 ) ( 484 1120 -48 ) ( 484 1120 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 496 1128 -48 ) ( 480 1128 -48 ) ( 480 1128 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 500 1128 -48 ) ( 500 1120 -48 ) ( 484 1120 -48 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 484 1120 -64 ) ( 500 1120 -64 ) ( 500 1128 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2596 +{ +( 680 1296 -24 ) ( 680 1280 -24 ) ( 680 1280 -40 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 696 1296 -24 ) ( 680 1296 -24 ) ( 680 1296 -40 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( 696 1280 -24 ) ( 696 1296 -24 ) ( 696 1296 -40 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 680 1280 -24 ) ( 696 1280 -24 ) ( 696 1280 -40 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( 680 1280 -32 ) ( 680 1296 -32 ) ( 696 1296 -32 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( 696 1296 -36 ) ( 680 1296 -36 ) ( 680 1280 -36 ) subway/light_yellow -304 0 0 0.500000 0.500000 134217728 16777217 10000 +} +// brush 2597 +{ +( 536 1296 -36 ) ( 520 1296 -36 ) ( 520 1280 -36 ) subway/light_yellow 16 -128 0 0.500000 0.500000 134217728 16777217 0 +( 520 1280 -32 ) ( 520 1296 -32 ) ( 536 1296 -32 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 520 1280 -24 ) ( 536 1280 -24 ) ( 536 1280 -40 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 536 1280 -24 ) ( 536 1296 -24 ) ( 536 1296 -40 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 536 1296 -24 ) ( 520 1296 -24 ) ( 520 1296 -40 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 520 1296 -24 ) ( 520 1280 -24 ) ( 520 1280 -40 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2598 +{ +( 520 1232 -24 ) ( 520 1216 -24 ) ( 520 1216 -40 ) subway/1_black 128 0 0 0.500000 0.500000 134217728 16777216 0 +( 536 1232 -24 ) ( 520 1232 -24 ) ( 520 1232 -40 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 536 1216 -24 ) ( 536 1232 -24 ) ( 536 1232 -40 ) subway/1_black 128 0 0 0.500000 0.500000 134217728 16777216 0 +( 520 1216 -24 ) ( 536 1216 -24 ) ( 536 1216 -40 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 520 1216 -32 ) ( 520 1232 -32 ) ( 536 1232 -32 ) subway/1_black 0 -128 0 0.500000 0.500000 134217728 16777216 0 +( 536 1232 -36 ) ( 520 1232 -36 ) ( 520 1216 -36 ) subway/light_yellow 16 -128 0 0.500000 0.500000 134217728 16777217 0 +} +// brush 2599 +{ +( 696 1232 -36 ) ( 680 1232 -36 ) ( 680 1216 -36 ) subway/light_yellow -304 -128 0 0.500000 0.500000 134217728 16777217 10000 +( 680 1216 -32 ) ( 680 1232 -32 ) ( 696 1232 -32 ) subway/1_black -320 -128 0 0.500000 0.500000 134217728 16777216 0 +( 680 1216 -24 ) ( 696 1216 -24 ) ( 696 1216 -40 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( 696 1216 -24 ) ( 696 1232 -24 ) ( 696 1232 -40 ) subway/1_black 128 0 0 0.500000 0.500000 134217728 16777216 0 +( 696 1232 -24 ) ( 680 1232 -24 ) ( 680 1232 -40 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( 680 1232 -24 ) ( 680 1216 -24 ) ( 680 1216 -40 ) subway/1_black 128 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2600 +{ +( 432 1344 -48 ) ( 432 1268 -48 ) ( 432 1268 -64 ) subway/metal_clean -256 0 0 0.500000 0.500000 134217728 16777216 0 +( 460 1348 -48 ) ( 432 1348 -48 ) ( 432 1348 -64 ) subway/stair_side -256 0 0 0.500000 0.500000 0 285212672 0 +( 464 1268 -48 ) ( 464 1344 -48 ) ( 464 1344 -64 ) subway/stair_side -256 0 0 0.500000 0.500000 0 285212672 0 +( 432 1264 -48 ) ( 460 1264 -48 ) ( 460 1264 -64 ) subway/stair_side -256 0 0 0.500000 0.500000 0 285212672 0 +( 432 1268 -60 ) ( 432 1344 -60 ) ( 460 1344 -60 ) subway/metal_clean -256 0 0 0.500000 0.500000 134217728 16777216 0 +( 460 1344 -64 ) ( 432 1344 -64 ) ( 432 1268 -64 ) subway/metal_clean -256 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2601 +{ +( 500 1380 -64 ) ( 472 1380 -64 ) ( 472 1304 -64 ) subway/metal_clean -256 0 0 0.500000 0.500000 134217728 16777216 0 +( 472 1304 -60 ) ( 472 1380 -60 ) ( 500 1380 -60 ) subway/metal_clean -256 0 0 0.500000 0.500000 134217728 16777216 0 +( 472 1352 -48 ) ( 500 1352 -48 ) ( 500 1352 -64 ) subway/stair_side -256 0 0 0.500000 0.500000 0 285212672 0 +( 540 1304 -48 ) ( 540 1380 -48 ) ( 540 1380 -64 ) subway/stair_side -256 0 0 0.500000 0.500000 0 285212672 0 +( 500 1384 -48 ) ( 472 1384 -48 ) ( 472 1384 -64 ) subway/stair_side -256 0 0 0.500000 0.500000 0 285212672 0 +( 472 1380 -48 ) ( 472 1304 -48 ) ( 472 1304 -64 ) subway/metal_clean -256 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2602 +{ +( 432 1380 -104 ) ( 432 1356 -104 ) ( 432 1356 -168 ) subway/stair_side 0 0 0 0.500000 0.500000 0 285212672 0 +( 536 1384 -104 ) ( 428 1384 -104 ) ( 428 1384 -168 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 592 1364 -104 ) ( 592 1388 -104 ) ( 592 1388 -168 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 428 1352 -104 ) ( 536 1352 -104 ) ( 536 1352 -168 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 428 1356 -136 ) ( 428 1380 -136 ) ( 536 1380 -136 ) subway/con5 0 0 0 0.500000 0.500000 0 285212672 0 +( 536 1380 -144 ) ( 428 1380 -144 ) ( 428 1356 -144 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2603 +{ +( 536 1380 -168 ) ( 428 1380 -168 ) ( 428 1356 -168 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +( 428 1356 -144 ) ( 428 1380 -144 ) ( 536 1380 -144 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +( 428 1360 -112 ) ( 536 1360 -112 ) ( 536 1360 -176 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +( 592 1364 -112 ) ( 592 1388 -112 ) ( 592 1388 -176 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +( 536 1384 -112 ) ( 428 1384 -112 ) ( 428 1384 -176 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +( 432 1380 -112 ) ( 432 1356 -112 ) ( 432 1356 -176 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 2604 +{ +( 680 1380 -104 ) ( 680 1356 -104 ) ( 680 1356 -168 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 784 1384 -104 ) ( 676 1384 -104 ) ( 676 1384 -168 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 784 1356 -104 ) ( 784 1380 -104 ) ( 784 1380 -168 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 676 1352 -104 ) ( 784 1352 -104 ) ( 784 1352 -168 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 676 1356 -136 ) ( 676 1380 -136 ) ( 784 1380 -136 ) subway/con5 0 0 0 0.500000 0.500000 0 285212672 0 +( 784 1380 -144 ) ( 676 1380 -144 ) ( 676 1356 -144 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2605 +{ +( 784 1380 -168 ) ( 676 1380 -168 ) ( 676 1356 -168 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 676 1356 -144 ) ( 676 1380 -144 ) ( 784 1380 -144 ) subway/metal_clean -256 0 0 0.500000 0.500000 134217728 16777216 0 +( 676 1360 -112 ) ( 784 1360 -112 ) ( 784 1360 -176 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +( 784 1356 -112 ) ( 784 1380 -112 ) ( 784 1380 -176 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 784 1384 -112 ) ( 676 1384 -112 ) ( 676 1384 -176 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 680 1380 -112 ) ( 680 1356 -112 ) ( 680 1356 -176 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 2606 +{ +( 460 1248 -144 ) ( 460 1356 -144 ) ( 436 1356 -144 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 436 1356 -136 ) ( 460 1356 -136 ) ( 460 1248 -136 ) subway/con5 0 0 0 0.500000 0.500000 0 285212672 0 +( 432 1356 -104 ) ( 432 1248 -104 ) ( 432 1248 -168 ) subway/stair_side -256 0 0 0.500000 0.500000 0 285212672 0 +( 436 1272 -104 ) ( 460 1272 -104 ) ( 460 1272 -168 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 464 1248 -104 ) ( 464 1356 -104 ) ( 464 1356 -168 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 460 1352 -104 ) ( 436 1352 -104 ) ( 436 1352 -168 ) subway/stair_side 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2607 +{ +( 452 1360 -112 ) ( 428 1360 -112 ) ( 428 1360 -176 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +( 456 1256 -112 ) ( 456 1364 -112 ) ( 456 1364 -176 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +( 428 1280 -112 ) ( 452 1280 -112 ) ( 452 1280 -176 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +( 432 1364 -112 ) ( 432 1256 -112 ) ( 432 1256 -176 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +( 428 1364 -144 ) ( 452 1364 -144 ) ( 452 1256 -144 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +( 452 1256 -168 ) ( 452 1364 -168 ) ( 428 1364 -168 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 2608 +{ +( 784 1384 -100 ) ( 736 1384 -100 ) ( 736 1336 -100 ) subway/con5 0 0 0 0.500000 0.500000 0 285212672 0 +( 736 1336 -96 ) ( 736 1384 -96 ) ( 784 1384 -96 ) subway/con5 0 0 0 0.500000 0.500000 0 285212672 0 +( 736 1336 -72 ) ( 784 1336 -72 ) ( 784 1336 -104 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 784 1336 -72 ) ( 784 1384 -72 ) ( 784 1384 -104 ) subway/1_bath_stall 0 0 0 1 1 0 16777216 0 +( 784 1384 -72 ) ( 736 1384 -72 ) ( 736 1384 -104 ) subway/1_bath_stall 0 0 0 1 1 0 16777216 0 +( 736 1384 -72 ) ( 736 1336 -72 ) ( 736 1336 -104 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 760 1336 0 ) ( 736 1360 0 ) ( 736 1360 10 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2609 +{ +( 776 1000 -48 ) ( 776 936 -48 ) ( 840 936 -48 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 768 1000 -32 ) ( 952 1000 -32 ) ( 952 800 -32 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 960 1168 -40 ) ( 776 1168 -40 ) ( 776 1168 -48 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 752 768 -48 ) ( 752 768 -40 ) ( 752 832 -40 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 896 1136 -48 ) ( 896 1136 -40 ) ( 960 1136 -40 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 464 1000 -48 ) ( 464 1000 -40 ) ( 464 936 -40 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 2610 +{ +( 776 1216 -48 ) ( 776 1152 -48 ) ( 840 1152 -48 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 768 1216 -32 ) ( 952 1216 -32 ) ( 952 1016 -32 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 960 1384 -40 ) ( 776 1384 -40 ) ( 776 1384 -48 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 752 984 -48 ) ( 752 984 -40 ) ( 752 1048 -40 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 896 1352 -48 ) ( 896 1352 -40 ) ( 960 1352 -40 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 464 1216 -48 ) ( 464 1216 -40 ) ( 464 1152 -40 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 2611 +{ +( 432 1216 -48 ) ( 432 1216 -40 ) ( 432 1152 -40 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 856 1136 -48 ) ( 856 1136 -40 ) ( 920 1136 -40 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 464 984 -48 ) ( 464 984 -40 ) ( 464 1048 -40 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 928 1384 -40 ) ( 744 1384 -40 ) ( 744 1384 -48 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 736 1216 -32 ) ( 920 1216 -32 ) ( 920 1016 -32 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 744 1216 -48 ) ( 744 1152 -48 ) ( 808 1152 -48 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 2612 +{ +( 1064 1216 -48 ) ( 1064 1152 -48 ) ( 1128 1152 -48 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1056 1216 -32 ) ( 1240 1216 -32 ) ( 1240 1016 -32 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1248 1384 -40 ) ( 1064 1384 -40 ) ( 1064 1384 -48 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 784 984 -48 ) ( 784 984 -40 ) ( 784 1048 -40 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1176 1136 -48 ) ( 1176 1136 -40 ) ( 1240 1136 -40 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 752 1216 -48 ) ( 752 1216 -40 ) ( 752 1152 -40 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 2613 +{ +( 744 1048 -48 ) ( 744 984 -48 ) ( 808 984 -48 ) subway/1_concrete_floor -32 16 0 0.500000 0.500000 0 285212672 0 +( 736 1048 -32 ) ( 920 1048 -32 ) ( 920 848 -32 ) subway/1_concrete_floor 944 2560 0 0.500000 0.500000 0 285212672 0 +( 928 1136 -40 ) ( 744 1136 -40 ) ( 744 1136 -48 ) subway/1_concrete_floor 688 -320 0 0.500000 0.500000 0 285212672 0 +( 784 832 -48 ) ( 784 832 -40 ) ( 784 896 -40 ) subway/1_concrete_floor -2672 -320 0 0.500000 0.500000 0 285212672 0 +( 856 968 -48 ) ( 856 968 -40 ) ( 920 968 -40 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 400 1056 -48 ) ( 400 1056 -40 ) ( 400 992 -40 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2614 +{ +( 360 656 -152 ) ( 424 656 -152 ) ( 424 720 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 424 720 -120 ) ( 424 656 -120 ) ( 360 656 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 424 1392 -152 ) ( 432 1384 -152 ) ( 432 1384 -120 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 424 720 -224 ) ( 424 720 -8 ) ( 424 440 -8 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 368 1136 -104 ) ( 432 1136 -104 ) ( 432 1136 -112 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 432 1168 -120 ) ( 432 1336 -120 ) ( 432 1336 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2615 +{ +( 432 1168 -152 ) ( 432 1336 -152 ) ( 432 1336 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 368 1136 -120 ) ( 432 1136 -120 ) ( 432 1136 -128 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 424 672 -240 ) ( 424 672 -24 ) ( 424 392 -24 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 424 1392 -168 ) ( 432 1384 -168 ) ( 432 1384 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 424 720 -152 ) ( 424 656 -152 ) ( 360 656 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 360 656 -168 ) ( 424 656 -168 ) ( 424 720 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2616 +{ +( 360 656 -104 ) ( 424 656 -104 ) ( 424 720 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 424 720 -64 ) ( 424 656 -64 ) ( 360 656 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 424 1392 -104 ) ( 432 1384 -104 ) ( 432 1384 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 424 720 -176 ) ( 424 720 40 ) ( 424 440 40 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 368 1136 -56 ) ( 432 1136 -56 ) ( 432 1136 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 432 1168 -64 ) ( 432 1336 -64 ) ( 432 1336 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2617 +{ +( 360 656 -120 ) ( 424 656 -120 ) ( 424 720 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 424 720 -104 ) ( 424 656 -104 ) ( 360 656 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 424 1392 -120 ) ( 432 1384 -120 ) ( 432 1384 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 424 720 -208 ) ( 424 720 8 ) ( 424 440 8 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 368 1136 -88 ) ( 432 1136 -88 ) ( 432 1136 -96 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 432 1168 -104 ) ( 432 1336 -104 ) ( 432 1336 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2618 +{ +( 432 1168 -48 ) ( 432 1336 -48 ) ( 432 1336 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 368 1136 -24 ) ( 432 1136 -24 ) ( 432 1136 -32 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 424 720 -144 ) ( 424 720 72 ) ( 424 440 72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 424 1392 -64 ) ( 432 1384 -64 ) ( 432 1384 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 424 720 -48 ) ( 424 656 -48 ) ( 360 656 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 360 656 -64 ) ( 424 656 -64 ) ( 424 720 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2619 +{ +( 704 1048 -48 ) ( 704 984 -48 ) ( 768 984 -48 ) subway/1_cork_ceiling 32 16 0 0.500000 0.500000 0 352321536 0 +( 696 1048 -32 ) ( 880 1048 -32 ) ( 880 848 -32 ) subway/1_concrete_floor 944 2560 0 0.500000 0.500000 0 285212672 0 +( 888 1160 -40 ) ( 704 1160 -40 ) ( 704 1160 -48 ) subway/1_concrete_floor 688 -320 0 0.500000 0.500000 0 285212672 0 +( 400 848 -48 ) ( 400 848 -40 ) ( 400 912 -40 ) subway/1_concrete_floor -2672 -320 0 0.500000 0.500000 0 285212672 0 +( 816 968 -48 ) ( 816 968 -40 ) ( 880 968 -40 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 360 1056 -48 ) ( 360 1056 -40 ) ( 360 992 -40 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2620 +{ +( 464 1048 -32 ) ( 464 1048 -24 ) ( 464 984 -24 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 896 1168 -32 ) ( 896 1168 -24 ) ( 960 1168 -24 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 752 824 -32 ) ( 752 824 -24 ) ( 752 888 -24 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 928 1352 -24 ) ( 744 1352 -24 ) ( 744 1352 -32 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 768 1056 -16 ) ( 952 1056 -16 ) ( 952 856 -16 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 776 1056 -32 ) ( 776 992 -32 ) ( 840 992 -32 ) subway/1_concrete_floor -32 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 2621 +{ +( 640 1128 -64 ) ( 576 1128 -64 ) ( 576 1064 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 576 1064 -48 ) ( 576 1128 -48 ) ( 640 1128 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 784 1136 -48 ) ( 784 1136 -64 ) ( 784 1128 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -128 1128 72 ) ( 152 1128 72 ) ( 152 1128 -144 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 728 1128 -32 ) ( 728 1128 -24 ) ( 728 1064 -24 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 760 1136 -64 ) ( 760 1136 -48 ) ( 696 1136 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2622 +{ +( 760 1136 -104 ) ( 760 1136 -64 ) ( 696 1136 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 728 1128 -64 ) ( 728 1128 -56 ) ( 728 1064 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -128 1128 40 ) ( 152 1128 40 ) ( 152 1128 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 1136 -64 ) ( 784 1136 -104 ) ( 784 1128 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 576 1064 -64 ) ( 576 1128 -64 ) ( 640 1128 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 640 1128 -104 ) ( 576 1128 -104 ) ( 576 1064 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2623 +{ +( 640 1128 -120 ) ( 576 1128 -120 ) ( 576 1064 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1080 1136 -104 ) ( 1080 1128 -104 ) ( 728 1128 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 784 1136 -104 ) ( 784 1136 -120 ) ( 784 1128 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -128 1128 8 ) ( 152 1128 8 ) ( 152 1128 -208 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 728 1128 -96 ) ( 728 1128 -88 ) ( 728 1064 -88 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 760 1136 -120 ) ( 760 1136 -104 ) ( 696 1136 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2624 +{ +( 760 1136 -152 ) ( 760 1136 -120 ) ( 696 1136 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 728 1128 -112 ) ( 728 1128 -104 ) ( 728 1064 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( -128 1128 -8 ) ( 152 1128 -8 ) ( 152 1128 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 1136 -120 ) ( 784 1136 -152 ) ( 784 1128 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 576 1064 -120 ) ( 576 1128 -120 ) ( 640 1128 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 640 1128 -152 ) ( 576 1128 -152 ) ( 576 1064 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2625 +{ +( 640 1128 -168 ) ( 576 1128 -168 ) ( 576 1064 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 576 1064 -152 ) ( 576 1128 -152 ) ( 640 1128 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 784 1136 -152 ) ( 784 1136 -168 ) ( 784 1128 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -144 1128 -24 ) ( 136 1128 -24 ) ( 136 1128 -240 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 728 1128 -128 ) ( 728 1128 -120 ) ( 728 1064 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 760 1136 -168 ) ( 760 1136 -152 ) ( 696 1136 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2626 +{ +( 584 1128 -168 ) ( 520 1128 -168 ) ( 520 1064 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 520 1064 -152 ) ( 520 1128 -152 ) ( 584 1128 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 728 1136 -152 ) ( 728 1136 -168 ) ( 728 1128 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -200 1128 -24 ) ( 80 1128 -24 ) ( 80 1128 -240 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 672 1128 -128 ) ( 672 1128 -120 ) ( 672 1064 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 736 1136 -168 ) ( 736 1136 -152 ) ( 672 1136 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2627 +{ +( 736 1136 -152 ) ( 736 1136 -120 ) ( 672 1136 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 672 1128 -112 ) ( 672 1128 -104 ) ( 672 1064 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( -184 1128 -8 ) ( 96 1128 -8 ) ( 96 1128 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 728 1136 -120 ) ( 728 1136 -152 ) ( 728 1128 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 532 1064 -132 ) ( 532 1128 -132 ) ( 596 1128 -132 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 584 1128 -152 ) ( 520 1128 -152 ) ( 520 1064 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2628 +{ +( 728 1136 -104 ) ( 728 1136 -64 ) ( 664 1136 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 672 1128 -64 ) ( 672 1128 -56 ) ( 672 1064 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -192 1128 40 ) ( 88 1128 40 ) ( 88 1128 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 728 1136 -64 ) ( 728 1136 -104 ) ( 728 1128 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 512 1064 -64 ) ( 512 1128 -64 ) ( 576 1128 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 592 1128 -84 ) ( 528 1128 -84 ) ( 528 1064 -84 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2629 +{ +( 576 1128 -64 ) ( 512 1128 -64 ) ( 512 1064 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 512 1064 -48 ) ( 512 1128 -48 ) ( 576 1128 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 728 1136 -48 ) ( 728 1136 -64 ) ( 728 1128 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -192 1128 72 ) ( 88 1128 72 ) ( 88 1128 -144 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 672 1128 -32 ) ( 672 1128 -24 ) ( 672 1064 -24 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 728 1136 -64 ) ( 728 1136 -48 ) ( 664 1136 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2630 +{ +( 692 1136 -168 ) ( 692 1136 -152 ) ( 628 1136 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 632 1128 -128 ) ( 632 1128 -120 ) ( 632 1064 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -244 1128 -24 ) ( 36 1128 -24 ) ( 36 1128 -240 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 672 1136 -152 ) ( 672 1136 -168 ) ( 672 1128 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 476 1064 -152 ) ( 476 1128 -152 ) ( 540 1128 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 540 1128 -168 ) ( 476 1128 -168 ) ( 476 1064 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2631 +{ +( 540 1128 -152 ) ( 476 1128 -152 ) ( 476 1064 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 476 1064 -120 ) ( 476 1128 -120 ) ( 540 1128 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 672 1136 -120 ) ( 672 1136 -152 ) ( 672 1128 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -228 1128 -8 ) ( 52 1128 -8 ) ( 52 1128 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 632 1128 -112 ) ( 632 1128 -104 ) ( 632 1064 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 692 1136 -152 ) ( 692 1136 -120 ) ( 628 1136 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2632 +{ +( 692 1136 -120 ) ( 692 1136 -104 ) ( 628 1136 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 632 1128 -96 ) ( 632 1128 -88 ) ( 632 1064 -88 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -228 1128 8 ) ( 52 1128 8 ) ( 52 1128 -208 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 672 1136 -104 ) ( 672 1136 -120 ) ( 672 1128 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 980 1136 -104 ) ( 980 1128 -104 ) ( 628 1128 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 540 1128 -120 ) ( 476 1128 -120 ) ( 476 1064 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2633 +{ +( 692 1136 -104 ) ( 692 1136 -64 ) ( 628 1136 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 632 1128 -64 ) ( 632 1128 -56 ) ( 632 1064 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -228 1128 40 ) ( 52 1128 40 ) ( 52 1128 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 672 1136 -64 ) ( 672 1136 -104 ) ( 672 1128 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 476 1064 -64 ) ( 476 1128 -64 ) ( 540 1128 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 540 1128 -104 ) ( 476 1128 -104 ) ( 476 1064 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2634 +{ +( 540 1128 -64 ) ( 476 1128 -64 ) ( 476 1064 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 476 1064 -48 ) ( 476 1128 -48 ) ( 540 1128 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 672 1136 -48 ) ( 672 1136 -64 ) ( 672 1128 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -228 1128 72 ) ( 52 1128 72 ) ( 52 1128 -144 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 632 1128 -32 ) ( 632 1128 -24 ) ( 632 1064 -24 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 692 1136 -64 ) ( 692 1136 -48 ) ( 628 1136 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2635 +{ +( 472 1128 -76 ) ( 408 1128 -76 ) ( 408 1064 -76 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 404 1064 -64 ) ( 404 1128 -64 ) ( 468 1128 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 632 1140 -64 ) ( 632 1140 -104 ) ( 632 1132 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -300 1128 40 ) ( -20 1128 40 ) ( -20 1128 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 560 1128 -64 ) ( 560 1128 -56 ) ( 560 1064 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 620 1136 -104 ) ( 620 1136 -64 ) ( 556 1136 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2636 +{ +( 620 1136 -64 ) ( 620 1136 -48 ) ( 556 1136 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 560 1128 -32 ) ( 560 1128 -24 ) ( 560 1064 -24 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -300 1128 72 ) ( -20 1128 72 ) ( -20 1128 -144 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 632 1140 -48 ) ( 632 1140 -64 ) ( 632 1132 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 404 1064 -48 ) ( 404 1128 -48 ) ( 468 1128 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 468 1128 -64 ) ( 404 1128 -64 ) ( 404 1064 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2637 +{ +( 580 1136 -64 ) ( 580 1136 -48 ) ( 516 1136 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 520 1128 -32 ) ( 520 1128 -24 ) ( 520 1064 -24 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -340 1128 72 ) ( -60 1128 72 ) ( -60 1128 -144 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 560 1136 -48 ) ( 560 1136 -64 ) ( 560 1128 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 364 1064 -48 ) ( 364 1128 -48 ) ( 428 1128 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 428 1128 -64 ) ( 364 1128 -64 ) ( 364 1064 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2638 +{ +( 428 1128 -104 ) ( 364 1128 -104 ) ( 364 1064 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 364 1064 -64 ) ( 364 1128 -64 ) ( 428 1128 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 560 1136 -64 ) ( 560 1136 -104 ) ( 560 1128 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -340 1128 40 ) ( -60 1128 40 ) ( -60 1128 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 520 1128 -64 ) ( 520 1128 -56 ) ( 520 1064 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 580 1136 -104 ) ( 580 1136 -64 ) ( 516 1136 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2639 +{ +( 428 1128 -120 ) ( 364 1128 -120 ) ( 364 1064 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 868 1136 -104 ) ( 868 1128 -104 ) ( 516 1128 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 560 1136 -104 ) ( 560 1136 -120 ) ( 560 1128 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -340 1128 8 ) ( -60 1128 8 ) ( -60 1128 -208 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 520 1128 -96 ) ( 520 1128 -88 ) ( 520 1064 -88 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 580 1136 -120 ) ( 580 1136 -104 ) ( 516 1136 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2640 +{ +( 580 1136 -152 ) ( 580 1136 -120 ) ( 516 1136 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 520 1128 -112 ) ( 520 1128 -104 ) ( 520 1064 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( -340 1128 -8 ) ( -60 1128 -8 ) ( -60 1128 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 560 1136 -120 ) ( 560 1136 -152 ) ( 560 1128 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 364 1064 -120 ) ( 364 1128 -120 ) ( 428 1128 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 428 1128 -152 ) ( 364 1128 -152 ) ( 364 1064 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2641 +{ +( 428 1128 -168 ) ( 364 1128 -168 ) ( 364 1064 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 364 1064 -152 ) ( 364 1128 -152 ) ( 428 1128 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 560 1136 -152 ) ( 560 1136 -168 ) ( 560 1128 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -356 1128 -24 ) ( -76 1128 -24 ) ( -76 1128 -240 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 520 1128 -128 ) ( 520 1128 -120 ) ( 520 1064 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 580 1136 -168 ) ( 580 1136 -152 ) ( 516 1136 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2642 +{ +( 528 1136 -168 ) ( 528 1136 -152 ) ( 464 1136 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 464 1128 -128 ) ( 464 1128 -120 ) ( 464 1064 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -408 1128 -24 ) ( -128 1128 -24 ) ( -128 1128 -240 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 520 1136 -152 ) ( 520 1136 -168 ) ( 520 1128 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 312 1064 -152 ) ( 312 1128 -152 ) ( 376 1128 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 376 1128 -168 ) ( 312 1128 -168 ) ( 312 1064 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2643 +{ +( 376 1128 -152 ) ( 312 1128 -152 ) ( 312 1064 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 324 1064 -132 ) ( 324 1128 -132 ) ( 388 1128 -132 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 520 1136 -120 ) ( 520 1136 -152 ) ( 520 1128 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -392 1128 -8 ) ( -112 1128 -8 ) ( -112 1128 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 464 1128 -112 ) ( 464 1128 -104 ) ( 464 1064 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 528 1136 -152 ) ( 528 1136 -120 ) ( 464 1136 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2644 +{ +( 520 1136 -64 ) ( 520 1136 -48 ) ( 456 1136 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 464 1128 -32 ) ( 464 1128 -24 ) ( 464 1064 -24 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -400 1128 72 ) ( -120 1128 72 ) ( -120 1128 -144 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 520 1136 -48 ) ( 520 1136 -64 ) ( 520 1128 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 304 1064 -48 ) ( 304 1128 -48 ) ( 368 1128 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 368 1128 -64 ) ( 304 1128 -64 ) ( 304 1064 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2645 +{ +( 384 1128 -84 ) ( 320 1128 -84 ) ( 320 1064 -84 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 304 1064 -64 ) ( 304 1128 -64 ) ( 368 1128 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 520 1136 -64 ) ( 520 1136 -104 ) ( 520 1128 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -400 1128 40 ) ( -120 1128 40 ) ( -120 1128 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 464 1128 -64 ) ( 464 1128 -56 ) ( 464 1064 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 520 1136 -104 ) ( 520 1136 -64 ) ( 456 1136 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2646 +{ +( 464 1136 -64 ) ( 464 1136 -48 ) ( 400 1136 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 400 1120 -32 ) ( 400 1120 -24 ) ( 400 1056 -24 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -448 1128 72 ) ( -168 1128 72 ) ( -168 1128 -144 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 464 1136 -48 ) ( 464 1136 -64 ) ( 464 1128 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 280 1064 -48 ) ( 280 1128 -48 ) ( 344 1128 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 344 1128 -64 ) ( 280 1128 -64 ) ( 280 1064 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2647 +{ +( 344 1128 -104 ) ( 280 1128 -104 ) ( 280 1064 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 280 1064 -64 ) ( 280 1128 -64 ) ( 344 1128 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 464 1136 -64 ) ( 464 1136 -104 ) ( 464 1128 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1128 40 ) ( -168 1128 40 ) ( -168 1128 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1120 -64 ) ( 400 1120 -56 ) ( 400 1056 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 464 1136 -104 ) ( 464 1136 -64 ) ( 400 1136 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2648 +{ +( 464 1136 -120 ) ( 464 1136 -104 ) ( 400 1136 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 400 1120 -96 ) ( 400 1120 -88 ) ( 400 1056 -88 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -448 1128 8 ) ( -168 1128 8 ) ( -168 1128 -208 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 464 1136 -104 ) ( 464 1136 -120 ) ( 464 1128 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 784 1136 -104 ) ( 784 1128 -104 ) ( 432 1128 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 344 1128 -120 ) ( 280 1128 -120 ) ( 280 1064 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2649 +{ +( 344 1128 -152 ) ( 280 1128 -152 ) ( 280 1064 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 280 1064 -120 ) ( 280 1128 -120 ) ( 344 1128 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 464 1136 -120 ) ( 464 1136 -152 ) ( 464 1128 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1128 -8 ) ( -168 1128 -8 ) ( -168 1128 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1120 -112 ) ( 400 1120 -104 ) ( 400 1056 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 464 1136 -152 ) ( 464 1136 -120 ) ( 400 1136 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2650 +{ +( 464 1136 -168 ) ( 464 1136 -152 ) ( 400 1136 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 400 1120 -128 ) ( 400 1120 -120 ) ( 400 1056 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -464 1128 -24 ) ( -184 1128 -24 ) ( -184 1128 -240 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 464 1136 -152 ) ( 464 1136 -168 ) ( 464 1128 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 280 1064 -152 ) ( 280 1128 -152 ) ( 344 1128 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 344 1128 -168 ) ( 280 1128 -168 ) ( 280 1064 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2651 +{ +( 784 1128 -168 ) ( 784 1128 -152 ) ( 784 960 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 784 960 -128 ) ( 784 960 -120 ) ( 848 960 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 792 424 -24 ) ( 792 704 -24 ) ( 792 704 -240 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 784 1384 -152 ) ( 784 1384 -168 ) ( 792 1392 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 856 656 -152 ) ( 792 656 -152 ) ( 792 720 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 792 720 -168 ) ( 792 656 -168 ) ( 856 656 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2652 +{ +( 792 720 -152 ) ( 792 656 -152 ) ( 856 656 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 856 656 -120 ) ( 792 656 -120 ) ( 792 720 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 784 1384 -120 ) ( 784 1384 -152 ) ( 792 1392 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 792 472 -8 ) ( 792 752 -8 ) ( 792 752 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 960 -112 ) ( 784 960 -104 ) ( 848 960 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 784 1128 -152 ) ( 784 1128 -120 ) ( 784 960 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2653 +{ +( 792 720 -120 ) ( 792 656 -120 ) ( 856 656 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 856 656 -104 ) ( 792 656 -104 ) ( 792 720 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 784 1384 -104 ) ( 784 1384 -120 ) ( 792 1392 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 792 472 8 ) ( 792 752 8 ) ( 792 752 -208 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 784 960 -96 ) ( 784 960 -88 ) ( 848 960 -88 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 784 1128 -120 ) ( 784 1128 -104 ) ( 784 960 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2654 +{ +( 784 1128 -64 ) ( 784 1128 -48 ) ( 784 960 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 784 960 -32 ) ( 784 960 -24 ) ( 848 960 -24 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 792 472 72 ) ( 792 752 72 ) ( 792 752 -144 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 784 1384 -48 ) ( 784 1384 -64 ) ( 792 1392 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 856 656 -48 ) ( 792 656 -48 ) ( 792 720 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 792 720 -64 ) ( 792 656 -64 ) ( 856 656 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2655 +{ +( 56 1456 -168 ) ( 56 1392 -168 ) ( 120 1392 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 120 1392 -152 ) ( 56 1392 -152 ) ( 56 1456 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 792 1392 -168 ) ( 784 1384 -168 ) ( 784 1384 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 72 1392 -240 ) ( 72 1392 -24 ) ( -208 1392 -24 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 432 1384 -152 ) ( 432 1384 -168 ) ( 424 1392 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 432 1384 -168 ) ( 432 1384 -152 ) ( 784 1384 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2656 +{ +( 432 1384 -152 ) ( 432 1384 -120 ) ( 784 1384 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 432 1384 -120 ) ( 432 1384 -152 ) ( 424 1392 -152 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 120 1392 -224 ) ( 120 1392 -8 ) ( -160 1392 -8 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 792 1392 -152 ) ( 784 1384 -152 ) ( 784 1384 -120 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 120 1392 -120 ) ( 56 1392 -120 ) ( 56 1456 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 56 1456 -152 ) ( 56 1392 -152 ) ( 120 1392 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2657 +{ +( 432 1384 -120 ) ( 432 1384 -104 ) ( 784 1384 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 432 1384 -104 ) ( 432 1384 -120 ) ( 424 1392 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 120 1392 -208 ) ( 120 1392 8 ) ( -160 1392 8 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 792 1392 -120 ) ( 784 1384 -120 ) ( 784 1384 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 120 1392 -104 ) ( 56 1392 -104 ) ( 56 1456 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 56 1456 -120 ) ( 56 1392 -120 ) ( 120 1392 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2658 +{ +( 432 1384 -104 ) ( 432 1384 -64 ) ( 784 1384 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 432 1384 -64 ) ( 432 1384 -104 ) ( 424 1392 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 120 1392 -176 ) ( 120 1392 40 ) ( -160 1392 40 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 792 1392 -104 ) ( 784 1384 -104 ) ( 784 1384 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 120 1392 -64 ) ( 56 1392 -64 ) ( 56 1456 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 56 1456 -104 ) ( 56 1392 -104 ) ( 120 1392 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2659 +{ +( 56 1456 -64 ) ( 56 1392 -64 ) ( 120 1392 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 120 1392 -48 ) ( 56 1392 -48 ) ( 56 1456 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 792 1392 -64 ) ( 784 1384 -64 ) ( 784 1384 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 120 1392 -144 ) ( 120 1392 72 ) ( -160 1392 72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 432 1384 -48 ) ( 432 1384 -64 ) ( 424 1392 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 432 1384 -64 ) ( 432 1384 -48 ) ( 784 1384 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 2660 +{ +( 688 1136 -176 ) ( 688 1136 -168 ) ( 624 1136 -168 ) subway/1_concrete_floor -3792 -320 0 0.500000 0.500000 0 285212672 0 +( 400 1720 -176 ) ( 400 1720 -168 ) ( 400 1656 -168 ) subway/1_stair_side1 1568 -320 0 0.500000 0.500000 0 285212672 0 +( 504 936 -184 ) ( 504 936 -176 ) ( 568 936 -176 ) subway/1_concrete_floor -3792 -320 0 0.500000 0.500000 0 285212672 0 +( 784 1128 -184 ) ( 784 1128 -176 ) ( 784 1192 -176 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 624 1264 -168 ) ( 624 1328 -168 ) ( 688 1328 -168 ) subway/1_concrete_floor 352 2960 0 0.500000 0.500000 0 285212672 0 +( 688 1344 -176 ) ( 624 1344 -176 ) ( 624 1280 -176 ) subway/1_concrete_floor -368 1856 0 0.500000 0.500000 0 285212672 0 +} +// brush 2661 +{ +( 2072 2320 -400 ) ( 2072 2376 -400 ) ( 2072 2376 -472 ) subway/1_soda_front_a3 38 42 0 0.700000 0.700000 134217728 0 0 +( 2014 2330 -400 ) ( 2086 2330 -400 ) ( 2086 2330 -472 ) subway/1_soda_side_a 40 4 0 0.700000 0.700000 134217728 0 0 +( 2038 2384 -376 ) ( 2038 2328 -376 ) ( 2038 2328 -448 ) subway/1_soda_front_a -79 4 0 -0.700000 0.700000 134217728 654311425 1500 +( 2086 2376 -400 ) ( 2014 2376 -400 ) ( 2014 2376 -472 ) subway/1_soda_side_a -40 4 0 -0.700000 0.700000 134217728 0 0 +( 2086 2376 -400 ) ( 2086 2320 -400 ) ( 2014 2320 -400 ) subway/1_soda_top 45 -4 0 0.700000 1.100000 134217728 0 0 +( 2014 2320 -444 ) ( 2086 2320 -444 ) ( 2086 2376 -444 ) subway/1_soda_front_a 49 -51 0 0.700000 0.700000 134217728 0 0 +} +// brush 2662 +{ +( 2014 2320 -464 ) ( 2086 2320 -464 ) ( 2086 2376 -464 ) subway/1_soda_front_b 9 -6 0 0.700000 0.700000 134217728 0 0 +( 2086 2374 -444 ) ( 2086 2318 -444 ) ( 2014 2318 -444 ) subway/1_soda_front_b 9 -6 0 0.700000 0.700000 134217728 0 0 +( 2082 2376 -434 ) ( 2010 2376 -434 ) ( 2010 2376 -506 ) subway/1_soda_side_b -40 6 0 -0.700000 0.700000 134217728 16777216 0 +( 2038 2384 -408 ) ( 2038 2328 -408 ) ( 2038 2328 -480 ) subway/1_soda_front_b -79 6 0 -0.700000 0.700000 0 654311425 1500 +( 2014 2330 -436 ) ( 2086 2330 -436 ) ( 2086 2330 -508 ) subway/1_soda_side_b 40 6 0 0.700000 0.700000 134217728 16777216 0 +( 2072 2318 -434 ) ( 2072 2374 -434 ) ( 2072 2374 -506 ) subway/1_soda_front_b3 38 10 0 0.700000 0.700000 134217728 0 0 +} +// brush 2663 +{ +( 360 -416 -480 ) ( 360 -456 -480 ) ( 392 -456 -480 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 392 -448 -464 ) ( 360 -448 -464 ) ( 360 -408 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 376 -144 -480 ) ( 384 -152 -480 ) ( 384 -152 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 384 -328 -464 ) ( 384 -264 -464 ) ( 384 -264 -480 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 392 -504 -480 ) ( 360 -504 -480 ) ( 360 -504 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 376 -432 -464 ) ( 376 -464 -464 ) ( 376 -464 -480 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 2664 +{ +( -408 328 -112 ) ( -408 328 -168 ) ( -184 328 -168 ) subway/1_tile 64 0 0 -0.500000 0.500000 0 318767104 0 +( -384 320 -120 ) ( -384 320 -152 ) ( -416 320 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 144 232 -128 ) ( 144 296 -128 ) ( 208 296 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 208 296 -160 ) ( 144 296 -160 ) ( 144 232 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -320 336 -128 ) ( -320 320 -128 ) ( -320 336 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -280 320 -128 ) ( -280 336 -128 ) ( -280 320 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2665 +{ +( -408 328 -112 ) ( -408 328 -168 ) ( -184 328 -168 ) subway/1_tile 64 0 0 -0.500000 0.500000 0 318767104 0 +( -384 320 -120 ) ( -384 320 -152 ) ( -416 320 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -184 288 -152 ) ( -184 288 -120 ) ( -184 320 -120 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 144 232 -128 ) ( 144 296 -128 ) ( 208 296 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 208 296 -160 ) ( 144 296 -160 ) ( 144 232 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -248 336 -128 ) ( -248 320 -128 ) ( -248 336 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2666 +{ +( -352 336 -128 ) ( -352 320 -128 ) ( -352 320 -160 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( -320 328 -128 ) ( -352 328 -128 ) ( -352 328 -160 ) subway/1_tile_graf6 64 0 0 -0.500000 0.500000 0 352321536 0 +( -320 320 -128 ) ( -320 336 -128 ) ( -320 336 -160 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( -352 320 -128 ) ( -320 320 -128 ) ( -320 320 -160 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( -352 320 -128 ) ( -352 336 -128 ) ( -320 336 -128 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( -320 336 -160 ) ( -352 336 -160 ) ( -352 320 -160 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2667 +{ +( -408 328 -112 ) ( -408 328 -168 ) ( -184 328 -168 ) subway/1_tile 64 0 0 -0.500000 0.500000 0 318767104 0 +( -408 328 -168 ) ( -408 328 -112 ) ( -416 320 -112 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -384 320 -120 ) ( -384 320 -152 ) ( -416 320 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 144 232 -128 ) ( 144 296 -128 ) ( 208 296 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 208 296 -160 ) ( 144 296 -160 ) ( 144 232 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -352 320 -128 ) ( -352 336 -128 ) ( -352 320 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2668 +{ +( -248 336 -160 ) ( -280 336 -160 ) ( -280 320 -160 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( -280 320 -128 ) ( -280 336 -128 ) ( -248 336 -128 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( -280 320 -128 ) ( -248 320 -128 ) ( -248 320 -160 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( -248 320 -128 ) ( -248 336 -128 ) ( -248 336 -160 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( -248 328 -128 ) ( -280 328 -128 ) ( -280 328 -160 ) subway/1_tile_damage1 -48 0 0 -0.500000 0.500000 0 352321536 0 +( -280 336 -128 ) ( -280 320 -128 ) ( -280 320 -160 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2669 +{ +( -440 -72 -160 ) ( -440 -8 -160 ) ( -504 -8 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 480 -160 ) ( -416 480 -192 ) ( -416 512 -192 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -168 ) ( -408 744 -112 ) ( -416 752 -112 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -112 ) ( -408 744 -168 ) ( -408 328 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 568 -152 ) ( -408 608 -152 ) ( -384 608 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 680 -128 ) ( -400 680 -128 ) ( -416 680 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2670 +{ +( -440 -72 -160 ) ( -440 -8 -160 ) ( -504 -8 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 480 -160 ) ( -416 480 -192 ) ( -416 512 -192 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -112 ) ( -408 744 -168 ) ( -408 328 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 568 -152 ) ( -408 608 -152 ) ( -384 608 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 608 -152 ) ( -384 608 -152 ) ( -408 608 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -400 648 -128 ) ( -416 648 -128 ) ( -400 648 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2671 +{ +( -504 -8 -128 ) ( -440 -8 -128 ) ( -440 -72 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 480 -160 ) ( -416 480 -192 ) ( -416 512 -192 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -168 ) ( -408 744 -112 ) ( -416 752 -112 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -112 ) ( -408 744 -168 ) ( -408 328 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 608 -152 ) ( -408 568 -152 ) ( -384 608 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 680 -128 ) ( -400 680 -128 ) ( -416 680 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2672 +{ +( -504 -8 -128 ) ( -440 -8 -128 ) ( -440 -72 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 480 -160 ) ( -416 480 -192 ) ( -416 512 -192 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -112 ) ( -408 744 -168 ) ( -408 328 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 608 -152 ) ( -408 568 -152 ) ( -384 608 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 552 -128 ) ( -408 552 -128 ) ( -416 552 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -400 648 -128 ) ( -416 648 -128 ) ( -400 648 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2673 +{ +( -400 680 -160 ) ( -416 680 -160 ) ( -416 648 -160 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( -416 648 -128 ) ( -416 680 -128 ) ( -400 680 -128 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( -416 648 -128 ) ( -400 648 -128 ) ( -400 648 -152 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( -408 648 -128 ) ( -408 680 -128 ) ( -408 680 -152 ) subway/1_tile_graf6 48 0 0 0.500000 0.500000 0 352321536 0 +( -408 680 -128 ) ( -424 680 -128 ) ( -424 680 -152 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( -416 680 -128 ) ( -416 648 -128 ) ( -416 648 -152 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2674 +{ +( 360 752 -136 ) ( 360 752 -104 ) ( 104 752 -104 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -104 ) ( -408 744 -160 ) ( -416 752 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -160 ) ( -408 744 -104 ) ( -184 744 -104 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 144 656 -128 ) ( 144 720 -128 ) ( 208 720 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 208 720 -160 ) ( 144 720 -160 ) ( 144 656 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -360 728 -128 ) ( -360 744 -128 ) ( -360 728 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2675 +{ +( 360 752 -136 ) ( 360 752 -104 ) ( 104 752 -104 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -160 ) ( -408 744 -104 ) ( -184 744 -104 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -184 712 -144 ) ( -184 712 -112 ) ( -184 744 -112 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 144 656 -128 ) ( 144 720 -128 ) ( 208 720 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 208 720 -160 ) ( 144 720 -160 ) ( 144 656 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -328 744 -128 ) ( -328 728 -128 ) ( -328 744 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2676 +{ +( -320 744 -160 ) ( -360 744 -160 ) ( -360 728 -160 ) subway/1_tile_graf2 0 0 0 0.500000 0.500000 0 352321536 0 +( -360 728 -128 ) ( -360 744 -128 ) ( -320 744 -128 ) subway/1_tile_graf2 0 0 0 0.500000 0.500000 0 352321536 0 +( -360 744 -128 ) ( -320 744 -128 ) ( -320 744 -160 ) subway/1_tile_graf2 16 0 0 0.500000 0.500000 0 352321536 0 +( -328 728 -128 ) ( -328 744 -128 ) ( -328 744 -160 ) subway/1_tile_graf2 0 0 0 0.500000 0.500000 0 352321536 0 +( -320 752 -128 ) ( -360 752 -128 ) ( -360 752 -160 ) subway/1_tile_graf2 0 0 0 0.500000 0.500000 0 352321536 0 +( -360 744 -128 ) ( -360 728 -128 ) ( -360 728 -160 ) subway/1_tile_graf2 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2677 +{ +( -504 -8 -128 ) ( -440 -8 -128 ) ( -440 -72 -128 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 328 -112 ) ( -408 328 -168 ) ( -416 320 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 480 -160 ) ( -416 480 -192 ) ( -416 512 -192 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -112 ) ( -408 744 -168 ) ( -408 328 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 608 -152 ) ( -408 568 -152 ) ( -384 608 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 512 -128 ) ( -416 512 -128 ) ( -408 512 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2678 +{ +( -408 544 -152 ) ( -416 544 -152 ) ( -416 512 -152 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -416 512 -128 ) ( -416 544 -128 ) ( -408 544 -128 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -416 512 -128 ) ( -408 512 -128 ) ( -408 512 -152 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -408 512 -128 ) ( -408 544 -128 ) ( -408 544 -152 ) subway/1_tile_damage2 0 16 0 0.500000 0.500000 0 352321536 0 +( -408 552 -128 ) ( -416 552 -128 ) ( -416 552 -152 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -416 544 -128 ) ( -416 512 -128 ) ( -416 512 -152 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2679 +{ +( -408 744 -144 ) ( -408 744 -200 ) ( -408 328 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 480 -192 ) ( -416 480 -224 ) ( -416 512 -224 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -504 -8 -176 ) ( -440 -8 -176 ) ( -440 -72 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -384 608 -184 ) ( -408 608 -184 ) ( -408 568 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -384 576 -152 ) ( -408 576 -152 ) ( -384 576 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 496 -152 ) ( -392 496 -152 ) ( -416 496 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2680 +{ +( -408 744 -144 ) ( -408 744 -200 ) ( -408 328 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 480 -192 ) ( -416 480 -224 ) ( -416 512 -224 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 328 -144 ) ( -408 328 -200 ) ( -416 320 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -504 -8 -176 ) ( -440 -8 -176 ) ( -440 -72 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -384 608 -184 ) ( -408 608 -184 ) ( -408 568 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -384 464 -152 ) ( -408 464 -152 ) ( -384 464 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2681 +{ +( -440 -72 -160 ) ( -440 -8 -160 ) ( -504 -8 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 480 -160 ) ( -416 480 -192 ) ( -416 512 -192 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -112 ) ( -408 744 -168 ) ( -408 328 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 568 -152 ) ( -408 608 -152 ) ( -384 608 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -384 576 -152 ) ( -408 576 -152 ) ( -384 576 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 496 -152 ) ( -392 496 -152 ) ( -416 496 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2682 +{ +( -440 -72 -160 ) ( -440 -8 -160 ) ( -504 -8 -160 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 328 -112 ) ( -408 328 -168 ) ( -416 320 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 480 -160 ) ( -416 480 -192 ) ( -416 512 -192 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -112 ) ( -408 744 -168 ) ( -408 328 -168 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 568 -152 ) ( -408 608 -152 ) ( -384 608 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -384 464 -152 ) ( -408 464 -152 ) ( -384 464 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2683 +{ +( -408 744 -128 ) ( -408 744 -184 ) ( -408 328 -184 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -416 480 -176 ) ( -416 480 -208 ) ( -416 512 -208 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -504 -8 -160 ) ( -440 -8 -160 ) ( -440 -72 -160 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -440 -72 -176 ) ( -440 -8 -176 ) ( -504 -8 -176 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -384 576 -152 ) ( -408 576 -152 ) ( -384 576 -184 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -416 496 -152 ) ( -392 496 -152 ) ( -416 496 -184 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2684 +{ +( -408 744 -128 ) ( -408 744 -184 ) ( -408 328 -184 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -416 480 -176 ) ( -416 480 -208 ) ( -416 512 -208 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -408 328 -128 ) ( -408 328 -184 ) ( -416 320 -184 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -504 -8 -160 ) ( -440 -8 -160 ) ( -440 -72 -160 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -440 -72 -176 ) ( -440 -8 -176 ) ( -504 -8 -176 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -384 464 -152 ) ( -408 464 -152 ) ( -384 464 -184 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2685 +{ +( -416 608 -152 ) ( -416 568 -152 ) ( -416 568 -184 ) subway/1_tile_graf7 0 -48 0 0.500000 0.500000 0 352321536 0 +( -392 608 -152 ) ( -416 608 -152 ) ( -416 608 -184 ) subway/1_tile_graf7 0 -48 0 0.500000 0.500000 0 352321536 0 +( -408 576 -152 ) ( -408 616 -152 ) ( -408 616 -184 ) subway/1_tile_graf7 0 -48 0 0.500000 0.500000 0 352321536 0 +( -408 576 -152 ) ( -384 576 -152 ) ( -384 576 -184 ) subway/1_tile_graf7 0 -48 0 0.500000 0.500000 0 352321536 0 +( -408 568 -152 ) ( -408 608 -152 ) ( -384 608 -152 ) subway/1_tile_graf7 0 0 0 0.500000 0.500000 0 352321536 0 +( -384 608 -184 ) ( -408 608 -184 ) ( -408 568 -184 ) subway/1_tile_graf7 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2686 +{ +( -408 744 -128 ) ( -408 744 -184 ) ( -408 328 -184 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -408 744 -184 ) ( -408 744 -128 ) ( -416 752 -128 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -416 480 -176 ) ( -416 480 -208 ) ( -416 512 -208 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -504 -8 -160 ) ( -440 -8 -160 ) ( -440 -72 -160 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -440 -72 -176 ) ( -440 -8 -176 ) ( -504 -8 -176 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -408 608 -152 ) ( -384 608 -152 ) ( -408 608 -184 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2687 +{ +( -408 744 -144 ) ( -408 744 -200 ) ( -408 328 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -200 ) ( -408 744 -144 ) ( -416 752 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 480 -192 ) ( -416 480 -224 ) ( -416 512 -224 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -504 -8 -176 ) ( -440 -8 -176 ) ( -440 -72 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -384 608 -184 ) ( -408 608 -184 ) ( -408 568 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 608 -152 ) ( -384 608 -152 ) ( -408 608 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2688 +{ +( -408 744 -144 ) ( -408 744 -200 ) ( -408 328 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -200 ) ( -408 744 -144 ) ( -416 752 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 480 -192 ) ( -416 480 -224 ) ( -416 512 -224 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 328 -144 ) ( -408 328 -200 ) ( -416 320 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -440 -72 -200 ) ( -440 -8 -200 ) ( -504 -8 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 608 -184 ) ( -384 608 -184 ) ( -408 568 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2689 +{ +( -384 496 -184 ) ( -408 496 -184 ) ( -408 456 -184 ) subway/1_tile_graf7 0 -224 0 0.500000 0.500000 0 352321536 0 +( -408 456 -152 ) ( -408 496 -152 ) ( -384 496 -152 ) subway/1_tile_graf7 0 -224 0 0.500000 0.500000 0 352321536 0 +( -408 464 -152 ) ( -384 464 -152 ) ( -384 464 -184 ) subway/1_tile_graf7 0 -48 0 0.500000 0.500000 0 352321536 0 +( -408 464 -152 ) ( -408 504 -152 ) ( -408 504 -184 ) subway/1_tile_graf8 32 16 0 0.500000 0.500000 0 352321536 0 +( -400 496 -152 ) ( -424 496 -152 ) ( -424 496 -184 ) subway/1_tile_graf7 0 -48 0 0.500000 0.500000 0 352321536 0 +( -416 496 -152 ) ( -416 456 -152 ) ( -416 456 -184 ) subway/1_tile_graf7 224 -48 0 0.500000 0.500000 0 352321536 0 +} +// brush 2690 +{ +( 208 296 -176 ) ( 144 296 -176 ) ( 144 232 -176 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( 144 232 -160 ) ( 144 296 -160 ) ( 208 296 -160 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -184 288 -168 ) ( -184 288 -136 ) ( -184 320 -136 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -384 320 -136 ) ( -384 320 -168 ) ( -416 320 -168 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -408 328 -184 ) ( -408 328 -128 ) ( -416 320 -128 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -408 328 -128 ) ( -408 328 -184 ) ( -184 328 -184 ) subway/1_tile_middle 64 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2691 +{ +( 208 296 -200 ) ( 144 296 -200 ) ( 144 232 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 144 232 -176 ) ( 144 296 -176 ) ( 208 296 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -184 288 -184 ) ( -184 288 -152 ) ( -184 320 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -384 320 -152 ) ( -384 320 -184 ) ( -416 320 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 328 -200 ) ( -408 328 -144 ) ( -416 320 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 328 -144 ) ( -408 328 -200 ) ( -184 328 -200 ) subway/1_tile 64 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2692 +{ +( 208 720 -176 ) ( 144 720 -176 ) ( 144 656 -176 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( 144 656 -160 ) ( 144 720 -160 ) ( 208 720 -160 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -184 712 -160 ) ( -184 712 -128 ) ( -184 744 -128 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -408 744 -176 ) ( -408 744 -120 ) ( -184 744 -120 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -408 744 -120 ) ( -408 744 -176 ) ( -416 752 -176 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( 360 752 -152 ) ( 360 752 -120 ) ( 104 752 -120 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2693 +{ +( 208 720 -200 ) ( 144 720 -200 ) ( 144 656 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 144 656 -176 ) ( 144 720 -176 ) ( 208 720 -176 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -184 712 -184 ) ( -184 712 -152 ) ( -184 744 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -200 ) ( -408 744 -144 ) ( -184 744 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -144 ) ( -408 744 -200 ) ( -416 752 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 360 752 -176 ) ( 360 752 -144 ) ( 104 752 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2694 +{ +( 904 -624 -168 ) ( 904 -624 -136 ) ( 520 -624 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 400 -408 -120 ) ( 400 -408 -152 ) ( 400 -416 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -360 -632 -120 ) ( -360 -632 -152 ) ( -504 -632 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 360 -624 -168 ) ( 360 -616 -168 ) ( 360 -616 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 232 -648 -120 ) ( 296 -648 -120 ) ( 296 -712 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 296 -712 -152 ) ( 296 -648 -152 ) ( 232 -648 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2695 +{ +( 384 -768 -464 ) ( 384 -768 -416 ) ( 424 -768 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -464 ) ( 384 -760 -392 ) ( 376 -768 -392 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -392 ) ( 384 -760 -464 ) ( 704 -760 -464 ) subway/1_tile 0 -16 0 -0.500000 0.500000 0 318767104 0 +( 448 -736 -424 ) ( 448 -792 -424 ) ( 528 -736 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 480 -792 -416 ) ( 480 -736 -416 ) ( 560 -736 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 504 -792 -384 ) ( 504 -736 -384 ) ( 504 -792 -456 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2696 +{ +( 384 -768 -464 ) ( 384 -768 -416 ) ( 424 -768 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -464 ) ( 384 -760 -392 ) ( 376 -768 -392 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -392 ) ( 384 -760 -464 ) ( 704 -760 -464 ) subway/1_tile 0 -16 0 -0.500000 0.500000 0 318767104 0 +( 512 -792 -400 ) ( 512 -736 -400 ) ( 592 -736 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 536 -792 -368 ) ( 536 -736 -368 ) ( 536 -792 -440 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 480 -736 -416 ) ( 480 -792 -416 ) ( 560 -736 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2697 +{ +( 384 -768 -464 ) ( 384 -768 -416 ) ( 424 -768 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -392 ) ( 384 -760 -464 ) ( 704 -760 -464 ) subway/1_tile 0 -16 0 -0.500000 0.500000 0 318767104 0 +( 672 -776 -408 ) ( 672 -744 -408 ) ( 672 -744 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 512 -736 -432 ) ( 592 -736 -432 ) ( 512 -792 -432 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 560 -736 -448 ) ( 480 -736 -448 ) ( 480 -792 -448 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 536 -744 -384 ) ( 536 -800 -384 ) ( 536 -744 -456 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2698 +{ +( 384 -768 -464 ) ( 384 -768 -416 ) ( 424 -768 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -392 ) ( 384 -760 -464 ) ( 704 -760 -464 ) subway/1_tile 0 -16 0 -0.500000 0.500000 0 318767104 0 +( 672 -776 -408 ) ( 672 -744 -408 ) ( 672 -744 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 528 -736 -456 ) ( 448 -736 -456 ) ( 448 -792 -456 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 504 -744 -392 ) ( 504 -800 -392 ) ( 504 -744 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 480 -736 -448 ) ( 560 -736 -448 ) ( 480 -792 -448 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2699 +{ +( 536 -736 -368 ) ( 536 -792 -368 ) ( 536 -792 -440 ) subway/1_tile_graf9 0 32 0 -0.500000 0.500000 0 352321536 0 +( 592 -760 -368 ) ( 512 -760 -368 ) ( 512 -760 -440 ) subway/1_tile_graf5 48 -32 0 -0.500000 0.500000 0 352321536 0 +( 568 -800 -368 ) ( 568 -744 -368 ) ( 568 -744 -440 ) subway/1_tile_graf9 0 32 0 -0.500000 0.500000 0 352321536 0 +( 512 -768 -368 ) ( 592 -768 -368 ) ( 592 -768 -440 ) subway/1_tile_graf9 -80 32 0 -0.500000 0.500000 0 352321536 0 +( 512 -792 -400 ) ( 512 -736 -400 ) ( 592 -736 -400 ) subway/1_tile_graf9 -80 -16 0 -0.500000 0.500000 0 352321536 0 +( 592 -736 -432 ) ( 512 -736 -432 ) ( 512 -792 -432 ) subway/1_tile_graf9 -80 -16 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2700 +{ +( 384 -768 -464 ) ( 384 -768 -416 ) ( 424 -768 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -392 ) ( 384 -760 -464 ) ( 704 -760 -464 ) subway/1_tile 0 -16 0 -0.500000 0.500000 0 318767104 0 +( 672 -776 -408 ) ( 672 -744 -408 ) ( 672 -744 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 448 -792 -424 ) ( 448 -736 -424 ) ( 528 -736 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 592 -736 -432 ) ( 512 -736 -432 ) ( 512 -792 -432 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 568 -744 -368 ) ( 568 -800 -368 ) ( 568 -744 -440 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2701 +{ +( 384 -768 -464 ) ( 384 -768 -416 ) ( 424 -768 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -392 ) ( 384 -760 -464 ) ( 704 -760 -464 ) subway/1_tile 0 -16 0 -0.500000 0.500000 0 318767104 0 +( 672 -776 -408 ) ( 672 -744 -408 ) ( 672 -744 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 448 -736 -424 ) ( 448 -792 -424 ) ( 528 -736 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 512 -792 -400 ) ( 512 -736 -400 ) ( 592 -736 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 568 -744 -368 ) ( 568 -800 -368 ) ( 568 -744 -440 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2702 +{ +( 384 -768 -464 ) ( 384 -768 -416 ) ( 424 -768 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -464 ) ( 384 -760 -392 ) ( 376 -768 -392 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -392 ) ( 384 -760 -464 ) ( 704 -760 -464 ) subway/1_tile 0 -16 0 -0.500000 0.500000 0 318767104 0 +( 672 -776 -408 ) ( 672 -744 -408 ) ( 672 -744 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 472 -776 -392 ) ( 432 -776 -392 ) ( 432 -744 -392 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 512 -736 -400 ) ( 512 -792 -400 ) ( 592 -736 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2703 +{ +( 472 -736 -392 ) ( 472 -792 -392 ) ( 472 -792 -464 ) subway/1_tile_graf9 0 -16 0 -0.500000 0.500000 0 352321536 0 +( 528 -760 -392 ) ( 448 -760 -392 ) ( 448 -760 -464 ) subway/1_tile_graf9 -80 -16 0 -0.500000 0.500000 0 352321536 0 +( 504 -800 -392 ) ( 504 -744 -392 ) ( 504 -744 -464 ) subway/1_tile_graf9 0 -16 0 -0.500000 0.500000 0 352321536 0 +( 448 -768 -392 ) ( 528 -768 -392 ) ( 528 -768 -464 ) subway/1_tile_graf9 -80 -16 0 -0.500000 0.500000 0 352321536 0 +( 448 -792 -424 ) ( 448 -736 -424 ) ( 528 -736 -424 ) subway/1_tile_graf9 -80 -16 0 -0.500000 0.500000 0 352321536 0 +( 528 -736 -456 ) ( 448 -736 -456 ) ( 448 -792 -456 ) subway/1_tile_graf9 -80 -16 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2704 +{ +( 456 -144 -416 ) ( 416 -144 -416 ) ( 416 -144 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -144 -392 ) ( 384 -152 -392 ) ( 384 -152 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 672 -152 -464 ) ( 352 -152 -464 ) ( 352 -152 -392 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 464 -128 -464 ) ( 424 -128 -464 ) ( 424 -160 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 480 -128 -432 ) ( 560 -128 -432 ) ( 480 -152 -432 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 448 -152 -432 ) ( 448 -136 -432 ) ( 448 -152 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2705 +{ +( 456 -144 -416 ) ( 416 -144 -416 ) ( 416 -144 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 672 -152 -464 ) ( 352 -152 -464 ) ( 352 -152 -392 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 672 -168 -448 ) ( 672 -168 -408 ) ( 672 -136 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 464 -128 -464 ) ( 424 -128 -464 ) ( 424 -160 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 480 -128 -432 ) ( 560 -128 -432 ) ( 480 -152 -432 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 480 -136 -432 ) ( 480 -152 -432 ) ( 480 -136 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2706 +{ +( 480 -136 -464 ) ( 448 -136 -464 ) ( 448 -152 -464 ) subway/1_tile_damage2 72 -32 0 0.500000 0.500000 0 352321536 0 +( 448 -152 -432 ) ( 448 -136 -432 ) ( 480 -136 -432 ) subway/1_tile_damage2 72 -32 0 0.500000 0.500000 0 352321536 0 +( 448 -152 -432 ) ( 480 -152 -432 ) ( 480 -152 -464 ) subway/1_tile_damage2 72 -32 0 0.500000 0.500000 0 352321536 0 +( 480 -152 -432 ) ( 480 -136 -432 ) ( 480 -136 -464 ) subway/1_tile_damage2 40 -32 0 0.500000 0.500000 0 352321536 0 +( 480 -144 -432 ) ( 448 -144 -432 ) ( 448 -144 -464 ) subway/1_tile_damage2 72 -32 0 0.500000 0.500000 0 352321536 0 +( 448 -136 -432 ) ( 448 -152 -432 ) ( 448 -152 -464 ) subway/1_tile_damage2 40 -32 0 0.500000 0.500000 0 352321536 0 +} +// brush 2707 +{ +( 456 -144 -416 ) ( 416 -144 -416 ) ( 416 -144 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -144 -392 ) ( 384 -152 -392 ) ( 384 -152 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 672 -152 -464 ) ( 352 -152 -464 ) ( 352 -152 -392 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 560 -128 -432 ) ( 480 -128 -432 ) ( 480 -152 -432 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 480 -152 -400 ) ( 480 -128 -400 ) ( 560 -128 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 480 -152 -400 ) ( 480 -128 -400 ) ( 480 -152 -432 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2708 +{ +( 456 -144 -416 ) ( 416 -144 -416 ) ( 416 -144 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 672 -152 -464 ) ( 352 -152 -464 ) ( 352 -152 -392 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 672 -168 -448 ) ( 672 -168 -408 ) ( 672 -136 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 560 -128 -432 ) ( 480 -128 -432 ) ( 480 -152 -432 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 480 -152 -400 ) ( 480 -128 -400 ) ( 560 -128 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 544 -128 -400 ) ( 544 -152 -400 ) ( 544 -128 -432 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2709 +{ +( 456 -144 -416 ) ( 416 -144 -416 ) ( 416 -144 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -144 -392 ) ( 384 -152 -392 ) ( 384 -152 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 672 -152 -464 ) ( 352 -152 -464 ) ( 352 -152 -392 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 672 -168 -448 ) ( 672 -168 -408 ) ( 672 -136 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 432 -168 -392 ) ( 432 -136 -392 ) ( 472 -136 -392 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 480 -128 -400 ) ( 480 -152 -400 ) ( 560 -128 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2710 +{ +( 560 -128 -432 ) ( 480 -128 -432 ) ( 480 -152 -432 ) subway/1_tile_graf10 0 0 0 0.500000 0.500000 0 318767104 0 +( 480 -152 -400 ) ( 480 -128 -400 ) ( 560 -128 -400 ) subway/1_tile_graf10 0 0 0 0.500000 0.500000 0 318767104 0 +( 480 -152 -400 ) ( 560 -152 -400 ) ( 560 -152 -432 ) subway/1_tile_graf10 64 32 0 0.500000 0.500000 0 318767104 0 +( 544 -152 -400 ) ( 544 -128 -400 ) ( 544 -128 -432 ) subway/1_tile_graf10 0 0 0 0.500000 0.500000 0 318767104 0 +( 560 -144 -400 ) ( 480 -144 -400 ) ( 480 -144 -432 ) subway/1_tile_graf10 0 0 0 0.500000 0.500000 0 318767104 0 +( 480 -128 -400 ) ( 480 -152 -400 ) ( 480 -152 -432 ) subway/1_tile_graf10 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2711 +{ +( 320 -432 -416 ) ( 320 -464 -416 ) ( 320 -464 -464 ) subway/1_tile_graf5 32 32 0 -0.500000 0.500000 0 352321536 0 +( 352 -432 -416 ) ( 320 -432 -416 ) ( 320 -432 -464 ) subway/1_tile_graf6 48 -32 0 0.500000 0.500000 0 352321536 0 +( 352 -464 -416 ) ( 352 -432 -416 ) ( 352 -432 -464 ) subway/1_tile_graf6 48 -32 0 0.500000 0.500000 0 352321536 0 +( 320 -464 -416 ) ( 352 -464 -416 ) ( 352 -464 -464 ) subway/1_tile_graf6 48 -32 0 0.500000 0.500000 0 352321536 0 +( 320 -464 -432 ) ( 320 -432 -432 ) ( 352 -432 -432 ) subway/1_tile_graf6 48 -32 0 0.500000 0.500000 0 352321536 0 +( 352 -432 -464 ) ( 320 -432 -464 ) ( 320 -464 -464 ) subway/1_tile_graf6 48 -32 0 0.500000 0.500000 0 352321536 0 +} +// brush 2712 +{ +( 352 -432 -432 ) ( 320 -432 -432 ) ( 320 -464 -432 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 320 -464 -416 ) ( 320 -432 -416 ) ( 352 -432 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 320 -464 -400 ) ( 352 -464 -400 ) ( 352 -464 -448 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 352 -464 -400 ) ( 352 -432 -400 ) ( 352 -432 -448 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 352 -432 -400 ) ( 320 -432 -400 ) ( 320 -432 -448 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 320 -432 -400 ) ( 320 -464 -400 ) ( 320 -464 -448 ) subway/1_tile 32 32 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2713 +{ +( 192 -328 -464 ) ( 192 -288 -464 ) ( 160 -288 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 160 -440 -416 ) ( 160 -752 -416 ) ( 160 -752 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 200 -440 -448 ) ( 200 -440 -408 ) ( 168 -440 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 192 -528 -424 ) ( 192 -528 -384 ) ( 192 -488 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 160 -488 -432 ) ( 160 -448 -432 ) ( 192 -448 -432 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 160 -448 -416 ) ( 192 -448 -416 ) ( 160 -448 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2714 +{ +( 192 -328 -464 ) ( 192 -288 -464 ) ( 160 -288 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 192 -728 -464 ) ( 168 -752 -464 ) ( 168 -752 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 160 -440 -416 ) ( 160 -752 -416 ) ( 160 -752 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 192 -528 -424 ) ( 192 -528 -384 ) ( 192 -488 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 160 -488 -432 ) ( 160 -448 -432 ) ( 192 -448 -432 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 192 -480 -416 ) ( 160 -480 -416 ) ( 192 -480 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2715 +{ +( 152 -296 -416 ) ( 184 -296 -416 ) ( 184 -336 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 192 -728 -464 ) ( 168 -752 -464 ) ( 168 -752 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 160 -440 -416 ) ( 160 -752 -416 ) ( 160 -752 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 200 -440 -448 ) ( 200 -440 -408 ) ( 168 -440 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 192 -528 -424 ) ( 192 -528 -384 ) ( 192 -488 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 160 -448 -432 ) ( 160 -488 -432 ) ( 192 -448 -432 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2716 +{ +( 192 -448 -464 ) ( 160 -448 -464 ) ( 160 -488 -464 ) subway/1_tile_graf6 0 -32 0 0.500000 0.500000 0 352321536 0 +( 160 -488 -432 ) ( 160 -448 -432 ) ( 192 -448 -432 ) subway/1_tile_graf6 0 -32 0 0.500000 0.500000 0 352321536 0 +( 160 -480 -416 ) ( 192 -480 -416 ) ( 192 -480 -464 ) subway/1_tile_graf6 0 -16 0 0.500000 0.500000 0 352321536 0 +( 192 -488 -416 ) ( 192 -448 -416 ) ( 192 -448 -464 ) subway/1_tile_graf6 64 -32 0 0.500000 0.500000 0 352321536 0 +( 192 -448 -416 ) ( 160 -448 -416 ) ( 160 -448 -464 ) subway/1_tile_graf6 0 -16 0 0.500000 0.500000 0 352321536 0 +( 160 -448 -416 ) ( 160 -488 -416 ) ( 160 -488 -464 ) subway/1_tile_graf6 16 -16 0 0.500000 0.500000 0 352321536 0 +} +// brush 2717 +{ +( -384 -248 -416 ) ( -64 -248 -416 ) ( -64 -248 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -416 ) ( -256 -216 -464 ) ( 136 -216 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -24 -216 -456 ) ( -96 -216 -456 ) ( -96 -256 -456 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -96 -256 -424 ) ( -96 -216 -424 ) ( -24 -216 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -64 -216 -424 ) ( -64 -256 -424 ) ( -64 -216 -472 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -32 -264 -424 ) ( -32 -224 -424 ) ( -32 -264 -472 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2718 +{ +( -384 -248 -416 ) ( -64 -248 -416 ) ( -64 -248 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -416 ) ( -256 -216 -464 ) ( 136 -216 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -464 ) ( 136 -248 -464 ) ( 136 -248 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -24 -216 -456 ) ( -96 -216 -456 ) ( -96 -256 -456 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -96 -256 -424 ) ( -96 -216 -424 ) ( -24 -216 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 0 -216 -424 ) ( 0 -256 -424 ) ( 0 -216 -472 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2719 +{ +( -96 -216 -424 ) ( -96 -256 -424 ) ( -96 -256 -472 ) subway/1_tile_graf3 128 -16 0 0.500000 0.500000 0 352321536 0 +( -24 -216 -424 ) ( -96 -216 -424 ) ( -96 -216 -472 ) subway/1_tile_graf3 128 -16 0 0.500000 0.500000 0 352321536 0 +( -64 -256 -424 ) ( -64 -216 -424 ) ( -64 -216 -472 ) subway/1_tile_graf3 128 -16 0 0.500000 0.500000 0 352321536 0 +( -96 -248 -424 ) ( -24 -248 -424 ) ( -24 -248 -472 ) subway/1_tile_graf3 128 -16 0 0.500000 0.500000 0 352321536 0 +( -96 -256 -424 ) ( -96 -216 -424 ) ( -24 -216 -424 ) subway/1_tile_graf3 128 0 0 0.500000 0.500000 0 352321536 0 +( -24 -216 -456 ) ( -96 -216 -456 ) ( -96 -256 -456 ) subway/1_tile_graf3 128 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2720 +{ +( 24 -776 -352 ) ( 16 -776 -352 ) ( 24 -776 -384 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 0 -720 -352 ) ( 16 -720 -352 ) ( 0 -760 -352 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -212 -792 -312 ) ( -172 -792 -312 ) ( -172 -792 -352 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -960 -328 ) ( 8 -992 -328 ) ( 8 -992 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 16 -620 -328 ) ( 16 -588 -328 ) ( 16 -588 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -184 -824 -384 ) ( -184 -856 -384 ) ( -144 -856 -384 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2721 +{ +( -120 -744 -304 ) ( -144 -744 -304 ) ( -120 -744 -368 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -144 -744 -336 ) ( -144 -640 -336 ) ( -120 -640 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -120 -640 -368 ) ( -144 -640 -368 ) ( -144 -744 -368 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -136 -716 -328 ) ( -136 -684 -328 ) ( -136 -684 -368 ) subway/1_tile_graf13 16 32 0 0.500000 0.500000 0 318767104 0 +( -144 -672 -328 ) ( -144 -704 -328 ) ( -144 -704 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -380 -776 -304 ) ( -340 -776 -304 ) ( -340 -776 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2722 +{ +( -120 -680 -304 ) ( -144 -680 -304 ) ( -120 -680 -368 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -144 -680 -336 ) ( -144 -576 -336 ) ( -120 -576 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -120 -576 -368 ) ( -144 -576 -368 ) ( -144 -680 -368 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -136 -652 -328 ) ( -136 -620 -328 ) ( -136 -620 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -144 -592 -328 ) ( -144 -624 -328 ) ( -144 -624 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -380 -744 -304 ) ( -340 -744 -304 ) ( -340 -744 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2723 +{ +( -96 -984 -368 ) ( -96 -984 -328 ) ( -64 -984 -328 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( -76 -952 -360 ) ( -76 -952 -320 ) ( -108 -952 -320 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -96 -992 -384 ) ( -96 -1032 -384 ) ( -64 -1032 -384 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -224 -992 -352 ) ( -224 -952 -352 ) ( -184 -952 -352 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -128 -952 -336 ) ( -128 -992 -336 ) ( -128 -952 -384 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -96 -1000 -352 ) ( -96 -976 -352 ) ( -96 -1000 -384 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2724 +{ +( -96 -984 -368 ) ( -96 -984 -328 ) ( -64 -984 -328 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -1008 -360 ) ( 128 -1008 -320 ) ( 128 -968 -320 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( -76 -952 -360 ) ( -76 -952 -320 ) ( -108 -952 -320 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -96 -992 -384 ) ( -96 -1032 -384 ) ( -64 -1032 -384 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -224 -992 -352 ) ( -224 -952 -352 ) ( -184 -952 -352 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -64 -984 -352 ) ( -64 -1008 -352 ) ( -64 -984 -384 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2725 +{ +( -32 -976 -384 ) ( -104 -976 -384 ) ( -104 -1000 -384 ) subway/1_tile_graf6 0 0 0 -0.500000 0.500000 0 352321536 0 +( -104 -1000 -352 ) ( -104 -976 -352 ) ( -32 -976 -352 ) subway/1_tile_graf6 0 0 0 -0.500000 0.500000 0 352321536 0 +( -104 -984 -352 ) ( -32 -984 -352 ) ( -32 -984 -384 ) subway/1_tile_graf6 0 0 0 -0.500000 0.500000 0 352321536 0 +( -64 -1008 -352 ) ( -64 -984 -352 ) ( -64 -984 -384 ) subway/1_tile_graf6 0 0 0 -0.500000 0.500000 0 352321536 0 +( -32 -952 -352 ) ( -104 -952 -352 ) ( -104 -952 -384 ) subway/1_tile_graf6 0 0 0 -0.500000 0.500000 0 352321536 0 +( -96 -976 -352 ) ( -96 -1000 -352 ) ( -96 -1000 -384 ) subway/1_tile_graf6 0 0 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2726 +{ +( -336 -976 -256 ) ( -336 -992 -256 ) ( -336 -976 -304 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -328 -976 -288 ) ( -368 -976 -288 ) ( -368 -992 -288 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -408 -976 -296 ) ( -192 -976 -296 ) ( -192 -976 -256 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -304 -1024 -184 ) ( -304 -992 -184 ) ( -304 -992 -224 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -432 -984 -184 ) ( -392 -984 -184 ) ( -392 -984 -224 ) subway/1_tile_damage2 8 0 0 0.500000 0.500000 0 352321536 0 +( -384 -976 -256 ) ( -232 -976 -256 ) ( -232 -1000 -256 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2727 +{ +( -416 -976 -256 ) ( -416 -992 -256 ) ( -416 -976 -304 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -408 -976 -288 ) ( -448 -976 -288 ) ( -448 -992 -288 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -488 -976 -296 ) ( -272 -976 -296 ) ( -272 -976 -256 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -336 -1024 -184 ) ( -336 -992 -184 ) ( -336 -992 -224 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -512 -984 -184 ) ( -472 -984 -184 ) ( -472 -984 -224 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -464 -976 -256 ) ( -312 -976 -256 ) ( -312 -1000 -256 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2728 +{ +( -136 -376 -416 ) ( -136 -408 -416 ) ( -136 -408 -464 ) subway/1_tile_graf1 32 24 0 0.500000 0.500000 0 352321536 0 +( -128 -376 -416 ) ( -136 -376 -416 ) ( -136 -376 -464 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -128 -408 -416 ) ( -128 -376 -416 ) ( -128 -376 -464 ) subway/1_tile_damage1 -16 -32 0 0.500000 0.500000 0 352321536 0 +( -136 -408 -416 ) ( -128 -408 -416 ) ( -128 -408 -464 ) subway/1_tile_graf1 32 24 0 0.500000 0.500000 0 352321536 0 +( -136 -408 -432 ) ( -136 -376 -432 ) ( -128 -376 -432 ) subway/1_tile_graf1 32 24 0 0.500000 0.500000 0 352321536 0 +( -128 -376 -464 ) ( -136 -376 -464 ) ( -136 -408 -464 ) subway/1_tile_graf1 32 24 0 0.500000 0.500000 0 352321536 0 +} +// brush 2729 +{ +( -128 -376 -432 ) ( -136 -376 -432 ) ( -136 -408 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -408 -416 ) ( -136 -376 -416 ) ( -128 -376 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -408 -400 ) ( -128 -408 -400 ) ( -128 -408 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -128 -408 -400 ) ( -128 -376 -400 ) ( -128 -376 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -128 -376 -400 ) ( -136 -376 -400 ) ( -136 -376 -448 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -136 -376 -400 ) ( -136 -408 -400 ) ( -136 -408 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2730 +{ +( -8 -408 -464 ) ( -8 -408 -448 ) ( -328 -408 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -440 -448 ) ( -136 -440 -408 ) ( -136 -472 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -128 -408 -448 ) ( -128 -408 -464 ) ( -128 -440 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -464 -440 -400 ) ( -464 -408 -400 ) ( -424 -408 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -112 -432 -432 ) ( -128 -432 -432 ) ( -128 -464 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -128 -432 -400 ) ( -112 -432 -400 ) ( -128 -432 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2731 +{ +( -136 -440 -448 ) ( -136 -440 -408 ) ( -136 -472 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -392 -472 -448 ) ( -392 -472 -408 ) ( -352 -472 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -128 -408 -448 ) ( -128 -408 -464 ) ( -128 -440 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -464 -440 -400 ) ( -464 -408 -400 ) ( -424 -408 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -112 -432 -432 ) ( -128 -432 -432 ) ( -128 -464 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -112 -464 -400 ) ( -128 -464 -400 ) ( -112 -464 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2732 +{ +( -8 -408 -464 ) ( -8 -408 -448 ) ( -328 -408 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -440 -448 ) ( -136 -440 -408 ) ( -136 -472 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -392 -472 -448 ) ( -392 -472 -408 ) ( -352 -472 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -128 -408 -448 ) ( -128 -408 -464 ) ( -128 -440 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -440 -408 -464 ) ( -480 -408 -464 ) ( -480 -440 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -128 -432 -432 ) ( -112 -432 -432 ) ( -128 -464 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2733 +{ +( -112 -432 -432 ) ( -128 -432 -432 ) ( -128 -464 -432 ) subway/1_tile_graf1 0 0 0 0.500000 0.500000 0 352321536 0 +( -128 -464 -400 ) ( -128 -432 -400 ) ( -112 -432 -400 ) subway/1_tile_graf1 0 0 0 0.500000 0.500000 0 352321536 0 +( -128 -464 -400 ) ( -112 -464 -400 ) ( -112 -464 -464 ) subway/1_tile_graf1 0 0 0 0.500000 0.500000 0 352321536 0 +( -128 -464 -400 ) ( -128 -432 -400 ) ( -128 -432 -464 ) subway/1_tile_graf1 32 24 0 0.500000 0.500000 0 352321536 0 +( -112 -432 -400 ) ( -128 -432 -400 ) ( -128 -432 -464 ) subway/1_tile_graf1 0 0 0 0.500000 0.500000 0 352321536 0 +( -136 -432 -400 ) ( -136 -464 -400 ) ( -136 -464 -464 ) subway/1_tile_graf1 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2734 +{ +( 136 -1224 -376 ) ( 136 -1224 -368 ) ( 136 -1160 -368 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 872 -792 -384 ) ( 872 -792 -376 ) ( 808 -792 -376 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -1080 -384 ) ( 128 -1080 -376 ) ( 128 -1144 -376 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 464 -1160 -336 ) ( 528 -1160 -336 ) ( 528 -1224 -336 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -872 -368 ) ( 120 -872 -368 ) ( 120 -896 -368 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 120 -864 -320 ) ( 136 -864 -320 ) ( 120 -864 -368 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2735 +{ +( 136 -1224 -376 ) ( 136 -1224 -368 ) ( 136 -1160 -368 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -1080 -384 ) ( 128 -1080 -376 ) ( 128 -1144 -376 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 312 -984 -392 ) ( 312 -984 -384 ) ( 376 -984 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 464 -1160 -336 ) ( 528 -1160 -336 ) ( 528 -1224 -336 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -872 -368 ) ( 120 -872 -368 ) ( 120 -896 -368 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -896 -320 ) ( 120 -896 -320 ) ( 136 -896 -368 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2736 +{ +( 136 -1224 -376 ) ( 136 -1224 -368 ) ( 136 -1160 -368 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 872 -792 -384 ) ( 872 -792 -376 ) ( 808 -792 -376 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -1080 -384 ) ( 128 -1080 -376 ) ( 128 -1144 -376 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 312 -984 -392 ) ( 312 -984 -384 ) ( 376 -984 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 544 -1216 -384 ) ( 544 -1152 -384 ) ( 480 -1152 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 120 -872 -368 ) ( 136 -872 -368 ) ( 120 -896 -368 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 2737 +{ +( 136 -872 -368 ) ( 120 -872 -368 ) ( 120 -896 -368 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 120 -896 -336 ) ( 120 -872 -336 ) ( 136 -872 -336 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 120 -896 -320 ) ( 136 -896 -320 ) ( 136 -896 -368 ) subway/1_tile_damage1 0 32 0 0.500000 0.500000 0 352321536 0 +( 136 -896 -320 ) ( 136 -872 -320 ) ( 136 -872 -368 ) subway/1_tile_damage1 0 32 0 0.500000 0.500000 0 352321536 0 +( 136 -864 -320 ) ( 120 -864 -320 ) ( 120 -864 -368 ) subway/1_tile_damage1 0 32 0 0.500000 0.500000 0 352321536 0 +( 128 -872 -320 ) ( 128 -896 -320 ) ( 128 -896 -368 ) subway/1_tile_damage1 0 32 0 0.500000 0.500000 0 352321536 0 +} +// brush 2738 +{ +( -448 -872 -296 ) ( -448 -832 -296 ) ( -448 -832 -336 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( -480 -968 -320 ) ( -480 -1008 -320 ) ( -480 -1008 -360 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( -436 -892 -320 ) ( -468 -892 -320 ) ( -468 -892 -360 ) subway/1_tile 672 -368 0 0.500000 0.500000 0 318767104 0 +( -480 -1032 -384 ) ( -448 -1032 -384 ) ( -448 -992 -384 ) subway/1_tile 672 -80 0 0.500000 0.500000 0 318767104 0 +( -480 -976 -352 ) ( -480 -936 -352 ) ( -448 -936 -352 ) subway/1_tile 672 -80 0 0.500000 0.500000 0 318767104 0 +( -480 -944 -336 ) ( -448 -944 -336 ) ( -480 -944 -384 ) subway/1_tile 672 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2739 +{ +( -448 -872 -296 ) ( -448 -832 -296 ) ( -448 -832 -336 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( -480 -984 -328 ) ( -448 -984 -328 ) ( -448 -984 -368 ) subway/1_tile 672 -368 0 0.500000 0.500000 0 318767104 0 +( -480 -968 -320 ) ( -480 -1008 -320 ) ( -480 -1008 -360 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( -480 -1032 -384 ) ( -448 -1032 -384 ) ( -448 -992 -384 ) subway/1_tile 672 -80 0 0.500000 0.500000 0 318767104 0 +( -480 -976 -352 ) ( -480 -936 -352 ) ( -448 -936 -352 ) subway/1_tile 672 -80 0 0.500000 0.500000 0 318767104 0 +( -448 -976 -336 ) ( -480 -976 -336 ) ( -448 -976 -384 ) subway/1_tile 672 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2740 +{ +( -448 -872 -296 ) ( -448 -832 -296 ) ( -448 -832 -336 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( -480 -984 -328 ) ( -448 -984 -328 ) ( -448 -984 -368 ) subway/1_tile 672 -368 0 0.500000 0.500000 0 318767104 0 +( -480 -968 -320 ) ( -480 -1008 -320 ) ( -480 -1008 -360 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( -436 -892 -320 ) ( -468 -892 -320 ) ( -468 -892 -360 ) subway/1_tile 672 -368 0 0.500000 0.500000 0 318767104 0 +( -456 -984 -336 ) ( -456 -1024 -336 ) ( -488 -1024 -336 ) subway/1_tile 672 -80 0 0.500000 0.500000 0 318767104 0 +( -480 -936 -352 ) ( -480 -976 -352 ) ( -448 -936 -352 ) subway/1_tile 672 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2741 +{ +( -448 -936 -384 ) ( -480 -936 -384 ) ( -480 -976 -384 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -480 -976 -352 ) ( -480 -936 -352 ) ( -448 -936 -352 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -480 -976 -336 ) ( -448 -976 -336 ) ( -448 -976 -384 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -448 -976 -336 ) ( -448 -936 -336 ) ( -448 -936 -384 ) subway/1_tile_damage2 40 0 0 0.500000 0.500000 0 352321536 0 +( -448 -944 -336 ) ( -480 -944 -336 ) ( -480 -944 -384 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -480 -936 -336 ) ( -480 -976 -336 ) ( -480 -976 -384 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2742 +{ +( -296 -832 -336 ) ( -296 -832 -296 ) ( -296 -872 -296 ) subway/1_tile 80 -368 0 0.500000 0.500000 0 318767104 0 +( -96 -984 -368 ) ( -96 -984 -328 ) ( -64 -984 -328 ) subway/1_tile 368 -368 0 0.500000 0.500000 0 318767104 0 +( -76 -952 -360 ) ( -76 -952 -320 ) ( -108 -952 -320 ) subway/1_tile 64 64 0 -0.500000 0.500000 0 318767104 0 +( -96 -992 -384 ) ( -96 -1032 -384 ) ( -64 -1032 -384 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -224 -992 -352 ) ( -224 -952 -352 ) ( -184 -952 -352 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( -248 -992 -336 ) ( -248 -952 -336 ) ( -248 -992 -384 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2743 +{ +( -208 -952 -384 ) ( -248 -952 -384 ) ( -248 -992 -384 ) subway/1_tile_graf5 16 32 0 0.500000 0.500000 0 352321536 0 +( -248 -992 -352 ) ( -248 -952 -352 ) ( -208 -952 -352 ) subway/1_tile_graf5 16 32 0 0.500000 0.500000 0 352321536 0 +( -248 -984 -336 ) ( -208 -984 -336 ) ( -208 -984 -384 ) subway/1_tile_graf5 16 32 0 0.500000 0.500000 0 352321536 0 +( -216 -992 -336 ) ( -216 -952 -336 ) ( -216 -952 -384 ) subway/1_tile_graf5 32 32 0 0.500000 0.500000 0 352321536 0 +( -200 -952 -336 ) ( -240 -952 -336 ) ( -240 -952 -384 ) subway/1_tile_graf9 16 0 0 -0.500000 0.500000 0 352321536 0 +( -248 -952 -336 ) ( -248 -992 -336 ) ( -248 -992 -384 ) subway/1_tile_graf5 32 32 0 0.500000 0.500000 0 352321536 0 +} +// brush 2744 +{ +( -588 -824 -304 ) ( -548 -824 -304 ) ( -548 -824 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -380 -800 -328 ) ( -380 -832 -328 ) ( -380 -832 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -152 -792 -312 ) ( -192 -792 -312 ) ( -192 -792 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -288 -816 -336 ) ( -328 -816 -336 ) ( -328 -784 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -288 -792 -352 ) ( -288 -824 -352 ) ( -240 -792 -352 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -240 -824 -320 ) ( -240 -792 -320 ) ( -240 -824 -368 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2745 +{ +( -588 -824 -304 ) ( -548 -824 -304 ) ( -548 -824 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -152 -792 -312 ) ( -192 -792 -312 ) ( -192 -792 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -128 -820 -328 ) ( -128 -788 -328 ) ( -128 -788 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -288 -816 -336 ) ( -328 -816 -336 ) ( -328 -784 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -288 -792 -352 ) ( -288 -824 -352 ) ( -240 -792 -352 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -208 -792 -320 ) ( -208 -824 -320 ) ( -208 -792 -368 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2746 +{ +( -588 -824 -304 ) ( -548 -824 -304 ) ( -548 -824 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -152 -792 -312 ) ( -192 -792 -312 ) ( -192 -792 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -288 -824 -352 ) ( -288 -792 -352 ) ( -240 -792 -352 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -256 -792 -336 ) ( -256 -824 -336 ) ( -256 -792 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -200 -792 -368 ) ( -248 -792 -368 ) ( -248 -824 -368 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -240 -824 -320 ) ( -240 -792 -320 ) ( -240 -824 -368 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2747 +{ +( -588 -824 -304 ) ( -548 -824 -304 ) ( -548 -824 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -152 -792 -312 ) ( -192 -792 -312 ) ( -192 -792 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -128 -820 -328 ) ( -128 -788 -328 ) ( -128 -788 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -288 -824 -352 ) ( -288 -792 -352 ) ( -240 -792 -352 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -200 -792 -368 ) ( -248 -792 -368 ) ( -248 -824 -368 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -208 -792 -320 ) ( -208 -824 -320 ) ( -208 -792 -368 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2748 +{ +( -588 -824 -304 ) ( -548 -824 -304 ) ( -548 -824 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -152 -792 -312 ) ( -192 -792 -312 ) ( -192 -792 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -128 -820 -328 ) ( -128 -788 -328 ) ( -128 -788 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -336 -792 -384 ) ( -336 -824 -384 ) ( -296 -824 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -256 -792 -336 ) ( -256 -824 -336 ) ( -256 -792 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -248 -792 -368 ) ( -200 -792 -368 ) ( -248 -824 -368 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2749 +{ +( -288 -792 -336 ) ( -288 -824 -336 ) ( -288 -824 -384 ) subway/1_tile_graf4 0 0 0 0.500000 0.500000 0 352321536 0 +( -248 -792 -336 ) ( -296 -792 -336 ) ( -296 -792 -384 ) subway/1_tile_graf4 64 0 0 0.500000 0.500000 0 352321536 0 +( -256 -824 -336 ) ( -256 -792 -336 ) ( -256 -792 -384 ) subway/1_tile_graf4 0 0 0 0.500000 0.500000 0 352321536 0 +( -296 -824 -336 ) ( -248 -824 -336 ) ( -248 -824 -384 ) subway/1_tile_graf4 64 0 0 0.500000 0.500000 0 352321536 0 +( -288 -824 -352 ) ( -288 -792 -352 ) ( -240 -792 -352 ) subway/1_tile_graf4 64 0 0 0.500000 0.500000 0 352321536 0 +( -248 -792 -384 ) ( -296 -792 -384 ) ( -296 -824 -384 ) subway/1_tile_graf4 64 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2750 +{ +( -588 -824 -304 ) ( -548 -824 -304 ) ( -548 -824 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -380 -800 -328 ) ( -380 -832 -328 ) ( -380 -832 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -152 -792 -312 ) ( -192 -792 -312 ) ( -192 -792 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -336 -792 -384 ) ( -336 -824 -384 ) ( -296 -824 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -288 -824 -352 ) ( -288 -792 -352 ) ( -240 -792 -352 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -288 -824 -336 ) ( -288 -792 -336 ) ( -288 -824 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 2751 +{ +( -200 -792 -368 ) ( -248 -792 -368 ) ( -248 -824 -368 ) subway/1_tile_graf4 -32 0 0 0.500000 0.500000 0 352321536 0 +( -240 -824 -336 ) ( -240 -792 -336 ) ( -192 -792 -336 ) subway/1_tile_graf4 -32 0 0 0.500000 0.500000 0 352321536 0 +( -248 -824 -320 ) ( -200 -824 -320 ) ( -200 -824 -368 ) subway/1_tile_graf5 32 32 0 0.500000 0.500000 0 352321536 0 +( -208 -824 -320 ) ( -208 -792 -320 ) ( -208 -792 -368 ) subway/1_tile_graf4 0 32 0 0.500000 0.500000 0 352321536 0 +( -200 -792 -320 ) ( -248 -792 -320 ) ( -248 -792 -368 ) subway/1_tile_graf4 -32 32 0 0.500000 0.500000 0 352321536 0 +( -240 -792 -320 ) ( -240 -824 -320 ) ( -240 -824 -368 ) subway/1_tile_graf4 0 32 0 0.500000 0.500000 0 352321536 0 +} +// brush 2752 +{ +( -464 -976 -256 ) ( -312 -976 -256 ) ( -312 -1000 -256 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -464 -968 -184 ) ( -464 -1000 -184 ) ( -464 -1000 -224 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -448 -984 -184 ) ( -408 -984 -184 ) ( -408 -984 -224 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -488 -976 -296 ) ( -272 -976 -296 ) ( -272 -976 -256 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -408 -976 -288 ) ( -448 -976 -288 ) ( -448 -992 -288 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -448 -992 -256 ) ( -448 -976 -256 ) ( -448 -992 -304 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2753 +{ +( -352 -976 -256 ) ( -200 -976 -256 ) ( -200 -1000 -256 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -400 -984 -184 ) ( -360 -984 -184 ) ( -360 -984 -224 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -272 -1024 -184 ) ( -272 -992 -184 ) ( -272 -992 -224 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -376 -976 -296 ) ( -160 -976 -296 ) ( -160 -976 -256 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -296 -976 -288 ) ( -336 -976 -288 ) ( -336 -992 -288 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -304 -976 -256 ) ( -304 -992 -256 ) ( -304 -976 -304 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2754 +{ +( -272 -976 -296 ) ( -488 -976 -296 ) ( -488 -984 -304 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -464 -968 -184 ) ( -464 -1000 -184 ) ( -464 -1000 -224 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -424 -984 -184 ) ( -384 -984 -184 ) ( -384 -984 -224 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -272 -1024 -184 ) ( -272 -992 -184 ) ( -272 -992 -224 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -488 -976 -296 ) ( -272 -976 -296 ) ( -272 -976 -256 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -448 -976 -288 ) ( -408 -976 -288 ) ( -448 -992 -288 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2755 +{ +( -408 -976 -288 ) ( -448 -976 -288 ) ( -448 -992 -288 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( -448 -992 -256 ) ( -448 -976 -256 ) ( -408 -976 -256 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( -448 -984 -256 ) ( -408 -984 -256 ) ( -408 -984 -304 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( -416 -992 -256 ) ( -416 -976 -256 ) ( -416 -976 -304 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( -408 -976 -256 ) ( -448 -976 -256 ) ( -448 -976 -304 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( -448 -976 -256 ) ( -448 -992 -256 ) ( -448 -992 -304 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2756 +{ +( -448 -992 -304 ) ( -464 -992 -304 ) ( -464 -1176 -304 ) subway/1_tile 448 -80 0 0.500000 0.500000 0 318767104 0 +( -456 -1168 -160 ) ( -456 -984 -160 ) ( -456 -984 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -448 -984 -160 ) ( -464 -984 -160 ) ( -464 -984 -184 ) subway/1_tile 448 -224 0 0.500000 0.500000 0 318767104 0 +( -464 -992 -160 ) ( -464 -1176 -160 ) ( -464 -1176 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -456 -1112 -272 ) ( -456 -1072 -272 ) ( -440 -1072 -272 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -456 -1080 -256 ) ( -440 -1080 -256 ) ( -456 -1080 -304 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2757 +{ +( -448 -992 -304 ) ( -464 -992 -304 ) ( -464 -1176 -304 ) subway/1_tile 448 -80 0 0.500000 0.500000 0 318767104 0 +( -464 -1176 -160 ) ( -448 -1176 -160 ) ( -448 -1176 -184 ) subway/1_tile 448 -224 0 0.500000 0.500000 0 318767104 0 +( -456 -1168 -160 ) ( -456 -984 -160 ) ( -456 -984 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -464 -992 -160 ) ( -464 -1176 -160 ) ( -464 -1176 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -456 -1112 -272 ) ( -456 -1072 -272 ) ( -440 -1072 -272 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -440 -1112 -256 ) ( -456 -1112 -256 ) ( -440 -1112 -304 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2758 +{ +( -464 -1176 -256 ) ( -464 -992 -256 ) ( -448 -992 -256 ) subway/1_tile 448 -80 0 0.500000 0.500000 0 318767104 0 +( -464 -1176 -160 ) ( -448 -1176 -160 ) ( -448 -1176 -184 ) subway/1_tile 448 -224 0 0.500000 0.500000 0 318767104 0 +( -456 -1168 -160 ) ( -456 -984 -160 ) ( -456 -984 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -448 -984 -160 ) ( -464 -984 -160 ) ( -464 -984 -184 ) subway/1_tile 448 -224 0 0.500000 0.500000 0 318767104 0 +( -464 -992 -160 ) ( -464 -1176 -160 ) ( -464 -1176 -184 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +( -456 -1072 -272 ) ( -456 -1112 -272 ) ( -440 -1072 -272 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2759 +{ +( -440 -1072 -304 ) ( -456 -1072 -304 ) ( -456 -1112 -304 ) subway/1_tile_damage2 8 -24 0 0.500000 0.500000 0 352321536 0 +( -456 -1112 -272 ) ( -456 -1072 -272 ) ( -440 -1072 -272 ) subway/1_tile_damage2 8 -24 0 0.500000 0.500000 0 352321536 0 +( -456 -1112 -256 ) ( -440 -1112 -256 ) ( -440 -1112 -304 ) subway/1_tile_damage2 8 -24 0 0.500000 0.500000 0 352321536 0 +( -456 -1112 -256 ) ( -456 -1072 -256 ) ( -456 -1072 -304 ) subway/1_tile_damage2 56 -32 0 0.500000 0.500000 0 352321536 0 +( -440 -1080 -256 ) ( -456 -1080 -256 ) ( -456 -1080 -304 ) subway/1_tile_damage2 8 -24 0 0.500000 0.500000 0 352321536 0 +( -464 -1072 -256 ) ( -464 -1112 -256 ) ( -464 -1112 -304 ) subway/1_tile_damage2 8 -24 0 0.500000 0.500000 0 352321536 0 +} +// brush 2760 +{ +( 160 -1216 -296 ) ( 160 -1216 -256 ) ( 128 -1216 -256 ) subway/1_tile -48 -224 0 0.500000 0.500000 0 318767104 0 +( 136 -1216 -288 ) ( 136 -1216 -248 ) ( 136 -1176 -248 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 128 -1256 -272 ) ( 128 -1256 -232 ) ( 128 -1296 -232 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 112 -1360 -280 ) ( 112 -1328 -280 ) ( 144 -1328 -280 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 136 -1280 -288 ) ( 112 -1280 -288 ) ( 112 -1312 -288 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 112 -1280 -256 ) ( 136 -1280 -256 ) ( 112 -1280 -288 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2761 +{ +( 136 -1216 -288 ) ( 136 -1216 -248 ) ( 136 -1176 -248 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 128 -1256 -272 ) ( 128 -1256 -232 ) ( 128 -1296 -232 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 112 -1360 -280 ) ( 112 -1328 -280 ) ( 144 -1328 -280 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 104 -1328 -256 ) ( 136 -1328 -256 ) ( 104 -1328 -312 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 136 -1280 -288 ) ( 112 -1280 -288 ) ( 112 -1312 -288 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 136 -1312 -256 ) ( 112 -1312 -256 ) ( 136 -1312 -288 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2762 +{ +( 128 -1264 -312 ) ( 128 -1304 -312 ) ( 160 -1304 -312 ) subway/1_tile -48 -624 0 0.500000 0.500000 0 318767104 0 +( 160 -1216 -296 ) ( 160 -1216 -256 ) ( 128 -1216 -256 ) subway/1_tile -48 -224 0 0.500000 0.500000 0 318767104 0 +( 136 -1216 -288 ) ( 136 -1216 -248 ) ( 136 -1176 -248 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 128 -1256 -272 ) ( 128 -1256 -232 ) ( 128 -1296 -232 ) subway/1_tile 128 0 0 -0.500000 0.500000 0 318767104 0 +( 104 -1328 -256 ) ( 136 -1328 -256 ) ( 104 -1328 -312 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 112 -1280 -288 ) ( 136 -1280 -288 ) ( 112 -1312 -288 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2763 +{ +( 168 -1296 -256 ) ( 136 -1296 -256 ) ( 136 -1256 -256 ) subway/1_tile -48 -624 0 0.500000 0.500000 0 318767104 0 +( 160 -1216 -296 ) ( 160 -1216 -256 ) ( 128 -1216 -256 ) subway/1_tile -48 -224 0 0.500000 0.500000 0 318767104 0 +( 136 -1216 -288 ) ( 136 -1216 -248 ) ( 136 -1176 -248 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 128 -1256 -272 ) ( 128 -1256 -232 ) ( 128 -1296 -232 ) subway/1_tile 128 0 0 -0.500000 0.500000 0 318767104 0 +( 112 -1328 -280 ) ( 112 -1360 -280 ) ( 144 -1328 -280 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 112 -1280 -256 ) ( 136 -1280 -256 ) ( 112 -1280 -288 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2764 +{ +( 168 -1296 -256 ) ( 136 -1296 -256 ) ( 136 -1256 -256 ) subway/1_tile -48 -624 0 0.500000 0.500000 0 318767104 0 +( 136 -1216 -288 ) ( 136 -1216 -248 ) ( 136 -1176 -248 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 120 -1400 -296 ) ( 120 -1400 -256 ) ( 152 -1400 -256 ) subway/1_tile -48 -224 0 0.500000 0.500000 0 318767104 0 +( 128 -1256 -272 ) ( 128 -1256 -232 ) ( 128 -1296 -232 ) subway/1_tile 128 0 0 -0.500000 0.500000 0 318767104 0 +( 112 -1328 -280 ) ( 112 -1360 -280 ) ( 144 -1328 -280 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 136 -1312 -256 ) ( 112 -1312 -256 ) ( 136 -1312 -288 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2765 +{ +( 136 -1280 -288 ) ( 112 -1280 -288 ) ( 112 -1312 -288 ) subway/1_tile_graf6 80 0 0 -0.500000 0.500000 0 352321536 0 +( 112 -1312 -256 ) ( 112 -1280 -256 ) ( 136 -1280 -256 ) subway/1_tile_graf6 80 0 0 -0.500000 0.500000 0 352321536 0 +( 112 -1312 -256 ) ( 136 -1312 -256 ) ( 136 -1312 -288 ) subway/1_tile_graf6 80 0 0 -0.500000 0.500000 0 352321536 0 +( 136 -1312 -256 ) ( 136 -1280 -256 ) ( 136 -1280 -288 ) subway/1_tile_graf6 80 0 0 -0.500000 0.500000 0 352321536 0 +( 144 -1280 -256 ) ( 120 -1280 -256 ) ( 120 -1280 -288 ) subway/1_tile_graf6 80 0 0 -0.500000 0.500000 0 352321536 0 +( 128 -1280 -256 ) ( 128 -1312 -256 ) ( 128 -1312 -288 ) subway/1_tile_graf5 128 0 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2766 +{ +( 128 -1264 -312 ) ( 128 -1304 -312 ) ( 160 -1304 -312 ) subway/1_tile -48 -624 0 0.500000 0.500000 0 318767104 0 +( 136 -1216 -288 ) ( 136 -1216 -248 ) ( 136 -1176 -248 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 120 -1400 -296 ) ( 120 -1400 -256 ) ( 152 -1400 -256 ) subway/1_tile -48 -224 0 0.500000 0.500000 0 318767104 0 +( 128 -1256 -272 ) ( 128 -1256 -232 ) ( 128 -1296 -232 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 112 -1360 -280 ) ( 112 -1328 -280 ) ( 144 -1328 -280 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +( 144 -1360 -256 ) ( 112 -1360 -256 ) ( 144 -1360 -312 ) subway/1_tile 624 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 2767 +{ +( 144 -1328 -312 ) ( 112 -1328 -312 ) ( 112 -1360 -312 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 112 -1360 -280 ) ( 112 -1328 -280 ) ( 144 -1328 -280 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 112 -1360 -256 ) ( 144 -1360 -256 ) ( 144 -1360 -312 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 136 -1360 -256 ) ( 136 -1328 -256 ) ( 136 -1328 -312 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 136 -1328 -256 ) ( 104 -1328 -256 ) ( 104 -1328 -312 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 128 -1328 -256 ) ( 128 -1360 -256 ) ( 128 -1360 -312 ) subway/1_tile_damage1 160 16 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2768 +{ +( 48 -1400 -272 ) ( 48 -1400 -232 ) ( 8 -1400 -232 ) subway/1_tile 48 16 0 -0.500000 0.500000 0 318767104 0 +( -496 -1392 -296 ) ( -496 -1392 -256 ) ( -496 -1424 -256 ) subway/1_tile 128 -224 0 0.500000 0.500000 0 318767104 0 +( -32 -1408 -288 ) ( -32 -1408 -248 ) ( 8 -1408 -248 ) subway/1_tile 816 -224 0 0.500000 0.500000 0 318767104 0 +( -8 -1408 -280 ) ( -8 -1392 -280 ) ( 48 -1392 -280 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +( -136 -1392 -296 ) ( -208 -1392 -296 ) ( -208 -1416 -296 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +( -208 -1416 -264 ) ( -208 -1392 -264 ) ( -208 -1416 -296 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +} +// brush 2769 +{ +( 48 -1400 -272 ) ( 48 -1400 -232 ) ( 8 -1400 -232 ) subway/1_tile 48 16 0 -0.500000 0.500000 0 318767104 0 +( -32 -1408 -288 ) ( -32 -1408 -248 ) ( 8 -1408 -248 ) subway/1_tile 816 -224 0 0.500000 0.500000 0 318767104 0 +( -8 -1408 -280 ) ( -8 -1392 -280 ) ( 48 -1392 -280 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +( -8 -1408 -256 ) ( -8 -1392 -256 ) ( -8 -1408 -312 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +( -136 -1392 -296 ) ( -208 -1392 -296 ) ( -208 -1416 -296 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +( -208 -1392 -264 ) ( -208 -1416 -264 ) ( -208 -1392 -296 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +} +// brush 2770 +{ +( 48 -1400 -272 ) ( 48 -1400 -232 ) ( 8 -1400 -232 ) subway/1_tile 48 16 0 -0.500000 0.500000 0 318767104 0 +( -496 -1392 -296 ) ( -496 -1392 -256 ) ( -496 -1424 -256 ) subway/1_tile 128 -224 0 0.500000 0.500000 0 318767104 0 +( -32 -1408 -288 ) ( -32 -1408 -248 ) ( 8 -1408 -248 ) subway/1_tile 816 -224 0 0.500000 0.500000 0 318767104 0 +( 80 -1400 -312 ) ( 40 -1400 -312 ) ( 40 -1432 -312 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +( -8 -1408 -256 ) ( -8 -1392 -256 ) ( -8 -1408 -312 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +( -208 -1392 -296 ) ( -136 -1392 -296 ) ( -208 -1416 -296 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +} +// brush 2771 +{ +( 48 -1400 -272 ) ( 48 -1400 -232 ) ( 8 -1400 -232 ) subway/1_tile 48 16 0 -0.500000 0.500000 0 318767104 0 +( -496 -1392 -296 ) ( -496 -1392 -256 ) ( -496 -1424 -256 ) subway/1_tile 128 -224 0 0.500000 0.500000 0 318767104 0 +( -32 -1408 -288 ) ( -32 -1408 -248 ) ( 8 -1408 -248 ) subway/1_tile 816 -224 0 0.500000 0.500000 0 318767104 0 +( -8 -1392 -280 ) ( -8 -1408 -280 ) ( 48 -1392 -280 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +( -208 -1416 -264 ) ( -208 -1392 -264 ) ( -136 -1392 -264 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +( -208 -1416 -264 ) ( -208 -1392 -264 ) ( -208 -1416 -296 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +} +// brush 2772 +{ +( 48 -1400 -272 ) ( 48 -1400 -232 ) ( 8 -1400 -232 ) subway/1_tile 48 16 0 -0.500000 0.500000 0 318767104 0 +( -32 -1408 -288 ) ( -32 -1408 -248 ) ( 8 -1408 -248 ) subway/1_tile 816 -224 0 0.500000 0.500000 0 318767104 0 +( 144 -1432 -296 ) ( 144 -1432 -256 ) ( 144 -1400 -256 ) subway/1_tile 128 -224 0 0.500000 0.500000 0 318767104 0 +( -8 -1392 -280 ) ( -8 -1408 -280 ) ( 48 -1392 -280 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +( -208 -1416 -264 ) ( -208 -1392 -264 ) ( -136 -1392 -264 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +( -208 -1392 -264 ) ( -208 -1416 -264 ) ( -208 -1392 -296 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +} +// brush 2773 +{ +( 48 -1400 -272 ) ( 48 -1400 -232 ) ( 8 -1400 -232 ) subway/1_tile 48 16 0 -0.500000 0.500000 0 318767104 0 +( -496 -1392 -296 ) ( -496 -1392 -256 ) ( -496 -1424 -256 ) subway/1_tile 128 -224 0 0.500000 0.500000 0 318767104 0 +( -32 -1408 -288 ) ( -32 -1408 -248 ) ( 8 -1408 -248 ) subway/1_tile 816 -224 0 0.500000 0.500000 0 318767104 0 +( 144 -1432 -296 ) ( 144 -1432 -256 ) ( 144 -1400 -256 ) subway/1_tile 128 -224 0 0.500000 0.500000 0 318767104 0 +( 48 -1440 -256 ) ( 48 -1408 -256 ) ( 88 -1408 -256 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +( -208 -1392 -264 ) ( -208 -1416 -264 ) ( -136 -1392 -264 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +} +// brush 2774 +{ +( 48 -1400 -272 ) ( 48 -1400 -232 ) ( 8 -1400 -232 ) subway/1_tile 48 16 0 -0.500000 0.500000 0 318767104 0 +( -32 -1408 -288 ) ( -32 -1408 -248 ) ( 8 -1408 -248 ) subway/1_tile 816 -224 0 0.500000 0.500000 0 318767104 0 +( 144 -1432 -296 ) ( 144 -1432 -256 ) ( 144 -1400 -256 ) subway/1_tile 128 -224 0 0.500000 0.500000 0 318767104 0 +( 80 -1400 -312 ) ( 40 -1400 -312 ) ( 40 -1432 -312 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +( -8 -1408 -280 ) ( -8 -1392 -280 ) ( 48 -1392 -280 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +( 24 -1392 -256 ) ( 24 -1408 -256 ) ( 24 -1392 -312 ) subway/1_tile 144 -800 0 0.500000 0.500000 0 318767104 0 +} +// brush 2775 +{ +( 48 -1392 -312 ) ( -8 -1392 -312 ) ( -8 -1408 -312 ) subway/1_tile_graf3 0 0 0 0.500000 0.500000 0 352321536 0 +( -8 -1408 -280 ) ( -8 -1392 -280 ) ( 48 -1392 -280 ) subway/1_tile_graf3 0 0 0 0.500000 0.500000 0 352321536 0 +( -8 -1408 -256 ) ( 48 -1408 -256 ) ( 48 -1408 -312 ) subway/1_tile_graf3 0 0 0 0.500000 0.500000 0 352321536 0 +( 24 -1408 -256 ) ( 24 -1392 -256 ) ( 24 -1392 -312 ) subway/1_tile_graf3 0 0 0 0.500000 0.500000 0 352321536 0 +( 48 -1400 -256 ) ( -8 -1400 -256 ) ( -8 -1400 -312 ) subway/1_tile_graf3 48 16 0 -0.500000 0.500000 0 352321536 0 +( -8 -1392 -256 ) ( -8 -1408 -256 ) ( -8 -1408 -312 ) subway/1_tile_graf3 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2776 +{ +( -56 -1216 -160 ) ( -16 -1216 -160 ) ( -16 -1216 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 144 -1208 -192 ) ( -8 -1208 -192 ) ( -8 -1208 -216 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 104 -1176 -224 ) ( 56 -1176 -224 ) ( 56 -1216 -224 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 56 -1216 -192 ) ( 56 -1176 -192 ) ( 104 -1176 -192 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 96 -1216 -192 ) ( 96 -1176 -192 ) ( 96 -1216 -248 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -56 -1176 -192 ) ( -56 -1216 -192 ) ( -56 -1176 -248 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2777 +{ +( -48 -1176 -184 ) ( 104 -1176 -184 ) ( 104 -1200 -184 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -96 -1192 -160 ) ( -96 -1224 -160 ) ( -96 -1224 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -56 -1216 -160 ) ( -16 -1216 -160 ) ( -16 -1216 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 144 -1224 -160 ) ( 144 -1192 -160 ) ( 144 -1192 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 144 -1208 -192 ) ( -8 -1208 -192 ) ( -8 -1208 -216 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 56 -1176 -192 ) ( 56 -1216 -192 ) ( 104 -1176 -192 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2778 +{ +( 40 -1224 -240 ) ( 40 -1192 -240 ) ( 0 -1192 -240 ) subway/con10 0 16 0 0.500000 0.500000 0 285212672 0 +( -96 -1192 -160 ) ( -96 -1224 -160 ) ( -96 -1224 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -56 -1216 -160 ) ( -16 -1216 -160 ) ( -16 -1216 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 96 -1224 -160 ) ( 96 -1192 -160 ) ( 96 -1192 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 144 -1208 -192 ) ( -8 -1208 -192 ) ( -8 -1208 -216 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 56 -1176 -224 ) ( 104 -1176 -224 ) ( 56 -1216 -224 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2779 +{ +( -72 -912 -160 ) ( -72 -952 -160 ) ( -72 -952 -200 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( -32 -888 -184 ) ( -64 -888 -184 ) ( -64 -888 -224 ) subway/1_tile 336 -80 0 0.500000 0.500000 0 318767104 0 +( -56 -952 -176 ) ( -56 -912 -176 ) ( -56 -912 -216 ) subway/1_tilegraf17 -16 32 0 0.500000 0.500000 0 318767104 0 +( -32 -864 -240 ) ( -64 -864 -240 ) ( -64 -904 -240 ) subway/1_tile 336 0 0 0.500000 0.500000 0 318767104 0 +( -56 -952 -208 ) ( -56 -920 -208 ) ( -48 -920 -208 ) subway/1_tile 336 0 0 0.500000 0.500000 0 318767104 0 +( -56 -920 -184 ) ( -48 -920 -184 ) ( -56 -920 -240 ) subway/1_tile 336 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2780 +{ +( -72 -912 -160 ) ( -72 -952 -160 ) ( -72 -952 -200 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( -56 -952 -176 ) ( -56 -912 -176 ) ( -56 -912 -216 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( -64 -984 -184 ) ( -32 -984 -184 ) ( -32 -984 -224 ) subway/1_tile 336 -80 0 0.500000 0.500000 0 318767104 0 +( -32 -864 -240 ) ( -64 -864 -240 ) ( -64 -904 -240 ) subway/1_tile 336 0 0 0.500000 0.500000 0 318767104 0 +( -56 -952 -208 ) ( -56 -920 -208 ) ( -48 -920 -208 ) subway/1_tile 336 0 0 0.500000 0.500000 0 318767104 0 +( -48 -952 -184 ) ( -56 -952 -184 ) ( -48 -952 -240 ) subway/1_tile 336 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2781 +{ +( -72 -912 -160 ) ( -72 -952 -160 ) ( -72 -952 -200 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( -32 -888 -184 ) ( -64 -888 -184 ) ( -64 -888 -224 ) subway/1_tile 336 -80 0 0.500000 0.500000 0 318767104 0 +( -56 -952 -176 ) ( -56 -912 -176 ) ( -56 -912 -216 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( -64 -984 -184 ) ( -32 -984 -184 ) ( -32 -984 -224 ) subway/1_tile 336 -80 0 0.500000 0.500000 0 318767104 0 +( -64 -912 -184 ) ( -64 -872 -184 ) ( -32 -872 -184 ) subway/1_tile 336 0 0 0.500000 0.500000 0 318767104 0 +( -56 -920 -208 ) ( -56 -952 -208 ) ( -48 -920 -208 ) subway/1_tile 336 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2782 +{ +( -48 -920 -240 ) ( -56 -920 -240 ) ( -56 -952 -240 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -56 -952 -208 ) ( -56 -920 -208 ) ( -48 -920 -208 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -56 -952 -184 ) ( -48 -952 -184 ) ( -48 -952 -240 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -56 -952 -184 ) ( -56 -920 -184 ) ( -56 -920 -240 ) subway/1_tile_damage2 -16 -32 0 0.500000 0.500000 0 352321536 0 +( -48 -920 -184 ) ( -56 -920 -184 ) ( -56 -920 -240 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -72 -920 -184 ) ( -72 -952 -184 ) ( -72 -952 -240 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2783 +{ +( -88 -616 -160 ) ( -88 -656 -160 ) ( -88 -656 -200 ) subway/1_tile -512 -80 0 0.500000 0.500000 0 318767104 0 +( -48 -656 -184 ) ( -80 -656 -184 ) ( -80 -656 -224 ) subway/1_tile 384 -80 0 0.500000 0.500000 0 318767104 0 +( -56 -736 -176 ) ( -56 -696 -176 ) ( -56 -696 -216 ) subway/1_tile -512 -80 0 0.500000 0.500000 0 318767104 0 +( -88 -696 -184 ) ( -56 -696 -184 ) ( -56 -696 -224 ) subway/1_tile 384 -80 0 0.500000 0.500000 0 318767104 0 +( -80 -656 -184 ) ( -80 -616 -184 ) ( -48 -616 -184 ) subway/1_tile 384 512 0 0.500000 0.500000 0 318767104 0 +( -56 -608 -208 ) ( -88 -608 -208 ) ( -88 -648 -208 ) subway/1_tile 384 512 0 0.500000 0.500000 0 318767104 0 +} +// brush 2784 +{ +( -120 -824 -240 ) ( -88 -824 -240 ) ( -88 -784 -240 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -96 -728 -176 ) ( -96 -768 -176 ) ( -96 -768 -216 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -120 -856 -184 ) ( -88 -856 -184 ) ( -88 -856 -224 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -88 -880 -160 ) ( -88 -840 -160 ) ( -88 -840 -200 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -88 -760 -208 ) ( -88 -728 -208 ) ( -80 -728 -208 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -80 -816 -184 ) ( -88 -816 -184 ) ( -80 -816 -240 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2785 +{ +( -88 -744 -184 ) ( -88 -784 -184 ) ( -120 -784 -184 ) subway/1_tile 304 352 0 0.500000 0.500000 0 318767104 0 +( -88 -696 -184 ) ( -120 -696 -184 ) ( -120 -696 -224 ) subway/1_tile -320 -80 0 0.500000 0.500000 0 318767104 0 +( -96 -696 -176 ) ( -96 -736 -176 ) ( -96 -736 -216 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -120 -856 -184 ) ( -88 -856 -184 ) ( -88 -856 -224 ) subway/1_tile -320 -80 0 0.500000 0.500000 0 318767104 0 +( -88 -784 -160 ) ( -88 -744 -160 ) ( -88 -744 -200 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -88 -696 -208 ) ( -88 -728 -208 ) ( -80 -696 -208 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2786 +{ +( -80 -696 -240 ) ( -88 -696 -240 ) ( -88 -728 -240 ) subway/1_tile_damage1 56 32 0 0.500000 0.500000 0 352321536 0 +( -88 -728 -208 ) ( -88 -696 -208 ) ( -80 -696 -208 ) subway/1_tile_damage1 56 32 0 0.500000 0.500000 0 352321536 0 +( -88 -728 -184 ) ( -80 -728 -184 ) ( -80 -728 -240 ) subway/1_tile_damage1 56 32 0 0.500000 0.500000 0 352321536 0 +( -88 -728 -184 ) ( -88 -696 -184 ) ( -88 -696 -240 ) subway/1_tile_damage1 56 32 0 0.500000 0.500000 0 352321536 0 +( -80 -696 -184 ) ( -88 -696 -184 ) ( -88 -696 -240 ) subway/1_tile_damage1 56 32 0 0.500000 0.500000 0 352321536 0 +( -96 -696 -184 ) ( -96 -728 -184 ) ( -96 -728 -240 ) subway/1_tile_damage1 56 32 0 0.500000 0.500000 0 352321536 0 +} +// brush 2787 +{ +( 16 -664 -160 ) ( 56 -664 -160 ) ( 56 -664 -200 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -56 -632 -184 ) ( -56 -664 -184 ) ( -56 -664 -224 ) subway/1_tile -544 -80 0 0.500000 0.500000 0 318767104 0 +( 104 -656 -176 ) ( 64 -656 -176 ) ( 64 -656 -216 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 8 -632 -240 ) ( 8 -664 -240 ) ( 48 -664 -240 ) subway/1_tile 80 544 0 0.500000 0.500000 0 318767104 0 +( -16 -664 -208 ) ( -16 -656 -208 ) ( 16 -656 -208 ) subway/1_tile 80 544 0 0.500000 0.500000 0 318767104 0 +( -48 -664 -184 ) ( -48 -656 -184 ) ( -48 -664 -240 ) subway/1_tile 80 544 0 0.500000 0.500000 0 318767104 0 +} +// brush 2788 +{ +( -16 -656 -184 ) ( -16 -664 -184 ) ( -16 -664 -240 ) subway/1_tile_graf9 0 0 0 0.500000 0.500000 0 352321536 0 +( 16 -656 -184 ) ( -16 -656 -184 ) ( -16 -656 -240 ) subway/1_tile_graf9 0 0 0 0.500000 0.500000 0 352321536 0 +( 16 -664 -184 ) ( 16 -656 -184 ) ( 16 -656 -240 ) subway/1_tile_graf9 0 0 0 0.500000 0.500000 0 352321536 0 +( -16 -664 -184 ) ( 16 -664 -184 ) ( 16 -664 -240 ) subway/1_tilegraf14 40 -32 0 0.500000 0.500000 0 318767104 0 +( -16 -664 -208 ) ( -16 -656 -208 ) ( 16 -656 -208 ) subway/1_tile_graf9 0 0 0 0.500000 0.500000 0 352321536 0 +( 16 -656 -240 ) ( -16 -656 -240 ) ( -16 -664 -240 ) subway/1_tile_graf9 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2789 +{ +( -16 -664 -160 ) ( 24 -664 -160 ) ( 24 -664 -200 ) subway/1_tilegraf18 32 32 0 0.500000 0.500000 0 318767104 0 +( 64 -656 -176 ) ( 24 -656 -176 ) ( 24 -656 -216 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 48 -664 -184 ) ( 48 -632 -184 ) ( 48 -632 -224 ) subway/1_tile -544 -80 0 0.500000 0.500000 0 318767104 0 +( -32 -632 -240 ) ( -32 -664 -240 ) ( 8 -664 -240 ) subway/1_tile 80 544 0 0.500000 0.500000 0 318767104 0 +( -56 -664 -208 ) ( -56 -656 -208 ) ( -24 -656 -208 ) subway/1_tile 80 544 0 0.500000 0.500000 0 318767104 0 +( 16 -656 -184 ) ( 16 -664 -184 ) ( 16 -656 -240 ) subway/1_tile 80 544 0 0.500000 0.500000 0 318767104 0 +} +// brush 2790 +{ +( 16 -664 -160 ) ( 56 -664 -160 ) ( 56 -664 -200 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -56 -632 -184 ) ( -56 -664 -184 ) ( -56 -664 -224 ) subway/1_tile -544 -80 0 0.500000 0.500000 0 318767104 0 +( 104 -656 -176 ) ( 64 -656 -176 ) ( 64 -656 -216 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( 104 -664 -184 ) ( 104 -632 -184 ) ( 104 -632 -224 ) subway/1_tile -544 -80 0 0.500000 0.500000 0 318767104 0 +( 56 -664 -184 ) ( 16 -664 -184 ) ( 16 -632 -184 ) subway/1_tile 80 544 0 0.500000 0.500000 0 318767104 0 +( -16 -656 -208 ) ( -16 -664 -208 ) ( 16 -656 -208 ) subway/1_tile 80 544 0 0.500000 0.500000 0 318767104 0 +} +// brush 2791 +{ +( -16 -656 -240 ) ( -48 -656 -240 ) ( -48 -664 -240 ) subway/1_tile_damage2 -32 32 0 0.500000 0.500000 0 352321536 0 +( -48 -664 -208 ) ( -48 -656 -208 ) ( -16 -656 -208 ) subway/1_tile_damage2 -32 32 0 0.500000 0.500000 0 352321536 0 +( -48 -664 -184 ) ( -16 -664 -184 ) ( -16 -664 -240 ) subway/1_tile_damage2 -32 32 0 0.500000 0.500000 0 352321536 0 +( -16 -664 -184 ) ( -16 -656 -184 ) ( -16 -656 -240 ) subway/1_tile_damage2 -32 32 0 0.500000 0.500000 0 352321536 0 +( -16 -656 -184 ) ( -48 -656 -184 ) ( -48 -656 -240 ) subway/1_tile_damage2 -32 32 0 0.500000 0.500000 0 352321536 0 +( -48 -656 -184 ) ( -48 -664 -184 ) ( -48 -664 -240 ) subway/1_tile_damage2 -32 32 0 0.500000 0.500000 0 352321536 0 +} +// brush 2792 +{ +( 200 -912 -152 ) ( 200 -880 -152 ) ( 160 -880 -152 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 104 -848 -120 ) ( 200 -848 -120 ) ( 200 -888 -120 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 168 -880 -96 ) ( 168 -912 -96 ) ( 168 -912 -136 ) subway/1_tile -176 -48 0 0.500000 0.500000 0 318767104 0 +( 104 -888 -96 ) ( 144 -888 -96 ) ( 144 -888 -136 ) subway/1_tile -176 -48 0 0.500000 0.500000 0 318767104 0 +( 200 -912 -96 ) ( 200 -880 -96 ) ( 200 -880 -136 ) subway/1_tile -176 -48 0 0.500000 0.500000 0 318767104 0 +( 200 -848 -120 ) ( 104 -848 -120 ) ( 104 -880 -152 ) subway/1_tile_graf4 80 40 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2793 +{ +( 232 -912 -152 ) ( 232 -880 -152 ) ( 192 -880 -152 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -848 -120 ) ( 232 -848 -120 ) ( 232 -888 -120 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 200 -880 -96 ) ( 200 -912 -96 ) ( 200 -912 -136 ) subway/1_tile -176 -48 0 0.500000 0.500000 0 318767104 0 +( 136 -888 -96 ) ( 176 -888 -96 ) ( 176 -888 -136 ) subway/1_tile -176 -48 0 0.500000 0.500000 0 318767104 0 +( 232 -912 -96 ) ( 232 -880 -96 ) ( 232 -880 -136 ) subway/1_tile -176 -48 0 0.500000 0.500000 0 318767104 0 +( 232 -848 -120 ) ( 136 -848 -120 ) ( 136 -880 -152 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2794 +{ +( 208 -880 -184 ) ( 248 -880 -184 ) ( 248 -912 -184 ) subway/1_tile -176 80 0 0.500000 0.500000 0 318767104 0 +( 104 -888 -144 ) ( 144 -888 -144 ) ( 144 -888 -184 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 232 -912 -152 ) ( 232 -880 -152 ) ( 232 -880 -192 ) subway/1_tile -80 -80 0 0.500000 0.500000 0 318767104 0 +( 216 -880 -160 ) ( 176 -880 -160 ) ( 176 -880 -200 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 200 -872 -192 ) ( 168 -872 -192 ) ( 168 -880 -192 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -872 -184 ) ( 136 -880 -184 ) ( 136 -872 -200 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2795 +{ +( 248 -912 -240 ) ( 248 -880 -240 ) ( 208 -880 -240 ) subway/1_tile -176 80 0 0.500000 0.500000 0 318767104 0 +( 136 -880 -184 ) ( 136 -912 -184 ) ( 136 -912 -224 ) subway/1_tile -80 -80 0 0.500000 0.500000 0 318767104 0 +( 160 -888 -144 ) ( 200 -888 -144 ) ( 200 -888 -184 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 232 -912 -152 ) ( 232 -880 -152 ) ( 232 -880 -192 ) subway/1_tile -80 -80 0 0.500000 0.500000 0 318767104 0 +( 216 -880 -160 ) ( 176 -880 -160 ) ( 176 -880 -200 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 168 -872 -192 ) ( 200 -872 -192 ) ( 168 -880 -192 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2796 +{ +( 232 -912 -184 ) ( 232 -880 -184 ) ( 192 -880 -184 ) subway/1_tile_middle -144 96 0 0.500000 0.500000 0 318767104 0 +( 184 -880 -168 ) ( 224 -880 -168 ) ( 224 -912 -168 ) subway/1_tile_middle -144 96 0 0.500000 0.500000 0 318767104 0 +( 80 -888 -128 ) ( 120 -888 -128 ) ( 120 -888 -168 ) subway/1_tile_middle -144 -48 0 0.500000 0.500000 0 318767104 0 +( 232 -912 -128 ) ( 232 -880 -128 ) ( 232 -880 -168 ) subway/1_tile_middle -80 -48 0 0.500000 0.500000 0 318767104 0 +( 224 -880 -104 ) ( 184 -880 -104 ) ( 184 -880 -144 ) subway/1_tile_middle -144 -48 0 0.500000 0.500000 0 318767104 0 +( 136 -872 -184 ) ( 136 -880 -184 ) ( 136 -872 -200 ) subway/1_tile_middle -144 -48 0 0.500000 0.500000 0 318767104 0 +} +// brush 2797 +{ +( 232 -912 -168 ) ( 232 -880 -168 ) ( 192 -880 -168 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 80 -888 -112 ) ( 120 -888 -112 ) ( 120 -888 -152 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 232 -912 -112 ) ( 232 -880 -112 ) ( 232 -880 -152 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 224 -880 -88 ) ( 184 -880 -88 ) ( 184 -880 -128 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 168 -880 -160 ) ( 168 -872 -160 ) ( 200 -872 -160 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -872 -184 ) ( 136 -880 -184 ) ( 136 -872 -200 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2798 +{ +( 184 -880 -152 ) ( 224 -880 -152 ) ( 224 -912 -152 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -880 -112 ) ( 136 -912 -112 ) ( 136 -912 -152 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -888 -112 ) ( 176 -888 -112 ) ( 176 -888 -152 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 232 -912 -112 ) ( 232 -880 -112 ) ( 232 -880 -152 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 224 -880 -88 ) ( 184 -880 -88 ) ( 184 -880 -128 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 168 -872 -160 ) ( 168 -880 -160 ) ( 200 -872 -160 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2799 +{ +( 176 -672 -200 ) ( 176 -672 -160 ) ( 216 -672 -160 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 200 -664 -184 ) ( 200 -664 -144 ) ( 160 -664 -144 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -640 -224 ) ( 136 -640 -184 ) ( 136 -672 -184 ) subway/1_tile -464 -80 0 0.500000 0.500000 0 318767104 0 +( 248 -640 -184 ) ( 248 -672 -184 ) ( 208 -672 -184 ) subway/1_tile -176 464 0 0.500000 0.500000 0 318767104 0 +( 200 -672 -192 ) ( 176 -672 -192 ) ( 176 -688 -192 ) subway/1_tile -176 464 0 0.500000 0.500000 0 318767104 0 +( 168 -688 -168 ) ( 168 -672 -168 ) ( 168 -688 -184 ) subway/1_tile -176 464 0 0.500000 0.500000 0 318767104 0 +} +// brush 2800 +{ +( 176 -672 -200 ) ( 176 -672 -160 ) ( 216 -672 -160 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 232 -672 -192 ) ( 232 -672 -152 ) ( 232 -640 -152 ) subway/1_tile -464 -80 0 0.500000 0.500000 0 318767104 0 +( 200 -664 -184 ) ( 200 -664 -144 ) ( 160 -664 -144 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 248 -640 -184 ) ( 248 -672 -184 ) ( 208 -672 -184 ) subway/1_tile -176 464 0 0.500000 0.500000 0 318767104 0 +( 200 -672 -192 ) ( 176 -672 -192 ) ( 176 -688 -192 ) subway/1_tile -176 464 0 0.500000 0.500000 0 318767104 0 +( 200 -672 -168 ) ( 200 -688 -168 ) ( 200 -672 -184 ) subway/1_tile -176 464 0 0.500000 0.500000 0 318767104 0 +} +// brush 2801 +{ +( 176 -672 -200 ) ( 176 -672 -160 ) ( 216 -672 -160 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 232 -672 -192 ) ( 232 -672 -152 ) ( 232 -640 -152 ) subway/1_tile -464 -80 0 0.500000 0.500000 0 318767104 0 +( 200 -664 -184 ) ( 200 -664 -144 ) ( 160 -664 -144 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -640 -224 ) ( 136 -640 -184 ) ( 136 -672 -184 ) subway/1_tile -464 -80 0 0.500000 0.500000 0 318767104 0 +( 208 -672 -240 ) ( 248 -672 -240 ) ( 248 -640 -240 ) subway/1_tile -176 464 0 0.500000 0.500000 0 318767104 0 +( 176 -672 -192 ) ( 200 -672 -192 ) ( 176 -688 -192 ) subway/1_tile -176 464 0 0.500000 0.500000 0 318767104 0 +} +// brush 2802 +{ +( 184 -672 -144 ) ( 184 -672 -104 ) ( 224 -672 -104 ) subway/1_tile_middle -144 -48 0 0.500000 0.500000 0 318767104 0 +( 176 -664 -168 ) ( 176 -664 -128 ) ( 136 -664 -128 ) subway/1_tile_middle -144 -48 0 0.500000 0.500000 0 318767104 0 +( 136 -640 -168 ) ( 136 -640 -128 ) ( 136 -672 -128 ) subway/1_tile_middle -464 -48 0 0.500000 0.500000 0 318767104 0 +( 224 -640 -168 ) ( 224 -672 -168 ) ( 184 -672 -168 ) subway/1_tile_middle -144 480 0 0.500000 0.500000 0 318767104 0 +( 192 -672 -184 ) ( 232 -672 -184 ) ( 232 -640 -184 ) subway/1_tile_middle -144 480 0 0.500000 0.500000 0 318767104 0 +( 168 -688 -168 ) ( 168 -672 -168 ) ( 168 -688 -184 ) subway/1_tile_middle -144 480 0 0.500000 0.500000 0 318767104 0 +} +// brush 2803 +{ +( 184 -672 -144 ) ( 184 -672 -104 ) ( 224 -672 -104 ) subway/1_tile_middle -144 -48 0 0.500000 0.500000 0 318767104 0 +( 232 -672 -168 ) ( 232 -672 -128 ) ( 232 -640 -128 ) subway/1_tile_middle -464 -48 0 0.500000 0.500000 0 318767104 0 +( 176 -664 -168 ) ( 176 -664 -128 ) ( 136 -664 -128 ) subway/1_tile_middle -144 -48 0 0.500000 0.500000 0 318767104 0 +( 224 -640 -168 ) ( 224 -672 -168 ) ( 184 -672 -168 ) subway/1_tile_middle -144 480 0 0.500000 0.500000 0 318767104 0 +( 192 -672 -184 ) ( 232 -672 -184 ) ( 232 -640 -184 ) subway/1_tile_middle -144 480 0 0.500000 0.500000 0 318767104 0 +( 200 -672 -168 ) ( 200 -688 -168 ) ( 200 -672 -184 ) subway/1_tile_middle -144 480 0 0.500000 0.500000 0 318767104 0 +} +// brush 2804 +{ +( 184 -672 -128 ) ( 184 -672 -88 ) ( 224 -672 -88 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 176 -664 -152 ) ( 176 -664 -112 ) ( 136 -664 -112 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -640 -152 ) ( 136 -640 -112 ) ( 136 -672 -112 ) subway/1_tile -560 -80 0 0.500000 0.500000 0 318767104 0 +( 192 -672 -168 ) ( 232 -672 -168 ) ( 232 -640 -168 ) subway/1_tile -176 304 0 0.500000 0.500000 0 318767104 0 +( 176 -688 -160 ) ( 176 -672 -160 ) ( 200 -672 -160 ) subway/1_tile -176 304 0 0.500000 0.500000 0 318767104 0 +( 168 -688 -168 ) ( 168 -672 -168 ) ( 168 -688 -184 ) subway/1_tile -176 304 0 0.500000 0.500000 0 318767104 0 +} +// brush 2805 +{ +( 184 -672 -128 ) ( 184 -672 -88 ) ( 224 -672 -88 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 232 -672 -152 ) ( 232 -672 -112 ) ( 232 -640 -112 ) subway/1_tile -560 -80 0 0.500000 0.500000 0 318767104 0 +( 176 -664 -152 ) ( 176 -664 -112 ) ( 136 -664 -112 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 192 -672 -168 ) ( 232 -672 -168 ) ( 232 -640 -168 ) subway/1_tile -176 304 0 0.500000 0.500000 0 318767104 0 +( 176 -688 -160 ) ( 176 -672 -160 ) ( 200 -672 -160 ) subway/1_tile -176 304 0 0.500000 0.500000 0 318767104 0 +( 200 -672 -168 ) ( 200 -688 -168 ) ( 200 -672 -184 ) subway/1_tile -176 304 0 0.500000 0.500000 0 318767104 0 +} +// brush 2806 +{ +( 184 -672 -128 ) ( 184 -672 -88 ) ( 224 -672 -88 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 232 -672 -152 ) ( 232 -672 -112 ) ( 232 -640 -112 ) subway/1_tile -560 -80 0 0.500000 0.500000 0 318767104 0 +( 176 -664 -152 ) ( 176 -664 -112 ) ( 136 -664 -112 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -640 -152 ) ( 136 -640 -112 ) ( 136 -672 -112 ) subway/1_tile -560 -80 0 0.500000 0.500000 0 318767104 0 +( 224 -640 -152 ) ( 224 -672 -152 ) ( 184 -672 -152 ) subway/1_tile -176 304 0 0.500000 0.500000 0 318767104 0 +( 176 -672 -160 ) ( 176 -688 -160 ) ( 200 -672 -160 ) subway/1_tile -176 304 0 0.500000 0.500000 0 318767104 0 +} +// brush 2807 +{ +( 200 -672 -192 ) ( 176 -672 -192 ) ( 176 -688 -192 ) subway/1_tile_graf7 0 0 0 0.500000 0.500000 0 352321536 0 +( 176 -688 -160 ) ( 176 -672 -160 ) ( 200 -672 -160 ) subway/1_tile_graf7 0 0 0 0.500000 0.500000 0 352321536 0 +( 176 -672 -168 ) ( 200 -672 -168 ) ( 200 -672 -184 ) subway/1_tile_graf7 -16 0 0 0.500000 0.500000 0 352321536 0 +( 200 -688 -168 ) ( 200 -672 -168 ) ( 200 -672 -184 ) subway/1_tile_graf7 0 0 0 0.500000 0.500000 0 352321536 0 +( 200 -664 -168 ) ( 176 -664 -168 ) ( 176 -664 -184 ) subway/1_tile_graf7 0 0 0 0.500000 0.500000 0 352321536 0 +( 168 -672 -168 ) ( 168 -688 -168 ) ( 168 -688 -184 ) subway/1_tile_graf7 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2808 +{ +( 688 696 -64 ) ( 688 632 -64 ) ( 624 632 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 688 88 -176 ) ( 688 88 40 ) ( 688 -192 40 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 696 1072 0 ) ( 696 1216 0 ) ( 696 1216 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 688 936 -96 ) ( 672 936 -96 ) ( 672 904 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 688 904 -64 ) ( 672 904 -64 ) ( 688 904 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 680 840 -64 ) ( 688 840 -64 ) ( 680 840 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2809 +{ +( 688 696 -64 ) ( 688 632 -64 ) ( 624 632 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 688 88 -176 ) ( 688 88 40 ) ( 688 -192 40 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 632 552 -56 ) ( 696 552 -56 ) ( 696 552 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 696 1072 -8 ) ( 696 1216 -8 ) ( 696 1216 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 688 936 -104 ) ( 672 936 -104 ) ( 672 904 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 736 608 -64 ) ( 728 608 -64 ) ( 736 608 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2810 +{ +( 688 840 -120 ) ( 688 808 -120 ) ( 688 808 -152 ) subway/1_tile_blood 16 16 0 -0.500000 0.500000 0 318767104 0 +( 696 840 -120 ) ( 688 840 -120 ) ( 688 840 -152 ) subway/1_tile_blood 0 0 0 0.500000 0.500000 0 318767104 0 +( 696 808 -120 ) ( 696 840 -120 ) ( 696 840 -152 ) subway/1_tile_blood -32 0 0 0.500000 0.500000 0 318767104 0 +( 688 808 -120 ) ( 696 808 -120 ) ( 696 808 -152 ) subway/1_tile_blood 0 0 0 0.500000 0.500000 0 318767104 0 +( 688 808 -120 ) ( 688 840 -120 ) ( 696 840 -120 ) subway/1_tile_blood 0 32 0 0.500000 0.500000 0 318767104 0 +( 696 840 -152 ) ( 688 840 -152 ) ( 688 808 -152 ) subway/1_tile_blood 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2811 +{ +( 688 872 -120 ) ( 672 872 -120 ) ( 688 872 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 696 1080 -48 ) ( 696 1224 -48 ) ( 696 1224 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 688 88 -224 ) ( 688 88 -8 ) ( 688 -192 -8 ) subway/1_tile -16 16 0 -0.500000 0.500000 0 318767104 0 +( 688 696 -120 ) ( 688 632 -120 ) ( 624 632 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 624 632 -152 ) ( 688 632 -152 ) ( 688 696 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 688 840 -120 ) ( 696 840 -120 ) ( 688 840 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2812 +{ +( 688 840 -96 ) ( 680 840 -96 ) ( 680 808 -96 ) subway/1_tile_graf3 0 16 0 0.500000 0.500000 0 352321536 0 +( 680 808 -64 ) ( 680 840 -64 ) ( 688 840 -64 ) subway/1_tile_graf3 0 16 0 0.500000 0.500000 0 352321536 0 +( 688 808 -64 ) ( 696 808 -64 ) ( 696 808 -96 ) subway/1_tile_graf3 0 0 0 0.500000 0.500000 0 352321536 0 +( 696 808 -64 ) ( 696 840 -64 ) ( 696 840 -96 ) subway/1_tile_graf3 -16 0 0 0.500000 0.500000 0 352321536 0 +( 696 840 -64 ) ( 688 840 -64 ) ( 688 840 -96 ) subway/1_tile_graf3 0 0 0 0.500000 0.500000 0 352321536 0 +( 688 840 -64 ) ( 688 808 -64 ) ( 688 808 -96 ) subway/1_tilegraf14 24 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2813 +{ +( 400 1224 -80 ) ( 400 1224 -152 ) ( 400 1160 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 368 1160 -152 ) ( 368 1160 -80 ) ( 360 1160 -80 ) subway/1_tile_damage2 64 24 0 0.500000 0.500000 0 352321536 0 +( 360 1104 -104 ) ( 360 968 -104 ) ( 360 968 -208 ) subway/1_tile_damage2 72 24 0 0.500000 0.500000 0 352321536 0 +( 368 1144 -80 ) ( 368 1144 -152 ) ( 360 1144 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 296 1088 -120 ) ( 360 1088 -120 ) ( 360 1024 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 360 1024 -152 ) ( 360 1088 -152 ) ( 296 1088 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2814 +{ +( 520 1216 -152 ) ( 520 1216 -48 ) ( 520 1072 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 536 368 -112 ) ( 536 368 -104 ) ( 600 368 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 528 160 -8 ) ( 528 440 -8 ) ( 528 440 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 592 632 -120 ) ( 528 632 -120 ) ( 528 696 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 528 696 -152 ) ( 528 632 -152 ) ( 592 632 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 520 800 -120 ) ( 504 800 -120 ) ( 504 800 -160 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2815 +{ +( 520 1216 -152 ) ( 520 1216 -48 ) ( 520 1072 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 160 -8 ) ( 528 440 -8 ) ( 528 440 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 904 -48 ) ( 528 904 -152 ) ( 536 904 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 592 632 -120 ) ( 528 632 -120 ) ( 528 696 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 528 696 -152 ) ( 528 632 -152 ) ( 592 632 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 520 832 -152 ) ( 512 832 -152 ) ( 520 832 -48 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2816 +{ +( 504 904 -120 ) ( 520 904 -120 ) ( 504 904 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 1072 -48 ) ( 528 1216 -48 ) ( 528 1216 -152 ) subway/1_tile_graf2 48 16 0 0.500000 0.500000 0 352321536 0 +( 520 88 -224 ) ( 520 88 -8 ) ( 520 -192 -8 ) subway/1_tile_damage2 0 -24 0 -0.500000 0.500000 0 352321536 0 +( 512 936 -152 ) ( 520 936 -152 ) ( 520 936 -48 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 520 696 -120 ) ( 520 632 -120 ) ( 456 632 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 456 632 -152 ) ( 520 632 -152 ) ( 520 696 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2817 +{ +( 672 968 -152 ) ( 736 968 -152 ) ( 736 1032 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 736 1032 -120 ) ( 736 968 -120 ) ( 672 968 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 400 968 -48 ) ( 400 968 -152 ) ( 400 976 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 1176 968 -8 ) ( 896 968 -8 ) ( 896 968 -224 ) subway/1_tile 32 16 0 -0.500000 0.500000 0 318767104 0 +( 464 960 -112 ) ( 464 960 -104 ) ( 464 1024 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 120 960 -152 ) ( 120 960 -48 ) ( 264 960 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2818 +{ +( 672 904 -120 ) ( 688 904 -120 ) ( 672 904 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 696 1072 -48 ) ( 696 1216 -48 ) ( 696 1216 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 688 88 -224 ) ( 688 88 -8 ) ( 688 -192 -8 ) subway/1_tile_damage2 0 -24 0 -0.500000 0.500000 0 352321536 0 +( 680 936 -152 ) ( 688 936 -152 ) ( 688 936 -48 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 688 696 -120 ) ( 688 632 -120 ) ( 624 632 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 624 632 -152 ) ( 688 632 -152 ) ( 688 696 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2819 +{ +( 520 1216 -104 ) ( 520 1216 0 ) ( 520 1072 0 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 160 40 ) ( 528 440 40 ) ( 528 440 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 936 0 ) ( 528 936 -104 ) ( 536 936 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 696 -104 ) ( 528 632 -104 ) ( 592 632 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 680 -72 ) ( 528 752 -72 ) ( 552 752 -72 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 536 744 -64 ) ( 560 744 -64 ) ( 536 744 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2820 +{ +( 520 1216 -104 ) ( 520 1216 0 ) ( 520 1072 0 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 536 368 -64 ) ( 536 368 -56 ) ( 600 368 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 160 40 ) ( 528 440 40 ) ( 528 440 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 696 -104 ) ( 528 632 -104 ) ( 592 632 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 680 -72 ) ( 528 752 -72 ) ( 552 752 -72 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 552 680 -64 ) ( 528 680 -64 ) ( 552 680 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2821 +{ +( 520 1216 -104 ) ( 520 1216 0 ) ( 520 1072 0 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 536 368 -64 ) ( 536 368 -56 ) ( 600 368 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 160 40 ) ( 528 440 40 ) ( 528 440 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 936 0 ) ( 528 936 -104 ) ( 536 936 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 592 632 -64 ) ( 528 632 -64 ) ( 528 696 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 752 -72 ) ( 528 680 -72 ) ( 552 752 -72 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2822 +{ +( 552 752 -104 ) ( 528 752 -104 ) ( 528 680 -104 ) subway/1_tile_graf11 0 0 0 0.500000 0.500000 0 318767104 0 +( 528 680 -72 ) ( 528 752 -72 ) ( 552 752 -72 ) subway/1_tile_graf11 0 0 0 0.500000 0.500000 0 318767104 0 +( 528 680 -64 ) ( 552 680 -64 ) ( 552 680 -104 ) subway/1_tile_graf11 0 0 0 0.500000 0.500000 0 318767104 0 +( 528 680 -64 ) ( 528 752 -64 ) ( 528 752 -104 ) subway/1_tile_graf11 48 -16 0 0.500000 0.500000 0 318767104 0 +( 560 744 -64 ) ( 536 744 -64 ) ( 536 744 -104 ) subway/1_tile_graf11 0 0 0 0.500000 0.500000 0 318767104 0 +( 520 752 -64 ) ( 520 680 -64 ) ( 520 680 -104 ) subway/1_tile_graf11 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2823 +{ +( 456 528 -152 ) ( 520 528 -152 ) ( 520 592 -152 ) subway/1_tile 800 2784 0 0.500000 0.500000 0 318767104 0 +( 520 592 -120 ) ( 520 528 -120 ) ( 456 528 -120 ) subway/1_tile 800 2784 0 0.500000 0.500000 0 318767104 0 +( 512 832 -152 ) ( 520 832 -152 ) ( 520 832 -48 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 520 -16 -224 ) ( 520 -16 -8 ) ( 520 -296 -8 ) subway/1_tile_damage2 -80 -24 0 -0.500000 0.500000 0 352321536 0 +( 528 968 -48 ) ( 528 1112 -48 ) ( 528 1112 -152 ) subway/1_tile_graf12 128 16 0 0.500000 0.500000 0 318767104 0 +( 504 800 -120 ) ( 520 800 -120 ) ( 504 800 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2824 +{ +( 624 600 -152 ) ( 688 600 -152 ) ( 688 664 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 688 664 -120 ) ( 688 600 -120 ) ( 624 600 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 688 56 -224 ) ( 688 56 -8 ) ( 688 -224 -8 ) subway/1_tile_damage2 -8 16 0 0.500000 0.500000 0 352321536 0 +( 632 552 -104 ) ( 696 552 -104 ) ( 696 552 -112 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 696 768 -48 ) ( 696 912 -48 ) ( 696 912 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 688 584 -120 ) ( 672 584 -120 ) ( 688 584 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2825 +{ +( 688 936 -64 ) ( 688 904 -64 ) ( 688 904 -104 ) subway/1_tile_graf5 80 0 0 -0.500000 0.500000 0 352321536 0 +( 688 936 -64 ) ( 672 936 -64 ) ( 672 936 -104 ) subway/1_tile_graf5 80 0 0 -0.500000 0.500000 0 352321536 0 +( 696 904 -64 ) ( 696 936 -64 ) ( 696 936 -104 ) subway/1_tile_graf5 80 0 0 -0.500000 0.500000 0 352321536 0 +( 672 904 -64 ) ( 688 904 -64 ) ( 688 904 -104 ) subway/1_tile_graf5 80 0 0 -0.500000 0.500000 0 352321536 0 +( 672 904 -64 ) ( 672 936 -64 ) ( 688 936 -64 ) subway/1_tile_graf5 80 0 0 -0.500000 0.500000 0 352321536 0 +( 688 936 -96 ) ( 672 936 -96 ) ( 672 904 -96 ) subway/1_tile_graf5 80 0 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2826 +{ +( 688 904 -152 ) ( 672 904 -152 ) ( 672 872 -152 ) subway/1_tile_graf5 80 0 0 -0.500000 0.500000 0 352321536 0 +( 672 872 -120 ) ( 672 904 -120 ) ( 688 904 -120 ) subway/1_tile_graf5 80 0 0 -0.500000 0.500000 0 352321536 0 +( 672 872 -120 ) ( 688 872 -120 ) ( 688 872 -160 ) subway/1_tile_graf5 80 0 0 -0.500000 0.500000 0 352321536 0 +( 696 872 -120 ) ( 696 904 -120 ) ( 696 904 -160 ) subway/1_tile_graf5 80 0 0 -0.500000 0.500000 0 352321536 0 +( 688 904 -120 ) ( 672 904 -120 ) ( 672 904 -160 ) subway/1_tile_graf5 80 0 0 -0.500000 0.500000 0 352321536 0 +( 688 904 -120 ) ( 688 872 -120 ) ( 688 872 -160 ) subway/1_tile_graf6 80 16 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2827 +{ +( 312 144 -128 ) ( 312 120 -128 ) ( 312 120 -200 ) subway/1_tile_graf9 48 -16 0 -0.500000 0.500000 0 352321536 0 +( 376 136 -128 ) ( 312 136 -128 ) ( 312 136 -200 ) subway/1_tile_graf9 48 -16 0 -0.500000 0.500000 0 352321536 0 +( 344 112 -128 ) ( 344 136 -128 ) ( 344 136 -200 ) subway/1_tile_graf9 48 -16 0 -0.500000 0.500000 0 352321536 0 +( 312 128 -128 ) ( 376 128 -128 ) ( 376 128 -200 ) subway/1_tile_graf9 48 -16 0 -0.500000 0.500000 0 352321536 0 +( 312 120 -168 ) ( 312 144 -168 ) ( 376 144 -168 ) subway/1_tile_graf9 48 -16 0 -0.500000 0.500000 0 352321536 0 +( 376 144 -200 ) ( 312 144 -200 ) ( 312 120 -200 ) subway/1_tile_graf9 48 -16 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2828 +{ +( 680 136 -200 ) ( 744 136 -200 ) ( 744 200 -200 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 296 128 -128 ) ( 296 128 -200 ) ( 296 136 -200 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 192 136 -96 ) ( 56 136 -96 ) ( 56 136 -200 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 496 128 -128 ) ( 496 128 -200 ) ( 432 128 -200 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 312 120 -168 ) ( 312 144 -168 ) ( 376 144 -168 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 312 120 -128 ) ( 312 144 -128 ) ( 312 120 -200 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2829 +{ +( 680 136 -200 ) ( 744 136 -200 ) ( 744 200 -200 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 192 136 -96 ) ( 56 136 -96 ) ( 56 136 -200 ) subway/1_tile 32 -16 0 -0.500000 0.500000 0 318767104 0 +( 584 136 -200 ) ( 584 136 -128 ) ( 584 144 -128 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 496 128 -128 ) ( 496 128 -200 ) ( 432 128 -200 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 312 120 -168 ) ( 312 144 -168 ) ( 376 144 -168 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 344 136 -128 ) ( 344 112 -128 ) ( 344 136 -200 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2830 +{ +( 912 200 -128 ) ( 912 136 -128 ) ( 848 136 -128 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 464 128 -120 ) ( 464 128 -192 ) ( 464 136 -192 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 360 136 -88 ) ( 224 136 -88 ) ( 224 136 -192 ) subway/1_tile 32 -16 0 -0.500000 0.500000 0 318767104 0 +( 584 120 -192 ) ( 584 120 -120 ) ( 584 128 -120 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 600 128 -120 ) ( 600 128 -192 ) ( 536 128 -192 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 480 144 -168 ) ( 480 120 -168 ) ( 544 144 -168 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2831 +{ +( 328 144 -200 ) ( 264 144 -200 ) ( 264 120 -200 ) subway/1_tile_graf9 48 -16 0 -0.500000 0.500000 0 352321536 0 +( 264 120 -168 ) ( 264 144 -168 ) ( 328 144 -168 ) subway/1_tile_graf9 48 -16 0 -0.500000 0.500000 0 352321536 0 +( 264 104 -128 ) ( 328 104 -128 ) ( 328 104 -200 ) subway/1_tile_graf9 48 -16 0 -0.500000 0.500000 0 352321536 0 +( 296 112 -128 ) ( 296 136 -128 ) ( 296 136 -200 ) subway/1_tile_graf9 48 -16 0 -0.500000 0.500000 0 352321536 0 +( 328 136 -128 ) ( 264 136 -128 ) ( 264 136 -200 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( 264 144 -128 ) ( 264 120 -128 ) ( 264 120 -200 ) subway/1_tile_damage1 48 -16 0 0.500000 0.500000 0 352321536 0 +} +// brush 2832 +{ +( -88 176 -152 ) ( -88 176 -112 ) ( -80 176 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -80 280 -128 ) ( -80 280 -112 ) ( -80 288 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -176 296 -120 ) ( -312 296 -120 ) ( -312 296 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -88 160 -112 ) ( -88 160 -152 ) ( -88 280 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -144 344 -112 ) ( -144 280 -112 ) ( -208 280 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -208 280 -152 ) ( -144 280 -152 ) ( -144 344 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2833 +{ +( 40 120 -120 ) ( 40 112 -120 ) ( 40 112 -160 ) subway/1_tile_graf1 0 16 0 -0.500000 0.500000 0 352321536 0 +( 88 120 -120 ) ( 32 120 -120 ) ( 32 120 -160 ) subway/1_tile_graf1 80 16 0 -0.500000 0.500000 0 352321536 0 +( 72 112 -120 ) ( 72 120 -120 ) ( 72 120 -160 ) subway/1_tile_graf1 0 16 0 -0.500000 0.500000 0 352321536 0 +( 32 112 -120 ) ( 88 112 -120 ) ( 88 112 -160 ) subway/1_tile_graf1 80 16 0 -0.500000 0.500000 0 352321536 0 +( 32 112 -120 ) ( 32 120 -120 ) ( 88 120 -120 ) subway/1_tile_graf1 80 32 0 -0.500000 0.500000 0 352321536 0 +( 88 120 -152 ) ( 32 120 -152 ) ( 32 112 -152 ) subway/1_tile_graf1 80 32 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2834 +{ +( -40 120 -128 ) ( -40 120 -112 ) ( -48 120 -112 ) subway/1_tile 0 32 0 -0.500000 0.500000 0 318767104 0 +( -24 24 -120 ) ( -24 -112 -120 ) ( -24 -112 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 112 -112 ) ( 80 112 -152 ) ( -40 112 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -40 -8 -152 ) ( -40 56 -152 ) ( -104 56 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 32 112 -120 ) ( 32 120 -120 ) ( 88 120 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 112 -120 ) ( 40 120 -120 ) ( 40 112 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2835 +{ +( 104 112 -152 ) ( 104 112 -112 ) ( 104 120 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -40 120 -128 ) ( -40 120 -112 ) ( -48 120 -112 ) subway/1_tile 0 32 0 -0.500000 0.500000 0 318767104 0 +( 80 112 -112 ) ( 80 112 -152 ) ( -40 112 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -40 -8 -152 ) ( -40 56 -152 ) ( -104 56 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 32 112 -120 ) ( 32 120 -120 ) ( 88 120 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 120 -120 ) ( 72 112 -120 ) ( 72 120 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2836 +{ +( 104 112 -152 ) ( 104 112 -112 ) ( 104 120 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -40 120 -128 ) ( -40 120 -112 ) ( -48 120 -112 ) subway/1_tile 0 32 0 -0.500000 0.500000 0 318767104 0 +( -56 24 -120 ) ( -56 -112 -120 ) ( -56 -112 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 112 -112 ) ( 80 112 -152 ) ( -40 112 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -104 56 -112 ) ( -40 56 -112 ) ( -40 -8 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 32 120 -120 ) ( 32 112 -120 ) ( 88 120 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2837 +{ +( -8 120 -152 ) ( -64 120 -152 ) ( -64 112 -152 ) subway/1_tile_graf1 -112 32 0 -0.500000 0.500000 0 352321536 0 +( -64 112 -120 ) ( -64 120 -120 ) ( -8 120 -120 ) subway/1_tile_graf1 -112 32 0 -0.500000 0.500000 0 352321536 0 +( -64 112 -120 ) ( -8 112 -120 ) ( -8 112 -160 ) subway/1_tile_graf1 -112 16 0 -0.500000 0.500000 0 352321536 0 +( -24 112 -120 ) ( -24 120 -120 ) ( -24 120 -160 ) subway/1_tile_graf1 0 16 0 -0.500000 0.500000 0 352321536 0 +( -8 120 -120 ) ( -64 120 -120 ) ( -64 120 -160 ) subway/1_tile_damage1 48 16 0 0.500000 0.500000 0 352321536 0 +( -56 120 -120 ) ( -56 112 -120 ) ( -56 112 -160 ) subway/1_tile_graf1 0 16 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2838 +{ +( -440 1192 -64 ) ( -440 1192 -48 ) ( -440 1528 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -448 1400 -64 ) ( -448 1400 152 ) ( -448 1120 152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -448 1520 152 ) ( -448 1520 -64 ) ( -440 1528 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -448 1504 -48 ) ( -448 1440 -48 ) ( -512 1440 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -512 1440 -64 ) ( -448 1440 -64 ) ( -448 1504 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -440 1424 -32 ) ( -416 1424 -32 ) ( -440 1424 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2839 +{ +( -440 1192 -64 ) ( -440 1192 -48 ) ( -440 1528 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -440 1192 -48 ) ( -440 1192 -64 ) ( -448 1184 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -448 1400 -64 ) ( -448 1400 152 ) ( -448 1120 152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -448 1504 -48 ) ( -448 1440 -48 ) ( -512 1440 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -512 1440 -64 ) ( -448 1440 -64 ) ( -448 1504 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -424 1392 -32 ) ( -448 1392 -32 ) ( -424 1392 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2840 +{ +( -448 1504 -64 ) ( -448 1440 -64 ) ( -512 1440 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1520 -8 ) ( -448 1520 -224 ) ( -440 1528 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1176 -48 ) ( -448 1176 -152 ) ( -448 1520 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1000 -104 ) ( -440 1064 -104 ) ( -440 1064 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -416 1424 -72 ) ( -440 1424 -72 ) ( -440 1392 -72 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1424 -32 ) ( -416 1424 -32 ) ( -440 1424 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2841 +{ +( -448 1504 -64 ) ( -448 1440 -64 ) ( -512 1440 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1176 -48 ) ( -448 1176 -152 ) ( -448 1520 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1184 -152 ) ( -448 1184 -48 ) ( -440 1192 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1000 -104 ) ( -440 1064 -104 ) ( -440 1064 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -416 1424 -72 ) ( -440 1424 -72 ) ( -440 1392 -72 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -424 1392 -32 ) ( -448 1392 -32 ) ( -424 1392 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2842 +{ +( -512 1440 -48 ) ( -448 1440 -48 ) ( -448 1504 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -448 1520 168 ) ( -448 1520 -48 ) ( -440 1528 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -448 1400 -48 ) ( -448 1400 168 ) ( -448 1120 168 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -440 1192 -48 ) ( -440 1192 -32 ) ( -440 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -440 1392 -40 ) ( -440 1424 -40 ) ( -416 1424 -40 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -440 1424 -32 ) ( -416 1424 -32 ) ( -440 1424 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2843 +{ +( -512 1440 -48 ) ( -448 1440 -48 ) ( -448 1504 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -448 1400 -48 ) ( -448 1400 168 ) ( -448 1120 168 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -440 1192 -32 ) ( -440 1192 -48 ) ( -448 1184 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -440 1192 -48 ) ( -440 1192 -32 ) ( -440 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -440 1392 -40 ) ( -440 1424 -40 ) ( -416 1424 -40 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -424 1392 -32 ) ( -448 1392 -32 ) ( -424 1392 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2844 +{ +( -448 1504 -32 ) ( -448 1440 -32 ) ( -512 1440 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -448 1520 168 ) ( -448 1520 -48 ) ( -440 1528 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -448 1400 -48 ) ( -448 1400 168 ) ( -448 1120 168 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -440 1192 -32 ) ( -440 1192 -48 ) ( -448 1184 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -440 1192 -48 ) ( -440 1192 -32 ) ( -440 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -440 1424 -40 ) ( -440 1392 -40 ) ( -416 1424 -40 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2845 +{ +( -416 1424 -72 ) ( -440 1424 -72 ) ( -440 1392 -72 ) subway/1_tile_graf7 0 -16 0 0.500000 0.500000 0 352321536 0 +( -440 1392 -40 ) ( -440 1424 -40 ) ( -416 1424 -40 ) subway/1_tile_graf7 0 -16 0 0.500000 0.500000 0 352321536 0 +( -448 1392 -32 ) ( -424 1392 -32 ) ( -424 1392 -48 ) subway/1_tile_graf7 0 -16 0 0.500000 0.500000 0 352321536 0 +( -440 1392 -32 ) ( -440 1424 -32 ) ( -440 1424 -48 ) subway/1_tile_graf7 32 -16 0 0.500000 0.500000 0 352321536 0 +( -416 1424 -32 ) ( -440 1424 -32 ) ( -440 1424 -48 ) subway/1_tile_graf7 0 -16 0 0.500000 0.500000 0 352321536 0 +( -448 1424 -32 ) ( -448 1392 -32 ) ( -448 1392 -48 ) subway/1_tile_graf7 0 -16 0 0.500000 0.500000 0 352321536 0 +} +// brush 2846 +{ +( -240 1440 -32 ) ( -304 1440 -32 ) ( -304 1504 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -312 1528 -48 ) ( -304 1520 -48 ) ( -304 1520 168 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -304 1272 168 ) ( -304 1552 168 ) ( -304 1552 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -304 1384 64 ) ( -304 1384 72 ) ( -240 1384 72 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -312 1368 64 ) ( -312 1368 72 ) ( -312 1304 72 ) subway/1_tile 0 0 0 -0.500000 0.500000 0 318767104 0 +( -320 1472 -40 ) ( -320 1440 -40 ) ( -304 1472 -40 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2847 +{ +( 392 800 -152 ) ( 392 864 -152 ) ( 328 864 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 800 -48 ) ( 392 664 -48 ) ( 392 664 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 12 +( 400 936 -152 ) ( 400 936 -80 ) ( 392 936 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1000 -80 ) ( 400 1000 -152 ) ( 400 936 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 896 -120 ) ( 392 928 -120 ) ( 400 928 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 928 -112 ) ( 400 928 -112 ) ( 392 928 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2848 +{ +( 392 864 -152 ) ( 392 928 -152 ) ( 328 928 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 848 -80 ) ( 400 848 -152 ) ( 392 848 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 864 -48 ) ( 392 728 -48 ) ( 392 728 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 12 +( 400 1016 -80 ) ( 400 1016 -152 ) ( 400 952 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 960 -120 ) ( 392 992 -120 ) ( 400 992 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 896 -112 ) ( 392 896 -112 ) ( 400 896 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2849 +{ +( 400 752 -80 ) ( 400 752 -152 ) ( 392 752 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 800 -48 ) ( 392 664 -48 ) ( 392 664 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 12 +( 400 936 -152 ) ( 400 936 -80 ) ( 392 936 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1000 -80 ) ( 400 1000 -152 ) ( 400 936 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 384 936 -112 ) ( 400 936 -112 ) ( 384 896 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 928 -120 ) ( 392 896 -120 ) ( 400 928 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2850 +{ +( 400 928 -152 ) ( 392 928 -152 ) ( 392 896 -152 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 392 896 -120 ) ( 392 928 -120 ) ( 400 928 -120 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 392 896 -112 ) ( 400 896 -112 ) ( 400 896 -152 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 400 896 -112 ) ( 400 928 -112 ) ( 400 928 -152 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 400 928 -112 ) ( 392 928 -112 ) ( 392 928 -152 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 392 928 -112 ) ( 392 896 -112 ) ( 392 896 -152 ) subway/1_tile_damage1 0 16 0 0.500000 0.500000 0 352321536 12 +} +// brush 2851 +{ +( 328 864 -80 ) ( 392 864 -80 ) ( 392 800 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 752 -80 ) ( 400 752 -152 ) ( 392 752 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 800 -48 ) ( 392 664 -48 ) ( 392 664 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 12 +( 400 1000 -80 ) ( 400 1000 -152 ) ( 400 936 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 936 -112 ) ( 384 936 -112 ) ( 384 896 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 904 -80 ) ( 384 904 -80 ) ( 400 904 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2852 +{ +( 400 936 -112 ) ( 384 936 -112 ) ( 384 896 -112 ) subway/1_tile_damage2 32 32 0 -0.500000 0.500000 0 352321536 0 +( 384 896 -80 ) ( 384 936 -80 ) ( 400 936 -80 ) subway/1_tile_damage2 32 32 0 -0.500000 0.500000 0 352321536 0 +( 384 904 -80 ) ( 400 904 -80 ) ( 400 904 -152 ) subway/1_tile_damage2 32 32 0 -0.500000 0.500000 0 352321536 0 +( 400 896 -80 ) ( 400 936 -80 ) ( 400 936 -152 ) subway/1_tile_damage2 16 32 0 -0.500000 0.500000 0 352321536 0 +( 400 936 -80 ) ( 384 936 -80 ) ( 384 936 -152 ) subway/1_tile_damage2 32 32 0 -0.500000 0.500000 0 352321536 0 +( 392 936 -80 ) ( 392 896 -80 ) ( 392 896 -152 ) subway/1_tile_damage2 16 32 0 0.500000 0.500000 0 352321536 12 +} +// brush 2853 +{ +( 224 792 -152 ) ( 224 944 -152 ) ( 224 944 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 968 -80 ) ( 224 960 -80 ) ( 224 960 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 632 -152 ) ( 232 632 -48 ) ( 232 768 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 11 +( 296 864 -152 ) ( 232 864 -152 ) ( 232 800 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 808 -120 ) ( 232 864 -120 ) ( 240 864 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 864 -120 ) ( 240 864 -120 ) ( 232 864 -192 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2854 +{ +( 224 792 -152 ) ( 224 944 -152 ) ( 224 944 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 632 -152 ) ( 232 632 -48 ) ( 232 768 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 11 +( 232 752 -152 ) ( 224 752 -152 ) ( 224 752 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 296 864 -152 ) ( 232 864 -152 ) ( 232 800 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 808 -120 ) ( 232 864 -120 ) ( 240 864 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 240 832 -128 ) ( 232 832 -128 ) ( 240 832 -200 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2855 +{ +( 224 800 -120 ) ( 224 800 -80 ) ( 224 760 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 896 -80 ) ( 224 896 -120 ) ( 232 896 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 568 -152 ) ( 232 568 -48 ) ( 232 704 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 11 +( 240 752 -152 ) ( 232 752 -152 ) ( 232 752 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 728 -80 ) ( 232 792 -80 ) ( 296 792 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 792 -120 ) ( 232 736 -120 ) ( 240 792 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2856 +{ +( 240 864 -152 ) ( 232 864 -152 ) ( 232 808 -152 ) subway/1_tile_graf13 0 0 0 0.500000 0.500000 0 318767104 0 +( 232 808 -120 ) ( 232 864 -120 ) ( 240 864 -120 ) subway/1_tile_graf13 0 0 0 0.500000 0.500000 0 318767104 0 +( 232 832 -128 ) ( 240 832 -128 ) ( 240 832 -200 ) subway/1_tile_graf13 0 -80 0 0.500000 0.500000 0 318767104 0 +( 232 808 -120 ) ( 232 864 -120 ) ( 232 864 -192 ) subway/1_tilegraf14 0 24 0 0.500000 0.500000 0 318767104 11 +( 240 864 -120 ) ( 232 864 -120 ) ( 232 864 -192 ) subway/1_tile_graf13 0 -80 0 0.500000 0.500000 0 318767104 0 +( 224 864 -120 ) ( 224 808 -120 ) ( 224 808 -192 ) subway/1_tile_graf13 0 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 2857 +{ +( 280 1192 -152 ) ( 216 1192 -152 ) ( 216 1128 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 1192 -152 ) ( 112 1192 -80 ) ( 240 1192 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 1200 -152 ) ( 104 1200 -80 ) ( 112 1192 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 96 1200 -80 ) ( 96 1200 -152 ) ( 224 1200 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 192 1184 -120 ) ( 192 1192 -120 ) ( 224 1192 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 192 1184 -80 ) ( 192 1192 -80 ) ( 192 1184 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2858 +{ +( 280 1192 -152 ) ( 216 1192 -152 ) ( 216 1128 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1200 -80 ) ( 224 1200 -152 ) ( 232 1192 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 1192 -152 ) ( 112 1192 -80 ) ( 240 1192 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 192 1184 -120 ) ( 192 1192 -120 ) ( 224 1192 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1192 -80 ) ( 224 1184 -80 ) ( 224 1192 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2859 +{ +( 216 1128 -80 ) ( 216 1192 -80 ) ( 280 1192 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1200 -80 ) ( 224 1200 -152 ) ( 232 1192 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 1192 -152 ) ( 112 1192 -80 ) ( 240 1192 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 1200 -152 ) ( 104 1200 -80 ) ( 112 1192 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 96 1200 -80 ) ( 96 1200 -152 ) ( 224 1200 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 192 1192 -120 ) ( 192 1184 -120 ) ( 224 1192 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2860 +{ +( 224 1192 -152 ) ( 192 1192 -152 ) ( 192 1184 -152 ) subway/1_tile_graf5 0 16 0 0.500000 0.500000 0 352321536 0 +( 192 1184 -120 ) ( 192 1192 -120 ) ( 224 1192 -120 ) subway/1_tile_graf5 0 16 0 0.500000 0.500000 0 352321536 0 +( 192 1192 -80 ) ( 224 1192 -80 ) ( 224 1192 -152 ) subway/1_tile_damage2 0 16 0 0.500000 0.500000 0 352321536 0 +( 224 1184 -80 ) ( 224 1192 -80 ) ( 224 1192 -152 ) subway/1_tile_graf5 0 16 0 0.500000 0.500000 0 352321536 0 +( 224 1200 -80 ) ( 192 1200 -80 ) ( 192 1200 -152 ) subway/1_tile_graf5 0 16 0 0.500000 0.500000 0 352321536 0 +( 192 1192 -80 ) ( 192 1184 -80 ) ( 192 1184 -152 ) subway/1_tile_graf5 0 16 0 0.500000 0.500000 0 352321536 0 +} +// brush 2861 +{ +( 288 1096 -120 ) ( 224 1096 -120 ) ( 224 1032 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1056 -80 ) ( 216 1048 -80 ) ( 216 1280 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 216 1056 -152 ) ( 216 1056 -80 ) ( 224 1056 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 248 1096 -24 ) ( 248 1096 -96 ) ( 248 960 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 240 1088 -80 ) ( 240 1088 -152 ) ( 248 1088 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 216 1056 -80 ) ( 216 1056 -152 ) ( 216 1280 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2862 +{ +( 400 912 -152 ) ( 400 912 -48 ) ( 400 1056 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 1344 -112 ) ( 392 1344 -104 ) ( 328 1344 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 392 1936 -8 ) ( 392 1656 -8 ) ( 392 1656 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 9 +( 392 1432 -152 ) ( 392 1496 -152 ) ( 328 1496 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 384 1312 -144 ) ( 408 1312 -144 ) ( 384 1224 -144 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 376 1200 -120 ) ( 408 1200 -120 ) ( 376 1200 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2863 +{ +( 400 912 -152 ) ( 400 912 -48 ) ( 400 1056 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 1960 -8 ) ( 392 1680 -8 ) ( 392 1680 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 9 +( 408 1312 -144 ) ( 384 1312 -144 ) ( 384 1224 -144 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 400 1344 -88 ) ( 376 1344 -88 ) ( 400 1344 -160 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 376 1160 -120 ) ( 376 1200 -120 ) ( 408 1200 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 376 1200 -120 ) ( 408 1200 -120 ) ( 376 1200 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2864 +{ +( 400 912 -152 ) ( 400 912 -48 ) ( 400 1056 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 1960 -8 ) ( 392 1680 -8 ) ( 392 1680 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 9 +( 392 1160 -48 ) ( 392 1160 -152 ) ( 384 1160 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 384 1224 -112 ) ( 384 1312 -112 ) ( 408 1312 -112 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 400 1344 -88 ) ( 376 1344 -88 ) ( 400 1344 -160 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 376 1200 -120 ) ( 376 1160 -120 ) ( 408 1200 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2865 +{ +( 408 1200 -152 ) ( 376 1200 -152 ) ( 376 1160 -152 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 376 1160 -120 ) ( 376 1200 -120 ) ( 408 1200 -120 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 376 1160 -120 ) ( 408 1160 -120 ) ( 408 1160 -152 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 400 1160 -120 ) ( 400 1200 -120 ) ( 400 1200 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 408 1200 -120 ) ( 376 1200 -120 ) ( 376 1200 -152 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( 392 1200 -120 ) ( 392 1160 -120 ) ( 392 1160 -152 ) subway/1_tile_damage1 88 16 0 -0.500000 0.500000 0 352321536 9 +} +// brush 2866 +{ +( 400 912 -152 ) ( 400 912 -48 ) ( 400 1056 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 1344 -112 ) ( 392 1344 -104 ) ( 328 1344 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 392 1936 -8 ) ( 392 1656 -8 ) ( 392 1656 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 9 +( 392 1160 -48 ) ( 392 1160 -152 ) ( 384 1160 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 328 1496 -80 ) ( 392 1496 -80 ) ( 392 1432 -80 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 384 1312 -112 ) ( 384 1224 -112 ) ( 408 1312 -112 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 2867 +{ +( 432 1376 -152 ) ( 304 1376 -152 ) ( 304 1376 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 64 1384 -48 ) ( -72 1384 -48 ) ( -72 1384 -152 ) subway/1_tile 48 48 0 -0.500000 0.500000 0 318767104 10 +( 80 1376 -152 ) ( 72 1384 -152 ) ( 72 1384 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 88 1384 -152 ) ( 152 1384 -152 ) ( 152 1448 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 152 1376 -120 ) ( 152 1392 -120 ) ( 184 1392 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 152 1376 -120 ) ( 152 1392 -120 ) ( 152 1376 -192 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2868 +{ +( 432 1376 -152 ) ( 304 1376 -152 ) ( 304 1376 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 192 1368 -112 ) ( 192 1368 -104 ) ( 192 1432 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 64 1384 -48 ) ( -72 1384 -48 ) ( -72 1384 -152 ) subway/1_tile 48 48 0 -0.500000 0.500000 0 318767104 10 +( 88 1384 -152 ) ( 152 1384 -152 ) ( 152 1448 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 152 1376 -120 ) ( 152 1392 -120 ) ( 184 1392 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 184 1392 -120 ) ( 184 1376 -120 ) ( 184 1392 -192 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2869 +{ +( 432 1376 -152 ) ( 304 1376 -152 ) ( 304 1376 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 192 1368 -112 ) ( 192 1368 -104 ) ( 192 1432 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 64 1384 -48 ) ( -72 1384 -48 ) ( -72 1384 -152 ) subway/1_tile 48 48 0 -0.500000 0.500000 0 318767104 10 +( 80 1376 -152 ) ( 72 1384 -152 ) ( 72 1384 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 1392 -112 ) ( 112 1392 -112 ) ( 80 1376 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 152 1392 -120 ) ( 152 1376 -120 ) ( 184 1392 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2870 +{ +( 80 1392 -80 ) ( 80 1376 -80 ) ( 80 1376 -152 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( 112 1384 -80 ) ( 80 1384 -80 ) ( 80 1384 -152 ) subway/1_tile_graf6 32 32 0 -0.500000 0.500000 0 352321536 10 +( 112 1376 -80 ) ( 112 1392 -80 ) ( 112 1392 -152 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( 80 1376 -80 ) ( 112 1376 -80 ) ( 112 1376 -152 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( 80 1376 -80 ) ( 80 1392 -80 ) ( 112 1392 -80 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( 112 1392 -112 ) ( 80 1392 -112 ) ( 80 1376 -112 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2871 +{ +( 64 1384 -48 ) ( -72 1384 -48 ) ( -72 1384 -152 ) subway/1_tile 48 48 0 -0.500000 0.500000 0 318767104 10 +( 80 1376 -152 ) ( 72 1384 -152 ) ( 72 1384 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 152 1448 -80 ) ( 152 1384 -80 ) ( 88 1384 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 1392 -112 ) ( 80 1392 -112 ) ( 80 1376 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 1376 -80 ) ( 80 1392 -80 ) ( 80 1376 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2872 +{ +( 432 1376 -152 ) ( 304 1376 -152 ) ( 304 1376 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 192 1368 -112 ) ( 192 1368 -104 ) ( 192 1432 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 64 1384 -48 ) ( -72 1384 -48 ) ( -72 1384 -152 ) subway/1_tile 48 48 0 -0.500000 0.500000 0 318767104 10 +( 152 1448 -80 ) ( 152 1384 -80 ) ( 88 1384 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 1392 -112 ) ( 80 1392 -112 ) ( 80 1376 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 1392 -80 ) ( 112 1376 -80 ) ( 112 1392 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2873 +{ +( 184 1392 -152 ) ( 152 1392 -152 ) ( 152 1376 -152 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( 152 1376 -120 ) ( 152 1392 -120 ) ( 184 1392 -120 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( 152 1376 -120 ) ( 184 1376 -120 ) ( 184 1376 -192 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( 184 1376 -120 ) ( 184 1392 -120 ) ( 184 1392 -192 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +( 184 1384 -120 ) ( 152 1384 -120 ) ( 152 1384 -192 ) subway/1_tile_graf5 48 48 0 -0.500000 0.500000 0 352321536 10 +( 152 1392 -120 ) ( 152 1376 -120 ) ( 152 1376 -192 ) subway/1_tile_graf6 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2874 +{ +( 72 1376 -48 ) ( 72 1376 -152 ) ( 72 1504 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 1376 -152 ) ( 80 1376 -48 ) ( 72 1384 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 144 1264 -152 ) ( 80 1264 -152 ) ( 80 1200 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 64 1336 -120 ) ( 64 1376 -120 ) ( 80 1376 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 64 1376 -64 ) ( 80 1376 -64 ) ( 64 1376 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2875 +{ +( 72 1376 -48 ) ( 72 1376 -152 ) ( 72 1504 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 1376 -48 ) ( 80 1376 -152 ) ( 80 1184 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 1184 -48 ) ( 80 1184 -152 ) ( 72 1192 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 144 1264 -152 ) ( 80 1264 -152 ) ( 80 1200 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 64 1336 -120 ) ( 64 1376 -120 ) ( 80 1376 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 1344 -64 ) ( 64 1344 -64 ) ( 80 1344 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2876 +{ +( 72 1376 -48 ) ( 72 1376 -152 ) ( 72 1504 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 1376 -152 ) ( 80 1376 -48 ) ( 72 1384 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 1376 -48 ) ( 80 1376 -152 ) ( 80 1184 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 1184 -48 ) ( 80 1184 -152 ) ( 72 1192 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 1200 -64 ) ( 80 1264 -64 ) ( 144 1264 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 64 1376 -120 ) ( 64 1336 -120 ) ( 80 1376 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2877 +{ +( 80 1376 -152 ) ( 64 1376 -152 ) ( 64 1336 -152 ) subway/1_tile_damage2 0 16 0 0.500000 0.500000 0 352321536 0 +( 64 1336 -120 ) ( 64 1376 -120 ) ( 80 1376 -120 ) subway/1_tile_damage2 0 16 0 0.500000 0.500000 0 352321536 0 +( 64 1344 -64 ) ( 80 1344 -64 ) ( 80 1344 -152 ) subway/1_tile_damage2 0 16 0 0.500000 0.500000 0 352321536 0 +( 80 1344 -64 ) ( 80 1384 -64 ) ( 80 1384 -152 ) subway/1_tile_damage2 0 16 0 0.500000 0.500000 0 352321536 0 +( 80 1376 -64 ) ( 64 1376 -64 ) ( 64 1376 -152 ) subway/1_tile_damage2 0 16 0 0.500000 0.500000 0 352321536 0 +( 72 1376 -64 ) ( 72 1336 -64 ) ( 72 1336 -152 ) subway/1_tile_damage2 0 16 0 0.500000 0.500000 0 352321536 0 +} +// brush 2878 +{ +( 192 1544 -48 ) ( 192 1544 -152 ) ( 192 1536 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -432 1544 -8 ) ( -152 1544 -8 ) ( -152 1544 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1552 -152 ) ( 40 1552 -48 ) ( -104 1552 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1544 -128 ) ( 8 1544 -128 ) ( 8 1536 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1536 -120 ) ( 40 1544 -120 ) ( 72 1544 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 1544 -104 ) ( 72 1536 -104 ) ( 72 1544 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2879 +{ +( 192 1544 -48 ) ( 192 1544 -152 ) ( 192 1536 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -432 1544 -8 ) ( -152 1544 -8 ) ( -152 1544 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1552 -152 ) ( 40 1552 -48 ) ( -104 1552 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 8 1536 -96 ) ( 8 1544 -96 ) ( 40 1544 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1544 -80 ) ( 40 1536 -80 ) ( 40 1544 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1544 -120 ) ( 40 1536 -120 ) ( 72 1544 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2880 +{ +( -120 1544 -152 ) ( -184 1544 -152 ) ( -184 1480 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -432 1544 -8 ) ( -152 1544 -8 ) ( -152 1544 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -240 1544 -112 ) ( -240 1544 -104 ) ( -240 1480 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1552 -152 ) ( 40 1552 -48 ) ( -104 1552 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 8 1544 -128 ) ( 40 1544 -128 ) ( 8 1536 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1536 -104 ) ( 40 1544 -104 ) ( 40 1536 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2881 +{ +( -120 1544 -152 ) ( -184 1544 -152 ) ( -184 1480 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 192 1544 -48 ) ( 192 1544 -152 ) ( 192 1536 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -432 1544 -8 ) ( -152 1544 -8 ) ( -152 1544 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1552 -152 ) ( 40 1552 -48 ) ( -104 1552 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 8 1544 -128 ) ( 40 1544 -128 ) ( 8 1536 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 1544 -104 ) ( 72 1536 -104 ) ( 72 1544 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2882 +{ +( 8 1544 -80 ) ( 8 1536 -80 ) ( 8 1536 -152 ) subway/1_tile_graf12 0 0 0 0.500000 0.500000 0 318767104 0 +( 40 1552 -80 ) ( 8 1552 -80 ) ( 8 1552 -152 ) subway/1_tile_graf12 16 0 0 0.500000 0.500000 0 318767104 0 +( 40 1536 -80 ) ( 40 1544 -80 ) ( 40 1544 -152 ) subway/1_tile_graf12 0 0 0 0.500000 0.500000 0 318767104 0 +( 8 1544 -80 ) ( 40 1544 -80 ) ( 40 1544 -152 ) subway/1_tile_graf12 48 0 0 0.500000 0.500000 0 318767104 0 +( 8 1536 -96 ) ( 8 1544 -96 ) ( 40 1544 -96 ) subway/1_tile_graf12 16 0 0 0.500000 0.500000 0 318767104 0 +( 40 1544 -128 ) ( 8 1544 -128 ) ( 8 1536 -128 ) subway/1_tile_graf12 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2883 +{ +( -432 1544 -8 ) ( -152 1544 -8 ) ( -152 1544 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -240 1544 -112 ) ( -240 1544 -104 ) ( -240 1480 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1552 -152 ) ( 40 1552 -48 ) ( -104 1552 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1544 -128 ) ( 8 1544 -128 ) ( 8 1536 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 8 1536 -96 ) ( 8 1544 -96 ) ( 40 1544 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 8 1536 -80 ) ( 8 1544 -80 ) ( 8 1536 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2884 +{ +( -184 1480 -80 ) ( -184 1544 -80 ) ( -120 1544 -80 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 192 1544 -48 ) ( 192 1544 -152 ) ( 192 1536 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -432 1544 -8 ) ( -152 1544 -8 ) ( -152 1544 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -240 1544 -112 ) ( -240 1544 -104 ) ( -240 1480 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1552 -152 ) ( 40 1552 -48 ) ( -104 1552 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 8 1544 -96 ) ( 8 1536 -96 ) ( 40 1544 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2885 +{ +( 72 1544 -152 ) ( 40 1544 -152 ) ( 40 1536 -152 ) subway/1_tile_graf12 -48 0 0 0.500000 0.500000 0 318767104 0 +( 40 1536 -120 ) ( 40 1544 -120 ) ( 72 1544 -120 ) subway/1_tile_graf12 -48 0 0 0.500000 0.500000 0 318767104 0 +( 40 1544 -104 ) ( 72 1544 -104 ) ( 72 1544 -176 ) subway/1_tile_graf1 48 16 0 0.500000 0.500000 0 352321536 0 +( 72 1536 -104 ) ( 72 1544 -104 ) ( 72 1544 -176 ) subway/1_tile_graf12 0 -48 0 0.500000 0.500000 0 318767104 0 +( 72 1552 -104 ) ( 40 1552 -104 ) ( 40 1552 -176 ) subway/1_tile_graf12 -48 -48 0 0.500000 0.500000 0 318767104 0 +( 40 1544 -104 ) ( 40 1536 -104 ) ( 40 1536 -176 ) subway/1_tile_graf12 0 -48 0 0.500000 0.500000 0 318767104 0 +} +// brush 2886 +{ +( -408 1448 -128 ) ( -344 1448 -128 ) ( -344 1512 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -344 1512 -96 ) ( -344 1448 -96 ) ( -408 1448 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -312 1224 -168 ) ( -312 1224 -64 ) ( -344 1224 -64 ) subway/1_tile_graf5 16 0 0 -0.500000 0.500000 0 352321536 0 +( -344 1600 -240 ) ( -344 1600 -24 ) ( -344 1320 -24 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -400 1192 -120 ) ( -336 1192 -120 ) ( -336 1192 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -312 1232 -96 ) ( -312 1232 -200 ) ( -312 1192 -200 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2887 +{ +( -408 1448 -96 ) ( -344 1448 -96 ) ( -344 1512 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -344 1512 -80 ) ( -344 1448 -80 ) ( -408 1448 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -312 1224 -152 ) ( -312 1224 -48 ) ( -344 1224 -48 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 0 +( -344 1600 -224 ) ( -344 1600 -8 ) ( -344 1320 -8 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -400 1192 -104 ) ( -336 1192 -104 ) ( -336 1192 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -312 1232 -80 ) ( -312 1232 -184 ) ( -312 1192 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2888 +{ +( -408 1232 -80 ) ( -408 1232 -184 ) ( -408 1192 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -496 1192 -104 ) ( -432 1192 -104 ) ( -432 1192 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1600 -224 ) ( -440 1600 -8 ) ( -440 1320 -8 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -408 1224 -152 ) ( -408 1224 -48 ) ( -440 1224 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -440 1512 -80 ) ( -440 1448 -80 ) ( -504 1448 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -504 1448 -152 ) ( -440 1448 -152 ) ( -440 1512 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2889 +{ +( -248 1192 -48 ) ( -248 1192 -152 ) ( -120 1192 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 1184 -152 ) ( 80 1184 -48 ) ( 72 1192 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 1184 -48 ) ( 80 1184 -152 ) ( -256 1184 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1184 -48 ) ( -448 1184 -152 ) ( -440 1192 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -424 1184 -64 ) ( -360 1184 -64 ) ( -360 1120 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -392 1200 -144 ) ( -392 1176 -144 ) ( -360 1200 -144 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2890 +{ +( -248 1192 -48 ) ( -248 1192 -152 ) ( -120 1192 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 1184 -152 ) ( 80 1184 -48 ) ( 72 1192 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 1184 -48 ) ( 80 1184 -152 ) ( -256 1184 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1184 -48 ) ( -448 1184 -152 ) ( -440 1192 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -360 1120 -152 ) ( -360 1184 -152 ) ( -424 1184 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -392 1200 -144 ) ( -360 1200 -144 ) ( -392 1176 -144 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2891 +{ +( -176 1480 -32 ) ( -240 1480 -32 ) ( -240 1544 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -240 1760 -48 ) ( -232 1768 -48 ) ( -232 1768 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -240 1792 -48 ) ( -240 1624 -48 ) ( -240 1624 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -248 1528 -32 ) ( -240 1520 -32 ) ( -240 1520 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -248 1448 -96 ) ( -248 1448 -88 ) ( -248 1384 -88 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -256 1648 -40 ) ( -256 1608 -40 ) ( -232 1648 -40 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2892 +{ +( -240 1544 -96 ) ( -240 1480 -96 ) ( -176 1480 -96 ) subway/1_tile 640 2976 0 0.500000 0.500000 0 318767104 0 +( -240 1760 -128 ) ( -232 1768 -128 ) ( -232 1768 -64 ) subway/1_tile -2832 -32 0 0.500000 0.500000 0 318767104 0 +( -240 1792 -112 ) ( -240 1624 -112 ) ( -240 1624 -48 ) subway/1_tile 1264 -32 0 0.500000 0.500000 0 318767104 0 +( -248 1528 -48 ) ( -240 1520 -48 ) ( -240 1520 -112 ) subway/1_tile -2832 -32 0 0.500000 0.500000 0 318767104 0 +( -248 1448 -112 ) ( -248 1448 -104 ) ( -248 1384 -104 ) subway/1_tile 1264 -32 0 0.500000 0.500000 0 318767104 0 +( -256 1648 -72 ) ( -232 1648 -72 ) ( -256 1608 -72 ) subway/1_tile 1264 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2893 +{ +( -680 1760 -64 ) ( -744 1760 -64 ) ( -744 1824 -64 ) subway/1_tile 1408 3344 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -48 ) ( -704 1760 -112 ) ( -536 1760 -112 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -128 ) ( -704 1760 -64 ) ( -696 1752 -64 ) subway/1_tile -3200 -32 0 0.500000 0.500000 0 318767104 0 +( -544 1752 -88 ) ( -480 1752 -88 ) ( -480 1752 -96 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +( -528 1752 -72 ) ( -560 1752 -72 ) ( -560 1744 -72 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +( -560 1744 -48 ) ( -560 1752 -48 ) ( -560 1744 -64 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2894 +{ +( -680 1760 -64 ) ( -744 1760 -64 ) ( -744 1824 -64 ) subway/1_tile 1408 3344 0 0.500000 0.500000 0 318767104 0 +( -232 1768 -64 ) ( -232 1768 -128 ) ( -240 1760 -128 ) subway/1_tile -3200 -32 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -48 ) ( -704 1760 -112 ) ( -536 1760 -112 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +( -544 1752 -88 ) ( -480 1752 -88 ) ( -480 1752 -96 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +( -528 1752 -72 ) ( -560 1752 -72 ) ( -560 1744 -72 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +( -528 1752 -48 ) ( -528 1744 -48 ) ( -528 1752 -64 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2895 +{ +( -744 1824 -96 ) ( -744 1760 -96 ) ( -680 1760 -96 ) subway/1_tile 1408 3344 0 0.500000 0.500000 0 318767104 0 +( -232 1768 -64 ) ( -232 1768 -128 ) ( -240 1760 -128 ) subway/1_tile -3200 -32 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -48 ) ( -704 1760 -112 ) ( -536 1760 -112 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -128 ) ( -704 1760 -64 ) ( -696 1752 -64 ) subway/1_tile -3200 -32 0 0.500000 0.500000 0 318767104 0 +( -544 1752 -88 ) ( -480 1752 -88 ) ( -480 1752 -96 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +( -560 1752 -72 ) ( -528 1752 -72 ) ( -560 1744 -72 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2896 +{ +( -544 1752 -104 ) ( -480 1752 -104 ) ( -480 1752 -112 ) subway/1_tile_middle 128 0 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -64 ) ( -704 1760 -48 ) ( -696 1752 -48 ) subway/1_tile_middle -464 0 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -48 ) ( -704 1760 -64 ) ( -536 1760 -64 ) subway/1_tile_middle 128 0 0 0.500000 0.500000 0 318767104 0 +( -680 1760 -48 ) ( -744 1760 -48 ) ( -744 1824 -48 ) subway/1_tile_middle 288 464 0 0.500000 0.500000 0 318767104 0 +( -744 1824 -64 ) ( -744 1760 -64 ) ( -680 1760 -64 ) subway/1_tile_middle 288 464 0 0.500000 0.500000 0 318767104 0 +( -560 1744 -48 ) ( -560 1752 -48 ) ( -560 1744 -64 ) subway/1_tile_middle 288 464 0 0.500000 0.500000 0 318767104 0 +} +// brush 2897 +{ +( -544 1752 -104 ) ( -480 1752 -104 ) ( -480 1752 -112 ) subway/1_tile_middle 128 0 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -48 ) ( -704 1760 -64 ) ( -536 1760 -64 ) subway/1_tile_middle 128 0 0 0.500000 0.500000 0 318767104 0 +( -232 1768 -48 ) ( -232 1768 -64 ) ( -240 1760 -64 ) subway/1_tile_middle -464 0 0 0.500000 0.500000 0 318767104 0 +( -680 1760 -48 ) ( -744 1760 -48 ) ( -744 1824 -48 ) subway/1_tile_middle 288 464 0 0.500000 0.500000 0 318767104 0 +( -744 1824 -64 ) ( -744 1760 -64 ) ( -680 1760 -64 ) subway/1_tile_middle 288 464 0 0.500000 0.500000 0 318767104 0 +( -528 1752 -48 ) ( -528 1744 -48 ) ( -528 1752 -64 ) subway/1_tile_middle 288 464 0 0.500000 0.500000 0 318767104 0 +} +// brush 2898 +{ +( -744 1824 -48 ) ( -744 1760 -48 ) ( -680 1760 -48 ) subway/1_tile -2464 384 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -32 ) ( -704 1760 -48 ) ( -536 1760 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -48 ) ( -704 1760 -32 ) ( -696 1752 -32 ) subway/1_tile -2656 192 0 0.500000 0.500000 0 318767104 0 +( -544 1752 -88 ) ( -480 1752 -88 ) ( -480 1752 -96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -560 1744 -40 ) ( -560 1752 -40 ) ( -528 1752 -40 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -560 1744 -48 ) ( -560 1752 -48 ) ( -560 1744 -64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2899 +{ +( -744 1824 -48 ) ( -744 1760 -48 ) ( -680 1760 -48 ) subway/1_tile -2464 384 0 0.500000 0.500000 0 318767104 0 +( -232 1768 -32 ) ( -232 1768 -48 ) ( -240 1760 -48 ) subway/1_tile -2656 192 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -32 ) ( -704 1760 -48 ) ( -536 1760 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -544 1752 -88 ) ( -480 1752 -88 ) ( -480 1752 -96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -560 1744 -40 ) ( -560 1752 -40 ) ( -528 1752 -40 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -528 1752 -48 ) ( -528 1744 -48 ) ( -528 1752 -64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2900 +{ +( -680 1760 -32 ) ( -744 1760 -32 ) ( -744 1824 -32 ) subway/1_tile -2464 384 0 0.500000 0.500000 0 318767104 0 +( -232 1768 -32 ) ( -232 1768 -48 ) ( -240 1760 -48 ) subway/1_tile -2656 192 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -32 ) ( -704 1760 -48 ) ( -536 1760 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -48 ) ( -704 1760 -32 ) ( -696 1752 -32 ) subway/1_tile -2656 192 0 0.500000 0.500000 0 318767104 0 +( -544 1752 -88 ) ( -480 1752 -88 ) ( -480 1752 -96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -560 1752 -40 ) ( -560 1744 -40 ) ( -528 1752 -40 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2901 +{ +( -528 1752 -72 ) ( -560 1752 -72 ) ( -560 1744 -72 ) subway/1_tile_graf7 0 -16 0 0.500000 0.500000 0 352321536 0 +( -560 1744 -40 ) ( -560 1752 -40 ) ( -528 1752 -40 ) subway/1_tile_graf7 0 -16 0 0.500000 0.500000 0 352321536 0 +( -560 1752 -48 ) ( -528 1752 -48 ) ( -528 1752 -64 ) subway/1_tile_graf7 32 -16 0 0.500000 0.500000 0 352321536 0 +( -528 1752 -48 ) ( -528 1760 -48 ) ( -528 1760 -64 ) subway/1_tile_graf7 0 -16 0 0.500000 0.500000 0 352321536 0 +( -528 1760 -48 ) ( -560 1760 -48 ) ( -560 1760 -64 ) subway/1_tile_graf7 0 -16 0 0.500000 0.500000 0 352321536 0 +( -560 1752 -48 ) ( -560 1744 -48 ) ( -560 1744 -64 ) subway/1_tile_graf7 0 -16 0 0.500000 0.500000 0 352321536 0 +} +// brush 2902 +{ +( -392 1456 -112 ) ( -392 1520 -112 ) ( -456 1520 -112 ) subway/1_tile 1120 2880 0 0.500000 0.500000 0 318767104 0 +( -496 1520 -8 ) ( -496 1520 -112 ) ( -504 1528 -112 ) subway/1_tile -2736 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1520 -8 ) ( -448 1520 -112 ) ( -496 1520 -112 ) subway/1_tile 976 -32 0 0.500000 0.500000 0 318767104 0 +( -144 1528 -104 ) ( -208 1528 -104 ) ( -208 1528 -112 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -488 1520 -80 ) ( -488 1536 -80 ) ( -456 1536 -80 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -488 1520 -64 ) ( -488 1536 -64 ) ( -488 1520 -112 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2903 +{ +( -392 1456 -112 ) ( -392 1520 -112 ) ( -456 1520 -112 ) subway/1_tile 1120 2880 0 0.500000 0.500000 0 318767104 0 +( -448 1520 -8 ) ( -448 1520 -112 ) ( -496 1520 -112 ) subway/1_tile 976 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1520 -112 ) ( -448 1520 -8 ) ( -440 1528 -8 ) subway/1_tile -2736 -32 0 0.500000 0.500000 0 318767104 0 +( -144 1528 -104 ) ( -208 1528 -104 ) ( -208 1528 -112 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -488 1520 -80 ) ( -488 1536 -80 ) ( -456 1536 -80 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -456 1536 -64 ) ( -456 1520 -64 ) ( -456 1536 -112 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2904 +{ +( -456 1520 -64 ) ( -392 1520 -64 ) ( -392 1456 -64 ) subway/1_tile 1120 2880 0 0.500000 0.500000 0 318767104 0 +( -496 1520 -8 ) ( -496 1520 -112 ) ( -504 1528 -112 ) subway/1_tile -2736 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1520 -8 ) ( -448 1520 -112 ) ( -496 1520 -112 ) subway/1_tile 976 -32 0 0.500000 0.500000 0 318767104 0 +( -448 1520 -112 ) ( -448 1520 -8 ) ( -440 1528 -8 ) subway/1_tile -2736 -32 0 0.500000 0.500000 0 318767104 0 +( -144 1528 -104 ) ( -208 1528 -104 ) ( -208 1528 -112 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -488 1536 -80 ) ( -488 1520 -80 ) ( -456 1536 -80 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2905 +{ +( -456 1536 -112 ) ( -488 1536 -112 ) ( -488 1520 -112 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -488 1520 -80 ) ( -488 1536 -80 ) ( -456 1536 -80 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( -488 1520 -64 ) ( -456 1520 -64 ) ( -456 1520 -112 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -456 1520 -64 ) ( -456 1536 -64 ) ( -456 1536 -112 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -456 1528 -64 ) ( -488 1528 -64 ) ( -488 1528 -112 ) subway/1_tile_damage2 0 -32 0 0.500000 0.500000 0 352321536 0 +( -488 1528 -64 ) ( -488 1512 -64 ) ( -488 1512 -112 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2906 +{ +( -496 1424 0 ) ( -536 1424 0 ) ( -536 1336 0 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( -536 1336 16 ) ( -536 1424 16 ) ( -496 1424 16 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( -536 1360 48 ) ( -496 1360 48 ) ( -496 1360 -16 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( -496 1336 48 ) ( -496 1424 48 ) ( -496 1424 -16 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( -496 1424 48 ) ( -536 1424 48 ) ( -536 1424 -16 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( -504 1424 48 ) ( -504 1336 48 ) ( -504 1336 -16 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 2907 +{ +( -512 1432 8 ) ( -512 1368 8 ) ( -512 1368 0 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -504 1288 8 ) ( -504 1352 8 ) ( -504 1352 0 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -512 1168 8 ) ( -504 1168 8 ) ( -504 1168 -112 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -504 1192 8 ) ( -512 1192 8 ) ( -512 1528 -104 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -496 1424 -32 ) ( -536 1424 -32 ) ( -536 1336 -32 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -536 1336 0 ) ( -536 1424 0 ) ( -496 1424 0 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2908 +{ +( -512 1432 8 ) ( -512 1368 8 ) ( -512 1368 0 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -504 1288 8 ) ( -504 1352 8 ) ( -504 1352 0 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -512 1168 8 ) ( -504 1168 8 ) ( -504 1168 -112 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -504 1192 8 ) ( -512 1192 8 ) ( -512 1528 -104 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -536 1424 0 ) ( -536 1336 0 ) ( -496 1424 0 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2909 +{ +( -512 1432 8 ) ( -512 1368 8 ) ( -512 1368 0 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -504 1528 -104 ) ( -512 1528 -104 ) ( -512 1528 -112 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -504 1288 8 ) ( -504 1352 8 ) ( -504 1352 0 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -512 1168 8 ) ( -504 1168 8 ) ( -504 1168 -112 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -504 1192 8 ) ( -512 1192 8 ) ( -512 1528 -104 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -496 1232 -112 ) ( -560 1232 -112 ) ( -560 1168 -112 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -536 1424 -32 ) ( -496 1424 -32 ) ( -536 1336 -32 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2910 +{ +( -504 1288 -32 ) ( -504 1288 -16 ) ( -504 936 -16 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( -504 1520 -16 ) ( -504 1520 -32 ) ( -496 1520 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 120 ) ( -496 1520 -16 ) ( -496 1168 -16 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 -32 ) ( -504 1528 -32 ) ( -504 1168 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -536 1336 16 ) ( -536 1424 16 ) ( -496 1424 16 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -536 1424 32 ) ( -496 1424 32 ) ( -536 1424 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2911 +{ +( -504 1288 -16 ) ( -504 1288 0 ) ( -504 936 0 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +( -496 1520 120 ) ( -496 1520 -16 ) ( -496 1168 -16 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -416 936 24 ) ( -352 936 24 ) ( -352 936 16 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 0 ) ( -504 1528 0 ) ( -504 1168 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -536 1336 16 ) ( -536 1424 16 ) ( -496 1424 16 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1360 48 ) ( -536 1360 48 ) ( -496 1360 -16 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2912 +{ +( -504 1288 -32 ) ( -504 1288 -16 ) ( -504 936 -16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -504 1520 -16 ) ( -504 1520 -32 ) ( -496 1520 -32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -496 1520 104 ) ( -496 1520 -32 ) ( -496 1168 -32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 936 8 ) ( -352 936 8 ) ( -352 936 0 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -496 1456 32 ) ( -496 1520 32 ) ( -432 1520 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -536 1424 16 ) ( -536 1336 16 ) ( -496 1424 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2913 +{ +( -504 944 128 ) ( -504 944 48 ) ( -504 1520 48 ) subway/1_tile 0 -32 0 -0.500000 0.500000 0 318767104 0 +( -504 1520 16 ) ( -504 1520 0 ) ( -496 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 136 ) ( -496 1520 0 ) ( -496 1168 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 984 96 ) ( -520 1016 96 ) ( -496 1016 96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 1048 80 ) ( -520 1016 80 ) ( -496 1048 80 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 1424 80 ) ( -504 1424 80 ) ( -520 1424 64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2914 +{ +( -504 944 128 ) ( -504 944 48 ) ( -504 1520 48 ) subway/1_tile 0 -32 0 -0.500000 0.500000 0 318767104 0 +( -496 1520 136 ) ( -496 1520 0 ) ( -496 1168 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 984 96 ) ( -520 1016 96 ) ( -496 1016 96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 1024 128 ) ( -496 1024 128 ) ( -520 1024 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 1048 80 ) ( -520 1016 80 ) ( -496 1048 80 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -504 1392 80 ) ( -520 1392 80 ) ( -504 1392 64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2915 +{ +( -504 944 128 ) ( -504 944 48 ) ( -504 1520 48 ) subway/1_tile 0 -32 0 -0.500000 0.500000 0 318767104 0 +( -504 1520 16 ) ( -504 1520 0 ) ( -496 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 136 ) ( -496 1520 0 ) ( -496 1168 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1016 64 ) ( -520 1016 64 ) ( -520 984 64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 1016 80 ) ( -520 1048 80 ) ( -496 1048 80 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 1424 80 ) ( -504 1424 80 ) ( -520 1424 64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2916 +{ +( -504 944 128 ) ( -504 944 48 ) ( -504 1520 48 ) subway/1_tile 0 -32 0 -0.500000 0.500000 0 318767104 0 +( -496 1520 136 ) ( -496 1520 0 ) ( -496 1168 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1016 64 ) ( -520 1016 64 ) ( -520 984 64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 1016 80 ) ( -520 1048 80 ) ( -496 1048 80 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 1056 112 ) ( -496 1056 112 ) ( -520 1056 32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -504 1392 80 ) ( -520 1392 80 ) ( -504 1392 64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2917 +{ +( -504 1432 64 ) ( -520 1432 64 ) ( -520 1392 64 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( -520 1392 96 ) ( -520 1432 96 ) ( -504 1432 96 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( -520 1392 80 ) ( -504 1392 80 ) ( -504 1392 64 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( -496 1392 80 ) ( -496 1432 80 ) ( -496 1432 64 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( -504 1424 80 ) ( -520 1424 80 ) ( -520 1424 64 ) subway/1_tile_damage1 0 0 0 0.500000 0.500000 0 352321536 0 +( -504 1432 80 ) ( -504 1392 80 ) ( -504 1392 64 ) subway/1_tile_damage1 32 0 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2918 +{ +( -632 1528 128 ) ( -632 1512 128 ) ( -632 1512 48 ) subway/1_tile_graf6 48 0 0 0.500000 0.500000 0 352321536 0 +( -608 1528 128 ) ( -632 1528 128 ) ( -632 1528 48 ) subway/1_tile_graf6 48 0 0 0.500000 0.500000 0 352321536 0 +( -600 1512 128 ) ( -600 1528 128 ) ( -600 1528 48 ) subway/1_tile_graf6 48 0 0 0.500000 0.500000 0 352321536 0 +( -632 1520 128 ) ( -608 1520 128 ) ( -608 1520 48 ) subway/1_tile_graf6 48 0 0 0.500000 0.500000 0 352321536 0 +( -632 1512 96 ) ( -632 1528 96 ) ( -608 1528 96 ) subway/1_tile_graf6 48 0 0 0.500000 0.500000 0 352321536 0 +( -608 1528 64 ) ( -632 1528 64 ) ( -632 1512 64 ) subway/1_tile_graf6 48 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2919 +{ +( -632 1520 56 ) ( -496 1520 56 ) ( -496 1520 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -536 1520 64 ) ( -536 1528 64 ) ( -536 1528 56 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1528 64 ) ( -632 1528 64 ) ( -632 1528 56 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -608 1528 64 ) ( -632 1528 64 ) ( -632 1512 64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1512 96 ) ( -632 1528 96 ) ( -608 1528 96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -600 1528 128 ) ( -600 1512 128 ) ( -600 1528 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2920 +{ +( -624 1520 128 ) ( -624 1528 128 ) ( -488 1528 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1520 56 ) ( -496 1520 56 ) ( -496 1520 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -504 1520 64 ) ( -504 1528 64 ) ( -504 1528 56 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1528 64 ) ( -632 1528 64 ) ( -632 1528 56 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1528 40 ) ( -632 1520 40 ) ( -632 1520 32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1528 96 ) ( -632 1512 96 ) ( -608 1528 96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2921 +{ +( -488 1528 48 ) ( -624 1528 48 ) ( -624 1520 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1520 56 ) ( -496 1520 56 ) ( -496 1520 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -504 1520 64 ) ( -504 1528 64 ) ( -504 1528 56 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1528 64 ) ( -632 1528 64 ) ( -632 1528 56 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1528 40 ) ( -632 1520 40 ) ( -632 1520 32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1528 64 ) ( -608 1528 64 ) ( -632 1512 64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2922 +{ +( -512 1528 64 ) ( -536 1528 64 ) ( -536 1512 64 ) subway/1_tile_graf6 48 0 0 0.500000 0.500000 0 352321536 0 +( -536 1512 96 ) ( -536 1528 96 ) ( -512 1528 96 ) subway/1_tile_graf6 48 0 0 0.500000 0.500000 0 352321536 0 +( -536 1520 128 ) ( -512 1520 128 ) ( -512 1520 48 ) subway/1_tile_graf4 -16 0 0 0.500000 0.500000 0 352321536 0 +( -504 1512 128 ) ( -504 1528 128 ) ( -504 1528 48 ) subway/1_tile_graf6 48 0 0 0.500000 0.500000 0 352321536 0 +( -512 1528 128 ) ( -536 1528 128 ) ( -536 1528 48 ) subway/1_tile_graf6 48 0 0 0.500000 0.500000 0 352321536 0 +( -536 1528 128 ) ( -536 1512 128 ) ( -536 1512 48 ) subway/1_tile_graf6 48 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2923 +{ +( -504 944 128 ) ( -504 944 48 ) ( -504 1520 48 ) subway/1_tile 0 -32 0 -0.500000 0.500000 0 318767104 0 +( -504 1520 16 ) ( -504 1520 0 ) ( -496 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 136 ) ( -496 1520 0 ) ( -496 1168 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 48 ) ( -504 1528 48 ) ( -504 1168 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 1016 64 ) ( -496 1016 64 ) ( -520 984 64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 1056 112 ) ( -496 1056 112 ) ( -520 1056 32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2924 +{ +( -504 944 128 ) ( -504 944 48 ) ( -504 1520 48 ) subway/1_tile 0 -32 0 -0.500000 0.500000 0 318767104 0 +( -496 1520 136 ) ( -496 1520 0 ) ( -496 1168 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -504 944 48 ) ( -504 944 128 ) ( -496 936 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 48 ) ( -504 1528 48 ) ( -504 1168 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 1016 64 ) ( -496 1016 64 ) ( -520 984 64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1024 112 ) ( -520 1024 112 ) ( -496 1024 32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2925 +{ +( -504 1016 128 ) ( -504 984 128 ) ( -504 984 48 ) subway/1_tile_graf3 0 0 0 -0.500000 0.500000 0 352321536 0 +( -496 1024 128 ) ( -520 1024 128 ) ( -520 1024 48 ) subway/1_tile_graf3 0 0 0 0.500000 0.500000 0 352321536 0 +( -496 984 128 ) ( -496 1016 128 ) ( -496 1016 48 ) subway/1_tile_graf3 0 0 0 0.500000 0.500000 0 352321536 0 +( -520 992 128 ) ( -496 992 128 ) ( -496 992 48 ) subway/1_tile_graf3 0 0 0 0.500000 0.500000 0 352321536 0 +( -520 984 96 ) ( -520 1016 96 ) ( -496 1016 96 ) subway/1_tile_graf3 0 0 0 0.500000 0.500000 0 352321536 0 +( -496 1016 64 ) ( -520 1016 64 ) ( -520 984 64 ) subway/1_tile_graf3 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 2926 +{ +( -504 944 128 ) ( -504 944 48 ) ( -504 1520 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 136 ) ( -496 1520 0 ) ( -496 1168 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -504 944 48 ) ( -504 944 128 ) ( -496 936 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1016 64 ) ( -520 1016 64 ) ( -520 984 64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 984 96 ) ( -520 1016 96 ) ( -496 1016 96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 992 128 ) ( -520 992 128 ) ( -496 992 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2927 +{ +( -504 944 128 ) ( -504 944 48 ) ( -504 1520 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -504 1520 16 ) ( -504 1520 0 ) ( -496 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 136 ) ( -496 1520 0 ) ( -496 1168 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -504 944 48 ) ( -504 944 128 ) ( -496 936 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1456 128 ) ( -496 1520 128 ) ( -432 1520 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -520 1016 96 ) ( -520 984 96 ) ( -496 1016 96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2928 +{ +( -496 1048 48 ) ( -520 1048 48 ) ( -520 1016 48 ) subway/1_tile_damage2 0 -32 0 -0.500000 0.500000 0 352321536 0 +( -520 1016 80 ) ( -520 1048 80 ) ( -496 1048 80 ) subway/1_tile_damage2 0 -32 0 -0.500000 0.500000 0 352321536 0 +( -520 1024 112 ) ( -496 1024 112 ) ( -496 1024 32 ) subway/1_tile_damage2 0 -32 0 -0.500000 0.500000 0 352321536 0 +( -496 1016 112 ) ( -496 1048 112 ) ( -496 1048 32 ) subway/1_tile_damage2 0 -32 0 -0.500000 0.500000 0 352321536 0 +( -496 1056 112 ) ( -520 1056 112 ) ( -520 1056 32 ) subway/1_tile_damage2 0 -32 0 -0.500000 0.500000 0 352321536 0 +( -504 1048 112 ) ( -504 1016 112 ) ( -504 1016 32 ) subway/1_tile_damage2 0 -32 0 -0.500000 0.500000 0 352321536 0 +} +// brush 2929 +{ +( -82 -408 -356 ) ( -82 -416 -356 ) ( -84 -416 -363 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -51 -408 -364 ) ( -82 -408 -356 ) ( -84 -408 -363 ) subway/1_poster2a 0 0 0 0.500000 0.500000 134217728 0 0 +( -51 -416 -364 ) ( -51 -408 -364 ) ( -53 -408 -372 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -82 -410 -356 ) ( -51 -410 -364 ) ( -53 -410 -372 ) subway/sign9 88 24 -16 0.500000 0.500000 0 0 0 +( -75 -416 -332 ) ( -75 -408 -332 ) ( -44 -408 -341 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -53 -408 -372 ) ( -84 -408 -363 ) ( -84 -416 -363 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 2930 +{ +( -488 928 96 ) ( -488 928 128 ) ( -520 960 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -800 944 96 ) ( -800 968 128 ) ( -912 968 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -784 936 128 ) ( -784 936 96 ) ( -776 944 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -464 936 128 ) ( -464 936 96 ) ( -784 936 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -872 936 128 ) ( -872 968 128 ) ( -760 968 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -768 936 96 ) ( -768 976 96 ) ( -872 976 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2931 +{ +( -792 1048 96 ) ( -688 1048 96 ) ( -688 1088 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 1056 128 ) ( -792 1056 128 ) ( -792 1088 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -616 1088 96 ) ( -616 1088 128 ) ( -672 1088 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -672 1088 96 ) ( -672 1088 128 ) ( -704 1056 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -792 1056 128 ) ( -680 1056 128 ) ( -680 1080 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -640 1088 128 ) ( -640 1088 96 ) ( -632 1080 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2932 +{ +( -672 1088 128 ) ( -672 1088 96 ) ( -680 1080 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -704 1248 128 ) ( -704 1136 128 ) ( -680 1136 96 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( -672 1176 96 ) ( -672 1176 128 ) ( -704 1176 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -672 1112 96 ) ( -672 1112 128 ) ( -672 1208 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -704 1136 128 ) ( -704 1248 128 ) ( -672 1248 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -712 1248 96 ) ( -712 1144 96 ) ( -672 1144 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2933 +{ +( -784 1136 96 ) ( -744 1136 96 ) ( -744 1240 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -784 1240 128 ) ( -752 1240 128 ) ( -752 1128 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -784 936 128 ) ( -784 936 96 ) ( -784 1152 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -752 1176 128 ) ( -784 1176 128 ) ( -784 1176 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -776 1144 96 ) ( -752 1144 128 ) ( -752 1256 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -784 936 96 ) ( -784 936 128 ) ( -752 968 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2934 +{ +( -640 1144 96 ) ( -600 1144 96 ) ( -600 1248 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -640 1248 128 ) ( -608 1248 128 ) ( -608 1136 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -640 1088 128 ) ( -640 1088 96 ) ( -640 1520 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -608 1520 128 ) ( -640 1520 128 ) ( -640 1520 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -632 1136 96 ) ( -608 1136 128 ) ( -608 1248 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -640 1088 96 ) ( -640 1088 128 ) ( -608 1056 128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2935 +{ +( 1816 1792 -320 ) ( 1816 1760 -320 ) ( 1816 1760 -448 ) subway/metal1 -31 16 0 0.500000 0.500000 0 16777216 0 +( 1832 1792 -320 ) ( 1816 1792 -320 ) ( 1816 1792 -448 ) subway/metal1 32 16 0 0.500000 0.500000 0 16777216 0 +( 1832 1760 -320 ) ( 1832 1792 -320 ) ( 1832 1792 -448 ) subway/metal1 0 16 0 0.500000 0.500000 0 16777216 0 +( 1816 1760 -320 ) ( 1832 1760 -320 ) ( 1832 1760 -448 ) subway/metal1 32 16 0 0.500000 0.500000 0 16777216 0 +( 1816 1760 -288 ) ( 1816 1792 -288 ) ( 1832 1792 -288 ) subway/metal1 32 0 0 0.500000 0.500000 0 16777216 0 +( 1832 1792 -480 ) ( 1816 1792 -480 ) ( 1816 1760 -480 ) subway/metal1 32 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2936 +{ +( 704 -32 -536 ) ( 680 -32 -536 ) ( 680 -56 -536 ) subway/metalrib1 0 -256 0 0.500000 0.500000 0 16777216 0 +( 692 -56 -352 ) ( 692 -32 -352 ) ( 716 -32 -352 ) subway/metalrib1 0 -256 0 0.500000 0.500000 0 16777216 0 +( 688 -56 -448 ) ( 712 -56 -448 ) ( 712 -56 -480 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 696 -40 -448 ) ( 696 -16 -448 ) ( 696 -16 -480 ) subway/metal1 272 0 0 0.500000 0.500000 0 16777216 0 +( 712 -24 -552 ) ( 688 -24 -552 ) ( 688 -24 -584 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 688 -32 -448 ) ( 688 -56 -448 ) ( 688 -56 -480 ) subway/metalrib1 256 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2937 +{ +( 264 -832 -200 ) ( 232 -832 -200 ) ( 232 -872 -200 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 232 -880 -152 ) ( 232 -840 -152 ) ( 264 -840 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 232 -880 -144 ) ( 264 -880 -144 ) ( 264 -880 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 264 -880 -144 ) ( 264 -840 -144 ) ( 264 -840 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 264 -848 -144 ) ( 232 -848 -144 ) ( 232 -848 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 232 -840 -144 ) ( 232 -880 -144 ) ( 232 -880 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2938 +{ +( -704 1040 124 ) ( -728 1040 124 ) ( -728 1016 124 ) subway/light_yellow 16 16 0 0.500000 0.500000 134217728 16777217 12000 +( -728 1016 128 ) ( -728 1040 128 ) ( -704 1040 128 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -728 1016 128 ) ( -704 1016 128 ) ( -704 1016 120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -712 1016 128 ) ( -712 1040 128 ) ( -712 1040 120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -704 1032 128 ) ( -728 1032 128 ) ( -728 1032 120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -728 1040 128 ) ( -728 1016 128 ) ( -728 1016 120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2939 +{ +( -576 1040 128 ) ( -576 1016 128 ) ( -576 1016 120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -552 1032 128 ) ( -576 1032 128 ) ( -576 1032 120 ) subway/1_black -304 0 0 0.500000 0.500000 134217728 16777216 0 +( -560 1016 128 ) ( -560 1040 128 ) ( -560 1040 120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -576 1016 128 ) ( -552 1016 128 ) ( -552 1016 120 ) subway/1_black -304 0 0 0.500000 0.500000 134217728 16777216 0 +( -576 1016 128 ) ( -576 1040 128 ) ( -552 1040 128 ) subway/1_black -304 0 0 0.500000 0.500000 134217728 16777216 0 +( -552 1040 124 ) ( -576 1040 124 ) ( -576 1016 124 ) subway/light_yellow -288 16 0 0.500000 0.500000 134217728 16777217 12000 +} +// brush 2940 +{ +( -552 1168 124 ) ( -576 1168 124 ) ( -576 1144 124 ) subway/light_yellow -288 16 0 0.500000 0.500000 134217728 16777217 12000 +( -576 1144 128 ) ( -576 1168 128 ) ( -552 1168 128 ) subway/1_black -304 0 0 0.500000 0.500000 134217728 16777216 0 +( -576 1144 128 ) ( -552 1144 128 ) ( -552 1144 120 ) subway/1_black -304 0 0 0.500000 0.500000 134217728 16777216 0 +( -560 1144 128 ) ( -560 1168 128 ) ( -560 1168 120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -552 1160 128 ) ( -576 1160 128 ) ( -576 1160 120 ) subway/1_black -304 0 0 0.500000 0.500000 134217728 16777216 0 +( -576 1168 128 ) ( -576 1144 128 ) ( -576 1144 120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2941 +{ +( -784 1304 48 ) ( -784 1304 64 ) ( -784 952 64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -768 1176 16 ) ( -768 1176 0 ) ( -760 1176 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -776 984 136 ) ( -776 984 0 ) ( -776 632 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -696 936 40 ) ( -632 936 40 ) ( -632 936 32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -776 1224 128 ) ( -776 1288 128 ) ( -712 1288 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -776 1288 48 ) ( -784 1296 48 ) ( -784 936 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2942 +{ +( -632 1176 136 ) ( -632 1176 128 ) ( -632 808 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1184 136 ) ( -784 1184 136 ) ( -784 1184 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -784 1168 128 ) ( -784 1168 136 ) ( -784 800 136 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -896 936 136 ) ( -896 936 144 ) ( -832 936 144 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -784 1184 136 ) ( -632 1184 136 ) ( -632 936 136 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1200 128 ) ( -776 1200 128 ) ( -776 832 128 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 2943 +{ +( -672 1088 32 ) ( -672 1088 56 ) ( -680 1080 56 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -640 1088 32 ) ( -640 1088 56 ) ( -672 1088 56 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -640 1088 56 ) ( -640 1088 32 ) ( -632 1080 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -680 1080 56 ) ( -632 1080 56 ) ( -632 1080 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -680 1080 48 ) ( -680 1088 48 ) ( -632 1088 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -632 1088 32 ) ( -680 1088 32 ) ( -680 1080 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2944 +{ +( -672 1088 8 ) ( -672 1088 32 ) ( -680 1080 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -640 1088 8 ) ( -640 1088 32 ) ( -672 1088 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -640 1088 32 ) ( -640 1088 8 ) ( -632 1080 8 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 1080 32 ) ( -632 1080 32 ) ( -632 1080 8 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 1080 32 ) ( -680 1088 32 ) ( -632 1088 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -632 1088 16 ) ( -680 1088 16 ) ( -680 1080 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2945 +{ +( -632 1088 48 ) ( -680 1088 48 ) ( -680 1080 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -680 1080 128 ) ( -680 1088 128 ) ( -632 1088 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -680 1080 72 ) ( -632 1080 72 ) ( -632 1080 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -640 1088 72 ) ( -640 1088 48 ) ( -632 1080 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -640 1088 48 ) ( -640 1088 72 ) ( -672 1088 72 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -672 1088 48 ) ( -672 1088 72 ) ( -680 1080 72 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2946 +{ +( -496 1176 136 ) ( -496 1176 128 ) ( -496 808 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1168 104 ) ( -632 1168 136 ) ( -640 1168 136 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1168 128 ) ( -632 1168 136 ) ( -632 800 136 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -760 936 136 ) ( -760 936 144 ) ( -696 936 144 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -640 1176 136 ) ( -496 1176 136 ) ( -496 808 136 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1176 128 ) ( -640 1176 128 ) ( -640 808 128 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 2947 +{ +( -496 1536 136 ) ( -496 1536 128 ) ( -496 1168 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1528 104 ) ( -632 1528 136 ) ( -640 1528 136 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -640 1536 128 ) ( -640 1536 136 ) ( -640 1168 136 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -760 1168 136 ) ( -760 1168 144 ) ( -696 1168 144 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -640 1536 136 ) ( -496 1536 136 ) ( -496 1168 136 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1536 128 ) ( -640 1536 128 ) ( -640 1168 128 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 2948 +{ +( -776 1296 32 ) ( -784 1304 32 ) ( -784 944 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -776 1224 48 ) ( -776 1288 48 ) ( -712 1288 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -696 936 24 ) ( -632 936 24 ) ( -632 936 16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -776 1080 120 ) ( -776 1080 -16 ) ( -776 728 -16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -784 1176 0 ) ( -784 1176 -16 ) ( -776 1176 -16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -784 1288 32 ) ( -784 1288 48 ) ( -784 936 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2949 +{ +( -784 1296 24 ) ( -784 1296 40 ) ( -784 944 40 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -784 1176 -8 ) ( -784 1176 -24 ) ( -776 1176 -24 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -776 1032 112 ) ( -776 1032 -24 ) ( -776 680 -24 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -696 936 16 ) ( -632 936 16 ) ( -632 936 8 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -776 1224 32 ) ( -776 1288 32 ) ( -712 1288 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -776 1288 16 ) ( -784 1296 16 ) ( -784 936 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2950 +{ +( -504 944 32 ) ( -504 944 48 ) ( -784 944 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -504 944 48 ) ( -504 944 32 ) ( -496 936 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -584 936 120 ) ( -584 936 -16 ) ( -936 936 -16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -784 856 24 ) ( -784 792 24 ) ( -784 792 16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -496 936 48 ) ( -432 936 48 ) ( -432 872 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -432 936 32 ) ( -424 944 32 ) ( -784 944 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2951 +{ +( -504 944 48 ) ( -504 944 136 ) ( -784 944 136 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -504 944 136 ) ( -504 944 48 ) ( -496 936 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -584 936 136 ) ( -584 936 0 ) ( -936 936 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -784 856 40 ) ( -784 792 40 ) ( -784 792 32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 936 136 ) ( -432 936 136 ) ( -432 872 136 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -432 936 48 ) ( -424 944 48 ) ( -784 944 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2952 +{ +( -672 1432 32 ) ( -680 1440 32 ) ( -680 1080 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -672 1368 48 ) ( -672 1432 48 ) ( -608 1432 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -672 1088 48 ) ( -672 1088 32 ) ( -680 1080 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -672 1088 32 ) ( -672 1088 48 ) ( -672 1352 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -680 1176 0 ) ( -680 1176 -16 ) ( -672 1176 -16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -680 1432 32 ) ( -680 1432 48 ) ( -680 1080 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2953 +{ +( -672 1336 48 ) ( -680 1344 48 ) ( -680 984 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -672 1272 152 ) ( -672 1336 152 ) ( -608 1336 152 ) subway/3_street -528 152 0 1 1 0 285212672 0 +( -672 1088 152 ) ( -672 1088 48 ) ( -680 1080 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -672 1104 48 ) ( -672 1104 152 ) ( -672 1176 152 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -680 1176 16 ) ( -680 1176 0 ) ( -672 1176 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -680 1336 48 ) ( -680 1336 64 ) ( -680 984 64 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2954 +{ +( -632 992 -136 ) ( -632 928 -136 ) ( -632 928 -144 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -480 1168 -136 ) ( -544 1168 -136 ) ( -544 1168 -144 ) subway/1_stair_side1 944 0 0 0.500000 0.500000 0 285212672 0 +( -504 1264 -136 ) ( -504 1328 -136 ) ( -504 1328 -144 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -480 936 -144 ) ( -416 936 -144 ) ( -416 936 -152 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( -560 1144 16 ) ( -560 1208 16 ) ( -496 1208 16 ) subway/1_concrete_floor 944 2528 0 0.500000 0.500000 0 285212672 0 +( -496 1208 8 ) ( -560 1208 8 ) ( -560 1144 8 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2955 +{ +( -680 1432 16 ) ( -680 1432 32 ) ( -680 1080 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -680 1176 -16 ) ( -680 1176 -32 ) ( -672 1176 -32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -672 1088 8 ) ( -672 1088 32 ) ( -672 1352 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -672 1088 32 ) ( -672 1088 8 ) ( -680 1080 8 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -672 1368 32 ) ( -672 1432 32 ) ( -608 1432 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -672 1432 16 ) ( -680 1440 16 ) ( -680 1080 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2956 +{ +( -640 1088 128 ) ( -640 1088 48 ) ( -640 1520 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -640 1520 16 ) ( -640 1520 0 ) ( -632 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1432 136 ) ( -632 1432 0 ) ( -632 1080 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -640 1088 48 ) ( -640 1088 128 ) ( -632 1080 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1456 128 ) ( -632 1520 128 ) ( -568 1520 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1520 48 ) ( -640 1528 48 ) ( -640 1168 48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 2957 +{ +( -1392 1656 -104 ) ( -1392 1592 -104 ) ( -1392 1592 -112 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1008 1752 -64 ) ( -1072 1752 -64 ) ( -1072 1752 -72 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1384 1800 -72 ) ( -1384 1864 -72 ) ( -1384 1864 -80 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1032 1576 -72 ) ( -968 1576 -72 ) ( -968 1576 -80 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1104 1640 -120 ) ( -1104 1704 -120 ) ( -1040 1704 -120 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -1040 1704 -336 ) ( -1104 1704 -336 ) ( -1104 1640 -336 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 2958 +{ +( -416 1600 -160 ) ( -416 1584 -160 ) ( -416 1584 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -404 1584 -160 ) ( -420 1584 -160 ) ( -420 1584 -288 ) subway/light_yellow 0 0 0 0.500000 0.500000 134217728 16777217 21000 +( -400 1584 -160 ) ( -400 1600 -160 ) ( -400 1600 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -420 1568 -160 ) ( -404 1568 -160 ) ( -404 1568 -288 ) subway/1_black -4 0 0 0.500000 0.500000 134217728 16777216 0 +( -420 1584 -272 ) ( -420 1600 -272 ) ( -404 1600 -272 ) subway/1_black -4 0 0 0.500000 0.500000 134217728 16777216 0 +( -404 1600 -288 ) ( -420 1600 -288 ) ( -420 1584 -288 ) subway/1_black -4 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2959 +{ +( -530 1600 -288 ) ( -546 1600 -288 ) ( -546 1584 -288 ) subway/1_black -12 0 0 0.500000 0.500000 134217728 16777216 0 +( -546 1584 -272 ) ( -546 1600 -272 ) ( -530 1600 -272 ) subway/1_black -12 0 0 0.500000 0.500000 134217728 16777216 0 +( -546 1568 -160 ) ( -530 1568 -160 ) ( -530 1568 -288 ) subway/1_black -12 0 0 0.500000 0.500000 134217728 16777216 0 +( -530 1568 -160 ) ( -530 1584 -160 ) ( -530 1584 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -530 1584 -160 ) ( -546 1584 -160 ) ( -546 1584 -288 ) subway/light_yellow 36 0 0 0.500000 0.500000 134217728 16777217 21000 +( -546 1600 -160 ) ( -546 1584 -160 ) ( -546 1584 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2960 +{ +( 432 1760 -288 ) ( 456 1760 -288 ) ( 456 1880 -288 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 440 1888 -272 ) ( 440 1768 -272 ) ( 416 1768 -272 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 40 1584 -280 ) ( 40 1584 -272 ) ( 16 1584 -272 ) subway/1_tunnelwall_floor 0 0 0 1 0.500000 0 285212672 0 +( -1000 1568 -208 ) ( -1000 1568 -200 ) ( -976 1568 -200 ) subway/con6 0 32 0 0.500000 0.500000 0 285212672 0 +( -64 1600 -248 ) ( -64 1600 -264 ) ( -64 1544 -248 ) subway/1_tunneltrack_1 13 -31 195 1 1 0 16777216 0 +( -400 1600 -160 ) ( -400 1584 -160 ) ( -400 1600 -288 ) subway/1_tunneltrack_1 13 -31 195 1 1 0 16777216 0 +} +// brush 2961 +{ +( 432 1760 -288 ) ( 456 1760 -288 ) ( 456 1880 -288 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 440 1888 -272 ) ( 440 1768 -272 ) ( 416 1768 -272 ) subway/con6 0 16 0 0.500000 0.500000 0 285212672 0 +( 40 1584 -280 ) ( 40 1584 -272 ) ( 16 1584 -272 ) subway/1_tunnelwall_floor 0 0 0 1 0.500000 0 285212672 0 +( -1000 1568 -208 ) ( -1000 1568 -200 ) ( -976 1568 -200 ) subway/con6 0 32 0 0.500000 0.500000 0 285212672 0 +( -530 1584 -160 ) ( -530 1568 -160 ) ( -530 1584 -288 ) subway/1_tunneltrack_1 13 -31 195 1 1 0 16777216 0 +( -416 1584 -160 ) ( -416 1600 -160 ) ( -416 1584 -288 ) subway/1_tunneltrack_1 13 -31 195 1 1 0 16777216 0 +} +// brush 2962 +{ +( 612 1118 -72 ) ( 580 1118 -72 ) ( 580 1128 -64 ) subway/1_black -2408 -1248 0 0.500000 0.500000 134217728 16777216 0 +( 552 1128 -64 ) ( 552 1128 -72 ) ( 568 1128 -72 ) subway/1_black -2408 -64 0 0.500000 0.500000 134217728 16777216 0 +( 580 1118 -72 ) ( 612 1118 -72 ) ( 612 1128 -72 ) subway/light_small -1188 -597 0 1 1 134217728 1 3000 +( 612 1128 -80 ) ( 612 1112 -80 ) ( 612 1112 -64 ) subway/1_black 1248 -64 0 0.500000 0.500000 134217728 16777216 0 +( 580 1112 -64 ) ( 580 1112 -80 ) ( 580 1128 -80 ) subway/1_black 1248 -64 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2963 +{ +( -248 1688 -104 ) ( -248 1624 -104 ) ( -248 1624 -112 ) subway/1_concrete_floor -2560 -32 0 0.500000 0.500000 0 285212672 0 +( -8 1752 -96 ) ( -72 1752 -96 ) ( -72 1752 -104 ) subway/1_concrete_floor 944 -32 0 0.500000 0.500000 0 285212672 0 +( -64 1784 -104 ) ( -64 1848 -104 ) ( -64 1848 -112 ) subway/1_concrete_floor -2560 -32 0 0.500000 0.500000 0 285212672 0 +( -32 1576 -104 ) ( 32 1576 -104 ) ( 32 1576 -112 ) subway/1_stair_side1 944 0 0 0.500000 0.500000 0 285212672 0 +( -104 1624 -112 ) ( -104 1688 -112 ) ( -40 1688 -112 ) subway/1_concrete_floor 944 2544 0 0.500000 0.500000 0 285212672 0 +( -40 1688 -120 ) ( -104 1688 -120 ) ( -104 1624 -120 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 2964 +{ +( -184 1688 -120 ) ( -248 1688 -120 ) ( -248 1624 -120 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -248 1624 -112 ) ( -248 1688 -112 ) ( -184 1688 -112 ) subway/1_concrete_floor 944 2544 0 0.500000 0.500000 0 285212672 0 +( -184 1624 -104 ) ( -120 1624 -104 ) ( -120 1624 -112 ) subway/1_stair_side1 944 0 0 0.500000 0.500000 0 285212672 0 +( -248 1784 -104 ) ( -248 1848 -104 ) ( -248 1848 -112 ) subway/1_concrete_floor -2560 -32 0 0.500000 0.500000 0 285212672 0 +( -168 1688 -96 ) ( -232 1688 -96 ) ( -232 1688 -104 ) subway/1_concrete_floor 944 -32 0 0.500000 0.500000 0 285212672 0 +( -376 1688 -104 ) ( -376 1624 -104 ) ( -376 1624 -112 ) subway/1_concrete_floor -2560 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 2965 +{ +( -576 1680 0 ) ( -576 1640 0 ) ( -576 1640 -8 ) subway/1_black -112 0 0 0.500000 0.500000 134217728 16777216 0 +( -520 1664 0 ) ( -592 1664 0 ) ( -592 1664 -8 ) subway/1_black -32 0 0 0.500000 0.500000 134217728 16777216 0 +( -532 1640 0 ) ( -532 1680 0 ) ( -532 1680 -8 ) subway/1_black -128 0 0 0.500000 0.500000 134217728 16777216 0 +( -576 1648 0 ) ( -504 1648 0 ) ( -504 1648 -8 ) subway/1_black -32 0 0 0.500000 0.500000 134217728 16777216 0 +( -592 1640 0 ) ( -592 1680 0 ) ( -520 1680 0 ) subway/1_black -32 112 0 0.500000 0.500000 134217728 16777216 0 +( -520 1680 -4 ) ( -592 1680 -4 ) ( -592 1640 -4 ) subway/light_tube 0 96 0 0.500000 0.500000 134217728 1 9000 +} +// brush 2966 +{ +( -384 1680 4 ) ( -384 1640 4 ) ( -384 1640 -4 ) subway/1_black -112 0 0 0.500000 0.500000 134217728 16777216 0 +( -328 1664 0 ) ( -400 1664 0 ) ( -400 1664 -8 ) subway/1_black -416 0 0 0.500000 0.500000 134217728 16777216 0 +( -340 1640 0 ) ( -340 1680 0 ) ( -340 1680 -8 ) subway/1_black -112 0 0 0.500000 0.500000 134217728 16777216 0 +( -400 1648 0 ) ( -328 1648 0 ) ( -328 1648 -8 ) subway/1_black -416 0 0 0.500000 0.500000 134217728 16777216 0 +( -400 1640 0 ) ( -400 1680 0 ) ( -328 1680 0 ) subway/1_black -416 112 0 0.500000 0.500000 134217728 16777216 0 +( -328 1680 -4 ) ( -400 1680 -4 ) ( -400 1640 -4 ) subway/light_tube 0 96 0 0.500000 0.500000 134217728 1 9000 +} +// brush 2967 +{ +( -696 1688 -104 ) ( -696 1624 -104 ) ( -696 1624 -112 ) subway/1_concrete_floor -2560 -32 0 0.500000 0.500000 0 285212672 0 +( -488 1688 -96 ) ( -552 1688 -96 ) ( -552 1688 -104 ) subway/1_concrete_floor 944 -32 0 0.500000 0.500000 0 285212672 0 +( -568 1784 -104 ) ( -568 1848 -104 ) ( -568 1848 -112 ) subway/1_concrete_floor -2560 -32 0 0.500000 0.500000 0 285212672 0 +( -504 1624 -104 ) ( -440 1624 -104 ) ( -440 1624 -112 ) subway/1_stair_side1 944 0 0 0.500000 0.500000 0 285212672 0 +( -568 1624 -112 ) ( -568 1688 -112 ) ( -504 1688 -112 ) subway/1_concrete_floor 944 2544 0 0.500000 0.500000 0 285212672 0 +( -504 1688 -120 ) ( -568 1688 -120 ) ( -568 1624 -120 ) subway/no_draw 0 0 0 1 1 0 128 0 +} +// brush 2968 +{ +( -440 1704 -104 ) ( -440 1640 -104 ) ( -440 1640 -112 ) subway/grating2 -16 48 0 0.500000 0.500000 0 16779264 0 +( -240 1688 -96 ) ( -304 1688 -96 ) ( -304 1688 -104 ) subway/grating2 -16 48 0 0.500000 0.500000 0 16779264 0 +( -376 1776 -104 ) ( -376 1840 -104 ) ( -376 1840 -112 ) subway/grating2 -16 48 0 0.500000 0.500000 0 16779264 0 +( -248 1624 -104 ) ( -184 1624 -104 ) ( -184 1624 -112 ) subway/grating2 -16 48 0 0.500000 0.500000 0 16779264 0 +( -312 1640 -112 ) ( -312 1704 -112 ) ( -248 1704 -112 ) subway/grating2 -16 48 0 0.500000 0.500000 0 16779264 0 +( -248 1704 -120 ) ( -312 1704 -120 ) ( -312 1640 -120 ) subway/grating2 -16 48 0 0.500000 0.500000 0 16779264 0 +} +// brush 2969 +{ +( -376 1672 -120 ) ( -440 1672 -120 ) ( -440 1608 -120 ) subway/grating2 48 48 0 0.500000 0.500000 0 16779264 0 +( -440 1608 -112 ) ( -440 1672 -112 ) ( -376 1672 -112 ) subway/grating2 48 48 0 0.500000 0.500000 0 16779264 0 +( -376 1624 -104 ) ( -312 1624 -104 ) ( -312 1624 -112 ) subway/grating2 48 48 0 0.500000 0.500000 0 16779264 0 +( -504 1744 -104 ) ( -504 1808 -104 ) ( -504 1808 -112 ) subway/grating2 48 48 0 0.500000 0.500000 0 16779264 0 +( -372 1688 -96 ) ( -436 1688 -96 ) ( -436 1688 -104 ) subway/grating2 48 48 0 0.500000 0.500000 0 16779264 0 +( -568 1672 -104 ) ( -568 1608 -104 ) ( -568 1608 -112 ) subway/grating2 48 48 0 0.500000 0.500000 0 16779264 0 +} +// brush 2970 +{ +( -376 1688 -120 ) ( -440 1688 -120 ) ( -440 1624 -120 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -440 1624 -112 ) ( -440 1688 -112 ) ( -376 1688 -112 ) subway/1_concrete_floor 944 2544 0 0.500000 0.500000 0 285212672 0 +( -376 1624 -104 ) ( -312 1624 -104 ) ( -312 1624 -112 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( -440 1784 -104 ) ( -440 1848 -104 ) ( -440 1848 -112 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( -360 1688 -96 ) ( -424 1688 -96 ) ( -424 1688 -104 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( -504 1688 -104 ) ( -504 1624 -104 ) ( -504 1624 -112 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 2971 +{ +( -504 1592 -120 ) ( -568 1592 -120 ) ( -568 1528 -120 ) subway/no_draw 0 0 0 1 1 0 128 0 +( -568 1528 -112 ) ( -568 1592 -112 ) ( -504 1592 -112 ) subway/1_concrete_floor 944 2544 0 0.500000 0.500000 0 285212672 0 +( -504 1528 -104 ) ( -440 1528 -104 ) ( -440 1528 -112 ) subway/1_stair_side1 944 0 0 0.500000 0.500000 0 285212672 0 +( -248 1680 -104 ) ( -248 1744 -104 ) ( -248 1744 -112 ) subway/1_concrete_floor -2560 -32 0 0.500000 0.500000 0 285212672 0 +( -496 1624 -96 ) ( -560 1624 -96 ) ( -560 1624 -104 ) subway/1_concrete_floor 944 -32 0 0.500000 0.500000 0 285212672 0 +( -696 1592 -104 ) ( -696 1528 -104 ) ( -696 1528 -112 ) subway/1_concrete_floor -2560 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 2972 +{ +( 832 -912 -254 ) ( 832 -912 -264 ) ( 784 -912 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 -560 -440 ) ( 840 -560 -432 ) ( 840 -536 -432 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 624 -472 -472 ) ( 624 -472 -464 ) ( 504 -472 -464 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 -304 -512 ) ( 824 -304 -504 ) ( 824 -328 -504 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( 560 -984 -560 ) ( 560 -984 -552 ) ( 680 -984 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 520 72 -496 ) ( 640 72 -496 ) ( 640 48 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 648 64 -520 ) ( 648 88 -520 ) ( 528 88 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 2973 +{ +( 648 64 -536 ) ( 648 88 -536 ) ( 528 88 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 520 72 -520 ) ( 640 72 -520 ) ( 640 48 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 824 -232 -528 ) ( 824 -232 -520 ) ( 824 -256 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 840 -1056 -456 ) ( 840 -1056 -448 ) ( 840 -1032 -448 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 848 -912 -254 ) ( 848 -912 -264 ) ( 792 -912 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 816 -472 -496 ) ( 816 -472 -512 ) ( 872 -472 -496 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 2974 +{ +( 832 -944 -416 ) ( 832 -944 -408 ) ( 832 -920 -408 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 624 -760 -448 ) ( 624 -760 -440 ) ( 504 -760 -440 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 824 -584 -504 ) ( 824 -584 -496 ) ( 824 -608 -496 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 560 -1728 -536 ) ( 560 -1728 -528 ) ( 680 -1728 -528 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 520 -672 -480 ) ( 640 -672 -480 ) ( 640 -696 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 648 -680 -496 ) ( 648 -656 -496 ) ( 528 -656 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 856 -912 -254 ) ( 856 -912 -264 ) ( 776 -912 -264 ) subway/1_tunneltrack_1 22 -13 195 1 1 0 16777216 0 +} +// brush 2975 +{ +( 832 -640 -344 ) ( 824 -640 -344 ) ( 832 -640 -456 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 816 -160 -384 ) ( 816 -112 -384 ) ( 824 -112 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 640 464 -448 ) ( 640 488 -448 ) ( 520 488 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 824 -56 -440 ) ( 824 -56 -432 ) ( 824 -80 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 840 296 -352 ) ( 840 296 -344 ) ( 840 320 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 840 -912 -254 ) ( 840 -912 -264 ) ( 784 -912 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 2976 +{ +( 824 -912 -254 ) ( 824 -912 -264 ) ( 792 -912 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 -288 -400 ) ( 840 -288 -392 ) ( 840 -264 -392 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 624 -472 -432 ) ( 624 -472 -424 ) ( 504 -472 -424 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 824 -200 -488 ) ( 824 -200 -480 ) ( 824 -224 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 560 -984 -520 ) ( 560 -984 -512 ) ( 680 -984 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 520 72 -448 ) ( 640 72 -448 ) ( 640 48 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 648 64 -480 ) ( 648 88 -480 ) ( 528 88 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 2977 +{ +( 816 -112 -384 ) ( 816 -160 -384 ) ( 824 -112 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 512 464 -336 ) ( 632 464 -336 ) ( 632 440 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 824 232 -440 ) ( 824 232 -432 ) ( 824 208 -432 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 620 -472 -384 ) ( 620 -472 -376 ) ( 500 -472 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 840 -376 -352 ) ( 840 -376 -344 ) ( 840 -352 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 840 -912 -254 ) ( 840 -912 -264 ) ( 784 -912 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 2978 +{ +( 792 -1616 -520 ) ( 792 -1640 -520 ) ( 792 -1640 -528 ) subway/1_tunneltrack_plain 1744 0 0 0.500000 0.500000 0 301989888 0 +( 1040 -760 -480 ) ( 920 -760 -480 ) ( 920 -760 -488 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 824 -1656 -520 ) ( 824 -1632 -520 ) ( 824 -1632 -528 ) subway/1_tunneltrack_plain 1744 0 0 0.500000 0.500000 0 301989888 0 +( 816 -1264 -568 ) ( 936 -1264 -568 ) ( 936 -1264 -576 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 872 -1616 -536 ) ( 872 -1592 -536 ) ( 992 -1592 -536 ) subway/1_tunnelfloor_2 807 8 90 1 1 0 285212672 0 +( 968 -1616 -552 ) ( 848 -1616 -552 ) ( 848 -1640 -552 ) subway/1_tunneltrack_plain -32 -1744 0 0.500000 0.500000 0 301989888 0 +} +// brush 2979 +{ +( 720 -432 -512 ) ( 720 -456 -512 ) ( 720 -456 -520 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +( 976 -760 -480 ) ( 856 -760 -480 ) ( 856 -760 -488 ) subway/1_tunneltrack_1 148 0 0 1 1 0 16777216 0 +( 792 -472 -520 ) ( 792 -448 -520 ) ( 792 -448 -528 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +( 780 -1152 -568 ) ( 900 -1152 -568 ) ( 900 -1152 -576 ) subway/1_tunneltrack_1 148 0 0 1 1 0 16777216 0 +( 836 -568 -536 ) ( 836 -544 -536 ) ( 956 -544 -536 ) subway/1_tunneltrack_1 108 208 0 1 1 0 16777216 0 +( 956 -528 -544 ) ( 836 -528 -544 ) ( 836 -552 -544 ) subway/1_tunneltrack_1 148 208 0 1 1 0 16777216 0 +} +// brush 2980 +{ +( 980 -856 -536 ) ( 980 -848 -536 ) ( 932 -848 -536 ) subway/metal2 24 0 0 0.500000 0.500000 0 16777216 0 +( 876 -992 -528 ) ( 876 -728 -528 ) ( 908 -728 -528 ) subway/metal2 24 0 0 0.500000 0.500000 0 16777216 0 +( 788 -768 -516 ) ( 788 -1032 -516 ) ( 788 -1032 -548 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 972 -760 -536 ) ( 972 -760 -504 ) ( 924 -760 -504 ) subway/metal2 24 0 0 0.500000 0.500000 0 16777216 0 +( 796 -856 -728 ) ( 796 -856 -768 ) ( 796 -864 -768 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 972 -1208 -504 ) ( 972 -1208 -536 ) ( 924 -1208 -536 ) subway/metal2 24 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2981 +{ +( 912 -1208 -504 ) ( 912 -1208 -536 ) ( 864 -1208 -536 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 720 -1160 -728 ) ( 720 -1160 -768 ) ( 720 -1168 -768 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 912 -760 -536 ) ( 912 -760 -504 ) ( 864 -760 -504 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 712 -856 -516 ) ( 712 -1120 -516 ) ( 712 -1120 -548 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 800 -992 -528 ) ( 800 -728 -528 ) ( 832 -728 -528 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 904 -856 -536 ) ( 904 -848 -536 ) ( 856 -848 -536 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2982 +{ +( 880 -736 -552 ) ( 760 -736 -552 ) ( 760 -760 -552 ) subway/1_tunneltrack_plain 240 0 0 0.500000 0.500000 0 301989888 0 +( 760 -768 -536 ) ( 760 -744 -536 ) ( 880 -744 -536 ) subway/1_tunnelfloor_2 -8 -16 90 -1 -1 0 285212672 0 +( 696 -1264 -568 ) ( 816 -1264 -568 ) ( 816 -1264 -576 ) subway/1_tunneltrack_plain 240 0 0 0.500000 0.500000 0 301989888 0 +( 720 -480 -520 ) ( 720 -456 -520 ) ( 720 -456 -528 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 896 -760 -480 ) ( 776 -760 -480 ) ( 776 -760 -488 ) subway/1_tunneltrack_plain 240 0 0 0.500000 0.500000 0 301989888 0 +( 688 -736 -520 ) ( 688 -760 -520 ) ( 688 -760 -528 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 2983 +{ +( 1048 1956 -344 ) ( 1048 1932 -344 ) ( 1048 1932 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1388 1464 -376 ) ( 1268 1464 -376 ) ( 1268 1464 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1112 -432 ) ( 1064 1136 -432 ) ( 1064 1136 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1064 868 -352 ) ( 1072 868 -352 ) ( 1072 820 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1312 -448 ) ( 1056 1312 -336 ) ( 1064 1312 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1504 -420 ) ( 1064 1464 -420 ) ( 1076 1504 -420 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 2984 +{ +( 1064 1568 -380 ) ( 1064 1528 -380 ) ( 1076 1568 -380 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1056 1464 -448 ) ( 1048 1464 -336 ) ( 1056 1464 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 932 -352 ) ( 1072 932 -352 ) ( 1072 884 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1180 -432 ) ( 1064 1204 -432 ) ( 1064 1204 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1388 1600 -376 ) ( 1268 1600 -376 ) ( 1268 1600 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1048 2020 -344 ) ( 1048 1996 -344 ) ( 1048 1996 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 2985 +{ +( 1200 1476 -420 ) ( 1184 1476 -420 ) ( 1184 1452 -420 ) subway/1_black -16 832 0 0.500000 0.500000 134217728 16777216 0 +( 1184 1452 -404 ) ( 1184 1476 -404 ) ( 1200 1476 -404 ) subway/1_black -16 832 0 0.500000 0.500000 134217728 16777216 0 +( 1184 1452 -372 ) ( 1200 1452 -372 ) ( 1200 1452 -420 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1200 1452 -372 ) ( 1200 1476 -372 ) ( 1200 1476 -420 ) subway/1_black -832 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1200 1468 -372 ) ( 1184 1468 -372 ) ( 1184 1468 -420 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1196 1476 -372 ) ( 1196 1452 -372 ) ( 1196 1452 -420 ) subway/light_red -920 -8 0 0.500000 0.500000 134217728 16777217 10000 +} +// brush 2986 +{ +( 1148 1492 -276 ) ( 1108 1492 -276 ) ( 1108 1492 -372 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1112 1472 -276 ) ( 1112 1484 -276 ) ( 1112 1484 -372 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1104 1488 -276 ) ( 1144 1488 -276 ) ( 1144 1488 -372 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1108 1488 -276 ) ( 1108 1476 -276 ) ( 1108 1476 -372 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1108 1488 -344 ) ( 1148 1488 -344 ) ( 1148 1476 -344 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1148 1476 -372 ) ( 1148 1488 -372 ) ( 1108 1488 -372 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2987 +{ +( 1144 1493 -248 ) ( 1084 1493 -248 ) ( 1084 1493 -392 ) subway/1_danger -348 53 0 -0.750000 0.750000 134217728 16777216 0 +( 1180 1469 -248 ) ( 1180 1487 -248 ) ( 1180 1487 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1078 1487 -248 ) ( 1138 1487 -248 ) ( 1138 1487 -392 ) subway/1_danger -294 53 0 0.750000 0.750000 134217728 16777216 0 +( 1084 1487 -248 ) ( 1084 1469 -248 ) ( 1084 1469 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1084 1487 -368 ) ( 1144 1487 -368 ) ( 1144 1469 -368 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1144 1469 -392 ) ( 1144 1487 -392 ) ( 1084 1487 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2988 +{ +( 764 152 -348 ) ( 748 152 -348 ) ( 748 140 -348 ) subway/light_red 8 16 0 0.500000 0.500000 0 16777217 15000 +( 748 140 -344 ) ( 748 152 -344 ) ( 764 152 -344 ) subway/1_black 0 -8 0 0.500000 0.500000 0 16777216 0 +( 748 136 -340 ) ( 764 136 -340 ) ( 764 136 -348 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 764 140 -340 ) ( 764 152 -340 ) ( 764 152 -348 ) subway/1_black 8 0 0 0.500000 0.500000 0 16777216 0 +( 764 152 -340 ) ( 748 152 -340 ) ( 748 152 -348 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 748 152 -340 ) ( 748 140 -340 ) ( 748 140 -348 ) subway/1_black 8 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2989 +{ +( 672 -512 -152 ) ( 608 -512 -152 ) ( 608 -576 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 608 -576 -120 ) ( 608 -512 -120 ) ( 672 -512 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -392 -152 ) ( 576 -392 -152 ) ( 576 -392 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -920 -120 ) ( 584 -920 -152 ) ( 584 -1064 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 -320 -120 ) ( 576 -320 -152 ) ( 584 -320 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 -344 -152 ) ( 576 -344 -120 ) ( 576 -728 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 2990 +{ +( 576 -344 -120 ) ( 576 -344 -80 ) ( 576 -728 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 624 -320 -80 ) ( 624 -320 -120 ) ( 632 -320 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 584 -1088 -80 ) ( 584 -1088 -120 ) ( 584 -1232 -120 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( 584 -600 -120 ) ( 576 -600 -120 ) ( 576 -600 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 608 -576 -80 ) ( 608 -512 -80 ) ( 672 -512 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 672 -512 -120 ) ( 608 -512 -120 ) ( 608 -576 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +} +// brush 2991 +{ +( 632 -304 10 ) ( 632 -304 0 ) ( 672 -344 0 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 584 -88 -88 ) ( 584 -24 -88 ) ( 584 -24 -72 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 584 -288 -120 ) ( 680 -240 -120 ) ( 680 -240 -88 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 680 -232 -120 ) ( 680 -256 -120 ) ( 680 -256 -72 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 584 -344 -88 ) ( 680 -296 -88 ) ( 680 -280 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 584 -288 -80 ) ( 680 -240 -80 ) ( 680 -296 -80 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 584 -328 -120 ) ( 680 -280 -120 ) ( 680 -240 -120 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +} +// brush 2992 +{ +( 592 -348 -136 ) ( 584 -348 -136 ) ( 584 -372 -136 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 584 -372 -104 ) ( 584 -348 -104 ) ( 592 -348 -104 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 584 -372 -96 ) ( 592 -372 -96 ) ( 592 -372 -128 ) subway/1_sign6 0 112 0 0.500000 0.500000 0 0 0 +( 586 -372 -96 ) ( 586 -348 -96 ) ( 586 -348 -128 ) subway/1_sign6 -24 112 0 0.500000 0.500000 0 0 0 +( 592 -340 -96 ) ( 584 -340 -96 ) ( 584 -340 -128 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 584 -348 -96 ) ( 584 -372 -96 ) ( 584 -372 -128 ) subway/1_sign6 -24 112 0 0.500000 0.500000 0 0 0 +} +// brush 2993 +{ +( 416 -256 -160 ) ( 352 -256 -160 ) ( 352 -256 -144 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 648 -88 -144 ) ( 648 -96 -144 ) ( 648 -96 -160 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 624 -160 -192 ) ( 648 -160 -192 ) ( 648 -160 -144 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 656 -232 -144 ) ( 656 -168 -144 ) ( 656 -168 -192 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 752 -104 -180 ) ( 688 -104 -180 ) ( 688 -40 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 688 -40 -184 ) ( 688 -104 -184 ) ( 752 -104 -184 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2994 +{ +( -192 1200 -48 ) ( -192 1192 -48 ) ( -192 1192 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -176 1196 -48 ) ( -192 1196 -48 ) ( -192 1196 -64 ) subway/light_yellow 0 0 0 0.500000 0.500000 134217728 1 12000 +( -176 1192 -48 ) ( -176 1200 -48 ) ( -176 1200 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -192 1192 -48 ) ( -176 1192 -48 ) ( -176 1192 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -192 1192 -48 ) ( -192 1200 -48 ) ( -176 1200 -48 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -176 1200 -64 ) ( -192 1200 -64 ) ( -192 1192 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2995 +{ +( -384 1200 -48 ) ( -384 1192 -48 ) ( -384 1192 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -368 1196 -48 ) ( -384 1196 -48 ) ( -384 1196 -64 ) subway/light_yellow 0 0 0 0.500000 0.500000 134217728 1 12000 +( -368 1192 -48 ) ( -368 1200 -48 ) ( -368 1200 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -384 1192 -48 ) ( -368 1192 -48 ) ( -368 1192 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -384 1192 -48 ) ( -384 1200 -48 ) ( -368 1200 -48 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -368 1200 -64 ) ( -384 1200 -64 ) ( -384 1192 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2996 +{ +( -1168 1816 -112 ) ( -1168 1752 -112 ) ( -1104 1752 -112 ) subway/1_tile_bottom 0 192 0 0.500000 0.500000 0 318767104 0 +( -1104 1752 -96 ) ( -1168 1752 -96 ) ( -1168 1816 -96 ) subway/1_tile_bottom 0 192 0 0.500000 0.500000 0 318767104 0 +( -664 1732 -128 ) ( -664 1732 -80 ) ( -664 1740 -80 ) subway/1_tile_bottom -192 0 0 0.500000 0.500000 0 318767104 0 +( -1128 1752 -64 ) ( -1128 1752 -128 ) ( -960 1752 -128 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -696 1760 -80 ) ( -696 1760 -128 ) ( -696 1768 -128 ) subway/1_tile_bottom -192 0 0 0.500000 0.500000 0 318767104 0 +( -664 1736 -80 ) ( -664 1736 -128 ) ( -704 1736 -128 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2997 +{ +( -664 1736 -64 ) ( -664 1736 -112 ) ( -704 1736 -112 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +( -696 1760 -64 ) ( -696 1760 -112 ) ( -696 1768 -112 ) subway/1_tile -3200 -32 0 0.500000 0.500000 0 318767104 0 +( -1128 1752 -48 ) ( -1128 1752 -112 ) ( -960 1752 -112 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +( -664 1732 -112 ) ( -664 1732 -64 ) ( -664 1740 -64 ) subway/1_tile -3200 -32 0 0.500000 0.500000 0 318767104 0 +( -1104 1752 -64 ) ( -1168 1752 -64 ) ( -1168 1816 -64 ) subway/1_tile 1408 3344 0 0.500000 0.500000 0 318767104 0 +( -1168 1816 -96 ) ( -1168 1752 -96 ) ( -1104 1752 -96 ) subway/1_tile 1408 3344 0 0.500000 0.500000 0 318767104 0 +} +// brush 2998 +{ +( -1168 1816 -64 ) ( -1168 1752 -64 ) ( -1104 1752 -64 ) subway/1_tile_middle 288 464 0 0.500000 0.500000 0 318767104 0 +( -1104 1752 -48 ) ( -1168 1752 -48 ) ( -1168 1816 -48 ) subway/1_tile_middle 288 464 0 0.500000 0.500000 0 318767104 0 +( -664 1732 -64 ) ( -664 1732 -48 ) ( -664 1740 -48 ) subway/1_tile_middle -464 0 0 0.500000 0.500000 0 318767104 0 +( -1128 1752 -48 ) ( -1128 1752 -64 ) ( -960 1752 -64 ) subway/1_tile_middle 128 0 0 0.500000 0.500000 0 318767104 0 +( -696 1760 -48 ) ( -696 1760 -64 ) ( -696 1768 -64 ) subway/1_tile_middle -464 0 0 0.500000 0.500000 0 318767104 0 +( -704 1736 -64 ) ( -704 1736 -48 ) ( -664 1736 -48 ) subway/1_tile_middle 128 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2999 +{ +( -1168 1816 -48 ) ( -1168 1752 -48 ) ( -1104 1752 -48 ) subway/1_tile -2464 384 0 0.500000 0.500000 0 318767104 0 +( -664 1752 0 ) ( -672 1744 0 ) ( -696 1744 0 ) subway/1_tile -2464 384 0 0.500000 0.500000 0 318767104 0 +( -664 1732 -48 ) ( -664 1732 -32 ) ( -664 1740 -32 ) subway/1_tile -2656 192 0 0.500000 0.500000 0 318767104 0 +( -1128 1752 -32 ) ( -1128 1752 -48 ) ( -960 1752 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -696 1760 -32 ) ( -696 1760 -48 ) ( -696 1768 -48 ) subway/1_tile -2656 192 0 0.500000 0.500000 0 318767104 0 +( -704 1736 -48 ) ( -704 1736 -32 ) ( -664 1736 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 3000 +{ +( -288 1728 -48 ) ( -288 1728 -32 ) ( -248 1728 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -280 1744 -32 ) ( -280 1744 -48 ) ( -280 1752 -48 ) subway/1_tile -2656 192 0 0.500000 0.500000 0 318767104 0 +( -712 1752 -32 ) ( -712 1752 -48 ) ( -544 1752 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -248 1744 -48 ) ( -248 1744 -32 ) ( -248 1752 -32 ) subway/1_tile -2656 192 0 0.500000 0.500000 0 318767104 0 +( -248 1752 0 ) ( -256 1744 0 ) ( -280 1744 0 ) subway/1_tile -2464 384 0 0.500000 0.500000 0 318767104 0 +( -752 1816 -48 ) ( -752 1752 -48 ) ( -688 1752 -48 ) subway/1_tile -2464 384 0 0.500000 0.500000 0 318767104 0 +} +// brush 3001 +{ +( -288 1728 -64 ) ( -288 1728 -48 ) ( -248 1728 -48 ) subway/1_tile_middle 128 0 0 0.500000 0.500000 0 318767104 0 +( -280 1744 -48 ) ( -280 1744 -64 ) ( -280 1752 -64 ) subway/1_tile_middle -464 0 0 0.500000 0.500000 0 318767104 0 +( -712 1752 -48 ) ( -712 1752 -64 ) ( -544 1752 -64 ) subway/1_tile_middle 128 0 0 0.500000 0.500000 0 318767104 0 +( -248 1744 -64 ) ( -248 1744 -48 ) ( -248 1752 -48 ) subway/1_tile_middle -464 0 0 0.500000 0.500000 0 318767104 0 +( -688 1752 -48 ) ( -752 1752 -48 ) ( -752 1816 -48 ) subway/1_tile_middle 288 464 0 0.500000 0.500000 0 318767104 0 +( -752 1816 -64 ) ( -752 1752 -64 ) ( -688 1752 -64 ) subway/1_tile_middle 288 464 0 0.500000 0.500000 0 318767104 0 +} +// brush 3002 +{ +( -752 1816 -96 ) ( -752 1752 -96 ) ( -688 1752 -96 ) subway/1_tile 1408 3344 0 0.500000 0.500000 0 318767104 0 +( -688 1752 -64 ) ( -752 1752 -64 ) ( -752 1816 -64 ) subway/1_tile 1408 3344 0 0.500000 0.500000 0 318767104 0 +( -248 1744 -112 ) ( -248 1744 -64 ) ( -248 1752 -64 ) subway/1_tile -3200 -32 0 0.500000 0.500000 0 318767104 0 +( -712 1752 -48 ) ( -712 1752 -112 ) ( -544 1752 -112 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +( -280 1744 -48 ) ( -280 1744 -96 ) ( -280 1752 -96 ) subway/1_tile -3200 -32 0 0.500000 0.500000 0 318767104 0 +( -248 1728 -64 ) ( -248 1728 -112 ) ( -288 1728 -112 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3003 +{ +( -248 1728 -80 ) ( -248 1728 -128 ) ( -288 1728 -128 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -280 1744 -64 ) ( -280 1744 -112 ) ( -280 1752 -112 ) subway/1_tile_bottom -192 0 0 0.500000 0.500000 0 318767104 0 +( -712 1752 -64 ) ( -712 1752 -128 ) ( -544 1752 -128 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -248 1744 -128 ) ( -248 1744 -80 ) ( -248 1752 -80 ) subway/1_tile_bottom -192 0 0 0.500000 0.500000 0 318767104 0 +( -688 1752 -96 ) ( -752 1752 -96 ) ( -752 1816 -96 ) subway/1_tile_bottom 0 192 0 0.500000 0.500000 0 318767104 0 +( -752 1816 -112 ) ( -752 1752 -112 ) ( -688 1752 -112 ) subway/1_tile_bottom 0 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 3004 +{ +( -200 1456 -112 ) ( -200 1520 -112 ) ( -264 1520 -112 ) subway/1_tile 736 2880 0 0.500000 0.500000 0 318767104 0 +( -264 1520 -64 ) ( -200 1520 -64 ) ( -200 1456 -64 ) subway/1_tile 736 2880 0 0.500000 0.500000 0 318767104 0 +( -304 1520 -24 ) ( -304 1520 -128 ) ( -312 1528 -128 ) subway/1_tile -2736 -32 0 0.500000 0.500000 0 318767104 0 +( -240 1520 -48 ) ( -240 1520 -112 ) ( -304 1520 -112 ) subway/1_tile 592 -32 0 0.500000 0.500000 0 318767104 0 +( -240 1520 -112 ) ( -240 1520 -48 ) ( -248 1528 -48 ) subway/1_tile -2736 -32 0 0.500000 0.500000 0 318767104 0 +( 48 1528 -120 ) ( -16 1528 -120 ) ( -16 1528 -128 ) subway/1_tile 592 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3005 +{ +( -248 1528 -64 ) ( -248 1528 -112 ) ( -288 1528 -112 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +( -280 1536 -48 ) ( -280 1536 -96 ) ( -280 1544 -96 ) subway/1_tile -3008 -32 0 0.500000 0.500000 0 318767104 0 +( -712 1544 -48 ) ( -712 1544 -112 ) ( -544 1544 -112 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +( -248 1536 -112 ) ( -248 1536 -64 ) ( -248 1544 -64 ) subway/1_tile -3008 -32 0 0.500000 0.500000 0 318767104 0 +( -688 1544 -64 ) ( -752 1544 -64 ) ( -752 1608 -64 ) subway/1_tile 1408 3152 0 0.500000 0.500000 0 318767104 0 +( -752 1608 -96 ) ( -752 1544 -96 ) ( -688 1544 -96 ) subway/1_tile 1408 3152 0 0.500000 0.500000 0 318767104 0 +} +// brush 3006 +{ +( -1168 1608 -96 ) ( -1168 1544 -96 ) ( -1104 1544 -96 ) subway/1_tile 1408 3152 0 0.500000 0.500000 0 318767104 0 +( -1104 1544 -64 ) ( -1168 1544 -64 ) ( -1168 1608 -64 ) subway/1_tile 1408 3152 0 0.500000 0.500000 0 318767104 0 +( -664 1536 -112 ) ( -664 1536 -64 ) ( -664 1544 -64 ) subway/1_tile -3008 -32 0 0.500000 0.500000 0 318767104 0 +( -1128 1544 -48 ) ( -1128 1544 -112 ) ( -960 1544 -112 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +( -696 1552 -64 ) ( -696 1552 -112 ) ( -696 1560 -112 ) subway/1_tile -3008 -32 0 0.500000 0.500000 0 318767104 0 +( -664 1528 -64 ) ( -664 1528 -112 ) ( -704 1528 -112 ) subway/1_tile 1104 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3007 +{ +( -640 1456 -96 ) ( -640 1520 -96 ) ( -704 1520 -96 ) subway/1_tile -2208 0 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -64 ) ( -640 1520 -64 ) ( -640 1456 -64 ) subway/1_tile -2208 0 0 0.500000 0.500000 0 318767104 0 +( -784 1168 -96 ) ( -784 1168 -88 ) ( -720 1168 -88 ) subway/1_tile -2208 0 0 0.500000 0.500000 0 318767104 0 +( -640 1168 -128 ) ( -640 1520 -128 ) ( -640 1520 8 ) subway/1_tile -2464 0 0 0.500000 0.500000 0 318767104 0 +( -632 1528 -8 ) ( -640 1520 -8 ) ( -640 1520 -144 ) subway/1_tile -2464 0 0 0.500000 0.500000 0 318767104 0 +( -632 1504 -112 ) ( -632 1504 -104 ) ( -632 1568 -104 ) subway/1_tile -2464 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3008 +{ +( -584 1456 -96 ) ( -584 1520 -96 ) ( -648 1520 -96 ) subway/1_tile 1360 -32 0 0.500000 0.500000 0 318767104 0 +( -648 1520 -64 ) ( -584 1520 -64 ) ( -584 1456 -64 ) subway/1_tile 1360 -32 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -48 ) ( -704 1520 -112 ) ( -696 1528 -112 ) subway/1_tile 1360 -32 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -112 ) ( -704 1520 -48 ) ( -640 1520 -48 ) subway/1_tile 1360 -32 0 0.500000 0.500000 0 318767104 0 +( -640 1520 -128 ) ( -640 1520 -24 ) ( -632 1528 -24 ) subway/1_tile 1360 -32 0 0.500000 0.500000 0 318767104 0 +( -488 1528 -120 ) ( -552 1528 -120 ) ( -552 1528 -128 ) subway/1_tile 1360 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3009 +{ +( 2120 -64 -552 ) ( 2000 -64 -552 ) ( 2000 -88 -552 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 2024 -64 -536 ) ( 2024 -40 -536 ) ( 2144 -40 -536 ) subway/1_tunnelfloor_2 -16 8 90 1 1 0 285212672 0 +( 1976 -344 -536 ) ( 1976 -344 -552 ) ( 1944 -344 -552 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1976 -40 -552 ) ( 1976 -40 -536 ) ( 1976 424 -536 ) subway/1_tunneltrack_plain -16 -48 0 0.500000 0.500000 0 301989888 0 +( 2184 424 -480 ) ( 2064 424 -480 ) ( 2064 424 -488 ) subway/1_tunneltrack_plain 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1952 -80 -520 ) ( 1952 -104 -520 ) ( 1952 -104 -528 ) subway/1_tunneltrack_plain -16 -48 0 0.500000 0.500000 0 301989888 0 +} +// brush 3010 +{ +( 1984 424 -480 ) ( 1976 424 -480 ) ( 1976 424 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1984 -160 -496 ) ( 1984 -160 -480 ) ( 1984 176 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1984 -344 -504 ) ( 1976 -344 -504 ) ( 1976 -344 -488 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1976 256 -480 ) ( 1976 -32 -480 ) ( 1976 -32 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1976 76 -480 ) ( 2000 76 -480 ) ( 2000 -100 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 2000 -100 -488 ) ( 2000 76 -488 ) ( 1976 76 -488 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 3011 +{ +( 1820 596 -472 ) ( 1820 572 -472 ) ( 1820 572 -488 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 1844 596 -472 ) ( 1820 596 -472 ) ( 1820 596 -488 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 1844 572 -472 ) ( 1844 596 -472 ) ( 1844 596 -488 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 1820 572 -472 ) ( 1844 572 -472 ) ( 1844 572 -488 ) subway/clip 0 16 0 0.500000 0.500000 196608 128 0 +( 1820 572 -472 ) ( 1820 596 -472 ) ( 1844 596 -472 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1844 596 -536 ) ( 1820 596 -536 ) ( 1820 572 -536 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 3012 +{ +( 900 428 -536 ) ( 876 428 -536 ) ( 876 404 -536 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 876 404 -472 ) ( 876 428 -472 ) ( 900 428 -472 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 876 404 -472 ) ( 900 404 -472 ) ( 900 404 -488 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 900 404 -472 ) ( 900 428 -472 ) ( 900 428 -488 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 900 428 -472 ) ( 876 428 -472 ) ( 876 428 -488 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 876 428 -472 ) ( 876 404 -472 ) ( 876 404 -488 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 3013 +{ +( 1696 768 -408 ) ( 1696 784 -408 ) ( 1688 784 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 784 -392 ) ( 1696 784 -392 ) ( 1696 768 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 768 -408 ) ( 1688 768 -392 ) ( 1696 768 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 784 -408 ) ( 1688 784 -392 ) ( 1688 768 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 784 -408 ) ( 1696 784 -392 ) ( 1688 784 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1690 768 -408 ) ( 1690 768 -392 ) ( 1690 784 -392 ) subway/light_red 0 -16 0 0.500000 0.500000 134217792 16777217 19000 +} +// brush 3014 +{ +( 1690 800 -408 ) ( 1690 800 -392 ) ( 1690 816 -392 ) subway/light_red 0 -16 0 0.500000 0.500000 134217792 16777217 19000 +( 1696 816 -408 ) ( 1696 816 -392 ) ( 1688 816 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 816 -408 ) ( 1688 816 -392 ) ( 1688 800 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 800 -408 ) ( 1688 800 -392 ) ( 1696 800 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 816 -392 ) ( 1696 816 -392 ) ( 1696 800 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 800 -408 ) ( 1696 816 -408 ) ( 1688 816 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +} +// brush 3015 +{ +( 1696 416 -408 ) ( 1696 432 -408 ) ( 1688 432 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 432 -392 ) ( 1696 432 -392 ) ( 1696 416 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 416 -408 ) ( 1688 416 -392 ) ( 1696 416 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 432 -408 ) ( 1688 432 -392 ) ( 1688 416 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 432 -408 ) ( 1696 432 -392 ) ( 1688 432 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1690 416 -408 ) ( 1690 416 -392 ) ( 1690 432 -392 ) subway/light_red 0 -16 0 0.500000 0.500000 134217792 16777217 19000 +} +// brush 3016 +{ +( 1690 384 -408 ) ( 1690 384 -392 ) ( 1690 400 -392 ) subway/light_red 0 -16 0 0.500000 0.500000 134217792 16777217 19000 +( 1696 400 -408 ) ( 1696 400 -392 ) ( 1688 400 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 400 -408 ) ( 1688 400 -392 ) ( 1688 384 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 384 -408 ) ( 1688 384 -392 ) ( 1696 384 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 400 -392 ) ( 1696 400 -392 ) ( 1696 384 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 384 -408 ) ( 1696 400 -408 ) ( 1688 400 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +} +// brush 3017 +{ +( 1696 1000 -408 ) ( 1696 1016 -408 ) ( 1688 1016 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1016 -392 ) ( 1696 1016 -392 ) ( 1696 1000 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1000 -408 ) ( 1688 1000 -392 ) ( 1696 1000 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1016 -408 ) ( 1688 1016 -392 ) ( 1688 1000 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 1016 -408 ) ( 1696 1016 -392 ) ( 1688 1016 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1690 1000 -408 ) ( 1690 1000 -392 ) ( 1690 1016 -392 ) subway/light_red 16 -16 0 0.500000 0.500000 134217792 16777217 19000 +} +// brush 3018 +{ +( 1690 1032 -408 ) ( 1690 1032 -392 ) ( 1690 1048 -392 ) subway/light_red 16 -16 0 0.500000 0.500000 134217792 16777217 19000 +( 1696 1048 -408 ) ( 1696 1048 -392 ) ( 1688 1048 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1048 -408 ) ( 1688 1048 -392 ) ( 1688 1032 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1032 -408 ) ( 1688 1032 -392 ) ( 1696 1032 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1048 -392 ) ( 1696 1048 -392 ) ( 1696 1032 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 1032 -408 ) ( 1696 1048 -408 ) ( 1688 1048 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +} +// brush 3019 +{ +( 1984 -308 -520 ) ( 1864 -308 -520 ) ( 1864 -332 -520 ) subway/1_tunnelwall 32 48 0 0.500000 0.500000 0 301989888 0 +( 1872 -324 -488 ) ( 1872 -300 -488 ) ( 1992 -300 -488 ) subway/1_tunnelwall 32 48 0 0.500000 0.500000 0 301989888 0 +( 1840 -344 -552 ) ( 1960 -344 -552 ) ( 1960 -344 -560 ) subway/1_tunnelwall 32 -48 0 0.500000 0.500000 0 301989888 0 +( 1688 -368 -504 ) ( 1688 -344 -504 ) ( 1688 -344 -512 ) subway/1_tunnelwall -56 -8 0 1 1 0 301989888 0 +( 2008 424 -464 ) ( 1888 424 -464 ) ( 1888 424 -472 ) subway/1_tunnelwall 32 -48 0 0.500000 0.500000 0 301989888 0 +( 1672 -468 -432 ) ( 1672 -492 -432 ) ( 1672 -492 -440 ) subway/1_tunnelwall -48 -48 0 0.500000 0.500000 0 301989888 0 +( 1728 -348 -264 ) ( 1680 -348 -264 ) ( 1680 -348 -254 ) subway/1_tunneltrack_1 -29 -54 195 1 1 0 16777216 0 +} +// brush 3020 +{ +( 1692 1120 -520 ) ( 1668 1120 -520 ) ( 1692 1120 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1984 644 -536 ) ( 1864 644 -536 ) ( 1864 620 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1872 604 -520 ) ( 1872 628 -520 ) ( 1992 628 -520 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1688 536 -520 ) ( 1688 560 -520 ) ( 1688 560 -528 ) subway/1_tunnelwall_floor -8 16 0 1 0.500000 0 285212672 0 +( 1672 564 -448 ) ( 1672 540 -448 ) ( 1672 540 -456 ) subway/con6 -16 48 0 0.500000 0.500000 0 285212672 0 +( 1720 888 -264 ) ( 1664 888 -264 ) ( 1664 888 -254 ) subway/1_tunneltrack_1 -28 -55 195 1 1 0 16777216 0 +} +// brush 3021 +{ +( 1984 620 -520 ) ( 1864 620 -520 ) ( 1864 596 -520 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1872 604 -488 ) ( 1872 628 -488 ) ( 1992 628 -488 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1832 684 -552 ) ( 1952 684 -552 ) ( 1952 684 -560 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1688 560 -504 ) ( 1688 584 -504 ) ( 1688 584 -512 ) subway/1_tunnelwall -8 -8 0 1 1 0 301989888 0 +( 2008 1352 -464 ) ( 1888 1352 -464 ) ( 1888 1352 -472 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1672 492 -432 ) ( 1672 468 -432 ) ( 1672 468 -440 ) subway/1_tunnelwall -16 16 0 0.500000 0.500000 0 301989888 0 +( 1728 888 -264 ) ( 1680 888 -264 ) ( 1680 888 -254 ) subway/1_tunneltrack_1 -28 -55 195 1 1 0 16777216 0 +} +// brush 3022 +{ +( 1688 1352 -496 ) ( 1688 1352 -480 ) ( 1680 1352 -480 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1680 1376 -480 ) ( 1680 1040 -480 ) ( 1680 1040 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1688 888 -480 ) ( 1688 888 -496 ) ( 1680 888 -496 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1688 896 -496 ) ( 1688 896 -480 ) ( 1688 1184 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1664 828 -480 ) ( 1664 1004 -480 ) ( 1688 1004 -480 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +( 1688 1004 -488 ) ( 1664 1004 -488 ) ( 1664 828 -488 ) subway/1_trim1 16 0 0 0.500000 0.500000 0 0 0 +} +// brush 3023 +{ +( 1984 644 -480 ) ( 1864 644 -480 ) ( 1864 620 -480 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1872 564 -448 ) ( 1872 588 -448 ) ( 1992 588 -448 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1824 228 -512 ) ( 1944 228 -512 ) ( 1944 228 -520 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1688 568 -480 ) ( 1688 592 -480 ) ( 1688 592 -488 ) subway/1_tunnelwall_pipe -16 8 0 0.500000 0.500000 0 16777216 0 +( 2008 1352 -424 ) ( 1888 1352 -424 ) ( 1888 1352 -432 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1672 1140 -392 ) ( 1672 1116 -392 ) ( 1672 1116 -400 ) subway/1_tunnelwall_pipe -16 32 0 0.500000 0.500000 0 16777216 0 +( 1688 888 -264 ) ( 1656 888 -264 ) ( 1656 888 -254 ) subway/1_tunneltrack_1 -28 -55 195 1 1 0 16777216 0 +} +// brush 3024 +{ +( 1688 888 -448 ) ( 1680 888 -336 ) ( 1688 888 -336 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1688 444 -288 ) ( 1696 444 -288 ) ( 1696 396 -288 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1992 1004 -448 ) ( 1872 1004 -448 ) ( 1872 980 -448 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1688 936 -432 ) ( 1688 960 -432 ) ( 1688 960 -440 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 2012 1352 -376 ) ( 1892 1352 -376 ) ( 1892 1352 -384 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1672 1508 -344 ) ( 1672 1484 -344 ) ( 1672 1484 -352 ) subway/1_tunnelwall -16 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 3025 +{ +( 1784 856 -536 ) ( 1784 856 -552 ) ( 1784 1320 -552 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 1960 1320 -480 ) ( 1840 1320 -480 ) ( 1840 1320 -488 ) subway/1_tunneltrack_plain 16 16 0 0.500000 0.500000 0 301989888 0 +( 1816 648 -552 ) ( 1816 648 -536 ) ( 1816 1320 -536 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 1816 648 -536 ) ( 1816 648 -552 ) ( 1784 616 -552 ) subway/1_tunneltrack_plain -16 16 0 0.500000 0.500000 0 301989888 0 +( 1808 456 -536 ) ( 1808 480 -536 ) ( 1928 480 -536 ) subway/1_tunnelfloor_2 -16 8 90 1 1 0 285212672 0 +( 1904 456 -552 ) ( 1784 456 -552 ) ( 1784 432 -552 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3026 +{ +( 1960 456 -552 ) ( 1840 456 -552 ) ( 1840 432 -552 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1864 456 -536 ) ( 1864 480 -536 ) ( 1984 480 -536 ) subway/1_tunnelfloor_2 8 -8 90 -1 -1 0 285212672 0 +( 1880 616 -536 ) ( 1880 616 -552 ) ( 1848 648 -552 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 1880 616 -552 ) ( 1880 616 -536 ) ( 1880 1352 -536 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 2016 1352 -480 ) ( 1896 1352 -480 ) ( 1896 1352 -488 ) subway/1_tunneltrack_plain 32 16 0 0.500000 0.500000 0 301989888 0 +( 1848 648 -536 ) ( 1848 648 -552 ) ( 1848 1352 -552 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3027 +{ +( 2064 504 -504 ) ( 2064 504 -536 ) ( 2016 504 -536 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1880 752 -728 ) ( 1880 752 -768 ) ( 1880 744 -768 ) subway/metal2 -48 16 0 0.500000 0.500000 0 16777216 0 +( 2064 1352 -536 ) ( 2064 1352 -504 ) ( 2016 1352 -504 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1872 920 -516 ) ( 1872 656 -516 ) ( 1872 656 -548 ) subway/metal2 -48 16 0 0.500000 0.500000 0 16777216 0 +( 1960 784 -528 ) ( 1960 1048 -528 ) ( 1992 1048 -528 ) subway/metal2 32 48 0 0.500000 0.500000 0 16777216 0 +( 2064 920 -536 ) ( 2064 928 -536 ) ( 2016 928 -536 ) subway/metal2 32 48 0 0.500000 0.500000 0 16777216 0 +( 1904 888 -264 ) ( 1840 888 -264 ) ( 1840 888 -254 ) subway/1_tunneltrack_1 -7 -43 195 1 1 0 16777216 0 +} +// brush 3028 +{ +( 1880 1760 -512 ) ( 1880 1736 -512 ) ( 1880 1736 -520 ) subway/1_tunneltrack_1 -60 8 0 1 1 0 16777216 0 +( 2136 1352 -480 ) ( 2016 1352 -480 ) ( 2016 1352 -488 ) subway/1_tunneltrack_1 60 8 0 1 1 0 16777216 0 +( 1944 1720 -520 ) ( 1944 1744 -520 ) ( 1944 1744 -528 ) subway/1_tunneltrack_1 -60 8 0 1 1 0 16777216 0 +( 1932 888 -568 ) ( 2052 888 -568 ) ( 2052 888 -576 ) subway/1_tunneltrack_1 60 8 0 1 1 0 16777216 0 +( 1996 1336 -536 ) ( 1996 1360 -536 ) ( 2116 1360 -536 ) subway/1_tunneltrack_1 20 16 0 1 1 0 16777216 0 +( 2116 1376 -544 ) ( 1996 1376 -544 ) ( 1996 1352 -544 ) subway/1_tunneltrack_1 60 16 0 1 1 0 16777216 0 +} +// brush 3029 +{ +( 2136 920 -536 ) ( 2136 928 -536 ) ( 2088 928 -536 ) subway/metal2 40 48 0 0.500000 0.500000 0 16777216 0 +( 2032 784 -528 ) ( 2032 1048 -528 ) ( 2064 1048 -528 ) subway/metal2 40 48 0 0.500000 0.500000 0 16777216 0 +( 1944 1112 -516 ) ( 1944 848 -516 ) ( 1944 848 -548 ) subway/metal2 -48 16 0 0.500000 0.500000 0 16777216 0 +( 2136 1352 -536 ) ( 2136 1352 -504 ) ( 2088 1352 -504 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 1952 1072 -728 ) ( 1952 1072 -768 ) ( 1952 1064 -768 ) subway/metal2 -48 16 0 0.500000 0.500000 0 16777216 0 +( 2136 504 -504 ) ( 2136 504 -536 ) ( 2088 504 -536 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 1960 888 -264 ) ( 1920 888 -264 ) ( 1920 888 -254 ) subway/1_tunneltrack_1 -10 -44 195 1 1 0 16777216 0 +} +// brush 3030 +{ +( 1952 1152 -520 ) ( 1952 1128 -520 ) ( 1952 1128 -528 ) subway/1_tunneltrack_plain -48 16 0 0.500000 0.500000 0 301989888 0 +( 2184 1352 -480 ) ( 2064 1352 -480 ) ( 2064 1352 -488 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 1976 824 -520 ) ( 1976 848 -520 ) ( 1976 848 -528 ) subway/1_tunneltrack_plain -48 16 0 0.500000 0.500000 0 301989888 0 +( 1968 888 -568 ) ( 2088 888 -568 ) ( 2088 888 -576 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 2024 864 -536 ) ( 2024 888 -536 ) ( 2144 888 -536 ) subway/1_tunnelfloor_2 0 8 90 1 1 0 285212672 0 +( 2120 864 -552 ) ( 2000 864 -552 ) ( 2000 840 -552 ) subway/1_tunneltrack_plain 0 48 0 0.500000 0.500000 0 301989888 0 +} +// brush 3031 +{ +( 1720 2128 -512 ) ( 1720 2104 -512 ) ( 1720 2104 -520 ) subway/1_tunneltrack_1 -36 8 0 1 1 0 16777216 0 +( 1976 1352 -480 ) ( 1856 1352 -480 ) ( 1856 1352 -488 ) subway/1_tunneltrack_1 28 8 0 1 1 0 16777216 0 +( 1792 2088 -520 ) ( 1792 2112 -520 ) ( 1792 2112 -528 ) subway/1_tunneltrack_1 -36 8 0 1 1 0 16777216 0 +( 1772 888 -568 ) ( 1892 888 -568 ) ( 1892 888 -576 ) subway/1_tunneltrack_1 28 8 0 1 1 0 16777216 0 +( 1836 928 -536 ) ( 1836 952 -536 ) ( 1956 952 -536 ) subway/1_tunneltrack_1 52 56 0 1 1 0 16777216 0 +( 1956 968 -544 ) ( 1836 968 -544 ) ( 1836 944 -544 ) subway/1_tunneltrack_1 28 56 0 1 1 0 16777216 0 +} +// brush 3032 +{ +( 1744 888 -264 ) ( 1680 888 -264 ) ( 1680 888 -254 ) subway/1_tunneltrack_1 -33 -20 195 1 1 0 16777216 0 +( 1904 512 -536 ) ( 1904 520 -536 ) ( 1856 520 -536 ) subway/metal2 32 0 0 0.500000 0.500000 0 16777216 0 +( 1800 376 -528 ) ( 1800 640 -528 ) ( 1832 640 -528 ) subway/metal2 32 0 0 0.500000 0.500000 0 16777216 0 +( 1712 512 -516 ) ( 1712 248 -516 ) ( 1712 248 -548 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 1904 1352 -536 ) ( 1904 1352 -504 ) ( 1856 1352 -504 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1720 1160 -728 ) ( 1720 1160 -768 ) ( 1720 1152 -768 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 1904 96 -504 ) ( 1904 96 -536 ) ( 1856 96 -536 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 3033 +{ +( 1680 1080 -520 ) ( 1680 1056 -520 ) ( 1680 1056 -528 ) subway/1_tunneltrack_plain -16 16 0 0.500000 0.500000 0 301989888 0 +( 1880 1352 -480 ) ( 1760 1352 -480 ) ( 1760 1352 -488 ) subway/1_tunneltrack_plain 16 16 0 0.500000 0.500000 0 301989888 0 +( 1712 2400 -520 ) ( 1712 2424 -520 ) ( 1712 2424 -528 ) subway/1_tunneltrack_plain -16 16 0 0.500000 0.500000 0 301989888 0 +( 1704 888 -568 ) ( 1824 888 -568 ) ( 1824 888 -576 ) subway/1_tunneltrack_plain 16 16 0 0.500000 0.500000 0 301989888 0 +( 1752 1048 -536 ) ( 1752 1072 -536 ) ( 1872 1072 -536 ) subway/1_tunnelfloor_2 8 -8 90 -1 -1 0 285212672 0 +( 1872 1080 -552 ) ( 1752 1080 -552 ) ( 1752 1056 -552 ) subway/1_tunneltrack_plain 16 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3034 +{ +( 1800 888 -264 ) ( 1760 888 -264 ) ( 1760 888 -254 ) subway/1_tunneltrack_1 -37 -21 195 1 1 0 16777216 0 +( 1976 96 -504 ) ( 1976 96 -536 ) ( 1928 96 -536 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 1792 664 -728 ) ( 1792 664 -768 ) ( 1792 656 -768 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 1976 1352 -536 ) ( 1976 1352 -504 ) ( 1928 1352 -504 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 1784 1520 -516 ) ( 1784 1256 -516 ) ( 1784 1256 -548 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 1872 376 -528 ) ( 1872 640 -528 ) ( 1904 640 -528 ) subway/metal2 40 0 0 0.500000 0.500000 0 16777216 0 +( 1976 512 -536 ) ( 1976 520 -536 ) ( 1928 520 -536 ) subway/metal2 40 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3035 +{ +( 1816 1208 -416 ) ( 1816 1208 -288 ) ( 1816 1176 -288 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1816 1160 -448 ) ( 1816 1160 -320 ) ( 1832 1160 -320 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1001 +( 1848 1184 -448 ) ( 1848 1184 -320 ) ( 1848 1216 -320 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1832 1352 -448 ) ( 1832 1352 -320 ) ( 1816 1352 -320 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1832 1176 -320 ) ( 1816 1176 -320 ) ( 1816 1208 -320 ) subway/1_tunnelwall 16 16 0 1 1 0 301989888 0 +( 1816 1208 -448 ) ( 1816 1176 -448 ) ( 1832 1176 -448 ) subway/1_tunnelwall 16 16 0 1 1 0 301989888 0 +} +// brush 3036 +{ +( 1816 1016 -288 ) ( 1816 984 -288 ) ( 1816 984 -416 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1832 1032 -320 ) ( 1816 1032 -320 ) ( 1816 1032 -448 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1001 +( 1848 984 -320 ) ( 1848 1016 -320 ) ( 1848 1016 -448 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1816 968 -320 ) ( 1832 968 -320 ) ( 1832 968 -448 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1002 +( 1816 984 -320 ) ( 1816 1016 -320 ) ( 1832 1016 -320 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1832 1016 -448 ) ( 1816 1016 -448 ) ( 1816 984 -448 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +} +// brush 3037 +{ +( 1640 1060 -480 ) ( 1640 1084 -480 ) ( 1520 1084 -480 ) subway/1_tunnelwall_pipe 32 16 0 0.500000 0.500000 0 16777216 0 +( 1512 1068 -448 ) ( 1632 1068 -448 ) ( 1632 1044 -448 ) subway/1_tunnelwall_pipe 32 16 0 0.500000 0.500000 0 16777216 0 +( 1560 668 -520 ) ( 1560 668 -512 ) ( 1680 668 -512 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1816 1032 -488 ) ( 1816 1032 -480 ) ( 1816 1008 -480 ) subway/1_tunnelwall_pipe 0 8 0 0.500000 0.500000 0 16777216 0 +( 1616 1760 -432 ) ( 1616 1760 -424 ) ( 1496 1760 -424 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1832 1524 -400 ) ( 1832 1524 -392 ) ( 1832 1548 -392 ) subway/1_tunnelwall_pipe 0 32 0 0.500000 0.500000 0 16777216 0 +( 1848 1352 -254 ) ( 1848 1352 -264 ) ( 1816 1352 -264 ) subway/1_tunneltrack_1 -28 -55 195 1 1 0 16777216 0 +} +// brush 3038 +{ +( 1992 1532 -352 ) ( 1992 1532 -344 ) ( 1992 1556 -344 ) subway/1_tunnelwall -16 32 0 0.500000 0.500000 0 301989888 0 +( 1772 1352 -384 ) ( 1772 1352 -376 ) ( 1652 1352 -376 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1976 936 -440 ) ( 1976 936 -432 ) ( 1976 912 -432 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1792 1036 -448 ) ( 1792 1060 -448 ) ( 1672 1060 -448 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1968 428 -288 ) ( 1968 476 -288 ) ( 1976 476 -288 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1976 920 -336 ) ( 1984 920 -336 ) ( 1976 920 -448 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 3039 +{ +( 1640 516 -488 ) ( 1640 540 -488 ) ( 1520 540 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1512 500 -480 ) ( 1632 500 -480 ) ( 1632 476 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1552 556 -544 ) ( 1552 556 -536 ) ( 1672 556 -536 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1816 440 -496 ) ( 1816 440 -488 ) ( 1816 416 -488 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1616 1352 -456 ) ( 1616 1352 -448 ) ( 1496 1352 -448 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1848 364 -424 ) ( 1848 364 -416 ) ( 1848 388 -416 ) subway/1_trim1 0 0 0 -0.500000 0.500000 0 0 0 +( 1832 648 -238 ) ( 1832 648 -248 ) ( 1784 648 -248 ) subway/1_trim1 0 0 0 -0.500000 0.500000 0 0 0 +} +// brush 3040 +{ +( 1640 492 -520 ) ( 1640 516 -520 ) ( 1520 516 -520 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1512 500 -488 ) ( 1632 500 -488 ) ( 1632 476 -488 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1552 556 -560 ) ( 1552 556 -552 ) ( 1672 556 -552 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1816 456 -512 ) ( 1816 456 -504 ) ( 1816 432 -504 ) subway/1_tunnelwall -8 -8 0 1 1 0 301989888 0 +( 1624 1352 -472 ) ( 1624 1352 -464 ) ( 1504 1352 -464 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1848 364 -440 ) ( 1848 364 -432 ) ( 1848 388 -432 ) subway/1_tunnelwall -8 -8 0 1 1 0 301989888 0 +( 1824 776 -254 ) ( 1824 776 -264 ) ( 1776 776 -264 ) subway/1_tunnelwall 16 -8 0 1 1 0 301989888 0 +} +// brush 3041 +{ +( 1640 1060 -520 ) ( 1640 1084 -520 ) ( 1520 1084 -520 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1512 1068 -488 ) ( 1632 1068 -488 ) ( 1632 1044 -488 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1552 1124 -560 ) ( 1552 1124 -552 ) ( 1672 1124 -552 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1816 1008 -512 ) ( 1816 1008 -504 ) ( 1816 984 -504 ) subway/1_tunnelwall 8 -80 0 0.500000 0.500000 0 301989888 0 +( 1616 1792 -472 ) ( 1616 1792 -464 ) ( 1496 1792 -464 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1832 932 -440 ) ( 1832 932 -432 ) ( 1832 956 -432 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1824 1352 -254 ) ( 1824 1352 -264 ) ( 1776 1352 -264 ) subway/1_tunnelwall 16 -8 0 1 1 0 301989888 0 +} +// brush 3042 +{ +( 1640 1060 -536 ) ( 1640 1084 -536 ) ( 1520 1084 -536 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1512 1068 -520 ) ( 1632 1068 -520 ) ( 1632 1044 -520 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1816 984 -528 ) ( 1816 984 -520 ) ( 1816 960 -520 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1840 1352 -254 ) ( 1840 1352 -264 ) ( 1784 1352 -264 ) subway/1_tunnelwall_floor 16 16 0 1 0.500000 0 285212672 0 +( 1832 1560 -520 ) ( 1832 1592 -520 ) ( 1832 1592 -536 ) subway/1_tunnelwall_floor 0 0 0 1 0.500000 0 285212672 0 +( 1828 1560 -520 ) ( 1804 1560 -520 ) ( 1828 1560 -536 ) subway/1_tunnelwall_floor 16 0 0 1 0.500000 0 285212672 0 +} +// brush 3043 +{ +( 1976 1040 -408 ) ( 1968 1040 -408 ) ( 1968 1024 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 1024 -392 ) ( 1968 1040 -392 ) ( 1976 1040 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 1024 -392 ) ( 1976 1024 -392 ) ( 1976 1024 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 1024 -392 ) ( 1976 1040 -392 ) ( 1976 1040 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 1040 -392 ) ( 1968 1040 -392 ) ( 1968 1040 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1974 1040 -392 ) ( 1974 1024 -392 ) ( 1974 1024 -408 ) subway/light_red 0 16 0 0.500000 0.500000 134217728 16777217 19000 +} +// brush 3044 +{ +( 1974 1008 -392 ) ( 1974 992 -392 ) ( 1974 992 -408 ) subway/light_red 0 16 0 0.500000 0.500000 134217728 16777217 19000 +( 1976 1008 -392 ) ( 1968 1008 -392 ) ( 1968 1008 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 992 -392 ) ( 1976 1008 -392 ) ( 1976 1008 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 992 -392 ) ( 1976 992 -392 ) ( 1976 992 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 992 -392 ) ( 1968 1008 -392 ) ( 1976 1008 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 1008 -408 ) ( 1968 1008 -408 ) ( 1968 992 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3045 +{ +( 1800 652 -536 ) ( 1800 676 -536 ) ( 1680 676 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1672 660 -520 ) ( 1792 660 -520 ) ( 1792 636 -520 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1976 536 -528 ) ( 1976 536 -520 ) ( 1976 512 -520 ) subway/1_tunnelwall_floor -40 16 0 1 0.500000 0 285212672 0 +( 2000 888 -254 ) ( 2000 888 -264 ) ( 1944 888 -264 ) subway/1_tunneltrack_1 -1 -14 195 1 1 0 16777216 0 +( 1992 1152 -520 ) ( 1992 1184 -520 ) ( 1992 1184 -536 ) subway/1_tunnelwall_floor -40 0 0 1 0.500000 0 285212672 0 +( 1988 1152 -520 ) ( 1964 1152 -520 ) ( 1988 1152 -536 ) subway/1_tunnelwall_floor 48 0 0 1 0.500000 0 285212672 0 +} +// brush 3046 +{ +( 1988 1168 -520 ) ( 1964 1168 -520 ) ( 1988 1168 -536 ) subway/1_tunnelwall_floor 48 0 0 1 0.500000 0 285212672 0 +( 1992 1168 -520 ) ( 1992 1200 -520 ) ( 1992 1200 -536 ) subway/1_tunnelwall_floor -32 0 0 1 0.500000 0 285212672 0 +( 2000 1152 -254 ) ( 2000 1152 -264 ) ( 1944 1152 -264 ) subway/1_tunneltrack_1 -1 -14 195 1 1 0 16777216 0 +( 1976 760 -528 ) ( 1976 760 -520 ) ( 1976 736 -520 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1672 844 -520 ) ( 1792 844 -520 ) ( 1792 820 -520 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1800 836 -536 ) ( 1800 860 -536 ) ( 1680 860 -536 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3047 +{ +( 2008 920 -254 ) ( 2008 920 -264 ) ( 1976 920 -264 ) subway/1_tunneltrack_1 -1 -14 195 1 1 0 16777216 0 +( 1992 1180 -400 ) ( 1992 1180 -392 ) ( 1992 1204 -392 ) subway/1_tunnelwall_pipe -16 32 0 0.500000 0.500000 0 16777216 0 +( 1776 1352 -432 ) ( 1776 1352 -424 ) ( 1656 1352 -424 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1976 592 -488 ) ( 1976 592 -480 ) ( 1976 568 -480 ) subway/1_tunnelwall_pipe -16 8 0 0.500000 0.500000 0 16777216 0 +( 1720 260 -520 ) ( 1720 260 -512 ) ( 1840 260 -512 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1672 644 -448 ) ( 1792 644 -448 ) ( 1792 620 -448 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1800 652 -480 ) ( 1800 676 -480 ) ( 1680 676 -480 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +} +// brush 3048 +{ +( 2000 860 -488 ) ( 2000 1036 -488 ) ( 1976 1036 -488 ) subway/2_warning 16 16 0 0.500000 0.500000 0 0 0 +( 1976 1036 -480 ) ( 2000 1036 -480 ) ( 2000 860 -480 ) subway/2_warning 16 16 0 0.500000 0.500000 0 0 0 +( 1976 1216 -472 ) ( 1976 928 -472 ) ( 1976 928 -488 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1984 888 -496 ) ( 1976 888 -496 ) ( 1976 888 -480 ) subway/2_warning 16 16 0 0.500000 0.500000 0 0 0 +( 1984 1024 -496 ) ( 1984 1024 -480 ) ( 1984 1360 -480 ) subway/2_warning -16 16 0 0.500000 0.500000 0 0 0 +( 1992 1352 -480 ) ( 1984 1352 -480 ) ( 1984 1352 -496 ) subway/2_warning 16 16 0 0.500000 0.500000 0 0 0 +} +// brush 3049 +{ +( 1984 888 -254 ) ( 1984 888 -264 ) ( 1936 888 -264 ) subway/1_tunneltrack_1 -1 -14 195 1 1 0 16777216 0 +( 1992 524 -440 ) ( 1992 524 -432 ) ( 1992 548 -432 ) subway/1_tunnelwall -16 16 0 0.500000 0.500000 0 301989888 0 +( 1776 1352 -472 ) ( 1776 1352 -464 ) ( 1656 1352 -464 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1976 528 -512 ) ( 1976 528 -504 ) ( 1976 504 -504 ) subway/1_tunnelwall -40 -8 0 1 1 0 301989888 0 +( 1712 716 -560 ) ( 1712 716 -552 ) ( 1832 716 -552 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1672 660 -488 ) ( 1792 660 -488 ) ( 1792 636 -488 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1800 652 -520 ) ( 1800 676 -520 ) ( 1680 676 -520 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3050 +{ +( 1800 852 -536 ) ( 1800 876 -536 ) ( 1680 876 -536 ) subway/con6 32 0 0 0.500000 0.500000 0 285212672 0 +( 1672 860 -520 ) ( 1792 860 -520 ) ( 1792 836 -520 ) subway/con6 32 0 0 0.500000 0.500000 0 285212672 0 +( 1976 776 -528 ) ( 1976 776 -520 ) ( 1976 752 -520 ) subway/1_tunnelwall_floor -48 16 0 1 0.500000 0 285212672 0 +( 2000 1168 -254 ) ( 2000 1168 -264 ) ( 1944 1168 -264 ) subway/1_tunneltrack_1 -1 -14 195 1 1 0 16777216 0 +( 1992 1352 -520 ) ( 1992 1384 -520 ) ( 1992 1384 -536 ) subway/1_tunnelwall_floor -48 0 0 1 0.500000 0 285212672 0 +( 1988 1352 -520 ) ( 1964 1352 -520 ) ( 1988 1352 -536 ) subway/1_tunnelwall_floor 48 0 0 1 0.500000 0 285212672 0 +} +// brush 3051 +{ +( 1744 1352 -264 ) ( 1680 1352 -264 ) ( 1680 1352 -254 ) subway/1_tunneltrack_1 -33 -20 195 1 1 0 16777216 0 +( 1904 1152 -536 ) ( 1904 1160 -536 ) ( 1856 1160 -536 ) subway/metal2 32 0 0 0.500000 0.500000 0 16777216 0 +( 1800 1016 -528 ) ( 1800 1280 -528 ) ( 1832 1280 -528 ) subway/metal2 32 0 0 0.500000 0.500000 0 16777216 0 +( 1712 1152 -516 ) ( 1712 888 -516 ) ( 1712 888 -548 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 1904 1992 -536 ) ( 1904 1992 -504 ) ( 1856 1992 -504 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1720 1624 -728 ) ( 1720 1624 -768 ) ( 1720 1616 -768 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 1904 736 -504 ) ( 1904 736 -536 ) ( 1856 736 -536 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 3052 +{ +( 1680 1720 -520 ) ( 1680 1696 -520 ) ( 1680 1696 -528 ) subway/1_tunneltrack_plain -16 16 0 0.500000 0.500000 0 301989888 0 +( 1712 2016 -552 ) ( 1712 2016 -536 ) ( 1680 1992 -536 ) subway/1_tunneltrack_plain 16 16 0 0.500000 0.500000 0 301989888 0 +( 1712 2016 -536 ) ( 1712 2016 -552 ) ( 1712 1352 -552 ) subway/1_tunneltrack_plain -16 16 0 0.500000 0.500000 0 301989888 0 +( 1704 1352 -568 ) ( 1824 1352 -568 ) ( 1824 1352 -576 ) subway/1_tunneltrack_plain 16 16 0 0.500000 0.500000 0 301989888 0 +( 1752 1688 -536 ) ( 1752 1712 -536 ) ( 1872 1712 -536 ) subway/1_tunnelfloor_2 8 -8 90 -1 -1 0 285212672 0 +( 1872 1720 -552 ) ( 1752 1720 -552 ) ( 1752 1696 -552 ) subway/1_tunneltrack_plain 16 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3053 +{ +( 1960 1096 -552 ) ( 1840 1096 -552 ) ( 1840 1072 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1864 1096 -536 ) ( 1864 1120 -536 ) ( 1984 1120 -536 ) subway/1_tunnelfloor_2 -8 8 90 1 1 0 285212672 0 +( 1816 1320 -536 ) ( 1816 1320 -552 ) ( 1784 1320 -552 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 1816 1320 -552 ) ( 1816 1320 -536 ) ( 1816 1992 -536 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 2024 1992 -480 ) ( 1904 1992 -480 ) ( 1904 1992 -488 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +( 1784 1984 -520 ) ( 1784 1960 -520 ) ( 1784 1960 -528 ) subway/1_tunneltrack_plain 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3054 +{ +( 1800 1352 -264 ) ( 1760 1352 -264 ) ( 1760 1352 -254 ) subway/1_tunneltrack_1 -37 -21 195 1 1 0 16777216 0 +( 1976 736 -504 ) ( 1976 736 -536 ) ( 1928 736 -536 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 1792 1328 -728 ) ( 1792 1328 -768 ) ( 1792 1320 -768 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 1976 1992 -536 ) ( 1976 1992 -504 ) ( 1928 1992 -504 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 1784 1960 -516 ) ( 1784 1696 -516 ) ( 1784 1696 -548 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 1872 1016 -528 ) ( 1872 1280 -528 ) ( 1904 1280 -528 ) subway/metal2 40 0 0 0.500000 0.500000 0 16777216 0 +( 1976 1152 -536 ) ( 1976 1160 -536 ) ( 1928 1160 -536 ) subway/metal2 40 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3055 +{ +( 1956 1608 -544 ) ( 1836 1608 -544 ) ( 1836 1584 -544 ) subway/1_tunneltrack_1 28 56 0 1 1 0 16777216 0 +( 1836 1568 -536 ) ( 1836 1592 -536 ) ( 1956 1592 -536 ) subway/1_tunneltrack_1 52 56 0 1 1 0 16777216 0 +( 1772 1352 -568 ) ( 1892 1352 -568 ) ( 1892 1352 -576 ) subway/1_tunneltrack_1 28 8 0 1 1 0 16777216 0 +( 1792 2552 -520 ) ( 1792 2576 -520 ) ( 1792 2576 -528 ) subway/1_tunneltrack_1 -36 8 0 1 1 0 16777216 0 +( 1976 1992 -480 ) ( 1856 1992 -480 ) ( 1856 1992 -488 ) subway/1_tunneltrack_1 28 8 0 1 1 0 16777216 0 +( 1720 2592 -512 ) ( 1720 2568 -512 ) ( 1720 2568 -520 ) subway/1_tunneltrack_1 -36 8 0 1 1 0 16777216 0 +} +// brush 3056 +{ +( 2116 448 -552 ) ( 1996 448 -552 ) ( 1996 424 -552 ) subway/1_tunneltrack_1 -4 0 0 1 1 0 16777216 0 +( 1996 408 -536 ) ( 1996 432 -536 ) ( 2116 432 -536 ) subway/1_tunneltrack_1 20 0 0 1 1 0 16777216 0 +( 1932 -344 -568 ) ( 2052 -344 -568 ) ( 2052 -344 -576 ) subway/1_tunneltrack_1 -4 -56 0 1 1 0 16777216 0 +( 1944 488 -520 ) ( 1944 512 -520 ) ( 1944 512 -528 ) subway/1_tunneltrack_1 -44 -56 0 1 1 0 16777216 0 +( 2136 424 -480 ) ( 2016 424 -480 ) ( 2016 424 -488 ) subway/1_tunneltrack_1 -4 -56 0 1 1 0 16777216 0 +( 1880 528 -512 ) ( 1880 504 -512 ) ( 1880 504 -520 ) subway/1_tunneltrack_1 -44 -56 0 1 1 0 16777216 0 +} +// brush 3057 +{ +( 1960 -344 -264 ) ( 1920 -344 -264 ) ( 1920 -344 -254 ) subway/1_tunneltrack_1 -11 -44 195 1 1 0 16777216 0 +( 2136 -424 -504 ) ( 2136 -424 -536 ) ( 2088 -424 -536 ) subway/metal2 40 -48 0 0.500000 0.500000 0 16777216 0 +( 1952 144 -728 ) ( 1952 144 -768 ) ( 1952 136 -768 ) subway/metal2 -16 -48 0 0.500000 0.500000 0 16777216 0 +( 2136 424 -536 ) ( 2136 424 -504 ) ( 2088 424 -504 ) subway/metal2 40 -48 0 0.500000 0.500000 0 16777216 0 +( 1944 -120 -516 ) ( 1944 -384 -516 ) ( 1944 -384 -548 ) subway/metal2 -16 -48 0 0.500000 0.500000 0 16777216 0 +( 2032 -144 -528 ) ( 2032 120 -528 ) ( 2064 120 -528 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +( 2136 -8 -536 ) ( 2136 0 -536 ) ( 2088 0 -536 ) subway/metal2 40 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 3058 +{ +( 1904 -344 -264 ) ( 1840 -344 -264 ) ( 1840 -344 -254 ) subway/1_tunneltrack_1 -8 -43 195 1 1 0 16777216 0 +( 2064 -8 -536 ) ( 2064 0 -536 ) ( 2016 0 -536 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1960 -144 -528 ) ( 1960 120 -528 ) ( 1992 120 -528 ) subway/metal2 32 16 0 0.500000 0.500000 0 16777216 0 +( 1872 -8 -516 ) ( 1872 -272 -516 ) ( 1872 -272 -548 ) subway/metal2 -16 -48 0 0.500000 0.500000 0 16777216 0 +( 2064 424 -536 ) ( 2064 424 -504 ) ( 2016 424 -504 ) subway/metal2 32 -48 0 0.500000 0.500000 0 16777216 0 +( 1880 -480 -728 ) ( 1880 -480 -768 ) ( 1880 -488 -768 ) subway/metal2 -16 -48 0 0.500000 0.500000 0 16777216 0 +( 2064 -424 -504 ) ( 2064 -424 -536 ) ( 2016 -424 -536 ) subway/metal2 32 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3059 +{ +( 1692 1560 -520 ) ( 1668 1560 -520 ) ( 1692 1560 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1984 1084 -536 ) ( 1864 1084 -536 ) ( 1864 1060 -536 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1872 1044 -520 ) ( 1872 1068 -520 ) ( 1992 1068 -520 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1688 976 -520 ) ( 1688 1000 -520 ) ( 1688 1000 -528 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1672 1004 -448 ) ( 1672 980 -448 ) ( 1672 980 -456 ) subway/con6 0 48 0 0.500000 0.500000 0 285212672 0 +( 1720 1352 -264 ) ( 1664 1352 -264 ) ( 1664 1352 -254 ) subway/1_tunneltrack_1 -28 -55 195 1 1 0 16777216 0 +} +// brush 3060 +{ +( 1664 1576 -520 ) ( 1688 1576 -520 ) ( 1664 1576 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1984 1084 -536 ) ( 1864 1084 -536 ) ( 1864 1060 -536 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1872 1044 -520 ) ( 1872 1068 -520 ) ( 1992 1068 -520 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1688 960 -520 ) ( 1688 984 -520 ) ( 1688 984 -528 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1672 1004 -448 ) ( 1672 980 -448 ) ( 1672 980 -456 ) subway/con6 0 48 0 0.500000 0.500000 0 285212672 0 +( 1640 1792 -496 ) ( 1696 1792 -512 ) ( 1696 1792 -496 ) subway/1_tunnelwall_floor 16 0 0 1 0.500000 0 285212672 0 +} +// brush 3061 +{ +( 1688 1592 -536 ) ( 1664 1592 -536 ) ( 1664 1560 -536 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +( 1664 1560 -520 ) ( 1664 1592 -520 ) ( 1688 1592 -520 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +( 1668 1560 -520 ) ( 1692 1560 -520 ) ( 1692 1560 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1688 1560 -520 ) ( 1688 1592 -520 ) ( 1688 1592 -536 ) subway/light_yellow 16 16 0 0.500000 0.500000 0 16777217 22000 +( 1688 1576 -520 ) ( 1664 1576 -520 ) ( 1664 1576 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1672 1584 -520 ) ( 1672 1552 -520 ) ( 1672 1552 -536 ) subway/light_red -16 16 0 0.500000 0.500000 0 16777217 15000 +} +// brush 3062 +{ +( 1984 1084 -520 ) ( 1864 1084 -520 ) ( 1864 1060 -520 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1872 1044 -488 ) ( 1872 1068 -488 ) ( 1992 1068 -488 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1832 1124 -552 ) ( 1952 1124 -552 ) ( 1952 1124 -560 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1688 1000 -504 ) ( 1688 1024 -504 ) ( 1688 1024 -512 ) subway/1_tunnelwall 8 -80 0 0.500000 0.500000 0 301989888 0 +( 2008 1792 -464 ) ( 1888 1792 -464 ) ( 1888 1792 -472 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1672 956 -432 ) ( 1672 932 -432 ) ( 1672 932 -440 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1728 1352 -264 ) ( 1680 1352 -264 ) ( 1680 1352 -254 ) subway/1_tunneltrack_1 -28 -55 195 1 1 0 16777216 0 +} +// brush 3063 +{ +( 1984 1084 -480 ) ( 1864 1084 -480 ) ( 1864 1060 -480 ) subway/1_tunnelwall_pipe 32 16 0 0.500000 0.500000 0 16777216 0 +( 1872 1044 -448 ) ( 1872 1068 -448 ) ( 1992 1068 -448 ) subway/1_tunnelwall_pipe 32 16 0 0.500000 0.500000 0 16777216 0 +( 1824 668 -512 ) ( 1944 668 -512 ) ( 1944 668 -520 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1688 1008 -480 ) ( 1688 1032 -480 ) ( 1688 1032 -488 ) subway/1_tunnelwall_pipe 0 8 0 0.500000 0.500000 0 16777216 0 +( 2008 1792 -424 ) ( 1888 1792 -424 ) ( 1888 1792 -432 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1672 1636 -392 ) ( 1672 1612 -392 ) ( 1672 1612 -400 ) subway/1_tunnelwall_pipe 0 32 0 0.500000 0.500000 0 16777216 0 +( 1688 1352 -264 ) ( 1656 1352 -264 ) ( 1656 1352 -254 ) subway/1_tunneltrack_1 -28 -55 195 1 1 0 16777216 0 +} +// brush 3064 +{ +( 1690 1440 -408 ) ( 1690 1440 -392 ) ( 1690 1456 -392 ) subway/light_red 32 -16 0 0.500000 0.500000 134217792 16777217 19000 +( 1696 1456 -408 ) ( 1696 1456 -392 ) ( 1688 1456 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1456 -408 ) ( 1688 1456 -392 ) ( 1688 1440 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1440 -408 ) ( 1688 1440 -392 ) ( 1696 1440 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1456 -392 ) ( 1696 1456 -392 ) ( 1696 1440 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 1440 -408 ) ( 1696 1456 -408 ) ( 1688 1456 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +} +// brush 3065 +{ +( 1696 1472 -408 ) ( 1696 1488 -408 ) ( 1688 1488 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1488 -392 ) ( 1696 1488 -392 ) ( 1696 1472 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1472 -408 ) ( 1688 1472 -392 ) ( 1696 1472 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1488 -408 ) ( 1688 1488 -392 ) ( 1688 1472 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 1488 -408 ) ( 1696 1488 -392 ) ( 1688 1488 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1690 1472 -408 ) ( 1690 1472 -392 ) ( 1690 1488 -392 ) subway/light_red 32 -16 0 0.500000 0.500000 134217792 16777217 19000 +} +// brush 3066 +{ +( 1696 1648 -408 ) ( 1696 1664 -408 ) ( 1688 1664 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1664 -392 ) ( 1696 1664 -392 ) ( 1696 1648 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1648 -408 ) ( 1688 1648 -392 ) ( 1696 1648 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1664 -408 ) ( 1688 1664 -392 ) ( 1688 1648 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 1664 -408 ) ( 1696 1664 -392 ) ( 1688 1664 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1690 1648 -408 ) ( 1690 1648 -392 ) ( 1690 1664 -392 ) subway/light_red 32 -16 0 0.500000 0.500000 134217792 16777217 19000 +} +// brush 3067 +{ +( 1690 1680 -408 ) ( 1690 1680 -392 ) ( 1690 1696 -392 ) subway/light_red 32 -16 0 0.500000 0.500000 134217792 16777217 19000 +( 1696 1696 -408 ) ( 1696 1696 -392 ) ( 1688 1696 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1696 -408 ) ( 1688 1696 -392 ) ( 1688 1680 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1680 -408 ) ( 1688 1680 -392 ) ( 1696 1680 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1696 -392 ) ( 1696 1696 -392 ) ( 1696 1680 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 1680 -408 ) ( 1696 1696 -408 ) ( 1688 1696 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +} +// brush 3068 +{ +( 1832 824 -448 ) ( 1816 824 -448 ) ( 1816 792 -448 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1816 792 -320 ) ( 1816 824 -320 ) ( 1832 824 -320 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1816 776 -320 ) ( 1832 776 -320 ) ( 1832 776 -448 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1848 792 -320 ) ( 1848 824 -320 ) ( 1848 824 -448 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1832 840 -320 ) ( 1816 840 -320 ) ( 1816 840 -448 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 1002 +( 1816 824 -288 ) ( 1816 792 -288 ) ( 1816 792 -416 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +} +// brush 3069 +{ +( 1744 1568 -288 ) ( 1744 1552 -288 ) ( 1744 1552 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 1568 -288 ) ( 1744 1568 -288 ) ( 1744 1568 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 1552 -288 ) ( 1760 1568 -288 ) ( 1760 1568 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 1552 -288 ) ( 1760 1552 -288 ) ( 1760 1552 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 1552 -288 ) ( 1744 1568 -288 ) ( 1760 1568 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1760 1568 -292 ) ( 1744 1568 -292 ) ( 1744 1552 -292 ) subway/light_orange 0 0 0 0.500000 0.500000 134217728 1 13000 +} +// brush 3070 +{ +( 1840 1268 -488 ) ( 1840 1444 -488 ) ( 1816 1444 -488 ) subway/2_warning -16 0 0 0.500000 0.500000 0 0 0 +( 1816 1444 -480 ) ( 1840 1444 -480 ) ( 1840 1268 -480 ) subway/2_warning -16 0 0 0.500000 0.500000 0 0 0 +( 1816 1624 -480 ) ( 1816 1336 -480 ) ( 1816 1336 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1824 1352 -496 ) ( 1816 1352 -496 ) ( 1816 1352 -480 ) subway/2_warning -16 16 0 0.500000 0.500000 0 0 0 +( 1824 1488 -496 ) ( 1824 1488 -480 ) ( 1824 1824 -480 ) subway/2_warning 0 16 0 0.500000 0.500000 0 0 0 +( 1824 1792 -480 ) ( 1816 1792 -480 ) ( 1816 1792 -496 ) subway/2_warning -16 16 0 0.500000 0.500000 0 0 0 +} +// brush 3071 +{ +( 1836 1352 -520 ) ( 1812 1352 -520 ) ( 1836 1352 -536 ) subway/1_tunnelwall_floor 16 16 0 1 0.500000 0 285212672 0 +( 1848 1216 -520 ) ( 1848 1248 -520 ) ( 1848 1248 -536 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1840 776 -254 ) ( 1840 776 -264 ) ( 1784 776 -264 ) subway/1_tunnelwall_floor 16 16 0 1 0.500000 0 285212672 0 +( 1816 416 -528 ) ( 1816 416 -520 ) ( 1816 392 -520 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1512 500 -520 ) ( 1632 500 -520 ) ( 1632 476 -520 ) subway/1_tunnelwall_floor 16 0 0 1 0.500000 0 285212672 0 +( 1640 492 -536 ) ( 1640 516 -536 ) ( 1520 516 -536 ) subway/1_tunnelwall_floor 16 0 0 1 0.500000 0 285212672 0 +} +// brush 3072 +{ +( 1848 776 -254 ) ( 1848 776 -264 ) ( 1816 776 -264 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1848 1020 -400 ) ( 1848 1020 -392 ) ( 1848 1044 -392 ) subway/1_tunnelwall_pipe -16 8 0 0.500000 0.500000 0 16777216 0 +( 1616 1352 -432 ) ( 1616 1352 -424 ) ( 1496 1352 -424 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1816 512 -488 ) ( 1816 512 -480 ) ( 1816 488 -480 ) subway/1_tunnelwall_pipe 0 8 0 0.500000 0.500000 0 16777216 0 +( 1560 132 -520 ) ( 1560 132 -512 ) ( 1680 132 -512 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1512 532 -448 ) ( 1632 532 -448 ) ( 1632 508 -448 ) subway/1_tunnelfloor_1 0 0 0 1 1 0 285212672 0 +( 1640 524 -480 ) ( 1640 548 -480 ) ( 1520 548 -480 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +} +// brush 3073 +{ +( 1832 1876 -352 ) ( 1832 1876 -344 ) ( 1832 1900 -344 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1612 1760 -384 ) ( 1612 1760 -376 ) ( 1492 1760 -376 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1816 1376 -440 ) ( 1816 1376 -432 ) ( 1816 1352 -432 ) subway/1_tunnelwall 8 -64 0 0.500000 0.500000 0 301989888 0 +( 1632 1460 -448 ) ( 1632 1484 -448 ) ( 1512 1484 -448 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1808 836 -288 ) ( 1808 884 -288 ) ( 1816 884 -288 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1816 1352 -336 ) ( 1824 1352 -336 ) ( 1816 1352 -448 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 3074 +{ +( 1672 1792 -320 ) ( 1672 1760 -320 ) ( 1672 1760 -448 ) subway/metal1 0 16 0 0.500000 0.500000 0 16777216 0 +( 1688 1792 -320 ) ( 1672 1792 -320 ) ( 1672 1792 -448 ) subway/metal1 32 16 0 0.500000 0.500000 0 16777216 0 +( 1688 1760 -320 ) ( 1688 1792 -320 ) ( 1688 1792 -448 ) subway/metal1 -31 16 0 0.500000 0.500000 0 16777216 0 +( 1672 1760 -320 ) ( 1688 1760 -320 ) ( 1688 1760 -448 ) subway/metal1 32 16 0 0.500000 0.500000 0 16777216 0 +( 1672 1760 -288 ) ( 1672 1792 -288 ) ( 1688 1792 -288 ) subway/metal1 32 0 0 0.500000 0.500000 0 16777216 0 +( 1688 1792 -480 ) ( 1672 1792 -480 ) ( 1672 1760 -480 ) subway/metal1 32 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3075 +{ +( 1640 1352 -496 ) ( 1696 1352 -512 ) ( 1696 1352 -496 ) subway/1_tunnelwall_floor 16 0 0 1 0.500000 0 285212672 0 +( 1672 564 -448 ) ( 1672 540 -448 ) ( 1672 540 -456 ) subway/con6 -16 48 0 0.500000 0.500000 0 285212672 0 +( 1688 520 -520 ) ( 1688 544 -520 ) ( 1688 544 -528 ) subway/1_tunnelwall_floor -8 16 0 1 0.500000 0 285212672 0 +( 1872 604 -520 ) ( 1872 628 -520 ) ( 1992 628 -520 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1984 644 -536 ) ( 1864 644 -536 ) ( 1864 620 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1664 1136 -520 ) ( 1688 1136 -520 ) ( 1664 1136 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3076 +{ +( 1824 1592 -536 ) ( 1800 1592 -536 ) ( 1800 1560 -536 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +( 1800 1560 -520 ) ( 1800 1592 -520 ) ( 1824 1592 -520 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +( 1804 1560 -520 ) ( 1828 1560 -520 ) ( 1828 1560 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1832 1560 -520 ) ( 1832 1592 -520 ) ( 1832 1592 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1824 1576 -520 ) ( 1800 1576 -520 ) ( 1800 1576 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1816 1584 -520 ) ( 1816 1552 -520 ) ( 1816 1552 -536 ) subway/light_yellow 16 16 0 0.500000 0.500000 0 16777217 22000 +} +// brush 3077 +{ +( 1672 1144 -520 ) ( 1672 1112 -520 ) ( 1672 1112 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 15000 +( 1688 1136 -520 ) ( 1664 1136 -520 ) ( 1664 1136 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1688 1120 -520 ) ( 1688 1152 -520 ) ( 1688 1152 -536 ) subway/light_yellow 32 16 0 0.500000 0.500000 0 16777217 22000 +( 1668 1120 -520 ) ( 1692 1120 -520 ) ( 1692 1120 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1664 1120 -520 ) ( 1664 1152 -520 ) ( 1688 1152 -520 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1688 1152 -536 ) ( 1664 1152 -536 ) ( 1664 1120 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +} +// brush 3078 +{ +( 1640 1060 -536 ) ( 1640 1084 -536 ) ( 1520 1084 -536 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1512 1068 -520 ) ( 1632 1068 -520 ) ( 1632 1044 -520 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1816 984 -528 ) ( 1816 984 -520 ) ( 1816 960 -520 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1832 980 -456 ) ( 1832 980 -448 ) ( 1832 1004 -448 ) subway/con6 0 48 0 0.500000 0.500000 0 285212672 0 +( 1808 1792 -496 ) ( 1808 1792 -512 ) ( 1864 1792 -496 ) subway/1_tunnelwall_floor 16 0 0 1 0.500000 0 285212672 0 +( 1800 1576 -520 ) ( 1824 1576 -520 ) ( 1800 1576 -536 ) subway/1_tunnelwall_floor 16 0 0 1 0.500000 0 285212672 0 +} +// brush 3079 +{ +( 1824 1840 -536 ) ( 1800 1840 -536 ) ( 1800 1808 -536 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +( 1800 1808 -520 ) ( 1800 1840 -520 ) ( 1824 1840 -520 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +( 1804 1808 -520 ) ( 1828 1808 -520 ) ( 1828 1808 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1824 1808 -520 ) ( 1824 1840 -520 ) ( 1824 1840 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1824 1824 -520 ) ( 1800 1824 -520 ) ( 1800 1824 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1816 1832 -520 ) ( 1816 1800 -520 ) ( 1816 1800 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 10000 +} +// brush 3080 +{ +( 1690 1208 -408 ) ( 1690 1208 -392 ) ( 1690 1224 -392 ) subway/light_red 16 -16 0 0.500000 0.500000 134217792 16777217 19000 +( 1696 1224 -408 ) ( 1696 1224 -392 ) ( 1688 1224 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1224 -408 ) ( 1688 1224 -392 ) ( 1688 1208 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1208 -408 ) ( 1688 1208 -392 ) ( 1696 1208 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1224 -392 ) ( 1696 1224 -392 ) ( 1696 1208 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 1208 -408 ) ( 1696 1224 -408 ) ( 1688 1224 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +} +// brush 3081 +{ +( 1696 1240 -408 ) ( 1696 1256 -408 ) ( 1688 1256 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1256 -392 ) ( 1696 1256 -392 ) ( 1696 1240 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1240 -408 ) ( 1688 1240 -392 ) ( 1696 1240 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1688 1256 -408 ) ( 1688 1256 -392 ) ( 1688 1240 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1696 1256 -408 ) ( 1696 1256 -392 ) ( 1688 1256 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217792 16777216 0 +( 1690 1240 -408 ) ( 1690 1240 -392 ) ( 1690 1256 -392 ) subway/light_red 16 -16 0 0.500000 0.500000 134217792 16777217 19000 +} +// brush 3082 +{ +( 1974 1264 -392 ) ( 1974 1248 -392 ) ( 1974 1248 -408 ) subway/light_red 0 16 0 0.500000 0.500000 134217728 16777217 19000 +( 1976 1264 -392 ) ( 1968 1264 -392 ) ( 1968 1264 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 1248 -392 ) ( 1976 1264 -392 ) ( 1976 1264 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 1248 -392 ) ( 1976 1248 -392 ) ( 1976 1248 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 1248 -392 ) ( 1968 1264 -392 ) ( 1976 1264 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 1264 -408 ) ( 1968 1264 -408 ) ( 1968 1248 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3083 +{ +( 1976 1232 -408 ) ( 1968 1232 -408 ) ( 1968 1216 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 1216 -392 ) ( 1968 1232 -392 ) ( 1976 1232 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 1216 -392 ) ( 1976 1216 -392 ) ( 1976 1216 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 1216 -392 ) ( 1976 1232 -392 ) ( 1976 1232 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1976 1232 -392 ) ( 1968 1232 -392 ) ( 1968 1232 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1974 1232 -392 ) ( 1974 1216 -392 ) ( 1974 1216 -408 ) subway/light_red 0 16 0 0.500000 0.500000 134217728 16777217 19000 +} +// brush 3084 +{ +( 1690 2552 -408 ) ( 1690 2552 -392 ) ( 1690 2568 -392 ) subway/light_red -16 16 0 0.500000 0.500000 134217728 16777217 12000 +( 1696 2568 -408 ) ( 1696 2568 -392 ) ( 1688 2568 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1688 2568 -408 ) ( 1688 2568 -392 ) ( 1688 2552 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1688 2552 -408 ) ( 1688 2552 -392 ) ( 1696 2552 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1688 2568 -392 ) ( 1696 2568 -392 ) ( 1696 2552 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1696 2552 -408 ) ( 1696 2568 -408 ) ( 1688 2568 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3085 +{ +( 1696 2584 -408 ) ( 1696 2600 -408 ) ( 1688 2600 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1688 2600 -392 ) ( 1696 2600 -392 ) ( 1696 2584 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1688 2584 -408 ) ( 1688 2584 -392 ) ( 1696 2584 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1688 2600 -408 ) ( 1688 2600 -392 ) ( 1688 2584 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1696 2600 -408 ) ( 1696 2600 -392 ) ( 1688 2600 -392 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1690 2584 -408 ) ( 1690 2584 -392 ) ( 1690 2600 -392 ) subway/light_red -16 16 0 0.500000 0.500000 134217728 16777217 12000 +} +// brush 3086 +{ +( 1992 532 -352 ) ( 1992 532 -344 ) ( 1992 556 -344 ) subway/1_tunnelwall -48 -32 0 0.500000 0.500000 0 301989888 0 +( 1772 432 -384 ) ( 1772 432 -376 ) ( 1652 432 -376 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +( 1976 -272 -440 ) ( 1976 -272 -432 ) ( 1976 -296 -432 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1792 52 -448 ) ( 1792 76 -448 ) ( 1672 76 -448 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1968 -532 -288 ) ( 1968 -484 -288 ) ( 1976 -484 -288 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1984 -344 -336 ) ( 1992 -344 -336 ) ( 1984 -344 -448 ) subway/1_tunnelwall 0 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 3087 +{ +( 2008 -344 -254 ) ( 2008 -344 -264 ) ( 1976 -344 -264 ) subway/1_tunneltrack_1 -54 -40 195 1 1 0 16777216 0 +( 1992 196 -400 ) ( 1992 196 -392 ) ( 1992 220 -392 ) subway/1_tunnelwall_pipe -48 -32 0 0.500000 0.500000 0 16777216 0 +( 1776 424 -432 ) ( 1776 424 -424 ) ( 1656 424 -424 ) subway/1_tunnelwall_pipe 0 -32 0 0.500000 0.500000 0 16777216 0 +( 1976 -616 -488 ) ( 1976 -616 -480 ) ( 1976 -640 -480 ) subway/1_tunnelwall_pipe -48 -56 0 0.500000 0.500000 0 16777216 0 +( 1720 -700 -520 ) ( 1720 -700 -512 ) ( 1840 -700 -512 ) subway/1_tunnelwall_pipe 0 -32 0 0.500000 0.500000 0 16777216 0 +( 1672 -340 -448 ) ( 1792 -340 -448 ) ( 1792 -364 -448 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1800 -308 -480 ) ( 1800 -284 -480 ) ( 1680 -284 -480 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3088 +{ +( 1980 -356 -254 ) ( 1980 -356 -264 ) ( 1932 -356 -264 ) subway/1_tunneltrack_1 -54 -40 195 1 1 0 16777216 0 +( 1992 -460 -440 ) ( 1992 -460 -432 ) ( 1992 -436 -432 ) subway/1_tunnelwall -48 -48 0 0.500000 0.500000 0 301989888 0 +( 1776 424 -472 ) ( 1776 424 -464 ) ( 1656 424 -464 ) subway/1_tunnelwall 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1976 -616 -512 ) ( 1976 -616 -504 ) ( 1976 -640 -504 ) subway/1_tunnelwall -56 -8 0 1 1 0 301989888 0 +( 1708 -344 -560 ) ( 1708 -344 -552 ) ( 1828 -344 -552 ) subway/1_tunnelwall 0 -48 0 0.500000 0.500000 0 301989888 0 +( 1672 -300 -488 ) ( 1792 -300 -488 ) ( 1792 -324 -488 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( 1800 -332 -520 ) ( 1800 -308 -520 ) ( 1680 -308 -520 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +} +// brush 3089 +{ +( 1640 2904 -496 ) ( 1696 2904 -512 ) ( 1696 2904 -496 ) subway/1_tunnelwall_floor 16 0 0 1 0.500000 0 285212672 0 +( 1720 2440 -264 ) ( 1664 2440 -264 ) ( 1664 2440 -254 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1536 2124 -448 ) ( 1536 2100 -448 ) ( 1536 2100 -456 ) subway/con6 0 48 0 0.500000 0.500000 0 285212672 0 +( 1688 2072 -520 ) ( 1688 2096 -520 ) ( 1688 2096 -528 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1872 2156 -520 ) ( 1872 2180 -520 ) ( 1992 2180 -520 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1984 2196 -536 ) ( 1864 2196 -536 ) ( 1864 2172 -536 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3090 +{ +( 1728 2440 -264 ) ( 1680 2440 -264 ) ( 1680 2440 -254 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1536 2076 -432 ) ( 1536 2052 -432 ) ( 1536 2052 -440 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 2008 2904 -464 ) ( 1888 2904 -464 ) ( 1888 2904 -472 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1688 2096 -504 ) ( 1688 2120 -504 ) ( 1688 2120 -512 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1832 2236 -552 ) ( 1952 2236 -552 ) ( 1952 2236 -560 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1872 2156 -488 ) ( 1872 2180 -488 ) ( 1992 2180 -488 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1984 2196 -520 ) ( 1864 2196 -520 ) ( 1864 2172 -520 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3091 +{ +( 1696 2556 -488 ) ( 1672 2556 -488 ) ( 1672 2380 -488 ) subway/2_warning 0 0 0 0.500000 0.500000 0 0 0 +( 1672 2380 -480 ) ( 1672 2556 -480 ) ( 1696 2556 -480 ) subway/2_warning 0 0 0 0.500000 0.500000 0 0 0 +( 1688 2440 -496 ) ( 1688 2440 -480 ) ( 1688 2728 -480 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1696 2440 -480 ) ( 1696 2440 -496 ) ( 1688 2440 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1536 2920 -480 ) ( 1536 2584 -480 ) ( 1536 2584 -496 ) subway/2_warning 0 16 0 0.500000 0.500000 0 0 0 +( 1696 2904 -496 ) ( 1696 2904 -480 ) ( 1688 2904 -480 ) subway/2_warning 0 16 0 0.500000 0.500000 0 0 0 +} +// brush 3092 +{ +( 1688 2456 -264 ) ( 1656 2456 -264 ) ( 1656 2456 -254 ) subway/1_tunneltrack_1 -28 -55 195 1 1 0 16777216 0 +( 1672 2724 -392 ) ( 1672 2700 -392 ) ( 1672 2700 -400 ) subway/1_tunnelwall_pipe 0 32 0 0.500000 0.500000 0 16777216 0 +( 2008 2904 -424 ) ( 1888 2904 -424 ) ( 1888 2904 -432 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1688 2120 -480 ) ( 1688 2144 -480 ) ( 1688 2144 -488 ) subway/1_tunnelwall_pipe 0 8 0 0.500000 0.500000 0 16777216 0 +( 1824 1780 -512 ) ( 1944 1780 -512 ) ( 1944 1780 -520 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1872 2156 -448 ) ( 1872 2180 -448 ) ( 1992 2180 -448 ) subway/1_tunnelwall_pipe 32 16 0 0.500000 0.500000 0 16777216 0 +( 1984 2196 -480 ) ( 1864 2196 -480 ) ( 1864 2172 -480 ) subway/1_tunnelwall_pipe 32 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 3093 +{ +( 1672 3084 -344 ) ( 1672 3060 -344 ) ( 1672 3060 -352 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 2012 2904 -376 ) ( 1892 2904 -376 ) ( 1892 2904 -384 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1688 2464 -432 ) ( 1688 2488 -432 ) ( 1688 2488 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1992 2596 -448 ) ( 1872 2596 -448 ) ( 1872 2572 -448 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1688 1996 -384 ) ( 1696 1996 -384 ) ( 1696 1948 -384 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1688 2456 -448 ) ( 1680 2456 -336 ) ( 1688 2456 -336 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 3094 +{ +( 1992 1984 -536 ) ( 1872 1984 -536 ) ( 1872 1960 -536 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1880 1944 -520 ) ( 1880 1968 -520 ) ( 2000 1968 -520 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1688 2256 -520 ) ( 1688 2280 -520 ) ( 1688 2280 -528 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1536 1832 -448 ) ( 1536 1808 -448 ) ( 1536 1808 -456 ) subway/con6 0 48 0 0.500000 0.500000 0 285212672 0 +( 1692 1992 -520 ) ( 1668 1992 -520 ) ( 1692 1992 -536 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1656 1824 -520 ) ( 1680 1824 -520 ) ( 1656 1824 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3095 +{ +( 1704 1792 -488 ) ( 1704 1792 -536 ) ( 1688 1792 -488 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1992 1984 -536 ) ( 1872 1984 -536 ) ( 1872 1960 -536 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1880 1944 -520 ) ( 1880 1968 -520 ) ( 2000 1968 -520 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1688 2256 -520 ) ( 1688 2280 -520 ) ( 1688 2280 -528 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1680 1824 -448 ) ( 1680 1800 -448 ) ( 1680 1800 -456 ) subway/con6 0 48 0 0.500000 0.500000 0 285212672 0 +( 1700 1808 -520 ) ( 1676 1808 -520 ) ( 1700 1808 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3096 +{ +( 1816 1792 -488 ) ( 1800 1792 -536 ) ( 1800 1792 -488 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1632 1960 -536 ) ( 1632 1984 -536 ) ( 1512 1984 -536 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1504 1968 -520 ) ( 1624 1968 -520 ) ( 1624 1944 -520 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1816 2344 -528 ) ( 1816 2344 -520 ) ( 1816 2320 -520 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1824 1736 -456 ) ( 1824 1736 -448 ) ( 1824 1760 -448 ) subway/con6 0 48 0 0.500000 0.500000 0 285212672 0 +( 1820 1808 -520 ) ( 1796 1808 -520 ) ( 1820 1808 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3097 +{ +( 1632 1960 -536 ) ( 1632 1984 -536 ) ( 1512 1984 -536 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1504 1968 -520 ) ( 1624 1968 -520 ) ( 1624 1944 -520 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1816 2344 -528 ) ( 1816 2344 -520 ) ( 1816 2320 -520 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1824 1736 -456 ) ( 1824 1736 -448 ) ( 1824 1760 -448 ) subway/con6 0 48 0 0.500000 0.500000 0 285212672 0 +( 1828 1976 -520 ) ( 1804 1976 -520 ) ( 1828 1976 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1800 1824 -520 ) ( 1824 1824 -520 ) ( 1800 1824 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3098 +{ +( 1824 2008 -536 ) ( 1800 2008 -536 ) ( 1800 1976 -536 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +( 1800 1976 -520 ) ( 1800 2008 -520 ) ( 1824 2008 -520 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +( 1804 1976 -520 ) ( 1828 1976 -520 ) ( 1828 1976 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1824 1976 -520 ) ( 1824 2008 -520 ) ( 1824 2008 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1824 1992 -520 ) ( 1800 1992 -520 ) ( 1800 1992 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1816 2000 -520 ) ( 1816 1968 -520 ) ( 1816 1968 -536 ) subway/light_red -16 16 0 0.500000 0.500000 0 16777217 10000 +} +// brush 3099 +{ +( 1632 1960 -536 ) ( 1632 1984 -536 ) ( 1512 1984 -536 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1504 1968 -520 ) ( 1624 1968 -520 ) ( 1624 1944 -520 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1816 2344 -528 ) ( 1816 2344 -520 ) ( 1816 2320 -520 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1824 1736 -456 ) ( 1824 1736 -448 ) ( 1824 1760 -448 ) subway/con6 0 48 0 0.500000 0.500000 0 285212672 0 +( 1824 2160 -520 ) ( 1800 2160 -520 ) ( 1824 2160 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1800 1992 -520 ) ( 1824 1992 -520 ) ( 1800 1992 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3100 +{ +( 1816 2192 -520 ) ( 1816 2160 -520 ) ( 1816 2160 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 10000 +( 1824 2176 -520 ) ( 1800 2176 -520 ) ( 1800 2176 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1824 2160 -520 ) ( 1824 2192 -520 ) ( 1824 2192 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1804 2160 -520 ) ( 1828 2160 -520 ) ( 1828 2160 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1800 2160 -520 ) ( 1800 2192 -520 ) ( 1824 2192 -520 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +( 1824 2192 -536 ) ( 1800 2192 -536 ) ( 1800 2160 -536 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +} +// brush 3101 +{ +( 1680 1944 -224 ) ( 1680 1936 -224 ) ( 1680 1936 -256 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1880 1960 -224 ) ( 1824 1960 -224 ) ( 1824 1960 -256 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 1936 -224 ) ( 1880 1944 -224 ) ( 1880 1944 -256 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1672 1792 -224 ) ( 1728 1792 -224 ) ( 1728 1792 -256 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1816 1936 -200 ) ( 1816 1944 -200 ) ( 1872 1944 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1880 1944 -256 ) ( 1824 1944 -256 ) ( 1824 1936 -256 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3102 +{ +( 1880 1960 -392 ) ( 1880 1960 -368 ) ( 1816 1960 -368 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 1960 -368 ) ( 1880 1960 -392 ) ( 1896 1944 -392 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1832 1944 -392 ) ( 1832 1944 -368 ) ( 1896 1944 -368 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1832 1944 -336 ) ( 1832 1944 -360 ) ( 1816 1960 -360 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1608 2672 -336 ) ( 1616 2672 -336 ) ( 1616 2288 -336 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1816 1936 -392 ) ( 1896 1936 -392 ) ( 1896 1944 -392 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3103 +{ +( 2544 1632 -432 ) ( 2544 1640 -432 ) ( 2160 1640 -432 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2168 1640 -400 ) ( 2552 1640 -400 ) ( 2552 1632 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2044 1792 -512 ) ( 2044 1792 -480 ) ( 2428 1792 -480 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1816 1488 -512 ) ( 1816 1488 -480 ) ( 1816 1480 -480 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1816 1960 -432 ) ( 1824 1952 -432 ) ( 1824 1952 -416 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1824 1840 -416 ) ( 1824 1920 -416 ) ( 1824 1920 -432 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3104 +{ +( 2544 1632 -448 ) ( 2544 1640 -448 ) ( 2160 1640 -448 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 2168 1640 -432 ) ( 2552 1640 -432 ) ( 2552 1632 -432 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 2044 1792 -528 ) ( 2044 1792 -496 ) ( 2428 1792 -496 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1816 1488 -528 ) ( 1816 1488 -496 ) ( 1816 1480 -496 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1816 1960 -448 ) ( 1824 1952 -448 ) ( 1824 1952 -432 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1824 1840 -432 ) ( 1824 1920 -432 ) ( 1824 1920 -448 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3105 +{ +( 1616 2296 -480 ) ( 1616 2680 -480 ) ( 1608 2680 -480 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1608 2688 -464 ) ( 1616 2688 -464 ) ( 1616 2304 -464 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1824 1952 -464 ) ( 1824 1952 -480 ) ( 1816 1960 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1824 1952 -480 ) ( 1824 1952 -464 ) ( 1904 1952 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1896 1960 -464 ) ( 1896 1960 -480 ) ( 1904 1952 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1896 1960 -480 ) ( 1896 1960 -464 ) ( 1816 1960 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3106 +{ +( 1896 1960 -464 ) ( 1896 1960 -448 ) ( 1816 1960 -448 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1896 1960 -448 ) ( 1896 1960 -464 ) ( 1904 1952 -464 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1824 1952 -464 ) ( 1824 1952 -448 ) ( 1904 1952 -448 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1824 1952 -448 ) ( 1824 1952 -464 ) ( 1816 1960 -464 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1608 2688 -448 ) ( 1616 2688 -448 ) ( 1616 2304 -448 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1616 2296 -464 ) ( 1616 2680 -464 ) ( 1608 2680 -464 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3107 +{ +( 1616 2296 -448 ) ( 1616 2680 -448 ) ( 1608 2680 -448 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 1608 2688 -432 ) ( 1616 2688 -432 ) ( 1616 2304 -432 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 1824 1952 -432 ) ( 1824 1952 -448 ) ( 1816 1960 -448 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1824 1952 -448 ) ( 1824 1952 -432 ) ( 1904 1952 -432 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1896 1960 -432 ) ( 1896 1960 -448 ) ( 1904 1952 -448 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1896 1960 -448 ) ( 1896 1960 -432 ) ( 1816 1960 -432 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3108 +{ +( 1616 2296 -400 ) ( 1616 2680 -400 ) ( 1608 2680 -400 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1608 2688 -392 ) ( 1616 2688 -392 ) ( 1616 2304 -392 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1816 2564 -464 ) ( 1816 2180 -464 ) ( 1816 2180 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1456 1952 -464 ) ( 1464 1952 -464 ) ( 1464 1952 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1896 1960 -392 ) ( 1896 1960 -400 ) ( 1904 1952 -400 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1896 1960 -400 ) ( 1896 1960 -392 ) ( 1816 1960 -392 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3109 +{ +( 1824 1840 -408 ) ( 1824 1920 -408 ) ( 1824 1920 -424 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1816 1960 -424 ) ( 1824 1952 -424 ) ( 1824 1952 -408 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1816 1488 -504 ) ( 1816 1488 -472 ) ( 1816 1480 -472 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2044 1792 -504 ) ( 2044 1792 -472 ) ( 2428 1792 -472 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2168 1640 -392 ) ( 2552 1640 -392 ) ( 2552 1632 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2544 1632 -400 ) ( 2544 1640 -400 ) ( 2160 1640 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3110 +{ +( 1376 1992 -464 ) ( 1368 1992 -464 ) ( 1368 1992 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1688 2200 -464 ) ( 1688 2584 -464 ) ( 1688 2584 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1200 1792 -464 ) ( 1208 1792 -464 ) ( 1208 1792 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1536 2484 -464 ) ( 1536 2100 -464 ) ( 1536 2100 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1360 2608 -392 ) ( 1368 2608 -392 ) ( 1368 2224 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1368 2216 -400 ) ( 1368 2600 -400 ) ( 1360 2600 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3111 +{ +( 1376 1992 -472 ) ( 1368 1992 -472 ) ( 1368 1992 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1688 2200 -472 ) ( 1688 2584 -472 ) ( 1688 2584 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 1792 -480 ) ( 1208 1792 -480 ) ( 1208 1792 -512 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1536 2484 -472 ) ( 1536 2100 -472 ) ( 1536 2100 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1360 2608 -400 ) ( 1368 2608 -400 ) ( 1368 2224 -400 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 1368 2216 -416 ) ( 1368 2600 -416 ) ( 1360 2600 -416 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3112 +{ +( 1376 1992 -496 ) ( 1368 1992 -496 ) ( 1368 1992 -528 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1688 2200 -496 ) ( 1688 2584 -496 ) ( 1688 2584 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1200 1792 -496 ) ( 1208 1792 -496 ) ( 1208 1792 -528 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1536 2484 -496 ) ( 1536 2100 -496 ) ( 1536 2100 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1360 2608 -416 ) ( 1368 2608 -416 ) ( 1368 2224 -416 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1368 2216 -464 ) ( 1368 2600 -464 ) ( 1360 2600 -464 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3113 +{ +( 1368 2216 -480 ) ( 1368 2600 -480 ) ( 1360 2600 -480 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1360 2608 -464 ) ( 1368 2608 -464 ) ( 1368 2224 -464 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1536 2484 -528 ) ( 1536 2100 -528 ) ( 1536 2100 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 1792 -528 ) ( 1208 1792 -528 ) ( 1208 1792 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1688 2200 -528 ) ( 1688 2584 -528 ) ( 1688 2584 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1376 1992 -528 ) ( 1368 1992 -528 ) ( 1368 1992 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3114 +{ +( 1824 2360 -440 ) ( 1824 2360 -432 ) ( 1824 2384 -432 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1576 2440 -472 ) ( 1576 2440 -464 ) ( 1456 2440 -464 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1816 2720 -512 ) ( 1816 2720 -504 ) ( 1816 2696 -504 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1568 1792 -560 ) ( 1568 1792 -552 ) ( 1688 1792 -552 ) subway/1_tunnelwall 16 -8 0 1 1 0 301989888 0 +( 1504 2600 -488 ) ( 1624 2600 -488 ) ( 1624 2576 -488 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1632 2592 -520 ) ( 1632 2616 -520 ) ( 1512 2616 -520 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3115 +{ +( 2000 2544 -224 ) ( 1984 2544 -224 ) ( 1984 2528 -224 ) subway/light_yellow 0 0 0 0.500000 0.500000 0 16777217 15000 +( 1984 2528 -216 ) ( 1984 2544 -216 ) ( 2000 2544 -216 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 1984 2528 -224 ) ( 2000 2528 -224 ) ( 2000 2528 -240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 2000 2528 -224 ) ( 2000 2544 -224 ) ( 2000 2544 -240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 2000 2544 -224 ) ( 1984 2544 -224 ) ( 1984 2544 -240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 1984 2544 -224 ) ( 1984 2528 -224 ) ( 1984 2528 -240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3116 +{ +( 2160 1896 -296 ) ( 2152 1896 -296 ) ( 2152 1824 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2152 1824 -280 ) ( 2152 1896 -280 ) ( 2160 1896 -280 ) subway/1_sign4 32 16 0 0.500000 0.500000 134217728 536870912 0 +( 2152 1832 -280 ) ( 2160 1832 -280 ) ( 2160 1832 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2160 1832 -280 ) ( 2160 1904 -280 ) ( 2160 1904 -288 ) subway/1_sign4 -80 16 0 0.500000 0.500000 134217728 536870912 0 +( 2160 1896 -280 ) ( 2152 1896 -280 ) ( 2152 1896 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2152 1896 -280 ) ( 2152 1824 -280 ) ( 2152 1824 -288 ) subway/1_sign4 80 16 0 -0.500000 0.500000 134217728 536870912 0 +} +// brush 3117 +{ +( 2328 1792 -352 ) ( 2328 1792 -384 ) ( 1936 1792 -384 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -352 ) ( 1912 1800 -384 ) ( 2024 1800 -384 ) subway/1_tile -48 16 0 -0.500000 0.500000 0 318767104 0 +( 1912 1800 -384 ) ( 1912 1800 -352 ) ( 1904 1792 -352 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 1904 1784 -352 ) ( 1904 1760 -352 ) ( 1880 1760 -352 ) subway/1_tile 16 32 0 0.500000 0.500000 0 318767104 0 +( 1880 1760 -384 ) ( 1904 1760 -384 ) ( 1904 1784 -384 ) subway/1_tile 16 32 0 0.500000 0.500000 0 318767104 0 +( 1928 1768 -356 ) ( 1928 1816 -356 ) ( 1928 1768 -388 ) subway/1_tile -16 48 0 0.500000 0.500000 0 318767104 0 +} +// brush 3118 +{ +( 1928 1904 -384 ) ( 1880 1904 -384 ) ( 1880 1824 -384 ) subway/1_tile_graf4 32 0 0 0.500000 0.500000 0 352321536 0 +( 1880 1824 -352 ) ( 1880 1904 -352 ) ( 1928 1904 -352 ) subway/1_tile_graf4 32 0 0 0.500000 0.500000 0 352321536 0 +( 1880 1856 -356 ) ( 1928 1856 -356 ) ( 1928 1856 -388 ) subway/1_tile_graf4 32 8 0 0.500000 0.500000 0 352321536 0 +( 1912 1824 -356 ) ( 1912 1904 -356 ) ( 1912 1904 -388 ) subway/1_tile_graf4 0 0 0 0.500000 0.500000 0 352321536 0 +( 1928 1888 -356 ) ( 1880 1888 -356 ) ( 1880 1888 -388 ) subway/1_tile_graf4 32 8 0 0.500000 0.500000 0 352321536 0 +( 1904 1900 -356 ) ( 1904 1820 -356 ) ( 1904 1820 -388 ) subway/1_tile_graf4 0 8 0 0.500000 0.500000 0 352321536 0 +} +// brush 3119 +{ +( 1896 1928 -384 ) ( 1872 1928 -384 ) ( 1872 1904 -384 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1792 -352 ) ( 1904 1792 -352 ) ( 1904 2024 -352 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -384 ) ( 1912 1800 -352 ) ( 1912 2024 -352 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2024 -376 ) ( 1888 2024 -328 ) ( 1880 2024 -328 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1904 2024 -376 ) ( 1904 2024 -328 ) ( 1904 1968 -328 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 1948 -356 ) ( 1928 1948 -356 ) ( 1880 1948 -388 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3120 +{ +( 1896 1928 -384 ) ( 1872 1928 -384 ) ( 1872 1904 -384 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1792 -352 ) ( 1904 1792 -352 ) ( 1904 2024 -352 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -384 ) ( 1912 1800 -352 ) ( 1912 2024 -352 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1904 2024 -376 ) ( 1904 2024 -328 ) ( 1904 1968 -328 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 1888 -356 ) ( 1928 1888 -356 ) ( 1880 1888 -388 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1928 1916 -356 ) ( 1880 1916 -356 ) ( 1928 1916 -388 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3121 +{ +( 1916 1792 -356 ) ( 1996 1792 -356 ) ( 1996 1792 -388 ) subway/1_tile_graf4 24 8 0 0.500000 0.500000 0 352321536 0 +( 1928 1816 -356 ) ( 1928 1768 -356 ) ( 1928 1768 -388 ) subway/1_tile_graf4 -40 8 0 0.500000 0.500000 0 352321536 0 +( 1992 1800 -356 ) ( 1912 1800 -356 ) ( 1912 1800 -388 ) subway/1_tile_graf9 -48 0 0 -0.500000 0.500000 0 352321536 0 +( 1960 1768 -356 ) ( 1960 1816 -356 ) ( 1960 1816 -388 ) subway/1_tile_graf4 -40 8 0 0.500000 0.500000 0 352321536 0 +( 1992 1768 -352 ) ( 1912 1768 -352 ) ( 1912 1816 -352 ) subway/1_tile_graf4 24 40 0 0.500000 0.500000 0 352321536 0 +( 1912 1816 -384 ) ( 1912 1768 -384 ) ( 1992 1768 -384 ) subway/1_tile_graf4 24 40 0 0.500000 0.500000 0 352321536 0 +} +// brush 3122 +{ +( 1896 1928 -384 ) ( 1872 1928 -384 ) ( 1872 1904 -384 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1792 -352 ) ( 1904 1792 -352 ) ( 1904 2024 -352 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -352 ) ( 1912 1800 -384 ) ( 1904 1792 -384 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -384 ) ( 1912 1800 -352 ) ( 1912 2024 -352 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1904 2024 -376 ) ( 1904 2024 -328 ) ( 1904 1968 -328 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1928 1856 -356 ) ( 1880 1856 -356 ) ( 1928 1856 -388 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3123 +{ +( 1928 1964 -384 ) ( 1880 1964 -384 ) ( 1880 1884 -384 ) subway/1_tile_graf4 32 56 0 0.500000 0.500000 0 352321536 0 +( 1880 1884 -352 ) ( 1880 1964 -352 ) ( 1928 1964 -352 ) subway/1_tile_graf4 32 56 0 0.500000 0.500000 0 352321536 0 +( 1880 1916 -356 ) ( 1928 1916 -356 ) ( 1928 1916 -388 ) subway/1_tile_graf4 32 8 0 0.500000 0.500000 0 352321536 0 +( 1912 1884 -356 ) ( 1912 1964 -356 ) ( 1912 1964 -388 ) subway/1_tile_graf5 -56 0 0 0.500000 0.500000 0 352321536 0 +( 1928 1948 -356 ) ( 1880 1948 -356 ) ( 1880 1948 -388 ) subway/1_tile_graf4 32 8 0 0.500000 0.500000 0 352321536 0 +( 1904 1960 -356 ) ( 1904 1880 -356 ) ( 1904 1880 -388 ) subway/1_tile_graf4 -56 8 0 0.500000 0.500000 0 352321536 0 +} +// brush 3124 +{ +( 2056 2184 -464 ) ( 2032 2184 -464 ) ( 2032 2160 -464 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2032 2160 -448 ) ( 2032 2184 -448 ) ( 2056 2184 -448 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2032 2248 -416 ) ( 2056 2248 -416 ) ( 2056 2248 -464 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2072 2280 -416 ) ( 2072 2280 -464 ) ( 2072 2096 -464 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2048 2280 -464 ) ( 2048 2280 -416 ) ( 2040 2280 -416 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2044 2280 -464 ) ( 2044 2280 -416 ) ( 2044 2224 -416 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3125 +{ +( 2044 2280 -424 ) ( 2044 2280 -376 ) ( 2044 2224 -376 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2048 2280 -432 ) ( 2048 2280 -384 ) ( 2040 2280 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2072 2280 -376 ) ( 2072 2280 -424 ) ( 2072 2096 -424 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2032 2248 -376 ) ( 2056 2248 -376 ) ( 2056 2248 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2032 2160 -400 ) ( 2032 2184 -400 ) ( 2056 2184 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2056 2184 -432 ) ( 2032 2184 -432 ) ( 2032 2160 -432 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3126 +{ +( 2052 2184 -448 ) ( 2028 2184 -448 ) ( 2028 2160 -448 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 2028 2160 -436 ) ( 2028 2184 -436 ) ( 2052 2184 -436 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 2028 2248 -412 ) ( 2052 2248 -412 ) ( 2052 2248 -460 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2044 2276 -412 ) ( 2044 2276 -460 ) ( 2044 2092 -460 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2044 2280 -460 ) ( 2044 2280 -412 ) ( 2036 2280 -412 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2040 2280 -440 ) ( 2040 2280 -392 ) ( 2040 2224 -392 ) subway/1_tile_graf8 16 48 0 -0.500000 0.500000 0 352321536 0 +} +// brush 3127 +{ +( 2052 2184 -436 ) ( 2028 2184 -436 ) ( 2028 2160 -436 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 2028 2160 -424 ) ( 2028 2184 -424 ) ( 2052 2184 -424 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 2028 2248 -400 ) ( 2052 2248 -400 ) ( 2052 2248 -448 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2044 2276 -400 ) ( 2044 2276 -448 ) ( 2044 2092 -448 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2044 2280 -448 ) ( 2044 2280 -400 ) ( 2036 2280 -400 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2040 2280 -428 ) ( 2040 2280 -380 ) ( 2040 2224 -380 ) subway/1_tile_graf8 16 48 0 -0.500000 0.500000 0 352321536 0 +} +// brush 3128 +{ +( 2056 2184 -448 ) ( 2032 2184 -448 ) ( 2032 2160 -448 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 2032 2160 -432 ) ( 2032 2184 -432 ) ( 2056 2184 -432 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 2032 2248 -400 ) ( 2056 2248 -400 ) ( 2056 2248 -448 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2072 2280 -400 ) ( 2072 2280 -448 ) ( 2072 2096 -448 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2280 -448 ) ( 2048 2280 -400 ) ( 2040 2280 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2044 2280 -448 ) ( 2044 2280 -400 ) ( 2044 2224 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3129 +{ +( 2040 2280 -464 ) ( 2040 2280 -416 ) ( 2040 2224 -416 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2044 2280 -464 ) ( 2044 2280 -416 ) ( 2036 2280 -416 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2044 2276 -416 ) ( 2044 2276 -464 ) ( 2044 2092 -464 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2028 2248 -416 ) ( 2052 2248 -416 ) ( 2052 2248 -464 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2028 2160 -456 ) ( 2028 2184 -456 ) ( 2052 2184 -456 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2052 2184 -464 ) ( 2028 2184 -464 ) ( 2028 2160 -464 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3130 +{ +( 2040 2280 -448 ) ( 2040 2280 -400 ) ( 2040 2224 -400 ) subway/1_tile_graf8 16 48 0 -0.500000 0.500000 0 352321536 0 +( 2044 2280 -468 ) ( 2044 2280 -420 ) ( 2036 2280 -420 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2044 2276 -420 ) ( 2044 2276 -468 ) ( 2044 2092 -468 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2028 2248 -420 ) ( 2052 2248 -420 ) ( 2052 2248 -468 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2028 2160 -444 ) ( 2028 2184 -444 ) ( 2052 2184 -444 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 2052 2184 -456 ) ( 2028 2184 -456 ) ( 2028 2160 -456 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3131 +{ +( 2052 2184 -424 ) ( 2028 2184 -424 ) ( 2028 2160 -424 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2028 2160 -400 ) ( 2028 2184 -400 ) ( 2052 2184 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2028 2248 -376 ) ( 2052 2248 -376 ) ( 2052 2248 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2044 2276 -376 ) ( 2044 2276 -424 ) ( 2044 2092 -424 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2044 2280 -432 ) ( 2044 2280 -384 ) ( 2036 2280 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2040 2280 -424 ) ( 2040 2280 -376 ) ( 2040 2224 -376 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3132 +{ +( 2040 2280 -408 ) ( 2040 2280 -392 ) ( 2040 2224 -392 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2280 -408 ) ( 2048 2280 -392 ) ( 2040 2280 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2072 2280 -392 ) ( 2072 2280 -408 ) ( 2072 2096 -408 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2032 2248 -392 ) ( 2056 2248 -392 ) ( 2056 2248 -440 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2032 2160 -392 ) ( 2032 2184 -392 ) ( 2056 2184 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2056 2184 -400 ) ( 2032 2184 -400 ) ( 2032 2160 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3133 +{ +( 2072 1968 -512 ) ( 2072 1960 -512 ) ( 2072 1960 -544 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2080 2048 -512 ) ( 2080 2056 -512 ) ( 2080 2056 -544 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1580 1992 -512 ) ( 1964 1992 -512 ) ( 1964 1992 -544 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1456 1984 -448 ) ( 1456 1992 -448 ) ( 1840 1992 -448 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2084 2336 -460 ) ( 2056 2336 -460 ) ( 2056 2292 -460 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2084 2448 -436 ) ( 2056 2448 -436 ) ( 2084 2448 -452 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3134 +{ +( 2072 1968 -512 ) ( 2072 1960 -512 ) ( 2072 1960 -544 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1864 2440 -512 ) ( 1480 2440 -512 ) ( 1480 2440 -544 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2080 1984 -512 ) ( 2080 1992 -512 ) ( 2080 1992 -544 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1580 1992 -512 ) ( 1964 1992 -512 ) ( 1964 1992 -544 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1848 1992 -464 ) ( 1464 1992 -464 ) ( 1464 1984 -464 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2056 2336 -460 ) ( 2084 2336 -460 ) ( 2056 2292 -460 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3135 +{ +( 2072 1968 -496 ) ( 2072 1960 -496 ) ( 2072 1960 -528 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2080 2048 -496 ) ( 2080 2056 -496 ) ( 2080 2056 -528 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1580 1992 -496 ) ( 1964 1992 -496 ) ( 1964 1992 -528 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1456 1984 -432 ) ( 1456 1992 -432 ) ( 1840 1992 -432 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 1848 1992 -448 ) ( 1464 1992 -448 ) ( 1464 1984 -448 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 2084 2448 -436 ) ( 2056 2448 -436 ) ( 2084 2448 -452 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3136 +{ +( 2072 1968 -472 ) ( 2072 1960 -472 ) ( 2072 1960 -504 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2080 2048 -480 ) ( 2080 2056 -480 ) ( 2080 2056 -512 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1580 1992 -472 ) ( 1964 1992 -472 ) ( 1964 1992 -504 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1848 1992 -432 ) ( 1464 1992 -432 ) ( 1464 1984 -432 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2056 2292 -428 ) ( 2056 2336 -428 ) ( 2084 2336 -428 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2084 2448 -436 ) ( 2056 2448 -436 ) ( 2084 2448 -452 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3137 +{ +( 2072 1968 -472 ) ( 2072 1960 -472 ) ( 2072 1960 -504 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1864 2440 -472 ) ( 1480 2440 -472 ) ( 1480 2440 -504 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2080 1984 -480 ) ( 2080 1992 -480 ) ( 2080 1992 -512 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1580 1992 -472 ) ( 1964 1992 -472 ) ( 1964 1992 -504 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1456 1984 -400 ) ( 1456 1992 -400 ) ( 1840 1992 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2056 2336 -428 ) ( 2056 2292 -428 ) ( 2084 2336 -428 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3138 +{ +( 2232 1880 -272 ) ( 2232 1856 -272 ) ( 2232 1856 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2248 1880 -272 ) ( 2232 1880 -272 ) ( 2232 1880 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2248 1856 -272 ) ( 2248 1880 -272 ) ( 2248 1880 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2232 1864 -272 ) ( 2248 1864 -272 ) ( 2248 1864 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2232 1856 -272 ) ( 2232 1880 -272 ) ( 2248 1880 -272 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2248 1880 -276 ) ( 2232 1880 -276 ) ( 2232 1856 -276 ) subway/light_yellow 16 16 0 0.500000 0.500000 134217728 16777217 12000 +} +// brush 3139 +{ +( 1968 2136 -280 ) ( 1968 2112 -280 ) ( 1968 2112 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1984 2136 -280 ) ( 1968 2136 -280 ) ( 1968 2136 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1984 2112 -280 ) ( 1984 2136 -280 ) ( 1984 2136 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 2120 -280 ) ( 1984 2120 -280 ) ( 1984 2120 -288 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1968 2112 -280 ) ( 1968 2136 -280 ) ( 1984 2136 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1984 2136 -284 ) ( 1968 2136 -284 ) ( 1968 2112 -284 ) subway/light_yellow 0 16 0 0.500000 0.500000 134217728 16777217 10000 +} +// brush 3140 +{ +( 2160 2048 -392 ) ( 2160 2016 -392 ) ( 2160 2016 -400 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2288 2184 -392 ) ( 2192 2184 -392 ) ( 2192 2184 -400 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2328 2024 -392 ) ( 2328 2056 -392 ) ( 2328 2056 -400 ) subway/1_stair_top1 -16 16 0 0.500000 0.500000 0 285212672 0 +( 2176 1792 -392 ) ( 2272 1792 -392 ) ( 2272 1792 -400 ) subway/1_stair_top1 0 16 0 0.500000 0.500000 0 285212672 0 +( 2176 2016 -384 ) ( 2176 2048 -384 ) ( 2272 2048 -384 ) subway/1_concrete_floor 32 16 0 0.500000 0.500000 0 285212672 0 +( 2280 2048 -400 ) ( 2184 2048 -400 ) ( 2184 2016 -400 ) subway/1_stair_top1 0 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3141 +{ +( 2320 1912 -280 ) ( 2224 1912 -280 ) ( 2224 1880 -280 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2224 1880 -272 ) ( 2224 1912 -272 ) ( 2320 1912 -272 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 2216 1792 -432 ) ( 2312 1792 -432 ) ( 2312 1792 -440 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2288 1888 -432 ) ( 2288 1920 -432 ) ( 2288 1920 -440 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2328 1824 -432 ) ( 2232 1824 -432 ) ( 2232 1824 -440 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 2192 1912 -432 ) ( 2192 1880 -432 ) ( 2192 1880 -440 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 3142 +{ +( 2032 1912 -280 ) ( 1936 1912 -280 ) ( 1936 1880 -280 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 1936 1880 -272 ) ( 1936 1912 -272 ) ( 2032 1912 -272 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1928 1792 -432 ) ( 2024 1792 -432 ) ( 2024 1792 -440 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2160 1880 -432 ) ( 2160 1912 -432 ) ( 2160 1912 -440 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2024 1928 -432 ) ( 1928 1928 -432 ) ( 1928 1928 -440 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1904 1912 -432 ) ( 1904 1880 -432 ) ( 1904 1880 -440 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 3143 +{ +( 2192 1904 -352 ) ( 2192 1928 -352 ) ( 2168 1928 -352 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2168 1928 -344 ) ( 2192 1928 -344 ) ( 2192 1904 -344 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2152 1936 -352 ) ( 2152 1936 -344 ) ( 2160 1928 -344 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2152 1960 -352 ) ( 2152 1960 -344 ) ( 2152 1936 -344 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2152 1960 -344 ) ( 2152 1960 -352 ) ( 2160 1960 -352 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2160 1784 -344 ) ( 2160 1840 -344 ) ( 2160 1840 -360 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3144 +{ +( 2168 1968 -312 ) ( 2168 1968 -280 ) ( 2168 1992 -280 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2152 1992 -280 ) ( 2152 1992 -312 ) ( 2160 1992 -312 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2152 1984 -312 ) ( 2152 1984 -280 ) ( 2152 1960 -280 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2160 1960 -280 ) ( 2160 1960 -312 ) ( 2152 1960 -312 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2168 1952 -280 ) ( 2192 1952 -280 ) ( 2192 1928 -280 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2192 1928 -312 ) ( 2192 1952 -312 ) ( 2168 1952 -312 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3145 +{ +( 2104 1928 -328 ) ( 2160 1928 -328 ) ( 2160 1928 -376 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2152 1936 -352 ) ( 2152 1936 -384 ) ( 2160 1928 -384 ) subway/1_tile -48 16 0 0.500000 0.500000 0 318767104 0 +( 2152 1936 -384 ) ( 2152 1936 -352 ) ( 2048 1936 -352 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -384 ) ( 2048 1936 -352 ) ( 2040 1928 -352 ) subway/1_tile -48 16 0 0.500000 0.500000 0 318767104 0 +( 2040 1920 -352 ) ( 2040 1896 -352 ) ( 2016 1896 -352 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +( 2016 1896 -384 ) ( 2040 1896 -384 ) ( 2040 1920 -384 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +} +// brush 3146 +{ +( 2016 1896 -352 ) ( 2040 1896 -352 ) ( 2040 1920 -352 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2040 1920 -344 ) ( 2040 1896 -344 ) ( 2016 1896 -344 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -352 ) ( 2048 1936 -344 ) ( 2040 1928 -344 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2152 1936 -352 ) ( 2152 1936 -344 ) ( 2048 1936 -344 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2152 1936 -344 ) ( 2152 1936 -352 ) ( 2160 1928 -352 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2104 1928 -344 ) ( 2160 1928 -344 ) ( 2160 1928 -360 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3147 +{ +( 2232 1928 -408 ) ( 2232 1928 -360 ) ( 2256 1928 -360 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2152 1936 -280 ) ( 2152 1936 -344 ) ( 2160 1928 -344 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 2152 1936 -344 ) ( 2152 1936 -280 ) ( 2048 1936 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -344 ) ( 2048 1936 -280 ) ( 2040 1928 -280 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 2184 1864 -280 ) ( 2184 1840 -280 ) ( 2160 1840 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2160 1832 -344 ) ( 2184 1832 -344 ) ( 2184 1856 -344 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3148 +{ +( 2048 2128 -408 ) ( 2048 2128 -360 ) ( 2048 2152 -360 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2128 2056 -408 ) ( 2128 2056 -360 ) ( 2104 2056 -360 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2032 2056 -296 ) ( 2032 2024 -296 ) ( 2032 2024 -344 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2112 2024 -408 ) ( 2112 2024 -360 ) ( 2136 2024 -360 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2032 2024 -296 ) ( 2032 2056 -296 ) ( 2048 2056 -296 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 2144 2080 -344 ) ( 2144 2104 -344 ) ( 2120 2104 -344 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3149 +{ +( 1800 2544 -224 ) ( 1784 2544 -224 ) ( 1784 2528 -224 ) subway/light_yellow 16 0 0 0.500000 0.500000 0 16777217 10000 +( 1784 2528 -216 ) ( 1784 2544 -216 ) ( 1800 2544 -216 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 1784 2528 -224 ) ( 1800 2528 -224 ) ( 1800 2528 -240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 1800 2528 -224 ) ( 1800 2544 -224 ) ( 1800 2544 -240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 1800 2544 -224 ) ( 1784 2544 -224 ) ( 1784 2544 -240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 1784 2544 -224 ) ( 1784 2528 -224 ) ( 1784 2528 -240 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3150 +{ +( 1904 2456 -264 ) ( 1896 2448 -264 ) ( 2216 2448 -264 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1848 2384 -256 ) ( 1848 2360 -256 ) ( 1824 2360 -256 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1880 2456 -336 ) ( 1880 2456 -256 ) ( 1888 2448 -256 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1928 2456 -256 ) ( 1928 2456 -336 ) ( 2256 2456 -336 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 905 +( 2152 2448 -264 ) ( 2152 2448 -256 ) ( 2160 2456 -256 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2152 2448 -256 ) ( 2152 2448 -264 ) ( 1888 2448 -264 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3151 +{ +( 1904 2456 -320 ) ( 1896 2448 -320 ) ( 2216 2448 -320 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +( 1856 2384 -264 ) ( 1856 2360 -264 ) ( 1832 2360 -264 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +( 1880 2456 -336 ) ( 1880 2456 -256 ) ( 1888 2448 -256 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 1928 2456 -256 ) ( 1928 2456 -336 ) ( 2256 2456 -336 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 905 +( 2152 2448 -320 ) ( 2152 2448 -264 ) ( 2160 2456 -264 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 2152 2448 -264 ) ( 2152 2448 -320 ) ( 1888 2448 -320 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3152 +{ +( 1692 2448 -328 ) ( 1692 2432 -328 ) ( 1692 2432 -336 ) subway/bars2 32 16 0 0.500000 0.500000 134217728 16779264 0 +( 1832 2446 -328 ) ( 1680 2446 -328 ) ( 1680 2446 -336 ) subway/bars2 32 16 0 0.500000 0.500000 134217728 16779264 0 +( 1876 2432 -328 ) ( 1876 2448 -328 ) ( 1876 2448 -336 ) subway/bars2 32 16 0 0.500000 0.500000 134217728 16779264 0 +( 1776 2442 -328 ) ( 1928 2442 -328 ) ( 1928 2442 -336 ) subway/bars2 32 16 0 0.500000 0.500000 134217728 16779264 0 +( 1696 2432 -308 ) ( 1696 2448 -308 ) ( 1848 2448 -308 ) subway/bars2 32 16 0 0.500000 0.500000 134217728 16779264 0 +( 1840 2448 -336 ) ( 1688 2448 -336 ) ( 1688 2432 -336 ) subway/bars2 32 16 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 3153 +{ +( 1840 2448 -308 ) ( 1688 2448 -308 ) ( 1688 2432 -308 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 1696 2432 -304 ) ( 1696 2448 -304 ) ( 1848 2448 -304 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 1720 2440 -316 ) ( 1872 2440 -316 ) ( 1872 2440 -324 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 1880 2432 -316 ) ( 1880 2448 -316 ) ( 1880 2448 -324 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 1832 2448 -316 ) ( 1680 2448 -316 ) ( 1680 2448 -324 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 1688 2448 -316 ) ( 1688 2432 -316 ) ( 1688 2432 -324 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 3154 +{ +( 1896 2456 -336 ) ( 1888 2448 -336 ) ( 2208 2448 -336 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1856 2384 -320 ) ( 1856 2360 -320 ) ( 1832 2360 -320 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2456 -352 ) ( 1880 2456 -272 ) ( 1888 2448 -272 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1928 2456 -272 ) ( 1928 2456 -352 ) ( 2256 2456 -352 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 905 +( 2152 2448 -336 ) ( 2152 2448 -320 ) ( 2160 2456 -320 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2152 2448 -320 ) ( 2152 2448 -336 ) ( 1888 2448 -336 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3155 +{ +( 1816 2456 -344 ) ( 1688 2456 -344 ) ( 1688 2456 -352 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1824 2656 -456 ) ( 1824 3040 -456 ) ( 1824 3040 -488 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1688 2440 -344 ) ( 1816 2440 -344 ) ( 1816 2440 -352 ) subway/metal2 16 16 0 0.500000 0.500000 0 16777216 0 +( 1688 2940 -456 ) ( 1688 2556 -456 ) ( 1688 2556 -488 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1816 2440 -344 ) ( 1688 2440 -344 ) ( 1688 2448 -344 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1568 2680 -352 ) ( 1568 3064 -352 ) ( 1560 3064 -352 ) subway/metalrib1 0 8 90 0.500000 0.500000 0 16777216 0 +} +// brush 3156 +{ +( 1880 2448 -344 ) ( 1816 2448 -344 ) ( 1816 2448 -392 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2656 -456 ) ( 1880 3040 -456 ) ( 1880 3040 -488 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1824 2440 -344 ) ( 1888 2440 -344 ) ( 1888 2440 -392 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1824 2940 -456 ) ( 1824 2556 -456 ) ( 1824 2556 -488 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2440 -344 ) ( 1816 2440 -344 ) ( 1816 2448 -344 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1632 2672 -392 ) ( 1632 3056 -392 ) ( 1624 3056 -392 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3157 +{ +( 1912 2056 -440 ) ( 1912 2024 -440 ) ( 1912 2024 -448 ) subway/1_stair_top1 -16 16 0 0.500000 0.500000 0 285212672 0 +( 2032 2056 -440 ) ( 1936 2056 -440 ) ( 1936 2056 -448 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2040 2032 -440 ) ( 2040 2064 -440 ) ( 2040 2064 -448 ) subway/1_stair_top1 -16 16 0 0.500000 0.500000 0 285212672 0 +( 1928 1800 -440 ) ( 2024 1800 -440 ) ( 2024 1800 -448 ) subway/1_stair_top1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1928 2024 -432 ) ( 1928 2056 -432 ) ( 2024 2056 -432 ) subway/1_concrete_floor 16 16 0 0.500000 0.500000 0 285212672 0 +( 2032 2056 -448 ) ( 1936 2056 -448 ) ( 1936 2024 -448 ) subway/1_stair_top1 0 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3158 +{ +( 1640 2672 -400 ) ( 1640 3056 -400 ) ( 1632 3056 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1624 3064 -392 ) ( 1632 3064 -392 ) ( 1632 2680 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1824 2940 -464 ) ( 1824 2556 -464 ) ( 1824 2556 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1632 2440 -464 ) ( 1640 2440 -464 ) ( 1640 2440 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2080 2656 -464 ) ( 2080 3040 -464 ) ( 2080 3040 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1616 2448 -464 ) ( 1608 2448 -464 ) ( 1608 2448 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3159 +{ +( 1808 2456 -336 ) ( 1816 2456 -336 ) ( 1808 2456 -448 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1800 1956 -384 ) ( 1800 2004 -384 ) ( 1808 2004 -384 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1624 2580 -448 ) ( 1624 2604 -448 ) ( 1504 2604 -448 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1816 2496 -440 ) ( 1816 2496 -432 ) ( 1816 2472 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1612 2904 -384 ) ( 1612 2904 -376 ) ( 1492 2904 -376 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1824 3068 -352 ) ( 1824 3068 -344 ) ( 1824 3092 -344 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 3160 +{ +( 1824 2456 -480 ) ( 1824 2456 -464 ) ( 1816 2456 -464 ) subway/metalrib1 -16 8 0 0.500000 0.500000 0 16777216 0 +( 1816 2456 -384 ) ( 1816 2440 -384 ) ( 1816 2440 -480 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1824 2440 -464 ) ( 1824 2440 -480 ) ( 1816 2440 -480 ) subway/metal2 16 16 0 0.500000 0.500000 0 16777216 0 +( 1824 2176 -480 ) ( 1824 2176 -464 ) ( 1824 2464 -464 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1816 2440 -352 ) ( 1816 2456 -352 ) ( 1824 2456 -352 ) subway/metalrib1 -16 24 0 0.500000 0.500000 0 16777216 0 +( 1824 2548 -480 ) ( 1800 2548 -480 ) ( 1800 2372 -480 ) subway/metalrib1 -16 24 0 0.500000 0.500000 0 16777216 0 +} +// brush 3161 +{ +( 1672 3268 -344 ) ( 1672 3244 -344 ) ( 1672 3244 -352 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 2012 2912 -376 ) ( 1892 2912 -376 ) ( 1892 2912 -384 ) subway/1_tunnelwall 32 32 0 0.500000 0.500000 0 301989888 0 +( 1832 2472 -432 ) ( 1832 2496 -432 ) ( 1832 2496 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1992 2780 -568 ) ( 1872 2780 -568 ) ( 1872 2756 -568 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1688 2180 -352 ) ( 1696 2180 -352 ) ( 1696 2132 -352 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1840 2904 -448 ) ( 1832 2904 -336 ) ( 1840 2904 -336 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +} +// brush 3162 +{ +( 1688 2548 -480 ) ( 1664 2548 -480 ) ( 1664 2372 -480 ) subway/metalrib1 0 24 0 0.500000 0.500000 0 16777216 0 +( 1688 2456 -384 ) ( 1688 2440 -384 ) ( 1680 2440 -384 ) subway/metalrib1 0 24 0 0.500000 0.500000 0 16777216 0 +( 1688 2440 -384 ) ( 1688 2456 -384 ) ( 1688 2456 -480 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1688 2440 -464 ) ( 1688 2440 -480 ) ( 1680 2440 -480 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1680 2728 -464 ) ( 1680 2392 -464 ) ( 1680 2392 -480 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +( 1688 2456 -480 ) ( 1688 2456 -464 ) ( 1680 2456 -464 ) subway/metalrib1 0 8 0 0.500000 0.500000 0 16777216 0 +} +// brush 3163 +{ +( 1832 2388 -488 ) ( 1832 2564 -488 ) ( 1808 2564 -488 ) subway/2_warning 0 0 0 0.500000 0.500000 0 0 0 +( 1808 2564 -480 ) ( 1832 2564 -480 ) ( 1832 2388 -480 ) subway/2_warning 0 0 0 0.500000 0.500000 0 0 0 +( 1816 2728 -480 ) ( 1816 2440 -480 ) ( 1816 2440 -496 ) subway/1_trim1 0 0 0 0.500000 0.500000 0 0 0 +( 1816 2440 -496 ) ( 1808 2440 -496 ) ( 1808 2440 -480 ) subway/2_warning 0 16 0 0.500000 0.500000 0 0 0 +( 1824 2584 -496 ) ( 1824 2584 -480 ) ( 1824 2920 -480 ) subway/2_warning 0 16 0 0.500000 0.500000 0 0 0 +( 1824 2904 -480 ) ( 1816 2904 -480 ) ( 1816 2904 -496 ) subway/2_warning 0 16 0 0.500000 0.500000 0 0 0 +} +// brush 3164 +{ +( 1360 1356 -536 ) ( 1240 1356 -536 ) ( 1240 1332 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1248 1316 -520 ) ( 1248 1340 -520 ) ( 1368 1340 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1064 1048 -520 ) ( 1064 1072 -520 ) ( 1064 1072 -528 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1048 1276 -448 ) ( 1048 1252 -448 ) ( 1048 1252 -456 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1096 1600 -264 ) ( 1040 1600 -264 ) ( 1040 1600 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1016 1888 -496 ) ( 1072 1888 -512 ) ( 1072 1888 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +} +// brush 3165 +{ +( 1360 1356 -520 ) ( 1240 1356 -520 ) ( 1240 1332 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1248 1316 -496 ) ( 1248 1340 -496 ) ( 1368 1340 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1208 1396 -552 ) ( 1328 1396 -552 ) ( 1328 1396 -560 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 1072 -504 ) ( 1064 1096 -504 ) ( 1064 1096 -512 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1384 1888 -464 ) ( 1264 1888 -464 ) ( 1264 1888 -472 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1048 1228 -432 ) ( 1048 1204 -432 ) ( 1048 1204 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1104 1600 -264 ) ( 1056 1600 -264 ) ( 1056 1600 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3166 +{ +( 1064 1716 -496 ) ( 1040 1716 -496 ) ( 1040 1540 -496 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 1040 1540 -480 ) ( 1040 1716 -480 ) ( 1064 1716 -480 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 1064 1600 -496 ) ( 1064 1600 -480 ) ( 1064 1888 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1064 1600 -480 ) ( 1064 1600 -496 ) ( 1056 1600 -496 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1048 1888 -480 ) ( 1048 1552 -480 ) ( 1048 1552 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 1888 -496 ) ( 1064 1888 -480 ) ( 1056 1888 -480 ) subway/1_tunnelwall 16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3167 +{ +( 1360 1356 -480 ) ( 1240 1356 -480 ) ( 1240 1332 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1248 1316 -448 ) ( 1248 1340 -448 ) ( 1368 1340 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1200 940 -512 ) ( 1320 940 -512 ) ( 1320 940 -520 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1064 1096 -480 ) ( 1064 1120 -480 ) ( 1064 1120 -488 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1384 1888 -424 ) ( 1264 1888 -424 ) ( 1264 1888 -432 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1048 1884 -392 ) ( 1048 1860 -392 ) ( 1048 1860 -400 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1064 1600 -264 ) ( 1032 1600 -264 ) ( 1032 1600 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3168 +{ +( 1064 1600 -448 ) ( 1056 1600 -336 ) ( 1064 1600 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1156 -352 ) ( 1072 1156 -352 ) ( 1072 1108 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1368 1756 -448 ) ( 1248 1756 -448 ) ( 1248 1732 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1440 -432 ) ( 1064 1464 -432 ) ( 1064 1464 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1388 1888 -376 ) ( 1268 1888 -376 ) ( 1268 1888 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1048 2244 -344 ) ( 1048 2220 -344 ) ( 1048 2220 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3169 +{ +( 2112 1912 -280 ) ( 2112 1928 -296 ) ( 2048 1928 -296 ) subway/light_square 0 16 0 0.500000 0.500000 134217728 16777217 8000 +( 2048 1912 -280 ) ( 2048 1928 -280 ) ( 2112 1928 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2048 1928 -280 ) ( 2048 1928 -296 ) ( 2112 1928 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2112 1928 -280 ) ( 2112 1928 -296 ) ( 2112 1912 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2096 1912 -296 ) ( 2096 1928 -296 ) ( 2096 1928 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3170 +{ +( 2024 1968 -280 ) ( 2040 1968 -296 ) ( 2040 2032 -296 ) subway/light_square 16 0 0 0.500000 0.500000 134217728 16777217 8000 +( 2024 2032 -280 ) ( 2040 2032 -280 ) ( 2040 1968 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2040 2032 -280 ) ( 2040 2032 -296 ) ( 2040 1968 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2040 1968 -280 ) ( 2040 1968 -296 ) ( 2024 1968 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2024 1984 -296 ) ( 2040 1984 -296 ) ( 2040 1984 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3171 +{ +( 2032 2048 -280 ) ( 1936 2048 -280 ) ( 1936 2016 -280 ) subway/1_tile_big 17 17 0 0.500000 -0.500000 0 318767104 901 +( 1936 2016 -272 ) ( 1936 2048 -272 ) ( 2032 2048 -272 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1928 1928 -432 ) ( 2024 1928 -432 ) ( 2024 1928 -440 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2048 2016 -432 ) ( 2048 2048 -432 ) ( 2048 2048 -440 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2024 2184 -432 ) ( 1928 2184 -432 ) ( 1928 2184 -440 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1904 2048 -432 ) ( 1904 2016 -432 ) ( 1904 2016 -440 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 3172 +{ +( 2424 1912 -344 ) ( 2424 1936 -344 ) ( 2400 1936 -344 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2392 1936 -232 ) ( 2416 1936 -232 ) ( 2416 1912 -232 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2320 1800 -344 ) ( 2320 1800 -280 ) ( 2328 1792 -280 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 2320 1984 -344 ) ( 2320 1984 -232 ) ( 2320 1800 -232 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2320 1960 -232 ) ( 2320 1960 -344 ) ( 2328 1960 -344 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1984 -232 ) ( 2328 1984 -344 ) ( 2328 1792 -344 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3173 +{ +( 2328 1984 -344 ) ( 2328 1984 -352 ) ( 2328 1792 -352 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2328 1984 -352 ) ( 2328 1984 -344 ) ( 2320 1992 -344 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2320 1800 -344 ) ( 2320 1800 -352 ) ( 2320 1912 -352 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2320 1800 -352 ) ( 2320 1800 -344 ) ( 2328 1792 -344 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 2336 1792 -344 ) ( 2360 1792 -344 ) ( 2360 1768 -344 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2360 1768 -352 ) ( 2360 1792 -352 ) ( 2336 1792 -352 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3174 +{ +( 2104 1928 -352 ) ( 2160 1928 -352 ) ( 2160 1928 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2160 1904 -352 ) ( 2160 1912 -352 ) ( 2160 1912 -400 ) subway/1_tile_middle -16 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -384 ) ( 2048 1936 -400 ) ( 2160 1936 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -400 ) ( 2048 1936 -384 ) ( 2040 1928 -384 ) subway/1_tile_middle -16 0 0 0.500000 0.500000 0 318767104 0 +( 2040 1920 -384 ) ( 2040 1896 -384 ) ( 2016 1896 -384 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2016 1896 -400 ) ( 2040 1896 -400 ) ( 2040 1920 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3175 +{ +( 2016 1896 -416 ) ( 2040 1896 -416 ) ( 2040 1920 -416 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +( 2040 1920 -400 ) ( 2040 1896 -400 ) ( 2016 1896 -400 ) subway/1_tile 0 48 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -416 ) ( 2048 1936 -400 ) ( 2040 1928 -400 ) subway/1_tile -48 16 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -400 ) ( 2048 1936 -416 ) ( 2160 1936 -416 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2160 1904 -368 ) ( 2160 1912 -368 ) ( 2160 1912 -416 ) subway/1_tile -48 16 0 0.500000 0.500000 0 318767104 0 +( 2104 1928 -368 ) ( 2160 1928 -368 ) ( 2160 1928 -416 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3176 +{ +( 2104 1928 -384 ) ( 2160 1928 -384 ) ( 2160 1928 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2160 1904 -384 ) ( 2160 1912 -384 ) ( 2160 1912 -432 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -416 ) ( 2048 1936 -432 ) ( 2160 1936 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -432 ) ( 2048 1936 -416 ) ( 2040 1928 -416 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 0 318767104 0 +( 2040 1920 -416 ) ( 2040 1896 -416 ) ( 2016 1896 -416 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2016 1896 -432 ) ( 2040 1896 -432 ) ( 2040 1920 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3177 +{ +( 2048 1936 -432 ) ( 2048 1936 -416 ) ( 2048 2024 -416 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2072 2024 -384 ) ( 2064 2024 -384 ) ( 2064 2024 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2040 1840 -432 ) ( 2040 2024 -432 ) ( 2040 2024 -384 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -416 ) ( 2048 1936 -432 ) ( 2040 1928 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2056 1928 -416 ) ( 2080 1928 -416 ) ( 2080 1904 -416 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 2080 1904 -432 ) ( 2080 1928 -432 ) ( 2056 1928 -432 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3178 +{ +( 2048 1936 -400 ) ( 2048 1936 -384 ) ( 2048 2024 -384 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2072 2024 -352 ) ( 2064 2024 -352 ) ( 2064 2024 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2040 1840 -400 ) ( 2040 2024 -400 ) ( 2040 2024 -352 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -384 ) ( 2048 1936 -400 ) ( 2040 1928 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2056 1928 -384 ) ( 2080 1928 -384 ) ( 2080 1904 -384 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 2080 1904 -400 ) ( 2080 1928 -400 ) ( 2056 1928 -400 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3179 +{ +( 2080 1904 -416 ) ( 2080 1928 -416 ) ( 2056 1928 -416 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2056 1928 -400 ) ( 2080 1928 -400 ) ( 2080 1904 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -400 ) ( 2048 1936 -416 ) ( 2040 1928 -416 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2040 1840 -416 ) ( 2040 2024 -416 ) ( 2040 2024 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2072 2024 -368 ) ( 2064 2024 -368 ) ( 2064 2024 -416 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -416 ) ( 2048 1936 -400 ) ( 2048 2024 -400 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3180 +{ +( 2048 1936 -352 ) ( 2048 1936 -344 ) ( 2048 2024 -344 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2072 2024 -344 ) ( 2064 2024 -344 ) ( 2064 2024 -360 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2040 1840 -360 ) ( 2040 2024 -360 ) ( 2040 2024 -344 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -344 ) ( 2048 1936 -352 ) ( 2040 1928 -352 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2056 1928 -344 ) ( 2080 1928 -344 ) ( 2080 1904 -344 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2080 1904 -352 ) ( 2080 1928 -352 ) ( 2056 1928 -352 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3181 +{ +( 2080 1904 -384 ) ( 2080 1928 -384 ) ( 2056 1928 -384 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2056 1928 -352 ) ( 2080 1928 -352 ) ( 2080 1904 -352 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -352 ) ( 2048 1936 -384 ) ( 2040 1928 -384 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2040 1840 -376 ) ( 2040 2024 -376 ) ( 2040 2024 -328 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2072 2024 -328 ) ( 2064 2024 -328 ) ( 2064 2024 -376 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -384 ) ( 2048 1936 -352 ) ( 2048 2024 -352 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3182 +{ +( 2144 2048 -344 ) ( 2144 2072 -344 ) ( 2120 2072 -344 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 2112 2072 -280 ) ( 2136 2072 -280 ) ( 2136 2048 -280 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -280 ) ( 2048 1936 -344 ) ( 2040 1928 -344 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2040 2232 -408 ) ( 2040 2232 -360 ) ( 2040 2208 -360 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2128 2024 -408 ) ( 2128 2024 -360 ) ( 2104 2024 -360 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2048 1936 -344 ) ( 2048 1936 -280 ) ( 2048 2024 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3183 +{ +( 1880 2152 -376 ) ( 1880 2128 -376 ) ( 1880 2128 -424 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1840 2440 -376 ) ( 1816 2440 -376 ) ( 1816 2440 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1912 2240 -376 ) ( 1912 2264 -376 ) ( 1912 2264 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1816 2056 -376 ) ( 1840 2056 -376 ) ( 1840 2056 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1808 2176 -368 ) ( 1808 2200 -368 ) ( 1832 2200 -368 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1832 2200 -392 ) ( 1808 2200 -392 ) ( 1808 2176 -392 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3184 +{ +( 2096 1800 -280 ) ( 2096 1800 -296 ) ( 2096 1816 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2112 1816 -296 ) ( 2112 1800 -296 ) ( 2112 1800 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2112 1800 -296 ) ( 2048 1800 -296 ) ( 2048 1800 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2112 1800 -280 ) ( 2048 1800 -280 ) ( 2048 1816 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2048 1800 -296 ) ( 2112 1800 -296 ) ( 2112 1816 -280 ) subway/light_square 0 16 0 0.500000 0.500000 134217728 16777217 8000 +} +// brush 3185 +{ +( 1912 2032 -296 ) ( 1912 1968 -296 ) ( 1928 1968 -280 ) subway/light_square 16 0 0 0.500000 0.500000 134217728 16777217 8000 +( 1912 1968 -280 ) ( 1912 2032 -280 ) ( 1928 2032 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1912 1968 -296 ) ( 1912 2032 -296 ) ( 1912 2032 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1928 1968 -296 ) ( 1912 1968 -296 ) ( 1912 1968 -280 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1912 1984 -280 ) ( 1912 1984 -296 ) ( 1928 1984 -296 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3186 +{ +( 2144 2080 -296 ) ( 2144 2104 -296 ) ( 2120 2104 -296 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 902 +( 2112 2104 -280 ) ( 2136 2104 -280 ) ( 2136 2080 -280 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 2112 2024 -392 ) ( 2112 2024 -344 ) ( 2136 2024 -344 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1904 2264 -392 ) ( 1904 2264 -344 ) ( 1904 2240 -344 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2128 2056 -392 ) ( 2128 2056 -344 ) ( 2104 2056 -344 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2048 2128 -392 ) ( 2048 2128 -344 ) ( 2048 2152 -344 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3187 +{ +( 1904 2056 -360 ) ( 1904 2032 -360 ) ( 1904 2032 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1848 2056 -360 ) ( 1824 2056 -360 ) ( 1824 2056 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1920 2024 -296 ) ( 1920 2056 -296 ) ( 1920 2056 -344 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1816 2024 -360 ) ( 1840 2024 -360 ) ( 1840 2024 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1920 2056 -296 ) ( 1920 2024 -296 ) ( 1904 2024 -296 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1832 2104 -344 ) ( 1808 2104 -344 ) ( 1808 2080 -344 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3188 +{ +( 1968 2336 -316 ) ( 1968 2304 -316 ) ( 1968 2304 -380 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1988 2348 -316 ) ( 1964 2348 -316 ) ( 1964 2348 -380 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1984 2304 -316 ) ( 1984 2336 -316 ) ( 1984 2336 -380 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1964 2304 -316 ) ( 1988 2304 -316 ) ( 1988 2304 -380 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1964 2304 -376 ) ( 1964 2336 -376 ) ( 1988 2336 -376 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1988 2336 -380 ) ( 1964 2336 -380 ) ( 1964 2304 -380 ) subway/light_tube 0 0 90 0.500000 0.500000 134217728 16777217 7000 +} +// brush 3189 +{ +( 1968 2248 -316 ) ( 1968 2216 -316 ) ( 1968 2216 -380 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1988 2248 -316 ) ( 1964 2248 -316 ) ( 1964 2248 -380 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1984 2216 -316 ) ( 1984 2248 -316 ) ( 1984 2248 -380 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1964 2204 -316 ) ( 1988 2204 -316 ) ( 1988 2204 -380 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1964 2216 -376 ) ( 1964 2248 -376 ) ( 1988 2248 -376 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1988 2248 -380 ) ( 1964 2248 -380 ) ( 1964 2216 -380 ) subway/light_tube 72 0 90 0.500000 0.500000 134217728 16777217 7000 +} +// brush 3190 +{ +( 1816 2380 -520 ) ( 1816 2348 -520 ) ( 1816 2348 -536 ) subway/light_red -24 16 0 0.500000 0.500000 0 16777217 10000 +( 1824 2364 -520 ) ( 1800 2364 -520 ) ( 1800 2364 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1824 2348 -520 ) ( 1824 2380 -520 ) ( 1824 2380 -536 ) subway/light_red -24 16 0 0.500000 0.500000 0 16777217 30000 +( 1808 2348 -520 ) ( 1832 2348 -520 ) ( 1832 2348 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1800 2348 -520 ) ( 1800 2380 -520 ) ( 1824 2380 -520 ) subway/light_red 0 24 0 0.500000 0.500000 0 16777217 30000 +( 1824 2380 -536 ) ( 1800 2380 -536 ) ( 1800 2348 -536 ) subway/light_red 0 24 0 0.500000 0.500000 0 16777217 30000 +} +// brush 3191 +{ +( 1688 1840 -536 ) ( 1664 1840 -536 ) ( 1664 1808 -536 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +( 1664 1808 -520 ) ( 1664 1840 -520 ) ( 1688 1840 -520 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 30000 +( 1676 1808 -520 ) ( 1700 1808 -520 ) ( 1700 1808 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1688 1808 -520 ) ( 1688 1840 -520 ) ( 1688 1840 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 10000 +( 1680 1824 -520 ) ( 1656 1824 -520 ) ( 1656 1824 -536 ) subway/light_red 0 16 0 0.500000 0.500000 0 16777217 30000 +( 1680 1832 -520 ) ( 1680 1800 -520 ) ( 1680 1800 -536 ) subway/light_red -16 16 0 0.500000 0.500000 0 16777217 10000 +} +// brush 3192 +{ +( 1800 2440 -488 ) ( 1816 2440 -536 ) ( 1816 2440 -488 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1632 1960 -536 ) ( 1632 1984 -536 ) ( 1512 1984 -536 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1504 1968 -520 ) ( 1624 1968 -520 ) ( 1624 1944 -520 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1816 2480 -528 ) ( 1816 2480 -520 ) ( 1816 2456 -520 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1824 1800 -456 ) ( 1824 1800 -448 ) ( 1824 1824 -448 ) subway/con6 0 48 0 0.500000 0.500000 0 285212672 0 +( 1800 2364 -520 ) ( 1824 2364 -520 ) ( 1800 2364 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3193 +{ +( 1632 1960 -536 ) ( 1632 1984 -536 ) ( 1512 1984 -536 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1504 1968 -520 ) ( 1624 1968 -520 ) ( 1624 1944 -520 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1816 2480 -528 ) ( 1816 2480 -520 ) ( 1816 2456 -520 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1824 1800 -456 ) ( 1824 1800 -448 ) ( 1824 1824 -448 ) subway/con6 0 48 0 0.500000 0.500000 0 285212672 0 +( 1800 2176 -520 ) ( 1824 2176 -520 ) ( 1800 2176 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +( 1828 2348 -520 ) ( 1804 2348 -520 ) ( 1828 2348 -536 ) subway/con6 32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3194 +{ +( 1882 2432 -408 ) ( 1874 2432 -408 ) ( 1874 2416 -408 ) subway/1_black -4 0 0 0.500000 0.500000 0 16777216 0 +( 1874 2416 -392 ) ( 1874 2432 -392 ) ( 1882 2432 -392 ) subway/1_black -4 0 0 0.500000 0.500000 0 16777216 0 +( 1874 2416 -392 ) ( 1882 2416 -392 ) ( 1882 2416 -408 ) subway/1_black -4 0 0 0.500000 0.500000 0 16777216 0 +( 1888 2416 -392 ) ( 1888 2432 -392 ) ( 1888 2432 -408 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1882 2432 -392 ) ( 1874 2432 -392 ) ( 1874 2432 -408 ) subway/1_black -4 0 0 0.500000 0.500000 0 16777216 0 +( 1880 2280 -392 ) ( 1880 2264 -392 ) ( 1880 2264 -408 ) subway/light_yellow 0 16 0 0.500000 0.500000 0 16777217 8000 +} +// brush 3195 +{ +( 2040 2088 -480 ) ( 2040 2088 -464 ) ( 2040 2032 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2088 -480 ) ( 2048 2088 -464 ) ( 2040 2088 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2072 2088 -464 ) ( 2072 2088 -480 ) ( 2072 1904 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2032 2056 -432 ) ( 2056 2056 -432 ) ( 2056 2056 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2032 1968 -464 ) ( 2032 1992 -464 ) ( 2056 1992 -464 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 2056 1992 -480 ) ( 2032 1992 -480 ) ( 2032 1968 -480 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3196 +{ +( 1896 1992 -480 ) ( 1872 1992 -480 ) ( 1872 1968 -480 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1872 1968 -464 ) ( 1872 1992 -464 ) ( 1896 1992 -464 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1872 2056 -432 ) ( 1896 2056 -432 ) ( 1896 2056 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 2088 -464 ) ( 1912 2088 -480 ) ( 1912 1904 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1888 2088 -480 ) ( 1888 2088 -464 ) ( 1880 2088 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1880 2088 -480 ) ( 1880 2088 -464 ) ( 1880 2032 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3197 +{ +( 1376 2448 -472 ) ( 1368 2448 -472 ) ( 1368 2448 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1680 2656 -472 ) ( 1680 3040 -472 ) ( 1680 3040 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 2440 -480 ) ( 1208 2440 -480 ) ( 1208 2440 -512 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1544 2940 -472 ) ( 1544 2556 -472 ) ( 1544 2556 -504 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1360 3064 -400 ) ( 1368 3064 -400 ) ( 1368 2680 -400 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 1368 2672 -416 ) ( 1368 3056 -416 ) ( 1360 3056 -416 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3198 +{ +( 1376 2448 -464 ) ( 1368 2448 -464 ) ( 1368 2448 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1680 2656 -464 ) ( 1680 3040 -464 ) ( 1680 3040 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1200 2440 -464 ) ( 1208 2440 -464 ) ( 1208 2440 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1544 2940 -464 ) ( 1544 2556 -464 ) ( 1544 2556 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1360 3064 -392 ) ( 1368 3064 -392 ) ( 1368 2680 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1368 2672 -400 ) ( 1368 3056 -400 ) ( 1360 3056 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3199 +{ +( 1376 2448 -496 ) ( 1368 2448 -496 ) ( 1368 2448 -528 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1680 2656 -496 ) ( 1680 3040 -496 ) ( 1680 3040 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1200 2440 -496 ) ( 1208 2440 -496 ) ( 1208 2440 -528 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1544 2940 -496 ) ( 1544 2556 -496 ) ( 1544 2556 -528 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1360 3064 -416 ) ( 1368 3064 -416 ) ( 1368 2680 -416 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1368 2672 -464 ) ( 1368 3056 -464 ) ( 1360 3056 -464 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3200 +{ +( 1368 2672 -480 ) ( 1368 3056 -480 ) ( 1360 3056 -480 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1360 3064 -464 ) ( 1368 3064 -464 ) ( 1368 2680 -464 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1544 2940 -528 ) ( 1544 2556 -528 ) ( 1544 2556 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1200 2440 -528 ) ( 1208 2440 -528 ) ( 1208 2440 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1680 2656 -528 ) ( 1680 3040 -528 ) ( 1680 3040 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1376 2448 -528 ) ( 1368 2448 -528 ) ( 1368 2448 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3201 +{ +( 1616 2296 -432 ) ( 1616 2680 -432 ) ( 1608 2680 -432 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1608 2688 -400 ) ( 1616 2688 -400 ) ( 1616 2304 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1824 1952 -400 ) ( 1824 1952 -432 ) ( 1816 1960 -432 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1824 1952 -432 ) ( 1824 1952 -400 ) ( 1904 1952 -400 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1896 1960 -400 ) ( 1896 1960 -432 ) ( 1904 1952 -432 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1896 1960 -432 ) ( 1896 1960 -400 ) ( 1816 1960 -400 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3202 +{ +( 1888 1960 -464 ) ( 1864 1960 -464 ) ( 1864 1936 -464 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1864 1936 -448 ) ( 1864 1960 -448 ) ( 1888 1960 -448 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1920 -448 ) ( 1904 1920 -464 ) ( 1896 1928 -464 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1904 1920 -464 ) ( 1904 1920 -448 ) ( 1904 2056 -448 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2056 -464 ) ( 1880 2056 -416 ) ( 1872 2056 -416 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2056 -464 ) ( 1880 2056 -416 ) ( 1880 2000 -416 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3203 +{ +( 1864 2200 -392 ) ( 1840 2200 -392 ) ( 1840 2176 -392 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1840 2176 -376 ) ( 1840 2200 -376 ) ( 1864 2200 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1968 2408 -376 ) ( 1992 2408 -376 ) ( 1992 2408 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2040 2336 -376 ) ( 2040 2360 -376 ) ( 2040 2360 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1872 2440 -376 ) ( 1848 2440 -376 ) ( 1848 2440 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1912 2152 -376 ) ( 1912 2128 -376 ) ( 1912 2128 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 3204 +{ +( 1816 1944 -392 ) ( 1808 1944 -392 ) ( 1808 1864 -392 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 2160 1664 -336 ) ( 2544 1664 -336 ) ( 2544 1656 -336 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 2036 1792 -496 ) ( 2036 1792 -464 ) ( 2420 1792 -464 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1816 1864 -392 ) ( 1816 1864 -400 ) ( 1816 1944 -400 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1824 1952 -360 ) ( 1840 1936 -360 ) ( 1840 1936 -336 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1832 1792 -368 ) ( 1832 1856 -368 ) ( 1832 1856 -392 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +} +// brush 3205 +{ +( 2544 1632 -464 ) ( 2544 1640 -464 ) ( 2160 1640 -464 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2168 1640 -448 ) ( 2552 1640 -448 ) ( 2552 1632 -448 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2044 1792 -544 ) ( 2044 1792 -512 ) ( 2428 1792 -512 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1816 1488 -544 ) ( 1816 1488 -512 ) ( 1816 1480 -512 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1816 1960 -464 ) ( 1824 1952 -464 ) ( 1824 1952 -448 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1824 1840 -448 ) ( 1824 1920 -448 ) ( 1824 1920 -464 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3206 +{ +( 1824 1840 -464 ) ( 1824 1920 -464 ) ( 1824 1920 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1816 1960 -480 ) ( 1824 1952 -480 ) ( 1824 1952 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1816 1488 -560 ) ( 1816 1488 -528 ) ( 1816 1480 -528 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2044 1792 -560 ) ( 2044 1792 -528 ) ( 2428 1792 -528 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2168 1640 -464 ) ( 2552 1640 -464 ) ( 2552 1632 -464 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 2544 1632 -480 ) ( 2544 1640 -480 ) ( 2160 1640 -480 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3207 +{ +( 1632 2672 -480 ) ( 1632 3056 -480 ) ( 1624 3056 -480 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1632 3064 -464 ) ( 1640 3064 -464 ) ( 1640 2680 -464 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1824 2940 -528 ) ( 1824 2556 -528 ) ( 1824 2556 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1632 2440 -528 ) ( 1640 2440 -528 ) ( 1640 2440 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2080 2656 -528 ) ( 2080 3040 -528 ) ( 2080 3040 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1616 2448 -528 ) ( 1608 2448 -528 ) ( 1608 2448 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3208 +{ +( 1616 2448 -512 ) ( 1608 2448 -512 ) ( 1608 2448 -544 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2080 2656 -512 ) ( 2080 3040 -512 ) ( 2080 3040 -544 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1632 2440 -512 ) ( 1640 2440 -512 ) ( 1640 2440 -544 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1824 2940 -512 ) ( 1824 2556 -512 ) ( 1824 2556 -544 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1632 3064 -448 ) ( 1640 3064 -448 ) ( 1640 2680 -448 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1640 2672 -464 ) ( 1640 3056 -464 ) ( 1632 3056 -464 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3209 +{ +( 1616 2448 -496 ) ( 1608 2448 -496 ) ( 1608 2448 -528 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2080 2656 -496 ) ( 2080 3040 -496 ) ( 2080 3040 -528 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1632 2440 -496 ) ( 1640 2440 -496 ) ( 1640 2440 -528 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1824 2940 -496 ) ( 1824 2556 -496 ) ( 1824 2556 -528 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1632 3064 -432 ) ( 1640 3064 -432 ) ( 1640 2680 -432 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 1640 2672 -448 ) ( 1640 3056 -448 ) ( 1632 3056 -448 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3210 +{ +( 1616 2448 -472 ) ( 1608 2448 -472 ) ( 1608 2448 -504 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2080 2656 -472 ) ( 2080 3040 -472 ) ( 2080 3040 -504 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1632 2440 -480 ) ( 1640 2440 -480 ) ( 1640 2440 -512 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1824 2940 -472 ) ( 1824 2556 -472 ) ( 1824 2556 -504 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1632 3064 -400 ) ( 1640 3064 -400 ) ( 1640 2680 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1640 2672 -432 ) ( 1640 3056 -432 ) ( 1632 3056 -432 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3211 +{ +( 1832 2136 -392 ) ( 1808 2136 -392 ) ( 1808 2112 -392 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1808 2112 -368 ) ( 1808 2136 -368 ) ( 1832 2136 -368 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1880 1944 -392 ) ( 1880 1944 -368 ) ( 1896 1928 -368 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1896 2168 -376 ) ( 1896 2192 -376 ) ( 1896 2192 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1840 2056 -376 ) ( 1816 2056 -376 ) ( 1816 2056 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1880 1936 -368 ) ( 1880 1936 -392 ) ( 1880 2056 -392 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3212 +{ +( 1848 1992 -480 ) ( 1464 1992 -480 ) ( 1464 1984 -480 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1456 1984 -464 ) ( 1456 1992 -464 ) ( 1840 1992 -464 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1580 1992 -528 ) ( 1964 1992 -528 ) ( 1964 1992 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2080 1984 -528 ) ( 2080 1992 -528 ) ( 2080 1992 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1864 2440 -528 ) ( 1480 2440 -528 ) ( 1480 2440 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2072 1968 -528 ) ( 2072 1960 -528 ) ( 2072 1960 -560 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3213 +{ +( 2072 1968 -464 ) ( 2072 1960 -464 ) ( 2072 1960 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1864 2440 -464 ) ( 1480 2440 -464 ) ( 1480 2440 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2080 1984 -464 ) ( 2080 1992 -464 ) ( 2080 1992 -496 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1580 1992 -464 ) ( 1964 1992 -464 ) ( 1964 1992 -496 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1456 1984 -392 ) ( 1456 1992 -392 ) ( 1840 1992 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1848 1992 -400 ) ( 1464 1992 -400 ) ( 1464 1984 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3214 +{ +( 1904 1960 -432 ) ( 1880 1960 -432 ) ( 1880 1936 -432 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 1936 -416 ) ( 1880 1960 -416 ) ( 1904 1960 -416 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2024 -384 ) ( 1904 2024 -384 ) ( 1904 2024 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1920 2056 -384 ) ( 1920 2056 -432 ) ( 1920 1872 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1896 2056 -432 ) ( 1896 2056 -384 ) ( 1888 2056 -384 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 2056 -432 ) ( 1912 2056 -384 ) ( 1912 2000 -384 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3215 +{ +( 1912 2056 -416 ) ( 1912 2056 -368 ) ( 1912 2000 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1896 2056 -416 ) ( 1896 2056 -368 ) ( 1888 2056 -368 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1920 2056 -368 ) ( 1920 2056 -416 ) ( 1920 1872 -416 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2024 -368 ) ( 1904 2024 -368 ) ( 1904 2024 -416 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 1936 -400 ) ( 1880 1960 -400 ) ( 1904 1960 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1960 -416 ) ( 1880 1960 -416 ) ( 1880 1936 -416 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3216 +{ +( 1904 1960 -400 ) ( 1880 1960 -400 ) ( 1880 1936 -400 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 1936 -384 ) ( 1880 1960 -384 ) ( 1904 1960 -384 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2024 -352 ) ( 1904 2024 -352 ) ( 1904 2024 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1920 2056 -352 ) ( 1920 2056 -400 ) ( 1920 1872 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1896 2056 -400 ) ( 1896 2056 -352 ) ( 1888 2056 -352 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 2056 -400 ) ( 1912 2056 -352 ) ( 1912 2000 -352 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3217 +{ +( 1904 1960 -352 ) ( 1880 1960 -352 ) ( 1880 1936 -352 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1880 1936 -344 ) ( 1880 1960 -344 ) ( 1904 1960 -344 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1880 2024 -344 ) ( 1904 2024 -344 ) ( 1904 2024 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1920 2056 -344 ) ( 1920 2056 -360 ) ( 1920 1872 -360 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1896 2056 -360 ) ( 1896 2056 -344 ) ( 1888 2056 -344 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1912 2056 -360 ) ( 1912 2056 -344 ) ( 1912 2000 -344 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3218 +{ +( 1912 2056 -376 ) ( 1912 2056 -328 ) ( 1912 2000 -328 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1896 2056 -376 ) ( 1896 2056 -328 ) ( 1888 2056 -328 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1920 2056 -328 ) ( 1920 2056 -376 ) ( 1920 1872 -376 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2024 -336 ) ( 1904 2024 -336 ) ( 1904 2024 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 1936 -352 ) ( 1880 1960 -352 ) ( 1904 1960 -352 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1960 -384 ) ( 1880 1960 -384 ) ( 1880 1936 -384 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3219 +{ +( 1904 2024 -360 ) ( 1904 2024 -344 ) ( 1904 1968 -344 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1888 2024 -360 ) ( 1888 2024 -344 ) ( 1880 2024 -344 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -352 ) ( 1912 1800 -344 ) ( 1912 2024 -344 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -344 ) ( 1912 1800 -352 ) ( 1904 1792 -352 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1872 1904 -344 ) ( 1872 1928 -344 ) ( 1896 1928 -344 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1896 1928 -352 ) ( 1872 1928 -352 ) ( 1872 1904 -352 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3220 +{ +( 1904 2024 -400 ) ( 1904 2024 -352 ) ( 1904 1968 -352 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1888 2024 -400 ) ( 1888 2024 -352 ) ( 1880 2024 -352 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -400 ) ( 1912 1800 -384 ) ( 1912 2024 -384 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -384 ) ( 1912 1800 -400 ) ( 1904 1792 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1872 1904 -384 ) ( 1872 1928 -384 ) ( 1896 1928 -384 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 1896 1928 -400 ) ( 1872 1928 -400 ) ( 1872 1904 -400 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3221 +{ +( 1896 1928 -416 ) ( 1872 1928 -416 ) ( 1872 1904 -416 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1872 1904 -400 ) ( 1872 1928 -400 ) ( 1896 1928 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -400 ) ( 1912 1800 -416 ) ( 1904 1792 -416 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -416 ) ( 1912 1800 -400 ) ( 1912 2024 -400 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2024 -416 ) ( 1888 2024 -368 ) ( 1880 2024 -368 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1904 2024 -416 ) ( 1904 2024 -368 ) ( 1904 1968 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3222 +{ +( 1904 2024 -432 ) ( 1904 2024 -384 ) ( 1904 1968 -384 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1888 2024 -432 ) ( 1888 2024 -384 ) ( 1880 2024 -384 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -432 ) ( 1912 1800 -416 ) ( 1912 2024 -416 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -416 ) ( 1912 1800 -432 ) ( 1904 1792 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1872 1904 -416 ) ( 1872 1928 -416 ) ( 1896 1928 -416 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1896 1928 -432 ) ( 1872 1928 -432 ) ( 1872 1904 -432 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3223 +{ +( 1832 2072 -344 ) ( 1808 2072 -344 ) ( 1808 2048 -344 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1816 2048 -280 ) ( 1816 2072 -280 ) ( 1840 2072 -280 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -280 ) ( 1912 1800 -344 ) ( 1904 1792 -344 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -344 ) ( 1912 1800 -280 ) ( 1912 2024 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1848 2024 -360 ) ( 1824 2024 -360 ) ( 1824 2024 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1904 2024 -360 ) ( 1904 2000 -360 ) ( 1904 2000 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3224 +{ +( 1832 2200 -376 ) ( 1808 2200 -376 ) ( 1808 2176 -376 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1816 2176 -312 ) ( 1816 2200 -312 ) ( 1840 2200 -312 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1816 2056 -360 ) ( 1840 2056 -360 ) ( 1840 2056 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2336 -360 ) ( 1912 2360 -360 ) ( 1912 2360 -408 ) subway/1_tile_big 16 17 -90 0.500000 -0.500000 0 318767104 901 +( 1848 2152 -360 ) ( 1824 2152 -360 ) ( 1824 2152 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1904 2152 -360 ) ( 1904 2128 -360 ) ( 1904 2128 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3225 +{ +( 2040 2000 -384 ) ( 2040 2056 -384 ) ( 2040 2056 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2064 2056 -384 ) ( 2056 2056 -384 ) ( 2056 2056 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2032 1872 -432 ) ( 2032 2056 -432 ) ( 2032 2056 -384 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2024 -432 ) ( 2048 2024 -384 ) ( 2072 2024 -384 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1960 -416 ) ( 2072 1960 -416 ) ( 2072 1936 -416 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 2072 1936 -432 ) ( 2072 1960 -432 ) ( 2048 1960 -432 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3226 +{ +( 2072 1936 -416 ) ( 2072 1960 -416 ) ( 2048 1960 -416 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1960 -400 ) ( 2072 1960 -400 ) ( 2072 1936 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2024 -416 ) ( 2048 2024 -368 ) ( 2072 2024 -368 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2032 1872 -416 ) ( 2032 2056 -416 ) ( 2032 2056 -368 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2064 2056 -368 ) ( 2056 2056 -368 ) ( 2056 2056 -416 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2040 2000 -368 ) ( 2040 2056 -368 ) ( 2040 2056 -416 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3227 +{ +( 2040 2000 -352 ) ( 2040 2056 -352 ) ( 2040 2056 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2064 2056 -352 ) ( 2056 2056 -352 ) ( 2056 2056 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2032 1872 -400 ) ( 2032 2056 -400 ) ( 2032 2056 -352 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2024 -400 ) ( 2048 2024 -352 ) ( 2072 2024 -352 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1960 -384 ) ( 2072 1960 -384 ) ( 2072 1936 -384 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 2072 1936 -400 ) ( 2072 1960 -400 ) ( 2048 1960 -400 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3228 +{ +( 2072 1936 -384 ) ( 2072 1960 -384 ) ( 2048 1960 -384 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1960 -352 ) ( 2072 1960 -352 ) ( 2072 1936 -352 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2024 -384 ) ( 2048 2024 -336 ) ( 2072 2024 -336 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2032 1872 -376 ) ( 2032 2056 -376 ) ( 2032 2056 -328 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2064 2056 -328 ) ( 2056 2056 -328 ) ( 2056 2056 -376 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2040 2000 -328 ) ( 2040 2056 -328 ) ( 2040 2056 -376 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3229 +{ +( 2040 2000 -344 ) ( 2040 2056 -344 ) ( 2040 2056 -360 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2064 2056 -344 ) ( 2056 2056 -344 ) ( 2056 2056 -360 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2032 1872 -360 ) ( 2032 2056 -360 ) ( 2032 2056 -344 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2024 -392 ) ( 2048 2024 -344 ) ( 2072 2024 -344 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2048 1960 -344 ) ( 2072 1960 -344 ) ( 2072 1936 -344 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2072 1936 -352 ) ( 2072 1960 -352 ) ( 2048 1960 -352 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3230 +{ +( 2104 1792 -368 ) ( 2160 1792 -368 ) ( 2160 1792 -416 ) subway/1_tile 16 16 0 0.500000 0.500000 0 318767104 0 +( 2160 1768 -368 ) ( 2160 1776 -368 ) ( 2160 1776 -416 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -400 ) ( 1912 1800 -416 ) ( 2024 1800 -416 ) subway/1_tile -48 32 0 -0.500000 0.500000 0 318767104 0 +( 1912 1800 -416 ) ( 1912 1800 -400 ) ( 1904 1792 -400 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 0 +( 1904 1784 -400 ) ( 1904 1760 -400 ) ( 1880 1760 -400 ) subway/1_tile 16 32 0 0.500000 0.500000 0 318767104 0 +( 1880 1760 -416 ) ( 1904 1760 -416 ) ( 1904 1784 -416 ) subway/1_tile 16 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3231 +{ +( 1880 2056 -480 ) ( 1880 2056 -432 ) ( 1880 2000 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1880 2056 -480 ) ( 1880 2056 -432 ) ( 1872 2056 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1920 -480 ) ( 1904 1920 -464 ) ( 1904 2056 -464 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1920 -464 ) ( 1904 1920 -480 ) ( 1896 1928 -480 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1864 1936 -464 ) ( 1864 1960 -464 ) ( 1888 1960 -464 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +( 1888 1960 -480 ) ( 1864 1960 -480 ) ( 1864 1936 -480 ) subway/1_tile_bottom 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3232 +{ +( 1880 2056 -448 ) ( 1880 2056 -400 ) ( 1880 2000 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1880 2056 -448 ) ( 1880 2056 -400 ) ( 1872 2056 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1920 -448 ) ( 1904 1920 -432 ) ( 1904 2056 -432 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1920 -432 ) ( 1904 1920 -448 ) ( 1896 1928 -448 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1864 1936 -432 ) ( 1864 1960 -432 ) ( 1888 1960 -432 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 1888 1960 -448 ) ( 1864 1960 -448 ) ( 1864 1936 -448 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3233 +{ +( 1888 1960 -432 ) ( 1864 1960 -432 ) ( 1864 1936 -432 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1864 1936 -400 ) ( 1864 1960 -400 ) ( 1888 1960 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1920 -400 ) ( 1904 1920 -432 ) ( 1896 1928 -432 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1904 1920 -432 ) ( 1904 1920 -400 ) ( 1904 2056 -400 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2056 -424 ) ( 1880 2056 -376 ) ( 1872 2056 -376 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2056 -424 ) ( 1880 2056 -376 ) ( 1880 2000 -376 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3234 +{ +( 1880 2056 -408 ) ( 1880 2056 -392 ) ( 1880 2000 -392 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1880 2056 -408 ) ( 1880 2056 -392 ) ( 1872 2056 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1920 -400 ) ( 1904 1920 -392 ) ( 1904 2056 -392 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1920 -392 ) ( 1904 1920 -400 ) ( 1896 1928 -400 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1864 1936 -392 ) ( 1864 1960 -392 ) ( 1888 1960 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1888 1960 -400 ) ( 1864 1960 -400 ) ( 1864 1936 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3235 +{ +( 2328 1792 -280 ) ( 2328 1792 -344 ) ( 1936 1792 -344 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 2328 1792 -344 ) ( 2328 1792 -280 ) ( 2320 1800 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -280 ) ( 1912 1800 -344 ) ( 2024 1800 -344 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -344 ) ( 1912 1800 -280 ) ( 1904 1792 -280 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2048 1728 -280 ) ( 2048 1704 -280 ) ( 2024 1704 -280 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +( 2024 1696 -344 ) ( 2048 1696 -344 ) ( 2048 1720 -344 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3236 +{ +( 1960 2196 -376 ) ( 1936 2196 -376 ) ( 1936 2172 -376 ) subway/con14 -16 32 0 0.500000 0.500000 0 285212672 0 +( 1936 2172 -312 ) ( 1936 2196 -312 ) ( 1960 2196 -312 ) subway/1_tile_big 0 -8 0 0.500000 0.500000 0 318767104 0 +( 1952 2168 -360 ) ( 1976 2168 -360 ) ( 1976 2168 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 901 +( 2008 2332 -360 ) ( 2008 2356 -360 ) ( 2008 2356 -408 ) subway/1_tile_big 8 16 0 0.500000 0.500000 0 318767104 0 +( 1968 2408 -360 ) ( 1944 2408 -360 ) ( 1944 2408 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1944 2144 -360 ) ( 1944 2120 -360 ) ( 1944 2120 -408 ) subway/1_tile_big 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3237 +{ +( 1912 2176 -312 ) ( 1912 2176 -376 ) ( 1912 2408 -376 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1936 2408 -360 ) ( 1912 2408 -360 ) ( 1912 2408 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1944 2336 -360 ) ( 1944 2360 -360 ) ( 1944 2360 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2168 -376 ) ( 1912 2168 -312 ) ( 1944 2168 -312 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 901 +( 1904 2176 -312 ) ( 1904 2200 -312 ) ( 1928 2200 -312 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1928 2200 -376 ) ( 1904 2200 -376 ) ( 1904 2176 -376 ) subway/con14 -16 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3238 +{ +( 1880 1760 -432 ) ( 1904 1760 -432 ) ( 1904 1784 -432 ) subway/1_tile_bottom 16 16 0 0.500000 0.500000 0 318767104 0 +( 1904 1784 -416 ) ( 1904 1760 -416 ) ( 1880 1760 -416 ) subway/1_tile_bottom 16 16 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -432 ) ( 1912 1800 -416 ) ( 1904 1792 -416 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -416 ) ( 1912 1800 -432 ) ( 2024 1800 -432 ) subway/1_tile_bottom -16 0 0 -0.500000 0.500000 0 318767104 0 +( 2160 1768 -384 ) ( 2160 1776 -384 ) ( 2160 1776 -432 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 2104 1792 -384 ) ( 2160 1792 -384 ) ( 2160 1792 -432 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3239 +{ +( 1880 1760 -400 ) ( 1904 1760 -400 ) ( 1904 1784 -400 ) subway/1_tile_middle 16 16 0 0.500000 0.500000 0 318767104 0 +( 1904 1784 -384 ) ( 1904 1760 -384 ) ( 1880 1760 -384 ) subway/1_tile_middle 16 16 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -400 ) ( 1912 1800 -384 ) ( 1904 1792 -384 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -384 ) ( 1912 1800 -400 ) ( 2024 1800 -400 ) subway/1_tile_middle -16 0 0 -0.500000 0.500000 0 318767104 0 +( 2160 1768 -352 ) ( 2160 1776 -352 ) ( 2160 1776 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2104 1792 -352 ) ( 2160 1792 -352 ) ( 2160 1792 -400 ) subway/1_tile_middle 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3240 +{ +( 1880 1760 -352 ) ( 1904 1760 -352 ) ( 1904 1784 -352 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1904 1784 -344 ) ( 1904 1760 -344 ) ( 1880 1760 -344 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -352 ) ( 1912 1800 -344 ) ( 1904 1792 -344 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1912 1800 -344 ) ( 1912 1800 -352 ) ( 2024 1800 -352 ) subway/1_tile_top -16 0 0 -0.500000 0.500000 0 318767104 0 +( 2328 1792 -352 ) ( 2328 1792 -344 ) ( 2320 1800 -344 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2328 1792 -344 ) ( 2328 1792 -352 ) ( 1936 1792 -352 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3241 +{ +( 1880 2440 -408 ) ( 1880 2440 -392 ) ( 1880 2384 -392 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1888 2416 -408 ) ( 1888 2416 -392 ) ( 1880 2416 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1912 2440 -392 ) ( 1912 2440 -408 ) ( 1912 2256 -408 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2408 -392 ) ( 1896 2408 -392 ) ( 1896 2408 -440 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2320 -392 ) ( 1872 2344 -392 ) ( 1896 2344 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 1896 2344 -400 ) ( 1872 2344 -400 ) ( 1872 2320 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3242 +{ +( 1896 2344 -464 ) ( 1872 2344 -464 ) ( 1872 2320 -464 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2320 -400 ) ( 1872 2344 -400 ) ( 1896 2344 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 1872 2408 -376 ) ( 1896 2408 -376 ) ( 1896 2408 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1912 2440 -376 ) ( 1912 2440 -424 ) ( 1912 2256 -424 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 1888 2416 -432 ) ( 1888 2416 -384 ) ( 1880 2416 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1880 2440 -424 ) ( 1880 2440 -376 ) ( 1880 2384 -376 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3243 +{ +( 1968 2200 -376 ) ( 1944 2200 -376 ) ( 1944 2176 -376 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1952 2176 -280 ) ( 1952 2200 -280 ) ( 1976 2200 -280 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1952 2056 -360 ) ( 1976 2056 -360 ) ( 1976 2056 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2048 2336 -360 ) ( 2048 2360 -360 ) ( 2048 2360 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1984 2152 -360 ) ( 1960 2152 -360 ) ( 1960 2152 -408 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2040 2152 -360 ) ( 2040 2128 -360 ) ( 2040 2128 -408 ) subway/1_tile_big 16 17 -90 0.500000 -0.500000 0 318767104 901 +} +// brush 3244 +{ +( 2048 2176 -376 ) ( 2048 2200 -376 ) ( 2024 2200 -376 ) subway/con14 -16 32 0 0.500000 0.500000 0 285212672 0 +( 2024 2200 -312 ) ( 2048 2200 -312 ) ( 2048 2176 -312 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 2040 2168 -312 ) ( 2040 2168 -376 ) ( 2008 2168 -376 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 901 +( 2008 2360 -408 ) ( 2008 2360 -360 ) ( 2008 2336 -360 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2040 2408 -408 ) ( 2040 2408 -360 ) ( 2016 2408 -360 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 2040 2172 -376 ) ( 2040 2172 -312 ) ( 2040 2404 -312 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3245 +{ +( 1568 1960 -528 ) ( 1568 1952 -528 ) ( 1568 1952 -560 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1672 2424 -528 ) ( 1288 2424 -528 ) ( 1288 2424 -560 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1712 1992 -528 ) ( 1712 2000 -528 ) ( 1712 2000 -560 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1380 2016 -528 ) ( 1764 2016 -528 ) ( 1764 2016 -560 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1264 1984 -536 ) ( 1264 1992 -536 ) ( 1648 1992 -536 ) subway/1_tunneltrack_plain 32 896 0 1 1 0 301989888 0 +( 1648 1992 -544 ) ( 1264 1992 -544 ) ( 1264 1984 -544 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +} +// brush 3246 +{ +( 680 -264 -432 ) ( 680 -288 -432 ) ( 680 -288 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1024 -144 -464 ) ( 904 -144 -464 ) ( 904 -144 -472 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 688 0 -504 ) ( 688 24 -504 ) ( 688 24 -512 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( 816 -752 -552 ) ( 936 -752 -552 ) ( 936 -752 -560 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 880 -144 -496 ) ( 880 -120 -496 ) ( 1000 -120 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 992 -104 -520 ) ( 872 -104 -520 ) ( 872 -128 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3247 +{ +( 680 -560 -488 ) ( 680 -560 -536 ) ( 696 -560 -488 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 704 -728 -488 ) ( 704 -728 -536 ) ( 688 -728 -488 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 992 -736 -536 ) ( 872 -736 -536 ) ( 872 -760 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 880 -776 -520 ) ( 880 -752 -520 ) ( 1000 -752 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 688 -416 -520 ) ( 688 -392 -520 ) ( 688 -392 -528 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 680 -888 -448 ) ( 680 -912 -448 ) ( 680 -912 -456 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3248 +{ +( 688 -120 -520 ) ( 688 -144 -520 ) ( 688 -144 -528 ) subway/1_tunneltrack_plain -1232 0 0 0.500000 0.500000 0 301989888 0 +( 888 -464 -480 ) ( 768 -464 -480 ) ( 768 -464 -488 ) subway/1_tunneltrack_plain 240 0 0 0.500000 0.500000 0 301989888 0 +( 720 136 -520 ) ( 720 160 -520 ) ( 720 160 -528 ) subway/1_tunneltrack_plain -1232 0 0 0.500000 0.500000 0 301989888 0 +( 712 -768 -568 ) ( 832 -768 -568 ) ( 832 -768 -576 ) subway/1_tunneltrack_plain 240 0 0 0.500000 0.500000 0 301989888 0 +( 760 -152 -536 ) ( 760 -128 -536 ) ( 880 -128 -536 ) subway/1_tunnelfloor_2 608 -16 90 -1 -1 0 285212672 0 +( 880 -120 -552 ) ( 760 -120 -552 ) ( 760 -144 -552 ) subway/1_tunneltrack_plain 240 1232 0 0.500000 0.500000 0 301989888 0 +} +// brush 3249 +{ +( 744 -760 -264 ) ( 680 -760 -264 ) ( 680 -760 -254 ) subway/1_tunneltrack_1 71 -210 195 1 1 0 16777216 0 +( 904 -688 -536 ) ( 904 -680 -536 ) ( 856 -680 -536 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 800 -824 -528 ) ( 800 -560 -528 ) ( 832 -560 -528 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 712 -688 -516 ) ( 712 -952 -516 ) ( 712 -952 -548 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 904 -464 -536 ) ( 904 -464 -504 ) ( 856 -464 -504 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 720 -1104 -728 ) ( 720 -1104 -768 ) ( 720 -1112 -768 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 904 -1104 -504 ) ( 904 -1104 -536 ) ( 856 -1104 -536 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3250 +{ +( 956 -232 -544 ) ( 836 -232 -544 ) ( 836 -256 -544 ) subway/1_tunneltrack_1 148 504 0 1 1 0 16777216 0 +( 836 -272 -536 ) ( 836 -248 -536 ) ( 956 -248 -536 ) subway/1_tunneltrack_1 108 208 0 1 1 0 16777216 0 +( 772 -760 -568 ) ( 892 -760 -568 ) ( 892 -760 -576 ) subway/1_tunneltrack_1 148 0 0 1 1 0 16777216 0 +( 792 -176 -520 ) ( 792 -152 -520 ) ( 792 -152 -528 ) subway/1_tunneltrack_1 -356 0 0 1 1 0 16777216 0 +( 976 -464 -480 ) ( 856 -464 -480 ) ( 856 -464 -488 ) subway/1_tunneltrack_1 148 0 0 1 1 0 16777216 0 +( 720 -136 -512 ) ( 720 -160 -512 ) ( 720 -160 -520 ) subway/1_tunneltrack_1 -356 0 0 1 1 0 16777216 0 +} +// brush 3251 +{ +( 804 -760 -264 ) ( 764 -760 -264 ) ( 764 -760 -254 ) subway/1_tunneltrack_1 71 -210 195 1 1 0 16777216 0 +( 980 -1104 -504 ) ( 980 -1104 -536 ) ( 932 -1104 -536 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 796 -512 -728 ) ( 796 -512 -768 ) ( 796 -520 -768 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 980 -464 -536 ) ( 980 -464 -504 ) ( 932 -464 -504 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 788 -760 -516 ) ( 788 -1024 -516 ) ( 788 -1024 -548 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 876 -824 -528 ) ( 876 -560 -528 ) ( 908 -560 -528 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 980 -688 -536 ) ( 980 -680 -536 ) ( 932 -680 -536 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3252 +{ +( 968 -744 -552 ) ( 848 -744 -552 ) ( 848 -768 -552 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 872 -744 -536 ) ( 872 -720 -536 ) ( 992 -720 -536 ) subway/1_tunnelfloor_2 -64 8 90 1 1 0 285212672 0 +( 816 -760 -568 ) ( 936 -760 -568 ) ( 936 -760 -576 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 824 -784 -520 ) ( 824 -760 -520 ) ( 824 -760 -528 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1032 -464 -480 ) ( 912 -464 -480 ) ( 912 -464 -488 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 792 -744 -520 ) ( 792 -768 -520 ) ( 792 -768 -528 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3253 +{ +( 2040 2152 -376 ) ( 2040 2128 -376 ) ( 2040 2128 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2000 2440 -376 ) ( 1976 2440 -376 ) ( 1976 2440 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 2072 2336 -376 ) ( 2072 2360 -376 ) ( 2072 2360 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1976 2056 -376 ) ( 2000 2056 -376 ) ( 2000 2056 -424 ) subway/1_tile_big_green 0 16 0 0.500000 0.500000 0 369098752 0 +( 1968 2176 -376 ) ( 1968 2200 -376 ) ( 1992 2200 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1992 2200 -392 ) ( 1968 2200 -392 ) ( 1968 2176 -392 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3254 +{ +( -400 -984 -274 ) ( -400 -988 -274 ) ( -400 -988 -322 ) subway/sign7 0 -28 0 0.500000 0.500000 134217728 0 0 +( -332 -984 -270 ) ( -420 -984 -270 ) ( -420 -984 -318 ) subway/sign7 32 -28 0 0.500000 0.500000 134217728 0 0 +( -336 -988 -270 ) ( -336 -984 -270 ) ( -336 -984 -318 ) subway/sign7 0 -28 0 0.500000 0.500000 134217728 0 0 +( -420 -986 -270 ) ( -332 -986 -270 ) ( -332 -986 -318 ) subway/sign7 32 -28 0 0.500000 0.500000 134217728 0 0 +( -420 -988 -270 ) ( -420 -984 -270 ) ( -332 -984 -270 ) subway/sign7 32 0 0 0.500000 0.500000 134217728 0 0 +( -328 -984 -302 ) ( -416 -984 -302 ) ( -416 -988 -302 ) subway/sign7 32 0 0 0.500000 0.500000 134217728 0 0 +} +// brush 3255 +{ +( -24 -792 -216 ) ( -176 -792 -216 ) ( -176 -792 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -264 -968 -296 ) ( -112 -968 -296 ) ( -112 -992 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -288 -984 -304 ) ( 128 -984 -304 ) ( 128 -792 -304 ) subway/con14 192 176 0 0.500000 0.500000 0 285212672 0 +( -160 -904 -296 ) ( -160 -872 -296 ) ( -160 -904 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -304 -872 -296 ) ( -304 -904 -296 ) ( -304 -904 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -312 -984 -296 ) ( -240 -984 -296 ) ( -312 -984 -304 ) subway/1_tile 80 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 3256 +{ +( -24 -792 -216 ) ( -176 -792 -216 ) ( -176 -792 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 128 -984 -304 ) ( -288 -984 -304 ) ( -288 -976 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -464 -952 -184 ) ( -464 -984 -184 ) ( -464 -984 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -264 -968 -296 ) ( -112 -968 -296 ) ( -112 -992 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -288 -984 -304 ) ( 128 -984 -304 ) ( 128 -792 -304 ) subway/con14 192 176 0 0.500000 0.500000 0 285212672 0 +( -304 -904 -296 ) ( -304 -872 -296 ) ( -304 -904 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3257 +{ +( -104 -872 -308 ) ( -176 -872 -308 ) ( -176 -904 -308 ) subway/light_tube 64 0 0 0.500000 0.500000 134217728 16777217 3500 +( -176 -904 -304 ) ( -176 -872 -304 ) ( -104 -872 -304 ) subway/light_tube 0 16 0 0.500000 0.500000 134217728 16777217 30000 +( -176 -896 -304 ) ( -104 -896 -304 ) ( -104 -896 -312 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( -116 -904 -304 ) ( -116 -872 -304 ) ( -116 -872 -312 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( -104 -880 -304 ) ( -176 -880 -304 ) ( -176 -880 -312 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( -160 -872 -304 ) ( -160 -904 -304 ) ( -160 -904 -312 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3258 +{ +( -184 -1192 -240 ) ( -184 -1208 -240 ) ( -184 -1208 -248 ) subway/1_black 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -168 -1192 -240 ) ( -184 -1192 -240 ) ( -184 -1192 -248 ) subway/1_black 416 16 0 0.500000 0.500000 134217728 16777216 0 +( -168 -1208 -240 ) ( -168 -1192 -240 ) ( -168 -1192 -248 ) subway/1_black 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -184 -1208 -240 ) ( -168 -1208 -240 ) ( -168 -1208 -248 ) subway/1_black 416 16 0 0.500000 0.500000 134217728 16777216 0 +( -184 -1208 -240 ) ( -184 -1192 -240 ) ( -168 -1192 -240 ) subway/1_black 416 16 0 0.500000 0.500000 134217728 16777216 0 +( -168 -1192 -244 ) ( -184 -1192 -244 ) ( -184 -1208 -244 ) subway/light_yellow 400 16 0 0.500000 0.500000 134217728 16777217 12000 +} +// brush 3259 +{ +( -56 -1360 -312 ) ( -56 -1360 -272 ) ( -56 -1320 -272 ) subway/1_tile_bottom 864 -272 0 0.500000 0.500000 0 318767104 0 +( -56 -1360 -312 ) ( -56 -1360 -272 ) ( -88 -1360 -272 ) subway/1_tile_bottom 320 -272 0 0.500000 0.500000 0 318767104 0 +( -96 -1400 -312 ) ( -96 -1400 -272 ) ( -96 -1440 -272 ) subway/1_tile_bottom 864 -272 0 0.500000 0.500000 0 318767104 0 +( -96 -1400 -312 ) ( -96 -1400 -272 ) ( -64 -1400 -272 ) subway/1_tile_bottom 320 -272 0 0.500000 0.500000 0 318767104 0 +( -88 -1320 -312 ) ( -56 -1320 -312 ) ( -56 -1360 -312 ) subway/1_tile_bottom 320 -912 0 0.500000 0.500000 0 318767104 0 +( -56 -1352 -328 ) ( -56 -1312 -328 ) ( -88 -1312 -328 ) subway/1_tile_bottom 320 -912 0 0.500000 0.500000 0 318767104 0 +} +// brush 3260 +{ +( -56 -1360 -272 ) ( -56 -1360 -232 ) ( -56 -1320 -232 ) subway/1_tile 864 -224 0 0.500000 0.500000 0 318767104 0 +( -56 -1360 -296 ) ( -56 -1360 -256 ) ( -88 -1360 -256 ) subway/1_tile 48 16 0 -0.500000 0.500000 0 318767104 0 +( -96 -1400 -288 ) ( -96 -1400 -248 ) ( -96 -1440 -248 ) subway/1_tile 864 -224 0 0.500000 0.500000 0 318767104 0 +( -96 -1400 -296 ) ( -96 -1400 -256 ) ( -64 -1400 -256 ) subway/1_tile 320 -224 0 0.500000 0.500000 0 318767104 0 +( -96 -1320 -272 ) ( -64 -1320 -272 ) ( -64 -1360 -272 ) subway/1_tile 320 -864 0 0.500000 0.500000 0 318767104 0 +( -56 -1352 -312 ) ( -56 -1312 -312 ) ( -88 -1312 -312 ) subway/1_tile 320 -864 0 0.500000 0.500000 0 318767104 0 +} +// brush 3261 +{ +( -248 -1256 -272 ) ( -248 -1216 -272 ) ( -248 -1216 -312 ) subway/1_tile_bottom 544 -272 0 0.500000 0.500000 0 318767104 0 +( -280 -1216 -272 ) ( -248 -1216 -272 ) ( -248 -1216 -312 ) subway/1_tile_bottom 320 -272 0 0.500000 0.500000 0 318767104 0 +( -288 -1136 -272 ) ( -288 -1176 -272 ) ( -288 -1176 -312 ) subway/1_tile_bottom 544 -272 0 0.500000 0.500000 0 318767104 0 +( -256 -1176 -272 ) ( -288 -1176 -272 ) ( -288 -1176 -312 ) subway/1_tile_bottom 320 -272 0 0.500000 0.500000 0 318767104 0 +( -256 -1216 -312 ) ( -256 -1256 -312 ) ( -288 -1256 -312 ) subway/1_tile_bottom 320 -592 0 0.500000 0.500000 0 318767104 0 +( -280 -1264 -328 ) ( -248 -1264 -328 ) ( -248 -1224 -328 ) subway/1_tile_bottom 320 -592 0 0.500000 0.500000 0 318767104 0 +} +// brush 3262 +{ +( -288 -832 -320 ) ( -288 -848 -304 ) ( -248 -848 -304 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( -380 -792 -304 ) ( -380 -848 -304 ) ( -380 -832 -320 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( -208 -792 -264 ) ( -248 -792 -264 ) ( -248 -792 -304 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( -116 -848 -304 ) ( -116 -792 -304 ) ( -124 -792 -320 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -116 -792 -304 ) ( -116 -848 -304 ) ( -380 -848 -304 ) subway/1_tile 576 -144 0 0.500000 0.500000 0 318767104 0 +( -124 -832 -320 ) ( -124 -792 -320 ) ( -380 -792 -320 ) subway/1_tile_middle 576 80 0 0.500000 0.500000 0 318767104 0 +} +// brush 3263 +{ +( -548 -824 -336 ) ( -548 -832 -320 ) ( -508 -832 -320 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( -380 -792 -320 ) ( -380 -832 -320 ) ( -380 -824 -336 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( -208 -792 -296 ) ( -248 -792 -296 ) ( -248 -792 -336 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( -124 -832 -320 ) ( -124 -792 -320 ) ( -128 -792 -336 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( -124 -792 -320 ) ( -124 -832 -320 ) ( -380 -832 -320 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -336 -792 -336 ) ( -336 -824 -336 ) ( -296 -824 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3264 +{ +( -588 -824 -344 ) ( -548 -824 -344 ) ( -548 -824 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( -380 -792 -344 ) ( -380 -824 -344 ) ( -380 -824 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -208 -792 -344 ) ( -248 -792 -344 ) ( -248 -792 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( -128 -820 -344 ) ( -128 -788 -344 ) ( -128 -788 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -288 -824 -384 ) ( -328 -824 -384 ) ( -328 -792 -384 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -336 -792 -400 ) ( -336 -824 -400 ) ( -296 -824 -400 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3265 +{ +( -440 -1072 -256 ) ( -440 -1072 -240 ) ( -456 -1072 -240 ) subway/1_black 384 -128 0 0.500000 0.500000 134217728 16777216 0 +( -456 -1088 -240 ) ( -440 -1088 -240 ) ( -440 -1088 -256 ) subway/1_black 384 -128 0 0.500000 0.500000 134217728 16777216 0 +( -456 -1056 -240 ) ( -440 -1056 -240 ) ( -440 -1088 -240 ) subway/1_black 384 16 0 0.500000 0.500000 134217728 16777216 0 +( -456 -1056 -256 ) ( -456 -1056 -240 ) ( -456 -1088 -240 ) subway/1_black -16 -128 0 0.500000 0.500000 134217728 16777216 0 +( -456 -1088 -256 ) ( -440 -1088 -240 ) ( -440 -1056 -240 ) subway/light_square 16 32 0 0.500000 0.500000 134217728 16777217 10000 +} +// brush 3266 +{ +( -464 -992 -144 ) ( -464 -1176 -144 ) ( -464 -1176 -168 ) subway/1_tile_middle 0 -192 0 0.500000 0.500000 0 318767104 0 +( -448 -984 -144 ) ( -464 -984 -144 ) ( -464 -984 -168 ) subway/1_tile_middle 368 -192 0 0.500000 0.500000 0 318767104 0 +( -456 -1168 -144 ) ( -456 -984 -144 ) ( -456 -984 -168 ) subway/1_tile_middle 0 -192 0 0.500000 0.500000 0 318767104 0 +( -464 -1176 -144 ) ( -448 -1176 -144 ) ( -448 -1176 -168 ) subway/1_tile_middle 368 -192 0 0.500000 0.500000 0 318767104 0 +( -464 -1176 -240 ) ( -464 -992 -240 ) ( -448 -992 -240 ) subway/1_tile_middle 368 -48 0 0.500000 0.500000 0 318767104 0 +( -448 -992 -256 ) ( -464 -992 -256 ) ( -464 -1176 -256 ) subway/1_tile_middle 368 -48 0 0.500000 0.500000 0 318767104 0 +} +// brush 3267 +{ +( -448 -992 -408 ) ( -464 -992 -408 ) ( -464 -1176 -408 ) subway/con6 368 0 0 0.500000 0.500000 0 285212672 0 +( -464 -1176 -304 ) ( -464 -992 -304 ) ( -448 -992 -304 ) subway/con6 368 0 0 0.500000 0.500000 0 285212672 0 +( -464 -1176 -264 ) ( -448 -1176 -264 ) ( -448 -1176 -288 ) subway/con6 368 -144 0 0.500000 0.500000 0 285212672 0 +( -456 -1168 -264 ) ( -456 -984 -264 ) ( -456 -984 -288 ) subway/con12 0 16 0 1 1 0 285212672 0 +( -448 -984 -264 ) ( -464 -984 -264 ) ( -464 -984 -288 ) subway/con6 368 -144 0 0.500000 0.500000 0 285212672 0 +( -464 -992 -264 ) ( -464 -1176 -264 ) ( -464 -1176 -288 ) subway/con6 0 -160 0 0.500000 0.500000 0 285212672 0 +} +// brush 3268 +{ +( -296 -1056 -240 ) ( -296 -1088 -240 ) ( -280 -1088 -256 ) subway/light_square 16 32 0 0.500000 0.500000 134217728 16777217 10000 +( -280 -1088 -240 ) ( -280 -1056 -240 ) ( -280 -1056 -256 ) subway/1_black -16 -128 0 0.500000 0.500000 134217728 16777216 0 +( -296 -1088 -240 ) ( -296 -1056 -240 ) ( -280 -1056 -240 ) subway/1_black 96 16 0 0.500000 0.500000 134217728 16777216 0 +( -296 -1088 -256 ) ( -296 -1088 -240 ) ( -280 -1088 -240 ) subway/1_black 96 -128 0 0.500000 0.500000 134217728 16777216 0 +( -280 -1072 -240 ) ( -296 -1072 -240 ) ( -296 -1072 -256 ) subway/1_black 96 -128 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3269 +{ +( -280 -992 -264 ) ( -280 -1176 -264 ) ( -280 -1176 -288 ) subway/con12 0 16 0 1 1 0 285212672 0 +( -264 -984 -264 ) ( -280 -984 -264 ) ( -280 -984 -288 ) subway/con6 0 -144 0 0.500000 0.500000 0 285212672 0 +( -272 -1168 -264 ) ( -272 -984 -264 ) ( -272 -984 -288 ) subway/con6 0 -160 0 0.500000 0.500000 0 285212672 0 +( -280 -1176 -264 ) ( -264 -1176 -264 ) ( -264 -1176 -288 ) subway/con6 0 -144 0 0.500000 0.500000 0 285212672 0 +( -280 -1176 -304 ) ( -280 -992 -304 ) ( -264 -992 -304 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( -264 -992 -408 ) ( -280 -992 -408 ) ( -280 -1176 -408 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3270 +{ +( 128 -1256 -216 ) ( 128 -1256 -176 ) ( 128 -1296 -176 ) subway/1_tile_middle 624 -192 0 0.500000 0.500000 0 318767104 0 +( 120 -1400 -240 ) ( 120 -1400 -200 ) ( 152 -1400 -200 ) subway/1_tile_middle -48 -192 0 0.500000 0.500000 0 318767104 0 +( 136 -1216 -240 ) ( 136 -1216 -200 ) ( 136 -1176 -200 ) subway/1_tile_middle 624 -192 0 0.500000 0.500000 0 318767104 0 +( 160 -1216 -240 ) ( 160 -1216 -200 ) ( 128 -1216 -200 ) subway/1_tile_middle -48 -192 0 0.500000 0.500000 0 318767104 0 +( 160 -1296 -240 ) ( 128 -1296 -240 ) ( 128 -1256 -240 ) subway/1_tile -48 -832 0 0.500000 0.500000 0 318767104 0 +( 136 -1264 -256 ) ( 136 -1304 -256 ) ( 168 -1304 -256 ) subway/1_tile_middle -48 -608 0 0.500000 0.500000 0 318767104 0 +} +// brush 3271 +{ +( 128 -1256 -312 ) ( 128 -1256 -272 ) ( 128 -1296 -272 ) subway/1_tile_bottom 624 -272 0 0.500000 0.500000 0 318767104 0 +( 120 -1400 -312 ) ( 120 -1400 -272 ) ( 152 -1400 -272 ) subway/1_tile_bottom -48 -272 0 0.500000 0.500000 0 318767104 0 +( 136 -1216 -312 ) ( 136 -1216 -272 ) ( 136 -1176 -272 ) subway/1_tile_bottom 624 -272 0 0.500000 0.500000 0 318767104 0 +( 160 -1216 -312 ) ( 160 -1216 -272 ) ( 128 -1216 -272 ) subway/1_tile_bottom -48 -272 0 0.500000 0.500000 0 318767104 0 +( 160 -1296 -312 ) ( 128 -1296 -312 ) ( 128 -1256 -312 ) subway/1_tile_bottom -48 -672 0 0.500000 0.500000 0 318767104 0 +( 128 -1264 -328 ) ( 128 -1304 -328 ) ( 160 -1304 -328 ) subway/1_tile_bottom -48 -672 0 0.500000 0.500000 0 318767104 0 +} +// brush 3272 +{ +( 1192 1928 -200 ) ( 1192 1912 -200 ) ( 1192 1912 -216 ) subway/1_black 544 32 0 0.500000 0.500000 0 16777216 0 +( 1208 1928 -200 ) ( 1192 1928 -200 ) ( 1192 1928 -216 ) subway/1_black 320 32 0 0.500000 0.500000 0 16777216 0 +( 1208 1912 -200 ) ( 1208 1928 -200 ) ( 1208 1928 -216 ) subway/1_black 544 32 0 0.500000 0.500000 0 16777216 0 +( 1192 1912 -200 ) ( 1208 1912 -200 ) ( 1208 1912 -216 ) subway/1_black 320 32 0 0.500000 0.500000 0 16777216 0 +( 1192 1912 -208 ) ( 1192 1928 -208 ) ( 1208 1928 -208 ) subway/1_black 320 -544 0 0.500000 0.500000 0 16777216 0 +( 1208 1928 -212 ) ( 1192 1928 -212 ) ( 1192 1912 -212 ) subway/light_yellow 336 -528 0 0.500000 0.500000 0 16777217 12000 +} +// brush 3273 +{ +( 1192 2056 -200 ) ( 1192 2040 -200 ) ( 1192 2040 -216 ) subway/1_black 320 32 0 0.500000 0.500000 0 16777216 0 +( 1208 2056 -200 ) ( 1192 2056 -200 ) ( 1192 2056 -216 ) subway/1_black 320 32 0 0.500000 0.500000 0 16777216 0 +( 1208 2040 -200 ) ( 1208 2056 -200 ) ( 1208 2056 -216 ) subway/1_black 320 32 0 0.500000 0.500000 0 16777216 0 +( 1192 2040 -200 ) ( 1208 2040 -200 ) ( 1208 2040 -216 ) subway/1_black 320 32 0 0.500000 0.500000 0 16777216 0 +( 1192 2040 -208 ) ( 1192 2056 -208 ) ( 1208 2056 -208 ) subway/1_black 320 -320 0 0.500000 0.500000 0 16777216 0 +( 1208 2056 -212 ) ( 1192 2056 -212 ) ( 1192 2040 -212 ) subway/light_yellow 336 -304 0 0.500000 0.500000 0 16777217 12000 +} +// brush 3274 +{ +( 1224 2116 -496 ) ( 1224 2292 -496 ) ( 1200 2292 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 1200 2292 -480 ) ( 1224 2292 -480 ) ( 1224 2116 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 1200 2296 -496 ) ( 1200 2296 -480 ) ( 1200 2176 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1208 2176 -496 ) ( 1200 2176 -496 ) ( 1200 2176 -480 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1216 2296 -480 ) ( 1216 2296 -496 ) ( 1216 2176 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1216 2328 -496 ) ( 1216 2328 -480 ) ( 1200 2328 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +} +// brush 3275 +{ +( 1024 1908 -520 ) ( 1024 1932 -520 ) ( 904 1932 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 896 1916 -496 ) ( 1016 1916 -496 ) ( 1016 1892 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 936 1972 -560 ) ( 936 1972 -552 ) ( 1056 1972 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1520 -512 ) ( 1200 1520 -504 ) ( 1200 1496 -504 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1000 2328 -472 ) ( 1000 2328 -464 ) ( 880 2328 -464 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1216 1780 -440 ) ( 1216 1780 -432 ) ( 1216 1804 -432 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1208 2176 -254 ) ( 1208 2176 -264 ) ( 1160 2176 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3276 +{ +( 1024 1908 -536 ) ( 1024 1932 -536 ) ( 904 1932 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 896 1916 -520 ) ( 1016 1916 -520 ) ( 1016 1892 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1200 1496 -528 ) ( 1200 1496 -520 ) ( 1200 1472 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1216 1812 -456 ) ( 1216 1812 -448 ) ( 1216 1836 -448 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1224 2176 -254 ) ( 1224 2176 -264 ) ( 1168 2176 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1192 2328 -496 ) ( 1192 2328 -512 ) ( 1248 2328 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +} +// brush 3277 +{ +( 1232 2176 -254 ) ( 1232 2176 -264 ) ( 1200 2176 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 2436 -400 ) ( 1216 2436 -392 ) ( 1216 2460 -392 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1000 2328 -432 ) ( 1000 2328 -424 ) ( 880 2328 -424 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1200 1544 -488 ) ( 1200 1544 -480 ) ( 1200 1520 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 944 1516 -520 ) ( 944 1516 -512 ) ( 1064 1516 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 896 1916 -448 ) ( 1016 1916 -448 ) ( 1016 1892 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1024 1908 -480 ) ( 1024 1932 -480 ) ( 904 1932 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3278 +{ +( 1200 2176 -336 ) ( 1208 2176 -336 ) ( 1200 2176 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 1684 -352 ) ( 1192 1732 -352 ) ( 1200 1732 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1016 2308 -448 ) ( 1016 2332 -448 ) ( 896 2332 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 2040 -440 ) ( 1200 2040 -432 ) ( 1200 2016 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1012 2328 -384 ) ( 1012 2328 -376 ) ( 892 2328 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1216 2796 -352 ) ( 1216 2796 -344 ) ( 1216 2820 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3279 +{ +( 1344 1808 -552 ) ( 1224 1808 -552 ) ( 1224 1784 -552 ) subway/1_tunneltrack_plain -784 416 0 0.500000 0.500000 0 301989888 0 +( 1248 1808 -536 ) ( 1248 1832 -536 ) ( 1368 1832 -536 ) subway/1_tunnelfloor_2 -272 -368 90 1 1 0 285212672 0 +( 1200 2176 -536 ) ( 1200 2176 -552 ) ( 1168 2176 -552 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1200 2312 -536 ) ( 1200 2312 -552 ) ( 1200 2176 -552 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1200 2344 -552 ) ( 1200 2344 -536 ) ( 1168 2368 -536 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1168 2504 -536 ) ( 1168 2176 -536 ) ( 1168 2176 -552 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3280 +{ +( 1208 1560 -536 ) ( 1208 1544 -536 ) ( 1272 1544 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1272 1552 -504 ) ( 1208 1552 -504 ) ( 1208 1560 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 1560 -536 ) ( 1296 1560 -504 ) ( 1208 1560 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 1560 -504 ) ( 1304 1560 -536 ) ( 1288 1544 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1272 1552 -504 ) ( 1272 1544 -536 ) ( 1208 1544 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 1560 -536 ) ( 1208 1560 -520 ) ( 1208 1552 -520 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3281 +{ +( 1208 1560 -504 ) ( 1208 1552 -504 ) ( 1272 1552 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1272 1552 -472 ) ( 1208 1552 -472 ) ( 1208 1560 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 1560 -504 ) ( 1296 1560 -472 ) ( 1208 1560 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 1560 -472 ) ( 1304 1560 -504 ) ( 1296 1552 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 1552 -504 ) ( 1208 1552 -488 ) ( 1272 1552 -488 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 1560 -504 ) ( 1208 1560 -488 ) ( 1208 1552 -488 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3282 +{ +( 1208 1560 -456 ) ( 1208 1552 -456 ) ( 1272 1552 -456 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1272 1552 -440 ) ( 1208 1552 -440 ) ( 1208 1560 -440 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1288 1560 -456 ) ( 1288 1560 -440 ) ( 1208 1560 -440 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1304 1560 -440 ) ( 1304 1560 -456 ) ( 1296 1552 -456 ) subway/metalrib1 0 -15 90 0.500000 0.500000 0 16777216 0 +( 1208 1552 -480 ) ( 1208 1552 -464 ) ( 1272 1552 -464 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1208 1560 -480 ) ( 1208 1560 -464 ) ( 1208 1552 -464 ) subway/metalrib1 0 -15 90 0.500000 0.500000 0 16777216 0 +} +// brush 3283 +{ +( 1208 1432 -464 ) ( 1208 1424 -464 ) ( 1208 1424 -480 ) subway/metalrib1 0 -15 90 0.500000 0.500000 0 16777216 0 +( 1280 1432 -464 ) ( 1216 1432 -464 ) ( 1216 1432 -480 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1304 1424 -456 ) ( 1304 1424 -440 ) ( 1296 1432 -440 ) subway/metalrib1 0 -15 90 0.500000 0.500000 0 16777216 0 +( 1296 1424 -440 ) ( 1296 1424 -456 ) ( 1208 1424 -456 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1208 1424 -440 ) ( 1208 1432 -440 ) ( 1272 1432 -440 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1272 1432 -456 ) ( 1208 1432 -456 ) ( 1208 1424 -456 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +} +// brush 3284 +{ +( 1272 1432 -504 ) ( 1208 1432 -504 ) ( 1208 1424 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 1424 -472 ) ( 1208 1432 -472 ) ( 1272 1432 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 1424 -472 ) ( 1296 1424 -504 ) ( 1208 1424 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 1424 -504 ) ( 1304 1424 -472 ) ( 1296 1432 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1280 1432 -488 ) ( 1216 1432 -488 ) ( 1216 1432 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 1432 -488 ) ( 1208 1424 -488 ) ( 1208 1424 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3285 +{ +( 1280 1440 -536 ) ( 1216 1440 -536 ) ( 1216 1424 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 1424 -504 ) ( 1208 1432 -504 ) ( 1272 1432 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1288 1424 -504 ) ( 1288 1424 -536 ) ( 1208 1424 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 1424 -536 ) ( 1304 1424 -504 ) ( 1296 1432 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1216 1440 -536 ) ( 1280 1440 -536 ) ( 1280 1432 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 1432 -520 ) ( 1208 1424 -520 ) ( 1208 1424 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3286 +{ +( 1328 904 -544 ) ( 1208 904 -544 ) ( 1208 880 -544 ) subway/1_tunneltrack_plain 32 896 0 0.500000 0.500000 0 301989888 0 +( 1232 904 -536 ) ( 1232 928 -536 ) ( 1352 928 -536 ) subway/1_tunneltrack_plain 32 896 0 1 1 0 301989888 0 +( 1160 1464 -568 ) ( 1280 1464 -568 ) ( 1280 1464 -576 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1264 856 -520 ) ( 1264 880 -520 ) ( 1264 880 -528 ) subway/1_tunneltrack_plain -896 0 0 0.500000 0.500000 0 301989888 0 +( 1408 1520 -480 ) ( 1288 1520 -480 ) ( 1288 1520 -488 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1168 1416 -520 ) ( 1168 1392 -520 ) ( 1168 1392 -528 ) subway/1_tunneltrack_plain -896 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3287 +{ +( 1208 2088 -544 ) ( 1208 2064 -544 ) ( 1328 2064 -544 ) subway/1_tunnelfloor_2 24 -392 0 1 -1 0 285212672 0 +( 1352 2048 -536 ) ( 1232 2048 -536 ) ( 1232 2072 -536 ) subway/1_tunnelfloor_2 19 400 0 1.400000 1.300000 0 285212672 0 +( 1272 1464 -576 ) ( 1272 1464 -568 ) ( 1152 1464 -568 ) subway/1_tunnelfloor_2 24 56 0 1 -1 0 285212672 0 +( 1264 1464 -544 ) ( 1280 1448 -544 ) ( 1280 1448 -536 ) subway/1_tunnelfloor_2 -440 56 0 1 -1 0 285212672 0 +( 1200 1440 -544 ) ( 1200 1440 -536 ) ( 1296 1440 -536 ) subway/1_tunnelfloor_2 24 56 0 1 -1 0 285212672 0 +( 1200 1440 -536 ) ( 1200 1440 -544 ) ( 1168 1464 -544 ) subway/1_tunnelfloor_2 24 56 0 1 -1 0 285212672 0 +} +// brush 3288 +{ +( 1200 1544 -544 ) ( 1200 1544 -536 ) ( 1168 1520 -536 ) subway/1_tunnelfloor_2 24 56 0 1 -1 0 285212672 0 +( 1200 1544 -536 ) ( 1200 1544 -544 ) ( 1288 1544 -544 ) subway/1_tunnelfloor_2 24 56 0 1 -1 0 285212672 0 +( 1288 1544 -536 ) ( 1288 1544 -544 ) ( 1272 1528 -544 ) subway/1_tunnelfloor_2 -439 56 0 1 -1 0 285212672 0 +( 1160 1520 -568 ) ( 1280 1520 -568 ) ( 1280 1520 -576 ) subway/1_tunnelfloor_2 24 56 0 1 -1 0 285212672 0 +( 1232 920 -536 ) ( 1232 944 -536 ) ( 1352 944 -536 ) subway/1_tunnelfloor_2 24 -391 0 1 -1 0 285212672 0 +( 1328 912 -544 ) ( 1208 912 -544 ) ( 1208 888 -544 ) subway/1_tunnelfloor_2 24 -391 0 1 -1 0 285212672 0 +} +// brush 3289 +{ +( 1208 1560 -464 ) ( 1208 1560 -448 ) ( 1208 1552 -448 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 1304 1424 -432 ) ( 1304 1424 -440 ) ( 1216 1424 -440 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1296 1552 -440 ) ( 1296 1552 -432 ) ( 1296 1560 -432 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 1288 1560 -440 ) ( 1288 1560 -424 ) ( 1208 1560 -424 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1272 1552 -432 ) ( 1208 1552 -432 ) ( 1208 1560 -432 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1208 1560 -440 ) ( 1208 1552 -440 ) ( 1272 1552 -440 ) subway/con10 16 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3290 +{ +( 1480 3272 -576 ) ( 1472 3272 -576 ) ( 1472 3104 -576 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1472 3104 -336 ) ( 1472 3272 -336 ) ( 1480 3272 -336 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1472 3104 -336 ) ( 1480 3104 -336 ) ( 1480 3104 -352 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1480 3104 -336 ) ( 1480 3272 -336 ) ( 1480 3272 -352 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1480 3272 -336 ) ( 1472 3272 -336 ) ( 1472 3272 -352 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1472 3272 -336 ) ( 1472 3104 -336 ) ( 1472 3104 -352 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +} +// brush 3291 +{ +( 1096 1336 -512 ) ( 1096 1312 -512 ) ( 1096 1312 -520 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +( 1376 2400 -480 ) ( 1256 2400 -480 ) ( 1256 2400 -488 ) subway/1_tunneltrack_1 -228 0 0 1 1 0 16777216 0 +( 1168 2224 -520 ) ( 1168 2248 -520 ) ( 1168 2248 -528 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +( 1140 2176 -568 ) ( 1260 2176 -568 ) ( 1260 2176 -576 ) subway/1_tunneltrack_1 -228 0 0 1 1 0 16777216 0 +( 1212 1616 -536 ) ( 1212 1640 -536 ) ( 1332 1640 -536 ) subway/1_tunneltrack_1 -204 216 0 1 1 0 16777216 0 +( 1332 1656 -544 ) ( 1212 1656 -544 ) ( 1212 1632 -544 ) subway/1_tunneltrack_1 -228 208 0 1 1 0 16777216 0 +} +// brush 3292 +{ +( 1292 1776 -312 ) ( 1292 1776 -344 ) ( 1244 1776 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1164 2184 -536 ) ( 1164 2184 -576 ) ( 1164 2176 -576 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1324 2848 -344 ) ( 1324 2848 -312 ) ( 1276 2848 -312 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1100 2224 -312 ) ( 1100 1960 -312 ) ( 1100 1960 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1180 2056 -336 ) ( 1180 2320 -336 ) ( 1212 2320 -336 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1276 2200 -352 ) ( 1276 2208 -352 ) ( 1228 2208 -352 ) subway/1_tunnel_ceiling2 156 0 0 1 1 0 16777216 0 +( 1164 2464 -264 ) ( 1084 2464 -264 ) ( 1084 2464 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3293 +{ +( 1200 2464 -344 ) ( 1200 2464 -352 ) ( 1168 2464 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1408 -336 ) ( 1200 2080 -336 ) ( 1200 2080 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1180 2848 -352 ) ( 1180 2848 -344 ) ( 1148 2848 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1164 3400 -352 ) ( 1164 4384 -352 ) ( 1164 4384 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1192 2080 -336 ) ( 1192 1408 -336 ) ( 1160 1408 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1168 2280 -352 ) ( 1168 1296 -352 ) ( 1200 1296 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +} +// brush 3294 +{ +( 1180 1888 -264 ) ( 1140 1888 -264 ) ( 1140 1888 -254 ) subway/1_tunneltrack_1 441 -109 195 1 1 0 16777216 0 +( 1356 1184 -504 ) ( 1356 1184 -536 ) ( 1308 1184 -536 ) subway/metal2 -752 0 0 0.500000 0.500000 0 16777216 0 +( 1172 2232 -728 ) ( 1172 2232 -768 ) ( 1172 2224 -768 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1364 2176 -536 ) ( 1364 2176 -504 ) ( 1316 2176 -504 ) subway/metal2 -752 0 0 0.500000 0.500000 0 16777216 0 +( 1164 1496 -516 ) ( 1164 1232 -516 ) ( 1164 1232 -548 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1252 1464 -528 ) ( 1252 1728 -528 ) ( 1284 1728 -528 ) subway/metal2 -752 416 0 0.500000 0.500000 0 16777216 0 +( 1356 1600 -536 ) ( 1356 1608 -536 ) ( 1308 1608 -536 ) subway/metal2 -752 416 0 0.500000 0.500000 0 16777216 0 +} +// brush 3295 +{ +( 1104 2464 -344 ) ( 1104 2464 -352 ) ( 1072 2464 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1100 2488 -336 ) ( 1100 3160 -336 ) ( 1100 3160 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1080 2848 -352 ) ( 1080 2848 -344 ) ( 1048 2848 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 1296 -352 ) ( 1064 2280 -352 ) ( 1064 2280 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1104 2080 -336 ) ( 1104 1408 -336 ) ( 1072 1408 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1072 2280 -352 ) ( 1072 1296 -352 ) ( 1104 1296 -352 ) subway/1_tunnel_ceiling2 156 0 0 1 1 0 16777216 0 +} +// brush 3296 +{ +( 1280 1416 -504 ) ( 1280 1416 -536 ) ( 1232 1416 -536 ) subway/metal2 -712 0 0 0.500000 0.500000 0 16777216 0 +( 1096 2088 -728 ) ( 1096 2088 -768 ) ( 1096 2080 -768 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1288 2848 -536 ) ( 1288 2848 -504 ) ( 1240 2848 -504 ) subway/metal2 -712 0 0 0.500000 0.500000 0 16777216 0 +( 1088 2104 -516 ) ( 1088 1840 -516 ) ( 1088 1840 -548 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1176 1696 -528 ) ( 1176 1960 -528 ) ( 1208 1960 -528 ) subway/metal2 -712 416 0 0.500000 0.500000 0 16777216 0 +( 1280 1832 -536 ) ( 1280 1840 -536 ) ( 1232 1840 -536 ) subway/metal2 -712 416 0 0.500000 0.500000 0 16777216 0 +( 1120 2176 -264 ) ( 1056 2176 -264 ) ( 1056 2176 -254 ) subway/1_tunneltrack_1 422 -115 195 1 1 0 16777216 0 +} +// brush 3297 +{ +( 1332 1784 -544 ) ( 1212 1784 -544 ) ( 1212 1760 -544 ) subway/1_tunneltrack_2 36 0 0 1 1 0 16777216 0 +( 1212 1744 -536 ) ( 1212 1768 -536 ) ( 1332 1768 -536 ) subway/1_tunneltrack_1 -204 216 0 1 1 0 16777216 0 +( 1140 2464 -568 ) ( 1260 2464 -568 ) ( 1260 2464 -576 ) subway/1_tunneltrack_2 36 0 0 1 1 0 16777216 0 +( 1168 2352 -520 ) ( 1168 2376 -520 ) ( 1168 2376 -528 ) subway/1_tunneltrack_2 36 0 0 1 1 0 16777216 0 +( 1408 2848 -480 ) ( 1288 2848 -480 ) ( 1288 2848 -488 ) subway/1_tunneltrack_2 36 0 0 1 1 0 16777216 0 +( 1096 1464 -512 ) ( 1096 1440 -512 ) ( 1096 1440 -520 ) subway/1_tunneltrack_2 36 0 0 1 1 0 16777216 0 +} +// brush 3298 +{ +( 1696 2336 -544 ) ( 1696 2216 -544 ) ( 1720 2216 -544 ) subway/1_tunnelfloor_2 160 -816 0 1 -1 0 285212672 0 +( 1688 2240 -536 ) ( 1664 2240 -536 ) ( 1664 2360 -536 ) subway/1_tunnelfloor_2 -1144 8 90 1 -1 0 285212672 0 +( 1088 2680 -536 ) ( 1088 2680 -544 ) ( 1088 2560 -544 ) subway/1_tunnelfloor_2 -455 56 0 1 -1 0 285212672 0 +( 1096 2848 -544 ) ( 1096 2848 -536 ) ( 1072 2848 -536 ) subway/1_tunnelfloor_2 -248 56 0 1 -1 0 285212672 0 +( 1064 2176 -536 ) ( 1064 2176 -544 ) ( 1064 2504 -544 ) subway/1_tunnelfloor_2 -455 56 0 1 -1 0 285212672 0 +( 1064 2176 -544 ) ( 1064 2176 -536 ) ( 1088 2176 -536 ) subway/1_tunnelfloor_2 -167 56 0 1 -1 0 285212672 0 +} +// brush 3299 +{ +( 1232 2404 -496 ) ( 1232 2580 -496 ) ( 1208 2580 -496 ) subway/metal2 -32 0 0 0.500000 0.500000 0 16777216 0 +( 1208 2580 -480 ) ( 1232 2580 -480 ) ( 1232 2404 -480 ) subway/metal2 -32 0 0 0.500000 0.500000 0 16777216 0 +( 1200 2752 -480 ) ( 1200 2464 -480 ) ( 1200 2464 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1216 2464 -496 ) ( 1208 2464 -496 ) ( 1208 2464 -480 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 1216 2512 -496 ) ( 1216 2512 -480 ) ( 1216 2848 -480 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1216 2848 -480 ) ( 1208 2848 -480 ) ( 1208 2848 -496 ) subway/1_tunnelwall -32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3300 +{ +( 1068 1844 -420 ) ( 1068 1844 -372 ) ( 1068 1868 -372 ) subway/light_red -1704 -8 0 0.500000 0.500000 134217728 16777217 13000 +( 1080 1860 -420 ) ( 1080 1860 -372 ) ( 1064 1860 -372 ) subway/1_black 256 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1868 -420 ) ( 1064 1868 -372 ) ( 1064 1844 -372 ) subway/1_black -1616 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1844 -420 ) ( 1064 1844 -372 ) ( 1080 1844 -372 ) subway/1_black 256 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1868 -404 ) ( 1080 1868 -404 ) ( 1080 1844 -404 ) subway/1_black 256 1616 0 0.500000 0.500000 134217728 16777216 0 +( 1080 1844 -420 ) ( 1080 1868 -420 ) ( 1064 1868 -420 ) subway/1_black 256 1616 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3301 +{ +( 1068 1908 -420 ) ( 1068 1908 -372 ) ( 1068 1932 -372 ) subway/light_red -1736 -8 0 0.500000 0.500000 134217728 16777217 12000 +( 1080 1924 -420 ) ( 1080 1924 -372 ) ( 1064 1924 -372 ) subway/1_black 256 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1932 -420 ) ( 1064 1932 -372 ) ( 1064 1908 -372 ) subway/1_black -1744 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1908 -420 ) ( 1064 1908 -372 ) ( 1080 1908 -372 ) subway/1_black 256 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1932 -404 ) ( 1080 1932 -404 ) ( 1080 1908 -404 ) subway/1_black 256 1744 0 0.500000 0.500000 134217728 16777216 0 +( 1080 1908 -420 ) ( 1080 1932 -420 ) ( 1064 1932 -420 ) subway/1_black 256 1744 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3302 +{ +( 1104 1888 -344 ) ( 1104 1888 -352 ) ( 1072 1888 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1100 1816 -336 ) ( 1100 2488 -336 ) ( 1100 2488 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1080 2176 -352 ) ( 1080 2176 -344 ) ( 1048 2176 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 720 -352 ) ( 1064 1704 -352 ) ( 1064 1704 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1104 1504 -336 ) ( 1104 832 -336 ) ( 1072 832 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1072 1704 -352 ) ( 1072 720 -352 ) ( 1104 720 -352 ) subway/1_tunnel_ceiling2 156 0 0 1 1 0 16777216 0 +} +// brush 3303 +{ +( 1292 1200 -312 ) ( 1292 1200 -344 ) ( 1244 1200 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1164 1512 -536 ) ( 1164 1512 -576 ) ( 1164 1504 -576 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1324 2176 -344 ) ( 1324 2176 -312 ) ( 1276 2176 -312 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1100 1552 -312 ) ( 1100 1288 -312 ) ( 1100 1288 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1180 1480 -336 ) ( 1180 1744 -336 ) ( 1212 1744 -336 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1284 1624 -352 ) ( 1284 1632 -352 ) ( 1236 1632 -352 ) subway/1_tunnel_ceiling2 156 0 0 1 1 0 16777216 0 +( 1164 1888 -264 ) ( 1084 1888 -264 ) ( 1084 1888 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3304 +{ +( 1168 1704 -352 ) ( 1168 720 -352 ) ( 1200 720 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1192 1504 -336 ) ( 1192 832 -336 ) ( 1160 832 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1164 2728 -352 ) ( 1164 3712 -352 ) ( 1164 3712 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1180 2176 -352 ) ( 1180 2176 -344 ) ( 1148 2176 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 832 -336 ) ( 1200 1504 -336 ) ( 1200 1504 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1888 -344 ) ( 1200 1888 -352 ) ( 1168 1888 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3305 +{ +( 1696 2048 -544 ) ( 1696 1928 -544 ) ( 1720 1928 -544 ) subway/1_tunnelfloor_2 160 -816 0 1 -1 0 285212672 0 +( 1688 1952 -536 ) ( 1664 1952 -536 ) ( 1664 2072 -536 ) subway/1_tunnelfloor_2 -1144 8 90 1 -1 0 285212672 0 +( 1088 2008 -536 ) ( 1088 2008 -544 ) ( 1088 1888 -544 ) subway/1_tunnelfloor_2 -455 56 0 1 -1 0 285212672 0 +( 1096 2176 -544 ) ( 1096 2176 -536 ) ( 1072 2176 -536 ) subway/1_tunnelfloor_2 -248 56 0 1 -1 0 285212672 0 +( 1064 1888 -536 ) ( 1064 1888 -544 ) ( 1064 2216 -544 ) subway/1_tunnelfloor_2 -455 56 0 1 -1 0 285212672 0 +( 1064 1888 -544 ) ( 1064 1888 -536 ) ( 1088 1888 -536 ) subway/1_tunnelfloor_2 -167 56 0 1 -1 0 285212672 0 +} +// brush 3306 +{ +( 1280 1128 -504 ) ( 1280 1128 -536 ) ( 1232 1128 -536 ) subway/metal2 -712 0 0 0.500000 0.500000 0 16777216 0 +( 1096 1752 -728 ) ( 1096 1752 -768 ) ( 1096 1744 -768 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1272 2176 -536 ) ( 1272 2176 -504 ) ( 1224 2176 -504 ) subway/metal2 -712 0 0 0.500000 0.500000 0 16777216 0 +( 1088 1816 -516 ) ( 1088 1552 -516 ) ( 1088 1552 -548 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1176 1408 -528 ) ( 1176 1672 -528 ) ( 1208 1672 -528 ) subway/metal2 -712 416 0 0.500000 0.500000 0 16777216 0 +( 1280 1544 -536 ) ( 1280 1552 -536 ) ( 1232 1552 -536 ) subway/metal2 -712 416 0 0.500000 0.500000 0 16777216 0 +( 1120 1888 -264 ) ( 1056 1888 -264 ) ( 1056 1888 -254 ) subway/1_tunneltrack_1 422 -115 195 1 1 0 16777216 0 +} +// brush 3307 +{ +( 1096 1048 -512 ) ( 1096 1024 -512 ) ( 1096 1024 -520 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +( 1376 2176 -480 ) ( 1256 2176 -480 ) ( 1256 2176 -488 ) subway/1_tunneltrack_1 -228 0 0 1 1 0 16777216 0 +( 1168 1936 -520 ) ( 1168 1960 -520 ) ( 1168 1960 -528 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +( 1140 1888 -568 ) ( 1260 1888 -568 ) ( 1260 1888 -576 ) subway/1_tunneltrack_1 -228 0 0 1 1 0 16777216 0 +( 1212 1328 -536 ) ( 1212 1352 -536 ) ( 1332 1352 -536 ) subway/1_tunneltrack_1 -204 216 0 1 1 0 16777216 0 +( 1332 1368 -544 ) ( 1212 1368 -544 ) ( 1212 1344 -544 ) subway/1_tunneltrack_1 -228 208 0 1 1 0 16777216 0 +} +// brush 3308 +{ +( 1168 2216 -536 ) ( 1168 1888 -536 ) ( 1168 1888 -552 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1176 2176 -552 ) ( 1208 2176 -552 ) ( 1208 2176 -536 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1888 -552 ) ( 1200 1888 -536 ) ( 1200 1968 -536 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1888 -536 ) ( 1200 1888 -552 ) ( 1168 1888 -552 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1248 1520 -536 ) ( 1248 1544 -536 ) ( 1368 1544 -536 ) subway/1_tunnelfloor_2 -272 -368 90 1 1 0 285212672 0 +( 1344 1520 -552 ) ( 1224 1520 -552 ) ( 1224 1496 -552 ) subway/1_tunneltrack_plain -784 416 0 0.500000 0.500000 0 301989888 0 +} +// brush 3309 +{ +( 1356 1888 -536 ) ( 1356 1896 -536 ) ( 1308 1896 -536 ) subway/metal2 -752 416 0 0.500000 0.500000 0 16777216 0 +( 1252 1752 -528 ) ( 1252 2016 -528 ) ( 1284 2016 -528 ) subway/metal2 -752 416 0 0.500000 0.500000 0 16777216 0 +( 1164 1784 -516 ) ( 1164 1520 -516 ) ( 1164 1520 -548 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1364 2848 -536 ) ( 1364 2848 -504 ) ( 1316 2848 -504 ) subway/metal2 -752 0 0 0.500000 0.500000 0 16777216 0 +( 1172 2552 -728 ) ( 1172 2552 -768 ) ( 1172 2544 -768 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1356 1472 -504 ) ( 1356 1472 -536 ) ( 1308 1472 -536 ) subway/metal2 -752 0 0 0.500000 0.500000 0 16777216 0 +( 1180 2176 -264 ) ( 1140 2176 -264 ) ( 1140 2176 -254 ) subway/1_tunneltrack_1 441 -109 195 1 1 0 16777216 0 +} +// brush 3310 +{ +( 1208 2464 -254 ) ( 1208 2464 -264 ) ( 1160 2464 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 2068 -440 ) ( 1216 2068 -432 ) ( 1216 2092 -432 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1000 2848 -472 ) ( 1000 2848 -464 ) ( 880 2848 -464 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 2056 -512 ) ( 1200 2056 -504 ) ( 1200 2032 -504 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 936 2260 -560 ) ( 936 2260 -552 ) ( 1056 2260 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 896 2204 -496 ) ( 1016 2204 -496 ) ( 1016 2180 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1024 2196 -520 ) ( 1024 2220 -520 ) ( 904 2220 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3311 +{ +( 1232 2464 -254 ) ( 1232 2464 -264 ) ( 1200 2464 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 2724 -400 ) ( 1216 2724 -392 ) ( 1216 2748 -392 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1000 2848 -432 ) ( 1000 2848 -424 ) ( 880 2848 -424 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1200 2080 -488 ) ( 1200 2080 -480 ) ( 1200 2056 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 944 1804 -520 ) ( 944 1804 -512 ) ( 1064 1804 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 896 2204 -448 ) ( 1016 2204 -448 ) ( 1016 2180 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1024 2196 -480 ) ( 1024 2220 -480 ) ( 904 2220 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3312 +{ +( 1192 2848 -496 ) ( 1192 2848 -512 ) ( 1248 2848 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1224 2464 -254 ) ( 1224 2464 -264 ) ( 1168 2464 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 2116 -456 ) ( 1216 2116 -448 ) ( 1216 2140 -448 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1200 2032 -528 ) ( 1200 2032 -520 ) ( 1200 2008 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 896 2204 -520 ) ( 1016 2204 -520 ) ( 1016 2180 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1024 2196 -536 ) ( 1024 2220 -536 ) ( 904 2220 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3313 +{ +( 1216 3084 -352 ) ( 1216 3084 -344 ) ( 1216 3108 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 996 2848 -384 ) ( 996 2848 -376 ) ( 876 2848 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 2424 -440 ) ( 1200 2424 -432 ) ( 1200 2400 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1016 2596 -448 ) ( 1016 2620 -448 ) ( 896 2620 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 1972 -352 ) ( 1192 2020 -352 ) ( 1200 2020 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 2464 -336 ) ( 1208 2464 -336 ) ( 1200 2464 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3314 +{ +( 1104 1888 -264 ) ( 1056 1888 -264 ) ( 1056 1888 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1048 1516 -432 ) ( 1048 1492 -432 ) ( 1048 1492 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1384 2176 -464 ) ( 1264 2176 -464 ) ( 1264 2176 -472 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 1360 -504 ) ( 1064 1384 -504 ) ( 1064 1384 -512 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1208 1684 -552 ) ( 1328 1684 -552 ) ( 1328 1684 -560 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1248 1604 -496 ) ( 1248 1628 -496 ) ( 1368 1628 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1360 1644 -520 ) ( 1240 1644 -520 ) ( 1240 1620 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3315 +{ +( 1064 1888 -264 ) ( 1032 1888 -264 ) ( 1032 1888 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1048 2172 -392 ) ( 1048 2148 -392 ) ( 1048 2148 -400 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1384 2176 -424 ) ( 1264 2176 -424 ) ( 1264 2176 -432 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1064 1384 -480 ) ( 1064 1408 -480 ) ( 1064 1408 -488 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1200 1228 -512 ) ( 1320 1228 -512 ) ( 1320 1228 -520 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1248 1604 -448 ) ( 1248 1628 -448 ) ( 1368 1628 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1360 1644 -480 ) ( 1240 1644 -480 ) ( 1240 1620 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3316 +{ +( 1064 2176 -496 ) ( 1064 2176 -480 ) ( 1056 2176 -480 ) subway/1_tunnelwall 16 0 0 0.500000 0.500000 0 301989888 0 +( 1048 2176 -480 ) ( 1048 1840 -480 ) ( 1048 1840 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 1888 -480 ) ( 1064 1888 -496 ) ( 1056 1888 -496 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1064 1888 -496 ) ( 1064 1888 -480 ) ( 1064 2176 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1040 1828 -480 ) ( 1040 2004 -480 ) ( 1064 2004 -480 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 1064 2004 -496 ) ( 1040 2004 -496 ) ( 1040 1828 -496 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3317 +{ +( 1016 2176 -496 ) ( 1072 2176 -512 ) ( 1072 2176 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1096 1888 -264 ) ( 1040 1888 -264 ) ( 1040 1888 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1048 1564 -448 ) ( 1048 1540 -448 ) ( 1048 1540 -456 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1064 1336 -520 ) ( 1064 1360 -520 ) ( 1064 1360 -528 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1248 1604 -520 ) ( 1248 1628 -520 ) ( 1368 1628 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1360 1644 -536 ) ( 1240 1644 -536 ) ( 1240 1620 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3318 +{ +( 1048 2532 -344 ) ( 1048 2508 -344 ) ( 1048 2508 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1388 2176 -376 ) ( 1268 2176 -376 ) ( 1268 2176 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1728 -432 ) ( 1064 1752 -432 ) ( 1064 1752 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1368 2044 -448 ) ( 1248 2044 -448 ) ( 1248 2020 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1444 -352 ) ( 1072 1444 -352 ) ( 1072 1396 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1888 -448 ) ( 1056 1888 -336 ) ( 1064 1888 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3319 +{ +( 1096 -64 -512 ) ( 1096 -88 -512 ) ( 1096 -88 -520 ) subway/1_tunneltrack_2 36 -24 0 1 1 0 16777216 0 +( 1360 1136 -480 ) ( 1240 1136 -480 ) ( 1240 1136 -488 ) subway/1_tunneltrack_2 36 -24 0 1 1 0 16777216 0 +( 1168 944 -520 ) ( 1168 968 -520 ) ( 1168 968 -528 ) subway/1_tunneltrack_2 36 -24 0 1 1 0 16777216 0 +( 1140 1072 -568 ) ( 1260 1072 -568 ) ( 1260 1072 -576 ) subway/1_tunneltrack_2 36 -24 0 1 1 0 16777216 0 +( 1212 336 -536 ) ( 1212 360 -536 ) ( 1332 360 -536 ) subway/1_tunneltrack_2 52 -16 0 1 1 0 16777216 0 +( 1332 376 -544 ) ( 1212 376 -544 ) ( 1212 352 -544 ) subway/1_tunneltrack_2 36 -24 0 1 1 0 16777216 0 +} +// brush 3320 +{ +( 1096 -128 -512 ) ( 1096 -152 -512 ) ( 1096 -152 -520 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +( 1360 1072 -480 ) ( 1240 1072 -480 ) ( 1240 1072 -488 ) subway/1_tunneltrack_1 -228 0 0 1 1 0 16777216 0 +( 1168 880 -520 ) ( 1168 904 -520 ) ( 1168 904 -528 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +( 1140 832 -568 ) ( 1260 832 -568 ) ( 1260 832 -576 ) subway/1_tunneltrack_1 -228 0 0 1 1 0 16777216 0 +( 1212 272 -536 ) ( 1212 296 -536 ) ( 1332 296 -536 ) subway/1_tunneltrack_1 -204 216 0 1 1 0 16777216 0 +( 1332 312 -544 ) ( 1212 312 -544 ) ( 1212 288 -544 ) subway/1_tunneltrack_1 -228 208 0 1 1 0 16777216 0 +} +// brush 3321 +{ +( 1080 2804 -420 ) ( 1080 2828 -420 ) ( 1064 2828 -420 ) subway/1_black 256 1856 0 0.500000 0.500000 134217728 16777216 0 +( 1064 2828 -404 ) ( 1080 2828 -404 ) ( 1080 2804 -404 ) subway/1_black 256 1856 0 0.500000 0.500000 134217728 16777216 0 +( 1064 2804 -420 ) ( 1064 2804 -372 ) ( 1080 2804 -372 ) subway/1_black 256 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 2828 -420 ) ( 1064 2828 -372 ) ( 1064 2804 -372 ) subway/1_black -1856 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1080 2820 -420 ) ( 1080 2820 -372 ) ( 1064 2820 -372 ) subway/1_black 256 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1068 2804 -420 ) ( 1068 2804 -372 ) ( 1068 2828 -372 ) subway/light_red -1832 -8 0 0.500000 0.500000 134217728 16777217 12000 +} +// brush 3322 +{ +( 1068 1268 -420 ) ( 1068 1268 -372 ) ( 1068 1292 -372 ) subway/light_red -456 -8 0 0.500000 0.500000 134217728 16777217 10000 +( 1080 1284 -420 ) ( 1080 1284 -372 ) ( 1064 1284 -372 ) subway/1_black 256 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1292 -420 ) ( 1064 1292 -372 ) ( 1064 1268 -372 ) subway/1_black -464 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1268 -420 ) ( 1064 1268 -372 ) ( 1080 1268 -372 ) subway/1_black 256 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1292 -404 ) ( 1080 1292 -404 ) ( 1080 1268 -404 ) subway/1_black 256 464 0 0.500000 0.500000 134217728 16777216 0 +( 1080 1268 -420 ) ( 1080 1292 -420 ) ( 1064 1292 -420 ) subway/1_black 256 464 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3323 +{ +( 1068 1204 -420 ) ( 1068 1204 -372 ) ( 1068 1228 -372 ) subway/light_red -424 -8 0 0.500000 0.500000 134217728 16777217 10000 +( 1080 1220 -420 ) ( 1080 1220 -372 ) ( 1064 1220 -372 ) subway/1_black 256 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1228 -420 ) ( 1064 1228 -372 ) ( 1064 1204 -372 ) subway/1_black -336 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1204 -420 ) ( 1064 1204 -372 ) ( 1080 1204 -372 ) subway/1_black 256 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1228 -404 ) ( 1080 1228 -404 ) ( 1080 1204 -404 ) subway/1_black 256 336 0 0.500000 0.500000 134217728 16777216 0 +( 1080 1204 -420 ) ( 1080 1228 -420 ) ( 1064 1228 -420 ) subway/1_black 256 336 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3324 +{ +( 1024 1332 -536 ) ( 1024 1356 -536 ) ( 904 1356 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 896 1340 -520 ) ( 1016 1340 -520 ) ( 1016 1316 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1200 1072 -528 ) ( 1200 1072 -520 ) ( 1200 1048 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1216 1252 -456 ) ( 1216 1252 -448 ) ( 1216 1276 -448 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1224 1600 -254 ) ( 1224 1600 -264 ) ( 1168 1600 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1192 1888 -496 ) ( 1192 1888 -512 ) ( 1248 1888 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +} +// brush 3325 +{ +( 1224 1540 -496 ) ( 1224 1716 -496 ) ( 1200 1716 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 1200 1716 -480 ) ( 1224 1716 -480 ) ( 1224 1540 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 1200 1560 -480 ) ( 1200 1560 -496 ) ( 1200 1888 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1208 1560 -480 ) ( 1208 1560 -496 ) ( 1200 1560 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1208 1560 -496 ) ( 1208 1560 -480 ) ( 1208 1888 -480 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1208 1888 -480 ) ( 1200 1888 -480 ) ( 1200 1888 -496 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3326 +{ +( 1024 1332 -520 ) ( 1024 1356 -520 ) ( 904 1356 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 896 1340 -496 ) ( 1016 1340 -496 ) ( 1016 1316 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 936 1396 -560 ) ( 936 1396 -552 ) ( 1056 1396 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1096 -512 ) ( 1200 1096 -504 ) ( 1200 1072 -504 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1000 1888 -472 ) ( 1000 1888 -464 ) ( 880 1888 -464 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1216 1204 -440 ) ( 1216 1204 -432 ) ( 1216 1228 -432 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1208 1600 -254 ) ( 1208 1600 -264 ) ( 1160 1600 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3327 +{ +( 1024 1332 -480 ) ( 1024 1356 -480 ) ( 904 1356 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 896 1340 -448 ) ( 1016 1340 -448 ) ( 1016 1316 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 944 940 -520 ) ( 944 940 -512 ) ( 1064 940 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1200 1120 -488 ) ( 1200 1120 -480 ) ( 1200 1096 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1000 1888 -432 ) ( 1000 1888 -424 ) ( 880 1888 -424 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1216 1860 -400 ) ( 1216 1860 -392 ) ( 1216 1884 -392 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1232 1600 -254 ) ( 1232 1600 -264 ) ( 1200 1600 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3328 +{ +( 1200 1600 -336 ) ( 1208 1600 -336 ) ( 1200 1600 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 1108 -352 ) ( 1192 1156 -352 ) ( 1200 1156 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1016 1732 -448 ) ( 1016 1756 -448 ) ( 896 1756 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 1464 -440 ) ( 1200 1464 -432 ) ( 1200 1440 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 996 1888 -384 ) ( 996 1888 -376 ) ( 876 1888 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1216 2220 -352 ) ( 1216 2220 -344 ) ( 1216 2244 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3329 +{ +( 1808 2904 -496 ) ( 1808 2904 -512 ) ( 1864 2904 -496 ) subway/1_tunnelwall_floor 16 0 0 1 0.500000 0 285212672 0 +( 1832 2440 -262 ) ( 1832 2440 -272 ) ( 1776 2440 -272 ) subway/1_tunneltrack_1 -28 -55 195 1 1 0 16777216 0 +( 1824 2092 -456 ) ( 1824 2092 -448 ) ( 1824 2116 -448 ) subway/con6 0 48 0 0.500000 0.500000 0 285212672 0 +( 1816 2104 -528 ) ( 1816 2104 -520 ) ( 1816 2080 -520 ) subway/1_tunnelwall_floor 0 16 0 1 0.500000 0 285212672 0 +( 1504 2188 -520 ) ( 1624 2188 -520 ) ( 1624 2164 -520 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +( 1632 2180 -536 ) ( 1632 2204 -536 ) ( 1512 2204 -536 ) subway/con6 32 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3330 +{ +( 1816 2440 -262 ) ( 1816 2440 -272 ) ( 1768 2440 -272 ) subway/1_tunneltrack_1 -28 -55 195 1 1 0 16777216 0 +( 1824 2044 -440 ) ( 1824 2044 -432 ) ( 1824 2068 -432 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1616 2904 -472 ) ( 1616 2904 -464 ) ( 1496 2904 -464 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1816 2128 -512 ) ( 1816 2128 -504 ) ( 1816 2104 -504 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1544 2244 -560 ) ( 1544 2244 -552 ) ( 1664 2244 -552 ) subway/1_tunnelwall 32 16 0 0.500000 0.500000 0 301989888 0 +( 1504 2188 -488 ) ( 1624 2188 -488 ) ( 1624 2164 -488 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +( 1632 2180 -520 ) ( 1632 2204 -520 ) ( 1512 2204 -520 ) subway/1_tunnelwall 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3331 +{ +( 1840 2456 -254 ) ( 1840 2456 -264 ) ( 1808 2456 -264 ) subway/1_tunneltrack_1 -28 -55 195 1 1 0 16777216 0 +( 1824 2708 -400 ) ( 1824 2708 -392 ) ( 1824 2732 -392 ) subway/1_tunnelwall_pipe 0 32 0 0.500000 0.500000 0 16777216 0 +( 1616 2904 -432 ) ( 1616 2904 -424 ) ( 1496 2904 -424 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1816 2152 -488 ) ( 1816 2152 -480 ) ( 1816 2128 -480 ) subway/1_tunnelwall_pipe 0 8 0 0.500000 0.500000 0 16777216 0 +( 1552 1788 -520 ) ( 1552 1788 -512 ) ( 1672 1788 -512 ) subway/1_tunnelwall_pipe 32 32 0 0.500000 0.500000 0 16777216 0 +( 1504 2188 -448 ) ( 1624 2188 -448 ) ( 1624 2164 -448 ) subway/1_tunnelwall_pipe 32 16 0 0.500000 0.500000 0 16777216 0 +( 1632 2180 -480 ) ( 1632 2204 -480 ) ( 1512 2204 -480 ) subway/1_tunnelwall_pipe 32 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 3332 +{ +( 1104 1600 -344 ) ( 1104 1600 -352 ) ( 1072 1600 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1100 1528 -336 ) ( 1100 2200 -336 ) ( 1100 2200 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1080 1888 -352 ) ( 1080 1888 -344 ) ( 1048 1888 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 432 -352 ) ( 1064 1416 -352 ) ( 1064 1416 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1104 1216 -336 ) ( 1104 544 -336 ) ( 1072 544 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1072 1416 -352 ) ( 1072 432 -352 ) ( 1104 432 -352 ) subway/1_tunnel_ceiling2 156 0 0 1 1 0 16777216 0 +} +// brush 3333 +{ +( 1292 912 -312 ) ( 1292 912 -344 ) ( 1244 912 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1164 1224 -536 ) ( 1164 1224 -576 ) ( 1164 1216 -576 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1324 1888 -344 ) ( 1324 1888 -312 ) ( 1276 1888 -312 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1100 1264 -312 ) ( 1100 1000 -312 ) ( 1100 1000 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1180 1192 -336 ) ( 1180 1456 -336 ) ( 1212 1456 -336 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1284 1336 -352 ) ( 1284 1344 -352 ) ( 1236 1344 -352 ) subway/1_tunnel_ceiling2 156 0 0 1 1 0 16777216 0 +( 1164 1600 -264 ) ( 1084 1600 -264 ) ( 1084 1600 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3334 +{ +( 1168 1416 -352 ) ( 1168 432 -352 ) ( 1200 432 -352 ) subway/1_tunnel_ceiling2 156 0 0 1 1 0 16777216 0 +( 1192 1216 -336 ) ( 1192 544 -336 ) ( 1160 544 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1164 2440 -352 ) ( 1164 3424 -352 ) ( 1164 3424 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1180 1888 -352 ) ( 1180 1888 -344 ) ( 1148 1888 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 544 -336 ) ( 1200 1216 -336 ) ( 1200 1216 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1600 -344 ) ( 1200 1600 -352 ) ( 1168 1600 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3335 +{ +( 1280 840 -504 ) ( 1280 840 -536 ) ( 1232 840 -536 ) subway/metal2 -712 0 0 0.500000 0.500000 0 16777216 0 +( 1096 1464 -728 ) ( 1096 1464 -768 ) ( 1096 1456 -768 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1272 1888 -536 ) ( 1272 1888 -504 ) ( 1224 1888 -504 ) subway/metal2 -712 0 0 0.500000 0.500000 0 16777216 0 +( 1088 1528 -516 ) ( 1088 1264 -516 ) ( 1088 1264 -548 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1176 1120 -528 ) ( 1176 1384 -528 ) ( 1208 1384 -528 ) subway/metal2 -712 416 0 0.500000 0.500000 0 16777216 0 +( 1280 1256 -536 ) ( 1280 1264 -536 ) ( 1232 1264 -536 ) subway/metal2 -712 416 0 0.500000 0.500000 0 16777216 0 +( 1120 1600 -264 ) ( 1056 1600 -264 ) ( 1056 1600 -254 ) subway/1_tunneltrack_1 422 -115 195 1 1 0 16777216 0 +} +// brush 3336 +{ +( 1696 1760 -544 ) ( 1696 1640 -544 ) ( 1720 1640 -544 ) subway/1_tunnelfloor_2 160 -528 0 1 -1 0 285212672 0 +( 1688 1664 -536 ) ( 1664 1664 -536 ) ( 1664 1784 -536 ) subway/1_tunnelfloor_2 -856 8 90 1 -1 0 285212672 0 +( 1088 1720 -536 ) ( 1088 1720 -544 ) ( 1088 1600 -544 ) subway/1_tunnelfloor_2 -167 56 0 1 -1 0 285212672 0 +( 1096 1888 -544 ) ( 1096 1888 -536 ) ( 1072 1888 -536 ) subway/1_tunnelfloor_2 -248 56 0 1 -1 0 285212672 0 +( 1064 1600 -536 ) ( 1064 1600 -544 ) ( 1064 1928 -544 ) subway/1_tunnelfloor_2 -167 56 0 1 -1 0 285212672 0 +( 1064 1600 -544 ) ( 1064 1600 -536 ) ( 1088 1600 -536 ) subway/1_tunnelfloor_2 -167 56 0 1 -1 0 285212672 0 +} +// brush 3337 +{ +( 1332 1080 -544 ) ( 1212 1080 -544 ) ( 1212 1056 -544 ) subway/1_tunneltrack_1 -228 208 0 1 1 0 16777216 0 +( 1212 1040 -536 ) ( 1212 1064 -536 ) ( 1332 1064 -536 ) subway/1_tunneltrack_1 -204 216 0 1 1 0 16777216 0 +( 1140 1528 -568 ) ( 1260 1528 -568 ) ( 1260 1528 -576 ) subway/1_tunneltrack_1 -228 0 0 1 1 0 16777216 0 +( 1168 1648 -520 ) ( 1168 1672 -520 ) ( 1168 1672 -528 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +( 1376 1888 -480 ) ( 1256 1888 -480 ) ( 1256 1888 -488 ) subway/1_tunneltrack_1 -228 0 0 1 1 0 16777216 0 +( 1096 760 -512 ) ( 1096 736 -512 ) ( 1096 736 -520 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +} +// brush 3338 +{ +( 1356 1312 -536 ) ( 1356 1320 -536 ) ( 1308 1320 -536 ) subway/metal2 -752 416 0 0.500000 0.500000 0 16777216 0 +( 1252 1176 -528 ) ( 1252 1440 -528 ) ( 1284 1440 -528 ) subway/metal2 -752 416 0 0.500000 0.500000 0 16777216 0 +( 1164 1208 -516 ) ( 1164 944 -516 ) ( 1164 944 -548 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1364 1888 -536 ) ( 1364 1888 -504 ) ( 1316 1888 -504 ) subway/metal2 -752 0 0 0.500000 0.500000 0 16777216 0 +( 1172 1944 -728 ) ( 1172 1944 -768 ) ( 1172 1936 -768 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1356 896 -504 ) ( 1356 896 -536 ) ( 1308 896 -536 ) subway/metal2 -752 0 0 0.500000 0.500000 0 16777216 0 +( 1180 1600 -264 ) ( 1140 1600 -264 ) ( 1140 1600 -254 ) subway/1_tunneltrack_1 441 -109 195 1 1 0 16777216 0 +} +// brush 3339 +{ +( 1168 1928 -536 ) ( 1168 1600 -536 ) ( 1168 1600 -552 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1176 1888 -552 ) ( 1208 1888 -552 ) ( 1208 1888 -536 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1600 -552 ) ( 1200 1600 -536 ) ( 1200 1680 -536 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1600 -536 ) ( 1200 1600 -552 ) ( 1168 1600 -552 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1248 1232 -536 ) ( 1248 1256 -536 ) ( 1368 1256 -536 ) subway/1_tunnelfloor_2 -272 -368 90 1 1 0 285212672 0 +( 1344 1232 -552 ) ( 1224 1232 -552 ) ( 1224 1208 -552 ) subway/1_tunneltrack_plain -784 416 0 0.500000 0.500000 0 301989888 0 +} +// brush 3340 +{ +( 1356 848 -536 ) ( 1356 856 -536 ) ( 1308 856 -536 ) subway/metal2 -752 416 0 0.500000 0.500000 0 16777216 0 +( 1252 712 -528 ) ( 1252 976 -528 ) ( 1284 976 -528 ) subway/metal2 -752 416 0 0.500000 0.500000 0 16777216 0 +( 1164 744 -516 ) ( 1164 480 -516 ) ( 1164 480 -548 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1356 1600 -536 ) ( 1356 1600 -504 ) ( 1308 1600 -504 ) subway/metal2 -752 0 0 0.500000 0.500000 0 16777216 0 +( 1172 1480 -728 ) ( 1172 1480 -768 ) ( 1172 1472 -768 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1356 432 -504 ) ( 1356 432 -536 ) ( 1308 432 -536 ) subway/metal2 -752 0 0 0.500000 0.500000 0 16777216 0 +( 1180 1136 -264 ) ( 1140 1136 -264 ) ( 1140 1136 -254 ) subway/1_tunneltrack_1 441 -109 195 1 1 0 16777216 0 +} +// brush 3341 +{ +( 1280 432 -504 ) ( 1280 432 -536 ) ( 1232 432 -536 ) subway/metal2 -712 0 0 0.500000 0.500000 0 16777216 0 +( 1096 1056 -728 ) ( 1096 1056 -768 ) ( 1096 1048 -768 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1280 1600 -536 ) ( 1280 1600 -504 ) ( 1232 1600 -504 ) subway/metal2 -712 0 0 0.500000 0.500000 0 16777216 0 +( 1088 1120 -516 ) ( 1088 856 -516 ) ( 1088 856 -548 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1176 712 -528 ) ( 1176 976 -528 ) ( 1208 976 -528 ) subway/metal2 -712 416 0 0.500000 0.500000 0 16777216 0 +( 1280 848 -536 ) ( 1280 856 -536 ) ( 1232 856 -536 ) subway/metal2 -712 416 0 0.500000 0.500000 0 16777216 0 +( 1120 1136 -264 ) ( 1056 1136 -264 ) ( 1056 1136 -254 ) subway/1_tunneltrack_1 422 -115 195 1 1 0 16777216 0 +} +// brush 3342 +{ +( 1096 296 -512 ) ( 1096 272 -512 ) ( 1096 272 -520 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +( 1368 1464 -480 ) ( 1248 1464 -480 ) ( 1248 1464 -488 ) subway/1_tunneltrack_1 -228 0 0 1 1 0 16777216 0 +( 1168 1184 -520 ) ( 1168 1208 -520 ) ( 1168 1208 -528 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +( 1140 1136 -568 ) ( 1260 1136 -568 ) ( 1260 1136 -576 ) subway/1_tunneltrack_1 -228 0 0 1 1 0 16777216 0 +( 1212 576 -536 ) ( 1212 600 -536 ) ( 1332 600 -536 ) subway/1_tunneltrack_1 -204 216 0 1 1 0 16777216 0 +( 1332 616 -544 ) ( 1212 616 -544 ) ( 1212 592 -544 ) subway/1_tunneltrack_1 -228 208 0 1 1 0 16777216 0 +} +// brush 3343 +{ +( 1168 1848 -536 ) ( 1168 1520 -536 ) ( 1168 1520 -552 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1168 1600 -552 ) ( 1200 1600 -552 ) ( 1200 1600 -536 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1768 -536 ) ( 1200 1848 -536 ) ( 1200 1848 -552 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1544 -552 ) ( 1168 1520 -552 ) ( 1168 1520 -536 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1248 1152 -536 ) ( 1248 1176 -536 ) ( 1368 1176 -536 ) subway/1_tunnelfloor_2 -272 -368 90 1 1 0 285212672 0 +( 1344 1152 -552 ) ( 1224 1152 -552 ) ( 1224 1128 -552 ) subway/1_tunneltrack_plain -784 416 0 0.500000 0.500000 0 301989888 0 +} +// brush 3344 +{ +( 1696 1432 -544 ) ( 1696 1312 -544 ) ( 1720 1312 -544 ) subway/1_tunnelfloor_2 160 -199 0 1 -1 0 285212672 0 +( 1688 1336 -536 ) ( 1664 1336 -536 ) ( 1664 1456 -536 ) subway/1_tunnelfloor_2 -528 8 90 1 -1 0 285212672 0 +( 1088 1392 -536 ) ( 1088 1392 -544 ) ( 1088 1272 -544 ) subway/1_tunnelfloor_2 160 56 0 1 -1 0 285212672 0 +( 1096 1600 -544 ) ( 1096 1600 -536 ) ( 1072 1600 -536 ) subway/1_tunnelfloor_2 -248 56 0 1 -1 0 285212672 0 +( 1064 1296 -536 ) ( 1064 1296 -544 ) ( 1064 1392 -544 ) subway/1_tunnelfloor_2 160 56 0 1 -1 0 285212672 0 +( 1064 1296 -544 ) ( 1064 1296 -536 ) ( 1088 1272 -536 ) subway/1_tunnelfloor_2 160 56 0 1 -1 0 285212672 0 +} +// brush 3345 +{ +( 1104 1136 -344 ) ( 1104 1136 -352 ) ( 1072 1136 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1100 1240 -336 ) ( 1100 1912 -336 ) ( 1100 1912 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1080 1600 -352 ) ( 1080 1600 -344 ) ( 1048 1600 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 -32 -352 ) ( 1064 952 -352 ) ( 1064 952 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1104 752 -336 ) ( 1104 80 -336 ) ( 1072 80 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1072 952 -352 ) ( 1072 -32 -352 ) ( 1104 -32 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +} +// brush 3346 +{ +( 1292 448 -312 ) ( 1292 448 -344 ) ( 1244 448 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1164 936 -536 ) ( 1164 936 -576 ) ( 1164 928 -576 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1324 1600 -344 ) ( 1324 1600 -312 ) ( 1276 1600 -312 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1100 976 -312 ) ( 1100 712 -312 ) ( 1100 712 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1180 728 -336 ) ( 1180 992 -336 ) ( 1212 992 -336 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1284 872 -352 ) ( 1284 880 -352 ) ( 1236 880 -352 ) subway/1_tunnel_ceiling2 156 0 0 1 1 0 16777216 0 +( 1164 1136 -264 ) ( 1084 1136 -264 ) ( 1084 1136 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3347 +{ +( 1168 952 -352 ) ( 1168 -32 -352 ) ( 1200 -32 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1192 752 -336 ) ( 1192 80 -336 ) ( 1160 80 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1164 2152 -352 ) ( 1164 3136 -352 ) ( 1164 3136 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1180 1600 -352 ) ( 1180 1600 -344 ) ( 1148 1600 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 80 -336 ) ( 1200 752 -336 ) ( 1200 752 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1136 -344 ) ( 1200 1136 -352 ) ( 1168 1136 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3348 +{ +( 1192 2176 -496 ) ( 1192 2176 -512 ) ( 1248 2176 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1224 1888 -254 ) ( 1224 1888 -264 ) ( 1168 1888 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 1540 -456 ) ( 1216 1540 -448 ) ( 1216 1564 -448 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1200 1360 -528 ) ( 1200 1360 -520 ) ( 1200 1336 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 896 1628 -520 ) ( 1016 1628 -520 ) ( 1016 1604 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1024 1620 -536 ) ( 1024 1644 -536 ) ( 904 1644 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3349 +{ +( 1208 2176 -480 ) ( 1200 2176 -480 ) ( 1200 2176 -496 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 1216 1888 -496 ) ( 1216 1888 -480 ) ( 1216 2176 -480 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1208 1888 -480 ) ( 1208 1888 -496 ) ( 1200 1888 -496 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1200 1848 -480 ) ( 1200 1848 -496 ) ( 1200 2176 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1200 2004 -480 ) ( 1224 2004 -480 ) ( 1224 1828 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 1224 1828 -496 ) ( 1224 2004 -496 ) ( 1200 2004 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3350 +{ +( 1208 1888 -254 ) ( 1208 1888 -264 ) ( 1160 1888 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 1492 -440 ) ( 1216 1492 -432 ) ( 1216 1516 -432 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1000 2176 -472 ) ( 1000 2176 -464 ) ( 880 2176 -464 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1384 -512 ) ( 1200 1384 -504 ) ( 1200 1360 -504 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 936 1684 -560 ) ( 936 1684 -552 ) ( 1056 1684 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 896 1628 -496 ) ( 1016 1628 -496 ) ( 1016 1604 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1024 1620 -520 ) ( 1024 1644 -520 ) ( 904 1644 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3351 +{ +( 1232 1888 -254 ) ( 1232 1888 -264 ) ( 1200 1888 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 2148 -400 ) ( 1216 2148 -392 ) ( 1216 2172 -392 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1000 2176 -432 ) ( 1000 2176 -424 ) ( 880 2176 -424 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1200 1408 -488 ) ( 1200 1408 -480 ) ( 1200 1384 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 944 1228 -520 ) ( 944 1228 -512 ) ( 1064 1228 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 896 1628 -448 ) ( 1016 1628 -448 ) ( 1016 1604 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1024 1620 -480 ) ( 1024 1644 -480 ) ( 904 1644 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3352 +{ +( 1216 2508 -352 ) ( 1216 2508 -344 ) ( 1216 2532 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 996 2176 -384 ) ( 996 2176 -376 ) ( 876 2176 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 1752 -440 ) ( 1200 1752 -432 ) ( 1200 1728 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1016 2020 -448 ) ( 1016 2044 -448 ) ( 896 2044 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 1396 -352 ) ( 1192 1444 -352 ) ( 1200 1444 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 1888 -336 ) ( 1208 1888 -336 ) ( 1200 1888 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3353 +{ +( 1192 1424 -496 ) ( 1192 1424 -512 ) ( 1248 1424 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1224 1136 -254 ) ( 1224 1136 -264 ) ( 1168 1136 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 788 -456 ) ( 1216 788 -448 ) ( 1216 812 -448 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1200 608 -528 ) ( 1200 608 -520 ) ( 1200 584 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 896 876 -520 ) ( 1016 876 -520 ) ( 1016 852 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1024 868 -536 ) ( 1024 892 -536 ) ( 904 892 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3354 +{ +( 1208 1136 -254 ) ( 1208 1136 -264 ) ( 1160 1136 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 740 -440 ) ( 1216 740 -432 ) ( 1216 764 -432 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1000 1424 -472 ) ( 1000 1424 -464 ) ( 880 1424 -464 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 632 -512 ) ( 1200 632 -504 ) ( 1200 608 -504 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 936 932 -560 ) ( 936 932 -552 ) ( 1056 932 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 896 876 -496 ) ( 1016 876 -496 ) ( 1016 852 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1024 868 -520 ) ( 1024 892 -520 ) ( 904 892 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3355 +{ +( 1208 1424 -480 ) ( 1200 1424 -480 ) ( 1200 1424 -496 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 1216 1136 -280 ) ( 1216 1312 -280 ) ( 1216 1312 -296 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1192 1136 -488 ) ( 1216 1136 -488 ) ( 1216 1136 -504 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1140 -496 ) ( 1200 1244 -496 ) ( 1200 1244 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1200 1252 -480 ) ( 1224 1252 -480 ) ( 1224 1076 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 1224 1076 -496 ) ( 1224 1252 -496 ) ( 1200 1252 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3356 +{ +( 1232 1136 -254 ) ( 1232 1136 -264 ) ( 1200 1136 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 1396 -400 ) ( 1216 1396 -392 ) ( 1216 1420 -392 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1000 1424 -432 ) ( 1000 1424 -424 ) ( 880 1424 -424 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1200 656 -488 ) ( 1200 656 -480 ) ( 1200 632 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 944 476 -520 ) ( 944 476 -512 ) ( 1064 476 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 896 876 -448 ) ( 1016 876 -448 ) ( 1016 852 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1024 868 -480 ) ( 1024 892 -480 ) ( 904 892 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3357 +{ +( 1216 1756 -352 ) ( 1216 1756 -344 ) ( 1216 1780 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 996 1424 -384 ) ( 996 1424 -376 ) ( 876 1424 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 1000 -440 ) ( 1200 1000 -432 ) ( 1200 976 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1016 1268 -448 ) ( 1016 1292 -448 ) ( 896 1292 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 644 -352 ) ( 1192 692 -352 ) ( 1200 692 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 1136 -336 ) ( 1208 1136 -336 ) ( 1200 1136 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3358 +{ +( 1216 1628 -488 ) ( 1216 1628 -480 ) ( 1216 1652 -480 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 996 1136 -520 ) ( 996 1136 -512 ) ( 876 1136 -512 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1200 704 -568 ) ( 1200 704 -560 ) ( 1200 680 -560 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1016 1132 -520 ) ( 1016 1156 -520 ) ( 896 1156 -520 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1192 508 -496 ) ( 1192 556 -496 ) ( 1200 556 -496 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1208 1096 -472 ) ( 1216 1096 -472 ) ( 1208 1096 -584 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +} +// brush 3359 +{ +( 1208 1096 -496 ) ( 1216 1096 -496 ) ( 1208 1096 -608 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1192 508 -520 ) ( 1192 556 -520 ) ( 1200 556 -520 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1016 1132 -536 ) ( 1016 1156 -536 ) ( 896 1156 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1200 704 -584 ) ( 1200 704 -576 ) ( 1200 680 -576 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 996 1136 -544 ) ( 996 1136 -536 ) ( 876 1136 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1216 1628 -512 ) ( 1216 1628 -504 ) ( 1216 1652 -504 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +} +// brush 3360 +{ +( 1208 1096 -424 ) ( 1216 1096 -424 ) ( 1208 1096 -536 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1192 508 -448 ) ( 1192 556 -448 ) ( 1200 556 -448 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1016 1132 -480 ) ( 1016 1156 -480 ) ( 896 1156 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1200 704 -528 ) ( 1200 704 -520 ) ( 1200 680 -520 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 996 1136 -472 ) ( 996 1136 -464 ) ( 876 1136 -464 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1216 1628 -440 ) ( 1216 1628 -432 ) ( 1216 1652 -432 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +} +// brush 3361 +{ +( 1208 1096 -336 ) ( 1216 1096 -336 ) ( 1208 1096 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 508 -352 ) ( 1192 556 -352 ) ( 1200 556 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1016 1132 -448 ) ( 1016 1156 -448 ) ( 896 1156 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 704 -440 ) ( 1200 704 -432 ) ( 1200 680 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 996 1136 -384 ) ( 996 1136 -376 ) ( 876 1136 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1216 1628 -352 ) ( 1216 1628 -344 ) ( 1216 1652 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3362 +{ +( 840 208 0 ) ( 856 192 0 ) ( 856 192 10 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 848 208 -536 ) ( 848 208 -528 ) ( 784 112 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 856 208 -536 ) ( 856 208 -528 ) ( 848 208 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 856 208 -528 ) ( 856 208 -536 ) ( 792 112 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 792 112 -528 ) ( 792 112 -536 ) ( 784 112 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 848 208 -528 ) ( 856 208 -528 ) ( 792 112 -528 ) subway/metal2 624 0 0 0.500000 0.500000 134217728 16777216 0 +( 856 208 -536 ) ( 848 208 -536 ) ( 784 112 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 788 108 0 ) ( 788 136 0 ) ( 788 136 10 ) subway/metal2 624 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3363 +{ +( 1064 1460 -408 ) ( 1064 1448 -408 ) ( 1064 1448 -424 ) subway/1_black 32 -80 0 0.500000 0.500000 134217728 16777216 0 +( 1068 1464 -408 ) ( 1064 1464 -408 ) ( 1064 1464 -424 ) subway/1_black 0 -80 0 0.500000 0.500000 134217728 16777216 0 +( 1068 1452 -408 ) ( 1068 1464 -408 ) ( 1068 1464 -424 ) subway/light_square 48 -80 0 0.500000 0.500000 134217728 16777217 8000 +( 1064 1448 -408 ) ( 1068 1448 -408 ) ( 1068 1448 -424 ) subway/1_black 0 -80 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1448 -408 ) ( 1064 1460 -408 ) ( 1068 1460 -408 ) subway/1_black 0 -32 0 0.500000 0.500000 134217728 16777216 0 +( 1068 1460 -424 ) ( 1064 1460 -424 ) ( 1064 1448 -424 ) subway/1_black 0 -32 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3364 +{ +( 1068 1540 -424 ) ( 1064 1540 -424 ) ( 1064 1528 -424 ) subway/1_black 0 128 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1528 -408 ) ( 1064 1540 -408 ) ( 1068 1540 -408 ) subway/1_black 0 128 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1528 -408 ) ( 1068 1528 -408 ) ( 1068 1528 -424 ) subway/1_black 0 -80 0 0.500000 0.500000 134217728 16777216 0 +( 1068 1532 -408 ) ( 1068 1544 -408 ) ( 1068 1544 -424 ) subway/light_square -16 -80 0 0.500000 0.500000 134217728 16777217 8000 +( 1068 1544 -408 ) ( 1064 1544 -408 ) ( 1064 1544 -424 ) subway/1_black 0 -80 0 0.500000 0.500000 134217728 16777216 0 +( 1064 1540 -408 ) ( 1064 1528 -408 ) ( 1064 1528 -424 ) subway/1_black -128 -80 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3365 +{ +( 1048 1956 -344 ) ( 1048 1932 -344 ) ( 1048 1932 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1396 1600 -376 ) ( 1276 1600 -376 ) ( 1276 1600 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1112 -432 ) ( 1064 1136 -432 ) ( 1064 1136 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1076 1504 -436 ) ( 1064 1504 -436 ) ( 1064 1464 -436 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1464 -380 ) ( 1064 1504 -380 ) ( 1076 1504 -380 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1528 -340 ) ( 1076 1528 -340 ) ( 1064 1528 -436 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3366 +{ +( 1048 1956 -344 ) ( 1048 1932 -344 ) ( 1048 1932 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1112 -432 ) ( 1064 1136 -432 ) ( 1064 1136 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1064 1312 -448 ) ( 1056 1312 -336 ) ( 1064 1312 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1076 1504 -436 ) ( 1064 1504 -436 ) ( 1064 1464 -436 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1464 -420 ) ( 1064 1504 -420 ) ( 1076 1504 -420 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1080 1464 -340 ) ( 1068 1464 -340 ) ( 1080 1464 -436 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3367 +{ +( 1048 2024 -372 ) ( 1048 2000 -372 ) ( 1048 2000 -380 ) subway/1_tunnelwall 0 -40 0 0.500000 0.500000 0 301989888 0 +( 1388 1528 -404 ) ( 1268 1528 -404 ) ( 1268 1528 -412 ) subway/1_tunnelwall 0 -40 0 0.500000 0.500000 0 301989888 0 +( 1064 1180 -460 ) ( 1064 1204 -460 ) ( 1064 1204 -468 ) subway/1_tunnelwall_2 8 -1 0 1 1 0 301989888 0 +( 1064 936 -380 ) ( 1072 936 -380 ) ( 1072 888 -380 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1464 -476 ) ( 1056 1464 -364 ) ( 1064 1464 -364 ) subway/1_tunnelwall 0 -40 0 0.500000 0.500000 0 301989888 0 +( 1064 1572 -444 ) ( 1064 1532 -444 ) ( 1076 1572 -444 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3368 +{ +( 1048 1956 -344 ) ( 1048 1932 -344 ) ( 1048 1932 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1388 1600 -376 ) ( 1268 1600 -376 ) ( 1268 1600 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1152 -432 ) ( 1064 1176 -432 ) ( 1064 1176 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1368 1468 -448 ) ( 1248 1468 -448 ) ( 1248 1444 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1312 -448 ) ( 1056 1312 -336 ) ( 1064 1312 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1504 -436 ) ( 1076 1504 -436 ) ( 1064 1464 -436 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3369 +{ +( 1192 1476 -372 ) ( 1192 1488 -372 ) ( 1152 1488 -372 ) subway/1_black -80 0 0 0.500000 0.500000 134217728 16777216 0 +( 1152 1488 -344 ) ( 1192 1488 -344 ) ( 1192 1476 -344 ) subway/1_black -80 0 0 0.500000 0.500000 134217728 16777216 0 +( 1152 1488 -276 ) ( 1152 1476 -276 ) ( 1152 1476 -372 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1148 1488 -276 ) ( 1188 1488 -276 ) ( 1188 1488 -372 ) subway/1_black -80 0 0 0.500000 0.500000 134217728 16777216 0 +( 1156 1472 -276 ) ( 1156 1484 -276 ) ( 1156 1484 -372 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1192 1492 -276 ) ( 1152 1492 -276 ) ( 1152 1492 -372 ) subway/1_black -80 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3370 +{ +( 968 1228 -519 ) ( 952 1228 -519 ) ( 952 1205 -496 ) subway/2_stair_side2 0 7 90 0.500000 0.500000 134217728 285212672 0 +( 952 1228 -473 ) ( 952 1251 -496 ) ( 968 1251 -496 ) subway/2_stair_side2 0 7 90 0.500000 0.500000 134217728 285212672 0 +( 952 1228 -473 ) ( 968 1228 -473 ) ( 968 1205 -496 ) subway/2_stair_side2 15 8 90 0.500000 0.500000 134217728 285212672 0 +( 954 1228 -473 ) ( 954 1251 -496 ) ( 954 1228 -519 ) subway/2_open_box3 24 42 -45 0.500000 0.500000 134217728 16777216 0 +( 968 1251 -496 ) ( 952 1251 -496 ) ( 952 1228 -519 ) subway/2_stair_side2 0 7 90 0.500000 0.500000 134217728 285212672 0 +( 952 1251 -496 ) ( 952 1228 -473 ) ( 952 1205 -496 ) subway/2_sign1 0 16 0 -0.500000 0.500000 134217728 0 0 +} +// brush 3371 +{ +( 1168 1464 -552 ) ( 1168 1464 -536 ) ( 1168 1136 -536 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1136 -536 ) ( 1200 1136 -552 ) ( 1168 1136 -552 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1136 -552 ) ( 1200 1136 -536 ) ( 1200 1216 -536 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1168 1464 -536 ) ( 1168 1464 -552 ) ( 1200 1440 -552 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1368 1808 -536 ) ( 1248 1808 -536 ) ( 1248 1832 -536 ) subway/1_tunnelfloor_2 -272 -368 90 1 1 0 285212672 0 +( 1224 1856 -552 ) ( 1224 1832 -552 ) ( 1344 1832 -552 ) subway/1_tunneltrack_plain -784 416 0 0.500000 0.500000 0 301989888 0 +} +// brush 3372 +{ +( 1200 1044 -424 ) ( 1192 1044 -424 ) ( 1192 1012 -424 ) subway/2_stair_side2 0 0 90 0.500000 0.500000 0 285212672 0 +( 1192 1012 -392 ) ( 1192 1044 -392 ) ( 1200 1044 -392 ) subway/2_stair_side2 0 0 90 0.500000 0.500000 0 285212672 0 +( 1192 1012 -408 ) ( 1200 1012 -408 ) ( 1200 1012 -416 ) subway/2_stair_side2 -8 0 90 0.500000 0.500000 0 285212672 0 +( 1208 1012 -408 ) ( 1208 1044 -408 ) ( 1208 1044 -416 ) subway/2_open_box 8 48 0 0.500000 0.500000 0 16777216 0 +( 1200 1044 -408 ) ( 1192 1044 -408 ) ( 1192 1044 -416 ) subway/2_stair_side2 -8 0 90 0.500000 0.500000 0 285212672 0 +( 1200 1044 -408 ) ( 1200 1012 -408 ) ( 1200 1012 -416 ) subway/2_sign1 40 48 0 -0.500000 0.500000 0 0 0 +} +// brush 3373 +{ +( 1200 664 -440 ) ( 1200 664 -432 ) ( 1200 640 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 996 1096 -384 ) ( 996 1096 -376 ) ( 876 1096 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 1044 -424 ) ( 1192 1044 -424 ) ( 1192 1012 -424 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 1012 -384 ) ( 1192 1044 -384 ) ( 1200 1044 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1208 1012 -416 ) ( 1208 1044 -416 ) ( 1208 1044 -424 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 1044 -416 ) ( 1200 1044 -416 ) ( 1192 1044 -424 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3374 +{ +( 1200 960 -336 ) ( 1208 960 -336 ) ( 1200 960 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 664 -440 ) ( 1200 664 -432 ) ( 1200 640 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1216 1588 -352 ) ( 1216 1588 -344 ) ( 1216 1612 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 1044 -424 ) ( 1192 1044 -424 ) ( 1192 1012 -424 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 1012 -384 ) ( 1192 1044 -384 ) ( 1200 1044 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 1012 -416 ) ( 1192 1012 -416 ) ( 1200 1012 -424 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3375 +{ +( 1200 1012 -412 ) ( 1184 1012 -412 ) ( 1184 988 -412 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1184 988 -396 ) ( 1184 1012 -396 ) ( 1200 1012 -396 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1184 988 -364 ) ( 1200 988 -364 ) ( 1200 988 -412 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1200 988 -364 ) ( 1200 1012 -364 ) ( 1200 1012 -412 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1200 1004 -364 ) ( 1184 1004 -364 ) ( 1184 1004 -412 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1196 1012 -364 ) ( 1196 988 -364 ) ( 1196 988 -412 ) subway/light_red 8 8 0 0.500000 0.500000 134217728 16777217 10000 +} +// brush 3376 +{ +( 1200 1076 -412 ) ( 1184 1076 -412 ) ( 1184 1052 -412 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1184 1052 -396 ) ( 1184 1076 -396 ) ( 1200 1076 -396 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1184 1052 -364 ) ( 1200 1052 -364 ) ( 1200 1052 -412 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1200 1052 -364 ) ( 1200 1076 -364 ) ( 1200 1076 -412 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1200 1068 -364 ) ( 1184 1068 -364 ) ( 1184 1068 -412 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 1196 1076 -364 ) ( 1196 1052 -364 ) ( 1196 1052 -412 ) subway/light_red -24 8 0 0.500000 0.500000 134217728 16777217 10000 +} +// brush 3377 +{ +( 1200 960 -336 ) ( 1208 960 -336 ) ( 1200 960 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 468 -352 ) ( 1192 516 -352 ) ( 1200 516 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 664 -440 ) ( 1200 664 -432 ) ( 1200 640 -432 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 996 1096 -384 ) ( 996 1096 -376 ) ( 876 1096 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1216 1588 -352 ) ( 1216 1588 -344 ) ( 1216 1612 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 1044 -384 ) ( 1192 1012 -384 ) ( 1200 1044 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3378 +{ +( 1328 440 -544 ) ( 1208 440 -544 ) ( 1208 416 -544 ) subway/1_tunneltrack_plain 32 -32 0 0.500000 0.500000 0 301989888 0 +( 1232 440 -536 ) ( 1232 464 -536 ) ( 1352 464 -536 ) subway/1_tunneltrack_plain 32 -32 0 1 1 0 301989888 0 +( 1160 1000 -568 ) ( 1280 1000 -568 ) ( 1280 1000 -576 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1264 392 -520 ) ( 1264 416 -520 ) ( 1264 416 -528 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1408 1056 -480 ) ( 1288 1056 -480 ) ( 1288 1056 -488 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1168 952 -520 ) ( 1168 928 -520 ) ( 1168 928 -528 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3379 +{ +( 1200 1080 -544 ) ( 1200 1080 -536 ) ( 1168 1056 -536 ) subway/1_tunnelfloor_2 24 56 0 1 -1 0 285212672 0 +( 1200 1080 -536 ) ( 1200 1080 -544 ) ( 1288 1080 -544 ) subway/1_tunnelfloor_2 24 56 0 1 -1 0 285212672 0 +( 1288 1080 -536 ) ( 1288 1080 -544 ) ( 1272 1064 -544 ) subway/1_tunnelfloor_2 24 56 0 1 -1 0 285212672 0 +( 1160 1056 -568 ) ( 1280 1056 -568 ) ( 1280 1056 -576 ) subway/1_tunnelfloor_2 24 56 0 1 -1 0 285212672 0 +( 1232 456 -536 ) ( 1232 480 -536 ) ( 1352 480 -536 ) subway/1_tunnelfloor_2 24 72 0 1 -1 0 285212672 0 +( 1328 448 -544 ) ( 1208 448 -544 ) ( 1208 424 -544 ) subway/1_tunnelfloor_2 24 72 0 1 -1 0 285212672 0 +} +// brush 3380 +{ +( 1208 1624 -544 ) ( 1208 1600 -544 ) ( 1328 1600 -544 ) subway/1_tunnelfloor_2 24 72 0 1 -1 0 285212672 0 +( 1352 1584 -536 ) ( 1232 1584 -536 ) ( 1232 1608 -536 ) subway/1_tunnelfloor_2 19 43 0 1.400000 1.300000 0 285212672 0 +( 1272 1000 -576 ) ( 1272 1000 -568 ) ( 1152 1000 -568 ) subway/1_tunnelfloor_2 24 56 0 1 -1 0 285212672 0 +( 1264 1000 -544 ) ( 1280 984 -544 ) ( 1280 984 -536 ) subway/1_tunnelfloor_2 24 56 0 1 -1 0 285212672 0 +( 1200 976 -544 ) ( 1200 976 -536 ) ( 1296 976 -536 ) subway/1_tunnelfloor_2 24 56 0 1 -1 0 285212672 0 +( 1200 976 -536 ) ( 1200 976 -544 ) ( 1168 1000 -544 ) subway/1_tunnelfloor_2 24 56 0 1 -1 0 285212672 0 +} +// brush 3381 +{ +( 1264 952 -520 ) ( 1264 928 -520 ) ( 1264 928 -528 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1288 1080 -544 ) ( 1288 1080 -536 ) ( 1272 1064 -536 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1288 976 -544 ) ( 1288 976 -536 ) ( 1288 1080 -536 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1288 976 -536 ) ( 1288 976 -544 ) ( 1272 992 -544 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1248 440 -536 ) ( 1248 464 -536 ) ( 1368 464 -536 ) subway/1_tunnelfloor_2 8 -8 90 1 1 0 285212672 0 +( 1344 440 -544 ) ( 1224 440 -544 ) ( 1224 416 -544 ) subway/1_tunneltrack_plain 32 -32 0 0.500000 0.500000 0 301989888 0 +} +// brush 3382 +{ +( 1208 1096 -536 ) ( 1208 1080 -536 ) ( 1272 1080 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1272 1088 -504 ) ( 1208 1088 -504 ) ( 1208 1096 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 1096 -536 ) ( 1296 1096 -504 ) ( 1208 1096 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 1096 -504 ) ( 1304 1096 -536 ) ( 1288 1080 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1272 1088 -504 ) ( 1272 1080 -536 ) ( 1208 1080 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 1096 -536 ) ( 1208 1096 -520 ) ( 1208 1088 -520 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3383 +{ +( 1208 1096 -504 ) ( 1208 1088 -504 ) ( 1272 1088 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1272 1088 -472 ) ( 1208 1088 -472 ) ( 1208 1096 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 1096 -504 ) ( 1296 1096 -472 ) ( 1208 1096 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 1096 -472 ) ( 1304 1096 -504 ) ( 1296 1088 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 1088 -504 ) ( 1208 1088 -488 ) ( 1272 1088 -488 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 1096 -504 ) ( 1208 1096 -488 ) ( 1208 1088 -488 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3384 +{ +( 1296 1088 -472 ) ( 1296 1088 -504 ) ( 1304 1096 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 968 -472 ) ( 1296 968 -504 ) ( 1296 1088 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 968 -504 ) ( 1296 968 -472 ) ( 1304 960 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 968 -504 ) ( 1304 968 -488 ) ( 1304 1032 -488 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 1032 -472 ) ( 1296 1096 -472 ) ( 1304 1096 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 1096 -504 ) ( 1296 1096 -504 ) ( 1296 1032 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3385 +{ +( 1272 968 -504 ) ( 1208 968 -504 ) ( 1208 960 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 960 -472 ) ( 1208 968 -472 ) ( 1272 968 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 960 -472 ) ( 1296 960 -504 ) ( 1208 960 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 960 -504 ) ( 1304 960 -472 ) ( 1296 968 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1280 968 -488 ) ( 1216 968 -488 ) ( 1216 968 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 968 -488 ) ( 1208 960 -488 ) ( 1208 960 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3386 +{ +( 1280 976 -536 ) ( 1216 976 -536 ) ( 1216 960 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 960 -504 ) ( 1208 968 -504 ) ( 1272 968 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1288 960 -504 ) ( 1288 960 -536 ) ( 1208 960 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 960 -536 ) ( 1304 960 -504 ) ( 1296 968 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1216 976 -536 ) ( 1280 976 -536 ) ( 1280 968 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 968 -520 ) ( 1208 960 -520 ) ( 1208 960 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3387 +{ +( 1304 1096 -536 ) ( 1304 1096 -504 ) ( 1296 1088 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 1032 -504 ) ( 1288 1032 -536 ) ( 1288 1096 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 960 -504 ) ( 1304 960 -536 ) ( 1288 976 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 1096 -504 ) ( 1304 1096 -536 ) ( 1304 952 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1296 1032 -504 ) ( 1296 1096 -504 ) ( 1304 1096 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 1096 -536 ) ( 1288 1096 -536 ) ( 1288 1032 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3388 +{ +( 1296 1040 -504 ) ( 1288 1040 -504 ) ( 1288 1008 -504 ) subway/2_stair_side2 72 -16 90 0.500000 0.500000 134217728 285212672 0 +( 1288 1008 -472 ) ( 1288 1040 -472 ) ( 1296 1040 -472 ) subway/2_stair_side2 72 -16 90 0.500000 0.500000 134217728 285212672 0 +( 1288 1008 -488 ) ( 1296 1008 -488 ) ( 1296 1008 -496 ) subway/2_stair_side2 40 -16 90 0.500000 0.500000 134217728 285212672 0 +( 1296 1008 -488 ) ( 1296 1040 -488 ) ( 1296 1040 -496 ) subway/2_open_box 16 16 0 0.500000 0.500000 134217728 16777216 0 +( 1296 1040 -488 ) ( 1288 1040 -488 ) ( 1288 1040 -496 ) subway/2_stair_side2 40 -16 90 0.500000 0.500000 134217728 285212672 0 +( 1292 1040 -488 ) ( 1292 1008 -488 ) ( 1292 1008 -496 ) subway/2_open_box 32 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3389 +{ +( 1208 1096 -456 ) ( 1208 1088 -456 ) ( 1272 1088 -456 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1272 1088 -440 ) ( 1208 1088 -440 ) ( 1208 1096 -440 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1288 1096 -456 ) ( 1288 1096 -440 ) ( 1208 1096 -440 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1304 1096 -440 ) ( 1304 1096 -456 ) ( 1296 1088 -456 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1208 1088 -480 ) ( 1208 1088 -464 ) ( 1272 1088 -464 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1208 1096 -480 ) ( 1208 1096 -464 ) ( 1208 1088 -464 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +} +// brush 3390 +{ +( 1304 1096 -456 ) ( 1296 1096 -456 ) ( 1296 1032 -456 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1296 1032 -440 ) ( 1296 1096 -440 ) ( 1304 1096 -440 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1304 968 -480 ) ( 1304 968 -464 ) ( 1304 1032 -464 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1296 968 -456 ) ( 1296 968 -440 ) ( 1304 960 -440 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1296 968 -440 ) ( 1296 968 -456 ) ( 1296 1088 -456 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1296 1088 -440 ) ( 1296 1088 -456 ) ( 1304 1096 -456 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +} +// brush 3391 +{ +( 1208 968 -464 ) ( 1208 960 -464 ) ( 1208 960 -480 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1280 968 -464 ) ( 1216 968 -464 ) ( 1216 968 -480 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1304 960 -456 ) ( 1304 960 -440 ) ( 1296 968 -440 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1296 960 -440 ) ( 1296 960 -456 ) ( 1208 960 -456 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1208 960 -440 ) ( 1208 968 -440 ) ( 1272 968 -440 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1272 968 -456 ) ( 1208 968 -456 ) ( 1208 960 -456 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +} +// brush 3392 +{ +( 1208 1096 -464 ) ( 1208 1096 -448 ) ( 1208 1088 -448 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1304 960 -432 ) ( 1304 960 -440 ) ( 1216 960 -440 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1296 1088 -440 ) ( 1296 1088 -432 ) ( 1296 1096 -432 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1288 1096 -440 ) ( 1288 1096 -424 ) ( 1208 1096 -424 ) subway/metalrib1 0 15 90 0.500000 0.500000 0 16777216 0 +( 1272 1088 -432 ) ( 1208 1088 -432 ) ( 1208 1096 -432 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1208 1096 -440 ) ( 1208 1088 -440 ) ( 1272 1088 -440 ) subway/con10 16 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3393 +{ +( 1248 1032 -440 ) ( 1248 1008 -440 ) ( 1248 1008 -456 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1264 1032 -440 ) ( 1240 1032 -440 ) ( 1240 1032 -456 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1264 1008 -440 ) ( 1264 1032 -440 ) ( 1264 1032 -456 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1240 1016 -440 ) ( 1264 1016 -440 ) ( 1264 1016 -456 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1240 1008 -440 ) ( 1240 1032 -440 ) ( 1264 1032 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1264 1032 -444 ) ( 1240 1032 -444 ) ( 1240 1008 -444 ) subway/light_yellow 0 -16 0 0.500000 0.500000 134217728 16777217 10000 +} +// brush 3394 +{ +( 1064 948 -496 ) ( 1040 948 -496 ) ( 1040 772 -496 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 1040 772 -480 ) ( 1040 948 -480 ) ( 1064 948 -480 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 1064 1176 -480 ) ( 1064 1176 -496 ) ( 1064 832 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1048 832 -504 ) ( 1048 832 -488 ) ( 1072 832 -488 ) subway/1_tunnelwall 16 0 0 0.500000 0.500000 0 301989888 0 +( 1048 1176 -496 ) ( 1048 1176 -480 ) ( 1048 832 -480 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1048 1176 -480 ) ( 1048 1176 -496 ) ( 1064 1176 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +} +// brush 3395 +{ +( 1360 588 -536 ) ( 1240 588 -536 ) ( 1240 564 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1248 548 -520 ) ( 1248 572 -520 ) ( 1368 572 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1064 296 -520 ) ( 1064 320 -520 ) ( 1064 320 -528 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1048 508 -448 ) ( 1048 484 -448 ) ( 1048 484 -456 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1096 832 -264 ) ( 1040 832 -264 ) ( 1040 832 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1016 1136 -496 ) ( 1072 1136 -512 ) ( 1072 1136 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +} +// brush 3396 +{ +( 1360 588 -520 ) ( 1240 588 -520 ) ( 1240 564 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1248 548 -496 ) ( 1248 572 -496 ) ( 1368 572 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1208 628 -552 ) ( 1328 628 -552 ) ( 1328 628 -560 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 320 -504 ) ( 1064 344 -504 ) ( 1064 344 -512 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1384 1136 -464 ) ( 1264 1136 -464 ) ( 1264 1136 -472 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1048 460 -432 ) ( 1048 436 -432 ) ( 1048 436 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1104 832 -264 ) ( 1056 832 -264 ) ( 1056 832 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3397 +{ +( 1360 588 -480 ) ( 1240 588 -480 ) ( 1240 564 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1248 548 -448 ) ( 1248 572 -448 ) ( 1368 572 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1200 172 -512 ) ( 1320 172 -512 ) ( 1320 172 -520 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1064 328 -480 ) ( 1064 352 -480 ) ( 1064 352 -488 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1384 1136 -424 ) ( 1264 1136 -424 ) ( 1264 1136 -432 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1048 1116 -392 ) ( 1048 1092 -392 ) ( 1048 1092 -400 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1064 832 -264 ) ( 1032 832 -264 ) ( 1032 832 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3398 +{ +( 1064 832 -448 ) ( 1056 832 -336 ) ( 1064 832 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 388 -352 ) ( 1072 388 -352 ) ( 1072 340 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1368 988 -448 ) ( 1248 988 -448 ) ( 1248 964 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 688 -432 ) ( 1064 712 -432 ) ( 1064 712 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1388 1136 -376 ) ( 1268 1136 -376 ) ( 1268 1136 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1048 1476 -344 ) ( 1048 1452 -344 ) ( 1048 1452 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3399 +{ +( 1200 1476 -408 ) ( 1192 1476 -408 ) ( 1200 1476 -416 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1192 1476 -392 ) ( 1192 1508 -392 ) ( 1200 1508 -392 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 1508 -424 ) ( 1192 1508 -424 ) ( 1192 1476 -424 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1216 2052 -344 ) ( 1216 2052 -336 ) ( 1216 2076 -336 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1200 1128 -432 ) ( 1200 1128 -424 ) ( 1200 1104 -424 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +( 1200 1424 -328 ) ( 1208 1424 -328 ) ( 1200 1424 -440 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +} +// brush 3400 +{ +( 1192 1508 -408 ) ( 1200 1508 -408 ) ( 1192 1508 -416 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1208 1476 -408 ) ( 1208 1508 -408 ) ( 1208 1508 -416 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1192 1476 -392 ) ( 1192 1508 -392 ) ( 1200 1508 -392 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 1508 -424 ) ( 1192 1508 -424 ) ( 1192 1476 -424 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 996 1560 -376 ) ( 996 1560 -368 ) ( 876 1560 -368 ) subway/1_tunnelwall 0 32 0 0.500000 0.500000 0 301989888 0 +( 1200 1128 -432 ) ( 1200 1128 -424 ) ( 1200 1104 -424 ) subway/1_tunnelwall 0 8 0 1 1 0 301989888 0 +} +// brush 3401 +{ +( 1200 1508 -408 ) ( 1200 1476 -408 ) ( 1200 1476 -416 ) subway/2_sign1 8 48 0 -0.500000 0.500000 0 0 0 +( 1200 1508 -408 ) ( 1192 1508 -408 ) ( 1192 1508 -416 ) subway/2_stair_side2 -8 0 90 0.500000 0.500000 134217728 285212672 0 +( 1208 1476 -408 ) ( 1208 1508 -408 ) ( 1208 1508 -416 ) subway/2_open_box -24 48 0 0.500000 0.500000 134217728 16777216 0 +( 1192 1476 -408 ) ( 1200 1476 -408 ) ( 1200 1476 -416 ) subway/2_stair_side2 -8 0 90 0.500000 0.500000 134217728 285212672 0 +( 1192 1476 -392 ) ( 1192 1508 -392 ) ( 1200 1508 -392 ) subway/2_stair_side2 0 0 90 0.500000 0.500000 134217728 285212672 0 +( 1200 1508 -424 ) ( 1192 1508 -424 ) ( 1192 1476 -424 ) subway/2_stair_side2 0 0 90 0.500000 0.500000 134217728 285212672 0 +} +// brush 3402 +{ +( 1192 1508 -392 ) ( 1192 1476 -392 ) ( 1200 1508 -392 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1216 2052 -352 ) ( 1216 2052 -344 ) ( 1216 2076 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 996 1560 -384 ) ( 996 1560 -376 ) ( 876 1560 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 1128 -440 ) ( 1200 1128 -432 ) ( 1200 1104 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1192 932 -352 ) ( 1192 980 -352 ) ( 1200 980 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 1424 -336 ) ( 1208 1424 -336 ) ( 1200 1424 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3403 +{ +( 1196 1540 -372 ) ( 1196 1516 -372 ) ( 1196 1516 -420 ) subway/light_red -920 -8 0 0.500000 0.500000 134217728 16777217 10000 +( 1200 1532 -372 ) ( 1184 1532 -372 ) ( 1184 1532 -420 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1200 1516 -372 ) ( 1200 1540 -372 ) ( 1200 1540 -420 ) subway/1_black -960 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1184 1516 -372 ) ( 1200 1516 -372 ) ( 1200 1516 -420 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1184 1516 -404 ) ( 1184 1540 -404 ) ( 1200 1540 -404 ) subway/1_black -16 960 0 0.500000 0.500000 134217728 16777216 0 +( 1200 1540 -420 ) ( 1184 1540 -420 ) ( 1184 1516 -420 ) subway/1_black -16 960 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3404 +{ +( 1092 1504 -348 ) ( 1092 1480 -348 ) ( 1140 1480 -348 ) subway/light_red -904 -16 0 0.500000 0.500000 134217728 16777217 10000 +( 1092 1496 -344 ) ( 1092 1496 -360 ) ( 1140 1496 -360 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1092 1480 -344 ) ( 1092 1504 -344 ) ( 1140 1504 -344 ) subway/1_black -832 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1092 1480 -360 ) ( 1092 1480 -344 ) ( 1140 1480 -344 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1124 1480 -360 ) ( 1124 1504 -360 ) ( 1124 1504 -344 ) subway/1_black -16 832 0 0.500000 0.500000 134217728 16777216 0 +( 1140 1504 -344 ) ( 1140 1504 -360 ) ( 1140 1480 -360 ) subway/1_black -16 832 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3405 +{ +( 1104 784 -344 ) ( 1104 784 -352 ) ( 1072 784 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1100 896 -336 ) ( 1100 1568 -336 ) ( 1100 1568 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1080 1136 -352 ) ( 1080 1136 -344 ) ( 1048 1136 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 -384 -352 ) ( 1064 600 -352 ) ( 1064 600 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1104 400 -336 ) ( 1104 -272 -336 ) ( 1072 -272 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1072 600 -352 ) ( 1072 -384 -352 ) ( 1104 -384 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +} +// brush 3406 +{ +( 1292 96 -312 ) ( 1292 96 -344 ) ( 1244 96 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1164 632 -536 ) ( 1164 632 -576 ) ( 1164 624 -576 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1324 1136 -344 ) ( 1324 1136 -312 ) ( 1276 1136 -312 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1100 680 -312 ) ( 1100 416 -312 ) ( 1100 416 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1180 376 -336 ) ( 1180 640 -336 ) ( 1212 640 -336 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1284 520 -352 ) ( 1284 528 -352 ) ( 1236 528 -352 ) subway/1_tunnel_ceiling2 156 0 0 1 1 0 16777216 0 +( 1164 784 -264 ) ( 1084 784 -264 ) ( 1084 784 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3407 +{ +( 1168 600 -352 ) ( 1168 -384 -352 ) ( 1200 -384 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1192 400 -336 ) ( 1192 -272 -336 ) ( 1160 -272 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1164 1808 -352 ) ( 1164 2792 -352 ) ( 1164 2792 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1184 1136 -352 ) ( 1184 1136 -344 ) ( 1152 1136 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 -272 -336 ) ( 1200 400 -336 ) ( 1200 400 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 784 -344 ) ( 1200 784 -352 ) ( 1168 784 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3408 +{ +( 1168 1264 -528 ) ( 1168 1264 -520 ) ( 1168 1240 -520 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1168 1056 -536 ) ( 1200 1080 -536 ) ( 1200 1080 -552 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1200 1224 -552 ) ( 1200 1080 -552 ) ( 1200 1080 -536 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1296 1136 -576 ) ( 1296 1136 -568 ) ( 1176 1136 -568 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1368 1728 -536 ) ( 1248 1728 -536 ) ( 1248 1752 -536 ) subway/1_tunnelfloor_2 -272 -368 90 1 1 0 285212672 0 +( 1224 1776 -552 ) ( 1224 1752 -552 ) ( 1344 1752 -552 ) subway/1_tunneltrack_plain -784 416 0 0.500000 0.500000 0 301989888 0 +} +// brush 3409 +{ +( 1280 128 -504 ) ( 1280 128 -536 ) ( 1232 128 -536 ) subway/metal2 -712 0 0 0.500000 0.500000 0 16777216 0 +( 1096 632 -728 ) ( 1096 632 -768 ) ( 1096 624 -768 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1280 1136 -536 ) ( 1280 1136 -504 ) ( 1232 1136 -504 ) subway/metal2 -712 0 0 0.500000 0.500000 0 16777216 0 +( 1088 816 -516 ) ( 1088 552 -516 ) ( 1088 552 -548 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1176 408 -528 ) ( 1176 672 -528 ) ( 1208 672 -528 ) subway/metal2 -712 416 0 0.500000 0.500000 0 16777216 0 +( 1280 544 -536 ) ( 1280 552 -536 ) ( 1232 552 -536 ) subway/metal2 -712 416 0 0.500000 0.500000 0 16777216 0 +( 1120 832 -264 ) ( 1056 832 -264 ) ( 1056 832 -254 ) subway/1_tunneltrack_1 422 -115 195 1 1 0 16777216 0 +} +// brush 3410 +{ +( 1332 768 -544 ) ( 1212 768 -544 ) ( 1212 744 -544 ) subway/1_tunneltrack_3 36 -24 0 1 1 0 16777216 0 +( 1212 728 -536 ) ( 1212 752 -536 ) ( 1332 752 -536 ) subway/1_tunneltrack_3 52 -24 0 1 1 0 16777216 0 +( 1140 1464 -568 ) ( 1260 1464 -568 ) ( 1260 1464 -576 ) subway/1_tunneltrack_3 36 -24 0 1 1 0 16777216 0 +( 1168 1336 -520 ) ( 1168 1360 -520 ) ( 1168 1360 -528 ) subway/1_tunneltrack_3 36 -24 0 1 1 0 16777216 0 +( 1360 1528 -480 ) ( 1240 1528 -480 ) ( 1240 1528 -488 ) subway/1_tunneltrack_3 36 -24 0 1 1 0 16777216 0 +( 1096 328 -512 ) ( 1096 304 -512 ) ( 1096 304 -520 ) subway/1_tunneltrack_3 36 -24 0 1 1 0 16777216 0 +} +// brush 3411 +{ +( 1356 544 -536 ) ( 1356 552 -536 ) ( 1308 552 -536 ) subway/metal2 -752 416 0 0.500000 0.500000 0 16777216 0 +( 1252 408 -528 ) ( 1252 672 -528 ) ( 1284 672 -528 ) subway/metal2 -752 416 0 0.500000 0.500000 0 16777216 0 +( 1164 320 -516 ) ( 1164 56 -516 ) ( 1164 56 -548 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1356 1136 -536 ) ( 1356 1136 -504 ) ( 1308 1136 -504 ) subway/metal2 -752 0 0 0.500000 0.500000 0 16777216 0 +( 1172 1136 -728 ) ( 1172 1136 -768 ) ( 1172 1128 -768 ) subway/metal2 -416 0 0 0.500000 0.500000 0 16777216 0 +( 1356 128 -504 ) ( 1356 128 -536 ) ( 1308 128 -536 ) subway/metal2 -752 0 0 0.500000 0.500000 0 16777216 0 +( 1180 832 -264 ) ( 1140 832 -264 ) ( 1140 832 -254 ) subway/1_tunneltrack_1 441 -109 195 1 1 0 16777216 0 +} +// brush 3412 +{ +( 1048 640 -544 ) ( 1048 664 -544 ) ( 928 664 -544 ) subway/1_tunnelfloor_2 216 -144 0 1 -1 0 285212672 0 +( 904 696 -536 ) ( 1024 696 -536 ) ( 1024 672 -536 ) subway/1_tunnelfloor_2 216 -144 0 1 -1 0 285212672 0 +( 976 1272 -576 ) ( 976 1272 -568 ) ( 1096 1272 -568 ) subway/1_tunnelfloor_2 216 56 0 1 -1 0 285212672 0 +( 992 1280 -544 ) ( 976 1296 -544 ) ( 976 1296 -536 ) subway/1_tunnelfloor_2 -192 56 0 1 -1 0 285212672 0 +( 1064 1296 -544 ) ( 1064 1296 -536 ) ( 968 1296 -536 ) subway/1_tunnelfloor_2 216 56 0 1 -1 0 285212672 0 +( 1064 1296 -536 ) ( 1064 1296 -544 ) ( 1088 1272 -544 ) subway/1_tunnelfloor_2 216 56 0 1 -1 0 285212672 0 +} +// brush 3413 +{ +( 1056 1312 -496 ) ( 1056 1312 -480 ) ( 1064 1312 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1056 1312 -480 ) ( 1056 1312 -496 ) ( 1056 1600 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1080 1600 -488 ) ( 1056 1600 -488 ) ( 1056 1600 -504 ) subway/1_tunnelwall 16 0 0 0.500000 0.500000 0 301989888 0 +( 1064 1656 -496 ) ( 1064 1312 -496 ) ( 1064 1312 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1064 1540 -480 ) ( 1040 1540 -480 ) ( 1040 1716 -480 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 1040 1716 -496 ) ( 1040 1540 -496 ) ( 1064 1540 -496 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3414 +{ +( 1048 632 -544 ) ( 1048 656 -544 ) ( 928 656 -544 ) subway/1_tunneltrack_plain 416 400 0 0.500000 0.500000 0 301989888 0 +( 904 680 -536 ) ( 1024 680 -536 ) ( 1024 656 -536 ) subway/1_tunneltrack_plain 416 400 0 1 1 0 301989888 0 +( 976 1216 -576 ) ( 976 1216 -568 ) ( 1096 1216 -568 ) subway/1_tunneltrack_plain 416 0 0 0.500000 0.500000 0 301989888 0 +( 1000 632 -528 ) ( 1000 632 -520 ) ( 1000 608 -520 ) subway/1_tunneltrack_plain -400 0 0 0.500000 0.500000 0 301989888 0 +( 968 1272 -488 ) ( 968 1272 -480 ) ( 848 1272 -480 ) subway/1_tunneltrack_plain 416 0 0 0.500000 0.500000 0 301989888 0 +( 1088 1144 -528 ) ( 1088 1144 -520 ) ( 1088 1168 -520 ) subway/1_tunneltrack_plain -400 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3415 +{ +( 928 1816 -544 ) ( 1048 1816 -544 ) ( 1048 1840 -544 ) subway/1_tunnelfloor_2 216 -144 0 1 -1 0 285212672 0 +( 1024 1824 -536 ) ( 1024 1800 -536 ) ( 904 1800 -536 ) subway/1_tunnelfloor_2 156 200 0 1 1 0 285212672 0 +( 1104 1216 -568 ) ( 984 1216 -568 ) ( 984 1216 -576 ) subway/1_tunnelfloor_2 216 56 0 1 -1 0 285212672 0 +( 984 1200 -536 ) ( 984 1200 -544 ) ( 1000 1216 -544 ) subway/1_tunnelfloor_2 -192 56 0 1 -1 0 285212672 0 +( 1064 1192 -536 ) ( 1064 1192 -544 ) ( 968 1192 -544 ) subway/1_tunnelfloor_2 216 56 0 1 -1 0 285212672 0 +( 1064 1192 -544 ) ( 1064 1192 -536 ) ( 1088 1216 -536 ) subway/1_tunnelfloor_2 216 56 0 1 -1 0 285212672 0 +} +// brush 3416 +{ +( 1000 1144 -528 ) ( 1000 1144 -520 ) ( 1000 1168 -520 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +( 992 1280 -536 ) ( 976 1296 -536 ) ( 976 1296 -544 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +( 976 1296 -536 ) ( 976 1192 -536 ) ( 976 1192 -544 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +( 992 1208 -544 ) ( 976 1192 -544 ) ( 976 1192 -536 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +( 896 680 -536 ) ( 1016 680 -536 ) ( 1016 656 -536 ) subway/1_tunnelfloor_2 -15 15 90 1 -1 0 285212672 0 +( 1040 632 -544 ) ( 1040 656 -544 ) ( 920 656 -544 ) subway/1_tunneltrack_plain 16 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3417 +{ +( 992 1296 -536 ) ( 1056 1296 -536 ) ( 1056 1312 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 1312 -504 ) ( 1056 1304 -504 ) ( 992 1304 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 1312 -504 ) ( 968 1312 -504 ) ( 968 1312 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 976 1296 -536 ) ( 960 1312 -536 ) ( 960 1312 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 1296 -536 ) ( 992 1296 -536 ) ( 992 1304 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 1304 -520 ) ( 1056 1312 -520 ) ( 1056 1312 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3418 +{ +( 968 1304 -504 ) ( 960 1312 -504 ) ( 960 1312 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 976 1312 -536 ) ( 976 1248 -536 ) ( 968 1248 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 976 1192 -536 ) ( 960 1176 -536 ) ( 960 1176 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 960 1168 -536 ) ( 960 1312 -536 ) ( 960 1312 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 960 1312 -504 ) ( 968 1312 -504 ) ( 968 1248 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 976 1248 -536 ) ( 976 1312 -536 ) ( 960 1312 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3419 +{ +( 1048 1176 -536 ) ( 1048 1192 -536 ) ( 984 1192 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 992 1184 -504 ) ( 1056 1184 -504 ) ( 1056 1176 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 1176 -536 ) ( 976 1176 -536 ) ( 976 1176 -504 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 968 1184 -504 ) ( 960 1176 -504 ) ( 960 1176 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 984 1184 -504 ) ( 984 1192 -536 ) ( 1048 1192 -536 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 1176 -536 ) ( 1056 1176 -520 ) ( 1056 1184 -520 ) subway/con11 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3420 +{ +( 1056 1176 -504 ) ( 1056 1184 -504 ) ( 992 1184 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 992 1184 -472 ) ( 1056 1184 -472 ) ( 1056 1176 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 1176 -504 ) ( 968 1176 -504 ) ( 968 1176 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 968 1184 -472 ) ( 960 1176 -472 ) ( 960 1176 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1048 1184 -504 ) ( 1048 1184 -488 ) ( 984 1184 -488 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 1176 -504 ) ( 1056 1176 -488 ) ( 1056 1184 -488 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3421 +{ +( 960 1312 -504 ) ( 968 1304 -504 ) ( 968 1304 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 968 1304 -504 ) ( 968 1184 -504 ) ( 968 1184 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 960 1176 -472 ) ( 968 1184 -472 ) ( 968 1184 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 960 1248 -488 ) ( 960 1184 -488 ) ( 960 1184 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 960 1312 -472 ) ( 968 1312 -472 ) ( 968 1248 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 968 1248 -504 ) ( 968 1312 -504 ) ( 960 1312 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3422 +{ +( 992 1304 -504 ) ( 1056 1304 -504 ) ( 1056 1312 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 1312 -472 ) ( 1056 1304 -472 ) ( 992 1304 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 1312 -472 ) ( 968 1312 -472 ) ( 968 1312 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 968 1304 -504 ) ( 960 1312 -504 ) ( 960 1312 -472 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 992 1304 -488 ) ( 1056 1304 -488 ) ( 1056 1304 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 1304 -488 ) ( 1056 1312 -488 ) ( 1056 1312 -504 ) subway/con12 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3423 +{ +( 992 1304 -472 ) ( 1056 1304 -472 ) ( 1056 1312 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1056 1312 -456 ) ( 1056 1304 -456 ) ( 992 1304 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1056 1312 -456 ) ( 976 1312 -456 ) ( 976 1312 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 968 1304 -472 ) ( 960 1312 -472 ) ( 960 1312 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 992 1304 -480 ) ( 1056 1304 -480 ) ( 1056 1304 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1056 1304 -480 ) ( 1056 1312 -480 ) ( 1056 1312 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 3424 +{ +( 968 1248 -472 ) ( 968 1312 -472 ) ( 960 1312 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 960 1312 -456 ) ( 968 1312 -456 ) ( 968 1248 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 960 1248 -480 ) ( 960 1184 -480 ) ( 960 1184 -496 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 960 1176 -456 ) ( 968 1184 -456 ) ( 968 1184 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 968 1304 -472 ) ( 968 1184 -472 ) ( 968 1184 -456 ) subway/1_trim1 -8 0 0 1 1 0 0 0 +( 960 1312 -472 ) ( 968 1304 -472 ) ( 968 1304 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 3425 +{ +( 1056 1176 -496 ) ( 1056 1176 -480 ) ( 1056 1184 -480 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1048 1184 -496 ) ( 1048 1184 -480 ) ( 984 1184 -480 ) subway/1_trim1 0 0 0 -1 1 0 0 0 +( 968 1184 -456 ) ( 960 1176 -456 ) ( 960 1176 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1056 1176 -472 ) ( 968 1176 -472 ) ( 968 1176 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 992 1184 -456 ) ( 1056 1184 -456 ) ( 1056 1176 -456 ) subway/1_trim1 0 0 0 1 1 0 0 0 +( 1056 1176 -472 ) ( 1056 1184 -472 ) ( 992 1184 -472 ) subway/1_trim1 0 0 0 1 1 0 0 0 +} +// brush 3426 +{ +( 1016 1224 -456 ) ( 1016 1224 -440 ) ( 1016 1248 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1024 1248 -456 ) ( 1024 1248 -440 ) ( 1000 1248 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1000 1248 -456 ) ( 1000 1248 -440 ) ( 1000 1224 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1000 1232 -456 ) ( 1000 1232 -440 ) ( 1024 1232 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1000 1248 -440 ) ( 1024 1248 -440 ) ( 1024 1224 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1024 1224 -444 ) ( 1024 1248 -444 ) ( 1000 1248 -444 ) subway/light_yellow 16 0 0 0.500000 0.500000 134217728 16777217 10000 +} +// brush 3427 +{ +( 1056 1304 -448 ) ( 1056 1312 -448 ) ( 1056 1312 -464 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1048 1176 -440 ) ( 960 1176 -440 ) ( 960 1176 -432 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 968 1312 -432 ) ( 968 1304 -432 ) ( 968 1304 -440 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1056 1312 -424 ) ( 976 1312 -424 ) ( 976 1312 -440 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1056 1312 -432 ) ( 1056 1304 -432 ) ( 992 1304 -432 ) subway/metalrib1 -16 0 90 0.500000 0.500000 0 16777216 0 +( 992 1304 -440 ) ( 1056 1304 -440 ) ( 1056 1312 -440 ) subway/con10 16 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3428 +{ +( 976 1224 -504 ) ( 976 1256 -504 ) ( 968 1256 -504 ) subway/2_stair_side2 -360 479 90 0.500000 0.500000 134217728 285212672 0 +( 968 1256 -472 ) ( 976 1256 -472 ) ( 976 1224 -472 ) subway/2_stair_side2 -360 479 90 0.500000 0.500000 134217728 285212672 0 +( 968 1224 -496 ) ( 968 1224 -488 ) ( 976 1224 -488 ) subway/2_stair_side2 39 480 90 0.500000 0.500000 134217728 285212672 0 +( 968 1256 -496 ) ( 968 1256 -488 ) ( 968 1224 -488 ) subway/2_open_box -416 16 0 0.500000 0.500000 134217728 16777216 0 +( 976 1256 -496 ) ( 976 1256 -488 ) ( 968 1256 -488 ) subway/2_stair_side2 39 480 90 0.500000 0.500000 134217728 285212672 0 +( 972 1224 -496 ) ( 972 1224 -488 ) ( 972 1256 -488 ) subway/2_open_box -400 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3429 +{ +( 1016 1600 -496 ) ( 1072 1600 -512 ) ( 1072 1600 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1096 1312 -264 ) ( 1040 1312 -264 ) ( 1040 1312 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1048 988 -448 ) ( 1048 964 -448 ) ( 1048 964 -456 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1064 720 -520 ) ( 1064 744 -520 ) ( 1064 744 -528 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1248 1028 -520 ) ( 1248 1052 -520 ) ( 1368 1052 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1360 1068 -536 ) ( 1240 1068 -536 ) ( 1240 1044 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3430 +{ +( 1104 1312 -264 ) ( 1056 1312 -264 ) ( 1056 1312 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1048 940 -432 ) ( 1048 916 -432 ) ( 1048 916 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1384 1600 -464 ) ( 1264 1600 -464 ) ( 1264 1600 -472 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 744 -504 ) ( 1064 768 -504 ) ( 1064 768 -512 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1208 1108 -552 ) ( 1328 1108 -552 ) ( 1328 1108 -560 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1248 1028 -496 ) ( 1248 1052 -496 ) ( 1368 1052 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1360 1068 -520 ) ( 1240 1068 -520 ) ( 1240 1044 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3431 +{ +( 1064 1312 -264 ) ( 1032 1312 -264 ) ( 1032 1312 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1048 1596 -392 ) ( 1048 1572 -392 ) ( 1048 1572 -400 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1384 1600 -424 ) ( 1264 1600 -424 ) ( 1264 1600 -432 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1064 792 -480 ) ( 1064 816 -480 ) ( 1064 816 -488 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1200 652 -512 ) ( 1320 652 -512 ) ( 1320 652 -520 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1248 1028 -448 ) ( 1248 1052 -448 ) ( 1368 1052 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1360 1068 -480 ) ( 1240 1068 -480 ) ( 1240 1044 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3432 +{ +( 1216 2092 -512 ) ( 1216 2092 -504 ) ( 1216 2116 -504 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 996 1600 -544 ) ( 996 1600 -536 ) ( 876 1600 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1200 1168 -584 ) ( 1200 1168 -576 ) ( 1200 1144 -576 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1016 1596 -536 ) ( 1016 1620 -536 ) ( 896 1620 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1192 972 -520 ) ( 1192 1020 -520 ) ( 1200 1020 -520 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1208 1560 -496 ) ( 1216 1560 -496 ) ( 1208 1560 -608 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +} +// brush 3433 +{ +( 1208 1560 -472 ) ( 1216 1560 -472 ) ( 1208 1560 -584 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1192 972 -496 ) ( 1192 1020 -496 ) ( 1200 1020 -496 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1016 1596 -520 ) ( 1016 1620 -520 ) ( 896 1620 -520 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1200 1168 -568 ) ( 1200 1168 -560 ) ( 1200 1144 -560 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 996 1600 -520 ) ( 996 1600 -512 ) ( 876 1600 -512 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1216 2092 -488 ) ( 1216 2092 -480 ) ( 1216 2116 -480 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +} +// brush 3434 +{ +( 1216 2092 -440 ) ( 1216 2092 -432 ) ( 1216 2116 -432 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 996 1600 -472 ) ( 996 1600 -464 ) ( 876 1600 -464 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1200 1168 -528 ) ( 1200 1168 -520 ) ( 1200 1144 -520 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1016 1596 -480 ) ( 1016 1620 -480 ) ( 896 1620 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1192 972 -448 ) ( 1192 1020 -448 ) ( 1200 1020 -448 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1208 1560 -424 ) ( 1216 1560 -424 ) ( 1208 1560 -536 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +} +// brush 3435 +{ +( 1216 2092 -352 ) ( 1216 2092 -344 ) ( 1216 2116 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 996 1600 -384 ) ( 996 1600 -376 ) ( 876 1600 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 1168 -440 ) ( 1200 1168 -432 ) ( 1200 1144 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1016 1596 -448 ) ( 1016 1620 -448 ) ( 896 1620 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 972 -352 ) ( 1192 1020 -352 ) ( 1200 1020 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1208 1560 -336 ) ( 1216 1560 -336 ) ( 1208 1560 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3436 +{ +( 1068 644 -540 ) ( 1044 644 -540 ) ( 1044 620 -540 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1044 620 -476 ) ( 1044 644 -476 ) ( 1068 644 -476 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1044 620 -476 ) ( 1068 620 -476 ) ( 1068 620 -492 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1068 620 -476 ) ( 1068 644 -476 ) ( 1068 644 -492 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1068 644 -476 ) ( 1044 644 -476 ) ( 1044 644 -492 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +( 1044 644 -476 ) ( 1044 620 -476 ) ( 1044 620 -492 ) subway/clip 0 0 0 0.500000 0.500000 196608 128 0 +} +// brush 3437 +{ +( 1068 872 -396 ) ( 1068 872 -348 ) ( 1068 896 -348 ) subway/light_red 80 -24 0 0.500000 0.500000 134217728 16777217 10000 +( 1080 888 -396 ) ( 1080 888 -348 ) ( 1064 888 -348 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 896 -396 ) ( 1064 896 -348 ) ( 1064 872 -348 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 872 -396 ) ( 1064 872 -348 ) ( 1080 872 -348 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 896 -380 ) ( 1080 896 -380 ) ( 1080 872 -380 ) subway/1_black -16 16 0 0.500000 0.500000 134217728 16777216 0 +( 1080 872 -396 ) ( 1080 896 -396 ) ( 1064 896 -396 ) subway/1_black -16 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3438 +{ +( 1068 824 -396 ) ( 1068 824 -348 ) ( 1068 848 -348 ) subway/light_red 80 -24 0 0.500000 0.500000 134217728 16777217 10000 +( 1080 840 -396 ) ( 1080 840 -348 ) ( 1064 840 -348 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 848 -396 ) ( 1064 848 -348 ) ( 1064 824 -348 ) subway/1_black 80 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 824 -396 ) ( 1064 824 -348 ) ( 1080 824 -348 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 1064 848 -380 ) ( 1080 848 -380 ) ( 1080 824 -380 ) subway/1_black -16 -80 0 0.500000 0.500000 134217728 16777216 0 +( 1080 824 -396 ) ( 1080 848 -396 ) ( 1064 848 -396 ) subway/1_black -16 -80 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3439 +{ +( 1064 856 -432 ) ( 1064 880 -432 ) ( 1064 880 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1388 1312 -376 ) ( 1268 1312 -376 ) ( 1268 1312 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1072 1228 -424 ) ( 1072 1260 -424 ) ( 1064 1260 -424 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1260 -392 ) ( 1072 1260 -392 ) ( 1072 1228 -392 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1056 1260 -424 ) ( 1056 1260 -416 ) ( 1056 1228 -416 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1072 1260 -424 ) ( 1064 1260 -416 ) ( 1072 1260 -416 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3440 +{ +( 996 1096 -384 ) ( 996 1096 -376 ) ( 876 1096 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1216 1588 -352 ) ( 1216 1588 -344 ) ( 1216 1612 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 1044 -432 ) ( 1192 1044 -432 ) ( 1192 1012 -432 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 1012 -400 ) ( 1192 1044 -400 ) ( 1200 1044 -400 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 1012 -416 ) ( 1200 1012 -416 ) ( 1200 1012 -424 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1208 1044 -416 ) ( 1208 1012 -416 ) ( 1208 1044 -424 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3441 +{ +( 1064 1176 -448 ) ( 1056 1176 -336 ) ( 1064 1176 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 856 -432 ) ( 1064 880 -432 ) ( 1064 880 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1048 1828 -344 ) ( 1048 1804 -344 ) ( 1048 1804 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1072 1228 -424 ) ( 1072 1260 -424 ) ( 1064 1260 -424 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1260 -392 ) ( 1072 1260 -392 ) ( 1072 1228 -392 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1228 -424 ) ( 1072 1228 -416 ) ( 1064 1228 -416 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3442 +{ +( 1064 1176 -448 ) ( 1056 1176 -336 ) ( 1064 1176 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 732 -352 ) ( 1072 732 -352 ) ( 1072 684 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 856 -432 ) ( 1064 880 -432 ) ( 1064 880 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1388 1312 -376 ) ( 1268 1312 -376 ) ( 1268 1312 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1048 1828 -344 ) ( 1048 1804 -344 ) ( 1048 1804 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 1260 -392 ) ( 1072 1228 -392 ) ( 1072 1260 -392 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3443 +{ +( 1072 1228 -424 ) ( 1072 1260 -424 ) ( 1064 1260 -424 ) subway/2_stair_side2 0 0 90 0.500000 0.500000 0 285212672 0 +( 1064 1260 -392 ) ( 1072 1260 -392 ) ( 1072 1228 -392 ) subway/2_stair_side2 0 0 90 0.500000 0.500000 0 285212672 0 +( 1064 1228 -416 ) ( 1064 1228 -408 ) ( 1072 1228 -408 ) subway/2_stair_side2 -8 0 90 0.500000 0.500000 0 285212672 0 +( 1056 1260 -416 ) ( 1056 1260 -408 ) ( 1056 1228 -408 ) subway/2_open_box -40 48 0 0.500000 0.500000 0 16777216 0 +( 1072 1260 -416 ) ( 1072 1260 -408 ) ( 1064 1260 -408 ) subway/2_stair_side2 -8 0 90 0.500000 0.500000 0 285212672 0 +( 1064 1228 -416 ) ( 1064 1228 -408 ) ( 1064 1260 -408 ) subway/2_sign1 40 48 0 0.500000 0.500000 0 0 0 +} +// brush 3444 +{ +( 1048 1692 -480 ) ( 1048 1668 -480 ) ( 1048 1668 -488 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1388 1176 -512 ) ( 1268 1176 -512 ) ( 1268 1176 -520 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1064 720 -560 ) ( 1064 744 -560 ) ( 1064 744 -568 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1368 1196 -520 ) ( 1248 1196 -520 ) ( 1248 1172 -520 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1064 596 -496 ) ( 1072 596 -496 ) ( 1072 548 -496 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +( 1056 1136 -584 ) ( 1048 1136 -472 ) ( 1056 1136 -472 ) subway/1_tunnelwall 0 -8 0 1 1 0 301989888 0 +} +// brush 3445 +{ +( 1056 1136 -608 ) ( 1048 1136 -496 ) ( 1056 1136 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1064 596 -520 ) ( 1072 596 -520 ) ( 1072 548 -520 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1368 1196 -536 ) ( 1248 1196 -536 ) ( 1248 1172 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1064 720 -576 ) ( 1064 744 -576 ) ( 1064 744 -584 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1388 1176 -536 ) ( 1268 1176 -536 ) ( 1268 1176 -544 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1048 1692 -504 ) ( 1048 1668 -504 ) ( 1048 1668 -512 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +} +// brush 3446 +{ +( 1056 1136 -536 ) ( 1048 1136 -424 ) ( 1056 1136 -424 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1064 596 -448 ) ( 1072 596 -448 ) ( 1072 548 -448 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1368 1196 -480 ) ( 1248 1196 -480 ) ( 1248 1172 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1064 720 -520 ) ( 1064 744 -520 ) ( 1064 744 -528 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1388 1176 -464 ) ( 1268 1176 -464 ) ( 1268 1176 -472 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1048 1692 -432 ) ( 1048 1668 -432 ) ( 1048 1668 -440 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +} +// brush 3447 +{ +( 1056 1136 -448 ) ( 1048 1136 -336 ) ( 1056 1136 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 596 -352 ) ( 1072 596 -352 ) ( 1072 548 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1368 1196 -448 ) ( 1248 1196 -448 ) ( 1248 1172 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 720 -432 ) ( 1064 744 -432 ) ( 1064 744 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1388 1176 -376 ) ( 1268 1176 -376 ) ( 1268 1176 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1048 1692 -344 ) ( 1048 1668 -344 ) ( 1048 1668 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3448 +{ +( 1200 832 -336 ) ( 1208 832 -336 ) ( 1200 832 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 340 -352 ) ( 1192 388 -352 ) ( 1200 388 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1016 964 -448 ) ( 1016 988 -448 ) ( 896 988 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 536 -440 ) ( 1200 536 -432 ) ( 1200 512 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 996 960 -384 ) ( 996 960 -376 ) ( 876 960 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1216 1452 -352 ) ( 1216 1452 -344 ) ( 1216 1476 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3449 +{ +( 1168 816 -520 ) ( 1168 792 -520 ) ( 1168 792 -528 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1200 976 -552 ) ( 1200 976 -536 ) ( 1168 1000 -536 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1200 976 -536 ) ( 1200 976 -552 ) ( 1200 832 -552 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1176 832 -568 ) ( 1296 832 -568 ) ( 1296 832 -576 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1248 304 -536 ) ( 1248 328 -536 ) ( 1368 328 -536 ) subway/1_tunnelfloor_2 -272 -368 90 1 1 0 285212672 0 +( 1344 304 -552 ) ( 1224 304 -552 ) ( 1224 280 -552 ) subway/1_tunneltrack_plain -784 416 0 0.500000 0.500000 0 301989888 0 +} +// brush 3450 +{ +( 820 -64 -348 ) ( 820 -88 -348 ) ( 820 -88 -396 ) subway/light_red -16 -24 0 0.500000 0.500000 134217728 16777217 20000 +( 824 -72 -348 ) ( 808 -72 -348 ) ( 808 -72 -396 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 824 -88 -348 ) ( 824 -64 -348 ) ( 824 -64 -396 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 808 -88 -348 ) ( 824 -88 -348 ) ( 824 -88 -396 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 808 -88 -380 ) ( 808 -64 -380 ) ( 824 -64 -380 ) subway/1_black -16 16 0 0.500000 0.500000 134217728 16777216 0 +( 824 -64 -396 ) ( 808 -64 -396 ) ( 808 -88 -396 ) subway/1_black -16 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3451 +{ +( 820 -112 -348 ) ( 820 -136 -348 ) ( 820 -136 -396 ) subway/light_red 80 -24 0 0.500000 0.500000 134217728 16777217 20000 +( 824 -120 -348 ) ( 808 -120 -348 ) ( 808 -120 -396 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 824 -136 -348 ) ( 824 -112 -348 ) ( 824 -112 -396 ) subway/1_black 80 -24 0 0.500000 0.500000 134217728 16777216 0 +( 808 -136 -348 ) ( 824 -136 -348 ) ( 824 -136 -396 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 808 -136 -380 ) ( 808 -112 -380 ) ( 824 -112 -380 ) subway/1_black -16 -80 0 0.500000 0.500000 134217728 16777216 0 +( 824 -112 -396 ) ( 808 -112 -396 ) ( 808 -136 -396 ) subway/1_black -16 -80 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3452 +{ +( 1292 -696 -312 ) ( 1292 -696 -344 ) ( 1244 -696 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1164 -160 -536 ) ( 1164 -160 -576 ) ( 1164 -168 -576 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1300 784 -344 ) ( 1300 784 -312 ) ( 1252 784 -312 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1100 -120 -312 ) ( 1100 -384 -312 ) ( 1100 -384 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1180 -416 -336 ) ( 1180 -152 -336 ) ( 1212 -152 -336 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 1284 -272 -352 ) ( 1284 -264 -352 ) ( 1236 -264 -352 ) subway/1_tunnel_ceiling2 156 0 0 1 1 0 16777216 0 +( 1156 -136 -264 ) ( 1076 -136 -264 ) ( 1076 -136 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3453 +{ +( 1168 -192 -352 ) ( 1168 -1176 -352 ) ( 1200 -1176 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +( 1192 -392 -336 ) ( 1192 -1064 -336 ) ( 1160 -1064 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1164 1016 -352 ) ( 1164 2000 -352 ) ( 1164 2000 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1208 784 -352 ) ( 1208 784 -344 ) ( 1176 784 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 -1064 -336 ) ( 1200 -392 -336 ) ( 1200 -392 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1192 -136 -344 ) ( 1192 -136 -352 ) ( 1160 -136 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3454 +{ +( 1104 -136 -344 ) ( 1104 -136 -352 ) ( 1072 -136 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1100 104 -336 ) ( 1100 776 -336 ) ( 1100 776 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1096 784 -352 ) ( 1096 784 -344 ) ( 1064 784 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 -1176 -352 ) ( 1064 -192 -352 ) ( 1064 -192 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1104 -392 -336 ) ( 1104 -1064 -336 ) ( 1072 -1064 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1072 -192 -352 ) ( 1072 -1176 -352 ) ( 1104 -1176 -352 ) subway/1_tunnel_ceiling 0 0 0 1 1 0 301989888 0 +} +// brush 3455 +{ +( 1200 2328 -336 ) ( 1208 2328 -336 ) ( 1200 2328 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 1836 -352 ) ( 1192 1884 -352 ) ( 1200 1884 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1016 2460 -424 ) ( 1016 2484 -424 ) ( 896 2484 -424 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 2208 -440 ) ( 1200 2208 -432 ) ( 1200 2184 -432 ) subway/1_tunnelwall -32 0 0 1 1 0 301989888 0 +( 1012 2464 -384 ) ( 1012 2464 -376 ) ( 892 2464 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1216 2948 -352 ) ( 1216 2948 -344 ) ( 1216 2972 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3456 +{ +( 1192 960 -496 ) ( 1192 960 -512 ) ( 1248 960 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1224 832 -254 ) ( 1224 832 -264 ) ( 1168 832 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 484 -456 ) ( 1216 484 -448 ) ( 1216 508 -448 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1200 144 -528 ) ( 1200 144 -520 ) ( 1200 120 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 896 572 -520 ) ( 1016 572 -520 ) ( 1016 548 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1024 564 -536 ) ( 1024 588 -536 ) ( 904 588 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3457 +{ +( 1208 832 -254 ) ( 1208 832 -264 ) ( 1160 832 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 436 -440 ) ( 1216 436 -432 ) ( 1216 460 -432 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1000 960 -472 ) ( 1000 960 -464 ) ( 880 960 -464 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 168 -512 ) ( 1200 168 -504 ) ( 1200 144 -504 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 936 628 -560 ) ( 936 628 -552 ) ( 1056 628 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 896 572 -496 ) ( 1016 572 -496 ) ( 1016 548 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1024 564 -520 ) ( 1024 588 -520 ) ( 904 588 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3458 +{ +( 1224 772 -496 ) ( 1224 948 -496 ) ( 1200 948 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 1200 948 -480 ) ( 1224 948 -480 ) ( 1224 772 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 1200 960 -496 ) ( 1200 960 -480 ) ( 1200 832 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1192 832 -488 ) ( 1216 832 -488 ) ( 1216 832 -504 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 1208 960 -480 ) ( 1208 960 -496 ) ( 1208 832 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1208 960 -496 ) ( 1208 960 -480 ) ( 1200 960 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +} +// brush 3459 +{ +( 1232 832 -254 ) ( 1232 832 -264 ) ( 1200 832 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 1092 -400 ) ( 1216 1092 -392 ) ( 1216 1116 -392 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1000 960 -432 ) ( 1000 960 -424 ) ( 880 960 -424 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1200 176 -488 ) ( 1200 176 -480 ) ( 1200 152 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 944 172 -520 ) ( 944 172 -512 ) ( 1064 172 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 896 572 -448 ) ( 1016 572 -448 ) ( 1016 548 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1024 564 -480 ) ( 1024 588 -480 ) ( 904 588 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3460 +{ +( 1208 1096 -496 ) ( 1208 1096 -480 ) ( 1208 1136 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 996 1136 -504 ) ( 996 1136 -496 ) ( 876 1136 -496 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1200 1096 -480 ) ( 1200 1096 -496 ) ( 1200 1136 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1016 1132 -496 ) ( 1016 1156 -496 ) ( 896 1156 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 1192 508 -480 ) ( 1192 556 -480 ) ( 1200 556 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 1208 1096 -480 ) ( 1208 1096 -496 ) ( 1200 1096 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +} +// brush 3461 +{ +( 1344 -536 -552 ) ( 1224 -536 -552 ) ( 1224 -560 -552 ) subway/1_tunneltrack_plain -784 416 0 0.500000 0.500000 0 301989888 0 +( 1248 -536 -536 ) ( 1248 -512 -536 ) ( 1368 -512 -536 ) subway/1_tunnelfloor_2 -272 -368 90 1 1 0 285212672 0 +( 1176 -136 -568 ) ( 1296 -136 -568 ) ( 1296 -136 -576 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1200 -576 -520 ) ( 1200 -552 -520 ) ( 1200 -552 -528 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1416 832 -480 ) ( 1296 832 -480 ) ( 1296 832 -488 ) subway/1_tunneltrack_plain -784 0 0 0.500000 0.500000 0 301989888 0 +( 1168 -24 -520 ) ( 1168 -48 -520 ) ( 1168 -48 -528 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3462 +{ +( 1096 940 -552 ) ( 1064 940 -552 ) ( 1064 820 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 820 -536 ) ( 1064 940 -536 ) ( 1096 940 -536 ) subway/1_tunnelfloor_2 -528 8 90 1 -1 0 285212672 0 +( 1064 832 -536 ) ( 1096 832 -536 ) ( 1096 832 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1088 820 -536 ) ( 1088 940 -536 ) ( 1088 940 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 1192 -536 ) ( 1064 1192 -552 ) ( 1088 1216 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 1192 -552 ) ( 1064 1192 -536 ) ( 1064 832 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3463 +{ +( 1280 -712 -504 ) ( 1280 -712 -536 ) ( 1232 -712 -536 ) subway/metal2 -712 0 0 0.500000 0.500000 134217728 16777216 0 +( 1096 328 -728 ) ( 1096 328 -768 ) ( 1096 320 -768 ) subway/metal2 -416 0 0 0.500000 0.500000 134217728 16777216 0 +( 1280 832 -536 ) ( 1280 832 -504 ) ( 1232 832 -504 ) subway/metal2 -712 0 0 0.500000 0.500000 134217728 16777216 0 +( 1088 -24 -516 ) ( 1088 -288 -516 ) ( 1088 -288 -548 ) subway/metal2 -416 0 0 0.500000 0.500000 134217728 16777216 0 +( 1176 -432 -528 ) ( 1176 -168 -528 ) ( 1208 -168 -528 ) subway/metal2 -712 416 0 0.500000 0.500000 134217728 16777216 0 +( 1280 -296 -536 ) ( 1280 -288 -536 ) ( 1232 -288 -536 ) subway/metal2 -712 416 0 0.500000 0.500000 134217728 16777216 0 +( 1120 -72 -264 ) ( 1056 -72 -264 ) ( 1056 -72 -254 ) subway/1_tunneltrack_1 422 -115 195 1 1 134217728 16777216 0 +} +// brush 3464 +{ +( 1356 -296 -536 ) ( 1356 -288 -536 ) ( 1308 -288 -536 ) subway/metal2 -752 416 0 0.500000 0.500000 134217728 16777216 0 +( 1252 -432 -528 ) ( 1252 -168 -528 ) ( 1284 -168 -528 ) subway/metal2 -752 416 0 0.500000 0.500000 134217728 16777216 0 +( 1164 16 -516 ) ( 1164 -248 -516 ) ( 1164 -248 -548 ) subway/metal2 -416 0 0 0.500000 0.500000 134217728 16777216 0 +( 1356 832 -536 ) ( 1356 832 -504 ) ( 1308 832 -504 ) subway/metal2 -752 0 0 0.500000 0.500000 134217728 16777216 0 +( 1172 232 -728 ) ( 1172 232 -768 ) ( 1172 224 -768 ) subway/metal2 -416 0 0 0.500000 0.500000 134217728 16777216 0 +( 1356 -712 -504 ) ( 1356 -712 -536 ) ( 1308 -712 -536 ) subway/metal2 -752 0 0 0.500000 0.500000 134217728 16777216 0 +( 1180 -72 -264 ) ( 1140 -72 -264 ) ( 1140 -72 -254 ) subway/1_tunneltrack_1 441 -109 195 1 1 134217728 16777216 0 +} +// brush 3465 +{ +( 1332 -528 -544 ) ( 1212 -528 -544 ) ( 1212 -552 -544 ) subway/1_tunneltrack_1 -228 208 0 1 1 0 16777216 0 +( 1212 -568 -536 ) ( 1212 -544 -536 ) ( 1332 -544 -536 ) subway/1_tunneltrack_1 -204 216 0 1 1 0 16777216 0 +( 1132 -32 -568 ) ( 1252 -32 -568 ) ( 1252 -32 -576 ) subway/1_tunneltrack_1 -228 0 0 1 1 0 16777216 0 +( 1168 40 -520 ) ( 1168 64 -520 ) ( 1168 64 -528 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +( 1360 832 -480 ) ( 1240 832 -480 ) ( 1240 832 -488 ) subway/1_tunneltrack_1 -228 0 0 1 1 0 16777216 0 +( 1096 -480 -512 ) ( 1096 -504 -512 ) ( 1096 -504 -520 ) subway/1_tunneltrack_1 -60 0 0 1 1 0 16777216 0 +} +// brush 3466 +{ +( 1064 832 -536 ) ( 1064 712 -536 ) ( 1064 712 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1096 832 -536 ) ( 1064 832 -536 ) ( 1064 832 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1088 712 -536 ) ( 1088 832 -536 ) ( 1088 832 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 724 -536 ) ( 1096 724 -536 ) ( 1096 724 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 712 -536 ) ( 1064 832 -536 ) ( 1096 832 -536 ) subway/1_tunnelfloor_2 -528 8 90 1 -1 0 285212672 0 +( 1096 832 -552 ) ( 1064 832 -552 ) ( 1064 712 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3467 +{ +( 1104 724 -264 ) ( 1056 724 -264 ) ( 1056 724 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1048 352 -432 ) ( 1048 328 -432 ) ( 1048 328 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1384 832 -464 ) ( 1264 832 -464 ) ( 1264 832 -472 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 16 -504 ) ( 1064 40 -504 ) ( 1064 40 -512 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1208 520 -552 ) ( 1328 520 -552 ) ( 1328 520 -560 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1248 440 -496 ) ( 1248 464 -496 ) ( 1368 464 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1360 480 -520 ) ( 1240 480 -520 ) ( 1240 456 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3468 +{ +( 1016 832 -496 ) ( 1072 832 -512 ) ( 1072 832 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1096 724 -264 ) ( 1040 724 -264 ) ( 1040 724 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1048 400 -448 ) ( 1048 376 -448 ) ( 1048 376 -456 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1064 -8 -520 ) ( 1064 16 -520 ) ( 1064 16 -528 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1248 440 -520 ) ( 1248 464 -520 ) ( 1368 464 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1360 480 -536 ) ( 1240 480 -536 ) ( 1240 456 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3469 +{ +( 1064 840 -496 ) ( 1040 840 -496 ) ( 1040 664 -496 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 1040 664 -480 ) ( 1040 840 -480 ) ( 1064 840 -480 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 1064 832 -480 ) ( 1064 832 -496 ) ( 1064 728 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1048 724 -504 ) ( 1048 724 -488 ) ( 1072 724 -488 ) subway/1_tunnelwall 16 0 0 0.500000 0.500000 0 301989888 0 +( 1048 720 -296 ) ( 1048 720 -280 ) ( 1048 544 -280 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 832 -496 ) ( 1064 832 -480 ) ( 1056 832 -480 ) subway/1_tunnelwall 16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3470 +{ +( 1064 724 -264 ) ( 1032 724 -264 ) ( 1032 724 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1048 1008 -392 ) ( 1048 984 -392 ) ( 1048 984 -400 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1384 832 -424 ) ( 1264 832 -424 ) ( 1264 832 -432 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1064 24 -480 ) ( 1064 48 -480 ) ( 1064 48 -488 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1200 64 -512 ) ( 1320 64 -512 ) ( 1320 64 -520 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1248 440 -448 ) ( 1248 464 -448 ) ( 1368 464 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1360 480 -480 ) ( 1240 480 -480 ) ( 1240 456 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3471 +{ +( 1048 1368 -344 ) ( 1048 1344 -344 ) ( 1048 1344 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1388 832 -376 ) ( 1268 832 -376 ) ( 1268 832 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 384 -432 ) ( 1064 408 -432 ) ( 1064 408 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1368 880 -448 ) ( 1248 880 -448 ) ( 1248 856 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 280 -352 ) ( 1072 280 -352 ) ( 1072 232 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 724 -448 ) ( 1056 724 -336 ) ( 1064 724 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3472 +{ +( 902 438 26 ) ( 902 438 16 ) ( 846 494 16 ) subway/1_tunnelwall 0 -16 0 1 0.500000 0 301989888 0 +( 854 398 16 ) ( 838 414 16 ) ( 838 414 26 ) subway/1_tunnelwall 0 -16 0 1 0.500000 0 301989888 0 +( 974 590 -516 ) ( 974 590 -524 ) ( 884 456 -524 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 838 398 -520 ) ( 838 398 -512 ) ( 846 398 -512 ) subway/1_tunnelwall 0 -16 0 1 0.500000 0 301989888 0 +( 964 594 -520 ) ( 964 594 -512 ) ( 878 464 -512 ) subway/1_tunnelwall 0 -16 0 1 0.500000 0 301989888 0 +( 1056 724 -512 ) ( 1056 724 -520 ) ( 1064 724 -520 ) subway/1_tunnelwall 0 -16 0 1 0.500000 0 301989888 0 +( 968 590 -496 ) ( 976 590 -496 ) ( 886 456 -496 ) subway/1_tunnelwall 0 -16 0 1 0.500000 0 301989888 0 +( 974 590 -520 ) ( 966 590 -520 ) ( 880 460 -520 ) subway/1_tunnelwall 0 -16 0 1 0.500000 0 301989888 0 +( 884 448 0 ) ( 884 480 0 ) ( 884 480 10 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +} +// brush 3473 +{ +( 974 590 -536 ) ( 966 590 -536 ) ( 880 460 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 968 590 -518 ) ( 976 590 -518 ) ( 886 456 -518 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1056 724 -528 ) ( 1056 724 -536 ) ( 1064 724 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 964 594 -536 ) ( 964 594 -528 ) ( 878 464 -528 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 838 398 -536 ) ( 838 398 -528 ) ( 846 398 -528 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 974 590 -528 ) ( 974 590 -536 ) ( 884 456 -536 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 854 398 0 ) ( 838 414 0 ) ( 838 414 10 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 902 438 10 ) ( 902 438 0 ) ( 846 494 0 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 884 448 0 ) ( 884 480 0 ) ( 884 480 10 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +} +// brush 3474 +{ +( 902 438 114 ) ( 902 438 104 ) ( 846 494 104 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 854 398 88 ) ( 838 414 88 ) ( 838 414 98 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 974 590 -436 ) ( 974 590 -444 ) ( 884 456 -444 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 838 398 -448 ) ( 838 398 -440 ) ( 846 398 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 964 596 -448 ) ( 964 596 -440 ) ( 878 466 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1054 724 -440 ) ( 1054 724 -448 ) ( 1062 724 -448 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 968 590 -352 ) ( 976 590 -352 ) ( 886 456 -352 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 974 590 -448 ) ( 966 590 -448 ) ( 880 460 -448 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 884 448 0 ) ( 884 484 0 ) ( 884 484 10 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +} +// brush 3475 +{ +( 1064 416 -536 ) ( 1056 416 -536 ) ( 970 286 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 1056 416 -528 ) ( 1064 416 -528 ) ( 974 282 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 1172 584 -528 ) ( 1172 584 -536 ) ( 1180 584 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 1056 416 -536 ) ( 1056 416 -528 ) ( 970 286 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 928 224 -536 ) ( 928 224 -528 ) ( 936 224 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 1064 416 -528 ) ( 1064 416 -536 ) ( 974 282 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 944 224 0 ) ( 928 240 0 ) ( 928 240 10 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 992 264 10 ) ( 992 264 0 ) ( 936 320 0 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 1164 588 0 ) ( 1164 552 0 ) ( 1164 552 10 ) subway/light_orange 0 0 0 0.500000 0.500000 134217728 1 25000 +} +// brush 3476 +{ +( 1008 472 -536 ) ( 1000 472 -536 ) ( 914 342 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 1000 472 -528 ) ( 1008 472 -528 ) ( 918 338 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 1088 604 -528 ) ( 1088 604 -536 ) ( 1096 604 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 1000 472 -536 ) ( 1000 472 -528 ) ( 914 342 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 872 280 -536 ) ( 872 280 -528 ) ( 880 280 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 1008 472 -528 ) ( 1008 472 -536 ) ( 918 338 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 888 280 0 ) ( 872 296 0 ) ( 872 296 10 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 936 320 10 ) ( 936 320 0 ) ( 880 376 0 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3477 +{ +( 760 -136 -348 ) ( 752 -136 -348 ) ( 752 -216 -348 ) subway/1_florescent 0 0 0 0.500000 0.500000 134217728 1 3500 +( 752 -216 -344 ) ( 752 -136 -344 ) ( 760 -136 -344 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 752 -208 -336 ) ( 760 -208 -336 ) ( 760 -208 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 760 -208 -336 ) ( 760 -128 -336 ) ( 760 -128 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 760 -144 -336 ) ( 752 -144 -336 ) ( 752 -144 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 752 -136 -336 ) ( 752 -216 -336 ) ( 752 -216 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3478 +{ +( 688 228 -404 ) ( 688 212 -404 ) ( 688 212 -420 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 692 228 -404 ) ( 688 228 -404 ) ( 688 228 -420 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 690 212 -404 ) ( 690 228 -404 ) ( 690 228 -420 ) subway/light_square 24 -16 0 0.500000 0.500000 134217728 16777217 12000 +( 688 212 -404 ) ( 692 212 -404 ) ( 692 212 -420 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 688 212 -408 ) ( 688 228 -408 ) ( 692 228 -408 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 692 228 -424 ) ( 688 228 -424 ) ( 688 212 -424 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3479 +{ +( 692 276 -424 ) ( 688 276 -424 ) ( 688 260 -424 ) subway/1_black 0 96 0 0.500000 0.500000 134217728 16777216 0 +( 688 260 -408 ) ( 688 276 -408 ) ( 692 276 -408 ) subway/1_black 0 96 0 0.500000 0.500000 134217728 16777216 0 +( 688 260 -404 ) ( 692 260 -404 ) ( 692 260 -420 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 690 260 -404 ) ( 690 276 -404 ) ( 690 276 -420 ) subway/light_square -72 -16 0 0.500000 0.500000 134217728 16777217 12000 +( 692 276 -404 ) ( 688 276 -404 ) ( 688 276 -420 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 688 276 -404 ) ( 688 260 -404 ) ( 688 260 -420 ) subway/1_black -96 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3480 +{ +( 688 512 -440 ) ( 688 536 -440 ) ( 688 536 -448 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 680 -96 -344 ) ( 680 -120 -344 ) ( 680 -120 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 704 -144 -264 ) ( 648 -144 -264 ) ( 648 -144 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 704 308 -448 ) ( 688 308 -448 ) ( 688 228 -448 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 688 228 -428 ) ( 688 308 -428 ) ( 704 308 -428 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 732 896 -348 ) ( 716 896 -348 ) ( 732 896 -444 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3481 +{ +( 888 176 -352 ) ( 888 200 -352 ) ( 1008 200 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 688 512 -440 ) ( 688 536 -440 ) ( 688 536 -448 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1048 896 -384 ) ( 928 896 -384 ) ( 928 896 -392 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 680 -96 -344 ) ( 680 -120 -344 ) ( 680 -120 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 704 -144 -264 ) ( 648 -144 -264 ) ( 648 -144 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 688 308 -428 ) ( 688 228 -428 ) ( 704 308 -428 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3482 +{ +( 820 -560 -348 ) ( 820 -584 -348 ) ( 820 -584 -396 ) subway/light_red -16 -24 0 0.500000 0.500000 134217728 16777217 20000 +( 824 -568 -348 ) ( 808 -568 -348 ) ( 808 -568 -396 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 824 -584 -348 ) ( 824 -560 -348 ) ( 824 -560 -396 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 808 -584 -348 ) ( 824 -584 -348 ) ( 824 -584 -396 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 808 -584 -380 ) ( 808 -560 -380 ) ( 824 -560 -380 ) subway/1_black -16 16 0 0.500000 0.500000 134217728 16777216 0 +( 824 -560 -396 ) ( 808 -560 -396 ) ( 808 -584 -396 ) subway/1_black -16 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3483 +{ +( 820 -608 -348 ) ( 820 -632 -348 ) ( 820 -632 -396 ) subway/light_red 80 -24 0 0.500000 0.500000 134217728 16777217 20000 +( 824 -616 -348 ) ( 808 -616 -348 ) ( 808 -616 -396 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 824 -632 -348 ) ( 824 -608 -348 ) ( 824 -608 -396 ) subway/1_black 80 -24 0 0.500000 0.500000 134217728 16777216 0 +( 808 -632 -348 ) ( 824 -632 -348 ) ( 824 -632 -396 ) subway/1_black -16 -24 0 0.500000 0.500000 134217728 16777216 0 +( 808 -632 -380 ) ( 808 -608 -380 ) ( 824 -608 -380 ) subway/1_black -16 -80 0 0.500000 0.500000 134217728 16777216 0 +( 824 -608 -396 ) ( 808 -608 -396 ) ( 808 -632 -396 ) subway/1_black -16 -80 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3484 +{ +( 1064 640 -488 ) ( 1048 640 -488 ) ( 1048 624 -488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1048 624 -472 ) ( 1048 640 -472 ) ( 1064 640 -472 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1048 624 -476 ) ( 1064 624 -476 ) ( 1064 624 -528 ) subway/button2a 16 0 0 0.500000 0.500000 0 16777216 0 +( 1064 624 -476 ) ( 1064 640 -476 ) ( 1064 640 -528 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1064 640 -476 ) ( 1048 640 -476 ) ( 1048 640 -528 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1048 640 -476 ) ( 1048 624 -476 ) ( 1048 624 -528 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3485 +{ +( 1044 624 -536 ) ( 1044 640 -536 ) ( 1048 640 -528 ) subway/1_trim1 -464 0 0 0.500000 0.500000 134217728 0 0 +( 1044 644 -536 ) ( 1068 644 -536 ) ( 1064 640 -528 ) subway/1_trim1 -416 0 0 0.500000 0.500000 134217728 0 0 +( 1068 640 -536 ) ( 1068 624 -536 ) ( 1064 624 -528 ) subway/1_trim1 -464 0 0 0.500000 0.500000 134217728 0 0 +( 1068 620 -536 ) ( 1044 620 -536 ) ( 1048 624 -528 ) subway/1_trim1 -416 0 0 0.500000 0.500000 134217728 0 0 +( 1048 624 -528 ) ( 1048 640 -528 ) ( 1064 640 -528 ) subway/metalfloor1 -416 464 0 0.500000 0.500000 134217728 16777216 0 +( 1044 620 -536 ) ( 1068 620 -536 ) ( 1068 644 -536 ) subway/1_trim1 -416 464 0 0.500000 0.500000 134217728 0 0 +} +// brush 3486 +{ +( 1064 640 -528 ) ( 1048 640 -528 ) ( 1048 624 -528 ) subway/metalrib1 -408 464 0 0.500000 0.500000 134217728 16777216 0 +( 1048 624 -476 ) ( 1048 640 -476 ) ( 1064 640 -476 ) subway/metalrib1 -408 464 0 0.500000 0.500000 134217728 16777216 0 +( 1048 628 -520 ) ( 1064 628 -520 ) ( 1064 628 -528 ) subway/metalrib1 -408 0 0 0.500000 0.500000 134217728 16777216 0 +( 1060 628 -520 ) ( 1060 644 -520 ) ( 1060 644 -528 ) subway/metalrib1 -456 0 0 0.500000 0.500000 134217728 16777216 0 +( 1064 636 -520 ) ( 1048 636 -520 ) ( 1048 636 -528 ) subway/metalrib1 -408 0 0 0.500000 0.500000 134217728 16777216 0 +( 1052 636 -520 ) ( 1052 620 -520 ) ( 1052 620 -528 ) subway/metalrib1 -456 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3487 +{ +( 896 360 0 ) ( 928 328 0 ) ( 928 328 10 ) subway/metalrib1 96 48 90 0.500000 0.500000 134217728 16777216 0 +( 804 244 10 ) ( 804 244 0 ) ( 788 260 0 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 904 336 -528 ) ( 808 272 -528 ) ( 808 272 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 788 252 -528 ) ( 788 244 -528 ) ( 788 244 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 904 328 -536 ) ( 808 264 -536 ) ( 808 264 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 924 344 -536 ) ( 924 336 -536 ) ( 924 336 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 904 328 -528 ) ( 808 264 -528 ) ( 808 272 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 904 336 -536 ) ( 808 272 -536 ) ( 808 264 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3488 +{ +( 788 260 0 ) ( 804 244 0 ) ( 804 244 10 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 792 264 0 ) ( 808 248 0 ) ( 808 248 10 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 776 240 -536 ) ( 776 240 -528 ) ( 712 144 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 808 264 -536 ) ( 808 264 -528 ) ( 800 264 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 784 240 -528 ) ( 784 240 -536 ) ( 720 144 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 720 144 -528 ) ( 720 144 -536 ) ( 712 144 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 776 240 -528 ) ( 784 240 -528 ) ( 720 144 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 784 240 -536 ) ( 776 240 -536 ) ( 712 144 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3489 +{ +( 856 192 10 ) ( 856 192 0 ) ( 840 208 0 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 936 264 -528 ) ( 840 200 -528 ) ( 840 200 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 840 200 -528 ) ( 840 192 -528 ) ( 840 192 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 936 256 -536 ) ( 840 192 -536 ) ( 840 192 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 936 264 -536 ) ( 936 256 -536 ) ( 936 256 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 936 256 -528 ) ( 840 192 -528 ) ( 840 200 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 936 264 -536 ) ( 840 200 -536 ) ( 840 192 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3490 +{ +( 936 256 -536 ) ( 1032 320 -536 ) ( 1032 328 -536 ) subway/metal2 40 0 0 0.500000 0.500000 0 16777216 0 +( 936 264 -528 ) ( 1032 328 -528 ) ( 1032 320 -528 ) subway/metal2 40 0 0 0.500000 0.500000 0 16777216 0 +( 936 256 -536 ) ( 936 264 -536 ) ( 936 264 -528 ) subway/metal2 40 0 0 0.500000 0.500000 0 16777216 0 +( 936 264 -536 ) ( 1032 328 -536 ) ( 1032 328 -528 ) subway/metal2 40 0 0 0.500000 0.500000 0 16777216 0 +( 1032 320 -528 ) ( 1032 328 -528 ) ( 1032 328 -536 ) subway/metal2 40 0 0 0.500000 0.500000 0 16777216 0 +( 936 256 -528 ) ( 1032 320 -528 ) ( 1032 320 -536 ) subway/metal2 40 0 0 0.500000 0.500000 0 16777216 0 +( 1016 328 10 ) ( 1016 328 0 ) ( 1032 312 0 ) subway/metal2 40 0 0 0.500000 0.500000 0 16777216 0 +( 936 320 0 ) ( 992 264 0 ) ( 992 264 10 ) subway/metal2 40 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3491 +{ +( 976 740 -544 ) ( 892 740 -544 ) ( 892 424 -544 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 892 424 -536 ) ( 892 740 -536 ) ( 976 740 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 892 424 -536 ) ( 976 424 -536 ) ( 976 424 -544 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1096 428 -536 ) ( 1096 744 -536 ) ( 1096 744 -544 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1085 724 -536 ) ( 1085 724 -544 ) ( 1096 724 -544 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 884 740 -536 ) ( 884 424 -536 ) ( 884 424 -544 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1085 724 -544 ) ( 1085 724 -536 ) ( 884 428 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1096 604 0 ) ( 976 424 0 ) ( 976 424 10 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3492 +{ +( 1096 352 -552 ) ( 1016 352 -552 ) ( 1016 320 -552 ) subway/1_tunnelfloor_2 -528 32 0 1 1 0 285212672 0 +( 1016 320 -536 ) ( 1016 352 -536 ) ( 1096 352 -536 ) subway/1_tunnelfloor_2 -528 32 0 1 1 0 285212672 0 +( 1032 320 -552 ) ( 1032 320 -536 ) ( 1064 320 -536 ) subway/1_tunnelfloor_2 -528 32 0 1 1 0 285212672 0 +( 1064 320 -552 ) ( 1064 320 -536 ) ( 1096 352 -536 ) subway/1_tunnelfloor_2 -528 32 0 1 1 0 285212672 0 +( 1096 352 -536 ) ( 1016 352 -536 ) ( 1016 352 -552 ) subway/1_tunnelfloor_2 -528 32 0 1 1 0 285212672 0 +( 1032 320 -536 ) ( 1032 320 -552 ) ( 1016 352 -552 ) subway/1_tunnelfloor_2 -528 32 0 1 1 0 285212672 0 +} +// brush 3493 +{ +( 1256 -528 -552 ) ( 1136 -528 -552 ) ( 1136 -552 -552 ) subway/1_tunneltrack_plain -512 416 0 0.500000 0.500000 0 301989888 0 +( 1136 -560 -536 ) ( 1136 -536 -536 ) ( 1256 -536 -536 ) subway/1_tunnelfloor_2 199 360 90 -1 -1 0 285212672 0 +( 1072 -136 -568 ) ( 1192 -136 -568 ) ( 1192 -136 -576 ) subway/1_tunneltrack_plain -512 0 0 0.500000 0.500000 0 301989888 0 +( 1096 352 -536 ) ( 1096 352 -552 ) ( 1096 -8 -552 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +( 1096 352 -552 ) ( 1096 352 -536 ) ( 1064 320 -536 ) subway/1_tunneltrack_plain -512 0 0 0.500000 0.500000 0 301989888 0 +( 1064 -528 -520 ) ( 1064 -552 -520 ) ( 1064 -552 -528 ) subway/1_tunneltrack_plain -416 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3494 +{ +( 884 428 -552 ) ( 1088 728 -552 ) ( 1088 756 -552 ) subway/1_tunnelfloor_2 -528 56 0 1 -1 0 285212672 0 +( 1088 728 -536 ) ( 884 428 -536 ) ( 884 456 -536 ) subway/1_tunnelfloor_2 -528 28 56 1 -1 0 285212672 0 +( 1088 728 -552 ) ( 1088 728 -536 ) ( 1088 760 -536 ) subway/1_tunnelfloor_2 -528 56 0 1 -1 0 285212672 0 +( 1088 760 -552 ) ( 1088 760 -536 ) ( 884 456 -536 ) subway/1_tunnelfloor_2 -528 56 0 1 -1 0 285212672 0 +( 884 428 -536 ) ( 884 428 -552 ) ( 884 456 -552 ) subway/1_tunnelfloor_2 -528 56 0 1 -1 0 285212672 0 +( 1088 728 -536 ) ( 1088 728 -552 ) ( 884 428 -552 ) subway/1_tunnelfloor_2 -528 56 0 1 -1 0 285212672 0 +( 1048 724 0 ) ( 1112 724 0 ) ( 1112 724 10 ) subway/1_tunnelfloor_2 -528 0 56 1 -1 0 285212672 0 +} +// brush 3495 +{ +( 664 424 -520 ) ( 688 424 -520 ) ( 688 424 -528 ) subway/1_tunnelfloor_2 -528 56 0 1 -1 0 285212672 0 +( 824 456 -552 ) ( 824 456 -536 ) ( 792 424 -536 ) subway/1_tunnelfloor_2 -528 56 0 1 -1 0 285212672 0 +( 824 456 -536 ) ( 824 456 -552 ) ( 920 456 -552 ) subway/1_tunnelfloor_2 -528 56 0 1 -1 0 285212672 0 +( 884 480 -568 ) ( 884 600 -568 ) ( 884 600 -576 ) subway/1_tunnelfloor_2 -528 56 0 1 -1 0 285212672 0 +( 1648 504 -536 ) ( 1624 504 -536 ) ( 1624 624 -536 ) subway/1_tunnelfloor_2 -528 56 0 1 -1 0 285212672 0 +( 1648 600 -552 ) ( 1648 480 -552 ) ( 1672 480 -552 ) subway/1_tunnelfloor_2 -528 56 0 1 -1 0 285212672 0 +} +// brush 3496 +{ +( 792 704 -520 ) ( 792 680 -520 ) ( 792 680 -528 ) subway/1_tunneltrack_plain -928 0 0 0.500000 0.500000 0 301989888 0 +( 1016 896 -480 ) ( 896 896 -480 ) ( 896 896 -488 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 824 456 -552 ) ( 824 456 -536 ) ( 824 576 -536 ) subway/1_tunneltrack_plain -928 0 0 0.500000 0.500000 0 301989888 0 +( 824 456 -536 ) ( 824 456 -552 ) ( 792 424 -552 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 872 -280 -536 ) ( 872 -256 -536 ) ( 992 -256 -536 ) subway/1_tunnelfloor_2 -528 8 90 1 1 0 285212672 0 +( 968 -280 -552 ) ( 848 -280 -552 ) ( 848 -304 -552 ) subway/1_tunneltrack_plain -32 928 0 0.500000 0.500000 0 301989888 0 +} +// brush 3497 +{ +( 844 456 -512 ) ( 844 448 -512 ) ( 844 448 -608 ) subway/1_black 0 -240 0 0.500000 0.500000 134217728 16777216 0 +( 868 456 -512 ) ( 844 456 -512 ) ( 844 456 -608 ) subway/1_black 0 -240 0 0.500000 0.500000 134217728 16777216 0 +( 860 448 -512 ) ( 860 456 -512 ) ( 860 456 -608 ) subway/1_black 0 -240 0 0.500000 0.500000 134217728 16777216 0 +( 844 452 -512 ) ( 868 452 -512 ) ( 868 452 -608 ) subway/light_red 8 -224 0 0.500000 0.500000 134217728 16777217 15000 +( 844 448 -512 ) ( 844 456 -512 ) ( 868 456 -512 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 868 456 -528 ) ( 844 456 -528 ) ( 844 448 -528 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3498 +{ +( 868 456 -448 ) ( 844 456 -448 ) ( 844 448 -448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 844 448 -432 ) ( 844 456 -432 ) ( 868 456 -432 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 844 452 -432 ) ( 868 452 -432 ) ( 868 452 -528 ) subway/light_red 8 0 0 0.500000 0.500000 134217728 16777217 15000 +( 860 448 -432 ) ( 860 456 -432 ) ( 860 456 -528 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 868 456 -432 ) ( 844 456 -432 ) ( 844 456 -528 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 844 456 -432 ) ( 844 448 -432 ) ( 844 448 -528 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3499 +{ +( 1040 328 -528 ) ( 1040 328 -432 ) ( 1040 320 -432 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1040 320 -528 ) ( 1040 320 -432 ) ( 1064 320 -432 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1056 320 -528 ) ( 1056 320 -432 ) ( 1056 328 -432 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1064 324 -528 ) ( 1064 324 -432 ) ( 1040 324 -432 ) subway/light_red 0 0 0 0.500000 0.500000 134217728 16777217 15000 +( 1064 320 -432 ) ( 1040 320 -432 ) ( 1040 328 -432 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1040 328 -448 ) ( 1040 320 -448 ) ( 1064 320 -448 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3500 +{ +( 1040 328 -528 ) ( 1040 320 -528 ) ( 1064 320 -528 ) subway/1_black -392 -256 0 0.500000 0.500000 134217728 16777216 0 +( 1064 320 -512 ) ( 1040 320 -512 ) ( 1040 328 -512 ) subway/1_black -392 -256 0 0.500000 0.500000 134217728 16777216 0 +( 1064 324 -608 ) ( 1064 324 -512 ) ( 1040 324 -512 ) subway/light_red -384 -224 0 0.500000 0.500000 134217728 16777217 15000 +( 1056 320 -608 ) ( 1056 320 -512 ) ( 1056 328 -512 ) subway/1_black 256 -240 0 0.500000 0.500000 134217728 16777216 0 +( 1040 320 -608 ) ( 1040 320 -512 ) ( 1064 320 -512 ) subway/1_black -392 -240 0 0.500000 0.500000 134217728 16777216 0 +( 1040 328 -608 ) ( 1040 328 -512 ) ( 1040 320 -512 ) subway/1_black 256 -240 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3501 +{ +( 968 -448 -552 ) ( 848 -448 -552 ) ( 848 -472 -552 ) subway/1_tunneltrack_plain -32 592 0 0.500000 0.500000 0 301989888 0 +( 872 -448 -536 ) ( 872 -424 -536 ) ( 992 -424 -536 ) subway/1_tunnelfloor_2 -360 8 90 1 1 0 285212672 0 +( 816 -464 -568 ) ( 936 -464 -568 ) ( 936 -464 -576 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 824 -488 -520 ) ( 824 -464 -520 ) ( 824 -464 -528 ) subway/1_tunneltrack_plain -592 0 0 0.500000 0.500000 0 301989888 0 +( 1040 -144 -480 ) ( 920 -144 -480 ) ( 920 -144 -488 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 792 -448 -520 ) ( 792 -472 -520 ) ( 792 -472 -528 ) subway/1_tunneltrack_plain -592 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3502 +{ +( 792 -128 -520 ) ( 792 -152 -520 ) ( 792 -152 -528 ) subway/1_tunneltrack_plain -1232 0 0 0.500000 0.500000 0 301989888 0 +( 1048 112 -480 ) ( 928 112 -480 ) ( 928 112 -488 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 824 -168 -520 ) ( 824 -144 -520 ) ( 824 -144 -528 ) subway/1_tunneltrack_plain -1232 0 0 0.500000 0.500000 0 301989888 0 +( 816 -144 -568 ) ( 936 -144 -568 ) ( 936 -144 -576 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 872 -128 -536 ) ( 872 -104 -536 ) ( 992 -104 -536 ) subway/1_tunnelfloor_2 -680 8 90 1 1 0 285212672 0 +( 968 -128 -552 ) ( 848 -128 -552 ) ( 848 -152 -552 ) subway/1_tunneltrack_plain -32 1232 0 0.500000 0.500000 0 301989888 0 +} +// brush 3503 +{ +( 688 200 -520 ) ( 688 176 -520 ) ( 688 176 -528 ) subway/1_tunneltrack_plain -1824 0 0 0.500000 0.500000 0 301989888 0 +( 888 -144 -480 ) ( 768 -144 -480 ) ( 768 -144 -488 ) subway/1_tunneltrack_plain 240 0 0 0.500000 0.500000 0 301989888 0 +( 720 432 -520 ) ( 720 456 -520 ) ( 720 456 -528 ) subway/1_tunneltrack_plain -1824 0 0 0.500000 0.500000 0 301989888 0 +( 712 -464 -568 ) ( 832 -464 -568 ) ( 832 -464 -576 ) subway/1_tunneltrack_plain 240 0 0 0.500000 0.500000 0 301989888 0 +( 760 144 -536 ) ( 760 168 -536 ) ( 880 168 -536 ) subway/1_tunnelfloor_2 904 -16 90 -1 -1 0 285212672 0 +( 880 176 -552 ) ( 760 176 -552 ) ( 760 152 -552 ) subway/1_tunneltrack_plain 240 1824 0 0.500000 0.500000 0 301989888 0 +} +// brush 3504 +{ +( 688 504 -520 ) ( 688 480 -520 ) ( 688 480 -528 ) subway/1_tunneltrack_plain -2480 0 0 0.500000 0.500000 0 301989888 0 +( 912 896 -480 ) ( 792 896 -480 ) ( 792 896 -488 ) subway/1_tunneltrack_plain 240 0 0 0.500000 0.500000 0 301989888 0 +( 720 760 -520 ) ( 720 784 -520 ) ( 720 784 -528 ) subway/1_tunneltrack_plain -2480 0 0 0.500000 0.500000 0 301989888 0 +( 712 264 -568 ) ( 832 264 -568 ) ( 832 264 -576 ) subway/1_tunneltrack_plain 240 0 0 0.500000 0.500000 0 301989888 0 +( 760 472 -536 ) ( 760 496 -536 ) ( 880 496 -536 ) subway/1_tunnelfloor_2 1232 -16 90 -1 -1 0 285212672 0 +( 880 504 -552 ) ( 760 504 -552 ) ( 760 480 -552 ) subway/1_tunneltrack_plain 240 2480 0 0.500000 0.500000 0 301989888 0 +} +// brush 3505 +{ +( 744 264 -264 ) ( 680 264 -264 ) ( 680 264 -254 ) subway/1_tunneltrack_1 59 -213 195 1 1 134217728 16777216 0 +( 904 -504 -536 ) ( 904 -496 -536 ) ( 856 -496 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 800 -640 -528 ) ( 800 -376 -528 ) ( 832 -376 -528 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 712 -96 -516 ) ( 712 -360 -516 ) ( 712 -360 -548 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 912 896 -536 ) ( 912 896 -504 ) ( 864 896 -504 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 720 472 -728 ) ( 720 472 -768 ) ( 720 464 -768 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 904 -920 -504 ) ( 904 -920 -536 ) ( 856 -920 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3506 +{ +( 804 264 -264 ) ( 764 264 -264 ) ( 764 264 -254 ) subway/1_tunneltrack_1 78 -207 195 1 1 134217728 16777216 0 +( 980 -920 -504 ) ( 980 -920 -536 ) ( 932 -920 -536 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 796 -184 -728 ) ( 796 -184 -768 ) ( 796 -192 -768 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 972 896 -536 ) ( 972 896 -504 ) ( 924 896 -504 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 788 800 -516 ) ( 788 536 -516 ) ( 788 536 -548 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 876 -640 -528 ) ( 876 -376 -528 ) ( 908 -376 -528 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 980 -504 -536 ) ( 980 -496 -536 ) ( 932 -496 -536 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3507 +{ +( 720 480 -512 ) ( 720 456 -512 ) ( 720 456 -520 ) subway/1_tunneltrack_1 -972 0 0 1 1 0 16777216 0 +( 1000 896 -480 ) ( 880 896 -480 ) ( 880 896 -488 ) subway/1_tunneltrack_1 148 0 0 1 1 0 16777216 0 +( 792 440 -520 ) ( 792 464 -520 ) ( 792 464 -528 ) subway/1_tunneltrack_1 -972 0 0 1 1 0 16777216 0 +( 780 264 -568 ) ( 900 264 -568 ) ( 900 264 -576 ) subway/1_tunneltrack_1 148 0 0 1 1 0 16777216 0 +( 836 344 -536 ) ( 836 368 -536 ) ( 956 368 -536 ) subway/1_tunneltrack_1 108 1120 0 1 1 0 16777216 0 +( 956 384 -544 ) ( 836 384 -544 ) ( 836 360 -544 ) subway/1_tunneltrack_1 148 1120 0 1 1 0 16777216 0 +} +// brush 3508 +{ +( 728 -144 -344 ) ( 728 -144 -352 ) ( 696 -144 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 724 208 -336 ) ( 724 880 -336 ) ( 724 880 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 712 896 -352 ) ( 712 896 -344 ) ( 680 896 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 688 -144 -352 ) ( 688 840 -352 ) ( 688 840 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 728 640 -336 ) ( 728 -32 -336 ) ( 696 -32 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 696 840 -352 ) ( 696 -144 -352 ) ( 728 -144 -352 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +} +// brush 3509 +{ +( 792 840 -352 ) ( 792 -144 -352 ) ( 824 -144 -352 ) subway/1_tunnelwall 7 16 90 0.500000 0.500000 0 301989888 0 +( 816 640 -336 ) ( 816 -32 -336 ) ( 784 -32 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 788 -360 -352 ) ( 788 624 -352 ) ( 788 624 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 896 -352 ) ( 824 896 -344 ) ( 792 896 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 -32 -336 ) ( 824 640 -336 ) ( 824 640 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 -144 -344 ) ( 824 -144 -352 ) ( 792 -144 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3510 +{ +( 824 -904 -344 ) ( 824 -904 -352 ) ( 792 -904 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 -792 -336 ) ( 824 -120 -336 ) ( 824 -120 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 832 -144 -352 ) ( 832 -144 -344 ) ( 800 -144 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 788 -1080 -352 ) ( 788 -96 -352 ) ( 788 -96 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 816 -120 -336 ) ( 816 -792 -336 ) ( 784 -792 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 792 80 -352 ) ( 792 -904 -352 ) ( 824 -904 -352 ) subway/1_tunnelwall 7 16 90 0.500000 0.500000 0 301989888 0 +} +// brush 3511 +{ +( 696 80 -352 ) ( 696 -904 -352 ) ( 728 -904 -352 ) subway/1_tunnelwall 7 16 90 0.500000 0.500000 0 301989888 0 +( 728 -120 -336 ) ( 728 -792 -336 ) ( 696 -792 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 688 -904 -352 ) ( 688 80 -352 ) ( 688 80 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 720 -144 -352 ) ( 720 -144 -344 ) ( 688 -144 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 724 -512 -336 ) ( 724 160 -336 ) ( 724 160 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 728 -912 -344 ) ( 728 -912 -352 ) ( 696 -912 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3512 +{ +( 824 -1264 -344 ) ( 824 -1264 -352 ) ( 792 -1264 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 -1272 -336 ) ( 824 -600 -336 ) ( 824 -600 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 832 -904 -352 ) ( 832 -904 -344 ) ( 800 -904 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 788 -1528 -352 ) ( 788 -544 -352 ) ( 788 -544 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 816 -600 -336 ) ( 816 -1272 -336 ) ( 784 -1272 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 792 -400 -352 ) ( 792 -1384 -352 ) ( 824 -1384 -352 ) subway/1_tunnelwall 7 16 90 0.500000 0.500000 0 301989888 0 +} +// brush 3513 +{ +( 848 -80 -496 ) ( 848 96 -496 ) ( 824 96 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 824 96 -480 ) ( 848 96 -480 ) ( 848 -80 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 824 152 -488 ) ( 824 -24 -488 ) ( 824 -24 -504 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 816 -24 -488 ) ( 840 -24 -488 ) ( 840 -24 -504 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 832 -56 -280 ) ( 832 120 -280 ) ( 832 120 -296 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 840 112 -488 ) ( 816 112 -488 ) ( 816 112 -504 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3514 +{ +( 832 -584 -416 ) ( 832 -584 -408 ) ( 832 -560 -408 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 632 -144 -448 ) ( 632 -144 -440 ) ( 512 -144 -440 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 824 -344 -504 ) ( 824 -344 -496 ) ( 824 -368 -496 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 560 -1440 -536 ) ( 560 -1440 -528 ) ( 680 -1440 -528 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 520 -384 -480 ) ( 640 -384 -480 ) ( 640 -408 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 648 -392 -496 ) ( 648 -368 -496 ) ( 528 -368 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 856 -760 -254 ) ( 856 -760 -264 ) ( 776 -760 -264 ) subway/1_tunneltrack_1 22 -13 195 1 1 0 16777216 0 +} +// brush 3515 +{ +( 720 24 -512 ) ( 720 0 -512 ) ( 720 0 -520 ) subway/1_tunneltrack_1 -652 0 0 1 1 0 16777216 0 +( 976 -144 -480 ) ( 856 -144 -480 ) ( 856 -144 -488 ) subway/1_tunneltrack_1 148 0 0 1 1 0 16777216 0 +( 792 120 -520 ) ( 792 144 -520 ) ( 792 144 -528 ) subway/1_tunneltrack_1 -652 0 0 1 1 0 16777216 0 +( 868 -464 -568 ) ( 988 -464 -568 ) ( 988 -464 -576 ) subway/1_tunneltrack_1 148 0 0 1 1 0 16777216 0 +( 836 24 -536 ) ( 836 48 -536 ) ( 956 48 -536 ) subway/1_tunneltrack_1 108 208 0 1 1 0 16777216 0 +( 956 64 -544 ) ( 836 64 -544 ) ( 836 40 -544 ) subway/1_tunneltrack_1 148 800 0 1 1 0 16777216 0 +} +// brush 3516 +{ +( 648 520 -520 ) ( 648 544 -520 ) ( 528 544 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 520 528 -496 ) ( 640 528 -496 ) ( 640 504 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 560 -528 -560 ) ( 560 -528 -552 ) ( 680 -528 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 152 -512 ) ( 824 152 -504 ) ( 824 128 -504 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( 632 -56 -472 ) ( 632 -56 -464 ) ( 512 -56 -464 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 840 160 -440 ) ( 840 160 -432 ) ( 840 184 -432 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 832 -472 -254 ) ( 832 -472 -264 ) ( 784 -472 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3517 +{ +( 824 -56 -496 ) ( 824 -56 -512 ) ( 880 -56 -496 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 848 -472 -254 ) ( 848 -472 -264 ) ( 792 -472 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 -336 -456 ) ( 840 -336 -448 ) ( 840 -312 -448 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 824 224 -528 ) ( 824 224 -520 ) ( 824 200 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 520 528 -520 ) ( 640 528 -520 ) ( 640 504 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 648 520 -536 ) ( 648 544 -536 ) ( 528 544 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3518 +{ +( 648 520 -480 ) ( 648 544 -480 ) ( 528 544 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 520 528 -448 ) ( 640 528 -448 ) ( 640 504 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 560 -528 -520 ) ( 560 -528 -512 ) ( 680 -528 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 824 256 -488 ) ( 824 256 -480 ) ( 824 232 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 632 -56 -432 ) ( 632 -56 -424 ) ( 512 -56 -424 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 840 432 -400 ) ( 840 432 -392 ) ( 840 456 -392 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 824 -472 -254 ) ( 824 -472 -264 ) ( 792 -472 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3519 +{ +( 840 -472 -254 ) ( 840 -472 -264 ) ( 784 -472 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 1016 -352 ) ( 840 1016 -344 ) ( 840 1040 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 824 400 -440 ) ( 824 400 -432 ) ( 824 376 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 640 920 -448 ) ( 640 944 -448 ) ( 520 944 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 816 296 -384 ) ( 816 344 -384 ) ( 824 344 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 832 -56 -344 ) ( 824 -56 -344 ) ( 832 -56 -456 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3520 +{ +( 840 -472 -254 ) ( 840 -472 -264 ) ( 784 -472 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 344 -352 ) ( 840 344 -344 ) ( 840 368 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 628 -56 -384 ) ( 628 -56 -376 ) ( 508 -56 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 824 688 -440 ) ( 824 688 -432 ) ( 824 664 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 512 920 -336 ) ( 632 920 -336 ) ( 632 896 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 816 344 -384 ) ( 816 296 -384 ) ( 824 344 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3521 +{ +( 816 512 -384 ) ( 816 464 -384 ) ( 824 512 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 512 1088 -336 ) ( 632 1088 -336 ) ( 632 1064 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 824 856 -440 ) ( 824 856 -432 ) ( 824 832 -432 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 628 112 -384 ) ( 628 112 -376 ) ( 508 112 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 840 512 -352 ) ( 840 512 -344 ) ( 840 536 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 848 -24 -254 ) ( 848 -24 -264 ) ( 792 -24 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3522 +{ +( 832 112 -344 ) ( 824 112 -344 ) ( 832 112 -456 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 816 464 -384 ) ( 816 512 -384 ) ( 824 512 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 640 1088 -448 ) ( 640 1112 -448 ) ( 520 1112 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 824 568 -440 ) ( 824 568 -432 ) ( 824 544 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 840 1216 -352 ) ( 840 1216 -344 ) ( 840 1240 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 848 -24 -254 ) ( 848 -24 -264 ) ( 792 -24 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3523 +{ +( 840 -24 -254 ) ( 840 -24 -264 ) ( 808 -24 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 600 -400 ) ( 840 600 -392 ) ( 840 624 -392 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 632 112 -432 ) ( 632 112 -424 ) ( 512 112 -424 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 824 424 -488 ) ( 824 424 -480 ) ( 824 400 -480 ) subway/1_tunnelwall_pipe 0 -64 0 0.500000 0.500000 0 16777216 0 +( 560 -360 -520 ) ( 560 -360 -512 ) ( 680 -360 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 520 696 -448 ) ( 640 696 -448 ) ( 640 672 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 648 688 -480 ) ( 648 712 -480 ) ( 528 712 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3524 +{ +( 648 688 -536 ) ( 648 712 -536 ) ( 528 712 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 520 696 -520 ) ( 640 696 -520 ) ( 640 672 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 824 392 -528 ) ( 824 392 -520 ) ( 824 368 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 840 -168 -456 ) ( 840 -168 -448 ) ( 840 -144 -448 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 864 -24 -254 ) ( 864 -24 -264 ) ( 808 -24 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 824 112 -496 ) ( 824 112 -512 ) ( 880 112 -496 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3525 +{ +( 848 -24 -254 ) ( 848 -24 -264 ) ( 800 -24 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 328 -440 ) ( 840 328 -432 ) ( 840 352 -432 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 632 112 -472 ) ( 632 112 -464 ) ( 512 112 -464 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 320 -512 ) ( 824 320 -504 ) ( 824 296 -504 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 560 -360 -560 ) ( 560 -360 -552 ) ( 680 -360 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 520 696 -496 ) ( 640 696 -496 ) ( 640 672 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 648 688 -520 ) ( 648 712 -520 ) ( 528 712 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3526 +{ +( 648 -392 -520 ) ( 648 -368 -520 ) ( 528 -368 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 520 -384 -496 ) ( 640 -384 -496 ) ( 640 -408 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 560 -1264 -560 ) ( 560 -1264 -552 ) ( 680 -1264 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 -760 -512 ) ( 824 -760 -504 ) ( 824 -784 -504 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( 624 -944 -472 ) ( 624 -944 -464 ) ( 504 -944 -464 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 840 -704 -440 ) ( 840 -704 -432 ) ( 840 -680 -432 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 832 -1272 -254 ) ( 832 -1272 -264 ) ( 784 -1272 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3527 +{ +( 816 -944 -496 ) ( 816 -944 -512 ) ( 872 -944 -496 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 848 -1264 -254 ) ( 848 -1264 -264 ) ( 792 -1264 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 -1200 -456 ) ( 840 -1200 -448 ) ( 840 -1176 -448 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 824 -688 -528 ) ( 824 -688 -520 ) ( 824 -712 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 520 -384 -520 ) ( 640 -384 -520 ) ( 640 -408 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 648 -392 -536 ) ( 648 -368 -536 ) ( 528 -368 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3528 +{ +( 648 -392 -480 ) ( 648 -368 -480 ) ( 528 -368 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 520 -384 -448 ) ( 640 -384 -448 ) ( 640 -408 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 568 -1264 -520 ) ( 568 -1264 -512 ) ( 688 -1264 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 824 -656 -488 ) ( 824 -656 -480 ) ( 824 -680 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 624 -944 -432 ) ( 624 -944 -424 ) ( 504 -944 -424 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 840 -744 -400 ) ( 840 -744 -392 ) ( 840 -720 -392 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 832 -1272 -254 ) ( 832 -1272 -264 ) ( 800 -1272 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3529 +{ +( 832 -1264 -254 ) ( 832 -1264 -264 ) ( 776 -1264 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 -176 -352 ) ( 840 -176 -344 ) ( 840 -152 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 824 -512 -440 ) ( 824 -512 -432 ) ( 824 -536 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 640 8 -448 ) ( 640 32 -448 ) ( 520 32 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 816 -616 -384 ) ( 816 -568 -384 ) ( 824 -568 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 824 -944 -344 ) ( 816 -944 -344 ) ( 824 -944 -456 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3530 +{ +( 848 -1264 -254 ) ( 848 -1264 -264 ) ( 792 -1264 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 -832 -352 ) ( 840 -832 -344 ) ( 840 -808 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 620 -944 -384 ) ( 620 -944 -376 ) ( 500 -944 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 824 -224 -440 ) ( 824 -224 -432 ) ( 824 -248 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 512 8 -336 ) ( 632 8 -336 ) ( 632 -16 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 816 -568 -384 ) ( 816 -616 -384 ) ( 824 -568 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3531 +{ +( 1048 576 -384 ) ( 824 576 -384 ) ( 824 160 -384 ) subway/con10 48 0 0 0.500000 0.500000 0 285212672 0 +( 824 160 -336 ) ( 824 576 -336 ) ( 1048 576 -336 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 112 -336 ) ( 1048 112 -336 ) ( 1048 112 -344 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 160 -336 ) ( 1064 576 -336 ) ( 1064 576 -344 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1048 728 -336 ) ( 824 728 -336 ) ( 824 728 -344 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 576 -336 ) ( 824 160 -336 ) ( 824 160 -344 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3532 +{ +( 916 -904 -312 ) ( 916 -904 -344 ) ( 868 -904 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 788 -368 -536 ) ( 788 -368 -576 ) ( 788 -376 -576 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 908 896 -344 ) ( 908 896 -312 ) ( 860 896 -312 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 724 -328 -312 ) ( 724 -592 -312 ) ( 724 -592 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 804 -624 -336 ) ( 804 -360 -336 ) ( 836 -360 -336 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 908 -480 -352 ) ( 908 -472 -352 ) ( 860 -472 -352 ) subway/1_tunnel_ceiling2 80 0 0 1 1 0 16777216 0 +( 788 -144 -264 ) ( 708 -144 -264 ) ( 708 -144 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3533 +{ +( 1088 416 -552 ) ( 1008 416 -552 ) ( 1008 328 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1008 328 -536 ) ( 1008 416 -536 ) ( 1088 416 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1016 352 -536 ) ( 1096 352 -536 ) ( 1096 352 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1088 328 -536 ) ( 1088 416 -536 ) ( 1088 416 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1088 456 -536 ) ( 1008 456 -536 ) ( 1008 456 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1000 392 -536 ) ( 1000 304 -536 ) ( 1000 304 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1000 320 0 ) ( 1112 488 0 ) ( 1112 488 10 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3534 +{ +( 1216 -128 -496 ) ( 1040 -128 -496 ) ( 1040 -144 -496 ) subway/1_tunnelwall_pipe 0 48 0 0.500000 0.500000 0 16777216 0 +( 1032 -144 -480 ) ( 1032 -128 -480 ) ( 1208 -128 -480 ) subway/metal2 0 -16 0 0.500000 0.500000 0 16777216 0 +( 1048 -144 -672 ) ( 1224 -144 -672 ) ( 1224 -144 -680 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1200 -144 -672 ) ( 1200 -128 -672 ) ( 1200 -128 -680 ) subway/1_tunnelwall_pipe 16 0 0 0.500000 0.500000 0 16777216 0 +( 1224 -136 -672 ) ( 1048 -136 -672 ) ( 1048 -136 -680 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1064 -128 -672 ) ( 1064 -144 -672 ) ( 1064 -144 -680 ) subway/1_tunnelwall_pipe 16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3535 +{ +( 792 576 -520 ) ( 792 552 -520 ) ( 792 552 -528 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1032 424 -480 ) ( 912 424 -480 ) ( 912 424 -488 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1088 -456 -520 ) ( 1088 -432 -520 ) ( 1088 -432 -528 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 856 248 -568 ) ( 976 248 -568 ) ( 976 248 -576 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 872 -408 -536 ) ( 872 -384 -536 ) ( 992 -384 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 968 -408 -552 ) ( 848 -408 -552 ) ( 848 -432 -552 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1104 616 0 ) ( 960 400 0 ) ( 960 400 10 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 928 344 0 ) ( 856 296 0 ) ( 856 296 10 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3536 +{ +( 936 328 -544 ) ( 792 232 -544 ) ( 792 160 -544 ) subway/1_tunnelfloor_2 -1550 34 57 1 1 0 285212672 0 +( 936 256 -536 ) ( 792 160 -536 ) ( 792 232 -536 ) subway/1_tunneltrack_1 -1520 46 123 1 1 0 16777216 0 +( 992 288 -544 ) ( 992 288 -536 ) ( 992 344 -536 ) subway/1_tunnelfloor_2 -1550 34 57 1 1 0 285212672 0 +( 936 256 -544 ) ( 792 160 -544 ) ( 792 160 -536 ) subway/1_tunnelfloor_2 -1550 34 57 1 1 0 285212672 0 +( 792 216 -544 ) ( 792 216 -536 ) ( 792 160 -536 ) subway/1_tunnelfloor_2 -1550 34 57 1 1 0 285212672 0 +( 928 344 -536 ) ( 784 248 -536 ) ( 784 248 -544 ) subway/1_tunnelfloor_2 -1550 34 57 1 1 0 285212672 0 +( 800 248 2 ) ( 800 248 -8 ) ( 776 272 -8 ) subway/1_tunnelfloor_2 -1550 34 57 1 1 0 285212672 0 +( 904 352 -8 ) ( 920 336 -8 ) ( 920 336 2 ) subway/1_tunnelfloor_2 -1550 34 57 1 1 0 285212672 0 +} +// brush 3537 +{ +( 884 488 -254 ) ( 884 488 -264 ) ( 884 456 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 472 -448 ) ( 840 472 -480 ) ( 904 472 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 840 472 -480 ) ( 840 472 -448 ) ( 824 456 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1412 456 -488 ) ( 1412 456 -480 ) ( 1436 456 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1712 200 -520 ) ( 1712 200 -512 ) ( 1712 320 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1312 152 -448 ) ( 1312 272 -448 ) ( 1336 272 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1320 280 -480 ) ( 1296 280 -480 ) ( 1296 160 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3538 +{ +( 840 472 -384 ) ( 840 472 -448 ) ( 904 472 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 840 472 -448 ) ( 840 472 -384 ) ( 824 456 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 980 456 -440 ) ( 980 456 -432 ) ( 1004 456 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 920 272 -448 ) ( 896 272 -448 ) ( 896 152 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1544 448 -352 ) ( 1496 448 -352 ) ( 1496 456 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 884 456 -304 ) ( 884 464 -304 ) ( 884 456 -416 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3539 +{ +( 832 464 -496 ) ( 832 464 -480 ) ( 824 456 -480 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 804 464 -480 ) ( 804 464 -496 ) ( 884 464 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 884 456 -496 ) ( 884 456 -480 ) ( 884 464 -480 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 884 456 -480 ) ( 884 456 -496 ) ( 824 456 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 936 456 -480 ) ( 936 480 -480 ) ( 1112 480 -480 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 1112 480 -496 ) ( 936 480 -496 ) ( 936 456 -496 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 3540 +{ +( 840 472 -536 ) ( 840 472 -520 ) ( 824 456 -520 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 884 480 -254 ) ( 884 480 -264 ) ( 884 424 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 472 -520 ) ( 840 472 -536 ) ( 904 472 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1444 456 -528 ) ( 1444 456 -520 ) ( 1468 456 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1312 152 -520 ) ( 1312 272 -520 ) ( 1336 272 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1320 280 -536 ) ( 1296 280 -536 ) ( 1296 160 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3541 +{ +( 884 464 -254 ) ( 884 464 -264 ) ( 884 416 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 472 -496 ) ( 840 472 -520 ) ( 904 472 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 840 472 -520 ) ( 840 472 -496 ) ( 824 456 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1420 456 -512 ) ( 1420 456 -504 ) ( 1444 456 -504 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1256 192 -560 ) ( 1256 192 -552 ) ( 1256 312 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1312 152 -496 ) ( 1312 272 -496 ) ( 1336 272 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1320 280 -520 ) ( 1296 280 -520 ) ( 1296 160 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3542 +{ +( 1096 464 -544 ) ( 1024 464 -544 ) ( 928 320 -544 ) subway/1_tunnelfloor_2 -1550 34 57 1 1 0 285212672 0 +( 1024 464 -536 ) ( 1096 464 -536 ) ( 1000 320 -536 ) subway/1_tunneltrack_1 102 12 145 1 1 0 16777216 0 +( 912 264 -536 ) ( 968 264 -536 ) ( 968 264 -544 ) subway/1_tunnelfloor_2 -1550 34 57 1 1 0 285212672 0 +( 1096 464 -536 ) ( 1096 464 -544 ) ( 1000 320 -544 ) subway/1_tunnelfloor_2 -1550 34 57 1 1 0 285212672 0 +( 1184 592 -536 ) ( 1128 592 -536 ) ( 1128 592 -544 ) subway/1_tunnelfloor_2 -1550 34 57 1 1 0 285212672 0 +( 1008 472 -544 ) ( 1008 472 -536 ) ( 912 328 -536 ) subway/1_tunnelfloor_2 -1550 34 57 1 1 0 285212672 0 +( 1072 608 -8 ) ( 1096 584 -8 ) ( 1096 584 2 ) subway/1_tunnelfloor_2 -1550 34 57 1 1 0 285212672 0 +( 920 336 2 ) ( 920 336 -8 ) ( 904 352 -8 ) subway/1_tunnelfloor_2 -1550 34 57 1 1 0 285212672 0 +( 1088 600 0 ) ( 1088 408 0 ) ( 1088 408 10 ) subway/1_tunneltrack_1 102 12 145 1 1 0 16777216 0 +} +// brush 3543 +{ +( 952 304 0 ) ( 1016 240 0 ) ( 1016 240 10 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 936 224 -536 ) ( 1080 320 -536 ) ( 1080 320 -552 ) subway/1_tunneltrack_plain -3328 0 0 0.500000 0.500000 0 301989888 0 +( 1080 456 -488 ) ( 1080 456 -480 ) ( 1080 576 -480 ) subway/1_tunneltrack_plain -288 0 0 0.500000 0.500000 0 301989888 0 +( 936 256 -552 ) ( 1080 352 -552 ) ( 1080 352 -536 ) subway/1_tunneltrack_plain -3328 0 0 0.500000 0.500000 0 301989888 0 +( 936 360 -576 ) ( 936 360 -568 ) ( 936 240 -568 ) subway/1_tunneltrack_plain -288 0 0 0.500000 0.500000 0 301989888 0 +( 936 256 -536 ) ( 1080 352 -536 ) ( 1080 320 -536 ) subway/1_tunnelfloor_2 -1568 30 33 1 1 0 285212672 0 +( 936 224 -552 ) ( 1080 320 -552 ) ( 1080 352 -552 ) subway/1_tunneltrack_plain -352 3264 0 0.500000 0.500000 0 301989888 0 +( 992 312 10 ) ( 992 312 0 ) ( 1032 272 0 ) subway/metal2 -256 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3544 +{ +( 936 256 -536 ) ( 792 160 -536 ) ( 792 160 -552 ) subway/1_tunneltrack_plain -3136 0 0 0.500000 0.500000 0 301989888 0 +( 792 24 -488 ) ( 792 24 -480 ) ( 792 -96 -480 ) subway/1_tunneltrack_plain -192 0 0 0.500000 0.500000 0 301989888 0 +( 936 224 -552 ) ( 792 128 -552 ) ( 792 128 -536 ) subway/1_tunneltrack_plain -3136 0 0 0.500000 0.500000 0 301989888 0 +( 936 120 -576 ) ( 936 120 -568 ) ( 936 240 -568 ) subway/1_tunneltrack_plain -192 0 0 0.500000 0.500000 0 301989888 0 +( 936 224 -536 ) ( 792 128 -536 ) ( 792 160 -536 ) subway/1_tunnelfloor_2 -1568 30 33 1 1 0 285212672 0 +( 936 256 -552 ) ( 792 160 -552 ) ( 792 128 -552 ) subway/1_tunneltrack_plain -160 3168 0 0.500000 0.500000 0 301989888 0 +( 880 168 10 ) ( 880 168 0 ) ( 840 208 0 ) subway/metal2 -160 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3545 +{ +( 820 304 -552 ) ( 820 304 -536 ) ( 724 160 -536 ) subway/1_tunneltrack_plain -3008 0 0 0.500000 0.500000 0 301989888 0 +( 1112 256 -480 ) ( 992 256 -480 ) ( 992 256 -488 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 888 256 -536 ) ( 888 256 -552 ) ( 792 112 -552 ) subway/1_tunneltrack_plain -3008 0 0 0.500000 0.500000 0 301989888 0 +( 776 112 -568 ) ( 896 112 -568 ) ( 896 112 -576 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 856 256 -536 ) ( 888 256 -536 ) ( 792 112 -536 ) subway/1_tunneltrack_1 46 12 145 1 1 0 16777216 0 +( 888 256 -552 ) ( 856 256 -552 ) ( 760 112 -552 ) subway/1_tunneltrack_plain 32 3008 0 0.500000 0.500000 0 301989888 0 +( 824 224 0 ) ( 864 184 0 ) ( 864 184 10 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 792 104 0 ) ( 792 260 0 ) ( 792 260 10 ) subway/metalrib1 96 48 90 0.500000 0.500000 0 16777216 0 +} +// brush 3546 +{ +( 840 208 0 ) ( 880 168 0 ) ( 880 168 10 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 920 256 -552 ) ( 888 256 -552 ) ( 792 112 -552 ) subway/1_tunneltrack_plain -32 3008 0 0.500000 0.500000 0 301989888 0 +( 888 256 -536 ) ( 920 256 -536 ) ( 824 112 -536 ) subway/1_tunnelfloor_2 -1568 8 57 1 1 0 285212672 0 +( 808 112 -568 ) ( 928 112 -568 ) ( 928 112 -576 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 920 256 -536 ) ( 920 256 -552 ) ( 824 112 -552 ) subway/1_tunneltrack_plain -3008 0 0 0.500000 0.500000 0 301989888 0 +( 1144 256 -480 ) ( 1024 256 -480 ) ( 1024 256 -488 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 888 256 -552 ) ( 888 256 -536 ) ( 792 112 -536 ) subway/1_tunneltrack_plain -3008 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3547 +{ +( 1104 -136 -264 ) ( 1056 -136 -264 ) ( 1056 -136 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1048 -288 -432 ) ( 1048 -312 -432 ) ( 1048 -312 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1384 320 -464 ) ( 1264 320 -464 ) ( 1264 320 -472 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1064 -568 -504 ) ( 1064 -544 -504 ) ( 1064 -544 -512 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1208 -136 -552 ) ( 1328 -136 -552 ) ( 1328 -136 -560 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1248 -200 -496 ) ( 1248 -176 -496 ) ( 1368 -176 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1360 -160 -520 ) ( 1240 -160 -520 ) ( 1240 -184 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3548 +{ +( 1016 320 -496 ) ( 1072 320 -512 ) ( 1072 320 -496 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1096 -136 -264 ) ( 1040 -136 -264 ) ( 1040 -136 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1048 -240 -448 ) ( 1048 -264 -448 ) ( 1048 -264 -456 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1064 -592 -520 ) ( 1064 -568 -520 ) ( 1064 -568 -528 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1248 -200 -520 ) ( 1248 -176 -520 ) ( 1368 -176 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1360 -160 -536 ) ( 1240 -160 -536 ) ( 1240 -184 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3549 +{ +( 1064 200 -496 ) ( 1040 200 -496 ) ( 1040 24 -496 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 1040 24 -480 ) ( 1040 200 -480 ) ( 1064 200 -480 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 1064 304 -480 ) ( 1064 304 -496 ) ( 1064 -144 -496 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1040 -144 -504 ) ( 1040 -144 -488 ) ( 1064 -144 -488 ) subway/1_tunnelwall 16 0 0 0.500000 0.500000 0 301989888 0 +( 1048 136 -296 ) ( 1048 136 -280 ) ( 1048 -40 -280 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1064 320 -496 ) ( 1064 320 -480 ) ( 1056 320 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +} +// brush 3550 +{ +( 1064 -136 -264 ) ( 1032 -136 -264 ) ( 1032 -136 -254 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1048 368 -392 ) ( 1048 344 -392 ) ( 1048 344 -400 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1384 320 -424 ) ( 1264 320 -424 ) ( 1264 320 -432 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1064 -560 -480 ) ( 1064 -536 -480 ) ( 1064 -536 -488 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1200 -576 -512 ) ( 1320 -576 -512 ) ( 1320 -576 -520 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1248 -200 -448 ) ( 1248 -176 -448 ) ( 1368 -176 -448 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +( 1360 -160 -480 ) ( 1240 -160 -480 ) ( 1240 -184 -480 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3551 +{ +( 1048 664 -344 ) ( 1048 640 -344 ) ( 1048 640 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1388 320 -376 ) ( 1268 320 -376 ) ( 1268 320 -384 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1064 -128 -432 ) ( 1064 -104 -432 ) ( 1064 -104 -440 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1368 240 -448 ) ( 1248 240 -448 ) ( 1248 216 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1064 -360 -352 ) ( 1072 -360 -352 ) ( 1072 -408 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1056 -136 -448 ) ( 1048 -136 -336 ) ( 1056 -136 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3552 +{ +( 840 472 -496 ) ( 840 472 -520 ) ( 824 456 -520 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 600 -520 ) ( 840 600 -496 ) ( 840 704 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 624 896 -472 ) ( 624 896 -464 ) ( 504 896 -464 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 -88 -512 ) ( 824 -88 -504 ) ( 824 -112 -504 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 560 136 -560 ) ( 560 136 -552 ) ( 680 136 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 520 80 -496 ) ( 640 80 -496 ) ( 640 56 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 648 72 -520 ) ( 648 96 -520 ) ( 528 96 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3553 +{ +( 840 536 -448 ) ( 840 536 -384 ) ( 840 640 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 620 896 -352 ) ( 620 896 -344 ) ( 500 896 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 824 480 -440 ) ( 824 480 -432 ) ( 824 456 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 640 472 -448 ) ( 640 496 -448 ) ( 520 496 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 816 -152 -352 ) ( 816 -104 -352 ) ( 824 -104 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 840 472 -384 ) ( 840 472 -448 ) ( 824 456 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3554 +{ +( 840 896 -488 ) ( 816 896 -488 ) ( 816 896 -504 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 832 720 -496 ) ( 832 720 -480 ) ( 832 840 -480 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 832 464 -480 ) ( 832 464 -496 ) ( 824 456 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 824 616 -488 ) ( 824 440 -488 ) ( 824 440 -504 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 824 456 -480 ) ( 848 456 -480 ) ( 848 280 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 848 280 -496 ) ( 848 456 -496 ) ( 824 456 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3555 +{ +( 816 896 -496 ) ( 816 896 -512 ) ( 872 896 -496 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 472 -520 ) ( 840 472 -536 ) ( 824 456 -536 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 600 -536 ) ( 840 600 -520 ) ( 840 704 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 824 -112 -528 ) ( 824 -112 -520 ) ( 824 -136 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 520 80 -520 ) ( 640 80 -520 ) ( 640 56 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 648 72 -536 ) ( 648 96 -536 ) ( 528 96 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3556 +{ +( 840 472 -448 ) ( 840 472 -480 ) ( 824 456 -480 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 840 472 -480 ) ( 840 472 -448 ) ( 840 576 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 624 896 -432 ) ( 624 896 -424 ) ( 504 896 -424 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 824 176 -488 ) ( 824 176 -480 ) ( 824 152 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 568 -320 -520 ) ( 568 -320 -512 ) ( 688 -320 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 520 80 -448 ) ( 640 80 -448 ) ( 640 56 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 648 72 -480 ) ( 648 96 -480 ) ( 528 96 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3557 +{ +( 1224 24 -496 ) ( 1224 200 -496 ) ( 1200 200 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 1200 200 -480 ) ( 1224 200 -480 ) ( 1224 24 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 1200 832 -496 ) ( 1200 832 -480 ) ( 1200 -8 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 1192 -136 -488 ) ( 1216 -136 -488 ) ( 1216 -136 -504 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 1216 408 -280 ) ( 1216 584 -280 ) ( 1216 584 -296 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 832 -480 ) ( 1200 832 -496 ) ( 1208 832 -496 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3558 +{ +( 1216 944 -352 ) ( 1216 944 -344 ) ( 1216 968 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 996 832 -384 ) ( 996 832 -376 ) ( 876 832 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 408 -440 ) ( 1200 408 -432 ) ( 1200 384 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1016 216 -448 ) ( 1016 240 -448 ) ( 896 240 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1192 -408 -352 ) ( 1192 -360 -352 ) ( 1200 -360 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1200 -136 -336 ) ( 1208 -136 -336 ) ( 1200 -136 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3559 +{ +( 1232 -136 -254 ) ( 1232 -136 -264 ) ( 1200 -136 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 584 -400 ) ( 1216 584 -392 ) ( 1216 608 -392 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1000 832 -432 ) ( 1000 832 -424 ) ( 880 832 -424 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1200 -24 -488 ) ( 1200 -24 -480 ) ( 1200 -48 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 944 -576 -520 ) ( 944 -576 -512 ) ( 1064 -576 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 896 -176 -448 ) ( 1016 -176 -448 ) ( 1016 -200 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1024 -184 -480 ) ( 1024 -160 -480 ) ( 904 -160 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3560 +{ +( 1200 -152 -254 ) ( 1200 -152 -264 ) ( 1152 -152 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 -72 -440 ) ( 1216 -72 -432 ) ( 1216 -48 -432 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1000 832 -472 ) ( 1000 832 -464 ) ( 880 832 -464 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1200 -32 -512 ) ( 1200 -32 -504 ) ( 1200 -56 -504 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 936 -136 -560 ) ( 936 -136 -552 ) ( 1056 -136 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 896 -176 -496 ) ( 1016 -176 -496 ) ( 1016 -200 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1024 -184 -520 ) ( 1024 -160 -520 ) ( 904 -160 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3561 +{ +( 1192 832 -496 ) ( 1192 832 -512 ) ( 1248 832 -496 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1216 -136 -254 ) ( 1216 -136 -264 ) ( 1160 -136 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 1216 -24 -456 ) ( 1216 -24 -448 ) ( 1216 0 -448 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1200 -56 -528 ) ( 1200 -56 -520 ) ( 1200 -80 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 896 -176 -520 ) ( 1016 -176 -520 ) ( 1016 -200 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 1024 -184 -536 ) ( 1024 -160 -536 ) ( 904 -160 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3562 +{ +( 984 224 0 ) ( 944 264 0 ) ( 944 264 10 ) subway/metal2 -368 0 0 0.500000 0.500000 0 16777216 0 +( 904 176 -552 ) ( 936 176 -552 ) ( 1032 320 -552 ) subway/1_tunneltrack_plain -432 3376 0 0.500000 0.500000 0 301989888 0 +( 936 176 -536 ) ( 904 176 -536 ) ( 1000 320 -536 ) subway/1_tunnelfloor_2 -1568 8 57 1 1 0 285212672 0 +( 1016 352 -536 ) ( 1016 352 -552 ) ( 1032 320 -552 ) subway/1_tunneltrack_plain -368 0 0 0.500000 0.500000 0 301989888 0 +( 1016 352 -552 ) ( 1016 352 -536 ) ( 972 284 -536 ) subway/1_tunneltrack_plain -3440 0 0 0.500000 0.500000 0 301989888 0 +( 680 176 -480 ) ( 800 176 -480 ) ( 800 176 -488 ) subway/1_tunneltrack_plain -368 0 0 0.500000 0.500000 0 301989888 0 +( 936 176 -552 ) ( 936 176 -536 ) ( 1032 320 -536 ) subway/1_tunneltrack_plain -3440 0 0 0.500000 0.500000 0 301989888 0 +( 972 284 -552 ) ( 972 284 -536 ) ( 992 264 -536 ) subway/metal2 -112 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3563 +{ +( 860 188 0 ) ( 1036 12 0 ) ( 1036 12 10 ) subway/metal_clean 0 0 0 0.500000 0.500000 0 16777216 0 +( 896 208 -496 ) ( 888 208 -496 ) ( 824 112 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 888 208 -480 ) ( 896 208 -480 ) ( 832 112 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 888 208 -496 ) ( 888 208 -480 ) ( 824 112 -480 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 816 112 -488 ) ( 840 112 -488 ) ( 840 112 -504 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 896 208 -480 ) ( 896 208 -496 ) ( 832 112 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 904 208 -488 ) ( 880 208 -488 ) ( 880 208 -504 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3564 +{ +( 840 -56 -488 ) ( 816 -56 -488 ) ( 816 -56 -504 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 832 -216 -280 ) ( 832 -40 -280 ) ( 832 -40 -296 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 816 -144 -488 ) ( 840 -144 -488 ) ( 840 -144 -504 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 824 -8 -488 ) ( 824 -184 -488 ) ( 824 -184 -504 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 824 -64 -480 ) ( 848 -64 -480 ) ( 848 -240 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 848 -240 -496 ) ( 848 -64 -496 ) ( 824 -64 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3565 +{ +( 936 224 -448 ) ( 936 208 -448 ) ( 936 208 -472 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 936 224 -472 ) ( 1032 288 -472 ) ( 1032 288 -448 ) subway/1_tunnelwall_pipe 0 -64 0 0.500000 0.500000 0 16777216 0 +( 1032 288 -472 ) ( 1032 272 -472 ) ( 1032 272 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 936 208 -448 ) ( 1032 272 -448 ) ( 1032 272 -472 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 624 64 -504 ) ( 624 -56 -504 ) ( 624 -56 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 936 224 -448 ) ( 1032 288 -448 ) ( 1032 272 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 936 208 -480 ) ( 1032 272 -480 ) ( 1032 288 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 984 272 58 ) ( 984 272 48 ) ( 1032 224 48 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3566 +{ +( 1032 224 48 ) ( 984 272 48 ) ( 984 272 58 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 968 224 -480 ) ( 984 224 -480 ) ( 1048 320 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 984 224 -448 ) ( 968 224 -448 ) ( 1032 320 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1312 632 -512 ) ( 1312 632 -504 ) ( 1192 632 -504 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 984 224 -472 ) ( 984 224 -448 ) ( 1048 320 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 984 224 -448 ) ( 984 224 -472 ) ( 968 224 -472 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 968 224 -448 ) ( 968 224 -472 ) ( 1032 320 -472 ) subway/1_tunnelwall_pipe 0 -64 0 0.500000 0.500000 0 16777216 0 +( 1048 320 -472 ) ( 1048 320 -448 ) ( 1032 320 -448 ) subway/1_tunnelwall_pipe 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3567 +{ +( 936 224 -496 ) ( 936 208 -496 ) ( 936 208 -520 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 936 224 -520 ) ( 1032 288 -520 ) ( 1032 288 -496 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1032 288 -520 ) ( 1032 272 -520 ) ( 1032 272 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 936 208 -496 ) ( 1032 272 -496 ) ( 1032 272 -520 ) subway/1_tunnelwall 0 -16 0 1 0.500000 0 301989888 0 +( 624 64 -552 ) ( 624 -56 -552 ) ( 624 -56 -560 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 936 224 -496 ) ( 1032 288 -496 ) ( 1032 272 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 936 208 -520 ) ( 1032 272 -520 ) ( 1032 288 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 984 272 10 ) ( 984 272 0 ) ( 1032 224 0 ) subway/metal_clean 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3568 +{ +( 1032 224 0 ) ( 984 272 0 ) ( 984 272 10 ) subway/metal_clean 0 0 0 0.500000 0.500000 0 16777216 0 +( 968 224 -520 ) ( 984 224 -520 ) ( 1048 320 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 984 224 -496 ) ( 968 224 -496 ) ( 1032 320 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1312 632 -560 ) ( 1312 632 -552 ) ( 1192 632 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 984 224 -520 ) ( 984 224 -496 ) ( 1048 320 -496 ) subway/1_tunnelwall 0 -16 0 1 0.500000 0 301989888 0 +( 984 224 -496 ) ( 984 224 -520 ) ( 968 224 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 968 224 -496 ) ( 968 224 -520 ) ( 1032 320 -520 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 1048 320 -520 ) ( 1048 320 -496 ) ( 1032 320 -496 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3569 +{ +( 1048 320 -432 ) ( 1048 320 -408 ) ( 1032 320 -408 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 968 224 -408 ) ( 968 224 -432 ) ( 1032 320 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 984 224 -408 ) ( 984 224 -432 ) ( 968 224 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 984 224 -432 ) ( 984 224 -408 ) ( 1048 320 -408 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1312 632 -472 ) ( 1312 632 -464 ) ( 1192 632 -464 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 984 224 -352 ) ( 968 224 -352 ) ( 1032 320 -352 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 968 224 -448 ) ( 984 224 -448 ) ( 1048 320 -448 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1032 224 136 ) ( 984 272 136 ) ( 984 272 146 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +} +// brush 3570 +{ +( 984 272 146 ) ( 984 272 136 ) ( 1032 224 136 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 936 208 -448 ) ( 1032 272 -448 ) ( 1032 288 -448 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 936 224 -352 ) ( 1032 288 -352 ) ( 1032 272 -352 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 624 64 -464 ) ( 624 -56 -464 ) ( 624 -56 -472 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 936 208 -408 ) ( 1032 272 -408 ) ( 1032 272 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1032 288 -432 ) ( 1032 272 -432 ) ( 1032 272 -408 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 936 224 -432 ) ( 1032 288 -432 ) ( 1032 288 -408 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 936 224 -408 ) ( 936 208 -408 ) ( 936 208 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +} +// brush 3571 +{ +( 824 112 -520 ) ( 824 112 -496 ) ( 840 112 -496 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 904 208 -496 ) ( 904 208 -520 ) ( 840 112 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 888 208 -496 ) ( 888 208 -520 ) ( 904 208 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 888 208 -520 ) ( 888 208 -496 ) ( 824 112 -496 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 560 -200 -560 ) ( 560 -200 -552 ) ( 680 -200 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 888 208 -496 ) ( 904 208 -496 ) ( 840 112 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 904 208 -520 ) ( 888 208 -520 ) ( 824 112 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 840 208 0 ) ( 888 160 0 ) ( 888 160 10 ) subway/metal_clean 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3572 +{ +( 888 160 10 ) ( 888 160 0 ) ( 840 208 0 ) subway/metal_clean 0 0 0 0.500000 0.500000 0 16777216 0 +( 936 224 -520 ) ( 840 160 -520 ) ( 840 144 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 936 208 -496 ) ( 840 144 -496 ) ( 840 160 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1248 368 -552 ) ( 1248 488 -552 ) ( 1248 488 -560 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 936 224 -496 ) ( 840 160 -496 ) ( 840 160 -520 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 840 144 -520 ) ( 840 160 -520 ) ( 840 160 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 936 208 -520 ) ( 840 144 -520 ) ( 840 144 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 936 208 -496 ) ( 936 224 -496 ) ( 936 224 -520 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3573 +{ +( 1032 224 -24 ) ( 984 272 -24 ) ( 984 272 -14 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 968 224 -536 ) ( 984 224 -536 ) ( 1048 320 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 984 224 -520 ) ( 968 224 -520 ) ( 1032 320 -520 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1312 632 -584 ) ( 1312 632 -576 ) ( 1192 632 -576 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 984 224 -536 ) ( 984 224 -512 ) ( 1048 320 -512 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 984 224 -512 ) ( 984 224 -536 ) ( 968 224 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 968 224 -520 ) ( 968 224 -544 ) ( 1032 320 -544 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1048 320 -544 ) ( 1048 320 -520 ) ( 1032 320 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3574 +{ +( 936 224 -520 ) ( 936 208 -520 ) ( 936 208 -544 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 936 224 -544 ) ( 1032 288 -544 ) ( 1032 288 -520 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 1032 288 -544 ) ( 1032 272 -544 ) ( 1032 272 -520 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 936 208 -520 ) ( 1032 272 -520 ) ( 1032 272 -544 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 624 64 -576 ) ( 624 -56 -576 ) ( 624 -56 -584 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 936 224 -520 ) ( 1032 288 -520 ) ( 1032 272 -520 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 936 208 -536 ) ( 1032 272 -536 ) ( 1032 288 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 984 272 -14 ) ( 984 272 -24 ) ( 1032 224 -24 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +} +// brush 3575 +{ +( 848 200 32 ) ( 1032 16 32 ) ( 1032 16 42 ) subway/metal_clean 0 0 0 0.500000 0.500000 0 16777216 0 +( 824 112 -336 ) ( 832 112 -336 ) ( 824 112 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 888 208 -352 ) ( 904 208 -352 ) ( 840 112 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 904 208 -448 ) ( 888 208 -448 ) ( 824 112 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 888 208 -448 ) ( 888 208 -384 ) ( 824 112 -384 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 684 208 -384 ) ( 684 208 -376 ) ( 564 208 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 904 208 -384 ) ( 904 208 -448 ) ( 840 112 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3576 +{ +( 936 224 -264 ) ( 936 192 -264 ) ( 936 192 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 936 208 -480 ) ( 840 144 -480 ) ( 840 144 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 840 480 -424 ) ( 840 360 -424 ) ( 840 360 -432 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 936 224 -448 ) ( 840 160 -448 ) ( 840 160 -480 ) subway/1_tunnelwall_pipe 0 -64 0 0.500000 0.500000 0 16777216 0 +( 1704 360 -512 ) ( 1704 480 -512 ) ( 1704 480 -520 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 936 208 -448 ) ( 840 144 -448 ) ( 840 160 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 936 224 -480 ) ( 840 160 -480 ) ( 840 144 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 1032 16 10 ) ( 1032 16 0 ) ( 856 192 0 ) subway/metal_clean 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3577 +{ +( 856 192 0 ) ( 1032 16 0 ) ( 1032 16 10 ) subway/metal_clean 0 0 0 0.500000 0.500000 0 16777216 0 +( 904 208 -480 ) ( 888 208 -480 ) ( 824 112 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 888 208 -448 ) ( 904 208 -448 ) ( 840 112 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 568 -656 -520 ) ( 568 -656 -512 ) ( 688 -656 -512 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 888 208 -480 ) ( 888 208 -448 ) ( 824 112 -448 ) subway/1_tunnelwall_pipe 0 -64 0 0.500000 0.500000 0 16777216 0 +( 688 208 -432 ) ( 688 208 -424 ) ( 568 208 -424 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 904 208 -448 ) ( 904 208 -480 ) ( 840 112 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 856 112 -254 ) ( 856 112 -264 ) ( 824 112 -264 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3578 +{ +( 824 112 -536 ) ( 824 112 -512 ) ( 840 112 -512 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 904 208 -520 ) ( 904 208 -544 ) ( 840 112 -544 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 888 208 -512 ) ( 888 208 -536 ) ( 904 208 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 888 208 -536 ) ( 888 208 -512 ) ( 824 112 -512 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 560 -200 -576 ) ( 560 -200 -568 ) ( 680 -200 -568 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 888 208 -520 ) ( 904 208 -520 ) ( 840 112 -520 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 904 208 -536 ) ( 888 208 -536 ) ( 824 112 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 840 208 -24 ) ( 888 160 -24 ) ( 888 160 -14 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +} +// brush 3579 +{ +( 936 208 -416 ) ( 840 144 -416 ) ( 840 144 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 840 484 -376 ) ( 840 364 -376 ) ( 840 364 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 936 224 -384 ) ( 840 160 -384 ) ( 840 160 -448 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 936 224 -448 ) ( 840 160 -448 ) ( 840 144 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 936 208 -352 ) ( 840 144 -352 ) ( 840 160 -352 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 936 224 -448 ) ( 936 216 -336 ) ( 936 224 -336 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 1032 16 42 ) ( 1032 16 32 ) ( 848 200 32 ) subway/metal_clean 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3580 +{ +( 888 160 -14 ) ( 888 160 -24 ) ( 840 208 -24 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 936 224 -536 ) ( 840 160 -536 ) ( 840 144 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 936 208 -520 ) ( 840 144 -520 ) ( 840 160 -520 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1248 368 -568 ) ( 1248 488 -568 ) ( 1248 488 -576 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 936 224 -512 ) ( 840 160 -512 ) ( 840 160 -536 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 840 144 -536 ) ( 840 160 -536 ) ( 840 160 -512 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 936 208 -536 ) ( 840 144 -536 ) ( 840 144 -512 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 936 208 -512 ) ( 936 224 -512 ) ( 936 224 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +} +// brush 3581 +{ +( 816 -568 -336 ) ( 824 -568 -336 ) ( 816 -568 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 816 -1128 -384 ) ( 816 -1080 -384 ) ( 824 -1080 -384 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 640 -504 -448 ) ( 640 -480 -448 ) ( 520 -480 -448 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 824 -736 -440 ) ( 824 -736 -432 ) ( 824 -760 -432 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 636 -472 -384 ) ( 636 -472 -376 ) ( 516 -472 -376 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +( 840 -464 -352 ) ( 840 -464 -344 ) ( 840 -440 -344 ) subway/1_tunnelwall 0 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 3582 +{ +( 880 192 -552 ) ( 760 192 -552 ) ( 760 168 -552 ) subway/1_tunneltrack_plain 240 1856 0 0.500000 0.500000 0 301989888 0 +( 760 160 -536 ) ( 760 184 -536 ) ( 880 184 -536 ) subway/1_tunnelfloor_2 920 -16 90 -1 -1 0 285212672 0 +( 704 -144 -568 ) ( 824 -144 -568 ) ( 824 -144 -576 ) subway/1_tunneltrack_plain 240 0 0 0.500000 0.500000 0 301989888 0 +( 720 448 -520 ) ( 720 472 -520 ) ( 720 472 -528 ) subway/1_tunneltrack_plain -1856 0 0 0.500000 0.500000 0 301989888 0 +( 896 264 -480 ) ( 776 264 -480 ) ( 776 264 -488 ) subway/1_tunneltrack_plain 240 0 0 0.500000 0.500000 0 301989888 0 +( 688 192 -520 ) ( 688 168 -520 ) ( 688 168 -528 ) subway/1_tunneltrack_plain -1856 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3583 +{ +( 904 -1232 -504 ) ( 904 -1232 -536 ) ( 856 -1232 -536 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 720 32 -728 ) ( 720 32 -768 ) ( 720 24 -768 ) subway/metal2 624 0 0 0.500000 0.500000 134217728 16777216 0 +( 904 264 -536 ) ( 904 264 -504 ) ( 856 264 -504 ) subway/metal2 40 0 0 0.500000 0.500000 134217728 16777216 0 +( 712 -504 -516 ) ( 712 -768 -516 ) ( 712 -768 -548 ) subway/metal2 624 0 0 0.500000 0.500000 134217728 16777216 0 +( 800 -952 -528 ) ( 800 -688 -528 ) ( 832 -688 -528 ) subway/metal2 624 0 0 0.500000 0.500000 134217728 16777216 0 +( 904 -816 -536 ) ( 904 -808 -536 ) ( 856 -808 -536 ) subway/metal2 40 -624 0 0.500000 0.500000 134217728 16777216 0 +( 744 -144 -264 ) ( 680 -144 -264 ) ( 680 -144 -254 ) subway/1_tunneltrack_1 59 -213 195 1 1 134217728 16777216 0 +} +// brush 3584 +{ +( 956 72 -544 ) ( 836 72 -544 ) ( 836 48 -544 ) subway/1_tunneltrack_1 148 808 0 1 1 0 16777216 0 +( 836 32 -536 ) ( 836 56 -536 ) ( 956 56 -536 ) subway/1_tunneltrack_1 108 808 0 1 1 0 16777216 0 +( 780 -144 -568 ) ( 900 -144 -568 ) ( 900 -144 -576 ) subway/1_tunneltrack_1 148 0 0 1 1 0 16777216 0 +( 792 32 -520 ) ( 792 56 -520 ) ( 792 56 -528 ) subway/1_tunneltrack_1 -660 0 0 1 1 0 16777216 0 +( 1000 264 -480 ) ( 880 264 -480 ) ( 880 264 -488 ) subway/1_tunneltrack_1 148 0 0 1 1 0 16777216 0 +( 720 168 -512 ) ( 720 144 -512 ) ( 720 144 -520 ) subway/1_tunneltrack_1 -660 0 0 1 1 0 16777216 0 +} +// brush 3585 +{ +( 980 -816 -536 ) ( 980 -808 -536 ) ( 932 -808 -536 ) subway/metal2 0 -624 0 0.500000 0.500000 134217728 16777216 0 +( 876 -952 -528 ) ( 876 -688 -528 ) ( 908 -688 -528 ) subway/metal2 624 0 0 0.500000 0.500000 134217728 16777216 0 +( 788 392 -516 ) ( 788 128 -516 ) ( 788 128 -548 ) subway/metal2 624 0 0 0.500000 0.500000 134217728 16777216 0 +( 980 264 -536 ) ( 980 264 -504 ) ( 932 264 -504 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 796 -496 -728 ) ( 796 -496 -768 ) ( 796 -504 -768 ) subway/metal2 624 0 0 0.500000 0.500000 134217728 16777216 0 +( 980 -1232 -504 ) ( 980 -1232 -536 ) ( 932 -1232 -536 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 804 -144 -264 ) ( 764 -144 -264 ) ( 764 -144 -254 ) subway/1_tunneltrack_1 78 -207 195 1 1 134217728 16777216 0 +} +// brush 3586 +{ +( 872 912 -552 ) ( 696 912 -552 ) ( 696 888 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 696 888 -520 ) ( 696 912 -520 ) ( 872 912 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 664 896 -536 ) ( 840 896 -536 ) ( 840 896 -552 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 840 888 -536 ) ( 840 912 -536 ) ( 840 912 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 856 904 -328 ) ( 680 904 -328 ) ( 680 904 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 680 912 -536 ) ( 680 888 -536 ) ( 680 888 -552 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3587 +{ +( 680 912 -504 ) ( 680 888 -504 ) ( 680 888 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 856 904 -296 ) ( 680 904 -296 ) ( 680 904 -312 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 840 888 -504 ) ( 840 912 -504 ) ( 840 912 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 664 896 -504 ) ( 840 896 -504 ) ( 840 896 -520 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 696 888 -496 ) ( 696 912 -496 ) ( 872 912 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 872 912 -520 ) ( 696 912 -520 ) ( 696 888 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3588 +{ +( 872 920 -496 ) ( 696 920 -496 ) ( 696 896 -496 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 696 896 -480 ) ( 696 920 -480 ) ( 872 920 -480 ) subway/metal2 0 16 0 0.500000 0.500000 0 16777216 0 +( 632 896 -488 ) ( 808 896 -488 ) ( 808 896 -504 ) subway/metalrib1 0 16 90 0.500000 0.500000 0 16777216 0 +( 824 880 -488 ) ( 824 904 -488 ) ( 824 904 -504 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +( 856 904 -280 ) ( 680 904 -280 ) ( 680 904 -296 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 688 912 -488 ) ( 688 888 -488 ) ( 688 888 -504 ) subway/1_tunnelwall -16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3589 +{ +( 680 912 -464 ) ( 680 888 -464 ) ( 680 888 -480 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 856 904 -256 ) ( 680 904 -256 ) ( 680 904 -272 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 840 888 -464 ) ( 840 912 -464 ) ( 840 912 -480 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 664 896 -464 ) ( 840 896 -464 ) ( 840 896 -480 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 696 888 -448 ) ( 696 912 -448 ) ( 872 912 -448 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 872 912 -480 ) ( 696 912 -480 ) ( 696 888 -480 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3590 +{ +( 680 912 -432 ) ( 680 888 -432 ) ( 680 888 -448 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 856 904 -224 ) ( 680 904 -224 ) ( 680 904 -240 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 840 888 -432 ) ( 840 912 -432 ) ( 840 912 -448 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 664 896 -432 ) ( 840 896 -432 ) ( 840 896 -448 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 696 888 -336 ) ( 696 912 -336 ) ( 872 912 -336 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 872 912 -448 ) ( 696 912 -448 ) ( 696 888 -448 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3591 +{ +( 1128 -1520 -520 ) ( 1008 -1520 -520 ) ( 1008 -1544 -520 ) subway/1_tunnelwall 0 -16 0 1 0.500000 0 301989888 0 +( 1008 -1560 -496 ) ( 1008 -1536 -496 ) ( 1128 -1536 -496 ) subway/1_tunnelwall 0 -16 0 1 0.500000 0 301989888 0 +( 956 -1272 -572 ) ( 1076 -1272 -572 ) ( 1076 -1272 -580 ) subway/1_tunnelwall 0 -16 0 1 0.500000 0 301989888 0 +( 840 -1596 -540 ) ( 840 -1572 -540 ) ( 840 -1572 -548 ) subway/1_tunnelwall 0 -16 0 1 0.500000 0 301989888 0 +( 1152 -1264 -532 ) ( 1032 -1264 -532 ) ( 1032 -1264 -540 ) subway/1_tunnelwall 0 48 0 0.500000 0.500000 0 301989888 0 +( 680 -1416 -452 ) ( 680 -1440 -452 ) ( 680 -1440 -460 ) subway/1_tunnelwall 0 -16 0 1 0.500000 0 301989888 0 +} +// brush 3592 +{ +( 1128 -1520 -480 ) ( 1008 -1520 -480 ) ( 1008 -1544 -480 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1008 -1560 -448 ) ( 1008 -1536 -448 ) ( 1128 -1536 -448 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 956 -1272 -524 ) ( 1076 -1272 -524 ) ( 1076 -1272 -532 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 840 -1596 -492 ) ( 840 -1572 -492 ) ( 840 -1572 -500 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1152 -1264 -484 ) ( 1032 -1264 -484 ) ( 1032 -1264 -492 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 680 -1416 -404 ) ( 680 -1440 -404 ) ( 680 -1440 -412 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3593 +{ +( 680 -1416 -476 ) ( 680 -1440 -476 ) ( 680 -1440 -484 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1152 -1264 -548 ) ( 1032 -1264 -548 ) ( 1032 -1264 -556 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 840 -1596 -564 ) ( 840 -1572 -564 ) ( 840 -1572 -572 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 956 -1272 -596 ) ( 1076 -1272 -596 ) ( 1076 -1272 -604 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1008 -1560 -520 ) ( 1008 -1536 -520 ) ( 1128 -1536 -520 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +( 1128 -1520 -536 ) ( 1008 -1520 -536 ) ( 1008 -1544 -536 ) subway/1_tunnelwall_floor 0 -48 0 1 0.500000 0 285212672 0 +} +// brush 3594 +{ +( 1332 -376 -544 ) ( 1212 -376 -544 ) ( 1212 -400 -544 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1220 -416 -536 ) ( 1220 -392 -536 ) ( 1340 -392 -536 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1156 -912 -568 ) ( 1276 -912 -568 ) ( 1276 -912 -576 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1168 -64 -520 ) ( 1168 -40 -520 ) ( 1168 -40 -528 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1340 -80 -480 ) ( 1220 -80 -480 ) ( 1220 -80 -488 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1096 -8 -512 ) ( 1096 -32 -512 ) ( 1096 -32 -520 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +( 1204 -136 -264 ) ( 1084 -136 -264 ) ( 1084 -136 -254 ) subway/1_tunneltrack_plain 0 0 0 1 1 0 301989888 0 +} +// brush 3595 +{ +( 608 -576 -336 ) ( 608 -592 -336 ) ( 608 -592 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 616 -576 -336 ) ( 608 -576 -336 ) ( 608 -576 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 610 -594 -336 ) ( 610 -578 -336 ) ( 610 -578 -352 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 15000 +( 608 -592 -336 ) ( 616 -592 -336 ) ( 616 -592 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 608 -592 -336 ) ( 608 -576 -336 ) ( 616 -576 -336 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 616 -576 -352 ) ( 608 -576 -352 ) ( 608 -592 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3596 +{ +( 616 -320 -352 ) ( 608 -320 -352 ) ( 608 -336 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 608 -336 -336 ) ( 608 -320 -336 ) ( 616 -320 -336 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 608 -336 -336 ) ( 616 -336 -336 ) ( 616 -336 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 610 -338 -336 ) ( 610 -322 -336 ) ( 610 -322 -352 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 15000 +( 616 -320 -336 ) ( 608 -320 -336 ) ( 608 -320 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 608 -320 -336 ) ( 608 -336 -336 ) ( 608 -336 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3597 +{ +( 724 -56 -356 ) ( 724 -24 -356 ) ( 696 -24 -368 ) subway/metal1 272 -16 90 0.500000 -0.500000 0 16777216 0 +( 696 -56 -352 ) ( 696 -40 -352 ) ( 720 -40 -352 ) subway/1_tunnelwall 0 -256 0 0.500000 0.500000 0 301989888 0 +( 696 -24 -352 ) ( 696 -40 -352 ) ( 696 -40 -368 ) subway/1_tunnelwall 256 0 0 0.500000 0.500000 0 301989888 0 +( 704 -24 -360 ) ( 704 -24 -368 ) ( 736 -24 -360 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 732 88 -552 ) ( 732 88 -592 ) ( 732 80 -592 ) subway/1_tunnelwall 256 0 0 0.500000 0.500000 0 301989888 0 +( 696 -56 -368 ) ( 696 -56 -360 ) ( 728 -56 -352 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 724 -24 -356 ) ( 724 -56 -356 ) ( 724 -56 -352 ) subway/metalrib1 256 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3598 +{ +( 544 -280 -448 ) ( 544 -280 -400 ) ( 584 -280 -400 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 544 -272 -400 ) ( 544 -272 -448 ) ( 544 -248 -448 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -248 -392 ) ( 536 -248 -392 ) ( 536 -248 -440 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 576 -264 -384 ) ( 576 -232 -384 ) ( 576 -232 -424 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 376 -264 -384 ) ( 336 -264 -384 ) ( 336 -232 -384 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 328 -240 -392 ) ( 328 -272 -392 ) ( 368 -272 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3599 +{ +( 384 -768 -464 ) ( 384 -768 -416 ) ( 424 -768 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -464 ) ( 384 -760 -392 ) ( 376 -768 -392 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -392 ) ( 384 -760 -464 ) ( 704 -760 -464 ) subway/1_tile 0 -16 0 -0.500000 0.500000 0 318767104 0 +( 528 -736 -456 ) ( 448 -736 -456 ) ( 448 -792 -456 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 448 -792 -424 ) ( 448 -736 -424 ) ( 528 -736 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 472 -792 -392 ) ( 472 -736 -392 ) ( 472 -792 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3600 +{ +( 384 -768 -464 ) ( 384 -768 -416 ) ( 424 -768 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -464 ) ( 384 -760 -392 ) ( 376 -768 -392 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -392 ) ( 384 -760 -464 ) ( 704 -760 -464 ) subway/1_tile 0 -16 0 -0.500000 0.500000 0 318767104 0 +( 672 -776 -408 ) ( 672 -744 -408 ) ( 672 -744 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 424 -752 -464 ) ( 424 -784 -464 ) ( 464 -784 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 448 -736 -456 ) ( 528 -736 -456 ) ( 448 -792 -456 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3601 +{ +( 560 -736 -448 ) ( 480 -736 -448 ) ( 480 -792 -448 ) subway/1_tile_graf9 -144 -16 0 -0.500000 0.500000 0 352321536 0 +( 480 -792 -416 ) ( 480 -736 -416 ) ( 560 -736 -416 ) subway/1_tile_graf9 -144 -16 0 -0.500000 0.500000 0 352321536 0 +( 480 -768 -384 ) ( 560 -768 -384 ) ( 560 -768 -456 ) subway/1_tile_graf9 -144 0 0 -0.500000 0.500000 0 352321536 0 +( 536 -800 -384 ) ( 536 -744 -384 ) ( 536 -744 -456 ) subway/1_tile_graf9 0 0 0 -0.500000 0.500000 0 352321536 0 +( 560 -760 -384 ) ( 480 -760 -384 ) ( 480 -760 -456 ) subway/1_tile_graf6 48 0 0 -0.500000 0.500000 0 352321536 0 +( 504 -736 -384 ) ( 504 -792 -384 ) ( 504 -792 -456 ) subway/1_tile_graf9 0 0 0 -0.500000 0.500000 0 352321536 0 +} +// brush 3602 +{ +( 328 -368 -456 ) ( 328 -400 -456 ) ( 368 -400 -456 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -392 -448 ) ( 336 -392 -448 ) ( 336 -360 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -392 -464 ) ( 576 -360 -464 ) ( 576 -360 -504 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 584 -376 -472 ) ( 536 -376 -472 ) ( 536 -376 -520 ) subway/1_tile_damage2 144 40 0 0.500000 0.500000 0 352321536 0 +( 544 -400 -416 ) ( 544 -400 -464 ) ( 544 -376 -464 ) subway/1_tile_damage2 16 32 0 0.500000 0.500000 0 352321536 0 +( 544 -408 -512 ) ( 544 -408 -464 ) ( 584 -408 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3603 +{ +( 328 -368 -448 ) ( 328 -400 -448 ) ( 368 -400 -448 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 376 -392 -432 ) ( 336 -392 -432 ) ( 336 -360 -432 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 576 -392 -448 ) ( 576 -360 -448 ) ( 576 -360 -488 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 584 -376 -456 ) ( 536 -376 -456 ) ( 536 -376 -504 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 544 -400 -400 ) ( 544 -400 -448 ) ( 544 -376 -448 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 544 -408 -504 ) ( 544 -408 -456 ) ( 584 -408 -456 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3604 +{ +( 328 -496 -448 ) ( 328 -528 -448 ) ( 368 -528 -448 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 376 -520 -432 ) ( 336 -520 -432 ) ( 336 -488 -432 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 576 -520 -448 ) ( 576 -488 -448 ) ( 576 -488 -488 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 584 -504 -456 ) ( 536 -504 -456 ) ( 536 -504 -504 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 544 -528 -400 ) ( 544 -528 -448 ) ( 544 -504 -448 ) subway/1_tile_middle 80 32 0 -0.500000 0.500000 0 318767104 0 +( 544 -536 -504 ) ( 544 -536 -456 ) ( 584 -536 -456 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3605 +{ +( 544 -408 -520 ) ( 544 -408 -472 ) ( 584 -408 -472 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 544 -400 -424 ) ( 544 -400 -472 ) ( 544 -376 -472 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( 584 -376 -480 ) ( 536 -376 -480 ) ( 536 -376 -528 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -392 -472 ) ( 576 -360 -472 ) ( 576 -360 -512 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -392 -456 ) ( 336 -392 -456 ) ( 336 -360 -456 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 328 -368 -464 ) ( 328 -400 -464 ) ( 368 -400 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3606 +{ +( 544 -664 -512 ) ( 544 -664 -464 ) ( 584 -664 -464 ) subway/1_tile 576 -432 0 0.500000 0.500000 0 318767104 0 +( 544 -656 -424 ) ( 544 -656 -472 ) ( 544 -632 -472 ) subway/1_tile 576 -432 0 0.500000 0.500000 0 318767104 0 +( 584 -632 -464 ) ( 536 -632 -464 ) ( 536 -632 -512 ) subway/1_tile 576 -432 0 0.500000 0.500000 0 318767104 0 +( 576 -648 -456 ) ( 576 -616 -456 ) ( 576 -616 -496 ) subway/1_tile 576 -432 0 0.500000 0.500000 0 318767104 0 +( 376 -648 -448 ) ( 336 -648 -448 ) ( 336 -616 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 328 -616 -456 ) ( 328 -648 -456 ) ( 368 -648 -456 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3607 +{ +( 544 -664 -480 ) ( 544 -664 -432 ) ( 584 -664 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 544 -656 -384 ) ( 544 -656 -432 ) ( 544 -632 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 584 -632 -432 ) ( 536 -632 -432 ) ( 536 -632 -480 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -648 -424 ) ( 576 -616 -424 ) ( 576 -616 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -648 -424 ) ( 336 -648 -424 ) ( 336 -616 -424 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 328 -616 -432 ) ( 328 -648 -432 ) ( 368 -648 -432 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3608 +{ +( 544 -664 -496 ) ( 544 -664 -448 ) ( 584 -664 -448 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 544 -656 -400 ) ( 544 -656 -448 ) ( 544 -632 -448 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 584 -632 -448 ) ( 536 -632 -448 ) ( 536 -632 -496 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 576 -648 -440 ) ( 576 -616 -440 ) ( 576 -616 -480 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 376 -648 -432 ) ( 336 -648 -432 ) ( 336 -616 -432 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 328 -616 -448 ) ( 328 -648 -448 ) ( 368 -648 -448 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3609 +{ +( 176 -664 -464 ) ( 136 -664 -464 ) ( 136 -696 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 344 -696 -464 ) ( 344 -696 -416 ) ( 392 -696 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 344 -688 -416 ) ( 344 -688 -464 ) ( 320 -664 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -664 -424 ) ( 376 -664 -384 ) ( 336 -664 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 368 -696 -432 ) ( 368 -664 -432 ) ( 408 -664 -432 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 368 -696 -432 ) ( 368 -664 -432 ) ( 368 -696 -480 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3610 +{ +( 176 -664 -464 ) ( 136 -664 -464 ) ( 136 -696 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 416 -712 -448 ) ( 416 -712 -408 ) ( 416 -680 -408 ) subway/1_tile_damage2 24 -32 0 -0.500000 0.500000 0 352321536 0 +( 344 -696 -464 ) ( 344 -696 -416 ) ( 392 -696 -416 ) subway/1_tile_damage1 56 -32 0 -0.500000 0.500000 0 352321536 0 +( 376 -664 -424 ) ( 376 -664 -384 ) ( 336 -664 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 368 -696 -432 ) ( 368 -664 -432 ) ( 408 -664 -432 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 400 -664 -432 ) ( 400 -696 -432 ) ( 400 -664 -480 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3611 +{ +( 144 -704 -416 ) ( 144 -672 -416 ) ( 184 -672 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 416 -712 -448 ) ( 416 -712 -408 ) ( 416 -680 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 344 -696 -464 ) ( 344 -696 -416 ) ( 392 -696 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 344 -688 -416 ) ( 344 -688 -464 ) ( 320 -664 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -664 -424 ) ( 376 -664 -384 ) ( 336 -664 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 368 -664 -432 ) ( 368 -696 -432 ) ( 408 -664 -432 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3612 +{ +( 408 -664 -464 ) ( 368 -664 -464 ) ( 368 -696 -464 ) subway/1_tile_damage1 32 0 0 -0.500000 0.500000 0 352321536 0 +( 368 -696 -432 ) ( 368 -664 -432 ) ( 408 -664 -432 ) subway/1_tile_damage1 32 0 0 -0.500000 0.500000 0 352321536 0 +( 368 -696 -432 ) ( 408 -696 -432 ) ( 408 -696 -480 ) subway/1_tile_damage1 56 -32 0 -0.500000 0.500000 0 352321536 0 +( 400 -704 -432 ) ( 400 -672 -432 ) ( 400 -672 -480 ) subway/1_tile_damage1 32 -32 0 -0.500000 0.500000 0 352321536 0 +( 408 -664 -432 ) ( 368 -664 -432 ) ( 368 -664 -480 ) subway/1_tile_damage1 32 -32 0 -0.500000 0.500000 0 352321536 0 +( 368 -664 -432 ) ( 368 -696 -432 ) ( 368 -696 -480 ) subway/1_tile_damage1 32 -32 0 -0.500000 0.500000 0 352321536 0 +} +// brush 3613 +{ +( 392 -504 -416 ) ( 344 -504 -416 ) ( 344 -504 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 328 -528 -464 ) ( 352 -504 -464 ) ( 352 -504 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 368 -536 -384 ) ( 408 -536 -384 ) ( 408 -536 -424 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 400 -504 -456 ) ( 368 -504 -456 ) ( 368 -544 -456 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 368 -544 -424 ) ( 368 -504 -424 ) ( 400 -504 -424 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 360 -544 -424 ) ( 360 -504 -424 ) ( 360 -544 -472 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3614 +{ +( 416 -528 -408 ) ( 416 -496 -408 ) ( 416 -496 -448 ) subway/1_tile_graf1 48 -24 0 0.500000 0.500000 0 352321536 0 +( 392 -504 -416 ) ( 344 -504 -416 ) ( 344 -504 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 368 -536 -384 ) ( 408 -536 -384 ) ( 408 -536 -424 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 400 -504 -456 ) ( 368 -504 -456 ) ( 368 -544 -456 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 368 -544 -424 ) ( 368 -504 -424 ) ( 400 -504 -424 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 392 -504 -424 ) ( 392 -544 -424 ) ( 392 -504 -472 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3615 +{ +( 184 -528 -416 ) ( 144 -528 -416 ) ( 144 -496 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 416 -528 -408 ) ( 416 -496 -408 ) ( 416 -496 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 392 -504 -416 ) ( 344 -504 -416 ) ( 344 -504 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 328 -528 -464 ) ( 352 -504 -464 ) ( 352 -504 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 368 -536 -384 ) ( 408 -536 -384 ) ( 408 -536 -424 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 368 -504 -424 ) ( 368 -544 -424 ) ( 400 -504 -424 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3616 +{ +( 136 -504 -464 ) ( 136 -536 -464 ) ( 176 -536 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 416 -528 -408 ) ( 416 -496 -408 ) ( 416 -496 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 392 -504 -416 ) ( 344 -504 -416 ) ( 344 -504 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 328 -528 -464 ) ( 352 -504 -464 ) ( 352 -504 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 368 -536 -384 ) ( 408 -536 -384 ) ( 408 -536 -424 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 368 -504 -456 ) ( 400 -504 -456 ) ( 368 -544 -456 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3617 +{ +( 400 -504 -456 ) ( 368 -504 -456 ) ( 368 -544 -456 ) subway/1_tile_damage2 -16 0 0 0.500000 0.500000 0 352321536 0 +( 368 -544 -424 ) ( 368 -504 -424 ) ( 400 -504 -424 ) subway/1_tile_damage2 -16 0 0 0.500000 0.500000 0 352321536 0 +( 368 -536 -424 ) ( 400 -536 -424 ) ( 400 -536 -472 ) subway/1_tile_damage2 -16 -16 0 0.500000 0.500000 0 352321536 0 +( 392 -536 -424 ) ( 392 -496 -424 ) ( 392 -496 -472 ) subway/1_tile_damage2 0 -16 0 0.500000 0.500000 0 352321536 0 +( 400 -504 -424 ) ( 368 -504 -424 ) ( 368 -504 -472 ) subway/1_tile_damage2 -16 -16 0 0.500000 0.500000 0 352321536 0 +( 360 -504 -424 ) ( 360 -544 -424 ) ( 360 -544 -472 ) subway/1_tile_damage2 0 -16 0 0.500000 0.500000 0 352321536 0 +} +// brush 3618 +{ +( 400 -448 -392 ) ( 368 -448 -392 ) ( 368 -408 -392 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 376 -144 -464 ) ( 384 -152 -464 ) ( 384 -152 -392 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -328 -392 ) ( 384 -264 -392 ) ( 384 -264 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -424 -416 ) ( 376 -464 -416 ) ( 376 -464 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -272 -416 ) ( 384 -376 -416 ) ( 440 -272 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -224 -392 ) ( 424 -224 -392 ) ( 376 -224 -424 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3619 +{ +( 400 -448 -392 ) ( 368 -448 -392 ) ( 368 -408 -392 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 384 -328 -392 ) ( 384 -264 -392 ) ( 384 -264 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -504 -464 ) ( 360 -504 -464 ) ( 360 -504 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -424 -416 ) ( 376 -464 -416 ) ( 376 -464 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -272 -416 ) ( 384 -376 -416 ) ( 440 -272 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 392 -256 -392 ) ( 344 -256 -392 ) ( 392 -256 -424 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3620 +{ +( 376 -144 -464 ) ( 384 -152 -464 ) ( 384 -152 -392 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -328 -392 ) ( 384 -264 -392 ) ( 384 -264 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -424 -416 ) ( 376 -464 -416 ) ( 376 -464 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -376 -416 ) ( 384 -272 -416 ) ( 440 -272 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 424 -208 -424 ) ( 376 -208 -424 ) ( 376 -264 -424 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -224 -392 ) ( 424 -224 -392 ) ( 376 -224 -424 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3621 +{ +( 384 -328 -392 ) ( 384 -264 -392 ) ( 384 -264 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -424 -416 ) ( 376 -464 -416 ) ( 376 -464 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -376 -416 ) ( 384 -272 -416 ) ( 440 -272 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -304 -400 ) ( 440 -304 -400 ) ( 384 -304 -472 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 424 -208 -424 ) ( 376 -208 -424 ) ( 376 -264 -424 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 392 -256 -392 ) ( 344 -256 -392 ) ( 392 -256 -424 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3622 +{ +( 376 -144 -464 ) ( 384 -152 -464 ) ( 384 -152 -392 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -328 -392 ) ( 384 -264 -392 ) ( 384 -264 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -424 -416 ) ( 376 -464 -416 ) ( 376 -464 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 440 -272 -448 ) ( 384 -272 -448 ) ( 384 -376 -448 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -304 -400 ) ( 440 -304 -400 ) ( 384 -304 -472 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -208 -424 ) ( 424 -208 -424 ) ( 376 -264 -424 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3623 +{ +( 424 -208 -424 ) ( 376 -208 -424 ) ( 376 -264 -424 ) subway/1_tile_graf12 0 0 0 0.500000 0.500000 0 318767104 0 +( 376 -264 -392 ) ( 376 -208 -392 ) ( 424 -208 -392 ) subway/1_tile_graf12 0 0 0 0.500000 0.500000 0 318767104 0 +( 344 -256 -392 ) ( 392 -256 -392 ) ( 392 -256 -424 ) subway/1_tile_graf12 0 48 0 0.500000 0.500000 0 318767104 0 +( 384 -264 -392 ) ( 384 -208 -392 ) ( 384 -208 -424 ) subway/1_tile_graf12 0 48 0 0.500000 0.500000 0 318767104 0 +( 424 -224 -392 ) ( 376 -224 -392 ) ( 376 -224 -424 ) subway/1_tile_graf12 0 48 0 0.500000 0.500000 0 318767104 0 +( 376 -208 -392 ) ( 376 -264 -392 ) ( 376 -264 -424 ) subway/1_tile_graf12 0 48 0 0.500000 0.500000 0 318767104 0 +} +// brush 3624 +{ +( 384 -328 -392 ) ( 384 -264 -392 ) ( 384 -264 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -504 -464 ) ( 360 -504 -464 ) ( 360 -504 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -424 -416 ) ( 376 -464 -416 ) ( 376 -464 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 440 -272 -448 ) ( 384 -272 -448 ) ( 384 -376 -448 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -376 -416 ) ( 384 -272 -416 ) ( 440 -272 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 440 -368 -392 ) ( 384 -368 -392 ) ( 440 -368 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3625 +{ +( 360 -416 -464 ) ( 360 -456 -464 ) ( 392 -456 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 376 -144 -464 ) ( 384 -152 -464 ) ( 384 -152 -392 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -328 -392 ) ( 384 -264 -392 ) ( 384 -264 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -504 -464 ) ( 360 -504 -464 ) ( 360 -504 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -424 -416 ) ( 376 -464 -416 ) ( 376 -464 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -272 -448 ) ( 440 -272 -448 ) ( 384 -376 -448 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3626 +{ +( 440 -272 -448 ) ( 384 -272 -448 ) ( 384 -376 -448 ) subway/1_tile_graf11 0 288 0 0.500000 0.500000 0 318767104 0 +( 384 -376 -416 ) ( 384 -272 -416 ) ( 440 -272 -416 ) subway/1_tile_graf11 0 288 0 0.500000 0.500000 0 318767104 0 +( 384 -368 -392 ) ( 440 -368 -392 ) ( 440 -368 -464 ) subway/1_tile_graf11 0 0 0 0.500000 0.500000 0 318767104 0 +( 384 -376 -392 ) ( 384 -272 -392 ) ( 384 -272 -464 ) subway/1_tile_graf11 -288 0 0 0.500000 0.500000 0 318767104 0 +( 440 -304 -400 ) ( 384 -304 -400 ) ( 384 -304 -472 ) subway/1_tile_graf11 0 0 0 0.500000 0.500000 0 318767104 0 +( 376 -272 -392 ) ( 376 -376 -392 ) ( 376 -376 -464 ) subway/1_tile_graf11 -288 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3627 +{ +( -336 -416 -416 ) ( -336 -384 -416 ) ( -296 -384 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -192 -408 -416 ) ( 120 -408 -416 ) ( 120 -408 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 0 -368 -448 ) ( 0 -368 -408 ) ( 0 -400 -408 ) subway/1_tile_graf2 80 0 0 -0.500000 0.500000 0 352321536 0 +( 128 -376 -464 ) ( 128 -376 -416 ) ( -192 -376 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 112 -360 -448 ) ( 64 -360 -448 ) ( 64 -400 -448 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 48 -400 -416 ) ( 48 -360 -416 ) ( 48 -400 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3628 +{ +( -336 -416 -416 ) ( -336 -384 -416 ) ( -296 -384 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 128 -376 -416 ) ( 128 -376 -464 ) ( 128 -408 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -192 -408 -416 ) ( 120 -408 -416 ) ( 120 -408 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -376 -464 ) ( 128 -376 -416 ) ( -192 -376 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 112 -360 -448 ) ( 64 -360 -448 ) ( 64 -400 -448 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 80 -360 -416 ) ( 80 -400 -416 ) ( 80 -360 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3629 +{ +( -304 -376 -464 ) ( -344 -376 -464 ) ( -344 -408 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 128 -376 -416 ) ( 128 -376 -464 ) ( 128 -408 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -192 -408 -416 ) ( 120 -408 -416 ) ( 120 -408 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 0 -368 -448 ) ( 0 -368 -408 ) ( 0 -400 -408 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 128 -376 -464 ) ( 128 -376 -416 ) ( -192 -376 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 64 -360 -448 ) ( 112 -360 -448 ) ( 64 -400 -448 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3630 +{ +( 112 -360 -448 ) ( 64 -360 -448 ) ( 64 -400 -448 ) subway/1_tile_graf5 -80 0 0 0.500000 0.500000 0 352321536 0 +( 64 -400 -416 ) ( 64 -360 -416 ) ( 112 -360 -416 ) subway/1_tile_graf5 -80 0 0 0.500000 0.500000 0 352321536 0 +( 64 -408 -416 ) ( 112 -408 -416 ) ( 112 -408 -464 ) subway/1_tile_graf5 -80 0 0 0.500000 0.500000 0 352321536 0 +( 80 -400 -416 ) ( 80 -360 -416 ) ( 80 -360 -464 ) subway/1_tile_graf5 0 0 0 0.500000 0.500000 0 352321536 0 +( 112 -376 -416 ) ( 64 -376 -416 ) ( 64 -376 -464 ) subway/1_tile_graf5 96 0 0 -0.500000 0.500000 0 352321536 0 +( 48 -360 -416 ) ( 48 -400 -416 ) ( 48 -400 -464 ) subway/1_tile_graf5 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 3631 +{ +( -384 -248 -416 ) ( -64 -248 -416 ) ( -64 -248 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -464 ) ( -256 -216 -416 ) ( -224 -248 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -416 ) ( -256 -216 -464 ) ( 136 -216 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -24 -216 -456 ) ( -96 -216 -456 ) ( -96 -256 -456 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -96 -256 -424 ) ( -96 -216 -424 ) ( -24 -216 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -96 -256 -424 ) ( -96 -216 -424 ) ( -96 -256 -472 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3632 +{ +( -384 -248 -416 ) ( -64 -248 -416 ) ( -64 -248 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -464 ) ( -256 -216 -416 ) ( -224 -248 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -416 ) ( -256 -216 -464 ) ( 136 -216 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -464 ) ( 136 -248 -464 ) ( 136 -248 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -216 -240 -416 ) ( -256 -240 -416 ) ( -256 -208 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -96 -216 -424 ) ( -96 -256 -424 ) ( -24 -216 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3633 +{ +( -384 -248 -416 ) ( -64 -248 -416 ) ( -64 -248 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -464 ) ( -256 -216 -416 ) ( -224 -248 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -416 ) ( -256 -216 -464 ) ( 136 -216 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -464 ) ( 136 -248 -464 ) ( 136 -248 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -264 -216 -464 ) ( -264 -248 -464 ) ( -224 -248 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -96 -216 -456 ) ( -24 -216 -456 ) ( -96 -256 -456 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3634 +{ +( 40 -216 -456 ) ( -32 -216 -456 ) ( -32 -256 -456 ) subway/1_tile_graf3 128 0 0 0.500000 0.500000 0 352321536 0 +( -32 -256 -424 ) ( -32 -216 -424 ) ( 40 -216 -424 ) subway/1_tile_graf3 128 0 0 0.500000 0.500000 0 352321536 0 +( -32 -248 -424 ) ( 40 -248 -424 ) ( 40 -248 -472 ) subway/1_tile_graf6 0 -16 0 0.500000 0.500000 0 352321536 0 +( 0 -256 -424 ) ( 0 -216 -424 ) ( 0 -216 -472 ) subway/1_tile_graf3 128 -16 0 0.500000 0.500000 0 352321536 0 +( 40 -216 -424 ) ( -32 -216 -424 ) ( -32 -216 -472 ) subway/1_tile_graf3 128 -16 0 0.500000 0.500000 0 352321536 0 +( -32 -224 -424 ) ( -32 -264 -424 ) ( -32 -264 -472 ) subway/1_tile_graf3 128 -16 0 0.500000 0.500000 0 352321536 0 +} +// brush 3635 +{ +( -192 -760 -384 ) ( -192 -792 -384 ) ( -152 -792 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 16 -612 -328 ) ( 16 -580 -328 ) ( 16 -580 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 0 -488 -312 ) ( -40 -488 -312 ) ( -40 -488 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -808 -328 ) ( 8 -840 -328 ) ( 8 -840 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -8 -656 -352 ) ( 8 -656 -352 ) ( -8 -696 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -608 -352 ) ( 16 -608 -352 ) ( 8 -608 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3636 +{ +( -192 -792 -384 ) ( -192 -824 -384 ) ( -152 -824 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 16 -644 -328 ) ( 16 -612 -328 ) ( 16 -612 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -840 -328 ) ( 8 -872 -328 ) ( 8 -872 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -228 -824 -312 ) ( -188 -824 -312 ) ( -188 -824 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -8 -688 -352 ) ( 8 -688 -352 ) ( -8 -728 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 16 -792 -352 ) ( 8 -792 -352 ) ( 16 -792 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3637 +{ +( 16 -612 -384 ) ( 8 -612 -384 ) ( 8 -640 -384 ) subway/1_tile_graf1 0 -16 0 0.500000 0.500000 0 352321536 0 +( 8 -640 -352 ) ( 8 -612 -352 ) ( 16 -612 -352 ) subway/1_tile_graf1 0 -16 0 0.500000 0.500000 0 352321536 0 +( 8 -640 -352 ) ( 16 -640 -352 ) ( 16 -640 -384 ) subway/1_tile_graf1 0 0 0 0.500000 0.500000 0 352321536 0 +( 16 -640 -352 ) ( 16 -612 -352 ) ( 16 -612 -384 ) subway/1_tile_graf1 16 0 0 0.500000 0.500000 0 352321536 0 +( 16 -608 -352 ) ( 8 -608 -352 ) ( 8 -608 -384 ) subway/1_tile_graf1 0 0 0 0.500000 0.500000 0 352321536 0 +( 8 -612 -352 ) ( 8 -640 -352 ) ( 8 -640 -384 ) subway/1_tile_graf1 64 0 0 -0.500000 0.500000 0 352321536 0 +} +// brush 3638 +{ +( -144 -784 -320 ) ( -184 -784 -320 ) ( -184 -752 -320 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 16 -612 -328 ) ( 16 -580 -328 ) ( 16 -580 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 0 -488 -312 ) ( -40 -488 -312 ) ( -40 -488 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -808 -328 ) ( 8 -840 -328 ) ( 8 -840 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -656 -352 ) ( -8 -656 -352 ) ( -8 -696 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -8 -656 -320 ) ( 8 -656 -320 ) ( -8 -656 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3639 +{ +( -144 -784 -320 ) ( -184 -784 -320 ) ( -184 -752 -320 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 16 -612 -328 ) ( 16 -580 -328 ) ( 16 -580 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -808 -328 ) ( 8 -840 -328 ) ( 8 -840 -368 ) subway/1_tile 112 64 0 -0.500000 0.500000 0 318767104 0 +( -228 -824 -304 ) ( -188 -824 -304 ) ( -188 -824 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -656 -352 ) ( -8 -656 -352 ) ( -8 -696 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -688 -320 ) ( -8 -688 -320 ) ( 8 -688 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3640 +{ +( 8 -656 -352 ) ( -8 -656 -352 ) ( -8 -696 -352 ) subway/1_tile_damage1 32 0 0 0.500000 0.500000 0 352321536 0 +( -8 -696 -320 ) ( -8 -656 -320 ) ( 8 -656 -320 ) subway/1_tile_damage1 32 0 0 0.500000 0.500000 0 352321536 0 +( -8 -688 -320 ) ( 8 -688 -320 ) ( 8 -688 -384 ) subway/1_tile_damage1 32 0 0 0.500000 0.500000 0 352321536 0 +( 16 -696 -320 ) ( 16 -656 -320 ) ( 16 -656 -384 ) subway/1_tile_damage1 32 0 0 0.500000 0.500000 0 352321536 0 +( 8 -656 -320 ) ( -8 -656 -320 ) ( -8 -656 -384 ) subway/1_tile_damage1 32 0 0 0.500000 0.500000 0 352321536 0 +( 8 -656 -320 ) ( 8 -696 -320 ) ( 8 -696 -384 ) subway/1_tile_damage1 32 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 3641 +{ +( -144 -600 -328 ) ( -144 -632 -328 ) ( -144 -632 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -152 -488 -312 ) ( -192 -488 -312 ) ( -192 -488 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -660 -328 ) ( -136 -628 -328 ) ( -136 -628 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -120 -576 -368 ) ( -144 -576 -368 ) ( -144 -680 -368 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -144 -680 -336 ) ( -144 -576 -336 ) ( -120 -576 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -144 -616 -320 ) ( -120 -616 -320 ) ( -144 -616 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3642 +{ +( -380 -792 -304 ) ( -340 -792 -304 ) ( -340 -792 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -144 -688 -328 ) ( -144 -720 -328 ) ( -144 -720 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -732 -328 ) ( -136 -700 -328 ) ( -136 -700 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -120 -656 -368 ) ( -144 -656 -368 ) ( -144 -760 -368 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -144 -760 -336 ) ( -144 -656 -336 ) ( -120 -656 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -120 -776 -304 ) ( -144 -776 -304 ) ( -120 -776 -368 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3643 +{ +( 672 -672 -408 ) ( 672 -696 -408 ) ( 672 -696 -416 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 1032 -48 -440 ) ( 912 -48 -440 ) ( 912 -48 -448 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 688 -456 -496 ) ( 688 -432 -496 ) ( 688 -432 -504 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 824 -912 -528 ) ( 944 -912 -528 ) ( 944 -912 -536 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 880 -776 -480 ) ( 880 -752 -480 ) ( 1000 -752 -480 ) subway/metalrib1b 0 0 0 0.500000 0.500000 0 16777216 0 +( 992 -736 -496 ) ( 872 -736 -496 ) ( 872 -760 -496 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 672 -56 -264 ) ( 736 -56 -264 ) ( 736 -56 -254 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +} +// brush 3644 +{ +( 696 -920 -536 ) ( 672 -920 -536 ) ( 672 -944 -536 ) subway/metalrib1 16 16 0 0.500000 0.500000 0 16777216 0 +( 680 -944 -352 ) ( 680 -920 -352 ) ( 704 -920 -352 ) subway/metalrib1 16 16 0 0.500000 0.500000 0 16777216 0 +( 680 -944 -448 ) ( 704 -944 -448 ) ( 704 -944 -480 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 688 -928 -448 ) ( 688 -904 -448 ) ( 688 -904 -480 ) subway/metal1 -32 0 0 0.500000 0.500000 0 16777216 0 +( 704 -912 -552 ) ( 680 -912 -552 ) ( 680 -912 -584 ) subway/metal2 16 0 0 0.500000 0.500000 0 16777216 0 +( 680 -920 -448 ) ( 680 -944 -448 ) ( 680 -944 -480 ) subway/metalrib1 -16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3645 +{ +( 752 -688 -336 ) ( 752 -768 -336 ) ( 752 -768 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 760 -696 -336 ) ( 752 -696 -336 ) ( 752 -696 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 760 -760 -336 ) ( 760 -680 -336 ) ( 760 -680 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 752 -760 -336 ) ( 760 -760 -336 ) ( 760 -760 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 752 -768 -344 ) ( 752 -688 -344 ) ( 760 -688 -344 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 760 -688 -348 ) ( 752 -688 -348 ) ( 752 -768 -348 ) subway/1_florescent 0 0 0 0.500000 0.500000 134217728 1 3500 +} +// brush 3646 +{ +( 760 -432 -348 ) ( 752 -432 -348 ) ( 752 -512 -348 ) subway/1_florescent 0 0 0 0.500000 0.500000 134217728 1 3500 +( 752 -512 -344 ) ( 752 -432 -344 ) ( 760 -432 -344 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 752 -504 -336 ) ( 760 -504 -336 ) ( 760 -504 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 760 -504 -336 ) ( 760 -424 -336 ) ( 760 -424 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 760 -440 -336 ) ( 752 -440 -336 ) ( 752 -440 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 752 -432 -336 ) ( 752 -512 -336 ) ( 752 -512 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3647 +{ +( 472 -608 -344 ) ( 472 -688 -344 ) ( 472 -688 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 480 -616 -344 ) ( 472 -616 -344 ) ( 472 -616 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 480 -680 -344 ) ( 480 -600 -344 ) ( 480 -600 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 472 -680 -344 ) ( 480 -680 -344 ) ( 480 -680 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 472 -688 -352 ) ( 472 -608 -352 ) ( 480 -608 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 480 -608 -356 ) ( 472 -608 -356 ) ( 472 -688 -356 ) subway/1_florescent -1 0 0 0.500000 0.500000 134217728 1 9000 +} +// brush 3648 +{ +( 680 -888 -448 ) ( 680 -912 -448 ) ( 680 -912 -456 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 688 -416 -520 ) ( 688 -392 -520 ) ( 688 -392 -528 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 880 -776 -520 ) ( 880 -752 -520 ) ( 1000 -752 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 992 -736 -536 ) ( 872 -736 -536 ) ( 872 -760 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 688 -344 -488 ) ( 688 -344 -536 ) ( 704 -344 -488 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 704 -544 -488 ) ( 704 -544 -536 ) ( 688 -544 -488 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3649 +{ +( 704 -344 -536 ) ( 704 -320 -536 ) ( 688 -320 -536 ) subway/1_black 224 496 0 0.500000 0.500000 0 16777216 0 +( 688 -320 -520 ) ( 704 -320 -520 ) ( 704 -344 -520 ) subway/1_black 224 496 0 0.500000 0.500000 0 16777216 0 +( 688 -344 -536 ) ( 688 -344 -488 ) ( 704 -344 -488 ) subway/1_black 224 -304 0 0.500000 0.500000 0 16777216 0 +( 680 -320 -536 ) ( 680 -320 -488 ) ( 680 -344 -488 ) subway/1_black -496 -304 0 0.500000 0.500000 0 16777216 0 +( 712 -328 -536 ) ( 712 -328 -488 ) ( 696 -328 -488 ) subway/1_black 224 -304 0 0.500000 0.500000 0 16777216 0 +( 688 -344 -536 ) ( 688 -344 -488 ) ( 688 -320 -488 ) subway/light_red -496 -304 0 0.500000 0.500000 0 16777217 20000 +} +// brush 3650 +{ +( 680 -888 -448 ) ( 680 -912 -448 ) ( 680 -912 -456 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 688 -416 -520 ) ( 688 -392 -520 ) ( 688 -392 -528 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 880 -776 -520 ) ( 880 -752 -520 ) ( 1000 -752 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 992 -736 -536 ) ( 872 -736 -536 ) ( 872 -760 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 688 -160 -488 ) ( 688 -160 -536 ) ( 704 -160 -488 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 712 -328 -488 ) ( 712 -328 -536 ) ( 696 -328 -488 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3651 +{ +( 704 -160 -536 ) ( 704 -136 -536 ) ( 688 -136 -536 ) subway/1_black 224 864 0 0.500000 0.500000 0 16777216 0 +( 688 -136 -520 ) ( 704 -136 -520 ) ( 704 -160 -520 ) subway/1_black 224 864 0 0.500000 0.500000 0 16777216 0 +( 688 -160 -536 ) ( 688 -160 -488 ) ( 704 -160 -488 ) subway/1_black 224 -304 0 0.500000 0.500000 0 16777216 0 +( 680 -136 -536 ) ( 680 -136 -488 ) ( 680 -160 -488 ) subway/1_black -864 -304 0 0.500000 0.500000 0 16777216 0 +( 704 -144 -536 ) ( 704 -144 -488 ) ( 688 -144 -488 ) subway/1_black 224 -304 0 0.500000 0.500000 0 16777216 0 +( 688 -160 -536 ) ( 688 -160 -488 ) ( 688 -136 -488 ) subway/light_red -864 -304 0 0.500000 0.500000 0 16777217 20000 +} +// brush 3652 +{ +( 680 -760 -448 ) ( 680 -784 -448 ) ( 680 -784 -456 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 688 48 -520 ) ( 688 72 -520 ) ( 688 72 -528 ) subway/1_tunnelwall_floor 0 -48 0 0.500000 0.500000 0 285212672 0 +( 880 -776 -520 ) ( 880 -752 -520 ) ( 1000 -752 -520 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 992 -736 -536 ) ( 872 -736 -536 ) ( 872 -760 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 772 896 -536 ) ( 772 896 -520 ) ( 716 896 -536 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +( 704 -144 -488 ) ( 704 -144 -536 ) ( 688 -144 -488 ) subway/con6 0 -32 0 0.500000 0.500000 0 285212672 0 +} +// brush 3653 +{ +( 704 -744 -536 ) ( 704 -720 -536 ) ( 688 -720 -536 ) subway/1_black 224 -304 0 0.500000 0.500000 0 16777216 0 +( 688 -720 -520 ) ( 704 -720 -520 ) ( 704 -744 -520 ) subway/1_black 224 -304 0 0.500000 0.500000 0 16777216 0 +( 688 -744 -536 ) ( 688 -744 -488 ) ( 704 -744 -488 ) subway/1_black 224 -304 0 0.500000 0.500000 0 16777216 0 +( 680 -720 -536 ) ( 680 -720 -488 ) ( 680 -744 -488 ) subway/1_black 304 -304 0 0.500000 0.500000 0 16777216 0 +( 704 -728 -536 ) ( 704 -728 -488 ) ( 688 -728 -488 ) subway/1_black 224 -304 0 0.500000 0.500000 0 16777216 0 +( 688 -744 -536 ) ( 688 -744 -488 ) ( 688 -720 -488 ) subway/light_red 304 -304 0 0.500000 0.500000 0 16777217 20000 +} +// brush 3654 +{ +( 688 -560 -536 ) ( 688 -560 -488 ) ( 688 -536 -488 ) subway/light_red -64 -304 0 0.500000 0.500000 0 16777217 20000 +( 704 -544 -536 ) ( 704 -544 -488 ) ( 688 -544 -488 ) subway/1_black 240 -304 0 0.500000 0.500000 0 16777216 0 +( 672 -536 -536 ) ( 672 -536 -488 ) ( 672 -560 -488 ) subway/1_black -64 -304 0 0.500000 0.500000 0 16777216 0 +( 680 -560 -536 ) ( 680 -560 -488 ) ( 696 -560 -488 ) subway/1_black 240 -304 0 0.500000 0.500000 0 16777216 0 +( 680 -536 -520 ) ( 696 -536 -520 ) ( 696 -560 -520 ) subway/1_black 240 64 0 0.500000 0.500000 0 16777216 0 +( 696 -560 -536 ) ( 696 -536 -536 ) ( 680 -536 -536 ) subway/1_black 240 64 0 0.500000 0.500000 0 16777216 0 +} +// brush 3655 +{ +( 824 -568 -448 ) ( 816 -568 -448 ) ( 816 -616 -448 ) subway/1_tunnelwall_3 0 0 0 1 1 0 301989888 0 +( 816 -616 -384 ) ( 816 -568 -384 ) ( 824 -568 -384 ) subway/1_tunnelwall_3 0 0 0 1 1 0 301989888 0 +( 816 -640 -344 ) ( 824 -640 -344 ) ( 824 -640 -456 ) subway/1_tunnelwall_3 0 0 0 1 1 0 301989888 0 +( 848 -616 -336 ) ( 848 -568 -336 ) ( 848 -568 -448 ) subway/1_tunnelwall_3 0 0 0 1 1 0 301989888 0 +( 824 -568 -336 ) ( 816 -568 -336 ) ( 816 -568 -448 ) subway/1_tunnelwall_3 0 0 0 1 1 0 301989888 0 +( 824 -568 -336 ) ( 824 -616 -336 ) ( 824 -616 -448 ) subway/1_tunnelwall_3 8 0 0 -1 1 0 301989888 0 +} +// brush 3656 +{ +( -120 -640 -304 ) ( -136 -640 -304 ) ( -136 -656 -304 ) subway/light_yellow 16 0 0 0.500000 0.500000 0 16777217 6000 +( -136 -656 -296 ) ( -136 -640 -296 ) ( -120 -640 -296 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -136 -656 -304 ) ( -120 -656 -304 ) ( -120 -656 -312 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -120 -656 -304 ) ( -120 -640 -304 ) ( -120 -640 -312 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -120 -640 -304 ) ( -136 -640 -304 ) ( -136 -640 -312 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -136 -640 -304 ) ( -136 -656 -304 ) ( -136 -656 -312 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3657 +{ +( -120 -752 -304 ) ( -136 -752 -304 ) ( -136 -768 -304 ) subway/light_yellow 16 0 0 0.500000 0.500000 0 16777217 6000 +( -136 -768 -296 ) ( -136 -752 -296 ) ( -120 -752 -296 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -136 -768 -304 ) ( -120 -768 -304 ) ( -120 -768 -312 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -120 -768 -304 ) ( -120 -752 -304 ) ( -120 -752 -312 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -120 -752 -304 ) ( -136 -752 -304 ) ( -136 -752 -312 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -136 -752 -304 ) ( -136 -768 -304 ) ( -136 -768 -312 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3658 +{ +( -16 -752 -304 ) ( -16 -768 -304 ) ( -16 -768 -312 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 0 -752 -304 ) ( -16 -752 -304 ) ( -16 -752 -312 ) subway/1_black -224 0 0 0.500000 0.500000 0 16777216 0 +( 0 -768 -304 ) ( 0 -752 -304 ) ( 0 -752 -312 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( -16 -768 -304 ) ( 0 -768 -304 ) ( 0 -768 -312 ) subway/1_black -224 0 0 0.500000 0.500000 0 16777216 0 +( -16 -768 -296 ) ( -16 -752 -296 ) ( 0 -752 -296 ) subway/1_black -224 0 0 0.500000 0.500000 0 16777216 0 +( 0 -752 -304 ) ( -16 -752 -304 ) ( -16 -768 -304 ) subway/light_yellow 0 0 0 0.500000 0.500000 0 16777217 6000 +} +// brush 3659 +{ +( -72 -416 -304 ) ( -72 -432 -304 ) ( -72 -432 -312 ) subway/1_black -672 0 0 0.500000 0.500000 0 16777216 0 +( -56 -416 -304 ) ( -72 -416 -304 ) ( -72 -416 -312 ) subway/1_black -112 0 0 0.500000 0.500000 0 16777216 0 +( -56 -432 -304 ) ( -56 -416 -304 ) ( -56 -416 -312 ) subway/1_black -672 0 0 0.500000 0.500000 0 16777216 0 +( -72 -432 -304 ) ( -56 -432 -304 ) ( -56 -432 -312 ) subway/1_black -112 0 0 0.500000 0.500000 0 16777216 0 +( -72 -432 -296 ) ( -72 -416 -296 ) ( -56 -416 -296 ) subway/1_black -112 672 0 0.500000 0.500000 0 16777216 0 +( -56 -416 -304 ) ( -72 -416 -304 ) ( -72 -432 -304 ) subway/light_yellow -112 672 0 0.500000 0.500000 0 16777217 6000 +} +// brush 3660 +{ +( 0 -640 -304 ) ( -16 -640 -304 ) ( -16 -656 -304 ) subway/light_yellow 0 0 0 0.500000 0.500000 0 16777217 6000 +( -16 -656 -296 ) ( -16 -640 -296 ) ( 0 -640 -296 ) subway/1_black -224 224 0 0.500000 0.500000 0 16777216 0 +( -16 -656 -304 ) ( 0 -656 -304 ) ( 0 -656 -312 ) subway/1_black -224 0 0 0.500000 0.500000 0 16777216 0 +( 0 -656 -304 ) ( 0 -640 -304 ) ( 0 -640 -312 ) subway/1_black -224 0 0 0.500000 0.500000 0 16777216 0 +( 0 -640 -304 ) ( -16 -640 -304 ) ( -16 -640 -312 ) subway/1_black -224 0 0 0.500000 0.500000 0 16777216 0 +( -16 -640 -304 ) ( -16 -656 -304 ) ( -16 -656 -312 ) subway/1_black -224 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3661 +{ +( -16 -408 -320 ) ( -16 -408 -296 ) ( 136 -408 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 48 -208 -376 ) ( 48 -232 -376 ) ( -104 -232 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 288 -408 -384 ) ( 288 -216 -384 ) ( -128 -216 -384 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 40 -296 -360 ) ( 40 -296 -368 ) ( 40 -328 -360 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -256 -272 -368 ) ( -256 -272 -360 ) ( -256 -304 -360 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -152 -216 -368 ) ( -152 -216 -376 ) ( -80 -216 -368 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3662 +{ +( 24 -296 -388 ) ( 24 -328 -388 ) ( 96 -328 -388 ) subway/light_tube 48 0 0 0.500000 0.500000 134217728 16777217 5200 +( 96 -328 -384 ) ( 24 -328 -384 ) ( 24 -296 -384 ) subway/light_tube -80 16 0 0.500000 0.500000 134217728 16777217 30000 +( 92 -304 -384 ) ( 92 -304 -376 ) ( 20 -304 -376 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( 84 -320 -384 ) ( 84 -320 -376 ) ( 84 -288 -376 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( 24 -320 -384 ) ( 24 -320 -376 ) ( 96 -320 -376 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( 40 -296 -376 ) ( 40 -296 -368 ) ( 40 -328 -368 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3663 +{ +( -16 -408 -320 ) ( -16 -408 -296 ) ( 136 -408 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 48 -208 -376 ) ( 48 -232 -376 ) ( -104 -232 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 288 -408 -384 ) ( 288 -216 -384 ) ( -128 -216 -384 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 128 -640 -384 ) ( 128 -712 -376 ) ( 128 -640 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 40 -296 -368 ) ( 40 -296 -360 ) ( 40 -328 -360 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 32 -216 -360 ) ( 32 -216 -368 ) ( 104 -216 -360 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3664 +{ +( 240 -488 -388 ) ( 272 -488 -388 ) ( 272 -416 -388 ) subway/light_tube 48 16 90 0.500000 0.500000 134217728 16777217 5200 +( 272 -416 -384 ) ( 272 -488 -384 ) ( 240 -488 -384 ) subway/light_tube -80 16 0 0.500000 0.500000 134217728 16777217 30000 +( 248 -416 -376 ) ( 248 -416 -368 ) ( 248 -488 -368 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( 272 -428 -376 ) ( 272 -428 -368 ) ( 240 -428 -368 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( 264 -476 -376 ) ( 264 -476 -368 ) ( 264 -404 -368 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( 240 -472 -376 ) ( 240 -472 -368 ) ( 272 -472 -368 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3665 +{ +( 544 -280 -432 ) ( 544 -280 -384 ) ( 584 -280 -384 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 544 -272 -384 ) ( 544 -272 -432 ) ( 544 -248 -432 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 584 -248 -384 ) ( 536 -248 -384 ) ( 536 -248 -432 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 576 -264 -376 ) ( 576 -232 -376 ) ( 576 -232 -416 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 376 -264 -352 ) ( 336 -264 -352 ) ( 336 -232 -352 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 328 -240 -384 ) ( 328 -272 -384 ) ( 368 -272 -384 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +} +// brush 3666 +{ +( 328 -240 -448 ) ( 328 -272 -448 ) ( 368 -272 -448 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 376 -264 -432 ) ( 336 -264 -432 ) ( 336 -232 -432 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 576 -264 -424 ) ( 576 -232 -424 ) ( 576 -232 -464 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 584 -248 -432 ) ( 536 -248 -432 ) ( 536 -248 -480 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 544 -272 -440 ) ( 544 -272 -488 ) ( 544 -248 -488 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +( 544 -280 -488 ) ( 544 -280 -440 ) ( 584 -280 -440 ) subway/1_tile_middle 0 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3667 +{ +( 544 -280 -464 ) ( 544 -280 -416 ) ( 584 -280 -416 ) subway/1_tile_damage2 32 -24 0 0.500000 0.500000 0 352321536 0 +( 544 -272 -416 ) ( 544 -272 -464 ) ( 544 -248 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 584 -248 -416 ) ( 536 -248 -416 ) ( 536 -248 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -264 -408 ) ( 576 -232 -408 ) ( 576 -232 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -264 -448 ) ( 336 -264 -448 ) ( 336 -232 -448 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 328 -240 -464 ) ( 328 -272 -464 ) ( 368 -272 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3668 +{ +( 328 -368 -384 ) ( 328 -400 -384 ) ( 368 -400 -384 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 376 -392 -352 ) ( 336 -392 -352 ) ( 336 -360 -352 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 576 -392 -376 ) ( 576 -360 -376 ) ( 576 -360 -416 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 584 -376 -384 ) ( 536 -376 -384 ) ( 536 -376 -432 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 544 -400 -384 ) ( 544 -400 -432 ) ( 544 -376 -432 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 544 -408 -432 ) ( 544 -408 -384 ) ( 584 -408 -384 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +} +// brush 3669 +{ +( 544 -408 -448 ) ( 544 -408 -400 ) ( 584 -408 -400 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 544 -400 -400 ) ( 544 -400 -448 ) ( 544 -376 -448 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -376 -400 ) ( 536 -376 -400 ) ( 536 -376 -448 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 576 -392 -392 ) ( 576 -360 -392 ) ( 576 -360 -432 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 376 -392 -384 ) ( 336 -392 -384 ) ( 336 -360 -384 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 328 -368 -392 ) ( 328 -400 -392 ) ( 368 -400 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3670 +{ +( 328 -368 -432 ) ( 328 -400 -432 ) ( 368 -400 -432 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 376 -392 -424 ) ( 336 -392 -424 ) ( 336 -360 -424 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 576 -392 -432 ) ( 576 -360 -432 ) ( 576 -360 -472 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 584 -376 -440 ) ( 536 -376 -440 ) ( 536 -376 -488 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 544 -400 -440 ) ( 544 -400 -488 ) ( 544 -376 -488 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 544 -408 -488 ) ( 544 -408 -440 ) ( 584 -408 -440 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3671 +{ +( 328 -496 -384 ) ( 328 -528 -384 ) ( 368 -528 -384 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 376 -520 -352 ) ( 336 -520 -352 ) ( 336 -488 -352 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 576 -520 -376 ) ( 576 -488 -376 ) ( 576 -488 -416 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 584 -504 -384 ) ( 536 -504 -384 ) ( 536 -504 -432 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 544 -528 -384 ) ( 544 -528 -432 ) ( 544 -504 -432 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 544 -536 -432 ) ( 544 -536 -384 ) ( 584 -536 -384 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +} +// brush 3672 +{ +( 544 -536 -448 ) ( 544 -536 -400 ) ( 584 -536 -400 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 544 -528 -400 ) ( 544 -528 -448 ) ( 544 -504 -448 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -504 -400 ) ( 536 -504 -400 ) ( 536 -504 -448 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 576 -520 -392 ) ( 576 -488 -392 ) ( 576 -488 -432 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 376 -520 -384 ) ( 336 -520 -384 ) ( 336 -488 -384 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 328 -496 -392 ) ( 328 -528 -392 ) ( 368 -528 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3673 +{ +( 328 -496 -464 ) ( 328 -528 -464 ) ( 368 -528 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -520 -448 ) ( 336 -520 -448 ) ( 336 -488 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -520 -464 ) ( 576 -488 -464 ) ( 576 -488 -504 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 584 -504 -472 ) ( 536 -504 -472 ) ( 536 -504 -520 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 544 -528 -416 ) ( 544 -528 -464 ) ( 544 -504 -464 ) subway/1_tile_graf2 80 16 0 -0.500000 0.500000 0 352321536 0 +( 544 -536 -520 ) ( 544 -536 -472 ) ( 584 -536 -472 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3674 +{ +( 328 -624 -384 ) ( 328 -656 -384 ) ( 368 -656 -384 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 376 -648 -352 ) ( 336 -648 -352 ) ( 336 -616 -352 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 576 -648 -376 ) ( 576 -616 -376 ) ( 576 -616 -416 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 584 -632 -384 ) ( 536 -632 -384 ) ( 536 -632 -432 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 544 -656 -384 ) ( 544 -656 -432 ) ( 544 -632 -432 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 544 -664 -432 ) ( 544 -664 -384 ) ( 584 -664 -384 ) subway/metal1 0 -16 90 0.500000 0.500000 0 16777216 0 +} +// brush 3675 +{ +( 328 -624 -392 ) ( 328 -656 -392 ) ( 368 -656 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 376 -648 -384 ) ( 336 -648 -384 ) ( 336 -616 -384 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 576 -648 -392 ) ( 576 -616 -392 ) ( 576 -616 -432 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -632 -400 ) ( 536 -632 -400 ) ( 536 -632 -448 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 544 -656 -400 ) ( 544 -656 -448 ) ( 544 -632 -448 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 544 -664 -448 ) ( 544 -664 -400 ) ( 584 -664 -400 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3676 +{ +( 328 -616 -464 ) ( 328 -648 -464 ) ( 368 -648 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 376 -648 -456 ) ( 336 -648 -456 ) ( 336 -616 -456 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 576 -648 -464 ) ( 576 -616 -464 ) ( 576 -616 -504 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 584 -632 -472 ) ( 536 -632 -472 ) ( 536 -632 -520 ) subway/1_tile_damage1 0 -8 0 0.500000 0.500000 0 352321536 0 +( 544 -656 -432 ) ( 544 -656 -480 ) ( 544 -632 -480 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 544 -664 -520 ) ( 544 -664 -472 ) ( 584 -664 -472 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3677 +{ +( 704 -824 -264 ) ( 648 -824 -264 ) ( 648 -824 -254 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 680 -456 -344 ) ( 680 -480 -344 ) ( 680 -480 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1032 -144 -384 ) ( 912 -144 -384 ) ( 912 -144 -392 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 688 -216 -440 ) ( 688 -192 -440 ) ( 688 -192 -448 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 824 -760 -464 ) ( 944 -760 -464 ) ( 944 -760 -472 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 888 -80 -352 ) ( 888 -56 -352 ) ( 1008 -56 -352 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1000 -32 -368 ) ( 880 -32 -368 ) ( 880 -56 -368 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3678 +{ +( 672 -760 -384 ) ( 688 -760 -384 ) ( 688 -760 -488 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 672 -760 -400 ) ( 672 -760 -472 ) ( 672 -744 -472 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 408 -744 -392 ) ( 408 -744 -464 ) ( 728 -744 -464 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( 688 -768 -416 ) ( 688 -736 -416 ) ( 688 -736 -456 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( 688 -760 -384 ) ( 672 -760 -384 ) ( 672 -744 -384 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 448 -744 -488 ) ( 448 -776 -488 ) ( 488 -776 -488 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3679 +{ +( 488 -128 -488 ) ( 448 -128 -488 ) ( 448 -160 -488 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 672 -144 -384 ) ( 688 -144 -384 ) ( 688 -160 -384 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 688 -168 -456 ) ( 688 -168 -416 ) ( 688 -136 -416 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( 728 -160 -464 ) ( 408 -160 -464 ) ( 408 -160 -392 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( 672 -160 -472 ) ( 672 -144 -472 ) ( 672 -144 -400 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 688 -144 -384 ) ( 672 -144 -384 ) ( 672 -144 -488 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3680 +{ +( 320 -760 -472 ) ( 320 -760 -464 ) ( 384 -760 -464 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 0 285212672 0 +( 672 -1496 -488 ) ( 672 -1496 -480 ) ( 672 -1432 -480 ) subway/1_stair_side1 840 -368 0 0.500000 0.500000 0 285212672 0 +( 496 -144 -488 ) ( 496 -144 -480 ) ( 432 -144 -480 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 0 285212672 0 +( 384 -936 -504 ) ( 384 -936 -496 ) ( 384 -1000 -496 ) subway/1_stair_side1 328 -368 0 0.500000 0.500000 0 285212672 0 +( 376 -1088 -480 ) ( 376 -1152 -480 ) ( 312 -1152 -480 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 312 -1168 -488 ) ( 376 -1168 -488 ) ( 376 -1104 -488 ) subway/1_lobby_floor 448 -880 0 0.500000 0.500000 0 285212672 0 +} +// brush 3681 +{ +( -344 -728 -400 ) ( -344 -760 -400 ) ( -304 -760 -400 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -288 -760 -320 ) ( -328 -760 -320 ) ( -328 -728 -320 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -136 -860 -296 ) ( -136 -828 -296 ) ( -136 -828 -336 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -208 -472 -280 ) ( -248 -472 -280 ) ( -248 -472 -320 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -144 -592 -280 ) ( -144 -624 -280 ) ( -144 -624 -320 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -380 -488 -280 ) ( -340 -488 -280 ) ( -340 -488 -320 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3682 +{ +( -372 -488 -360 ) ( -332 -488 -360 ) ( -332 -488 -400 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -136 -472 -392 ) ( -136 -488 -392 ) ( -136 -488 -480 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -200 -472 -360 ) ( -240 -472 -360 ) ( -240 -472 -400 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -128 -860 -376 ) ( -128 -828 -376 ) ( -128 -828 -416 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -136 -488 -392 ) ( -136 -472 -392 ) ( -128 -472 -400 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( -336 -728 -480 ) ( -336 -760 -480 ) ( -296 -760 -480 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3683 +{ +( 168 -760 -480 ) ( 208 -760 -480 ) ( 208 -728 -480 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( 0 -472 -400 ) ( 8 -472 -392 ) ( 8 -488 -392 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 0 -828 -416 ) ( 0 -828 -376 ) ( 0 -860 -376 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( 112 -472 -400 ) ( 112 -472 -360 ) ( 72 -472 -360 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( 8 -488 -480 ) ( 8 -488 -392 ) ( 8 -472 -392 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( 204 -488 -400 ) ( 204 -488 -360 ) ( 244 -488 -360 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3684 +{ +( -228 -488 -280 ) ( -188 -488 -280 ) ( -188 -488 -320 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( 8 -592 -280 ) ( 8 -624 -280 ) ( 8 -624 -320 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -56 -472 -280 ) ( -96 -472 -280 ) ( -96 -472 -320 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( 16 -860 -296 ) ( 16 -828 -296 ) ( 16 -828 -336 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -136 -760 -320 ) ( -176 -760 -320 ) ( -176 -728 -320 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -192 -728 -400 ) ( -192 -760 -400 ) ( -152 -760 -400 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3685 +{ +( -364 -824 -360 ) ( -324 -824 -360 ) ( -324 -824 -400 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( -136 -640 -360 ) ( -136 -672 -360 ) ( -136 -672 -400 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( -200 -488 -360 ) ( -240 -488 -360 ) ( -240 -488 -400 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( -128 -876 -360 ) ( -128 -844 -360 ) ( -128 -844 -400 ) subway/con11 0 -16 0 1 1 0 285212672 0 +( -288 -792 -400 ) ( -328 -792 -400 ) ( -328 -760 -400 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( -336 -760 -480 ) ( -336 -792 -480 ) ( -296 -792 -480 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3686 +{ +( -356 -600 -288 ) ( -316 -600 -288 ) ( -316 -600 -328 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -136 -744 -312 ) ( -136 -776 -312 ) ( -136 -776 -352 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -144 -568 -296 ) ( -184 -568 -296 ) ( -184 -568 -336 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -104 -600 -304 ) ( -104 -568 -304 ) ( -120 -568 -320 ) subway/1_tile_middle 16 -16 90 0.500000 0.500000 0 318767104 0 +( -104 -568 -304 ) ( -104 -600 -304 ) ( -136 -600 -304 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -336 -736 -320 ) ( -336 -768 -320 ) ( -296 -768 -320 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 3687 +{ +( -336 -736 -336 ) ( -336 -768 -336 ) ( -296 -768 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -120 -568 -320 ) ( -120 -600 -320 ) ( -136 -600 -320 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -120 -600 -320 ) ( -120 -568 -320 ) ( -128 -568 -336 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -144 -568 -296 ) ( -184 -568 -296 ) ( -184 -568 -336 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -744 -312 ) ( -136 -776 -312 ) ( -136 -776 -352 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -356 -600 -288 ) ( -316 -600 -288 ) ( -316 -600 -328 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3688 +{ +( 16 -840 -384 ) ( 16 -912 -376 ) ( 16 -840 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -8 -408 -384 ) ( 64 -408 -376 ) ( -8 -408 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -24 -520 -384 ) ( -24 -520 -376 ) ( -24 -552 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 288 -600 -384 ) ( 288 -408 -384 ) ( -128 -408 -384 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 48 -400 -296 ) ( 48 -424 -296 ) ( -104 -424 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -8 -472 -320 ) ( -8 -472 -296 ) ( 144 -472 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3689 +{ +( -48 -408 -320 ) ( -48 -408 -296 ) ( 104 -408 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 8 -392 -296 ) ( 8 -416 -296 ) ( -144 -416 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 248 -592 -376 ) ( 248 -400 -376 ) ( -168 -400 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -104 -512 -384 ) ( -104 -512 -376 ) ( -104 -544 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -48 -400 -384 ) ( 24 -400 -376 ) ( -48 -400 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -24 -832 -384 ) ( -24 -904 -376 ) ( -24 -832 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3690 +{ +( -104 -832 -384 ) ( -104 -904 -376 ) ( -104 -832 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -144 -472 -384 ) ( -104 -472 -384 ) ( -104 -472 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -144 -496 -384 ) ( -144 -496 -376 ) ( -144 -528 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -104 -472 -384 ) ( -144 -472 -384 ) ( -144 -568 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 48 -400 -296 ) ( 48 -424 -296 ) ( -104 -424 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -104 -568 -304 ) ( -144 -568 -304 ) ( -144 -568 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3691 +{ +( -104 -840 -384 ) ( -104 -912 -376 ) ( -104 -840 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -128 -408 -384 ) ( -56 -408 -376 ) ( -128 -408 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -144 -520 -384 ) ( -144 -520 -376 ) ( -144 -552 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 168 -600 -384 ) ( 168 -408 -384 ) ( -248 -408 -384 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -72 -400 -296 ) ( -72 -424 -296 ) ( -224 -424 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -128 -472 -320 ) ( -128 -472 -296 ) ( 24 -472 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3692 +{ +( -192 -96 -488 ) ( -192 -32 -488 ) ( -256 -32 -488 ) subway/1_lobby_floor 448 -880 0 0.500000 0.500000 0 285212672 0 +( -256 -48 -480 ) ( -192 -48 -480 ) ( -192 -112 -480 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( -224 -200 -488 ) ( -224 -264 -488 ) ( -224 -264 -496 ) subway/1_stair_side1 328 -368 0 0.500000 0.500000 0 285212672 0 +( -120 -448 -480 ) ( -56 -448 -480 ) ( -56 -448 -488 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 0 285212672 0 +( 128 224 -480 ) ( 128 288 -480 ) ( 128 288 -488 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( -184 -216 -480 ) ( -248 -216 -480 ) ( -248 -216 -488 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 0 285212672 0 +} +// brush 3693 +{ +( -304 -408 -480 ) ( -344 -408 -480 ) ( -344 -440 -480 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -336 -440 -464 ) ( -336 -408 -464 ) ( -296 -408 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 8 -408 -464 ) ( 8 -408 -480 ) ( 8 -440 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -256 -472 -464 ) ( -256 -472 -424 ) ( -216 -472 -424 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 0 -440 -464 ) ( 0 -440 -424 ) ( 0 -472 -424 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 128 -408 -480 ) ( 128 -408 -464 ) ( -192 -408 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3694 +{ +( 128 -408 -448 ) ( 128 -408 -432 ) ( -192 -408 -432 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( 0 -440 -432 ) ( 0 -440 -392 ) ( 0 -472 -392 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( -256 -472 -432 ) ( -256 -472 -392 ) ( -216 -472 -392 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( 8 -408 -432 ) ( 8 -408 -448 ) ( 8 -440 -448 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( -328 -440 -384 ) ( -328 -408 -384 ) ( -288 -408 -384 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( -312 -408 -400 ) ( -352 -408 -400 ) ( -352 -440 -400 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3695 +{ +( -304 -408 -464 ) ( -344 -408 -464 ) ( -344 -440 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -328 -440 -400 ) ( -328 -408 -400 ) ( -288 -408 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -408 -448 ) ( 8 -408 -464 ) ( 8 -440 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -472 -448 ) ( -256 -472 -408 ) ( -216 -472 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 0 -440 -448 ) ( 0 -440 -408 ) ( 0 -472 -408 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 128 -408 -464 ) ( 128 -408 -448 ) ( -192 -408 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3696 +{ +( -8 -408 -480 ) ( -8 -408 -464 ) ( -328 -408 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( -136 -440 -464 ) ( -136 -440 -424 ) ( -136 -472 -424 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -392 -472 -464 ) ( -392 -472 -424 ) ( -352 -472 -424 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( -128 -408 -464 ) ( -128 -408 -480 ) ( -128 -440 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -472 -440 -464 ) ( -472 -408 -464 ) ( -432 -408 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -440 -408 -480 ) ( -480 -408 -480 ) ( -480 -440 -480 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3697 +{ +( 128 -376 -480 ) ( 128 -376 -464 ) ( -192 -376 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 0 -376 -464 ) ( 0 -376 -424 ) ( 0 -408 -424 ) subway/1_tile_bottom 80 0 0 -0.500000 0.500000 0 318767104 0 +( -256 -408 -464 ) ( -256 -408 -424 ) ( -216 -408 -424 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 128 -376 -464 ) ( 128 -376 -480 ) ( 128 -408 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -336 -408 -464 ) ( -336 -376 -464 ) ( -296 -376 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -304 -376 -480 ) ( -344 -376 -480 ) ( -344 -408 -480 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3698 +{ +( 96 -472 -80 ) ( 152 -416 -80 ) ( 152 -416 -70 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 160 -376 -464 ) ( 136 -376 -464 ) ( 168 -440 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 136 -376 -416 ) ( 160 -376 -416 ) ( 192 -440 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 168 -376 -408 ) ( 136 -376 -408 ) ( 136 -376 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 136 -376 -464 ) ( 136 -376 -416 ) ( 168 -440 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 168 -440 -408 ) ( 200 -440 -408 ) ( 200 -440 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 160 -376 -416 ) ( 160 -376 -464 ) ( 192 -440 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3699 +{ +( -8 -816 -456 ) ( -8 -816 -448 ) ( -8 -752 -448 ) subway/1_lobby_floor 112 -432 0 0.500000 0.500000 0 285212672 0 +( 832 -544 -456 ) ( 832 -544 -448 ) ( 768 -544 -448 ) subway/1_stair_side1 712 -448 0 0.500000 0.500000 0 285212672 0 +( -128 -624 -456 ) ( -128 -624 -448 ) ( -128 -688 -448 ) subway/1_lobby_floor 112 -432 0 0.500000 0.500000 0 285212672 0 +( 72 -568 -464 ) ( 72 -568 -456 ) ( 136 -568 -456 ) subway/1_stair_side1 200 -448 0 0.500000 0.500000 0 285212672 0 +( 520 -736 -448 ) ( 584 -736 -448 ) ( 584 -800 -448 ) subway/1_stair_top1 -128 528 0 0.500000 0.500000 0 285212672 0 +( 600 -800 -456 ) ( 600 -736 -456 ) ( 536 -736 -456 ) subway/1_lobby_floor 320 -368 0 0.500000 0.500000 0 285212672 0 +} +// brush 3700 +{ +( -8 -792 -464 ) ( -8 -792 -456 ) ( -8 -728 -456 ) subway/1_lobby_floor 64 -448 0 0.500000 0.500000 0 285212672 0 +( 832 -520 -464 ) ( 832 -520 -456 ) ( 768 -520 -456 ) subway/1_stair_side1 712 -464 0 0.500000 0.500000 0 285212672 0 +( -128 -600 -464 ) ( -128 -600 -456 ) ( -128 -664 -456 ) subway/1_lobby_floor 64 -448 0 0.500000 0.500000 0 285212672 0 +( -40 -544 -472 ) ( -40 -544 -464 ) ( 24 -544 -464 ) subway/1_stair_side1 200 -464 0 0.500000 0.500000 0 285212672 0 +( 520 -712 -456 ) ( 584 -712 -456 ) ( 584 -776 -456 ) subway/1_stair_top1 -128 576 0 0.500000 0.500000 0 285212672 0 +( 600 -776 -464 ) ( 600 -712 -464 ) ( 536 -712 -464 ) subway/1_lobby_floor 320 -320 0 0.500000 0.500000 0 285212672 0 +} +// brush 3701 +{ +( -8 -768 -472 ) ( -8 -768 -464 ) ( -8 -704 -464 ) subway/1_lobby_floor 16 -464 0 0.500000 0.500000 0 285212672 0 +( 832 -496 -472 ) ( 832 -496 -464 ) ( 768 -496 -464 ) subway/1_stair_side1 712 -480 0 0.500000 0.500000 0 285212672 0 +( -128 -576 -472 ) ( -128 -576 -464 ) ( -128 -640 -464 ) subway/1_lobby_floor 16 -464 0 0.500000 0.500000 0 285212672 0 +( -40 -520 -480 ) ( -40 -520 -472 ) ( 24 -520 -472 ) subway/1_stair_side1 200 -480 0 0.500000 0.500000 0 285212672 0 +( 520 -688 -464 ) ( 584 -688 -464 ) ( 584 -752 -464 ) subway/1_stair_top1 -128 624 0 0.500000 0.500000 0 285212672 0 +( 600 -752 -472 ) ( 600 -688 -472 ) ( 536 -688 -472 ) subway/1_lobby_floor 320 -272 0 0.500000 0.500000 0 285212672 0 +} +// brush 3702 +{ +( 600 -728 -480 ) ( 600 -664 -480 ) ( 536 -664 -480 ) subway/1_lobby_floor 320 -224 0 0.500000 0.500000 0 285212672 0 +( 520 -664 -472 ) ( 584 -664 -472 ) ( 584 -728 -472 ) subway/1_stair_top1 -128 672 0 0.500000 0.500000 0 285212672 0 +( -40 -496 -488 ) ( -40 -496 -480 ) ( 24 -496 -480 ) subway/1_stair_side1 200 -496 0 0.500000 0.500000 0 285212672 0 +( -128 -552 -480 ) ( -128 -552 -472 ) ( -128 -616 -472 ) subway/1_lobby_floor -32 -480 0 0.500000 0.500000 0 285212672 0 +( 944 -472 -480 ) ( 944 -472 -472 ) ( 880 -472 -472 ) subway/1_stair_side1 712 -496 0 0.500000 0.500000 0 285212672 0 +( -8 -744 -480 ) ( -8 -744 -472 ) ( -8 -680 -472 ) subway/1_lobby_floor -32 -480 0 0.500000 0.500000 0 285212672 0 +} +// brush 3703 +{ +( -120 -744 -480 ) ( -120 -744 -472 ) ( -120 -680 -472 ) subway/metal_rust -512 -80 0 0.500000 0.500000 0 16777216 0 +( 880 -472 -480 ) ( 880 -472 -472 ) ( 816 -472 -472 ) subway/metal_rust 0 -80 0 0.500000 0.500000 0 16777216 0 +( -128 -552 -480 ) ( -128 -552 -472 ) ( -128 -616 -472 ) subway/metal_rust -512 -80 0 0.500000 0.500000 0 16777216 0 +( -128 -568 -440 ) ( -120 -568 -440 ) ( -120 -568 -480 ) subway/metal_rust 0 -80 0 0.500000 0.500000 0 16777216 0 +( -120 -568 -440 ) ( -128 -568 -440 ) ( -128 -472 -472 ) subway/metal_rust 0 512 0 0.500000 0.500000 0 16777216 0 +( 536 -728 -480 ) ( 536 -664 -480 ) ( 472 -664 -480 ) subway/metal_rust 0 512 0 0.500000 0.500000 0 16777216 0 +} +// brush 3704 +{ +( 656 -728 -480 ) ( 656 -664 -480 ) ( 592 -664 -480 ) subway/metal_rust 0 512 0 0.500000 0.500000 0 16777216 0 +( 0 -568 -440 ) ( -8 -568 -440 ) ( -8 -472 -472 ) subway/metal_rust 0 512 0 0.500000 0.500000 0 16777216 0 +( -8 -568 -440 ) ( 0 -568 -440 ) ( 0 -568 -480 ) subway/metal_rust 0 -80 0 0.500000 0.500000 0 16777216 0 +( -8 -552 -480 ) ( -8 -552 -472 ) ( -8 -616 -472 ) subway/metal_rust -512 -80 0 0.500000 0.500000 0 16777216 0 +( 1000 -472 -480 ) ( 1000 -472 -472 ) ( 936 -472 -472 ) subway/metal_rust 0 -80 0 0.500000 0.500000 0 16777216 0 +( 0 -744 -480 ) ( 0 -744 -472 ) ( 0 -680 -472 ) subway/metal_rust -512 -80 0 0.500000 0.500000 0 16777216 0 +} +// brush 3705 +{ +( -216 -296 -400 ) ( -216 -256 -400 ) ( -224 -256 -416 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( -248 -224 -400 ) ( -248 -224 -416 ) ( -216 -256 -416 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( -256 -184 -416 ) ( -256 -184 -400 ) ( -256 -408 -400 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( -256 -408 -416 ) ( -256 -408 -400 ) ( -216 -368 -400 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( -256 -96 -400 ) ( -256 -56 -400 ) ( -216 -56 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -224 -48 -416 ) ( -224 -8 -416 ) ( -256 -8 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3706 +{ +( -64 -376 -480 ) ( -64 -376 -464 ) ( -384 -376 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( -256 -408 -464 ) ( -256 -408 -480 ) ( -224 -376 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -256 -408 -480 ) ( -256 -408 -464 ) ( -136 -408 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( -128 -376 -464 ) ( -128 -376 -480 ) ( -128 -408 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -528 -408 -464 ) ( -528 -376 -464 ) ( -488 -376 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -496 -376 -480 ) ( -536 -376 -480 ) ( -536 -408 -480 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3707 +{ +( -64 -376 -464 ) ( -64 -376 -416 ) ( -384 -376 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -408 -416 ) ( -256 -408 -464 ) ( -224 -376 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -256 -408 -464 ) ( -256 -408 -416 ) ( -136 -408 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -376 -416 ) ( -136 -376 -464 ) ( -136 -408 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -528 -416 -416 ) ( -528 -384 -416 ) ( -488 -384 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -496 -376 -464 ) ( -536 -376 -464 ) ( -536 -408 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3708 +{ +( -496 -376 -416 ) ( -536 -376 -416 ) ( -536 -408 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -448 -408 -400 ) ( -488 -408 -400 ) ( -488 -368 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -128 -408 -416 ) ( -128 -408 -400 ) ( -128 -368 -400 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( -256 -408 -416 ) ( -256 -408 -400 ) ( -136 -408 -400 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( -256 -408 -400 ) ( -256 -408 -416 ) ( -224 -376 -416 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( -248 -368 -400 ) ( -288 -368 -400 ) ( -288 -376 -416 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 3709 +{ +( -424 -352 -384 ) ( -464 -352 -384 ) ( -464 -368 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -256 -408 -384 ) ( -256 -408 -400 ) ( -216 -368 -400 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( -256 -408 -400 ) ( -256 -408 -384 ) ( -136 -408 -384 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( -128 -408 -400 ) ( -128 -408 -384 ) ( -128 -352 -384 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -448 -408 -384 ) ( -488 -408 -384 ) ( -488 -352 -384 ) subway/1_tile 576 -144 0 0.500000 0.500000 0 318767104 0 +( -496 -384 -400 ) ( -536 -384 -400 ) ( -536 -416 -400 ) subway/1_tile_middle 576 80 0 0.500000 0.500000 0 318767104 0 +} +// brush 3710 +{ +( -224 -48 -480 ) ( -224 -8 -480 ) ( -256 -8 -480 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -256 -16 -464 ) ( -224 -16 -464 ) ( -224 -56 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -224 -376 -464 ) ( -224 -376 -480 ) ( -256 -408 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -256 -96 -464 ) ( -256 -96 -424 ) ( -256 -136 -424 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( -224 -248 -480 ) ( -224 -248 -464 ) ( -256 -216 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -224 -248 -464 ) ( -224 -248 -480 ) ( -224 -376 -480 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3711 +{ +( -232 -48 -400 ) ( -232 -8 -400 ) ( -264 -8 -400 ) subway/1_tile_middle 576 80 0 0.500000 0.500000 0 318767104 0 +( -256 -96 -384 ) ( -256 -56 -384 ) ( -200 -56 -384 ) subway/1_tile 576 -144 0 0.500000 0.500000 0 318767104 0 +( -256 -408 -400 ) ( -256 -408 -384 ) ( -200 -408 -384 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -400 ) ( -256 -216 -384 ) ( -256 -408 -384 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -384 ) ( -256 -216 -400 ) ( -216 -256 -400 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( -200 -120 -384 ) ( -200 -80 -384 ) ( -216 -80 -400 ) subway/1_tile_middle 48 -46 90 0.500000 -0.500000 0 318767104 0 +} +// brush 3712 +{ +( -448 -408 -400 ) ( -488 -408 -400 ) ( -488 -440 -400 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( -464 -440 -384 ) ( -464 -408 -384 ) ( -424 -408 -384 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( -128 -408 -432 ) ( -128 -408 -448 ) ( -128 -440 -448 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( -392 -472 -432 ) ( -392 -472 -392 ) ( -352 -472 -392 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( -136 -440 -432 ) ( -136 -440 -392 ) ( -136 -472 -392 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( -8 -408 -448 ) ( -8 -408 -432 ) ( -328 -408 -432 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3713 +{ +( -56 -368 -400 ) ( -96 -368 -400 ) ( -96 -376 -416 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 0 -376 -416 ) ( 0 -368 -400 ) ( 0 -408 -400 ) subway/1_tile 80 0 0 -0.500000 0.500000 0 318767104 0 +( 88 -408 -400 ) ( 88 -408 -416 ) ( -192 -408 -416 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -408 -416 ) ( 128 -408 -400 ) ( 128 -368 -400 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( -256 -408 -400 ) ( -296 -408 -400 ) ( -296 -368 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -304 -376 -416 ) ( -344 -376 -416 ) ( -344 -408 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3714 +{ +( -304 -384 -400 ) ( -344 -384 -400 ) ( -344 -416 -400 ) subway/1_tile_middle 576 80 0 0.500000 0.500000 0 318767104 0 +( -256 -408 -384 ) ( -296 -408 -384 ) ( -296 -352 -384 ) subway/1_tile 576 -144 0 0.500000 0.500000 0 318767104 0 +( 128 -408 -400 ) ( 128 -408 -384 ) ( 128 -352 -384 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 72 -408 -384 ) ( 72 -408 -400 ) ( -192 -408 -400 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( 0 -368 -400 ) ( 0 -352 -384 ) ( 0 -408 -384 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( -232 -352 -384 ) ( -272 -352 -384 ) ( -272 -368 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3715 +{ +( 192 -320 -512 ) ( 192 -280 -512 ) ( 160 -280 -512 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 160 -296 -464 ) ( 192 -296 -464 ) ( 192 -336 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 160 -760 -464 ) ( 192 -728 -464 ) ( 192 -728 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 160 -376 -496 ) ( 160 -376 -456 ) ( 160 -416 -456 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 192 -440 -496 ) ( 192 -440 -456 ) ( 160 -440 -456 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 192 -448 -480 ) ( 192 -736 -480 ) ( 192 -736 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3716 +{ +( 200 -576 -400 ) ( 200 -536 -400 ) ( 192 -536 -416 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 192 -440 -416 ) ( 200 -440 -400 ) ( 160 -440 -400 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 160 -440 -400 ) ( 160 -760 -400 ) ( 160 -760 -416 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 192 -728 -416 ) ( 160 -760 -416 ) ( 160 -760 -400 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 160 -376 -400 ) ( 160 -336 -400 ) ( 200 -336 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 192 -328 -416 ) ( 192 -288 -416 ) ( 160 -288 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3717 +{ +( 184 -328 -400 ) ( 184 -288 -400 ) ( 152 -288 -400 ) subway/1_tile_middle 576 80 0 0.500000 0.500000 0 318767104 0 +( 160 -376 -384 ) ( 160 -336 -384 ) ( 216 -336 -384 ) subway/1_tile 576 -144 0 0.500000 0.500000 0 318767104 0 +( 200 -720 -400 ) ( 160 -760 -400 ) ( 160 -760 -384 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 160 -440 -384 ) ( 160 -744 -384 ) ( 160 -744 -400 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( 200 -440 -400 ) ( 216 -440 -384 ) ( 160 -440 -384 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( 216 -400 -384 ) ( 216 -360 -384 ) ( 200 -360 -400 ) subway/1_tile_middle 48 -46 90 0.500000 -0.500000 0 318767104 0 +} +// brush 3718 +{ +( 240 -672 -388 ) ( 272 -672 -388 ) ( 272 -600 -388 ) subway/light_tube 32 16 90 0.500000 0.500000 134217728 16777217 5200 +( 272 -600 -384 ) ( 272 -672 -384 ) ( 240 -672 -384 ) subway/light_tube -80 0 0 0.500000 0.500000 134217728 16777217 30000 +( 248 -588 -392 ) ( 248 -588 -384 ) ( 248 -660 -384 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( 276 -612 -392 ) ( 276 -612 -384 ) ( 244 -612 -384 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( 264 -672 -392 ) ( 264 -672 -384 ) ( 264 -600 -384 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +( 240 -656 -392 ) ( 240 -656 -384 ) ( 272 -656 -384 ) subway/1_black -320 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3719 +{ +( 128 -600 -384 ) ( 128 -528 -376 ) ( 128 -600 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 264 -216 -384 ) ( 264 -216 -376 ) ( 232 -216 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 408 -408 -384 ) ( 408 -216 -384 ) ( -8 -216 -384 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 168 -208 -376 ) ( 168 -232 -376 ) ( 16 -232 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 296 -216 -304 ) ( 296 -216 -264 ) ( 296 -184 -264 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 112 -760 -320 ) ( 112 -760 -296 ) ( 264 -760 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3720 +{ +( 16 -568 -304 ) ( -24 -568 -304 ) ( -24 -568 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 168 -400 -296 ) ( 168 -424 -296 ) ( 16 -424 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 16 -472 -384 ) ( -24 -472 -384 ) ( -24 -568 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -24 -496 -384 ) ( -24 -496 -376 ) ( -24 -528 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -24 -472 -384 ) ( 16 -472 -384 ) ( 16 -472 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 16 -832 -384 ) ( 16 -904 -376 ) ( 16 -832 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3721 +{ +( 168 -400 -70 ) ( 168 -400 -80 ) ( 96 -472 -80 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 136 -256 -400 ) ( 136 -248 -416 ) ( 136 -216 -416 ) subway/1_tile 80 -320 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -416 ) ( 360 -328 -416 ) ( 360 -328 -400 ) subway/1_tile 368 -320 0 0.500000 0.500000 0 318767104 0 +( 360 -416 -376 ) ( 360 -376 -376 ) ( 360 -376 -416 ) subway/1_tile 80 -320 0 0.500000 0.500000 0 318767104 0 +( 136 -256 -400 ) ( 360 -368 -400 ) ( 360 -360 -416 ) subway/1_tile 368 -320 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -400 ) ( 360 -328 -400 ) ( 360 -368 -400 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -248 -416 ) ( 360 -360 -416 ) ( 360 -328 -416 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 3722 +{ +( 272 -296 -70 ) ( 272 -296 -80 ) ( 96 -472 -80 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 136 -256 -400 ) ( 360 -368 -400 ) ( 360 -328 -400 ) subway/1_tile_middle 368 -64 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -384 ) ( 360 -328 -384 ) ( 360 -384 -384 ) subway/1_tile 368 -288 0 0.500000 0.500000 0 318767104 0 +( 136 -272 -384 ) ( 360 -384 -384 ) ( 360 -368 -400 ) subway/1_tile_middle -64 172 -26 0.500000 0.500000 0 318767104 0 +( 360 -408 -344 ) ( 360 -368 -344 ) ( 360 -368 -384 ) subway/1_tile_middle 80 -320 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -400 ) ( 360 -328 -400 ) ( 360 -328 -384 ) subway/1_tile_middle -352 32 0 0.500000 0.500000 0 318767104 0 +( 136 -272 -384 ) ( 136 -256 -400 ) ( 136 -216 -400 ) subway/1_tile_middle -448 368 90 0.500000 0.500000 0 318767104 0 +} +// brush 3723 +{ +( 176 -392 -70 ) ( 176 -392 -80 ) ( 96 -472 -80 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 136 -248 -512 ) ( 360 -360 -512 ) ( 360 -328 -512 ) subway/1_tile_bottom 368 -128 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -464 ) ( 360 -328 -464 ) ( 360 -360 -464 ) subway/1_tile_bottom 368 -128 0 0.500000 0.500000 0 318767104 0 +( 136 -248 -464 ) ( 360 -360 -464 ) ( 360 -360 -480 ) subway/1_tile_bottom 368 -416 0 0.500000 0.500000 0 318767104 0 +( 360 -416 -424 ) ( 360 -376 -424 ) ( 360 -376 -464 ) subway/1_tile_bottom 80 -416 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -480 ) ( 360 -328 -480 ) ( 360 -328 -464 ) subway/1_tile_bottom 368 -416 0 0.500000 0.500000 0 318767104 0 +( 136 -328 -424 ) ( 136 -368 -424 ) ( 136 -368 -464 ) subway/1_tile_bottom 80 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3724 +{ +( 200 -432 -464 ) ( 200 -432 -424 ) ( 240 -432 -424 ) subway/1_tile_bottom 80 -416 0 0.500000 0.500000 0 318767104 0 +( 240 -208 -464 ) ( 240 -208 -480 ) ( 352 -432 -480 ) subway/1_tile_bottom 368 -416 0 0.500000 0.500000 0 318767104 0 +( 192 -208 -496 ) ( 192 -208 -456 ) ( 152 -208 -456 ) subway/1_tile_bottom 80 -416 0 0.500000 0.500000 0 318767104 0 +( 208 -208 -512 ) ( 208 -208 -496 ) ( 320 -432 -496 ) subway/1_tile_bottom 368 -416 0 0.500000 0.500000 0 318767104 0 +( 208 -208 -464 ) ( 240 -208 -464 ) ( 352 -432 -464 ) subway/1_tile_bottom 368 -128 0 0.500000 0.500000 0 318767104 0 +( 240 -208 -512 ) ( 208 -208 -512 ) ( 320 -432 -512 ) subway/1_tile_bottom 368 -128 0 0.500000 0.500000 0 318767104 0 +( 96 -472 -80 ) ( 176 -392 -80 ) ( 176 -392 -70 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3725 +{ +( 240 -208 -416 ) ( 208 -208 -416 ) ( 320 -432 -416 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 200 -208 -400 ) ( 240 -208 -400 ) ( 352 -432 -400 ) subway/1_tile 368 -80 0 0.500000 0.500000 0 318767104 0 +( 208 -208 -416 ) ( 200 -208 -400 ) ( 312 -432 -400 ) subway/1_tile 368 -320 0 0.500000 0.500000 0 318767104 0 +( 192 -208 -416 ) ( 192 -208 -376 ) ( 152 -208 -376 ) subway/1_tile 80 -320 0 0.500000 0.500000 0 318767104 0 +( 240 -208 -400 ) ( 240 -208 -416 ) ( 352 -432 -416 ) subway/1_tile 368 -320 0 0.500000 0.500000 0 318767104 0 +( 352 -432 -416 ) ( 320 -432 -416 ) ( 312 -432 -400 ) subway/1_tile 80 -320 0 0.500000 0.500000 0 318767104 0 +( 96 -472 -80 ) ( 168 -400 -80 ) ( 168 -400 -70 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3726 +{ +( 352 -432 -400 ) ( 312 -432 -400 ) ( 296 -432 -384 ) subway/1_tile_middle -448 368 90 0.500000 0.500000 0 318767104 0 +( 240 -208 -384 ) ( 240 -208 -400 ) ( 352 -432 -400 ) subway/1_tile_middle -352 32 0 0.500000 0.500000 0 318767104 0 +( 200 -208 -384 ) ( 200 -208 -344 ) ( 160 -208 -344 ) subway/1_tile_middle 80 -320 0 0.500000 0.500000 0 318767104 0 +( 200 -208 -400 ) ( 184 -208 -384 ) ( 296 -432 -384 ) subway/1_tile_middle -64 136 297 0.500000 0.500000 0 318767104 0 +( 184 -208 -384 ) ( 240 -208 -384 ) ( 352 -432 -384 ) subway/1_tile 368 -288 0 0.500000 0.500000 0 318767104 0 +( 240 -208 -400 ) ( 200 -208 -400 ) ( 312 -432 -400 ) subway/1_tile_middle 368 -64 0 0.500000 0.500000 0 318767104 0 +( 96 -472 -80 ) ( 272 -296 -80 ) ( 272 -296 -70 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3727 +{ +( 312 -328 -400 ) ( 296 -328 -384 ) ( 296 -368 -384 ) subway/1_tile_middle 48 -46 90 0.500000 -0.500000 0 318767104 0 +( 352 -432 -384 ) ( 296 -432 -384 ) ( 312 -432 -400 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( 352 -432 -400 ) ( 352 -504 -400 ) ( 352 -504 -384 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( 296 -560 -384 ) ( 352 -504 -384 ) ( 352 -504 -400 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 296 -328 -384 ) ( 352 -328 -384 ) ( 352 -368 -384 ) subway/1_tile 576 -144 0 0.500000 0.500000 0 318767104 0 +( 360 -280 -400 ) ( 328 -280 -400 ) ( 328 -320 -400 ) subway/1_tile_middle 576 80 0 0.500000 0.500000 0 318767104 0 +} +// brush 3728 +{ +( 352 -280 -416 ) ( 320 -280 -416 ) ( 320 -320 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 312 -328 -400 ) ( 352 -328 -400 ) ( 352 -368 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 312 -544 -400 ) ( 352 -504 -400 ) ( 352 -504 -416 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 352 -432 -416 ) ( 352 -504 -416 ) ( 352 -504 -400 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 352 -432 -400 ) ( 312 -432 -400 ) ( 320 -432 -416 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 320 -528 -416 ) ( 312 -528 -400 ) ( 312 -568 -400 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 3729 +{ +( 320 -488 -384 ) ( 320 -528 -384 ) ( 320 -528 -424 ) subway/1_tile 32 32 0 -0.500000 0.500000 0 318767104 0 +( 344 -464 -408 ) ( 312 -464 -408 ) ( 312 -464 -448 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 352 -432 -464 ) ( 352 -512 -464 ) ( 352 -512 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 320 -536 -416 ) ( 344 -512 -416 ) ( 344 -512 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 328 -328 -416 ) ( 328 -288 -416 ) ( 360 -288 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 352 -280 -464 ) ( 320 -280 -464 ) ( 320 -320 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3730 +{ +( 320 -488 -456 ) ( 320 -528 -456 ) ( 320 -528 -496 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 352 -432 -424 ) ( 320 -432 -424 ) ( 320 -432 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 352 -432 -480 ) ( 352 -504 -480 ) ( 352 -504 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 320 -536 -464 ) ( 352 -504 -464 ) ( 352 -504 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 320 -328 -464 ) ( 320 -288 -464 ) ( 352 -288 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 352 -280 -512 ) ( 320 -280 -512 ) ( 320 -320 -512 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3731 +{ +( 320 -880 -512 ) ( 320 -920 -512 ) ( 352 -920 -512 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 352 -912 -464 ) ( 320 -912 -464 ) ( 320 -872 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 352 -696 -480 ) ( 352 -696 -464 ) ( 320 -664 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 352 -696 -464 ) ( 352 -696 -480 ) ( 352 -768 -480 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 352 -760 -480 ) ( 320 -728 -480 ) ( 320 -728 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 320 -664 -496 ) ( 320 -728 -496 ) ( 320 -728 -512 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3732 +{ +( 320 -880 -464 ) ( 320 -920 -464 ) ( 352 -920 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 360 -912 -416 ) ( 328 -912 -416 ) ( 328 -872 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 344 -688 -464 ) ( 344 -688 -416 ) ( 320 -664 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 352 -688 -464 ) ( 352 -752 -464 ) ( 352 -752 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 320 -728 -416 ) ( 344 -752 -416 ) ( 344 -752 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 320 -672 -424 ) ( 320 -672 -384 ) ( 320 -712 -384 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3733 +{ +( 312 -632 -400 ) ( 312 -672 -400 ) ( 320 -672 -416 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 312 -720 -400 ) ( 352 -760 -400 ) ( 352 -760 -416 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 352 -696 -416 ) ( 352 -760 -416 ) ( 352 -760 -400 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 352 -696 -416 ) ( 352 -696 -400 ) ( 312 -656 -400 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 352 -832 -400 ) ( 352 -872 -400 ) ( 312 -872 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 320 -880 -416 ) ( 320 -920 -416 ) ( 352 -920 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3734 +{ +( 328 -880 -400 ) ( 328 -920 -400 ) ( 360 -920 -400 ) subway/1_tile_middle 576 80 0 0.500000 0.500000 0 318767104 0 +( 352 -832 -384 ) ( 352 -872 -384 ) ( 296 -872 -384 ) subway/1_tile 576 -144 0 0.500000 0.500000 0 318767104 0 +( 352 -696 -400 ) ( 352 -696 -384 ) ( 296 -640 -384 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 352 -696 -400 ) ( 352 -768 -400 ) ( 352 -768 -384 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( 296 -704 -384 ) ( 352 -760 -384 ) ( 352 -760 -400 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( 296 -832 -384 ) ( 296 -872 -384 ) ( 312 -872 -400 ) subway/1_tile_middle 48 -46 90 0.500000 -0.500000 0 318767104 0 +} +// brush 3735 +{ +( 48 -736 -400 ) ( 8 -736 -400 ) ( 8 -768 -400 ) subway/1_tile_middle 576 80 0 0.500000 0.500000 0 318767104 0 +( 96 -760 -384 ) ( 56 -760 -384 ) ( 56 -704 -384 ) subway/1_tile 576 -144 0 0.500000 0.500000 0 318767104 0 +( 312 -720 -400 ) ( 352 -760 -400 ) ( 352 -760 -384 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 352 -760 -400 ) ( 160 -760 -400 ) ( 160 -760 -384 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( 216 -704 -384 ) ( 160 -760 -384 ) ( 160 -760 -400 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( 96 -704 -384 ) ( 56 -704 -384 ) ( 56 -720 -400 ) subway/1_tile_middle -40 32 0 -0.500000 0.500000 0 318767104 0 +} +// brush 3736 +{ +( 312 -720 -400 ) ( 168 -720 -400 ) ( 168 -728 -416 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 200 -720 -400 ) ( 160 -760 -400 ) ( 160 -760 -416 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 352 -760 -416 ) ( 160 -760 -416 ) ( 160 -760 -400 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 320 -728 -416 ) ( 352 -760 -416 ) ( 352 -760 -400 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 96 -760 -400 ) ( 56 -760 -400 ) ( 56 -720 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 48 -728 -416 ) ( 8 -728 -416 ) ( 8 -760 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3737 +{ +( 48 -728 -464 ) ( 8 -728 -464 ) ( 8 -760 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 16 -768 -416 ) ( 16 -736 -416 ) ( 56 -736 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 344 -752 -416 ) ( 320 -728 -416 ) ( 320 -728 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 160 -760 -432 ) ( 160 -760 -392 ) ( 200 -760 -392 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 168 -752 -464 ) ( 192 -728 -464 ) ( 192 -728 -416 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 320 -728 -416 ) ( 192 -728 -416 ) ( 192 -728 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3738 +{ +( 48 -728 -512 ) ( 8 -728 -512 ) ( 8 -760 -512 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 16 -760 -464 ) ( 16 -728 -464 ) ( 56 -728 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 352 -760 -464 ) ( 320 -728 -464 ) ( 320 -728 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 96 -760 -464 ) ( 96 -760 -424 ) ( 136 -760 -424 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 160 -760 -480 ) ( 192 -728 -480 ) ( 192 -728 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 320 -728 -496 ) ( 192 -728 -496 ) ( 192 -728 -512 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3739 +{ +( -192 -256 -400 ) ( -192 -272 -384 ) ( -152 -272 -384 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -400 ) ( -256 -216 -384 ) ( -200 -272 -384 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -384 ) ( -256 -216 -400 ) ( 136 -216 -400 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( 136 -272 -384 ) ( 136 -216 -384 ) ( 136 -216 -400 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -216 -272 -384 ) ( -216 -216 -384 ) ( -176 -216 -384 ) subway/1_tile 576 -144 0 0.500000 0.500000 0 318767104 0 +( -264 -208 -400 ) ( -264 -240 -400 ) ( -224 -240 -400 ) subway/1_tile_middle 576 80 0 0.500000 0.500000 0 318767104 0 +} +// brush 3740 +{ +( -264 -216 -416 ) ( -264 -248 -416 ) ( -224 -248 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -216 -256 -400 ) ( -216 -216 -400 ) ( -176 -216 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 136 -256 -400 ) ( 136 -216 -400 ) ( 136 -216 -416 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( -264 -216 -400 ) ( -264 -216 -416 ) ( 136 -216 -416 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -416 ) ( -256 -216 -400 ) ( -216 -256 -400 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( -16 -248 -416 ) ( -16 -256 -400 ) ( 24 -256 -400 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 3741 +{ +( -376 -248 -496 ) ( -56 -248 -496 ) ( -56 -248 -512 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -480 ) ( -256 -216 -464 ) ( -224 -248 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -464 ) ( -256 -216 -480 ) ( 136 -216 -480 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 136 -216 -480 ) ( 136 -248 -480 ) ( 136 -248 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -216 -248 -464 ) ( -256 -248 -464 ) ( -256 -216 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -256 -216 -512 ) ( -256 -248 -512 ) ( -216 -248 -512 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3742 +{ +( -192 -448 -480 ) ( -256 -448 -480 ) ( -256 -448 -488 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 0 285212672 0 +( 8 160 -480 ) ( 8 224 -480 ) ( 8 224 -488 ) subway/1_stair_side1 840 -368 0 0.500000 0.500000 0 285212672 0 +( -120 -472 -480 ) ( -56 -472 -480 ) ( -56 -472 -488 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 0 285212672 0 +( -136 -264 -488 ) ( -136 -328 -488 ) ( -136 -328 -496 ) subway/1_stair_side1 328 -368 0 0.500000 0.500000 0 285212672 0 +( -256 -112 -480 ) ( -192 -112 -480 ) ( -192 -176 -480 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( -192 -160 -488 ) ( -192 -96 -488 ) ( -256 -96 -488 ) subway/1_lobby_floor 448 -880 0 0.500000 0.500000 0 285212672 0 +} +// brush 3743 +{ +( 164 -404 -102 ) ( 164 -404 -112 ) ( 96 -472 -112 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 192 -496 -464 ) ( 192 -496 -424 ) ( 192 -456 -424 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 128 -376 -480 ) ( 192 -408 -480 ) ( 192 -408 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 128 -316 -464 ) ( 128 -316 -424 ) ( 128 -356 -424 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 128 -408 -496 ) ( 192 -440 -496 ) ( 192 -440 -512 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 128 -376 -464 ) ( 192 -408 -464 ) ( 192 -440 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 128 -408 -512 ) ( 192 -440 -512 ) ( 192 -408 -512 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3744 +{ +( 128 -376 -464 ) ( 192 -408 -464 ) ( 192 -408 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -368 -448 ) ( 128 -368 -408 ) ( 128 -400 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -400 -416 ) ( 192 -432 -416 ) ( 192 -432 -464 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 192 -432 -448 ) ( 192 -432 -408 ) ( 192 -400 -408 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -376 -416 ) ( 192 -408 -416 ) ( 192 -432 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 128 -400 -464 ) ( 192 -432 -464 ) ( 192 -408 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 152 -416 -70 ) ( 152 -416 -80 ) ( 96 -472 -80 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3745 +{ +( 156 -412 -70 ) ( 156 -412 -80 ) ( 96 -472 -80 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 128 -396 -416 ) ( 192 -428 -416 ) ( 192 -408 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 128 -368 -400 ) ( 192 -400 -400 ) ( 192 -428 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 192 -424 -424 ) ( 192 -424 -384 ) ( 192 -392 -384 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -396 -400 ) ( 192 -428 -400 ) ( 192 -428 -416 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -376 -416 ) ( 128 -368 -400 ) ( 128 -408 -400 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -376 -416 ) ( 192 -408 -416 ) ( 192 -400 -400 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 3746 +{ +( 160 -408 -70 ) ( 160 -408 -80 ) ( 96 -472 -80 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 128 -408 -400 ) ( 192 -440 -400 ) ( 192 -400 -400 ) subway/1_tile_middle 576 80 0 0.500000 0.500000 0 318767104 0 +( 128 -352 -384 ) ( 192 -384 -384 ) ( 192 -440 -384 ) subway/1_tile 576 -144 0 0.500000 0.500000 0 318767104 0 +( 192 -424 -384 ) ( 192 -424 -344 ) ( 192 -392 -344 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -408 -384 ) ( 192 -440 -384 ) ( 192 -440 -400 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -368 -400 ) ( 128 -352 -384 ) ( 128 -408 -384 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( 128 -368 -400 ) ( 192 -400 -400 ) ( 192 -384 -384 ) subway/1_tile_middle -64 121 -26 0.500000 0.500000 0 318767104 0 +} +// brush 3747 +{ +( 184 -376 -384 ) ( 168 -376 -400 ) ( 200 -440 -400 ) subway/1_tile_middle -64 117 297 0.500000 0.500000 0 318767104 0 +( 160 -440 -384 ) ( 216 -440 -384 ) ( 200 -440 -400 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( 128 -376 -400 ) ( 128 -376 -384 ) ( 160 -440 -384 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( 176 -376 -344 ) ( 144 -376 -344 ) ( 144 -376 -384 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -376 -384 ) ( 184 -376 -384 ) ( 216 -440 -384 ) subway/1_tile 576 -144 0 0.500000 0.500000 0 318767104 0 +( 168 -376 -400 ) ( 128 -376 -400 ) ( 160 -440 -400 ) subway/1_tile_middle 576 80 0 0.500000 0.500000 0 318767104 0 +( 96 -472 -80 ) ( 160 -408 -80 ) ( 160 -408 -70 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3748 +{ +( 168 -376 -400 ) ( 160 -376 -416 ) ( 192 -440 -416 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 160 -440 -400 ) ( 200 -440 -400 ) ( 192 -440 -416 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 140 -376 -416 ) ( 140 -376 -400 ) ( 172 -440 -400 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 176 -376 -384 ) ( 144 -376 -384 ) ( 144 -376 -424 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 140 -376 -400 ) ( 168 -376 -400 ) ( 200 -440 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 160 -376 -416 ) ( 140 -376 -416 ) ( 172 -440 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 96 -472 -80 ) ( 156 -412 -80 ) ( 156 -412 -70 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3749 +{ +( 160 -376 -512 ) ( 128 -376 -512 ) ( 160 -440 -512 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 128 -376 -464 ) ( 160 -376 -464 ) ( 192 -440 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 128 -376 -480 ) ( 128 -376 -464 ) ( 160 -440 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 212 -440 -424 ) ( 252 -440 -424 ) ( 252 -440 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 160 -376 -496 ) ( 160 -376 -512 ) ( 192 -440 -512 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 112 -376 -424 ) ( 72 -376 -424 ) ( 72 -376 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 96 -472 -112 ) ( 164 -404 -112 ) ( 164 -404 -102 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3750 +{ +( 136 -1224 -352 ) ( 136 -1224 -344 ) ( 136 -1160 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 872 -792 -360 ) ( 872 -792 -352 ) ( 808 -792 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 120 -792 -320 ) ( 120 -984 -320 ) ( 128 -984 -336 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 312 -984 -368 ) ( 312 -984 -360 ) ( 376 -984 -360 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 120 -984 -320 ) ( 120 -792 -320 ) ( 136 -792 -320 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 544 -1216 -336 ) ( 544 -1152 -336 ) ( 480 -1152 -336 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3751 +{ +( 136 -1224 -392 ) ( 136 -1224 -384 ) ( 136 -1160 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 872 -792 -400 ) ( 872 -792 -392 ) ( 808 -792 -392 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 128 -1080 -400 ) ( 128 -1080 -392 ) ( 128 -1144 -392 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 312 -984 -408 ) ( 312 -984 -400 ) ( 376 -984 -400 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 464 -1152 -384 ) ( 528 -1152 -384 ) ( 528 -1216 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 544 -1216 -400 ) ( 544 -1152 -400 ) ( 480 -1152 -400 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3752 +{ +( 128 -1224 -408 ) ( 128 -1224 -400 ) ( 128 -1160 -400 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 0 285212672 0 +( 864 -824 -408 ) ( 864 -824 -400 ) ( 800 -824 -400 ) subway/1_stair_side1 840 -368 0 0.500000 0.500000 0 285212672 0 +( -504 -1040 -408 ) ( -504 -1040 -400 ) ( -504 -1104 -400 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 0 285212672 0 +( 304 -984 -416 ) ( 304 -984 -408 ) ( 368 -984 -408 ) subway/1_stair_side1 328 -368 0 0.500000 0.500000 0 285212672 0 +( 456 -1152 -400 ) ( 520 -1152 -400 ) ( 520 -1216 -400 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 -1216 -408 ) ( 536 -1152 -408 ) ( 472 -1152 -408 ) subway/1_lobby_floor 448 -880 0 0.500000 0.500000 0 285212672 0 +} +// brush 3753 +{ +( -200 -864 -400 ) ( -200 -896 -400 ) ( -160 -896 -400 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -152 -896 -384 ) ( -192 -896 -384 ) ( -192 -864 -384 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 8 -860 -344 ) ( 8 -828 -344 ) ( 8 -828 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -64 -696 -344 ) ( -104 -696 -344 ) ( -104 -696 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 0 -864 -344 ) ( 0 -896 -344 ) ( 0 -896 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -220 -728 -344 ) ( -180 -728 -344 ) ( -180 -728 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3754 +{ +( -200 -864 -384 ) ( -200 -896 -384 ) ( -160 -896 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -152 -888 -336 ) ( -192 -888 -336 ) ( -192 -856 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 8 -860 -328 ) ( 8 -828 -328 ) ( 8 -828 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -8 -696 -312 ) ( -48 -696 -312 ) ( -48 -696 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 0 -872 -328 ) ( 0 -904 -328 ) ( 0 -904 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -220 -728 -304 ) ( -180 -728 -304 ) ( -180 -728 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3755 +{ +( 188 -728 -328 ) ( 188 -728 -288 ) ( 228 -728 -288 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -904 -352 ) ( 8 -904 -312 ) ( 8 -872 -312 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 56 -696 -336 ) ( 56 -696 -296 ) ( 16 -696 -296 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 0 -696 -336 ) ( -8 -696 -320 ) ( -8 -728 -320 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -728 -320 ) ( -8 -728 -320 ) ( -8 -696 -320 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 168 -896 -336 ) ( 208 -896 -336 ) ( 208 -864 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3756 +{ +( 168 -896 -320 ) ( 208 -896 -320 ) ( 208 -864 -320 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 8 -728 -304 ) ( -24 -728 -304 ) ( -24 -696 -304 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -8 -696 -320 ) ( -24 -696 -304 ) ( -24 -728 -304 ) subway/1_tile_middle 16 -16 90 0.500000 0.500000 0 318767104 0 +( 56 -696 -336 ) ( 56 -696 -296 ) ( 16 -696 -296 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 8 -904 -352 ) ( 8 -904 -312 ) ( 8 -872 -312 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 188 -728 -328 ) ( 188 -728 -288 ) ( 228 -728 -288 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 3757 +{ +( -336 -864 -384 ) ( -336 -896 -384 ) ( -296 -896 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -288 -888 -336 ) ( -328 -888 -336 ) ( -328 -856 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -128 -860 -328 ) ( -128 -828 -328 ) ( -128 -828 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -144 -696 -312 ) ( -184 -696 -312 ) ( -184 -696 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -872 -328 ) ( -136 -904 -328 ) ( -136 -904 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -356 -728 -304 ) ( -316 -728 -304 ) ( -316 -728 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3758 +{ +( -356 -728 -288 ) ( -316 -728 -288 ) ( -316 -728 -328 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -136 -872 -312 ) ( -136 -904 -312 ) ( -136 -904 -352 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -144 -696 -296 ) ( -184 -696 -296 ) ( -184 -696 -336 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -104 -728 -304 ) ( -104 -696 -304 ) ( -120 -696 -320 ) subway/1_tile_middle 16 -16 90 0.500000 0.500000 0 318767104 0 +( -104 -696 -304 ) ( -104 -728 -304 ) ( -136 -728 -304 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -336 -864 -320 ) ( -336 -896 -320 ) ( -296 -896 -320 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 3759 +{ +( -336 -864 -336 ) ( -336 -896 -336 ) ( -296 -896 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -120 -696 -320 ) ( -120 -728 -320 ) ( -136 -728 -320 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -120 -728 -320 ) ( -120 -696 -320 ) ( -128 -696 -336 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -144 -696 -296 ) ( -184 -696 -296 ) ( -184 -696 -336 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -872 -312 ) ( -136 -904 -312 ) ( -136 -904 -352 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -356 -728 -288 ) ( -316 -728 -288 ) ( -316 -728 -328 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3760 +{ +( -356 -728 -344 ) ( -316 -728 -344 ) ( -316 -728 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( -136 -864 -344 ) ( -136 -896 -344 ) ( -136 -896 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -200 -696 -344 ) ( -240 -696 -344 ) ( -240 -696 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( -128 -860 -344 ) ( -128 -828 -344 ) ( -128 -828 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -288 -896 -384 ) ( -328 -896 -384 ) ( -328 -864 -384 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -336 -864 -400 ) ( -336 -896 -400 ) ( -296 -896 -400 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3761 +{ +( -24 -792 -216 ) ( -176 -792 -216 ) ( -176 -792 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 128 -1016 -184 ) ( 128 -984 -184 ) ( 128 -984 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -264 -968 -296 ) ( -112 -968 -296 ) ( -112 -992 -296 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -288 -984 -304 ) ( 128 -984 -304 ) ( 128 -792 -304 ) subway/con14 192 176 0 0.500000 0.500000 0 285212672 0 +( -160 -872 -296 ) ( -160 -904 -296 ) ( -160 -904 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -176 -984 -296 ) ( -104 -984 -296 ) ( -176 -984 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3762 +{ +( -356 -600 -304 ) ( -316 -600 -304 ) ( -316 -600 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -136 -744 -328 ) ( -136 -776 -328 ) ( -136 -776 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -144 -568 -312 ) ( -184 -568 -312 ) ( -184 -568 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( -128 -732 -328 ) ( -128 -700 -328 ) ( -128 -700 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -288 -760 -336 ) ( -328 -760 -336 ) ( -328 -728 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -336 -736 -384 ) ( -336 -768 -384 ) ( -296 -768 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3763 +{ +( -336 -736 -400 ) ( -336 -768 -400 ) ( -296 -768 -400 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -288 -768 -384 ) ( -328 -768 -384 ) ( -328 -736 -384 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -128 -732 -344 ) ( -128 -700 -344 ) ( -128 -700 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -200 -568 -344 ) ( -240 -568 -344 ) ( -240 -568 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( -136 -736 -344 ) ( -136 -768 -344 ) ( -136 -768 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -356 -600 -344 ) ( -316 -600 -344 ) ( -316 -600 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3764 +{ +( 168 -768 -336 ) ( 208 -768 -336 ) ( 208 -736 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 8 -600 -320 ) ( -8 -600 -320 ) ( -8 -568 -320 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 0 -568 -336 ) ( -8 -568 -320 ) ( -8 -600 -320 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 56 -568 -336 ) ( 56 -568 -296 ) ( 16 -568 -296 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -776 -352 ) ( 8 -776 -312 ) ( 8 -744 -312 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 188 -600 -328 ) ( 188 -600 -288 ) ( 228 -600 -288 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3765 +{ +( 188 -600 -328 ) ( 188 -600 -288 ) ( 228 -600 -288 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 8 -776 -352 ) ( 8 -776 -312 ) ( 8 -744 -312 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 56 -568 -336 ) ( 56 -568 -296 ) ( 16 -568 -296 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -8 -568 -320 ) ( -24 -568 -304 ) ( -24 -600 -304 ) subway/1_tile_middle 16 -16 90 0.500000 0.500000 0 318767104 0 +( 8 -600 -304 ) ( -24 -600 -304 ) ( -24 -568 -304 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 168 -768 -320 ) ( 208 -768 -320 ) ( 208 -736 -320 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 3766 +{ +( -220 -600 -344 ) ( -180 -600 -344 ) ( -180 -600 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 0 -736 -344 ) ( 0 -768 -344 ) ( 0 -768 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -64 -568 -344 ) ( -104 -568 -344 ) ( -104 -568 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 8 -732 -344 ) ( 8 -700 -344 ) ( 8 -700 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -152 -768 -384 ) ( -192 -768 -384 ) ( -192 -736 -384 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -200 -736 -400 ) ( -200 -768 -400 ) ( -160 -768 -400 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3767 +{ +( -220 -600 -304 ) ( -180 -600 -304 ) ( -180 -600 -344 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 0 -744 -328 ) ( 0 -776 -328 ) ( 0 -776 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -8 -568 -312 ) ( -48 -568 -312 ) ( -48 -568 -352 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 8 -732 -328 ) ( 8 -700 -328 ) ( 8 -700 -368 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( -152 -760 -336 ) ( -192 -760 -336 ) ( -192 -728 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -200 -736 -384 ) ( -200 -768 -384 ) ( -160 -768 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3768 +{ +( -200 -728 -496 ) ( -200 -760 -496 ) ( -160 -760 -496 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( -152 -760 -400 ) ( -192 -760 -400 ) ( -192 -728 -400 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( 8 -532 -360 ) ( 8 -500 -360 ) ( 8 -500 -400 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( -64 -488 -360 ) ( -104 -488 -360 ) ( -104 -488 -400 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 0 -712 -360 ) ( 0 -744 -360 ) ( 0 -744 -400 ) subway/con11 0 -16 0 1 1 0 285212672 0 +( -228 -824 -360 ) ( -188 -824 -360 ) ( -188 -824 -400 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3769 +{ +( -192 -760 -400 ) ( -192 -792 -400 ) ( -152 -792 -400 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( -144 -792 -384 ) ( -184 -792 -384 ) ( -184 -760 -384 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 16 -612 -344 ) ( 16 -580 -344 ) ( 16 -580 -384 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( -56 -488 -344 ) ( -96 -488 -344 ) ( -96 -488 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 8 -800 -344 ) ( 8 -832 -344 ) ( 8 -832 -384 ) subway/1_tile_bottom 112 64 0 -0.500000 0.500000 0 318767104 0 +( -228 -824 -344 ) ( -188 -824 -344 ) ( -188 -824 -384 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3770 +{ +( -228 -824 -288 ) ( -188 -824 -288 ) ( -188 -824 -328 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 8 -808 -312 ) ( 8 -840 -312 ) ( 8 -840 -352 ) subway/1_tile_middle 112 64 0 -0.500000 0.500000 0 318767104 0 +( 0 -472 -296 ) ( -40 -472 -296 ) ( -40 -472 -336 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 16 -596 -312 ) ( 16 -564 -312 ) ( 16 -564 -352 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -144 -784 -304 ) ( -184 -784 -304 ) ( -184 -752 -304 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( -192 -760 -320 ) ( -192 -792 -320 ) ( -152 -792 -320 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 3771 +{ +( 4 -792 -320 ) ( 4 -832 -320 ) ( 128 -832 -320 ) subway/1_tile_middle 576 80 0 0.500000 0.500000 0 318767104 0 +( -4 -848 -304 ) ( -4 -792 -304 ) ( 128 -792 -304 ) subway/1_tile 576 -144 0 0.500000 0.500000 0 318767104 0 +( -12 -792 -304 ) ( -12 -848 -304 ) ( -4 -832 -320 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -792 -304 ) ( 128 -792 -264 ) ( 88 -792 -264 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -832 -320 ) ( 128 -848 -304 ) ( 128 -792 -304 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( 128 -848 -304 ) ( 168 -848 -304 ) ( 168 -832 -320 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3772 +{ +( 176 -824 -400 ) ( 216 -824 -400 ) ( 216 -792 -400 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 208 -792 -384 ) ( 208 -824 -384 ) ( 168 -824 -384 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 0 -788 -384 ) ( 0 -788 -344 ) ( 0 -820 -344 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 128 -792 -384 ) ( 128 -792 -344 ) ( 88 -792 -344 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 128 -824 -384 ) ( 128 -824 -344 ) ( 128 -792 -344 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 208 -824 -384 ) ( 208 -824 -344 ) ( 248 -824 -344 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3773 +{ +( 176 -824 -384 ) ( 216 -824 -384 ) ( 216 -792 -384 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 208 -784 -336 ) ( 208 -816 -336 ) ( 168 -816 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 0 -788 -368 ) ( 0 -788 -328 ) ( 0 -820 -328 ) subway/1_tile_damage2 32 0 0 0.500000 0.500000 0 352321536 0 +( 72 -792 -352 ) ( 72 -792 -312 ) ( 32 -792 -312 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 128 -832 -368 ) ( 128 -832 -328 ) ( 128 -800 -328 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 216 -824 -344 ) ( 216 -824 -304 ) ( 256 -824 -304 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3774 +{ +( 176 -824 -336 ) ( 216 -824 -336 ) ( 216 -792 -336 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 4 -832 -320 ) ( 4 -792 -320 ) ( 128 -792 -320 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( -4 -784 -320 ) ( -4 -824 -320 ) ( 0 -816 -336 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -792 -336 ) ( 128 -792 -296 ) ( 88 -792 -296 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 128 -824 -336 ) ( 128 -832 -320 ) ( 128 -792 -320 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 173 -832 -320 ) ( 213 -832 -320 ) ( 213 -824 -336 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 3775 +{ +( 544 -1216 -320 ) ( 544 -1152 -320 ) ( 480 -1152 -320 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( 464 -1160 -304 ) ( 528 -1160 -304 ) ( 528 -1224 -304 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( 312 -984 -352 ) ( 312 -984 -344 ) ( 376 -984 -344 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( 120 -1080 -344 ) ( 120 -1080 -336 ) ( 120 -1144 -336 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( 872 -792 -344 ) ( 872 -792 -336 ) ( 808 -792 -336 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +( 136 -1224 -336 ) ( 136 -1224 -328 ) ( 136 -1160 -328 ) subway/1_tile_middle 0 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3776 +{ +( 760 -1024 -348 ) ( 740 -1024 -348 ) ( 740 -1064 -348 ) subway/1_florescent 16 0 0 0.500000 0.500000 134217728 1 5000 +( 740 -1064 -344 ) ( 740 -1024 -344 ) ( 760 -1024 -344 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 740 -1064 -344 ) ( 760 -1064 -344 ) ( 760 -1064 -356 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 760 -1064 -344 ) ( 760 -1024 -344 ) ( 760 -1024 -356 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 760 -1024 -344 ) ( 740 -1024 -344 ) ( 740 -1024 -356 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 752 -1024 -344 ) ( 752 -1064 -344 ) ( 752 -1064 -356 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +} +// brush 3777 +{ +( 856 -248 -362 ) ( 856 -216 -362 ) ( 824 -216 -362 ) subway/metal1 0 -16 90 0.500000 -0.500000 0 16777216 0 +( 820 -232 -344 ) ( 844 -232 -344 ) ( 844 -248 -344 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 832 -216 -362 ) ( 832 -248 -362 ) ( 832 -248 -354 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 808 -216 -364 ) ( 840 -216 -372 ) ( 840 -216 -364 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 820 -112 -596 ) ( 820 -104 -596 ) ( 820 -104 -556 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 788 -248 -344 ) ( 820 -248 -352 ) ( 820 -248 -360 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 824 -248 -360 ) ( 824 -248 -368 ) ( 824 -216 -368 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3778 +{ +( 804 -784 -264 ) ( 724 -784 -264 ) ( 724 -784 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 908 -664 -352 ) ( 908 -656 -352 ) ( 860 -656 -352 ) subway/1_tunnel_ceiling2 80 0 0 1 1 0 16777216 0 +( 800 -808 -336 ) ( 800 -544 -336 ) ( 832 -544 -336 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 724 -656 -312 ) ( 724 -920 -312 ) ( 724 -920 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 908 -144 -344 ) ( 908 -144 -312 ) ( 860 -144 -312 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 788 -696 -536 ) ( 788 -696 -576 ) ( 788 -704 -576 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 916 -1088 -312 ) ( 916 -1088 -344 ) ( 868 -1088 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3779 +{ +( 804 -464 -264 ) ( 764 -464 -264 ) ( 764 -464 -254 ) subway/1_tunneltrack_1 71 -210 195 1 1 134217728 16777216 0 +( 980 -808 -504 ) ( 980 -808 -536 ) ( 932 -808 -536 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +( 796 -216 -728 ) ( 796 -216 -768 ) ( 796 -224 -768 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 980 -144 -536 ) ( 980 -144 -504 ) ( 932 -144 -504 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +( 788 -464 -516 ) ( 788 -728 -516 ) ( 788 -728 -548 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 876 -528 -528 ) ( 876 -264 -528 ) ( 908 -264 -528 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +( 980 -392 -536 ) ( 980 -384 -536 ) ( 932 -384 -536 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3780 +{ +( 760 -400 -264 ) ( 672 -400 -264 ) ( 672 -400 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +( 904 -560 -544 ) ( 784 -560 -544 ) ( 784 -584 -544 ) subway/1_tunneltrack_plain 224 16 0 0.500000 0.500000 0 301989888 0 +( 768 -608 -536 ) ( 768 -584 -536 ) ( 888 -584 -536 ) subway/1_tunneltrack_plain 224 16 0 0.500000 0.500000 0 301989888 0 +( 704 -1104 -568 ) ( 824 -1104 -568 ) ( 824 -1104 -576 ) subway/1_tunneltrack_plain 224 0 0 0.500000 0.500000 0 301989888 0 +( 716 -376 -520 ) ( 716 -352 -520 ) ( 716 -352 -528 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +( 896 -216 -480 ) ( 776 -216 -480 ) ( 776 -216 -488 ) subway/1_tunneltrack_plain 224 0 0 0.500000 0.500000 0 301989888 0 +( 704 -560 -512 ) ( 704 -584 -512 ) ( 704 -584 -520 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3781 +{ +( 744 -464 -264 ) ( 680 -464 -264 ) ( 680 -464 -254 ) subway/1_tunneltrack_1 71 -210 195 1 1 134217728 16777216 0 +( 904 -392 -536 ) ( 904 -384 -536 ) ( 856 -384 -536 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +( 800 -528 -528 ) ( 800 -264 -528 ) ( 832 -264 -528 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +( 712 -392 -516 ) ( 712 -656 -516 ) ( 712 -656 -548 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 912 -144 -536 ) ( 912 -144 -504 ) ( 864 -144 -504 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +( 720 -808 -728 ) ( 720 -808 -768 ) ( 720 -816 -768 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 904 -808 -504 ) ( 904 -808 -536 ) ( 856 -808 -536 ) subway/metal2 16 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3782 +{ +( 820 -1208 -264 ) ( 700 -1208 -264 ) ( 700 -1208 -254 ) subway/1_tunneltrack_plain -84 15 0 1 -1 0 301989888 0 +( 720 -1080 -512 ) ( 720 -1104 -512 ) ( 720 -1104 -520 ) subway/1_tunneltrack_plain -84 15 0 1 -1 0 301989888 0 +( 972 -1152 -480 ) ( 852 -1152 -480 ) ( 852 -1152 -488 ) subway/1_tunneltrack_plain -84 15 0 1 -1 0 301989888 0 +( 792 -1136 -520 ) ( 792 -1112 -520 ) ( 792 -1112 -528 ) subway/1_tunneltrack_plain -84 15 0 1 -1 0 301989888 0 +( 780 -1984 -568 ) ( 900 -1984 -568 ) ( 900 -1984 -576 ) subway/1_tunneltrack_plain -84 15 0 1 -1 0 301989888 0 +( 844 -1488 -536 ) ( 844 -1464 -536 ) ( 964 -1464 -536 ) subway/1_tunneltrack_end2 -84 7 0 1 1 0 16777216 0 +( 956 -1448 -544 ) ( 836 -1448 -544 ) ( 836 -1472 -544 ) subway/1_tunneltrack_plain -84 15 0 1 -1 0 301989888 0 +} +// brush 3783 +{ +( 864 -1264 -254 ) ( 864 -1264 -264 ) ( 784 -1264 -264 ) subway/1_tunneltrack_1 22 -13 195 1 1 0 16777216 0 +( 648 -1448 -496 ) ( 648 -1424 -496 ) ( 528 -1424 -496 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 520 -1440 -480 ) ( 640 -1440 -480 ) ( 640 -1464 -480 ) subway/metal2 -16 0 0 0.500000 0.500000 0 16777216 0 +( 560 -2496 -536 ) ( 560 -2496 -528 ) ( 680 -2496 -528 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 824 -1488 -504 ) ( 824 -1488 -496 ) ( 824 -1512 -496 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 624 -944 -448 ) ( 624 -944 -440 ) ( 504 -944 -440 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 840 -896 -416 ) ( 840 -896 -408 ) ( 840 -872 -408 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 3784 +{ +( 992 -176 -480 ) ( 872 -176 -480 ) ( 872 -200 -480 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 880 -216 -448 ) ( 880 -192 -448 ) ( 1000 -192 -448 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 816 -712 -512 ) ( 936 -712 -512 ) ( 936 -712 -520 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 688 128 -488 ) ( 688 152 -488 ) ( 688 152 -496 ) subway/1_tunnelwall_pipe 0 64 0 0.500000 0.500000 0 16777216 0 +( 1048 896 -432 ) ( 928 896 -432 ) ( 928 896 -440 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 680 -312 -392 ) ( 680 -336 -392 ) ( 680 -336 -400 ) subway/1_tunnelwall_pipe 0 -48 0 0.500000 0.500000 0 16777216 0 +( 696 -144 -264 ) ( 664 -144 -264 ) ( 664 -144 -254 ) subway/1_tunneltrack_1 79 -208 195 1 1 0 16777216 0 +} +// brush 3785 +{ +( 840 -56 -536 ) ( 840 -32 -536 ) ( 816 -32 -536 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( 804 -32 -352 ) ( 828 -32 -352 ) ( 828 -56 -352 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( 808 -56 -480 ) ( 808 -56 -448 ) ( 832 -56 -448 ) subway/metal2 -32 0 0 0.500000 0.500000 0 16777216 0 +( 824 -16 -480 ) ( 824 -16 -448 ) ( 824 -40 -448 ) subway/metal1 16 0 0 0.500000 0.500000 0 16777216 0 +( 832 -24 -584 ) ( 832 -24 -552 ) ( 808 -24 -552 ) subway/metal2 -32 0 0 0.500000 0.500000 0 16777216 0 +( 840 -56 -480 ) ( 840 -56 -448 ) ( 840 -32 -448 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3786 +{ +( 1128 -1520 -448 ) ( 1008 -1520 -448 ) ( 1008 -1544 -448 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1008 -1560 -332 ) ( 1008 -1536 -332 ) ( 1128 -1536 -332 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 956 -1272 -492 ) ( 1076 -1272 -492 ) ( 1076 -1272 -500 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 840 -1596 -460 ) ( 840 -1572 -460 ) ( 840 -1572 -468 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 1152 -1264 -452 ) ( 1032 -1264 -452 ) ( 1032 -1264 -460 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +( 680 -1416 -372 ) ( 680 -1440 -372 ) ( 680 -1440 -380 ) subway/1_tunnelwall 0 0 0 1 1 0 301989888 0 +} +// brush 3787 +{ +( 688 896 -264 ) ( 752 896 -264 ) ( 752 896 -254 ) subway/metalrib1 0 -32 90 0.500000 0.500000 0 16777216 0 +( 1000 152 -496 ) ( 880 152 -496 ) ( 880 128 -496 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 888 112 -480 ) ( 888 136 -480 ) ( 1008 136 -480 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 832 -24 -528 ) ( 952 -24 -528 ) ( 952 -24 -536 ) subway/metalrib1 0 -32 90 0.500000 0.500000 0 16777216 0 +( 688 728 -496 ) ( 688 752 -496 ) ( 688 752 -504 ) subway/metalrib1 0 -32 90 0.500000 0.500000 0 16777216 0 +( 1048 904 -440 ) ( 928 904 -440 ) ( 928 904 -448 ) subway/metalrib1 0 -32 90 0.500000 0.500000 0 16777216 0 +( 680 280 -408 ) ( 680 256 -408 ) ( 680 256 -416 ) subway/metalrib1 0 -32 90 0.500000 0.500000 0 16777216 0 +} +// brush 3788 +{ +( 680 472 -432 ) ( 680 448 -432 ) ( 680 448 -440 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 1032 896 -464 ) ( 912 896 -464 ) ( 912 896 -472 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 688 720 -504 ) ( 688 744 -504 ) ( 688 744 -512 ) subway/1_tunnelwall 0 -16 0 0.500000 0.500000 0 301989888 0 +( 816 -144 -552 ) ( 936 -144 -552 ) ( 936 -144 -560 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 880 464 -496 ) ( 880 488 -496 ) ( 1000 488 -496 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +( 992 504 -520 ) ( 872 504 -520 ) ( 872 480 -520 ) subway/1_tunnelwall 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3789 +{ +( 664 -1264 -408 ) ( 640 -1264 -408 ) ( 640 -1264 -416 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 840 -1600 -440 ) ( 840 -1480 -440 ) ( 840 -1480 -448 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 496 -1272 -496 ) ( 520 -1272 -496 ) ( 520 -1272 -504 ) subway/metalrib1 0 0 90 0.500000 0.500000 0 16777216 0 +( 680 -1416 -528 ) ( 680 -1536 -528 ) ( 680 -1536 -536 ) subway/metalrib1 0 -16 90 0.500000 0.500000 0 16777216 0 +( 528 -1464 -480 ) ( 552 -1464 -480 ) ( 552 -1584 -480 ) subway/metal2 0 -16 0 0.500000 0.500000 0 16777216 0 +( 568 -1576 -496 ) ( 568 -1456 -496 ) ( 544 -1456 -496 ) subway/metal2 0 -16 0 0.500000 0.500000 0 16777216 0 +} +// brush 3790 +{ +( 916 -848 -352 ) ( 916 -840 -352 ) ( 868 -840 -352 ) subway/1_tunnel_ceiling2 80 0 0 1 1 0 16777216 0 +( 812 -992 -336 ) ( 812 -728 -336 ) ( 844 -728 -336 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 724 -952 -312 ) ( 724 -1216 -312 ) ( 724 -1216 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 916 -784 -344 ) ( 916 -784 -312 ) ( 868 -784 -312 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 788 -992 -536 ) ( 788 -992 -576 ) ( 788 -1000 -576 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +( 908 -1264 -312 ) ( 908 -1264 -344 ) ( 860 -1264 -344 ) subway/1_tunnel_ceiling2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3791 +{ +( 608 -208 -336 ) ( 608 -224 -336 ) ( 608 -224 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 616 -208 -336 ) ( 608 -208 -336 ) ( 608 -208 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 610 -226 -336 ) ( 610 -210 -336 ) ( 610 -210 -352 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 15000 +( 608 -224 -336 ) ( 616 -224 -336 ) ( 616 -224 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 608 -224 -336 ) ( 608 -208 -336 ) ( 616 -208 -336 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 616 -208 -352 ) ( 608 -208 -352 ) ( 608 -224 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3792 +{ +( 616 -448 -352 ) ( 608 -448 -352 ) ( 608 -464 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 608 -464 -336 ) ( 608 -448 -336 ) ( 616 -448 -336 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 608 -464 -336 ) ( 616 -464 -336 ) ( 616 -464 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 610 -466 -336 ) ( 610 -450 -336 ) ( 610 -450 -352 ) subway/light_red 0 0 0 0.500000 0.500000 0 16777217 15000 +( 616 -448 -336 ) ( 608 -448 -336 ) ( 608 -448 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 608 -448 -336 ) ( 608 -464 -336 ) ( 608 -464 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3793 +{ +( 472 -352 -344 ) ( 472 -432 -344 ) ( 472 -432 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 480 -360 -344 ) ( 472 -360 -344 ) ( 472 -360 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 480 -424 -344 ) ( 480 -344 -344 ) ( 480 -344 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 472 -424 -344 ) ( 480 -424 -344 ) ( 480 -424 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 472 -432 -352 ) ( 472 -352 -352 ) ( 480 -352 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 480 -352 -356 ) ( 472 -352 -356 ) ( 472 -432 -356 ) subway/1_florescent -1 0 0 0.500000 0.500000 134217728 1 9000 +} +// brush 3794 +{ +( 544 -388 -368 ) ( 544 -404 -368 ) ( 544 -404 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 134217728 318767104 0 +( 584 -388 -368 ) ( 576 -388 -368 ) ( 576 -388 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 576 -400 -368 ) ( 576 -384 -368 ) ( 576 -384 -400 ) subway/light_yellow -16 0 0 0.250000 0.250000 134217728 16777217 8000 +( 544 -396 -368 ) ( 552 -396 -368 ) ( 552 -396 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 576 -400 -392 ) ( 576 -384 -392 ) ( 584 -384 -392 ) subway/1_black 0 512 0 0.500000 0.500000 134217728 16777216 0 +( 584 -384 -400 ) ( 576 -384 -400 ) ( 576 -400 -400 ) subway/1_black 0 512 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3795 +{ +( 672 -408 -368 ) ( 672 -408 -392 ) ( 672 -440 -392 ) subway/metalrib1 16 -272 90 0.500000 0.500000 134217728 16777216 0 +( 416 -440 -392 ) ( 416 -408 -392 ) ( 416 -408 -368 ) subway/metalrib1 16 -272 90 0.500000 0.500000 134217728 16777216 0 +( 472 -416 -392 ) ( 472 -416 -368 ) ( 504 -416 -368 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -440 -368 ) ( 512 -408 -368 ) ( 544 -408 -368 ) subway/metalrib1 -255 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -408 -368 ) ( 512 -408 -392 ) ( 544 -408 -392 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -408 -384 ) ( 512 -440 -384 ) ( 544 -440 -384 ) subway/metalrib1 -255 -16 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 3796 +{ +( 512 -368 -384 ) ( 512 -400 -384 ) ( 544 -400 -384 ) subway/metalrib1 -256 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -368 -368 ) ( 512 -368 -392 ) ( 544 -368 -392 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -400 -368 ) ( 512 -368 -368 ) ( 544 -368 -368 ) subway/metalrib1 -255 -16 90 0.500000 0.500000 134217728 16777216 0 +( 472 -376 -392 ) ( 472 -376 -368 ) ( 504 -376 -368 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 416 -400 -392 ) ( 416 -368 -392 ) ( 416 -368 -368 ) subway/metalrib1 16 -272 90 0.500000 0.500000 134217728 16777216 0 +( 672 -368 -368 ) ( 672 -368 -392 ) ( 672 -400 -392 ) subway/metalrib1 16 -272 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 3797 +{ +( 376 -560 -384 ) ( 376 -632 -384 ) ( 376 -560 -392 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 416 -728 -352 ) ( 416 -728 -384 ) ( 376 -768 -384 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 24 -1056 -368 ) ( 440 -1056 -368 ) ( 440 -864 -368 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 48 -1040 -352 ) ( 200 -1040 -352 ) ( 200 -1064 -352 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 416 -144 -352 ) ( 416 -144 -368 ) ( 416 -728 -368 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 416 -144 -368 ) ( 416 -144 -352 ) ( 376 -144 -352 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3798 +{ +( 416 -144 -384 ) ( 416 -144 -368 ) ( 376 -144 -368 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 416 -144 -368 ) ( 416 -144 -384 ) ( 416 -728 -384 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 48 -1040 -368 ) ( 200 -1040 -368 ) ( 200 -1064 -368 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 24 -1056 -384 ) ( 440 -1056 -384 ) ( 440 -864 -384 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 416 -728 -368 ) ( 416 -728 -400 ) ( 376 -768 -400 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 376 -560 -400 ) ( 376 -632 -400 ) ( 376 -560 -408 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3799 +{ +( 376 -424 -400 ) ( 376 -464 -400 ) ( 376 -464 -448 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 384 -504 -448 ) ( 360 -504 -448 ) ( 360 -504 -400 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 384 -328 -384 ) ( 384 -264 -384 ) ( 384 -264 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 376 -144 -392 ) ( 384 -152 -392 ) ( 384 -152 -384 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 400 -448 -384 ) ( 368 -448 -384 ) ( 368 -408 -384 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 360 -416 -392 ) ( 360 -456 -392 ) ( 392 -456 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3800 +{ +( 544 -516 -368 ) ( 544 -532 -368 ) ( 544 -532 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 134217728 318767104 0 +( 584 -516 -368 ) ( 576 -516 -368 ) ( 576 -516 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 576 -528 -368 ) ( 576 -512 -368 ) ( 576 -512 -400 ) subway/light_yellow -16 0 0 0.250000 0.250000 134217728 16777217 8000 +( 576 -524 -368 ) ( 584 -524 -368 ) ( 584 -524 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 576 -528 -392 ) ( 576 -512 -392 ) ( 584 -512 -392 ) subway/1_black 0 256 0 0.500000 0.500000 134217728 16777216 0 +( 584 -512 -400 ) ( 576 -512 -400 ) ( 576 -528 -400 ) subway/1_black 0 256 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3801 +{ +( 544 -636 -368 ) ( 544 -652 -368 ) ( 544 -652 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 134217728 318767104 0 +( 584 -644 -368 ) ( 576 -644 -368 ) ( 576 -644 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 576 -660 -368 ) ( 576 -644 -368 ) ( 576 -644 -400 ) subway/light_yellow -16 0 0 0.250000 0.250000 134217728 16777217 8000 +( 576 -652 -368 ) ( 584 -652 -368 ) ( 584 -652 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 576 -652 -392 ) ( 576 -636 -392 ) ( 584 -636 -392 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 584 -636 -400 ) ( 576 -636 -400 ) ( 576 -652 -400 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3802 +{ +( 584 -256 -400 ) ( 576 -256 -400 ) ( 576 -272 -400 ) subway/1_black 0 768 0 0.500000 0.500000 134217728 16777216 0 +( 576 -272 -392 ) ( 576 -256 -392 ) ( 584 -256 -392 ) subway/1_black 0 768 0 0.500000 0.500000 134217728 16777216 0 +( 576 -268 -368 ) ( 584 -268 -368 ) ( 584 -268 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 576 -272 -368 ) ( 576 -256 -368 ) ( 576 -256 -400 ) subway/light_yellow -16 0 0 0.250000 0.250000 134217728 16777217 8000 +( 582 -260 -368 ) ( 574 -260 -368 ) ( 574 -260 -400 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 544 -256 -368 ) ( 544 -272 -368 ) ( 544 -272 -400 ) subway/1_tile 576 -368 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 3803 +{ +( 616 -696 -352 ) ( 608 -696 -352 ) ( 608 -712 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 608 -712 -336 ) ( 608 -696 -336 ) ( 616 -696 -336 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 608 -712 -336 ) ( 616 -712 -336 ) ( 616 -712 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 610 -714 -336 ) ( 610 -698 -336 ) ( 610 -698 -352 ) subway/light_red 16 0 0 0.500000 0.500000 0 16777217 15000 +( 616 -696 -336 ) ( 608 -696 -336 ) ( 608 -696 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 608 -696 -336 ) ( 608 -712 -336 ) ( 608 -712 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3804 +{ +( 480 -224 -356 ) ( 472 -224 -356 ) ( 472 -304 -356 ) subway/1_florescent -1 0 0 0.500000 0.500000 134217728 1 9000 +( 472 -304 -352 ) ( 472 -224 -352 ) ( 480 -224 -352 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 472 -296 -344 ) ( 480 -296 -344 ) ( 480 -296 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 480 -296 -344 ) ( 480 -216 -344 ) ( 480 -216 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 480 -232 -344 ) ( 472 -232 -344 ) ( 472 -232 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 472 -224 -344 ) ( 472 -304 -344 ) ( 472 -304 -360 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3805 +{ +( 672 -112 -296 ) ( 672 40 -296 ) ( 672 40 -320 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 416 -184 -384 ) ( 416 -184 -352 ) ( 584 -184 -352 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 104 184 -352 ) ( 104 32 -352 ) ( 80 32 -352 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 88 208 -368 ) ( 88 -208 -368 ) ( 280 -208 -368 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 416 -144 -368 ) ( 416 -144 -352 ) ( 416 -184 -352 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 416 -144 -352 ) ( 416 -144 -368 ) ( 672 -144 -368 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3806 +{ +( 672 -312 -384 ) ( 672 -312 -352 ) ( 672 -728 -352 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 672 -728 -384 ) ( 672 -728 -352 ) ( 712 -728 -352 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 320 -1056 -368 ) ( 736 -1056 -368 ) ( 736 -864 -368 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 344 -1040 -352 ) ( 496 -1040 -352 ) ( 496 -1064 -352 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 680 -584 -384 ) ( 680 -584 -352 ) ( 680 -168 -352 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 672 -144 -352 ) ( 672 -144 -384 ) ( 712 -144 -384 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3807 +{ +( 672 -952 -328 ) ( 672 -952 -304 ) ( 672 -800 -304 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 584 -728 -352 ) ( 416 -728 -352 ) ( 416 -728 -384 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 80 -944 -352 ) ( 104 -944 -352 ) ( 104 -1096 -352 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 280 -704 -368 ) ( 88 -704 -368 ) ( 88 -1120 -368 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 376 -768 -384 ) ( 416 -728 -384 ) ( 416 -728 -352 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 584 -768 -392 ) ( 512 -768 -384 ) ( 584 -768 -384 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3808 +{ +( 672 -160 -384 ) ( 688 -160 -384 ) ( 688 -144 -368 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 688 -584 -400 ) ( 688 -584 -368 ) ( 688 -168 -368 ) subway/metalrib1 0 -32 90 0.500000 0.500000 0 16777216 0 +( 352 -1040 -368 ) ( 504 -1040 -368 ) ( 504 -1064 -368 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 688 -160 -384 ) ( 672 -160 -384 ) ( 672 -744 -384 ) subway/metalrib1 0 0 0 0.500000 0.500000 0 16777216 0 +( 688 -744 -384 ) ( 672 -744 -384 ) ( 672 -760 -368 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 672 -312 -400 ) ( 672 -312 -368 ) ( 672 -728 -368 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3809 +{ +( 672 -496 -368 ) ( 672 -496 -392 ) ( 672 -528 -392 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 416 -528 -392 ) ( 416 -496 -392 ) ( 416 -496 -368 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 464 -504 -392 ) ( 464 -504 -368 ) ( 496 -504 -368 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -528 -368 ) ( 512 -496 -368 ) ( 544 -496 -368 ) subway/metalrib1 0 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -496 -368 ) ( 512 -496 -392 ) ( 544 -496 -392 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -496 -384 ) ( 512 -528 -384 ) ( 544 -528 -384 ) subway/metalrib1 0 -16 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 3810 +{ +( 512 -536 -384 ) ( 512 -568 -384 ) ( 544 -568 -384 ) subway/metalrib1 0 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -536 -368 ) ( 512 -536 -392 ) ( 544 -536 -392 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -568 -368 ) ( 512 -536 -368 ) ( 544 -536 -368 ) subway/metalrib1 0 -16 90 0.500000 0.500000 134217728 16777216 0 +( 472 -544 -392 ) ( 472 -544 -368 ) ( 504 -544 -368 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 416 -568 -392 ) ( 416 -536 -392 ) ( 416 -536 -368 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 672 -536 -368 ) ( 672 -536 -392 ) ( 672 -568 -392 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 3811 +{ +( 512 -624 -384 ) ( 512 -656 -384 ) ( 544 -656 -384 ) subway/metalrib1 255 -16 90 0.500000 0.500000 134217728 16777216 0 +( 520 -624 -368 ) ( 520 -624 -392 ) ( 552 -624 -392 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -656 -368 ) ( 512 -624 -368 ) ( 544 -624 -368 ) subway/metalrib1 256 -16 90 0.500000 0.500000 134217728 16777216 0 +( 472 -632 -392 ) ( 472 -632 -368 ) ( 504 -632 -368 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 416 -656 -392 ) ( 416 -624 -392 ) ( 416 -624 -368 ) subway/metalrib1 16 240 90 0.500000 0.500000 134217728 16777216 0 +( 672 -624 -368 ) ( 672 -624 -392 ) ( 672 -656 -392 ) subway/metalrib1 16 240 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 3812 +{ +( 672 -664 -368 ) ( 672 -664 -392 ) ( 672 -696 -392 ) subway/metalrib1 16 240 90 0.500000 0.500000 134217728 16777216 0 +( 416 -696 -392 ) ( 416 -664 -392 ) ( 416 -664 -368 ) subway/metalrib1 16 240 90 0.500000 0.500000 134217728 16777216 0 +( 408 -672 -392 ) ( 408 -672 -368 ) ( 440 -672 -368 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -696 -368 ) ( 512 -664 -368 ) ( 544 -664 -368 ) subway/metalrib1 256 -16 90 0.500000 0.500000 134217728 16777216 0 +( 432 -664 -368 ) ( 432 -664 -392 ) ( 464 -664 -392 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -664 -384 ) ( 512 -696 -384 ) ( 544 -696 -384 ) subway/metalrib1 256 -16 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 3813 +{ +( 512 -280 -384 ) ( 512 -312 -384 ) ( 544 -312 -384 ) subway/metalrib1 -255 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -280 -368 ) ( 512 -280 -392 ) ( 544 -280 -392 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -312 -368 ) ( 512 -280 -368 ) ( 544 -280 -368 ) subway/metalrib1 -255 -16 90 0.500000 0.500000 134217728 16777216 0 +( 472 -288 -392 ) ( 472 -288 -368 ) ( 504 -288 -368 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 416 -312 -392 ) ( 416 -280 -392 ) ( 416 -280 -368 ) subway/metalrib1 16 -272 90 0.500000 0.500000 134217728 16777216 0 +( 672 -280 -368 ) ( 672 -280 -392 ) ( 672 -312 -392 ) subway/metalrib1 16 -272 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 3814 +{ +( 672 -240 -368 ) ( 672 -240 -392 ) ( 672 -272 -392 ) subway/metalrib1 16 -272 90 0.500000 0.500000 134217728 16777216 0 +( 416 -272 -392 ) ( 416 -240 -392 ) ( 416 -240 -368 ) subway/metalrib1 16 -272 90 0.500000 0.500000 134217728 16777216 0 +( 472 -248 -392 ) ( 472 -248 -368 ) ( 504 -248 -368 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -272 -368 ) ( 512 -240 -368 ) ( 544 -240 -368 ) subway/metalrib1 -255 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -240 -368 ) ( 512 -240 -392 ) ( 544 -240 -392 ) subway/metalrib1 16 -16 90 0.500000 0.500000 134217728 16777216 0 +( 512 -240 -384 ) ( 512 -272 -384 ) ( 544 -272 -384 ) subway/metalrib1 -256 -16 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 3815 +{ +( 496 -736 -376 ) ( 496 -736 -344 ) ( 688 -736 -344 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 608 -776 -344 ) ( 608 -776 -376 ) ( 608 -736 -376 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 360 -704 -352 ) ( 168 -704 -352 ) ( 168 -1120 -352 ) subway/con6 0 -16 0 0.500000 0.500000 0 285212672 0 +( 160 -944 -336 ) ( 184 -944 -336 ) ( 184 -1096 -336 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 664 -728 -344 ) ( 496 -728 -344 ) ( 496 -728 -376 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 640 -952 -320 ) ( 640 -952 -296 ) ( 640 -800 -296 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3816 +{ +( 584 -768 -408 ) ( 512 -768 -400 ) ( 584 -768 -400 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 376 -768 -400 ) ( 416 -728 -400 ) ( 416 -728 -368 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 280 -704 -384 ) ( 88 -704 -384 ) ( 88 -1120 -384 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 80 -944 -368 ) ( 104 -944 -368 ) ( 104 -1096 -368 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 584 -728 -368 ) ( 416 -728 -368 ) ( 416 -728 -400 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 672 -952 -344 ) ( 672 -952 -320 ) ( 672 -800 -320 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3817 +{ +( 320 -728 -352 ) ( 320 -728 -344 ) ( 384 -728 -344 ) subway/con2 0 0 0 0.500000 0.500000 0 285212672 0 +( 608 -1496 -344 ) ( 608 -1496 -336 ) ( 608 -1432 -336 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 496 -184 -352 ) ( 496 -184 -344 ) ( 432 -184 -344 ) subway/con2 0 0 0 0.500000 0.500000 0 285212672 0 +( 416 -992 -360 ) ( 416 -992 -352 ) ( 416 -1056 -352 ) subway/con2 0 0 0 0.500000 0.500000 0 285212672 0 +( 376 -1088 -336 ) ( 376 -1152 -336 ) ( 312 -1152 -336 ) subway/con2 0 0 0 0.500000 0.500000 0 285212672 0 +( 312 -1168 -352 ) ( 376 -1168 -352 ) ( 376 -1104 -352 ) subway/con_ceil 0 48 0 0.500000 0.500000 0 16777216 0 +} +// brush 3818 +{ +( 544 -1168 -352 ) ( 608 -1168 -352 ) ( 608 -1104 -352 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 608 -1088 -336 ) ( 608 -1152 -336 ) ( 544 -1152 -336 ) subway/con2 -128 0 0 0.500000 0.500000 0 285212672 0 +( 640 -992 -352 ) ( 640 -992 -344 ) ( 640 -1056 -344 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 728 -184 -352 ) ( 728 -184 -344 ) ( 664 -184 -344 ) subway/con2 -128 0 0 0.500000 0.500000 0 285212672 0 +( 672 -1496 -352 ) ( 672 -1496 -344 ) ( 672 -1432 -344 ) subway/con2 0 0 0 0.500000 0.500000 0 285212672 0 +( 552 -728 -352 ) ( 552 -728 -344 ) ( 616 -728 -344 ) subway/con2 -128 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3819 +{ +( 416 -144 -368 ) ( 416 -144 -384 ) ( 672 -144 -384 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 416 -144 -384 ) ( 416 -144 -368 ) ( 416 -184 -368 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 88 208 -384 ) ( 88 -208 -384 ) ( 280 -208 -384 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( 104 184 -368 ) ( 104 32 -368 ) ( 80 32 -368 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 416 -184 -400 ) ( 416 -184 -368 ) ( 584 -184 -368 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +( 672 -112 -312 ) ( 672 40 -312 ) ( 672 40 -336 ) subway/1_mtrim1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3820 +{ +( 296 -488 -376 ) ( 296 -560 -376 ) ( 296 -488 -384 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 272 -696 -376 ) ( 304 -696 -376 ) ( 304 -696 -384 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 24 -984 -384 ) ( 440 -984 -384 ) ( 440 -792 -384 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 48 -968 -376 ) ( 200 -968 -376 ) ( 200 -992 -376 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 376 -1016 -264 ) ( 376 -984 -264 ) ( 376 -984 -304 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 304 -504 -296 ) ( 152 -504 -296 ) ( 152 -504 -320 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3821 +{ +( 384 -768 -480 ) ( 384 -768 -464 ) ( 416 -768 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -480 ) ( 384 -760 -464 ) ( 376 -768 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -464 ) ( 384 -760 -480 ) ( 704 -760 -480 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 672 -776 -424 ) ( 672 -744 -424 ) ( 672 -744 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 472 -784 -464 ) ( 432 -784 -464 ) ( 432 -752 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 424 -752 -480 ) ( 424 -784 -480 ) ( 464 -784 -480 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3822 +{ +( 384 -768 -448 ) ( 384 -768 -400 ) ( 424 -768 -400 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -392 ) ( 384 -760 -384 ) ( 376 -768 -384 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -384 ) ( 384 -760 -392 ) ( 704 -760 -392 ) subway/1_tile_top 0 -16 0 -0.500000 0.500000 0 318767104 0 +( 672 -776 -392 ) ( 672 -744 -392 ) ( 672 -744 -432 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 472 -776 -384 ) ( 432 -776 -384 ) ( 432 -744 -384 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 424 -752 -392 ) ( 424 -784 -392 ) ( 464 -784 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3823 +{ +( 376 -736 -464 ) ( 376 -736 -416 ) ( 376 -776 -416 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 360 -696 -416 ) ( 360 -696 -464 ) ( 384 -696 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -464 ) ( 384 -760 -392 ) ( 384 -696 -392 ) subway/1_tile -64 -368 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -392 ) ( 384 -760 -464 ) ( 376 -768 -464 ) subway/1_tile 576 -368 0 0.500000 0.500000 0 318767104 0 +( 368 -792 -392 ) ( 368 -752 -392 ) ( 400 -752 -392 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 392 -744 -464 ) ( 360 -744 -464 ) ( 360 -784 -464 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3824 +{ +( 392 -744 -480 ) ( 360 -744 -480 ) ( 360 -784 -480 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 360 -792 -464 ) ( 360 -752 -464 ) ( 392 -752 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -464 ) ( 384 -760 -480 ) ( 376 -768 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -480 ) ( 384 -760 -464 ) ( 384 -696 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 360 -696 -464 ) ( 360 -696 -480 ) ( 392 -696 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 376 -736 -480 ) ( 376 -736 -464 ) ( 376 -768 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3825 +{ +( 392 -744 -392 ) ( 360 -744 -392 ) ( 360 -784 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 368 -792 -384 ) ( 368 -752 -384 ) ( 400 -752 -384 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -384 ) ( 384 -760 -392 ) ( 376 -768 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 384 -760 -392 ) ( 384 -760 -384 ) ( 384 -696 -384 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 360 -696 -400 ) ( 360 -696 -448 ) ( 384 -696 -448 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 376 -736 -448 ) ( 376 -736 -400 ) ( 376 -776 -400 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3826 +{ +( 464 -128 -480 ) ( 424 -128 -480 ) ( 424 -160 -480 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 432 -160 -464 ) ( 432 -128 -464 ) ( 472 -128 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 672 -168 -464 ) ( 672 -168 -424 ) ( 672 -136 -424 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 672 -152 -480 ) ( 352 -152 -480 ) ( 352 -152 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 376 -144 -464 ) ( 384 -152 -464 ) ( 384 -152 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 448 -144 -464 ) ( 416 -144 -464 ) ( 416 -144 -480 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3827 +{ +( 464 -128 -392 ) ( 424 -128 -392 ) ( 424 -160 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 432 -168 -384 ) ( 432 -136 -384 ) ( 472 -136 -384 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 672 -168 -432 ) ( 672 -168 -392 ) ( 672 -136 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 672 -152 -392 ) ( 352 -152 -392 ) ( 352 -152 -384 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 376 -144 -384 ) ( 384 -152 -384 ) ( 384 -152 -392 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 456 -144 -400 ) ( 416 -144 -400 ) ( 416 -144 -448 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3828 +{ +( 136 -504 -480 ) ( 136 -536 -480 ) ( 176 -536 -480 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 184 -536 -464 ) ( 144 -536 -464 ) ( 144 -504 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 416 -528 -424 ) ( 416 -496 -424 ) ( 416 -496 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 392 -504 -464 ) ( 352 -504 -464 ) ( 352 -504 -480 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 320 -536 -480 ) ( 352 -504 -480 ) ( 352 -504 -464 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 368 -536 -424 ) ( 408 -536 -424 ) ( 408 -536 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3829 +{ +( 376 -664 -464 ) ( 376 -664 -424 ) ( 336 -664 -424 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 352 -696 -464 ) ( 352 -696 -480 ) ( 320 -664 -480 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 352 -696 -480 ) ( 352 -696 -464 ) ( 392 -696 -464 ) subway/1_tile_bottom -64 -416 0 0.500000 0.500000 0 318767104 0 +( 416 -704 -464 ) ( 416 -704 -424 ) ( 416 -672 -424 ) subway/1_tile_bottom 576 -416 0 0.500000 0.500000 0 318767104 0 +( 144 -696 -464 ) ( 144 -664 -464 ) ( 184 -664 -464 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +( 176 -664 -480 ) ( 136 -664 -480 ) ( 136 -696 -480 ) subway/1_tile_bottom 576 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3830 +{ +( 152 -1192 -488 ) ( 216 -1192 -488 ) ( 216 -1128 -488 ) subway/1_lobby_floor 448 -880 0 0.500000 0.500000 0 285212672 0 +( 216 -1096 -480 ) ( 216 -1160 -480 ) ( 152 -1160 -480 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 328 -960 -496 ) ( 328 -960 -488 ) ( 328 -1024 -488 ) subway/1_stair_side1 328 -368 0 0.500000 0.500000 0 285212672 0 +( 352 -504 -488 ) ( 352 -504 -480 ) ( 288 -504 -480 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 0 285212672 0 +( 384 -1512 -488 ) ( 384 -1512 -480 ) ( 384 -1448 -480 ) subway/1_stair_side1 840 -368 0 0.500000 0.500000 0 285212672 0 +( 152 -696 -488 ) ( 152 -696 -480 ) ( 216 -696 -480 ) subway/1_lobby_floor 624 -352 0 0.500000 0.500000 0 285212672 0 +} +// brush 3831 +{ +( 640 -400 -320 ) ( 640 -400 -296 ) ( 640 -248 -296 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 664 -176 -344 ) ( 496 -176 -344 ) ( 496 -176 -376 ) subway/con2 0 0 0 0.500000 0.500000 0 285212672 0 +( 160 -392 -336 ) ( 184 -392 -336 ) ( 184 -544 -336 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 360 -152 -352 ) ( 168 -152 -352 ) ( 168 -568 -352 ) subway/con6 0 -16 0 0.500000 0.500000 0 285212672 0 +( 608 -224 -344 ) ( 608 -224 -376 ) ( 608 -184 -376 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 496 -184 -376 ) ( 496 -184 -344 ) ( 688 -184 -344 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3832 +{ +( 176 -672 -400 ) ( 136 -672 -400 ) ( 136 -704 -400 ) subway/1_tile_middle 576 80 0 0.500000 0.500000 0 318767104 0 +( 224 -696 -384 ) ( 184 -696 -384 ) ( 184 -640 -384 ) subway/1_tile 576 -144 0 0.500000 0.500000 0 318767104 0 +( 416 -696 -384 ) ( 416 -696 -344 ) ( 416 -664 -344 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 344 -696 -400 ) ( 344 -696 -384 ) ( 392 -696 -384 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( 352 -696 -384 ) ( 352 -696 -400 ) ( 312 -656 -400 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( 224 -640 -384 ) ( 184 -640 -384 ) ( 184 -656 -400 ) subway/1_tile_middle -40 32 0 -0.500000 0.500000 0 318767104 0 +} +// brush 3833 +{ +( 424 -656 -400 ) ( 384 -656 -400 ) ( 384 -664 -416 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 352 -696 -400 ) ( 352 -696 -416 ) ( 320 -664 -416 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 352 -696 -416 ) ( 352 -696 -400 ) ( 400 -696 -400 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 416 -696 -424 ) ( 416 -696 -384 ) ( 416 -664 -384 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 224 -696 -400 ) ( 184 -696 -400 ) ( 184 -656 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 176 -664 -416 ) ( 136 -664 -416 ) ( 136 -696 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3834 +{ +( 8 -872 -304 ) ( 8 -904 -304 ) ( 8 -904 -312 ) subway/1_black -752 -240 0 0.500000 0.500000 134217728 16777216 0 +( 64 -880 -304 ) ( -8 -880 -304 ) ( -8 -880 -312 ) subway/1_black -752 -240 0 0.500000 0.500000 134217728 16777216 0 +( 52 -904 -304 ) ( 52 -872 -304 ) ( 52 -872 -312 ) subway/1_black -752 -240 0 0.500000 0.500000 134217728 16777216 0 +( -8 -896 -304 ) ( 64 -896 -304 ) ( 64 -896 -312 ) subway/1_black -752 -240 0 0.500000 0.500000 134217728 16777216 0 +( -8 -904 -304 ) ( -8 -872 -304 ) ( 64 -872 -304 ) subway/light_tube -80 16 0 0.500000 0.500000 134217728 16777217 30000 +( 64 -872 -308 ) ( -8 -872 -308 ) ( -8 -904 -308 ) subway/light_tube -16 0 0 0.500000 0.500000 134217728 16777217 3500 +} +// brush 3835 +{ +( 512 -728 -336 ) ( 512 -728 -328 ) ( 576 -728 -328 ) subway/con2_pipe1 -128 16 0 0.500000 0.500000 0 536870912 0 +( 640 -1504 -336 ) ( 640 -1504 -328 ) ( 640 -1440 -328 ) subway/con2_pipe1 0 16 0 0.500000 0.500000 0 536870912 0 +( 696 -152 -336 ) ( 696 -152 -328 ) ( 632 -152 -328 ) subway/con2_pipe1 -128 16 0 0.500000 0.500000 0 536870912 0 +( 608 -992 -344 ) ( 608 -992 -336 ) ( 608 -1056 -336 ) subway/con2_pipe1 0 16 0 0.500000 0.500000 0 536870912 0 +( 568 -1088 -328 ) ( 568 -1152 -328 ) ( 504 -1152 -328 ) subway/con2_pipe1 -128 0 0 0.500000 0.500000 0 536870912 0 +( 504 -1168 -336 ) ( 568 -1168 -336 ) ( 568 -1104 -336 ) subway/con2_pipe1 -128 0 0 0.500000 0.500000 0 536870912 0 +} +// brush 3836 +{ +( 0 -976 -448 ) ( 0 -976 -440 ) ( 0 -912 -440 ) subway/1_stair_side1 616 -448 0 0.500000 0.500000 0 285212672 0 +( 880 -568 -448 ) ( 880 -568 -440 ) ( 816 -568 -440 ) subway/1_stair_side1 840 -432 0 0.500000 0.500000 0 285212672 0 +( -128 -784 -448 ) ( -128 -784 -440 ) ( -128 -848 -440 ) subway/1_lobby_floor 432 -416 0 0.500000 0.500000 0 285212672 0 +( 32 -728 -456 ) ( 32 -728 -448 ) ( 96 -728 -448 ) subway/1_stair_side1 328 -432 0 0.500000 0.500000 0 285212672 0 +( 456 -896 -440 ) ( 520 -896 -440 ) ( 520 -960 -440 ) subway/1_concrete_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 -960 -448 ) ( 536 -896 -448 ) ( 472 -896 -448 ) subway/1_lobby_floor 448 -688 0 0.500000 0.500000 0 285212672 0 +} +// brush 3837 +{ +( -296 -832 -384 ) ( -296 -832 -344 ) ( -296 -872 -344 ) subway/1_tile_bottom 80 -416 0 0.500000 0.500000 0 318767104 0 +( -96 -984 -384 ) ( -96 -984 -344 ) ( -64 -984 -344 ) subway/1_tile_bottom 368 -416 0 0.500000 0.500000 0 318767104 0 +( 128 -936 -384 ) ( 128 -936 -344 ) ( 128 -896 -344 ) subway/1_tile_bottom 80 -416 0 0.500000 0.500000 0 318767104 0 +( -76 -952 -384 ) ( -76 -952 -344 ) ( -108 -952 -344 ) subway/1_tile_bottom 64 64 0 -0.500000 0.500000 0 318767104 0 +( -64 -1024 -384 ) ( -96 -1024 -384 ) ( -96 -984 -384 ) subway/1_tile_bottom 368 -128 0 0.500000 0.500000 0 318767104 0 +( -96 -992 -400 ) ( -96 -1032 -400 ) ( -64 -1032 -400 ) subway/1_tile_bottom 368 -128 0 0.500000 0.500000 0 318767104 0 +} +// brush 3838 +{ +( 136 -504 -416 ) ( 136 -536 -416 ) ( 176 -536 -416 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 184 -544 -400 ) ( 184 -504 -400 ) ( 224 -504 -400 ) subway/1_tile 576 64 0 0.500000 0.500000 0 318767104 0 +( 416 -536 -384 ) ( 416 -504 -384 ) ( 416 -504 -424 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 400 -504 -400 ) ( 352 -504 -400 ) ( 352 -504 -416 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +( 320 -536 -416 ) ( 352 -504 -416 ) ( 352 -504 -400 ) subway/1_tile 576 -320 0 0.500000 0.500000 0 318767104 0 +( 408 -536 -416 ) ( 408 -544 -400 ) ( 448 -544 -400 ) subway/1_tile -64 -320 0 0.500000 0.500000 0 318767104 0 +} +// brush 3839 +{ +( 176 -544 -400 ) ( 176 -560 -384 ) ( 216 -560 -384 ) subway/1_tile_middle -40 32 0 -0.500000 0.500000 0 318767104 0 +( 312 -544 -400 ) ( 352 -504 -400 ) ( 352 -504 -384 ) subway/1_tile_middle -144 32 0 0.500000 0.500000 0 318767104 0 +( 392 -504 -384 ) ( 344 -504 -384 ) ( 344 -504 -400 ) subway/1_tile_middle -64 -320 0 0.500000 0.500000 0 318767104 0 +( 416 -536 -344 ) ( 416 -504 -344 ) ( 416 -504 -384 ) subway/1_tile_middle 576 -320 0 0.500000 0.500000 0 318767104 0 +( 184 -560 -384 ) ( 184 -504 -384 ) ( 224 -504 -384 ) subway/1_tile 576 -144 0 0.500000 0.500000 0 318767104 0 +( 136 -496 -400 ) ( 136 -528 -400 ) ( 176 -528 -400 ) subway/1_tile_middle 576 80 0 0.500000 0.500000 0 318767104 0 +} +// brush 3840 +{ +( -304 -872 -304 ) ( -304 -904 -304 ) ( -304 -904 -312 ) subway/1_black -104 -240 0 0.500000 0.500000 134217728 16777216 0 +( -248 -880 -304 ) ( -320 -880 -304 ) ( -320 -880 -312 ) subway/1_black -104 -240 0 0.500000 0.500000 134217728 16777216 0 +( -260 -904 -304 ) ( -260 -872 -304 ) ( -260 -872 -312 ) subway/1_black -104 -240 0 0.500000 0.500000 134217728 16777216 0 +( -320 -896 -304 ) ( -248 -896 -304 ) ( -248 -896 -312 ) subway/1_black -104 -240 0 0.500000 0.500000 134217728 16777216 0 +( -320 -904 -304 ) ( -320 -872 -304 ) ( -248 -872 -304 ) subway/light_tube 0 16 0 0.500000 0.500000 134217728 16777217 30000 +( -248 -872 -308 ) ( -320 -872 -308 ) ( -320 -904 -308 ) subway/light_tube 96 0 0 0.500000 0.500000 134217728 16777217 3500 +} +// brush 3841 +{ +( -448 -872 -344 ) ( -448 -832 -344 ) ( -448 -832 -384 ) subway/1_tile_bottom 80 -416 0 0.500000 0.500000 0 318767104 0 +( -480 -984 -344 ) ( -448 -984 -344 ) ( -448 -984 -384 ) subway/1_tile_bottom 672 -416 0 0.500000 0.500000 0 318767104 0 +( -480 -904 -344 ) ( -480 -944 -344 ) ( -480 -944 -384 ) subway/1_tile_bottom 80 -416 0 0.500000 0.500000 0 318767104 0 +( -436 -892 -344 ) ( -468 -892 -344 ) ( -468 -892 -384 ) subway/1_tile_bottom 672 -416 0 0.500000 0.500000 0 318767104 0 +( -448 -984 -384 ) ( -448 -1024 -384 ) ( -480 -1024 -384 ) subway/1_tile_bottom 672 -128 0 0.500000 0.500000 0 318767104 0 +( -480 -1032 -400 ) ( -448 -1032 -400 ) ( -448 -992 -400 ) subway/1_tile_bottom 672 -128 0 0.500000 0.500000 0 318767104 0 +} +// brush 3842 +{ +( -364 -772 -304 ) ( -380 -772 -320 ) ( -428 -868 -320 ) subway/1_tile_middle -21 -21 64 0.500000 0.500000 0 318767104 0 +( -476 -892 -304 ) ( -420 -892 -304 ) ( -436 -892 -320 ) subway/1_tile_middle -72 32 0 0.500000 0.500000 0 318767104 0 +( -420 -772 -320 ) ( -420 -772 -304 ) ( -468 -868 -304 ) subway/1_tile_middle -24 -320 0 0.500000 0.500000 0 318767104 0 +( -388 -772 -264 ) ( -420 -772 -264 ) ( -420 -772 -304 ) subway/1_tile_middle 648 -320 0 0.500000 0.500000 0 318767104 0 +( -420 -772 -304 ) ( -364 -772 -304 ) ( -412 -868 -304 ) subway/1_tile 648 -184 0 0.500000 0.500000 0 318767104 0 +( -380 -772 -320 ) ( -420 -772 -320 ) ( -468 -868 -320 ) subway/1_tile_middle 648 40 0 0.500000 0.500000 0 318767104 0 +( -468 -804 0 ) ( -412 -860 0 ) ( -412 -860 10 ) subway/1_tile_middle 24 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3843 +{ +( -380 -756 -384 ) ( -380 -756 -400 ) ( -436 -868 -400 ) subway/1_tile_bottom -72 -416 0 0.500000 0.500000 0 318767104 0 +( -476 -892 -344 ) ( -444 -892 -344 ) ( -444 -892 -384 ) subway/1_tile_bottom 648 -416 0 0.500000 0.500000 0 318767104 0 +( -412 -756 -400 ) ( -412 -756 -384 ) ( -468 -868 -384 ) subway/1_tile_bottom -72 -416 0 0.500000 0.500000 0 318767104 0 +( -380 -756 -344 ) ( -412 -756 -344 ) ( -412 -756 -384 ) subway/1_tile_bottom 648 -416 0 0.500000 0.500000 0 318767104 0 +( -412 -756 -384 ) ( -380 -756 -384 ) ( -436 -868 -384 ) subway/1_tile_bottom 648 24 0 0.500000 0.500000 0 318767104 0 +( -380 -756 -400 ) ( -412 -756 -400 ) ( -468 -868 -400 ) subway/1_tile_bottom 648 24 0 0.500000 0.500000 0 318767104 0 +( -468 -804 0 ) ( -412 -860 0 ) ( -412 -860 10 ) subway/1_tile_middle 24 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3844 +{ +( -388 -772 -336 ) ( -420 -772 -336 ) ( -468 -868 -336 ) subway/1_tile 648 40 0 0.500000 0.500000 0 318767104 0 +( -420 -772 -320 ) ( -380 -772 -320 ) ( -428 -868 -320 ) subway/1_tile 648 40 0 0.500000 0.500000 0 318767104 0 +( -388 -772 -304 ) ( -420 -772 -304 ) ( -420 -772 -344 ) subway/1_tile 648 -320 0 0.500000 0.500000 0 318767104 0 +( -420 -772 -336 ) ( -420 -772 -320 ) ( -468 -868 -320 ) subway/1_tile -40 -320 0 0.500000 0.500000 0 318767104 0 +( -484 -892 -320 ) ( -444 -892 -320 ) ( -452 -892 -336 ) subway/1_tile 648 -320 0 0.500000 0.500000 0 318767104 0 +( -380 -772 -320 ) ( -388 -772 -336 ) ( -436 -868 -336 ) subway/1_tile -40 -320 0 0.500000 0.500000 0 318767104 0 +( -468 -804 0 ) ( -372 -900 0 ) ( -372 -900 10 ) subway/1_tile_middle 24 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3845 +{ +( -468 -804 0 ) ( -372 -900 0 ) ( -372 -900 10 ) subway/1_tile_middle 24 32 0 0.500000 0.500000 0 318767104 0 +( -396 -788 -384 ) ( -428 -788 -384 ) ( -468 -868 -384 ) subway/1_tile 648 152 0 0.500000 0.500000 0 318767104 0 +( -428 -788 -336 ) ( -396 -788 -336 ) ( -436 -868 -336 ) subway/1_tile 648 152 0 0.500000 0.500000 0 318767104 0 +( -396 -788 -320 ) ( -428 -788 -320 ) ( -428 -788 -360 ) subway/1_tile 648 -368 0 0.500000 0.500000 0 318767104 0 +( -428 -788 -384 ) ( -428 -788 -336 ) ( -468 -868 -336 ) subway/1_tile -152 -368 0 0.500000 0.500000 0 318767104 0 +( -484 -892 -328 ) ( -452 -892 -328 ) ( -452 -892 -368 ) subway/1_tile 648 -368 0 0.500000 0.500000 0 318767104 0 +( -396 -788 -336 ) ( -396 -788 -384 ) ( -436 -868 -384 ) subway/1_tile -152 -368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3846 +{ +( -412 -860 10 ) ( -412 -860 0 ) ( -468 -804 0 ) subway/1_tile_middle -56 32 0 0.500000 0.500000 0 318767104 0 +( -404 -804 -320 ) ( -500 -852 -320 ) ( -500 -892 -320 ) subway/1_tile_middle 584 120 0 0.500000 0.500000 0 318767104 0 +( -404 -860 -304 ) ( -500 -908 -304 ) ( -500 -852 -304 ) subway/1_tile 584 -104 0 0.500000 0.500000 0 318767104 0 +( -500 -852 -304 ) ( -500 -852 -264 ) ( -500 -884 -264 ) subway/1_tile_middle 640 -320 0 0.500000 0.500000 0 318767104 0 +( -404 -804 -304 ) ( -500 -852 -304 ) ( -500 -852 -320 ) subway/1_tile_middle -160 -320 0 0.500000 0.500000 0 318767104 0 +( -380 -836 -320 ) ( -380 -852 -304 ) ( -380 -796 -304 ) subway/1_tile_middle -80 32 0 0.500000 0.500000 0 318767104 0 +( -404 -844 -320 ) ( -500 -892 -320 ) ( -500 -908 -304 ) subway/1_tile_middle -43 23 26 0.500000 0.500000 0 318767104 0 +} +// brush 3847 +{ +( -412 -860 10 ) ( -412 -860 0 ) ( -468 -804 0 ) subway/1_tile_middle -56 32 0 0.500000 0.500000 0 318767104 0 +( -404 -804 -400 ) ( -516 -860 -400 ) ( -516 -892 -400 ) subway/1_tile_bottom 584 104 0 0.500000 0.500000 0 318767104 0 +( -404 -836 -384 ) ( -516 -892 -384 ) ( -516 -860 -384 ) subway/1_tile_bottom 584 104 0 0.500000 0.500000 0 318767104 0 +( -516 -860 -384 ) ( -516 -860 -344 ) ( -516 -892 -344 ) subway/1_tile_bottom 640 -416 0 0.500000 0.500000 0 318767104 0 +( -404 -804 -384 ) ( -516 -860 -384 ) ( -516 -860 -400 ) subway/1_tile_bottom -208 -416 0 0.500000 0.500000 0 318767104 0 +( -380 -828 -384 ) ( -380 -828 -344 ) ( -380 -796 -344 ) subway/1_tile_bottom 640 -416 0 0.500000 0.500000 0 318767104 0 +( -404 -836 -400 ) ( -516 -892 -400 ) ( -516 -892 -384 ) subway/1_tile_bottom -208 -416 0 0.500000 0.500000 0 318767104 0 +} +// brush 3848 +{ +( -404 -836 -384 ) ( -484 -876 -384 ) ( -484 -876 -336 ) subway/1_tile -288 -368 0 0.500000 0.500000 0 318767104 0 +( -380 -820 -368 ) ( -380 -820 -328 ) ( -380 -788 -328 ) subway/1_tile 640 -368 0 0.500000 0.500000 0 318767104 0 +( -404 -804 -336 ) ( -484 -844 -336 ) ( -484 -844 -384 ) subway/1_tile -288 -368 0 0.500000 0.500000 0 318767104 0 +( -484 -844 -360 ) ( -484 -844 -320 ) ( -484 -876 -320 ) subway/1_tile 640 -368 0 0.500000 0.500000 0 318767104 0 +( -404 -836 -336 ) ( -484 -876 -336 ) ( -484 -844 -336 ) subway/1_tile 584 232 0 0.500000 0.500000 0 318767104 0 +( -404 -804 -384 ) ( -484 -844 -384 ) ( -484 -876 -384 ) subway/1_tile 584 232 0 0.500000 0.500000 0 318767104 0 +( -372 -900 10 ) ( -372 -900 0 ) ( -468 -804 0 ) subway/1_tile_middle -56 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3849 +{ +( -372 -900 10 ) ( -372 -900 0 ) ( -468 -804 0 ) subway/1_tile_middle -56 32 0 0.500000 0.500000 0 318767104 0 +( -404 -836 -336 ) ( -500 -884 -336 ) ( -500 -892 -320 ) subway/1_tile -176 -320 0 0.500000 0.500000 0 318767104 0 +( -380 -820 -336 ) ( -380 -828 -320 ) ( -380 -788 -320 ) subway/1_tile 640 -320 0 0.500000 0.500000 0 318767104 0 +( -404 -804 -320 ) ( -500 -852 -320 ) ( -500 -852 -336 ) subway/1_tile -176 -320 0 0.500000 0.500000 0 318767104 0 +( -500 -852 -344 ) ( -500 -852 -304 ) ( -500 -884 -304 ) subway/1_tile 640 -320 0 0.500000 0.500000 0 318767104 0 +( -404 -844 -320 ) ( -500 -892 -320 ) ( -500 -852 -320 ) subway/1_tile 584 120 0 0.500000 0.500000 0 318767104 0 +( -404 -804 -336 ) ( -500 -852 -336 ) ( -500 -884 -336 ) subway/1_tile 584 120 0 0.500000 0.500000 0 318767104 0 +} +// brush 3850 +{ +( -448 -1256 -272 ) ( -448 -1216 -272 ) ( -448 -1216 -312 ) subway/1_tile_bottom 544 -272 0 0.500000 0.500000 0 318767104 0 +( -480 -1216 -272 ) ( -448 -1216 -272 ) ( -448 -1216 -312 ) subway/1_tile_bottom 688 -272 0 0.500000 0.500000 0 318767104 0 +( -480 -1136 -272 ) ( -480 -1176 -272 ) ( -480 -1176 -312 ) subway/1_tile_bottom 544 -272 0 0.500000 0.500000 0 318767104 0 +( -448 -1176 -272 ) ( -480 -1176 -272 ) ( -480 -1176 -312 ) subway/1_tile_bottom 688 -272 0 0.500000 0.500000 0 318767104 0 +( -448 -1216 -312 ) ( -448 -1256 -312 ) ( -480 -1256 -312 ) subway/1_tile_bottom 688 -592 0 0.500000 0.500000 0 318767104 0 +( -480 -1264 -328 ) ( -448 -1264 -328 ) ( -448 -1224 -328 ) subway/1_tile_bottom 688 -592 0 0.500000 0.500000 0 318767104 0 +} +// brush 3851 +{ +( -448 -1256 -232 ) ( -448 -1216 -232 ) ( -448 -1216 -272 ) subway/1_tile 544 -224 0 0.500000 0.500000 0 318767104 0 +( -480 -1216 -256 ) ( -448 -1216 -256 ) ( -448 -1216 -296 ) subway/1_tile 688 -224 0 0.500000 0.500000 0 318767104 0 +( -480 -1136 -248 ) ( -480 -1176 -248 ) ( -480 -1176 -288 ) subway/1_tile 544 -224 0 0.500000 0.500000 0 318767104 0 +( -448 -1176 -256 ) ( -480 -1176 -256 ) ( -480 -1176 -296 ) subway/1_tile 688 -224 0 0.500000 0.500000 0 318767104 0 +( -456 -1216 -272 ) ( -456 -1256 -272 ) ( -488 -1256 -272 ) subway/1_tile 688 -544 0 0.500000 0.500000 0 318767104 0 +( -480 -1264 -312 ) ( -448 -1264 -312 ) ( -448 -1224 -312 ) subway/1_tile 688 -544 0 0.500000 0.500000 0 318767104 0 +} +// brush 3852 +{ +( 536 -1632 -336 ) ( 536 -1568 -336 ) ( 472 -1568 -336 ) subway/1_lobby_floor 448 -1712 0 0.500000 0.500000 0 285212672 0 +( 456 -1568 -328 ) ( 520 -1568 -328 ) ( 520 -1632 -328 ) subway/1_lobby_floor 448 -1712 0 0.500000 0.500000 0 285212672 0 +( 304 -1400 -344 ) ( 304 -1400 -336 ) ( 368 -1400 -336 ) subway/1_stair_side1 328 -224 0 0.500000 0.500000 0 285212672 0 +( -496 -1448 -336 ) ( -496 -1448 -328 ) ( -496 -1512 -328 ) subway/1_lobby_floor 1456 -208 0 0.500000 0.500000 0 285212672 0 +( 864 -1176 -336 ) ( 864 -1176 -328 ) ( 800 -1176 -328 ) subway/1_stair_side1 840 -224 0 0.500000 0.500000 0 285212672 0 +( 128 -1632 -336 ) ( 128 -1632 -328 ) ( 128 -1568 -328 ) subway/1_lobby_floor 1456 -208 0 0.500000 0.500000 0 285212672 0 +} +// brush 3853 +{ +( -376 -1016 -256 ) ( -376 -984 -256 ) ( -416 -984 -256 ) subway/1_tile_middle 0 -192 0 0.500000 0.500000 0 318767104 0 +( -464 -976 -232 ) ( -312 -976 -232 ) ( -312 -1000 -232 ) subway/1_tile_middle 0 -192 0 0.500000 0.500000 0 318767104 0 +( -464 -968 -160 ) ( -464 -1000 -160 ) ( -464 -1000 -200 ) subway/1_tile_middle 0 -192 0 0.500000 0.500000 0 318767104 0 +( -448 -984 -160 ) ( -408 -984 -160 ) ( -408 -984 -200 ) subway/1_tile_middle 0 -192 0 0.500000 0.500000 0 318767104 0 +( -272 -1024 -160 ) ( -272 -992 -160 ) ( -272 -992 -200 ) subway/1_tile_middle 0 -192 0 0.500000 0.500000 0 318767104 0 +( -272 -976 -192 ) ( -424 -976 -192 ) ( -424 -976 -216 ) subway/1_tile_middle 0 -192 0 0.500000 0.500000 0 318767104 0 +} +// brush 3854 +{ +( 400 -984 -256 ) ( 400 -1008 -264 ) ( 410 -1008 -264 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 400 -1008 -240 ) ( 400 -984 -232 ) ( 410 -984 -232 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 112 -984 -228 ) ( 112 -988 -228 ) ( 104 -988 -228 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 112 -984 -256 ) ( 112 -984 -232 ) ( 104 -984 -232 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 112 -988 -260 ) ( 112 -984 -260 ) ( 104 -984 -260 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 112 -988 -232 ) ( 112 -988 -256 ) ( 104 -988 -256 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 110 -988 -232 ) ( 110 -984 -232 ) ( 110 -984 -256 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 106 -984 -256 ) ( 106 -984 -232 ) ( 106 -988 -232 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3855 +{ +( 400 -1072 -296 ) ( 400 -1072 -248 ) ( 410 -1072 -248 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 112 -1176 -296 ) ( 104 -1176 -296 ) ( 104 -984 -232 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 104 -988 -256 ) ( 112 -988 -256 ) ( 112 -988 -224 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 112 -984 -256 ) ( 104 -984 -256 ) ( 104 -1176 -320 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 104 -1172 -288 ) ( 112 -1172 -288 ) ( 112 -1172 -320 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 110 -1032 -224 ) ( 110 -984 -224 ) ( 110 -984 -256 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 106 -984 -256 ) ( 106 -984 -224 ) ( 106 -1032 -224 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 3856 +{ +( -178 -1032 -248 ) ( -168 -1032 -248 ) ( -168 -1080 -264 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -178 -1080 -288 ) ( -168 -1080 -288 ) ( -168 -1056 -280 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( 112 -1072 -288 ) ( 104 -1072 -288 ) ( 104 -1076 -288 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( 112 -1076 -292 ) ( 104 -1076 -292 ) ( 104 -1076 -256 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( 112 -1076 -260 ) ( 104 -1076 -260 ) ( 104 -1072 -260 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( 112 -1072 -252 ) ( 104 -1072 -252 ) ( 104 -1072 -288 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( 106 -1076 -256 ) ( 106 -1076 -292 ) ( 106 -1072 -292 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( 110 -1072 -292 ) ( 110 -1076 -292 ) ( 110 -1076 -256 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3857 +{ +( 400 -1152 -312 ) ( 400 -1176 -320 ) ( 410 -1176 -320 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 400 -1176 -296 ) ( 400 -1152 -288 ) ( 410 -1152 -288 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 112 -1172 -292 ) ( 112 -1176 -292 ) ( 104 -1176 -292 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 112 -1172 -324 ) ( 112 -1172 -292 ) ( 104 -1172 -292 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 112 -1176 -324 ) ( 112 -1172 -324 ) ( 104 -1172 -324 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 112 -1176 -292 ) ( 112 -1176 -324 ) ( 104 -1176 -324 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 110 -1176 -292 ) ( 110 -1172 -292 ) ( 110 -1172 -324 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 106 -1172 -324 ) ( 106 -1172 -292 ) ( 106 -1176 -292 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3858 +{ +( 400 -1076 -260 ) ( 400 -1076 -300 ) ( 410 -1076 -300 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 106 -984 -256 ) ( 106 -984 -224 ) ( 106 -1032 -224 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 110 -1032 -224 ) ( 110 -984 -224 ) ( 110 -984 -256 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 104 -1172 -288 ) ( 112 -1172 -288 ) ( 112 -1172 -320 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 112 -984 -256 ) ( 104 -984 -256 ) ( 104 -1176 -320 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 104 -988 -256 ) ( 112 -988 -256 ) ( 112 -988 -224 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 112 -1176 -296 ) ( 104 -1176 -296 ) ( 104 -984 -232 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 3859 +{ +( 112 -1176 -292 ) ( 104 -1176 -292 ) ( 104 -984 -228 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 104 -984 -232 ) ( 112 -984 -232 ) ( 112 -984 -200 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 112 -984 -232 ) ( 104 -984 -232 ) ( 104 -1176 -296 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 104 -1176 -264 ) ( 112 -1176 -264 ) ( 112 -1176 -296 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 112 -1032 -200 ) ( 112 -984 -200 ) ( 112 -984 -232 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 104 -984 -232 ) ( 104 -984 -200 ) ( 104 -1032 -200 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 3860 +{ +( 536 -560 -328 ) ( 472 -560 -328 ) ( 472 -624 -328 ) subway/metal_rust 456 -704 0 0.500000 0.500000 0 16777216 0 +( 104 -984 -256 ) ( 112 -984 -256 ) ( 112 -1080 -288 ) subway/metal_rust 456 -704 0 0.500000 0.500000 0 16777216 0 +( 112 -792 -304 ) ( 112 -792 -296 ) ( 112 -728 -296 ) subway/metal_rust 256 -104 0 0.500000 0.500000 0 16777216 0 +( 344 -1176 -304 ) ( 344 -1176 -296 ) ( 408 -1176 -296 ) subway/metal_rust 408 -56 0 0.500000 0.500000 0 16777216 0 +( 104 -184 -296 ) ( 104 -184 -288 ) ( 104 -248 -288 ) subway/metal_rust 256 -104 0 0.500000 0.500000 0 16777216 0 +( 112 -984 -256 ) ( 104 -984 -256 ) ( 104 -984 -296 ) subway/metal_rust 408 -56 0 0.500000 0.500000 0 16777216 0 +} +// brush 3861 +{ +( 232 -1076 -260 ) ( 232 -1076 -300 ) ( 242 -1076 -300 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -62 -984 -256 ) ( -62 -984 -224 ) ( -62 -1032 -224 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -58 -1032 -224 ) ( -58 -984 -224 ) ( -58 -984 -256 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -64 -1172 -288 ) ( -56 -1172 -288 ) ( -56 -1172 -320 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -56 -984 -256 ) ( -64 -984 -256 ) ( -64 -1176 -320 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -64 -988 -256 ) ( -56 -988 -256 ) ( -56 -988 -224 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -56 -1176 -296 ) ( -64 -1176 -296 ) ( -64 -984 -232 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 3862 +{ +( 232 -1152 -312 ) ( 232 -1176 -320 ) ( 242 -1176 -320 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 232 -1176 -296 ) ( 232 -1152 -288 ) ( 242 -1152 -288 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -56 -1172 -292 ) ( -56 -1176 -292 ) ( -64 -1176 -292 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -56 -1172 -324 ) ( -56 -1172 -292 ) ( -64 -1172 -292 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -56 -1176 -324 ) ( -56 -1172 -324 ) ( -64 -1172 -324 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -56 -1176 -292 ) ( -56 -1176 -324 ) ( -64 -1176 -324 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -58 -1176 -292 ) ( -58 -1172 -292 ) ( -58 -1172 -324 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -62 -1172 -324 ) ( -62 -1172 -292 ) ( -62 -1176 -292 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3863 +{ +( 368 -560 -328 ) ( 304 -560 -328 ) ( 304 -624 -328 ) subway/metal_rust 792 -704 0 0.500000 0.500000 134217728 16777216 0 +( -64 -984 -256 ) ( -56 -984 -256 ) ( -56 -1080 -288 ) subway/metal_rust 792 -704 0 0.500000 0.500000 134217728 16777216 0 +( -56 -792 -304 ) ( -56 -792 -296 ) ( -56 -728 -296 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( 176 -1176 -304 ) ( 176 -1176 -296 ) ( 240 -1176 -296 ) subway/metal_rust 744 -56 0 0.500000 0.500000 134217728 16777216 0 +( -64 -184 -296 ) ( -64 -184 -288 ) ( -64 -248 -288 ) subway/metal_rust 256 -104 0 0.500000 0.500000 134217728 16777216 0 +( -56 -984 -256 ) ( -64 -984 -256 ) ( -64 -984 -296 ) subway/metal_rust 744 -56 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3864 +{ +( -56 -1176 -292 ) ( -64 -1176 -292 ) ( -64 -984 -228 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -64 -984 -232 ) ( -56 -984 -232 ) ( -56 -984 -200 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -56 -984 -232 ) ( -64 -984 -232 ) ( -64 -1176 -296 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -64 -1176 -264 ) ( -56 -1176 -264 ) ( -56 -1176 -296 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -56 -1032 -200 ) ( -56 -984 -200 ) ( -56 -984 -232 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -64 -984 -232 ) ( -64 -984 -200 ) ( -64 -1032 -200 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 3865 +{ +( 232 -1072 -296 ) ( 232 -1072 -248 ) ( 242 -1072 -248 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -56 -1176 -296 ) ( -64 -1176 -296 ) ( -64 -984 -232 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -64 -988 -256 ) ( -56 -988 -256 ) ( -56 -988 -224 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -56 -984 -256 ) ( -64 -984 -256 ) ( -64 -1176 -320 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -64 -1172 -288 ) ( -56 -1172 -288 ) ( -56 -1172 -320 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -58 -1032 -224 ) ( -58 -984 -224 ) ( -58 -984 -256 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -62 -984 -256 ) ( -62 -984 -224 ) ( -62 -1032 -224 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 3866 +{ +( 232 -984 -256 ) ( 232 -1008 -264 ) ( 242 -1008 -264 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 232 -1008 -240 ) ( 232 -984 -232 ) ( 242 -984 -232 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -56 -984 -228 ) ( -56 -988 -228 ) ( -64 -988 -228 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -56 -984 -256 ) ( -56 -984 -232 ) ( -64 -984 -232 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -56 -988 -260 ) ( -56 -984 -260 ) ( -64 -984 -260 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -56 -988 -232 ) ( -56 -988 -256 ) ( -64 -988 -256 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -58 -988 -232 ) ( -58 -984 -232 ) ( -58 -984 -256 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -62 -984 -256 ) ( -62 -984 -232 ) ( -62 -988 -232 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3867 +{ +( -58 -1072 -292 ) ( -58 -1076 -292 ) ( -58 -1076 -256 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -62 -1076 -256 ) ( -62 -1076 -292 ) ( -62 -1072 -292 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -56 -1072 -252 ) ( -64 -1072 -252 ) ( -64 -1072 -288 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -56 -1076 -260 ) ( -64 -1076 -260 ) ( -64 -1072 -260 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -56 -1076 -292 ) ( -64 -1076 -292 ) ( -64 -1076 -256 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -56 -1072 -288 ) ( -64 -1072 -288 ) ( -64 -1076 -288 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -346 -1080 -288 ) ( -336 -1080 -288 ) ( -336 -1056 -280 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -346 -1032 -248 ) ( -336 -1032 -248 ) ( -336 -1080 -264 ) subway/metal_rust 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3868 +{ +( -360 -1192 -244 ) ( -376 -1192 -244 ) ( -376 -1208 -244 ) subway/light_yellow 784 16 0 0.500000 0.500000 134217728 16777217 12000 +( -376 -1208 -240 ) ( -376 -1192 -240 ) ( -360 -1192 -240 ) subway/1_black 800 16 0 0.500000 0.500000 134217728 16777216 0 +( -376 -1208 -240 ) ( -360 -1208 -240 ) ( -360 -1208 -248 ) subway/1_black 800 16 0 0.500000 0.500000 134217728 16777216 0 +( -360 -1208 -240 ) ( -360 -1192 -240 ) ( -360 -1192 -248 ) subway/1_black 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -360 -1192 -240 ) ( -376 -1192 -240 ) ( -376 -1192 -248 ) subway/1_black 800 16 0 0.500000 0.500000 134217728 16777216 0 +( -376 -1192 -240 ) ( -376 -1208 -240 ) ( -376 -1208 -248 ) subway/1_black 16 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3869 +{ +( -64 -1088 -184 ) ( -48 -1088 -168 ) ( -48 -1056 -168 ) subway/light_square 0 0 0 0.500000 0.500000 134217728 16777217 10000 +( -64 -1056 -184 ) ( -64 -1056 -168 ) ( -64 -1088 -168 ) subway/1_black -16 16 0 0.500000 0.500000 134217728 16777216 0 +( -64 -1056 -168 ) ( -48 -1056 -168 ) ( -48 -1088 -168 ) subway/1_black 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -64 -1088 -168 ) ( -48 -1088 -168 ) ( -48 -1088 -184 ) subway/1_black 16 16 0 0.500000 0.500000 134217728 16777216 0 +( -48 -1072 -184 ) ( -48 -1072 -168 ) ( -64 -1072 -168 ) subway/1_black 16 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3870 +{ +( -376 -1032 -240 ) ( -376 -1000 -240 ) ( -416 -1000 -240 ) subway/con10 0 16 0 0.500000 0.500000 0 285212672 0 +( -464 -984 -232 ) ( -312 -984 -232 ) ( -312 -1008 -232 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -464 -976 -160 ) ( -464 -1008 -160 ) ( -464 -1008 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -456 -1176 -160 ) ( -416 -1176 -160 ) ( -416 -1176 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -272 -1032 -160 ) ( -272 -1000 -160 ) ( -272 -1000 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -272 -984 -192 ) ( -424 -984 -192 ) ( -424 -984 -216 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3871 +{ +( -176 -1264 -240 ) ( -176 -1232 -240 ) ( -216 -1232 -240 ) subway/con10 0 16 0 0.500000 0.500000 0 285212672 0 +( -264 -1216 -232 ) ( -112 -1216 -232 ) ( -112 -1240 -232 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -496 -1200 -160 ) ( -496 -1232 -160 ) ( -496 -1232 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -256 -1408 -160 ) ( -216 -1408 -160 ) ( -216 -1408 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -72 -1264 -160 ) ( -72 -1232 -160 ) ( -72 -1232 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -72 -1176 -192 ) ( -224 -1176 -192 ) ( -224 -1176 -216 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3872 +{ +( -264 -992 -256 ) ( -280 -992 -256 ) ( -280 -1176 -256 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( -280 -1176 -240 ) ( -280 -992 -240 ) ( -264 -992 -240 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( -280 -1176 -144 ) ( -264 -1176 -144 ) ( -264 -1176 -168 ) subway/1_tile_middle 0 -192 0 0.500000 0.500000 0 318767104 0 +( -272 -1168 -144 ) ( -272 -984 -144 ) ( -272 -984 -168 ) subway/1_tile_middle 0 -192 0 0.500000 0.500000 0 318767104 0 +( -264 -984 -144 ) ( -280 -984 -144 ) ( -280 -984 -168 ) subway/1_tile_middle 0 -192 0 0.500000 0.500000 0 318767104 0 +( -280 -992 -144 ) ( -280 -1176 -144 ) ( -280 -1176 -168 ) subway/1_tile_middle 112 64 0 -0.500000 0.500000 0 318767104 0 +} +// brush 3873 +{ +( -56 -992 -184 ) ( -72 -992 -184 ) ( -72 -1176 -184 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( -72 -1176 -168 ) ( -72 -992 -168 ) ( -56 -992 -168 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( -72 -1176 -72 ) ( -56 -1176 -72 ) ( -56 -1176 -96 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( -64 -1168 -72 ) ( -64 -984 -72 ) ( -64 -984 -96 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( -56 -984 -72 ) ( -72 -984 -72 ) ( -72 -984 -96 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( -72 -992 -72 ) ( -72 -1176 -72 ) ( -72 -1176 -96 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +} +// brush 3874 +{ +( -72 -992 -88 ) ( -72 -1176 -88 ) ( -72 -1176 -112 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -56 -984 -88 ) ( -72 -984 -88 ) ( -72 -984 -112 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -64 -1168 -88 ) ( -64 -984 -88 ) ( -64 -984 -112 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -72 -1176 -88 ) ( -56 -1176 -88 ) ( -56 -1176 -112 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -72 -1176 -184 ) ( -72 -992 -184 ) ( -56 -992 -184 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +( -56 -992 -232 ) ( -72 -992 -232 ) ( -72 -1176 -232 ) subway/1_tile 80 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 3875 +{ +( -72 -992 -192 ) ( -72 -1176 -192 ) ( -72 -1176 -216 ) subway/con6 0 -16 0 0.500000 0.500000 0 285212672 0 +( -56 -984 -192 ) ( -72 -984 -192 ) ( -72 -984 -216 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( -64 -1168 -192 ) ( -64 -984 -192 ) ( -64 -984 -216 ) subway/con12 0 24 0 1 1 0 285212672 0 +( -72 -1176 -192 ) ( -56 -1176 -192 ) ( -56 -1176 -216 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( -72 -1176 -232 ) ( -72 -992 -232 ) ( -56 -992 -232 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( -56 -992 -336 ) ( -72 -992 -336 ) ( -72 -1176 -336 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3876 +{ +( 40 -1264 -240 ) ( 40 -1232 -240 ) ( 0 -1232 -240 ) subway/con10 0 16 0 0.500000 0.500000 0 285212672 0 +( -48 -1216 -232 ) ( 104 -1216 -232 ) ( 104 -1240 -232 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -72 -1208 -160 ) ( -72 -1240 -160 ) ( -72 -1240 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -40 -1408 -160 ) ( 0 -1408 -160 ) ( 0 -1408 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 144 -1264 -160 ) ( 144 -1232 -160 ) ( 144 -1232 -200 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 144 -1216 -192 ) ( -8 -1216 -192 ) ( -8 -1216 -216 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3877 +{ +( -208 -1176 -328 ) ( -168 -1176 -328 ) ( -168 -1144 -328 ) subway/1_tile_bottom -48 -672 0 0.500000 0.500000 0 318767104 0 +( -176 -1144 -312 ) ( -176 -1176 -312 ) ( -216 -1176 -312 ) subway/1_tile_bottom -48 -672 0 0.500000 0.500000 0 318767104 0 +( -256 -1144 -312 ) ( -256 -1144 -272 ) ( -256 -1176 -272 ) subway/1_tile_bottom -48 -272 0 0.500000 0.500000 0 318767104 0 +( -256 -1168 -312 ) ( -256 -1168 -272 ) ( -296 -1168 -272 ) subway/1_tile_bottom 624 -272 0 0.500000 0.500000 0 318767104 0 +( -72 -1184 -312 ) ( -72 -1184 -272 ) ( -72 -1152 -272 ) subway/1_tile_bottom -48 -272 0 0.500000 0.500000 0 318767104 0 +( -216 -1176 -312 ) ( -216 -1176 -272 ) ( -176 -1176 -272 ) subway/1_tile_bottom 624 -272 0 0.500000 0.500000 0 318767104 0 +} +// brush 3878 +{ +( 104 -1224 -328 ) ( 104 -1264 -328 ) ( 136 -1264 -328 ) subway/1_tile_bottom 0 -592 0 0.500000 0.500000 0 318767104 0 +( 136 -1256 -312 ) ( 104 -1256 -312 ) ( 104 -1216 -312 ) subway/1_tile_bottom 0 -592 0 0.500000 0.500000 0 318767104 0 +( 136 -1176 -312 ) ( 136 -1176 -272 ) ( 104 -1176 -272 ) subway/1_tile_bottom 0 -272 0 0.500000 0.500000 0 318767104 0 +( 136 -1176 -312 ) ( 136 -1176 -272 ) ( 136 -1136 -272 ) subway/1_tile_bottom 544 -272 0 0.500000 0.500000 0 318767104 0 +( 104 -1216 -312 ) ( 104 -1216 -272 ) ( 136 -1216 -272 ) subway/1_tile_bottom 0 -272 0 0.500000 0.500000 0 318767104 0 +( 104 -1216 -312 ) ( 104 -1216 -272 ) ( 104 -1256 -272 ) subway/1_tile_bottom 544 -272 0 0.500000 0.500000 0 318767104 0 +} +// brush 3879 +{ +( -208 -1168 -256 ) ( -168 -1168 -256 ) ( -168 -1136 -256 ) subway/1_tile_middle -48 -608 0 0.500000 0.500000 0 318767104 0 +( -176 -1144 -240 ) ( -176 -1176 -240 ) ( -216 -1176 -240 ) subway/1_tile -48 -832 0 0.500000 0.500000 0 318767104 0 +( -256 -1144 -240 ) ( -256 -1144 -200 ) ( -256 -1176 -200 ) subway/1_tile_middle -48 -192 0 0.500000 0.500000 0 318767104 0 +( -256 -1168 -240 ) ( -256 -1168 -200 ) ( -296 -1168 -200 ) subway/1_tile_middle 624 -192 0 0.500000 0.500000 0 318767104 0 +( -72 -1184 -240 ) ( -72 -1184 -200 ) ( -72 -1152 -200 ) subway/1_tile_middle -48 -192 0 0.500000 0.500000 0 318767104 0 +( -216 -1176 -216 ) ( -216 -1176 -176 ) ( -176 -1176 -176 ) subway/1_tile_middle 624 -192 0 0.500000 0.500000 0 318767104 0 +} +// brush 3880 +{ +( 136 -1312 -312 ) ( 104 -1312 -312 ) ( 104 -1352 -312 ) subway/1_tile 0 -864 0 0.500000 0.500000 0 318767104 0 +( 112 -1360 -272 ) ( 112 -1320 -272 ) ( 144 -1320 -272 ) subway/1_tile 0 -864 0 0.500000 0.500000 0 318767104 0 +( 104 -1400 -256 ) ( 136 -1400 -256 ) ( 136 -1400 -296 ) subway/1_tile 0 -224 0 0.500000 0.500000 0 318767104 0 +( 136 -1440 -248 ) ( 136 -1400 -248 ) ( 136 -1400 -288 ) subway/1_tile 864 -224 0 0.500000 0.500000 0 318767104 0 +( 136 -1360 -256 ) ( 104 -1360 -256 ) ( 104 -1360 -296 ) subway/1_tile 0 -224 0 0.500000 0.500000 0 318767104 0 +( 104 -1320 -232 ) ( 104 -1360 -232 ) ( 104 -1360 -272 ) subway/1_tile 864 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 3881 +{ +( 136 -1312 -328 ) ( 104 -1312 -328 ) ( 104 -1352 -328 ) subway/1_tile_bottom 0 -912 0 0.500000 0.500000 0 318767104 0 +( 104 -1360 -312 ) ( 104 -1320 -312 ) ( 136 -1320 -312 ) subway/1_tile_bottom 0 -912 0 0.500000 0.500000 0 318767104 0 +( 104 -1400 -272 ) ( 136 -1400 -272 ) ( 136 -1400 -312 ) subway/1_tile_bottom 0 -272 0 0.500000 0.500000 0 318767104 0 +( 136 -1440 -272 ) ( 136 -1400 -272 ) ( 136 -1400 -312 ) subway/1_tile_bottom 864 -272 0 0.500000 0.500000 0 318767104 0 +( 136 -1360 -272 ) ( 104 -1360 -272 ) ( 104 -1360 -312 ) subway/1_tile_bottom 0 -272 0 0.500000 0.500000 0 318767104 0 +( 104 -1320 -272 ) ( 104 -1360 -272 ) ( 104 -1360 -312 ) subway/1_tile_bottom 864 -272 0 0.500000 0.500000 0 318767104 0 +} +// brush 3882 +{ +( 96 -1056 -168 ) ( 96 -1088 -168 ) ( 112 -1088 -184 ) subway/light_square 0 0 0 0.500000 0.500000 134217728 16777217 10000 +( 112 -1088 -168 ) ( 112 -1056 -168 ) ( 112 -1056 -184 ) subway/1_black -16 16 0 0.500000 0.500000 134217728 16777216 0 +( 96 -1088 -168 ) ( 96 -1056 -168 ) ( 112 -1056 -168 ) subway/1_black -304 16 0 0.500000 0.500000 134217728 16777216 0 +( 96 -1088 -184 ) ( 96 -1088 -168 ) ( 112 -1088 -168 ) subway/1_black -304 16 0 0.500000 0.500000 134217728 16777216 0 +( 112 -1072 -168 ) ( 96 -1072 -168 ) ( 96 -1072 -184 ) subway/1_black -304 16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3883 +{ +( -448 -1360 -312 ) ( -448 -1360 -272 ) ( -448 -1320 -272 ) subway/1_tile_bottom 864 -272 0 0.500000 0.500000 0 318767104 0 +( -448 -1360 -312 ) ( -448 -1360 -272 ) ( -480 -1360 -272 ) subway/1_tile_bottom 720 -272 0 0.500000 0.500000 0 318767104 0 +( -480 -1400 -312 ) ( -480 -1400 -272 ) ( -480 -1440 -272 ) subway/1_tile_bottom 864 -272 0 0.500000 0.500000 0 318767104 0 +( -480 -1400 -312 ) ( -480 -1400 -272 ) ( -448 -1400 -272 ) subway/1_tile_bottom 720 -272 0 0.500000 0.500000 0 318767104 0 +( -480 -1320 -312 ) ( -448 -1320 -312 ) ( -448 -1360 -312 ) subway/1_tile_bottom 720 -912 0 0.500000 0.500000 0 318767104 0 +( -448 -1352 -328 ) ( -448 -1312 -328 ) ( -480 -1312 -328 ) subway/1_tile_bottom 720 -912 0 0.500000 0.500000 0 318767104 0 +} +// brush 3884 +{ +( -448 -1360 -272 ) ( -448 -1360 -232 ) ( -448 -1320 -232 ) subway/1_tile 864 -224 0 0.500000 0.500000 0 318767104 0 +( -448 -1360 -296 ) ( -448 -1360 -256 ) ( -480 -1360 -256 ) subway/1_tile 720 -224 0 0.500000 0.500000 0 318767104 0 +( -480 -1400 -288 ) ( -480 -1400 -248 ) ( -480 -1440 -248 ) subway/1_tile 864 -224 0 0.500000 0.500000 0 318767104 0 +( -480 -1400 -296 ) ( -480 -1400 -256 ) ( -448 -1400 -256 ) subway/1_tile 720 -224 0 0.500000 0.500000 0 318767104 0 +( -488 -1320 -272 ) ( -456 -1320 -272 ) ( -456 -1360 -272 ) subway/1_tile 720 -864 0 0.500000 0.500000 0 318767104 0 +( -448 -1352 -312 ) ( -448 -1312 -312 ) ( -480 -1312 -312 ) subway/1_tile 720 -864 0 0.500000 0.500000 0 318767104 0 +} +// brush 3885 +{ +( -248 -1352 -328 ) ( -248 -1312 -328 ) ( -280 -1312 -328 ) subway/1_tile_bottom 320 -912 0 0.500000 0.500000 0 318767104 0 +( -280 -1320 -312 ) ( -248 -1320 -312 ) ( -248 -1360 -312 ) subway/1_tile_bottom 320 -912 0 0.500000 0.500000 0 318767104 0 +( -288 -1400 -312 ) ( -288 -1400 -272 ) ( -256 -1400 -272 ) subway/1_tile_bottom 320 -272 0 0.500000 0.500000 0 318767104 0 +( -288 -1400 -312 ) ( -288 -1400 -272 ) ( -288 -1440 -272 ) subway/1_tile_bottom 864 -272 0 0.500000 0.500000 0 318767104 0 +( -248 -1360 -312 ) ( -248 -1360 -272 ) ( -280 -1360 -272 ) subway/1_tile_bottom 320 -272 0 0.500000 0.500000 0 318767104 0 +( -248 -1360 -312 ) ( -248 -1360 -272 ) ( -248 -1320 -272 ) subway/1_tile_bottom 864 -272 0 0.500000 0.500000 0 318767104 0 +} +// brush 3886 +{ +( -248 -1352 -312 ) ( -248 -1312 -312 ) ( -280 -1312 -312 ) subway/1_tile 320 -864 0 0.500000 0.500000 0 318767104 0 +( -288 -1320 -272 ) ( -256 -1320 -272 ) ( -256 -1360 -272 ) subway/1_tile 320 -864 0 0.500000 0.500000 0 318767104 0 +( -288 -1400 -296 ) ( -288 -1400 -256 ) ( -256 -1400 -256 ) subway/1_tile 320 -224 0 0.500000 0.500000 0 318767104 0 +( -288 -1400 -288 ) ( -288 -1400 -248 ) ( -288 -1440 -248 ) subway/1_tile 864 -224 0 0.500000 0.500000 0 318767104 0 +( -248 -1360 -296 ) ( -248 -1360 -256 ) ( -280 -1360 -256 ) subway/1_tile_damage2 0 -24 0 0.500000 0.500000 0 352321536 0 +( -248 -1360 -272 ) ( -248 -1360 -232 ) ( -248 -1320 -232 ) subway/1_tile 864 -224 0 0.500000 0.500000 0 318767104 0 +} +// brush 3887 +{ +( -480 -1296 -272 ) ( -480 -1256 -272 ) ( -480 -1256 -312 ) subway/1_tile_bottom 624 -272 0 0.500000 0.500000 0 318767104 0 +( -504 -1400 -272 ) ( -472 -1400 -272 ) ( -472 -1400 -312 ) subway/1_tile_bottom 672 -272 0 0.500000 0.500000 0 318767104 0 +( -488 -1176 -272 ) ( -488 -1216 -272 ) ( -488 -1216 -312 ) subway/1_tile_bottom 624 -272 0 0.500000 0.500000 0 318767104 0 +( -480 -1216 -272 ) ( -512 -1216 -272 ) ( -512 -1216 -312 ) subway/1_tile_bottom 672 -272 0 0.500000 0.500000 0 318767104 0 +( -480 -1256 -312 ) ( -480 -1296 -312 ) ( -512 -1296 -312 ) subway/1_tile_bottom 672 -672 0 0.500000 0.500000 0 318767104 0 +( -512 -1304 -328 ) ( -480 -1304 -328 ) ( -480 -1264 -328 ) subway/1_tile_bottom 672 -672 0 0.500000 0.500000 0 318767104 0 +} +// brush 3888 +{ +( -480 -1296 -176 ) ( -480 -1256 -176 ) ( -480 -1256 -216 ) subway/1_tile_middle 624 -192 0 0.500000 0.500000 0 318767104 0 +( -504 -1400 -200 ) ( -472 -1400 -200 ) ( -472 -1400 -240 ) subway/1_tile_middle 672 -192 0 0.500000 0.500000 0 318767104 0 +( -488 -1176 -200 ) ( -488 -1216 -200 ) ( -488 -1216 -240 ) subway/1_tile_middle 624 -192 0 0.500000 0.500000 0 318767104 0 +( -480 -1216 -200 ) ( -512 -1216 -200 ) ( -512 -1216 -240 ) subway/1_tile_middle 672 -192 0 0.500000 0.500000 0 318767104 0 +( -480 -1256 -240 ) ( -480 -1296 -240 ) ( -512 -1296 -240 ) subway/1_tile 672 -832 0 0.500000 0.500000 0 318767104 0 +( -520 -1304 -256 ) ( -488 -1304 -256 ) ( -488 -1264 -256 ) subway/1_tile_middle 672 -608 0 0.500000 0.500000 0 318767104 0 +} +// brush 3889 +{ +( 104 -872 -144 ) ( -48 -872 -144 ) ( -48 -872 -168 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 120 -920 -112 ) ( 120 -888 -112 ) ( 120 -888 -152 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -48 -1216 -112 ) ( -8 -1216 -112 ) ( -8 -1216 -152 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -72 -888 -112 ) ( -72 -920 -112 ) ( -72 -920 -152 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -48 -872 -144 ) ( 104 -872 -144 ) ( 104 -896 -144 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 40 -920 -168 ) ( 40 -888 -168 ) ( 0 -888 -168 ) subway/con14 176 112 0 0.500000 0.500000 0 285212672 0 +} +// brush 3890 +{ +( 96 -952 -184 ) ( 96 -984 -184 ) ( 104 -984 -184 ) subway/1_tile_middle 0 -64 0 0.500000 0.500000 0 318767104 0 +( 104 -984 -168 ) ( 104 -984 -200 ) ( 72 -984 -200 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( 72 -952 -200 ) ( 104 -952 -200 ) ( 104 -952 -168 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( 104 -960 -200 ) ( 104 -976 -200 ) ( 104 -976 -168 ) subway/1_tile_middle 16 -48 0 0.500000 0.500000 0 318767104 0 +( 80 -984 -168 ) ( 80 -952 -168 ) ( 104 -952 -168 ) subway/1_tile_middle 0 -64 0 0.500000 0.500000 0 318767104 0 +( 80 -952 -168 ) ( 80 -984 -168 ) ( 96 -984 -184 ) subway/1_tile_middle 16 0 90 0.500000 0.500000 0 318767104 0 +} +// brush 3891 +{ +( 128 -856 -240 ) ( 96 -856 -240 ) ( 96 -896 -240 ) subway/1_tile 16 0 0 0.500000 0.500000 0 318767104 0 +( 96 -904 -184 ) ( 96 -864 -184 ) ( 128 -864 -184 ) subway/1_tile 16 0 0 0.500000 0.500000 0 318767104 0 +( 104 -984 -184 ) ( 104 -984 -240 ) ( 96 -984 -240 ) subway/1_tile 16 -80 0 0.500000 0.500000 0 318767104 0 +( 104 -984 -240 ) ( 104 -984 -184 ) ( 104 -888 -184 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -952 -184 ) ( 104 -952 -184 ) ( 104 -952 -224 ) subway/1_tile 16 -80 0 0.500000 0.500000 0 318767104 0 +( 96 -984 -184 ) ( 96 -984 -240 ) ( 96 -888 -240 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 3892 +{ +( 96 -984 -200 ) ( 96 -984 -256 ) ( 96 -888 -256 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( 136 -952 -200 ) ( 104 -952 -200 ) ( 104 -952 -240 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( 104 -984 -256 ) ( 104 -984 -200 ) ( 104 -888 -200 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( 104 -984 -200 ) ( 104 -984 -256 ) ( 96 -984 -256 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( 96 -904 -240 ) ( 96 -864 -240 ) ( 128 -864 -240 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( 128 -856 -256 ) ( 96 -856 -256 ) ( 96 -896 -256 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +} +// brush 3893 +{ +( -48 -888 -240 ) ( -48 -984 -240 ) ( -48 -984 -184 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( -56 -952 -224 ) ( -56 -952 -184 ) ( -88 -952 -184 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -56 -888 -184 ) ( -56 -984 -184 ) ( -56 -984 -240 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( -48 -984 -240 ) ( -56 -984 -240 ) ( -56 -984 -184 ) subway/1_tile 272 -80 0 0.500000 0.500000 0 318767104 0 +( -80 -864 -184 ) ( -48 -864 -184 ) ( -48 -904 -184 ) subway/1_tile 272 0 0 0.500000 0.500000 0 318767104 0 +( -48 -896 -240 ) ( -48 -856 -240 ) ( -80 -856 -240 ) subway/1_tile 272 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3894 +{ +( -48 -984 -184 ) ( -32 -984 -168 ) ( -32 -952 -168 ) subway/1_tile_middle 16 256 90 0.500000 0.500000 0 318767104 0 +( -56 -952 -168 ) ( -32 -952 -168 ) ( -32 -984 -168 ) subway/1_tile_middle 256 -64 0 0.500000 0.500000 0 318767104 0 +( -56 -976 -168 ) ( -56 -976 -200 ) ( -56 -960 -200 ) subway/1_tile_middle 16 -48 0 0.500000 0.500000 0 318767104 0 +( -56 -952 -168 ) ( -56 -952 -200 ) ( -24 -952 -200 ) subway/1_tile_middle 256 -48 0 0.500000 0.500000 0 318767104 0 +( -24 -984 -200 ) ( -56 -984 -200 ) ( -56 -984 -168 ) subway/1_tile_middle 256 -48 0 0.500000 0.500000 0 318767104 0 +( -56 -984 -184 ) ( -48 -984 -184 ) ( -48 -952 -184 ) subway/1_tile_middle 256 -64 0 0.500000 0.500000 0 318767104 0 +} +// brush 3895 +{ +( 104 -872 -104 ) ( 104 -912 -104 ) ( 104 -912 -144 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( 136 -888 -128 ) ( 104 -888 -128 ) ( 104 -888 -168 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( 120 -984 -184 ) ( 120 -984 -168 ) ( 120 -888 -168 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( 112 -984 -168 ) ( 112 -984 -184 ) ( 104 -984 -184 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( 104 -904 -168 ) ( 104 -864 -168 ) ( 136 -864 -168 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 136 -856 -184 ) ( 104 -856 -184 ) ( 104 -896 -184 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3896 +{ +( 112 -992 -72 ) ( 112 -1176 -72 ) ( 112 -1176 -96 ) subway/1_tile_middle 64 16 0 -0.500000 0.500000 0 318767104 0 +( 128 -984 -72 ) ( 112 -984 -72 ) ( 112 -984 -96 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( 120 -1168 -72 ) ( 120 -984 -72 ) ( 120 -984 -96 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( 112 -1176 -72 ) ( 128 -1176 -72 ) ( 128 -1176 -96 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( 112 -1176 -168 ) ( 112 -992 -168 ) ( 128 -992 -168 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( 128 -992 -184 ) ( 112 -992 -184 ) ( 112 -1176 -184 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +} +// brush 3897 +{ +( 104 -1224 -184 ) ( 104 -1208 -184 ) ( -80 -1208 -184 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( -80 -1208 -168 ) ( 104 -1208 -168 ) ( 104 -1224 -168 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( -80 -1208 -72 ) ( -80 -1224 -72 ) ( -80 -1224 -96 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( -72 -1216 -72 ) ( 112 -1216 -72 ) ( 112 -1216 -96 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( 112 -1224 -72 ) ( 112 -1208 -72 ) ( 112 -1208 -96 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( 104 -1208 -72 ) ( -80 -1208 -72 ) ( -80 -1208 -96 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3898 +{ +( 128 -992 -336 ) ( 112 -992 -336 ) ( 112 -1176 -336 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 112 -1176 -232 ) ( 112 -992 -232 ) ( 128 -992 -232 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 112 -1176 -192 ) ( 128 -1176 -192 ) ( 128 -1176 -216 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 120 -1168 -192 ) ( 120 -984 -192 ) ( 120 -984 -216 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 128 -984 -192 ) ( 112 -984 -192 ) ( 112 -984 -216 ) subway/con6 0 0 0 0.500000 0.500000 0 285212672 0 +( 112 -992 -192 ) ( 112 -1176 -192 ) ( 112 -1176 -216 ) subway/con12 0 24 0 1 1 0 285212672 0 +} +// brush 3899 +{ +( 136 -1120 -264 ) ( 136 -1120 -256 ) ( 136 -1056 -256 ) subway/1_lobby_floor 432 -64 0 0.500000 0.500000 0 285212672 0 +( 872 -664 -264 ) ( 872 -664 -256 ) ( 808 -664 -256 ) subway/1_lobby_floor 752 -64 0 0.500000 0.500000 0 285212672 0 +( -88 -936 -264 ) ( -88 -936 -256 ) ( -88 -1000 -256 ) subway/1_lobby_floor 432 -64 0 0.500000 0.500000 0 285212672 0 +( 312 -984 -272 ) ( 312 -984 -264 ) ( 376 -984 -264 ) subway/1_stair_side1 312 -80 0 0.500000 0.500000 0 285212672 0 +( 464 -1056 -256 ) ( 528 -1056 -256 ) ( 528 -1120 -256 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 544 -1120 -264 ) ( 544 -1056 -264 ) ( 480 -1056 -264 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +} +// brush 3900 +{ +( -424 -624 -328 ) ( -424 -560 -328 ) ( -488 -560 -328 ) subway/metal_rust 400 -752 0 0.500000 0.500000 0 16777216 0 +( -64 -1080 -288 ) ( -64 -984 -256 ) ( -56 -984 -256 ) subway/metal_rust 400 -752 0 0.500000 0.500000 0 16777216 0 +( -64 -728 -296 ) ( -64 -792 -296 ) ( -64 -792 -304 ) subway/metal_rust 528 -80 0 0.500000 0.500000 0 16777216 0 +( -360 -1176 -296 ) ( -296 -1176 -296 ) ( -296 -1176 -304 ) subway/metal_rust 624 -80 0 0.500000 0.500000 0 16777216 0 +( -56 -248 -288 ) ( -56 -184 -288 ) ( -56 -184 -296 ) subway/metal_rust 528 -80 0 0.500000 0.500000 0 16777216 0 +( -56 -984 -296 ) ( -56 -984 -256 ) ( -64 -984 -256 ) subway/metal_rust 624 -80 0 0.500000 0.500000 0 16777216 0 +} +// brush 3901 +{ +( 252 -960 -256 ) ( 244 -960 -256 ) ( 244 -960 -296 ) subway/metal_rust -8 -16 0 0.500000 0.500000 0 16777216 0 +( 244 -160 -296 ) ( 244 -160 -288 ) ( 244 -224 -288 ) subway/metal_rust -32 -16 0 0.500000 0.500000 0 16777216 0 +( 484 -1152 -304 ) ( 484 -1152 -296 ) ( 548 -1152 -296 ) subway/metal_rust -8 -16 0 0.500000 0.500000 0 16777216 0 +( 252 -768 -304 ) ( 252 -768 -296 ) ( 252 -704 -296 ) subway/metal_rust -32 -16 0 0.500000 0.500000 0 16777216 0 +( 244 -960 -256 ) ( 252 -960 -256 ) ( 252 -1056 -288 ) subway/metal_rust -40 0 0 0.500000 0.500000 0 16777216 0 +( 676 -536 -328 ) ( 612 -536 -328 ) ( 612 -600 -328 ) subway/metal_rust -40 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3902 +{ +( 160 -1052 -256 ) ( 160 -1052 -248 ) ( 160 -988 -248 ) subway/1_lobby_floor 600 -32 0 0.500000 0.500000 0 285212672 0 +( 960 -688 -256 ) ( 960 -688 -248 ) ( 896 -688 -248 ) subway/1_lobby_floor 880 -32 0 0.500000 0.500000 0 285212672 0 +( 136 -1012 -256 ) ( 136 -1012 -248 ) ( 136 -1076 -248 ) subway/1_stair_side1 168 -48 0 0.500000 0.500000 0 285212672 0 +( 416 -864 -264 ) ( 416 -864 -256 ) ( 480 -864 -256 ) subway/1_lobby_floor 880 -32 0 0.500000 0.500000 0 285212672 0 +( 568 -1148 -248 ) ( 632 -1148 -248 ) ( 632 -1212 -248 ) subway/1_stair_top1 168 192 90 0.500000 0.500000 0 285212672 0 +( 648 -1204 -256 ) ( 648 -1140 -256 ) ( 584 -1140 -256 ) subway/1_lobby_floor 560 -856 0 0.500000 0.500000 0 285212672 0 +} +// brush 3903 +{ +( 184 -1052 -248 ) ( 184 -1052 -240 ) ( 184 -988 -240 ) subway/1_lobby_floor 600 -16 0 0.500000 0.500000 0 285212672 0 +( 984 -688 -248 ) ( 984 -688 -240 ) ( 920 -688 -240 ) subway/1_lobby_floor 832 -16 0 0.500000 0.500000 0 285212672 0 +( 160 -852 -248 ) ( 160 -852 -240 ) ( 160 -916 -240 ) subway/1_stair_side1 168 -32 0 0.500000 0.500000 0 285212672 0 +( 440 -864 -256 ) ( 440 -864 -248 ) ( 504 -864 -248 ) subway/1_lobby_floor 832 -16 0 0.500000 0.500000 0 285212672 0 +( 592 -1148 -240 ) ( 656 -1148 -240 ) ( 656 -1212 -240 ) subway/1_stair_top1 168 144 90 0.500000 0.500000 0 285212672 0 +( 672 -1212 -248 ) ( 672 -1148 -248 ) ( 608 -1148 -248 ) subway/1_lobby_floor 512 -856 0 0.500000 0.500000 0 285212672 0 +} +// brush 3904 +{ +( 208 -1052 -240 ) ( 208 -1052 -232 ) ( 208 -988 -232 ) subway/1_lobby_floor 600 0 0 0.500000 0.500000 0 285212672 0 +( 1008 -688 -240 ) ( 1008 -688 -232 ) ( 944 -688 -232 ) subway/1_lobby_floor 784 0 0 0.500000 0.500000 0 285212672 0 +( 184 -852 -240 ) ( 184 -852 -232 ) ( 184 -916 -232 ) subway/1_stair_side1 168 -16 0 0.500000 0.500000 0 285212672 0 +( 464 -864 -248 ) ( 464 -864 -240 ) ( 528 -864 -240 ) subway/1_lobby_floor 784 0 0 0.500000 0.500000 0 285212672 0 +( 616 -1148 -232 ) ( 680 -1148 -232 ) ( 680 -1212 -232 ) subway/1_stair_top1 168 96 90 0.500000 0.500000 0 285212672 0 +( 696 -1212 -240 ) ( 696 -1148 -240 ) ( 632 -1148 -240 ) subway/1_lobby_floor 464 -856 0 0.500000 0.500000 0 285212672 0 +} +// brush 3905 +{ +( 232 -1212 -232 ) ( 232 -1212 -224 ) ( 232 -1148 -224 ) subway/1_lobby_floor 600 16 0 0.500000 0.500000 0 285212672 0 +( 1032 -688 -232 ) ( 1032 -688 -224 ) ( 968 -688 -224 ) subway/1_lobby_floor 736 16 0 0.500000 0.500000 0 285212672 0 +( 208 -852 -232 ) ( 208 -852 -224 ) ( 208 -916 -224 ) subway/1_stair_side1 168 0 0 0.500000 0.500000 0 285212672 0 +( 488 -864 -240 ) ( 488 -864 -232 ) ( 552 -864 -232 ) subway/1_lobby_floor 736 16 0 0.500000 0.500000 0 285212672 0 +( 640 -1140 -224 ) ( 704 -1140 -224 ) ( 704 -1204 -224 ) subway/1_stair_top1 168 48 90 0.500000 0.500000 0 285212672 0 +( 720 -1212 -232 ) ( 720 -1148 -232 ) ( 656 -1148 -232 ) subway/1_lobby_floor 416 -856 0 0.500000 0.500000 0 285212672 0 +} +// brush 3906 +{ +( 648 -1288 -256 ) ( 648 -1224 -256 ) ( 584 -1224 -256 ) subway/metal_rust 0 -352 0 0.500000 0.500000 0 16777216 0 +( 232 -856 -216 ) ( 232 -864 -216 ) ( 136 -864 -248 ) subway/metal_rust 0 -352 0 0.500000 0.500000 0 16777216 0 +( 424 -864 -264 ) ( 424 -864 -256 ) ( 488 -864 -256 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( 136 -1096 -256 ) ( 136 -1096 -248 ) ( 136 -1160 -248 ) subway/metal_rust 352 0 0 0.500000 0.500000 0 16777216 0 +( 1032 -856 -256 ) ( 1032 -856 -248 ) ( 968 -856 -248 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( 232 -864 -216 ) ( 232 -856 -216 ) ( 232 -856 -256 ) subway/metal_rust 352 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3907 +{ +( 80 -1400 -328 ) ( 40 -1400 -328 ) ( 40 -1432 -328 ) subway/1_tile_bottom 144 -848 0 0.500000 0.500000 0 318767104 0 +( 48 -1432 -312 ) ( 48 -1400 -312 ) ( 88 -1400 -312 ) subway/1_tile_bottom 144 -848 0 0.500000 0.500000 0 318767104 0 +( 144 -1432 -312 ) ( 144 -1432 -272 ) ( 144 -1400 -272 ) subway/1_tile_bottom 128 -272 0 0.500000 0.500000 0 318767104 0 +( -32 -1408 -312 ) ( -32 -1408 -272 ) ( 8 -1408 -272 ) subway/1_tile_bottom 816 -272 0 0.500000 0.500000 0 318767104 0 +( -496 -1392 -312 ) ( -496 -1392 -272 ) ( -496 -1424 -272 ) subway/1_tile_bottom 128 -272 0 0.500000 0.500000 0 318767104 0 +( 48 -1400 -312 ) ( 48 -1400 -272 ) ( 8 -1400 -272 ) subway/1_tile_bottom 48 16 0 -0.500000 0.500000 0 318767104 0 +} +// brush 3908 +{ +( 80 -1408 -256 ) ( 40 -1408 -256 ) ( 40 -1440 -256 ) subway/1_tile_middle 144 -784 0 0.500000 0.500000 0 318767104 0 +( 48 -1432 -240 ) ( 48 -1400 -240 ) ( 88 -1400 -240 ) subway/1_tile 144 -1008 0 0.500000 0.500000 0 318767104 0 +( 144 -1432 -240 ) ( 144 -1432 -200 ) ( 144 -1400 -200 ) subway/1_tile_middle 128 -192 0 0.500000 0.500000 0 318767104 0 +( -32 -1408 -240 ) ( -32 -1408 -200 ) ( 8 -1408 -200 ) subway/1_tile_middle 816 -192 0 0.500000 0.500000 0 318767104 0 +( -496 -1392 -240 ) ( -496 -1392 -200 ) ( -496 -1424 -200 ) subway/1_tile_middle 128 -192 0 0.500000 0.500000 0 318767104 0 +( 48 -1400 -216 ) ( 48 -1400 -176 ) ( 8 -1400 -176 ) subway/1_tile_middle 48 32 0 -0.500000 0.500000 0 318767104 0 +} +// brush 3909 +{ +( 136 -808 -256 ) ( 104 -808 -256 ) ( 104 -848 -256 ) subway/1_tile_bottom 0 64 0 0.500000 0.500000 0 318767104 0 +( 104 -856 -240 ) ( 104 -816 -240 ) ( 136 -816 -240 ) subway/1_tile_bottom 0 64 0 0.500000 0.500000 0 318767104 0 +( 104 -896 -200 ) ( 136 -896 -200 ) ( 136 -896 -240 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( 136 -936 -200 ) ( 136 -896 -200 ) ( 136 -896 -240 ) subway/1_tile_bottom -112 -128 0 0.500000 0.500000 0 318767104 0 +( 136 -856 -200 ) ( 104 -856 -200 ) ( 104 -856 -240 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( 104 -816 -200 ) ( 104 -856 -200 ) ( 104 -856 -240 ) subway/1_tile_bottom -112 -128 0 0.500000 0.500000 0 318767104 0 +} +// brush 3910 +{ +( 104 -816 -160 ) ( 104 -856 -160 ) ( 104 -856 -200 ) subway/1_tile -112 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -856 -184 ) ( 104 -856 -184 ) ( 104 -856 -224 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -936 -176 ) ( 136 -896 -176 ) ( 136 -896 -216 ) subway/1_tile -112 -80 0 0.500000 0.500000 0 318767104 0 +( 104 -888 -184 ) ( 136 -888 -184 ) ( 136 -888 -224 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 112 -856 -184 ) ( 112 -816 -184 ) ( 144 -816 -184 ) subway/1_tile 0 112 0 0.500000 0.500000 0 318767104 0 +( 136 -808 -240 ) ( 104 -808 -240 ) ( 104 -848 -240 ) subway/1_tile 0 112 0 0.500000 0.500000 0 318767104 0 +} +// brush 3911 +{ +( 144 -808 -184 ) ( 112 -808 -184 ) ( 112 -848 -184 ) subway/1_tile_middle 0 128 0 0.500000 0.500000 0 318767104 0 +( 104 -856 -168 ) ( 104 -816 -168 ) ( 136 -816 -168 ) subway/1_tile 0 -96 0 0.500000 0.500000 0 318767104 0 +( 104 -896 -128 ) ( 136 -896 -128 ) ( 136 -896 -168 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( 136 -936 -128 ) ( 136 -896 -128 ) ( 136 -896 -168 ) subway/1_tile_middle -112 -48 0 0.500000 0.500000 0 318767104 0 +( 136 -856 -128 ) ( 104 -856 -128 ) ( 104 -856 -168 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( 104 -816 -104 ) ( 104 -856 -104 ) ( 104 -856 -144 ) subway/1_tile_middle -112 -48 0 0.500000 0.500000 0 318767104 0 +} +// brush 3912 +{ +( 96 -848 -144 ) ( 96 -896 -144 ) ( 104 -896 -168 ) subway/1_tile 16 -80 0 0.500000 0.500000 0 318767104 0 +( 104 -848 -144 ) ( 104 -856 -168 ) ( 136 -856 -168 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 144 -896 -144 ) ( 144 -856 -144 ) ( 136 -856 -168 ) subway/1_tile 16 -80 0 0.500000 0.500000 0 318767104 0 +( 104 -896 -112 ) ( 136 -896 -112 ) ( 136 -896 -152 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 96 -896 -144 ) ( 96 -848 -144 ) ( 144 -848 -144 ) subway/1_tile 0 -96 0 0.500000 0.500000 0 318767104 0 +( 136 -808 -168 ) ( 104 -808 -168 ) ( 104 -848 -168 ) subway/1_tile 0 -96 0 0.500000 0.500000 0 318767104 0 +} +// brush 3913 +{ +( 104 -984 -240 ) ( 104 -984 -256 ) ( 104 -888 -256 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( 136 -888 -200 ) ( 104 -888 -200 ) ( 104 -888 -240 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( 120 -984 -256 ) ( 120 -984 -240 ) ( 120 -888 -240 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( 112 -984 -240 ) ( 112 -984 -256 ) ( 104 -984 -256 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( 104 -904 -240 ) ( 104 -864 -240 ) ( 136 -864 -240 ) subway/1_tile_bottom 0 -48 0 0.500000 0.500000 0 318767104 0 +( 136 -864 -256 ) ( 104 -864 -256 ) ( 104 -904 -256 ) subway/1_tile_bottom 0 -48 0 0.500000 0.500000 0 318767104 0 +} +// brush 3914 +{ +( -48 -896 -256 ) ( -48 -856 -256 ) ( -80 -856 -256 ) subway/1_tile_bottom 256 -128 0 0.500000 0.500000 0 318767104 0 +( -80 -864 -240 ) ( -48 -864 -240 ) ( -48 -904 -240 ) subway/1_tile_bottom 256 -128 0 0.500000 0.500000 0 318767104 0 +( -48 -984 -256 ) ( -56 -984 -256 ) ( -56 -984 -200 ) subway/1_tile_bottom 256 -128 0 0.500000 0.500000 0 318767104 0 +( -56 -888 -200 ) ( -56 -984 -200 ) ( -56 -984 -256 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( -56 -952 -240 ) ( -56 -952 -200 ) ( -88 -952 -200 ) subway/1_tile_bottom 256 -128 0 0.500000 0.500000 0 318767104 0 +( -48 -888 -256 ) ( -48 -984 -256 ) ( -48 -984 -200 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +} +// brush 3915 +{ +( 136 -608 -256 ) ( 104 -608 -256 ) ( 104 -648 -256 ) subway/1_tile_bottom 0 464 0 0.500000 0.500000 0 318767104 0 +( 104 -656 -240 ) ( 104 -616 -240 ) ( 136 -616 -240 ) subway/1_tile_bottom 0 464 0 0.500000 0.500000 0 318767104 0 +( 104 -696 -200 ) ( 136 -696 -200 ) ( 136 -696 -240 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( 136 -736 -200 ) ( 136 -696 -200 ) ( 136 -696 -240 ) subway/1_tile_bottom -512 -128 0 0.500000 0.500000 0 318767104 0 +( 144 -656 -200 ) ( 112 -656 -200 ) ( 112 -656 -240 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( 104 -616 -200 ) ( 104 -656 -200 ) ( 104 -656 -240 ) subway/1_tile_bottom -512 -128 0 0.500000 0.500000 0 318767104 0 +} +// brush 3916 +{ +( 104 -616 -104 ) ( 104 -656 -104 ) ( 104 -656 -144 ) subway/1_tile_middle -512 -48 0 0.500000 0.500000 0 318767104 0 +( 144 -656 -128 ) ( 112 -656 -128 ) ( 112 -656 -168 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( 136 -736 -128 ) ( 136 -696 -128 ) ( 136 -696 -168 ) subway/1_tile_middle -512 -48 0 0.500000 0.500000 0 318767104 0 +( 104 -696 -128 ) ( 136 -696 -128 ) ( 136 -696 -168 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( 112 -656 -168 ) ( 112 -616 -168 ) ( 144 -616 -168 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 144 -608 -184 ) ( 112 -608 -184 ) ( 112 -648 -184 ) subway/1_tile_middle 0 528 0 0.500000 0.500000 0 318767104 0 +} +// brush 3917 +{ +( 104 -616 -160 ) ( 104 -656 -160 ) ( 104 -656 -200 ) subway/1_tile -512 -80 0 0.500000 0.500000 0 318767104 0 +( 144 -656 -184 ) ( 112 -656 -184 ) ( 112 -656 -224 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -736 -176 ) ( 136 -696 -176 ) ( 136 -696 -216 ) subway/1_tile -512 -80 0 0.500000 0.500000 0 318767104 0 +( 104 -696 -184 ) ( 136 -696 -184 ) ( 136 -696 -224 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 112 -656 -184 ) ( 112 -616 -184 ) ( 144 -616 -184 ) subway/1_tile 0 512 0 0.500000 0.500000 0 318767104 0 +( 136 -608 -240 ) ( 104 -608 -240 ) ( 104 -648 -240 ) subway/1_tile 0 512 0 0.500000 0.500000 0 318767104 0 +} +// brush 3918 +{ +( 96 -656 -144 ) ( 96 -704 -144 ) ( 104 -696 -168 ) subway/1_tile -384 -80 0 0.500000 0.500000 0 318767104 0 +( 144 -656 -112 ) ( 112 -656 -112 ) ( 112 -656 -152 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 144 -696 -144 ) ( 144 -656 -144 ) ( 136 -656 -168 ) subway/1_tile -384 -80 0 0.500000 0.500000 0 318767104 0 +( 96 -704 -144 ) ( 144 -704 -144 ) ( 136 -696 -168 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 96 -704 -144 ) ( 96 -656 -144 ) ( 144 -656 -144 ) subway/1_tile 0 304 0 0.500000 0.500000 0 318767104 0 +( 144 -608 -168 ) ( 112 -608 -168 ) ( 112 -648 -168 ) subway/1_tile 0 304 0 0.500000 0.500000 0 318767104 0 +} +// brush 3919 +{ +( -48 -760 -168 ) ( -80 -760 -168 ) ( -80 -800 -168 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -96 -848 -144 ) ( -96 -696 -144 ) ( -72 -696 -144 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -80 -856 -112 ) ( -48 -856 -112 ) ( -48 -856 -152 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -72 -856 -112 ) ( -72 -816 -112 ) ( -72 -816 -152 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -48 -696 -112 ) ( -80 -696 -112 ) ( -80 -696 -152 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -96 -696 -144 ) ( -96 -848 -144 ) ( -96 -848 -168 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3920 +{ +( 8 -632 -168 ) ( 8 -664 -168 ) ( 48 -664 -168 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 96 -680 -144 ) ( -56 -680 -144 ) ( -56 -656 -144 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 104 -664 -112 ) ( 104 -632 -112 ) ( 104 -632 -152 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 104 -656 -112 ) ( 64 -656 -112 ) ( 64 -656 -152 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -56 -632 -112 ) ( -56 -664 -112 ) ( -56 -664 -152 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -56 -680 -144 ) ( 96 -680 -144 ) ( 96 -680 -168 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3921 +{ +( 8 -632 -256 ) ( 8 -664 -256 ) ( 48 -664 -256 ) subway/1_tile_bottom 80 496 0 0.500000 0.500000 0 318767104 0 +( 56 -664 -240 ) ( 16 -664 -240 ) ( 16 -632 -240 ) subway/1_tile_bottom 80 496 0 0.500000 0.500000 0 318767104 0 +( 104 -664 -200 ) ( 104 -632 -200 ) ( 104 -632 -240 ) subway/1_tile_bottom -544 -128 0 0.500000 0.500000 0 318767104 0 +( 104 -656 -200 ) ( 64 -656 -200 ) ( 64 -656 -240 ) subway/1_tile_bottom 80 -128 0 0.500000 0.500000 0 318767104 0 +( -56 -632 -200 ) ( -56 -664 -200 ) ( -56 -664 -240 ) subway/1_tile_bottom -544 -128 0 0.500000 0.500000 0 318767104 0 +( 16 -664 -200 ) ( 56 -664 -200 ) ( 56 -664 -240 ) subway/1_tile_bottom 80 -128 0 0.500000 0.500000 0 318767104 0 +} +// brush 3922 +{ +( 8 -632 -184 ) ( 8 -664 -184 ) ( 48 -664 -184 ) subway/1_tile_middle 80 560 0 0.500000 0.500000 0 318767104 0 +( 56 -664 -168 ) ( 16 -664 -168 ) ( 16 -632 -168 ) subway/1_tile_middle 80 560 0 0.500000 0.500000 0 318767104 0 +( 104 -664 -128 ) ( 104 -632 -128 ) ( 104 -632 -168 ) subway/1_tile_middle -544 -48 0 0.500000 0.500000 0 318767104 0 +( 104 -656 -128 ) ( 64 -656 -128 ) ( 64 -656 -168 ) subway/1_tile_middle 80 -48 0 0.500000 0.500000 0 318767104 0 +( -56 -632 -128 ) ( -56 -664 -128 ) ( -56 -664 -168 ) subway/1_tile_middle -544 -48 0 0.500000 0.500000 0 318767104 0 +( 16 -664 -104 ) ( 56 -664 -104 ) ( 56 -664 -144 ) subway/1_tile_middle 80 -48 0 0.500000 0.500000 0 318767104 0 +} +// brush 3923 +{ +( -88 -784 -104 ) ( -88 -744 -104 ) ( -88 -744 -144 ) subway/1_tile_middle 272 -48 0 0.500000 0.500000 0 318767104 0 +( -120 -856 -128 ) ( -88 -856 -128 ) ( -88 -856 -168 ) subway/1_tile_middle -320 -48 0 0.500000 0.500000 0 318767104 0 +( -96 -696 -128 ) ( -96 -736 -128 ) ( -96 -736 -168 ) subway/1_tile_middle 272 -48 0 0.500000 0.500000 0 318767104 0 +( -88 -696 -128 ) ( -120 -696 -128 ) ( -120 -696 -168 ) subway/1_tile_middle -320 -48 0 0.500000 0.500000 0 318767104 0 +( -88 -744 -168 ) ( -88 -784 -168 ) ( -120 -784 -168 ) subway/1_tile_middle 304 368 0 0.500000 0.500000 0 318767104 0 +( -120 -792 -184 ) ( -88 -792 -184 ) ( -88 -752 -184 ) subway/1_tile_middle 304 368 0 0.500000 0.500000 0 318767104 0 +} +// brush 3924 +{ +( -72 -912 -104 ) ( -72 -952 -104 ) ( -72 -952 -144 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( -32 -888 -128 ) ( -64 -888 -128 ) ( -64 -888 -168 ) subway/1_tile_middle 336 -48 0 0.500000 0.500000 0 318767104 0 +( -56 -952 -128 ) ( -56 -912 -128 ) ( -56 -912 -168 ) subway/1_tile_middle 0 -48 0 0.500000 0.500000 0 318767104 0 +( -64 -984 -128 ) ( -32 -984 -128 ) ( -32 -984 -168 ) subway/1_tile_middle 336 -48 0 0.500000 0.500000 0 318767104 0 +( -64 -912 -168 ) ( -64 -872 -168 ) ( -32 -872 -168 ) subway/1_tile_middle 336 16 0 0.500000 0.500000 0 318767104 0 +( -32 -864 -184 ) ( -64 -864 -184 ) ( -64 -904 -184 ) subway/1_tile_middle 336 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3925 +{ +( -32 -864 -256 ) ( -64 -864 -256 ) ( -64 -904 -256 ) subway/1_tile_bottom 336 -48 0 0.500000 0.500000 0 318767104 0 +( -64 -912 -240 ) ( -64 -872 -240 ) ( -32 -872 -240 ) subway/1_tile_bottom 336 -48 0 0.500000 0.500000 0 318767104 0 +( -64 -984 -200 ) ( -32 -984 -200 ) ( -32 -984 -240 ) subway/1_tile_bottom 336 -128 0 0.500000 0.500000 0 318767104 0 +( -56 -952 -200 ) ( -56 -912 -200 ) ( -56 -912 -240 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +( -32 -888 -200 ) ( -64 -888 -200 ) ( -64 -888 -240 ) subway/1_tile_bottom 336 -128 0 0.500000 0.500000 0 318767104 0 +( -72 -912 -200 ) ( -72 -952 -200 ) ( -72 -952 -240 ) subway/1_tile_bottom 0 -128 0 0.500000 0.500000 0 318767104 0 +} +// brush 3926 +{ +( -96 -848 -144 ) ( -96 -896 -144 ) ( -88 -896 -168 ) subway/1_tile 16 -80 0 0.500000 0.500000 0 318767104 0 +( -88 -848 -144 ) ( -88 -856 -168 ) ( -56 -856 -168 ) subway/1_tile 384 -80 0 0.500000 0.500000 0 318767104 0 +( -48 -896 -144 ) ( -48 -856 -144 ) ( -56 -856 -168 ) subway/1_tile 16 -80 0 0.500000 0.500000 0 318767104 0 +( -88 -896 -112 ) ( -56 -896 -112 ) ( -56 -896 -152 ) subway/1_tile 384 -80 0 0.500000 0.500000 0 318767104 0 +( -96 -896 -144 ) ( -96 -848 -144 ) ( -48 -848 -144 ) subway/1_tile 384 -96 0 0.500000 0.500000 0 318767104 0 +( -56 -808 -168 ) ( -88 -808 -168 ) ( -88 -848 -168 ) subway/1_tile 384 -96 0 0.500000 0.500000 0 318767104 0 +} +// brush 3927 +{ +( 136 -760 -144 ) ( 104 -760 -144 ) ( 104 -800 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 104 -800 -112 ) ( 104 -760 -112 ) ( 136 -760 -112 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 104 -888 -112 ) ( 136 -888 -112 ) ( 136 -888 -152 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 144 -888 -112 ) ( 144 -848 -112 ) ( 144 -848 -152 ) subway/1_tile -80 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -656 -112 ) ( 104 -656 -112 ) ( 104 -656 -152 ) subway/1_tile 0 -80 0 0.500000 0.500000 0 318767104 0 +( 96 -768 -88 ) ( 96 -808 -88 ) ( 96 -808 -128 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3928 +{ +( -16 -656 -88 ) ( -56 -656 -88 ) ( -56 -656 -128 ) subway/1_tile 208 -80 0 0.500000 0.500000 0 318767104 0 +( 104 -696 -112 ) ( 104 -664 -112 ) ( 104 -664 -152 ) subway/1_tile -192 -80 0 0.500000 0.500000 0 318767104 0 +( -136 -704 -112 ) ( -96 -704 -112 ) ( -96 -704 -152 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -48 -672 -112 ) ( -48 -704 -112 ) ( -48 -704 -152 ) subway/1_tile -192 -80 0 0.500000 0.500000 0 318767104 0 +( -48 -664 -112 ) ( -8 -664 -112 ) ( -8 -696 -112 ) subway/1_tile 288 192 0 0.500000 0.500000 0 318767104 0 +( -8 -696 -144 ) ( -8 -664 -144 ) ( -48 -664 -144 ) subway/1_tile 288 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 3929 +{ +( -96 -768 -88 ) ( -96 -808 -88 ) ( -96 -808 -128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -56 -656 -112 ) ( -88 -656 -112 ) ( -88 -656 -152 ) subway/1_tile 384 -80 0 0.500000 0.500000 0 318767104 0 +( -48 -888 -112 ) ( -48 -848 -112 ) ( -48 -848 -152 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -88 -888 -112 ) ( -56 -888 -112 ) ( -56 -888 -152 ) subway/1_tile 384 -80 0 0.500000 0.500000 0 318767104 0 +( -88 -800 -112 ) ( -88 -760 -112 ) ( -56 -760 -112 ) subway/1_tile 384 0 0 0.500000 0.500000 0 318767104 0 +( -56 -760 -144 ) ( -88 -760 -144 ) ( -88 -800 -144 ) subway/1_tile 384 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3930 +{ +( -56 -808 -256 ) ( -88 -808 -256 ) ( -88 -848 -256 ) subway/1_tile_bottom 384 64 0 0.500000 0.500000 0 318767104 0 +( -88 -856 -240 ) ( -88 -816 -240 ) ( -56 -816 -240 ) subway/1_tile_bottom 384 64 0 0.500000 0.500000 0 318767104 0 +( -88 -896 -200 ) ( -56 -896 -200 ) ( -56 -896 -240 ) subway/1_tile_bottom 384 -128 0 0.500000 0.500000 0 318767104 0 +( -56 -936 -200 ) ( -56 -896 -200 ) ( -56 -896 -240 ) subway/1_tile_bottom -112 -128 0 0.500000 0.500000 0 318767104 0 +( -56 -856 -200 ) ( -88 -856 -200 ) ( -88 -856 -240 ) subway/1_tile_bottom 384 -128 0 0.500000 0.500000 0 318767104 0 +( -88 -816 -200 ) ( -88 -856 -200 ) ( -88 -856 -240 ) subway/1_tile_bottom -112 -128 0 0.500000 0.500000 0 318767104 0 +} +// brush 3931 +{ +( -88 -816 -160 ) ( -88 -856 -160 ) ( -88 -856 -200 ) subway/1_tile -112 -80 0 0.500000 0.500000 0 318767104 0 +( -56 -856 -184 ) ( -88 -856 -184 ) ( -88 -856 -224 ) subway/1_tile 384 -80 0 0.500000 0.500000 0 318767104 0 +( -56 -936 -176 ) ( -56 -896 -176 ) ( -56 -896 -216 ) subway/1_tile -112 -80 0 0.500000 0.500000 0 318767104 0 +( -88 -896 -184 ) ( -56 -896 -184 ) ( -56 -896 -224 ) subway/1_tile 384 -80 0 0.500000 0.500000 0 318767104 0 +( -80 -856 -184 ) ( -80 -816 -184 ) ( -48 -816 -184 ) subway/1_tile 384 112 0 0.500000 0.500000 0 318767104 0 +( -56 -808 -240 ) ( -88 -808 -240 ) ( -88 -848 -240 ) subway/1_tile 384 112 0 0.500000 0.500000 0 318767104 0 +} +// brush 3932 +{ +( -48 -808 -184 ) ( -80 -808 -184 ) ( -80 -848 -184 ) subway/1_tile_middle 384 128 0 0.500000 0.500000 0 318767104 0 +( -88 -856 -168 ) ( -88 -816 -168 ) ( -56 -816 -168 ) subway/1_tile 384 -96 0 0.500000 0.500000 0 318767104 0 +( -88 -896 -128 ) ( -56 -896 -128 ) ( -56 -896 -168 ) subway/1_tile_middle 384 -48 0 0.500000 0.500000 0 318767104 0 +( -56 -936 -128 ) ( -56 -896 -128 ) ( -56 -896 -168 ) subway/1_tile_middle -112 -48 0 0.500000 0.500000 0 318767104 0 +( -56 -856 -128 ) ( -88 -856 -128 ) ( -88 -856 -168 ) subway/1_tile_middle 384 -48 0 0.500000 0.500000 0 318767104 0 +( -88 -816 -104 ) ( -88 -856 -104 ) ( -88 -856 -144 ) subway/1_tile_middle -112 -48 0 0.500000 0.500000 0 318767104 0 +} +// brush 3933 +{ +( -48 -608 -168 ) ( -80 -608 -168 ) ( -80 -648 -168 ) subway/1_tile 384 304 0 0.500000 0.500000 0 318767104 0 +( -96 -704 -144 ) ( -96 -656 -144 ) ( -48 -656 -144 ) subway/1_tile 384 304 0 0.500000 0.500000 0 318767104 0 +( -96 -704 -144 ) ( -48 -704 -144 ) ( -56 -696 -168 ) subway/1_tile 384 -80 0 0.500000 0.500000 0 318767104 0 +( -48 -696 -144 ) ( -48 -656 -144 ) ( -56 -656 -168 ) subway/1_tile -384 -80 0 0.500000 0.500000 0 318767104 0 +( -48 -656 -112 ) ( -80 -656 -112 ) ( -80 -656 -152 ) subway/1_tile 384 -80 0 0.500000 0.500000 0 318767104 0 +( -96 -656 -144 ) ( -96 -704 -144 ) ( -88 -696 -168 ) subway/1_tile -384 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 3934 +{ +( -48 -608 -184 ) ( -80 -608 -184 ) ( -80 -648 -184 ) subway/1_tile_middle 384 528 0 0.500000 0.500000 0 318767104 0 +( -80 -656 -168 ) ( -80 -616 -168 ) ( -48 -616 -168 ) subway/1_tile 384 -80 0 0.500000 0.500000 0 318767104 0 +( -88 -696 -128 ) ( -56 -696 -128 ) ( -56 -696 -168 ) subway/1_tile_middle 384 -48 0 0.500000 0.500000 0 318767104 0 +( -56 -736 -128 ) ( -56 -696 -128 ) ( -56 -696 -168 ) subway/1_tile_middle -512 -48 0 0.500000 0.500000 0 318767104 0 +( -48 -656 -128 ) ( -80 -656 -128 ) ( -80 -656 -168 ) subway/1_tile_middle 384 -48 0 0.500000 0.500000 0 318767104 0 +( -88 -616 -104 ) ( -88 -656 -104 ) ( -88 -656 -144 ) subway/1_tile_middle -512 -48 0 0.500000 0.500000 0 318767104 0 +} +// brush 3935 +{ +( -56 -608 -240 ) ( -88 -608 -240 ) ( -88 -648 -240 ) subway/1_tile 384 512 0 0.500000 0.500000 0 318767104 0 +( -80 -656 -208 ) ( -80 -616 -208 ) ( -48 -616 -208 ) subway/1_tile 384 512 0 0.500000 0.500000 0 318767104 0 +( -88 -696 -208 ) ( -56 -696 -208 ) ( -56 -696 -248 ) subway/1_tile_damage2 56 -32 0 0.500000 0.500000 0 352321536 0 +( -56 -736 -200 ) ( -56 -696 -200 ) ( -56 -696 -240 ) subway/1_tile_graf5 -8 32 0 0.500000 0.500000 0 352321536 0 +( -48 -656 -208 ) ( -80 -656 -208 ) ( -80 -656 -248 ) subway/1_tile 384 -80 0 0.500000 0.500000 0 318767104 0 +( -88 -616 -184 ) ( -88 -656 -184 ) ( -88 -656 -224 ) subway/1_tile -512 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 3936 +{ +( -88 -616 -200 ) ( -88 -656 -200 ) ( -88 -656 -240 ) subway/1_tile_bottom -512 -128 0 0.500000 0.500000 0 318767104 0 +( -48 -656 -200 ) ( -80 -656 -200 ) ( -80 -656 -240 ) subway/1_tile_bottom 384 -128 0 0.500000 0.500000 0 318767104 0 +( -56 -736 -200 ) ( -56 -696 -200 ) ( -56 -696 -240 ) subway/1_tile_bottom -512 -128 0 0.500000 0.500000 0 318767104 0 +( -88 -696 -200 ) ( -56 -696 -200 ) ( -56 -696 -240 ) subway/1_tile_bottom 384 -128 0 0.500000 0.500000 0 318767104 0 +( -88 -656 -240 ) ( -88 -616 -240 ) ( -56 -616 -240 ) subway/1_tile_bottom 384 464 0 0.500000 0.500000 0 318767104 0 +( -56 -608 -256 ) ( -88 -608 -256 ) ( -88 -648 -256 ) subway/1_tile_bottom 384 464 0 0.500000 0.500000 0 318767104 0 +} +// brush 3937 +{ +( -8 -888 -144 ) ( -8 -856 -144 ) ( -48 -856 -144 ) subway/1_tile 288 -192 0 0.500000 0.500000 0 318767104 0 +( -48 -856 -112 ) ( -8 -856 -112 ) ( -8 -888 -112 ) subway/1_tile 288 -192 0 0.500000 0.500000 0 318767104 0 +( -88 -864 -112 ) ( -88 -896 -112 ) ( -88 -896 -152 ) subway/1_tile 192 -80 0 0.500000 0.500000 0 318767104 0 +( -136 -896 -112 ) ( -96 -896 -112 ) ( -96 -896 -152 ) subway/1_tile 208 -80 0 0.500000 0.500000 0 318767104 0 +( 96 -888 -112 ) ( 96 -856 -112 ) ( 96 -856 -152 ) subway/1_tile 192 -80 0 0.500000 0.500000 0 318767104 0 +( -16 -848 -88 ) ( -56 -848 -88 ) ( -56 -848 -128 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 3938 +{ +( 240 -864 -160 ) ( 200 -864 -160 ) ( 200 -864 -200 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 232 -904 -152 ) ( 232 -872 -152 ) ( 232 -872 -192 ) subway/1_tile -96 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -880 -200 ) ( 208 -880 -200 ) ( 208 -880 -264 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 136 -872 -184 ) ( 136 -904 -184 ) ( 136 -904 -224 ) subway/1_tile -96 -80 0 0.500000 0.500000 0 318767104 0 +( 232 -880 -200 ) ( 160 -880 -200 ) ( 160 -864 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 248 -904 -264 ) ( 248 -872 -264 ) ( 208 -872 -264 ) subway/1_tile -176 96 0 0.500000 0.500000 0 318767104 0 +} +// brush 3939 +{ +( 168 -848 -120 ) ( 72 -848 -120 ) ( 72 -880 -152 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 168 -912 -96 ) ( 168 -880 -96 ) ( 168 -880 -136 ) subway/1_tile -176 -48 0 0.500000 0.500000 0 318767104 0 +( 72 -888 -96 ) ( 112 -888 -96 ) ( 112 -888 -136 ) subway/1_tile -176 -48 0 0.500000 0.500000 0 318767104 0 +( 136 -880 -96 ) ( 136 -912 -96 ) ( 136 -912 -136 ) subway/1_tile -176 -48 0 0.500000 0.500000 0 318767104 0 +( 72 -848 -120 ) ( 168 -848 -120 ) ( 168 -888 -120 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 168 -912 -152 ) ( 168 -880 -152 ) ( 128 -880 -152 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 3940 +{ +( 464 -688 -120 ) ( 464 -688 -112 ) ( 400 -688 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 208 -288 -120 ) ( 208 -288 -112 ) ( 208 -352 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 656 -848 -120 ) ( 656 -848 -112 ) ( 720 -848 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 288 -872 -128 ) ( 288 -872 -120 ) ( 288 -808 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 488 -728 -104 ) ( 488 -664 -104 ) ( 552 -664 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 552 -648 -120 ) ( 488 -648 -120 ) ( 488 -712 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3941 +{ +( -88 -784 -200 ) ( -88 -744 -200 ) ( -88 -744 -240 ) subway/1_tile_bottom 272 -128 0 0.500000 0.500000 0 318767104 0 +( -120 -856 -200 ) ( -88 -856 -200 ) ( -88 -856 -240 ) subway/1_tile_bottom -320 -128 0 0.500000 0.500000 0 318767104 0 +( -96 -696 -200 ) ( -96 -736 -200 ) ( -96 -736 -240 ) subway/1_tile_bottom 272 -128 0 0.500000 0.500000 0 318767104 0 +( -88 -696 -200 ) ( -120 -696 -200 ) ( -120 -696 -240 ) subway/1_tile_bottom -320 -128 0 0.500000 0.500000 0 318767104 0 +( -88 -744 -240 ) ( -88 -784 -240 ) ( -120 -784 -240 ) subway/1_tile_bottom 304 304 0 0.500000 0.500000 0 318767104 0 +( -120 -792 -256 ) ( -88 -792 -256 ) ( -88 -752 -256 ) subway/1_tile_bottom 304 304 0 0.500000 0.500000 0 318767104 0 +} +// brush 3942 +{ +( 192 -672 -152 ) ( 232 -672 -152 ) ( 232 -640 -152 ) subway/1_tile -176 304 0 0.500000 0.500000 0 318767104 0 +( 232 -664 -120 ) ( 232 -704 -120 ) ( 136 -704 -120 ) subway/1_tile -176 304 0 0.500000 0.500000 0 318767104 0 +( 136 -640 -136 ) ( 136 -640 -96 ) ( 136 -672 -96 ) subway/1_tile -560 -48 0 0.500000 0.500000 0 318767104 0 +( 176 -664 -136 ) ( 176 -664 -96 ) ( 136 -664 -96 ) subway/1_tile -176 -48 0 0.500000 0.500000 0 318767104 0 +( 232 -672 -136 ) ( 232 -672 -96 ) ( 232 -640 -96 ) subway/1_tile -560 -48 0 0.500000 0.500000 0 318767104 0 +( 136 -672 -152 ) ( 136 -704 -120 ) ( 232 -704 -120 ) subway/1_tile -176 336 0 0.500000 0.500000 0 318767104 0 +} +// brush 3943 +{ +( 208 -680 -264 ) ( 248 -680 -264 ) ( 248 -648 -264 ) subway/1_tile -176 480 0 0.500000 0.500000 0 318767104 0 +( 160 -688 -216 ) ( 160 -672 -200 ) ( 232 -672 -200 ) subway/1_tile_big 0 384 0 0.500000 0.500000 0 318767104 0 +( 136 -648 -224 ) ( 136 -648 -184 ) ( 136 -680 -184 ) subway/1_tile -480 -80 0 0.500000 0.500000 0 318767104 0 +( 208 -672 -264 ) ( 208 -672 -200 ) ( 136 -672 -200 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +( 232 -680 -192 ) ( 232 -680 -152 ) ( 232 -648 -152 ) subway/1_tile -480 -80 0 0.500000 0.500000 0 318767104 0 +( 200 -688 -200 ) ( 200 -688 -160 ) ( 240 -688 -160 ) subway/1_tile -176 -80 0 0.500000 0.500000 0 318767104 0 +} +// brush 3944 +{ +( 132 -784 -144 ) ( 132 -784 -152 ) ( 116 -784 -152 ) subway/1_black -703 207 540 0.500000 0.500000 134217728 16777216 0 +( 112 -768 -152 ) ( 128 -768 -152 ) ( 128 -768 -144 ) subway/1_black -703 334 540 0.500000 0.500000 134217728 16777216 0 +( 112 -768 -152 ) ( 112 -768 -144 ) ( 112 -800 -144 ) subway/1_black 352 -24 0 0.500000 0.500000 134217728 16777216 0 +( 112 -768 -144 ) ( 128 -768 -144 ) ( 128 -800 -144 ) subway/1_black 1376 144 0 0.500000 0.500000 134217728 16777216 0 +( 128 -768 -144 ) ( 128 -768 -152 ) ( 128 -800 -152 ) subway/1_black 352 -24 0 0.500000 0.500000 134217728 16777216 0 +( 160 -768 -148 ) ( 144 -768 -148 ) ( 144 -800 -148 ) subway/light_yellow 1440 192 0 0.500000 0.500000 134217728 1 10000 +} +// brush 3945 +{ +( 264 -704 -144 ) ( 264 -704 -136 ) ( 200 -704 -136 ) subway/1_tile_big -32 -64 0 0.500000 0.500000 0 318767104 0 +( -88 -288 -144 ) ( -88 -288 -136 ) ( -88 -352 -136 ) subway/1_tile_big_blue 0 -64 0 0.500000 0.500000 0 285212672 0 +( 448 -848 -152 ) ( 448 -848 -144 ) ( 512 -848 -144 ) subway/1_tile_big -32 -64 0 0.500000 0.500000 0 318767104 0 +( 96 -872 -152 ) ( 96 -872 -144 ) ( 96 -808 -144 ) subway/1_tile_big 0 -64 0 0.500000 0.500000 0 318767104 0 +( 296 -728 -128 ) ( 296 -664 -128 ) ( 360 -664 -128 ) subway/1_tile_big -32 0 0 0.500000 0.500000 0 318767104 0 +( 344 -648 -136 ) ( 280 -648 -136 ) ( 280 -712 -136 ) subway/con14 192 112 0 0.500000 0.500000 0 285212672 0 +} +// brush 3946 +{ +( 8 -776 -136 ) ( 8 -800 -136 ) ( 8 -800 -144 ) subway/1_black 384 -24 0 0.500000 0.500000 134217728 16777216 0 +( 40 -776 -136 ) ( 8 -776 -136 ) ( 8 -776 -144 ) subway/1_black 352 -24 0 0.500000 0.500000 134217728 16777216 0 +( 52 -800 -136 ) ( 52 -776 -136 ) ( 52 -776 -144 ) subway/1_black 384 -24 0 0.500000 0.500000 134217728 16777216 0 +( 24 -792 -136 ) ( 56 -792 -136 ) ( 56 -792 -144 ) subway/1_black 352 -24 0 0.500000 0.500000 134217728 16777216 0 +( 8 -800 -136 ) ( 8 -776 -136 ) ( 40 -776 -136 ) subway/1_black 352 8 0 0.500000 0.500000 134217728 16777216 0 +( 40 -776 -140 ) ( 8 -776 -140 ) ( 8 -800 -140 ) subway/light_tube -16 -16 0 0.500000 0.500000 0 16777217 5000 +} +// brush 3947 +{ +( 648 -1120 -256 ) ( 648 -1056 -256 ) ( 584 -1056 -256 ) subway/metal_rust 0 -16 0 0.500000 0.500000 0 16777216 0 +( 232 -688 -216 ) ( 232 -696 -216 ) ( 136 -696 -248 ) subway/metal_rust 0 -16 0 0.500000 0.500000 0 16777216 0 +( 424 -696 -264 ) ( 424 -696 -256 ) ( 488 -696 -256 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( 136 -928 -256 ) ( 136 -928 -248 ) ( 136 -992 -248 ) subway/metal_rust 16 0 0 0.500000 0.500000 0 16777216 0 +( 1032 -688 -256 ) ( 1032 -688 -248 ) ( 968 -688 -248 ) subway/metal_rust 0 0 0 0.500000 0.500000 0 16777216 0 +( 232 -696 -216 ) ( 232 -688 -216 ) ( 232 -688 -256 ) subway/metal_rust 16 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3948 +{ +( 272 -496 -152 ) ( 272 -432 -152 ) ( 208 -432 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 320 -688 -104 ) ( 320 -680 -104 ) ( 400 -680 -104 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 248 -688 -120 ) ( 248 -688 -152 ) ( 248 -680 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 248 -688 -152 ) ( 248 -688 -120 ) ( 616 -688 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 27 +( 352 -136 -128 ) ( 352 -72 -128 ) ( 352 -72 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 424 -680 -120 ) ( 288 -680 -120 ) ( 288 -680 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3949 +{ +( 344 -440 -216 ) ( 280 -440 -216 ) ( 280 -504 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 280 -520 -184 ) ( 280 -456 -184 ) ( 344 -456 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 352 -696 -184 ) ( 352 -688 -184 ) ( 352 -688 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 280 -696 -184 ) ( 440 -696 -184 ) ( 440 -696 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 29 +( 248 -696 -216 ) ( 248 -688 -216 ) ( 248 -688 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 192 -688 -216 ) ( 352 -688 -216 ) ( 352 -688 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3950 +{ +( 184 -688 -184 ) ( 344 -688 -184 ) ( 344 -688 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 248 -696 -152 ) ( 248 -696 -184 ) ( 248 -688 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 256 -696 -184 ) ( 256 -696 -152 ) ( 592 -696 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 29 +( 352 -696 -152 ) ( 352 -688 -144 ) ( 352 -688 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 160 -696 -152 ) ( 152 -688 -144 ) ( 480 -688 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 29 +( 248 -688 -184 ) ( 168 -688 -184 ) ( 160 -696 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3951 +{ +( 744 -1120 -224 ) ( 744 -1056 -224 ) ( 680 -1056 -224 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 664 -1056 -216 ) ( 728 -1056 -216 ) ( 728 -1120 -216 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 512 -856 -232 ) ( 512 -856 -224 ) ( 576 -856 -224 ) subway/1_lobby_floor 752 16 0 0.500000 0.500000 0 285212672 0 +( 232 -928 -224 ) ( 232 -928 -216 ) ( 232 -992 -216 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 1056 -600 -224 ) ( 1056 -600 -216 ) ( 992 -600 -216 ) subway/1_lobby_floor 752 16 0 0.500000 0.500000 0 285212672 0 +( 552 -1120 -224 ) ( 552 -1120 -216 ) ( 552 -1056 -216 ) subway/1_lobby_floor 432 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3952 +{ +( 304 120 -128 ) ( 240 120 -128 ) ( 240 112 -128 ) subway/1_tile -1216 -32 0 0.500000 0.500000 0 318767104 0 +( 240 112 -120 ) ( 240 120 -120 ) ( 304 120 -120 ) subway/1_tile -1216 -32 0 0.500000 0.500000 0 318767104 0 +( 240 104 -120 ) ( 304 104 -120 ) ( 304 104 -152 ) subway/1_tile -1216 -32 0 0.500000 0.500000 0 318767104 0 +( 264 112 -120 ) ( 264 120 -120 ) ( 264 120 -152 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 304 128 -120 ) ( 240 128 -120 ) ( 240 128 -152 ) subway/1_tile -1216 -32 0 0.500000 0.500000 0 318767104 0 +( 240 120 -120 ) ( 240 112 -120 ) ( 240 112 -152 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3953 +{ +( 224 120 -120 ) ( 224 112 -120 ) ( 224 112 -152 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 288 112 -120 ) ( 224 112 -120 ) ( 224 112 -152 ) subway/1_tile -1184 -32 0 0.500000 0.500000 0 318767104 0 +( 240 112 -120 ) ( 240 120 -120 ) ( 240 120 -152 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 224 104 -120 ) ( 288 104 -120 ) ( 288 104 -152 ) subway/1_tile -1184 -32 0 0.500000 0.500000 0 318767104 0 +( 224 112 -120 ) ( 224 120 -120 ) ( 288 120 -120 ) subway/1_tile -1184 -32 0 0.500000 0.500000 0 318767104 0 +( 288 120 -128 ) ( 224 120 -128 ) ( 224 112 -128 ) subway/1_tile -1184 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3954 +{ +( 200 120 -120 ) ( 200 112 -120 ) ( 200 112 -152 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 264 128 -120 ) ( 200 128 -120 ) ( 200 128 -152 ) subway/1_tile -1136 -32 0 0.500000 0.500000 0 318767104 0 +( 224 112 -120 ) ( 224 120 -120 ) ( 224 120 -152 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 200 104 -120 ) ( 264 104 -120 ) ( 264 104 -152 ) subway/1_tile -1136 -32 0 0.500000 0.500000 0 318767104 0 +( 200 112 -120 ) ( 200 120 -120 ) ( 264 120 -120 ) subway/1_tile -1136 -32 0 0.500000 0.500000 0 318767104 0 +( 264 120 -128 ) ( 200 120 -128 ) ( 200 112 -128 ) subway/1_tile -1136 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3955 +{ +( 336 128 -128 ) ( 336 128 -200 ) ( 272 128 -200 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 168 128 -200 ) ( 168 128 -128 ) ( 168 136 -128 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( -32 136 -96 ) ( -168 136 -96 ) ( -168 136 -200 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 136 128 -128 ) ( 136 128 -200 ) ( 136 136 -200 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 520 200 -128 ) ( 520 136 -128 ) ( 456 136 -128 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 456 136 -200 ) ( 520 136 -200 ) ( 520 200 -200 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +} +// brush 3956 +{ +( 336 128 -200 ) ( 336 128 -216 ) ( 272 128 -216 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +( 168 128 -216 ) ( 168 128 -200 ) ( 168 136 -200 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( -80 136 -200 ) ( -216 136 -200 ) ( -216 136 -216 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +( 136 128 -200 ) ( 136 128 -216 ) ( 136 136 -216 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( 520 200 -200 ) ( 520 136 -200 ) ( 456 136 -200 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 456 136 -216 ) ( 520 136 -216 ) ( 520 200 -216 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +} +// brush 3957 +{ +( 448 136 -216 ) ( 512 136 -216 ) ( 512 200 -216 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 512 200 -200 ) ( 512 136 -200 ) ( 448 136 -200 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 168 128 -200 ) ( 168 128 -216 ) ( 168 136 -216 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( -88 136 -200 ) ( -224 136 -200 ) ( -224 136 -216 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +( 200 136 -216 ) ( 200 136 -200 ) ( 200 144 -200 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( 328 104 -200 ) ( 328 104 -216 ) ( 264 104 -216 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3958 +{ +( 448 136 -200 ) ( 512 136 -200 ) ( 512 200 -200 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 512 200 -120 ) ( 512 136 -120 ) ( 448 136 -120 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 168 128 -128 ) ( 168 128 -200 ) ( 168 136 -200 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( -40 136 -96 ) ( -176 136 -96 ) ( -176 136 -200 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 200 136 -200 ) ( 200 136 -128 ) ( 200 144 -128 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 328 104 -128 ) ( 328 104 -200 ) ( 264 104 -200 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3959 +{ +( 680 136 -216 ) ( 744 136 -216 ) ( 744 200 -216 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 744 200 -200 ) ( 744 136 -200 ) ( 680 136 -200 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 296 128 -200 ) ( 296 128 -216 ) ( 296 136 -216 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( 144 136 -200 ) ( 8 136 -200 ) ( 8 136 -216 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +( 584 136 -216 ) ( 584 136 -200 ) ( 584 144 -200 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( 496 128 -200 ) ( 496 128 -216 ) ( 432 128 -216 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3960 +{ +( 280 -392 -120 ) ( 280 -392 -88 ) ( 280 -776 -88 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 496 0 -88 ) ( 496 0 -120 ) ( 504 0 -120 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 488 -864 -88 ) ( 488 -864 -120 ) ( 488 -1008 -120 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 392 -96 -88 ) ( 384 -96 -88 ) ( 384 -96 -56 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 520 -424 -112 ) ( 520 -360 -112 ) ( 584 -360 -112 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 584 -360 -120 ) ( 520 -360 -120 ) ( 520 -424 -120 ) subway/1_concrete_floor -16 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3961 +{ +( 584 -360 -224 ) ( 520 -360 -224 ) ( 520 -424 -224 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 520 -424 -216 ) ( 520 -360 -216 ) ( 584 -360 -216 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 448 -96 -192 ) ( 440 -96 -192 ) ( 440 -96 -160 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 488 -832 -192 ) ( 488 -832 -224 ) ( 488 -976 -224 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 496 0 -192 ) ( 496 0 -224 ) ( 504 0 -224 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 280 -200 -224 ) ( 280 -200 -192 ) ( 280 -584 -192 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3962 +{ +( 368 -24 -116 ) ( 368 -48 -116 ) ( 368 -48 -124 ) subway/1_black 1920 80 0 0.500000 0.500000 134217728 16777216 0 +( 388 -24 -116 ) ( 364 -24 -116 ) ( 364 -24 -124 ) subway/1_black 3168 80 0 0.500000 0.500000 134217728 16777216 0 +( 384 -44 -116 ) ( 384 -20 -116 ) ( 384 -20 -124 ) subway/1_black 1920 80 0 0.500000 0.500000 134217728 16777216 0 +( 368 -40 -116 ) ( 392 -40 -116 ) ( 392 -40 -124 ) subway/1_black 3168 80 0 0.500000 0.500000 134217728 16777216 0 +( 364 -48 -120 ) ( 364 -24 -120 ) ( 388 -24 -120 ) subway/1_black 3168 -336 0 0.500000 0.500000 134217728 16777216 0 +( 388 -24 -124 ) ( 364 -24 -124 ) ( 364 -48 -124 ) subway/light_yellow 448 400 0 0.500000 0.500000 134217728 16777217 10000 +} +// brush 3963 +{ +( 464 -200 -116 ) ( 464 -224 -116 ) ( 464 -224 -124 ) subway/1_black 2272 80 0 0.500000 0.500000 134217728 16777216 0 +( 484 -200 -116 ) ( 460 -200 -116 ) ( 460 -200 -124 ) subway/1_black 2992 80 0 0.500000 0.500000 134217728 16777216 0 +( 480 -220 -116 ) ( 480 -196 -116 ) ( 480 -196 -124 ) subway/1_black 2272 80 0 0.500000 0.500000 134217728 16777216 0 +( 464 -216 -116 ) ( 488 -216 -116 ) ( 488 -216 -124 ) subway/1_black 2992 80 0 0.500000 0.500000 134217728 16777216 0 +( 460 -224 -120 ) ( 460 -200 -120 ) ( 484 -200 -120 ) subway/1_black 2992 -688 0 0.500000 0.500000 134217728 16777216 0 +( 484 -200 -124 ) ( 460 -200 -124 ) ( 460 -224 -124 ) subway/light_yellow 288 48 0 0.500000 0.500000 134217728 16777217 7000 +} +// brush 3964 +{ +( 1324 -104 -128 ) ( 1324 -120 -128 ) ( 1324 -120 -160 ) subway/light_yellow 784 0 0 0.500000 0.500000 134217728 1 10000 +( 1328 -104 -128 ) ( 1320 -104 -128 ) ( 1320 -104 -160 ) subway/1_black -240 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1328 -120 -128 ) ( 1328 -104 -128 ) ( 1328 -104 -160 ) subway/1_black 736 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1320 -120 -128 ) ( 1328 -120 -128 ) ( 1328 -120 -160 ) subway/1_black -240 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1320 -120 -128 ) ( 1320 -104 -128 ) ( 1328 -104 -128 ) subway/1_black -240 -736 0 0.500000 0.500000 134217728 16777216 0 +( 1328 -100 -144 ) ( 1320 -100 -144 ) ( 1320 -116 -144 ) subway/1_black -240 -736 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3965 +{ +( 400 -104 -152 ) ( 400 -104 -120 ) ( 408 -96 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 176 -104 -152 ) ( 176 -104 -120 ) ( 336 -104 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 176 -104 -120 ) ( 176 -104 -152 ) ( 184 -96 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 360 -96 -120 ) ( 368 -96 -120 ) ( 368 -96 -88 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 328 -104 -120 ) ( 328 -96 -120 ) ( 424 -96 -120 ) subway/1_lobby2 0 -48 0 0.500000 0.500000 0 285212672 0 +( 240 8 -152 ) ( 304 8 -152 ) ( 304 72 -152 ) subway/1_lobby2 0 -48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3966 +{ +( 288 128 -128 ) ( 224 128 -128 ) ( 224 120 -128 ) subway/light_yellow 0 32 0 0.500000 0.500000 0 16777217 15000 +( 224 120 -120 ) ( 224 128 -120 ) ( 288 128 -120 ) subway/1_tile -1184 -16 0 0.500000 0.500000 0 318767104 0 +( 224 112 -120 ) ( 288 112 -120 ) ( 288 112 -152 ) subway/1_tile -1184 -32 0 0.500000 0.500000 0 318767104 0 +( 240 120 -120 ) ( 240 128 -120 ) ( 240 128 -152 ) subway/1_tile -1280 -32 0 0.500000 0.500000 0 318767104 0 +( 288 128 -120 ) ( 224 128 -120 ) ( 224 128 -152 ) subway/1_tile -1184 -32 0 0.500000 0.500000 0 318767104 0 +( 224 128 -120 ) ( 224 120 -120 ) ( 224 120 -152 ) subway/1_tile -1280 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 3967 +{ +( 408 -264 -224 ) ( 408 -264 -192 ) ( 408 -648 -192 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 584 -96 -192 ) ( 584 -96 -224 ) ( 592 -96 -224 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 584 -896 -192 ) ( 584 -896 -224 ) ( 584 -1040 -224 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 472 -320 -192 ) ( 464 -320 -192 ) ( 464 -320 -160 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 608 -488 -216 ) ( 608 -424 -216 ) ( 672 -424 -216 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 672 -424 -224 ) ( 608 -424 -224 ) ( 608 -488 -224 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3968 +{ +( 400 -104 -184 ) ( 400 -104 -152 ) ( 408 -96 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 176 -104 -184 ) ( 176 -104 -152 ) ( 336 -104 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 176 -104 -152 ) ( 176 -104 -184 ) ( 184 -96 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 360 -96 -152 ) ( 368 -96 -152 ) ( 368 -96 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 304 72 -152 ) ( 304 8 -152 ) ( 240 8 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 240 8 -184 ) ( 304 8 -184 ) ( 304 72 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3969 +{ +( 400 -104 -216 ) ( 400 -104 -184 ) ( 408 -96 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 176 -104 -216 ) ( 176 -104 -184 ) ( 336 -104 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 176 -104 -184 ) ( 176 -104 -216 ) ( 184 -96 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 360 -96 -184 ) ( 368 -96 -184 ) ( 368 -96 -152 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 304 72 -184 ) ( 304 8 -184 ) ( 240 8 -184 ) subway/1_lobby1 0 -48 0 0.500000 0.500000 0 285212672 0 +( 328 -96 -216 ) ( 344 -104 -216 ) ( 416 -104 -216 ) subway/1_lobby1 0 -48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3970 +{ +( 496 -88 -184 ) ( 496 -88 -152 ) ( 488 -96 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 496 -88 -152 ) ( 496 -88 -184 ) ( 584 -88 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -672 -152 ) ( 584 -672 -184 ) ( 584 -816 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 536 -96 -152 ) ( 528 -96 -152 ) ( 528 -96 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 608 -264 -152 ) ( 608 -200 -152 ) ( 672 -200 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 672 -200 -184 ) ( 608 -200 -184 ) ( 608 -264 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3971 +{ +( 496 -88 -216 ) ( 496 -88 -184 ) ( 488 -96 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 496 -88 -184 ) ( 496 -88 -216 ) ( 584 -88 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -672 -184 ) ( 584 -672 -216 ) ( 584 -816 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 -96 -184 ) ( 528 -96 -184 ) ( 528 -96 -152 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 608 -264 -184 ) ( 608 -200 -184 ) ( 672 -200 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 672 -200 -216 ) ( 608 -200 -216 ) ( 608 -264 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3972 +{ +( 496 -88 -152 ) ( 496 -88 -120 ) ( 488 -96 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 496 -88 -120 ) ( 496 -88 -152 ) ( 584 -88 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -672 -120 ) ( 584 -672 -152 ) ( 584 -816 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 -96 -120 ) ( 528 -96 -120 ) ( 528 -96 -88 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 608 -264 -120 ) ( 608 -200 -120 ) ( 672 -200 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 672 -200 -152 ) ( 608 -200 -152 ) ( 608 -264 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3973 +{ +( 312 112 -216 ) ( 376 112 -216 ) ( 376 176 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 376 176 -184 ) ( 376 112 -184 ) ( 312 112 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 336 8 -184 ) ( 336 8 -216 ) ( 496 8 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 288 8 -216 ) ( 288 8 -184 ) ( 280 0 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 280 0 -216 ) ( 280 0 -184 ) ( 440 0 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 488 0 -216 ) ( 488 0 -184 ) ( 496 8 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3974 +{ +( 312 112 -184 ) ( 376 112 -184 ) ( 376 176 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 376 176 -152 ) ( 376 112 -152 ) ( 312 112 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 336 8 -152 ) ( 336 8 -184 ) ( 496 8 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 288 8 -184 ) ( 288 8 -152 ) ( 280 0 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 280 0 -184 ) ( 280 0 -152 ) ( 440 0 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 488 0 -184 ) ( 488 0 -152 ) ( 496 8 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3975 +{ +( 312 112 -152 ) ( 376 112 -152 ) ( 376 176 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 376 176 -120 ) ( 376 112 -120 ) ( 312 112 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 336 8 -120 ) ( 336 8 -152 ) ( 496 8 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 288 8 -152 ) ( 288 8 -120 ) ( 280 0 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 280 0 -152 ) ( 280 0 -120 ) ( 440 0 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 488 0 -152 ) ( 488 0 -120 ) ( 496 8 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3976 +{ +( 496 8 -152 ) ( 496 8 -120 ) ( 488 0 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 496 8 -120 ) ( 496 8 -152 ) ( 496 -88 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 496 -88 -120 ) ( 496 -88 -152 ) ( 488 -96 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 488 -48 -120 ) ( 488 -40 -120 ) ( 488 -40 -88 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 320 -120 -120 ) ( 384 -120 -120 ) ( 384 -184 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 384 -184 -152 ) ( 384 -120 -152 ) ( 320 -120 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3977 +{ +( 584 -864 -224 ) ( 584 -864 -216 ) ( 584 -800 -216 ) subway/1_lobby_floor 432 16 0 0.500000 0.500000 0 285212672 0 +( 1072 -416 -224 ) ( 1072 -416 -216 ) ( 1008 -416 -216 ) subway/1_lobby_floor 752 16 0 0.500000 0.500000 0 285212672 0 +( 400 -680 -224 ) ( 400 -680 -216 ) ( 400 -744 -216 ) subway/1_lobby_floor 432 16 0 0.500000 0.500000 0 285212672 0 +( 512 -600 -232 ) ( 512 -600 -224 ) ( 576 -600 -224 ) subway/1_lobby_floor 752 16 0 0.500000 0.500000 0 285212672 0 +( 664 -800 -216 ) ( 728 -800 -216 ) ( 728 -864 -216 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 744 -864 -224 ) ( 744 -800 -224 ) ( 680 -800 -224 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +} +// brush 3978 +{ +( 1088 -600 -184 ) ( 1088 -600 -152 ) ( 704 -600 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 576 -616 -152 ) ( 576 -616 -184 ) ( 576 -624 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -184 -632 -152 ) ( -184 -632 -184 ) ( -328 -632 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 544 -632 -184 ) ( 544 -624 -184 ) ( 544 -624 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 408 -656 -152 ) ( 472 -656 -152 ) ( 472 -720 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 472 -720 -184 ) ( 472 -656 -184 ) ( 408 -656 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3979 +{ +( 1096 -624 -216 ) ( 856 -624 -216 ) ( 856 -632 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 408 -656 -184 ) ( 472 -656 -184 ) ( 472 -720 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 544 -632 -216 ) ( 544 -624 -216 ) ( 544 -624 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -184 -632 -184 ) ( -184 -632 -216 ) ( -328 -632 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 -616 -184 ) ( 576 -616 -216 ) ( 576 -624 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1088 -600 -216 ) ( 1088 -600 -184 ) ( 704 -600 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3980 +{ +( 1088 -600 -152 ) ( 1088 -600 -120 ) ( 704 -600 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 -608 -120 ) ( 576 -608 -152 ) ( 576 -616 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -184 -624 -120 ) ( -184 -624 -152 ) ( -328 -624 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 544 -624 -152 ) ( 544 -616 -152 ) ( 544 -616 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 408 -648 -120 ) ( 472 -648 -120 ) ( 472 -712 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 472 -712 -152 ) ( 472 -648 -152 ) ( 408 -648 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3981 +{ +( 528 -632 -136 ) ( 544 -632 -160 ) ( 544 -600 -160 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 544 -632 -136 ) ( 528 -632 -136 ) ( 528 -600 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 544 -600 -136 ) ( 544 -600 -160 ) ( 544 -632 -160 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 504 -600 -168 ) ( 536 -600 -168 ) ( 536 -600 -128 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 536 -632 -128 ) ( 536 -632 -168 ) ( 504 -632 -168 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3982 +{ +( 912 -392 -216 ) ( 912 -392 -184 ) ( 528 -392 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 400 -416 -184 ) ( 400 -416 -216 ) ( 400 -424 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -360 -632 -184 ) ( -360 -632 -216 ) ( -504 -632 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 360 -624 -216 ) ( 360 -616 -216 ) ( 360 -616 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 232 -648 -184 ) ( 296 -648 -184 ) ( 296 -712 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 920 -616 -216 ) ( 680 -616 -216 ) ( 680 -624 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3983 +{ +( 912 -392 -184 ) ( 912 -392 -152 ) ( 528 -392 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 400 -416 -152 ) ( 400 -416 -184 ) ( 400 -424 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -360 -632 -152 ) ( -360 -632 -184 ) ( -504 -632 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 360 -624 -184 ) ( 360 -616 -184 ) ( 360 -616 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 232 -648 -152 ) ( 296 -648 -152 ) ( 296 -712 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 296 -712 -184 ) ( 296 -648 -184 ) ( 232 -648 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3984 +{ +( 296 -680 -136 ) ( 296 -616 -136 ) ( 232 -616 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 232 -616 -120 ) ( 296 -616 -120 ) ( 296 -680 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 360 -592 -168 ) ( 360 -584 -168 ) ( 360 -584 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -360 -600 -120 ) ( -360 -600 -152 ) ( -504 -600 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 416 -376 -120 ) ( 416 -376 -152 ) ( 416 -384 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 912 -392 -168 ) ( 912 -392 -136 ) ( 528 -392 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3985 +{ +( 440 -632 -168 ) ( 408 -632 -168 ) ( 408 -632 -128 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 408 -392 -128 ) ( 408 -392 -168 ) ( 440 -392 -168 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 400 -432 -160 ) ( 400 -400 -160 ) ( 400 -400 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 416 -592 -136 ) ( 416 -624 -136 ) ( 400 -624 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 400 -592 -160 ) ( 400 -624 -160 ) ( 416 -624 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3986 +{ +( 368 -720 -136 ) ( 368 -656 -136 ) ( 304 -656 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 304 -656 -120 ) ( 368 -656 -120 ) ( 368 -720 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 400 -632 -152 ) ( 400 -624 -152 ) ( 400 -624 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -288 -632 -120 ) ( -288 -632 -152 ) ( -432 -632 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 544 -616 -120 ) ( 544 -616 -152 ) ( 544 -624 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 984 -600 -152 ) ( 984 -600 -120 ) ( 600 -600 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3987 +{ +( 592 -432 -136 ) ( 592 -416 -160 ) ( 560 -416 -160 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 592 -416 -136 ) ( 592 -432 -136 ) ( 560 -432 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 552 -416 -136 ) ( 552 -416 -160 ) ( 584 -416 -160 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 392 -456 -168 ) ( 392 -424 -168 ) ( 392 -424 -128 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 552 -424 -128 ) ( 552 -424 -168 ) ( 552 -456 -168 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3988 +{ +( 1136 -160 -112 ) ( 1072 -160 -112 ) ( 1072 -160 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 1328 264 -112 ) ( 1328 328 -112 ) ( 1328 328 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 816 -200 -112 ) ( 880 -200 -112 ) ( 880 -200 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 880 -176 -120 ) ( 880 -240 -120 ) ( 880 -240 -128 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 984 -32 -104 ) ( 1048 -32 -104 ) ( 1048 -96 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1048 -80 -120 ) ( 1048 -16 -120 ) ( 984 -16 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +} +// brush 3989 +{ +( 1064 -40 -96 ) ( 1000 -40 -96 ) ( 1000 -40 -104 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 1328 48 -96 ) ( 1328 112 -96 ) ( 1328 112 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 712 -160 -96 ) ( 776 -160 -96 ) ( 776 -160 -104 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 904 -408 -104 ) ( 904 -472 -104 ) ( 904 -472 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 896 -248 -96 ) ( 960 -248 -96 ) ( 960 -312 -96 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 960 -296 -104 ) ( 960 -232 -104 ) ( 896 -232 -104 ) subway/con14 176 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3990 +{ +( 872 -168 -216 ) ( 872 -208 -216 ) ( 904 -208 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 -200 -200 ) ( 872 -200 -200 ) ( 872 -160 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 -160 -200 ) ( 904 -160 -160 ) ( 872 -160 -160 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 -208 -200 ) ( 904 -208 -160 ) ( 904 -168 -160 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -200 -200 ) ( 872 -200 -160 ) ( 904 -200 -160 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -160 -200 ) ( 872 -160 -160 ) ( 872 -200 -160 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3991 +{ +( 872 -168 -200 ) ( 872 -208 -200 ) ( 904 -208 -200 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 -200 -152 ) ( 872 -200 -152 ) ( 872 -160 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 -160 -184 ) ( 904 -160 -144 ) ( 872 -160 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 -208 -184 ) ( 904 -208 -144 ) ( 904 -168 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 -200 -184 ) ( 872 -200 -144 ) ( 904 -200 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 -160 -184 ) ( 872 -160 -144 ) ( 872 -200 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3992 +{ +( 1128 -192 -184 ) ( 1312 -192 -184 ) ( 1312 -192 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 -192 -184 ) ( 904 -192 -216 ) ( 904 -184 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1072 -184 -216 ) ( 1072 -184 -184 ) ( 912 -184 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1304 -184 -216 ) ( 1304 -192 -216 ) ( 1304 -192 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1000 -424 -184 ) ( 936 -424 -184 ) ( 936 -360 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 928 -376 -216 ) ( 928 -440 -216 ) ( 992 -440 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3993 +{ +( 1032 -200 -152 ) ( 1032 -200 -120 ) ( 1168 -200 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1304 -808 -152 ) ( 1304 -808 -144 ) ( 1304 -744 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1432 -192 -152 ) ( 1432 -192 -144 ) ( 1368 -192 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 904 -200 -120 ) ( 904 -200 -152 ) ( 904 -192 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 134217728 285212672 0 +( 1048 -200 -120 ) ( 968 -200 -120 ) ( 968 -192 -120 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 134217728 285212672 0 +( 856 -448 -152 ) ( 920 -448 -152 ) ( 920 -384 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 134217728 285212672 0 +} +// brush 3994 +{ +( 992 232 -216 ) ( 928 232 -216 ) ( 928 168 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 928 152 -184 ) ( 928 216 -184 ) ( 992 216 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1104 0 -184 ) ( 1104 0 -216 ) ( 1104 -8 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1168 -24 -184 ) ( 1328 -24 -184 ) ( 1328 -24 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 -24 -216 ) ( 904 -16 -216 ) ( 904 -16 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1328 -16 -216 ) ( 1328 -16 -184 ) ( 1144 -16 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3995 +{ +( 920 176 -152 ) ( 920 240 -152 ) ( 856 240 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 968 -16 -120 ) ( 968 -8 -120 ) ( 1048 -8 -120 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 -16 -152 ) ( 904 -8 -152 ) ( 904 -8 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1376 -16 -144 ) ( 1440 -16 -144 ) ( 1440 -16 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1104 544 -144 ) ( 1104 608 -144 ) ( 1104 608 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1072 -8 -120 ) ( 936 -8 -120 ) ( 936 -8 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3996 +{ +( 1304 -168 -200 ) ( 1304 -168 -160 ) ( 1304 -208 -160 ) subway/1_lobby1 -32 16 0 0.500000 0.500000 0 285212672 0 +( 1304 -200 -200 ) ( 1304 -200 -160 ) ( 1336 -200 -160 ) subway/1_lobby1 -32 16 0 0.500000 0.500000 0 285212672 0 +( 1336 -208 -200 ) ( 1336 -208 -160 ) ( 1336 -168 -160 ) subway/1_lobby1 -32 16 0 0.500000 0.500000 0 285212672 0 +( 1336 -168 -200 ) ( 1336 -168 -160 ) ( 1304 -168 -160 ) subway/1_lobby1 -32 16 0 0.500000 0.500000 0 285212672 0 +( 1336 -208 -200 ) ( 1304 -208 -200 ) ( 1304 -168 -200 ) subway/1_lobby1 -32 48 0 0.500000 0.500000 0 285212672 0 +( 1304 -176 -216 ) ( 1304 -216 -216 ) ( 1336 -216 -216 ) subway/1_lobby1 -32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3997 +{ +( 1304 -176 -200 ) ( 1304 -216 -200 ) ( 1336 -216 -200 ) subway/1_lobby1a -32 32 0 0.500000 0.500000 0 285212672 0 +( 1336 -208 -136 ) ( 1304 -208 -136 ) ( 1304 -168 -136 ) subway/1_lobby1a -32 32 0 0.500000 0.500000 0 285212672 0 +( 1336 -168 -184 ) ( 1336 -168 -144 ) ( 1304 -168 -144 ) subway/1_lobby1a -32 0 0 0.500000 0.500000 0 285212672 0 +( 1336 -208 -184 ) ( 1336 -208 -144 ) ( 1336 -168 -144 ) subway/1_lobby1a -32 0 0 0.500000 0.500000 0 285212672 0 +( 1304 -200 -184 ) ( 1304 -200 -144 ) ( 1336 -200 -144 ) subway/1_lobby1a -32 0 0 0.500000 0.500000 0 285212672 0 +( 1304 -168 -184 ) ( 1304 -168 -144 ) ( 1304 -208 -144 ) subway/1_lobby1a -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3998 +{ +( 1304 -168 -168 ) ( 1304 -168 -128 ) ( 1304 -208 -128 ) subway/1_lobby2 -32 16 0 0.500000 0.500000 0 285212672 0 +( 1304 -200 -168 ) ( 1304 -200 -128 ) ( 1336 -200 -128 ) subway/1_lobby2 -32 16 0 0.500000 0.500000 0 285212672 0 +( 1336 -208 -168 ) ( 1336 -208 -128 ) ( 1336 -168 -128 ) subway/1_lobby2 -32 16 0 0.500000 0.500000 0 285212672 0 +( 1336 -168 -168 ) ( 1336 -168 -128 ) ( 1304 -168 -128 ) subway/1_lobby2 -32 16 0 0.500000 0.500000 0 285212672 0 +( 1336 -208 -120 ) ( 1304 -208 -120 ) ( 1304 -168 -120 ) subway/1_lobby2 -32 48 0 0.500000 0.500000 0 285212672 0 +( 1304 -168 -136 ) ( 1304 -208 -136 ) ( 1336 -208 -136 ) subway/1_lobby2 -32 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3999 +{ +( 904 0 -200 ) ( 872 0 -200 ) ( 872 -40 -200 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 -48 -152 ) ( 872 -8 -152 ) ( 904 -8 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 -48 -144 ) ( 904 -48 -144 ) ( 904 -48 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 -40 -144 ) ( 904 0 -144 ) ( 904 0 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 16 -144 ) ( 872 16 -144 ) ( 872 16 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 -8 -144 ) ( 872 -48 -144 ) ( 872 -48 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4000 +{ +( 904 0 -216 ) ( 872 0 -216 ) ( 872 -40 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -48 -200 ) ( 872 -8 -200 ) ( 904 -8 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -48 -160 ) ( 904 -48 -160 ) ( 904 -48 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 -40 -160 ) ( 904 0 -160 ) ( 904 0 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 16 -160 ) ( 872 16 -160 ) ( 872 16 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -8 -160 ) ( 872 -48 -160 ) ( 872 -48 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4001 +{ +( 1336 -184 -120 ) ( 1336 -48 -120 ) ( 1336 -48 -152 ) subway/1_lobby2 -48 16 0 0.500000 0.500000 0 285212672 0 +( 1880 -184 -144 ) ( 1944 -184 -144 ) ( 1944 -184 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1328 16 -144 ) ( 1328 -48 -144 ) ( 1328 -48 -152 ) subway/1_lobby2 -48 16 0 0.500000 0.500000 0 285212672 0 +( 1328 240 -152 ) ( 1336 240 -152 ) ( 1336 240 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1328 -80 -120 ) ( 1336 -80 -120 ) ( 1336 -160 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1520 -32 -152 ) ( 1584 -32 -152 ) ( 1584 32 -152 ) subway/1_lobby2 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4002 +{ +( 1328 -8 -184 ) ( 1328 72 -184 ) ( 1320 80 -184 ) subway/1_lobby1a 0 48 0 0.500000 0.500000 0 285212672 0 +( 1320 80 -152 ) ( 1328 88 -144 ) ( 1328 -240 -144 ) subway/1_lobby1a -48 0 0 0.500000 0.500000 0 285212672 0 +( 1328 -184 -144 ) ( 1328 -184 -184 ) ( 1320 -184 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1320 -376 -184 ) ( 1320 -376 -176 ) ( 1320 -440 -176 ) subway/1_lobby1a -48 0 0 0.500000 0.500000 0 285212672 0 +( 1320 240 -184 ) ( 1328 240 -184 ) ( 1328 240 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1328 64 -184 ) ( 1328 64 -144 ) ( 1328 248 -144 ) subway/1_lobby1a -48 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4003 +{ +( 1328 64 -216 ) ( 1328 64 -184 ) ( 1328 248 -184 ) subway/1_lobby1 -48 16 0 0.500000 0.500000 0 285212672 0 +( 1320 240 -216 ) ( 1328 240 -216 ) ( 1328 240 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1320 -264 -184 ) ( 1320 -424 -184 ) ( 1320 -424 -216 ) subway/1_lobby1 -48 16 0 0.500000 0.500000 0 285212672 0 +( 1328 -184 -184 ) ( 1328 -184 -216 ) ( 1320 -184 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1496 -40 -184 ) ( 1560 -40 -184 ) ( 1560 -104 -184 ) subway/1_lobby1 0 0 0 0.500000 0.500000 0 285212672 0 +( 1576 -104 -216 ) ( 1576 -40 -216 ) ( 1512 -40 -216 ) subway/1_lobby1 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4004 +{ +( 872 -344 -192 ) ( 864 -344 -192 ) ( 864 -416 -192 ) subway/1_black 0 -480 0 0.500000 0.500000 0 16777216 0 +( 864 -416 -128 ) ( 864 -344 -128 ) ( 872 -344 -128 ) subway/1_black 0 -480 0 0.500000 0.500000 0 16777216 0 +( 864 -448 -152 ) ( 872 -448 -152 ) ( 872 -448 -184 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 872 -416 -152 ) ( 872 -344 -152 ) ( 872 -344 -184 ) subway/1_map 240 0 0 1 1 0 637534209 10000 +( 872 -320 -160 ) ( 864 -320 -160 ) ( 864 -320 -192 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 870 -344 -152 ) ( 870 -416 -152 ) ( 870 -416 -184 ) subway/1_map -192 0 0 -1 1 0 637534208 10000 +} +// brush 4005 +{ +( 1064 360 -184 ) ( 1064 360 -176 ) ( 1064 424 -176 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1672 552 -184 ) ( 1672 552 -176 ) ( 1608 552 -176 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1056 456 -184 ) ( 1056 456 -176 ) ( 1056 392 -176 ) subway/1_lobby1a 32 16 0 -0.500000 0.500000 0 285212672 0 +( 1080 464 -192 ) ( 1080 464 -184 ) ( 1144 464 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1232 424 -152 ) ( 1296 424 -152 ) ( 1296 360 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1312 360 -184 ) ( 1312 424 -184 ) ( 1248 424 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4006 +{ +( 1312 240 -184 ) ( 1312 304 -184 ) ( 1248 304 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1232 304 -152 ) ( 1296 304 -152 ) ( 1296 240 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1080 328 -192 ) ( 1080 328 -184 ) ( 1144 328 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1056 336 -184 ) ( 1056 336 -176 ) ( 1056 272 -176 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1672 400 -184 ) ( 1672 400 -176 ) ( 1608 400 -176 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1064 240 -184 ) ( 1064 240 -176 ) ( 1064 304 -176 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4007 +{ +( 170 1064 -132 ) ( 98 1064 -132 ) ( 98 1008 -132 ) subway/1_soda_front_a 8 -35 0 0.700000 0.700000 134217728 0 0 +( 98 1008 -88 ) ( 98 1064 -88 ) ( 170 1064 -88 ) subway/1_soda_top 28 -24 0 0.500000 1 134217728 0 0 +( 98 1008 -88 ) ( 170 1008 -88 ) ( 170 1008 -160 ) subway/1_soda_side_a 40 2 0 0.700000 0.700000 134217728 0 0 +( 146 1000 -64 ) ( 146 1056 -64 ) ( 146 1056 -136 ) subway/1_soda_front_a 15 3 0 0.700000 0.700000 134217728 654311425 800 +( 170 1054 -88 ) ( 98 1054 -88 ) ( 98 1054 -160 ) subway/1_soda_side_a 24 2 0 -0.700000 0.700000 134217728 0 0 +( 112 1064 -88 ) ( 112 1008 -88 ) ( 112 1008 -160 ) subway/1_soda_front_a 0 51 0 0.700000 0.700000 134217728 0 0 +} +// brush 4008 +{ +( 112 1066 -122 ) ( 112 1010 -122 ) ( 112 1010 -194 ) subway/1_soda_front_b 24 3 0 0.700000 0.700000 134217728 0 0 +( 170 1054 -124 ) ( 98 1054 -124 ) ( 98 1054 -196 ) subway/1_soda_side_b 24 2 0 -0.700000 0.700000 134217728 16777216 0 +( 146 1000 -96 ) ( 146 1056 -96 ) ( 146 1056 -168 ) subway/1_soda_front_b 15 4 0 0.700000 0.700000 134217728 654311425 800 +( 102 1008 -122 ) ( 174 1008 -122 ) ( 174 1008 -194 ) subway/1_soda_side_b 40 2 0 0.700000 0.700000 134217728 16777216 0 +( 98 1010 -132 ) ( 98 1066 -132 ) ( 170 1066 -132 ) subway/1_soda_front_b 32 -23 0 0.700000 0.700000 134217728 0 0 +( 170 1064 -152 ) ( 98 1064 -152 ) ( 98 1008 -152 ) subway/1_soda_front_b 32 -23 0 0.700000 0.700000 134217728 0 0 +} +// brush 4009 +{ +( 496 -496 -124 ) ( 464 -496 -124 ) ( 464 -520 -124 ) subway/light_tube -928 544 0 0.500000 0.500000 134217728 16777217 6500 +( 464 -520 -120 ) ( 464 -496 -120 ) ( 496 -496 -120 ) subway/1_black -560 568 0 0.500000 0.500000 134217728 16777216 0 +( 464 -512 -120 ) ( 496 -512 -120 ) ( 496 -512 -128 ) subway/1_black -560 8 0 0.500000 0.500000 134217728 16777216 0 +( 508 -520 -120 ) ( 508 -496 -120 ) ( 508 -496 -128 ) subway/1_black -176 8 0 0.500000 0.500000 134217728 16777216 0 +( 496 -496 -120 ) ( 464 -496 -120 ) ( 464 -496 -128 ) subway/1_black -560 8 0 0.500000 0.500000 134217728 16777216 0 +( 464 -496 -120 ) ( 464 -520 -120 ) ( 464 -520 -128 ) subway/1_black -176 8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4010 +{ +( 408 -856 -140 ) ( 392 -856 -140 ) ( 392 -864 -140 ) subway/1_black -488 208 540 0.500000 0.500000 134217728 16777216 0 +( 396 -864 -124 ) ( 396 -856 -124 ) ( 412 -856 -124 ) subway/1_black -488 335 540 0.500000 0.500000 134217728 16777216 0 +( 412 -864 -156 ) ( 412 -864 -124 ) ( 412 -856 -124 ) subway/1_black 520 -8 0 0.500000 0.500000 134217728 16777216 0 +( 396 -864 -156 ) ( 396 -864 -124 ) ( 412 -864 -124 ) subway/1_black 1160 -8 0 0.500000 0.500000 134217728 16777216 0 +( 396 -856 -156 ) ( 396 -856 -124 ) ( 396 -864 -124 ) subway/1_black 520 -8 0 0.500000 0.500000 134217728 16777216 0 +( 380 -860 -156 ) ( 380 -860 -124 ) ( 364 -860 -124 ) subway/light_yellow 1192 8 0 0.500000 0.500000 134217728 1 10000 +} +// brush 4011 +{ +( 232 -840 -160 ) ( 232 -880 -160 ) ( 232 -880 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 264 -848 -160 ) ( 232 -848 -160 ) ( 232 -848 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 264 -880 -160 ) ( 264 -840 -160 ) ( 264 -840 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 232 -880 -160 ) ( 264 -880 -160 ) ( 264 -880 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 232 -880 -200 ) ( 232 -840 -200 ) ( 264 -840 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 264 -832 -216 ) ( 232 -832 -216 ) ( 232 -872 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4012 +{ +( 232 -680 -136 ) ( 232 -720 -136 ) ( 264 -720 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 288 -672 -120 ) ( 288 -728 -120 ) ( 208 -728 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 264 -672 -168 ) ( 264 -672 -128 ) ( 232 -672 -128 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 288 -728 -120 ) ( 288 -672 -120 ) ( 272 -672 -136 ) subway/1_lobby2 0 -64 90 0.500000 -0.500000 0 285212672 0 +( 272 -728 -120 ) ( 272 -712 -136 ) ( 224 -712 -136 ) subway/1_lobby2 0 -16 0 0.500000 -0.500000 0 285212672 0 +( 208 -672 -120 ) ( 208 -728 -120 ) ( 224 -712 -136 ) subway/1_lobby2 0 -32 90 0.500000 0.500000 0 285212672 0 +} +// brush 4013 +{ +( 208 -824 -120 ) ( 208 -880 -120 ) ( 224 -880 -136 ) subway/1_lobby2 -32 32 90 0.500000 0.500000 0 285212672 0 +( 264 -824 -120 ) ( 232 -824 -120 ) ( 232 -840 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 288 -880 -120 ) ( 288 -824 -120 ) ( 272 -840 -136 ) subway/1_lobby2 0 -64 90 0.500000 -0.500000 0 285212672 0 +( 224 -880 -128 ) ( 256 -880 -128 ) ( 256 -880 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 208 -880 -120 ) ( 208 -824 -120 ) ( 280 -824 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 264 -832 -136 ) ( 232 -832 -136 ) ( 232 -872 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4014 +{ +( 264 -840 -152 ) ( 232 -840 -152 ) ( 232 -880 -152 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 224 -880 -136 ) ( 224 -840 -136 ) ( 272 -840 -136 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 232 -880 -144 ) ( 264 -880 -144 ) ( 264 -880 -184 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 272 -880 -136 ) ( 272 -840 -136 ) ( 264 -848 -152 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 264 -840 -136 ) ( 232 -840 -136 ) ( 232 -848 -152 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +( 224 -840 -136 ) ( 224 -880 -136 ) ( 232 -880 -152 ) subway/1_lobby1a 40 16 0 -0.500000 0.500000 0 285212672 0 +} +// brush 4015 +{ +( 224 -672 -136 ) ( 224 -712 -136 ) ( 232 -704 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 232 -704 -152 ) ( 232 -712 -136 ) ( 264 -712 -136 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 272 -712 -136 ) ( 272 -672 -136 ) ( 264 -672 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 264 -672 -184 ) ( 264 -672 -144 ) ( 232 -672 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 272 -672 -136 ) ( 272 -712 -136 ) ( 224 -712 -136 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 232 -672 -152 ) ( 232 -712 -152 ) ( 264 -712 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4016 +{ +( 232 -680 -200 ) ( 232 -720 -200 ) ( 264 -720 -200 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 264 -712 -152 ) ( 232 -712 -152 ) ( 232 -672 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 264 -672 -184 ) ( 264 -672 -144 ) ( 232 -672 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 264 -712 -184 ) ( 264 -712 -144 ) ( 264 -672 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 232 -704 -184 ) ( 232 -704 -144 ) ( 264 -704 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 232 -672 -184 ) ( 232 -672 -144 ) ( 232 -712 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4017 +{ +( 232 -672 -200 ) ( 232 -672 -160 ) ( 232 -712 -160 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 232 -704 -200 ) ( 232 -704 -160 ) ( 264 -704 -160 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 264 -712 -200 ) ( 264 -712 -160 ) ( 264 -672 -160 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 264 -672 -200 ) ( 264 -672 -160 ) ( 232 -672 -160 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 264 -712 -200 ) ( 232 -712 -200 ) ( 232 -672 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 232 -680 -216 ) ( 232 -720 -216 ) ( 264 -720 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4018 +{ +( 496 -648 -120 ) ( 432 -648 -120 ) ( 432 -712 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 432 -728 -104 ) ( 432 -664 -104 ) ( 496 -664 -104 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 208 -872 -128 ) ( 208 -872 -120 ) ( 208 -808 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -856 -120 ) ( 600 -856 -112 ) ( 664 -856 -112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 136 -304 -120 ) ( 136 -304 -112 ) ( 136 -368 -112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 408 -688 -120 ) ( 408 -688 -112 ) ( 344 -688 -112 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4019 +{ +( 424 -696 -120 ) ( 360 -696 -120 ) ( 360 -760 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 360 -776 -104 ) ( 360 -712 -104 ) ( 424 -712 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 520 -920 -128 ) ( 520 -920 -120 ) ( 520 -856 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 704 -880 -120 ) ( 704 -880 -112 ) ( 768 -880 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 280 -344 -120 ) ( 280 -344 -112 ) ( 280 -408 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 336 -832 -120 ) ( 336 -832 -112 ) ( 272 -832 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 4020 +{ +( 568 -832 -136 ) ( 536 -832 -136 ) ( 536 -872 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 -872 -120 ) ( 536 -832 -120 ) ( 568 -832 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 -872 -128 ) ( 568 -872 -128 ) ( 568 -872 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 -872 -128 ) ( 568 -832 -128 ) ( 568 -832 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 -840 -128 ) ( 536 -840 -128 ) ( 536 -840 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 -832 -128 ) ( 536 -872 -128 ) ( 536 -872 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4021 +{ +( 536 -832 -144 ) ( 536 -872 -144 ) ( 536 -872 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 568 -840 -144 ) ( 536 -840 -144 ) ( 536 -840 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 568 -872 -144 ) ( 568 -832 -144 ) ( 568 -832 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 536 -872 -144 ) ( 568 -872 -144 ) ( 568 -872 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 536 -872 -136 ) ( 536 -832 -136 ) ( 568 -832 -136 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 568 -824 -200 ) ( 536 -824 -200 ) ( 536 -864 -200 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4022 +{ +( 744 -864 -120 ) ( 744 -800 -120 ) ( 680 -800 -120 ) subway/con14 192 112 0 0.500000 0.500000 0 285212672 0 +( 664 -800 -112 ) ( 728 -800 -112 ) ( 728 -864 -112 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 512 -600 -128 ) ( 512 -600 -120 ) ( 576 -600 -120 ) subway/1_lobby_floor 752 16 0 0.500000 0.500000 0 285212672 0 +( 400 -680 -120 ) ( 400 -680 -112 ) ( 400 -744 -112 ) subway/1_lobby_floor 432 16 0 0.500000 0.500000 0 285212672 0 +( 1072 -416 -120 ) ( 1072 -416 -112 ) ( 1008 -416 -112 ) subway/1_lobby_floor 752 16 0 0.500000 0.500000 0 285212672 0 +( 576 -864 -120 ) ( 576 -864 -112 ) ( 576 -800 -112 ) subway/1_lobby_floor 432 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4023 +{ +( 968 176 -104 ) ( 968 232 -104 ) ( 968 232 -112 ) subway/1_black -480 0 0 0.500000 0.500000 0 16777216 0 +( 936 188 -104 ) ( 976 188 -104 ) ( 976 188 -112 ) subway/1_black -576 0 0 0.500000 0.500000 0 16777216 0 +( 952 240 -104 ) ( 952 184 -104 ) ( 952 184 -112 ) subway/1_black -480 32 0 0.500000 0.500000 0 16777216 0 +( 976 232 -104 ) ( 936 232 -104 ) ( 936 232 -112 ) subway/1_black -576 32 0 0.500000 0.500000 0 16777216 0 +( 976 232 -104 ) ( 976 176 -104 ) ( 936 176 -104 ) subway/1_black 48 1104 0 0.500000 0.500000 0 16777216 0 +( 936 176 -108 ) ( 976 176 -108 ) ( 976 232 -108 ) subway/light_tube 136 -48 90 0.500000 0.500000 0 16777217 5200 +} +// brush 4024 +{ +( 972 -24 -144 ) ( 972 -32 -144 ) ( 988 -32 -144 ) subway/1_black 432 -544 0 0.500000 0.500000 134217728 16777216 0 +( 992 -32 -128 ) ( 976 -32 -128 ) ( 976 -24 -128 ) subway/1_black 432 -544 0 0.500000 0.500000 134217728 16777216 0 +( 992 -32 -128 ) ( 992 -24 -128 ) ( 992 -24 -160 ) subway/1_black -432 -16 0 0.500000 0.500000 134217728 16777216 0 +( 992 -24 -128 ) ( 976 -24 -128 ) ( 976 -24 -160 ) subway/1_black 1408 -16 0 0.500000 0.500000 134217728 16777216 0 +( 976 -24 -128 ) ( 976 -32 -128 ) ( 976 -32 -160 ) subway/1_black -432 -16 0 0.500000 0.500000 134217728 16777216 0 +( 976 -28 -128 ) ( 992 -28 -128 ) ( 992 -28 -160 ) subway/light_yellow 1472 0 0 0.500000 0.500000 134217728 1 10000 +} +// brush 4025 +{ +( 1012 72 -140 ) ( 996 72 -140 ) ( 996 64 -140 ) subway/1_black 151 -56 270 0.500000 0.500000 134217728 16777216 0 +( 1000 64 -124 ) ( 1000 72 -124 ) ( 1016 72 -124 ) subway/1_black 152 8 270 0.500000 0.500000 134217728 16777216 0 +( 1016 64 -156 ) ( 1016 64 -124 ) ( 1016 72 -124 ) subway/1_black 1936 0 0 0.500000 0.500000 134217728 16777216 0 +( 1000 64 -156 ) ( 1000 64 -124 ) ( 1016 64 -124 ) subway/1_black -1440 0 0 0.500000 0.500000 134217728 16777216 0 +( 1000 72 -156 ) ( 1000 72 -124 ) ( 1000 64 -124 ) subway/1_black 1936 0 0 0.500000 0.500000 134217728 16777216 0 +( 1088 68 -156 ) ( 1088 68 -124 ) ( 1072 68 -124 ) subway/light_yellow -1424 8 0 0.500000 0.500000 134217728 1 10000 +} +// brush 4026 +{ +( 1168 200 -120 ) ( 1168 200 -112 ) ( 1232 200 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 1304 -288 -120 ) ( 1304 -288 -112 ) ( 1304 -224 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1032 248 -120 ) ( 1032 248 -112 ) ( 968 248 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1064 296 -120 ) ( 1064 296 -112 ) ( 1064 232 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1176 144 -104 ) ( 1176 80 -104 ) ( 1112 80 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1112 64 -120 ) ( 1176 64 -120 ) ( 1176 128 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4027 +{ +( 552 -752 -140 ) ( 552 -768 -140 ) ( 560 -768 -140 ) subway/1_black -184 -48 540 0.500000 0.500000 134217728 16777216 0 +( 560 -764 -124 ) ( 552 -764 -124 ) ( 552 -748 -124 ) subway/1_black -184 79 540 0.500000 0.500000 134217728 16777216 0 +( 560 -748 -156 ) ( 560 -748 -124 ) ( 552 -748 -124 ) subway/1_black 264 -8 0 0.500000 0.500000 134217728 16777216 0 +( 560 -764 -156 ) ( 560 -764 -124 ) ( 560 -748 -124 ) subway/1_black 856 -8 0 0.500000 0.500000 134217728 16777216 0 +( 552 -764 -156 ) ( 552 -764 -124 ) ( 560 -764 -124 ) subway/1_black 264 -8 0 0.500000 0.500000 134217728 16777216 0 +( 556 -780 -156 ) ( 556 -780 -124 ) ( 556 -796 -124 ) subway/light_yellow 888 8 0 0.500000 0.500000 134217728 1 10000 +} +// brush 4028 +{ +( 384 -744 -120 ) ( 384 -808 -120 ) ( 448 -808 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 464 -808 -104 ) ( 400 -808 -104 ) ( 400 -744 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 608 -624 -128 ) ( 608 -624 -120 ) ( 544 -624 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 568 -632 -120 ) ( 568 -632 -112 ) ( 568 -568 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 32 -904 -120 ) ( 32 -904 -112 ) ( 96 -904 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 520 -832 -120 ) ( 520 -832 -112 ) ( 520 -896 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 4029 +{ +( 376 -824 -120 ) ( 376 -824 -112 ) ( 376 -888 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( -24 -664 -120 ) ( -24 -664 -112 ) ( 40 -664 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 520 -640 -120 ) ( 520 -640 -112 ) ( 520 -576 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 560 -624 -128 ) ( 560 -624 -120 ) ( 496 -624 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 416 -808 -104 ) ( 352 -808 -104 ) ( 352 -744 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 336 -744 -120 ) ( 336 -808 -120 ) ( 400 -808 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4030 +{ +( 816 -824 -152 ) ( 816 -760 -152 ) ( 752 -760 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 -632 -120 ) ( 568 -712 -120 ) ( 560 -712 -120 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 568 -872 -120 ) ( 568 -872 -152 ) ( 560 -872 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 560 -576 -152 ) ( 560 -576 -144 ) ( 560 -640 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1176 -616 -152 ) ( 1176 -616 -144 ) ( 1112 -616 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 -744 -152 ) ( 568 -744 -120 ) ( 568 -608 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4031 +{ +( 744 -752 -216 ) ( 808 -752 -216 ) ( 808 -688 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 792 -688 -184 ) ( 792 -752 -184 ) ( 728 -752 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 560 -616 -216 ) ( 560 -616 -184 ) ( 552 -616 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 552 -616 -216 ) ( 552 -616 -184 ) ( 552 -776 -184 ) subway/1_lobby1 40 16 0 -0.500000 0.500000 0 285212672 0 +( 560 -872 -184 ) ( 560 -872 -216 ) ( 552 -872 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 560 -712 -184 ) ( 560 -712 -216 ) ( 560 -872 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4032 +{ +( 392 -696 0 ) ( 368 -672 0 ) ( 368 -672 10 ) subway/1_lobby4 -16 0 0 0.500000 0.500000 0 285212672 0 +( 344 -736 -216 ) ( 352 -736 -216 ) ( 392 -656 -216 ) subway/1_lobby1 0 32 0 0.500000 0.500000 0 285212672 0 +( 352 -736 -184 ) ( 344 -736 -184 ) ( 384 -656 -184 ) subway/1_lobby1 0 32 0 0.500000 0.500000 0 285212672 0 +( 392 -656 -184 ) ( 384 -656 -184 ) ( 384 -656 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 352 -736 -216 ) ( 352 -736 -184 ) ( 392 -656 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 29 +( 352 -736 -216 ) ( 344 -736 -216 ) ( 344 -736 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 344 -736 -184 ) ( 344 -736 -216 ) ( 384 -656 -216 ) subway/1_lobby1 -16 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4033 +{ +( 136 -696 -216 ) ( 136 -760 -216 ) ( 200 -760 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 216 -760 -184 ) ( 152 -760 -184 ) ( 152 -696 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 392 -624 -184 ) ( 384 -624 -184 ) ( 384 -624 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 392 -784 -184 ) ( 392 -624 -184 ) ( 392 -624 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 29 +( 392 -656 -216 ) ( 384 -656 -216 ) ( 384 -656 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 384 -656 -216 ) ( 384 -496 -216 ) ( 384 -496 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4034 +{ +( 392 -696 0 ) ( 360 -664 0 ) ( 360 -664 10 ) subway/1_lobby4 -16 0 0 0.500000 0.500000 0 285212672 0 +( 344 -736 -144 ) ( 344 -736 -184 ) ( 384 -656 -184 ) subway/1_lobby1a -16 0 0 0.500000 0.500000 0 285212672 0 +( 352 -736 -184 ) ( 344 -736 -184 ) ( 344 -736 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 352 -736 -184 ) ( 352 -736 -152 ) ( 392 -656 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 29 +( 392 -656 -152 ) ( 384 -656 -144 ) ( 384 -656 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 352 -736 -152 ) ( 344 -736 -144 ) ( 384 -656 -144 ) subway/1_lobby1a -1 1 63 0.500000 0.500000 0 285212672 29 +( 344 -736 -184 ) ( 352 -736 -184 ) ( 392 -656 -184 ) subway/1_lobby1a 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4035 +{ +( 384 -656 -184 ) ( 384 -496 -184 ) ( 384 -496 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 392 -656 -184 ) ( 384 -656 -184 ) ( 384 -656 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 392 -672 -184 ) ( 392 -672 -176 ) ( 392 -608 -176 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 29 +( 392 -624 -152 ) ( 384 -624 -144 ) ( 384 -624 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 392 -880 -152 ) ( 384 -888 -144 ) ( 384 -560 -144 ) subway/1_lobby1a -1 0 0 0.500000 0.500000 0 285212672 29 +( 384 -792 -184 ) ( 384 -872 -184 ) ( 392 -880 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4036 +{ +( 392 -696 16 ) ( 320 -624 16 ) ( 320 -624 26 ) subway/1_lobby4 -16 0 0 0.500000 0.500000 0 285212672 0 +( 344 -720 -152 ) ( 352 -720 -152 ) ( 384 -656 -152 ) subway/1_lobby2 0 32 0 0.500000 0.500000 0 285212672 0 +( 352 -720 -104 ) ( 344 -720 -104 ) ( 376 -656 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 344 -720 -120 ) ( 352 -720 -120 ) ( 352 -720 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 352 -720 -136 ) ( 352 -720 -104 ) ( 384 -656 -104 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 27 +( 384 -656 -120 ) ( 376 -656 -120 ) ( 376 -656 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 344 -720 -120 ) ( 344 -720 -152 ) ( 376 -656 -152 ) subway/1_lobby2 -16 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4037 +{ +( 352 -680 -152 ) ( 416 -648 -152 ) ( 416 -648 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 352 -680 -136 ) ( 352 -680 -104 ) ( 352 -688 -104 ) subway/1_lobby2 -16 16 0 0.500000 0.500000 0 285212672 0 +( 352 -688 -120 ) ( 416 -656 -120 ) ( 416 -656 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 27 +( 416 -656 -152 ) ( 416 -656 -120 ) ( 416 -648 -120 ) subway/1_lobby2 -16 16 0 0.500000 0.500000 0 285212672 0 +( 352 -680 -104 ) ( 416 -648 -104 ) ( 416 -656 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 352 -688 -152 ) ( 416 -656 -152 ) ( 416 -648 -152 ) subway/1_lobby2 0 32 0 0.500000 0.500000 0 285212672 0 +( 320 -624 26 ) ( 320 -624 16 ) ( 392 -696 16 ) subway/1_lobby4 -16 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4038 +{ +( 192 -768 -152 ) ( 128 -768 -152 ) ( 128 -832 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 384 -720 -120 ) ( 376 -720 -120 ) ( 376 -640 -120 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 384 -656 -152 ) ( 376 -656 -152 ) ( 376 -656 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 384 -424 -144 ) ( 384 -360 -144 ) ( 384 -360 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 27 +( -168 -624 -144 ) ( -232 -624 -144 ) ( -232 -624 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 376 -608 -120 ) ( 376 -744 -120 ) ( 376 -744 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4039 +{ +( 744 -1120 -104 ) ( 744 -1056 -104 ) ( 680 -1056 -104 ) subway/con14 192 112 0 0.500000 0.500000 0 285212672 0 +( 664 -1056 -96 ) ( 728 -1056 -96 ) ( 728 -1120 -96 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 0 352321536 0 +( 512 -888 -112 ) ( 512 -888 -104 ) ( 576 -888 -104 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 0 352321536 0 +( 232 -936 -104 ) ( 232 -936 -96 ) ( 232 -1000 -96 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 0 352321536 0 +( 1048 -664 -104 ) ( 1048 -664 -96 ) ( 984 -664 -96 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 0 352321536 0 +( 552 -1120 -104 ) ( 552 -1120 -96 ) ( 552 -1056 -96 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 0 352321536 0 +} +// brush 4040 +{ +( 352 -688 -216 ) ( 432 -648 -216 ) ( 432 -648 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 432 -648 -184 ) ( 432 -648 -216 ) ( 432 -656 -216 ) subway/1_lobby1 -16 16 0 0.500000 0.500000 0 285212672 0 +( 352 -696 -184 ) ( 432 -656 -184 ) ( 432 -656 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 29 +( 352 -688 -216 ) ( 352 -688 -184 ) ( 352 -696 -184 ) subway/1_lobby1 -16 16 0 0.500000 0.500000 0 285212672 0 +( 352 -688 -184 ) ( 432 -648 -184 ) ( 432 -656 -184 ) subway/1_lobby1 0 32 0 0.500000 0.500000 0 285212672 0 +( 352 -696 -216 ) ( 432 -656 -216 ) ( 432 -648 -216 ) subway/1_lobby1 0 32 0 0.500000 0.500000 0 285212672 0 +( 368 -672 10 ) ( 368 -672 0 ) ( 392 -696 0 ) subway/1_lobby4 -16 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4041 +{ +( 352 -696 -184 ) ( 432 -656 -184 ) ( 432 -648 -184 ) subway/1_lobby1a 0 16 0 0.500000 0.500000 0 285212672 0 +( 352 -688 -144 ) ( 432 -648 -144 ) ( 432 -656 -152 ) subway/1_lobby1a -1 0 26 0.500000 0.500000 0 285212672 29 +( 352 -688 -184 ) ( 352 -688 -144 ) ( 352 -696 -152 ) subway/1_lobby1a -16 0 0 0.500000 0.500000 0 285212672 0 +( 352 -696 -152 ) ( 432 -656 -152 ) ( 432 -656 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 29 +( 432 -648 -144 ) ( 432 -648 -184 ) ( 432 -656 -184 ) subway/1_lobby1a -16 0 0 0.500000 0.500000 0 285212672 0 +( 352 -688 -184 ) ( 432 -648 -184 ) ( 432 -648 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 360 -664 10 ) ( 360 -664 0 ) ( 392 -696 0 ) subway/1_lobby4 -16 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4042 +{ +( 512 -864 -184 ) ( 512 -864 -216 ) ( 352 -864 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 248 -864 -184 ) ( 248 -864 -216 ) ( 248 -856 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 432 -856 -216 ) ( 432 -856 -184 ) ( 272 -856 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 -864 -216 ) ( 536 -864 -184 ) ( 536 -856 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 360 -1096 -184 ) ( 296 -1096 -184 ) ( 296 -1032 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 296 -1048 -216 ) ( 296 -1112 -216 ) ( 360 -1112 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4043 +{ +( 416 -872 -152 ) ( 416 -872 -120 ) ( 552 -872 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 -1480 -152 ) ( 536 -1480 -144 ) ( 536 -1416 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 648 -864 -152 ) ( 648 -864 -144 ) ( 584 -864 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 248 -872 -120 ) ( 248 -872 -152 ) ( 248 -864 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 416 -872 -120 ) ( 336 -872 -120 ) ( 336 -864 -120 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 224 -1120 -152 ) ( 288 -1120 -152 ) ( 288 -1056 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4044 +{ +( 592 -512 -184 ) ( 592 -576 -184 ) ( 656 -576 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 656 -576 -152 ) ( 592 -576 -152 ) ( 592 -512 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 648 -600 -184 ) ( 648 -608 -184 ) ( 648 -608 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 1248 -600 -152 ) ( 1248 -600 -184 ) ( 1392 -600 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -608 -152 ) ( 584 -608 -184 ) ( 584 -600 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -144 -608 -184 ) ( -144 -608 -152 ) ( 240 -608 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4045 +{ +( 120 -608 -216 ) ( 360 -608 -216 ) ( 360 -600 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 808 -576 -184 ) ( 744 -576 -184 ) ( 744 -512 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -600 -216 ) ( 872 -608 -216 ) ( 872 -608 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1400 -600 -184 ) ( 1400 -600 -216 ) ( 1544 -600 -216 ) subway/1_lobby1 16 16 0 -0.500000 0.500000 0 285212672 0 +( 576 -608 -184 ) ( 576 -608 -216 ) ( 576 -600 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 8 -608 -216 ) ( 8 -608 -184 ) ( 392 -608 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4046 +{ +( 744 -512 -152 ) ( 744 -576 -152 ) ( 808 -576 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 808 -576 -120 ) ( 744 -576 -120 ) ( 744 -512 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -600 -152 ) ( 872 -608 -152 ) ( 872 -608 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1400 -600 -120 ) ( 1400 -600 -152 ) ( 1544 -600 -152 ) subway/1_lobby2 16 16 0 -0.500000 0.500000 0 285212672 0 +( 576 -608 -120 ) ( 576 -608 -152 ) ( 576 -600 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 8 -608 -152 ) ( 8 -608 -120 ) ( 392 -608 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4047 +{ +( 1828 1032 -108 ) ( 1812 1032 -108 ) ( 1812 1008 -108 ) subway/light_yellow 8 16 0 0.500000 0.500000 134217728 1 13000 +( 1812 1008 -104 ) ( 1812 1032 -104 ) ( 1828 1032 -104 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1812 1016 -104 ) ( 1828 1016 -104 ) ( 1828 1016 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1820 1008 -104 ) ( 1820 1032 -104 ) ( 1820 1032 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1828 1032 -104 ) ( 1812 1032 -104 ) ( 1812 1032 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1804 1032 -104 ) ( 1804 1008 -104 ) ( 1804 1008 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4048 +{ +( 1572 776 -104 ) ( 1572 752 -104 ) ( 1572 752 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1596 776 -104 ) ( 1580 776 -104 ) ( 1580 776 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1588 752 -104 ) ( 1588 776 -104 ) ( 1588 776 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1580 760 -104 ) ( 1596 760 -104 ) ( 1596 760 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1580 752 -104 ) ( 1580 776 -104 ) ( 1596 776 -104 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1596 776 -108 ) ( 1580 776 -108 ) ( 1580 752 -108 ) subway/light_yellow 24 16 0 0.500000 0.500000 134217728 1 10000 +} +// brush 4049 +{ +( 1608 840 -224 ) ( 1544 840 -224 ) ( 1544 776 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1544 776 -216 ) ( 1544 840 -216 ) ( 1608 840 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1520 936 -192 ) ( 1584 936 -192 ) ( 1584 936 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1736 1032 -216 ) ( 1736 1000 -216 ) ( 1736 1000 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1768 1000 -216 ) ( 1768 1032 -216 ) ( 1768 1032 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1784 1000 -216 ) ( 1736 1000 -216 ) ( 1784 1000 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4050 +{ +( 1608 840 -224 ) ( 1544 840 -224 ) ( 1544 776 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1544 776 -216 ) ( 1544 840 -216 ) ( 1608 840 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1520 936 -192 ) ( 1584 936 -192 ) ( 1584 936 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1856 776 -192 ) ( 1856 840 -192 ) ( 1856 840 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1784 1032 -216 ) ( 1736 1032 -216 ) ( 1736 1032 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1768 1032 -216 ) ( 1768 1000 -216 ) ( 1768 1032 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4051 +{ +( 1608 840 -224 ) ( 1544 840 -224 ) ( 1544 776 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1544 776 -216 ) ( 1544 840 -216 ) ( 1608 840 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1856 776 -192 ) ( 1856 840 -192 ) ( 1856 840 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1656 1096 -192 ) ( 1592 1096 -192 ) ( 1592 1096 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1736 1032 -216 ) ( 1736 1000 -216 ) ( 1736 1000 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1736 1032 -216 ) ( 1784 1032 -216 ) ( 1736 1032 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4052 +{ +( 1608 840 -224 ) ( 1544 840 -224 ) ( 1544 776 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1544 776 -216 ) ( 1544 840 -216 ) ( 1608 840 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1520 936 -192 ) ( 1584 936 -192 ) ( 1584 936 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1656 1096 -192 ) ( 1592 1096 -192 ) ( 1592 1096 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1664 832 -192 ) ( 1664 768 -192 ) ( 1664 768 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1736 1000 -216 ) ( 1736 1032 -216 ) ( 1736 1000 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4053 +{ +( 1616 1032 -224 ) ( 1568 1032 -224 ) ( 1568 1000 -224 ) subway/1_bathroom_floor_drain 16 32 0 0.500000 0.500000 0 285212672 0 +( 1568 1000 -216 ) ( 1568 1032 -216 ) ( 1616 1032 -216 ) subway/1_bathroom_floor_drain 0 16 0 0.500000 0.500000 0 285212672 0 +( 1568 1000 -216 ) ( 1616 1000 -216 ) ( 1616 1000 -224 ) subway/1_bathroom_floor_drain 16 0 0 0.500000 0.500000 0 285212672 0 +( 1600 1000 -216 ) ( 1600 1032 -216 ) ( 1600 1032 -224 ) subway/1_bathroom_floor_drain -32 0 0 0.500000 0.500000 0 285212672 0 +( 1616 1032 -216 ) ( 1568 1032 -216 ) ( 1568 1032 -224 ) subway/1_bathroom_floor_drain 16 0 0 0.500000 0.500000 0 285212672 0 +( 1568 1032 -216 ) ( 1568 1000 -216 ) ( 1568 1000 -224 ) subway/1_bathroom_floor_drain -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4054 +{ +( 1616 760 -224 ) ( 1568 760 -224 ) ( 1568 728 -224 ) subway/1_bathroom_floor_drain 16 0 0 0.500000 0.500000 0 285212672 0 +( 1568 728 -216 ) ( 1568 760 -216 ) ( 1616 760 -216 ) subway/1_bathroom_floor_drain 0 48 0 0.500000 0.500000 0 285212672 0 +( 1568 728 -216 ) ( 1616 728 -216 ) ( 1616 728 -224 ) subway/1_bathroom_floor_drain 16 0 0 0.500000 0.500000 0 285212672 0 +( 1600 728 -216 ) ( 1600 760 -216 ) ( 1600 760 -224 ) subway/1_bathroom_floor_drain 0 0 0 0.500000 0.500000 0 285212672 0 +( 1616 760 -216 ) ( 1568 760 -216 ) ( 1568 760 -224 ) subway/1_bathroom_floor_drain 16 0 0 0.500000 0.500000 0 285212672 0 +( 1568 760 -216 ) ( 1568 728 -216 ) ( 1568 728 -224 ) subway/1_bathroom_floor_drain 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4055 +{ +( 1568 896 -216 ) ( 1568 864 -216 ) ( 1568 864 -224 ) subway/1_bathroom_floor_drain -16 0 0 0.500000 0.500000 0 285212672 0 +( 1616 896 -216 ) ( 1568 896 -216 ) ( 1568 896 -224 ) subway/1_bathroom_floor_drain 16 0 0 0.500000 0.500000 0 285212672 0 +( 1600 864 -216 ) ( 1600 896 -216 ) ( 1600 896 -224 ) subway/1_bathroom_floor_drain -16 0 0 0.500000 0.500000 0 285212672 0 +( 1568 864 -216 ) ( 1616 864 -216 ) ( 1616 864 -224 ) subway/1_bathroom_floor_drain 16 0 0 0.500000 0.500000 0 285212672 0 +( 1568 864 -216 ) ( 1568 896 -216 ) ( 1616 896 -216 ) subway/1_bathroom_floor_drain 0 0 0 0.500000 0.500000 0 285212672 0 +( 1616 896 -224 ) ( 1568 896 -224 ) ( 1568 864 -224 ) subway/1_bathroom_floor_drain 16 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4056 +{ +( 1736 1032 -216 ) ( 1736 1000 -216 ) ( 1736 1000 -224 ) subway/1_bathroom_floor_drain -32 0 0 0.500000 0.500000 0 285212672 0 +( 1784 1032 -216 ) ( 1736 1032 -216 ) ( 1736 1032 -224 ) subway/1_bathroom_floor_drain 0 0 0 0.500000 0.500000 0 285212672 0 +( 1768 1000 -216 ) ( 1768 1032 -216 ) ( 1768 1032 -224 ) subway/1_bathroom_floor_drain -32 0 0 0.500000 0.500000 0 285212672 0 +( 1736 1000 -216 ) ( 1784 1000 -216 ) ( 1784 1000 -224 ) subway/1_bathroom_floor_drain 0 0 0 0.500000 0.500000 0 285212672 0 +( 1736 1000 -216 ) ( 1736 1032 -216 ) ( 1784 1032 -216 ) subway/1_bathroom_floor_drain 48 16 0 0.500000 0.500000 0 285212672 0 +( 1784 1032 -224 ) ( 1736 1032 -224 ) ( 1736 1000 -224 ) subway/1_bathroom_floor_drain 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4057 +{ +( 1376 840 -224 ) ( 1312 840 -224 ) ( 1312 776 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1312 776 -216 ) ( 1312 840 -216 ) ( 1376 840 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1496 832 -192 ) ( 1496 768 -192 ) ( 1496 768 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1568 1000 -216 ) ( 1616 1000 -216 ) ( 1616 1000 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1616 1032 -216 ) ( 1568 1032 -216 ) ( 1568 1032 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1568 1000 -216 ) ( 1568 1032 -216 ) ( 1568 1000 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4058 +{ +( 1376 840 -224 ) ( 1312 840 -224 ) ( 1312 776 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1312 776 -216 ) ( 1312 840 -216 ) ( 1376 840 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1424 1096 -192 ) ( 1360 1096 -192 ) ( 1360 1096 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1496 832 -192 ) ( 1496 768 -192 ) ( 1496 768 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1600 728 -216 ) ( 1600 760 -216 ) ( 1600 760 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1568 1032 -216 ) ( 1616 1032 -216 ) ( 1568 1032 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4059 +{ +( 1376 840 -224 ) ( 1312 840 -224 ) ( 1312 776 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1312 776 -216 ) ( 1312 840 -216 ) ( 1376 840 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1496 832 -192 ) ( 1496 768 -192 ) ( 1496 768 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1600 728 -216 ) ( 1600 760 -216 ) ( 1600 760 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1568 896 -216 ) ( 1616 896 -216 ) ( 1568 896 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1616 1000 -216 ) ( 1568 1000 -216 ) ( 1616 1000 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4060 +{ +( 1376 840 -224 ) ( 1312 840 -224 ) ( 1312 776 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1312 776 -216 ) ( 1312 840 -216 ) ( 1376 840 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1496 832 -192 ) ( 1496 768 -192 ) ( 1496 768 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1568 864 -216 ) ( 1616 864 -216 ) ( 1616 864 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1616 896 -216 ) ( 1568 896 -216 ) ( 1568 896 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1568 864 -216 ) ( 1568 896 -216 ) ( 1568 864 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4061 +{ +( 1376 840 -224 ) ( 1312 840 -224 ) ( 1312 776 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1312 776 -216 ) ( 1312 840 -216 ) ( 1376 840 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1496 832 -192 ) ( 1496 768 -192 ) ( 1496 768 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1600 728 -216 ) ( 1600 760 -216 ) ( 1600 760 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1568 760 -216 ) ( 1616 760 -216 ) ( 1568 760 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1616 864 -216 ) ( 1568 864 -216 ) ( 1616 864 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4062 +{ +( 1376 840 -224 ) ( 1312 840 -224 ) ( 1312 776 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1312 776 -216 ) ( 1312 840 -216 ) ( 1376 840 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1496 832 -192 ) ( 1496 768 -192 ) ( 1496 768 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1568 728 -216 ) ( 1616 728 -216 ) ( 1616 728 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1616 760 -216 ) ( 1568 760 -216 ) ( 1568 760 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1568 728 -216 ) ( 1568 760 -216 ) ( 1568 728 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4063 +{ +( 1376 840 -224 ) ( 1312 840 -224 ) ( 1312 776 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1312 776 -216 ) ( 1312 840 -216 ) ( 1376 840 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1664 768 -192 ) ( 1664 832 -192 ) ( 1664 832 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1424 1096 -192 ) ( 1360 1096 -192 ) ( 1360 1096 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1568 728 -216 ) ( 1616 728 -216 ) ( 1616 728 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1600 760 -216 ) ( 1600 728 -216 ) ( 1600 760 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4064 +{ +( 1376 840 -224 ) ( 1312 840 -224 ) ( 1312 776 -224 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1312 776 -216 ) ( 1312 840 -216 ) ( 1376 840 -216 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1312 688 -192 ) ( 1376 688 -192 ) ( 1376 688 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1664 768 -192 ) ( 1664 832 -192 ) ( 1664 832 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1496 832 -192 ) ( 1496 768 -192 ) ( 1496 768 -224 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1616 728 -216 ) ( 1568 728 -216 ) ( 1616 728 -224 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4065 +{ +( 1888 1124 -200 ) ( 1888 1096 -200 ) ( 1896 1096 -200 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1896 1096 -168 ) ( 1888 1096 -168 ) ( 1888 1124 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1896 1024 -200 ) ( 1896 1024 -168 ) ( 1896 1136 -168 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1888 1128 -168 ) ( 1888 1128 -200 ) ( 1896 1136 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1888 1208 -200 ) ( 1888 1208 -168 ) ( 1888 1088 -168 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1896 1016 -168 ) ( 1896 1016 -200 ) ( 1888 1016 -200 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +} +// brush 4066 +{ +( 1596 1032 -108 ) ( 1580 1032 -108 ) ( 1580 1008 -108 ) subway/light_yellow 24 16 0 0.500000 0.500000 134217728 1 10000 +( 1580 1008 -104 ) ( 1580 1032 -104 ) ( 1596 1032 -104 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1580 1016 -104 ) ( 1596 1016 -104 ) ( 1596 1016 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1588 1008 -104 ) ( 1588 1032 -104 ) ( 1588 1032 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1596 1032 -104 ) ( 1580 1032 -104 ) ( 1580 1032 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1572 1032 -104 ) ( 1572 1008 -104 ) ( 1572 1008 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4067 +{ +( 1596 888 -108 ) ( 1580 888 -108 ) ( 1580 864 -108 ) subway/light_yellow 24 16 0 0.500000 0.500000 134217728 1 10000 +( 1580 864 -104 ) ( 1580 888 -104 ) ( 1596 888 -104 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1580 872 -104 ) ( 1596 872 -104 ) ( 1596 872 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1588 864 -104 ) ( 1588 888 -104 ) ( 1588 888 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1596 888 -104 ) ( 1580 888 -104 ) ( 1580 888 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1572 888 -104 ) ( 1572 864 -104 ) ( 1572 864 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4068 +{ +( 1684 1032 -104 ) ( 1684 1008 -104 ) ( 1684 1008 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1708 1032 -104 ) ( 1692 1032 -104 ) ( 1692 1032 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1700 1008 -104 ) ( 1700 1032 -104 ) ( 1700 1032 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1692 1016 -104 ) ( 1708 1016 -104 ) ( 1708 1016 -112 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1692 1008 -104 ) ( 1692 1032 -104 ) ( 1708 1032 -104 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1708 1032 -108 ) ( 1692 1032 -108 ) ( 1692 1008 -108 ) subway/light_yellow 24 16 0 0.500000 0.500000 134217728 1 13000 +} +// brush 4069 +{ +( 1888 1016 -208 ) ( 1824 1016 -208 ) ( 1824 1008 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 1008 -144 ) ( 1824 1016 -144 ) ( 1888 1016 -144 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 1008 -176 ) ( 1888 1008 -176 ) ( 1888 1008 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1888 1008 -176 ) ( 1888 1016 -176 ) ( 1888 1016 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1884 1012 -176 ) ( 1820 1012 -176 ) ( 1820 1012 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 1016 -176 ) ( 1824 1008 -176 ) ( 1824 1008 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 4070 +{ +( 1824 1064 -176 ) ( 1824 1056 -176 ) ( 1824 1056 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1888 1060 -176 ) ( 1824 1060 -176 ) ( 1824 1060 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1888 1056 -176 ) ( 1888 1064 -176 ) ( 1888 1064 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 1056 -176 ) ( 1888 1056 -176 ) ( 1888 1056 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 1056 -144 ) ( 1824 1064 -144 ) ( 1888 1064 -144 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1888 1064 -208 ) ( 1824 1064 -208 ) ( 1824 1056 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 4071 +{ +( 1824 968 -176 ) ( 1824 960 -176 ) ( 1824 960 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1888 964 -176 ) ( 1824 964 -176 ) ( 1824 964 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1888 960 -176 ) ( 1888 968 -176 ) ( 1888 968 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 960 -176 ) ( 1884 960 -176 ) ( 1884 960 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 960 -144 ) ( 1824 968 -144 ) ( 1888 968 -144 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1888 968 -208 ) ( 1824 968 -208 ) ( 1824 960 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 4072 +{ +( 1528 1020 -208 ) ( 1528 1028 -208 ) ( 1464 1028 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1464 1028 -144 ) ( 1528 1028 -144 ) ( 1528 1020 -144 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1464 1020 -192 ) ( 1464 1020 -176 ) ( 1528 1020 -176 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1464 1028 -192 ) ( 1464 1028 -176 ) ( 1464 1020 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1528 1024 -192 ) ( 1528 1024 -176 ) ( 1464 1024 -176 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1524 1020 -192 ) ( 1524 1020 -176 ) ( 1524 1028 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 4073 +{ +( 1528 1068 -208 ) ( 1528 1076 -208 ) ( 1464 1076 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1464 1076 -144 ) ( 1528 1076 -144 ) ( 1528 1068 -144 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1460 1068 -192 ) ( 1460 1068 -176 ) ( 1524 1068 -176 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1464 1076 -192 ) ( 1464 1076 -176 ) ( 1464 1068 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1528 1072 -192 ) ( 1528 1072 -176 ) ( 1464 1072 -176 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1524 1068 -192 ) ( 1524 1068 -176 ) ( 1524 1076 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 4074 +{ +( 1524 924 -192 ) ( 1524 924 -176 ) ( 1524 932 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1528 928 -192 ) ( 1528 928 -176 ) ( 1464 928 -176 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1464 932 -192 ) ( 1464 932 -176 ) ( 1464 924 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1464 924 -192 ) ( 1464 924 -176 ) ( 1528 924 -176 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1464 932 -144 ) ( 1528 932 -144 ) ( 1528 924 -144 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1528 924 -208 ) ( 1528 932 -208 ) ( 1464 932 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 4075 +{ +( 1524 972 -192 ) ( 1524 972 -176 ) ( 1524 980 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1528 976 -192 ) ( 1528 976 -176 ) ( 1464 976 -176 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1464 980 -192 ) ( 1464 980 -176 ) ( 1464 972 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1464 972 -192 ) ( 1464 972 -176 ) ( 1528 972 -176 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1464 980 -144 ) ( 1528 980 -144 ) ( 1528 972 -144 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1528 972 -208 ) ( 1528 980 -208 ) ( 1464 980 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 4076 +{ +( 1504 512 -72 ) ( 1504 448 -72 ) ( 1504 448 -104 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1704 952 -72 ) ( 1640 952 -72 ) ( 1640 952 -104 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1656 784 -72 ) ( 1656 848 -72 ) ( 1656 848 -104 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1616 696 -72 ) ( 1680 696 -72 ) ( 1680 696 -104 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1608 792 -96 ) ( 1608 856 -96 ) ( 1672 856 -96 ) subway/1_bathroom_floor 48 0 0 0.500000 0.500000 0 285212672 0 +( 1672 856 -104 ) ( 1608 856 -104 ) ( 1608 792 -104 ) subway/1_bathroom_floor 48 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4077 +{ +( 1496 496 -72 ) ( 1496 432 -72 ) ( 1496 432 -104 ) subway/1_bathroom_floor -32 32 0 0.500000 0.500000 0 285212672 0 +( 1696 688 -72 ) ( 1632 688 -72 ) ( 1632 688 -104 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1664 768 -72 ) ( 1664 832 -72 ) ( 1664 832 -104 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1616 680 -72 ) ( 1680 680 -72 ) ( 1680 680 -104 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1608 776 -96 ) ( 1608 840 -96 ) ( 1672 840 -96 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1672 840 -104 ) ( 1608 840 -104 ) ( 1608 776 -104 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4078 +{ +( 1472 952 -72 ) ( 1408 952 -72 ) ( 1408 952 -104 ) subway/1_bathroom_floor_edge 0 16 90 0.500000 0.500000 0 285212672 0 +( 1664 664 -72 ) ( 1664 728 -72 ) ( 1664 728 -104 ) subway/1_bathroom_floor_edge 0 -16 90 0.500000 0.500000 0 285212672 0 +( 1744 696 -72 ) ( 1808 696 -72 ) ( 1808 696 -104 ) subway/1_bathroom_floor_edge 0 16 90 0.500000 0.500000 0 285212672 0 +( 1656 832 -72 ) ( 1656 768 -72 ) ( 1656 768 -104 ) subway/1_bathroom_floor_edge 0 -16 90 0.500000 0.500000 0 285212672 0 +( 1752 752 -96 ) ( 1816 752 -96 ) ( 1816 688 -96 ) subway/1_bathroom_floor_edge -32 15 90 0.500000 0.500000 0 285212672 0 +( 1816 688 -104 ) ( 1816 752 -104 ) ( 1752 752 -104 ) subway/1_bathroom_floor_edge -32 15 90 0.500000 0.500000 0 285212672 0 +} +// brush 4079 +{ +( 1664 760 -72 ) ( 1664 696 -72 ) ( 1664 696 -104 ) subway/1_bathroom_floor_edge -32 16 0 0.500000 0.500000 0 285212672 0 +( 1864 952 -72 ) ( 1800 952 -72 ) ( 1800 952 -104 ) subway/1_bathroom_floor_edge 48 16 0 0.500000 0.500000 0 285212672 0 +( 1848 1032 -72 ) ( 1848 1096 -72 ) ( 1848 1096 -104 ) subway/1_bathroom_floor_edge -32 16 0 0.500000 0.500000 0 285212672 0 +( 1784 944 -72 ) ( 1848 944 -72 ) ( 1848 944 -104 ) subway/1_bathroom_floor_edge 48 16 0 0.500000 0.500000 0 285212672 0 +( 1776 1040 -96 ) ( 1776 1104 -96 ) ( 1840 1104 -96 ) subway/1_bathroom_floor_edge 48 48 0 0.500000 0.500000 0 285212672 0 +( 1840 1104 -104 ) ( 1776 1104 -104 ) ( 1776 1040 -104 ) subway/1_bathroom_floor_edge 48 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 4080 +{ +( 1656 688 -104 ) ( 1656 752 -104 ) ( 1592 752 -104 ) subway/1_bathroom_floor_edge -32 15 90 0.500000 0.500000 0 285212672 0 +( 1592 752 -96 ) ( 1656 752 -96 ) ( 1656 688 -96 ) subway/1_bathroom_floor_edge -32 15 90 0.500000 0.500000 0 285212672 0 +( 1496 832 -72 ) ( 1496 768 -72 ) ( 1496 768 -104 ) subway/1_bathroom_floor_edge 0 -16 90 0.500000 0.500000 0 285212672 0 +( 1584 696 -72 ) ( 1648 696 -72 ) ( 1648 696 -104 ) subway/1_bathroom_floor_edge 0 16 90 0.500000 0.500000 0 285212672 0 +( 1504 800 -72 ) ( 1504 864 -72 ) ( 1504 864 -104 ) subway/1_bathroom_floor_edge 0 -16 90 0.500000 0.500000 0 285212672 0 +( 1312 1088 -72 ) ( 1248 1088 -72 ) ( 1248 1088 -104 ) subway/1_bathroom_floor_edge 0 16 90 0.500000 0.500000 0 285212672 0 +} +// brush 4081 +{ +( 1496 504 -72 ) ( 1496 440 -72 ) ( 1496 440 -104 ) subway/1_bathroom_floor_edge -32 16 0 0.500000 0.500000 0 285212672 0 +( 1696 696 -72 ) ( 1632 696 -72 ) ( 1632 696 -104 ) subway/1_bathroom_floor_edge 0 16 0 0.500000 0.500000 0 285212672 0 +( 1664 776 -72 ) ( 1664 840 -72 ) ( 1664 840 -104 ) subway/1_bathroom_floor_edge -32 16 0 0.500000 0.500000 0 285212672 0 +( 1616 688 -72 ) ( 1680 688 -72 ) ( 1680 688 -104 ) subway/1_bathroom_floor_edge 0 16 0 0.500000 0.500000 0 285212672 0 +( 1608 784 -96 ) ( 1608 848 -96 ) ( 1672 848 -96 ) subway/1_bathroom_floor_edge 0 48 0 0.500000 0.500000 0 285212672 0 +( 1672 848 -104 ) ( 1608 848 -104 ) ( 1608 784 -104 ) subway/1_bathroom_floor_edge 0 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 4082 +{ +( 1840 1248 -104 ) ( 1776 1248 -104 ) ( 1776 1184 -104 ) subway/1_bathroom_floor_edge 48 16 0 0.500000 0.500000 0 285212672 0 +( 1776 1184 -96 ) ( 1776 1248 -96 ) ( 1840 1248 -96 ) subway/1_bathroom_floor_edge 48 16 0 0.500000 0.500000 0 285212672 0 +( 1784 1088 -72 ) ( 1848 1088 -72 ) ( 1848 1088 -104 ) subway/1_bathroom_floor_edge 48 16 0 0.500000 0.500000 0 285212672 0 +( 1848 1176 -72 ) ( 1848 1240 -72 ) ( 1848 1240 -104 ) subway/1_bathroom_floor_edge 0 16 0 0.500000 0.500000 0 285212672 0 +( 1864 1096 -72 ) ( 1800 1096 -72 ) ( 1800 1096 -104 ) subway/1_bathroom_floor_edge 48 16 0 0.500000 0.500000 0 285212672 0 +( 1496 904 -72 ) ( 1496 840 -72 ) ( 1496 840 -104 ) subway/1_bathroom_floor_edge 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4083 +{ +( 1856 920 -72 ) ( 1856 856 -72 ) ( 1856 856 -104 ) subway/1_bathroom_floor -48 32 0 0.500000 0.500000 0 285212672 0 +( 1896 1104 -72 ) ( 1832 1104 -72 ) ( 1832 1104 -104 ) subway/1_bathroom_floor 16 32 0 0.500000 0.500000 0 285212672 0 +( 1864 920 -72 ) ( 1864 984 -72 ) ( 1864 984 -104 ) subway/1_tile_big -16 0 0 0.500000 0.500000 0 318767104 0 +( 1824 944 -72 ) ( 1888 944 -72 ) ( 1888 944 -104 ) subway/1_bathroom_floor 16 32 0 0.500000 0.500000 0 285212672 0 +( 1816 944 -96 ) ( 1816 1008 -96 ) ( 1880 1008 -96 ) subway/1_bathroom_floor 16 48 0 0.500000 0.500000 0 285212672 0 +( 1880 1008 -104 ) ( 1816 1008 -104 ) ( 1816 944 -104 ) subway/1_bathroom_floor 16 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 4084 +{ +( 1664 752 -72 ) ( 1664 688 -72 ) ( 1664 688 -104 ) subway/1_bathroom_floor -32 32 0 0.500000 0.500000 0 285212672 0 +( 1704 944 -72 ) ( 1640 944 -72 ) ( 1640 944 -104 ) subway/1_bathroom_floor 16 32 0 0.500000 0.500000 0 285212672 0 +( 1672 760 -72 ) ( 1672 824 -72 ) ( 1672 824 -104 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1632 680 -72 ) ( 1696 680 -72 ) ( 1696 680 -104 ) subway/1_bathroom_floor 16 32 0 0.500000 0.500000 0 285212672 0 +( 1624 776 -96 ) ( 1624 840 -96 ) ( 1688 840 -96 ) subway/1_bathroom_floor 16 32 0 0.500000 0.500000 0 285212672 0 +( 1688 840 -104 ) ( 1624 840 -104 ) ( 1624 776 -104 ) subway/1_bathroom_floor 16 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4085 +{ +( 1872 1008 -104 ) ( 1808 1008 -104 ) ( 1808 944 -104 ) subway/1_bathroom_floor 32 48 0 0.500000 0.500000 0 285212672 0 +( 1808 944 -96 ) ( 1808 1008 -96 ) ( 1872 1008 -96 ) subway/1_bathroom_floor 32 48 0 0.500000 0.500000 0 285212672 0 +( 1464 1096 -72 ) ( 1528 1096 -72 ) ( 1528 1096 -104 ) subway/1_bathroom_floor 32 32 0 0.500000 0.500000 0 285212672 0 +( 1856 920 -72 ) ( 1856 984 -72 ) ( 1856 984 -104 ) subway/1_tile_big -16 0 0 0.500000 0.500000 0 318767104 0 +( 1888 1104 -72 ) ( 1824 1104 -72 ) ( 1824 1104 -104 ) subway/1_bathroom_floor 32 32 0 0.500000 0.500000 0 285212672 0 +( 1496 1072 -72 ) ( 1496 1008 -72 ) ( 1496 1008 -104 ) subway/1_bathroom_floor -48 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4086 +{ +( 1512 840 -104 ) ( 1448 840 -104 ) ( 1448 776 -104 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1448 776 -96 ) ( 1448 840 -96 ) ( 1512 840 -96 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1456 680 -72 ) ( 1520 680 -72 ) ( 1520 680 -104 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1496 768 -72 ) ( 1496 832 -72 ) ( 1496 832 -104 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1528 1104 -72 ) ( 1464 1104 -72 ) ( 1464 1104 -104 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1488 752 -72 ) ( 1488 688 -72 ) ( 1488 688 -104 ) subway/1_bathroom_floor -32 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4087 +{ +( 1664 944 -224 ) ( 1664 944 -216 ) ( 1664 688 -216 ) subway/1_bathroom_floor_edge 0 32 90 0.500000 -0.500000 0 285212672 0 +( 1664 944 -216 ) ( 1664 944 -224 ) ( 1696 912 -224 ) subway/1_bathroom_floor_edge 0 32 90 0.500000 -0.500000 0 285212672 0 +( 1696 912 -216 ) ( 1696 912 -224 ) ( 1696 664 -224 ) subway/1_bathroom_floor_edge 0 32 90 0.500000 -0.500000 0 285212672 0 +( 1696 656 -216 ) ( 1696 656 -224 ) ( 1664 688 -224 ) subway/1_bathroom_floor_edge 0 32 90 0.500000 -0.500000 0 285212672 0 +( 1344 776 -216 ) ( 1344 840 -216 ) ( 1408 840 -216 ) subway/1_bathroom_floor_edge -32 -63 90 0.500000 -0.500000 0 285212672 0 +( 1408 840 -224 ) ( 1344 840 -224 ) ( 1344 776 -224 ) subway/1_bathroom_floor_edge -32 -63 90 0.500000 -0.500000 0 285212672 0 +} +// brush 4088 +{ +( 1464 800 -216 ) ( 1464 800 -224 ) ( 1464 1128 -224 ) subway/1_bathroom_floor_edge 0 -16 90 0.500000 0.500000 0 285212672 0 +( 1496 1096 -224 ) ( 1496 1096 -216 ) ( 1464 1128 -216 ) subway/1_bathroom_floor_edge 0 -16 90 0.500000 0.500000 0 285212672 0 +( 1496 800 -224 ) ( 1496 800 -216 ) ( 1496 1096 -216 ) subway/1_bathroom_floor_edge 0 -16 90 0.500000 0.500000 0 285212672 0 +( 1464 800 -224 ) ( 1464 800 -216 ) ( 1496 768 -216 ) subway/1_bathroom_floor_edge 0 -16 90 0.500000 0.500000 0 285212672 0 +( 1272 776 -216 ) ( 1272 840 -216 ) ( 1336 840 -216 ) subway/1_bathroom_floor_edge -32 15 90 0.500000 0.500000 0 285212672 0 +( 1336 840 -224 ) ( 1272 840 -224 ) ( 1272 776 -224 ) subway/1_bathroom_floor_edge -32 15 90 0.500000 0.500000 0 285212672 0 +} +// brush 4089 +{ +( 1376 808 -224 ) ( 1312 808 -224 ) ( 1312 744 -224 ) subway/1_bathroom_floor_edge 0 -32 0 0.500000 -0.500000 0 285212672 0 +( 1312 744 -216 ) ( 1312 808 -216 ) ( 1376 808 -216 ) subway/1_bathroom_floor_edge 0 -32 0 0.500000 -0.500000 0 285212672 0 +( 1464 656 -224 ) ( 1464 656 -216 ) ( 1696 656 -216 ) subway/1_bathroom_floor_edge 0 0 0 0.500000 -0.500000 0 285212672 0 +( 1664 688 -216 ) ( 1664 688 -224 ) ( 1696 656 -224 ) subway/1_bathroom_floor_edge -32 0 0 0.500000 -0.500000 0 285212672 0 +( 1664 688 -224 ) ( 1664 688 -216 ) ( 1496 688 -216 ) subway/1_bathroom_floor_edge 0 0 0 0.500000 -0.500000 0 285212672 0 +( 1464 656 -216 ) ( 1464 656 -224 ) ( 1496 688 -224 ) subway/1_bathroom_floor_edge -32 0 0 0.500000 -0.500000 0 285212672 0 +} +// brush 4090 +{ +( 1496 1096 -224 ) ( 1464 1128 -224 ) ( 1464 1128 -216 ) subway/1_bathroom_floor_edge -32 48 0 0.500000 0.500000 0 285212672 0 +( 1856 1096 -216 ) ( 1856 1096 -224 ) ( 1664 1096 -224 ) subway/1_bathroom_floor_edge 0 48 0 0.500000 0.500000 0 285212672 0 +( 1888 1128 -216 ) ( 1888 1128 -224 ) ( 1856 1096 -224 ) subway/1_bathroom_floor_edge -32 48 0 0.500000 0.500000 0 285212672 0 +( 1888 1128 -224 ) ( 1888 1128 -216 ) ( 1464 1128 -216 ) subway/1_bathroom_floor_edge 0 48 0 0.500000 0.500000 0 285212672 0 +( 1376 976 -216 ) ( 1312 976 -216 ) ( 1312 1040 -216 ) subway/1_bathroom_floor_edge 0 16 0 0.500000 0.500000 0 285212672 0 +( 1312 1040 -224 ) ( 1312 976 -224 ) ( 1376 976 -224 ) subway/1_bathroom_floor_edge 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4091 +{ +( 1696 912 -224 ) ( 1664 944 -224 ) ( 1664 944 -216 ) subway/1_bathroom_floor_edge -32 0 0 0.500000 -0.500000 0 285212672 0 +( 1888 912 -216 ) ( 1888 912 -224 ) ( 1696 912 -224 ) subway/1_bathroom_floor_edge 0 0 0 0.500000 -0.500000 0 285212672 0 +( 1856 944 -216 ) ( 1856 944 -224 ) ( 1888 912 -224 ) subway/1_bathroom_floor_edge -32 0 0 0.500000 -0.500000 0 285212672 0 +( 1856 944 -224 ) ( 1856 944 -216 ) ( 1664 944 -216 ) subway/1_bathroom_floor_edge 0 0 0 0.500000 -0.500000 0 285212672 0 +( 1576 792 -216 ) ( 1512 792 -216 ) ( 1512 856 -216 ) subway/1_bathroom_floor_edge 0 -32 0 0.500000 -0.500000 0 285212672 0 +( 1512 856 -224 ) ( 1512 792 -224 ) ( 1576 792 -224 ) subway/1_bathroom_floor_edge 0 -32 0 0.500000 -0.500000 0 285212672 0 +} +// brush 4092 +{ +( 1856 1096 -224 ) ( 1856 1096 -216 ) ( 1856 944 -216 ) subway/1_bathroom_floor_edge 0 32 90 0.500000 -0.500000 0 285212672 0 +( 1856 1096 -216 ) ( 1856 1096 -224 ) ( 1888 1128 -224 ) subway/1_bathroom_floor_edge 0 32 90 0.500000 -0.500000 0 285212672 0 +( 1888 1128 -216 ) ( 1888 1128 -224 ) ( 1888 912 -224 ) subway/1_bathroom_floor_edge 0 32 90 0.500000 -0.500000 0 285212672 0 +( 1888 912 -216 ) ( 1888 912 -224 ) ( 1856 944 -224 ) subway/1_bathroom_floor_edge 0 32 90 0.500000 -0.500000 0 285212672 0 +( 1536 1032 -216 ) ( 1536 1096 -216 ) ( 1600 1096 -216 ) subway/1_bathroom_floor_edge -32 -63 90 0.500000 -0.500000 0 285212672 0 +( 1600 1096 -224 ) ( 1536 1096 -224 ) ( 1536 1032 -224 ) subway/1_bathroom_floor_edge -32 -63 90 0.500000 -0.500000 0 285212672 0 +} +// brush 4093 +{ +( 1536 864 -120 ) ( 1472 864 -120 ) ( 1472 800 -120 ) subway/1_bathroom_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 1472 800 -104 ) ( 1472 864 -104 ) ( 1536 864 -104 ) subway/1_bathroom_floor 0 16 0 0.500000 0.500000 0 285212672 0 +( 1696 912 -120 ) ( 1696 912 -104 ) ( 1888 912 -104 ) subway/1_bathroom_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1864 936 -104 ) ( 1864 936 -120 ) ( 1888 912 -120 ) subway/1_tile_big -16 0 0 0.500000 0.500000 0 318767104 0 +( 1864 936 -120 ) ( 1864 936 -104 ) ( 1672 936 -104 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1696 912 -104 ) ( 1696 912 -120 ) ( 1672 936 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4094 +{ +( 1664 1096 -72 ) ( 1600 1096 -72 ) ( 1600 1096 -104 ) subway/1_bathroom_floor_edge 0 16 90 0.500000 0.500000 0 285212672 0 +( 1856 808 -72 ) ( 1856 872 -72 ) ( 1856 872 -104 ) subway/1_bathroom_floor_edge 0 -48 90 0.500000 0.500000 0 285212672 0 +( 1944 944 -72 ) ( 2008 944 -72 ) ( 2008 944 -104 ) subway/1_bathroom_floor_edge 0 16 90 0.500000 0.500000 0 285212672 0 +( 1848 984 -72 ) ( 1848 920 -72 ) ( 1848 920 -104 ) subway/1_bathroom_floor_edge 0 -48 90 0.500000 0.500000 0 285212672 0 +( 1944 896 -96 ) ( 2008 896 -96 ) ( 2008 832 -96 ) subway/1_bathroom_floor_edge -63 15 90 0.500000 0.500000 0 285212672 0 +( 2008 832 -104 ) ( 2008 896 -104 ) ( 1944 896 -104 ) subway/1_bathroom_floor_edge 0 15 90 0.500000 0.500000 0 285212672 0 +} +// brush 4095 +{ +( 1672 936 -120 ) ( 1672 936 -104 ) ( 1672 680 -104 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1672 936 -104 ) ( 1672 936 -120 ) ( 1696 912 -120 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1696 776 -88 ) ( 1696 840 -88 ) ( 1696 840 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1672 680 -120 ) ( 1672 680 -104 ) ( 1696 656 -104 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1472 776 -104 ) ( 1472 840 -104 ) ( 1536 840 -104 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1536 840 -120 ) ( 1472 840 -120 ) ( 1472 776 -120 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4096 +{ +( 1696 840 -104 ) ( 1632 840 -104 ) ( 1632 776 -104 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1632 776 -96 ) ( 1632 840 -96 ) ( 1696 840 -96 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1648 936 -72 ) ( 1712 936 -72 ) ( 1712 936 -104 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1864 776 -72 ) ( 1864 840 -72 ) ( 1864 840 -104 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1712 944 -72 ) ( 1648 944 -72 ) ( 1648 944 -104 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1672 752 -72 ) ( 1672 688 -72 ) ( 1672 688 -104 ) subway/1_bathroom_floor -32 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4097 +{ +( 1864 960 -88 ) ( 1864 896 -88 ) ( 1864 896 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1888 1128 -120 ) ( 1888 1128 -104 ) ( 1864 1104 -104 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1888 1128 -104 ) ( 1888 1128 -120 ) ( 1888 912 -120 ) subway/1_tile_big -16 0 0 0.500000 0.500000 0 318767104 0 +( 1888 912 -104 ) ( 1888 912 -120 ) ( 1864 936 -120 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1664 976 -104 ) ( 1664 1040 -104 ) ( 1728 1040 -104 ) subway/1_bathroom_floor 0 48 0 0.500000 0.500000 0 285212672 0 +( 1728 1040 -120 ) ( 1664 1040 -120 ) ( 1664 976 -120 ) subway/1_bathroom_floor 0 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 4098 +{ +( 1512 840 -120 ) ( 1448 840 -120 ) ( 1448 776 -120 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1448 776 -104 ) ( 1448 840 -104 ) ( 1512 840 -104 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1696 656 -104 ) ( 1696 656 -120 ) ( 1464 656 -120 ) subway/1_bathroom_floor 48 0 0 0.500000 0.500000 0 285212672 0 +( 1696 656 -120 ) ( 1696 656 -104 ) ( 1672 680 -104 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1528 680 -88 ) ( 1464 680 -88 ) ( 1464 680 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1464 656 -104 ) ( 1464 656 -120 ) ( 1488 680 -120 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4099 +{ +( 1328 840 -120 ) ( 1264 840 -120 ) ( 1264 776 -120 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1264 776 -104 ) ( 1264 840 -104 ) ( 1328 840 -104 ) subway/1_bathroom_floor 0 32 0 0.500000 0.500000 0 285212672 0 +( 1488 680 -104 ) ( 1488 680 -120 ) ( 1464 656 -120 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1488 1104 -104 ) ( 1488 1104 -120 ) ( 1488 680 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1488 1104 -120 ) ( 1488 1104 -104 ) ( 1464 1128 -104 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1464 760 -88 ) ( 1464 696 -88 ) ( 1464 696 -120 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4100 +{ +( 1888 1124 -128 ) ( 1888 1096 -128 ) ( 1896 1096 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1896 920 -120 ) ( 1888 912 -120 ) ( 1888 1128 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1896 904 -128 ) ( 1896 904 -120 ) ( 1896 1136 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1888 1128 -120 ) ( 1888 1128 -128 ) ( 1896 1136 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1888 1216 -128 ) ( 1888 1216 -120 ) ( 1888 1096 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1896 904 -120 ) ( 1896 904 -128 ) ( 1888 912 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 4101 +{ +( 1888 912 -168 ) ( 1888 912 -200 ) ( 1896 904 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1896 904 -168 ) ( 1896 904 -200 ) ( 1704 904 -200 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1704 904 -168 ) ( 1704 904 -200 ) ( 1696 912 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1888 912 -200 ) ( 1888 912 -168 ) ( 1696 912 -168 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1896 912 -168 ) ( 1896 904 -168 ) ( 1704 904 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1756 904 -200 ) ( 1784 904 -200 ) ( 1784 912 -200 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +} +// brush 4102 +{ +( 1696 912 -216 ) ( 1704 904 -216 ) ( 1704 904 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1696 736 -200 ) ( 1696 616 -200 ) ( 1696 616 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1704 648 -216 ) ( 1696 656 -216 ) ( 1696 656 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1704 800 -200 ) ( 1704 920 -200 ) ( 1704 920 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1696 708 -200 ) ( 1696 736 -200 ) ( 1704 736 -200 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1704 736 -216 ) ( 1696 736 -216 ) ( 1696 708 -216 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +} +// brush 4103 +{ +( 1704 736 -168 ) ( 1696 736 -168 ) ( 1696 708 -168 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1696 708 -128 ) ( 1696 736 -128 ) ( 1704 736 -128 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1704 800 -128 ) ( 1704 920 -128 ) ( 1704 920 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1704 648 -168 ) ( 1696 656 -168 ) ( 1696 656 -128 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1696 736 -128 ) ( 1696 616 -128 ) ( 1696 616 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1696 912 -168 ) ( 1704 904 -168 ) ( 1704 904 -128 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +} +// brush 4104 +{ +( 1704 736 -200 ) ( 1696 736 -200 ) ( 1696 708 -200 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1696 708 -168 ) ( 1696 736 -168 ) ( 1704 736 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1704 800 -168 ) ( 1704 920 -168 ) ( 1704 920 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1704 648 -200 ) ( 1696 656 -200 ) ( 1696 656 -168 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1696 736 -168 ) ( 1696 616 -168 ) ( 1696 616 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1696 912 -200 ) ( 1704 904 -200 ) ( 1704 904 -168 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +} +// brush 4105 +{ +( 1696 912 -128 ) ( 1704 904 -128 ) ( 1704 904 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1696 736 -120 ) ( 1696 616 -120 ) ( 1696 616 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1704 648 -128 ) ( 1696 656 -128 ) ( 1696 656 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1704 800 -120 ) ( 1704 920 -120 ) ( 1704 920 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1696 708 -120 ) ( 1696 736 -120 ) ( 1704 736 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1704 736 -128 ) ( 1696 736 -128 ) ( 1696 708 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 4106 +{ +( 1756 904 -216 ) ( 1784 904 -216 ) ( 1784 912 -216 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1784 912 -200 ) ( 1784 904 -200 ) ( 1756 904 -200 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1880 912 -216 ) ( 1880 912 -200 ) ( 1696 912 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1704 904 -200 ) ( 1704 904 -216 ) ( 1696 912 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1464 904 -216 ) ( 1464 904 -200 ) ( 1584 904 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1888 912 -200 ) ( 1888 912 -216 ) ( 1896 904 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +} +// brush 4107 +{ +( 1888 912 -128 ) ( 1888 912 -168 ) ( 1896 904 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1896 904 -128 ) ( 1896 904 -168 ) ( 1704 904 -168 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1704 904 -128 ) ( 1704 904 -168 ) ( 1696 912 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1888 912 -168 ) ( 1888 912 -128 ) ( 1696 912 -128 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1784 912 -128 ) ( 1784 904 -128 ) ( 1756 904 -128 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1756 904 -168 ) ( 1784 904 -168 ) ( 1784 912 -168 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +} +// brush 4108 +{ +( 1756 904 -128 ) ( 1784 904 -128 ) ( 1784 912 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1784 912 -120 ) ( 1784 904 -120 ) ( 1756 904 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1888 912 -128 ) ( 1888 912 -120 ) ( 1696 912 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1704 904 -120 ) ( 1704 904 -128 ) ( 1696 912 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1896 904 -120 ) ( 1896 904 -128 ) ( 1704 904 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1888 912 -120 ) ( 1888 912 -128 ) ( 1896 904 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 4109 +{ +( 1464 448 -216 ) ( 1464 448 -224 ) ( 1464 776 -224 ) subway/1_bathroom_floor_edge 0 -16 90 0.500000 0.500000 0 285212672 0 +( 1496 752 -224 ) ( 1496 752 -216 ) ( 1464 720 -216 ) subway/1_bathroom_floor_edge 0 -16 90 0.500000 0.500000 0 285212672 0 +( 1496 688 -224 ) ( 1496 688 -216 ) ( 1496 752 -216 ) subway/1_bathroom_floor_edge 0 -16 90 0.500000 0.500000 0 285212672 0 +( 1496 688 -216 ) ( 1496 688 -224 ) ( 1464 656 -224 ) subway/1_bathroom_floor_edge 0 -16 90 0.500000 0.500000 0 285212672 0 +( 1272 368 -216 ) ( 1272 432 -216 ) ( 1336 432 -216 ) subway/1_bathroom_floor_edge -32 15 90 0.500000 0.500000 0 285212672 0 +( 1336 432 -224 ) ( 1272 432 -224 ) ( 1272 368 -224 ) subway/1_bathroom_floor_edge -32 15 90 0.500000 0.500000 0 285212672 0 +} +// brush 4110 +{ +( 1456 712 -200 ) ( 1456 712 -216 ) ( 1464 720 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1464 616 -216 ) ( 1464 616 -200 ) ( 1464 736 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1464 656 -200 ) ( 1464 656 -216 ) ( 1456 648 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1456 728 -216 ) ( 1456 728 -200 ) ( 1456 608 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1456 736 -200 ) ( 1464 736 -200 ) ( 1464 708 -200 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1464 708 -216 ) ( 1464 736 -216 ) ( 1456 736 -216 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +} +// brush 4111 +{ +( 1464 708 -168 ) ( 1464 736 -168 ) ( 1456 736 -168 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1456 736 -128 ) ( 1464 736 -128 ) ( 1464 708 -128 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1456 728 -168 ) ( 1456 728 -128 ) ( 1456 608 -128 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1464 656 -128 ) ( 1464 656 -168 ) ( 1456 648 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1464 616 -168 ) ( 1464 616 -128 ) ( 1464 736 -128 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1456 712 -128 ) ( 1456 712 -168 ) ( 1464 720 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +} +// brush 4112 +{ +( 1464 708 -200 ) ( 1464 736 -200 ) ( 1456 736 -200 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1456 736 -168 ) ( 1464 736 -168 ) ( 1464 708 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1456 728 -200 ) ( 1456 728 -168 ) ( 1456 608 -168 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1464 656 -168 ) ( 1464 656 -200 ) ( 1456 648 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1464 616 -200 ) ( 1464 616 -168 ) ( 1464 736 -168 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1456 712 -168 ) ( 1456 712 -200 ) ( 1464 720 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +} +// brush 4113 +{ +( 1456 712 -120 ) ( 1456 712 -128 ) ( 1464 720 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1464 616 -128 ) ( 1464 616 -120 ) ( 1464 736 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1464 656 -120 ) ( 1464 656 -128 ) ( 1456 648 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1456 728 -128 ) ( 1456 728 -120 ) ( 1456 608 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1456 736 -120 ) ( 1464 736 -120 ) ( 1464 708 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1464 708 -128 ) ( 1464 736 -128 ) ( 1456 736 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 4114 +{ +( 1888 1124 -216 ) ( 1888 1096 -216 ) ( 1896 1096 -216 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1896 1096 -200 ) ( 1888 1096 -200 ) ( 1888 1124 -200 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1896 904 -216 ) ( 1896 904 -200 ) ( 1896 1136 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1888 1128 -200 ) ( 1888 1128 -216 ) ( 1896 1136 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1888 1216 -216 ) ( 1888 1216 -200 ) ( 1888 1096 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1896 904 -200 ) ( 1896 904 -216 ) ( 1888 912 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +} +// brush 4115 +{ +( 1896 904 -128 ) ( 1896 904 -168 ) ( 1888 912 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1888 1208 -168 ) ( 1888 1208 -128 ) ( 1888 1088 -128 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1888 1128 -128 ) ( 1888 1128 -168 ) ( 1896 1136 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1896 904 -168 ) ( 1896 904 -128 ) ( 1896 1136 -128 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1896 1096 -128 ) ( 1888 1096 -128 ) ( 1888 1124 -128 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1888 1124 -168 ) ( 1888 1096 -168 ) ( 1896 1096 -168 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +} +// brush 4116 +{ +( 1888 1128 -120 ) ( 1896 1136 -120 ) ( 1896 1136 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1272 1128 -128 ) ( 1272 1128 -120 ) ( 1392 1128 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1464 1128 -120 ) ( 1464 1128 -128 ) ( 1456 1136 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1648 1136 -128 ) ( 1960 1136 -128 ) ( 1960 1136 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1544 1136 -120 ) ( 1544 1128 -120 ) ( 1516 1128 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1516 1128 -128 ) ( 1544 1128 -128 ) ( 1544 1136 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 4117 +{ +( 1516 1128 -168 ) ( 1544 1128 -168 ) ( 1544 1136 -168 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1544 1136 -128 ) ( 1544 1128 -128 ) ( 1516 1128 -128 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1648 1136 -168 ) ( 1960 1136 -168 ) ( 1960 1136 -128 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1464 1128 -128 ) ( 1464 1128 -168 ) ( 1456 1136 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1272 1128 -168 ) ( 1272 1128 -128 ) ( 1392 1128 -128 ) subway/1_bathroom_women_nos 0 0 0 0.500000 0.500000 0 0 0 +( 1888 1128 -128 ) ( 1896 1136 -128 ) ( 1896 1136 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +} +// brush 4118 +{ +( 1516 1128 -200 ) ( 1544 1128 -200 ) ( 1544 1136 -200 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1544 1136 -168 ) ( 1544 1128 -168 ) ( 1516 1128 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1648 1136 -200 ) ( 1960 1136 -200 ) ( 1960 1136 -168 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1464 1128 -168 ) ( 1464 1128 -200 ) ( 1456 1136 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1272 1128 -200 ) ( 1272 1128 -168 ) ( 1392 1128 -168 ) subway/1_bathroom_women 0 -16 0 0.500000 0.500000 0 0 0 +( 1888 1128 -168 ) ( 1896 1136 -168 ) ( 1896 1136 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +} +// brush 4119 +{ +( 1888 1128 -200 ) ( 1896 1136 -200 ) ( 1896 1136 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1272 1128 -216 ) ( 1272 1128 -200 ) ( 1392 1128 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1464 1128 -200 ) ( 1464 1128 -216 ) ( 1456 1136 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1648 1136 -216 ) ( 1960 1136 -216 ) ( 1960 1136 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1544 1136 -200 ) ( 1544 1128 -200 ) ( 1516 1128 -200 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1516 1128 -216 ) ( 1544 1128 -216 ) ( 1544 1136 -216 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +} +// brush 4120 +{ +( 1464 800 -168 ) ( 1456 808 -168 ) ( 1456 808 -128 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1464 800 -128 ) ( 1464 920 -128 ) ( 1464 920 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1456 1136 -168 ) ( 1464 1128 -168 ) ( 1464 1128 -128 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1456 928 -128 ) ( 1456 808 -128 ) ( 1456 808 -168 ) subway/1_bathroom_women_nos -32 0 0 0.500000 0.500000 0 0 0 +( 1464 828 -128 ) ( 1464 800 -128 ) ( 1456 800 -128 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +( 1456 800 -168 ) ( 1464 800 -168 ) ( 1464 828 -168 ) subway/1_bathroom_women_nos 0 32 0 0.500000 0.500000 0 0 0 +} +// brush 4121 +{ +( 1456 800 -128 ) ( 1464 800 -128 ) ( 1464 828 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1464 828 -120 ) ( 1464 800 -120 ) ( 1456 800 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1456 928 -120 ) ( 1456 808 -120 ) ( 1456 808 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1456 1136 -128 ) ( 1464 1128 -128 ) ( 1464 1128 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1464 800 -120 ) ( 1464 920 -120 ) ( 1464 920 -128 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +( 1464 800 -128 ) ( 1456 808 -128 ) ( 1456 808 -120 ) subway/1_bathroom_women_top 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 4122 +{ +( 1464 800 -200 ) ( 1456 808 -200 ) ( 1456 808 -168 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1464 800 -168 ) ( 1464 920 -168 ) ( 1464 920 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1456 1136 -200 ) ( 1464 1128 -200 ) ( 1464 1128 -168 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1456 928 -168 ) ( 1456 808 -168 ) ( 1456 808 -200 ) subway/1_bathroom_women -32 -16 0 0.500000 0.500000 0 0 0 +( 1464 828 -168 ) ( 1464 800 -168 ) ( 1456 800 -168 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +( 1456 800 -200 ) ( 1464 800 -200 ) ( 1464 828 -200 ) subway/1_bathroom_women 0 16 0 0.500000 0.500000 0 0 0 +} +// brush 4123 +{ +( 1456 800 -216 ) ( 1464 800 -216 ) ( 1464 828 -216 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1464 828 -200 ) ( 1464 800 -200 ) ( 1456 800 -200 ) subway/1_bathroom_women_bottom 0 16 0 0.500000 0.500000 0 0 0 +( 1456 928 -200 ) ( 1456 808 -200 ) ( 1456 808 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1456 1136 -216 ) ( 1464 1128 -216 ) ( 1464 1128 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1464 800 -200 ) ( 1464 920 -200 ) ( 1464 920 -216 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +( 1464 800 -216 ) ( 1456 808 -216 ) ( 1456 808 -200 ) subway/1_bathroom_women_bottom 0 -16 0 0.500000 0.500000 0 0 0 +} +// brush 4124 +{ +( 1464 1128 -120 ) ( 1464 1128 -104 ) ( 1488 1104 -104 ) subway/1_bathroom_floor -32 0 0 0.500000 0.500000 0 285212672 0 +( 1464 1128 -104 ) ( 1464 1128 -120 ) ( 1888 1128 -120 ) subway/1_bathroom_floor 48 0 0 0.500000 0.500000 0 285212672 0 +( 1864 1104 -120 ) ( 1864 1104 -104 ) ( 1888 1128 -104 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1864 1104 -104 ) ( 1864 1104 -120 ) ( 1488 1104 -120 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1448 1224 -104 ) ( 1448 1288 -104 ) ( 1512 1288 -104 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +( 1512 1288 -120 ) ( 1448 1288 -120 ) ( 1448 1224 -120 ) subway/1_bathroom_floor 48 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4125 +{ +( 1528 876 -208 ) ( 1528 884 -208 ) ( 1464 884 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1464 884 -144 ) ( 1528 884 -144 ) ( 1528 876 -144 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1464 876 -192 ) ( 1464 876 -176 ) ( 1528 876 -176 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1464 884 -192 ) ( 1464 884 -176 ) ( 1464 876 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1528 880 -192 ) ( 1528 880 -176 ) ( 1464 880 -176 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1524 876 -192 ) ( 1524 876 -176 ) ( 1524 884 -176 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 4126 +{ +( -432 1408 -168 ) ( -432 1344 -168 ) ( -368 1344 -168 ) subway/1_concrete_floor 688 2672 0 0.500000 0.500000 0 285212672 0 +( -368 1344 -160 ) ( -432 1344 -160 ) ( -432 1408 -160 ) subway/1_stair_top1 944 -2304 0 0.500000 -0.500000 0 285212672 0 +( -240 1408 -168 ) ( -240 1408 -160 ) ( -304 1408 -160 ) subway/1_concrete_floor 688 -320 0 0.500000 0.500000 0 285212672 0 +( -320 1224 -168 ) ( -320 1224 -160 ) ( -320 1288 -160 ) subway/1_concrete_floor -2672 -320 0 0.500000 0.500000 0 285212672 0 +( -368 1384 -168 ) ( -368 1384 -160 ) ( -304 1384 -160 ) subway/1_stair_side1 688 -320 0 0.500000 0.500000 0 285212672 0 +( -432 1408 -168 ) ( -432 1408 -160 ) ( -432 1344 -160 ) subway/1_concrete_floor -2672 -320 0 0.500000 0.500000 0 285212672 0 +} +// brush 4127 +{ +( -432 1432 -160 ) ( -432 1432 -152 ) ( -432 1368 -152 ) subway/1_concrete_floor -2624 -304 0 0.500000 0.500000 0 285212672 0 +( -368 1408 -160 ) ( -368 1408 -152 ) ( -304 1408 -152 ) subway/1_stair_side1 688 -304 0 0.500000 0.500000 0 285212672 0 +( -320 1248 -160 ) ( -320 1248 -152 ) ( -320 1312 -152 ) subway/1_concrete_floor -2624 -304 0 0.500000 0.500000 0 285212672 0 +( -240 1432 -160 ) ( -240 1432 -152 ) ( -304 1432 -152 ) subway/1_concrete_floor 688 -304 0 0.500000 0.500000 0 285212672 0 +( -368 1368 -152 ) ( -432 1368 -152 ) ( -432 1432 -152 ) subway/1_stair_top1 944 -2352 0 0.500000 -0.500000 0 285212672 0 +( -432 1432 -160 ) ( -432 1368 -160 ) ( -368 1368 -160 ) subway/1_concrete_floor 688 2624 0 0.500000 0.500000 0 285212672 0 +} +// brush 4128 +{ +( -432 1456 -152 ) ( -432 1456 -144 ) ( -432 1392 -144 ) subway/1_concrete_floor -2576 -288 0 0.500000 0.500000 0 285212672 0 +( -368 1432 -152 ) ( -368 1432 -144 ) ( -304 1432 -144 ) subway/1_stair_side1 688 -288 0 0.500000 0.500000 0 285212672 0 +( -320 1272 -152 ) ( -320 1272 -144 ) ( -320 1336 -144 ) subway/1_concrete_floor -2576 -288 0 0.500000 0.500000 0 285212672 0 +( -240 1456 -152 ) ( -240 1456 -144 ) ( -304 1456 -144 ) subway/1_concrete_floor 688 -288 0 0.500000 0.500000 0 285212672 0 +( -368 1392 -144 ) ( -432 1392 -144 ) ( -432 1456 -144 ) subway/1_stair_top1 944 -2400 0 0.500000 -0.500000 0 285212672 0 +( -432 1456 -152 ) ( -432 1392 -152 ) ( -368 1392 -152 ) subway/1_concrete_floor 688 2576 0 0.500000 0.500000 0 285212672 0 +} +// brush 4129 +{ +( -432 1480 -144 ) ( -432 1480 -136 ) ( -432 1416 -136 ) subway/1_concrete_floor -2528 -272 0 0.500000 0.500000 0 285212672 0 +( -368 1456 -144 ) ( -368 1456 -136 ) ( -304 1456 -136 ) subway/1_stair_side1 688 -272 0 0.500000 0.500000 0 285212672 0 +( -320 1296 -144 ) ( -320 1296 -136 ) ( -320 1360 -136 ) subway/1_concrete_floor -2528 -272 0 0.500000 0.500000 0 285212672 0 +( -240 1480 -144 ) ( -240 1480 -136 ) ( -304 1480 -136 ) subway/1_concrete_floor 688 -272 0 0.500000 0.500000 0 285212672 0 +( -368 1416 -136 ) ( -432 1416 -136 ) ( -432 1480 -136 ) subway/1_stair_top1 944 -2448 0 0.500000 -0.500000 0 285212672 0 +( -432 1480 -144 ) ( -432 1416 -144 ) ( -368 1416 -144 ) subway/1_concrete_floor 688 2528 0 0.500000 0.500000 0 285212672 0 +} +// brush 4130 +{ +( -432 1504 -136 ) ( -432 1504 -128 ) ( -432 1440 -128 ) subway/1_concrete_floor -2480 -256 0 0.500000 0.500000 0 285212672 0 +( -368 1480 -136 ) ( -368 1480 -128 ) ( -304 1480 -128 ) subway/1_stair_side1 688 -256 0 0.500000 0.500000 0 285212672 0 +( -320 1320 -136 ) ( -320 1320 -128 ) ( -320 1384 -128 ) subway/1_concrete_floor -2480 -256 0 0.500000 0.500000 0 285212672 0 +( -240 1504 -136 ) ( -240 1504 -128 ) ( -304 1504 -128 ) subway/1_concrete_floor 688 -256 0 0.500000 0.500000 0 285212672 0 +( -368 1440 -128 ) ( -432 1440 -128 ) ( -432 1504 -128 ) subway/1_stair_top1 944 -2496 0 0.500000 -0.500000 0 285212672 0 +( -432 1504 -136 ) ( -432 1440 -136 ) ( -368 1440 -136 ) subway/1_concrete_floor 688 2480 0 0.500000 0.500000 0 285212672 0 +} +// brush 4131 +{ +( -432 1528 -128 ) ( -432 1528 -120 ) ( -432 1464 -120 ) subway/1_concrete_floor -2464 0 0 0.500000 0.500000 0 285212672 0 +( -368 1504 -128 ) ( -368 1504 -120 ) ( -304 1504 -120 ) subway/1_stair_side1 944 0 0 0.500000 0.500000 0 285212672 0 +( -320 1344 -128 ) ( -320 1344 -120 ) ( -320 1408 -120 ) subway/1_concrete_floor -2464 0 0 0.500000 0.500000 0 285212672 0 +( -304 1528 -128 ) ( -304 1528 -120 ) ( -368 1528 -120 ) subway/1_concrete_floor 944 0 0 0.500000 0.500000 0 285212672 0 +( -368 1464 -120 ) ( -432 1464 -120 ) ( -432 1528 -120 ) subway/1_stair_top1 944 -2544 0 0.500000 -0.500000 0 285212672 0 +( -432 1528 -128 ) ( -432 1464 -128 ) ( -368 1464 -128 ) subway/1_concrete_floor 944 2464 0 0.500000 0.500000 0 285212672 0 +} +// brush 4132 +{ +( -470 1504 -88 ) ( -470 1496 -88 ) ( -470 1496 -116 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -466 1496 -88 ) ( -466 1504 -88 ) ( -466 1504 -116 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -472 1496 -88 ) ( -464 1496 -88 ) ( -464 1496 -116 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -464 1504 -116 ) ( -472 1504 -116 ) ( -472 1496 -116 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +( -464 1504 -88 ) ( -472 1504 -88 ) ( -472 1504 -116 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -472 1504 -88 ) ( -464 1504 -88 ) ( -464 1496 -88 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +( -328 1480 -96 ) ( -328 1504 -88 ) ( -318 1504 -88 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +( -328 1504 -112 ) ( -328 1480 -120 ) ( -318 1480 -120 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +} +// brush 4133 +{ +( -472 1360 -128 ) ( -472 1360 -136 ) ( -472 1504 -88 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -464 1360 -136 ) ( -464 1360 -128 ) ( -464 1504 -80 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -464 1360 -128 ) ( -464 1360 -160 ) ( -472 1360 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -472 1360 -136 ) ( -464 1360 -136 ) ( -464 1504 -88 ) subway/1_black 0 8 0 1 1 0 16777216 0 +( -464 1504 -112 ) ( -464 1504 -80 ) ( -472 1504 -80 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -464 1360 -132 ) ( -472 1360 -132 ) ( -472 1504 -84 ) subway/1_black 0 8 0 1 1 0 16777216 0 +} +// brush 4134 +{ +( -470 1504 -124 ) ( -470 1504 -88 ) ( -470 1476 -88 ) subway/bars2 -16 0 0 0.500000 0.500000 134217728 16779264 0 +( -466 1476 -88 ) ( -466 1504 -88 ) ( -466 1504 -124 ) subway/bars2 -16 0 0 0.500000 0.500000 134217728 16779264 0 +( -464 1368 -116 ) ( -464 1368 -152 ) ( -472 1368 -152 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -464 1476 -160 ) ( -464 1504 -160 ) ( -472 1504 -160 ) subway/bars2 0 16 0 0.500000 0.500000 134217728 16779264 0 +( -464 1496 -124 ) ( -464 1496 -88 ) ( -472 1496 -88 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( -464 1504 -88 ) ( -464 1476 -88 ) ( -472 1476 -88 ) subway/bars2 0 16 0 0.500000 0.500000 134217728 16779264 0 +( -328 1360 -136 ) ( -328 1504 -88 ) ( -318 1504 -88 ) subway/bars2 0 16 0 0.500000 0.500000 134217728 16779264 0 +( -328 1504 -112 ) ( -328 1360 -160 ) ( -318 1360 -160 ) subway/bars2 0 16 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 4135 +{ +( -470 1368 -160 ) ( -470 1368 -132 ) ( -470 1360 -132 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -466 1360 -132 ) ( -466 1368 -132 ) ( -466 1368 -160 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -466 1360 -132 ) ( -466 1360 -160 ) ( -474 1360 -160 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -464 1360 -160 ) ( -464 1368 -160 ) ( -472 1368 -160 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +( -464 1368 -160 ) ( -464 1368 -132 ) ( -472 1368 -132 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -464 1368 -132 ) ( -464 1360 -132 ) ( -472 1360 -132 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +( -328 1360 -136 ) ( -328 1384 -128 ) ( -318 1384 -128 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +( -328 1384 -152 ) ( -328 1360 -160 ) ( -318 1360 -160 ) subway/1_black 0 8 0 1 1 134217728 16777216 0 +} +// brush 4136 +{ +( -976 1208 -8 ) ( -976 1112 24 ) ( -966 1112 24 ) subway/1_black -8 8 0 1 1 134217728 16777216 0 +( -976 1112 48 ) ( -976 1208 16 ) ( -966 1208 16 ) subway/1_black -8 8 0 1 1 134217728 16777216 0 +( -1016 1120 48 ) ( -1016 1112 48 ) ( -1024 1112 48 ) subway/1_black -8 8 0 1 1 134217728 16777216 0 +( -1016 1120 16 ) ( -1016 1120 56 ) ( -1024 1120 56 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1016 1112 16 ) ( -1016 1120 16 ) ( -1024 1120 16 ) subway/1_black -8 8 0 1 1 134217728 16777216 0 +( -1016 1112 48 ) ( -1016 1112 8 ) ( -1024 1112 8 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1018 1112 56 ) ( -1018 1120 56 ) ( -1018 1120 16 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1022 1120 16 ) ( -1022 1120 56 ) ( -1022 1112 56 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +} +// brush 4137 +{ +( -432 1408 -168 ) ( -432 1344 -168 ) ( -368 1344 -168 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -440 1528 -112 ) ( -432 1528 -112 ) ( -432 1384 -160 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -432 1528 -112 ) ( -440 1528 -112 ) ( -440 1528 -168 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -432 1224 -168 ) ( -432 1224 -160 ) ( -432 1288 -160 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -368 1384 -168 ) ( -368 1384 -160 ) ( -304 1384 -160 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -440 1528 -168 ) ( -440 1528 -160 ) ( -440 1464 -160 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 4138 +{ +( -752 1608 -112 ) ( -752 1544 -112 ) ( -688 1544 -112 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -688 1544 -96 ) ( -752 1544 -96 ) ( -752 1608 -96 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -248 1536 -128 ) ( -248 1536 -80 ) ( -248 1544 -80 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -712 1544 -64 ) ( -712 1544 -128 ) ( -544 1544 -128 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -280 1536 -64 ) ( -280 1536 -112 ) ( -280 1544 -112 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -248 1528 -80 ) ( -248 1528 -128 ) ( -288 1528 -128 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4139 +{ +( -752 1608 -64 ) ( -752 1544 -64 ) ( -688 1544 -64 ) subway/1_tile_middle 288 272 0 0.500000 0.500000 0 318767104 0 +( -688 1544 -48 ) ( -752 1544 -48 ) ( -752 1608 -48 ) subway/1_tile_middle 288 272 0 0.500000 0.500000 0 318767104 0 +( -248 1536 -64 ) ( -248 1536 -48 ) ( -248 1544 -48 ) subway/1_tile_middle -272 0 0 0.500000 0.500000 0 318767104 0 +( -712 1544 -48 ) ( -712 1544 -64 ) ( -544 1544 -64 ) subway/1_tile_middle 128 0 0 0.500000 0.500000 0 318767104 0 +( -280 1536 -48 ) ( -280 1536 -64 ) ( -280 1544 -64 ) subway/1_tile_middle -272 0 0 0.500000 0.500000 0 318767104 0 +( -288 1528 -64 ) ( -288 1528 -48 ) ( -248 1528 -48 ) subway/1_tile_middle 128 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4140 +{ +( -752 1608 -48 ) ( -752 1544 -48 ) ( -688 1544 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -248 1544 0 ) ( -256 1536 0 ) ( -280 1536 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -248 1536 -48 ) ( -248 1536 -32 ) ( -248 1544 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -712 1544 -32 ) ( -712 1544 -48 ) ( -544 1544 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -280 1536 -32 ) ( -280 1536 -48 ) ( -280 1544 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -288 1528 -48 ) ( -288 1528 -32 ) ( -248 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 4141 +{ +( -704 1528 -64 ) ( -704 1528 -48 ) ( -664 1528 -48 ) subway/1_tile_middle 128 0 0 0.500000 0.500000 0 318767104 0 +( -696 1552 -48 ) ( -696 1552 -64 ) ( -696 1560 -64 ) subway/1_tile_middle -272 0 0 0.500000 0.500000 0 318767104 0 +( -1128 1544 -48 ) ( -1128 1544 -64 ) ( -960 1544 -64 ) subway/1_tile_middle 128 0 0 0.500000 0.500000 0 318767104 0 +( -664 1536 -64 ) ( -664 1536 -48 ) ( -664 1544 -48 ) subway/1_tile_middle -272 0 0 0.500000 0.500000 0 318767104 0 +( -1104 1544 -48 ) ( -1168 1544 -48 ) ( -1168 1608 -48 ) subway/1_tile_middle 288 272 0 0.500000 0.500000 0 318767104 0 +( -1168 1608 -64 ) ( -1168 1544 -64 ) ( -1104 1544 -64 ) subway/1_tile_middle 288 272 0 0.500000 0.500000 0 318767104 0 +} +// brush 4142 +{ +( -664 1528 -80 ) ( -664 1528 -128 ) ( -704 1528 -128 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -696 1552 -80 ) ( -696 1552 -128 ) ( -696 1560 -128 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -1128 1544 -64 ) ( -1128 1544 -128 ) ( -960 1544 -128 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -664 1536 -128 ) ( -664 1536 -80 ) ( -664 1544 -80 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -1104 1544 -96 ) ( -1168 1544 -96 ) ( -1168 1608 -96 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -1168 1608 -112 ) ( -1168 1544 -112 ) ( -1104 1544 -112 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4143 +{ +( -704 1528 -48 ) ( -704 1528 -32 ) ( -664 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -696 1552 -32 ) ( -696 1552 -48 ) ( -696 1560 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -1128 1544 -32 ) ( -1128 1544 -48 ) ( -960 1544 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -664 1536 -48 ) ( -664 1536 -32 ) ( -664 1544 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -664 1544 0 ) ( -672 1536 0 ) ( -696 1536 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -1168 1608 -48 ) ( -1168 1544 -48 ) ( -1104 1544 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 4144 +{ +( -544 1752 -104 ) ( -480 1752 -104 ) ( -480 1752 -112 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -144 ) ( -704 1760 -80 ) ( -696 1752 -80 ) subway/1_tile_bottom -192 0 0 0.500000 0.500000 0 318767104 0 +( -704 1760 -64 ) ( -704 1760 -128 ) ( -536 1760 -128 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -232 1768 -80 ) ( -232 1768 -144 ) ( -240 1760 -144 ) subway/1_tile_bottom -192 0 0 0.500000 0.500000 0 318767104 0 +( -680 1760 -96 ) ( -744 1760 -96 ) ( -744 1824 -96 ) subway/1_tile_bottom 0 192 0 0.500000 0.500000 0 318767104 0 +( -744 1824 -112 ) ( -744 1760 -112 ) ( -680 1760 -112 ) subway/1_tile_bottom 0 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 4145 +{ +( 216 1056 -136 ) ( 216 1056 -208 ) ( 216 1280 -208 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 240 1088 -136 ) ( 240 1088 -208 ) ( 248 1088 -208 ) subway/1_tile_damage2 0 24 0 0.500000 0.500000 0 352321536 0 +( 248 1096 -80 ) ( 248 1096 -152 ) ( 248 960 -152 ) subway/1_tile_graf3 0 16 0 0.500000 0.500000 0 352321536 0 +( 216 1056 -208 ) ( 216 1056 -136 ) ( 224 1056 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1056 -120 ) ( 216 1048 -120 ) ( 216 1280 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 288 1096 -152 ) ( 224 1096 -152 ) ( 224 1032 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4146 +{ +( -1016 1472 -96 ) ( -1024 1472 -96 ) ( -1024 1112 24 ) subway/bars2 -48 16 0 0.500000 0.500000 134217728 16779264 0 +( -1024 1472 -72 ) ( -1016 1472 -72 ) ( -1016 1112 48 ) subway/bars2 -48 16 0 0.500000 0.500000 134217728 16779264 0 +( -1024 1120 -80 ) ( -1024 1120 -72 ) ( -1016 1120 48 ) subway/bars2 -48 0 0 0.500000 0.500000 134217728 16779264 0 +( -1019 1472 -72 ) ( -1019 1472 -80 ) ( -1019 1112 40 ) subway/bars2 -16 0 0 0.500000 0.500000 134217728 16779264 0 +( -1024 1472 -72 ) ( -1024 1472 -80 ) ( -1016 1472 -80 ) subway/bars2 -48 0 0 0.500000 0.500000 134217728 16779264 0 +( -1021 1632 -112 ) ( -1021 1632 -104 ) ( -1021 1272 -104 ) subway/bars2 -16 0 0 0.500000 0.500000 134217728 16779264 0 +( -976 1464 -8 ) ( -976 1464 -104 ) ( -966 1464 -104 ) subway/bars2 -48 0 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 4147 +{ +( -1024 1472 -80 ) ( -1024 1472 -72 ) ( -1024 1112 -72 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1024 1472 -72 ) ( -1024 1472 -80 ) ( -1016 1472 -80 ) subway/1_black -8 0 0 1 1 0 16777216 0 +( -1016 1472 -76 ) ( -1016 1472 -84 ) ( -1016 1112 36 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1024 1112 -72 ) ( -1024 1112 -64 ) ( -1016 1112 56 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1024 1472 -68 ) ( -1016 1472 -68 ) ( -1016 1112 52 ) subway/1_black -8 8 0 1 1 0 16777216 0 +( -1016 1472 -72 ) ( -1024 1472 -72 ) ( -1024 1112 48 ) subway/1_black -8 8 0 1 1 0 16777216 0 +} +// brush 4148 +{ +( -1024 1472 -112 ) ( -1024 1472 -104 ) ( -1024 1112 -104 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1024 1472 -104 ) ( -1024 1472 -112 ) ( -1016 1472 -112 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1016 1472 -104 ) ( -1016 1472 -112 ) ( -1016 1112 8 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1024 1112 -104 ) ( -1024 1112 -96 ) ( -1016 1112 24 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1024 1472 -96 ) ( -1016 1472 -96 ) ( -1016 1112 24 ) subway/1_black -8 8 0 1 1 134217728 16777216 0 +( -1016 1472 -112 ) ( -1024 1472 -112 ) ( -1024 1112 8 ) subway/1_black -8 8 0 1 1 134217728 16777216 0 +} +// brush 4149 +{ +( -1022 1472 -96 ) ( -1022 1472 -64 ) ( -1022 1464 -64 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1018 1464 -64 ) ( -1018 1472 -64 ) ( -1018 1472 -96 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1018 1464 -72 ) ( -1018 1464 -104 ) ( -1026 1464 -104 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1016 1464 -96 ) ( -1016 1472 -96 ) ( -1024 1472 -96 ) subway/1_black -8 8 0 1 1 134217728 16777216 0 +( -1014 1472 -96 ) ( -1014 1472 -64 ) ( -1022 1472 -64 ) subway/1_black -8 0 0 1 1 134217728 16777216 0 +( -1016 1472 -64 ) ( -1016 1464 -64 ) ( -1024 1464 -64 ) subway/1_black -8 8 0 1 1 134217728 16777216 0 +( -976 1448 -64 ) ( -976 1472 -72 ) ( -966 1472 -72 ) subway/1_black -8 8 0 1 1 134217728 16777216 0 +( -976 1472 -96 ) ( -976 1424 -80 ) ( -966 1424 -80 ) subway/1_black -8 8 0 1 1 134217728 16777216 0 +} +// brush 4150 +{ +( -128 1296 -152 ) ( -128 1360 -152 ) ( -192 1360 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -192 1360 -64 ) ( -128 1360 -64 ) ( -128 1296 -64 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -136 1400 -152 ) ( -136 1400 -48 ) ( -120 1384 -48 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -136 1400 -48 ) ( -136 1400 -152 ) ( -136 1424 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -128 1432 -112 ) ( -128 1432 -104 ) ( -192 1432 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( -120 1264 -152 ) ( -120 1264 -48 ) ( -120 1408 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4151 +{ +( 256 1064 -68 ) ( 256 1072 -68 ) ( 240 1072 -68 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 240 1072 -52 ) ( 256 1072 -52 ) ( 256 1064 -52 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 248 1064 -68 ) ( 248 1064 -52 ) ( 264 1064 -52 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 248 1072 -68 ) ( 248 1072 -52 ) ( 248 1064 -52 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 256 1080 -68 ) ( 256 1080 -52 ) ( 240 1080 -52 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 252 1064 -68 ) ( 252 1064 -52 ) ( 252 1072 -52 ) subway/light_yellow -16 24 0 0.500000 0.500000 134217728 1 12000 +} +// brush 4152 +{ +( 576 -344 -184 ) ( 576 -344 -152 ) ( 576 -728 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 576 -384 -152 ) ( 576 -384 -184 ) ( 584 -384 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -944 -152 ) ( 584 -944 -184 ) ( 584 -1088 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -392 -184 ) ( 576 -392 -184 ) ( 576 -392 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 608 -576 -152 ) ( 608 -512 -152 ) ( 672 -512 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 672 -512 -184 ) ( 608 -512 -184 ) ( 608 -576 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4153 +{ +( 668 -320 -52 ) ( 644 -320 -52 ) ( 644 -344 -52 ) subway/light_blue 1232 -960 0 0.500000 0.500000 134217728 1 20000 +( 644 -344 -48 ) ( 644 -320 -48 ) ( 668 -320 -48 ) subway/1_black 2720 -720 0 0.500000 0.500000 134217728 16777216 0 +( 648 -336 -44 ) ( 672 -336 -44 ) ( 672 -336 -52 ) subway/1_black 2720 80 0 0.500000 0.500000 134217728 16777216 0 +( 664 -340 -44 ) ( 664 -316 -44 ) ( 664 -316 -52 ) subway/1_black 2304 80 0 0.500000 0.500000 134217728 16777216 0 +( 668 -320 -44 ) ( 644 -320 -44 ) ( 644 -320 -52 ) subway/1_black 2720 80 0 0.500000 0.500000 134217728 16777216 0 +( 648 -320 -44 ) ( 648 -344 -44 ) ( 648 -344 -52 ) subway/1_black 2304 80 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4154 +{ +( 912 -24 -96 ) ( 848 -24 -96 ) ( 848 -88 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 848 -88 -48 ) ( 848 -24 -48 ) ( 912 -24 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 -24 -152 ) ( 808 -24 -104 ) ( 808 40 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 -24 -72 ) ( 808 -24 -120 ) ( 784 -24 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 -40 -136 ) ( 584 -40 -120 ) ( 584 -48 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 520 8 -104 ) ( 520 8 -120 ) ( 584 8 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4155 +{ +( 868 188 -156 ) ( 868 188 -124 ) ( 868 204 -124 ) subway/light_yellow 200 8 0 0.500000 0.500000 134217728 1 10000 +( 872 204 -156 ) ( 872 204 -124 ) ( 864 204 -124 ) subway/1_black 336 -192 0 0.500000 0.500000 134217728 16777216 0 +( 864 204 -156 ) ( 864 204 -124 ) ( 864 188 -124 ) subway/1_black 184 -8 0 0.500000 0.500000 134217728 16777216 0 +( 864 188 -156 ) ( 864 188 -124 ) ( 872 188 -124 ) subway/1_black 336 -8 0 0.500000 0.500000 134217728 16777216 0 +( 864 204 -124 ) ( 872 204 -124 ) ( 872 188 -124 ) subway/1_black 336 -184 0 0.500000 0.500000 134217728 16777216 0 +( 872 192 -140 ) ( 872 208 -140 ) ( 864 208 -140 ) subway/1_black 336 -184 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4156 +{ +( 1160 864 -48 ) ( 1096 864 -48 ) ( 1096 800 -48 ) subway/1_concrete_floor2 16 0 0 0.500000 0.500000 0 285212672 0 +( 1096 800 -40 ) ( 1096 864 -40 ) ( 1160 864 -40 ) subway/1_lobby4 -144 208 90 0.500000 0.500000 0 285212672 0 +( 1072 872 -80 ) ( 1072 872 -32 ) ( 1072 936 -32 ) subway/1_lobby4 1280 32 0 0.500000 0.500000 0 285212672 0 +( 1088 328 -32 ) ( 1088 328 -80 ) ( 1064 328 -80 ) subway/1_beam1 -304 32 0 0.500000 0.500000 0 16777216 0 +( 840 832 -48 ) ( 840 832 -32 ) ( 840 824 -32 ) subway/1_beam1 1280 32 0 0.500000 0.500000 0 16777216 0 +( 936 552 -48 ) ( 888 552 -48 ) ( 936 552 -56 ) subway/1_lobby4 -304 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4157 +{ +( 792 40 -112 ) ( 792 40 -96 ) ( 792 56 -96 ) subway/1_black 352 0 0 0.500000 0.500000 134217728 16777216 0 +( 792 56 -112 ) ( 792 56 -96 ) ( 784 56 -96 ) subway/1_black -1744 0 0 0.500000 0.500000 134217728 16777216 0 +( 788 56 -112 ) ( 788 56 -96 ) ( 788 40 -96 ) subway/light_yellow 368 0 0 0.500000 0.500000 134217728 1 10000 +( 784 40 -112 ) ( 784 40 -96 ) ( 792 40 -96 ) subway/1_black -1744 0 0 0.500000 0.500000 134217728 16777216 0 +( 784 56 -96 ) ( 792 56 -96 ) ( 792 40 -96 ) subway/1_black 71 1048 360 0.500000 0.500000 134217728 16777216 0 +( 792 40 -112 ) ( 792 56 -112 ) ( 784 56 -112 ) subway/1_black -40 1032 360 0.500000 0.500000 134217728 16777216 0 +} +// brush 4158 +{ +( 792 212 -112 ) ( 792 212 -96 ) ( 792 228 -96 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 792 228 -112 ) ( 792 228 -96 ) ( 784 228 -96 ) subway/1_black -1744 0 0 0.500000 0.500000 134217728 16777216 0 +( 788 228 -112 ) ( 788 228 -96 ) ( 788 212 -96 ) subway/light_yellow 24 0 0 0.500000 0.500000 134217728 1 10000 +( 784 212 -112 ) ( 784 212 -96 ) ( 792 212 -96 ) subway/1_black -1744 0 0 0.500000 0.500000 134217728 16777216 0 +( 784 228 -96 ) ( 792 228 -96 ) ( 792 212 -96 ) subway/1_black 71 1392 360 0.500000 0.500000 134217728 16777216 0 +( 792 212 -112 ) ( 792 228 -112 ) ( 784 228 -112 ) subway/1_black -40 1376 360 0.500000 0.500000 134217728 16777216 0 +} +// brush 4159 +{ +( 668 -80 -52 ) ( 644 -80 -52 ) ( 644 -104 -52 ) subway/light_blue 1232 -960 0 0.500000 0.500000 134217728 1 20000 +( 644 -104 -48 ) ( 644 -80 -48 ) ( 668 -80 -48 ) subway/1_black 2784 -480 0 0.500000 0.500000 134217728 16777216 0 +( 648 -96 -44 ) ( 672 -96 -44 ) ( 672 -96 -52 ) subway/1_black 2784 80 0 0.500000 0.500000 134217728 16777216 0 +( 664 -100 -44 ) ( 664 -76 -44 ) ( 664 -76 -52 ) subway/1_black 2064 80 0 0.500000 0.500000 134217728 16777216 0 +( 668 -80 -44 ) ( 644 -80 -44 ) ( 644 -80 -52 ) subway/1_black 2784 80 0 0.500000 0.500000 134217728 16777216 0 +( 648 -80 -44 ) ( 648 -104 -44 ) ( 648 -104 -52 ) subway/1_black 2064 80 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4160 +{ +( -88 136 -112 ) ( -88 136 -96 ) ( -80 136 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -80 280 -112 ) ( -80 280 -96 ) ( -80 288 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -176 296 -104 ) ( -312 296 -104 ) ( -312 296 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -88 160 -96 ) ( -88 160 -112 ) ( -88 280 -112 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -144 344 -96 ) ( -144 280 -96 ) ( -208 280 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -208 280 -112 ) ( -144 280 -112 ) ( -144 344 -112 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4161 +{ +( 136 560 -138 ) ( 128 560 -138 ) ( 128 560 -170 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 128 552 -170 ) ( 128 552 -138 ) ( 136 552 -138 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 128 552 -170 ) ( 136 552 -170 ) ( 136 560 -170 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 136 552 -170 ) ( 136 552 -138 ) ( 136 560 -138 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 136 552 -138 ) ( 128 552 -138 ) ( 128 560 -138 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 128 552 -138 ) ( 128 552 -170 ) ( 128 560 -170 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 248 360 -138 ) ( 128 360 -170 ) ( 128 350 -170 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 128 360 -146 ) ( 248 360 -114 ) ( 248 350 -114 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 4162 +{ +( 136 558 -144 ) ( 16 558 -144 ) ( 16 558 -184 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 16 554 -184 ) ( 16 554 -144 ) ( 136 554 -144 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 136 552 -168 ) ( 136 560 -168 ) ( 16 560 -200 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 128 560 -144 ) ( 128 552 -144 ) ( 128 552 -136 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 16 552 -176 ) ( 16 560 -176 ) ( 136 560 -144 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 24 560 -168 ) ( 24 552 -168 ) ( 24 552 -176 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 4163 +{ +( 16 360 -176 ) ( 136 360 -144 ) ( 136 350 -144 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 136 360 -168 ) ( 16 360 -200 ) ( 16 350 -200 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 16 552 -168 ) ( 16 552 -200 ) ( 16 560 -200 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 24 552 -168 ) ( 16 552 -168 ) ( 16 560 -168 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 24 552 -208 ) ( 24 552 -176 ) ( 24 560 -176 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 16 552 -200 ) ( 24 552 -200 ) ( 24 560 -200 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 16 554 -200 ) ( 16 554 -168 ) ( 24 554 -168 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 24 558 -168 ) ( 16 558 -168 ) ( 16 558 -200 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 4164 +{ +( 16 560 -168 ) ( 16 552 -168 ) ( 16 552 -176 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 16 552 -172 ) ( 16 560 -172 ) ( 136 560 -140 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 136 560 -144 ) ( 136 552 -144 ) ( 136 552 -136 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 136 552 -144 ) ( 136 560 -144 ) ( 16 560 -176 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 16 552 -184 ) ( 16 552 -144 ) ( 136 552 -144 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 136 560 -148 ) ( 16 560 -148 ) ( 16 560 -188 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 4165 +{ +( 128 512 -146 ) ( 248 512 -114 ) ( 248 502 -114 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 248 512 -138 ) ( 128 512 -170 ) ( 128 502 -170 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 128 704 -138 ) ( 128 704 -170 ) ( 128 712 -170 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 136 704 -138 ) ( 128 704 -138 ) ( 128 712 -138 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 136 704 -170 ) ( 136 704 -138 ) ( 136 712 -138 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 128 704 -170 ) ( 136 704 -170 ) ( 136 712 -170 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 128 704 -170 ) ( 128 704 -138 ) ( 136 704 -138 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 136 712 -138 ) ( 128 712 -138 ) ( 128 712 -170 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 4166 +{ +( 24 712 -168 ) ( 24 704 -168 ) ( 24 704 -176 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 16 704 -176 ) ( 16 712 -176 ) ( 136 712 -144 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 128 712 -144 ) ( 128 704 -144 ) ( 128 704 -136 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 136 704 -168 ) ( 136 712 -168 ) ( 16 712 -200 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 16 706 -184 ) ( 16 706 -144 ) ( 136 706 -144 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +( 136 710 -144 ) ( 16 710 -144 ) ( 16 710 -184 ) subway/bars2 0 0 0 0.500000 0.500000 134217728 16779264 0 +} +// brush 4167 +{ +( 24 710 -168 ) ( 16 710 -168 ) ( 16 710 -200 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 16 706 -200 ) ( 16 706 -168 ) ( 24 706 -168 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 16 704 -200 ) ( 24 704 -200 ) ( 24 712 -200 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 24 704 -208 ) ( 24 704 -176 ) ( 24 712 -176 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 24 704 -168 ) ( 16 704 -168 ) ( 16 712 -168 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 16 704 -168 ) ( 16 704 -200 ) ( 16 712 -200 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 136 512 -168 ) ( 16 512 -200 ) ( 16 502 -200 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 16 512 -176 ) ( 136 512 -144 ) ( 136 502 -144 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 4168 +{ +( 136 712 -144 ) ( 16 712 -144 ) ( 16 712 -184 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 16 704 -188 ) ( 16 704 -148 ) ( 136 704 -148 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 136 704 -144 ) ( 136 712 -144 ) ( 16 712 -176 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 136 712 -144 ) ( 136 704 -144 ) ( 136 704 -136 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 16 704 -172 ) ( 16 712 -172 ) ( 136 712 -140 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( 16 712 -168 ) ( 16 704 -168 ) ( 16 704 -176 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 4169 +{ +( 240 520 -184 ) ( 176 520 -184 ) ( 176 456 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 176 456 -152 ) ( 176 520 -152 ) ( 240 520 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -152 512 -184 ) ( -152 512 -152 ) ( -152 544 -152 ) subway/1_lobby1ac 0 0 0 0.500000 0.500000 0 285212672 0 +( -152 520 -152 ) ( -152 520 -184 ) ( -184 520 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -184 496 -152 ) ( -184 496 -136 ) ( -184 488 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 392 552 -184 ) ( 392 552 -152 ) ( 136 552 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4170 +{ +( 336 818 -52 ) ( 336 890 -52 ) ( 296 890 -52 ) subway/light_tube 76 0 90 0.500000 0.500000 134217728 1 5000 +( 296 890 -48 ) ( 336 890 -48 ) ( 336 818 -48 ) subway/1_black 0 4 0 0.500000 0.500000 134217728 16777216 0 +( 304 890 -48 ) ( 304 818 -48 ) ( 304 818 -56 ) subway/1_black -4 0 0 0.500000 0.500000 134217728 16777216 0 +( 296 858 -48 ) ( 336 858 -48 ) ( 336 858 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 320 818 -48 ) ( 320 890 -48 ) ( 320 890 -56 ) subway/1_black -4 0 0 0.500000 0.500000 134217728 16777216 0 +( 336 902 -48 ) ( 296 902 -48 ) ( 296 902 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4171 +{ +( 488 196 -96 ) ( 488 236 -96 ) ( 488 236 -104 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 412 212 -96 ) ( 484 212 -96 ) ( 484 212 -104 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 444 236 -96 ) ( 444 196 -96 ) ( 444 196 -104 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 476 228 -96 ) ( 404 228 -96 ) ( 404 228 -104 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 484 236 -96 ) ( 484 196 -96 ) ( 412 196 -96 ) subway/1_black 8 8 0 0.500000 0.500000 134217728 16777216 0 +( 404 196 -100 ) ( 476 196 -100 ) ( 476 236 -100 ) subway/light_tube 8 8 0 0.500000 0.500000 134217728 1 5000 +} +// brush 4172 +{ +( 700 312 -112 ) ( 700 312 -96 ) ( 684 312 -96 ) subway/1_black -936 0 0 0.500000 0.500000 134217728 16777216 0 +( 684 312 -112 ) ( 684 312 -96 ) ( 684 304 -96 ) subway/1_black -784 0 0 0.500000 0.500000 134217728 16777216 0 +( 684 308 -112 ) ( 684 308 -96 ) ( 700 308 -96 ) subway/light_yellow -920 0 0 0.500000 0.500000 134217728 1 10000 +( 700 304 -112 ) ( 700 304 -96 ) ( 700 312 -96 ) subway/1_black -784 0 0 0.500000 0.500000 134217728 16777216 0 +( 684 304 -96 ) ( 684 312 -96 ) ( 700 312 -96 ) subway/1_black 239 1544 270 0.500000 0.500000 134217728 16777216 0 +( 700 312 -112 ) ( 684 312 -112 ) ( 684 304 -112 ) subway/1_black 159 1544 270 0.500000 0.500000 134217728 16777216 0 +} +// brush 4173 +{ +( 12 120 -96 ) ( 28 120 -96 ) ( 28 120 -112 ) subway/1_black 408 0 0 0.500000 0.500000 134217728 16777216 0 +( 12 128 -96 ) ( 12 120 -96 ) ( 12 120 -112 ) subway/1_black -400 0 0 0.500000 0.500000 134217728 16777216 0 +( 28 124 -96 ) ( 12 124 -96 ) ( 12 124 -112 ) subway/light_yellow 424 0 0 0.500000 0.500000 134217728 1 15000 +( 28 120 -96 ) ( 28 128 -96 ) ( 28 128 -112 ) subway/1_black -400 0 0 0.500000 0.500000 134217728 16777216 0 +( 28 120 -96 ) ( 12 120 -96 ) ( 12 128 -96 ) subway/1_black -144 200 270 0.500000 0.500000 134217728 16777216 0 +( 12 128 -112 ) ( 12 120 -112 ) ( 28 120 -112 ) subway/1_black -224 199 270 0.500000 0.500000 134217728 16777216 0 +} +// brush 4174 +{ +( -80 232 -96 ) ( -80 216 -96 ) ( -80 216 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -72 232 -96 ) ( -80 232 -96 ) ( -80 232 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -76 216 -96 ) ( -76 232 -96 ) ( -76 232 -112 ) subway/light_yellow 16 0 0 0.500000 0.500000 134217728 1 15000 +( -80 216 -96 ) ( -72 216 -96 ) ( -72 216 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -80 216 -96 ) ( -80 232 -96 ) ( -72 232 -96 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -72 232 -112 ) ( -80 232 -112 ) ( -80 216 -112 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4175 +{ +( 608 56 -112 ) ( 600 56 -112 ) ( 600 40 -112 ) subway/1_black 327 1032 360 0.500000 0.500000 134217728 16777216 0 +( 600 40 -96 ) ( 600 56 -96 ) ( 608 56 -96 ) subway/1_black 439 1048 360 0.500000 0.500000 134217728 16777216 0 +( 600 40 -96 ) ( 608 40 -96 ) ( 608 40 -112 ) subway/1_black -1376 0 0 0.500000 0.500000 134217728 16777216 0 +( 604 40 -96 ) ( 604 56 -96 ) ( 604 56 -112 ) subway/light_yellow 368 0 0 0.500000 0.500000 134217728 1 10000 +( 608 56 -96 ) ( 600 56 -96 ) ( 600 56 -112 ) subway/1_black -1376 0 0 0.500000 0.500000 134217728 16777216 0 +( 600 56 -96 ) ( 600 40 -96 ) ( 600 40 -112 ) subway/1_black 352 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4176 +{ +( 40 336 -216 ) ( 104 336 -216 ) ( 104 400 -216 ) subway/metal2 64 -1216 0 0.500000 0.500000 0 16777216 0 +( 16 704 -200 ) ( 16 712 -200 ) ( 136 712 -168 ) subway/metal2 64 -1216 0 0.500000 0.500000 0 16777216 0 +( 16 712 -200 ) ( 16 704 -200 ) ( 16 704 -216 ) subway/metal2 1216 0 0 0.500000 0.500000 0 16777216 0 +( 320 712 -184 ) ( 320 712 -176 ) ( 256 712 -176 ) subway/metal2 64 0 0 0.500000 0.500000 0 16777216 0 +( 136 -40 -176 ) ( 136 -40 -168 ) ( 136 24 -168 ) subway/metal2 1216 0 0 0.500000 0.500000 0 16777216 0 +( 40 704 -208 ) ( 40 704 -200 ) ( 104 704 -200 ) subway/metal2 64 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 4177 +{ +( -368 716 0 ) ( -378 704 0 ) ( -378 704 10 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -408 744 -128 ) ( -408 704 -128 ) ( -408 704 -160 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -368 744 -128 ) ( -408 744 -128 ) ( -408 744 -160 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -368 704 -128 ) ( -368 744 -128 ) ( -368 744 -160 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -408 704 -128 ) ( -368 704 -128 ) ( -368 704 -160 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -408 704 -158 ) ( -408 744 -158 ) ( -368 744 -158 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -368 744 -160 ) ( -408 744 -160 ) ( -408 704 -160 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4178 +{ +( -408 368 -160 ) ( -408 328 -160 ) ( -368 328 -160 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -368 328 -158 ) ( -408 328 -158 ) ( -408 368 -158 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -368 368 -160 ) ( -368 368 -128 ) ( -408 368 -128 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -368 328 -160 ) ( -368 328 -128 ) ( -368 368 -128 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -408 328 -160 ) ( -408 328 -128 ) ( -368 328 -128 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -408 368 -160 ) ( -408 368 -128 ) ( -408 328 -128 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -378 368 10 ) ( -378 368 0 ) ( -368 356 0 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4179 +{ +( 136 336 -184 ) ( 200 336 -184 ) ( 200 400 -184 ) subway/1_concrete_floor -432 640 0 0.500000 0.500000 0 285212672 0 +( 200 416 -176 ) ( 200 352 -176 ) ( 136 352 -176 ) subway/1_stair_top1 -610 -1364 90 0.500000 0.500000 0 285212672 0 +( 112 552 -192 ) ( 112 552 -184 ) ( 112 488 -184 ) subway/1_stair_side1 1216 0 0 0.500000 0.500000 0 285212672 0 +( 320 704 -192 ) ( 320 704 -184 ) ( 256 704 -184 ) subway/1_concrete_floor -3856 -336 0 0.500000 0.500000 0 285212672 0 +( 136 -40 -184 ) ( 136 -40 -176 ) ( 136 24 -176 ) subway/1_stair_side1 2784 -336 0 0.500000 0.500000 0 285212672 0 +( 136 560 -184 ) ( 136 560 -176 ) ( 200 560 -176 ) subway/1_concrete_floor -3856 -336 0 0.500000 0.500000 0 285212672 0 +} +// brush 4180 +{ +( 112 336 -192 ) ( 176 336 -192 ) ( 176 400 -192 ) subway/1_concrete_floor -480 640 0 0.500000 0.500000 0 285212672 0 +( 176 416 -184 ) ( 176 352 -184 ) ( 112 352 -184 ) subway/1_stair_top1 -610 -1316 90 0.500000 0.500000 0 285212672 0 +( 88 552 -200 ) ( 88 552 -192 ) ( 88 488 -192 ) subway/1_stair_side1 1216 -16 0 0.500000 0.500000 0 285212672 0 +( 296 704 -200 ) ( 296 704 -192 ) ( 232 704 -192 ) subway/1_concrete_floor -3904 -352 0 0.500000 0.500000 0 285212672 0 +( 112 -40 -192 ) ( 112 -40 -184 ) ( 112 24 -184 ) subway/1_stair_side1 2784 -352 0 0.500000 0.500000 0 285212672 0 +( 112 560 -192 ) ( 112 560 -184 ) ( 176 560 -184 ) subway/1_concrete_floor -3904 -352 0 0.500000 0.500000 0 285212672 0 +} +// brush 4181 +{ +( 88 336 -200 ) ( 152 336 -200 ) ( 152 400 -200 ) subway/1_concrete_floor -528 640 0 0.500000 0.500000 0 285212672 0 +( 152 416 -192 ) ( 152 352 -192 ) ( 88 352 -192 ) subway/1_stair_top1 -610 -1340 90 0.500000 0.500000 0 285212672 0 +( 64 552 -208 ) ( 64 552 -200 ) ( 64 488 -200 ) subway/1_stair_side1 1216 -32 0 0.500000 0.500000 0 285212672 0 +( 272 704 -208 ) ( 272 704 -200 ) ( 208 704 -200 ) subway/1_concrete_floor -3952 -368 0 0.500000 0.500000 0 285212672 0 +( 88 -40 -200 ) ( 88 -40 -192 ) ( 88 24 -192 ) subway/1_stair_side1 2784 -368 0 0.500000 0.500000 0 285212672 0 +( 88 560 -200 ) ( 88 560 -192 ) ( 152 560 -192 ) subway/1_concrete_floor -3952 -368 0 0.500000 0.500000 0 285212672 0 +} +// brush 4182 +{ +( 64 336 -208 ) ( 128 336 -208 ) ( 128 400 -208 ) subway/1_concrete_floor -576 640 0 0.500000 0.500000 0 285212672 0 +( 128 416 -200 ) ( 128 352 -200 ) ( 64 352 -200 ) subway/1_stair_top1 -610 -1348 90 0.500000 0.500000 0 285212672 0 +( 40 552 -216 ) ( 40 552 -208 ) ( 40 488 -208 ) subway/1_stair_side1 1216 -48 0 0.500000 0.500000 0 285212672 0 +( 248 704 -216 ) ( 248 704 -208 ) ( 184 704 -208 ) subway/1_concrete_floor -4000 -384 0 0.500000 0.500000 0 285212672 0 +( 64 -40 -208 ) ( 64 -40 -200 ) ( 64 24 -200 ) subway/1_stair_side1 2784 -384 0 0.500000 0.500000 0 285212672 0 +( 64 560 -208 ) ( 64 560 -200 ) ( 128 560 -200 ) subway/1_concrete_floor -4000 -384 0 0.500000 0.500000 0 285212672 0 +} +// brush 4183 +{ +( 40 184 -216 ) ( 104 184 -216 ) ( 104 248 -216 ) subway/metal2 64 -1216 0 0.500000 0.500000 0 16777216 0 +( 16 552 -200 ) ( 16 560 -200 ) ( 136 560 -168 ) subway/metal2 64 -1216 0 0.500000 0.500000 0 16777216 0 +( 16 560 -200 ) ( 16 552 -200 ) ( 16 552 -216 ) subway/metal2 1216 0 0 0.500000 0.500000 0 16777216 0 +( 320 560 -184 ) ( 320 560 -176 ) ( 256 560 -176 ) subway/metal2 64 0 0 0.500000 0.500000 0 16777216 0 +( 136 -192 -176 ) ( 136 -192 -168 ) ( 136 -128 -168 ) subway/metal2 1216 0 0 0.500000 0.500000 0 16777216 0 +( 40 552 -208 ) ( 40 552 -200 ) ( 104 552 -200 ) subway/metal2 64 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 4184 +{ +( 40 560 -216 ) ( 40 560 -208 ) ( 104 560 -208 ) subway/1_concrete_floor -4048 -400 0 0.500000 0.500000 0 285212672 0 +( 40 -40 -216 ) ( 40 -40 -208 ) ( 40 24 -208 ) subway/1_stair_side1 2784 -400 0 0.500000 0.500000 0 285212672 0 +( 224 704 -224 ) ( 224 704 -216 ) ( 160 704 -216 ) subway/1_concrete_floor -4048 -400 0 0.500000 0.500000 0 285212672 0 +( 16 552 -224 ) ( 16 552 -216 ) ( 16 488 -216 ) subway/1_stair_side1 1216 -64 0 0.500000 0.500000 0 285212672 0 +( 104 416 -208 ) ( 104 352 -208 ) ( 40 352 -208 ) subway/1_stair_top1 -610 -1300 90 0.500000 0.500000 0 285212672 0 +( 40 336 -216 ) ( 104 336 -216 ) ( 104 400 -216 ) subway/1_concrete_floor -624 640 0 0.500000 0.500000 0 285212672 0 +} +// brush 4185 +{ +( -292 608 -120 ) ( -292 592 -120 ) ( -292 592 -136 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -276 608 -120 ) ( -292 608 -120 ) ( -292 608 -136 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( -276 592 -120 ) ( -276 608 -120 ) ( -276 608 -136 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -292 592 -120 ) ( -276 592 -120 ) ( -276 592 -136 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( -292 592 -120 ) ( -292 608 -120 ) ( -276 608 -120 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( -276 608 -124 ) ( -292 608 -124 ) ( -292 592 -124 ) subway/light_yellow 8 32 0 0.500000 0.500000 134217728 1 12000 +} +// brush 4186 +{ +( -276 480 -124 ) ( -292 480 -124 ) ( -292 464 -124 ) subway/light_yellow 8 -224 0 0.500000 0.500000 134217728 1 12000 +( -292 464 -120 ) ( -292 480 -120 ) ( -276 480 -120 ) subway/1_black -8 -256 0 0.500000 0.500000 134217728 16777216 0 +( -292 464 -120 ) ( -276 464 -120 ) ( -276 464 -136 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( -276 464 -120 ) ( -276 480 -120 ) ( -276 480 -136 ) subway/1_black 256 0 0 0.500000 0.500000 134217728 16777216 0 +( -276 480 -120 ) ( -292 480 -120 ) ( -292 480 -136 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( -292 480 -120 ) ( -292 464 -120 ) ( -292 464 -136 ) subway/1_black 256 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4187 +{ +( -160 432 -48 ) ( -160 432 -72 ) ( -184 432 -72 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -184 448 -72 ) ( -160 448 -72 ) ( -160 448 -48 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -168 448 -48 ) ( -168 432 -48 ) ( -184 432 -48 ) subway/1_black 0 16 0 0.500000 0.500000 134217728 16777216 0 +( -184 432 -64 ) ( -184 448 -64 ) ( -184 448 -48 ) subway/1_black -16 0 0 0.500000 0.500000 134217728 16777216 0 +( -168 432 -48 ) ( -168 448 -48 ) ( -184 448 -64 ) subway/light_square 16 32 0 0.500000 0.500000 0 16777217 12000 +} +// brush 4188 +{ +( -168 624 -48 ) ( -168 640 -48 ) ( -184 640 -64 ) subway/light_square 16 32 0 0.500000 0.500000 134217728 16777217 12000 +( -184 624 -64 ) ( -184 640 -64 ) ( -184 640 -48 ) subway/1_black -400 0 0 0.500000 0.500000 134217728 16777216 0 +( -168 640 -48 ) ( -168 624 -48 ) ( -184 624 -48 ) subway/1_black 0 400 0 0.500000 0.500000 134217728 16777216 0 +( -184 640 -72 ) ( -160 640 -72 ) ( -160 640 -48 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -160 624 -48 ) ( -160 624 -72 ) ( -184 624 -72 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4189 +{ +( 136 456 -192 ) ( 104 456 -192 ) ( 104 360 -192 ) subway/1_black 0 -16 0 0.500000 0.500000 0 16777216 0 +( 104 360 -128 ) ( 104 456 -128 ) ( 136 456 -128 ) subway/1_black 0 -16 0 0.500000 0.500000 0 16777216 0 +( 104 360 -136 ) ( 136 360 -136 ) ( 136 360 -184 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 136 360 -136 ) ( 136 456 -136 ) ( 136 456 -184 ) subway/1_map -24 0 0 -1 1 0 637534209 10000 +( 136 488 -136 ) ( 104 488 -136 ) ( 104 488 -184 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 132 456 -136 ) ( 132 360 -136 ) ( 132 360 -184 ) subway/1_map -24 0 0 -1 1 0 637534208 10000 +} +// brush 4190 +{ +( 128 1544 -128 ) ( 64 1544 -128 ) ( 64 1520 -128 ) subway/1_poster3 0 0 0 0.500000 0.500000 134217728 0 0 +( 64 1520 -96 ) ( 64 1544 -96 ) ( 128 1544 -96 ) subway/1_poster3 0 0 0 0.500000 0.500000 134217728 0 0 +( 64 1542 -80 ) ( 128 1542 -80 ) ( 128 1542 -152 ) subway/1_poster1 32 0 0 0.500000 0.500000 0 536870912 30000 +( 112 1520 -80 ) ( 112 1544 -80 ) ( 112 1544 -152 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 200 1544 -80 ) ( 136 1544 -80 ) ( 136 1544 -152 ) subway/1_poster3 0 0 0 0.500000 0.500000 134217728 0 0 +( 80 1544 -80 ) ( 80 1520 -80 ) ( 80 1520 -152 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4191 +{ +( 80 1544 -116 ) ( 80 1520 -116 ) ( 80 1520 -188 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 200 1544 -116 ) ( 136 1544 -116 ) ( 136 1544 -188 ) subway/1_poster_top 0 0 0 0.500000 0.500000 134217728 0 0 +( 112 1520 -116 ) ( 112 1544 -116 ) ( 112 1544 -188 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 64 1542 -108 ) ( 128 1542 -108 ) ( 128 1542 -180 ) subway/1_poster_top 32 8 0 0.500000 0.500000 134217728 0 1500 +( 64 1520 -128 ) ( 64 1544 -128 ) ( 128 1544 -128 ) subway/1_poster_top 0 0 0 0.500000 0.500000 134217728 0 0 +( 128 1544 -132 ) ( 64 1544 -132 ) ( 64 1520 -132 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4192 +{ +( 128 1544 -96 ) ( 64 1544 -96 ) ( 64 1520 -96 ) subway/1_poster_top 0 0 0 0.500000 0.500000 134217728 0 0 +( 64 1520 -92 ) ( 64 1544 -92 ) ( 128 1544 -92 ) subway/1_poster_top 0 0 0 0.500000 0.500000 134217728 0 0 +( 64 1542 -76 ) ( 128 1542 -76 ) ( 128 1542 -148 ) subway/1_poster_top 32 8 0 0.500000 0.500000 134217728 0 1500 +( 112 1520 -76 ) ( 112 1544 -76 ) ( 112 1544 -148 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 200 1544 -76 ) ( 136 1544 -76 ) ( 136 1544 -148 ) subway/1_poster_top 0 0 0 0.500000 0.500000 134217728 0 0 +( 80 1544 -76 ) ( 80 1520 -76 ) ( 80 1520 -148 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4193 +{ +( -32 1544 -76 ) ( -32 1520 -76 ) ( -32 1520 -148 ) subway/1_black 416 -104 0 0.500000 0.500000 134217728 16777216 0 +( 16 1544 -76 ) ( -48 1544 -76 ) ( -48 1544 -148 ) subway/1_poster_top 0 0 0 0.500000 0.500000 134217728 0 0 +( 0 1520 -76 ) ( 0 1544 -76 ) ( 0 1544 -148 ) subway/1_black 416 -104 0 0.500000 0.500000 134217728 16777216 0 +( -48 1542 -72 ) ( 16 1542 -72 ) ( 16 1542 -144 ) subway/1_poster_top 0 8 0 0.500000 0.500000 134217728 0 1500 +( -48 1520 -92 ) ( -48 1544 -92 ) ( 16 1544 -92 ) subway/1_poster_top 0 0 0 0.500000 0.500000 134217728 0 0 +( 16 1544 -96 ) ( -48 1544 -96 ) ( -48 1520 -96 ) subway/1_poster_top 0 0 0 0.500000 0.500000 134217728 0 0 +} +// brush 4194 +{ +( 16 1544 -132 ) ( -48 1544 -132 ) ( -48 1520 -132 ) subway/1_black 416 -104 0 0.500000 0.500000 134217728 16777216 0 +( -48 1520 -128 ) ( -48 1544 -128 ) ( 16 1544 -128 ) subway/1_poster_top 0 0 0 0.500000 0.500000 134217728 0 0 +( -48 1542 -108 ) ( 16 1542 -108 ) ( 16 1542 -180 ) subway/1_poster_top 0 8 0 0.500000 0.500000 134217728 0 1500 +( 0 1520 -116 ) ( 0 1544 -116 ) ( 0 1544 -188 ) subway/1_black 416 -104 0 0.500000 0.500000 134217728 16777216 0 +( 16 1544 -116 ) ( -48 1544 -116 ) ( -48 1544 -188 ) subway/1_poster_top 0 0 0 0.500000 0.500000 134217728 0 0 +( -32 1544 -116 ) ( -32 1520 -116 ) ( -32 1520 -188 ) subway/1_black 416 -104 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4195 +{ +( -32 1544 -80 ) ( -32 1520 -80 ) ( -32 1520 -152 ) subway/1_black 416 -104 0 0.500000 0.500000 134217728 16777216 0 +( 16 1544 -80 ) ( -48 1544 -80 ) ( -48 1544 -152 ) subway/1_poster3 0 0 0 0.500000 0.500000 134217728 0 0 +( 0 1520 -80 ) ( 0 1544 -80 ) ( 0 1544 -152 ) subway/1_black 416 -104 0 0.500000 0.500000 134217728 16777216 0 +( -48 1542 -80 ) ( 16 1542 -80 ) ( 16 1542 -152 ) subway/1_poster2 0 0 0 0.500000 0.500000 0 0 0 +( -48 1520 -96 ) ( -48 1544 -96 ) ( 16 1544 -96 ) subway/1_poster3 0 0 0 0.500000 0.500000 134217728 0 0 +( 16 1544 -128 ) ( -48 1544 -128 ) ( -48 1520 -128 ) subway/1_poster3 0 0 0 0.500000 0.500000 134217728 0 0 +} +// brush 4196 +{ +( -240 1392 -92 ) ( -240 1376 -92 ) ( -240 1376 -180 ) subway/sign8 0 -56 0 0.500000 0.500000 134217728 0 0 +( -168 1384 -92 ) ( -240 1384 -92 ) ( -240 1384 -180 ) subway/sign8 0 -56 0 0.500000 0.500000 134217728 0 0 +( -176 1372 -92 ) ( -176 1388 -92 ) ( -176 1388 -180 ) subway/sign8 0 -56 0 0.500000 0.500000 134217728 0 0 +( -240 1382 -92 ) ( -168 1382 -92 ) ( -168 1382 -180 ) subway/sign8 96 -56 0 0.500000 0.500000 134217728 0 0 +( -240 1376 -92 ) ( -240 1392 -92 ) ( -168 1392 -92 ) subway/sign8 0 0 0 0.500000 0.500000 134217728 0 0 +( -172 1392 -124 ) ( -244 1392 -124 ) ( -244 1376 -124 ) subway/sign8 0 0 0 0.500000 0.500000 134217728 0 0 +} +// brush 4197 +{ +( 880 -566 -136 ) ( 824 -566 -136 ) ( 824 -566 -208 ) subway/1_soda_front_a 74 -2 0 -0.700000 0.700000 0 654311425 900 +( 870 -624 -136 ) ( 870 -552 -136 ) ( 870 -552 -208 ) subway/1_soda_side_a -1 -1 0 0.700000 0.700000 0 0 0 +( 816 -600 -112 ) ( 872 -600 -112 ) ( 872 -600 -184 ) subway/1_soda_front_a 38 -1 0 0.700000 0.700000 0 1 800 +( 824 -552 -136 ) ( 824 -624 -136 ) ( 824 -624 -208 ) subway/1_soda_side_a -33 -1 0 -0.700000 0.700000 0 0 0 +( 824 -552 -136 ) ( 880 -552 -136 ) ( 880 -624 -136 ) subway/1_soda_top -27 -34 0 0.700000 0.700000 0 0 0 +( 880 -624 -180 ) ( 880 -552 -180 ) ( 824 -552 -180 ) subway/1_soda_front_a -56 -16 0 0.700000 0.700000 0 0 0 +} +// brush 4198 +{ +( 880 -624 -200 ) ( 880 -552 -200 ) ( 824 -552 -200 ) subway/1_soda_front_b -32 -4 0 0.700000 0.700000 0 0 0 +( 826 -552 -180 ) ( 882 -552 -180 ) ( 882 -624 -180 ) subway/1_soda_front_b -32 -4 0 0.700000 0.700000 0 0 0 +( 824 -556 -170 ) ( 824 -628 -170 ) ( 824 -628 -242 ) subway/1_soda_side_b -33 -1 0 -0.700000 0.700000 0 16777216 0 +( 816 -600 -144 ) ( 872 -600 -144 ) ( 872 -600 -216 ) subway/1_soda_front_b 38 0 0 0.700000 0.700000 0 1 800 +( 870 -624 -172 ) ( 870 -552 -172 ) ( 870 -552 -244 ) subway/1_soda_side_b -1 -1 0 0.700000 0.700000 0 16777216 0 +( 882 -566 -170 ) ( 826 -566 -170 ) ( 826 -566 -242 ) subway/1_soda_front_b 10 -1 0 -0.700000 0.700000 0 654311425 900 +} +// brush 4199 +{ +( 600 -128 0 ) ( 616 -160 0 ) ( 616 -160 10 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 584 -128 0 ) ( 616 -144 0 ) ( 616 -144 10 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 624 -240 0 ) ( 592 -304 0 ) ( 592 -304 10 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 632 -264 0 ) ( 584 -288 0 ) ( 584 -288 10 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 832 -424 -224 ) ( 768 -424 -224 ) ( 768 -488 -224 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 768 -488 -216 ) ( 768 -424 -216 ) ( 832 -424 -216 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 632 -288 -192 ) ( 624 -288 -192 ) ( 624 -288 -160 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 616 -920 -192 ) ( 616 -920 -224 ) ( 616 -1064 -224 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 736 -128 -192 ) ( 736 -128 -224 ) ( 744 -128 -224 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +( 584 -256 -224 ) ( 584 -256 -192 ) ( 584 -640 -192 ) subway/3_street 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4200 +{ +( 1008 -304 -224 ) ( 1008 -304 -216 ) ( 944 -304 -216 ) subway/1_lobby_floor 432 16 0 0.500000 0.500000 0 285212672 0 +( 584 496 -224 ) ( 584 496 -216 ) ( 584 432 -216 ) subway/1_lobby_floor 752 16 0 0.500000 0.500000 0 285212672 0 +( 792 -600 -224 ) ( 792 -600 -216 ) ( 856 -600 -216 ) subway/1_lobby_floor 432 16 0 0.500000 0.500000 0 285212672 0 +( 872 -40 -232 ) ( 872 -40 -224 ) ( 872 24 -224 ) subway/1_lobby_floor 752 16 0 0.500000 0.500000 0 285212672 0 +( 904 112 -216 ) ( 904 176 -216 ) ( 968 176 -216 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 968 192 -224 ) ( 904 192 -224 ) ( 904 128 -224 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +} +// brush 4201 +{ +( 1008 8 -224 ) ( 1008 8 -216 ) ( 944 8 -216 ) subway/1_lobby_floor 432 16 0 0.500000 0.500000 0 285212672 0 +( 584 800 -224 ) ( 584 800 -216 ) ( 584 736 -216 ) subway/1_lobby_floor 752 16 0 0.500000 0.500000 0 285212672 0 +( 792 -120 -224 ) ( 792 -120 -216 ) ( 856 -120 -216 ) subway/1_lobby_floor 432 16 0 0.500000 0.500000 0 285212672 0 +( 872 256 -232 ) ( 872 256 -224 ) ( 872 320 -224 ) subway/1_lobby_floor 752 16 0 0.500000 0.500000 0 285212672 0 +( 904 416 -216 ) ( 904 480 -216 ) ( 968 480 -216 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 968 496 -224 ) ( 904 496 -224 ) ( 904 432 -224 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +} +// brush 4202 +{ +( 584 -256 -120 ) ( 584 -256 -88 ) ( 584 -640 -88 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 736 -128 -88 ) ( 736 -128 -120 ) ( 744 -128 -120 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 616 -920 -88 ) ( 616 -920 -120 ) ( 616 -1064 -120 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 632 -288 -88 ) ( 624 -288 -88 ) ( 624 -288 -56 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 768 -488 -112 ) ( 768 -424 -112 ) ( 832 -424 -112 ) subway/1_concrete_floor -16 0 0 0.500000 0.500000 0 285212672 0 +( 832 -424 -120 ) ( 768 -424 -120 ) ( 768 -488 -120 ) subway/1_concrete_floor -16 0 0 0.500000 0.500000 0 285212672 0 +( 632 -264 104 ) ( 584 -288 104 ) ( 584 -288 114 ) subway/1_concrete_floor -16 0 0 0.500000 0.500000 0 285212672 0 +( 624 -240 104 ) ( 592 -304 104 ) ( 592 -304 114 ) subway/1_concrete_floor -16 0 0 0.500000 0.500000 0 285212672 0 +( 584 -128 104 ) ( 616 -144 104 ) ( 616 -144 114 ) subway/1_concrete_floor -16 0 0 0.500000 0.500000 0 285212672 0 +( 600 -128 104 ) ( 616 -160 104 ) ( 616 -160 114 ) subway/1_concrete_floor -16 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4203 +{ +( 672 -432 -216 ) ( 608 -432 -216 ) ( 608 -496 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 608 -496 -184 ) ( 608 -432 -184 ) ( 672 -432 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 416 -328 -216 ) ( 416 -328 -184 ) ( 584 -328 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -904 -184 ) ( 584 -904 -216 ) ( 584 -1048 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 560 -320 -184 ) ( 560 -320 -216 ) ( 568 -320 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 400 -328 -184 ) ( 400 -328 -216 ) ( 400 -320 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4204 +{ +( 672 -432 -152 ) ( 608 -432 -152 ) ( 608 -496 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 608 -496 -120 ) ( 608 -432 -120 ) ( 672 -432 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 416 -328 -152 ) ( 416 -328 -120 ) ( 584 -328 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -904 -120 ) ( 584 -904 -152 ) ( 584 -1048 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 560 -320 -120 ) ( 560 -320 -152 ) ( 568 -320 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 400 -328 -120 ) ( 400 -328 -152 ) ( 400 -320 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4205 +{ +( 400 -328 -152 ) ( 400 -328 -184 ) ( 400 -320 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 560 -320 -152 ) ( 560 -320 -184 ) ( 568 -320 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -904 -152 ) ( 584 -904 -184 ) ( 584 -1048 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 416 -328 -184 ) ( 416 -328 -152 ) ( 584 -328 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 608 -496 -152 ) ( 608 -432 -152 ) ( 672 -432 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 672 -432 -184 ) ( 608 -432 -184 ) ( 608 -496 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4206 +{ +( 584 -328 -136 ) ( 664 -288 -136 ) ( 664 -248 -136 ) subway/1_lobby3 256 0 0 0.500000 0.500000 0 285212672 0 +( 584 -288 -120 ) ( 664 -248 -120 ) ( 664 -288 -120 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 0 +( 584 -328 -112 ) ( 664 -288 -112 ) ( 664 -288 -144 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 19 +( 664 -256 -152 ) ( 664 -280 -152 ) ( 664 -280 -104 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -288 -152 ) ( 664 -248 -152 ) ( 664 -248 -120 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 26 +( 584 -80 -120 ) ( 584 -16 -120 ) ( 584 -16 -104 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 552 -224 18 ) ( 552 -224 8 ) ( 656 -328 8 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4207 +{ +( 656 -328 8 ) ( 552 -224 8 ) ( 552 -224 18 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 344 -256 -104 ) ( 344 -256 -120 ) ( 408 -256 -120 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 0 +( 576 -336 -120 ) ( 576 -336 -152 ) ( 616 -256 -152 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 26 +( 608 -336 -104 ) ( 608 -336 -152 ) ( 584 -336 -152 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 0 +( 616 -336 -152 ) ( 616 -336 -120 ) ( 656 -256 -120 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 19 +( 616 -336 -120 ) ( 576 -336 -120 ) ( 616 -256 -120 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 0 +( 576 -336 -136 ) ( 616 -336 -136 ) ( 656 -256 -136 ) subway/1_lobby3 257 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4208 +{ +( 688 -40 -136 ) ( 688 -104 -136 ) ( 752 -104 -136 ) subway/1_lobby3 256 0 0 0.500000 0.500000 0 285212672 0 +( 752 -104 -120 ) ( 688 -104 -120 ) ( 688 -40 -120 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 0 +( 656 -232 -104 ) ( 656 -168 -104 ) ( 656 -168 -152 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 19 +( 624 -160 -152 ) ( 648 -160 -152 ) ( 648 -160 -104 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 0 +( 616 -88 -104 ) ( 616 -96 -104 ) ( 616 -96 -120 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 26 +( 416 -256 -120 ) ( 352 -256 -120 ) ( 352 -256 -104 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4209 +{ +( 656 -160 -136 ) ( 616 -80 -136 ) ( 576 -80 -136 ) subway/1_lobby3 259 4 0 0.500000 0.500000 0 285212672 0 +( 616 -160 -120 ) ( 576 -80 -120 ) ( 616 -80 -120 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 0 +( 656 -160 -120 ) ( 616 -80 -120 ) ( 616 -80 -152 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 19 +( 584 -80 -152 ) ( 608 -80 -152 ) ( 608 -80 -104 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 0 +( 616 -160 -152 ) ( 576 -80 -152 ) ( 576 -80 -120 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 26 +( 408 -160 -120 ) ( 344 -160 -120 ) ( 344 -160 -104 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 0 +( 552 -192 18 ) ( 552 -192 8 ) ( 656 -88 8 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4210 +{ +( 656 -88 8 ) ( 552 -192 8 ) ( 552 -192 18 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 584 -400 -104 ) ( 584 -400 -120 ) ( 584 -336 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 664 -168 -120 ) ( 664 -168 -152 ) ( 584 -128 -152 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 26 +( 664 -136 -104 ) ( 664 -136 -152 ) ( 664 -160 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 664 -128 -152 ) ( 664 -128 -120 ) ( 584 -88 -120 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 19 +( 664 -128 -120 ) ( 664 -168 -120 ) ( 584 -128 -120 ) subway/1_lobby2 256 16 0 0.500000 0.500000 0 285212672 0 +( 664 -168 -136 ) ( 664 -128 -136 ) ( 584 -88 -136 ) subway/1_lobby3 256 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4211 +{ +( 496 8 -216 ) ( 496 8 -184 ) ( 488 0 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 496 8 -184 ) ( 496 8 -216 ) ( 496 -88 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 496 -88 -184 ) ( 496 -88 -216 ) ( 488 -96 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 488 -48 -184 ) ( 488 -40 -184 ) ( 488 -40 -152 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 320 -120 -184 ) ( 384 -120 -184 ) ( 384 -184 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 384 -184 -216 ) ( 384 -120 -216 ) ( 320 -120 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4212 +{ +( 496 8 -184 ) ( 496 8 -152 ) ( 488 0 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 496 8 -152 ) ( 496 8 -184 ) ( 496 -88 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 496 -88 -152 ) ( 496 -88 -184 ) ( 488 -96 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 488 -48 -152 ) ( 488 -40 -152 ) ( 488 -40 -120 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 320 -120 -152 ) ( 384 -120 -152 ) ( 384 -184 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 384 -184 -184 ) ( 384 -120 -184 ) ( 320 -120 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4213 +{ +( 672 -152 -184 ) ( 608 -152 -184 ) ( 608 -216 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 608 -216 -152 ) ( 608 -152 -152 ) ( 672 -152 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -32 -184 ) ( 576 -32 -184 ) ( 576 -32 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -560 -152 ) ( 584 -560 -184 ) ( 584 -704 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 576 -16 -152 ) ( 576 -16 -184 ) ( 584 -16 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 576 16 -184 ) ( 576 16 -152 ) ( 576 -368 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4214 +{ +( 576 -24 -216 ) ( 576 -24 -184 ) ( 576 -408 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 -24 -184 ) ( 576 -24 -216 ) ( 584 -24 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -624 -184 ) ( 584 -624 -216 ) ( 584 -768 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -88 -216 ) ( 576 -88 -216 ) ( 576 -88 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -88 -184 ) ( 576 -88 -184 ) ( 576 -24 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 -88 -216 ) ( 584 -88 -216 ) ( 584 -24 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4215 +{ +( 1000 -160 -120 ) ( 1064 -160 -120 ) ( 1064 -96 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 1048 -96 -104 ) ( 1048 -160 -104 ) ( 984 -160 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 904 -40 -120 ) ( 840 -40 -120 ) ( 840 -40 -128 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 880 72 -112 ) ( 880 8 -112 ) ( 880 8 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 1344 -160 -112 ) ( 1408 -160 -112 ) ( 1408 -160 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 912 -296 -112 ) ( 912 -232 -112 ) ( 912 -232 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 4216 +{ +( 1200 56 -120 ) ( 1200 56 -112 ) ( 1264 56 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1328 -424 -120 ) ( 1328 -424 -112 ) ( 1328 -360 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1008 104 -120 ) ( 1008 104 -112 ) ( 944 104 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 856 152 -128 ) ( 856 152 -120 ) ( 856 88 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1176 0 -104 ) ( 1176 -64 -104 ) ( 1112 -64 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1112 -80 -120 ) ( 1176 -80 -120 ) ( 1176 -16 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4217 +{ +( 872 -328 -200 ) ( 872 -328 -160 ) ( 872 -368 -160 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -600 -200 ) ( 872 -600 -160 ) ( 904 -600 -160 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 880 -512 -200 ) ( 880 -512 -160 ) ( 880 -472 -160 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 912 -200 -200 ) ( 912 -200 -160 ) ( 880 -200 -160 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 -272 -200 ) ( 872 -272 -200 ) ( 872 -232 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -240 -216 ) ( 872 -280 -216 ) ( 904 -280 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4218 +{ +( 872 -328 -168 ) ( 872 -328 -128 ) ( 872 -368 -128 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -600 -168 ) ( 872 -600 -128 ) ( 904 -600 -128 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 880 -520 -168 ) ( 880 -520 -128 ) ( 880 -480 -128 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 912 -200 -120 ) ( 880 -200 -120 ) ( 880 -200 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -232 -120 ) ( 904 -232 -120 ) ( 904 -272 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 -232 -136 ) ( 872 -272 -136 ) ( 904 -272 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4219 +{ +( 536 -832 -160 ) ( 536 -872 -160 ) ( 536 -872 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 -840 -160 ) ( 536 -840 -160 ) ( 536 -840 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 -872 -160 ) ( 568 -832 -160 ) ( 568 -832 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 -872 -160 ) ( 568 -872 -160 ) ( 568 -872 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 -872 -200 ) ( 536 -832 -200 ) ( 568 -832 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 -824 -216 ) ( 536 -824 -216 ) ( 536 -864 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4220 +{ +( 888 104 -216 ) ( 856 104 -216 ) ( 856 64 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 856 56 -200 ) ( 856 96 -200 ) ( 888 96 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 856 56 -160 ) ( 888 56 -160 ) ( 888 56 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 888 56 -160 ) ( 888 96 -160 ) ( 888 96 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 888 88 -160 ) ( 856 88 -160 ) ( 856 88 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 856 96 -160 ) ( 856 56 -160 ) ( 856 56 -200 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4221 +{ +( 856 96 -144 ) ( 856 56 -144 ) ( 856 56 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 888 88 -144 ) ( 856 88 -144 ) ( 856 88 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 888 56 -144 ) ( 888 96 -144 ) ( 888 96 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 856 56 -144 ) ( 888 56 -144 ) ( 888 56 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 856 56 -136 ) ( 856 96 -136 ) ( 888 96 -136 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 888 104 -200 ) ( 856 104 -200 ) ( 856 64 -200 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4222 +{ +( 888 96 -136 ) ( 856 96 -136 ) ( 856 56 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 856 56 -120 ) ( 856 96 -120 ) ( 888 96 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 856 56 -128 ) ( 888 56 -128 ) ( 888 56 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 888 56 -128 ) ( 888 96 -128 ) ( 888 96 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 888 88 -128 ) ( 856 88 -128 ) ( 856 88 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 856 96 -128 ) ( 856 56 -128 ) ( 856 56 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4223 +{ +( 1064 272 -136 ) ( 1032 272 -136 ) ( 1032 232 -136 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1032 232 -120 ) ( 1032 272 -120 ) ( 1064 272 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1032 232 -128 ) ( 1064 232 -128 ) ( 1064 232 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1064 240 -128 ) ( 1064 280 -128 ) ( 1064 280 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1064 264 -128 ) ( 1032 264 -128 ) ( 1032 264 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1032 272 -128 ) ( 1032 232 -128 ) ( 1032 232 -168 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4224 +{ +( 920 -192 -152 ) ( 984 -192 -152 ) ( 984 -128 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1112 56 -120 ) ( 1032 56 -120 ) ( 1032 64 -120 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 864 64 -120 ) ( 856 56 -120 ) ( 856 56 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1328 64 -152 ) ( 1328 64 -144 ) ( 1264 64 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1104 -552 -152 ) ( 1104 -552 -144 ) ( 1104 -488 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1160 56 -152 ) ( 896 56 -152 ) ( 896 56 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4225 +{ +( 992 -120 -216 ) ( 992 -184 -216 ) ( 1056 -184 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 -168 -184 ) ( 992 -168 -184 ) ( 992 -104 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1104 -8 -208 ) ( 1104 56 -208 ) ( 1104 56 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1144 72 -208 ) ( 1080 72 -208 ) ( 1080 72 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 864 64 -184 ) ( 864 64 -216 ) ( 872 72 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 800 64 -216 ) ( 800 64 -184 ) ( 896 64 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4226 +{ +( 1224 1088 -224 ) ( 1160 1088 -224 ) ( 1160 1024 -224 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1160 1008 -216 ) ( 1160 1072 -216 ) ( 1224 1072 -216 ) subway/1_lobby_floor 48 16 0 0.500000 0.500000 0 285212672 0 +( 1320 848 -232 ) ( 1320 848 -224 ) ( 1320 912 -224 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1032 72 -224 ) ( 1032 72 -216 ) ( 1096 72 -216 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1032 1448 -224 ) ( 1032 1448 -216 ) ( 1032 1384 -216 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1240 240 -224 ) ( 1240 240 -216 ) ( 1176 240 -216 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4227 +{ +( 1200 240 -184 ) ( 1200 240 -216 ) ( 1352 240 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1040 240 -216 ) ( 1040 240 -184 ) ( 1032 232 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1472 232 -216 ) ( 1472 232 -208 ) ( 1536 232 -208 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1320 256 -224 ) ( 1320 256 -216 ) ( 1320 320 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1136 408 -184 ) ( 1136 472 -184 ) ( 1200 472 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1200 488 -216 ) ( 1136 488 -216 ) ( 1136 424 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4228 +{ +( 1136 200 -120 ) ( 1136 200 -112 ) ( 1200 200 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 1064 -288 -120 ) ( 1064 -288 -112 ) ( 1064 -224 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 968 320 -120 ) ( 968 320 -112 ) ( 904 320 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1000 296 -128 ) ( 1000 296 -120 ) ( 1000 232 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 1112 144 -104 ) ( 1112 80 -104 ) ( 1048 80 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1048 64 -120 ) ( 1112 64 -120 ) ( 1112 128 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4229 +{ +( 1128 16 -120 ) ( 1192 16 -120 ) ( 1192 80 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1192 96 -104 ) ( 1192 32 -104 ) ( 1128 32 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1304 208 -120 ) ( 1304 208 -112 ) ( 1304 144 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 1056 248 -120 ) ( 1056 248 -112 ) ( 992 248 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1336 -336 -120 ) ( 1336 -336 -112 ) ( 1336 -272 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1192 104 -120 ) ( 1192 104 -112 ) ( 1256 104 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 4230 +{ +( 984 64 -120 ) ( 1048 64 -120 ) ( 1048 128 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1048 144 -104 ) ( 1048 80 -104 ) ( 984 80 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 920 296 -128 ) ( 920 296 -120 ) ( 920 232 -120 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 904 320 -120 ) ( 904 320 -112 ) ( 840 320 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1000 -288 -120 ) ( 1000 -288 -112 ) ( 1000 -224 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1080 280 -120 ) ( 1080 280 -112 ) ( 1144 280 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 4231 +{ +( 880 64 -120 ) ( 944 64 -120 ) ( 944 128 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 944 144 -104 ) ( 944 80 -104 ) ( 880 80 -104 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 856 320 -128 ) ( 856 320 -120 ) ( 856 256 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 800 320 -120 ) ( 800 320 -112 ) ( 736 320 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 920 -288 -112 ) ( 920 -288 -104 ) ( 920 -224 -104 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +( 960 104 -120 ) ( 960 104 -112 ) ( 1024 104 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4232 +{ +( 872 592 -64 ) ( 872 528 -64 ) ( 936 528 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 936 528 -48 ) ( 872 528 -48 ) ( 872 592 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 872 384 -120 ) ( 872 384 -72 ) ( 808 384 -72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 888 488 -72 ) ( 888 488 -120 ) ( 888 464 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 888 328 -104 ) ( 888 328 -88 ) ( 896 328 -88 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 840 200 -72 ) ( 840 200 -88 ) ( 840 264 -88 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4233 +{ +( 872 648 -64 ) ( 872 584 -64 ) ( 936 584 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 936 584 -48 ) ( 872 584 -48 ) ( 872 648 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 872 496 -120 ) ( 872 496 -72 ) ( 808 496 -72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 872 544 -72 ) ( 872 544 -120 ) ( 872 520 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 888 384 -104 ) ( 888 384 -88 ) ( 896 384 -88 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 840 256 -72 ) ( 840 256 -88 ) ( 840 320 -88 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4234 +{ +( 840 368 -72 ) ( 840 368 -88 ) ( 840 432 -88 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 888 496 -104 ) ( 888 496 -88 ) ( 896 496 -88 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 888 656 -72 ) ( 888 656 -120 ) ( 888 632 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 872 552 -120 ) ( 872 552 -72 ) ( 808 552 -72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 936 696 -48 ) ( 872 696 -48 ) ( 872 760 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 872 760 -64 ) ( 872 696 -64 ) ( 936 696 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4235 +{ +( 872 456 -216 ) ( 872 392 -216 ) ( 936 392 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 936 392 -168 ) ( 872 392 -168 ) ( 872 456 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 360 -216 ) ( 872 360 -168 ) ( 808 360 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 352 -168 ) ( 872 352 -216 ) ( 872 328 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 888 328 -184 ) ( 888 328 -168 ) ( 896 328 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 256 -168 ) ( 840 256 -184 ) ( 840 320 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4236 +{ +( 840 256 -152 ) ( 840 256 -168 ) ( 840 320 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 888 328 -168 ) ( 888 328 -152 ) ( 896 328 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 872 352 -152 ) ( 872 352 -200 ) ( 872 328 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 872 360 -200 ) ( 872 360 -152 ) ( 808 360 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 936 392 -152 ) ( 872 392 -152 ) ( 872 456 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 872 456 -168 ) ( 872 392 -168 ) ( 936 392 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4237 +{ +( 840 256 -112 ) ( 840 256 -128 ) ( 840 320 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 888 328 -144 ) ( 888 328 -128 ) ( 896 328 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 872 352 -112 ) ( 872 352 -160 ) ( 872 328 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 872 360 -160 ) ( 872 360 -112 ) ( 808 360 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 936 392 -120 ) ( 872 392 -120 ) ( 872 456 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 872 456 -128 ) ( 872 392 -128 ) ( 936 392 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4238 +{ +( 840 256 -136 ) ( 840 256 -152 ) ( 840 320 -152 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 888 328 -152 ) ( 888 328 -136 ) ( 896 328 -136 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 352 -136 ) ( 872 352 -184 ) ( 872 328 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 360 -184 ) ( 872 360 -136 ) ( 808 360 -136 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 936 392 -128 ) ( 872 392 -128 ) ( 872 456 -128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 456 -152 ) ( 872 392 -152 ) ( 936 392 -152 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4239 +{ +( 840 256 -104 ) ( 840 256 -120 ) ( 840 320 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 888 328 -136 ) ( 888 328 -120 ) ( 896 328 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 352 -104 ) ( 872 352 -152 ) ( 872 328 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 360 -152 ) ( 872 360 -104 ) ( 808 360 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 936 392 -104 ) ( 872 392 -104 ) ( 872 456 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 456 -120 ) ( 872 392 -120 ) ( 936 392 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4240 +{ +( 872 328 -104 ) ( 872 360 -104 ) ( 840 360 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 888 384 -64 ) ( 888 328 -64 ) ( 840 328 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 328 -88 ) ( 872 328 -88 ) ( 872 328 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 888 328 -64 ) ( 888 384 -64 ) ( 872 360 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 840 384 -64 ) ( 840 360 -104 ) ( 872 360 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 840 368 -104 ) ( 840 432 -104 ) ( 840 432 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4241 +{ +( 840 448 -88 ) ( 840 448 -104 ) ( 840 512 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 872 520 -104 ) ( 840 520 -104 ) ( 840 496 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 888 504 -64 ) ( 888 552 -64 ) ( 872 552 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 872 552 -136 ) ( 872 552 -88 ) ( 808 552 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 888 552 -64 ) ( 888 504 -64 ) ( 840 496 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 840 520 -104 ) ( 872 520 -104 ) ( 872 552 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4242 +{ +( 872 648 -128 ) ( 872 584 -128 ) ( 936 584 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 936 584 -120 ) ( 872 584 -120 ) ( 872 648 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 872 552 -160 ) ( 872 552 -112 ) ( 808 552 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 872 544 -112 ) ( 872 544 -160 ) ( 872 520 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 888 520 -144 ) ( 888 520 -128 ) ( 896 520 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 840 448 -112 ) ( 840 448 -128 ) ( 840 512 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4243 +{ +( 872 648 -120 ) ( 872 584 -120 ) ( 936 584 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 936 584 -104 ) ( 872 584 -104 ) ( 872 648 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 552 -152 ) ( 872 552 -104 ) ( 808 552 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 544 -104 ) ( 872 544 -152 ) ( 872 520 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 888 520 -136 ) ( 888 520 -120 ) ( 896 520 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 840 448 -104 ) ( 840 448 -120 ) ( 840 512 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4244 +{ +( 872 648 -152 ) ( 872 584 -152 ) ( 936 584 -152 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 936 584 -128 ) ( 872 584 -128 ) ( 872 648 -128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 552 -184 ) ( 872 552 -136 ) ( 808 552 -136 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 544 -136 ) ( 872 544 -184 ) ( 872 520 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 888 520 -152 ) ( 888 520 -136 ) ( 896 520 -136 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 448 -136 ) ( 840 448 -152 ) ( 840 512 -152 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4245 +{ +( 872 648 -168 ) ( 872 584 -168 ) ( 936 584 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 936 584 -152 ) ( 872 584 -152 ) ( 872 648 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 872 552 -200 ) ( 872 552 -152 ) ( 808 552 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 872 544 -152 ) ( 872 544 -200 ) ( 872 520 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 888 520 -168 ) ( 888 520 -152 ) ( 896 520 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 840 448 -152 ) ( 840 448 -168 ) ( 840 512 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4246 +{ +( 872 648 -216 ) ( 872 584 -216 ) ( 936 584 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 936 584 -168 ) ( 872 584 -168 ) ( 872 648 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 552 -216 ) ( 872 552 -168 ) ( 808 552 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 544 -168 ) ( 872 544 -216 ) ( 872 520 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 888 520 -184 ) ( 888 520 -168 ) ( 896 520 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 448 -168 ) ( 840 448 -184 ) ( 840 512 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4247 +{ +( 1016 200 -72 ) ( 1016 200 -88 ) ( 1016 264 -88 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1080 328 -104 ) ( 1080 328 -88 ) ( 1088 328 -88 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1064 424 -72 ) ( 1064 424 -120 ) ( 1064 400 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1048 384 -120 ) ( 1048 384 -72 ) ( 984 384 -72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1112 528 -48 ) ( 1048 528 -48 ) ( 1048 592 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1048 592 -64 ) ( 1048 528 -64 ) ( 1112 528 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4248 +{ +( 1032 256 -72 ) ( 1032 256 -88 ) ( 1032 320 -88 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1096 384 -104 ) ( 1096 384 -88 ) ( 1104 384 -88 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1064 488 -72 ) ( 1064 488 -120 ) ( 1064 464 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1064 496 -120 ) ( 1064 496 -72 ) ( 1000 496 -72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1128 584 -48 ) ( 1064 584 -48 ) ( 1064 648 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1064 648 -64 ) ( 1064 584 -64 ) ( 1128 584 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4249 +{ +( 1048 760 -64 ) ( 1048 696 -64 ) ( 1112 696 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1112 696 -48 ) ( 1048 696 -48 ) ( 1048 760 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1048 552 -120 ) ( 1048 552 -72 ) ( 984 552 -72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1064 592 -72 ) ( 1064 592 -120 ) ( 1064 568 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1080 496 -104 ) ( 1080 496 -88 ) ( 1088 496 -88 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1016 368 -72 ) ( 1016 368 -88 ) ( 1016 432 -88 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4250 +{ +( 1032 256 -168 ) ( 1032 256 -184 ) ( 1032 320 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1080 328 -184 ) ( 1080 328 -168 ) ( 1088 328 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 352 -168 ) ( 1064 352 -216 ) ( 1064 328 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 360 -216 ) ( 1064 360 -168 ) ( 1000 360 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1128 392 -168 ) ( 1064 392 -168 ) ( 1064 456 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 456 -216 ) ( 1064 392 -216 ) ( 1128 392 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4251 +{ +( 1064 456 -168 ) ( 1064 392 -168 ) ( 1128 392 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1128 392 -144 ) ( 1064 392 -144 ) ( 1064 456 -144 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 360 -200 ) ( 1064 360 -152 ) ( 1000 360 -152 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 352 -144 ) ( 1064 352 -192 ) ( 1064 328 -192 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1080 328 -160 ) ( 1080 328 -144 ) ( 1088 328 -144 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1032 256 -152 ) ( 1032 256 -168 ) ( 1032 320 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4252 +{ +( 1064 456 -128 ) ( 1064 392 -128 ) ( 1128 392 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1128 392 -120 ) ( 1064 392 -120 ) ( 1064 456 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1064 360 -160 ) ( 1064 360 -112 ) ( 1000 360 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1064 352 -112 ) ( 1064 352 -160 ) ( 1064 328 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1080 328 -144 ) ( 1080 328 -128 ) ( 1088 328 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1032 256 -112 ) ( 1032 256 -128 ) ( 1032 320 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4253 +{ +( 1064 456 -144 ) ( 1064 392 -144 ) ( 1128 392 -144 ) subway/1_tile_bottom 8 32 0 0.500000 0.500000 0 318767104 0 +( 1128 392 -128 ) ( 1064 392 -128 ) ( 1064 456 -128 ) subway/1_tile_bottom 8 32 0 0.500000 0.500000 0 318767104 0 +( 1064 360 -176 ) ( 1064 360 -128 ) ( 1000 360 -128 ) subway/1_tile_bottom 8 32 0 0.500000 0.500000 0 318767104 0 +( 1064 352 -136 ) ( 1064 352 -184 ) ( 1064 328 -184 ) subway/1_tile_bottom 8 32 0 0.500000 0.500000 0 318767104 0 +( 1080 328 -152 ) ( 1080 328 -136 ) ( 1088 328 -136 ) subway/1_tile_bottom 8 32 0 0.500000 0.500000 0 318767104 0 +( 1032 256 -128 ) ( 1032 256 -144 ) ( 1032 320 -144 ) subway/1_tile_bottom 8 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4254 +{ +( 1064 456 -120 ) ( 1064 392 -120 ) ( 1128 392 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1128 392 -104 ) ( 1064 392 -104 ) ( 1064 456 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1064 360 -152 ) ( 1064 360 -104 ) ( 1000 360 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1064 352 -104 ) ( 1064 352 -152 ) ( 1064 328 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1080 328 -136 ) ( 1080 328 -120 ) ( 1088 328 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1032 256 -104 ) ( 1032 256 -120 ) ( 1032 320 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4255 +{ +( 1016 384 -64 ) ( 1016 328 -64 ) ( 1032 328 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1032 384 -64 ) ( 1032 360 -104 ) ( 1064 360 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1064 360 -136 ) ( 1064 336 -136 ) ( 1064 336 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1000 328 -88 ) ( 1064 328 -88 ) ( 1064 328 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1016 328 -64 ) ( 1016 384 -64 ) ( 1064 384 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1064 328 -104 ) ( 1064 360 -104 ) ( 1032 360 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4256 +{ +( 1032 520 -104 ) ( 1064 520 -104 ) ( 1064 552 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1016 496 -64 ) ( 1016 552 -64 ) ( 1064 552 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1064 552 -136 ) ( 1064 552 -88 ) ( 1000 552 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1064 544 -88 ) ( 1064 544 -136 ) ( 1064 520 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1064 520 -104 ) ( 1032 520 -104 ) ( 1032 496 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1016 552 -64 ) ( 1016 496 -64 ) ( 1032 520 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4257 +{ +( 1032 448 -112 ) ( 1032 448 -128 ) ( 1032 512 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1080 520 -144 ) ( 1080 520 -128 ) ( 1088 520 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1064 544 -112 ) ( 1064 544 -160 ) ( 1064 520 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1064 552 -160 ) ( 1064 552 -112 ) ( 1000 552 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1128 584 -120 ) ( 1064 584 -120 ) ( 1064 648 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1064 648 -128 ) ( 1064 584 -128 ) ( 1128 584 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4258 +{ +( 1032 448 -104 ) ( 1032 448 -120 ) ( 1032 512 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1080 520 -136 ) ( 1080 520 -120 ) ( 1088 520 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1064 544 -104 ) ( 1064 544 -152 ) ( 1064 520 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1064 552 -152 ) ( 1064 552 -104 ) ( 1000 552 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1128 584 -104 ) ( 1064 584 -104 ) ( 1064 648 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1064 648 -120 ) ( 1064 584 -120 ) ( 1128 584 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4259 +{ +( 1032 448 -128 ) ( 1032 448 -144 ) ( 1032 512 -144 ) subway/1_tile_bottom 8 32 0 0.500000 0.500000 0 318767104 0 +( 1080 520 -152 ) ( 1080 520 -136 ) ( 1088 520 -136 ) subway/1_tile_bottom 8 32 0 0.500000 0.500000 0 318767104 0 +( 1064 544 -136 ) ( 1064 544 -184 ) ( 1064 520 -184 ) subway/1_tile_bottom 8 32 0 0.500000 0.500000 0 318767104 0 +( 1064 552 -184 ) ( 1064 552 -136 ) ( 1000 552 -136 ) subway/1_tile_bottom 8 32 0 0.500000 0.500000 0 318767104 0 +( 1128 584 -128 ) ( 1064 584 -128 ) ( 1064 648 -128 ) subway/1_tile_bottom 8 32 0 0.500000 0.500000 0 318767104 0 +( 1064 648 -144 ) ( 1064 584 -144 ) ( 1128 584 -144 ) subway/1_tile_bottom 8 32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4260 +{ +( 1032 448 -152 ) ( 1032 448 -168 ) ( 1032 512 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1080 520 -168 ) ( 1080 520 -152 ) ( 1088 520 -152 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 544 -152 ) ( 1064 544 -200 ) ( 1064 520 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 552 -200 ) ( 1064 552 -152 ) ( 1000 552 -152 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1128 584 -144 ) ( 1064 584 -144 ) ( 1064 648 -144 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 648 -168 ) ( 1064 584 -168 ) ( 1128 584 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4261 +{ +( 1032 448 -168 ) ( 1032 448 -184 ) ( 1032 512 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1080 520 -184 ) ( 1080 520 -168 ) ( 1088 520 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 544 -168 ) ( 1064 544 -216 ) ( 1064 520 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 552 -216 ) ( 1064 552 -168 ) ( 1000 552 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1128 584 -168 ) ( 1064 584 -168 ) ( 1064 648 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1064 648 -216 ) ( 1064 584 -216 ) ( 1128 584 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4262 +{ +( 672 184 -152 ) ( 608 184 -152 ) ( 608 120 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 864 232 -120 ) ( 856 232 -120 ) ( 856 312 -120 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 856 56 -152 ) ( 856 56 -120 ) ( 864 64 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 864 304 -144 ) ( 864 368 -144 ) ( 864 368 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 312 328 -144 ) ( 248 328 -144 ) ( 248 328 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 856 56 -120 ) ( 856 56 -152 ) ( 856 320 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4263 +{ +( 1296 128 -152 ) ( 1296 192 -152 ) ( 1232 192 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1048 320 -120 ) ( 1048 240 -120 ) ( 1040 240 -120 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 1048 240 -120 ) ( 1048 240 -152 ) ( 1040 240 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1040 376 -152 ) ( 1040 376 -144 ) ( 1040 312 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1656 328 -152 ) ( 1656 328 -144 ) ( 1592 328 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1048 280 -152 ) ( 1048 280 -120 ) ( 1048 328 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4264 +{ +( 1064 328 -112 ) ( 1064 376 -112 ) ( 1064 376 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1672 552 -152 ) ( 1672 552 -144 ) ( 1608 552 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 456 -152 ) ( 1056 456 -144 ) ( 1056 392 -144 ) subway/1_lobby2 32 16 0 -0.500000 0.500000 0 285212672 0 +( 1080 328 -160 ) ( 1080 328 -152 ) ( 1144 328 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1064 552 -112 ) ( 1064 504 -112 ) ( 1056 504 -120 ) subway/1_tile_big_blue 0 -24 90 0.500000 0.500000 0 285212672 0 +( 1312 360 -152 ) ( 1312 424 -152 ) ( 1248 424 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4265 +{ +( 1288 104 -184 ) ( 1288 168 -184 ) ( 1224 168 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1040 296 -144 ) ( 1040 208 -144 ) ( 1032 200 -152 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 1040 240 -144 ) ( 1040 240 -184 ) ( 1032 232 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1032 200 -152 ) ( 1032 200 -184 ) ( 1032 248 -184 ) subway/1_lobby1ab 48 16 0 0.500000 0.500000 0 285212672 0 +( 1648 264 -184 ) ( 1648 264 -176 ) ( 1584 264 -176 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 1040 240 -184 ) ( 1040 240 -144 ) ( 1040 264 -144 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4266 +{ +( 880 72 -120 ) ( 944 72 -120 ) ( 944 136 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 944 152 -80 ) ( 944 88 -80 ) ( 880 88 -80 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 848 304 -128 ) ( 848 304 -120 ) ( 848 240 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 800 328 -120 ) ( 800 328 -112 ) ( 736 328 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1072 -288 -120 ) ( 1072 -288 -112 ) ( 1072 -224 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 888 320 -120 ) ( 888 320 -112 ) ( 952 320 -112 ) subway/1_beam1 0 16 0 0.500000 0.500000 0 16777216 0 +} +// brush 4267 +{ +( 1064 1088 -224 ) ( 1000 1088 -224 ) ( 1000 1024 -224 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1000 1008 -216 ) ( 1000 1072 -216 ) ( 1064 1072 -216 ) subway/1_lobby_floor 48 16 0 0.500000 0.500000 0 285212672 0 +( 1032 856 -232 ) ( 1032 856 -224 ) ( 1032 920 -224 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 72 -224 ) ( 872 72 -216 ) ( 936 72 -216 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 1448 -224 ) ( 872 1448 -216 ) ( 872 1384 -216 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( 1064 520 -224 ) ( 1064 520 -216 ) ( 1000 520 -216 ) subway/1_lobby_floor 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4268 +{ +( 1288 136 -216 ) ( 1288 200 -216 ) ( 1224 200 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1208 200 -184 ) ( 1272 200 -184 ) ( 1272 136 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1040 240 -184 ) ( 1040 240 -216 ) ( 1032 232 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1032 256 -184 ) ( 1032 256 -216 ) ( 1032 304 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1648 328 -216 ) ( 1648 328 -208 ) ( 1584 328 -208 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1040 240 -216 ) ( 1040 240 -184 ) ( 1040 328 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4269 +{ +( 864 456 -144 ) ( 864 192 -144 ) ( 864 192 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 320 328 -176 ) ( 256 328 -176 ) ( 256 328 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 192 -184 ) ( 872 192 -152 ) ( 872 288 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 192 -152 ) ( 872 192 -184 ) ( 864 192 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 864 192 -144 ) ( 864 456 -144 ) ( 872 456 -152 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +( 680 328 -184 ) ( 616 328 -184 ) ( 616 264 -184 ) subway/1_lobby1a 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4270 +{ +( 1064 192 -216 ) ( 1064 192 -208 ) ( 1064 256 -208 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1672 552 -216 ) ( 1672 552 -208 ) ( 1608 552 -208 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 456 -216 ) ( 1056 456 -208 ) ( 1056 392 -208 ) subway/1_lobby1 32 16 0 -0.500000 0.500000 0 285212672 0 +( 1080 328 -224 ) ( 1080 328 -216 ) ( 1144 328 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1232 424 -184 ) ( 1296 424 -184 ) ( 1296 360 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1312 360 -216 ) ( 1312 424 -216 ) ( 1248 424 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4271 +{ +( 1064 240 -184 ) ( 1064 240 -176 ) ( 1064 304 -176 ) subway/1_lobby1aa 32 16 0 -0.500000 0.500000 0 285212672 0 +( 1672 432 -184 ) ( 1672 432 -176 ) ( 1608 432 -176 ) subway/1_lobby1aa 32 16 0 -0.500000 0.500000 0 285212672 0 +( 1056 392 -184 ) ( 1056 392 -176 ) ( 1056 328 -176 ) subway/1_lobby1aa 32 16 0 -0.500000 0.500000 0 285212672 0 +( 1080 400 -192 ) ( 1080 400 -184 ) ( 1144 400 -184 ) subway/1_lobby1aa 32 16 0 -0.500000 0.500000 0 285212672 0 +( 1232 304 -152 ) ( 1296 304 -152 ) ( 1296 240 -152 ) subway/1_lobby1aa 32 16 0 -0.500000 0.500000 0 285212672 0 +( 1312 240 -184 ) ( 1312 304 -184 ) ( 1248 304 -184 ) subway/1_lobby1aa 32 16 0 -0.500000 0.500000 0 285212672 0 +} +// brush 4272 +{ +( 1320 360 -120 ) ( 1320 424 -120 ) ( 1256 424 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1240 424 -80 ) ( 1304 424 -80 ) ( 1304 360 -80 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1088 328 -128 ) ( 1088 328 -120 ) ( 1152 328 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1064 280 -120 ) ( 1064 280 -112 ) ( 1064 216 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1680 552 -120 ) ( 1680 552 -112 ) ( 1616 552 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1072 368 -120 ) ( 1072 368 -112 ) ( 1072 432 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4273 +{ +( 680 200 -216 ) ( 616 200 -216 ) ( 616 136 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 632 136 -184 ) ( 632 200 -184 ) ( 696 200 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 864 64 -216 ) ( 864 64 -184 ) ( 872 72 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 72 -208 ) ( 872 136 -208 ) ( 872 136 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 320 328 -208 ) ( 256 328 -208 ) ( 256 328 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 864 64 -184 ) ( 864 64 -216 ) ( 864 328 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4274 +{ +( 1320 360 -80 ) ( 1320 424 -80 ) ( 1256 424 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 1240 424 -48 ) ( 1304 424 -48 ) ( 1304 360 -48 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 1088 328 -88 ) ( 1088 328 -80 ) ( 1152 328 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 1064 280 -80 ) ( 1064 280 -72 ) ( 1064 216 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 1680 552 -80 ) ( 1680 552 -72 ) ( 1616 552 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 1072 368 -80 ) ( 1072 368 -72 ) ( 1072 432 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4275 +{ +( 1064 808 -80 ) ( 1000 808 -80 ) ( 1000 744 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 1000 728 -48 ) ( 1000 792 -48 ) ( 1064 792 -48 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 1032 576 -88 ) ( 1032 576 -80 ) ( 1032 640 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 1080 552 -80 ) ( 1080 552 -72 ) ( 1144 552 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 872 1168 -80 ) ( 872 1168 -72 ) ( 872 1104 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 1056 560 -80 ) ( 1056 560 -72 ) ( 992 560 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4276 +{ +( 1056 560 -120 ) ( 1056 560 -112 ) ( 992 560 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 872 1168 -120 ) ( 872 1168 -112 ) ( 872 1104 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1080 552 -120 ) ( 1080 552 -112 ) ( 1144 552 -112 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1032 576 -128 ) ( 1032 576 -120 ) ( 1032 640 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1000 728 -80 ) ( 1000 792 -80 ) ( 1064 792 -80 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +( 1064 808 -120 ) ( 1000 808 -120 ) ( 1000 744 -120 ) subway/1_lobby3 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4277 +{ +( 1032 552 -112 ) ( 984 552 -112 ) ( 984 552 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 1160 -152 ) ( 872 1160 -144 ) ( 872 1096 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 968 544 -152 ) ( 968 544 -144 ) ( 1032 544 -144 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1032 568 -160 ) ( 1032 568 -152 ) ( 1032 632 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 552 -112 ) ( 920 552 -112 ) ( 920 544 -120 ) subway/1_tile_big_blue 0 -40 0 0.500000 0.500000 0 285212672 0 +( 1064 800 -152 ) ( 1000 800 -152 ) ( 1000 736 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4278 +{ +( 1168 552 -216 ) ( 1168 552 -208 ) ( 1104 552 -208 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 1160 -216 ) ( 872 1160 -208 ) ( 872 1096 -208 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 968 544 -216 ) ( 968 544 -208 ) ( 1032 544 -208 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1032 568 -224 ) ( 1032 568 -216 ) ( 1032 632 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1000 720 -184 ) ( 1000 784 -184 ) ( 1064 784 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1064 800 -216 ) ( 1000 800 -216 ) ( 1000 736 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4279 +{ +( 888 320 -80 ) ( 888 320 -72 ) ( 952 320 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 1072 -288 -80 ) ( 1072 -288 -72 ) ( 1072 -224 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 800 328 -80 ) ( 800 328 -72 ) ( 736 328 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 848 304 -88 ) ( 848 304 -80 ) ( 848 240 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 944 152 -48 ) ( 944 88 -48 ) ( 880 88 -48 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 880 72 -80 ) ( 944 72 -80 ) ( 944 136 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4280 +{ +( 1064 800 -224 ) ( 1000 800 -224 ) ( 1000 736 -224 ) subway/1_lobby_floor_edge -400 -1136 0 0.500000 0.500000 0 301989888 0 +( 1000 720 -216 ) ( 1000 784 -216 ) ( 1064 784 -216 ) subway/1_lobby_floor_edge -400 -1136 0 0.500000 0.500000 0 301989888 0 +( 1064 568 -232 ) ( 1064 568 -224 ) ( 1064 632 -224 ) subway/1_lobby_floor_edge 1136 16 0 0.500000 0.500000 0 301989888 0 +( 928 520 -224 ) ( 928 520 -216 ) ( 992 520 -216 ) subway/1_lobby_floor_edge -400 16 0 0.500000 0.500000 0 301989888 0 +( 840 1160 -224 ) ( 840 1160 -216 ) ( 840 1096 -216 ) subway/1_lobby_floor_edge 1136 16 0 0.500000 0.500000 0 301989888 0 +( 1056 552 -224 ) ( 1056 552 -216 ) ( 992 552 -216 ) subway/1_lobby_floor_edge -400 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 4281 +{ +( 576 -24 -152 ) ( 576 -24 -120 ) ( 576 -408 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 -24 -120 ) ( 576 -24 -152 ) ( 584 -24 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -624 -120 ) ( 584 -624 -152 ) ( 584 -768 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -88 -152 ) ( 576 -88 -152 ) ( 576 -88 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 608 -256 -120 ) ( 608 -192 -120 ) ( 672 -192 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 672 -192 -152 ) ( 608 -192 -152 ) ( 608 -256 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4282 +{ +( 672 -192 -120 ) ( 608 -192 -120 ) ( 608 -256 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 608 -256 -80 ) ( 608 -192 -80 ) ( 672 -192 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 584 -88 -120 ) ( 576 -88 -120 ) ( 576 -88 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 584 -624 -80 ) ( 584 -624 -120 ) ( 584 -768 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 576 -24 -80 ) ( 576 -24 -120 ) ( 584 -24 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 576 -24 -120 ) ( 576 -24 -80 ) ( 576 -408 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +} +// brush 4283 +{ +( 576 -24 -80 ) ( 576 -24 -48 ) ( 576 -408 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 576 -24 -48 ) ( 576 -24 -80 ) ( 584 -24 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 584 -624 -48 ) ( 584 -624 -80 ) ( 584 -768 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 584 -88 -80 ) ( 576 -88 -80 ) ( 576 -88 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 608 -256 -48 ) ( 608 -192 -48 ) ( 672 -192 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 584 320 -80 ) ( 576 328 -80 ) ( 576 192 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +} +// brush 4284 +{ +( 520 8 -120 ) ( 520 8 -136 ) ( 584 8 -136 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 584 -40 -152 ) ( 584 -40 -136 ) ( 584 -48 -136 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 808 -24 -120 ) ( 808 -24 -168 ) ( 784 -24 -168 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 808 -24 -168 ) ( 808 -24 -120 ) ( 808 40 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 848 -88 -96 ) ( 848 -24 -96 ) ( 912 -24 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 912 -24 -112 ) ( 848 -24 -112 ) ( 848 -88 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4285 +{ +( 576 112 -216 ) ( 576 -128 -216 ) ( 584 -128 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 608 -576 -184 ) ( 608 -512 -184 ) ( 672 -512 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -392 -216 ) ( 576 -392 -216 ) ( 576 -392 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -944 -184 ) ( 584 -944 -216 ) ( 584 -1088 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 -320 -184 ) ( 576 -320 -216 ) ( 584 -320 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 -320 -216 ) ( 576 -320 -184 ) ( 576 -704 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4286 +{ +( 672 -424 -184 ) ( 608 -424 -184 ) ( 608 -488 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 608 -488 -152 ) ( 608 -424 -152 ) ( 672 -424 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -336 -188 ) ( 576 -336 -188 ) ( 576 -336 -156 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 584 -872 -152 ) ( 584 -872 -184 ) ( 584 -1016 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 576 -320 -152 ) ( 576 -320 -184 ) ( 584 -320 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 576 -256 -184 ) ( 576 -256 -152 ) ( 576 -640 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4287 +{ +( 584 0 -80 ) ( 576 8 -80 ) ( 576 -128 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 608 -576 -48 ) ( 608 -512 -48 ) ( 672 -512 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 584 -600 -80 ) ( 576 -600 -80 ) ( 576 -600 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 584 -1096 -48 ) ( 584 -1096 -80 ) ( 584 -1240 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 576 -320 -48 ) ( 576 -320 -80 ) ( 584 -320 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 576 -344 -80 ) ( 576 -344 -48 ) ( 576 -728 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +} +// brush 4288 +{ +( 880 312 -80 ) ( 872 320 -80 ) ( 872 184 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 904 -264 -48 ) ( 904 -200 -48 ) ( 968 -200 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 880 -600 -80 ) ( 872 -600 -80 ) ( 872 -600 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 880 -232 -48 ) ( 880 -232 -80 ) ( 880 -376 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 880 16 -80 ) ( 880 16 -48 ) ( 872 8 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 872 -216 -48 ) ( 872 -352 -48 ) ( 872 -352 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4289 +{ +( 872 -216 -80 ) ( 872 -352 -80 ) ( 872 -352 -120 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( 880 16 -120 ) ( 880 16 -80 ) ( 872 8 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 880 -232 -80 ) ( 880 -232 -120 ) ( 880 -376 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 880 -600 -120 ) ( 872 -600 -120 ) ( 872 -600 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 904 -264 -80 ) ( 904 -200 -80 ) ( 968 -200 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 968 -200 -120 ) ( 904 -200 -120 ) ( 904 -264 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +} +// brush 4290 +{ +( 168 880 -72 ) ( 168 816 -72 ) ( 232 816 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 232 816 -40 ) ( 168 816 -40 ) ( 168 880 -40 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 168 520 -72 ) ( 168 520 -40 ) ( 136 520 -40 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 144 392 -40 ) ( 144 392 -72 ) ( 144 360 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 136 328 -72 ) ( 136 328 -24 ) ( 168 328 -24 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 136 456 -40 ) ( 136 456 -88 ) ( 136 488 -88 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4291 +{ +( 168 880 -152 ) ( 168 816 -152 ) ( 232 816 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 232 816 -120 ) ( 168 816 -120 ) ( 168 880 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 168 520 -152 ) ( 168 520 -120 ) ( 136 520 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 144 392 -120 ) ( 144 392 -152 ) ( 144 360 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 192 328 -120 ) ( 192 328 -104 ) ( 200 328 -104 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 136 1032 -152 ) ( 136 1032 -120 ) ( 136 776 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4292 +{ +( 136 456 -72 ) ( 136 456 -120 ) ( 136 488 -120 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( 136 328 -120 ) ( 136 328 -72 ) ( 168 328 -72 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +( 144 392 -88 ) ( 144 392 -120 ) ( 144 360 -120 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +( 168 520 -120 ) ( 168 520 -88 ) ( 136 520 -88 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +( 232 816 -72 ) ( 168 816 -72 ) ( 168 880 -72 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +( 168 880 -120 ) ( 168 816 -120 ) ( 232 816 -120 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 4293 +{ +( 136 1032 -184 ) ( 136 1032 -152 ) ( 136 776 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 192 328 -152 ) ( 192 328 -136 ) ( 200 328 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 144 392 -152 ) ( 144 392 -184 ) ( 144 360 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 176 520 -184 ) ( 176 520 -152 ) ( 144 520 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 232 816 -152 ) ( 168 816 -152 ) ( 168 880 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 168 880 -184 ) ( 168 816 -184 ) ( 232 816 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4294 +{ +( 136 1032 -216 ) ( 136 1032 -184 ) ( 136 776 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 144 328 -184 ) ( 144 328 -216 ) ( 136 328 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 144 328 -216 ) ( 144 328 -184 ) ( 144 408 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 176 520 -216 ) ( 176 520 -184 ) ( 144 520 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 232 816 -184 ) ( 168 816 -184 ) ( 168 880 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 168 880 -216 ) ( 168 816 -216 ) ( 232 816 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4295 +{ +( 272 264 -216 ) ( 208 264 -216 ) ( 208 200 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 208 200 -184 ) ( 208 264 -184 ) ( 272 264 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -88 256 -216 ) ( -88 256 -184 ) ( -88 288 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -176 288 -216 ) ( -176 288 -184 ) ( -88 288 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -176 288 -184 ) ( -176 288 -216 ) ( -168 296 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 424 296 -216 ) ( 424 296 -184 ) ( 168 296 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4296 +{ +( 272 264 -184 ) ( 208 264 -184 ) ( 208 200 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 208 200 -152 ) ( 208 264 -152 ) ( 272 264 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -88 256 -184 ) ( -88 256 -152 ) ( -88 288 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -104 288 -152 ) ( -104 288 -184 ) ( -136 288 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -168 240 -152 ) ( -168 240 -136 ) ( -168 232 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 424 296 -184 ) ( 424 296 -152 ) ( 168 296 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4297 +{ +( 272 264 -120 ) ( 208 264 -120 ) ( 208 200 -120 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +( 208 200 -80 ) ( 208 264 -80 ) ( 272 264 -80 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +( -88 264 -120 ) ( -88 264 -88 ) ( -88 296 -88 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +( -104 288 -88 ) ( -104 288 -120 ) ( -136 288 -120 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +( -168 296 -120 ) ( -168 296 -72 ) ( -168 264 -72 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +( -152 296 -72 ) ( -152 296 -120 ) ( -120 296 -120 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4298 +{ +( 424 296 -152 ) ( 424 296 -120 ) ( 168 296 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -168 240 -120 ) ( -168 240 -104 ) ( -168 232 -104 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -104 288 -120 ) ( -104 288 -152 ) ( -136 288 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -88 264 -152 ) ( -88 264 -120 ) ( -88 296 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 208 200 -120 ) ( 208 264 -120 ) ( 272 264 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 272 264 -152 ) ( 208 264 -152 ) ( 208 200 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4299 +{ +( -152 296 -40 ) ( -152 296 -88 ) ( -120 296 -88 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -168 296 -72 ) ( -168 296 -24 ) ( -168 264 -24 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -104 288 -40 ) ( -104 288 -72 ) ( -136 288 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -88 264 -72 ) ( -88 264 -40 ) ( -88 296 -40 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 208 200 -40 ) ( 208 264 -40 ) ( 272 264 -40 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 272 264 -80 ) ( 208 264 -80 ) ( 208 200 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4300 +{ +( 200 240 -112 ) ( 136 240 -112 ) ( 136 176 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 176 -96 ) ( 136 240 -96 ) ( 200 240 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 72 272 -120 ) ( 136 272 -120 ) ( 136 272 -168 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 136 304 -168 ) ( 136 280 -168 ) ( 136 280 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 152 328 -136 ) ( 144 328 -136 ) ( 144 328 -152 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 80 496 -136 ) ( 80 560 -136 ) ( 80 560 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4301 +{ +( -40 16 -216 ) ( -40 80 -216 ) ( -104 80 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 80 120 -176 ) ( -40 120 -176 ) ( -40 144 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 88 120 -176 ) ( 88 120 -216 ) ( -32 120 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -56 48 -200 ) ( -56 -88 -200 ) ( -56 -88 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -32 144 -216 ) ( -32 144 -200 ) ( -40 144 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 104 120 -216 ) ( 104 120 -176 ) ( 104 144 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4302 +{ +( 104 112 -168 ) ( 104 112 -152 ) ( 104 120 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -32 120 -168 ) ( -32 120 -152 ) ( -40 120 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -56 24 -136 ) ( -56 -112 -136 ) ( -56 -112 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 80 112 -152 ) ( 80 112 -168 ) ( -40 112 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -104 56 -152 ) ( -40 56 -152 ) ( -40 -8 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -40 -8 -168 ) ( -40 56 -168 ) ( -104 56 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4303 +{ +( -40 -8 -200 ) ( -40 56 -200 ) ( -104 56 -200 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -104 56 -168 ) ( -40 56 -168 ) ( -40 -8 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 80 112 -168 ) ( 80 112 -200 ) ( -40 112 -200 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -56 24 -152 ) ( -56 -112 -152 ) ( -56 -112 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -24 120 -184 ) ( -24 120 -168 ) ( -32 120 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 112 -200 ) ( 104 112 -168 ) ( 104 120 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4304 +{ +( 104 112 -112 ) ( 104 112 -96 ) ( 104 120 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -40 120 -112 ) ( -40 120 -96 ) ( -48 120 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -56 24 -104 ) ( -56 -112 -104 ) ( -56 -112 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 80 112 -96 ) ( 80 112 -112 ) ( -40 112 -112 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -104 56 -96 ) ( -40 56 -96 ) ( -40 -8 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -40 -8 -112 ) ( -40 56 -112 ) ( -104 56 -112 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4305 +{ +( 776 128 -224 ) ( 776 192 -224 ) ( 712 192 -224 ) subway/1_concrete_floor -176 -352 0 0.500000 0.500000 0 285212672 0 +( 696 200 -216 ) ( 760 200 -216 ) ( 760 136 -216 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 560 104 -224 ) ( 560 104 -216 ) ( 624 104 -216 ) subway/1_stair_side1 1216 0 0 0.500000 0.500000 0 285212672 0 +( -88 344 -232 ) ( -88 344 -224 ) ( -88 280 -224 ) subway/1_concrete_floor -1440 -320 0 0.500000 0.500000 0 285212672 0 +( 1144 328 -224 ) ( 1144 328 -216 ) ( 1080 328 -216 ) subway/1_stair_side1 1616 -320 0 0.500000 0.500000 0 285212672 0 +( 792 152 -224 ) ( 792 152 -216 ) ( 792 216 -216 ) subway/1_concrete_floor -1440 -320 0 0.500000 0.500000 0 285212672 0 +} +// brush 4306 +{ +( -200 -96 -120 ) ( -200 -32 -120 ) ( -264 -32 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( -264 -32 -80 ) ( -200 -32 -80 ) ( -200 -96 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( -192 288 -120 ) ( -192 288 -88 ) ( -160 288 -88 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( -176 256 -88 ) ( -176 256 -120 ) ( -176 288 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( -168 328 -120 ) ( -168 328 -72 ) ( -200 328 -72 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( -168 328 -72 ) ( -168 328 -120 ) ( -168 296 -120 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4307 +{ +( 392 360 -216 ) ( 392 360 -184 ) ( 136 360 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -184 304 -184 ) ( -184 304 -168 ) ( -184 296 -168 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -152 328 -184 ) ( -152 328 -216 ) ( -184 328 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -152 320 -216 ) ( -152 320 -184 ) ( -152 352 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 176 264 -184 ) ( 176 328 -184 ) ( 240 328 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 240 328 -216 ) ( 176 328 -216 ) ( 176 264 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4308 +{ +( 392 360 -184 ) ( 392 360 -152 ) ( 136 360 -152 ) subway/1_lobby1ab 40 16 0 0.500000 0.500000 0 285212672 0 +( -184 304 -152 ) ( -184 304 -136 ) ( -184 296 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -152 328 -152 ) ( -152 328 -184 ) ( -184 328 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -152 320 -184 ) ( -152 320 -152 ) ( -152 352 -152 ) subway/1_lobby1ac 48 -48 0 0.500000 0.500000 0 285212672 0 +( 176 264 -152 ) ( 176 328 -152 ) ( 240 328 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 240 328 -184 ) ( 176 328 -184 ) ( 176 264 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4309 +{ +( 240 328 -120 ) ( 176 328 -120 ) ( 176 264 -120 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( 176 264 -80 ) ( 176 328 -80 ) ( 240 328 -80 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( -152 328 -120 ) ( -152 328 -88 ) ( -152 360 -88 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( -152 328 -88 ) ( -152 328 -120 ) ( -184 328 -120 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( -184 360 -120 ) ( -184 360 -72 ) ( -184 328 -72 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( -184 360 -72 ) ( -184 360 -120 ) ( -152 360 -120 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4310 +{ +( 240 328 -152 ) ( 176 328 -152 ) ( 176 264 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 176 264 -120 ) ( 176 328 -120 ) ( 240 328 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -152 328 -152 ) ( -152 328 -120 ) ( -152 360 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -152 328 -120 ) ( -152 328 -152 ) ( -184 328 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -184 304 -120 ) ( -184 304 -104 ) ( -184 296 -104 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 392 360 -152 ) ( 392 360 -120 ) ( 136 360 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4311 +{ +( 136 208 -96 ) ( 136 208 -88 ) ( 136 144 -88 ) subway/1_beam1 1328 0 0 0.500000 0.500000 0 16777216 0 +( 648 112 -96 ) ( 648 112 -88 ) ( 712 112 -88 ) subway/1_beam1 32 0 0 0.500000 0.500000 0 16777216 0 +( 816 48 -96 ) ( 816 48 -88 ) ( 816 112 -88 ) subway/1_concrete_floor -1344 -320 0 0.500000 0.500000 0 285212672 0 +( 696 320 -88 ) ( 512 320 -88 ) ( 512 320 -96 ) subway/1_beam1 32 0 0 0.500000 0.500000 0 16777216 0 +( 504 200 -88 ) ( 688 200 -88 ) ( 688 0 -88 ) subway/1_concrete_floor 976 1232 0 0.500000 0.500000 0 285212672 0 +( 512 200 -96 ) ( 512 136 -96 ) ( 576 136 -96 ) subway/con14 176 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4312 +{ +( 104 152 -200 ) ( 104 216 -200 ) ( 104 216 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 160 144 -184 ) ( 152 144 -184 ) ( 152 144 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 136 144 -232 ) ( 136 120 -232 ) ( 136 120 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 72 112 -184 ) ( 136 112 -184 ) ( 136 112 -232 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 136 16 -176 ) ( 136 80 -176 ) ( 200 80 -176 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 200 80 -200 ) ( 136 80 -200 ) ( 136 16 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4313 +{ +( 104 152 -216 ) ( 104 216 -216 ) ( 104 216 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 160 144 -200 ) ( 152 144 -200 ) ( 152 144 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 136 144 -248 ) ( 136 120 -248 ) ( 136 120 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 72 112 -200 ) ( 136 112 -200 ) ( 136 112 -248 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 136 16 -200 ) ( 136 80 -200 ) ( 200 80 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 200 80 -216 ) ( 136 80 -216 ) ( 136 16 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4314 +{ +( 104 152 -168 ) ( 104 216 -168 ) ( 104 216 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 160 144 -168 ) ( 152 144 -168 ) ( 152 144 -184 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 136 144 -200 ) ( 136 120 -200 ) ( 136 120 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 72 112 -152 ) ( 136 112 -152 ) ( 136 112 -200 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 136 16 -152 ) ( 136 80 -152 ) ( 200 80 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 200 80 -168 ) ( 136 80 -168 ) ( 136 16 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4315 +{ +( 136 112 -152 ) ( 136 144 -152 ) ( 104 144 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 168 -112 ) ( 136 88 -112 ) ( 80 88 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 112 -152 ) ( 80 88 -112 ) ( 136 88 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 144 -184 ) ( 136 120 -184 ) ( 136 120 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 168 -112 ) ( 104 144 -152 ) ( 136 144 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 144 -152 ) ( 80 168 -112 ) ( 80 112 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4316 +{ +( 200 80 -112 ) ( 136 80 -112 ) ( 136 16 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 16 -96 ) ( 136 80 -96 ) ( 200 80 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 64 88 -120 ) ( 128 88 -120 ) ( 128 88 -168 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 136 144 -168 ) ( 136 120 -168 ) ( 136 120 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 152 168 -136 ) ( 144 168 -136 ) ( 144 168 -152 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 80 336 -136 ) ( 80 400 -136 ) ( 80 400 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4317 +{ +( 104 152 -176 ) ( 104 216 -176 ) ( 104 216 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 160 144 -176 ) ( 152 144 -176 ) ( 152 144 -192 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 144 -208 ) ( 136 120 -208 ) ( 136 120 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 112 -160 ) ( 136 112 -160 ) ( 136 112 -208 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 16 -168 ) ( 136 80 -168 ) ( 200 80 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 200 80 -176 ) ( 136 80 -176 ) ( 136 16 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4318 +{ +( 104 336 -216 ) ( 104 400 -216 ) ( 104 400 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 160 328 -200 ) ( 152 328 -200 ) ( 152 328 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 136 328 -248 ) ( 136 304 -248 ) ( 136 304 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 72 296 -200 ) ( 136 296 -200 ) ( 136 296 -248 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 136 200 -200 ) ( 136 264 -200 ) ( 200 264 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 200 264 -216 ) ( 136 264 -216 ) ( 136 200 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4319 +{ +( 104 224 -160 ) ( 104 224 -176 ) ( 104 288 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 152 296 -192 ) ( 152 296 -176 ) ( 160 296 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 320 -160 ) ( 136 320 -208 ) ( 136 296 -208 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 328 -208 ) ( 136 328 -160 ) ( 72 328 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 200 360 -168 ) ( 136 360 -168 ) ( 136 424 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 424 -200 ) ( 136 360 -200 ) ( 200 360 -200 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4320 +{ +( 104 224 -152 ) ( 104 224 -168 ) ( 104 288 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 152 296 -184 ) ( 152 296 -168 ) ( 160 296 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 136 320 -152 ) ( 136 320 -200 ) ( 136 296 -200 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 136 328 -200 ) ( 136 328 -152 ) ( 72 328 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 200 360 -152 ) ( 136 360 -152 ) ( 136 424 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 136 424 -168 ) ( 136 360 -168 ) ( 200 360 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4321 +{ +( 760 416 -216 ) ( 760 352 -216 ) ( 824 352 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 640 312 -176 ) ( 760 312 -176 ) ( 760 288 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 632 312 -176 ) ( 632 312 -216 ) ( 752 312 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 776 384 -200 ) ( 776 520 -200 ) ( 776 520 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 752 288 -216 ) ( 752 288 -200 ) ( 760 288 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 616 312 -216 ) ( 616 312 -176 ) ( 616 288 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4322 +{ +( 616 320 -152 ) ( 616 320 -112 ) ( 616 312 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 760 312 -128 ) ( 760 312 -112 ) ( 768 312 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 776 408 -120 ) ( 776 544 -120 ) ( 776 544 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 640 320 -112 ) ( 640 320 -152 ) ( 760 320 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 824 376 -112 ) ( 760 376 -112 ) ( 760 440 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 760 440 -152 ) ( 760 376 -152 ) ( 824 376 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4323 +{ +( 760 440 -200 ) ( 760 376 -200 ) ( 824 376 -200 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 824 376 -168 ) ( 760 376 -168 ) ( 760 440 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 640 320 -168 ) ( 640 320 -200 ) ( 760 320 -200 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 776 408 -152 ) ( 776 544 -152 ) ( 776 544 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 744 312 -184 ) ( 744 312 -168 ) ( 752 312 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 616 320 -200 ) ( 616 320 -168 ) ( 616 312 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4324 +{ +( 616 320 -168 ) ( 616 320 -152 ) ( 616 312 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 752 312 -168 ) ( 752 312 -152 ) ( 760 312 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 776 408 -136 ) ( 776 544 -136 ) ( 776 544 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 640 320 -152 ) ( 640 320 -168 ) ( 760 320 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 824 376 -152 ) ( 760 376 -152 ) ( 760 440 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 760 440 -168 ) ( 760 376 -168 ) ( 824 376 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4325 +{ +( 616 320 -112 ) ( 616 320 -96 ) ( 616 312 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 760 312 -112 ) ( 760 312 -96 ) ( 768 312 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 776 408 -104 ) ( 776 544 -104 ) ( 776 544 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 640 320 -96 ) ( 640 320 -112 ) ( 760 320 -112 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 824 376 -96 ) ( 760 376 -96 ) ( 760 440 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 760 440 -112 ) ( 760 376 -112 ) ( 824 376 -112 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4326 +{ +( -88 176 -112 ) ( -88 240 -112 ) ( -152 240 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -152 240 -96 ) ( -88 240 -96 ) ( -88 176 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -88 272 -168 ) ( -88 272 -120 ) ( -24 272 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -88 280 -120 ) ( -88 280 -168 ) ( -88 304 -168 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -96 328 -152 ) ( -96 328 -136 ) ( -104 328 -136 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -32 560 -120 ) ( -32 560 -136 ) ( -32 496 -136 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4327 +{ +( -152 360 -168 ) ( -88 360 -168 ) ( -88 424 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -88 424 -152 ) ( -88 360 -152 ) ( -152 360 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -24 328 -152 ) ( -88 328 -152 ) ( -88 328 -200 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -88 296 -200 ) ( -88 320 -200 ) ( -88 320 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -112 296 -168 ) ( -104 296 -168 ) ( -104 296 -184 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -56 288 -168 ) ( -56 224 -168 ) ( -56 224 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4328 +{ +( -152 360 -200 ) ( -88 360 -200 ) ( -88 424 -200 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -88 424 -168 ) ( -88 360 -168 ) ( -152 360 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -24 328 -160 ) ( -88 328 -160 ) ( -88 328 -208 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -88 296 -208 ) ( -88 320 -208 ) ( -88 320 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -112 296 -176 ) ( -104 296 -176 ) ( -104 296 -192 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -56 288 -176 ) ( -56 224 -176 ) ( -56 224 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4329 +{ +( -88 200 -216 ) ( -88 264 -216 ) ( -152 264 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -152 264 -200 ) ( -88 264 -200 ) ( -88 200 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -88 296 -248 ) ( -88 296 -200 ) ( -24 296 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -88 304 -200 ) ( -88 304 -248 ) ( -88 328 -248 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -104 328 -216 ) ( -104 328 -200 ) ( -112 328 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -56 400 -200 ) ( -56 400 -216 ) ( -56 336 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4330 +{ +( -32 400 -120 ) ( -32 400 -136 ) ( -32 336 -136 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -96 168 -152 ) ( -96 168 -136 ) ( -104 168 -136 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -88 120 -120 ) ( -88 120 -168 ) ( -88 144 -168 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -80 88 -168 ) ( -80 88 -120 ) ( -16 88 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -152 80 -96 ) ( -88 80 -96 ) ( -88 16 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( -88 16 -112 ) ( -88 80 -112 ) ( -152 80 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4331 +{ +( -32 112 -112 ) ( -32 168 -112 ) ( -56 144 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -88 144 -152 ) ( -56 144 -152 ) ( -56 168 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -88 120 -136 ) ( -88 120 -184 ) ( -88 144 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -88 88 -112 ) ( -32 88 -112 ) ( -56 112 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -32 88 -112 ) ( -88 88 -112 ) ( -88 168 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -56 144 -152 ) ( -88 144 -152 ) ( -88 112 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4332 +{ +( -88 16 -168 ) ( -88 80 -168 ) ( -152 80 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -152 80 -152 ) ( -88 80 -152 ) ( -88 16 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -88 112 -200 ) ( -88 112 -152 ) ( -24 112 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -88 120 -152 ) ( -88 120 -200 ) ( -88 144 -200 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -104 144 -184 ) ( -104 144 -168 ) ( -112 144 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -56 216 -152 ) ( -56 216 -168 ) ( -56 152 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4333 +{ +( -88 16 -176 ) ( -88 80 -176 ) ( -152 80 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -152 80 -168 ) ( -88 80 -168 ) ( -88 16 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -88 112 -208 ) ( -88 112 -160 ) ( -24 112 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -88 120 -160 ) ( -88 120 -208 ) ( -88 144 -208 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -104 144 -192 ) ( -104 144 -176 ) ( -112 144 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -56 216 -160 ) ( -56 216 -176 ) ( -56 152 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4334 +{ +( -88 16 -200 ) ( -88 80 -200 ) ( -152 80 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -152 80 -176 ) ( -88 80 -176 ) ( -88 16 -176 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -88 112 -232 ) ( -88 112 -184 ) ( -24 112 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -88 120 -184 ) ( -88 120 -232 ) ( -88 144 -232 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -104 144 -200 ) ( -104 144 -184 ) ( -112 144 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -56 216 -184 ) ( -56 216 -200 ) ( -56 152 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4335 +{ +( -88 16 -216 ) ( -88 80 -216 ) ( -152 80 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -152 80 -200 ) ( -88 80 -200 ) ( -88 16 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -88 112 -248 ) ( -88 112 -200 ) ( -24 112 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -88 120 -200 ) ( -88 120 -248 ) ( -88 144 -248 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -104 144 -216 ) ( -104 144 -200 ) ( -112 144 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -56 216 -200 ) ( -56 216 -216 ) ( -56 152 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4336 +{ +( 584 16 -216 ) ( 584 80 -216 ) ( 520 80 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 520 80 -200 ) ( 584 80 -200 ) ( 584 16 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 584 112 -248 ) ( 584 112 -200 ) ( 648 112 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 584 120 -200 ) ( 584 120 -248 ) ( 584 144 -248 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 568 144 -216 ) ( 568 144 -200 ) ( 560 144 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 616 216 -200 ) ( 616 216 -216 ) ( 616 152 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4337 +{ +( 584 16 -200 ) ( 584 80 -200 ) ( 520 80 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 520 80 -176 ) ( 584 80 -176 ) ( 584 16 -176 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 112 -232 ) ( 584 112 -184 ) ( 648 112 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 120 -184 ) ( 584 120 -232 ) ( 584 144 -232 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 568 144 -200 ) ( 568 144 -184 ) ( 560 144 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 616 216 -184 ) ( 616 216 -200 ) ( 616 152 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4338 +{ +( 584 16 -168 ) ( 584 80 -168 ) ( 520 80 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 520 80 -152 ) ( 584 80 -152 ) ( 584 16 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 112 -200 ) ( 584 112 -152 ) ( 648 112 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 120 -152 ) ( 584 120 -200 ) ( 584 144 -200 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 568 144 -184 ) ( 568 144 -168 ) ( 560 144 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 216 -152 ) ( 616 216 -168 ) ( 616 152 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4339 +{ +( 584 16 -176 ) ( 584 80 -176 ) ( 520 80 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 520 80 -168 ) ( 584 80 -168 ) ( 584 16 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 112 -208 ) ( 584 112 -160 ) ( 648 112 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 120 -160 ) ( 584 120 -208 ) ( 584 144 -208 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 568 144 -192 ) ( 568 144 -176 ) ( 560 144 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 616 216 -160 ) ( 616 216 -176 ) ( 616 152 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4340 +{ +( 640 400 -120 ) ( 640 400 -136 ) ( 640 336 -136 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 576 168 -152 ) ( 576 168 -136 ) ( 568 168 -136 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 584 120 -120 ) ( 584 120 -168 ) ( 584 144 -168 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 592 88 -168 ) ( 592 88 -120 ) ( 656 88 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 520 80 -96 ) ( 584 80 -96 ) ( 584 16 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 584 16 -112 ) ( 584 80 -112 ) ( 520 80 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4341 +{ +( 584 168 -112 ) ( 584 232 -112 ) ( 520 232 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 520 232 -96 ) ( 584 232 -96 ) ( 584 168 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 584 264 -168 ) ( 584 264 -120 ) ( 648 264 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 584 272 -120 ) ( 584 272 -168 ) ( 584 296 -168 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 576 320 -152 ) ( 576 320 -136 ) ( 568 320 -136 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 640 552 -120 ) ( 640 552 -136 ) ( 640 488 -136 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4342 +{ +( 520 352 -168 ) ( 584 352 -168 ) ( 584 416 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 416 -152 ) ( 584 352 -152 ) ( 520 352 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 648 320 -152 ) ( 584 320 -152 ) ( 584 320 -200 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 288 -200 ) ( 584 312 -200 ) ( 584 312 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 560 288 -168 ) ( 568 288 -168 ) ( 568 288 -184 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 280 -168 ) ( 616 216 -168 ) ( 616 216 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4343 +{ +( 520 352 -176 ) ( 584 352 -176 ) ( 584 416 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 416 -168 ) ( 584 352 -168 ) ( 520 352 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 648 320 -160 ) ( 584 320 -160 ) ( 584 320 -208 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 288 -208 ) ( 584 312 -208 ) ( 584 312 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 560 288 -176 ) ( 568 288 -176 ) ( 568 288 -192 ) subway/1_tile_damage2 0 16 0 0.500000 0.500000 0 352321536 0 +( 616 280 -176 ) ( 616 216 -176 ) ( 616 216 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4344 +{ +( 520 352 -200 ) ( 584 352 -200 ) ( 584 416 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 416 -176 ) ( 584 352 -176 ) ( 520 352 -176 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 648 320 -184 ) ( 584 320 -184 ) ( 584 320 -232 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 288 -232 ) ( 584 312 -232 ) ( 584 312 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 560 288 -184 ) ( 568 288 -184 ) ( 568 288 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 616 280 -200 ) ( 616 216 -200 ) ( 616 216 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4345 +{ +( 584 192 -216 ) ( 584 256 -216 ) ( 520 256 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 520 256 -200 ) ( 584 256 -200 ) ( 584 192 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 584 288 -248 ) ( 584 288 -200 ) ( 648 288 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 584 296 -200 ) ( 584 296 -248 ) ( 584 320 -248 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 568 320 -216 ) ( 568 320 -200 ) ( 560 320 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 616 392 -200 ) ( 616 392 -216 ) ( 616 328 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4346 +{ +( -440 -72 -128 ) ( -440 -8 -128 ) ( -504 -8 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( -504 -8 -120 ) ( -440 -8 -120 ) ( -440 -72 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 328 -120 ) ( -408 328 -144 ) ( -416 320 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 480 -120 ) ( -416 480 -152 ) ( -416 512 -152 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -144 ) ( -408 744 -120 ) ( -416 752 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -120 ) ( -408 744 -144 ) ( -408 328 -144 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4347 +{ +( -408 328 -200 ) ( -408 328 -216 ) ( -184 328 -216 ) subway/1_tile_bottom 64 16 0 -0.500000 0.500000 0 318767104 0 +( -408 328 -216 ) ( -408 328 -200 ) ( -416 320 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -384 320 -184 ) ( -384 320 -216 ) ( -416 320 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -184 288 -216 ) ( -184 288 -184 ) ( -184 320 -184 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 144 232 -200 ) ( 144 296 -200 ) ( 208 296 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 208 296 -216 ) ( 144 296 -216 ) ( 144 232 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4348 +{ +( 208 296 -128 ) ( 144 296 -128 ) ( 144 232 -128 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 144 232 -120 ) ( 144 296 -120 ) ( 208 296 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( -184 288 -152 ) ( -184 288 -120 ) ( -184 320 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( -384 320 -120 ) ( -384 320 -152 ) ( -416 320 -152 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 328 -144 ) ( -408 328 -120 ) ( -416 320 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 328 -120 ) ( -408 328 -144 ) ( -184 328 -144 ) subway/1_tile_top 64 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 4349 +{ +( 352 752 -216 ) ( 352 752 -184 ) ( 96 752 -184 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -408 744 -200 ) ( -408 744 -216 ) ( -416 752 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -408 744 -216 ) ( -408 744 -200 ) ( -184 744 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -184 712 -216 ) ( -184 712 -184 ) ( -184 744 -184 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 144 656 -200 ) ( 144 720 -200 ) ( 208 720 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 208 720 -216 ) ( 144 720 -216 ) ( 144 656 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4350 +{ +( 208 720 -128 ) ( 144 720 -128 ) ( 144 656 -128 ) subway/1_tile_middle 0 8 0 0.500000 0.500000 0 318767104 0 +( 144 656 -120 ) ( 144 720 -120 ) ( 208 720 -120 ) subway/1_tile_middle 0 8 0 0.500000 0.500000 0 318767104 0 +( -184 712 -152 ) ( -184 712 -120 ) ( -184 744 -120 ) subway/1_tile_middle 0 8 0 0.500000 0.500000 0 318767104 0 +( -408 744 -144 ) ( -408 744 -120 ) ( -184 744 -120 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( -408 744 -120 ) ( -408 744 -144 ) ( -416 752 -144 ) subway/1_tile_middle 0 8 0 0.500000 0.500000 0 318767104 0 +( 360 752 -152 ) ( 360 752 -120 ) ( 104 752 -120 ) subway/1_tile_middle 0 8 0 0.500000 0.500000 0 318767104 0 +} +// brush 4351 +{ +( -192 312 -112 ) ( -192 752 -112 ) ( -184 752 -120 ) subway/1_tile_middle 0 8 0 0.500000 0.500000 0 318767104 0 +( -440 752 -96 ) ( -440 752 -80 ) ( -448 752 -80 ) subway/1_tile_middle 0 8 0 0.500000 0.500000 0 318767104 0 +( -416 472 -96 ) ( -416 472 -128 ) ( -416 504 -128 ) subway/1_tile_middle 0 8 0 0.500000 0.500000 0 318767104 0 +( -416 312 -128 ) ( -416 312 -96 ) ( -384 312 -96 ) subway/1_tile_middle 0 8 0 0.500000 0.500000 0 318767104 0 +( -192 752 -112 ) ( -192 312 -112 ) ( -384 312 -112 ) subway/1_tile_middle 0 8 0 0.500000 0.500000 0 318767104 0 +( -408 -80 -120 ) ( -408 -16 -120 ) ( -472 -16 -120 ) subway/con14 176 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4352 +{ +( 392 744 -184 ) ( 392 744 -152 ) ( 136 744 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -184 688 -152 ) ( -184 688 -136 ) ( -184 680 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -152 712 -152 ) ( -152 712 -184 ) ( -184 712 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -152 704 -184 ) ( -152 704 -152 ) ( -152 736 -152 ) subway/1_lobby1ac 0 0 0 0.500000 0.500000 0 285212672 0 +( 176 648 -152 ) ( 176 712 -152 ) ( 240 712 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 240 712 -184 ) ( 176 712 -184 ) ( 176 648 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4353 +{ +( -168 328 -40 ) ( -168 328 -88 ) ( -168 296 -88 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -168 328 -72 ) ( -168 328 -24 ) ( -200 328 -24 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -176 256 -40 ) ( -176 256 -72 ) ( -176 288 -72 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -192 288 -72 ) ( -192 288 -40 ) ( -160 288 -40 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -264 -32 -40 ) ( -200 -32 -40 ) ( -200 -96 -40 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -200 -96 -80 ) ( -200 -32 -80 ) ( -264 -32 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4354 +{ +( 208 680 -64 ) ( 208 680 -32 ) ( -112 680 -32 ) subway/1_lobby4 -64 32 0 1 1 0 285212672 0 +( -120 584 -32 ) ( -120 584 -16 ) ( -120 576 -16 ) subway/1_lobby4 112 32 0 1 1 0 285212672 0 +( 96 584 -32 ) ( 96 584 -64 ) ( -104 584 -64 ) subway/1_lobby4 -64 32 0 1 1 0 285212672 0 +( 88 648 -32 ) ( 88 648 -64 ) ( 88 640 -64 ) subway/1_beam1 0 32 0 0.500000 0.500000 0 16777216 0 +( 240 544 -24 ) ( 240 608 -24 ) ( 304 608 -24 ) subway/1_lobby4 -64 -96 0 1 1 0 285212672 0 +( 304 592 -32 ) ( 240 592 -32 ) ( 240 528 -32 ) subway/1_concrete_floor2 112 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4355 +{ +( 144 680 -80 ) ( 144 680 -48 ) ( -176 680 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( -184 584 -48 ) ( -184 584 -32 ) ( -184 576 -32 ) subway/1_lobby4 112 16 0 1 1 0 285212672 0 +( 32 584 -48 ) ( 32 584 -80 ) ( -168 584 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( -120 648 -48 ) ( -120 648 -80 ) ( -120 640 -80 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 176 544 -32 ) ( 176 608 -32 ) ( 240 608 -32 ) subway/1_lobby4 0 -96 0 1 1 0 285212672 0 +( 240 592 -48 ) ( 176 592 -48 ) ( 176 528 -48 ) subway/1_concrete_floor -16 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4356 +{ +( 304 400 -32 ) ( 240 400 -32 ) ( 240 336 -32 ) subway/1_concrete_floor2 112 16 0 0.500000 0.500000 0 285212672 0 +( 240 352 -24 ) ( 240 416 -24 ) ( 304 416 -24 ) subway/1_lobby4 -64 -288 0 1 1 0 285212672 0 +( 72 456 -32 ) ( 72 456 -64 ) ( 72 448 -64 ) subway/1_beam1 384 32 0 0.500000 0.500000 0 16777216 0 +( 96 392 -32 ) ( 96 392 -64 ) ( -104 392 -64 ) subway/1_lobby4 -64 32 0 1 1 0 285212672 0 +( -120 392 -32 ) ( -120 392 -16 ) ( -120 384 -16 ) subway/1_lobby4 304 32 0 1 1 0 285212672 0 +( 208 488 -64 ) ( 208 488 -32 ) ( -112 488 -32 ) subway/1_lobby4 -64 32 0 1 1 0 285212672 0 +} +// brush 4357 +{ +( 240 720 -48 ) ( 176 720 -48 ) ( 176 656 -48 ) subway/1_concrete_floor -16 16 0 0.500000 0.500000 0 285212672 0 +( 176 656 -32 ) ( 176 720 -32 ) ( 240 720 -32 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 136 752 -48 ) ( 136 752 -80 ) ( 136 744 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 24 680 -48 ) ( 24 680 -80 ) ( -176 680 -80 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( -184 696 -48 ) ( -184 696 -32 ) ( -184 688 -32 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 136 752 -80 ) ( 136 752 -48 ) ( -184 752 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +} +// brush 4358 +{ +( 400 680 -80 ) ( 400 680 -48 ) ( 80 680 -48 ) subway/1_lobby4 -256 16 0 1 1 0 285212672 0 +( 72 584 -40 ) ( 72 584 -24 ) ( 72 576 -24 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 288 584 -48 ) ( 288 584 -80 ) ( 88 584 -80 ) subway/1_lobby4 -256 16 0 1 1 0 285212672 0 +( 104 648 -48 ) ( 104 648 -80 ) ( 104 640 -80 ) subway/1_lobby4 112 16 0 1 1 0 285212672 0 +( 432 544 -32 ) ( 432 608 -32 ) ( 496 608 -32 ) subway/1_lobby4 -256 -96 0 1 1 0 285212672 0 +( 496 592 -48 ) ( 432 592 -48 ) ( 432 528 -48 ) subway/1_concrete_floor -528 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4359 +{ +( -168 392 -48 ) ( 152 392 -48 ) ( 152 392 -80 ) subway/1_lobby4 -8 16 0 1 1 0 285212672 0 +( -184 496 -32 ) ( -184 488 -32 ) ( -184 488 -48 ) subway/1_lobby4 368 16 0 1 1 0 285212672 0 +( -160 488 -80 ) ( 40 488 -80 ) ( 40 488 -48 ) subway/1_lobby4 -8 16 0 1 1 0 285212672 0 +( -120 432 -80 ) ( -120 424 -80 ) ( -120 424 -48 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 248 464 -32 ) ( 184 464 -32 ) ( 184 528 -32 ) subway/1_lobby4 -8 -352 0 1 1 0 285212672 0 +( 184 544 -48 ) ( 184 480 -48 ) ( 248 480 -48 ) subway/1_concrete_floor -16 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4360 +{ +( 144 584 -80 ) ( 144 584 -48 ) ( -176 584 -48 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( -184 520 -48 ) ( -184 520 -32 ) ( -184 512 -32 ) subway/1_lobby4 176 16 0 1 1 0 285212672 0 +( 24 488 -48 ) ( 24 488 -80 ) ( -176 488 -80 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 136 576 -48 ) ( 136 576 -80 ) ( 136 568 -80 ) subway/1_lobby4 176 16 0 1 1 0 285212672 0 +( 176 480 -32 ) ( 176 544 -32 ) ( 240 544 -32 ) subway/1_lobby4 0 -160 0 1 1 0 285212672 0 +( 240 560 -48 ) ( 176 560 -48 ) ( 176 496 -48 ) subway/1_concrete_floor -16 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4361 +{ +( -176 272 -48 ) ( 144 272 -48 ) ( 144 272 -80 ) subway/1_lobby4 -8 16 0 1 1 0 285212672 0 +( -184 384 -32 ) ( -184 376 -32 ) ( -184 376 -48 ) subway/1_lobby4 256 16 0 1 1 0 285212672 0 +( -168 392 -72 ) ( 32 392 -72 ) ( 32 392 -40 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 144 328 -80 ) ( 144 320 -80 ) ( 144 320 -48 ) subway/1_lobby4 256 16 0 1 1 0 285212672 0 +( 248 352 -32 ) ( 184 352 -32 ) ( 184 416 -32 ) subway/1_lobby4 -8 -240 0 1 1 0 285212672 0 +( 184 416 -48 ) ( 184 352 -48 ) ( 248 352 -48 ) subway/1_concrete_floor -16 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4362 +{ +( 136 752 -80 ) ( 136 752 -48 ) ( -184 752 -48 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( -184 696 -48 ) ( -184 696 -32 ) ( -184 688 -32 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 16 744 -48 ) ( 16 744 -80 ) ( -184 744 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 136 752 -48 ) ( 136 752 -80 ) ( 136 744 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 176 656 -48 ) ( 176 720 -48 ) ( 240 720 -48 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 240 720 -80 ) ( 176 720 -80 ) ( 176 656 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4363 +{ +( 392 552 -120 ) ( 392 552 -88 ) ( 136 552 -88 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( -184 496 -88 ) ( -184 496 -72 ) ( -184 488 -72 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( -152 520 -88 ) ( -152 520 -120 ) ( -184 520 -120 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( -152 520 -120 ) ( -152 520 -88 ) ( -152 552 -88 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( 176 456 -80 ) ( 176 520 -80 ) ( 240 520 -80 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( 240 520 -120 ) ( 176 520 -120 ) ( 176 456 -120 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4364 +{ +( -200 -96 -216 ) ( -200 -32 -216 ) ( -264 -32 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -264 -32 -184 ) ( -200 -32 -184 ) ( -200 -96 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -200 288 -216 ) ( -200 288 -184 ) ( -168 288 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -176 256 -184 ) ( -176 256 -216 ) ( -176 288 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -224 328 -184 ) ( -224 328 -168 ) ( -232 328 -168 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -168 -248 -216 ) ( -168 -248 -184 ) ( -168 8 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4365 +{ +( -200 -96 -184 ) ( -200 -32 -184 ) ( -264 -32 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -264 -32 -152 ) ( -200 -32 -152 ) ( -200 -96 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -200 288 -184 ) ( -200 288 -152 ) ( -168 288 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -176 256 -152 ) ( -176 256 -184 ) ( -176 288 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -224 328 -152 ) ( -224 328 -136 ) ( -232 328 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -168 -248 -184 ) ( -168 -248 -152 ) ( -168 8 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4366 +{ +( -168 -248 -152 ) ( -168 -248 -120 ) ( -168 8 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -224 328 -120 ) ( -224 328 -104 ) ( -232 328 -104 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -176 256 -120 ) ( -176 256 -152 ) ( -176 288 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -192 288 -152 ) ( -192 288 -120 ) ( -160 288 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -264 -32 -120 ) ( -200 -32 -120 ) ( -200 -96 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -200 -96 -152 ) ( -200 -32 -152 ) ( -264 -32 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4367 +{ +( 240 712 -216 ) ( 176 712 -216 ) ( 176 648 -216 ) subway/1_lobby1 0 -48 0 0.500000 0.500000 0 285212672 0 +( 176 648 -184 ) ( 176 712 -184 ) ( 240 712 -184 ) subway/1_lobby1 0 -48 0 0.500000 0.500000 0 285212672 0 +( -152 704 -216 ) ( -152 704 -184 ) ( -152 736 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -152 712 -184 ) ( -152 712 -216 ) ( -184 712 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -184 688 -184 ) ( -184 688 -168 ) ( -184 680 -168 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 392 744 -216 ) ( 392 744 -184 ) ( 136 744 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4368 +{ +( -440 -72 -216 ) ( -440 -8 -216 ) ( -504 -8 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -504 -8 -200 ) ( -440 -8 -200 ) ( -440 -72 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -408 328 -200 ) ( -408 328 -216 ) ( -416 320 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -416 480 -184 ) ( -416 480 -216 ) ( -416 512 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -408 744 -216 ) ( -408 744 -200 ) ( -416 752 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( -408 744 -200 ) ( -408 744 -216 ) ( -408 328 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4369 +{ +( 392 744 -152 ) ( 392 744 -120 ) ( 136 744 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -184 688 -120 ) ( -184 688 -104 ) ( -184 680 -104 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -152 712 -120 ) ( -152 712 -152 ) ( -184 712 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -152 712 -152 ) ( -152 712 -120 ) ( -152 744 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 176 648 -120 ) ( 176 712 -120 ) ( 240 712 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 240 712 -152 ) ( 176 712 -152 ) ( 176 648 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4370 +{ +( -192 712 -112 ) ( -192 360 -112 ) ( -184 360 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 168 480 -80 ) ( 168 544 -80 ) ( 232 544 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( -184 368 -120 ) ( -184 368 -88 ) ( -184 400 -88 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( -160 360 -88 ) ( -160 360 -120 ) ( -192 360 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( -192 360 -112 ) ( -192 712 -112 ) ( -192 712 -72 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 384 712 -120 ) ( 384 712 -88 ) ( 128 712 -88 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +} +// brush 4371 +{ +( 240 520 -152 ) ( 176 520 -152 ) ( 176 456 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 176 456 -120 ) ( 176 520 -120 ) ( 240 520 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -152 520 -152 ) ( -152 520 -120 ) ( -152 552 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -152 520 -120 ) ( -152 520 -152 ) ( -184 520 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -184 496 -120 ) ( -184 496 -104 ) ( -184 488 -104 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 392 552 -152 ) ( 392 552 -120 ) ( 136 552 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4372 +{ +( 240 720 -216 ) ( 176 720 -216 ) ( 176 656 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 176 656 -184 ) ( 176 720 -184 ) ( 240 720 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 136 752 -184 ) ( 136 752 -216 ) ( 136 744 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 16 744 -184 ) ( 16 744 -216 ) ( -184 744 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -184 696 -184 ) ( -184 696 -168 ) ( -184 688 -168 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 136 752 -216 ) ( 136 752 -184 ) ( -184 752 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4373 +{ +( 384 720 -184 ) ( 320 720 -184 ) ( 320 656 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 320 656 -152 ) ( 320 720 -152 ) ( 384 720 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( -8 744 -152 ) ( -8 744 -184 ) ( -8 736 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 160 744 -152 ) ( 160 744 -184 ) ( -40 744 -184 ) subway/1_lobby1ae 16 16 0 0.500000 0.500000 0 285212672 0 +( -40 696 -152 ) ( -40 696 -136 ) ( -40 688 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 224 752 -184 ) ( 224 752 -152 ) ( -96 752 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4374 +{ +( 240 720 -152 ) ( 176 720 -152 ) ( 176 656 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 176 656 -120 ) ( 176 720 -120 ) ( 240 720 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 136 752 -120 ) ( 136 752 -152 ) ( 136 744 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 16 744 -120 ) ( 16 744 -152 ) ( -184 744 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( -184 696 -120 ) ( -184 696 -104 ) ( -184 688 -104 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 136 752 -152 ) ( 136 752 -120 ) ( -184 752 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4375 +{ +( 1168 -16 -216 ) ( 1104 -16 -216 ) ( 1104 -80 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1104 -80 -184 ) ( 1104 -16 -184 ) ( 1168 -16 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 16 -184 ) ( 872 16 -216 ) ( 872 8 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 920 8 -184 ) ( 920 8 -216 ) ( 720 8 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 808 -40 -184 ) ( 808 -40 -168 ) ( 808 -48 -168 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 16 -216 ) ( 872 16 -184 ) ( 808 16 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4376 +{ +( 1168 -16 -184 ) ( 1104 -16 -184 ) ( 1104 -80 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 1104 -80 -152 ) ( 1104 -16 -152 ) ( 1168 -16 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 872 16 -152 ) ( 872 16 -184 ) ( 872 8 -184 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 920 8 -152 ) ( 920 8 -184 ) ( 720 8 -184 ) subway/1_lobby1ac 48 -8 0 0.500000 0.500000 0 285212672 0 +( 808 -40 -152 ) ( 808 -40 -136 ) ( 808 -48 -136 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +( 872 16 -184 ) ( 872 16 -152 ) ( 808 16 -152 ) subway/1_lobby1a 0 -16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4377 +{ +( 1168 -16 -152 ) ( 1104 -16 -152 ) ( 1104 -80 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 1104 -80 -120 ) ( 1104 -16 -120 ) ( 1168 -16 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 16 -120 ) ( 872 16 -152 ) ( 872 8 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 920 8 -120 ) ( 920 8 -152 ) ( 720 8 -152 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 808 -40 -120 ) ( 808 -40 -104 ) ( 808 -48 -104 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 16 -152 ) ( 872 16 -120 ) ( 808 16 -120 ) subway/1_lobby2 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4378 +{ +( 1168 -16 -120 ) ( 1104 -16 -120 ) ( 1104 -80 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 1104 -80 -80 ) ( 1104 -16 -80 ) ( 1168 -16 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 872 16 -80 ) ( 872 16 -120 ) ( 872 8 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 848 8 -80 ) ( 848 8 -120 ) ( 648 8 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 808 -40 -88 ) ( 808 -40 -72 ) ( 808 -48 -72 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 968 16 -120 ) ( 968 16 -80 ) ( 808 16 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +} +// brush 4379 +{ +( 968 16 -80 ) ( 968 16 -48 ) ( 808 16 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 808 -40 -48 ) ( 808 -40 -32 ) ( 808 -48 -32 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 848 8 -48 ) ( 848 8 -80 ) ( 648 8 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 872 16 -48 ) ( 872 16 -80 ) ( 872 8 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 1104 -80 -48 ) ( 1104 -16 -48 ) ( 1168 -16 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 1168 -16 -80 ) ( 1104 -16 -80 ) ( 1104 -80 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +} +// brush 4380 +{ +( 968 296 -224 ) ( 904 296 -224 ) ( 904 232 -224 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 904 192 -216 ) ( 904 256 -216 ) ( 968 256 -216 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 872 48 -232 ) ( 872 48 -224 ) ( 872 112 -224 ) subway/1_lobby_floor 752 16 0 0.500000 0.500000 0 285212672 0 +( 792 -304 -224 ) ( 792 -304 -216 ) ( 856 -304 -216 ) subway/1_lobby_floor 432 16 0 0.500000 0.500000 0 285212672 0 +( 616 560 -224 ) ( 616 560 -216 ) ( 616 496 -216 ) subway/1_lobby_floor 752 16 0 0.500000 0.500000 0 285212672 0 +( 1024 -120 -224 ) ( 1024 -120 -216 ) ( 960 -120 -216 ) subway/1_lobby_floor 432 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4381 +{ +( 776 216 -184 ) ( 776 216 -200 ) ( 776 280 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 824 288 -200 ) ( 824 288 -184 ) ( 832 288 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 808 312 -184 ) ( 808 312 -232 ) ( 808 288 -232 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 808 320 -232 ) ( 808 320 -184 ) ( 744 320 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 352 -176 ) ( 808 352 -176 ) ( 808 416 -176 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 808 416 -200 ) ( 808 352 -200 ) ( 872 352 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4382 +{ +( 712 -24 -216 ) ( 648 -24 -216 ) ( 648 -88 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 648 -88 -200 ) ( 648 -24 -200 ) ( 712 -24 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 616 -24 -248 ) ( 616 -24 -200 ) ( 616 40 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 608 -24 -200 ) ( 608 -24 -248 ) ( 584 -24 -248 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 584 -40 -216 ) ( 584 -40 -200 ) ( 584 -48 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 512 8 -200 ) ( 512 8 -216 ) ( 576 8 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4383 +{ +( 712 -24 -176 ) ( 648 -24 -176 ) ( 648 -88 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 648 -88 -168 ) ( 648 -24 -168 ) ( 712 -24 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 616 -24 -208 ) ( 616 -24 -160 ) ( 616 40 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 608 -24 -160 ) ( 608 -24 -208 ) ( 584 -24 -208 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 -40 -192 ) ( 584 -40 -176 ) ( 584 -48 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 512 8 -160 ) ( 512 8 -176 ) ( 576 8 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4384 +{ +( 712 -24 -200 ) ( 648 -24 -200 ) ( 648 -88 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 648 -88 -176 ) ( 648 -24 -176 ) ( 712 -24 -176 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 616 -24 -232 ) ( 616 -24 -184 ) ( 616 40 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 608 -24 -184 ) ( 608 -24 -232 ) ( 584 -24 -232 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -40 -200 ) ( 584 -40 -184 ) ( 584 -48 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 512 8 -184 ) ( 512 8 -200 ) ( 576 8 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4385 +{ +( 712 -24 -168 ) ( 648 -24 -168 ) ( 648 -88 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 648 -88 -152 ) ( 648 -24 -152 ) ( 712 -24 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -24 -200 ) ( 616 -24 -152 ) ( 616 40 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 608 -24 -152 ) ( 608 -24 -200 ) ( 584 -24 -200 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -40 -184 ) ( 584 -40 -168 ) ( 584 -48 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 512 8 -152 ) ( 512 8 -168 ) ( 576 8 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4386 +{ +( 624 8 -152 ) ( 688 8 -152 ) ( 688 8 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 640 8 -112 ) ( 616 8 -152 ) ( 616 -24 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 616 -24 -184 ) ( 592 -24 -184 ) ( 592 -24 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 40 -136 ) ( 584 -24 -136 ) ( 584 -24 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 592 0 -112 ) ( 640 0 -112 ) ( 640 -32 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 -24 -152 ) ( 616 -24 -152 ) ( 616 8 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4387 +{ +( 704 8 -160 ) ( 704 8 -176 ) ( 768 8 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 776 -40 -192 ) ( 776 -40 -176 ) ( 776 -48 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 800 -24 -160 ) ( 800 -24 -208 ) ( 776 -24 -208 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 -24 -208 ) ( 808 -24 -160 ) ( 808 40 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 840 -88 -168 ) ( 840 -24 -168 ) ( 904 -24 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 904 -24 -176 ) ( 840 -24 -176 ) ( 840 -88 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4388 +{ +( 704 8 -152 ) ( 704 8 -168 ) ( 768 8 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 776 -40 -184 ) ( 776 -40 -168 ) ( 776 -48 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 800 -24 -152 ) ( 800 -24 -200 ) ( 776 -24 -200 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 808 -24 -200 ) ( 808 -24 -152 ) ( 808 40 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 840 -88 -152 ) ( 840 -24 -152 ) ( 904 -24 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 904 -24 -168 ) ( 840 -24 -168 ) ( 840 -88 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4389 +{ +( 704 8 -184 ) ( 704 8 -200 ) ( 768 8 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 776 -40 -200 ) ( 776 -40 -184 ) ( 776 -48 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 800 -24 -184 ) ( 800 -24 -232 ) ( 776 -24 -232 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 808 -24 -232 ) ( 808 -24 -184 ) ( 808 40 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 -88 -176 ) ( 840 -24 -176 ) ( 904 -24 -176 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 904 -24 -200 ) ( 840 -24 -200 ) ( 840 -88 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4390 +{ +( 704 8 -200 ) ( 704 8 -216 ) ( 768 8 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 776 -40 -216 ) ( 776 -40 -200 ) ( 776 -48 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 800 -24 -200 ) ( 800 -24 -248 ) ( 776 -24 -248 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 808 -24 -248 ) ( 808 -24 -200 ) ( 808 40 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 840 -88 -200 ) ( 840 -24 -200 ) ( 904 -24 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 904 -24 -216 ) ( 840 -24 -216 ) ( 840 -88 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4391 +{ +( 440 304 -128 ) ( 440 296 -128 ) ( 680 296 -128 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 440 304 -96 ) ( 680 264 -96 ) ( 680 224 -96 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 136 288 -128 ) ( 136 304 -128 ) ( 136 304 -96 ) subway/1_tile_middle 1360 0 0 0.500000 0.500000 0 318767104 0 +( 544 264 -96 ) ( 544 296 -128 ) ( 304 296 -128 ) subway/1_tile_middle 544 784 0 0.500000 0.500000 0 318767104 0 +( 584 264 -96 ) ( 584 304 -96 ) ( 584 304 -112 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 560 304 -112 ) ( 656 304 -112 ) ( 656 304 -96 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 626 344 -112 ) ( 616 344 -112 ) ( 616 272 -112 ) subway/1_tile_middle 32 -1344 0 0.500000 0.500000 0 318767104 0 +} +// brush 4392 +{ +( 576 304 -128 ) ( 656 304 -128 ) ( 656 304 -112 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 584 280 -112 ) ( 584 304 -112 ) ( 584 304 -128 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 544 264 -96 ) ( 544 296 -128 ) ( 304 296 -128 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 136 288 -128 ) ( 136 304 -128 ) ( 136 304 -96 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 440 304 -112 ) ( 680 264 -112 ) ( 680 224 -112 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 440 304 -128 ) ( 440 296 -128 ) ( 680 296 -128 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +} +// brush 4393 +{ +( 592 304 -216 ) ( 656 304 -216 ) ( 656 304 -200 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +( 584 296 -200 ) ( 584 304 -200 ) ( 584 304 -216 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( -8 296 -216 ) ( -8 296 -200 ) ( 128 296 -200 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +( 136 296 -216 ) ( 136 304 -216 ) ( 136 304 -200 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( 456 296 -200 ) ( 520 296 -200 ) ( 520 232 -200 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 520 232 -216 ) ( 520 296 -216 ) ( 456 296 -216 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +} +// brush 4394 +{ +( 320 784 -152 ) ( 320 784 -80 ) ( 192 720 -80 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 192 712 -80 ) ( 192 712 -152 ) ( 192 720 -152 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 320 776 -80 ) ( 320 776 -152 ) ( 192 712 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 11 +( 320 776 -152 ) ( 320 776 -80 ) ( 320 784 -80 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 320 784 -80 ) ( 320 776 -80 ) ( 192 712 -80 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 320 776 -152 ) ( 320 784 -152 ) ( 192 720 -152 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 160 784 0 ) ( 232 712 0 ) ( 232 712 10 ) subway/1_tile_middle 1360 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4395 +{ +( 160 784 -72 ) ( 232 712 -72 ) ( 232 712 -62 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( 320 776 -168 ) ( 320 784 -168 ) ( 192 720 -168 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 320 784 -152 ) ( 320 776 -152 ) ( 192 712 -152 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 320 776 -168 ) ( 320 776 -96 ) ( 320 784 -96 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( 320 776 -96 ) ( 320 776 -168 ) ( 192 712 -168 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +( 192 712 -96 ) ( 192 712 -168 ) ( 192 720 -168 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( 320 784 -168 ) ( 320 784 -96 ) ( 192 720 -96 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4396 +{ +( 224 752 -152 ) ( 160 624 -152 ) ( 160 624 -224 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( 224 752 -168 ) ( 232 752 -168 ) ( 232 752 -96 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +( 232 752 -168 ) ( 168 624 -168 ) ( 168 624 -96 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 11 +( 160 624 -96 ) ( 168 624 -96 ) ( 168 624 -168 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +( 232 752 -152 ) ( 168 624 -152 ) ( 160 624 -152 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 224 752 -168 ) ( 160 624 -168 ) ( 168 624 -168 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 232 712 -62 ) ( 232 712 -72 ) ( 160 784 -72 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4397 +{ +( 232 712 10 ) ( 232 712 0 ) ( 160 784 0 ) subway/1_tile_middle 1360 130 0 0.500000 -0.500000 0 318767104 0 +( 224 752 -152 ) ( 160 624 -152 ) ( 168 624 -152 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 232 752 -80 ) ( 168 624 -80 ) ( 160 624 -80 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 160 624 -80 ) ( 168 624 -80 ) ( 168 624 -152 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 232 752 -152 ) ( 168 624 -152 ) ( 168 624 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 11 +( 224 752 -152 ) ( 232 752 -152 ) ( 232 752 -80 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 224 752 -80 ) ( 160 624 -80 ) ( 160 624 -152 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4398 +{ +( 224 752 -64 ) ( 200 704 -64 ) ( 200 704 -80 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 248 752 -64 ) ( 224 752 -64 ) ( 224 752 -80 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 232 752 -80 ) ( 208 704 -80 ) ( 224 704 -64 ) subway/1_tile 0 13 64 0.500000 0.500000 0 318767104 11 +( 216 704 -80 ) ( 200 704 -80 ) ( 200 704 -48 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 248 752 -64 ) ( 224 704 -64 ) ( 200 704 -64 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 224 752 -80 ) ( 200 704 -80 ) ( 208 704 -80 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 232 712 10 ) ( 232 712 0 ) ( 160 784 0 ) subway/1_tile_middle 1360 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4399 +{ +( 160 784 0 ) ( 232 712 0 ) ( 232 712 10 ) subway/1_tile -1440 -597 -27 0.500000 0.500000 0 318767104 0 +( 240 736 -80 ) ( 240 744 -80 ) ( 192 720 -80 ) subway/1_tile -3198 -1192 -27 0.500000 0.500000 0 318767104 0 +( 240 744 -64 ) ( 240 720 -64 ) ( 192 696 -64 ) subway/1_tile -3198 -1192 -27 0.500000 0.500000 0 318767104 0 +( 240 744 -48 ) ( 240 744 -80 ) ( 240 728 -80 ) subway/1_tile -1440 -597 -27 0.500000 0.500000 0 318767104 0 +( 240 720 -64 ) ( 240 736 -80 ) ( 192 712 -80 ) subway/1_tile -610 -14 26 0.500000 0.500000 0 318767104 11 +( 192 720 -80 ) ( 192 720 -64 ) ( 192 696 -64 ) subway/1_tile -1440 -597 -27 0.500000 0.500000 0 318767104 0 +( 240 744 -80 ) ( 240 744 -64 ) ( 192 720 -64 ) subway/1_tile -2595 -9 -27 0.500000 0.500000 0 318767104 0 +} +// brush 4400 +{ +( 160 784 0 ) ( 224 720 0 ) ( 224 720 10 ) subway/1_tile_middle 1360 130 0 0.500000 -0.500000 0 318767104 0 +( 256 728 -64 ) ( 256 752 -64 ) ( 192 720 -64 ) subway/1_tile_middle 32 -1344 0 0.500000 0.500000 0 318767104 0 +( 256 752 -64 ) ( 256 752 -48 ) ( 192 720 -48 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 192 720 -64 ) ( 192 720 -48 ) ( 192 680 -48 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 256 712 -48 ) ( 256 728 -64 ) ( 192 696 -64 ) subway/1_tile_middle -610 -36 26 0.500000 0.500000 0 318767104 11 +( 256 752 -48 ) ( 256 752 -80 ) ( 256 736 -80 ) subway/1_tile_middle 1360 0 0 0.500000 0.500000 0 318767104 0 +( 256 752 -48 ) ( 256 712 -48 ) ( 192 680 -48 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 104 712 -80 ) ( 344 712 -80 ) ( 344 720 -80 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +} +// brush 4401 +{ +( 224 600 -80 ) ( 232 600 -80 ) ( 232 840 -80 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 264 752 -48 ) ( 232 688 -48 ) ( 192 688 -48 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 208 688 -80 ) ( 192 688 -80 ) ( 192 688 -48 ) subway/1_tile_middle 32 0 0 0.500000 0.500000 0 318767104 0 +( 248 752 -64 ) ( 216 688 -64 ) ( 232 688 -48 ) subway/1_tile_middle 0 -10 64 0.500000 0.500000 0 318767104 11 +( 264 752 -48 ) ( 224 752 -48 ) ( 224 752 -64 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 224 752 -48 ) ( 192 688 -48 ) ( 192 688 -64 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 224 752 -64 ) ( 192 688 -64 ) ( 216 688 -64 ) subway/1_tile_middle 32 -1344 0 0.500000 0.500000 0 318767104 0 +( 224 720 10 ) ( 224 720 0 ) ( 160 784 0 ) subway/1_tile_middle 1360 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4402 +{ +( 392 776 -80 ) ( 392 536 -80 ) ( 400 536 -80 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 400 752 -48 ) ( 280 512 -48 ) ( 240 512 -48 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 280 512 -48 ) ( 280 512 -80 ) ( 264 512 -80 ) subway/1_tile_middle 32 0 0 0.500000 0.500000 0 318767104 0 +( 360 752 -48 ) ( 240 512 -48 ) ( 256 512 -64 ) subway/1_tile_middle 0 14 64 0.500000 0.500000 0 318767104 12 +( 376 752 -64 ) ( 400 752 -64 ) ( 400 752 -48 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 400 752 -64 ) ( 280 512 -64 ) ( 280 512 -48 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 376 752 -64 ) ( 256 512 -64 ) ( 280 512 -64 ) subway/1_tile_middle 32 -1344 0 0.500000 0.500000 0 318767104 0 +( 216 728 10 ) ( 216 728 0 ) ( 160 784 0 ) subway/1_tile_bottom 1872 2096 0 0.500000 0.500000 0 318767104 0 +} +// brush 4403 +{ +( 400 752 -80 ) ( 280 512 -80 ) ( 280 512 -64 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 392 752 -80 ) ( 400 752 -80 ) ( 400 752 -64 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 376 752 -64 ) ( 256 512 -64 ) ( 272 512 -80 ) subway/1_tile 0 13 64 0.500000 0.500000 0 318767104 12 +( 280 512 -48 ) ( 280 512 -80 ) ( 264 512 -80 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 400 752 -64 ) ( 280 512 -64 ) ( 256 512 -64 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 392 752 -80 ) ( 272 512 -80 ) ( 280 512 -80 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 216 728 10 ) ( 216 728 0 ) ( 160 784 0 ) subway/1_tile_bottom 1872 2096 0 0.500000 0.500000 0 318767104 0 +} +// brush 4404 +{ +( 400 752 -152 ) ( 280 512 -152 ) ( 280 512 -80 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 392 752 -152 ) ( 400 752 -152 ) ( 400 752 -80 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 392 752 -80 ) ( 272 512 -80 ) ( 272 512 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 12 +( 280 512 -80 ) ( 280 512 -152 ) ( 272 512 -152 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 400 752 -80 ) ( 280 512 -80 ) ( 272 512 -80 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 392 752 -152 ) ( 272 512 -152 ) ( 280 512 -152 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 216 728 10 ) ( 216 728 0 ) ( 160 784 0 ) subway/1_tile_bottom 1872 2096 0 0.500000 0.500000 0 318767104 0 +} +// brush 4405 +{ +( 400 752 -168 ) ( 280 512 -168 ) ( 280 512 -152 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( 392 752 -168 ) ( 400 752 -168 ) ( 400 752 -152 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +( 392 752 -152 ) ( 272 512 -152 ) ( 272 512 -168 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 12 +( 280 512 -152 ) ( 280 512 -168 ) ( 272 512 -168 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +( 400 752 -152 ) ( 280 512 -152 ) ( 272 512 -152 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 392 752 -168 ) ( 272 512 -168 ) ( 280 512 -168 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 224 720 10 ) ( 224 720 0 ) ( 160 784 0 ) subway/1_tile_bottom 1872 2096 0 0.500000 0.500000 0 318767104 0 +} +// brush 4406 +{ +( 160 784 0 ) ( 224 720 0 ) ( 224 720 10 ) subway/1_tile_bottom 1872 2096 0 0.500000 0.500000 0 318767104 0 +( 432 664 -168 ) ( 432 672 -168 ) ( 192 552 -168 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 432 672 -152 ) ( 432 664 -152 ) ( 192 544 -152 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 432 672 -168 ) ( 432 664 -168 ) ( 432 664 -152 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( 432 672 -168 ) ( 432 672 -152 ) ( 192 552 -152 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 12 +( 192 544 -152 ) ( 192 544 -168 ) ( 192 552 -168 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( 432 664 -152 ) ( 432 664 -168 ) ( 192 544 -168 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4407 +{ +( 160 784 0 ) ( 216 728 0 ) ( 216 728 10 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 432 664 -152 ) ( 432 672 -152 ) ( 192 552 -152 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 432 672 -80 ) ( 432 664 -80 ) ( 192 544 -80 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 432 672 -152 ) ( 432 664 -152 ) ( 432 664 -80 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 432 672 -152 ) ( 432 672 -80 ) ( 192 552 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 12 +( 192 544 -80 ) ( 192 544 -152 ) ( 192 552 -152 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 432 664 -80 ) ( 432 664 -152 ) ( 192 544 -152 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4408 +{ +( 160 784 0 ) ( 216 728 0 ) ( 216 728 10 ) subway/1_tile_bottom 1872 2096 0 0.500000 0.500000 0 318767104 0 +( 432 664 -80 ) ( 432 672 -80 ) ( 192 552 -80 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 432 688 -64 ) ( 432 664 -64 ) ( 192 544 -64 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 432 680 -80 ) ( 432 664 -80 ) ( 432 664 -48 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 432 672 -80 ) ( 432 688 -64 ) ( 192 568 -64 ) subway/1_tile -610 -14 26 0.500000 0.500000 0 318767104 12 +( 192 544 -64 ) ( 192 544 -80 ) ( 192 552 -80 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 432 664 -64 ) ( 432 664 -80 ) ( 192 544 -80 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4409 +{ +( 160 784 0 ) ( 216 728 0 ) ( 216 728 10 ) subway/1_tile_bottom 1872 2096 0 0.500000 0.500000 0 318767104 0 +( 432 664 -64 ) ( 432 688 -64 ) ( 192 568 -64 ) subway/1_tile_middle 32 -1344 0 0.500000 0.500000 0 318767104 0 +( 432 664 -48 ) ( 432 664 -64 ) ( 192 544 -64 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 192 544 -48 ) ( 192 544 -64 ) ( 192 568 -64 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 432 688 -64 ) ( 432 704 -48 ) ( 192 584 -48 ) subway/1_tile_middle -610 -14 26 0.500000 0.500000 0 318767104 12 +( 432 680 -80 ) ( 432 664 -80 ) ( 432 664 -48 ) subway/1_tile_middle 1360 0 0 0.500000 0.500000 0 318767104 0 +( 432 704 -48 ) ( 432 664 -48 ) ( 192 544 -48 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 408 544 -80 ) ( 408 552 -80 ) ( 168 552 -80 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +} +// brush 4410 +{ +( -88 152 -224 ) ( -88 152 -216 ) ( -88 216 -216 ) subway/1_concrete_floor -1440 -320 0 0.500000 0.500000 0 285212672 0 +( 1056 328 -224 ) ( 1056 328 -216 ) ( 992 328 -216 ) subway/1_stair_side1 1616 -320 0 0.500000 0.500000 0 285212672 0 +( -176 520 -232 ) ( -176 520 -224 ) ( -176 456 -224 ) subway/1_concrete_floor -1440 -320 0 0.500000 0.500000 0 285212672 0 +( 472 288 -224 ) ( 472 288 -216 ) ( 536 288 -216 ) subway/1_stair_side1 1216 0 0 0.500000 0.500000 0 285212672 0 +( 608 200 -216 ) ( 672 200 -216 ) ( 672 136 -216 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 688 128 -224 ) ( 688 192 -224 ) ( 624 192 -224 ) subway/1_concrete_floor -176 -352 0 0.500000 0.500000 0 285212672 0 +} +// brush 4411 +{ +( 424 104 -200 ) ( 424 104 -216 ) ( 360 104 -216 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +( 296 136 -216 ) ( 296 136 -200 ) ( 296 144 -200 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( 8 136 -200 ) ( -128 136 -200 ) ( -128 136 -216 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +( 264 128 -200 ) ( 264 128 -216 ) ( 264 136 -216 ) subway/1_tile_bottom 1368 16 0 0.500000 0.500000 0 318767104 0 +( 608 200 -200 ) ( 608 136 -200 ) ( 544 136 -200 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +( 544 136 -216 ) ( 608 136 -216 ) ( 608 200 -216 ) subway/1_tile_bottom 40 -1344 0 0.500000 0.500000 0 318767104 0 +} +// brush 4412 +{ +( 424 104 -128 ) ( 424 104 -200 ) ( 360 104 -200 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 296 136 -200 ) ( 296 136 -128 ) ( 296 144 -128 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 56 136 -96 ) ( -80 136 -96 ) ( -80 136 -200 ) subway/1_tile 32 -16 0 -0.500000 0.500000 0 318767104 0 +( 264 128 -128 ) ( 264 128 -200 ) ( 264 136 -200 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 608 200 -120 ) ( 608 136 -120 ) ( 544 136 -120 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 544 136 -168 ) ( 608 136 -168 ) ( 608 200 -168 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +} +// brush 4413 +{ +( 656 128 -112 ) ( 656 128 -128 ) ( 576 128 -128 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 584 128 -128 ) ( 584 128 -112 ) ( 584 152 -112 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 312 136 -128 ) ( 552 136 -128 ) ( 552 168 -96 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 136 128 -96 ) ( 136 128 -128 ) ( 136 144 -128 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 680 208 -112 ) ( 680 168 -112 ) ( 440 128 -112 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 680 136 -128 ) ( 440 136 -128 ) ( 440 128 -128 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +} +// brush 4414 +{ +( 680 136 -128 ) ( 440 136 -128 ) ( 440 128 -128 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 680 208 -96 ) ( 680 168 -96 ) ( 440 128 -96 ) subway/1_tile -2592 -1392 0 0.500000 0.500000 0 318767104 0 +( 136 128 -96 ) ( 136 128 -128 ) ( 136 144 -128 ) subway/1_tile_middle 1360 0 0 0.500000 0.500000 0 318767104 0 +( 312 136 -128 ) ( 552 136 -128 ) ( 552 168 -96 ) subway/1_tile_middle 544 784 0 0.500000 0.500000 0 318767104 0 +( 584 128 -112 ) ( 584 128 -96 ) ( 584 168 -96 ) subway/1_tile -1264 -32 0 0.500000 0.500000 0 318767104 0 +( 656 128 -96 ) ( 656 128 -112 ) ( 560 128 -112 ) subway/1_tile -2592 -32 0 0.500000 0.500000 0 318767104 0 +( 616 160 -112 ) ( 616 88 -112 ) ( 626 88 -112 ) subway/1_tile_middle 32 -1344 0 0.500000 0.500000 0 318767104 0 +} +// brush 4415 +{ +( 392 752 -176 ) ( 392 752 -168 ) ( 328 752 -168 ) subway/1_concrete_floor -3200 -320 0 0.500000 0.500000 0 285212672 0 +( 136 1272 -176 ) ( 136 1272 -168 ) ( 136 1208 -168 ) subway/1_stair_side1 2016 -320 0 0.500000 0.500000 0 285212672 0 +( 200 544 -184 ) ( 200 544 -176 ) ( 264 544 -176 ) subway/1_concrete_floor -3200 -320 0 0.500000 0.500000 0 285212672 0 +( 400 688 -176 ) ( 400 688 -168 ) ( 400 752 -168 ) subway/1_concrete_floor 2016 -320 0 0.500000 0.500000 0 285212672 0 +( 328 824 -168 ) ( 328 888 -168 ) ( 392 888 -168 ) subway/1_concrete_floor 944 2512 0 0.500000 0.500000 0 285212672 0 +( 392 904 -176 ) ( 328 904 -176 ) ( 328 840 -176 ) subway/1_concrete_floor 224 1408 0 0.500000 0.500000 0 285212672 0 +} +// brush 4416 +{ +( 224 840 -48 ) ( 224 840 -40 ) ( 224 776 -40 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 656 752 -48 ) ( 656 752 -40 ) ( 720 752 -40 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 400 664 -48 ) ( 400 664 -40 ) ( 400 728 -40 ) subway/1_concrete_floor -2672 -320 0 0.500000 0.500000 0 285212672 0 +( 704 968 -40 ) ( 520 968 -40 ) ( 520 968 -48 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 512 832 -32 ) ( 696 832 -32 ) ( 696 632 -32 ) subway/1_concrete_floor 944 2560 0 0.500000 0.500000 0 285212672 0 +( 520 832 -48 ) ( 520 768 -48 ) ( 584 768 -48 ) subway/con14 48 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4417 +{ +( 56 552 -168 ) ( 120 552 -168 ) ( 120 616 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 120 616 -152 ) ( 120 552 -152 ) ( 56 552 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 136 544 -152 ) ( 136 544 -168 ) ( 136 552 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 136 552 -152 ) ( 0 552 -152 ) ( 0 552 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 12 +( 192 544 -168 ) ( 192 544 -152 ) ( 192 552 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 256 544 -152 ) ( 256 544 -168 ) ( 192 544 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4418 +{ +( 56 552 -152 ) ( 120 552 -152 ) ( 120 616 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 120 616 -80 ) ( 120 552 -80 ) ( 56 552 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 544 -80 ) ( 136 544 -152 ) ( 136 552 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 184 552 -48 ) ( 48 552 -48 ) ( 48 552 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 12 +( 192 544 -152 ) ( 192 544 -80 ) ( 192 552 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 256 544 -80 ) ( 256 544 -152 ) ( 192 544 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4419 +{ +( 280 552 -80 ) ( 40 552 -80 ) ( 40 544 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 280 624 -64 ) ( 280 584 -64 ) ( 40 544 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 544 -48 ) ( 136 544 -80 ) ( 136 560 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 208 552 -80 ) ( 448 552 -80 ) ( 448 584 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 12 +( 192 544 -80 ) ( 192 544 -64 ) ( 192 568 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 256 544 -64 ) ( 256 544 -80 ) ( 176 544 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4420 +{ +( 216 576 -64 ) ( 216 504 -64 ) ( 226 504 -64 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 256 544 -48 ) ( 256 544 -64 ) ( 160 544 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 192 544 -64 ) ( 192 544 -48 ) ( 192 584 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 208 552 -80 ) ( 448 552 -80 ) ( 448 584 -48 ) subway/1_tile_middle 0 80 0 0.500000 0.500000 0 318767104 12 +( 136 544 -48 ) ( 136 544 -80 ) ( 136 560 -80 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 280 624 -48 ) ( 280 584 -48 ) ( 40 544 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 280 552 -80 ) ( 40 552 -80 ) ( 40 544 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4421 +{ +( 392 800 -168 ) ( 392 864 -168 ) ( 328 864 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 328 864 -152 ) ( 392 864 -152 ) ( 392 800 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 400 752 -152 ) ( 400 752 -168 ) ( 392 752 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 392 752 -152 ) ( 392 616 -152 ) ( 392 616 -168 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 12 +( 400 936 -168 ) ( 400 936 -152 ) ( 392 936 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 400 1000 -152 ) ( 400 1000 -168 ) ( 400 936 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4422 +{ +( 392 1024 -80 ) ( 392 784 -80 ) ( 400 784 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 320 1024 -64 ) ( 360 1024 -64 ) ( 400 784 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 752 -48 ) ( 400 752 -80 ) ( 384 752 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 952 -80 ) ( 392 1192 -80 ) ( 360 1192 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 12 +( 400 936 -80 ) ( 400 936 -64 ) ( 376 936 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1000 -64 ) ( 400 1000 -80 ) ( 400 920 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4423 +{ +( 368 960 -64 ) ( 440 960 -64 ) ( 440 970 -64 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 400 1000 -48 ) ( 400 1000 -64 ) ( 400 904 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 936 -64 ) ( 400 936 -48 ) ( 360 936 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 952 -80 ) ( 392 1192 -80 ) ( 360 1192 -48 ) subway/1_tile_middle 0 80 90 0.500000 0.500000 0 318767104 12 +( 400 752 -48 ) ( 400 752 -80 ) ( 384 752 -80 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 320 1024 -48 ) ( 360 1024 -48 ) ( 400 784 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 1024 -80 ) ( 392 784 -80 ) ( 400 784 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4424 +{ +( 392 968 -176 ) ( 392 968 -168 ) ( 328 968 -168 ) subway/1_concrete_floor -3200 -320 0 0.500000 0.500000 0 285212672 0 +( 224 1488 -176 ) ( 224 1488 -168 ) ( 224 1424 -168 ) subway/1_stair_side1 2016 -320 0 0.500000 0.500000 0 285212672 0 +( 200 752 -184 ) ( 200 752 -176 ) ( 264 752 -176 ) subway/1_concrete_floor -3200 -320 0 0.500000 0.500000 0 285212672 0 +( 400 904 -176 ) ( 400 904 -168 ) ( 400 968 -168 ) subway/1_concrete_floor 2016 -320 0 0.500000 0.500000 0 285212672 0 +( 328 1040 -168 ) ( 328 1104 -168 ) ( 392 1104 -168 ) subway/1_concrete_floor 944 2512 0 0.500000 0.500000 0 285212672 0 +( 392 1120 -176 ) ( 328 1120 -176 ) ( 328 1056 -176 ) subway/1_concrete_floor 224 1408 0 0.500000 0.500000 0 285212672 0 +} +// brush 4425 +{ +( 128 904 -224 ) ( 64 904 -224 ) ( 64 840 -224 ) subway/1_concrete_floor 224 1408 0 0.500000 0.500000 0 285212672 0 +( 64 824 -216 ) ( 64 888 -216 ) ( 128 888 -216 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 136 688 -224 ) ( 136 688 -216 ) ( 136 752 -216 ) subway/1_concrete_floor 2016 -320 0 0.500000 0.500000 0 285212672 0 +( -48 328 -232 ) ( -48 328 -224 ) ( 16 328 -224 ) subway/1_concrete_floor -3200 -320 0 0.500000 0.500000 0 285212672 0 +( -408 1304 -224 ) ( -408 1304 -216 ) ( -408 1240 -216 ) subway/1_stair_side1 2016 -320 0 0.500000 0.500000 0 285212672 0 +( 128 744 -224 ) ( 128 744 -216 ) ( 64 744 -216 ) subway/1_concrete_floor -3200 -320 0 0.500000 0.500000 0 285212672 0 +} +// brush 4426 +{ +( 288 192 -96 ) ( 288 128 -96 ) ( 352 128 -96 ) subway/con14 176 16 0 0.500000 0.500000 0 285212672 0 +( 280 192 -88 ) ( 464 192 -88 ) ( 464 -8 -88 ) subway/1_concrete_floor 976 1232 0 0.500000 0.500000 0 285212672 0 +( 472 304 -88 ) ( 288 304 -88 ) ( 288 304 -96 ) subway/1_beam1 32 0 0 0.500000 0.500000 0 16777216 0 +( 136 48 -96 ) ( 136 48 -88 ) ( 136 112 -88 ) subway/1_concrete_floor -1344 -320 0 0.500000 0.500000 0 285212672 0 +( 424 104 -96 ) ( 424 104 -88 ) ( 488 104 -88 ) subway/1_beam1 32 0 0 0.500000 0.500000 0 16777216 0 +( -88 200 -96 ) ( -88 200 -88 ) ( -88 136 -88 ) subway/1_beam1 1328 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 4427 +{ +( 584 8 -112 ) ( 584 8 -96 ) ( 592 8 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 600 120 -112 ) ( 600 120 -96 ) ( 600 128 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 504 112 -104 ) ( 368 112 -104 ) ( 368 112 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 584 8 -96 ) ( 584 8 -112 ) ( 584 128 -112 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 528 192 -96 ) ( 528 128 -96 ) ( 464 128 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 464 128 -112 ) ( 528 128 -112 ) ( 528 192 -112 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4428 +{ +( 584 8 -152 ) ( 584 8 -112 ) ( 592 8 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 600 120 -128 ) ( 600 120 -112 ) ( 600 128 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 504 112 -120 ) ( 368 112 -120 ) ( 368 112 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 8 -112 ) ( 584 8 -152 ) ( 584 128 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 192 -112 ) ( 528 128 -112 ) ( 464 128 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 464 128 -152 ) ( 528 128 -152 ) ( 528 192 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4429 +{ +( 584 8 -168 ) ( 584 8 -152 ) ( 592 8 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 600 112 -168 ) ( 600 112 -152 ) ( 600 120 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 504 112 -136 ) ( 368 112 -136 ) ( 368 112 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 8 -152 ) ( 584 8 -168 ) ( 584 128 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 528 192 -152 ) ( 528 128 -152 ) ( 464 128 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 464 128 -168 ) ( 528 128 -168 ) ( 528 192 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4430 +{ +( 488 128 -216 ) ( 552 128 -216 ) ( 552 192 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 592 8 -176 ) ( 592 128 -176 ) ( 616 128 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -8 -176 ) ( 600 -8 -216 ) ( 600 112 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 528 112 -200 ) ( 392 112 -200 ) ( 392 112 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 616 120 -216 ) ( 616 120 -200 ) ( 616 128 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 592 8 -216 ) ( 592 8 -176 ) ( 616 8 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4431 +{ +( 464 128 -200 ) ( 528 128 -200 ) ( 528 192 -200 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 192 -168 ) ( 528 128 -168 ) ( 464 128 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 8 -168 ) ( 584 8 -200 ) ( 584 128 -200 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 504 112 -152 ) ( 368 112 -152 ) ( 368 112 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 600 104 -184 ) ( 600 104 -168 ) ( 600 112 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 584 8 -200 ) ( 584 8 -168 ) ( 592 8 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4432 +{ +( 864 192 -200 ) ( 864 128 -200 ) ( 928 128 -200 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 928 128 -168 ) ( 864 128 -168 ) ( 864 192 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 128 -200 ) ( 808 8 -200 ) ( 808 8 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1024 304 -168 ) ( 1024 304 -152 ) ( 888 304 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 792 304 -168 ) ( 792 296 -168 ) ( 792 296 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 800 8 -168 ) ( 808 8 -168 ) ( 808 8 -200 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4433 +{ +( 840 192 -216 ) ( 840 128 -216 ) ( 904 128 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 776 128 -200 ) ( 800 128 -176 ) ( 800 8 -176 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 792 304 -216 ) ( 792 184 -216 ) ( 792 184 -176 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 1000 304 -216 ) ( 1000 304 -200 ) ( 864 304 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 776 128 -200 ) ( 776 120 -200 ) ( 776 120 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 776 8 -200 ) ( 800 8 -176 ) ( 800 8 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4434 +{ +( 800 8 -152 ) ( 808 8 -152 ) ( 808 8 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 792 312 -152 ) ( 792 304 -152 ) ( 792 304 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1024 304 -152 ) ( 1024 304 -136 ) ( 888 304 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 808 128 -168 ) ( 808 8 -168 ) ( 808 8 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 928 128 -152 ) ( 864 128 -152 ) ( 864 192 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 864 192 -168 ) ( 864 128 -168 ) ( 928 128 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4435 +{ +( 800 8 -112 ) ( 808 8 -112 ) ( 808 8 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 792 320 -112 ) ( 792 312 -112 ) ( 792 312 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1024 304 -136 ) ( 1024 304 -120 ) ( 888 304 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 128 -152 ) ( 808 8 -152 ) ( 808 8 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 928 128 -112 ) ( 864 128 -112 ) ( 864 192 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 864 192 -152 ) ( 864 128 -152 ) ( 928 128 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4436 +{ +( 800 8 -96 ) ( 808 8 -96 ) ( 808 8 -112 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 792 320 -96 ) ( 792 312 -96 ) ( 792 312 -112 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1024 304 -120 ) ( 1024 304 -104 ) ( 888 304 -104 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 808 128 -112 ) ( 808 8 -112 ) ( 808 8 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 928 128 -96 ) ( 864 128 -96 ) ( 864 192 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 864 192 -112 ) ( 864 128 -112 ) ( 928 128 -112 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4437 +{ +( 872 232 -112 ) ( 808 232 -112 ) ( 808 168 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 168 -96 ) ( 808 232 -96 ) ( 872 232 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 744 264 -120 ) ( 808 264 -120 ) ( 808 264 -168 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 808 296 -168 ) ( 808 272 -168 ) ( 808 272 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 824 320 -136 ) ( 816 320 -136 ) ( 816 320 -152 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 752 488 -136 ) ( 752 552 -136 ) ( 752 552 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4438 +{ +( 808 400 -120 ) ( 808 400 -136 ) ( 808 336 -136 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 744 168 -152 ) ( 744 168 -136 ) ( 736 168 -136 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 752 120 -120 ) ( 752 120 -168 ) ( 752 144 -168 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 752 88 -168 ) ( 752 88 -120 ) ( 816 88 -120 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 688 80 -96 ) ( 752 80 -96 ) ( 752 16 -96 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 752 16 -112 ) ( 752 80 -112 ) ( 688 80 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4439 +{ +( 808 416 -176 ) ( 808 352 -176 ) ( 872 352 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 872 352 -168 ) ( 808 352 -168 ) ( 808 416 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 320 -224 ) ( 808 320 -176 ) ( 744 320 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 312 -176 ) ( 808 312 -224 ) ( 808 288 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 824 288 -192 ) ( 824 288 -176 ) ( 832 288 -176 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +( 776 216 -176 ) ( 776 216 -192 ) ( 776 280 -192 ) subway/1_tile_damage2 0 0 0 0.500000 0.500000 0 352321536 0 +} +// brush 4440 +{ +( 808 416 -168 ) ( 808 352 -168 ) ( 872 352 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 352 -152 ) ( 808 352 -152 ) ( 808 416 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 808 320 -200 ) ( 808 320 -152 ) ( 744 320 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 808 312 -152 ) ( 808 312 -200 ) ( 808 288 -200 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 824 288 -184 ) ( 824 288 -168 ) ( 832 288 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 776 216 -152 ) ( 776 216 -168 ) ( 776 280 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4441 +{ +( 816 400 -128 ) ( 816 336 -128 ) ( 880 336 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 880 336 -120 ) ( 816 336 -120 ) ( 816 400 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 816 304 -160 ) ( 816 304 -112 ) ( 752 304 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 816 296 -112 ) ( 816 296 -160 ) ( 816 272 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 832 272 -144 ) ( 832 272 -128 ) ( 840 272 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 200 -112 ) ( 784 200 -128 ) ( 784 264 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4442 +{ +( 752 320 -112 ) ( 752 264 -112 ) ( 776 288 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 288 -152 ) ( 776 288 -152 ) ( 776 264 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 312 -136 ) ( 808 312 -184 ) ( 808 288 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 320 -184 ) ( 808 320 -136 ) ( 744 320 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 752 264 -112 ) ( 752 320 -112 ) ( 808 320 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 776 288 -152 ) ( 808 288 -152 ) ( 808 320 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4443 +{ +( 776 152 -176 ) ( 776 216 -176 ) ( 776 216 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 832 144 -176 ) ( 824 144 -176 ) ( 824 144 -192 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 144 -208 ) ( 808 120 -208 ) ( 808 120 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 744 112 -160 ) ( 808 112 -160 ) ( 808 112 -208 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 808 16 -168 ) ( 808 80 -168 ) ( 872 80 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 872 80 -176 ) ( 808 80 -176 ) ( 808 16 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4444 +{ +( 776 152 -168 ) ( 776 216 -168 ) ( 776 216 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 832 144 -168 ) ( 824 144 -168 ) ( 824 144 -184 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 808 144 -200 ) ( 808 120 -200 ) ( 808 120 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 744 112 -152 ) ( 808 112 -152 ) ( 808 112 -200 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 808 16 -152 ) ( 808 80 -152 ) ( 872 80 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 872 80 -168 ) ( 808 80 -168 ) ( 808 16 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4445 +{ +( 776 152 -200 ) ( 776 216 -200 ) ( 776 216 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 832 144 -184 ) ( 824 144 -184 ) ( 824 144 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 808 144 -232 ) ( 808 120 -232 ) ( 808 120 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 744 112 -184 ) ( 808 112 -184 ) ( 808 112 -232 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 808 16 -176 ) ( 808 80 -176 ) ( 872 80 -176 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 80 -200 ) ( 808 80 -200 ) ( 808 16 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4446 +{ +( 184 192 -100 ) ( 256 192 -100 ) ( 256 232 -100 ) subway/light_tube 192 128 0 0.500000 0.500000 134217728 1 5000 +( 256 232 -96 ) ( 256 192 -96 ) ( 184 192 -96 ) subway/1_black -2176 -3264 0 0.500000 0.500000 134217728 16777216 0 +( 256 224 -96 ) ( 184 224 -96 ) ( 184 224 -104 ) subway/1_black -1328 -96 0 0.500000 0.500000 134217728 16777216 0 +( 224 232 -96 ) ( 224 192 -96 ) ( 224 192 -104 ) subway/1_black 2416 -96 0 0.500000 0.500000 134217728 16777216 0 +( 184 208 -96 ) ( 256 208 -96 ) ( 256 208 -104 ) subway/1_black -1328 -96 0 0.500000 0.500000 134217728 16777216 0 +( 268 192 -96 ) ( 268 232 -96 ) ( 268 232 -104 ) subway/1_black 2416 -96 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4447 +{ +( 592 -64 -96 ) ( 592 -64 -88 ) ( 592 -128 -88 ) subway/1_beam1 1328 0 0 0.500000 0.500000 0 16777216 0 +( 648 8 -96 ) ( 648 8 -88 ) ( 712 8 -88 ) subway/1_beam1 32 0 0 0.500000 0.500000 0 16777216 0 +( 808 -160 -96 ) ( 808 -160 -88 ) ( 808 -96 -88 ) subway/1_concrete_floor -1344 -320 0 0.500000 0.500000 0 285212672 0 +( 688 112 -88 ) ( 504 112 -88 ) ( 504 112 -96 ) subway/1_beam1 32 0 0 0.500000 0.500000 0 16777216 0 +( 504 -8 -88 ) ( 688 -8 -88 ) ( 688 -208 -88 ) subway/1_concrete_floor 976 1232 0 0.500000 0.500000 0 285212672 0 +( 512 -8 -96 ) ( 512 -72 -96 ) ( 576 -72 -96 ) subway/con14 176 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4448 +{ +( -80 136 -216 ) ( -80 136 -176 ) ( -56 136 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -56 272 -216 ) ( -56 272 -200 ) ( -56 280 -200 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -152 296 -200 ) ( -288 296 -200 ) ( -288 296 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -80 152 -176 ) ( -80 152 -216 ) ( -80 272 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -80 160 -176 ) ( -80 280 -176 ) ( -56 280 -200 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -184 280 -216 ) ( -120 280 -216 ) ( -120 344 -216 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4449 +{ +( -88 136 -200 ) ( -88 136 -168 ) ( -80 136 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -80 264 -184 ) ( -80 264 -168 ) ( -80 272 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -176 296 -152 ) ( -312 296 -152 ) ( -312 296 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -88 160 -168 ) ( -88 160 -200 ) ( -88 280 -200 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -144 344 -168 ) ( -144 280 -168 ) ( -208 280 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -208 280 -200 ) ( -144 280 -200 ) ( -144 344 -200 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4450 +{ +( -208 280 -168 ) ( -144 280 -168 ) ( -144 344 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -144 344 -152 ) ( -144 280 -152 ) ( -208 280 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -88 160 -152 ) ( -88 160 -168 ) ( -88 280 -168 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -176 296 -136 ) ( -312 296 -136 ) ( -312 296 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -80 272 -168 ) ( -80 272 -152 ) ( -80 280 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( -88 136 -168 ) ( -88 136 -152 ) ( -80 136 -152 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4451 +{ +( -208 240 -152 ) ( -144 240 -152 ) ( -144 304 -152 ) subway/1_tile_damage2 8 24 0 0.500000 0.500000 0 352321536 0 +( -144 304 -112 ) ( -144 240 -112 ) ( -208 240 -112 ) subway/1_tile_damage2 8 24 0 0.500000 0.500000 0 352321536 0 +( -88 112 -112 ) ( -88 112 -152 ) ( -88 232 -152 ) subway/1_tile_damage2 8 24 0 0.500000 0.500000 0 352321536 0 +( -160 176 -120 ) ( -296 176 -120 ) ( -296 176 -136 ) subway/1_tile_damage2 8 24 0 0.500000 0.500000 0 352321536 0 +( -80 240 -128 ) ( -80 240 -112 ) ( -80 248 -112 ) subway/1_tile_damage2 8 24 0 0.500000 0.500000 0 352321536 0 +( -88 144 -152 ) ( -88 144 -112 ) ( -80 144 -112 ) subway/1_tile_damage2 8 24 0 0.500000 0.500000 0 352321536 0 +} +// brush 4452 +{ +( 840 336 -216 ) ( 840 336 -168 ) ( 840 360 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 728 360 -184 ) ( 728 360 -168 ) ( 720 360 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 720 264 -168 ) ( 720 128 -168 ) ( 720 128 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 336 -168 ) ( 840 336 -216 ) ( 720 336 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 656 296 -168 ) ( 720 296 -168 ) ( 720 232 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 720 232 -216 ) ( 720 296 -216 ) ( 656 296 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4453 +{ +( 840 336 -168 ) ( 840 336 -128 ) ( 840 360 -152 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 728 360 -168 ) ( 728 360 -152 ) ( 720 360 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 720 264 -152 ) ( 720 128 -152 ) ( 720 128 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 840 336 -128 ) ( 840 336 -168 ) ( 720 336 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 840 336 -128 ) ( 720 336 -128 ) ( 720 360 -152 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 720 232 -168 ) ( 720 296 -168 ) ( 656 296 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4454 +{ +( 840 328 -152 ) ( 840 328 -120 ) ( 840 336 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 728 336 -136 ) ( 728 336 -120 ) ( 720 336 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 240 -104 ) ( 720 104 -104 ) ( 720 104 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 840 328 -120 ) ( 840 328 -152 ) ( 720 328 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 656 272 -120 ) ( 720 272 -120 ) ( 720 208 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 208 -152 ) ( 720 272 -152 ) ( 656 272 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4455 +{ +( 720 208 -120 ) ( 720 272 -120 ) ( 656 272 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 656 272 -104 ) ( 720 272 -104 ) ( 720 208 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 840 328 -104 ) ( 840 328 -120 ) ( 720 328 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 240 -88 ) ( 720 104 -88 ) ( 720 104 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 336 -120 ) ( 720 336 -104 ) ( 712 336 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 840 328 -120 ) ( 840 328 -104 ) ( 840 336 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4456 +{ +( 720 208 -104 ) ( 720 272 -104 ) ( 656 272 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 656 272 -64 ) ( 720 272 -64 ) ( 720 208 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 840 328 -64 ) ( 840 328 -104 ) ( 720 328 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 240 -72 ) ( 720 104 -72 ) ( 720 104 -88 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 712 336 -80 ) ( 712 336 -64 ) ( 704 336 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 840 328 -104 ) ( 840 328 -64 ) ( 840 336 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4457 +{ +( 720 208 -64 ) ( 720 272 -64 ) ( 656 272 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 656 272 -48 ) ( 720 272 -48 ) ( 720 208 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 840 328 -48 ) ( 840 328 -64 ) ( 720 328 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 720 240 -56 ) ( 720 104 -56 ) ( 720 104 -72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 712 336 -64 ) ( 712 336 -48 ) ( 704 336 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 840 328 -64 ) ( 840 328 -48 ) ( 840 336 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4458 +{ +( 392 552 -216 ) ( 392 552 -184 ) ( 136 552 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -184 496 -184 ) ( -184 496 -168 ) ( -184 488 -168 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -152 520 -184 ) ( -152 520 -216 ) ( -184 520 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( -152 512 -216 ) ( -152 512 -184 ) ( -152 544 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 176 456 -184 ) ( 176 520 -184 ) ( 240 520 -184 ) subway/1_lobby1 0 -48 0 0.500000 0.500000 0 285212672 0 +( 240 520 -216 ) ( 176 520 -216 ) ( 176 456 -216 ) subway/1_lobby1 0 -48 0 0.500000 0.500000 0 285212672 0 +} +// brush 4459 +{ +( 384 712 -72 ) ( 384 712 -40 ) ( 128 712 -40 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( -192 656 -40 ) ( -192 656 -24 ) ( -192 648 -24 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( -160 360 -40 ) ( -160 360 -72 ) ( -192 360 -72 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( -184 360 -72 ) ( -184 360 -40 ) ( -184 392 -40 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 168 480 -48 ) ( 168 544 -48 ) ( 232 544 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 232 544 -80 ) ( 168 544 -80 ) ( 168 480 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +} +// brush 4460 +{ +( 136 752 -120 ) ( 136 752 -80 ) ( -184 752 -80 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +( -184 696 -88 ) ( -184 696 -72 ) ( -184 688 -72 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +( 16 744 -80 ) ( 16 744 -120 ) ( -184 744 -120 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( 136 752 -80 ) ( 136 752 -120 ) ( 136 744 -120 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +( 176 656 -80 ) ( 176 720 -80 ) ( 240 720 -80 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +( 240 720 -120 ) ( 176 720 -120 ) ( 176 656 -120 ) subway/1_lobby3 0 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 4461 +{ +( 464 544 -48 ) ( 464 480 -48 ) ( 528 480 -48 ) subway/1_concrete_floor -528 -496 0 0.500000 0.500000 0 285212672 0 +( 496 464 -32 ) ( 432 464 -32 ) ( 432 528 -32 ) subway/1_lobby4 -256 -352 0 1 1 0 285212672 0 +( 136 432 -80 ) ( 136 424 -80 ) ( 136 424 -48 ) subway/1_lobby4 368 16 0 1 1 0 285212672 0 +( 88 488 -80 ) ( 288 488 -80 ) ( 288 488 -48 ) subway/1_lobby4 -256 16 0 1 1 0 285212672 0 +( 72 496 -32 ) ( 72 488 -32 ) ( 72 488 -48 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 80 392 -40 ) ( 400 392 -40 ) ( 400 392 -72 ) subway/1_lobby4 -256 16 0 1 1 0 285212672 0 +} +// brush 4462 +{ +( 872 848 -224 ) ( 872 848 -216 ) ( 872 912 -216 ) subway/1_lobby_floor_edge -16 16 0 0.500000 0.500000 0 301989888 0 +( 1520 552 -224 ) ( 1520 552 -216 ) ( 1456 552 -216 ) subway/1_lobby_floor_edge -16 16 0 0.500000 0.500000 0 301989888 0 +( 840 1008 -224 ) ( 840 1008 -216 ) ( 840 944 -216 ) subway/1_lobby_floor_edge -16 16 0 0.500000 0.500000 0 301989888 0 +( 896 328 -232 ) ( 896 328 -224 ) ( 960 328 -224 ) subway/1_lobby_floor_edge -16 16 0 0.500000 0.500000 0 301989888 0 +( 1040 936 -216 ) ( 1104 936 -216 ) ( 1104 872 -216 ) subway/1_lobby_floor_edge -16 112 90 0.500000 0.500000 0 301989888 0 +( 1112 808 -224 ) ( 1112 872 -224 ) ( 1048 872 -224 ) subway/1_lobby_floor_edge -16 16 0 0.500000 0.500000 0 301989888 0 +} +// brush 4463 +{ +( 1064 304 -224 ) ( 1064 304 -216 ) ( 1064 368 -216 ) subway/1_lobby_floor_edge 1696 -623 0 0.500000 0.500000 0 301989888 0 +( 1672 520 -224 ) ( 1672 520 -216 ) ( 1608 520 -216 ) subway/1_lobby_floor_edge 1696 -623 0 0.500000 0.500000 0 301989888 0 +( 1032 400 -224 ) ( 1032 400 -216 ) ( 1032 336 -216 ) subway/1_lobby_floor_edge 1696 -623 0 0.500000 0.500000 0 301989888 0 +( 1088 328 -232 ) ( 1088 328 -224 ) ( 1152 328 -224 ) subway/1_lobby_floor_edge 1696 -623 0 0.500000 0.500000 0 301989888 0 +( 1232 360 -216 ) ( 1296 360 -216 ) ( 1296 296 -216 ) subway/1_lobby_floor_edge 1712 -623 90 0.500000 -0.500000 0 301989888 0 +( 1312 296 -224 ) ( 1312 360 -224 ) ( 1248 360 -224 ) subway/1_lobby_floor_edge 1696 -623 0 0.500000 0.500000 0 301989888 0 +} +// brush 4464 +{ +( 1096 104 -224 ) ( 1096 104 -216 ) ( 1032 104 -216 ) subway/1_lobby_floor 432 16 0 0.500000 0.500000 0 285212672 0 +( 584 640 -224 ) ( 584 640 -216 ) ( 584 576 -216 ) subway/1_lobby_floor 528 16 0 0.500000 0.500000 0 285212672 0 +( 920 8 -224 ) ( 920 8 -216 ) ( 984 8 -216 ) subway/1_lobby_floor 432 16 0 0.500000 0.500000 0 285212672 0 +( 784 72 -232 ) ( 784 72 -224 ) ( 784 136 -224 ) subway/1_lobby_floor 528 16 0 0.500000 0.500000 0 285212672 0 +( 1032 224 -216 ) ( 1032 288 -216 ) ( 1096 288 -216 ) subway/1_lobby_floor 432 -688 0 0.500000 0.500000 0 285212672 0 +( 1096 304 -224 ) ( 1032 304 -224 ) ( 1032 240 -224 ) subway/1_lobby_floor 432 -464 0 0.500000 0.500000 0 285212672 0 +} +// brush 4465 +{ +( 232 -608 -80 ) ( 232 -608 -48 ) ( 616 -608 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 576 -608 -48 ) ( 576 -608 -80 ) ( 576 -600 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 1400 -600 -48 ) ( 1400 -600 -80 ) ( 1544 -600 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 880 -600 -80 ) ( 880 -608 -80 ) ( 880 -608 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 808 -576 -48 ) ( 744 -576 -48 ) ( 744 -512 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 232 -600 -80 ) ( 224 -608 -80 ) ( 360 -608 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +} +// brush 4466 +{ +( 616 -288 60 ) ( 636 -308 60 ) ( 636 -308 70 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 704 -268 -140 ) ( 704 -260 -140 ) ( 584 -320 -140 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 704 -260 -136 ) ( 704 -268 -136 ) ( 584 -328 -136 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 704 -268 -152 ) ( 704 -268 -156 ) ( 584 -328 -156 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 23 +( 584 -320 -116 ) ( 584 -320 -164 ) ( 584 -296 -164 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 704 -260 -156 ) ( 704 -260 -152 ) ( 584 -320 -152 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 704 36 -116 ) ( 704 36 -132 ) ( 704 -28 -132 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4467 +{ +( 704 36 -144 ) ( 704 36 -160 ) ( 704 -28 -160 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 704 -260 -184 ) ( 704 -260 -180 ) ( 584 -320 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 584 -320 -144 ) ( 584 -320 -192 ) ( 584 -296 -192 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 704 -268 -180 ) ( 704 -268 -184 ) ( 584 -328 -184 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 24 +( 704 -260 -180 ) ( 704 -268 -180 ) ( 584 -328 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 704 -268 -184 ) ( 704 -260 -184 ) ( 584 -320 -184 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 616 -288 0 ) ( 636 -308 0 ) ( 636 -308 10 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4468 +{ +( 584 -320 18 ) ( 584 -320 8 ) ( 600 -312 8 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 632 -304 10 ) ( 632 -304 0 ) ( 584 -328 0 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 588 -552 -148 ) ( 588 -616 -148 ) ( 588 -616 -132 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 512 -328 -140 ) ( 520 -328 -140 ) ( 520 -328 -156 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 584 -352 -180 ) ( 584 -328 -180 ) ( 584 -328 -132 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 656 -316 -132 ) ( 592 -316 -132 ) ( 592 -316 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 532 -224 -140 ) ( 532 -288 -140 ) ( 468 -288 -140 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 464 -288 -180 ) ( 528 -288 -180 ) ( 528 -224 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4469 +{ +( 356 -376 -132 ) ( 292 -376 -132 ) ( 292 -376 -116 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 648 -256 -120 ) ( 588 -376 -120 ) ( 588 -376 -124 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 624 -256 -164 ) ( 648 -256 -164 ) ( 648 -256 -116 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 656 -256 -156 ) ( 596 -376 -156 ) ( 596 -376 -152 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 23 +( 656 -256 -136 ) ( 596 -376 -136 ) ( 588 -376 -136 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 648 -256 -140 ) ( 588 -376 -140 ) ( 596 -376 -140 ) subway/1_black 0 1 0 0.500000 0.500000 134217728 16777216 0 +( 636 -308 70 ) ( 636 -308 60 ) ( 616 -288 60 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4470 +{ +( 636 -308 10 ) ( 636 -308 0 ) ( 616 -288 0 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 648 -256 -184 ) ( 588 -376 -184 ) ( 596 -376 -184 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 656 -256 -180 ) ( 596 -376 -180 ) ( 588 -376 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 656 -256 -184 ) ( 596 -376 -184 ) ( 596 -376 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 24 +( 624 -256 -192 ) ( 648 -256 -192 ) ( 648 -256 -144 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 648 -256 -180 ) ( 588 -376 -180 ) ( 588 -376 -184 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 356 -376 -160 ) ( 292 -376 -160 ) ( 292 -376 -144 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4471 +{ +( 420 -256 -156 ) ( 356 -256 -156 ) ( 356 -256 -140 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 648 -180 -132 ) ( 648 -188 -132 ) ( 648 -188 -148 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 624 -252 -180 ) ( 648 -252 -180 ) ( 648 -252 -132 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 656 -324 -140 ) ( 656 -260 -140 ) ( 656 -260 -188 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 752 -200 -140 ) ( 688 -200 -140 ) ( 688 -136 -140 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 688 -132 -180 ) ( 688 -196 -180 ) ( 752 -196 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4472 +{ +( 416 -256 -136 ) ( 352 -256 -136 ) ( 352 -256 -120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 648 -88 -120 ) ( 648 -96 -120 ) ( 648 -96 -136 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 624 -160 -168 ) ( 648 -160 -168 ) ( 648 -160 -120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 656 -232 -120 ) ( 656 -168 -120 ) ( 656 -168 -168 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 23 +( 752 -104 -136 ) ( 688 -104 -136 ) ( 688 -40 -136 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 688 -40 -140 ) ( 688 -104 -140 ) ( 752 -104 -140 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4473 +{ +( 696 -40 -184 ) ( 696 -104 -184 ) ( 760 -104 -184 ) subway/con5 0 0 0 0.500000 0.500000 0 285212672 0 +( 760 -104 -180 ) ( 696 -104 -180 ) ( 696 -40 -180 ) subway/con5 0 0 0 0.500000 0.500000 0 285212672 0 +( 668 -168 -180 ) ( 668 -168 -184 ) ( 668 -248 -184 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( 668 -168 -184 ) ( 668 -168 -180 ) ( 656 -160 -180 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( 656 -88 -144 ) ( 656 -96 -144 ) ( 656 -96 -160 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 668 -248 -180 ) ( 668 -248 -184 ) ( 656 -256 -184 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 4474 +{ +( 420 -164 -156 ) ( 356 -164 -156 ) ( 356 -164 -140 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 648 -88 -132 ) ( 648 -96 -132 ) ( 648 -96 -148 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 624 -160 -188 ) ( 648 -160 -188 ) ( 648 -160 -140 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 656 -232 -140 ) ( 656 -168 -140 ) ( 656 -168 -188 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 752 -108 -140 ) ( 688 -108 -140 ) ( 688 -44 -140 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 688 -40 -180 ) ( 688 -104 -180 ) ( 752 -104 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4475 +{ +( 704 -388 -132 ) ( 704 -452 -132 ) ( 704 -452 -116 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 584 -96 -152 ) ( 704 -156 -152 ) ( 704 -156 -156 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 584 -120 -164 ) ( 584 -96 -164 ) ( 584 -96 -116 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 584 -88 -156 ) ( 704 -148 -156 ) ( 704 -148 -152 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 23 +( 584 -88 -136 ) ( 704 -148 -136 ) ( 704 -156 -136 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 584 -96 -140 ) ( 704 -156 -140 ) ( 704 -148 -140 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 636 -108 70 ) ( 636 -108 60 ) ( 616 -128 60 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4476 +{ +( 616 -128 60 ) ( 636 -108 60 ) ( 636 -108 70 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 596 -40 -140 ) ( 588 -40 -140 ) ( 648 -160 -140 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 588 -40 -136 ) ( 596 -40 -136 ) ( 656 -160 -136 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 596 -40 -152 ) ( 596 -40 -156 ) ( 656 -160 -156 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 23 +( 648 -160 -116 ) ( 648 -160 -164 ) ( 624 -160 -164 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 588 -40 -124 ) ( 588 -40 -120 ) ( 648 -160 -120 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 292 -40 -116 ) ( 292 -40 -132 ) ( 356 -40 -132 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4477 +{ +( 292 -40 -144 ) ( 292 -40 -160 ) ( 356 -40 -160 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 588 -40 -184 ) ( 588 -40 -180 ) ( 648 -160 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 648 -160 -144 ) ( 648 -160 -192 ) ( 624 -160 -192 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 596 -40 -180 ) ( 596 -40 -184 ) ( 656 -160 -184 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 21 +( 588 -40 -180 ) ( 596 -40 -180 ) ( 656 -160 -180 ) subway/1_black -1 0 0 0.500000 0.500000 134217728 16777216 0 +( 596 -40 -184 ) ( 588 -40 -184 ) ( 648 -160 -184 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 616 -128 0 ) ( 636 -108 0 ) ( 636 -108 10 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4478 +{ +( 636 -108 10 ) ( 636 -108 0 ) ( 616 -128 0 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 584 -96 -184 ) ( 704 -156 -184 ) ( 704 -148 -184 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 584 -88 -180 ) ( 704 -148 -180 ) ( 704 -156 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 584 -88 -184 ) ( 704 -148 -184 ) ( 704 -148 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 21 +( 584 -120 -192 ) ( 584 -96 -192 ) ( 584 -96 -144 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 584 -96 -180 ) ( 704 -156 -180 ) ( 704 -156 -184 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 704 -388 -160 ) ( 704 -452 -160 ) ( 704 -452 -144 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4479 +{ +( 528 -192 -180 ) ( 528 -128 -180 ) ( 464 -128 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 468 -128 -140 ) ( 532 -128 -140 ) ( 532 -192 -140 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 592 -100 -180 ) ( 592 -100 -132 ) ( 656 -100 -132 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 584 -88 -132 ) ( 584 -88 -180 ) ( 584 -64 -180 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 520 -88 -156 ) ( 520 -88 -140 ) ( 512 -88 -140 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 588 200 -132 ) ( 588 200 -148 ) ( 588 136 -148 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 584 -88 0 ) ( 632 -112 0 ) ( 632 -112 10 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 600 -104 8 ) ( 584 -96 8 ) ( 584 -96 18 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4480 +{ +( 856 496 -8 ) ( 856 496 -80 ) ( 792 496 -80 ) subway/1_tile_middle 736 130 0 0.500000 -0.500000 0 318767104 0 +( 720 536 -80 ) ( 720 536 -8 ) ( 720 544 -8 ) subway/1_tile_middle 400 130 0 0.500000 -0.500000 0 318767104 0 +( 736 552 40 ) ( 600 552 40 ) ( 600 552 -64 ) subway/1_tile_middle 736 130 0 0.500000 -0.500000 0 318767104 0 +( 664 536 -8 ) ( 664 536 -80 ) ( 664 544 -80 ) subway/1_tile_middle 400 130 0 0.500000 -0.500000 0 318767104 0 +( 720 616 -48 ) ( 720 552 -48 ) ( 656 552 -48 ) subway/1_tile_middle 64 1538 90 0.500000 -0.500000 0 318767104 0 +( 656 552 -64 ) ( 720 552 -64 ) ( 720 616 -64 ) subway/1_tile -2480 -1008 90 0.500000 0.500000 0 318767104 0 +} +// brush 4481 +{ +( 632 552 -52 ) ( 632 624 -52 ) ( 592 624 -52 ) subway/light_tube 1376 -591 90 0.500000 0.500000 134217728 1 5000 +( 592 636 -48 ) ( 632 636 -48 ) ( 632 564 -48 ) subway/1_black -2400 -1984 0 0.500000 0.500000 134217728 16777216 0 +( 600 624 -48 ) ( 600 552 -48 ) ( 600 552 -56 ) subway/1_black -416 -96 0 0.500000 0.500000 134217728 16777216 0 +( 592 592 -48 ) ( 632 592 -48 ) ( 632 592 -56 ) subway/1_black 0 -96 0 0.500000 0.500000 134217728 16777216 0 +( 616 552 -48 ) ( 616 624 -48 ) ( 616 624 -56 ) subway/1_black -416 -96 0 0.500000 0.500000 134217728 16777216 0 +( 632 636 -48 ) ( 592 636 -48 ) ( 592 636 -56 ) subway/1_black 0 -96 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4482 +{ +( 632 804 -52 ) ( 632 876 -52 ) ( 592 876 -52 ) subway/light_tube 104 -15 90 0.500000 0.500000 134217728 1 5000 +( 592 876 -48 ) ( 632 876 -48 ) ( 632 804 -48 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 600 876 -48 ) ( 600 804 -48 ) ( 600 804 -56 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 592 844 -48 ) ( 632 844 -48 ) ( 632 844 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 616 804 -48 ) ( 616 876 -48 ) ( 616 876 -56 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 636 888 -48 ) ( 596 888 -48 ) ( 596 888 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4483 +{ +( 336 1236 -52 ) ( 336 1308 -52 ) ( 296 1308 -52 ) subway/light_tube 8 0 90 0.500000 0.500000 134217728 1 8000 +( 296 1308 -48 ) ( 336 1308 -48 ) ( 336 1236 -48 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 304 1308 -48 ) ( 304 1236 -48 ) ( 304 1236 -56 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 296 1276 -48 ) ( 336 1276 -48 ) ( 336 1276 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 320 1236 -48 ) ( 320 1308 -48 ) ( 320 1308 -56 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 336 1320 -48 ) ( 296 1320 -48 ) ( 296 1320 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4484 +{ +( 632 404 -48 ) ( 632 444 -48 ) ( 632 444 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 548 424 -48 ) ( 620 424 -48 ) ( 620 424 -56 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 588 448 -48 ) ( 588 408 -48 ) ( 588 408 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 620 440 -48 ) ( 548 440 -48 ) ( 548 440 -56 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 620 448 -48 ) ( 620 408 -48 ) ( 548 408 -48 ) subway/1_black 0 -8 90 0.500000 0.500000 134217728 16777216 0 +( 560 404 -52 ) ( 632 404 -52 ) ( 632 444 -52 ) subway/light_tube 112 -15 180 0.500000 0.500000 134217728 1 5000 +} +// brush 4485 +{ +( 408 1032 -52 ) ( 480 1032 -52 ) ( 480 1072 -52 ) subway/light_tube 0 16 0 0.500000 0.500000 134217728 1 5000 +( 480 1072 -48 ) ( 480 1032 -48 ) ( 408 1032 -48 ) subway/1_black -1808 -608 0 0.500000 0.500000 134217728 16777216 0 +( 480 1064 -48 ) ( 408 1064 -48 ) ( 408 1064 -56 ) subway/1_black -1792 -96 0 0.500000 0.500000 134217728 16777216 0 +( 448 1072 -48 ) ( 448 1032 -48 ) ( 448 1032 -56 ) subway/1_black 592 -96 0 0.500000 0.500000 134217728 16777216 0 +( 408 1048 -48 ) ( 480 1048 -48 ) ( 480 1048 -56 ) subway/1_black -1792 -96 0 0.500000 0.500000 134217728 16777216 0 +( 492 1032 -48 ) ( 492 1072 -48 ) ( 492 1072 -56 ) subway/1_black 592 -96 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4486 +{ +( 776 8 -32 ) ( 776 8 -48 ) ( 840 8 -48 ) subway/1_lobby4 -304 32 0 0.500000 0.500000 0 285212672 0 +( 576 264 -48 ) ( 576 264 -32 ) ( 576 256 -32 ) subway/1_beam1 1280 32 0 0.500000 0.500000 0 16777216 0 +( 1096 -600 -32 ) ( 1096 -600 -80 ) ( 1072 -600 -80 ) subway/1_beam1 -304 32 0 0.500000 0.500000 0 16777216 0 +( 880 320 -80 ) ( 880 320 -32 ) ( 880 384 -32 ) subway/1_lobby4 1280 32 0 0.500000 0.500000 0 285212672 0 +( 1088 248 -40 ) ( 1088 312 -40 ) ( 1152 312 -40 ) subway/1_lobby4 -144 208 90 0.500000 0.500000 0 285212672 0 +( 1152 312 -48 ) ( 1088 312 -48 ) ( 1088 248 -48 ) subway/1_concrete_floor2 112 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4487 +{ +( 992 968 -168 ) ( 1056 968 -168 ) ( 1056 1032 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 1056 1032 -152 ) ( 1056 968 -152 ) ( 992 968 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 720 968 -64 ) ( 720 968 -168 ) ( 720 976 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 784 968 -168 ) ( 784 968 -152 ) ( 720 968 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 784 968 -152 ) ( 784 968 -168 ) ( 792 960 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 392 960 -168 ) ( 392 960 -64 ) ( 536 960 -64 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4488 +{ +( 440 960 -152 ) ( 440 960 -48 ) ( 584 960 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 968 -120 ) ( 784 968 -152 ) ( 792 960 -152 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 784 968 -152 ) ( 784 968 -120 ) ( 720 968 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 968 -48 ) ( 720 968 -152 ) ( 720 976 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 1056 1032 -120 ) ( 1056 968 -120 ) ( 992 968 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 992 968 -152 ) ( 1056 968 -152 ) ( 1056 1032 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 4489 +{ +( 440 960 -136 ) ( 440 960 -32 ) ( 584 960 -32 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 784 968 -104 ) ( 784 968 -120 ) ( 792 960 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 784 968 -120 ) ( 784 968 -104 ) ( 720 968 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 968 -32 ) ( 720 968 -136 ) ( 720 976 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1056 1032 -104 ) ( 1056 968 -104 ) ( 992 968 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 992 968 -120 ) ( 1056 968 -120 ) ( 1056 1032 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4490 +{ +( 440 960 -104 ) ( 440 960 0 ) ( 584 960 0 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 968 -64 ) ( 784 968 -104 ) ( 792 960 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 784 968 -104 ) ( 784 968 -64 ) ( 720 968 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 968 0 ) ( 720 968 -104 ) ( 720 976 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1056 1032 -64 ) ( 1056 968 -64 ) ( 992 968 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 992 968 -104 ) ( 1056 968 -104 ) ( 1056 1032 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4491 +{ +( 992 968 -64 ) ( 1056 968 -64 ) ( 1056 1032 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1056 1032 -48 ) ( 1056 968 -48 ) ( 992 968 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 720 968 32 ) ( 720 968 -72 ) ( 720 976 -72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 784 968 -64 ) ( 784 968 -48 ) ( 720 968 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 784 968 -48 ) ( 784 968 -64 ) ( 792 960 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 440 960 -72 ) ( 440 960 32 ) ( 584 960 32 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4492 +{ +( 672 968 -168 ) ( 736 968 -168 ) ( 736 1032 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 736 1032 -152 ) ( 736 968 -152 ) ( 672 968 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 400 968 -64 ) ( 400 968 -168 ) ( 400 976 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 1224 968 -24 ) ( 944 968 -24 ) ( 944 968 -240 ) subway/1_tile_bottom 32 16 0 -0.500000 0.500000 0 318767104 0 +( 496 960 -128 ) ( 496 960 -120 ) ( 496 1024 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 72 960 -168 ) ( 72 960 -64 ) ( 216 960 -64 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4493 +{ +( 184 960 -152 ) ( 184 960 -48 ) ( 328 960 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 496 960 -112 ) ( 496 960 -104 ) ( 496 1024 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 1224 968 -8 ) ( 944 968 -8 ) ( 944 968 -224 ) subway/1_tile_damage1 32 16 0 -0.500000 0.500000 0 352321536 0 +( 464 968 -48 ) ( 464 968 -152 ) ( 464 976 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 784 1032 -120 ) ( 784 968 -120 ) ( 720 968 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 720 968 -152 ) ( 784 968 -152 ) ( 784 1032 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 4494 +{ +( 120 960 -136 ) ( 120 960 -32 ) ( 264 960 -32 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 496 960 -96 ) ( 496 960 -88 ) ( 496 1024 -88 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 1176 968 8 ) ( 896 968 8 ) ( 896 968 -208 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 400 968 -32 ) ( 400 968 -136 ) ( 400 976 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 736 1032 -104 ) ( 736 968 -104 ) ( 672 968 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 672 968 -120 ) ( 736 968 -120 ) ( 736 1032 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4495 +{ +( 120 960 -104 ) ( 120 960 0 ) ( 264 960 0 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 496 960 -64 ) ( 496 960 -56 ) ( 496 1024 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 1176 968 40 ) ( 896 968 40 ) ( 896 968 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 968 0 ) ( 400 968 -104 ) ( 400 976 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 736 1032 -64 ) ( 736 968 -64 ) ( 672 968 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 672 968 -104 ) ( 736 968 -104 ) ( 736 1032 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4496 +{ +( 672 968 -64 ) ( 736 968 -64 ) ( 736 1032 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 736 1032 -48 ) ( 736 968 -48 ) ( 672 968 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 400 968 32 ) ( 400 968 -72 ) ( 400 976 -72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 1176 968 72 ) ( 896 968 72 ) ( 896 968 -144 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 496 960 -32 ) ( 496 960 -24 ) ( 496 1024 -24 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 120 960 -72 ) ( 120 960 32 ) ( 264 960 32 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4497 +{ +( 688 496 -8 ) ( 688 496 -80 ) ( 624 496 -80 ) subway/1_tile_middle 1072 130 0 0.500000 -0.500000 0 318767104 0 +( 552 536 -80 ) ( 552 536 -8 ) ( 552 544 -8 ) subway/1_tile_middle 400 130 0 0.500000 -0.500000 0 318767104 0 +( 568 552 40 ) ( 432 552 40 ) ( 432 552 -64 ) subway/1_tile_middle 1072 130 0 0.500000 -0.500000 0 318767104 0 +( 496 536 -8 ) ( 496 536 -80 ) ( 496 544 -80 ) subway/1_tile_middle 400 130 0 0.500000 -0.500000 0 318767104 0 +( 552 616 -48 ) ( 552 552 -48 ) ( 488 552 -48 ) subway/1_tile_middle 64 1202 90 0.500000 -0.500000 0 318767104 0 +( 488 552 -64 ) ( 552 552 -64 ) ( 552 616 -64 ) subway/1_tile -2480 -672 90 0.500000 0.500000 0 318767104 0 +} +// brush 4498 +{ +( 488 384 -64 ) ( 552 384 -64 ) ( 552 448 -64 ) subway/1_tile -2144 -672 90 0.500000 0.500000 0 318767104 0 +( 552 448 -48 ) ( 552 384 -48 ) ( 488 384 -48 ) subway/1_tile_middle 400 1202 90 0.500000 -0.500000 0 318767104 0 +( 496 368 -8 ) ( 496 368 -80 ) ( 496 376 -80 ) subway/1_tile_middle 736 130 0 0.500000 -0.500000 0 318767104 0 +( 568 384 40 ) ( 432 384 40 ) ( 432 384 -64 ) subway/1_tile_middle 1072 130 0 0.500000 -0.500000 0 318767104 0 +( 552 368 -80 ) ( 552 368 -8 ) ( 552 376 -8 ) subway/1_tile_middle 736 130 0 0.500000 -0.500000 0 318767104 0 +( 688 328 -8 ) ( 688 328 -80 ) ( 624 328 -80 ) subway/1_tile_middle 1072 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4499 +{ +( 784 512 -8 ) ( 784 512 -80 ) ( 720 512 -80 ) subway/1_tile_middle 880 130 0 0.500000 -0.500000 0 318767104 0 +( 664 536 -80 ) ( 664 536 -8 ) ( 664 544 -8 ) subway/1_tile_middle 400 130 0 0.500000 -0.500000 0 318767104 0 +( 664 552 40 ) ( 528 552 40 ) ( 528 552 -64 ) subway/1_tile_middle 880 130 0 0.500000 -0.500000 0 318767104 0 +( 552 544 -8 ) ( 552 544 -80 ) ( 552 552 -80 ) subway/1_tile_middle 400 130 0 0.500000 -0.500000 0 318767104 0 +( 648 616 -48 ) ( 648 552 -48 ) ( 584 552 -48 ) subway/1_tile_middle 64 1394 90 0.500000 -0.500000 0 318767104 0 +( 584 552 -64 ) ( 648 552 -64 ) ( 648 616 -64 ) subway/1_tile -2480 -864 90 0.500000 0.500000 0 318767104 0 +} +// brush 4500 +{ +( 720 264 -64 ) ( 720 328 -64 ) ( 656 328 -64 ) subway/1_tile -2480 -1008 90 0.500000 0.500000 0 318767104 0 +( 656 328 -48 ) ( 720 328 -48 ) ( 720 264 -48 ) subway/1_tile_middle 64 1538 90 0.500000 -0.500000 0 318767104 0 +( 664 336 -80 ) ( 664 344 -80 ) ( 664 344 -8 ) subway/1_tile_middle 400 130 0 0.500000 -0.500000 0 318767104 0 +( 600 328 -64 ) ( 600 328 40 ) ( 736 328 40 ) subway/1_tile_middle 736 130 0 0.500000 -0.500000 0 318767104 0 +( 720 336 -8 ) ( 720 344 -8 ) ( 720 344 -80 ) subway/1_tile_middle 400 130 0 0.500000 -0.500000 0 318767104 0 +( 792 384 -80 ) ( 856 384 -80 ) ( 856 384 -8 ) subway/1_tile_middle 736 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4501 +{ +( 712 216 -104 ) ( 712 280 -104 ) ( 648 280 -104 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 648 280 -64 ) ( 712 280 -64 ) ( 712 216 -64 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 600 320 -48 ) ( 600 320 -120 ) ( 592 320 -120 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 648 288 -72 ) ( 648 152 -72 ) ( 648 152 -176 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 664 328 -96 ) ( 664 328 -24 ) ( 656 328 -24 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 688 416 -48 ) ( 688 416 -120 ) ( 688 352 -120 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4502 +{ +( 640 216 -120 ) ( 640 280 -120 ) ( 576 280 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 280 -104 ) ( 640 280 -104 ) ( 640 216 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 528 320 -64 ) ( 528 320 -136 ) ( 520 320 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 520 296 -88 ) ( 520 160 -88 ) ( 520 160 -192 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 648 328 -136 ) ( 648 328 -64 ) ( 640 328 -64 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 680 416 -64 ) ( 680 416 -136 ) ( 680 352 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4503 +{ +( 680 224 -168 ) ( 680 288 -168 ) ( 616 288 -168 ) subway/1_tile_bottom 72 -1200 0 0.500000 0.500000 0 318767104 0 +( 616 288 -152 ) ( 680 288 -152 ) ( 680 224 -152 ) subway/1_tile_bottom 72 -1200 0 0.500000 0.500000 0 318767104 0 +( 688 328 -152 ) ( 688 328 -168 ) ( 680 328 -168 ) subway/1_tile_bottom 72 16 0 0.500000 0.500000 0 318767104 0 +( 680 256 -152 ) ( 680 120 -152 ) ( 680 120 -168 ) subway/1_tile_bottom 1224 16 0 0.500000 0.500000 0 318767104 0 +( 688 368 -168 ) ( 688 368 -152 ) ( 680 368 -152 ) subway/1_tile_bottom 72 16 0 0.500000 0.500000 0 318767104 0 +( 720 424 -152 ) ( 720 424 -168 ) ( 720 360 -168 ) subway/1_tile_bottom 1224 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4504 +{ +( 720 424 -80 ) ( 720 424 -152 ) ( 720 360 -152 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 688 368 -152 ) ( 688 368 -80 ) ( 680 368 -80 ) subway/1_tile -2560 -32 0 0.500000 0.500000 0 318767104 0 +( 680 304 -104 ) ( 680 168 -104 ) ( 680 168 -208 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 688 328 -80 ) ( 688 328 -152 ) ( 680 328 -152 ) subway/1_tile -2560 -32 0 0.500000 0.500000 0 318767104 0 +( 616 288 -120 ) ( 680 288 -120 ) ( 680 224 -120 ) subway/1_tile -2560 -1248 0 0.500000 0.500000 0 318767104 0 +( 680 224 -152 ) ( 680 288 -152 ) ( 616 288 -152 ) subway/1_tile -2560 -1248 0 0.500000 0.500000 0 318767104 0 +} +// brush 4505 +{ +( 680 224 -120 ) ( 680 288 -120 ) ( 616 288 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 288 -104 ) ( 680 288 -104 ) ( 680 224 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 688 328 -64 ) ( 688 328 -136 ) ( 680 328 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 680 304 -88 ) ( 680 168 -88 ) ( 680 168 -192 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 688 368 -136 ) ( 688 368 -64 ) ( 680 368 -64 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 424 -64 ) ( 720 424 -136 ) ( 720 360 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4506 +{ +( 536 512 -64 ) ( 536 552 -64 ) ( 536 552 -104 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 504 552 -96 ) ( 504 552 -24 ) ( 496 552 -24 ) subway/1_tile -2192 -32 0 0.500000 0.500000 0 318767104 0 +( 496 496 -48 ) ( 496 360 -48 ) ( 496 360 -152 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 496 512 -64 ) ( 552 512 -64 ) ( 536 512 -104 ) subway/1_tile -2192 -32 0 0.500000 0.500000 0 318767104 0 +( 536 552 -64 ) ( 536 512 -64 ) ( 496 512 -64 ) subway/1_tile -2192 -1248 0 0.500000 0.500000 0 318767104 0 +( 496 416 -104 ) ( 496 480 -104 ) ( 432 480 -104 ) subway/1_tile -2192 -1248 0 0.500000 0.500000 0 318767104 0 +} +// brush 4507 +{ +( 536 616 -64 ) ( 536 616 -136 ) ( 536 552 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 504 552 -136 ) ( 504 552 -64 ) ( 496 552 -64 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 496 496 -88 ) ( 496 360 -88 ) ( 496 360 -192 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 504 512 -64 ) ( 504 512 -136 ) ( 496 512 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 432 480 -104 ) ( 496 480 -104 ) ( 496 416 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 496 416 -120 ) ( 496 480 -120 ) ( 432 480 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4508 +{ +( 496 416 -152 ) ( 496 480 -152 ) ( 432 480 -152 ) subway/1_tile -2192 -1248 0 0.500000 0.500000 0 318767104 0 +( 432 480 -120 ) ( 496 480 -120 ) ( 496 416 -120 ) subway/1_tile -2192 -1248 0 0.500000 0.500000 0 318767104 0 +( 504 512 -80 ) ( 504 512 -152 ) ( 496 512 -152 ) subway/1_tile -2192 -32 0 0.500000 0.500000 0 318767104 0 +( 496 496 -104 ) ( 496 360 -104 ) ( 496 360 -208 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 504 552 -152 ) ( 504 552 -80 ) ( 496 552 -80 ) subway/1_tile -2192 -32 0 0.500000 0.500000 0 318767104 0 +( 536 616 -80 ) ( 536 616 -152 ) ( 536 552 -152 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4509 +{ +( 496 416 -168 ) ( 496 480 -168 ) ( 432 480 -168 ) subway/1_tile_bottom 440 -1200 0 0.500000 0.500000 0 318767104 0 +( 432 480 -152 ) ( 496 480 -152 ) ( 496 416 -152 ) subway/1_tile_bottom 440 -1200 0 0.500000 0.500000 0 318767104 0 +( 504 512 -152 ) ( 504 512 -168 ) ( 496 512 -168 ) subway/1_tile_bottom 440 16 0 0.500000 0.500000 0 318767104 0 +( 496 448 -152 ) ( 496 312 -152 ) ( 496 312 -168 ) subway/1_tile_bottom 1224 16 0 0.500000 0.500000 0 318767104 0 +( 504 552 -168 ) ( 504 552 -152 ) ( 496 552 -152 ) subway/1_tile_bottom 440 16 0 0.500000 0.500000 0 318767104 0 +( 536 616 -152 ) ( 536 616 -168 ) ( 536 552 -168 ) subway/1_tile_bottom 1224 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4510 +{ +( 720 328 -96 ) ( 720 264 -96 ) ( 720 264 -24 ) subway/1_tile -1408 32 0 0.500000 0.500000 0 318767104 0 +( 680 328 -24 ) ( 688 328 -24 ) ( 688 328 -96 ) subway/1_tile -2560 32 0 0.500000 0.500000 0 318767104 0 +( 680 384 -64 ) ( 680 328 -64 ) ( 680 328 -104 ) subway/1_tile -1408 32 0 0.500000 0.500000 0 318767104 0 +( 720 368 -64 ) ( 680 368 -64 ) ( 680 368 -104 ) subway/1_tile -2560 32 0 0.500000 0.500000 0 318767104 0 +( 680 368 -64 ) ( 720 368 -64 ) ( 720 328 -64 ) subway/1_tile -2560 -1248 0 0.500000 0.500000 0 318767104 0 +( 616 400 -104 ) ( 680 400 -104 ) ( 680 464 -104 ) subway/1_tile -2560 -1248 0 0.500000 0.500000 0 318767104 0 +} +// brush 4511 +{ +( 720 616 -64 ) ( 720 616 -136 ) ( 720 552 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 688 552 -136 ) ( 688 552 -64 ) ( 680 552 -64 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 680 496 -88 ) ( 680 360 -88 ) ( 680 360 -192 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 688 512 -64 ) ( 688 512 -136 ) ( 680 512 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 480 -104 ) ( 680 480 -104 ) ( 680 416 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 680 416 -120 ) ( 680 480 -120 ) ( 616 480 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4512 +{ +( 680 416 -152 ) ( 680 480 -152 ) ( 616 480 -152 ) subway/1_tile -2560 -1248 0 0.500000 0.500000 0 318767104 0 +( 616 480 -120 ) ( 680 480 -120 ) ( 680 416 -120 ) subway/1_tile -2560 -1248 0 0.500000 0.500000 0 318767104 0 +( 688 512 -80 ) ( 688 512 -152 ) ( 680 512 -152 ) subway/1_tile -2560 -32 0 0.500000 0.500000 0 318767104 0 +( 680 496 -104 ) ( 680 360 -104 ) ( 680 360 -208 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +( 688 552 -152 ) ( 688 552 -80 ) ( 680 552 -80 ) subway/1_tile -2560 -32 0 0.500000 0.500000 0 318767104 0 +( 720 616 -80 ) ( 720 616 -152 ) ( 720 552 -152 ) subway/1_tile -1408 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4513 +{ +( 680 416 -168 ) ( 680 480 -168 ) ( 616 480 -168 ) subway/1_tile_bottom 72 -1200 0 0.500000 0.500000 0 318767104 0 +( 616 480 -152 ) ( 680 480 -152 ) ( 680 416 -152 ) subway/1_tile_bottom 72 -1200 0 0.500000 0.500000 0 318767104 0 +( 688 512 -152 ) ( 688 512 -168 ) ( 680 512 -168 ) subway/1_tile_bottom 72 16 0 0.500000 0.500000 0 318767104 0 +( 680 448 -152 ) ( 680 312 -152 ) ( 680 312 -168 ) subway/1_tile_bottom 1224 16 0 0.500000 0.500000 0 318767104 0 +( 688 552 -168 ) ( 688 552 -152 ) ( 680 552 -152 ) subway/1_tile_bottom 72 16 0 0.500000 0.500000 0 318767104 0 +( 720 616 -152 ) ( 720 616 -168 ) ( 720 552 -168 ) subway/1_tile_bottom 1224 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4514 +{ +( 680 416 -64 ) ( 680 480 -64 ) ( 616 480 -64 ) subway/1_tile -2560 -1248 0 0.500000 0.500000 0 318767104 0 +( 616 480 -48 ) ( 680 480 -48 ) ( 680 416 -48 ) subway/1_tile_middle 64 1346 0 0.500000 -0.500000 0 318767104 0 +( 688 328 -8 ) ( 688 328 -80 ) ( 680 328 -80 ) subway/1_tile_middle 64 130 0 0.500000 -0.500000 0 318767104 0 +( 680 496 40 ) ( 680 360 40 ) ( 680 360 -64 ) subway/1_tile_middle 1216 130 0 0.500000 -0.500000 0 318767104 0 +( 688 552 -80 ) ( 688 552 -8 ) ( 680 552 -8 ) subway/1_tile_middle 64 130 0 0.500000 -0.500000 0 318767104 0 +( 720 616 -8 ) ( 720 616 -80 ) ( 720 552 -80 ) subway/1_tile_middle 1216 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4515 +{ +( 536 328 -168 ) ( 536 264 -168 ) ( 536 264 -152 ) subway/1_tile_bottom 1544 16 0 0.500000 0.500000 0 318767104 0 +( 496 328 -152 ) ( 504 328 -152 ) ( 504 328 -168 ) subway/1_tile_bottom 440 16 0 0.500000 0.500000 0 318767104 0 +( 496 568 -168 ) ( 496 568 -152 ) ( 496 432 -152 ) subway/1_tile_bottom 1544 16 0 0.500000 0.500000 0 318767104 0 +( 496 368 -168 ) ( 504 368 -168 ) ( 504 368 -152 ) subway/1_tile_bottom 440 16 0 0.500000 0.500000 0 318767104 0 +( 496 464 -152 ) ( 496 400 -152 ) ( 432 400 -152 ) subway/1_tile_bottom 440 -1520 0 0.500000 0.500000 0 318767104 0 +( 432 400 -168 ) ( 496 400 -168 ) ( 496 464 -168 ) subway/1_tile_bottom 440 -1520 0 0.500000 0.500000 0 318767104 0 +} +// brush 4516 +{ +( 536 328 -152 ) ( 536 264 -152 ) ( 536 264 -80 ) subway/1_tile -1088 -32 0 0.500000 0.500000 0 318767104 0 +( 496 328 -80 ) ( 504 328 -80 ) ( 504 328 -152 ) subway/1_tile -2192 -32 0 0.500000 0.500000 0 318767104 0 +( 496 520 -208 ) ( 496 520 -104 ) ( 496 384 -104 ) subway/1_tile -1088 -32 0 0.500000 0.500000 0 318767104 0 +( 496 368 -152 ) ( 504 368 -152 ) ( 504 368 -80 ) subway/1_tile -2192 -32 0 0.500000 0.500000 0 318767104 0 +( 496 464 -120 ) ( 496 400 -120 ) ( 432 400 -120 ) subway/1_tile -2192 -1568 0 0.500000 0.500000 0 318767104 0 +( 432 400 -152 ) ( 496 400 -152 ) ( 496 464 -152 ) subway/1_tile -2192 -1568 0 0.500000 0.500000 0 318767104 0 +} +// brush 4517 +{ +( 432 400 -120 ) ( 496 400 -120 ) ( 496 464 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 496 464 -104 ) ( 496 400 -104 ) ( 432 400 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 496 368 -136 ) ( 504 368 -136 ) ( 504 368 -64 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 496 520 -192 ) ( 496 520 -88 ) ( 496 384 -88 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 496 328 -64 ) ( 504 328 -64 ) ( 504 328 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 328 -136 ) ( 536 264 -136 ) ( 536 264 -64 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4518 +{ +( 432 400 -104 ) ( 496 400 -104 ) ( 496 464 -104 ) subway/1_tile -2192 -1568 0 0.500000 0.500000 0 318767104 0 +( 496 368 -64 ) ( 536 368 -64 ) ( 536 328 -64 ) subway/1_tile -2192 -1568 0 0.500000 0.500000 0 318767104 0 +( 536 368 -64 ) ( 496 368 -64 ) ( 496 368 -104 ) subway/1_tile -2192 -32 0 0.500000 0.500000 0 318767104 0 +( 496 520 -152 ) ( 496 520 -48 ) ( 496 384 -48 ) subway/1_tile -1088 -32 0 0.500000 0.500000 0 318767104 0 +( 496 328 -24 ) ( 504 328 -24 ) ( 504 328 -96 ) subway/1_tile -2192 -32 0 0.500000 0.500000 0 318767104 0 +( 536 328 -64 ) ( 536 384 -64 ) ( 536 368 -104 ) subway/1_tile -1088 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4519 +{ +( 712 384 -8 ) ( 712 384 -80 ) ( 648 384 -80 ) subway/1_tile_middle 1024 130 0 0.500000 -0.500000 0 318767104 0 +( 528 488 -80 ) ( 528 488 -8 ) ( 528 496 -8 ) subway/1_tile_middle 512 130 0 0.500000 -0.500000 0 318767104 0 +( 592 496 40 ) ( 456 496 40 ) ( 456 496 -64 ) subway/1_tile_middle 1024 130 0 0.500000 -0.500000 0 318767104 0 +( 520 480 -8 ) ( 520 480 -80 ) ( 520 488 -80 ) subway/1_tile_middle 512 130 0 0.500000 -0.500000 0 318767104 0 +( 576 560 -48 ) ( 576 496 -48 ) ( 512 496 -48 ) subway/1_tile_middle 176 1250 90 0.500000 -0.500000 0 318767104 0 +( 512 496 -64 ) ( 576 496 -64 ) ( 576 560 -64 ) subway/1_tile -2368 -720 90 0.500000 0.500000 0 318767104 0 +} +// brush 4520 +{ +( 680 416 -32 ) ( 680 416 -104 ) ( 680 352 -104 ) subway/1_tile_middle 1216 130 0 0.500000 -0.500000 0 318767104 0 +( 648 328 -80 ) ( 648 328 -8 ) ( 640 328 -8 ) subway/1_tile_middle 1216 130 0 0.500000 -0.500000 0 318767104 0 +( 520 296 -56 ) ( 520 160 -56 ) ( 520 160 -160 ) subway/1_tile_middle 1216 130 0 0.500000 -0.500000 0 318767104 0 +( 528 320 -32 ) ( 528 320 -104 ) ( 520 320 -104 ) subway/1_tile_middle 1216 130 0 0.500000 -0.500000 0 318767104 0 +( 576 280 -48 ) ( 640 280 -48 ) ( 640 216 -48 ) subway/1_tile_middle 1216 130 0 0.500000 -0.500000 0 318767104 0 +( 640 216 -64 ) ( 640 280 -64 ) ( 576 280 -64 ) subway/1_tile_middle 1216 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4521 +{ +( 680 416 -152 ) ( 680 416 -168 ) ( 680 352 -168 ) subway/1_tile_bottom 1240 16 0 0.500000 0.500000 0 318767104 0 +( 648 328 -168 ) ( 648 328 -152 ) ( 640 328 -152 ) subway/1_tile_bottom 152 16 0 0.500000 0.500000 0 318767104 0 +( 520 248 -152 ) ( 520 112 -152 ) ( 520 112 -168 ) subway/1_tile_bottom 1240 16 0 0.500000 0.500000 0 318767104 0 +( 528 320 -152 ) ( 528 320 -168 ) ( 520 320 -168 ) subway/1_tile_bottom 152 16 0 0.500000 0.500000 0 318767104 0 +( 576 280 -152 ) ( 640 280 -152 ) ( 640 216 -152 ) subway/1_tile_bottom 152 -1216 0 0.500000 0.500000 0 318767104 0 +( 640 216 -168 ) ( 640 280 -168 ) ( 576 280 -168 ) subway/1_tile_bottom 152 -1216 0 0.500000 0.500000 0 318767104 0 +} +// brush 4522 +{ +( 528 944 -168 ) ( 528 952 -168 ) ( 496 968 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 528 952 -152 ) ( 528 944 -152 ) ( 496 960 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 496 968 -64 ) ( 496 968 -168 ) ( 496 976 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 528 952 -168 ) ( 528 952 -152 ) ( 496 968 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 18 +( 528 936 -128 ) ( 528 936 -120 ) ( 528 1000 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 528 944 -152 ) ( 528 944 -168 ) ( 496 960 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 528 968 0 ) ( 504 944 0 ) ( 504 944 10 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +} +// brush 4523 +{ +( 528 944 -120 ) ( 528 944 -152 ) ( 496 960 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 936 -112 ) ( 528 936 -104 ) ( 528 1000 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 528 952 -152 ) ( 528 952 -120 ) ( 496 968 -120 ) subway/1_tile_damage2 112 48 0 -0.500000 0.500000 0 352321536 18 +( 496 968 -48 ) ( 496 968 -152 ) ( 496 976 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 528 952 -120 ) ( 528 944 -120 ) ( 496 960 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 528 944 -152 ) ( 528 952 -152 ) ( 496 968 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 528 968 0 ) ( 512 952 0 ) ( 512 952 10 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +} +// brush 4524 +{ +( 528 944 -104 ) ( 528 944 -120 ) ( 496 960 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 528 936 -96 ) ( 528 936 -88 ) ( 528 1000 -88 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 528 952 -120 ) ( 528 952 -104 ) ( 496 968 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 496 968 -32 ) ( 496 968 -136 ) ( 496 976 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 528 952 -104 ) ( 528 944 -104 ) ( 496 960 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 528 944 -120 ) ( 528 952 -120 ) ( 496 968 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 528 968 0 ) ( 512 952 0 ) ( 512 952 10 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4525 +{ +( 528 944 -64 ) ( 528 944 -104 ) ( 496 960 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 936 -64 ) ( 528 936 -56 ) ( 528 1000 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 952 -104 ) ( 528 952 -64 ) ( 496 968 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 18 +( 496 968 0 ) ( 496 968 -104 ) ( 496 976 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 952 -64 ) ( 528 944 -64 ) ( 496 960 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 944 -104 ) ( 528 952 -104 ) ( 496 968 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 968 0 ) ( 512 952 0 ) ( 512 952 10 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +} +// brush 4526 +{ +( 528 968 0 ) ( 496 936 0 ) ( 496 936 10 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 528 944 -48 ) ( 528 944 -64 ) ( 496 960 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 528 936 -32 ) ( 528 936 -24 ) ( 528 1000 -24 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 528 952 -64 ) ( 528 952 -48 ) ( 496 968 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 18 +( 496 968 32 ) ( 496 968 -72 ) ( 496 976 -72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 528 952 -48 ) ( 528 944 -48 ) ( 496 960 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 528 944 -64 ) ( 528 952 -64 ) ( 496 968 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4527 +{ +( 528 936 -64 ) ( 512 968 -64 ) ( 504 968 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 520 936 -48 ) ( 504 968 -48 ) ( 512 968 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 536 936 -72 ) ( 528 936 -72 ) ( 528 936 32 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 528 936 -48 ) ( 512 968 -48 ) ( 512 968 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 18 +( 560 968 -24 ) ( 496 968 -24 ) ( 496 968 -32 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 520 936 -64 ) ( 504 968 -64 ) ( 504 968 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 496 936 10 ) ( 496 936 0 ) ( 528 968 0 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +} +// brush 4528 +{ +( 512 952 10 ) ( 512 952 0 ) ( 528 968 0 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 528 936 -104 ) ( 512 968 -104 ) ( 504 968 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 520 936 -64 ) ( 504 968 -64 ) ( 512 968 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 536 936 -104 ) ( 528 936 -104 ) ( 528 936 0 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 528 936 -64 ) ( 512 968 -64 ) ( 512 968 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 18 +( 560 968 -56 ) ( 496 968 -56 ) ( 496 968 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 520 936 -104 ) ( 504 968 -104 ) ( 504 968 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4529 +{ +( 512 952 10 ) ( 512 952 0 ) ( 528 968 0 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 528 936 -120 ) ( 512 968 -120 ) ( 504 968 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 520 936 -104 ) ( 504 968 -104 ) ( 512 968 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 936 -136 ) ( 528 936 -136 ) ( 528 936 -32 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 528 936 -104 ) ( 512 968 -104 ) ( 512 968 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 560 968 -88 ) ( 496 968 -88 ) ( 496 968 -96 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 520 936 -120 ) ( 504 968 -120 ) ( 504 968 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4530 +{ +( 512 952 10 ) ( 512 952 0 ) ( 528 968 0 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 528 936 -152 ) ( 512 968 -152 ) ( 504 968 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 520 936 -120 ) ( 504 968 -120 ) ( 512 968 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 536 936 -152 ) ( 528 936 -152 ) ( 528 936 -48 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 528 936 -120 ) ( 512 968 -120 ) ( 512 968 -152 ) subway/1_tile_damage2 64 48 0 -0.500000 0.500000 0 352321536 18 +( 560 968 -104 ) ( 496 968 -104 ) ( 496 968 -112 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 520 936 -152 ) ( 504 968 -152 ) ( 504 968 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4531 +{ +( 504 944 10 ) ( 504 944 0 ) ( 528 968 0 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 520 936 -168 ) ( 504 968 -168 ) ( 504 968 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 560 968 -120 ) ( 496 968 -120 ) ( 496 968 -128 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 528 936 -152 ) ( 512 968 -152 ) ( 512 968 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 18 +( 536 936 -168 ) ( 528 936 -168 ) ( 528 936 -64 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 520 936 -152 ) ( 504 968 -152 ) ( 512 968 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 528 936 -168 ) ( 512 968 -168 ) ( 504 968 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4532 +{ +( 528 696 -168 ) ( 528 632 -168 ) ( 592 632 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 592 632 -152 ) ( 528 632 -152 ) ( 528 696 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 528 936 -64 ) ( 528 936 -168 ) ( 536 936 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 528 112 -24 ) ( 528 392 -24 ) ( 528 392 -240 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 536 368 -128 ) ( 536 368 -120 ) ( 600 368 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 520 1264 -168 ) ( 520 1264 -64 ) ( 520 1120 -64 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4533 +{ +( 520 1216 -136 ) ( 520 1216 -32 ) ( 520 1072 -32 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 536 368 -96 ) ( 536 368 -88 ) ( 600 368 -88 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 528 160 8 ) ( 528 440 8 ) ( 528 440 -208 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 528 936 -32 ) ( 528 936 -136 ) ( 536 936 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 592 632 -104 ) ( 528 632 -104 ) ( 528 696 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 528 696 -120 ) ( 528 632 -120 ) ( 592 632 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4534 +{ +( 528 696 -64 ) ( 528 632 -64 ) ( 592 632 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 592 632 -48 ) ( 528 632 -48 ) ( 528 696 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 528 936 32 ) ( 528 936 -72 ) ( 536 936 -72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 528 160 72 ) ( 528 440 72 ) ( 528 440 -144 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 536 552 -32 ) ( 536 552 -24 ) ( 600 552 -24 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 520 1216 -72 ) ( 520 1216 32 ) ( 520 1072 32 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4535 +{ +( 688 1512 -176 ) ( 624 1512 -176 ) ( 624 1448 -176 ) subway/1_concrete_floor -368 1856 0 0.500000 0.500000 0 285212672 0 +( 624 1432 -168 ) ( 624 1496 -168 ) ( 688 1496 -168 ) subway/1_concrete_floor 352 2960 0 0.500000 0.500000 0 285212672 0 +( 784 1304 -184 ) ( 784 1304 -176 ) ( 784 1368 -176 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 504 1136 -184 ) ( 504 1136 -176 ) ( 568 1136 -176 ) subway/1_concrete_floor -3792 -320 0 0.500000 0.500000 0 285212672 0 +( 432 1872 -176 ) ( 432 1872 -168 ) ( 432 1808 -168 ) subway/1_stair_side1 1568 -320 0 0.500000 0.500000 0 285212672 0 +( 696 1384 -176 ) ( 696 1384 -168 ) ( 632 1384 -168 ) subway/1_concrete_floor -3792 -320 0 0.500000 0.500000 0 285212672 0 +} +// brush 4536 +{ +( 720 968 -64 ) ( 688 952 -64 ) ( 688 944 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 720 960 -48 ) ( 688 944 -48 ) ( 688 952 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 720 976 -72 ) ( 720 968 -72 ) ( 720 968 32 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 720 968 -48 ) ( 688 952 -48 ) ( 688 952 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 19 +( 688 1000 -24 ) ( 688 936 -24 ) ( 688 936 -32 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 720 960 -64 ) ( 688 944 -64 ) ( 688 944 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 720 936 10 ) ( 720 936 0 ) ( 688 968 0 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +} +// brush 4537 +{ +( 704 952 10 ) ( 704 952 0 ) ( 688 968 0 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 720 968 -104 ) ( 688 952 -104 ) ( 688 944 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 960 -64 ) ( 688 944 -64 ) ( 688 952 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 976 -104 ) ( 720 968 -104 ) ( 720 968 0 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 968 -64 ) ( 688 952 -64 ) ( 688 952 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 19 +( 688 1000 -56 ) ( 688 936 -56 ) ( 688 936 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 960 -104 ) ( 688 944 -104 ) ( 688 944 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4538 +{ +( 704 952 10 ) ( 704 952 0 ) ( 688 968 0 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 720 968 -152 ) ( 688 952 -152 ) ( 688 944 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 720 960 -120 ) ( 688 944 -120 ) ( 688 952 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 720 976 -152 ) ( 720 968 -152 ) ( 720 968 -48 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 720 968 -120 ) ( 688 952 -120 ) ( 688 952 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 19 +( 688 1000 -104 ) ( 688 936 -104 ) ( 688 936 -112 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 720 960 -152 ) ( 688 944 -152 ) ( 688 944 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4539 +{ +( 712 944 10 ) ( 712 944 0 ) ( 688 968 0 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 720 960 -168 ) ( 688 944 -168 ) ( 688 944 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 688 1000 -120 ) ( 688 936 -120 ) ( 688 936 -128 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 720 968 -152 ) ( 688 952 -152 ) ( 688 952 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 19 +( 720 976 -168 ) ( 720 968 -168 ) ( 720 968 -64 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 720 960 -152 ) ( 688 944 -152 ) ( 688 952 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 720 968 -168 ) ( 688 952 -168 ) ( 688 944 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4540 +{ +( 704 952 10 ) ( 704 952 0 ) ( 688 968 0 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 968 -120 ) ( 688 952 -120 ) ( 688 944 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 960 -104 ) ( 688 944 -104 ) ( 688 952 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 976 -136 ) ( 720 968 -136 ) ( 720 968 -32 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 968 -104 ) ( 688 952 -104 ) ( 688 952 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 688 1000 -88 ) ( 688 936 -88 ) ( 688 936 -96 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 960 -120 ) ( 688 944 -120 ) ( 688 944 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4541 +{ +( 688 968 0 ) ( 720 936 0 ) ( 720 936 10 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 712 968 -48 ) ( 712 968 -64 ) ( 696 936 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 720 968 -32 ) ( 720 968 -24 ) ( 656 968 -24 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 704 968 -64 ) ( 704 968 -48 ) ( 688 936 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 19 +( 688 936 32 ) ( 688 936 -72 ) ( 680 936 -72 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 704 968 -48 ) ( 712 968 -48 ) ( 696 936 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 712 968 -64 ) ( 704 968 -64 ) ( 688 936 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4542 +{ +( 712 968 -168 ) ( 704 968 -168 ) ( 688 936 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 704 968 -152 ) ( 712 968 -152 ) ( 696 936 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 688 936 -64 ) ( 688 936 -168 ) ( 680 936 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 704 968 -168 ) ( 704 968 -152 ) ( 688 936 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 19 +( 720 968 -128 ) ( 720 968 -120 ) ( 656 968 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 712 968 -152 ) ( 712 968 -168 ) ( 696 936 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 688 968 0 ) ( 712 944 0 ) ( 712 944 10 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +} +// brush 4543 +{ +( 712 968 -64 ) ( 712 968 -104 ) ( 696 936 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 968 -64 ) ( 720 968 -56 ) ( 656 968 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 704 968 -104 ) ( 704 968 -64 ) ( 688 936 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 19 +( 688 936 0 ) ( 688 936 -104 ) ( 680 936 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 704 968 -64 ) ( 712 968 -64 ) ( 696 936 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 712 968 -104 ) ( 704 968 -104 ) ( 688 936 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 688 968 0 ) ( 704 952 0 ) ( 704 952 10 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +} +// brush 4544 +{ +( 712 968 -104 ) ( 712 968 -120 ) ( 696 936 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 968 -96 ) ( 720 968 -88 ) ( 656 968 -88 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 704 968 -120 ) ( 704 968 -104 ) ( 688 936 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 688 936 -32 ) ( 688 936 -136 ) ( 680 936 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 704 968 -104 ) ( 712 968 -104 ) ( 696 936 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 712 968 -120 ) ( 704 968 -120 ) ( 688 936 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 688 968 0 ) ( 704 952 0 ) ( 704 952 10 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4545 +{ +( 712 968 -120 ) ( 712 968 -152 ) ( 696 936 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 968 -112 ) ( 720 968 -104 ) ( 656 968 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 704 968 -152 ) ( 704 968 -120 ) ( 688 936 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 19 +( 688 936 -48 ) ( 688 936 -152 ) ( 680 936 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 704 968 -120 ) ( 712 968 -120 ) ( 696 936 -120 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 712 968 -152 ) ( 704 968 -152 ) ( 688 936 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 688 968 0 ) ( 704 952 0 ) ( 704 952 10 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +} +// brush 4546 +{ +( -624 1232 8 ) ( -624 1168 8 ) ( -624 1168 0 ) subway/1_concrete_floor -2464 0 0 0.500000 0.500000 0 285212672 0 +( -560 1192 8 ) ( -624 1192 8 ) ( -624 1192 0 ) subway/1_stair_side1 944 0 0 0.500000 0.500000 0 285212672 0 +( -512 1288 8 ) ( -512 1352 8 ) ( -512 1352 0 ) subway/1_concrete_floor -2464 0 0 0.500000 0.500000 0 285212672 0 +( -496 1168 8 ) ( -432 1168 8 ) ( -432 1168 0 ) subway/1_concrete_floor 944 0 0 0.500000 0.500000 0 285212672 0 +( -560 1168 8 ) ( -560 1232 8 ) ( -496 1232 8 ) subway/1_stair_top1 944 2464 0 0.500000 0.500000 0 285212672 0 +( -496 1232 0 ) ( -560 1232 0 ) ( -560 1168 0 ) subway/1_concrete_floor 944 2464 0 0.500000 0.500000 0 285212672 0 +} +// brush 4547 +{ +( 1048 864 -48 ) ( 984 864 -48 ) ( 984 800 -48 ) subway/1_concrete_floor -32 64 0 0.500000 0.500000 0 285212672 0 +( 984 800 -32 ) ( 984 864 -32 ) ( 1048 864 -32 ) subway/1_lobby4 -144 208 90 0.500000 0.500000 0 285212672 0 +( 840 856 -80 ) ( 840 856 -32 ) ( 840 920 -32 ) subway/1_lobby4 1280 32 0 0.500000 0.500000 0 285212672 0 +( 976 320 -32 ) ( 976 320 -80 ) ( 952 320 -80 ) subway/1_beam1 -304 32 0 0.500000 0.500000 0 16777216 0 +( 720 832 -48 ) ( 720 832 -32 ) ( 720 824 -32 ) subway/1_beam1 1280 32 0 0.500000 0.500000 0 16777216 0 +( 672 552 -32 ) ( 672 552 -48 ) ( 736 552 -48 ) subway/1_lobby4 -304 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 4548 +{ +( 552 -224 -54 ) ( 552 -224 -64 ) ( 656 -328 -64 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -80 -184 ) ( 584 -16 -184 ) ( 584 -16 -168 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -288 -216 ) ( 664 -248 -216 ) ( 664 -248 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 25 +( 664 -256 -216 ) ( 664 -280 -216 ) ( 664 -280 -168 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 584 -328 -184 ) ( 664 -288 -184 ) ( 664 -288 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 20 +( 584 -288 -184 ) ( 664 -248 -184 ) ( 664 -288 -184 ) subway/con5 0 0 0 0.500000 0.500000 0 285212672 0 +( 584 -328 -216 ) ( 664 -288 -216 ) ( 664 -248 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4549 +{ +( 624 -296 18 ) ( 624 -296 8 ) ( 672 -344 8 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 584 -344 -80 ) ( 680 -296 -80 ) ( 680 -240 -80 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 584 -288 -48 ) ( 680 -240 -48 ) ( 680 -296 -48 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 584 -348 -48 ) ( 680 -300 -48 ) ( 680 -300 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 680 -232 -80 ) ( 680 -256 -80 ) ( 680 -256 -32 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 584 -288 -80 ) ( 680 -240 -80 ) ( 680 -240 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 584 -88 -48 ) ( 584 -24 -48 ) ( 584 -24 -32 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +} +// brush 4550 +{ +( 352 -256 -32 ) ( 352 -256 -48 ) ( 416 -256 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 568 -352 -48 ) ( 568 -352 -80 ) ( 616 -256 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 584 -352 -32 ) ( 584 -352 -80 ) ( 560 -352 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 628 -352 -80 ) ( 628 -352 -48 ) ( 676 -256 -48 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 624 -352 -48 ) ( 568 -352 -48 ) ( 616 -256 -48 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 568 -352 -80 ) ( 624 -352 -80 ) ( 672 -256 -80 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 672 -344 8 ) ( 624 -296 8 ) ( 624 -296 18 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +} +// brush 4551 +{ +( 568 -352 -120 ) ( 608 -352 -120 ) ( 656 -256 -120 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 624 -352 -80 ) ( 568 -352 -80 ) ( 616 -256 -80 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 608 -352 -120 ) ( 624 -352 -88 ) ( 672 -256 -88 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 584 -352 -72 ) ( 584 -352 -120 ) ( 560 -352 -120 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 568 -352 -88 ) ( 568 -352 -120 ) ( 616 -256 -120 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 352 -256 -72 ) ( 352 -256 -88 ) ( 416 -256 -88 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 672 -344 0 ) ( 632 -304 0 ) ( 632 -304 10 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +} +// brush 4552 +{ +( 576 -336 -216 ) ( 616 -336 -216 ) ( 656 -256 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -336 -184 ) ( 576 -336 -184 ) ( 616 -256 -184 ) subway/con5 -1 0 0 0.500000 0.500000 0 285212672 0 +( 616 -336 -216 ) ( 616 -336 -184 ) ( 656 -256 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 20 +( 608 -336 -168 ) ( 608 -336 -216 ) ( 584 -336 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 576 -336 -184 ) ( 576 -336 -216 ) ( 616 -256 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 25 +( 344 -256 -168 ) ( 344 -256 -184 ) ( 408 -256 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 656 -328 -64 ) ( 552 -224 -64 ) ( 552 -224 -54 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4553 +{ +( 688 -40 -120 ) ( 688 -104 -120 ) ( 752 -104 -120 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 616 -160 -80 ) ( 672 -160 -80 ) ( 672 -256 -80 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 656 -256 -120 ) ( 672 -256 -88 ) ( 672 -160 -88 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 624 -160 -120 ) ( 648 -160 -120 ) ( 648 -160 -72 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 616 -88 -64 ) ( 616 -96 -64 ) ( 616 -96 -80 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 416 -256 -88 ) ( 352 -256 -88 ) ( 352 -256 -72 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +} +// brush 4554 +{ +( 416 -256 -184 ) ( 352 -256 -184 ) ( 352 -256 -168 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -88 -168 ) ( 616 -96 -168 ) ( 616 -96 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 25 +( 624 -160 -216 ) ( 648 -160 -216 ) ( 648 -160 -168 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 656 -232 -168 ) ( 656 -168 -168 ) ( 656 -168 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 20 +( 752 -104 -184 ) ( 688 -104 -184 ) ( 688 -40 -184 ) subway/con5 0 0 0 0.500000 0.500000 0 285212672 0 +( 688 -40 -216 ) ( 688 -104 -216 ) ( 752 -104 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4555 +{ +( 552 -192 -54 ) ( 552 -192 -64 ) ( 656 -88 -64 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 408 -160 -184 ) ( 344 -160 -184 ) ( 344 -160 -168 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 616 -160 -216 ) ( 576 -80 -216 ) ( 576 -80 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 25 +( 584 -80 -216 ) ( 608 -80 -216 ) ( 608 -80 -168 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 656 -160 -184 ) ( 616 -80 -184 ) ( 616 -80 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 20 +( 616 -160 -184 ) ( 576 -80 -184 ) ( 616 -80 -184 ) subway/con5 -1 0 0 0.500000 0.500000 0 285212672 0 +( 656 -160 -216 ) ( 616 -80 -216 ) ( 576 -80 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4556 +{ +( 632 -112 10 ) ( 632 -112 0 ) ( 672 -72 0 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 416 -160 -88 ) ( 352 -160 -88 ) ( 352 -160 -72 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 616 -160 -120 ) ( 568 -64 -120 ) ( 568 -64 -88 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 560 -64 -120 ) ( 584 -64 -120 ) ( 584 -64 -72 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 672 -160 -88 ) ( 624 -64 -88 ) ( 608 -64 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 616 -160 -80 ) ( 568 -64 -80 ) ( 624 -64 -80 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 656 -160 -120 ) ( 608 -64 -120 ) ( 568 -64 -120 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +} +// brush 4557 +{ +( 624 -120 18 ) ( 624 -120 8 ) ( 672 -72 8 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 672 -160 -80 ) ( 624 -64 -80 ) ( 568 -64 -80 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 616 -160 -48 ) ( 568 -64 -48 ) ( 624 -64 -48 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 676 -160 -48 ) ( 628 -64 -48 ) ( 628 -64 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 560 -64 -80 ) ( 584 -64 -80 ) ( 584 -64 -32 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 616 -160 -80 ) ( 568 -64 -80 ) ( 568 -64 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 416 -160 -48 ) ( 352 -160 -48 ) ( 352 -160 -32 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +} +// brush 4558 +{ +( 416 -256 -48 ) ( 352 -256 -48 ) ( 352 -256 -32 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 616 -88 -32 ) ( 616 -96 -32 ) ( 616 -96 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 624 -160 -80 ) ( 648 -160 -80 ) ( 648 -160 -32 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 676 -232 -32 ) ( 676 -168 -32 ) ( 676 -168 -80 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 752 -104 -48 ) ( 688 -104 -48 ) ( 688 -40 -48 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 688 -40 -80 ) ( 688 -104 -80 ) ( 752 -104 -80 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +} +// brush 4559 +{ +( 584 -392 -32 ) ( 584 -392 -48 ) ( 584 -328 -48 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 680 -176 -48 ) ( 680 -176 -80 ) ( 584 -128 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 680 -160 -32 ) ( 680 -160 -80 ) ( 680 -184 -80 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +( 680 -116 -80 ) ( 680 -116 -48 ) ( 584 -68 -48 ) subway/1_lobby4 0 32 0 0.500000 0.500000 0 285212672 0 +( 680 -120 -48 ) ( 680 -176 -48 ) ( 584 -128 -48 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 680 -176 -80 ) ( 680 -120 -80 ) ( 584 -72 -80 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 672 -72 8 ) ( 624 -120 8 ) ( 624 -120 18 ) subway/1_lobby4 0 16 0 1 1 0 285212672 0 +} +// brush 4560 +{ +( 680 -176 -120 ) ( 680 -136 -120 ) ( 584 -88 -120 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 680 -120 -80 ) ( 680 -176 -80 ) ( 584 -128 -80 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 680 -136 -120 ) ( 680 -120 -88 ) ( 584 -72 -88 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 680 -160 -72 ) ( 680 -160 -120 ) ( 680 -184 -120 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 680 -176 -88 ) ( 680 -176 -120 ) ( 584 -128 -120 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 584 -392 -72 ) ( 584 -392 -88 ) ( 584 -328 -88 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +( 672 -72 0 ) ( 632 -112 0 ) ( 632 -112 10 ) subway/1_lobby4 0 8 0 1 1 0 285212672 0 +} +// brush 4561 +{ +( 664 -168 -216 ) ( 664 -128 -216 ) ( 584 -88 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 664 -128 -184 ) ( 664 -168 -184 ) ( 584 -128 -184 ) subway/con5 0 0 0 0.500000 0.500000 0 285212672 0 +( 664 -128 -216 ) ( 664 -128 -184 ) ( 584 -88 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 20 +( 664 -136 -168 ) ( 664 -136 -216 ) ( 664 -160 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 664 -168 -184 ) ( 664 -168 -216 ) ( 584 -128 -216 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 25 +( 584 -400 -168 ) ( 584 -400 -184 ) ( 584 -336 -184 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +( 656 -88 -64 ) ( 552 -192 -64 ) ( 552 -192 -54 ) subway/1_lobby1 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4562 +{ +( 744 -512 -120 ) ( 744 -576 -120 ) ( 808 -576 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 808 -576 -80 ) ( 744 -576 -80 ) ( 744 -512 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 880 -600 -120 ) ( 880 -608 -120 ) ( 880 -608 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 1400 -600 -80 ) ( 1400 -600 -120 ) ( 1544 -600 -120 ) subway/1_lobby3 0 32 0 0.500000 0.500000 0 285212672 0 +( 576 -608 -80 ) ( 576 -608 -120 ) ( 576 -600 -120 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +( 232 -608 -120 ) ( 232 -608 -80 ) ( 616 -608 -80 ) subway/1_lobby3 0 0 0 1 1 0 285212672 0 +} +// brush 4563 +{ +( -616 1232 -112 ) ( -680 1232 -112 ) ( -680 1168 -112 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -624 1192 8 ) ( -632 1192 8 ) ( -632 1528 -104 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -632 1168 8 ) ( -624 1168 8 ) ( -624 1168 -112 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -624 1288 8 ) ( -624 1352 8 ) ( -624 1352 0 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -624 1528 -104 ) ( -632 1528 -104 ) ( -632 1528 -112 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +( -632 1432 8 ) ( -632 1368 8 ) ( -632 1368 0 ) subway/metal2 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 4564 +{ +( 212 616 -48 ) ( 212 656 -48 ) ( 212 656 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 136 632 -48 ) ( 208 632 -48 ) ( 208 632 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 168 656 -48 ) ( 168 616 -48 ) ( 168 616 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 208 648 -48 ) ( 136 648 -48 ) ( 136 648 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 208 656 -48 ) ( 208 616 -48 ) ( 136 616 -48 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 136 616 -52 ) ( 208 616 -52 ) ( 208 656 -52 ) subway/light_tube 48 16 0 0.500000 0.500000 0 1 5000 +} +// brush 4565 +{ +( 152 1488 -48 ) ( 152 1448 -48 ) ( 152 1448 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 236 1472 -48 ) ( 164 1472 -48 ) ( 164 1472 -56 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 196 1448 -48 ) ( 196 1488 -48 ) ( 196 1488 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 164 1456 -48 ) ( 236 1456 -48 ) ( 236 1456 -56 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 164 1448 -48 ) ( 164 1488 -48 ) ( 236 1488 -48 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 236 1488 -52 ) ( 164 1488 -52 ) ( 164 1448 -52 ) subway/light_tube 80 0 0 0.500000 0.500000 134217728 1 8000 +} +// brush 4566 +{ +( 692 1120 -64 ) ( 708 1120 -64 ) ( 708 1128 -64 ) subway/metal_clean -416 0 0 0.500000 0.500000 134217728 16777216 0 +( 708 1128 -48 ) ( 708 1120 -48 ) ( 692 1120 -48 ) subway/metal_clean -416 0 0 0.500000 0.500000 134217728 16777216 0 +( 704 1128 -48 ) ( 688 1128 -48 ) ( 688 1128 -64 ) subway/metal_clean -416 0 0 0.500000 0.500000 134217728 16777216 0 +( 692 1128 -48 ) ( 692 1120 -48 ) ( 692 1120 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 688 1124 -48 ) ( 704 1124 -48 ) ( 704 1124 -64 ) subway/light_yellow -360 0 0 0.500000 0.500000 134217728 16777217 20000 +( 708 1120 -48 ) ( 708 1128 -48 ) ( 708 1128 -64 ) subway/metal_clean 16 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4567 +{ +( -272 1200 -64 ) ( -288 1200 -64 ) ( -288 1192 -64 ) subway/metal_clean -192 0 0 0.500000 0.500000 134217728 16777216 0 +( -288 1192 -48 ) ( -288 1200 -48 ) ( -272 1200 -48 ) subway/metal_clean -192 0 0 0.500000 0.500000 134217728 16777216 0 +( -288 1192 -48 ) ( -272 1192 -48 ) ( -272 1192 -64 ) subway/metal_clean -192 0 0 0.500000 0.500000 134217728 16777216 0 +( -272 1192 -48 ) ( -272 1200 -48 ) ( -272 1200 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -272 1196 -48 ) ( -288 1196 -48 ) ( -288 1196 -64 ) subway/light_yellow -192 0 0 0.500000 0.500000 134217728 1 12000 +( -288 1200 -48 ) ( -288 1192 -48 ) ( -288 1192 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4568 +{ +( -528 1520 56 ) ( -600 1520 56 ) ( -600 1512 56 ) subway/sign7 0 0 0 0.500000 0.500000 0 0 0 +( -600 1512 88 ) ( -600 1520 88 ) ( -528 1520 88 ) subway/sign7 0 0 0 0.500000 0.500000 0 0 0 +( -600 1518 136 ) ( -528 1518 136 ) ( -528 1518 56 ) subway/sign7 -80 -16 0 0.500000 0.500000 0 0 0 +( -536 1512 136 ) ( -536 1520 136 ) ( -536 1520 56 ) subway/sign7 0 -16 0 0.500000 0.500000 0 0 0 +( -528 1520 136 ) ( -600 1520 136 ) ( -600 1520 56 ) subway/sign7 0 -16 0 0.500000 0.500000 0 0 0 +( -600 1520 136 ) ( -600 1512 136 ) ( -600 1512 56 ) subway/sign7 0 -16 0 0.500000 0.500000 0 0 0 +} +// brush 4569 +{ +( 840 544 -120 ) ( 840 552 -120 ) ( 840 552 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 544 -120 ) ( 728 544 -120 ) ( 728 544 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 776 -120 ) ( 720 776 -104 ) ( 720 640 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 552 -152 ) ( 840 552 -152 ) ( 840 552 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 672 -120 ) ( 720 608 -120 ) ( 656 608 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 656 608 -152 ) ( 720 608 -152 ) ( 720 672 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4570 +{ +( 656 608 -120 ) ( 720 608 -120 ) ( 720 672 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 672 -104 ) ( 720 608 -104 ) ( 656 608 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 552 -120 ) ( 840 552 -120 ) ( 840 552 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 720 776 -104 ) ( 720 776 -88 ) ( 720 640 -88 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 712 544 -104 ) ( 720 544 -104 ) ( 720 544 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 840 544 -104 ) ( 840 552 -104 ) ( 840 552 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4571 +{ +( 656 608 -104 ) ( 720 608 -104 ) ( 720 672 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 672 -64 ) ( 720 608 -64 ) ( 656 608 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 552 -104 ) ( 840 552 -104 ) ( 840 552 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 720 776 -88 ) ( 720 776 -72 ) ( 720 640 -72 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 704 544 -64 ) ( 712 544 -64 ) ( 712 544 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 840 544 -64 ) ( 840 552 -64 ) ( 840 552 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4572 +{ +( 656 608 -64 ) ( 720 608 -64 ) ( 720 672 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 720 672 -48 ) ( 720 608 -48 ) ( 656 608 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 720 552 -64 ) ( 840 552 -64 ) ( 840 552 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 720 776 -72 ) ( 720 776 -56 ) ( 720 640 -56 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 704 544 -48 ) ( 712 544 -48 ) ( 712 544 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 840 544 -48 ) ( 840 552 -48 ) ( 840 552 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4573 +{ +( 840 520 -152 ) ( 840 544 -128 ) ( 840 544 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 720 520 -152 ) ( 728 520 -152 ) ( 728 520 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 720 752 -168 ) ( 720 752 -152 ) ( 720 616 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 720 544 -168 ) ( 840 544 -168 ) ( 840 544 -128 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 720 520 -152 ) ( 720 544 -128 ) ( 840 544 -128 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 656 584 -168 ) ( 720 584 -168 ) ( 720 648 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4574 +{ +( 840 520 -216 ) ( 840 520 -168 ) ( 840 544 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 728 544 -184 ) ( 728 544 -168 ) ( 720 544 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 720 448 -168 ) ( 720 312 -168 ) ( 720 312 -184 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 520 -168 ) ( 840 520 -216 ) ( 720 520 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 656 480 -168 ) ( 720 480 -168 ) ( 720 416 -168 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 720 416 -216 ) ( 720 480 -216 ) ( 656 480 -216 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4575 +{ +( 360 1024 -64 ) ( 360 1088 -64 ) ( 296 1088 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 296 1088 -48 ) ( 360 1088 -48 ) ( 360 1024 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 368 936 -8 ) ( 368 936 -80 ) ( 360 936 -80 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 360 1104 40 ) ( 360 968 40 ) ( 360 968 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 368 1160 -80 ) ( 368 1160 -8 ) ( 360 1160 -8 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 400 1224 -8 ) ( 400 1224 -80 ) ( 400 1160 -80 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4576 +{ +( 400 1032 -24 ) ( 400 1032 -96 ) ( 400 968 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 992 -64 ) ( 360 992 -64 ) ( 360 976 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 360 912 -48 ) ( 360 776 -48 ) ( 360 776 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 368 936 -24 ) ( 368 936 -96 ) ( 360 936 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 360 984 -64 ) ( 400 984 -64 ) ( 400 936 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 360 832 -104 ) ( 360 896 -104 ) ( 296 896 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4577 +{ +( 360 832 -120 ) ( 360 896 -120 ) ( 296 896 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 296 896 -104 ) ( 360 896 -104 ) ( 360 832 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 368 936 -64 ) ( 368 936 -136 ) ( 360 936 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 360 912 -88 ) ( 360 776 -88 ) ( 360 776 -192 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 368 976 -136 ) ( 368 976 -64 ) ( 360 976 -64 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 400 1032 -64 ) ( 400 1032 -136 ) ( 400 968 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4578 +{ +( 400 1032 -80 ) ( 400 1032 -152 ) ( 400 968 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 368 976 -152 ) ( 368 976 -80 ) ( 360 976 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 360 912 -104 ) ( 360 776 -104 ) ( 360 776 -208 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 368 936 -80 ) ( 368 936 -152 ) ( 360 936 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 296 896 -120 ) ( 360 896 -120 ) ( 360 832 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 360 832 -152 ) ( 360 896 -152 ) ( 296 896 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4579 +{ +( 400 1032 -152 ) ( 400 1032 -168 ) ( 400 968 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 368 976 -168 ) ( 368 976 -152 ) ( 360 976 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 360 864 -152 ) ( 360 728 -152 ) ( 360 728 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 368 936 -152 ) ( 368 936 -168 ) ( 360 936 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 296 896 -152 ) ( 360 896 -152 ) ( 360 832 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 360 832 -168 ) ( 360 896 -168 ) ( 296 896 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4580 +{ +( 400 1224 -24 ) ( 400 1224 -96 ) ( 400 1160 -96 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 368 1160 -96 ) ( 368 1160 -24 ) ( 360 1160 -24 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 360 1104 -48 ) ( 360 968 -48 ) ( 360 968 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 360 1104 -64 ) ( 400 1104 -64 ) ( 400 1120 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1112 -64 ) ( 360 1112 -64 ) ( 360 1160 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 360 1024 -104 ) ( 360 1088 -104 ) ( 296 1088 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4581 +{ +( 400 1224 -64 ) ( 400 1224 -136 ) ( 400 1160 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 368 1160 -136 ) ( 368 1160 -64 ) ( 360 1160 -64 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 360 1104 -88 ) ( 360 968 -88 ) ( 360 968 -192 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 368 1120 -64 ) ( 368 1120 -136 ) ( 360 1120 -136 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 296 1088 -104 ) ( 360 1088 -104 ) ( 360 1024 -104 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +( 360 1024 -120 ) ( 360 1088 -120 ) ( 296 1088 -120 ) subway/1_tile_big_blue 0 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4582 +{ +( 360 1016 -152 ) ( 360 1080 -152 ) ( 296 1080 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 296 1080 -120 ) ( 360 1080 -120 ) ( 360 1016 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 368 1120 -80 ) ( 368 1120 -152 ) ( 360 1120 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 360 1096 -104 ) ( 360 960 -104 ) ( 360 960 -208 ) subway/1_tile_damage2 48 8 0 0.500000 0.500000 0 352321536 0 +( 368 1144 -152 ) ( 368 1144 -80 ) ( 360 1144 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1216 -80 ) ( 400 1216 -152 ) ( 400 1152 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4583 +{ +( 360 1024 -168 ) ( 360 1088 -168 ) ( 296 1088 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 296 1088 -152 ) ( 360 1088 -152 ) ( 360 1024 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 368 1120 -152 ) ( 368 1120 -168 ) ( 360 1120 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 360 1056 -152 ) ( 360 920 -152 ) ( 360 920 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 368 1160 -168 ) ( 368 1160 -152 ) ( 360 1160 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 400 1224 -152 ) ( 400 1224 -168 ) ( 400 1160 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4584 +{ +( 520 616 -48 ) ( 520 552 -48 ) ( 584 552 -48 ) subway/con14 48 16 0 0.500000 0.500000 0 285212672 0 +( 512 616 -32 ) ( 696 616 -32 ) ( 696 416 -32 ) subway/1_concrete_floor 944 2560 0 0.500000 0.500000 0 285212672 0 +( 704 752 -40 ) ( 520 752 -40 ) ( 520 752 -48 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 400 448 -48 ) ( 400 448 -40 ) ( 400 512 -40 ) subway/1_concrete_floor -2672 -320 0 0.500000 0.500000 0 285212672 0 +( 656 544 -48 ) ( 656 544 -40 ) ( 720 544 -40 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 136 624 -48 ) ( 136 624 -40 ) ( 136 560 -40 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 4585 +{ +( 192 720 -168 ) ( 256 720 -168 ) ( 256 720 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 192 712 -152 ) ( 192 720 -152 ) ( 192 720 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 0 712 -168 ) ( 0 712 -152 ) ( 136 712 -152 ) subway/1_tile_bottom 40 16 0 0.500000 0.500000 0 318767104 0 +( 136 712 -168 ) ( 136 720 -168 ) ( 136 720 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 56 712 -152 ) ( 120 712 -152 ) ( 120 648 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 120 648 -168 ) ( 120 712 -168 ) ( 56 712 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4586 +{ +( 192 720 -152 ) ( 256 720 -152 ) ( 256 720 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 192 712 -80 ) ( 192 720 -80 ) ( 192 720 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 48 712 -152 ) ( 48 712 -48 ) ( 184 712 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 11 +( 136 712 -152 ) ( 136 720 -152 ) ( 136 720 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 56 712 -80 ) ( 120 712 -80 ) ( 120 648 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 120 648 -152 ) ( 120 712 -152 ) ( 56 712 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4587 +{ +( 40 720 -80 ) ( 40 712 -80 ) ( 280 712 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 720 -48 ) ( 280 680 -48 ) ( 280 640 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 136 704 -80 ) ( 136 720 -80 ) ( 136 720 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 448 680 -48 ) ( 448 712 -80 ) ( 208 712 -80 ) subway/1_tile_middle 0 80 0 0.500000 0.500000 0 318767104 11 +( 192 680 -48 ) ( 192 720 -48 ) ( 192 720 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 160 720 -64 ) ( 256 720 -64 ) ( 256 720 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 226 760 -64 ) ( 216 760 -64 ) ( 216 688 -64 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4588 +{ +( 176 720 -80 ) ( 256 720 -80 ) ( 256 720 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 192 696 -64 ) ( 192 720 -64 ) ( 192 720 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 448 680 -48 ) ( 448 712 -80 ) ( 208 712 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 11 +( 136 704 -80 ) ( 136 720 -80 ) ( 136 720 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 720 -64 ) ( 280 680 -64 ) ( 280 640 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 720 -80 ) ( 40 712 -80 ) ( 280 712 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4589 +{ +( 224 792 -168 ) ( 224 944 -168 ) ( 224 944 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 232 968 -152 ) ( 224 960 -152 ) ( 224 960 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 232 584 -168 ) ( 232 584 -152 ) ( 232 720 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 11 +( 232 752 -168 ) ( 224 752 -168 ) ( 224 752 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 232 800 -152 ) ( 232 864 -152 ) ( 296 864 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 296 864 -168 ) ( 232 864 -168 ) ( 232 800 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4590 +{ +( 224 792 -80 ) ( 224 944 -80 ) ( 224 944 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 248 984 -64 ) ( 224 960 -64 ) ( 224 960 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 264 1200 -48 ) ( 232 1200 -80 ) ( 232 960 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 11 +( 240 752 -80 ) ( 224 752 -80 ) ( 224 752 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 784 -64 ) ( 264 1024 -64 ) ( 304 1024 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 784 -80 ) ( 232 784 -80 ) ( 232 1024 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4591 +{ +( 224 784 -80 ) ( 232 784 -80 ) ( 232 1024 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 784 -48 ) ( 264 1024 -48 ) ( 304 1024 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 240 752 -80 ) ( 224 752 -80 ) ( 224 752 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 264 1200 -48 ) ( 232 1200 -80 ) ( 232 960 -80 ) subway/1_tile_middle 0 80 90 0.500000 0.500000 0 318767104 11 +( 264 1000 -48 ) ( 224 960 -48 ) ( 224 960 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 792 -64 ) ( 224 944 -64 ) ( 224 944 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 184 970 -64 ) ( 184 960 -64 ) ( 256 960 -64 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4592 +{ +( 288 1096 -48 ) ( 224 1096 -48 ) ( 224 1032 -48 ) subway/con14 48 16 0 0.500000 0.500000 0 285212672 0 +( 224 1056 -32 ) ( 216 1048 -32 ) ( 216 1280 -32 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 232 960 -48 ) ( 232 960 24 ) ( 240 960 24 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 264 1096 24 ) ( 264 1096 -48 ) ( 264 960 -48 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 248 1200 24 ) ( 248 1200 -48 ) ( 256 1200 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 104 1024 24 ) ( 104 1024 -48 ) ( 104 1248 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4593 +{ +( 376 1384 -48 ) ( 376 1320 -48 ) ( 440 1320 -48 ) subway/con14 48 16 0 0.500000 0.500000 0 285212672 0 +( 368 1384 -32 ) ( 552 1384 -32 ) ( 552 1184 -32 ) subway/1_concrete_floor 944 2560 0 0.500000 0.500000 0 285212672 0 +( 560 1552 -40 ) ( 376 1552 -40 ) ( 376 1552 -48 ) subway/1_concrete_floor 688 -320 0 0.500000 0.500000 0 285212672 0 +( 400 1216 -48 ) ( 400 1216 -40 ) ( 400 1280 -40 ) subway/1_concrete_floor -2672 -320 0 0.500000 0.500000 0 285212672 0 +( 472 1160 -48 ) ( 472 1160 -40 ) ( 536 1160 -40 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 72 1392 -48 ) ( 72 1392 -40 ) ( 72 1328 -40 ) subway/1_concrete_floor -2672 -320 0 0.500000 0.500000 0 285212672 0 +} +// brush 4594 +{ +( 456 616 -48 ) ( 456 680 -48 ) ( 392 680 -48 ) subway/1_concrete_floor -32 16 0 0.500000 0.500000 0 285212672 0 +( 392 680 -40 ) ( 456 680 -40 ) ( 456 616 -40 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 480 328 -40 ) ( 480 328 -56 ) ( 472 328 -56 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 496 648 -40 ) ( 496 512 -40 ) ( 496 512 -56 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 456 968 -48 ) ( 456 968 -32 ) ( 448 968 -32 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 720 784 -40 ) ( 720 784 -56 ) ( 720 720 -56 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 4595 +{ +( 392 1432 -168 ) ( 392 1496 -168 ) ( 328 1496 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 328 1496 -152 ) ( 392 1496 -152 ) ( 392 1432 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 392 1160 -64 ) ( 392 1160 -168 ) ( 384 1160 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 392 1984 -24 ) ( 392 1704 -24 ) ( 392 1704 -240 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 9 +( 392 1344 -128 ) ( 392 1344 -120 ) ( 328 1344 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 400 864 -168 ) ( 400 864 -64 ) ( 400 1008 -64 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4596 +{ +( 232 1136 -80 ) ( 232 1376 -80 ) ( 224 1376 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 304 1136 -64 ) ( 264 1136 -64 ) ( 224 1376 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1344 -48 ) ( 224 1344 -80 ) ( 240 1344 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1296 -80 ) ( 232 1056 -80 ) ( 264 1056 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 10 +( 224 1200 -80 ) ( 224 1200 -64 ) ( 248 1176 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1192 -64 ) ( 224 1192 -80 ) ( 224 1344 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4597 +{ +( 224 1192 -152 ) ( 224 1192 -168 ) ( 224 1344 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 224 1200 -168 ) ( 224 1200 -152 ) ( 232 1192 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 232 1304 -152 ) ( 232 1440 -152 ) ( 232 1440 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 10 +( 224 1344 -152 ) ( 224 1344 -168 ) ( 232 1344 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 296 1296 -152 ) ( 232 1296 -152 ) ( 232 1360 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 232 1360 -168 ) ( 232 1296 -168 ) ( 296 1296 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4598 +{ +( 256 1200 -64 ) ( 184 1200 -64 ) ( 184 1190 -64 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 224 1192 -48 ) ( 224 1192 -64 ) ( 224 1344 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1200 -64 ) ( 224 1200 -48 ) ( 264 1160 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1296 -80 ) ( 232 1056 -80 ) ( 264 1056 -48 ) subway/1_tile_middle 0 80 90 0.500000 0.500000 0 318767104 10 +( 224 1344 -48 ) ( 224 1344 -80 ) ( 240 1344 -80 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 304 1136 -48 ) ( 264 1136 -48 ) ( 224 1376 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1136 -80 ) ( 232 1376 -80 ) ( 224 1376 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4599 +{ +( 224 992 -64 ) ( 224 920 -64 ) ( 234 920 -64 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 128 960 -64 ) ( 128 960 -48 ) ( 224 960 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 960 -64 ) ( 224 960 -48 ) ( 264 1000 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 128 968 -80 ) ( 368 968 -80 ) ( 368 1000 -48 ) subway/1_tile_middle 0 114 0 0.500000 -0.500000 0 318767104 0 +( 104 960 -48 ) ( 104 960 -80 ) ( 104 976 -80 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 288 1040 -48 ) ( 288 1000 -48 ) ( 48 960 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 288 968 -80 ) ( 48 968 -80 ) ( 48 960 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 960 -48 ) ( 112 960 -64 ) ( 112 984 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4600 +{ +( 288 1096 -64 ) ( 224 1096 -64 ) ( 224 1032 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 224 1056 -48 ) ( 216 1048 -48 ) ( 216 1280 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 216 1056 -64 ) ( 216 1056 8 ) ( 224 1056 8 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 248 1096 8 ) ( 248 1096 -64 ) ( 248 960 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 240 1088 8 ) ( 240 1088 -64 ) ( 248 1088 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 216 1056 8 ) ( 216 1056 -64 ) ( 216 1280 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4601 +{ +( 288 1096 -80 ) ( 224 1096 -80 ) ( 224 1032 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 216 1088 -64 ) ( 248 1088 -64 ) ( 248 1056 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 216 1056 -64 ) ( 248 1056 -64 ) ( 248 1056 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 248 1096 -64 ) ( 248 1096 -136 ) ( 248 960 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 248 1088 -64 ) ( 216 1088 -64 ) ( 216 1088 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 216 1056 -64 ) ( 216 1056 -136 ) ( 216 1280 -136 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4602 +{ +( 264 1024 40 ) ( 264 1024 -32 ) ( 264 1248 -32 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 408 1200 40 ) ( 408 1200 -32 ) ( 416 1200 -32 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 400 1096 40 ) ( 400 1096 -32 ) ( 400 960 -32 ) subway/1_beam1 0 0 0 0.500000 0.500000 0 16777216 0 +( 392 960 -32 ) ( 392 960 40 ) ( 400 960 40 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 384 1056 -24 ) ( 376 1048 -24 ) ( 376 1280 -24 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 448 1096 -32 ) ( 384 1096 -32 ) ( 384 1032 -32 ) subway/1_concrete_floor 944 2960 0 0.500000 0.500000 0 285212672 0 +} +// brush 4603 +{ +( 48 1200 -80 ) ( 48 1192 -80 ) ( 288 1192 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 48 1200 -48 ) ( 288 1160 -48 ) ( 288 1120 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 1184 -80 ) ( 104 1200 -80 ) ( 104 1200 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 328 1160 -48 ) ( 328 1192 -80 ) ( 88 1192 -80 ) subway/1_tile_middle 0 114 0 0.500000 -0.500000 0 318767104 0 +( 264 1160 -48 ) ( 224 1200 -48 ) ( 224 1200 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 144 1200 -48 ) ( 144 1200 -64 ) ( 224 1200 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 234 1240 -64 ) ( 224 1240 -64 ) ( 224 1168 -64 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 112 1200 -64 ) ( 112 1200 -48 ) ( 112 1160 -48 ) subway/1_tile_middle 0 114 0 0.500000 -0.500000 0 318767104 0 +} +// brush 4604 +{ +( 88 960 -80 ) ( 184 960 -80 ) ( 184 960 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 968 -152 ) ( 112 968 -80 ) ( 104 960 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 96 968 -80 ) ( 96 968 -152 ) ( 232 968 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 968 -152 ) ( 224 960 -152 ) ( 224 960 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 280 968 -80 ) ( 216 968 -80 ) ( 216 1032 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 216 1032 -152 ) ( 216 968 -152 ) ( 280 968 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4605 +{ +( 296 960 -80 ) ( 296 968 -80 ) ( 56 968 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 296 960 -64 ) ( 56 1000 -64 ) ( 56 1040 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 968 -80 ) ( 224 960 -80 ) ( 224 960 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -24 1000 -48 ) ( -24 968 -80 ) ( 216 968 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 104 976 -80 ) ( 104 1040 -48 ) ( 104 1000 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 960 -80 ) ( 112 960 -64 ) ( 224 960 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 960 -64 ) ( 112 960 -80 ) ( 112 968 -80 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4606 +{ +( 288 1096 -168 ) ( 224 1096 -168 ) ( 224 1032 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 224 1032 -152 ) ( 224 1096 -152 ) ( 288 1096 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 216 1056 -168 ) ( 216 1056 -152 ) ( 224 1056 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 248 1096 -96 ) ( 248 1096 -168 ) ( 248 960 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 240 1088 -152 ) ( 240 1088 -168 ) ( 248 1088 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 216 1280 -168 ) ( 216 1280 -152 ) ( 216 1056 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4607 +{ +( 216 1032 -168 ) ( 216 968 -168 ) ( 280 968 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 280 968 -152 ) ( 216 968 -152 ) ( 216 1032 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 232 968 -168 ) ( 224 960 -168 ) ( 224 960 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 408 968 -168 ) ( 408 968 -152 ) ( 272 968 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 104 960 -152 ) ( 104 960 -168 ) ( 112 968 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 104 960 -168 ) ( 104 960 -152 ) ( 240 960 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4608 +{ +( 128 1200 -64 ) ( 128 1200 -80 ) ( 224 1200 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 112 1200 -80 ) ( 112 1200 -64 ) ( 112 1176 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 216 1192 -80 ) ( -24 1192 -80 ) ( -24 1160 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1200 -64 ) ( 224 1200 -80 ) ( 232 1192 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 56 1120 -64 ) ( 56 1160 -64 ) ( 296 1200 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 56 1192 -80 ) ( 296 1192 -80 ) ( 296 1200 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4609 +{ +( 280 1192 -168 ) ( 216 1192 -168 ) ( 216 1128 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 216 1128 -152 ) ( 216 1192 -152 ) ( 280 1192 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 224 1200 -152 ) ( 224 1200 -168 ) ( 232 1192 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 104 1192 -168 ) ( 104 1192 -152 ) ( 232 1192 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 112 1192 -152 ) ( 112 1192 -168 ) ( 104 1200 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 224 1200 -168 ) ( 224 1200 -152 ) ( 128 1200 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4610 +{ +( 392 1536 -176 ) ( 328 1536 -176 ) ( 328 1472 -176 ) subway/1_concrete_floor 224 2272 0 0.500000 0.500000 0 285212672 0 +( 328 1472 -168 ) ( 328 1536 -168 ) ( 392 1536 -168 ) subway/1_concrete_floor 944 2960 0 0.500000 0.500000 0 285212672 0 +( 400 1336 -176 ) ( 400 1336 -168 ) ( 400 1400 -168 ) subway/1_concrete_floor 1152 -320 0 0.500000 0.500000 0 285212672 0 +( 192 1192 -176 ) ( 192 1192 -168 ) ( 256 1192 -168 ) subway/1_concrete_floor -3200 -320 0 0.500000 0.500000 0 285212672 0 +( 192 1912 -176 ) ( 192 1912 -168 ) ( 192 1848 -168 ) subway/1_stair_side1 1152 -320 0 0.500000 0.500000 0 285212672 0 +( 392 1384 -176 ) ( 392 1384 -168 ) ( 328 1384 -168 ) subway/1_concrete_floor -3200 -320 0 0.500000 0.500000 0 285212672 0 +} +// brush 4611 +{ +( 80 1384 -48 ) ( 80 1320 -48 ) ( 144 1320 -48 ) subway/con14 48 16 0 0.500000 0.500000 0 285212672 0 +( 72 1384 -40 ) ( 256 1384 -40 ) ( 256 1184 -40 ) subway/1_concrete_floor 944 2560 0 0.500000 0.500000 0 285212672 0 +( 264 1552 -40 ) ( 80 1552 -40 ) ( 80 1552 -48 ) subway/1_concrete_floor 688 -320 0 0.500000 0.500000 0 285212672 0 +( 72 1216 -48 ) ( 72 1216 -40 ) ( 72 1280 -40 ) subway/1_concrete_floor -2672 -320 0 0.500000 0.500000 0 285212672 0 +( 160 1384 -48 ) ( 160 1384 -40 ) ( 224 1384 -40 ) subway/1_stair_side1 688 -320 0 0.500000 0.500000 0 285212672 0 +( -224 1392 -48 ) ( -224 1392 -40 ) ( -224 1328 -40 ) subway/1_concrete_floor -2672 -320 0 0.500000 0.500000 0 285212672 0 +} +// brush 4612 +{ +( 200 1352 10 ) ( 200 1352 0 ) ( 400 1552 0 ) subway/1_concrete_floor 944 2960 0 0.500000 0.500000 0 285212672 0 +( 400 1344 -80 ) ( 296 1552 -80 ) ( 296 1552 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 1344 -80 ) ( 400 1344 -80 ) ( 400 1344 -152 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( 392 1344 -152 ) ( 288 1552 -152 ) ( 288 1552 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 9 +( 288 1552 -152 ) ( 296 1552 -152 ) ( 296 1552 -80 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( 392 1344 -80 ) ( 288 1552 -80 ) ( 296 1552 -80 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( 400 1344 -152 ) ( 296 1552 -152 ) ( 288 1552 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 4613 +{ +( 400 1552 0 ) ( 224 1376 0 ) ( 224 1376 10 ) subway/1_concrete_floor 944 2960 0 0.500000 0.500000 0 285212672 0 +( 400 1440 -80 ) ( 400 1448 -80 ) ( 192 1552 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1448 -64 ) ( 400 1424 -64 ) ( 192 1528 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 192 1544 -80 ) ( 192 1560 -80 ) ( 192 1560 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1424 -64 ) ( 400 1440 -80 ) ( 192 1544 -80 ) subway/1_tile 0 24 -26 0.500000 0.500000 0 318767104 9 +( 400 1360 -80 ) ( 400 1296 -48 ) ( 400 1336 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1448 -80 ) ( 400 1448 -64 ) ( 192 1552 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4614 +{ +( 400 1552 0 ) ( 232 1384 0 ) ( 232 1384 10 ) subway/1_concrete_floor 944 2960 0 0.500000 0.500000 0 285212672 0 +( 384 1552 -80 ) ( 384 1544 -80 ) ( 624 1544 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1448 -48 ) ( 400 1408 -48 ) ( 192 1512 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 192 1544 -80 ) ( 192 1560 -80 ) ( 192 1560 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 400 1408 -48 ) ( 400 1424 -64 ) ( 192 1528 -64 ) subway/1_tile_middle 0 -28 -26 0.500000 0.500000 0 318767104 9 +( 400 1360 -80 ) ( 400 1296 -48 ) ( 400 1336 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1448 -64 ) ( 400 1448 -48 ) ( 192 1552 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1424 -64 ) ( 400 1448 -64 ) ( 192 1552 -64 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4615 +{ +( 400 1344 -64 ) ( 296 1552 -64 ) ( 272 1552 -64 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 400 1344 -48 ) ( 296 1552 -48 ) ( 296 1552 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 184 1552 -48 ) ( 144 1552 -48 ) ( 208 1552 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 376 1344 -64 ) ( 272 1552 -64 ) ( 256 1552 -48 ) subway/1_tile_middle 0 34 116 0.500000 0.500000 0 318767104 9 +( 408 1344 -48 ) ( 408 1344 -80 ) ( 392 1344 -80 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 360 1344 -48 ) ( 256 1552 -48 ) ( 296 1552 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 1776 -80 ) ( 392 1536 -80 ) ( 400 1536 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 232 1384 10 ) ( 232 1384 0 ) ( 400 1552 0 ) subway/1_concrete_floor 944 2960 0 0.500000 0.500000 0 285212672 0 +} +// brush 4616 +{ +( 400 1344 -64 ) ( 296 1552 -64 ) ( 296 1552 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 184 1552 -48 ) ( 144 1552 -48 ) ( 208 1552 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 1344 -80 ) ( 288 1552 -80 ) ( 272 1552 -64 ) subway/1_tile 12 40 26 0.500000 0.500000 0 318767104 9 +( 408 1344 -48 ) ( 408 1344 -80 ) ( 392 1344 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 376 1344 -64 ) ( 272 1552 -64 ) ( 296 1552 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1344 -80 ) ( 296 1552 -80 ) ( 288 1552 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 224 1376 10 ) ( 224 1376 0 ) ( 400 1552 0 ) subway/1_concrete_floor 944 2960 0 0.500000 0.500000 0 285212672 0 +} +// brush 4617 +{ +( 400 1552 -72 ) ( 200 1352 -72 ) ( 200 1352 -62 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 400 1448 -224 ) ( 400 1448 -152 ) ( 192 1552 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 192 1552 -168 ) ( 192 1552 -96 ) ( 192 1544 -96 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 400 1440 -96 ) ( 400 1440 -168 ) ( 192 1544 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 9 +( 400 1448 -96 ) ( 400 1448 -168 ) ( 400 1440 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 400 1448 -152 ) ( 400 1440 -152 ) ( 192 1544 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 400 1440 -168 ) ( 400 1448 -168 ) ( 192 1552 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4618 +{ +( 400 1344 -168 ) ( 296 1552 -168 ) ( 288 1552 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 392 1344 -152 ) ( 288 1552 -152 ) ( 296 1552 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 288 1552 -168 ) ( 296 1552 -168 ) ( 296 1552 -96 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 392 1344 -168 ) ( 288 1552 -168 ) ( 288 1552 -96 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 9 +( 392 1344 -96 ) ( 400 1344 -96 ) ( 400 1344 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 400 1344 -96 ) ( 296 1552 -96 ) ( 296 1552 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 200 1352 -62 ) ( 200 1352 -72 ) ( 400 1552 -72 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4619 +{ +( -432 1584 -176 ) ( -432 1520 -176 ) ( -368 1520 -176 ) subway/1_concrete_floor 688 3072 0 0.500000 0.500000 0 285212672 0 +( -368 1520 -168 ) ( -432 1520 -168 ) ( -432 1584 -168 ) subway/1_concrete_floor 944 2960 0 0.500000 0.500000 0 285212672 0 +( -232 1552 -176 ) ( -232 1552 -168 ) ( -296 1552 -168 ) subway/1_concrete_floor 688 -320 0 0.500000 0.500000 0 285212672 0 +( 392 1416 -176 ) ( 392 1416 -168 ) ( 392 1480 -168 ) subway/1_concrete_floor -3072 -320 0 0.500000 0.500000 0 285212672 0 +( -352 1384 -176 ) ( -352 1384 -168 ) ( -288 1384 -168 ) subway/1_stair_side1 688 -320 0 0.500000 0.500000 0 285212672 0 +( -280 1584 -176 ) ( -280 1584 -168 ) ( -280 1520 -168 ) subway/1_concrete_floor -3072 -320 0 0.500000 0.500000 0 285212672 0 +} +// brush 4620 +{ +( 160 1312 0 ) ( 216 1368 0 ) ( 216 1368 10 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 184 1424 -152 ) ( 184 1424 -80 ) ( 224 1344 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 216 1344 -112 ) ( 216 1344 -104 ) ( 280 1344 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 192 1424 -80 ) ( 192 1424 -152 ) ( 232 1344 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 184 1424 -80 ) ( 184 1424 -152 ) ( 192 1424 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 184 1424 -80 ) ( 192 1424 -80 ) ( 232 1344 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 192 1424 -152 ) ( 184 1424 -152 ) ( 224 1344 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 4621 +{ +( 160 1312 0 ) ( 224 1376 0 ) ( 224 1376 10 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 134217728 352321536 0 +( 184 1424 -168 ) ( 184 1424 -152 ) ( 224 1344 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 134217728 318767104 0 +( 216 1344 -136 ) ( 216 1344 -128 ) ( 280 1344 -128 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 134217728 318767104 0 +( 192 1424 -152 ) ( 192 1424 -168 ) ( 232 1344 -168 ) subway/1_tile_bottom 48 48 0 -0.500000 0.500000 134217728 318767104 10 +( 184 1424 -152 ) ( 184 1424 -168 ) ( 192 1424 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 134217728 318767104 0 +( 184 1424 -152 ) ( 192 1424 -152 ) ( 232 1344 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 134217728 318767104 0 +( 192 1424 -168 ) ( 184 1424 -168 ) ( 224 1344 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 4622 +{ +( 160 1312 0 ) ( 232 1384 0 ) ( 232 1384 10 ) subway/1_cork_ceiling 0 82 90 0.500000 0.500000 134217728 352321536 0 +( 232 1224 -80 ) ( 232 1464 -80 ) ( 224 1464 -80 ) subway/1_cork_ceiling 0 82 90 0.500000 0.500000 134217728 352321536 0 +( 184 1424 -48 ) ( 224 1424 -48 ) ( 264 1344 -48 ) subway/1_cork_ceiling 0 82 90 0.500000 0.500000 134217728 352321536 0 +( 184 1424 -48 ) ( 184 1424 -80 ) ( 200 1424 -80 ) subway/1_cork_ceiling 0 82 90 0.500000 0.500000 134217728 352321536 0 +( 224 1424 -48 ) ( 208 1424 -64 ) ( 248 1344 -64 ) subway/1_tile_middle 0 42 116 0.500000 0.500000 134217728 318767104 10 +( 264 1344 -48 ) ( 304 1344 -48 ) ( 240 1344 -80 ) subway/1_cork_ceiling 0 82 90 0.500000 0.500000 134217728 352321536 0 +( 184 1424 -64 ) ( 184 1424 -48 ) ( 224 1344 -48 ) subway/1_cork_ceiling 0 82 90 0.500000 0.500000 134217728 352321536 0 +( 208 1424 -64 ) ( 184 1424 -64 ) ( 224 1344 -64 ) subway/1_cork_ceiling 0 82 90 0.500000 0.500000 134217728 352321536 0 +} +// brush 4623 +{ +( 160 1312 0 ) ( 216 1368 0 ) ( 216 1368 10 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 134217728 352321536 0 +( 192 1424 -80 ) ( 184 1424 -80 ) ( 224 1344 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 184 1424 -64 ) ( 208 1424 -64 ) ( 248 1344 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 184 1424 -48 ) ( 184 1424 -80 ) ( 200 1424 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 208 1424 -64 ) ( 192 1424 -80 ) ( 232 1344 -80 ) subway/1_tile 30 56 26 0.500000 0.500000 134217728 318767104 10 +( 264 1344 -48 ) ( 304 1344 -48 ) ( 240 1344 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 184 1424 -80 ) ( 184 1424 -64 ) ( 224 1344 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +} +// brush 4624 +{ +( 192 1376 -64 ) ( 272 1336 -64 ) ( 272 1360 -64 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 134217728 318767104 0 +( 192 1376 -48 ) ( 272 1336 -48 ) ( 272 1336 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 192 1392 -80 ) ( 192 1456 -48 ) ( 192 1416 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 192 1400 -64 ) ( 272 1360 -64 ) ( 272 1376 -48 ) subway/1_tile_middle 0 -4 -26 0.500000 0.500000 134217728 318767104 10 +( 272 1352 -80 ) ( 272 1336 -80 ) ( 272 1336 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 134217728 318767104 0 +( 192 1416 -48 ) ( 272 1376 -48 ) ( 272 1336 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 312 1376 -80 ) ( 312 1384 -80 ) ( 72 1384 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 232 1384 10 ) ( 232 1384 0 ) ( 160 1312 0 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 134217728 352321536 0 +} +// brush 4625 +{ +( 192 1376 -64 ) ( 272 1336 -64 ) ( 272 1336 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 192 1392 -80 ) ( 192 1456 -48 ) ( 192 1416 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 192 1384 -80 ) ( 272 1344 -80 ) ( 272 1360 -64 ) subway/1_tile 0 24 -26 0.500000 0.500000 134217728 318767104 10 +( 272 1352 -80 ) ( 272 1336 -80 ) ( 272 1336 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 192 1400 -64 ) ( 272 1360 -64 ) ( 272 1336 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 192 1376 -80 ) ( 272 1336 -80 ) ( 272 1344 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 216 1368 10 ) ( 216 1368 0 ) ( 160 1312 0 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 134217728 352321536 0 +} +// brush 4626 +{ +( 328 1376 -168 ) ( 200 1376 -168 ) ( 200 1376 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 192 1368 -136 ) ( 192 1368 -128 ) ( 192 1432 -128 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 64 1384 -152 ) ( -72 1384 -152 ) ( -72 1384 -168 ) subway/1_tile_bottom 48 48 0 -0.500000 0.500000 0 318767104 10 +( 72 1384 -152 ) ( 80 1376 -152 ) ( 80 1376 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 152 1448 -152 ) ( 152 1384 -152 ) ( 88 1384 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 88 1384 -168 ) ( 152 1384 -168 ) ( 152 1448 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4627 +{ +( -168 1464 -52 ) ( -184 1464 -52 ) ( -184 1456 -52 ) subway/light_blue 16 0 0 0.500000 0.500000 134217728 1 3000 +( -184 1456 -48 ) ( -184 1464 -48 ) ( -168 1464 -48 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -184 1456 -48 ) ( -168 1456 -48 ) ( -168 1456 -56 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -168 1456 -48 ) ( -168 1464 -48 ) ( -168 1464 -56 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -168 1472 -48 ) ( -184 1472 -48 ) ( -184 1472 -56 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -184 1464 -48 ) ( -184 1456 -48 ) ( -184 1456 -56 ) subway/metal2 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4628 +{ +( -80 1200 -64 ) ( -96 1200 -64 ) ( -96 1192 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -96 1192 -48 ) ( -96 1200 -48 ) ( -80 1200 -48 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -96 1192 -48 ) ( -80 1192 -48 ) ( -80 1192 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -80 1192 -48 ) ( -80 1200 -48 ) ( -80 1200 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -80 1196 -48 ) ( -96 1196 -48 ) ( -96 1196 -64 ) subway/light_yellow 0 0 0 0.500000 0.500000 134217728 1 12000 +( -96 1200 -48 ) ( -96 1192 -48 ) ( -96 1192 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4629 +{ +( -36 1488 -48 ) ( -36 1448 -48 ) ( -36 1448 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 20 1472 -48 ) ( -52 1472 -48 ) ( -52 1472 -56 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 8 1448 -48 ) ( 8 1488 -48 ) ( 8 1488 -56 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -52 1456 -48 ) ( 20 1456 -48 ) ( 20 1456 -56 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( -52 1448 -48 ) ( -52 1488 -48 ) ( 20 1488 -48 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 20 1488 -52 ) ( -52 1488 -52 ) ( -52 1448 -52 ) subway/light_tube 72 0 0 0.500000 0.500000 134217728 1 8000 +} +// brush 4630 +{ +( 16 1200 -64 ) ( 0 1200 -64 ) ( 0 1192 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 0 1192 -48 ) ( 0 1200 -48 ) ( 16 1200 -48 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 0 1192 -48 ) ( 16 1192 -48 ) ( 16 1192 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 16 1192 -48 ) ( 16 1200 -48 ) ( 16 1200 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 16 1196 -48 ) ( 0 1196 -48 ) ( 0 1196 -64 ) subway/light_yellow 0 0 0 0.500000 0.500000 134217728 1 12000 +( 0 1200 -48 ) ( 0 1192 -48 ) ( 0 1192 -64 ) subway/metal_clean 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4631 +{ +( -88 1536 -152 ) ( -152 1536 -152 ) ( -152 1472 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -152 1472 -64 ) ( -152 1536 -64 ) ( -88 1536 -64 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -136 1528 -152 ) ( -136 1528 -48 ) ( -120 1544 -48 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -136 1528 -48 ) ( -136 1528 -152 ) ( -216 1528 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -216 1536 -112 ) ( -216 1536 -104 ) ( -216 1472 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( -64 1544 -152 ) ( -64 1544 -48 ) ( -208 1544 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4632 +{ +( -224 1520 -152 ) ( -224 1520 -48 ) ( -224 1376 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -216 1400 -112 ) ( -216 1400 -104 ) ( -152 1400 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( -216 1352 -8 ) ( -216 1632 -8 ) ( -216 1632 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -224 1544 -48 ) ( -224 1544 -152 ) ( -216 1544 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -152 1440 -64 ) ( -216 1440 -64 ) ( -216 1504 -64 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -216 1504 -152 ) ( -216 1440 -152 ) ( -152 1440 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 4633 +{ +( -160 1400 -152 ) ( -160 1400 -48 ) ( -240 1400 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -280 1384 -112 ) ( -280 1384 -104 ) ( -280 1320 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( -328 1384 -8 ) ( -48 1384 -8 ) ( -48 1384 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -136 1400 -48 ) ( -136 1400 -152 ) ( -120 1384 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -152 1320 -64 ) ( -152 1384 -64 ) ( -88 1384 -64 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -88 1384 -152 ) ( -152 1384 -152 ) ( -152 1320 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 4634 +{ +( -96 1384 -152 ) ( -160 1384 -152 ) ( -160 1320 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -160 1320 -64 ) ( -160 1384 -64 ) ( -96 1384 -64 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -280 1384 -168 ) ( -280 1384 -64 ) ( -280 1400 -64 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -280 1376 -48 ) ( -280 1376 -152 ) ( -288 1376 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -288 1376 -112 ) ( -288 1376 -104 ) ( -288 1312 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( -168 1400 -152 ) ( -168 1400 -48 ) ( -248 1400 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4635 +{ +( -304 1360 -152 ) ( -304 1296 -152 ) ( -240 1296 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 1 +( -240 1296 -64 ) ( -304 1296 -64 ) ( -304 1360 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 1 +( -312 1376 -48 ) ( -312 1376 -168 ) ( -304 1376 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 1 +( -280 1168 -8 ) ( -280 1448 -8 ) ( -280 1448 -224 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 1 +( -312 1344 -168 ) ( -312 1344 -48 ) ( -280 1344 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 1 +( -312 1344 -48 ) ( -312 1344 -168 ) ( -312 1376 -168 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 1 +( -304 1344 0 ) ( -312 1352 0 ) ( -312 1352 10 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 1 +( -280 1352 0 ) ( -288 1344 0 ) ( -288 1344 10 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 1 +} +// brush 4636 +{ +( -392 1456 -64 ) ( -392 1520 -64 ) ( -456 1520 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -456 1520 -48 ) ( -392 1520 -48 ) ( -392 1456 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -496 1520 -8 ) ( -496 1520 -112 ) ( -504 1528 -112 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -448 1520 -8 ) ( -448 1520 -112 ) ( -496 1520 -112 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -448 1520 -112 ) ( -448 1520 -8 ) ( -440 1528 -8 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -144 1528 -104 ) ( -208 1528 -104 ) ( -208 1528 -112 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4637 +{ +( -504 1568 -24 ) ( -504 1504 -24 ) ( -504 1504 -32 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -496 1520 -64 ) ( -496 1520 72 ) ( -504 1528 72 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -496 1520 72 ) ( -496 1520 -64 ) ( -496 1168 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -416 1168 -24 ) ( -352 1168 -24 ) ( -352 1168 -32 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -496 1456 -48 ) ( -496 1520 -48 ) ( -432 1520 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -432 1520 -64 ) ( -496 1520 -64 ) ( -496 1456 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4638 +{ +( -200 1456 -48 ) ( -200 1520 -48 ) ( -264 1520 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -264 1520 -32 ) ( -200 1520 -32 ) ( -200 1456 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -304 1520 8 ) ( -304 1520 -96 ) ( -312 1528 -96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -240 1520 -32 ) ( -240 1520 -48 ) ( -304 1520 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -240 1520 -48 ) ( -240 1520 -32 ) ( -248 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( 48 1528 -88 ) ( -16 1528 -88 ) ( -16 1528 -96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 4639 +{ +( -584 1456 -48 ) ( -584 1520 -48 ) ( -648 1520 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -648 1520 -32 ) ( -584 1520 -32 ) ( -584 1456 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -32 ) ( -704 1520 -48 ) ( -696 1528 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -48 ) ( -704 1520 -32 ) ( -640 1520 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -640 1520 -96 ) ( -640 1520 8 ) ( -632 1528 8 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -488 1528 -88 ) ( -552 1528 -88 ) ( -552 1528 -96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 4640 +{ +( -640 1456 -48 ) ( -640 1520 -48 ) ( -704 1520 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -704 1520 16 ) ( -640 1520 16 ) ( -640 1456 16 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -784 1176 -16 ) ( -784 1176 -8 ) ( -720 1176 -8 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -640 1176 0 ) ( -640 1528 0 ) ( -640 1528 136 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1528 88 ) ( -640 1520 88 ) ( -640 1520 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -632 1504 -16 ) ( -632 1504 -8 ) ( -632 1568 -8 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 4641 +{ +( -632 1504 -32 ) ( -632 1504 -24 ) ( -632 1568 -24 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -632 1528 72 ) ( -640 1520 72 ) ( -640 1520 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -640 1168 -64 ) ( -640 1520 -64 ) ( -640 1520 72 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -784 1168 -32 ) ( -784 1168 -24 ) ( -720 1168 -24 ) subway/1_tile_middle 256 0 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -48 ) ( -640 1520 -48 ) ( -640 1456 -48 ) subway/1_tile_middle 256 0 0 0.500000 0.500000 0 318767104 0 +( -640 1456 -64 ) ( -640 1520 -64 ) ( -704 1520 -64 ) subway/1_tile_middle 256 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4642 +{ +( -488 1528 -104 ) ( -552 1528 -104 ) ( -552 1528 -112 ) subway/1_tile_middle 384 0 0 0.500000 0.500000 0 318767104 0 +( -640 1520 -112 ) ( -640 1520 -8 ) ( -632 1528 -8 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -64 ) ( -704 1520 -48 ) ( -640 1520 -48 ) subway/1_tile_middle 384 0 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -48 ) ( -704 1520 -64 ) ( -696 1528 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -648 1520 -48 ) ( -584 1520 -48 ) ( -584 1456 -48 ) subway/1_tile_middle 384 0 0 0.500000 0.500000 0 318767104 0 +( -584 1456 -64 ) ( -584 1520 -64 ) ( -648 1520 -64 ) subway/1_tile_middle 384 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4643 +{ +( 48 1528 -104 ) ( -16 1528 -104 ) ( -16 1528 -112 ) subway/1_tile_middle -384 0 0 0.500000 0.500000 0 318767104 0 +( -240 1520 -64 ) ( -240 1520 -48 ) ( -248 1528 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -240 1520 -48 ) ( -240 1520 -64 ) ( -304 1520 -64 ) subway/1_tile_middle -384 0 0 0.500000 0.500000 0 318767104 0 +( -304 1520 -8 ) ( -304 1520 -112 ) ( -312 1528 -112 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -264 1520 -48 ) ( -200 1520 -48 ) ( -200 1456 -48 ) subway/1_tile_middle -384 0 0 0.500000 0.500000 0 318767104 0 +( -200 1456 -64 ) ( -200 1520 -64 ) ( -264 1520 -64 ) subway/1_tile_middle -384 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4644 +{ +( -120 1448 -168 ) ( -56 1448 -168 ) ( -56 1512 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -56 1512 -152 ) ( -56 1448 -152 ) ( -120 1448 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -24 1224 -168 ) ( -24 1224 -152 ) ( -56 1224 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -56 1600 -248 ) ( -56 1600 -32 ) ( -56 1320 -32 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -112 1192 -128 ) ( -48 1192 -128 ) ( -48 1192 -136 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -24 1232 -152 ) ( -24 1232 -168 ) ( -24 1192 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4645 +{ +( -24 1232 -48 ) ( -24 1232 -152 ) ( -24 1192 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -112 1192 -104 ) ( -48 1192 -104 ) ( -48 1192 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -56 1600 -224 ) ( -56 1600 -8 ) ( -56 1320 -8 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -24 1224 -152 ) ( -24 1224 -48 ) ( -56 1224 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -56 1512 -80 ) ( -56 1448 -80 ) ( -120 1448 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -120 1448 -152 ) ( -56 1448 -152 ) ( -56 1512 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4646 +{ +( -120 1296 -144 ) ( -120 1296 -40 ) ( -120 1440 -40 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -136 1528 -48 ) ( -136 1528 -64 ) ( -120 1544 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -136 1528 -64 ) ( -136 1528 -48 ) ( -136 1400 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -136 1400 -64 ) ( -136 1400 -48 ) ( -120 1384 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -192 1392 -48 ) ( -128 1392 -48 ) ( -128 1328 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -128 1328 -64 ) ( -128 1392 -64 ) ( -192 1392 -64 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4647 +{ +( -120 1464 -152 ) ( -120 1464 -64 ) ( -120 1496 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -128 1496 -112 ) ( -128 1496 -104 ) ( -192 1496 -104 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( -136 1432 -48 ) ( -136 1432 -152 ) ( -136 1456 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -120 1432 -64 ) ( -120 1432 -152 ) ( -136 1432 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -192 1392 -64 ) ( -128 1392 -64 ) ( -128 1328 -64 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -128 1328 -80 ) ( -128 1392 -80 ) ( -192 1392 -80 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 4648 +{ +( -496 1544 -104 ) ( -560 1544 -104 ) ( -560 1480 -104 ) subway/1_concrete_floor 944 3040 0 0.500000 0.500000 0 285212672 0 +( -560 1480 -96 ) ( -560 1544 -96 ) ( -496 1544 -96 ) subway/1_stair_top1 944 3088 0 0.500000 0.500000 0 285212672 0 +( -560 1480 -96 ) ( -496 1480 -96 ) ( -496 1480 -104 ) subway/1_concrete_floor 944 -192 0 0.500000 0.500000 0 285212672 0 +( -512 1600 -96 ) ( -512 1664 -96 ) ( -512 1664 -104 ) subway/1_concrete_floor -3040 -192 0 0.500000 0.500000 0 285212672 0 +( -560 1504 -96 ) ( -624 1504 -96 ) ( -624 1504 -104 ) subway/1_stair_side1 944 -192 0 0.500000 0.500000 0 285212672 0 +( -624 1544 -96 ) ( -624 1480 -96 ) ( -624 1480 -104 ) subway/1_concrete_floor -3040 -192 0 0.500000 0.500000 0 285212672 0 +} +// brush 4649 +{ +( -496 1568 -112 ) ( -560 1568 -112 ) ( -560 1504 -112 ) subway/1_concrete_floor 944 3088 0 0.500000 0.500000 0 285212672 0 +( -560 1504 -104 ) ( -560 1568 -104 ) ( -496 1568 -104 ) subway/1_stair_top1 944 3136 0 0.500000 0.500000 0 285212672 0 +( -560 1504 -104 ) ( -496 1504 -104 ) ( -496 1504 -112 ) subway/1_concrete_floor 944 -208 0 0.500000 0.500000 0 285212672 0 +( -512 1624 -104 ) ( -512 1688 -104 ) ( -512 1688 -112 ) subway/1_concrete_floor -3088 -208 0 0.500000 0.500000 0 285212672 0 +( -496 1528 -104 ) ( -560 1528 -104 ) ( -560 1528 -112 ) subway/1_stair_side1 944 -208 0 0.500000 0.500000 0 285212672 0 +( -624 1568 -104 ) ( -624 1504 -104 ) ( -624 1504 -112 ) subway/1_concrete_floor -3088 -208 0 0.500000 0.500000 0 285212672 0 +} +// brush 4650 +{ +( -496 1520 -96 ) ( -560 1520 -96 ) ( -560 1456 -96 ) subway/1_concrete_floor 944 2992 0 0.500000 0.500000 0 285212672 0 +( -560 1456 -88 ) ( -560 1520 -88 ) ( -496 1520 -88 ) subway/1_stair_top1 944 3040 0 0.500000 0.500000 0 285212672 0 +( -560 1456 -88 ) ( -496 1456 -88 ) ( -496 1456 -96 ) subway/1_concrete_floor 944 -176 0 0.500000 0.500000 0 285212672 0 +( -512 1576 -88 ) ( -512 1640 -88 ) ( -512 1640 -96 ) subway/1_concrete_floor -2992 -176 0 0.500000 0.500000 0 285212672 0 +( -560 1480 -88 ) ( -624 1480 -88 ) ( -624 1480 -96 ) subway/1_stair_side1 944 -176 0 0.500000 0.500000 0 285212672 0 +( -624 1520 -88 ) ( -624 1456 -88 ) ( -624 1456 -96 ) subway/1_concrete_floor -2992 -176 0 0.500000 0.500000 0 285212672 0 +} +// brush 4651 +{ +( -496 1496 -88 ) ( -560 1496 -88 ) ( -560 1432 -88 ) subway/1_concrete_floor 944 2944 0 0.500000 0.500000 0 285212672 0 +( -560 1432 -80 ) ( -560 1496 -80 ) ( -496 1496 -80 ) subway/1_stair_top1 944 2992 0 0.500000 0.500000 0 285212672 0 +( -560 1432 -80 ) ( -496 1432 -80 ) ( -496 1432 -88 ) subway/1_concrete_floor 944 -160 0 0.500000 0.500000 0 285212672 0 +( -512 1552 -80 ) ( -512 1616 -80 ) ( -512 1616 -88 ) subway/1_concrete_floor -2944 -160 0 0.500000 0.500000 0 285212672 0 +( -560 1456 -80 ) ( -624 1456 -80 ) ( -624 1456 -88 ) subway/1_stair_side1 944 -160 0 0.500000 0.500000 0 285212672 0 +( -624 1496 -80 ) ( -624 1432 -80 ) ( -624 1432 -88 ) subway/1_concrete_floor -2944 -160 0 0.500000 0.500000 0 285212672 0 +} +// brush 4652 +{ +( -496 1472 -80 ) ( -560 1472 -80 ) ( -560 1408 -80 ) subway/1_concrete_floor 944 2896 0 0.500000 0.500000 0 285212672 0 +( -560 1408 -72 ) ( -560 1472 -72 ) ( -496 1472 -72 ) subway/1_stair_top1 944 2944 0 0.500000 0.500000 0 285212672 0 +( -560 1408 -72 ) ( -496 1408 -72 ) ( -496 1408 -80 ) subway/1_concrete_floor 944 -144 0 0.500000 0.500000 0 285212672 0 +( -512 1528 -72 ) ( -512 1592 -72 ) ( -512 1592 -80 ) subway/1_concrete_floor -2896 -144 0 0.500000 0.500000 0 285212672 0 +( -560 1432 -72 ) ( -624 1432 -72 ) ( -624 1432 -80 ) subway/1_stair_side1 944 -144 0 0.500000 0.500000 0 285212672 0 +( -624 1472 -72 ) ( -624 1408 -72 ) ( -624 1408 -80 ) subway/1_concrete_floor -2896 -144 0 0.500000 0.500000 0 285212672 0 +} +// brush 4653 +{ +( -496 1448 -72 ) ( -560 1448 -72 ) ( -560 1384 -72 ) subway/1_concrete_floor 944 2848 0 0.500000 0.500000 0 285212672 0 +( -560 1384 -64 ) ( -560 1448 -64 ) ( -496 1448 -64 ) subway/1_stair_top1 944 2896 0 0.500000 0.500000 0 285212672 0 +( -560 1384 -64 ) ( -496 1384 -64 ) ( -496 1384 -72 ) subway/1_concrete_floor 944 -128 0 0.500000 0.500000 0 285212672 0 +( -512 1504 -64 ) ( -512 1568 -64 ) ( -512 1568 -72 ) subway/1_concrete_floor -2848 -128 0 0.500000 0.500000 0 285212672 0 +( -560 1408 -64 ) ( -624 1408 -64 ) ( -624 1408 -72 ) subway/1_stair_side1 944 -128 0 0.500000 0.500000 0 285212672 0 +( -624 1448 -64 ) ( -624 1384 -64 ) ( -624 1384 -72 ) subway/1_concrete_floor -2848 -128 0 0.500000 0.500000 0 285212672 0 +} +// brush 4654 +{ +( -496 1424 -64 ) ( -560 1424 -64 ) ( -560 1360 -64 ) subway/1_concrete_floor 944 2800 0 0.500000 0.500000 0 285212672 0 +( -560 1360 -56 ) ( -560 1424 -56 ) ( -496 1424 -56 ) subway/1_stair_top1 944 2848 0 0.500000 0.500000 0 285212672 0 +( -560 1360 -56 ) ( -496 1360 -56 ) ( -496 1360 -64 ) subway/1_concrete_floor 944 -112 0 0.500000 0.500000 0 285212672 0 +( -512 1480 -56 ) ( -512 1544 -56 ) ( -512 1544 -64 ) subway/1_concrete_floor -2800 -112 0 0.500000 0.500000 0 285212672 0 +( -560 1384 -56 ) ( -624 1384 -56 ) ( -624 1384 -64 ) subway/1_stair_side1 944 -112 0 0.500000 0.500000 0 285212672 0 +( -624 1424 -56 ) ( -624 1360 -56 ) ( -624 1360 -64 ) subway/1_concrete_floor -2800 -112 0 0.500000 0.500000 0 285212672 0 +} +// brush 4655 +{ +( -496 1400 -56 ) ( -560 1400 -56 ) ( -560 1336 -56 ) subway/1_concrete_floor 944 2752 0 0.500000 0.500000 0 285212672 0 +( -560 1336 -48 ) ( -560 1400 -48 ) ( -496 1400 -48 ) subway/1_stair_top1 944 2800 0 0.500000 0.500000 0 285212672 0 +( -560 1336 -48 ) ( -496 1336 -48 ) ( -496 1336 -56 ) subway/1_concrete_floor 944 -96 0 0.500000 0.500000 0 285212672 0 +( -512 1456 -48 ) ( -512 1520 -48 ) ( -512 1520 -56 ) subway/1_concrete_floor -2752 -96 0 0.500000 0.500000 0 285212672 0 +( -560 1360 -48 ) ( -624 1360 -48 ) ( -624 1360 -56 ) subway/1_stair_side1 944 -96 0 0.500000 0.500000 0 285212672 0 +( -624 1400 -48 ) ( -624 1336 -48 ) ( -624 1336 -56 ) subway/1_concrete_floor -2752 -96 0 0.500000 0.500000 0 285212672 0 +} +// brush 4656 +{ +( -496 1376 -48 ) ( -560 1376 -48 ) ( -560 1312 -48 ) subway/1_concrete_floor 944 2464 0 0.500000 0.500000 0 285212672 0 +( -560 1312 -40 ) ( -560 1376 -40 ) ( -496 1376 -40 ) subway/1_stair_top1 944 2496 0 0.500000 0.500000 0 285212672 0 +( -560 1312 -40 ) ( -496 1312 -40 ) ( -496 1312 -48 ) subway/1_concrete_floor 944 0 0 0.500000 0.500000 0 285212672 0 +( -512 1432 -40 ) ( -512 1496 -40 ) ( -512 1496 -48 ) subway/1_concrete_floor -2464 0 0 0.500000 0.500000 0 285212672 0 +( -560 1336 -40 ) ( -624 1336 -40 ) ( -624 1336 -48 ) subway/1_stair_side1 944 0 0 0.500000 0.500000 0 285212672 0 +( -624 1376 -40 ) ( -624 1312 -40 ) ( -624 1312 -48 ) subway/1_concrete_floor -2464 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4657 +{ +( -496 1352 -40 ) ( -560 1352 -40 ) ( -560 1288 -40 ) subway/1_concrete_floor 944 2656 0 0.500000 0.500000 0 285212672 0 +( -560 1288 -32 ) ( -560 1352 -32 ) ( -496 1352 -32 ) subway/1_stair_top1 944 2704 0 0.500000 0.500000 0 285212672 0 +( -560 1288 -32 ) ( -496 1288 -32 ) ( -496 1288 -40 ) subway/1_concrete_floor 944 -64 0 0.500000 0.500000 0 285212672 0 +( -512 1408 -32 ) ( -512 1472 -32 ) ( -512 1472 -40 ) subway/1_concrete_floor -2656 -64 0 0.500000 0.500000 0 285212672 0 +( -560 1312 -32 ) ( -624 1312 -32 ) ( -624 1312 -40 ) subway/1_stair_side1 944 -64 0 0.500000 0.500000 0 285212672 0 +( -624 1352 -32 ) ( -624 1288 -32 ) ( -624 1288 -40 ) subway/1_concrete_floor -2656 -64 0 0.500000 0.500000 0 285212672 0 +} +// brush 4658 +{ +( -624 1328 -24 ) ( -624 1264 -24 ) ( -624 1264 -32 ) subway/1_concrete_floor -2608 -48 0 0.500000 0.500000 0 285212672 0 +( -560 1288 -24 ) ( -624 1288 -24 ) ( -624 1288 -32 ) subway/1_stair_side1 944 -48 0 0.500000 0.500000 0 285212672 0 +( -512 1384 -24 ) ( -512 1448 -24 ) ( -512 1448 -32 ) subway/1_concrete_floor -2608 -48 0 0.500000 0.500000 0 285212672 0 +( -560 1264 -24 ) ( -496 1264 -24 ) ( -496 1264 -32 ) subway/1_concrete_floor 944 -48 0 0.500000 0.500000 0 285212672 0 +( -560 1264 -24 ) ( -560 1328 -24 ) ( -496 1328 -24 ) subway/1_stair_top1 944 2656 0 0.500000 0.500000 0 285212672 0 +( -496 1328 -32 ) ( -560 1328 -32 ) ( -560 1264 -32 ) subway/1_concrete_floor 944 2608 0 0.500000 0.500000 0 285212672 0 +} +// brush 4659 +{ +( -624 1304 -16 ) ( -624 1240 -16 ) ( -624 1240 -24 ) subway/1_concrete_floor -2560 -32 0 0.500000 0.500000 0 285212672 0 +( -560 1264 -16 ) ( -624 1264 -16 ) ( -624 1264 -24 ) subway/1_stair_side1 944 -32 0 0.500000 0.500000 0 285212672 0 +( -512 1360 -16 ) ( -512 1424 -16 ) ( -512 1424 -24 ) subway/1_concrete_floor -2560 -32 0 0.500000 0.500000 0 285212672 0 +( -560 1240 -16 ) ( -496 1240 -16 ) ( -496 1240 -24 ) subway/1_concrete_floor 944 -32 0 0.500000 0.500000 0 285212672 0 +( -560 1240 -16 ) ( -560 1304 -16 ) ( -496 1304 -16 ) subway/1_stair_top1 944 2608 0 0.500000 0.500000 0 285212672 0 +( -496 1304 -24 ) ( -560 1304 -24 ) ( -560 1240 -24 ) subway/1_concrete_floor 944 2560 0 0.500000 0.500000 0 285212672 0 +} +// brush 4660 +{ +( -624 1280 -8 ) ( -624 1216 -8 ) ( -624 1216 -16 ) subway/1_concrete_floor -2512 -16 0 0.500000 0.500000 0 285212672 0 +( -560 1240 -8 ) ( -624 1240 -8 ) ( -624 1240 -16 ) subway/1_stair_side1 944 -16 0 0.500000 0.500000 0 285212672 0 +( -512 1336 -8 ) ( -512 1400 -8 ) ( -512 1400 -16 ) subway/1_concrete_floor -2512 -16 0 0.500000 0.500000 0 285212672 0 +( -560 1216 -8 ) ( -496 1216 -8 ) ( -496 1216 -16 ) subway/1_concrete_floor 944 -16 0 0.500000 0.500000 0 285212672 0 +( -560 1216 -8 ) ( -560 1280 -8 ) ( -496 1280 -8 ) subway/1_stair_top1 944 2560 0 0.500000 0.500000 0 285212672 0 +( -496 1280 -16 ) ( -560 1280 -16 ) ( -560 1216 -16 ) subway/1_concrete_floor 944 2512 0 0.500000 0.500000 0 285212672 0 +} +// brush 4661 +{ +( -624 1256 0 ) ( -624 1192 0 ) ( -624 1192 -8 ) subway/1_concrete_floor -2464 0 0 0.500000 0.500000 0 285212672 0 +( -560 1216 0 ) ( -624 1216 0 ) ( -624 1216 -8 ) subway/1_stair_side1 944 0 0 0.500000 0.500000 0 285212672 0 +( -512 1312 0 ) ( -512 1376 0 ) ( -512 1376 -8 ) subway/1_concrete_floor -2464 0 0 0.500000 0.500000 0 285212672 0 +( -560 1192 0 ) ( -496 1192 0 ) ( -496 1192 -8 ) subway/1_concrete_floor 944 0 0 0.500000 0.500000 0 285212672 0 +( -560 1192 0 ) ( -560 1256 0 ) ( -496 1256 0 ) subway/1_stair_top1 944 2512 0 0.500000 0.500000 0 285212672 0 +( -496 1256 -8 ) ( -560 1256 -8 ) ( -560 1192 -8 ) subway/1_concrete_floor 944 2464 0 0.500000 0.500000 0 285212672 0 +} +// brush 4662 +{ +( -120 1544 -168 ) ( -184 1544 -168 ) ( -184 1480 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -184 1480 -152 ) ( -184 1544 -152 ) ( -120 1544 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 192 1544 -152 ) ( 192 1544 -168 ) ( 192 1536 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -432 1544 -24 ) ( -152 1544 -24 ) ( -152 1544 -240 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -240 1544 -128 ) ( -240 1544 -120 ) ( -240 1480 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 40 1552 -168 ) ( 40 1552 -152 ) ( -104 1552 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4663 +{ +( -288 1384 -48 ) ( -288 1320 -48 ) ( -224 1320 -48 ) subway/con14 48 16 0 0.500000 0.500000 0 285212672 0 +( -296 1384 -40 ) ( -112 1384 -40 ) ( -112 1184 -40 ) subway/1_concrete_floor 944 2560 0 0.500000 0.500000 0 285212672 0 +( -96 1384 -40 ) ( -280 1384 -40 ) ( -280 1384 -48 ) subway/1_concrete_floor 688 -320 0 0.500000 0.500000 0 285212672 0 +( 72 1216 -48 ) ( 72 1216 -40 ) ( 72 1280 -40 ) subway/1_concrete_floor -2672 -320 0 0.500000 0.500000 0 285212672 0 +( -208 1184 -48 ) ( -208 1184 -40 ) ( -144 1184 -40 ) subway/1_stair_side1 688 -320 0 0.500000 0.500000 0 285212672 0 +( -296 1384 -48 ) ( -296 1384 -40 ) ( -296 1320 -40 ) subway/1_concrete_floor -2672 -320 0 0.500000 0.500000 0 285212672 0 +} +// brush 4664 +{ +( 192 1376 -152 ) ( 272 1336 -152 ) ( 272 1344 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 192 1384 -80 ) ( 272 1344 -80 ) ( 272 1336 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 272 1344 -152 ) ( 272 1336 -152 ) ( 272 1336 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 192 1384 -152 ) ( 272 1344 -152 ) ( 272 1344 -80 ) subway/1_tile 48 48 0 -0.500000 0.500000 134217728 318767104 10 +( 192 1432 -104 ) ( 192 1368 -104 ) ( 192 1368 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 192 1376 -80 ) ( 272 1336 -80 ) ( 272 1336 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 134217728 318767104 0 +( 216 1368 10 ) ( 216 1368 0 ) ( 160 1312 0 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 134217728 352321536 0 +} +// brush 4665 +{ +( 144 1264 -64 ) ( 80 1264 -64 ) ( 80 1200 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 80 1200 -48 ) ( 80 1264 -48 ) ( 144 1264 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 80 1184 -32 ) ( 80 1184 -136 ) ( 72 1192 -136 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 80 1376 -32 ) ( 80 1376 -136 ) ( 80 1184 -136 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 80 1376 -136 ) ( 80 1376 -32 ) ( 72 1384 -32 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 72 1376 -32 ) ( 72 1376 -136 ) ( 72 1504 -136 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4666 +{ +( 72 1376 -152 ) ( 72 1376 -168 ) ( 72 1504 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 80 1376 -168 ) ( 80 1376 -152 ) ( 72 1384 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 80 1376 -152 ) ( 80 1376 -168 ) ( 80 1184 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 72 1192 -168 ) ( 72 1192 -152 ) ( 80 1184 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 80 1200 -152 ) ( 80 1264 -152 ) ( 144 1264 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 144 1264 -168 ) ( 80 1264 -168 ) ( 80 1200 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4667 +{ +( -160 1400 -168 ) ( -160 1400 -152 ) ( -240 1400 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -280 1384 -128 ) ( -280 1384 -120 ) ( -280 1320 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -328 1384 -24 ) ( -48 1384 -24 ) ( -48 1384 -240 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -136 1400 -152 ) ( -136 1400 -168 ) ( -120 1384 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -152 1320 -152 ) ( -152 1384 -152 ) ( -88 1384 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -88 1384 -168 ) ( -152 1384 -168 ) ( -152 1320 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4668 +{ +( -88 1384 -64 ) ( -152 1384 -64 ) ( -152 1320 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -152 1320 -48 ) ( -152 1384 -48 ) ( -88 1384 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -136 1400 -32 ) ( -136 1400 -136 ) ( -120 1384 -136 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -328 1384 8 ) ( -48 1384 8 ) ( -48 1384 -208 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -280 1384 -96 ) ( -280 1384 -88 ) ( -280 1320 -88 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -160 1400 -136 ) ( -160 1400 -32 ) ( -240 1400 -32 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4669 +{ +( -120 1392 -152 ) ( -120 1392 -48 ) ( -120 1536 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -136 1528 -48 ) ( -136 1528 -152 ) ( -120 1544 -152 ) subway/1_tile 560 -32 0 0.500000 0.500000 0 318767104 0 +( -136 1528 -152 ) ( -136 1528 -48 ) ( -136 1504 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -112 1496 -48 ) ( -112 1496 -152 ) ( -120 1496 -152 ) subway/1_tile 848 -32 0 0.500000 0.500000 0 318767104 0 +( -192 1480 -64 ) ( -128 1480 -64 ) ( -128 1416 -64 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +( -128 1416 -152 ) ( -128 1480 -152 ) ( -192 1480 -152 ) subway/1_tile 800 2864 0 0.500000 0.500000 0 318767104 0 +} +// brush 4670 +{ +( -128 1416 -168 ) ( -128 1480 -168 ) ( -192 1480 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -192 1480 -152 ) ( -128 1480 -152 ) ( -128 1416 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -112 1496 -152 ) ( -112 1496 -168 ) ( -120 1496 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -136 1528 -168 ) ( -136 1528 -152 ) ( -136 1504 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -136 1528 -152 ) ( -136 1528 -168 ) ( -120 1544 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -120 1392 -168 ) ( -120 1392 -152 ) ( -120 1536 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4671 +{ +( -120 1280 -168 ) ( -120 1280 -152 ) ( -120 1424 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -128 1432 -128 ) ( -128 1432 -120 ) ( -192 1432 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -136 1400 -152 ) ( -136 1400 -168 ) ( -136 1424 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -136 1400 -168 ) ( -136 1400 -152 ) ( -120 1384 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -192 1360 -152 ) ( -128 1360 -152 ) ( -128 1296 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -128 1296 -168 ) ( -128 1360 -168 ) ( -192 1360 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4672 +{ +( -64 1544 -136 ) ( -64 1544 -32 ) ( -208 1544 -32 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -216 1536 -96 ) ( -216 1536 -88 ) ( -216 1472 -88 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -136 1528 -32 ) ( -136 1528 -136 ) ( -216 1528 -136 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -136 1528 -136 ) ( -136 1528 -32 ) ( -120 1544 -32 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -152 1472 -48 ) ( -152 1536 -48 ) ( -88 1536 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -88 1536 -64 ) ( -152 1536 -64 ) ( -152 1472 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4673 +{ +( -88 1536 -168 ) ( -152 1536 -168 ) ( -152 1472 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -152 1472 -152 ) ( -152 1536 -152 ) ( -88 1536 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -136 1528 -168 ) ( -136 1528 -152 ) ( -120 1544 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -136 1528 -152 ) ( -136 1528 -168 ) ( -216 1528 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -216 1536 -128 ) ( -216 1536 -120 ) ( -216 1472 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -64 1544 -168 ) ( -64 1544 -152 ) ( -208 1544 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4674 +{ +( -96 1384 -168 ) ( -160 1384 -168 ) ( -160 1320 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -160 1320 -152 ) ( -160 1384 -152 ) ( -96 1384 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -280 1384 -168 ) ( -280 1384 -152 ) ( -280 1400 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -280 1376 -152 ) ( -280 1376 -168 ) ( -288 1376 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -288 1376 -128 ) ( -288 1376 -120 ) ( -288 1312 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -168 1400 -168 ) ( -168 1400 -152 ) ( -248 1400 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4675 +{ +( -168 1400 -136 ) ( -168 1400 -32 ) ( -248 1400 -32 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -288 1376 -96 ) ( -288 1376 -88 ) ( -288 1312 -88 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -280 1376 -32 ) ( -280 1376 -136 ) ( -288 1376 -136 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -280 1384 -152 ) ( -280 1384 -48 ) ( -280 1400 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -160 1320 -48 ) ( -160 1384 -48 ) ( -96 1384 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -96 1384 -64 ) ( -160 1384 -64 ) ( -160 1320 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4676 +{ +( -224 1520 -168 ) ( -224 1520 -152 ) ( -224 1376 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -216 1400 -128 ) ( -216 1400 -120 ) ( -152 1400 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -216 1352 -24 ) ( -216 1632 -24 ) ( -216 1632 -240 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -224 1544 -152 ) ( -224 1544 -168 ) ( -216 1544 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -152 1440 -152 ) ( -216 1440 -152 ) ( -216 1504 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -216 1504 -168 ) ( -216 1440 -168 ) ( -152 1440 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4677 +{ +( -216 1504 -64 ) ( -216 1440 -64 ) ( -152 1440 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -152 1440 -48 ) ( -216 1440 -48 ) ( -216 1504 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -224 1544 -32 ) ( -224 1544 -136 ) ( -216 1544 -136 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -216 1352 8 ) ( -216 1632 8 ) ( -216 1632 -208 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -216 1400 -96 ) ( -216 1400 -88 ) ( -152 1400 -88 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -224 1520 -136 ) ( -224 1520 -32 ) ( -224 1376 -32 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4678 +{ +( -120 1232 -48 ) ( -120 1232 -152 ) ( -120 1192 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -208 1192 -104 ) ( -144 1192 -104 ) ( -144 1192 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -152 1600 -224 ) ( -152 1600 -8 ) ( -152 1320 -8 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -120 1224 -152 ) ( -120 1224 -48 ) ( -152 1224 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -152 1512 -80 ) ( -152 1448 -80 ) ( -216 1448 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -216 1448 -152 ) ( -152 1448 -152 ) ( -152 1512 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4679 +{ +( -216 1448 -168 ) ( -152 1448 -168 ) ( -152 1512 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -152 1512 -152 ) ( -152 1448 -152 ) ( -216 1448 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -120 1224 -168 ) ( -120 1224 -152 ) ( -152 1224 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -152 1600 -248 ) ( -152 1600 -32 ) ( -152 1320 -32 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -208 1192 -128 ) ( -144 1192 -128 ) ( -144 1192 -136 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -120 1232 -152 ) ( -120 1232 -168 ) ( -120 1192 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4680 +{ +( -432 1384 -48 ) ( -432 1320 -48 ) ( -368 1320 -48 ) subway/con14 48 16 0 0.500000 0.500000 0 285212672 0 +( -440 1376 -40 ) ( -120 1376 -40 ) ( -120 1184 -40 ) subway/1_concrete_floor 944 2560 0 0.500000 0.500000 0 285212672 0 +( -120 1376 -40 ) ( -440 1376 -40 ) ( -440 1384 -48 ) subway/1_concrete_floor 688 -320 0 0.500000 0.500000 0 285212672 0 +( -296 1208 -48 ) ( -296 1208 -40 ) ( -296 1272 -40 ) subway/1_concrete_floor -2672 -320 0 0.500000 0.500000 0 285212672 0 +( -352 1184 -48 ) ( -352 1184 -40 ) ( -288 1184 -40 ) subway/1_stair_side1 688 -320 0 0.500000 0.500000 0 285212672 0 +( -440 1384 -48 ) ( -440 1384 -40 ) ( -440 1320 -40 ) subway/1_concrete_floor -2672 -320 0 0.500000 0.500000 0 285212672 0 +} +// brush 4681 +{ +( -448 1392 -176 ) ( -448 1392 -168 ) ( -448 1328 -168 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( -352 1184 -176 ) ( -352 1184 -168 ) ( -288 1184 -168 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 80 1224 -176 ) ( 80 1224 -168 ) ( 80 1288 -168 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 285212672 0 +( -240 1384 -176 ) ( -240 1384 -168 ) ( -304 1384 -168 ) subway/1_concrete_floor 48 0 0 0.500000 0.500000 0 285212672 0 +( -368 1328 -168 ) ( -432 1328 -168 ) ( -432 1392 -168 ) subway/1_concrete_floor 48 16 0 0.500000 0.500000 0 285212672 0 +( -432 1392 -176 ) ( -432 1328 -176 ) ( -368 1328 -176 ) subway/1_concrete_floor 48 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4682 +{ +( -360 1120 -64 ) ( -360 1184 -64 ) ( -424 1184 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -424 1184 -48 ) ( -360 1184 -48 ) ( -360 1120 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -448 1184 -32 ) ( -448 1184 -136 ) ( -440 1192 -136 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 80 1184 -32 ) ( 80 1184 -136 ) ( -256 1184 -136 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 80 1184 -136 ) ( 80 1184 -32 ) ( 72 1192 -32 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( -248 1192 -32 ) ( -248 1192 -136 ) ( -120 1192 -136 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4683 +{ +( -248 1192 -152 ) ( -248 1192 -168 ) ( -120 1192 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 80 1184 -168 ) ( 80 1184 -152 ) ( 72 1192 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 80 1184 -152 ) ( 80 1184 -168 ) ( -256 1184 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -440 1192 -168 ) ( -440 1192 -152 ) ( -448 1184 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -424 1184 -152 ) ( -360 1184 -152 ) ( -360 1120 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -360 1120 -168 ) ( -360 1184 -168 ) ( -424 1184 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4684 +{ +( -304 1504 -168 ) ( -304 1440 -168 ) ( -240 1440 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -240 1440 -152 ) ( -304 1440 -152 ) ( -304 1504 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -312 1528 -240 ) ( -304 1520 -240 ) ( -304 1520 -24 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -304 1312 -24 ) ( -304 1592 -24 ) ( -304 1592 -240 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -304 1376 -128 ) ( -304 1376 -120 ) ( -240 1376 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -312 1392 -128 ) ( -312 1392 -120 ) ( -312 1328 -120 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4685 +{ +( -312 1232 -128 ) ( -312 1232 -232 ) ( -312 1192 -232 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -400 1192 -152 ) ( -336 1192 -152 ) ( -336 1192 -160 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -344 1600 -272 ) ( -344 1600 -56 ) ( -344 1320 -56 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -312 1224 -200 ) ( -312 1224 -96 ) ( -344 1224 -96 ) subway/1_tile 16 0 0 -0.500000 0.500000 0 318767104 0 +( -344 1512 -128 ) ( -344 1448 -128 ) ( -408 1448 -128 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -408 1448 -152 ) ( -344 1448 -152 ) ( -344 1512 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4686 +{ +( -408 1448 -168 ) ( -344 1448 -168 ) ( -344 1512 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -344 1512 -152 ) ( -344 1448 -152 ) ( -408 1448 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -312 1224 -168 ) ( -312 1224 -152 ) ( -344 1224 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -344 1600 -248 ) ( -344 1600 -32 ) ( -344 1320 -32 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -400 1192 -128 ) ( -336 1192 -128 ) ( -336 1192 -136 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -312 1232 -152 ) ( -312 1232 -168 ) ( -312 1192 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4687 +{ +( -408 1232 -152 ) ( -408 1232 -168 ) ( -408 1192 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -496 1192 -128 ) ( -432 1192 -128 ) ( -432 1192 -136 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -440 1600 -248 ) ( -440 1600 -32 ) ( -440 1320 -32 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -408 1224 -168 ) ( -408 1224 -152 ) ( -440 1224 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -440 1512 -152 ) ( -440 1448 -152 ) ( -504 1448 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -504 1448 -168 ) ( -440 1448 -168 ) ( -440 1512 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4688 +{ +( -216 1232 -80 ) ( -216 1232 -184 ) ( -216 1192 -184 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -304 1192 -104 ) ( -240 1192 -104 ) ( -240 1192 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -248 1600 -224 ) ( -248 1600 -8 ) ( -248 1320 -8 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -216 1224 -152 ) ( -216 1224 -48 ) ( -248 1224 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -248 1512 -80 ) ( -248 1448 -80 ) ( -312 1448 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -312 1448 -152 ) ( -248 1448 -152 ) ( -248 1512 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4689 +{ +( -312 1448 -168 ) ( -248 1448 -168 ) ( -248 1512 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -248 1512 -152 ) ( -248 1448 -152 ) ( -312 1448 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -216 1224 -168 ) ( -216 1224 -152 ) ( -248 1224 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -248 1600 -248 ) ( -248 1600 -32 ) ( -248 1320 -32 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -304 1192 -128 ) ( -240 1192 -128 ) ( -240 1192 -136 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -216 1232 -152 ) ( -216 1232 -168 ) ( -216 1192 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4690 +{ +( -440 1000 -128 ) ( -440 1064 -128 ) ( -440 1064 -136 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -448 1184 -168 ) ( -448 1184 -152 ) ( -440 1192 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -448 1176 -152 ) ( -448 1176 -168 ) ( -448 1520 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -448 1520 -32 ) ( -448 1520 -248 ) ( -440 1528 -248 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -448 1504 -152 ) ( -448 1440 -152 ) ( -512 1440 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -512 1440 -168 ) ( -448 1440 -168 ) ( -448 1504 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4691 +{ +( 192 1376 -168 ) ( 272 1336 -168 ) ( 272 1344 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 134217728 318767104 0 +( 192 1384 -152 ) ( 272 1344 -152 ) ( 272 1336 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 134217728 318767104 0 +( 272 1344 -168 ) ( 272 1336 -168 ) ( 272 1336 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 134217728 318767104 0 +( 192 1384 -168 ) ( 272 1344 -168 ) ( 272 1344 -152 ) subway/1_tile_bottom 48 48 0 -0.500000 0.500000 134217728 318767104 10 +( 192 1432 -128 ) ( 192 1368 -128 ) ( 192 1368 -136 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 134217728 318767104 0 +( 192 1376 -152 ) ( 272 1336 -152 ) ( 272 1336 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 134217728 318767104 0 +( 224 1376 10 ) ( 224 1376 0 ) ( 160 1312 0 ) subway/1_cork_ceiling 16 16 0 0.500000 0.500000 134217728 352321536 0 +} +// brush 4692 +{ +( -280 1352 16 ) ( -288 1344 16 ) ( -288 1344 26 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 1 +( -304 1344 16 ) ( -312 1352 16 ) ( -312 1352 26 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 1 +( -312 1344 -32 ) ( -312 1344 -152 ) ( -312 1376 -152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 1 +( -312 1344 -152 ) ( -312 1344 -32 ) ( -280 1344 -32 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 1 +( -280 1168 8 ) ( -280 1448 8 ) ( -280 1448 -208 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 1 +( -312 1376 -32 ) ( -312 1376 -152 ) ( -304 1376 -152 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 1 +( -240 1296 -48 ) ( -304 1296 -48 ) ( -304 1360 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 1 +( -304 1360 -64 ) ( -304 1296 -64 ) ( -240 1296 -64 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 1 +} +// brush 4693 +{ +( -304 1360 -168 ) ( -304 1296 -168 ) ( -240 1296 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 1 +( -240 1296 -152 ) ( -304 1296 -152 ) ( -304 1360 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 1 +( -312 1376 -64 ) ( -312 1376 -184 ) ( -304 1376 -184 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 1 +( -280 1168 -24 ) ( -280 1448 -24 ) ( -280 1448 -240 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 1 +( -312 1344 -184 ) ( -312 1344 -64 ) ( -280 1344 -64 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 1 +( -312 1344 -64 ) ( -312 1344 -184 ) ( -312 1376 -184 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 1 +( -304 1344 -16 ) ( -312 1352 -16 ) ( -312 1352 -6 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 1 +( -280 1352 -16 ) ( -288 1344 -16 ) ( -288 1344 -6 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 1 +} +// brush 4694 +{ +( -24 1448 -152 ) ( 40 1448 -152 ) ( 40 1512 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1512 -80 ) ( 40 1448 -80 ) ( -24 1448 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 1224 -152 ) ( 72 1224 -48 ) ( 40 1224 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 40 1600 -224 ) ( 40 1600 -8 ) ( 40 1320 -8 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( -16 1192 -104 ) ( 48 1192 -104 ) ( 48 1192 -112 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 72 1232 -48 ) ( 72 1232 -152 ) ( 72 1192 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4695 +{ +( -464 1384 -168 ) ( -464 1320 -168 ) ( -400 1320 -168 ) subway/1_black 0 8 0 1 1 0 16777216 0 +( -472 1504 -112 ) ( -464 1504 -112 ) ( -464 1360 -160 ) subway/1_black 0 8 0 1 1 0 16777216 0 +( -464 1504 -112 ) ( -472 1504 -112 ) ( -472 1504 -168 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -464 1200 -168 ) ( -464 1200 -160 ) ( -464 1264 -160 ) subway/1_black -8 0 0 1 1 0 16777216 0 +( -400 1360 -168 ) ( -400 1360 -160 ) ( -336 1360 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( -472 1504 -168 ) ( -472 1504 -160 ) ( -472 1440 -160 ) subway/1_black -8 0 0 1 1 0 16777216 0 +} +// brush 4696 +{ +( -448 1384 0 ) ( -448 1376 0 ) ( -448 1376 -32 ) subway/1_tile 944 2544 0 0.500000 0.500000 0 318767104 0 +( -304 1384 -16 ) ( -448 1384 -16 ) ( -448 1384 -48 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -304 1376 0 ) ( -304 1384 0 ) ( -304 1384 -32 ) subway/1_tile 944 2544 0 0.500000 0.500000 0 318767104 0 +( -304 1368 -40 ) ( -448 1368 -40 ) ( -448 1368 0 ) subway/1_tile 944 2544 0 0.500000 0.500000 0 318767104 0 +( -448 1376 0 ) ( -448 1384 0 ) ( -304 1384 0 ) subway/1_tile 944 2544 0 0.500000 0.500000 0 318767104 0 +( -448 1368 -40 ) ( -304 1368 -40 ) ( -304 1384 -48 ) subway/1_tile 944 2544 0 0.500000 0.500000 0 318767104 0 +} +// brush 4697 +{ +( -680 1160 128 ) ( -784 1160 128 ) ( -784 1152 136 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -776 1176 152 ) ( -632 1176 152 ) ( -632 808 152 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -904 1152 144 ) ( -904 1152 152 ) ( -840 1152 152 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -784 1168 136 ) ( -784 1168 144 ) ( -784 800 144 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -784 1160 128 ) ( -680 1160 128 ) ( -680 1160 152 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( -680 1176 144 ) ( -680 1176 136 ) ( -680 808 136 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 4698 +{ +( -312 1416 -32 ) ( -312 1784 -32 ) ( -336 1784 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -304 1520 -32 ) ( -304 1520 0 ) ( -336 1552 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -304 1520 0 ) ( -304 1520 -32 ) ( -304 1448 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -304 1384 -32 ) ( -312 1384 -32 ) ( -336 1384 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -304 1424 0 ) ( -336 1424 0 ) ( -336 1488 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -312 1384 -32 ) ( -304 1384 -32 ) ( -304 1520 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 4699 +{ +( -344 1528 -32 ) ( 24 1528 -32 ) ( 24 1552 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -248 1528 -32 ) ( -240 1520 -32 ) ( -240 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -312 1520 -32 ) ( -312 1520 0 ) ( -240 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -336 1552 0 ) ( -336 1520 0 ) ( -312 1520 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -336 1520 0 ) ( -336 1552 0 ) ( -272 1552 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -336 1520 -32 ) ( 32 1520 -32 ) ( 32 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -304 1520 0 ) ( -336 1552 0 ) ( -336 1552 10 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 4700 +{ +( -536 1248 96 ) ( -536 1144 96 ) ( -496 1144 96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -528 1136 128 ) ( -528 1248 128 ) ( -496 1248 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 928 96 ) ( -496 928 128 ) ( -496 1520 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 96 ) ( -496 1520 128 ) ( -528 1520 128 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -528 1256 128 ) ( -528 1144 128 ) ( -504 1144 96 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( -496 936 128 ) ( -496 936 96 ) ( -504 944 96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 4701 +{ +( -632 1528 24 ) ( -632 1520 24 ) ( -632 1520 16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -496 1528 48 ) ( -632 1528 48 ) ( -632 1528 40 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -504 1520 48 ) ( -504 1528 48 ) ( -504 1528 40 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -640 1520 24 ) ( -504 1520 24 ) ( -504 1520 16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -632 1520 48 ) ( -632 1528 48 ) ( -496 1528 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -488 1528 32 ) ( -624 1528 32 ) ( -624 1520 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4702 +{ +( -632 1528 24 ) ( -632 1520 24 ) ( -632 1520 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -496 1528 48 ) ( -632 1528 48 ) ( -632 1528 40 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -504 1520 48 ) ( -504 1528 48 ) ( -504 1528 40 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -640 1520 24 ) ( -504 1520 24 ) ( -504 1520 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -632 1520 32 ) ( -632 1528 32 ) ( -496 1528 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -496 1528 16 ) ( -632 1528 16 ) ( -632 1520 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4703 +{ +( -504 944 48 ) ( -504 944 32 ) ( -504 1520 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -504 1520 0 ) ( -504 1520 -16 ) ( -496 1520 -16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -496 1520 120 ) ( -496 1520 -16 ) ( -496 1168 -16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -504 944 32 ) ( -504 944 48 ) ( -496 936 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -496 1456 48 ) ( -496 1520 48 ) ( -432 1520 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -496 1520 32 ) ( -504 1528 32 ) ( -504 1168 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4704 +{ +( -632 1520 16 ) ( -640 1528 16 ) ( -640 1168 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -632 1456 32 ) ( -632 1520 32 ) ( -568 1520 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -640 1088 -32 ) ( -640 1088 32 ) ( -632 1080 32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -632 1432 152 ) ( -632 1432 16 ) ( -632 1080 16 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -640 1520 -16 ) ( -640 1520 -32 ) ( -632 1520 -32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -640 1088 32 ) ( -640 1088 -32 ) ( -640 1520 -32 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4705 +{ +( -640 1088 48 ) ( -640 1088 32 ) ( -640 1520 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -640 1520 0 ) ( -640 1520 -16 ) ( -632 1520 -16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -632 1432 120 ) ( -632 1432 -16 ) ( -632 1080 -16 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -640 1088 32 ) ( -640 1088 48 ) ( -632 1080 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -632 1456 48 ) ( -632 1520 48 ) ( -568 1520 48 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( -632 1520 32 ) ( -640 1528 32 ) ( -640 1168 32 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4706 +{ +( -432 1520 -48 ) ( -496 1520 -48 ) ( -496 1456 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1456 -32 ) ( -496 1520 -32 ) ( -432 1520 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -416 1168 -8 ) ( -352 1168 -8 ) ( -352 1168 -16 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 88 ) ( -496 1520 -48 ) ( -496 1168 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 -48 ) ( -496 1520 88 ) ( -504 1528 88 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -504 1568 -8 ) ( -504 1504 -8 ) ( -504 1504 -16 ) subway/1_tile 32 0 0 -0.500000 0.500000 0 318767104 0 +} +// brush 4707 +{ +( -304 1536 8 ) ( -304 1536 0 ) ( -304 1168 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -440 1528 -24 ) ( -440 1528 8 ) ( -448 1528 8 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -448 1536 0 ) ( -448 1536 8 ) ( -448 1168 8 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -560 1384 8 ) ( -560 1384 16 ) ( -496 1384 16 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -448 1536 8 ) ( -304 1536 8 ) ( -304 1168 8 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -304 1536 0 ) ( -448 1536 0 ) ( -448 1168 0 ) subway/1_concrete_floor2 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4708 +{ +( -448 1384 -32 ) ( -440 1384 -32 ) ( -440 1528 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -416 1488 0 ) ( -416 1424 0 ) ( -448 1424 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -440 1384 -32 ) ( -448 1384 -32 ) ( -448 1384 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -448 1448 -32 ) ( -448 1520 -32 ) ( -448 1520 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -416 1552 0 ) ( -448 1520 0 ) ( -448 1520 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -416 1784 0 ) ( -440 1784 -32 ) ( -440 1416 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 4709 +{ +( -600 1752 -32 ) ( -968 1752 -32 ) ( -968 1728 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -696 1760 -32 ) ( -696 1760 0 ) ( -696 1728 0 ) subway/1_tile -2656 192 0 0.500000 0.500000 0 318767104 0 +( -672 1760 0 ) ( -672 1760 -32 ) ( -240 1760 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -248 1752 0 ) ( -248 1752 -32 ) ( -256 1744 -32 ) subway/1_tile -2656 192 0 0.500000 0.500000 0 318767104 0 +( -608 1728 0 ) ( -976 1728 0 ) ( -976 1760 0 ) subway/1_tile -2464 384 0 0.500000 0.500000 0 318767104 0 +( -608 1760 -32 ) ( -976 1760 -32 ) ( -976 1752 -32 ) subway/1_tile -2464 384 0 0.500000 0.500000 0 318767104 0 +} +// brush 4710 +{ +( -248 1320 -32 ) ( -248 1688 -32 ) ( -272 1688 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -248 1752 -32 ) ( -240 1760 -32 ) ( -240 1760 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -240 1520 0 ) ( -240 1680 0 ) ( -240 1680 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -272 1552 0 ) ( -240 1520 0 ) ( -240 1520 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -272 1312 0 ) ( -272 1680 0 ) ( -240 1680 0 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -240 1312 -32 ) ( -240 1680 -32 ) ( -248 1680 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 4711 +{ +( -696 1600 16 ) ( -696 1536 16 ) ( -696 1536 8 ) subway/1_concrete_floor 0 0 0 1 1 0 285212672 0 +( -492 1752 16 ) ( -556 1752 16 ) ( -556 1752 8 ) subway/1_concrete_floor 0 0 0 1 1 0 285212672 0 +( -248 1672 16 ) ( -248 1736 16 ) ( -248 1736 8 ) subway/1_concrete_floor 0 0 0 1 1 0 285212672 0 +( -496 1528 16 ) ( -432 1528 16 ) ( -432 1528 8 ) subway/1_concrete_floor 0 0 0 1 1 0 285212672 0 +( -568 1528 8 ) ( -568 1592 8 ) ( -504 1592 8 ) subway/1_concrete_floor 0 0 0 1 1 0 285212672 0 +( -504 1592 0 ) ( -568 1592 0 ) ( -568 1528 0 ) subway/1_concrete_floor2 32 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 4712 +{ +( 72 1232 -152 ) ( 72 1232 -168 ) ( 72 1192 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -16 1192 -128 ) ( 48 1192 -128 ) ( 48 1192 -136 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 40 1600 -248 ) ( 40 1600 -32 ) ( 40 1320 -32 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 72 1224 -168 ) ( 72 1224 -152 ) ( 40 1224 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 40 1512 -152 ) ( 40 1448 -152 ) ( -24 1448 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( -24 1448 -168 ) ( 40 1448 -168 ) ( 40 1512 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4713 +{ +( -144 1528 -88 ) ( -208 1528 -88 ) ( -208 1528 -96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -448 1520 -96 ) ( -448 1520 8 ) ( -440 1528 8 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -448 1520 8 ) ( -448 1520 -96 ) ( -496 1520 -96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -496 1520 8 ) ( -496 1520 -96 ) ( -504 1528 -96 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -456 1520 -32 ) ( -392 1520 -32 ) ( -392 1456 -32 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +( -392 1456 -48 ) ( -392 1520 -48 ) ( -456 1520 -48 ) subway/1_tile -2464 192 0 0.500000 0.500000 0 318767104 0 +} +// brush 4714 +{ +( -248 1448 -128 ) ( -248 1448 -120 ) ( -248 1384 -120 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -248 1528 -64 ) ( -240 1520 -64 ) ( -240 1520 -128 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -240 1792 -128 ) ( -240 1624 -128 ) ( -240 1624 -64 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -240 1760 -144 ) ( -232 1768 -144 ) ( -232 1768 -80 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -176 1480 -96 ) ( -240 1480 -96 ) ( -240 1544 -96 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -240 1544 -112 ) ( -240 1480 -112 ) ( -176 1480 -112 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4715 +{ +( -488 1528 -136 ) ( -552 1528 -136 ) ( -552 1528 -144 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -640 1520 -144 ) ( -640 1520 -40 ) ( -632 1528 -40 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -128 ) ( -704 1520 -64 ) ( -640 1520 -64 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -64 ) ( -704 1520 -128 ) ( -696 1528 -128 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -648 1520 -96 ) ( -584 1520 -96 ) ( -584 1456 -96 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -584 1456 -112 ) ( -584 1520 -112 ) ( -648 1520 -112 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4716 +{ +( -432 1520 -128 ) ( -496 1520 -128 ) ( -496 1456 -128 ) subway/1_tile -2464 0 0 0.500000 0.500000 0 318767104 0 +( -496 1456 -64 ) ( -496 1520 -64 ) ( -432 1520 -64 ) subway/1_tile -2464 0 0 0.500000 0.500000 0 318767104 0 +( -416 1168 -88 ) ( -352 1168 -88 ) ( -352 1168 -96 ) subway/1_tile -2464 0 0 0.500000 0.500000 0 318767104 0 +( -496 1520 8 ) ( -496 1520 -128 ) ( -496 1168 -128 ) subway/1_tile -2464 0 0 0.500000 0.500000 0 318767104 0 +( -496 1520 -128 ) ( -496 1520 8 ) ( -504 1528 8 ) subway/1_tile -2464 0 0 0.500000 0.500000 0 318767104 0 +( -504 1568 -104 ) ( -504 1504 -104 ) ( -504 1504 -112 ) subway/1_tile -2464 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4717 +{ +( -632 1504 -128 ) ( -632 1504 -120 ) ( -632 1568 -120 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -632 1528 -24 ) ( -640 1520 -24 ) ( -640 1520 -160 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -640 1168 -144 ) ( -640 1520 -144 ) ( -640 1520 -8 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -784 1168 -112 ) ( -784 1168 -104 ) ( -720 1168 -104 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -704 1520 -96 ) ( -640 1520 -96 ) ( -640 1456 -96 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( -640 1456 -112 ) ( -640 1520 -112 ) ( -704 1520 -112 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +} +} +// entity 1 +{ +"classname" "script_runner" +"script" "tsr1/stallchecker" +"targetname" "t57" +"origin" "1624 728 -216" +} +// entity 2 +{ +"spawnflags" "1" +"targetname" "new_clip_stall" +"classname" "func_wall" +// brush 0 +{ +( 1780 1004 -208 ) ( 1780 1000 -208 ) ( 1824 1004 -208 ) subway/clip 32 0 -180 1 -1 196608 144 0 +( 1780 1000 -144 ) ( 1780 1004 -144 ) ( 1824 1008 -144 ) subway/clip 32 0 -180 1 -1 196608 144 0 +( 1780 1004 -200 ) ( 1780 1000 -200 ) ( 1780 1000 -204 ) subway/clip 32 0 -180 1 -1 196608 144 0 +( 1780 1000 -208 ) ( 1780 1000 -144 ) ( 1824 1004 -144 ) subway/clip 32 0 -180 1 -1 196608 144 0 +( 1824 1004 -200 ) ( 1824 1008 -200 ) ( 1824 1008 -204 ) subway/clip 32 0 -180 1 -1 196608 144 0 +( 1780 1004 -144 ) ( 1780 1004 -208 ) ( 1824 1008 -208 ) subway/clip 32 0 -180 1 -1 196608 144 0 +} +} +// entity 3 +{ +"classname" "info_notnull" +"targetname" "stall_playerfind" +"origin" "1184 888 -168" +} +// entity 4 +{ +"classname" "script_runner" +"targetname" "t255" +"script" "tsr1/check_guys" +"origin" "1544 712 -160" +} +// entity 5 +{ +"classname" "trigger_once" +"target" "t255" +// brush 0 +{ +( 1432 800 -216 ) ( 1424 800 -216 ) ( 1424 720 -216 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1424 720 -128 ) ( 1424 800 -128 ) ( 1432 800 -128 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1424 720 -128 ) ( 1432 720 -128 ) ( 1432 720 -216 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1432 720 -128 ) ( 1432 800 -128 ) ( 1432 800 -216 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1432 800 -128 ) ( 1424 800 -128 ) ( 1424 800 -216 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1424 800 -128 ) ( 1424 720 -128 ) ( 1424 720 -216 ) subway/trigger -40 0 0 1 1 0 144 0 +} +} +// entity 6 +{ +"health" "300" +"spawnflags" "2" +"origin" "1128 2792 -376" +"targetname" "qa_explosion" +"classname" "environ_explosion" +} +// entity 7 +{ +"count" "50" +"health" "700" +"style" "1" +"origin" "1128 1032 -408" +"targetname" "qa_camerashake" +"classname" "func_camerashake" +} +// entity 8 +{ +"mass" "2" +"material" "8" +"surfaceType" "28" +"targetname" "breakstall" +"classname" "func_breakable_brush" +// brush 0 +{ +( 1130 910 -192 ) ( 1126 910 -192 ) ( 1126 872 -192 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1126 872 -168 ) ( 1126 910 -168 ) ( 1130 910 -168 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1129 872 -168 ) ( 1129 910 -168 ) ( 1129 910 -192 ) subway/1_bath_stall 26 -16 0 1 1 0 16908288 0 +( 1130 898 -168 ) ( 1126 898 -168 ) ( 1126 898 -192 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1127 910 -168 ) ( 1127 872 -168 ) ( 1127 872 -192 ) subway/1_bath_stall 26 -16 0 1 1 0 16908288 0 +( 1126 866 -180 ) ( 1126 874 -168 ) ( 1130 870 -174 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1126 874 -192 ) ( 1126 866 -180 ) ( 1130 870 -186 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +} +// brush 1 +{ +( 1126 882 -168 ) ( 1130 882 -168 ) ( 1130 904 -168 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1126 862 -144 ) ( 1126 892 -144 ) ( 1132 892 -144 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1129 862 -144 ) ( 1129 892 -144 ) ( 1129 892 -180 ) subway/1_bath_stall 26 -16 0 1 1 0 16908288 0 +( 1127 892 -144 ) ( 1127 862 -144 ) ( 1127 862 -180 ) subway/1_bath_stall 26 -16 0 1 1 0 16908288 0 +( 1124 908 -192 ) ( 1136 908 -192 ) ( 1130 908 -144 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1130 874 -168 ) ( 1126 874 -168 ) ( 1126 864 -144 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1126 908 -158 ) ( 1126 898 -168 ) ( 1130 903 -163 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +} +// brush 2 +{ +( 1130 924 -192 ) ( 1126 924 -192 ) ( 1126 886 -192 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1129 886 -168 ) ( 1129 924 -168 ) ( 1129 924 -192 ) subway/1_bath_stall 26 -16 0 1 1 0 16908288 0 +( 1130 908 -168 ) ( 1126 908 -168 ) ( 1126 908 -192 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1127 924 -168 ) ( 1127 886 -168 ) ( 1127 886 -192 ) subway/1_bath_stall 26 -16 0 1 1 0 16908288 0 +( 1126 898 -172 ) ( 1126 908 -188 ) ( 1130 903 -180 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +( 1126 898 -192 ) ( 1126 898 -172 ) ( 1130 898 -182 ) subway/1_bath_stall 26 -16 0 1 1 0 16777216 0 +} +} +// entity 9 +{ +"classname" "item_equip_grenade" +"origin" "708 1356 -130" +} +// entity 10 +{ +"spawnflags" "1" +"targetname" "show_objectives" +"classname" "trigger_objectives" +// brush 0 +{ +( -584 1008 56 ) ( -616 1008 56 ) ( -616 992 56 ) subway/trigger 32 -8 0 1 1 0 128 0 +( -616 992 64 ) ( -616 1008 64 ) ( -584 1008 64 ) subway/trigger 32 -8 0 1 1 0 128 0 +( -616 944 64 ) ( -584 944 64 ) ( -584 944 48 ) subway/trigger 32 8 0 1 1 0 128 0 +( -536 976 64 ) ( -536 992 64 ) ( -536 992 48 ) subway/trigger 8 8 0 1 1 0 128 0 +( -584 1008 64 ) ( -616 1008 64 ) ( -616 1008 48 ) subway/trigger 32 8 0 1 1 0 128 0 +( -616 1008 64 ) ( -616 992 64 ) ( -616 992 48 ) subway/trigger 8 8 0 1 1 0 128 0 +} +} +// entity 11 +{ +"origin" "456 -160 -168" +"targetname" "health_2" +"parm2" "health1_button" +"parm1" "health1_door" +"script" "tsr1/health" +"classname" "script_runner" +} +// entity 12 +{ +"classname" "script_runner" +"script" "tsr1/health" +"origin" "-180 -928 -336" +"parm1" "health2_door" +"parm2" "health2_but" +"targetname" "health_1" +} +// entity 13 +{ +"origin" "-144 1264 -152" +"angle" "180" +"targetname" "t253" +"classname" "point_combat" +} +// entity 14 +{ +"classname" "script_runner" +"targetname" "t122" +"script" "tsr1/hostageb" +"origin" "24 592 -104" +} +// entity 15 +{ +"classname" "func_wall" +"targetname" "raf_clipdoor" +"spawnflags" "1" +// brush 0 +{ +( 1528 1068 -208 ) ( 1572 1060 -208 ) ( 1572 1064 -208 ) subway/clip -15 24 90 1 1 196608 144 0 +( 1528 1072 -144 ) ( 1572 1064 -144 ) ( 1572 1060 -144 ) subway/clip -15 24 90 1 1 196608 144 0 +( 1572 1060 -204 ) ( 1572 1060 -200 ) ( 1572 1064 -200 ) subway/clip -16 0 0 1 1 196608 144 0 +( 1528 1068 -200 ) ( 1572 1060 -200 ) ( 1572 1060 -204 ) subway/clip -24 0 -180 1 -1 196608 144 0 +( 1528 1072 -204 ) ( 1528 1072 -200 ) ( 1528 1068 -200 ) subway/clip -16 0 0 1 1 196608 144 0 +( 1528 1072 -204 ) ( 1572 1064 -204 ) ( 1572 1064 -200 ) subway/clip -24 0 -180 1 -1 196608 144 0 +} +} +// entity 16 +{ +"origin" "1128 904 -456" +"targetname" "new_train_shake" +"classname" "func_camerashake" +} +// entity 17 +{ +"classname" "item_ammo_sp_pistol" +"origin" "376 -579 -480" +} +// entity 18 +{ +"classname" "item_ammo_sp_shotgun" +"origin" "447 -295 -172" +} +// entity 19 +{ +"classname" "item_ammo_sp_pistol" +"angle" "180" +"origin" "626 -147 -184" +} +// entity 20 +{ +"classname" "item_ammo_sp_pistol" +"angle" "270" +"origin" "1344 1277 -216" +} +// entity 21 +{ +"classname" "item_ammo_sp_shotgun" +"angle" "270" +"origin" "1343 1257 -216" +} +// entity 22 +{ +"classname" "item_ammo_sp_shotgun" +"origin" "688 1361 -136" +} +// entity 23 +{ +"classname" "func_group" +// brush 0 +{ +( -174 -934 -368 ) ( -206 -934 -368 ) ( -206 -950 -368 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -206 -950 -352 ) ( -206 -934 -352 ) ( -174 -934 -352 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -206 -952 -336 ) ( -174 -952 -336 ) ( -174 -952 -376 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -188 -954 -336 ) ( -188 -938 -336 ) ( -188 -938 -376 ) subway/med_sides 0 0 0 1 1 0 0 0 +( -174 -946 -336 ) ( -206 -946 -336 ) ( -206 -946 -376 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -190 -934 -336 ) ( -190 -950 -336 ) ( -190 -950 -376 ) subway/med_sides 0 0 0 1 1 0 0 0 +} +// brush 1 +{ +( -174 -934 -352 ) ( -206 -934 -352 ) ( -206 -950 -352 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -188 -950 -350 ) ( -188 -934 -350 ) ( -156 -934 -350 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -188 -952 -334 ) ( -156 -952 -334 ) ( -156 -952 -374 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -170 -954 -334 ) ( -170 -938 -334 ) ( -170 -938 -374 ) subway/med_sides 0 0 0 1 1 0 0 0 +( -156 -946 -334 ) ( -188 -946 -334 ) ( -188 -946 -374 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -190 -934 -334 ) ( -190 -950 -334 ) ( -190 -950 -374 ) subway/med_sides 0 0 0 1 1 0 0 0 +} +// brush 2 +{ +( -174 -934 -370 ) ( -206 -934 -370 ) ( -206 -950 -370 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -188 -950 -368 ) ( -188 -934 -368 ) ( -156 -934 -368 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -188 -952 -352 ) ( -156 -952 -352 ) ( -156 -952 -392 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -170 -954 -352 ) ( -170 -938 -352 ) ( -170 -938 -392 ) subway/med_sides 0 0 0 1 1 0 0 0 +( -156 -946 -352 ) ( -188 -946 -352 ) ( -188 -946 -392 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -190 -934 -352 ) ( -190 -950 -352 ) ( -190 -950 -392 ) subway/med_sides 0 0 0 1 1 0 0 0 +} +// brush 3 +{ +( -156 -934 -368 ) ( -188 -934 -368 ) ( -188 -950 -368 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -188 -950 -352 ) ( -188 -934 -352 ) ( -156 -934 -352 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -188 -952 -336 ) ( -156 -952 -336 ) ( -156 -952 -376 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -170 -954 -336 ) ( -170 -938 -336 ) ( -170 -938 -376 ) subway/med_sides 0 0 0 1 1 0 0 0 +( -156 -946 -336 ) ( -188 -946 -336 ) ( -188 -946 -376 ) subway/med_sides 4 0 0 1 1 0 0 0 +( -172 -934 -336 ) ( -172 -950 -336 ) ( -172 -950 -376 ) subway/med_sides 0 0 0 1 1 0 0 0 +} +} +// entity 24 +{ +"origin" "376 -605 -476" +"classname" "item_equip_light_goggles" +} +// entity 25 +{ +"lip" "4" +"angle" "180" +"classname" "func_button" +"spawnflags" "2" +"wait" "-1" +"targetname" "health1_button" +// brush 0 +{ +( 406 -188 -176 ) ( 422 -188 -176 ) ( 422 -156 -176 ) subway/1_black -4 -9 -90 1 1 0 16777216 0 +( 422 -156 -160 ) ( 422 -188 -160 ) ( 406 -188 -160 ) subway/1_black -4 -9 -90 1 1 0 16777216 0 +( 410 -156 -184 ) ( 410 -156 -144 ) ( 410 -188 -144 ) subway/1_black -4 0 -180 1 -1 0 16777216 0 +( 422 -156 -184 ) ( 422 -156 -144 ) ( 406 -156 -144 ) subway/1_black 10 0 0 1 1 0 16777216 0 +( 412 -188 -184 ) ( 412 -188 -144 ) ( 412 -156 -144 ) subway/med_inside -8 0 0 0.500000 0.500000 0 0 0 +( 406 -172 -184 ) ( 406 -172 -144 ) ( 422 -172 -144 ) subway/1_black 10 0 0 1 1 0 16777216 0 +} +} +// entity 26 +{ +"lip" "4" +"delay" "2.5" +"angle" "270" +"classname" "func_button" +"targetname" "health2_but" +"spawnflags" "2" +"wait" "-1" +// brush 0 +{ +( -172 -938 -368 ) ( -204 -938 -368 ) ( -204 -954 -368 ) subway/1_black 4 6 0 1 1 0 16777216 0 +( -204 -954 -352 ) ( -204 -938 -352 ) ( -172 -938 -352 ) subway/1_black 4 6 0 1 1 0 16777216 0 +( -204 -950 -336 ) ( -172 -950 -336 ) ( -172 -950 -376 ) subway/1_black 4 0 0 1 1 0 16777216 0 +( -172 -954 -336 ) ( -172 -938 -336 ) ( -172 -938 -376 ) subway/1_black -6 0 0 1 1 0 16777216 0 +( -172 -948 -336 ) ( -204 -948 -336 ) ( -204 -948 -376 ) subway/med_inside -24 0 0 -0.500000 0.500000 0 0 0 +( -188 -938 -336 ) ( -188 -954 -336 ) ( -188 -954 -376 ) subway/1_black -6 0 0 1 1 0 16777216 0 +} +} +// entity 27 +{ +"speed" "700" +"targetname" "new_kick_stall_push" +"angle" "360" +"spawnflags" "3" +"classname" "trigger_push" +// brush 0 +{ +( 1560 1064 -208 ) ( 1528 1064 -208 ) ( 1528 1024 -208 ) subway/trigger -24 0 0 1 1 0 144 0 +( 1528 1024 -128 ) ( 1528 1064 -128 ) ( 1560 1064 -128 ) subway/trigger -24 0 0 1 1 0 144 0 +( 1528 1016 -128 ) ( 1560 1016 -128 ) ( 1560 1016 -208 ) subway/trigger -24 0 0 1 1 0 144 0 +( 1568 1024 -128 ) ( 1568 1064 -128 ) ( 1568 1064 -208 ) subway/trigger -24 0 0 1 1 0 144 0 +( 1560 1072 -128 ) ( 1528 1072 -128 ) ( 1528 1072 -208 ) subway/trigger -24 0 0 1 1 0 144 0 +( 1528 1064 -128 ) ( 1528 1024 -128 ) ( 1528 1024 -208 ) subway/trigger -24 0 0 1 1 0 144 0 +} +} +// entity 28 +{ +"spawnflags" "4" +"targetname" "new_kick_stall" +"classname" "func_wall" +// brush 0 +{ +( 1528 1068 -152 ) ( 1524 1068 -152 ) ( 1524 1064 -152 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1524 1064 -148 ) ( 1524 1068 -148 ) ( 1528 1068 -148 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1524 1064 -144 ) ( 1528 1064 -144 ) ( 1528 1064 -208 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1527 1064 -144 ) ( 1527 1068 -144 ) ( 1527 1068 -208 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1528 1068 -144 ) ( 1524 1068 -144 ) ( 1524 1068 -208 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1525 1068 -144 ) ( 1525 1064 -144 ) ( 1525 1064 -208 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +} +// brush 1 +{ +( 1528 1068 -204 ) ( 1524 1068 -204 ) ( 1524 1064 -204 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1524 1064 -200 ) ( 1524 1068 -200 ) ( 1528 1068 -200 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1524 1064 -196 ) ( 1528 1064 -196 ) ( 1528 1064 -260 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1527 1064 -196 ) ( 1527 1068 -196 ) ( 1527 1068 -260 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1528 1068 -196 ) ( 1524 1068 -196 ) ( 1524 1068 -260 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1525 1068 -196 ) ( 1525 1064 -196 ) ( 1525 1064 -260 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +} +// brush 2 +{ +( 1532 1064 -176 ) ( 1524 1064 -176 ) ( 1524 1064 -192 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1528 1004 -176 ) ( 1528 1068 -176 ) ( 1528 1068 -192 ) subway/1_bath_stalldoor -36 -16 0 0.650000 1 134217728 16908288 0 +( 1524 1024 -176 ) ( 1532 1024 -176 ) ( 1532 1024 -192 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1524 1068 -176 ) ( 1524 1004 -176 ) ( 1524 1004 -192 ) subway/1_bath_stalldoor -36 -16 0 0.650000 1 134217728 16908288 0 +( 1524 1072 -144 ) ( 1532 1072 -144 ) ( 1532 1008 -144 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1532 1008 -208 ) ( 1532 1072 -208 ) ( 1524 1072 -208 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +} +// brush 3 +{ +( 1532 1076 -176 ) ( 1520 1076 -176 ) ( 1520 1064 -176 ) subway/origin 12 -24 0 1 1 16777216 128 0 +( 1520 1064 -168 ) ( 1520 1076 -168 ) ( 1532 1076 -168 ) subway/origin 12 -24 0 1 1 16777216 128 0 +( 1520 1064 -120 ) ( 1532 1064 -120 ) ( 1532 1064 -184 ) subway/origin 12 -24 0 1 1 16777216 128 0 +( 1532 1064 -120 ) ( 1532 1076 -120 ) ( 1532 1076 -184 ) subway/origin 12 -24 0 1 1 16777216 128 0 +( 1532 1076 -120 ) ( 1520 1076 -120 ) ( 1520 1076 -184 ) subway/origin 12 -24 0 1 1 16777216 128 0 +( 1520 1076 -120 ) ( 1520 1064 -120 ) ( 1520 1064 -184 ) subway/origin 12 -24 0 1 1 16777216 128 0 +} +} +// entity 29 +{ +"classname" "script_runner" +"script" "tsr1/sodafall" +"targetname" "t251" +"origin" "-372 1280 -128" +} +// entity 30 +{ +"classname" "trigger_once" +"target" "t251" +// brush 0 +{ +( -312 1360 -168 ) ( -440 1360 -168 ) ( -440 1352 -168 ) subway/trigger 0 0 0 1 1 0 144 0 +( -440 1352 -48 ) ( -440 1360 -48 ) ( -312 1360 -48 ) subway/trigger 0 0 0 1 1 0 144 0 +( -440 1344 -64 ) ( -312 1344 -64 ) ( -312 1344 -152 ) subway/trigger 0 0 0 1 1 0 144 0 +( -304 1352 -64 ) ( -304 1360 -64 ) ( -304 1360 -152 ) subway/trigger 0 0 0 1 1 0 144 0 +( -304 1368 -64 ) ( -432 1368 -64 ) ( -432 1368 -152 ) subway/trigger 0 0 0 1 1 0 144 0 +( -440 1360 -64 ) ( -440 1352 -64 ) ( -440 1352 -152 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 31 +{ +"targetname" "soda_fall" +"classname" "func_wall" +"spawnflags" "4" +// brush 0 +{ +( 4 1304 -172 ) ( -12 1304 -172 ) ( -12 1288 -172 ) subway/origin -12 0 0 1 1 16777216 128 0 +( -12 1284 -164 ) ( -12 1300 -164 ) ( 4 1300 -164 ) subway/origin -12 0 0 1 1 16777216 128 0 +( -12 1292 -160 ) ( 4 1292 -160 ) ( 4 1292 -176 ) subway/origin -12 0 0 1 1 16777216 128 0 +( -4 1280 -160 ) ( -4 1296 -160 ) ( -4 1296 -176 ) subway/origin 0 0 0 1 1 16777216 128 0 +( -4 1300 -160 ) ( -20 1300 -160 ) ( -20 1300 -176 ) subway/origin -12 0 0 1 1 16777216 128 0 +( -12 1304 -160 ) ( -12 1288 -160 ) ( -12 1288 -176 ) subway/origin 0 0 0 1 1 16777216 128 0 +} +// brush 1 +{ +( 26 1296 -138 ) ( -30 1296 -138 ) ( -30 1296 -210 ) subway/1_black 0 0 -180 1 -1 134217792 16777216 0 +( 14 1238 -140 ) ( 14 1310 -140 ) ( 14 1310 -212 ) subway/1_black 0 0 0 1 1 134217792 16777216 0 +( -40 1262 -112 ) ( 16 1262 -112 ) ( 16 1262 -184 ) subway/1_black 0 0 -180 1 -1 134217792 16777216 0 +( -32 1306 -138 ) ( -32 1234 -138 ) ( -32 1234 -210 ) subway/1_black 0 0 0 1 1 134217792 16777216 0 +( -30 1310 -152 ) ( 26 1310 -152 ) ( 26 1238 -152 ) subway/1_black 0 0 90 1 1 134217792 16777216 0 +( 24 1238 -168 ) ( 24 1310 -168 ) ( -32 1310 -168 ) subway/1_black 0 0 90 1 1 134217792 16777216 0 +} +// brush 2 +{ +( 26 1296 -122 ) ( -30 1296 -122 ) ( -30 1296 -194 ) subway/1_black 0 0 -180 1 -1 134217792 16777216 0 +( 14 1238 -124 ) ( 14 1310 -124 ) ( 14 1310 -196 ) subway/1_soda_side_b -7 31 -180 0.699951 0.699998 134217792 16908288 0 +( -40 1262 -96 ) ( 16 1262 -96 ) ( 16 1262 -168 ) subway/1_soda_front_b 25 -20 -180 -0.699951 -0.699997 134217792 654442497 800 +( -32 1306 -122 ) ( -32 1234 -122 ) ( -32 1234 -194 ) subway/1_soda_side_b -23 31 -180 -0.699951 0.699998 134217792 16908288 0 +( -30 1310 -132 ) ( 26 1310 -132 ) ( 26 1238 -132 ) subway/1_soda_front_b -13 9 90 0.700073 0.700073 134217792 0 0 +( 24 1238 -152 ) ( 24 1310 -152 ) ( -32 1310 -152 ) subway/1_soda_front_b -13 9 90 0.700073 0.700073 134217792 0 0 +} +// brush 3 +{ +( 24 1238 -132 ) ( 24 1310 -132 ) ( -32 1310 -132 ) subway/1_soda_front_a 27 -1 90 0.700073 0.700073 134217792 0 0 +( -32 1310 -88 ) ( 24 1310 -88 ) ( 24 1238 -88 ) subway/1_soda_top 10 -15 90 0.500000 1 134217792 0 0 +( -32 1310 -88 ) ( -32 1238 -88 ) ( -32 1238 -160 ) subway/1_soda_side_a -9 9 0 -0.699951 0.699997 134217792 131072 0 +( -40 1262 -64 ) ( 16 1262 -64 ) ( 16 1262 -136 ) subway/1_soda_front_a -39 11 -180 -0.699951 -0.700012 134217792 654442497 800 +( 14 1238 -88 ) ( 14 1310 -88 ) ( 14 1310 -160 ) subway/1_soda_side_a 39 9 0 0.699951 0.699997 134217792 131072 0 +( 24 1296 -88 ) ( -32 1296 -88 ) ( -32 1296 -160 ) subway/1_black 0 0 -180 1 -1 134217792 16777216 0 +} +} +// entity 32 +{ +"health" "30" +"classname" "trigger_heal" +"target" "health_1" +// brush 0 +{ +( -196 -936 -400 ) ( -196 -952 -400 ) ( -156 -952 -400 ) subway/trigger -4 0 0 1 1 0 144 0 +( -156 -952 -376 ) ( -196 -952 -376 ) ( -196 -936 -376 ) subway/trigger -4 0 0 1 1 0 144 0 +( -156 -928 -360 ) ( -156 -928 -344 ) ( -196 -928 -344 ) subway/trigger -4 8 0 1 1 0 144 0 +( -164 -944 -344 ) ( -164 -944 -328 ) ( -164 -928 -328 ) subway/trigger 24 8 0 1 1 0 144 0 +( -196 -948 -304 ) ( -196 -948 -288 ) ( -156 -948 -288 ) subway/trigger -4 8 0 1 1 0 144 0 +( -196 -936 -336 ) ( -196 -936 -320 ) ( -196 -952 -320 ) subway/trigger 24 8 0 1 1 0 144 0 +} +} +// entity 33 +{ +"health" "30" +"classname" "trigger_heal" +"target" "health_2" +// brush 0 +{ +( 424 -144 -216 ) ( 408 -144 -216 ) ( 408 -184 -216 ) subway/trigger -4 -24 0 1 1 0 144 0 +( 404 -184 -148 ) ( 404 -144 -148 ) ( 420 -144 -148 ) subway/trigger -4 -24 0 1 1 0 144 0 +( 404 -184 -160 ) ( 420 -184 -160 ) ( 420 -184 -176 ) subway/trigger -4 0 0 1 1 0 144 0 +( 428 -184 -160 ) ( 428 -144 -160 ) ( 428 -144 -176 ) subway/trigger 32 0 0 1 1 0 144 0 +( 420 -144 -144 ) ( 404 -144 -144 ) ( 404 -144 -160 ) subway/trigger -4 0 0 1 1 0 144 0 +( 408 -112 -144 ) ( 408 -152 -144 ) ( 408 -152 -160 ) subway/trigger 32 0 0 1 1 0 144 0 +} +} +// entity 34 +{ +"classname" "path_corner" +"targetname" "t248" +"target" "t91" +"origin" "1240 -104 -208" +} +// entity 35 +{ +"classname" "path_corner" +"targetname" "t91" +"target" "t248" +"origin" "896 -104 -208" +} +// entity 36 +{ +"origin" "-16 -728 -240" +"targetname" "t247" +"classname" "point_combat" +} +// entity 37 +{ +"targetname" "raflean2" +"origin" "-16 -944 -216" +"spawnflags" "6" +"angle" "90" +"target" "t247" +"classname" "m_nyc_mpunk" +} +// entity 38 +{ +"origin" "424 -784 -152" +"script" "tsr1/raflean1" +"targetname" "t245" +"classname" "script_runner" +} +// entity 39 +{ +"target" "t245" +"classname" "trigger_once" +// brush 0 +{ +( 352 -696 -216 ) ( 344 -696 -216 ) ( 344 -736 -216 ) iraq/trigger 0 0 0 1 1 0 144 0 +( 344 -736 -104 ) ( 344 -696 -104 ) ( 352 -696 -104 ) iraq/trigger 0 0 0 1 1 0 144 0 +( 344 -872 -136 ) ( 352 -872 -136 ) ( 352 -872 -184 ) iraq/trigger 0 0 0 1 1 0 144 0 +( 352 -816 -136 ) ( 352 -776 -136 ) ( 352 -776 -184 ) iraq/trigger 0 0 0 1 1 0 144 0 +( 352 -696 -136 ) ( 344 -696 -136 ) ( 344 -696 -184 ) iraq/trigger 0 0 0 1 1 0 144 0 +( 344 -696 -136 ) ( 344 -736 -136 ) ( 344 -736 -184 ) iraq/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 40 +{ +"target" "t159" +"classname" "trigger_once" +// brush 0 +{ +( 1064 232 -216 ) ( 1032 232 -216 ) ( 1032 192 -216 ) subway/trigger -16 -16 0 1 1 0 144 0 +( 1032 200 -120 ) ( 1032 240 -120 ) ( 1064 240 -120 ) subway/trigger -16 -16 0 1 1 0 144 0 +( 1032 64 -144 ) ( 1064 64 -144 ) ( 1064 64 -184 ) subway/trigger -16 -16 0 1 1 0 144 0 +( 1040 208 -144 ) ( 1040 248 -144 ) ( 1040 248 -184 ) subway/trigger -16 -16 0 1 1 0 144 0 +( 1064 232 -144 ) ( 1032 232 -144 ) ( 1032 232 -184 ) subway/trigger -16 -16 0 1 1 0 144 0 +( 1032 232 -208 ) ( 1032 192 -208 ) ( 1032 192 -248 ) subway/trigger -16 -16 0 1 1 0 144 0 +} +} +// entity 41 +{ +"classname" "info_notnull" +"targetname" "host_count" +"health" "0" +"origin" "-580 1700 -60" +} +// entity 42 +{ +"origin" "-368 -920 -352" +"targetname" "t244" +"script" "tsr1/lowpunks" +"classname" "script_runner" +} +// entity 43 +{ +"target" "t244" +"classname" "trigger_once" +// brush 0 +{ +( -296 -1008 -400 ) ( -440 -1008 -400 ) ( -440 -1016 -400 ) iraq/trigger 0 -32 0 1 1 0 144 0 +( -432 -1016 -304 ) ( -432 -1008 -304 ) ( -288 -1008 -304 ) iraq/trigger 0 -32 0 1 1 0 144 0 +( -432 -1016 -336 ) ( -288 -1016 -336 ) ( -288 -1016 -352 ) iraq/trigger 0 0 0 1 1 0 144 0 +( -288 -1016 -336 ) ( -288 -1008 -336 ) ( -288 -1008 -352 ) iraq/trigger 32 0 0 1 1 0 144 0 +( -312 -1008 -336 ) ( -456 -1008 -336 ) ( -456 -1008 -352 ) iraq/trigger 0 0 0 1 1 0 144 0 +( -456 -1008 -336 ) ( -456 -1016 -336 ) ( -456 -1016 -352 ) iraq/trigger 32 0 0 1 1 0 144 0 +} +} +// entity 44 +{ +"origin" "-32 -912 -384" +"angle" "180" +"targetname" "t242" +"classname" "point_combat" +} +// entity 45 +{ +"distance" "135" +"speed" "200" +"spawnflags" "96" +"classname" "func_door_rotating" +"targetname" "health2_door" +// brush 0 +{ +( -179 -946 -353 ) ( -180 -946 -353 ) ( -180 -947 -353 ) subway/origin -21 -40 0 1 1 16777216 128 0 +( -180 -947 -352 ) ( -180 -946 -352 ) ( -179 -946 -352 ) subway/origin -21 -40 0 1 1 16777216 128 0 +( -180 -947 -337 ) ( -179 -947 -337 ) ( -179 -947 -353 ) subway/origin -21 7 0 1 1 16777216 128 0 +( -179 -947 -352 ) ( -179 -946 -352 ) ( -179 -946 -368 ) subway/origin 40 7 0 1 1 16777216 128 0 +( -179 -946 -337 ) ( -180 -946 -337 ) ( -180 -946 -353 ) subway/origin -21 7 0 1 1 16777216 128 0 +( -180 -946 -337 ) ( -180 -947 -337 ) ( -180 -947 -353 ) subway/origin 40 7 0 1 1 16777216 128 0 +} +// brush 1 +{ +( -172 -937 -368 ) ( -204 -937 -368 ) ( -204 -953 -368 ) subway/med_sides -12 4 0 1 1 64 0 0 +( -204 -953 -352 ) ( -204 -937 -352 ) ( -172 -937 -352 ) subway/med_sides -12 4 0 1 1 64 0 0 +( -205 -947 -336 ) ( -173 -947 -336 ) ( -173 -947 -376 ) subway/med_sides -12 0 0 1 1 64 0 0 +( -172 -953 -336 ) ( -172 -937 -336 ) ( -172 -937 -376 ) subway/med_sides -4 0 0 1 1 64 0 0 +( -164 -946 -336 ) ( -196 -946 -336 ) ( -196 -946 -376 ) subway/med_door 0 -1 0 -0.500000 0.500000 64 0 0 +( -188 -937 -336 ) ( -188 -953 -336 ) ( -188 -953 -376 ) subway/med_sides -4 0 0 1 1 64 0 0 +} +} +// entity 46 +{ +"origin" "904 744 -168" +"script" "tsr1/pisscop" +"targetname" "t241" +"classname" "script_runner" +} +// entity 47 +{ +"origin" "256 32 -168" +"targetname" "t198" +"script" "tsr1/rafguy" +"classname" "script_runner" +} +// entity 48 +{ +"target" "t198" +"spawnflags" "3" +"classname" "trigger_once" +"killtarget" "locked" +// brush 0 +{ +( 280 72 -216 ) ( 184 72 -216 ) ( 184 56 -216 ) iraq/trigger 0 0 0 1 1 0 144 0 +( 184 56 -120 ) ( 184 72 -120 ) ( 280 72 -120 ) iraq/trigger 0 0 0 1 1 0 144 0 +( 184 48 -120 ) ( 280 48 -120 ) ( 280 48 -216 ) iraq/trigger 0 0 0 1 1 0 144 0 +( 280 56 -120 ) ( 280 72 -120 ) ( 280 72 -216 ) iraq/trigger 0 0 0 1 1 0 144 0 +( 280 64 -120 ) ( 184 64 -120 ) ( 184 64 -216 ) iraq/trigger 0 0 0 1 1 0 144 0 +( 184 72 -120 ) ( 184 56 -120 ) ( 184 56 -216 ) iraq/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 49 +{ +"soundName" "ButtonElevator1" +"angle" "-2" +"targetname" "new_tok_lever" +"spawnflags" "32" +"classname" "func_door" +// brush 0 +{ +( 516 -100 -166 ) ( 500 -100 -166 ) ( 500 -104 -166 ) subway/1_black 0 2 0 1 1 0 16777216 0 +( 500 -104 -164 ) ( 500 -100 -164 ) ( 516 -100 -164 ) subway/1_black 0 2 0 1 1 0 16777216 0 +( 496 -102 -164 ) ( 512 -102 -164 ) ( 512 -102 -196 ) subway/1_black 0 -2 0 1 1 0 16777216 0 +( 516 -104 -164 ) ( 516 -100 -164 ) ( 516 -100 -196 ) subway/1_black -2 -2 0 1 1 0 16777216 0 +( 516 -100 -164 ) ( 500 -100 -164 ) ( 500 -100 -196 ) subway/1_black 0 -2 0 1 1 0 16777216 0 +( 500 -100 -164 ) ( 500 -104 -164 ) ( 500 -104 -196 ) subway/1_black -2 -2 0 1 1 0 16777216 0 +} +// brush 1 +{ +( 510 -100 -166 ) ( 494 -100 -166 ) ( 494 -104 -166 ) subway/metal_clean -2 0 0 1 1 0 16777216 0 +( 494 -104 -164 ) ( 494 -100 -164 ) ( 510 -100 -164 ) subway/metal_clean -2 0 0 1 1 0 16777216 0 +( 490 -100 -164 ) ( 506 -100 -164 ) ( 506 -100 -196 ) subway/metal_clean -2 -2 0 1 1 0 16777216 0 +( 506 -102 -164 ) ( 506 -98 -164 ) ( 506 -98 -196 ) subway/metal_clean 0 -2 0 1 1 0 16777216 0 +( 510 -97 -164 ) ( 494 -97 -164 ) ( 494 -97 -196 ) subway/metal_clean -2 -2 0 1 1 0 16777216 0 +( 504 -100 -164 ) ( 504 -104 -164 ) ( 504 -104 -196 ) subway/metal_clean 0 -2 0 1 1 0 16777216 0 +} +// brush 2 +{ +( 516 -100 -166 ) ( 500 -100 -166 ) ( 500 -104 -166 ) subway/metal_clean 2 0 0 1 1 0 16777216 0 +( 500 -104 -164 ) ( 500 -100 -164 ) ( 516 -100 -164 ) subway/metal_clean 2 0 0 1 1 0 16777216 0 +( 496 -100 -164 ) ( 512 -100 -164 ) ( 512 -100 -196 ) subway/metal_clean 2 -2 0 1 1 0 16777216 0 +( 512 -104 -164 ) ( 512 -100 -164 ) ( 512 -100 -196 ) subway/metal_clean 0 -2 0 1 1 0 16777216 0 +( 516 -97 -164 ) ( 500 -97 -164 ) ( 500 -97 -196 ) subway/metal_clean 2 -2 0 1 1 0 16777216 0 +( 510 -97 -164 ) ( 510 -101 -164 ) ( 510 -101 -196 ) subway/metal_clean 0 -2 0 1 1 0 16777216 0 +} +} +// entity 50 +{ +"angle" "225" +"waitaction6" "STD_IPISS_N_A_A" +"waitaction5" "STD_IPISS_N_A_A" +"wait" "-1" +"origin" "912 992 -208" +"targetname" "t240" +"waitaction4" "std_Ipiss_n_a_a" +"waitaction3" "std_Ipiss_n_a_a" +"waitaction2" "std_Ipiss_n_a_a" +"waitaction1" "std_Ipiss_n_a_a" +"classname" "path_corner" +"spawnflags" "0" +} +// entity 51 +{ +"origin" "144 1504 -160" +"script" "tsr1/npc1set" +"targetname" "t239" +"classname" "script_runner" +} +// entity 52 +{ +"target" "t239" +"classname" "trigger_once" +// brush 0 +{ +( 160 1456 -168 ) ( 152 1456 -168 ) ( 152 1384 -168 ) subway/trigger 40 0 0 1 1 0 144 0 +( 152 1384 -48 ) ( 152 1456 -48 ) ( 160 1456 -48 ) subway/trigger 40 0 0 1 1 0 144 0 +( 152 1384 -80 ) ( 160 1384 -80 ) ( 160 1384 -112 ) subway/trigger 40 0 0 1 1 0 144 0 +( 160 1384 -80 ) ( 160 1456 -80 ) ( 160 1456 -112 ) subway/trigger 8 0 0 1 1 0 144 0 +( 160 1544 -80 ) ( 152 1544 -80 ) ( 152 1544 -112 ) subway/trigger 40 0 0 1 1 0 144 0 +( 152 1456 -80 ) ( 152 1384 -80 ) ( 152 1384 -112 ) subway/trigger 8 0 0 1 1 0 144 0 +} +} +// entity 53 +{ +"spawnflags" "2" +"origin" "280 1144 -160" +"targetname" "t168" +"wait" "-1" +"waitaction1" "STD_XFEARWAVE_N_N_N" +"angle" "315" +"classname" "path_corner" +} +// entity 54 +{ +"wait" "-1" +"origin" "40 1312 -152" +"angle" "180" +"spawnflags" "3" +"waitaction1" "CCH_A_FWD_P_2" +"targetname" "t238" +"classname" "point_combat" +} +// entity 55 +{ +"classname" "func_group" +// brush 0 +{ +( -98 1070 -168 ) ( -98 1142 -168 ) ( -154 1142 -168 ) subway/1_soda_front_b 6 -14 0 0.700073 0.699951 134217728 0 0 +( -142 1068 -182 ) ( -142 1140 -182 ) ( -142 1140 -110 ) subway/1_soda_side_b -7 -12 -90 -0.700000 0.700000 134217728 16777216 0 +( -144 1096 -134 ) ( -144 1168 -134 ) ( -88 1168 -134 ) subway/1_soda_front_b 58 -14 0 0.700000 0.700000 134217728 654311424 800 +( -96 1070 -106 ) ( -96 1142 -106 ) ( -96 1142 -178 ) subway/1_soda_side_b 7 -13 -90 0.700000 0.700000 134217728 16777216 0 +( -154 1132 -110 ) ( -154 1132 -182 ) ( -98 1132 -182 ) subway/1_soda_front_b 24 -5 90 0.700073 -0.699951 134217728 0 0 +( -96 1112 -182 ) ( -152 1112 -182 ) ( -152 1112 -110 ) subway/1_soda_front_b 24 -5 90 0.700073 -0.699951 134217728 0 0 +} +// brush 1 +{ +( -96 1132 -182 ) ( -152 1132 -182 ) ( -152 1132 -110 ) subway/1_soda_front_a 0 -17 90 0.699951 -0.699951 134217728 0 0 +( -152 1176 -110 ) ( -152 1176 -182 ) ( -96 1176 -182 ) subway/1_soda_top 10 -25 90 0.500000 -1 134217728 0 0 +( -96 1104 -110 ) ( -96 1176 -110 ) ( -96 1176 -182 ) subway/1_soda_side_a 7 -46 -90 0.700000 0.700000 134217728 0 0 +( -144 1128 -134 ) ( -144 1200 -134 ) ( -88 1200 -134 ) subway/1_soda_front_a 58 -47 0 0.700000 0.700000 134217728 654311424 800 +( -142 1104 -182 ) ( -142 1176 -182 ) ( -142 1176 -110 ) subway/1_soda_side_a -7 -46 -90 -0.700000 0.700000 134217728 0 0 +( -96 1104 -168 ) ( -96 1176 -168 ) ( -152 1176 -168 ) subway/1_soda_front_a 46 1 0 0.699951 0.699951 134217728 0 0 +} +// brush 2 +{ +( -98 1054 -168 ) ( -98 1126 -168 ) ( -154 1126 -168 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -142 1052 -182 ) ( -142 1124 -182 ) ( -142 1124 -110 ) subway/1_black -7 1 90 1 -1 134217728 16777216 0 +( -144 1080 -134 ) ( -144 1152 -134 ) ( -88 1152 -134 ) subway/1_black -7 -15 90 1 -1 134217728 16777216 0 +( -96 1054 -106 ) ( -96 1126 -106 ) ( -96 1126 -178 ) subway/1_black -7 1 90 1 -1 134217728 16777216 0 +( -154 1112 -110 ) ( -154 1112 -182 ) ( -98 1112 -182 ) subway/1_black 6 -1 90 1 -1 134217728 16777216 0 +( -96 1096 -182 ) ( -152 1096 -182 ) ( -152 1096 -110 ) subway/1_soda_top 10 -25 90 0.500000 -1 134217728 0 0 +} +} +// entity 56 +{ +"classname" "func_wall" +"targetname" "beam2" +"spawnflags" "4" +// brush 0 +{ +( 1488 -1968 -432 ) ( 1464 -1968 -432 ) ( 1464 -1996 -432 ) subway/metalrib1 4 9 0 1 0.960938 0 16777216 0 +( 1464 -1996 -416 ) ( 1464 -1968 -416 ) ( 1488 -1968 -416 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +( 1468 -2048 -424 ) ( 1492 -2048 -424 ) ( 1492 -2048 -432 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +( 1484 -1984 -416 ) ( 1484 -1984 -432 ) ( 1484 -2048 -432 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +( 1484 -1984 -432 ) ( 1484 -1984 -416 ) ( 1468 -1968 -416 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +( 1468 -1968 -424 ) ( 1468 -1996 -424 ) ( 1468 -1996 -432 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +} +// brush 1 +{ +( 1480 -2044 -436 ) ( 1472 -2044 -436 ) ( 1472 -2052 -436 ) subway/origin 16 0 0 1 1 16777216 128 0 +( 1472 -2052 -428 ) ( 1472 -2044 -428 ) ( 1480 -2044 -428 ) subway/origin 16 0 0 1 1 16777216 128 0 +( 1472 -2052 -420 ) ( 1480 -2052 -420 ) ( 1480 -2052 -436 ) subway/origin 16 0 0 1 1 16777216 128 0 +( 1480 -2052 -420 ) ( 1480 -2044 -420 ) ( 1480 -2044 -436 ) subway/origin 16 0 0 1 1 16777216 128 0 +( 1480 -2044 -420 ) ( 1472 -2044 -420 ) ( 1472 -2044 -436 ) subway/origin 16 0 0 1 1 16777216 128 0 +( 1472 -2044 -420 ) ( 1472 -2052 -420 ) ( 1472 -2052 -436 ) subway/origin 16 0 0 1 1 16777216 128 0 +} +} +// entity 57 +{ +"classname" "func_wall" +"targetname" "beam1b" +"spawnflags" "4" +// brush 0 +{ +( 1540 -1916 -436 ) ( 1532 -1916 -436 ) ( 1532 -1924 -436 ) subway/origin 0 0 0 1 1 16777216 128 0 +( 1532 -1924 -428 ) ( 1532 -1916 -428 ) ( 1540 -1916 -428 ) subway/origin 0 0 0 1 1 16777216 128 0 +( 1532 -1924 -420 ) ( 1540 -1924 -420 ) ( 1540 -1924 -436 ) subway/origin 0 0 0 1 1 16777216 128 0 +( 1540 -1924 -420 ) ( 1540 -1916 -420 ) ( 1540 -1916 -436 ) subway/origin 0 0 0 1 1 16777216 128 0 +( 1540 -1916 -420 ) ( 1532 -1916 -420 ) ( 1532 -1916 -436 ) subway/origin 0 0 0 1 1 16777216 128 0 +( 1532 -1916 -420 ) ( 1532 -1924 -420 ) ( 1532 -1924 -436 ) subway/origin 0 0 0 1 1 16777216 128 0 +} +// brush 1 +{ +( 1544 -1920 -432 ) ( 1528 -1920 -432 ) ( 1528 -1952 -432 ) subway/metalrib1 8 9 0 1 0.960938 0 16777216 0 +( 1528 -1952 -416 ) ( 1528 -1920 -416 ) ( 1544 -1920 -416 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +( 1544 -1936 -416 ) ( 1544 -1936 -432 ) ( 1528 -1952 -432 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +( 1544 -1936 -432 ) ( 1544 -1936 -416 ) ( 1544 -1920 -416 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +( 1544 -1920 -424 ) ( 1528 -1920 -424 ) ( 1528 -1920 -432 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +( 1528 -1920 -424 ) ( 1528 -1952 -424 ) ( 1528 -1952 -432 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +} +} +// entity 58 +{ +"classname" "func_wall" +"targetname" "beam3b" +"spawnflags" "4" +// brush 0 +{ +( 1424 -1960 -432 ) ( 1408 -1960 -432 ) ( 1408 -2000 -432 ) subway/metalrib1 0 9 0 1 0.960938 0 16777216 0 +( 1408 -2000 -416 ) ( 1408 -1960 -416 ) ( 1424 -1960 -416 ) subway/metalrib1 0 9 0 1 0.960938 0 16777216 0 +( 1408 -2000 -432 ) ( 1408 -2000 -416 ) ( 1424 -1984 -416 ) subway/metal2 0 48 0 1 1 0 16777216 0 +( 1424 -2000 -416 ) ( 1424 -1960 -416 ) ( 1424 -1960 -432 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +( 1424 -1920 -416 ) ( 1408 -1920 -416 ) ( 1408 -1920 -432 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +( 1408 -2000 -416 ) ( 1408 -2000 -432 ) ( 1408 -1960 -432 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +} +// brush 1 +{ +( 1420 -1916 -436 ) ( 1412 -1916 -436 ) ( 1412 -1924 -436 ) subway/origin 16 -8 0 1 1 16777216 128 0 +( 1412 -1924 -428 ) ( 1412 -1916 -428 ) ( 1420 -1916 -428 ) subway/origin 16 -8 0 1 1 16777216 128 0 +( 1412 -1924 -420 ) ( 1420 -1924 -420 ) ( 1420 -1924 -436 ) subway/origin 16 -8 0 1 1 16777216 128 0 +( 1420 -1924 -420 ) ( 1420 -1916 -420 ) ( 1420 -1916 -436 ) subway/origin 16 -8 0 1 1 16777216 128 0 +( 1420 -1916 -420 ) ( 1412 -1916 -420 ) ( 1412 -1916 -436 ) subway/origin 16 -8 0 1 1 16777216 128 0 +( 1412 -1916 -420 ) ( 1412 -1924 -420 ) ( 1412 -1924 -436 ) subway/origin 16 -8 0 1 1 16777216 128 0 +} +} +// entity 59 +{ +"targetname" "t237" +"origin" "1760 -1664 -456" +"script" "tsr1/endcavein" +"classname" "script_runner" +} +// entity 60 +{ +"target" "t237" +"classname" "trigger_once" +// brush 0 +{ +( 1736 -1488 -552 ) ( 1688 -1488 -552 ) ( 1688 -1496 -552 ) subway/trigger -16 8 0 1 1 0 144 0 +( 1688 -1496 -312 ) ( 1688 -1488 -312 ) ( 1736 -1488 -312 ) subway/trigger -16 8 0 1 1 0 144 0 +( 1864 -1496 -312 ) ( 1912 -1496 -312 ) ( 1912 -1496 -552 ) subway/trigger -16 0 0 1 1 0 144 0 +( 2000 -1496 -312 ) ( 2000 -1488 -312 ) ( 2000 -1488 -552 ) subway/trigger -24 0 0 1 1 0 144 0 +( 1736 -1488 -312 ) ( 1688 -1488 -312 ) ( 1688 -1488 -552 ) subway/trigger -16 0 0 1 1 0 144 0 +( 1672 -1488 -312 ) ( 1672 -1496 -312 ) ( 1672 -1496 -552 ) subway/trigger -24 0 0 1 1 0 144 0 +} +} +// entity 61 +{ +"targetname" "breakceiling" +"surfaceType" "17" +"material" "4" +"mass" "3" +"count" "20" +"spawnflags" "1" +"classname" "func_breakable_brush" +// brush 0 +{ +( 1480 -1920 -400 ) ( 1480 -1888 -400 ) ( 1512 -1888 -400 ) subway/1_tunnelwall -8 0 0 0.500000 0.500000 0 301989888 0 +( 1480 -1944 -416 ) ( 1480 -2016 -416 ) ( 1488 -1980 -416 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +( 1360 -1984 -416 ) ( 1360 -1984 -400 ) ( 1408 -2048 -400 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( 1360 -1984 -400 ) ( 1360 -1984 -416 ) ( 1440 -1984 -416 ) subway/con14 16 0 0 1 1 0 285212672 0 +( 1440 -1984 -416 ) ( 1408 -2048 -416 ) ( 1424 -2016 -400 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1 +{ +( 1376 -1936 -416 ) ( 1344 -1936 -416 ) ( 1344 -1968 -416 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1344 -1968 -400 ) ( 1344 -1936 -400 ) ( 1376 -1936 -400 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1360 -1984 -400 ) ( 1360 -1984 -416 ) ( 1312 -1936 -416 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -2048 -416 ) ( 1408 -2048 -400 ) ( 1408 -1920 -400 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -1920 -416 ) ( 1408 -1920 -400 ) ( 1312 -1936 -400 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1360 -1984 -416 ) ( 1360 -1984 -400 ) ( 1408 -1984 -400 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 2 +{ +( 1440 -1936 -416 ) ( 1408 -1936 -416 ) ( 1408 -1984 -416 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -1984 -400 ) ( 1408 -1936 -400 ) ( 1440 -1936 -400 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -1984 -400 ) ( 1440 -1984 -400 ) ( 1440 -1984 -416 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -1936 -400 ) ( 1408 -1984 -400 ) ( 1408 -1984 -416 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -1936 -416 ) ( 1440 -1984 -416 ) ( 1424 -1960 -400 ) subway/1_tunneltrack_plain 32 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 3 +{ +( 1360 -1904 -416 ) ( 1328 -1904 -416 ) ( 1328 -1936 -416 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1328 -1936 -400 ) ( 1328 -1904 -400 ) ( 1360 -1904 -400 ) subway/con14 16 0 0 1 1 0 285212672 0 +( 1408 -1920 -400 ) ( 1408 -1920 -416 ) ( 1312 -1936 -416 ) subway/con14 16 0 0 1 1 0 285212672 0 +( 1408 -1920 -416 ) ( 1408 -1920 -400 ) ( 1392 -1856 -400 ) subway/con14 0 0 0 1 1 0 285212672 0 +( 1392 -1856 -416 ) ( 1392 -1856 -400 ) ( 1344 -1872 -400 ) subway/con14 16 0 0 1 1 0 285212672 0 +( 1344 -1872 -416 ) ( 1344 -1872 -400 ) ( 1312 -1936 -400 ) subway/con14 0 0 0 1 1 0 285212672 0 +} +} +// entity 62 +{ +"targetname" "dirtpile" +"classname" "func_wall" +"spawnflags" "3" +// brush 0 +{ +( 1384 -1880 -544 ) ( 1312 -1880 -544 ) ( 1312 -2024 -544 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1360 -1920 -536 ) ( 1360 -1984 -520 ) ( 1280 -1984 -512 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1280 -1984 -512 ) ( 1360 -1984 -520 ) ( 1360 -1984 -544 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1360 -1984 -544 ) ( 1360 -1984 -520 ) ( 1360 -1920 -536 ) subway/3_dirt 0 0 0 1 1 0 117440512 0 +( 1360 -1920 -536 ) ( 1280 -1984 -512 ) ( 1280 -1984 -544 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +} +// brush 1 +{ +( 1384 -1880 -544 ) ( 1312 -1880 -544 ) ( 1312 -2024 -544 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1280 -1984 -512 ) ( 1360 -1984 -520 ) ( 1360 -2048 -536 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1360 -1984 -544 ) ( 1360 -1984 -520 ) ( 1280 -1984 -512 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1360 -2048 -536 ) ( 1360 -1984 -520 ) ( 1360 -1984 -544 ) subway/3_dirt 0 0 0 1 1 0 117440512 0 +( 1280 -1984 -544 ) ( 1280 -1984 -512 ) ( 1360 -2048 -536 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +} +// brush 2 +{ +( 1384 -1880 -544 ) ( 1312 -1880 -544 ) ( 1312 -2024 -544 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1360 -2048 -536 ) ( 1360 -1984 -520 ) ( 1408 -1984 -536 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1408 -1984 -536 ) ( 1360 -1984 -520 ) ( 1360 -1984 -544 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1360 -1984 -544 ) ( 1360 -1984 -520 ) ( 1360 -2048 -536 ) subway/3_dirt 0 0 0 1 1 0 117440512 0 +( 1408 -1984 -544 ) ( 1360 -2048 -544 ) ( 1384 -2016 -528 ) subway/3_dirt 0 0 0 1 1 0 117440512 0 +} +// brush 3 +{ +( 1384 -1880 -544 ) ( 1312 -1880 -544 ) ( 1312 -2024 -544 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1408 -1984 -536 ) ( 1360 -1984 -520 ) ( 1360 -1920 -536 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1360 -1984 -544 ) ( 1360 -1984 -520 ) ( 1408 -1984 -536 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1360 -1920 -536 ) ( 1360 -1984 -520 ) ( 1360 -1984 -544 ) subway/3_dirt 0 0 0 1 1 0 117440512 0 +( 1360 -1920 -552 ) ( 1408 -1984 -552 ) ( 1384 -1952 -536 ) subway/3_dirt 0 0 0 1 1 0 117440512 0 +} +// brush 4 +{ +( 1384 -1880 -544 ) ( 1312 -1880 -544 ) ( 1312 -2024 -544 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1360 -1920 -536 ) ( 1280 -1984 -512 ) ( 1280 -1920 -536 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1368 -1920 -528 ) ( 1296 -1920 -528 ) ( 1296 -1920 -544 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1280 -1920 -536 ) ( 1280 -1984 -512 ) ( 1280 -1984 -544 ) subway/3_dirt 0 0 0 1 1 0 117440512 0 +( 1280 -1984 -544 ) ( 1280 -1984 -512 ) ( 1360 -1920 -536 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +} +// brush 5 +{ +( 1384 -1880 -544 ) ( 1312 -1880 -544 ) ( 1312 -2024 -544 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1360 -2048 -536 ) ( 1280 -2048 -456 ) ( 1280 -1984 -512 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1280 -2048 -544 ) ( 1280 -2048 -456 ) ( 1360 -2048 -536 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +( 1280 -1984 -512 ) ( 1280 -2048 -456 ) ( 1280 -2048 -544 ) subway/3_dirt 0 0 0 1 1 0 117440512 0 +( 1360 -2048 -536 ) ( 1280 -1984 -512 ) ( 1280 -1984 -544 ) subway/3_dirt 80 0 0 1 1 0 117440512 0 +} +} +// entity 63 +{ +"classname" "func_wall" +"targetname" "rubblechunk1" +"spawnflags" "4" +// brush 0 +{ +( 1456 -2040 -424 ) ( 1440 -2040 -424 ) ( 1440 -2056 -424 ) subway/origin 16 0 0 1 1 16777216 128 0 +( 1440 -2056 -408 ) ( 1440 -2040 -408 ) ( 1456 -2040 -408 ) subway/origin 16 0 0 1 1 16777216 128 0 +( 1440 -2056 -408 ) ( 1456 -2056 -408 ) ( 1456 -2056 -424 ) subway/origin 16 -8 0 1 1 16777216 128 0 +( 1456 -2056 -408 ) ( 1456 -2040 -408 ) ( 1456 -2040 -424 ) subway/origin 0 -8 0 1 1 16777216 128 0 +( 1456 -2040 -408 ) ( 1440 -2040 -408 ) ( 1440 -2040 -424 ) subway/origin 16 -8 0 1 1 16777216 128 0 +( 1440 -2040 -408 ) ( 1440 -2056 -408 ) ( 1440 -2056 -424 ) subway/origin 0 -8 0 1 1 16777216 128 0 +} +// brush 1 +{ +( 1480 -1920 -400 ) ( 1480 -1888 -400 ) ( 1512 -1888 -400 ) subway/1_tunnelwall -8 0 0 0.500000 0.500000 0 301989888 0 +( 1488 -2048 -472 ) ( 1520 -2048 -472 ) ( 1520 -2048 -504 ) subway/1_tunnelwall -8 0 0 0.500000 0.500000 0 301989888 0 +( 1488 -1928 -472 ) ( 1488 -1896 -472 ) ( 1488 -1896 -504 ) subway/1_tunnelwall 8 0 0 0.500000 0.500000 0 301989888 0 +( 1480 -1944 -416 ) ( 1480 -2016 -416 ) ( 1488 -1980 -416 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -2048 -416 ) ( 1440 -1984 -416 ) ( 1424 -2016 -400 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1984 -416 ) ( 1488 -2016 -416 ) ( 1464 -2000 -400 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +} +} +// entity 64 +{ +"classname" "func_wall" +"targetname" "rubblechunk2" +"spawnflags" "4" +// brush 0 +{ +( 1488 -1920 -400 ) ( 1440 -1984 -400 ) ( 1408 -1936 -400 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +( 1488 -1920 -416 ) ( 1488 -1920 -400 ) ( 1408 -1920 -400 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1984 -416 ) ( 1488 -1920 -416 ) ( 1408 -1920 -416 ) subway/1_tunneltrack_plain -16 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -1936 -400 ) ( 1408 -1936 -416 ) ( 1408 -1920 -416 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +( 1440 -1983 -400 ) ( 1440 -1983 -416 ) ( 1408 -1935 -416 ) subway/con14 0 0 0 1 1 0 285212672 0 +( 1440 -1984 -416 ) ( 1440 -1984 -400 ) ( 1488 -1920 -400 ) subway/1_tunneltrack_plain 16 0 0 0.500000 0.500000 0 301989888 0 +} +// brush 1 +{ +( 1440 -1928 -424 ) ( 1456 -1928 -424 ) ( 1456 -1912 -424 ) subway/origin 16 0 0 1 1 16777216 128 0 +( 1456 -1928 -408 ) ( 1440 -1928 -408 ) ( 1440 -1912 -408 ) subway/origin 16 0 0 1 1 16777216 128 0 +( 1440 -1928 -408 ) ( 1456 -1928 -408 ) ( 1456 -1928 -424 ) subway/origin 16 -8 0 1 1 16777216 128 0 +( 1456 -1928 -424 ) ( 1456 -1928 -408 ) ( 1456 -1912 -408 ) subway/origin 0 -8 0 1 1 16777216 128 0 +( 1456 -1912 -408 ) ( 1440 -1912 -408 ) ( 1440 -1912 -424 ) subway/origin 16 -8 0 1 1 16777216 128 0 +( 1440 -1928 -408 ) ( 1440 -1928 -424 ) ( 1440 -1912 -424 ) subway/origin 0 -8 0 1 1 16777216 128 0 +} +} +// entity 65 +{ +"targetname" "beam3" +"classname" "func_wall" +"spawnflags" "4" +// brush 0 +{ +( 1424 -1984 -432 ) ( 1408 -1984 -432 ) ( 1408 -2048 -432 ) subway/metalrib1 0 9 0 1 0.960938 0 16777216 0 +( 1408 -2048 -416 ) ( 1408 -1984 -416 ) ( 1424 -1984 -416 ) subway/metalrib1 0 1 0 1 0.960938 0 16777216 0 +( 1408 -2048 -416 ) ( 1424 -2048 -416 ) ( 1424 -2048 -448 ) subway/metalrib1 -8 18 0 1 0.960938 0 16777216 0 +( 1424 -1984 -416 ) ( 1424 -1984 -432 ) ( 1424 -2048 -432 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +( 1424 -1984 -432 ) ( 1424 -1984 -416 ) ( 1408 -2000 -416 ) subway/metal2 0 0 0 1 1 0 16777216 0 +( 1408 -1984 -416 ) ( 1408 -2048 -416 ) ( 1408 -2048 -448 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +} +// brush 1 +{ +( 1420 -2044 -436 ) ( 1416 -2044 -436 ) ( 1416 -2052 -436 ) subway/origin 8 0 0 1 1 16777216 128 0 +( 1416 -2052 -428 ) ( 1416 -2044 -428 ) ( 1420 -2044 -428 ) subway/origin 8 0 0 1 1 16777216 128 0 +( 1416 -2052 -420 ) ( 1420 -2052 -420 ) ( 1420 -2052 -436 ) subway/origin 8 0 0 1 1 16777216 128 0 +( 1420 -2052 -420 ) ( 1420 -2044 -420 ) ( 1420 -2044 -436 ) subway/origin 0 0 0 1 1 16777216 128 0 +( 1420 -2044 -420 ) ( 1416 -2044 -420 ) ( 1416 -2044 -436 ) subway/origin 8 0 0 1 1 16777216 128 0 +( 1412 -2044 -420 ) ( 1412 -2052 -420 ) ( 1412 -2052 -436 ) subway/origin 0 0 0 1 1 16777216 128 0 +} +} +// entity 66 +{ +"targetname" "beam2b" +"classname" "func_wall" +"spawnflags" "4" +// brush 0 +{ +( 1484 -1984 -432 ) ( 1468 -1984 -432 ) ( 1468 -2048 -432 ) subway/metalrib1 4 9 0 1 0.960938 0 16777216 0 +( 1468 -2048 -416 ) ( 1468 -1984 -416 ) ( 1484 -1984 -416 ) subway/metalrib1 4 1 0 1 0.960938 0 16777216 0 +( 1468 -1968 -432 ) ( 1468 -1968 -416 ) ( 1484 -1984 -416 ) subway/metalrib1 -4 18 0 1 0.960938 0 16777216 0 +( 1484 -2048 -424 ) ( 1484 -1984 -424 ) ( 1484 -1984 -456 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +( 1484 -1920 -416 ) ( 1468 -1920 -416 ) ( 1468 -1920 -448 ) subway/metalrib1 -4 18 0 1 0.960938 0 16777216 0 +( 1468 -1968 -416 ) ( 1468 -1968 -432 ) ( 1468 -1920 -432 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +} +// brush 1 +{ +( 1480 -1916 -436 ) ( 1476 -1916 -436 ) ( 1476 -1924 -436 ) subway/origin 12 0 0 1 1 16777216 128 0 +( 1476 -1924 -428 ) ( 1476 -1916 -428 ) ( 1480 -1916 -428 ) subway/origin 12 0 0 1 1 16777216 128 0 +( 1476 -1924 -420 ) ( 1480 -1924 -420 ) ( 1480 -1924 -436 ) subway/origin 12 0 0 1 1 16777216 128 0 +( 1480 -1924 -420 ) ( 1480 -1916 -420 ) ( 1480 -1916 -436 ) subway/origin 0 0 0 1 1 16777216 128 0 +( 1480 -1916 -420 ) ( 1476 -1916 -420 ) ( 1476 -1916 -436 ) subway/origin 12 0 0 1 1 16777216 128 0 +( 1472 -1916 -420 ) ( 1472 -1924 -420 ) ( 1472 -1924 -436 ) subway/origin 0 0 0 1 1 16777216 128 0 +} +} +// entity 67 +{ +"targetname" "beam1" +"classname" "func_wall" +"spawnflags" "4" +// brush 0 +{ +( 1544 -1984 -432 ) ( 1528 -1984 -432 ) ( 1528 -2048 -432 ) subway/metalrib1 8 9 0 1 0.960938 0 16777216 0 +( 1528 -2048 -416 ) ( 1528 -1984 -416 ) ( 1544 -1984 -416 ) subway/metalrib1 8 1 0 1 0.960938 0 16777216 0 +( 1528 -2048 -416 ) ( 1544 -2048 -416 ) ( 1544 -2048 -448 ) subway/metalrib1 0 18 0 1 0.960938 0 16777216 0 +( 1544 -1936 -416 ) ( 1544 -1936 -432 ) ( 1544 -2048 -432 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +( 1544 -1936 -432 ) ( 1544 -1936 -416 ) ( 1528 -1952 -416 ) subway/metalrib1 0 18 0 1 0.960938 0 16777216 0 +( 1528 -1984 -416 ) ( 1528 -2048 -416 ) ( 1528 -2048 -448 ) subway/metalrib1 -15 -13 90 1 0.960000 0 16777216 0 +} +// brush 1 +{ +( 1540 -2044 -436 ) ( 1536 -2044 -436 ) ( 1536 -2052 -436 ) subway/origin 16 0 0 1 1 16777216 128 0 +( 1536 -2052 -428 ) ( 1536 -2044 -428 ) ( 1540 -2044 -428 ) subway/origin 16 0 0 1 1 16777216 128 0 +( 1536 -2052 -420 ) ( 1540 -2052 -420 ) ( 1540 -2052 -436 ) subway/origin 16 0 0 1 1 16777216 128 0 +( 1540 -2052 -420 ) ( 1540 -2044 -420 ) ( 1540 -2044 -436 ) subway/origin 0 0 0 1 1 16777216 128 0 +( 1540 -2044 -420 ) ( 1536 -2044 -420 ) ( 1536 -2044 -436 ) subway/origin 16 0 0 1 1 16777216 128 0 +( 1532 -2044 -420 ) ( 1532 -2052 -420 ) ( 1532 -2052 -436 ) subway/origin 0 0 0 1 1 16777216 128 0 +} +} +// entity 68 +{ +"classname" "func_breakable_brush" +"targetname" "floorbrealk1" +// brush 0 +{ +( 1464 -1880 -544 ) ( 1392 -1880 -544 ) ( 1392 -2024 -544 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1392 -2024 -536 ) ( 1392 -1880 -536 ) ( 1464 -1880 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1488 -1968 -536 ) ( 1488 -1968 -544 ) ( 1488 -2048 -544 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -2048 -536 ) ( 1408 -2048 -544 ) ( 1456 -1952 -544 ) subway/1_tunneltrack_plain -32 0 0 0.500000 0.500000 0 301989888 0 +( 1408 -2048 -544 ) ( 1408 -2048 -536 ) ( 1488 -2048 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +( 1488 -1968 -544 ) ( 1488 -1968 -536 ) ( 1456 -1952 -536 ) subway/1_tunneltrack_plain 0 0 0 0.500000 0.500000 0 301989888 0 +} +} +// entity 69 +{ +"origin" "1744 -2344 -424" +"delay" "1.5" +"target" "endcinematicb" +"targetname" "endcinematic" +"classname" "trigger_relay" +} +// entity 70 +{ +"delay" "1.5" +"color" "0 0 0" +"origin" "1768 -2344 -424" +"targetname" "endcinematic" +"classname" "func_fade" +} +// entity 71 +{ +"classname" "point_combat" +"targetname" "t236" +"origin" "1752 -2104 -520" +} +// entity 72 +{ +"classname" "trigger_counter" +"targetname" "wave1count" +"count" "3" +"target" "t173" +// brush 0 +{ +( 1816 -1872 -384 ) ( 1800 -1872 -384 ) ( 1800 -1888 -384 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1800 -1888 -368 ) ( 1800 -1872 -368 ) ( 1816 -1872 -368 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1800 -1888 -368 ) ( 1816 -1888 -368 ) ( 1816 -1888 -384 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1816 -1888 -368 ) ( 1816 -1872 -368 ) ( 1816 -1872 -384 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1816 -1872 -368 ) ( 1800 -1872 -368 ) ( 1800 -1872 -384 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +( 1800 -1872 -368 ) ( 1800 -1888 -368 ) ( 1800 -1888 -384 ) subway/1_tunnelwall 8 -64 0 1 1 0 301989888 0 +} +} +// entity 73 +{ +"classname" "script_runner" +"targetname" "endwave1b" +"origin" "1912 -1480 -424" +"script" "common/use2" +"parm1" "endwave1b" +} +// entity 74 +{ +"classname" "point_combat" +"origin" "1752 -2248 -520" +"targetname" "t234" +} +// entity 75 +{ +"classname" "point_combat" +"targetname" "t233" +"origin" "1808 -2176 -520" +} +// entity 76 +{ +"targetname" "raidb" +"origin" "2264 2456 -272" +"script" "tsr1/raidb" +"classname" "script_runner" +} +// entity 77 +{ +"classname" "func_breakable_brush" +"health" "10" +"material" "7" +"surfaceType" "37" +"target" "t130" +// brush 0 +{ +( 604 -140 16 ) ( 640 -104 16 ) ( 640 -104 26 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 608 -72 -156 ) ( 608 -72 -180 ) ( 652 -160 -180 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 652 -160 -148 ) ( 652 -160 -172 ) ( 648 -160 -172 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 604 -72 -172 ) ( 604 -72 -148 ) ( 648 -160 -148 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 608 -72 -180 ) ( 608 -72 -156 ) ( 604 -72 -156 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 604 -72 -140 ) ( 608 -72 -140 ) ( 652 -160 -140 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 608 -72 -180 ) ( 604 -72 -180 ) ( 648 -160 -180 ) subway/glass 0 0 0 1 1 0 620759040 0 +} +// brush 1 +{ +( 584 -96 -180 ) ( 672 -140 -180 ) ( 672 -136 -180 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 584 -92 -140 ) ( 672 -136 -140 ) ( 672 -140 -140 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 672 -140 -156 ) ( 672 -136 -156 ) ( 672 -136 -180 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 584 -96 -148 ) ( 672 -140 -148 ) ( 672 -140 -172 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 584 -96 -172 ) ( 584 -92 -172 ) ( 584 -92 -148 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 584 -92 -180 ) ( 672 -136 -180 ) ( 672 -136 -156 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 640 -104 26 ) ( 640 -104 16 ) ( 604 -140 16 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 588 -108 0 ) ( 588 -84 0 ) ( 588 -84 10 ) subway/glass 0 0 0 1 1 0 620759040 0 +} +} +// entity 78 +{ +"classname" "trigger_once" +"targetname" "outtoken" +"target" "scue1b" +"spawnflags" "4" +// brush 0 +{ +( 660 -162 -180 ) ( 658 -162 -180 ) ( 658 -178 -180 ) subway/trigger 12 0 0 1 1 0 144 0 +( 658 -174 -140 ) ( 658 -158 -140 ) ( 660 -158 -140 ) subway/trigger 12 0 0 1 1 0 144 0 +( 658 -256 -144 ) ( 660 -256 -144 ) ( 660 -256 -184 ) subway/trigger 12 0 0 1 1 0 144 0 +( 664 -170 -164 ) ( 664 -154 -164 ) ( 664 -154 -204 ) subway/trigger 24 0 0 1 1 0 144 0 +( 660 -160 -144 ) ( 658 -160 -144 ) ( 658 -160 -184 ) subway/trigger 12 0 0 1 1 0 144 0 +( 657 -232 -144 ) ( 657 -248 -144 ) ( 657 -248 -184 ) subway/trigger 24 0 0 1 1 0 144 0 +} +} +// entity 79 +{ +"classname" "trigger_relay" +"targetname" "scue1b" +"target" "scue1" +"origin" "368 -64 -168" +} +// entity 80 +{ +"speed" "900" +"classname" "trigger_push" +"spawnflags" "3" +"targetname" "playerpush" +"angle" "90" +// brush 0 +{ +( 640 1200 -168 ) ( 560 1200 -168 ) ( 560 1128 -168 ) subway/trigger -4 0 -180 1 -1 0 160 0 +( 560 1128 -48 ) ( 560 1200 -48 ) ( 640 1200 -48 ) subway/trigger -4 0 -180 1 -1 0 160 0 +( 568 1120 -104 ) ( 648 1120 -104 ) ( 648 1120 -168 ) subway/trigger -4 0 -180 1 -1 0 160 0 +( 656 1128 -104 ) ( 656 1200 -104 ) ( 656 1200 -168 ) subway/trigger -4 0 -180 1 -1 0 160 0 +( 632 1208 -104 ) ( 552 1208 -104 ) ( 552 1208 -168 ) subway/trigger -4 0 -180 1 -1 0 160 0 +( 536 1208 -104 ) ( 536 1136 -104 ) ( 536 1136 -168 ) subway/trigger -4 0 -180 1 -1 0 160 0 +} +} +// entity 81 +{ +"classname" "func_wall" +"targetname" "kickedopen" +"spawnflags" "3" +// brush 0 +{ +( 612 1196 -168 ) ( 620 1132 -168 ) ( 628 1132 -168 ) subway/clip 28 -60 90 1 1 196608 144 0 +( 620 1196 -80 ) ( 628 1132 -80 ) ( 620 1132 -80 ) subway/clip 28 -60 90 1 1 196608 144 0 +( 620 1196 -168 ) ( 628 1132 -168 ) ( 628 1132 -80 ) subway/clip 28 0 0 1 1 196608 144 0 +( 620 1132 -136 ) ( 620 1132 -120 ) ( 628 1132 -120 ) subway/clip 60 0 -180 1 -1 196608 144 0 +( 616 1196 -80 ) ( 624 1132 -80 ) ( 624 1132 -168 ) subway/clip 28 0 0 1 1 196608 144 0 +( 620 1196 -136 ) ( 620 1196 -120 ) ( 612 1196 -120 ) subway/clip 60 0 -180 1 -1 196608 144 0 +} +} +// entity 82 +{ +"classname" "func_wall" +"spawnflags" "3" +"targetname" "openin" +// brush 0 +{ +( 628 1176 -168 ) ( 620 1176 -168 ) ( 620 1124 -168 ) subway/clip 0 -4 0 1 1 196608 144 0 +( 620 1124 -84 ) ( 620 1176 -84 ) ( 628 1176 -84 ) subway/clip 0 -4 0 1 1 196608 144 0 +( 624 1132 -32 ) ( 632 1132 -32 ) ( 632 1132 -168 ) subway/clip 0 16 0 1 1 196608 144 0 +( 628 1124 -32 ) ( 628 1176 -32 ) ( 628 1176 -168 ) subway/clip 4 16 0 1 1 196608 144 0 +( 628 1192 -32 ) ( 620 1192 -32 ) ( 620 1192 -168 ) subway/clip 0 16 0 1 1 196608 144 0 +( 624 1176 -32 ) ( 624 1124 -32 ) ( 624 1124 -168 ) subway/clip 4 16 0 1 1 196608 144 0 +} +} +// entity 83 +{ +"classname" "script_runner" +"script" "tsr1/trainhorn" +"targetname" "t43" +"origin" "1152 928 -464" +} +// entity 84 +{ +"classname" "func_group" +// brush 0 +{ +( 1916 -12 -304 ) ( 1804 -12 -304 ) ( 1804 -60 -304 ) subway/1_black 8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1804 -60 -300 ) ( 1804 -12 -300 ) ( 1916 -12 -300 ) subway/1_black 8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1716 -60 -312 ) ( 1828 -60 -312 ) ( 1828 -60 -328 ) subway/1_black 8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1828 -60 -316 ) ( 1828 -12 -316 ) ( 1828 -12 -332 ) subway/1_black -8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1916 -56 -316 ) ( 1804 -56 -316 ) ( 1804 -56 -332 ) subway/1_black 8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1824 -12 -308 ) ( 1824 -60 -308 ) ( 1824 -60 -324 ) subway/1_black -8 8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1 +{ +( 1916 40 -304 ) ( 1804 40 -304 ) ( 1804 -8 -304 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1804 -8 -300 ) ( 1804 40 -300 ) ( 1916 40 -300 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1716 -8 -312 ) ( 1828 -8 -312 ) ( 1828 -8 -328 ) subway/1_black 8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1828 -8 -316 ) ( 1828 40 -316 ) ( 1828 40 -332 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1916 -4 -316 ) ( 1804 -4 -316 ) ( 1804 -4 -332 ) subway/1_black 8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1824 40 -308 ) ( 1824 -8 -308 ) ( 1824 -8 -324 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( 1828 -64 -320 ) ( 1828 0 -320 ) ( 1824 0 -320 ) subway/1_black -7 0 90 0.500000 0.500000 134217728 16777216 0 +( 1824 0 -304 ) ( 1828 0 -304 ) ( 1828 -64 -304 ) subway/1_black -7 0 90 0.500000 0.500000 134217728 16777216 0 +( 1824 0 -308 ) ( 1824 -64 -308 ) ( 1824 -64 -312 ) subway/1_danger 0 0 0 -0.500000 0.500000 134217728 16777216 0 +( 1824 -64 -308 ) ( 1828 -64 -308 ) ( 1828 -64 -312 ) subway/1_black -7 -7 -180 0.500000 -0.500000 134217728 16777216 0 +( 1828 -64 -308 ) ( 1828 0 -308 ) ( 1828 0 -312 ) subway/1_danger 0 0 0 -0.500000 0.500000 134217728 16777216 0 +( 1828 0 -308 ) ( 1824 0 -308 ) ( 1824 0 -312 ) subway/1_black -7 -7 -180 0.500000 -0.500000 134217728 16777216 0 +} +} +// entity 85 +{ +"classname" "func_group" +// brush 0 +{ +( 1832 752 -344 ) ( 1824 752 -344 ) ( 1824 560 -344 ) subway/3_pipes2 0 20 90 0.500000 0.500000 134217728 16777216 0 +( 1824 560 -338 ) ( 1824 752 -338 ) ( 1832 752 -338 ) subway/3_pipes2 0 20 90 0.500000 0.500000 134217728 16777216 0 +( 1832 -280 -312 ) ( 1840 -280 -312 ) ( 1840 -280 -344 ) subway/3_pipes2 0 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1830 216 -312 ) ( 1830 408 -312 ) ( 1830 408 -344 ) subway/3_pipes2 0 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1832 752 -312 ) ( 1824 752 -312 ) ( 1824 752 -344 ) subway/3_pipes2 0 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1824 656 -314 ) ( 1824 464 -314 ) ( 1824 464 -346 ) subway/3_pipes2 0 -16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1 +{ +( 1832 -280 -344 ) ( 1824 -280 -344 ) ( 1824 -472 -344 ) subway/3_pipes2 15 20 90 0.500000 0.500000 134217728 16777216 0 +( 1824 -472 -338 ) ( 1824 -280 -338 ) ( 1832 -280 -338 ) subway/3_pipes2 15 20 90 0.500000 0.500000 134217728 16777216 0 +( 1832 -1312 -312 ) ( 1840 -1312 -312 ) ( 1840 -1312 -344 ) subway/3_pipes2 0 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1830 -816 -312 ) ( 1830 -624 -312 ) ( 1830 -624 -344 ) subway/3_pipes2 16 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1832 -280 -312 ) ( 1824 -280 -312 ) ( 1824 -280 -344 ) subway/3_pipes2 0 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1824 -504 -314 ) ( 1824 -696 -314 ) ( 1824 -696 -346 ) subway/3_pipes2 16 -16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( 1832 -1312 -344 ) ( 1824 -1312 -344 ) ( 1824 -1504 -344 ) subway/3_pipes2 -33 20 90 0.500000 0.500000 134217728 16777216 0 +( 1824 -1504 -338 ) ( 1824 -1312 -338 ) ( 1832 -1312 -338 ) subway/3_pipes2 -33 20 90 0.500000 0.500000 134217728 16777216 0 +( 1840 -2536 -312 ) ( 1848 -2536 -312 ) ( 1848 -2536 -344 ) subway/3_pipes2 0 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1830 -1848 -312 ) ( 1830 -1656 -312 ) ( 1830 -1656 -344 ) subway/3_pipes2 -32 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1832 -1312 -312 ) ( 1824 -1312 -312 ) ( 1824 -1312 -344 ) subway/3_pipes2 0 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1824 -1536 -314 ) ( 1824 -1728 -314 ) ( 1824 -1728 -346 ) subway/3_pipes2 -32 -16 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 86 +{ +"origin" "1952 2744 -328" +"targetname" "t230" +"waitaction1" "CCH_A_FWD_P_2" +"wait" "-1" +"angle" "270" +"classname" "path_corner" +} +// entity 87 +{ +"origin" "912 384 -96" +"target" "t226" +"targetname" "cornerln1" +"classname" "trigger_relay" +} +// entity 88 +{ +"targetname" "lower_punk2" +"target" "t242" +"classname" "m_nyc_mskinhead2a" +"angle" "180" +"origin" "-32 -648 -392" +"spawnflags" "18" +} +// entity 89 +{ +"classname" "point_combat" +"targetname" "t220" +"origin" "-288 -1280 -312" +} +// entity 90 +{ +"classname" "func_fade" +"origin" "-584 1064 80" +"targetname" "tsr1fadeout" +"color" "0.0 0.0 0.0" +"delay" "1" +} +// entity 91 +{ +"origin" "1976 2376 -432" +"spawnflags" "65536" +"classname" "m_nyc_mswat" +} +// entity 92 +{ +"targetname" "gunshots" +"classname" "func_wall" +// brush 0 +{ +( -2232 -116 424 ) ( -2244 -128 424 ) ( -2148 -224 424 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -2153 -218 448 ) ( -2249 -122 448 ) ( -2238 -111 448 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -2159 -212 488 ) ( -2148 -201 488 ) ( -2148 -201 464 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2068 -292 488 ) ( -2165 -195 488 ) ( -2165 -195 464 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( -2148 -190 488 ) ( -2159 -201 488 ) ( -2159 -201 464 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2244 -128 488 ) ( -2148 -224 488 ) ( -2148 -224 464 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 93 +{ +"angle" "225" +"target" "t240" +"classname" "m_nyc_mskinhead2a" +"spawnflags" "6" +"origin" "912 992 -176" +"targetname" "pissguy1" +} +// entity 94 +{ +"delay" "2" +"origin" "1824 -416 -376" +"count" "50" +"targetname" "trainshake" +"classname" "func_camerashake" +} +// entity 95 +{ +"classname" "m_nyc_mswat" +"angle" "270" +"targetname" "subdsswat" +"spawnflags" "65536" +"origin" "424 -608 -432" +} +// entity 96 +{ +"classname" "m_nyc_mswat" +"spawnflags" "65536" +"targetname" "mendsswat" +"origin" "1664 992 -168" +} +// entity 97 +{ +"classname" "m_nyc_mswat" +"origin" "752 -240 -176" +"spawnflags" "65536" +"targetname" "tokdsguy" +} +// entity 98 +{ +"classname" "trigger_multiple" +"spawnflags" "8" +"target" "behinducam" +// brush 0 +{ +( 584 1352 -136 ) ( 552 1352 -136 ) ( 552 1344 -136 ) subway/trigger 0 8 0 1 1 0 128 0 +( 552 1344 -104 ) ( 552 1352 -104 ) ( 584 1352 -104 ) subway/trigger 0 8 0 1 1 0 128 0 +( 552 1336 -104 ) ( 584 1336 -104 ) ( 584 1336 -136 ) subway/trigger 0 -8 0 1 1 0 128 0 +( 600 1352 -104 ) ( 600 1360 -104 ) ( 600 1360 -136 ) subway/trigger -8 -8 0 1 1 0 128 0 +( 584 1352 -104 ) ( 552 1352 -104 ) ( 552 1352 -136 ) subway/trigger 0 -8 0 1 1 0 128 0 +( 536 1320 -104 ) ( 536 1312 -104 ) ( 536 1312 -136 ) subway/trigger -8 -8 0 1 1 0 128 0 +} +} +// entity 99 +{ +"killtarget" "swat1scr" +"classname" "m_nyc_mskinhead2a" +"angle" "270" +"targetname" "rbadguy2" +"spawnflags" "131222" +"origin" "2056 2680 -280" +} +// entity 100 +{ +"killtarget" "swat2scr" +"classname" "m_nyc_mskinhead2a" +"angle" "270" +"targetname" "rbadguy1" +"spawnflags" "131222" +"origin" "1952 2680 -280" +} +// entity 101 +{ +"origin" "744 1112 -112" +"targetname" "gbnyc5b" +"script" "tsr1/gbnyc5b" +"classname" "script_runner" +} +// entity 102 +{ +"pathtarget" "gbnyc5b" +"origin" "600 1104 -160" +"targetname" "t212" +"classname" "point_combat" +} +// entity 103 +{ +"classname" "script_runner" +"targetname" "backout" +"script" "tsr1/backout" +"origin" "596 1184 -120" +} +// entity 104 +{ +"targetname" "backof" +"classname" "trigger_once" +"target" "backout" +"spawnflags" "12" +// brush 0 +{ +( 640 1160 -168 ) ( 544 1160 -168 ) ( 544 1136 -168 ) subway/trigger 60 0 -180 1 -1 0 160 0 +( 544 1136 -72 ) ( 544 1160 -72 ) ( 640 1160 -72 ) subway/trigger 60 0 -180 1 -1 0 160 0 +( 544 1136 -80 ) ( 640 1136 -80 ) ( 640 1136 -168 ) subway/trigger 60 0 -180 1 -1 0 160 0 +( 648 1136 -80 ) ( 648 1160 -80 ) ( 648 1160 -168 ) subway/trigger -4 0 -180 1 -1 0 160 0 +( 640 1152 -80 ) ( 544 1152 -80 ) ( 544 1152 -168 ) subway/trigger 60 0 -180 1 -1 0 160 0 +( 544 1160 -80 ) ( 544 1136 -80 ) ( 544 1136 -168 ) subway/trigger -4 0 -180 1 -1 0 160 0 +} +} +// entity 105 +{ +"classname" "func_group" +// brush 0 +{ +( 1760 3032 -224 ) ( 1680 3192 -224 ) ( 1656 3192 -240 ) subway/1_tile -29 -1 -153 0.500000 0.500000 0 318767104 900 +( 1720 3032 -240 ) ( 1640 3192 -240 ) ( 1640 3192 -224 ) subway/1_tile_big_green 0 16 -180 0.500000 -0.500000 0 369098752 0 +( 1720 3032 -224 ) ( 1640 3192 -224 ) ( 1680 3192 -224 ) subway/1_tile_big_green -15 -2 -180 0.500000 0.500000 0 369098752 0 +( 1736 3032 -240 ) ( 1656 3192 -240 ) ( 1640 3192 -240 ) subway/1_tile_big_green -15 -2 -180 0.500000 0.500000 0 369098752 0 +( 1736 3032 -240 ) ( 1720 3032 -240 ) ( 1720 3032 -224 ) subway/1_tile_big_green -16 0 -180 0.500000 -0.500000 0 369098752 0 +( 1680 3112 -224 ) ( 1672 3104 -240 ) ( 1688 3120 -240 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 1 +{ +( 1720 3032 -256 ) ( 1616 3240 -256 ) ( 1624 3240 -256 ) subway/1_tile_big -15 16 90 0.500000 0.500000 0 318767104 0 +( 1728 3032 -320 ) ( 1720 3032 -320 ) ( 1720 3032 -264 ) subway/1_tile_big 0 15 -180 0.500000 -0.500000 0 318767104 0 +( 1728 3032 -264 ) ( 1624 3240 -264 ) ( 1624 3240 -320 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 905 +( 1720 3032 -320 ) ( 1616 3240 -320 ) ( 1616 3240 -264 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1480 2912 -256 ) ( 1472 2904 -312 ) ( 1488 2920 -312 ) subway/1_tile_big 0 16 -180 0.500000 -0.500000 0 318767104 0 +( 1592 3032 -264 ) ( 1624 3032 -264 ) ( 1608 3117 -264 ) subway/1_tile_big 0 15 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 2 +{ +( 1736 3032 -240 ) ( 1656 3192 -240 ) ( 1648 3192 -256 ) subway/1_tile 32 16 -180 0.500000 -0.500000 0 318767104 900 +( 1720 3032 -256 ) ( 1640 3192 -256 ) ( 1640 3192 -240 ) subway/1_tile_big_green 0 16 -180 0.500000 -0.500000 0 369098752 0 +( 1728 3032 -256 ) ( 1648 3192 -256 ) ( 1640 3192 -256 ) subway/1_tile_big_green -15 -2 -180 0.500000 0.500000 0 369098752 0 +( 1720 3032 -240 ) ( 1640 3192 -240 ) ( 1656 3192 -240 ) subway/1_tile_big_green -15 -2 -180 0.500000 0.500000 0 369098752 0 +( 1728 3032 -256 ) ( 1720 3032 -256 ) ( 1720 3032 -240 ) subway/1_tile_big_green -16 0 -180 0.500000 -0.500000 0 369098752 0 +( 1680 3112 -240 ) ( 1672 3104 -256 ) ( 1688 3120 -256 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 3 +{ +( 1728 3032 -320 ) ( 1720 3032 -320 ) ( 1720 3032 -264 ) subway/1_tile_big 0 15 -180 0.500000 -0.500000 0 318767104 0 +( 1728 3032 -264 ) ( 1624 3240 -264 ) ( 1624 3240 -320 ) subway/1_tile -32 16 0 0.500000 0.500000 0 318767104 905 +( 1720 3032 -320 ) ( 1616 3240 -320 ) ( 1616 3240 -264 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1480 2912 -256 ) ( 1472 2904 -312 ) ( 1488 2920 -312 ) subway/1_tile_big 0 16 -180 0.500000 -0.500000 0 318767104 0 +( 1592 3032 -320 ) ( 1608 3032 -320 ) ( 1600 3117 -320 ) subway/1_tile_big 0 15 -180 0.500000 -0.500000 0 318767104 0 +( 1624 3032 -264 ) ( 1592 3032 -264 ) ( 1608 3117 -264 ) subway/1_tile_big 0 15 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 4 +{ +( 1600 3152 -264 ) ( 1600 3152 -320 ) ( 1600 3160 -320 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 1808 3056 -320 ) ( 1808 3056 -264 ) ( 1600 3160 -264 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 905 +( 1808 3048 -264 ) ( 1808 3048 -320 ) ( 1600 3152 -320 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1488 2920 -312 ) ( 1472 2904 -312 ) ( 1480 2912 -256 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1592 3112 -320 ) ( 1608 3112 -320 ) ( 1600 3160 -320 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1624 3112 -264 ) ( 1592 3112 -264 ) ( 1608 3160 -264 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 5 +{ +( 1808 3056 -256 ) ( 1808 3048 -256 ) ( 1600 3152 -256 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1600 3152 -264 ) ( 1600 3152 -320 ) ( 1600 3160 -320 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 1808 3056 -320 ) ( 1808 3056 -264 ) ( 1600 3160 -264 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 905 +( 1808 3048 -264 ) ( 1808 3048 -320 ) ( 1600 3152 -320 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1488 2920 -312 ) ( 1472 2904 -312 ) ( 1480 2912 -256 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1592 3112 -264 ) ( 1624 3112 -264 ) ( 1608 3160 -264 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 6 +{ +( 1760 3080 -256 ) ( 1760 3088 -240 ) ( 1600 3168 -240 ) subway/1_tile -48 15 -180 0.500000 -0.500000 0 318767104 900 +( 1760 3072 -240 ) ( 1760 3072 -256 ) ( 1600 3152 -256 ) subway/1_tile_big_green -16 15 -180 0.500000 -0.500000 0 369098752 0 +( 1760 3072 -256 ) ( 1760 3080 -256 ) ( 1600 3160 -256 ) subway/1_tile_big_green -31 13 90 0.500000 0.500000 0 369098752 0 +( 1760 3088 -240 ) ( 1760 3072 -240 ) ( 1600 3152 -240 ) subway/1_tile_big_green -31 13 90 0.500000 0.500000 0 369098752 0 +( 1600 3152 -240 ) ( 1600 3152 -256 ) ( 1600 3160 -256 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1688 3120 -256 ) ( 1672 3104 -256 ) ( 1680 3112 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 7 +{ +( 1760 3088 -240 ) ( 1760 3112 -224 ) ( 1600 3192 -224 ) subway/1_tile -28 -49 153 0.500000 0.500000 0 318767104 900 +( 1760 3072 -224 ) ( 1760 3072 -240 ) ( 1600 3152 -240 ) subway/1_tile_big_green -16 15 -180 0.500000 -0.500000 0 369098752 0 +( 1760 3112 -224 ) ( 1760 3072 -224 ) ( 1600 3152 -224 ) subway/1_tile_big_green -31 13 90 0.500000 0.500000 0 369098752 0 +( 1760 3072 -240 ) ( 1760 3088 -240 ) ( 1600 3168 -240 ) subway/1_tile_big_green -31 13 90 0.500000 0.500000 0 369098752 0 +( 1600 3152 -224 ) ( 1600 3152 -240 ) ( 1600 3168 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1688 3120 -240 ) ( 1672 3104 -240 ) ( 1680 3112 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 8 +{ +( 1792 3096 -224 ) ( 1792 3112 -224 ) ( 1600 3208 -224 ) subway/1_tile_bottom 1 0 -26 0.500000 0.500000 0 318767104 0 +( 1792 3112 -216 ) ( 1792 3096 -216 ) ( 1600 3192 -216 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1792 3096 -216 ) ( 1792 3096 -224 ) ( 1600 3192 -224 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1792 3112 -224 ) ( 1792 3112 -216 ) ( 1600 3208 -216 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1600 3208 -224 ) ( 1600 3208 -216 ) ( 1600 3192 -216 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1712 3144 -224 ) ( 1704 3136 -224 ) ( 1708 3140 -216 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 9 +{ +( 1808 3048 -336 ) ( 1808 3056 -336 ) ( 1600 3160 -336 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1600 3152 -264 ) ( 1600 3152 -320 ) ( 1600 3160 -320 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 1808 3056 -320 ) ( 1808 3056 -264 ) ( 1600 3160 -264 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 905 +( 1808 3048 -264 ) ( 1808 3048 -320 ) ( 1600 3152 -320 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1488 2920 -320 ) ( 1472 2904 -320 ) ( 1480 2912 -264 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1608 3112 -320 ) ( 1592 3112 -320 ) ( 1600 3160 -320 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 10 +{ +( 1776 3032 -224 ) ( 1680 3224 -224 ) ( 1664 3224 -224 ) subway/1_tile_bottom 13 0 -63 0.500000 0.500000 0 318767104 0 +( 1760 3032 -216 ) ( 1664 3224 -216 ) ( 1680 3224 -216 ) subway/1_tile_top -16 0 90 0.500000 0.500000 0 318767104 0 +( 1760 3032 -224 ) ( 1664 3224 -224 ) ( 1664 3224 -216 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1776 3032 -216 ) ( 1680 3224 -216 ) ( 1680 3224 -224 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1760 3032 -216 ) ( 1776 3032 -216 ) ( 1776 3032 -224 ) subway/1_tile_top -16 0 -180 0.500000 -0.500000 0 318767104 0 +( 1708 3140 -216 ) ( 1704 3136 -224 ) ( 1712 3144 -224 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 11 +{ +( 1824 3096 -224 ) ( 1824 3160 -224 ) ( 1600 3272 -224 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1824 3160 -216 ) ( 1824 3096 -216 ) ( 1600 3208 -216 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +( 1824 3160 -224 ) ( 1824 3160 -216 ) ( 1600 3272 -216 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1600 3128 -224 ) ( 1600 3152 -224 ) ( 1600 3140 -216 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1824 3096 -216 ) ( 1824 3096 -224 ) ( 1600 3208 -224 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1744 3160 -224 ) ( 1744 3176 -224 ) ( 1744 3176 -240 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 1728 3176 -224 ) ( 1744 3176 -224 ) ( 1728 3176 -240 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 12 +{ +( 1936 3104 -224 ) ( 1936 3120 -224 ) ( 1600 3288 -224 ) subway/1_tile_bottom 1 -14 -26 0.500000 -0.500000 0 318767104 0 +( 1936 3120 -216 ) ( 1936 3104 -216 ) ( 1600 3272 -216 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 3104 -216 ) ( 1936 3104 -224 ) ( 1600 3272 -224 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1936 3120 -224 ) ( 1936 3120 -216 ) ( 1600 3288 -216 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1600 3272 -216 ) ( 1600 3272 -224 ) ( 1600 3288 -224 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +( 1712 3144 -224 ) ( 1704 3136 -224 ) ( 1708 3140 -216 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 13 +{ +( 1920 3128 -224 ) ( 1920 3152 -240 ) ( 1600 3312 -240 ) subway/1_tile -1 6 154 0.500000 -0.500000 0 318767104 900 +( 1920 3168 -240 ) ( 1920 3168 -224 ) ( 1600 3328 -224 ) subway/1_tile_big_green 0 14 -180 0.500000 -0.500000 0 369098752 0 +( 1920 3168 -224 ) ( 1920 3128 -224 ) ( 1600 3288 -224 ) subway/1_tile_big_green -30 29 90 0.500000 0.500000 0 369098752 0 +( 1920 3152 -240 ) ( 1920 3168 -240 ) ( 1600 3328 -240 ) subway/1_tile_big_green -30 29 90 0.500000 0.500000 0 369098752 0 +( 1600 3328 -240 ) ( 1600 3328 -224 ) ( 1600 3288 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1704 3136 -240 ) ( 1696 3128 -240 ) ( 1700 3132 -224 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 14 +{ +( 1920 3152 -240 ) ( 1920 3160 -256 ) ( 1600 3320 -256 ) subway/1_tile 0 14 -180 0.500000 -0.500000 0 318767104 904 +( 1920 3168 -256 ) ( 1920 3168 -240 ) ( 1600 3328 -240 ) subway/1_tile_big_green 0 14 -180 0.500000 -0.500000 0 369098752 0 +( 1920 3160 -256 ) ( 1920 3168 -256 ) ( 1600 3328 -256 ) subway/1_tile_big_green -30 29 90 0.500000 0.500000 0 369098752 0 +( 1920 3168 -240 ) ( 1920 3152 -240 ) ( 1600 3312 -240 ) subway/1_tile_big_green -30 29 90 0.500000 0.500000 0 369098752 0 +( 1600 3312 -240 ) ( 1600 3320 -256 ) ( 1600 3328 -256 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +( 1704 3136 -256 ) ( 1696 3128 -256 ) ( 1700 3132 -240 ) subway/1_tile_big_green 0 0 0 0.500000 0.500000 0 369098752 0 +} +// brush 15 +{ +( 1952 3144 -320 ) ( 1952 3152 -320 ) ( 1600 3328 -320 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1600 3320 -264 ) ( 1600 3320 -320 ) ( 1600 3328 -320 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 1952 3144 -264 ) ( 1952 3144 -320 ) ( 1600 3320 -320 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 904 +( 1952 3152 -320 ) ( 1952 3152 -264 ) ( 1600 3328 -264 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1688 3120 -312 ) ( 1680 3112 -312 ) ( 1684 3116 -256 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 1656 3224 -264 ) ( 1592 3224 -264 ) ( 1624 3328 -264 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 16 +{ +( 1952 3144 -336 ) ( 1952 3152 -336 ) ( 1600 3328 -336 ) subway/1_tile_bottom 16 16 0 0.500000 0.500000 0 318767104 0 +( 1952 3152 -320 ) ( 1952 3144 -320 ) ( 1600 3320 -320 ) subway/1_tile_bottom 16 16 0 0.500000 0.500000 0 318767104 0 +( 1600 3320 -320 ) ( 1600 3320 -336 ) ( 1600 3328 -336 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1952 3144 -320 ) ( 1952 3144 -336 ) ( 1600 3320 -336 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 904 +( 1952 3152 -336 ) ( 1952 3152 -320 ) ( 1600 3328 -320 ) subway/1_tile_bottom 16 0 0 0.500000 0.500000 0 318767104 0 +( 1688 3120 -336 ) ( 1680 3112 -336 ) ( 1684 3116 -320 ) subway/1_tile_bottom -16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 17 +{ +( 1952 3152 -256 ) ( 1952 3144 -256 ) ( 1600 3320 -256 ) subway/1_tile_big 0 0 0 0.500000 0.500000 0 318767104 0 +( 1600 3320 -264 ) ( 1600 3320 -320 ) ( 1600 3328 -320 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 1952 3144 -264 ) ( 1952 3144 -320 ) ( 1600 3320 -320 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 904 +( 1952 3152 -320 ) ( 1952 3152 -264 ) ( 1600 3328 -264 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1688 3120 -312 ) ( 1680 3112 -312 ) ( 1684 3116 -256 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 1592 3224 -264 ) ( 1656 3224 -264 ) ( 1624 3328 -264 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 18 +{ +( 1824 3096 -224 ) ( 1824 3160 -224 ) ( 1600 3272 -224 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1824 3160 -216 ) ( 1824 3096 -216 ) ( 1600 3208 -216 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +( 1824 3160 -224 ) ( 1824 3160 -216 ) ( 1600 3272 -216 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1712 3144 -224 ) ( 1704 3136 -224 ) ( 1708 3140 -216 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 1744 3176 -224 ) ( 1744 3160 -224 ) ( 1744 3176 -240 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 19 +{ +( 1840 3032 -224 ) ( 1728 3256 -224 ) ( 1664 3256 -224 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1776 3032 -216 ) ( 1664 3256 -216 ) ( 1728 3256 -216 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1840 3032 -216 ) ( 1728 3256 -216 ) ( 1728 3256 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1708 3140 -216 ) ( 1704 3136 -224 ) ( 1712 3144 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1728 3160 -224 ) ( 1744 3160 -224 ) ( 1744 3160 -240 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1744 3176 -224 ) ( 1744 3160 -224 ) ( 1744 3176 -240 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +} +// brush 20 +{ +( 1744 3176 -224 ) ( 1728 3176 -224 ) ( 1728 3160 -224 ) subway/light_yellow 0 16 0 0.500000 0.500000 134217728 16777217 15000 +( 1728 3160 -216 ) ( 1728 3176 -216 ) ( 1744 3176 -216 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1728 3160 -224 ) ( 1744 3160 -224 ) ( 1744 3160 -240 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 3160 -224 ) ( 1744 3176 -224 ) ( 1744 3176 -240 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1744 3176 -224 ) ( 1728 3176 -224 ) ( 1728 3176 -240 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1728 3176 -224 ) ( 1728 3160 -224 ) ( 1728 3160 -240 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 21 +{ +( 1824 3096 -224 ) ( 1824 3160 -224 ) ( 1600 3272 -224 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1824 3160 -216 ) ( 1824 3096 -216 ) ( 1600 3208 -216 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +( 1824 3096 -216 ) ( 1824 3096 -224 ) ( 1600 3208 -224 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1728 3160 -224 ) ( 1744 3160 -224 ) ( 1744 3160 -240 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1744 3176 -224 ) ( 1728 3176 -224 ) ( 1728 3176 -240 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1728 3160 -224 ) ( 1728 3176 -224 ) ( 1728 3160 -240 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 22 +{ +( 1824 3096 -224 ) ( 1824 3160 -224 ) ( 1600 3272 -224 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1824 3160 -216 ) ( 1824 3096 -216 ) ( 1600 3208 -216 ) subway/1_tile_big 16 0 0 0.500000 0.500000 0 318767104 0 +( 1824 3096 -216 ) ( 1824 3096 -224 ) ( 1600 3208 -224 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +( 1712 3144 -224 ) ( 1704 3136 -224 ) ( 1708 3140 -216 ) subway/1_tile_big -16 16 0 0.500000 0.500000 0 318767104 0 +( 1744 3160 -224 ) ( 1728 3160 -224 ) ( 1744 3160 -240 ) subway/1_tile_big 16 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 23 +{ +( 1840 3032 -224 ) ( 1728 3256 -224 ) ( 1664 3256 -224 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1776 3032 -216 ) ( 1664 3256 -216 ) ( 1728 3256 -216 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1840 3032 -216 ) ( 1728 3256 -216 ) ( 1728 3256 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1776 3032 -224 ) ( 1664 3256 -224 ) ( 1664 3256 -216 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1708 3140 -216 ) ( 1704 3136 -224 ) ( 1712 3144 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1744 3160 -224 ) ( 1728 3160 -224 ) ( 1744 3160 -240 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1808 3048 -224 ) ( 1808 3064 -224 ) ( 1808 3064 -240 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1792 3064 -224 ) ( 1808 3064 -224 ) ( 1792 3064 -240 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +} +// brush 24 +{ +( 1856 3032 -224 ) ( 1688 3368 -224 ) ( 1672 3368 -224 ) subway/1_tile_bottom -19 -8 116 0.500000 0.500000 0 318767104 0 +( 1840 3032 -216 ) ( 1672 3368 -216 ) ( 1688 3368 -216 ) subway/1_tile_top -15 0 90 0.500000 0.500000 0 318767104 0 +( 1840 3032 -224 ) ( 1672 3368 -224 ) ( 1672 3368 -216 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1856 3032 -216 ) ( 1688 3368 -216 ) ( 1688 3368 -224 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 1856 3032 -224 ) ( 1840 3032 -224 ) ( 1840 3032 -216 ) subway/1_tile_top -16 0 -180 0.500000 -0.500000 0 318767104 0 +( 1708 3140 -216 ) ( 1704 3136 -224 ) ( 1712 3144 -224 ) subway/1_tile_top 0 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 25 +{ +( 1880 3032 -240 ) ( 1720 3352 -240 ) ( 1696 3352 -224 ) subway/1_tile 5 31 -63 0.500082 -0.499863 0 318767104 900 +( 1896 3032 -224 ) ( 1736 3352 -224 ) ( 1736 3352 -240 ) subway/1_tile_big_green 16 15 -180 0.500000 -0.500000 0 369098752 0 +( 1856 3032 -224 ) ( 1696 3352 -224 ) ( 1736 3352 -224 ) subway/1_tile_big_green -14 -17 -180 0.500000 0.500000 0 369098752 0 +( 1896 3032 -240 ) ( 1736 3352 -240 ) ( 1720 3352 -240 ) subway/1_tile_big_green -14 -17 -180 0.500000 0.500000 0 369098752 0 +( 1856 3032 -224 ) ( 1896 3032 -224 ) ( 1896 3032 -240 ) subway/1_tile_big_green -16 0 -180 0.500000 -0.500000 0 369098752 0 +( 1700 3132 -224 ) ( 1696 3128 -240 ) ( 1704 3136 -240 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 26 +{ +( 1888 3032 -256 ) ( 1728 3352 -256 ) ( 1720 3352 -240 ) subway/1_tile 32 15 -180 0.500000 -0.500000 0 318767104 904 +( 1896 3032 -240 ) ( 1736 3352 -240 ) ( 1736 3352 -256 ) subway/1_tile_big_green 16 15 -180 0.500000 -0.500000 0 369098752 0 +( 1896 3032 -256 ) ( 1736 3352 -256 ) ( 1728 3352 -256 ) subway/1_tile_big_green -14 -18 -180 0.500000 0.500000 0 369098752 0 +( 1880 3032 -240 ) ( 1720 3352 -240 ) ( 1736 3352 -240 ) subway/1_tile_big_green -14 -18 -180 0.500000 0.500000 0 369098752 0 +( 1896 3032 -256 ) ( 1888 3032 -256 ) ( 1880 3032 -240 ) subway/1_tile_big_green -16 0 -180 0.500000 -0.500000 0 369098752 0 +( 1700 3132 -240 ) ( 1696 3128 -256 ) ( 1704 3136 -256 ) subway/1_tile_big_green 0 0 -180 0.500000 -0.500000 0 369098752 0 +} +// brush 27 +{ +( 1888 3032 -256 ) ( 1712 3384 -256 ) ( 1720 3384 -256 ) subway/1_tile_big -15 16 90 0.500000 0.500000 0 318767104 0 +( 1896 3032 -320 ) ( 1888 3032 -320 ) ( 1888 3032 -264 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1888 3032 -312 ) ( 1712 3384 -312 ) ( 1712 3384 -256 ) subway/1_tile_top 0 0 0 0.500000 0.500000 0 318767104 904 +( 1896 3032 -264 ) ( 1720 3384 -264 ) ( 1720 3384 -320 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1684 3116 -256 ) ( 1680 3112 -312 ) ( 1688 3120 -312 ) subway/1_tile_big 16 16 -180 0.500000 -0.500000 0 318767104 0 +( 1592 3032 -264 ) ( 1656 3032 -264 ) ( 1624 3229 -264 ) subway/1_tile_big -16 15 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 28 +{ +( 1896 3032 -320 ) ( 1720 3384 -320 ) ( 1712 3384 -320 ) subway/1_tile_big -15 16 90 0.500000 0.500000 0 318767104 0 +( 1896 3032 -320 ) ( 1888 3032 -320 ) ( 1888 3032 -264 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 1888 3032 -312 ) ( 1712 3384 -312 ) ( 1712 3384 -256 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 904 +( 1896 3032 -264 ) ( 1720 3384 -264 ) ( 1720 3384 -320 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1684 3116 -256 ) ( 1680 3112 -312 ) ( 1688 3120 -312 ) subway/1_tile_big 16 16 -180 0.500000 -0.500000 0 318767104 0 +( 1656 3032 -264 ) ( 1592 3032 -264 ) ( 1624 3229 -264 ) subway/1_tile_big -16 15 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 29 +{ +( 1896 3032 -336 ) ( 1720 3384 -336 ) ( 1712 3384 -336 ) subway/1_tile_bottom 0 0 90 0.500000 0.500000 0 318767104 0 +( 1888 3032 -320 ) ( 1712 3384 -320 ) ( 1720 3384 -320 ) subway/1_tile_bottom 0 0 90 0.500000 0.500000 0 318767104 0 +( 1896 3032 -336 ) ( 1888 3032 -336 ) ( 1888 3032 -320 ) subway/1_tile_bottom -16 0 -180 0.500000 -0.500000 0 318767104 0 +( 1888 3032 -336 ) ( 1712 3384 -336 ) ( 1712 3384 -320 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 904 +( 1896 3032 -320 ) ( 1720 3384 -320 ) ( 1720 3384 -336 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 0 +( 1684 3116 -320 ) ( 1680 3112 -336 ) ( 1688 3120 -336 ) subway/1_tile_bottom 16 0 -180 0.500000 -0.500000 0 318767104 0 +} +// brush 30 +{ +( 1840 3032 -224 ) ( 1728 3256 -224 ) ( 1664 3256 -224 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1776 3032 -216 ) ( 1664 3256 -216 ) ( 1728 3256 -216 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1840 3032 -216 ) ( 1728 3256 -216 ) ( 1728 3256 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1792 3048 -224 ) ( 1808 3048 -224 ) ( 1808 3048 -240 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1808 3064 -224 ) ( 1808 3048 -224 ) ( 1808 3064 -240 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +} +// brush 31 +{ +( 1808 3064 -224 ) ( 1792 3064 -224 ) ( 1792 3048 -224 ) subway/light_yellow 0 16 0 0.500000 0.500000 134217728 16777217 15000 +( 1792 3048 -216 ) ( 1792 3064 -216 ) ( 1808 3064 -216 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1792 3048 -224 ) ( 1808 3048 -224 ) ( 1808 3048 -240 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1808 3048 -224 ) ( 1808 3064 -224 ) ( 1808 3064 -240 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1808 3064 -224 ) ( 1792 3064 -224 ) ( 1792 3064 -240 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1792 3064 -224 ) ( 1792 3048 -224 ) ( 1792 3048 -240 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 32 +{ +( 1840 3032 -224 ) ( 1728 3256 -224 ) ( 1664 3256 -224 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1776 3032 -216 ) ( 1664 3256 -216 ) ( 1728 3256 -216 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1776 3032 -224 ) ( 1664 3256 -224 ) ( 1664 3256 -216 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1792 3048 -224 ) ( 1808 3048 -224 ) ( 1808 3048 -240 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1808 3064 -224 ) ( 1792 3064 -224 ) ( 1792 3064 -240 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1792 3048 -224 ) ( 1792 3064 -224 ) ( 1792 3048 -240 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +} +// brush 33 +{ +( 1840 3032 -224 ) ( 1728 3256 -224 ) ( 1664 3256 -224 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1776 3032 -216 ) ( 1664 3256 -216 ) ( 1728 3256 -216 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1840 3032 -216 ) ( 1728 3256 -216 ) ( 1728 3256 -224 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1708 3032 -216 ) ( 1720 3032 -224 ) ( 1696 3032 -224 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +( 1776 3032 -224 ) ( 1664 3256 -224 ) ( 1664 3256 -216 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 900 +( 1808 3048 -224 ) ( 1792 3048 -224 ) ( 1808 3048 -240 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 900 +} +// brush 34 +{ +( 1728 3032 -336 ) ( 1624 3240 -336 ) ( 1616 3240 -336 ) subway/1_tile_big -15 16 90 0.500000 0.500000 0 318767104 0 +( 1728 3032 -320 ) ( 1720 3032 -320 ) ( 1720 3032 -264 ) subway/1_tile_big 0 15 -180 0.500000 -0.500000 0 318767104 0 +( 1728 3032 -264 ) ( 1624 3240 -264 ) ( 1624 3240 -320 ) subway/1_tile_bottom 0 0 0 0.500000 0.500000 0 318767104 905 +( 1720 3032 -320 ) ( 1616 3240 -320 ) ( 1616 3240 -264 ) subway/1_tile_big 0 16 0 0.500000 0.500000 0 318767104 0 +( 1480 2912 -264 ) ( 1472 2904 -320 ) ( 1488 2920 -320 ) subway/1_tile_big 0 16 -180 0.500000 -0.500000 0 318767104 0 +( 1608 3032 -320 ) ( 1592 3032 -320 ) ( 1600 3117 -320 ) subway/1_tile_big 0 15 -180 0.500000 -0.500000 0 318767104 0 +} +} +// entity 106 +{ +"classname" "script_runner" +"script" "tsr1/nycintro" +"targetname" "startintro" +"origin" "-536 1048 64" +} +// entity 107 +{ +"origin" "1528 800 -176" +"target" "lhostageb2" +"targetname" "lhostageb" +"classname" "trigger_relay" +} +// entity 108 +{ +"classname" "func_fade" +"delay" "1" +"color" "0.0 0.0 0.0" +"targetname" "sabrefade1" +"origin" "1760 1984 -336" +} +// entity 109 +{ +"origin" "1752 -2232 -472" +"delay" "1.5" +"classname" "func_fade" +"targetname" "testfade2" +"spawnflags" "1" +"color" "0.0 0.0 0.0" +} +// entity 110 +{ +"origin" "1752 -2264 -472" +"delay" "1" +"color" "0.0 0.0 0.0" +"targetname" "testfade" +"classname" "func_fade" +} +// entity 111 +{ +"origin" "-2032 200 192" +"spawnflags" "30" +"targetname" "introhawkb" +"classname" "m_x_mmerc" +} +// entity 112 +{ +"origin" "-2000 176 192" +"targetname" "introjohnb" +"spawnflags" "24" +"angle" "90" +"classname" "m_x_mcharacter" +} +// entity 113 +{ +"targetname" "scue1" +"classname" "script_runner" +"script" "tsr1/scue1" +"origin" "360 -32 -168" +} +// entity 114 +{ +"classname" "trigger_once" +"target" "scue1b" +// brush 0 +{ +( 456 88 -216 ) ( 392 88 -216 ) ( 392 80 -216 ) subway/trigger 0 16 0 1 1 0 144 0 +( 392 80 -120 ) ( 392 88 -120 ) ( 456 88 -120 ) subway/trigger 0 16 0 1 1 0 144 0 +( 408 -96 -152 ) ( 472 -96 -152 ) ( 472 -96 -184 ) subway/trigger 0 0 0 1 1 0 144 0 +( 408 72 -152 ) ( 408 80 -152 ) ( 408 80 -184 ) subway/trigger -16 0 0 1 1 0 144 0 +( 464 0 -152 ) ( 400 0 -152 ) ( 400 0 -184 ) subway/trigger 0 0 0 1 1 0 144 0 +( 400 56 -152 ) ( 400 48 -152 ) ( 400 48 -184 ) subway/trigger -16 0 0 1 1 0 144 0 +} +} +// entity 115 +{ +"classname" "info_notnull" +"targetname" "newcam2n" +"origin" "-2120 560 220" +} +// entity 116 +{ +"classname" "func_remote_camera" +"targetname" "newcam2" +"target" "newcam2n" +"origin" "-2176 304 156" +"volume" "2" +} +// entity 117 +{ +"classname" "info_notnull" +"targetname" "newcam1n" +"origin" "-2168 464 216" +} +// entity 118 +{ +"classname" "func_remote_camera" +"targetname" "newcam1" +"target" "newcam1n" +"origin" "-2152 436 216" +"volume" "2" +} +// entity 119 +{ +"classname" "m_nyc_mswatleader" +"angle" "270" +"spawnflags" "30" +"targetname" "lastswatleader" +"origin" "-2144 512 208" +} +// entity 120 +{ +"origin" "1832 -2280 -376" +"map" "trn1" +"targetname" "endlevel" +"classname" "target_changelevel" +} +// entity 121 +{ +"origin" "852 -556 -164" +"target" "tokencamn" +"volume" "2" +"targetname" "tokencam" +"classname" "func_remote_camera" +} +// entity 122 +{ +"origin" "512 -128 -176" +"targetname" "tdoorjohn" +"spawnflags" "22" +"angle" "90" +"classname" "m_x_mcharacter" +} +// entity 123 +{ +"origin" "744 1344 -72" +"targetname" "thirdtv" +"classname" "light" +} +// entity 124 +{ +"surfaceType" "28" +"health" "45" +"material" "8" +"target" "thirdtv" +"classname" "func_breakable_brush" +// brush 0 +{ +( 746 1368 -92 ) ( 780 1402 -92 ) ( 768 1413 -92 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 768 1413 -60 ) ( 780 1402 -60 ) ( 746 1368 -60 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 734 1380 -92 ) ( 734 1380 -76 ) ( 746 1368 -76 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 763 1388 -92 ) ( 763 1388 -76 ) ( 729 1354 -76 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 761 1384 -92 ) ( 761 1384 -76 ) ( 750 1395 -76 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 743 1365 -92 ) ( 743 1365 -76 ) ( 777 1399 -76 ) subway/1_static_tv 32 0 45 1 1 134217728 16777216 0 +} +// brush 1 +{ +( 771 1343 -60 ) ( 805 1377 -60 ) ( 794 1388 -60 ) subway/1_static_tv 32 0 45 1 1 134217728 16777216 0 +( 794 1388 -58 ) ( 805 1377 -58 ) ( 771 1343 -58 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 760 1354 -88 ) ( 760 1354 -72 ) ( 771 1343 -72 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 772 1398 -88 ) ( 772 1398 -72 ) ( 739 1364 -72 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 787 1358 -88 ) ( 787 1358 -72 ) ( 775 1370 -72 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 770 1344 -88 ) ( 770 1344 -72 ) ( 804 1378 -72 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +} +// brush 2 +{ +( 771 1343 -92 ) ( 805 1377 -92 ) ( 794 1388 -92 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 794 1388 -60 ) ( 805 1377 -60 ) ( 771 1343 -60 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 760 1354 -92 ) ( 760 1354 -76 ) ( 771 1343 -76 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 784 1361 -92 ) ( 784 1361 -76 ) ( 750 1327 -76 ) subway/1_static_tv 32 0 45 1 1 134217728 16777216 0 +( 787 1358 -92 ) ( 787 1358 -76 ) ( 775 1370 -76 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 770 1344 -92 ) ( 770 1344 -76 ) ( 804 1378 -76 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +} +// brush 3 +{ +( 770 1344 -124 ) ( 770 1344 -108 ) ( 804 1378 -108 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 791 1354 -124 ) ( 791 1354 -108 ) ( 780 1365 -108 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 772 1398 -124 ) ( 772 1398 -108 ) ( 739 1364 -108 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 760 1354 -124 ) ( 760 1354 -108 ) ( 771 1343 -108 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +( 794 1388 -92 ) ( 805 1377 -92 ) ( 771 1343 -92 ) subway/1_static_tv 32 0 45 1 1 134217728 16777216 0 +( 772 1341 -94 ) ( 806 1375 -94 ) ( 795 1387 -94 ) subway/1_static_tv 32 0 0 1 1 134217728 16777216 0 +} +// brush 4 +{ +( 768 1346 -92 ) ( 797 1374 -92 ) ( 768 1402 -92 ) subway/1_static1 0 0 0 1 1 134217728 4097 20 +( 768 1402 -60 ) ( 797 1374 -60 ) ( 768 1346 -60 ) subway/1_static1 0 0 0 1 1 134217728 4097 20 +( 743 1377 -92 ) ( 743 1377 -60 ) ( 771 1348 -60 ) subway/1_static1 0 0 0 0.500000 0.500000 134217728 4097 20 +( 774 1397 -92 ) ( 774 1397 -60 ) ( 746 1368 -60 ) subway/1_static1 0 0 0 1 1 134217728 4097 20 +( 782 1363 -92 ) ( 782 1363 -60 ) ( 754 1391 -60 ) subway/1_static1 0 0 0 1 1 134217728 4097 20 +( 768 1346 -92 ) ( 768 1346 -60 ) ( 797 1374 -60 ) subway/1_static1 0 0 0 1 1 134217728 4097 20 +} +} +// entity 125 +{ +"origin" "-376 364 -136" +"light" "115" +"targetname" "bottomtv" +"classname" "light" +} +// entity 126 +{ +"spawnflags" "22" +"origin" "856 -552 -128" +"script" "tsr1/tdoorcam1" +"targetname" "tokendoor2s" +"classname" "script_runner" +} +// entity 127 +{ +"targetname" "tokencamn" +"origin" "836 -540 -164" +"classname" "info_notnull" +} +// entity 128 +{ +"classname" "trigger_once" +"target" "t206" +// brush 0 +{ +( 672 1376 -168 ) ( 536 1376 -168 ) ( 536 1216 -168 ) subway/trigger 24 24 0 1 1 0 144 0 +( 536 1216 -40 ) ( 536 1376 -40 ) ( 672 1376 -40 ) subway/trigger 24 24 0 1 1 0 144 0 +( 536 1312 -128 ) ( 672 1312 -128 ) ( 672 1312 -144 ) subway/trigger 24 0 0 1 1 0 144 0 +( 744 1216 -128 ) ( 744 1376 -128 ) ( 744 1376 -144 ) subway/trigger 0 0 0 1 1 0 144 0 +( 672 1352 -128 ) ( 536 1352 -128 ) ( 536 1352 -144 ) subway/trigger 24 0 0 1 1 0 144 0 +( 536 1392 -128 ) ( 536 1232 -128 ) ( 536 1232 -144 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 129 +{ +"targetname" "originalwall" +"spawnflags" "6" +"classname" "func_wall" +// brush 0 +{ +( 1126 920 -160 ) ( 1126 776 -160 ) ( 1126 776 -192 ) subway/1_bath_stall -28 -16 0 1 1 134217728 16777216 0 +( 1174 920 -160 ) ( 1126 920 -160 ) ( 1126 920 -192 ) subway/1_bath_stall 12 -16 0 1 1 134217728 16777216 0 +( 1130 848 -160 ) ( 1130 992 -160 ) ( 1130 992 -192 ) subway/1_bath_stall -28 -16 0 1 1 134217728 16777216 0 +( 1126 864 -160 ) ( 1174 864 -160 ) ( 1174 864 -192 ) subway/1_bath_stall 12 -16 0 1 1 134217728 16777216 0 +( 1126 864 -144 ) ( 1126 1008 -144 ) ( 1174 1008 -144 ) subway/1_bath_stall 12 4 0 1 1 134217728 16777216 0 +( 1174 1008 -192 ) ( 1126 1008 -192 ) ( 1126 864 -192 ) subway/1_bath_stall 12 4 0 1 1 134217728 16777216 0 +} +} +// entity 130 +{ +"target" "bottomtv" +"classname" "func_breakable_brush" +"mass" "2" +"count" "6" +"health" "45" +"material" "8" +"surfaceType" "28" +// brush 0 +{ +( -367 347 -156 ) ( -367 347 -140 ) ( -401 313 -140 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -385 328 -156 ) ( -385 328 -140 ) ( -374 317 -140 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -387 324 -156 ) ( -387 324 -140 ) ( -353 358 -140 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -358 332 -156 ) ( -358 332 -140 ) ( -370 344 -140 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -392 299 -124 ) ( -404 310 -124 ) ( -370 344 -124 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -370 344 -156 ) ( -404 310 -156 ) ( -392 299 -156 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +} +// brush 1 +{ +( -392 366 -156 ) ( -392 366 -124 ) ( -421 338 -124 ) subway/meter1 0 0 0 0.500000 0.500000 0 16777216 0 +( -406 349 -156 ) ( -406 349 -124 ) ( -378 321 -124 ) subway/metal_clean 0 0 0 0.500000 0.500000 0 16777216 0 +( -398 315 -156 ) ( -398 315 -124 ) ( -370 344 -124 ) subway/meter1 0 0 0 0.500000 0.500000 0 16777216 0 +( -367 335 -156 ) ( -367 335 -124 ) ( -395 364 -124 ) subway/1_static1 0 0 0 0.500000 0.500000 0 537006080 2900 +( -392 310 -124 ) ( -421 338 -124 ) ( -392 366 -124 ) subway/meter1 0 0 0 0.500000 0.500000 0 16777216 0 +( -392 366 -156 ) ( -421 338 -156 ) ( -392 310 -156 ) subway/meter1 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2 +{ +( -396 371 -158 ) ( -430 337 -158 ) ( -419 325 -158 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -418 324 -156 ) ( -429 335 -156 ) ( -395 369 -156 ) subway/1_static_tv 32 0 47 1 1 0 16777216 0 +( -384 358 -188 ) ( -384 358 -172 ) ( -395 369 -172 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -396 314 -188 ) ( -396 314 -172 ) ( -363 348 -172 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -415 358 -188 ) ( -415 358 -172 ) ( -404 347 -172 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -394 368 -188 ) ( -394 368 -172 ) ( -428 334 -172 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +} +// brush 3 +{ +( -394 368 -152 ) ( -394 368 -136 ) ( -428 334 -136 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -411 354 -152 ) ( -411 354 -136 ) ( -399 342 -136 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -396 314 -152 ) ( -396 314 -136 ) ( -363 348 -136 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -384 358 -152 ) ( -384 358 -136 ) ( -395 369 -136 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -418 324 -122 ) ( -429 335 -122 ) ( -395 369 -122 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -395 369 -124 ) ( -429 335 -124 ) ( -418 324 -124 ) subway/1_static_tv 32 0 47 1 1 0 16777216 0 +} +// brush 4 +{ +( -394 368 -156 ) ( -394 368 -140 ) ( -428 334 -140 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -411 354 -156 ) ( -411 354 -140 ) ( -399 342 -140 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -408 351 -156 ) ( -408 351 -140 ) ( -374 385 -140 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -384 358 -156 ) ( -384 358 -140 ) ( -395 369 -140 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -418 324 -124 ) ( -429 335 -124 ) ( -395 369 -124 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -395 369 -156 ) ( -429 335 -156 ) ( -418 324 -156 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +} +} +// entity 131 +{ +"target" "toptv" +"classname" "func_breakable_brush" +"count" "6" +"mass" "2" +"health" "45" +"material" "8" +"surfaceType" "28" +// brush 0 +{ +( -421 734 -124 ) ( -392 706 -124 ) ( -392 706 -156 ) subway/1_static1 0 0 0 1 1 0 4096 20 +( -378 751 -124 ) ( -406 723 -124 ) ( -406 723 -156 ) subway/1_static1 0 0 0 1 1 0 4096 20 +( -370 728 -124 ) ( -398 757 -124 ) ( -398 757 -156 ) subway/1_static1 0 0 0 1 1 0 4096 20 +( -395 708 -124 ) ( -367 737 -124 ) ( -367 737 -156 ) subway/1_static1 0 0 0 0.500000 0.500000 0 536875008 2900 +( -392 706 -124 ) ( -421 734 -124 ) ( -392 762 -124 ) subway/1_static1 0 0 0 1 1 0 4096 20 +( -392 762 -156 ) ( -421 734 -156 ) ( -392 706 -156 ) subway/1_static1 0 0 0 1 1 0 4096 20 +} +// brush 1 +{ +( -428 738 -140 ) ( -394 704 -140 ) ( -394 704 -156 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -399 730 -140 ) ( -411 718 -140 ) ( -411 718 -156 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -374 687 -140 ) ( -408 721 -140 ) ( -408 721 -156 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -395 703 -140 ) ( -384 714 -140 ) ( -384 714 -156 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -395 703 -124 ) ( -429 737 -124 ) ( -418 748 -124 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -418 748 -156 ) ( -429 737 -156 ) ( -395 703 -156 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +} +// brush 2 +{ +( -419 747 -158 ) ( -430 735 -158 ) ( -396 701 -158 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -395 703 -156 ) ( -429 737 -156 ) ( -418 748 -156 ) subway/1_static_tv 32 0 -48 1 1 0 16777216 0 +( -395 703 -172 ) ( -384 714 -172 ) ( -384 714 -188 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -363 724 -172 ) ( -396 758 -172 ) ( -396 758 -188 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -404 725 -172 ) ( -415 714 -172 ) ( -415 714 -188 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -428 738 -172 ) ( -394 704 -172 ) ( -394 704 -188 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +} +// brush 3 +{ +( -401 759 -140 ) ( -367 725 -140 ) ( -367 725 -156 ) subway/metal_clean 0 0 0 1 1 0 16777216 0 +( -374 755 -140 ) ( -385 744 -140 ) ( -385 744 -156 ) subway/metal_clean 0 0 0 1 1 0 16777216 0 +( -353 714 -140 ) ( -387 748 -140 ) ( -387 748 -156 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -370 728 -140 ) ( -358 740 -140 ) ( -358 740 -156 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -370 728 -124 ) ( -404 762 -124 ) ( -392 773 -124 ) subway/metal_clean 0 0 0 1 1 0 16777216 0 +( -392 773 -156 ) ( -404 762 -156 ) ( -370 728 -156 ) subway/metal_clean 0 0 0 1 1 0 16777216 0 +} +// brush 4 +{ +( -428 738 -136 ) ( -394 704 -136 ) ( -394 704 -152 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -399 730 -136 ) ( -411 718 -136 ) ( -411 718 -152 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -363 724 -136 ) ( -396 758 -136 ) ( -396 758 -152 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -395 703 -136 ) ( -384 714 -136 ) ( -384 714 -152 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -395 703 -122 ) ( -429 737 -122 ) ( -418 748 -122 ) subway/1_static_tv 32 0 0 1 1 0 16777216 0 +( -418 748 -124 ) ( -429 737 -124 ) ( -395 703 -124 ) subway/1_static_tv 32 0 -48 1 1 0 16777216 0 +} +} +// entity 132 +{ +"origin" "640 -492 -168" +"targetname" "tokenlocked2" +"classname" "trigger_relay" +"sp_message" "25627" +} +// entity 133 +{ +"wait" "4" +"target" "tokenlocked2" +"classname" "trigger_multiple" +// brush 0 +{ +( 572 16 -168 ) ( 572 16 -136 ) ( 572 -368 -136 ) subway/trigger 24 0 0 1 1 0 144 0 +( 568 -416 -136 ) ( 568 -416 -168 ) ( 576 -416 -168 ) subway/trigger 24 0 0 1 1 0 144 0 +( 576 -1248 -136 ) ( 576 -1248 -168 ) ( 576 -1392 -168 ) subway/trigger 24 0 0 1 1 0 144 0 +( 584 -568 -168 ) ( 576 -568 -168 ) ( 576 -568 -136 ) subway/trigger 24 0 0 1 1 0 144 0 +( 608 -664 -136 ) ( 608 -600 -136 ) ( 672 -600 -136 ) subway/trigger 24 0 0 1 1 0 144 0 +( 672 -600 -216 ) ( 608 -600 -216 ) ( 608 -664 -216 ) subway/trigger 24 0 0 1 1 0 144 0 +} +} +// entity 134 +{ +"angle" "45" +"waitaction1" "CCH_A_FWD_MS_2" +"wait" "-1" +"targetname" "t203" +"origin" "576 -152 -208" +"classname" "path_corner" +} +// entity 135 +{ +"target" "tokendoor2s" +"classname" "trigger_multiple" +"spawnflags" "8" +// brush 0 +{ +( 520 -96 -216 ) ( 496 -96 -216 ) ( 496 -104 -216 ) subway/trigger -16 0 0 1 1 0 144 0 +( 496 -104 -150 ) ( 496 -96 -150 ) ( 520 -96 -150 ) subway/trigger -16 0 0 1 1 0 144 0 +( 496 -112 -184 ) ( 520 -112 -184 ) ( 520 -112 -200 ) subway/trigger -16 -32 0 1 1 0 144 0 +( 520 -104 -134 ) ( 520 -96 -134 ) ( 520 -96 -150 ) subway/trigger 0 -32 0 1 1 0 144 0 +( 520 -98 -134 ) ( 496 -98 -134 ) ( 496 -98 -150 ) subway/trigger -16 -32 0 1 1 0 144 0 +( 496 -96 -184 ) ( 496 -104 -184 ) ( 496 -104 -200 ) subway/trigger 0 -32 0 1 1 0 144 0 +} +} +// entity 136 +{ +"soundName" "DoorNormalMetalGarage" +"classname" "func_door" +"angle" "-1" +"targetname" "tdoor" +"spawnflags" "32" +// brush 0 +{ +( 566 16 -168 ) ( 566 16 -136 ) ( 566 -368 -136 ) subway/w_gardoor3 44 -112 0 1 1 0 16777216 0 +( 562 -416 -136 ) ( 562 -416 -168 ) ( 570 -416 -168 ) subway/w_gardoor3 -86 -112 0 1 1 0 16777216 0 +( 568 -1248 -136 ) ( 568 -1248 -168 ) ( 568 -1392 -168 ) subway/w_gardoor3 44 -112 0 1 1 0 16777216 0 +( 578 -568 -168 ) ( 570 -568 -168 ) ( 570 -568 -136 ) subway/w_gardoor3 -86 -112 0 1 1 0 16777216 0 +( 602 -664 -136 ) ( 602 -600 -136 ) ( 666 -600 -136 ) subway/w_gardoor3 -86 16 0 1 1 0 16777216 0 +( 666 -600 -216 ) ( 602 -600 -216 ) ( 602 -664 -216 ) subway/1_stair_side1 1 8 90 0.500000 0.500000 0 285212672 0 +} +} +// entity 137 +{ +"sp_message" "25627" +"classname" "trigger_multiple" +"spawnflags" "8" +"wait" ".3" +// brush 0 +{ +( -676 1672 -112 ) ( -716 1672 -112 ) ( -716 1600 -112 ) subway/trigger 0 0 0 1 1 0 144 0 +( -716 1600 -24 ) ( -716 1672 -24 ) ( -676 1672 -24 ) subway/trigger 0 0 0 1 1 0 144 0 +( -716 1608 -64 ) ( -676 1608 -64 ) ( -676 1608 -96 ) subway/trigger 0 0 0 1 1 0 144 0 +( -688 1600 -64 ) ( -688 1672 -64 ) ( -688 1672 -96 ) subway/trigger 0 0 0 1 1 0 144 0 +( -676 1672 -64 ) ( -716 1672 -64 ) ( -716 1672 -96 ) subway/trigger 0 0 0 1 1 0 144 0 +( -704 1672 -64 ) ( -704 1600 -64 ) ( -704 1600 -96 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 138 +{ +"target" "endcinematic" +"targetname" "endtsr1" +"count" "3" +"classname" "trigger_counter" +// brush 0 +{ +( 1840 -2192 -376 ) ( 1824 -2192 -376 ) ( 1824 -2208 -376 ) subway/h_cretewall_plain 0 48 0 1 1 0 285212672 0 +( 1824 -2208 -360 ) ( 1824 -2192 -360 ) ( 1840 -2192 -360 ) subway/h_cretewall_plain 0 48 0 1 1 0 285212672 0 +( 1824 -2208 -360 ) ( 1840 -2208 -360 ) ( 1840 -2208 -440 ) subway/h_cretewall_plain 0 24 0 1 1 0 285212672 0 +( 1840 -2208 -360 ) ( 1840 -2192 -360 ) ( 1840 -2192 -440 ) subway/h_cretewall_plain 0 24 0 1 1 0 285212672 0 +( 1840 -2192 -360 ) ( 1824 -2192 -360 ) ( 1824 -2192 -440 ) subway/h_cretewall_plain 0 24 0 1 1 0 285212672 0 +( 1824 -2192 -360 ) ( 1824 -2208 -360 ) ( 1824 -2208 -440 ) subway/h_cretewall_plain 0 24 0 1 1 0 285212672 0 +} +} +// entity 139 +{ +"killtarget" "endtsr1" +"origin" "1848 -1040 -496" +"target" "t201" +"spawnflags" "786448" +"classname" "m_nyc_mskinhead2a" +"targetname" "endspawner2" +} +// entity 140 +{ +"classname" "func_group" +// brush 0 +{ +( 56 -1204 -204 ) ( 56 -1208 -204 ) ( 56 -1208 -252 ) subway/1_concrete_floor -16 120 90 0.500000 0.500000 134217728 16777216 0 +( 122 -1204 -200 ) ( 34 -1204 -200 ) ( 34 -1204 -248 ) subway/1_concrete_floor -15 -84 90 0.500000 0.500000 134217728 16777216 0 +( 58 -1204 -234 ) ( 58 -1208 -234 ) ( 58 -1208 -198 ) subway/1_concrete_floor -16 120 90 0.500000 0.500000 134217728 16777216 0 +( -26 -1208 -200 ) ( 62 -1208 -200 ) ( 62 -1208 -248 ) subway/1_concrete_floor -15 -84 90 0.500000 0.500000 134217728 16777216 0 +( 58 -1204 -198 ) ( 58 -1208 -198 ) ( 56 -1208 -200 ) subway/1_concrete_floor 24 -84 90 0.500000 0.500000 134217728 16777216 0 +( 58 -1208 -234 ) ( 58 -1204 -234 ) ( 56 -1204 -232 ) subway/1_concrete_floor 24 -84 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1 +{ +( -8 -1208 -200 ) ( -8 -1204 -200 ) ( -10 -1204 -198 ) subway/1_concrete_floor -48 -120 0 0.500000 0.500000 134217728 16777216 0 +( 122 -1204 -196 ) ( 34 -1204 -196 ) ( 34 -1204 -244 ) subway/1_concrete_floor -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 56 -1204 -200 ) ( 56 -1208 -200 ) ( 58 -1208 -198 ) subway/1_concrete_floor -48 -120 0 0.500000 0.500000 134217728 16777216 0 +( -26 -1208 -196 ) ( 62 -1208 -196 ) ( 62 -1208 -244 ) subway/1_concrete_floor -48 48 0 0.500000 0.500000 134217728 16777216 0 +( 36 -1208 -198 ) ( 36 -1204 -198 ) ( 124 -1204 -198 ) subway/1_concrete_floor -48 -120 0 0.500000 0.500000 134217728 16777216 0 +( 56 -1208 -200 ) ( 56 -1204 -200 ) ( -8 -1204 -200 ) subway/1_concrete_floor -48 -120 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( -10 -1204 -198 ) ( -10 -1208 -198 ) ( -10 -1208 -234 ) subway/1_concrete_floor -16 120 90 0.500000 0.500000 134217728 16777216 0 +( 56 -1204 -200 ) ( -32 -1204 -200 ) ( -32 -1204 -248 ) subway/1_concrete_floor -15 -80 90 0.500000 0.500000 134217728 16777216 0 +( -8 -1208 -200 ) ( -8 -1204 -200 ) ( -8 -1204 -248 ) subway/1_concrete_floor -16 120 90 0.500000 0.500000 134217728 16777216 0 +( -92 -1208 -200 ) ( -4 -1208 -200 ) ( -4 -1208 -248 ) subway/1_concrete_floor -15 -80 90 0.500000 0.500000 134217728 16777216 0 +( -10 -1208 -198 ) ( -10 -1204 -198 ) ( -8 -1204 -200 ) subway/1_concrete_floor 24 -80 90 0.500000 0.500000 134217728 16777216 0 +( -10 -1204 -234 ) ( -10 -1208 -234 ) ( -8 -1208 -232 ) subway/1_concrete_floor 24 -80 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 3 +{ +( 96 -1184 -232 ) ( 0 -1184 -232 ) ( 0 -1208 -232 ) subway/sign6 0 0 0 0.500000 0.500000 134217728 0 0 +( 0 -1208 -200 ) ( 0 -1184 -200 ) ( 96 -1184 -200 ) subway/sign6 0 0 0 0.500000 0.500000 134217728 0 0 +( 0 -1208 -200 ) ( 96 -1208 -200 ) ( 96 -1208 -256 ) subway/sign6 0 -32 0 0.500000 0.500000 134217728 0 0 +( 56 -1208 -200 ) ( 56 -1184 -200 ) ( 56 -1184 -256 ) subway/sign6 64 -32 0 0.500000 0.500000 134217728 0 0 +( 96 -1206 -200 ) ( 0 -1206 -200 ) ( 0 -1206 -256 ) subway/sign6 112 -16 0 -0.500000 0.500000 134217728 0 0 +( -8 -1184 -200 ) ( -8 -1208 -200 ) ( -8 -1208 -256 ) subway/sign6 64 -32 0 0.500000 0.500000 134217728 0 0 +} +// brush 4 +{ +( 128 -1204 -234 ) ( 40 -1204 -234 ) ( 40 -1208 -234 ) subway/1_concrete_floor -48 -120 0 0.500000 0.500000 134217728 16777216 0 +( 56 -1204 -232 ) ( 56 -1208 -232 ) ( -8 -1208 -232 ) subway/1_concrete_floor -48 -120 0 0.500000 0.500000 134217728 16777216 0 +( -26 -1208 -230 ) ( 62 -1208 -230 ) ( 62 -1208 -278 ) subway/1_concrete_floor -48 108 0 0.500000 0.500000 134217728 16777216 0 +( 56 -1208 -232 ) ( 56 -1204 -232 ) ( 58 -1204 -234 ) subway/1_concrete_floor -48 -60 0 0.500000 0.500000 134217728 16777216 0 +( -10 -1204 -232 ) ( -10 -1204 -234 ) ( 58 -1204 -234 ) subway/1_concrete_floor -48 108 0 0.500000 0.500000 134217728 16777216 0 +( -8 -1204 -232 ) ( -8 -1208 -232 ) ( -10 -1208 -234 ) subway/1_concrete_floor -48 -60 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 141 +{ +"origin" "-2168 464 208" +"spawnflags" "30" +"targetname" "lastjohn" +"classname" "m_x_mcharacter" +"angle" "315" +} +// entity 142 +{ +"classname" "info_notnull" +"targetname" "swatnull" +"origin" "316 964 -124" +} +// entity 143 +{ +"classname" "info_notnull" +"targetname" "lastcam2n" +"origin" "-2140 252 104" +} +// entity 144 +{ +"classname" "func_remote_camera" +"origin" "-2184 124 36" +"volume" "2" +"targetname" "lastcam2" +"target" "lastcam2n" +} +// entity 145 +{ +"origin" "-2152 536 228" +"targetname" "lastcam1n" +"classname" "info_notnull" +} +// entity 146 +{ +"origin" "-2138 492 216" +"target" "lastcam1n" +"targetname" "lastcam1" +"classname" "func_remote_camera" +"volume" "2" +} +// entity 147 +{ +"origin" "-2120 464 208" +"targetname" "lasthawk" +"classname" "m_x_mmerc" +"angle" "200" +"spawnflags" "30" +} +// entity 148 +{ +"spawnflags" "4" +"volume" "2" +"origin" "640 1008 -144" +"target" "introcam7n" +"targetname" "introcam7" +"classname" "func_remote_camera" +} +// entity 149 +{ +"origin" "1832 -1736 -488" +"spawnflags" "22" +"targetname" "endhawk2" +"classname" "m_x_mmerc" +} +// entity 150 +{ +"angle" "90" +"origin" "1832 -1824 -488" +"spawnflags" "22" +"targetname" "endjohn2" +"classname" "m_x_mcharacter" +} +// entity 151 +{ +"origin" "1832 -1824 -484" +"targetname" "endcam4n" +"classname" "info_notnull" +} +// entity 152 +{ +"spawnflags" "2" +"origin" "1832 -1848 -484" +"target" "endcam4n" +"targetname" "endcam4" +"volume" "2" +"classname" "func_remote_camera" +} +// entity 153 +{ +"classname" "info_notnull" +"origin" "1822 -1874 -476" +"targetname" "endcam2n" +} +// entity 154 +{ +"spawnflags" "2" +"classname" "func_remote_camera" +"volume" "2" +"targetname" "endcam2" +"origin" "1816 -1882 -476" +"target" "endcam2n" +} +// entity 155 +{ +"classname" "script_runner" +"targetname" "endcinematicb" +"script" "tsr1/endcin" +"origin" "1744 -2368 -424" +} +// entity 156 +{ +"classname" "m_x_mcharacter" +"origin" "1832 -1880 -496" +"spawnflags" "22" +"targetname" "endjohn1" +"angle" "90" +} +// entity 157 +{ +"classname" "m_x_mmerc" +"angle" "270" +"spawnflags" "524310" +"origin" "1832 -1312 -496" +"targetname" "endhawk1" +} +// entity 158 +{ +"classname" "info_notnull" +"origin" "1836 -1540 -484" +"targetname" "endcam1n" +} +// entity 159 +{ +"spawnflags" "2" +"classname" "func_remote_camera" +"origin" "1836 -1548 -484" +"targetname" "endcam1" +"target" "endcam1n" +"volume" "2" +} +// entity 160 +{ +"classname" "script_runner" +"script" "tsr1/etrainset" +"targetname" "t45" +"origin" "1752 1208 -384" +} +// entity 161 +{ +"classname" "m_nyc_mskinhead1" +"angle" "180" +"origin" "1912 1024 -360" +"spawnflags" "262160" +"targetname" "rtskinhead1" +} +// entity 162 +{ +"classname" "info_notnull" +"targetname" "introswatcamn" +"origin" "344 1168 -132" +} +// entity 163 +{ +"classname" "func_remote_camera" +"targetname" "introswatcam" +"target" "introswatcamn" +"volume" "2" +"origin" "344 952 -152" +} +// entity 164 +{ +"angle" "270" +"classname" "m_nyc_mskinhead2a" +"targetname" "introswatkiller" +"spawnflags" "30" +"origin" "160 1448 -128" +} +// entity 165 +{ +"classname" "m_nyc_mswat" +"angle" "270" +"spawnflags" "32793" +"targetname" "introdeadswat" +"origin" "320 1216 -128" +} +// entity 166 +{ +"targetname" "introcam5n" +"origin" "-1988 148 284" +"classname" "info_notnull" +} +// entity 167 +{ +"volume" "2" +"spawnflags" "10" +"target" "introcam5n" +"targetname" "introcam5" +"origin" "-1988 132 284" +"classname" "func_remote_camera" +} +// entity 168 +{ +"classname" "info_notnull" +"origin" "-1916 244 196" +"targetname" "introcam4n" +} +// entity 169 +{ +"spawnflags" "6" +"classname" "func_remote_camera" +"origin" "-2036 180 212" +"targetname" "introcam4" +"target" "introcam4n" +"volume" "2" +} +// entity 170 +{ +"classname" "m_x_mcharacter" +"spawnflags" "2138" +"origin" "-2008 168 192" +"angle" "45" +"targetname" "introjohn" +} +// entity 171 +{ +"classname" "m_x_mmerc" +"angle" "360" +"origin" "-2032 208 192" +"spawnflags" "90" +"targetname" "introhawk" +} +// entity 172 +{ +"classname" "info_notnull" +"targetname" "introcam1n" +"origin" "-2500 40 408" +} +// entity 173 +{ +"target" "t241" +"classname" "trigger_once" +// brush 0 +{ +( 832 784 -216 ) ( 824 784 -216 ) ( 824 736 -216 ) subway/trigger 0 0 0 1 1 0 144 0 +( 824 736 -64 ) ( 824 784 -64 ) ( 832 784 -64 ) subway/trigger 0 0 0 1 1 0 144 0 +( 840 632 -120 ) ( 848 632 -120 ) ( 848 632 -208 ) subway/trigger 0 0 0 1 1 0 144 0 +( 832 728 -120 ) ( 832 776 -120 ) ( 832 776 -208 ) subway/trigger -40 0 0 1 1 0 144 0 +( 832 792 -120 ) ( 824 792 -120 ) ( 824 792 -208 ) subway/trigger 0 0 0 1 1 0 144 0 +( 824 816 -120 ) ( 824 768 -120 ) ( 824 768 -208 ) subway/trigger -40 0 0 1 1 0 144 0 +} +} +// entity 174 +{ +"classname" "environ_explosion" +"spawnflags" "2" +"origin" "1344 -1912 -488" +"targetname" "endexplosion1" +} +// entity 175 +{ +"target" "endwave1b" +"classname" "trigger_once" +// brush 0 +{ +( 1792 -1536 -552 ) ( 1728 -1536 -552 ) ( 1728 -1552 -552 ) subway/trigger -16 -16 0 1 1 0 144 0 +( 1712 -1552 -288 ) ( 1712 -1536 -288 ) ( 1776 -1536 -288 ) subway/trigger -16 -16 0 1 1 0 144 0 +( 1712 -1544 -288 ) ( 1776 -1544 -288 ) ( 1776 -1544 -304 ) subway/trigger -16 0 0 1 1 0 144 0 +( 2000 -1552 -288 ) ( 2000 -1536 -288 ) ( 2000 -1536 -304 ) subway/trigger 16 0 0 1 1 0 144 0 +( 1776 -1536 -288 ) ( 1712 -1536 -288 ) ( 1712 -1536 -304 ) subway/trigger -16 0 0 1 1 0 144 0 +( 1680 -1536 -288 ) ( 1680 -1552 -288 ) ( 1680 -1552 -304 ) subway/trigger 16 0 0 1 1 0 144 0 +} +} +// entity 176 +{ +"origin" "1832 -1408 -512" +"targetname" "t190" +"classname" "point_combat" +} +// entity 177 +{ +"angle" "270" +"killtarget" "endtsr1" +"spawnflags" "786448" +"target" "t190" +"targetname" "endleftguy" +"origin" "1832 -1200 -496" +"classname" "m_nyc_mskinhead2a" +} +// entity 178 +{ +"origin" "1832 -1176 -528" +"targetname" "t189" +"classname" "point_combat" +} +// entity 179 +{ +"killtarget" "endtsr1" +"targetname" "endrightguy" +"origin" "1832 -848 -496" +"target" "t189" +"spawnflags" "786448" +"angle" "180" +"classname" "m_nyc_mskinhead1" +} +// entity 180 +{ +"wait" "-1" +"classname" "path_corner" +"WaitAction1" "CCH_XONKNEES_N_N_N" +"targetname" "t187" +"angle" "270" +"origin" "512 1096 -160" +} +// entity 181 +{ +"classname" "m_nyc_estockbroker" +"angle" "270" +"targetname" "introhostage2" +"target" "t187" +"spawnflags" "30" +"origin" "512 1096 -120" +} +// entity 182 +{ +"wait" "-1" +"classname" "path_corner" +"WaitAction1" "CCH_XONKNEES_N_N_N" +"targetname" "t186" +"angle" "270" +"origin" "544 1082 -160" +} +// entity 183 +{ +"classname" "m_nyc_etourist" +"target" "t186" +"angle" "270" +"origin" "544 1082 -128" +"targetname" "introhostage1" +"spawnflags" "30" +} +// entity 184 +{ +"angle" "70" +"alertradius" "1" +"classname" "m_nyc_mskinhead2a" +"targetname" "walkinguy" +"spawnflags" "30" +"origin" "580 1008 -128" +} +// entity 185 +{ +"classname" "info_notnull" +"origin" "660 964 -148" +"targetname" "introcam2n" +} +// entity 186 +{ +"spawnflags" "4" +"classname" "func_remote_camera" +"origin" "668 960 -148" +"targetname" "introcam2" +"target" "introcam2n" +"volume" "2" +} +// entity 187 +{ +"classname" "m_x_mskinboss" +"angle" "260" +"targetname" "sabre1" +"spawnflags" "30" +"origin" "600 1096 -128" +} +// entity 188 +{ +"origin" "-2516 40 412" +"targetname" "introcam1" +"target" "introcam1n" +"classname" "func_remote_camera" +"spawnflags" "10" +"volume" "2" +} +// entity 189 +{ +"origin" "1756 1964 -356" +"targetname" "rcam1n" +"classname" "info_notnull" +} +// entity 190 +{ +"volume" "2" +"origin" "1756 1980 -356" +"target" "rcam1n" +"targetname" "rcam1" +"classname" "func_remote_camera" +} +// entity 191 +{ +"targetname" "leader" +"origin" "1752 1880 -352" +"spawnflags" "54" +"angle" "90" +"classname" "m_x_mskinboss" +} +// entity 192 +{ +"target" "t231" +"origin" "2048 2744 -288" +"spawnflags" "22" +"targetname" "rswat1" +"angle" "270" +"classname" "m_nyc_mswatleader" +} +// entity 193 +{ +"origin" "2200 2464 -272" +"script" "tsr1/raid" +"targetname" "t183" +"classname" "script_runner" +} +// entity 194 +{ +"target" "t183" +"classname" "trigger_once" +// brush 0 +{ +( 2328 2246 -336 ) ( 2328 2256 -336 ) ( 2144 2256 -336 ) subway/trigger 0 -8 0 1 1 0 144 0 +( 2328 2256 -216 ) ( 2328 2246 -216 ) ( 2144 2246 -216 ) subway/trigger 0 -8 0 1 1 0 144 0 +( 2320 2248 -224 ) ( 2320 2248 -384 ) ( 2136 2248 -384 ) subway/trigger 0 0 0 1 1 0 144 0 +( 2328 2248 -264 ) ( 2328 2256 -264 ) ( 2328 2256 -320 ) subway/trigger 8 0 0 1 1 0 144 0 +( 2328 2256 -384 ) ( 2328 2256 -224 ) ( 2144 2256 -224 ) subway/trigger 0 0 0 1 1 0 144 0 +( 2152 2128 -264 ) ( 2152 2120 -264 ) ( 2152 2120 -320 ) subway/trigger 8 0 0 1 1 0 144 0 +} +} +// entity 195 +{ +"origin" "1976 1984 -376" +"script" "tsr1/endstepsa" +"targetname" "t182" +"classname" "script_runner" +} +// entity 196 +{ +"target" "t182" +"classname" "trigger_once" +// brush 0 +{ +( 2032 2104 -448 ) ( 1920 2104 -448 ) ( 1920 2096 -448 ) subway/trigger -8 16 0 1 1 0 144 0 +( 1920 2096 -280 ) ( 1920 2104 -280 ) ( 2032 2104 -280 ) subway/trigger -8 16 0 1 1 0 144 0 +( 1920 2096 -352 ) ( 2032 2096 -352 ) ( 2032 2096 -384 ) subway/trigger -8 0 0 1 1 0 144 0 +( 2040 2096 -352 ) ( 2040 2104 -352 ) ( 2040 2104 -384 ) subway/trigger -16 0 0 1 1 0 144 0 +( 2032 2104 -352 ) ( 1920 2104 -352 ) ( 1920 2104 -384 ) subway/trigger -8 0 0 1 1 0 144 0 +( 1912 2104 -352 ) ( 1912 2096 -352 ) ( 1912 2096 -384 ) subway/trigger -16 0 0 1 1 0 144 0 +} +} +// entity 197 +{ +"classname" "script_runner" +"targetname" "t180" +"script" "tsr1/bummurder" +"origin" "824 216 -472" +} +// entity 198 +{ +"classname" "trigger_once" +"target" "t180" +// brush 0 +{ +( 832 168 -528 ) ( 760 168 -528 ) ( 760 160 -528 ) subway/trigger 0 0 0 1 1 0 144 0 +( 752 160 -352 ) ( 752 168 -352 ) ( 824 168 -352 ) subway/trigger 0 0 0 1 1 0 144 0 +( 760 160 -496 ) ( 832 160 -496 ) ( 832 160 -520 ) subway/trigger 0 0 0 1 1 0 144 0 +( 864 160 -440 ) ( 864 168 -440 ) ( 864 168 -464 ) subway/trigger 0 0 0 1 1 0 144 0 +( 832 168 -440 ) ( 760 168 -440 ) ( 760 168 -464 ) subway/trigger 0 0 0 1 1 0 144 0 +( 688 176 -496 ) ( 688 168 -496 ) ( 688 168 -520 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 199 +{ +"classname" "m_nyc_mskinhead2a" +"targetname" "bumkiller" +"angle" "270" +"origin" "1136 768 -488" +"spawnflags" "6" +} +// entity 200 +{ +"classname" "path_corner" +"wait" "-1" +"waitaction1" "std_xfearwave_n_n_n" +"origin" "960 336 -528" +"waitaction2" "std_xfearwave_n_n_n" +"targetname" "t178" +} +// entity 201 +{ +"classname" "misc_generic_barrel_burning" +"origin" "906 282 -524" +"light" "105" +"spawnflags" "4" +} +// entity 202 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"light" "90" +"origin" "588 -648 -400" +} +// entity 203 +{ +"origin" "1528 824 -176" +"script" "tsr1/lhostageb" +"targetname" "lhostageb2" +"classname" "script_runner" +} +// entity 204 +{ +"angle" "180" +"waitaction5" "std_Ipiss_n_a_a" +"waitaction4" "std_Itouchnuts_n_a_n" +"waitaction3" "std_Ipiss_n_a_a" +"waitaction2" "std_Ipiss_n_a_a" +"waitaction1" "std_Ipiss_n_a_a" +"origin" "1264 1432 -208" +"wait" "-1" +"targetname" "t175" +"classname" "path_corner" +} +// entity 205 +{ +"angle" "180" +"targetname" "pissguy" +"spawnflags" "134" +"origin" "1264 1432 -176" +"target" "t175" +"classname" "m_nyc_mskinhead2a" +} +// entity 206 +{ +"classname" "script_runner" +"targetname" "t173" +"script" "tsr1/endtunnel" +"origin" "1808 -1848 -376" +} +// entity 207 +{ +"origin" "1152 880 -168" +"targetname" "t58" +"script" "tsr1/stall" +"classname" "script_runner" +} +// entity 208 +{ +"origin" "-176 1464 -120" +"spawnflags" "22" +"targetname" "closetguy" +"angle" "360" +"classname" "m_nyc_mskinhead2a" +} +// entity 209 +{ +"light" "95" +"origin" "1808 2168 -520" +"_color" ".922000 0.501961 0.250980" +"classname" "light" +} +// entity 210 +{ +"origin" "1936 1976 -304" +"light" "105" +"_color" ".950000 0.945098 0.793137" +"classname" "light" +} +// entity 211 +{ +"sp_message" "25627" +"classname" "trigger_relay" +"targetname" "locked" +"origin" "232 144 -168" +} +// entity 212 +{ +"spawnflags" "8" +"classname" "trigger_multiple" +"target" "locked" +"wait" "4" +// brush 0 +{ +( 264 112 -216 ) ( 200 112 -216 ) ( 200 104 -216 ) subway/trigger 0 -8 0 1 1 0 144 0 +( 200 104 -128 ) ( 200 112 -128 ) ( 264 112 -128 ) subway/trigger 0 -8 0 1 1 0 144 0 +( 200 104 -128 ) ( 264 104 -128 ) ( 264 104 -216 ) subway/trigger 0 0 0 1 1 0 144 0 +( 264 104 -128 ) ( 264 112 -128 ) ( 264 112 -216 ) subway/trigger 8 0 0 1 1 0 144 0 +( 264 112 -128 ) ( 200 112 -128 ) ( 200 112 -216 ) subway/trigger 0 0 0 1 1 0 144 0 +( 200 112 -128 ) ( 200 104 -128 ) ( 200 104 -216 ) subway/trigger 8 0 0 1 1 0 144 0 +} +} +// entity 213 +{ +"origin" "1008 1240 -496" +"spawnflags" "16388" +"angle" "360" +"classname" "m_nyc_ebum" +} +// entity 214 +{ +"spawnflags" "6" +"origin" "984 360 -496" +"angle" "45" +"classname" "m_nyc_ebum" +"target" "t178" +"targetname" "deadbum" +} +// entity 215 +{ +"target" "trainvictim1" +"targetname" "t167" +"origin" "240 -552 -448" +"classname" "trigger_relay" +} +// entity 216 +{ +"target" "t167" +"classname" "trigger_once" +// brush 0 +{ +( 320 -488 -480 ) ( 216 -488 -480 ) ( 216 -496 -480 ) subway/trigger 0 24 0 1 1 0 144 0 +( 216 -496 -400 ) ( 216 -488 -400 ) ( 320 -488 -400 ) subway/trigger 0 24 0 1 1 0 144 0 +( 216 -496 -416 ) ( 320 -496 -416 ) ( 320 -496 -464 ) subway/trigger 0 0 0 1 1 0 144 0 +( 320 -496 -416 ) ( 320 -488 -416 ) ( 320 -488 -464 ) subway/trigger -24 0 0 1 1 0 144 0 +( 320 -488 -416 ) ( 216 -488 -416 ) ( 216 -488 -464 ) subway/trigger 0 0 0 1 1 0 144 0 +( 192 -488 -416 ) ( 192 -496 -416 ) ( 192 -496 -464 ) subway/trigger -24 0 0 1 1 0 144 0 +} +} +// entity 217 +{ +"soundName" "CityStreet" +"origin" "-1916 -292 212" +"classname" "environ_soundgen" +} +// entity 218 +{ +"classname" "light" +"_color" "0.925490 1.000000 1.000000" +"light" "100" +"origin" "-176 1464 -64" +} +// entity 219 +{ +"target" "t165" +"classname" "trigger_once" +// brush 0 +{ +( 1256 2432 -536 ) ( 1208 2432 -536 ) ( 1208 2392 -536 ) subway/trigger -40 32 0 1 1 0 144 0 +( 1208 2392 -440 ) ( 1208 2432 -440 ) ( 1256 2432 -440 ) subway/trigger -40 32 0 1 1 0 144 0 +( 1216 2344 -456 ) ( 1264 2344 -456 ) ( 1264 2344 -536 ) subway/trigger -40 -8 0 1 1 0 144 0 +( 1224 2392 -456 ) ( 1224 2432 -456 ) ( 1224 2432 -536 ) subway/trigger -16 -8 0 1 1 0 144 0 +( 1248 2464 -456 ) ( 1200 2464 -456 ) ( 1200 2464 -536 ) subway/trigger -40 -8 0 1 1 0 144 0 +( 1216 2432 -456 ) ( 1216 2392 -456 ) ( 1216 2392 -536 ) subway/trigger -16 -8 0 1 1 0 144 0 +} +} +// entity 220 +{ +"script" "tsr1/swat1" +"origin" "1288 2364 -496" +"targetname" "t165" +"classname" "script_runner" +} +// entity 221 +{ +"origin" "2144 1944 -360" +"classname" "_point_lean" +} +// entity 222 +{ +"origin" "2000 1936 -416" +"targetname" "t162" +"angle" "90" +"classname" "point_combat" +} +// entity 223 +{ +"classname" "trigger_once" +"target" "t122" +// brush 0 +{ +( 208 288 -208 ) ( 192 288 -208 ) ( 192 272 -208 ) subway/trigger -32 0 0 1 1 0 144 0 +( 192 272 -96 ) ( 192 288 -96 ) ( 208 288 -96 ) subway/trigger -32 0 0 1 1 0 144 0 +( 216 104 -128 ) ( 232 104 -128 ) ( 232 104 -160 ) subway/trigger -32 0 0 1 1 0 144 0 +( 264 264 -128 ) ( 264 280 -128 ) ( 264 280 -160 ) subway/trigger 0 0 0 1 1 0 144 0 +( 208 320 -128 ) ( 192 320 -128 ) ( 192 320 -160 ) subway/trigger -32 0 0 1 1 0 144 0 +( 200 288 -128 ) ( 200 272 -128 ) ( 200 272 -160 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 224 +{ +"killtarget" "topstairguy1" +"targetname" "topstairbad1" +"classname" "m_nyc_mskinhead1" +"spawnflags" "6" +"angle" "360" +"origin" "960 440 -168" +} +// entity 225 +{ +"classname" "trigger_once" +"target" "t159" +// brush 0 +{ +( 664 592 -168 ) ( 544 592 -168 ) ( 544 536 -168 ) subway/trigger -16 32 0 1 1 0 144 0 +( 536 536 -48 ) ( 536 592 -48 ) ( 656 592 -48 ) subway/trigger -16 32 0 1 1 0 144 0 +( 536 536 -88 ) ( 656 536 -88 ) ( 656 536 -136 ) subway/trigger -16 -16 0 1 1 0 144 0 +( 696 536 -88 ) ( 696 592 -88 ) ( 696 592 -136 ) subway/trigger -32 -16 0 1 1 0 144 0 +( 656 544 -88 ) ( 536 544 -88 ) ( 536 544 -136 ) subway/trigger -16 -16 0 1 1 0 144 0 +( 528 608 -88 ) ( 528 552 -88 ) ( 528 552 -136 ) subway/trigger -32 -16 0 1 1 0 144 0 +} +} +// entity 226 +{ +"classname" "script_runner" +"targetname" "t159" +"script" "tsr1/stairstoken" +"origin" "584 400 -128" +} +// entity 227 +{ +"classname" "m_nyc_mpolitician" +"origin" "1024 432 -168" +"targetname" "topstairguy1" +"spawnflags" "16390" +"angle" "180" +} +// entity 228 +{ +"classname" "script_runner" +"targetname" "t124" +"script" "tsr1/introstairs" +"origin" "-600 1368 40" +} +// entity 229 +{ +"classname" "trigger_once" +// brush 0 +{ +( 1224 1104 -216 ) ( 1216 1104 -216 ) ( 1216 1032 -216 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1216 1032 -128 ) ( 1216 1104 -128 ) ( 1224 1104 -128 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1216 1032 -128 ) ( 1224 1032 -128 ) ( 1224 1032 -168 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1224 1032 -128 ) ( 1224 1104 -128 ) ( 1224 1104 -168 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1224 1104 -128 ) ( 1216 1104 -128 ) ( 1216 1104 -168 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1216 1104 -128 ) ( 1216 1032 -128 ) ( 1216 1032 -168 ) subway/trigger -40 0 0 1 1 0 144 0 +} +} +// entity 230 +{ +"target" "t157" +"targetname" "t156" +"origin" "-136 -296 -472" +"classname" "point_combat" +} +// entity 231 +{ +"origin" "-184 -648 -392" +"targetname" "t155" +"classname" "point_combat" +} +// entity 232 +{ +"classname" "path_corner" +"origin" "640 216 -208" +"targetname" "t149" +"target" "t150" +"MoveAction" "std_rafraid_n_n_n" +} +// entity 233 +{ +"classname" "point_combat" +"origin" "1240 -88 -192" +"targetname" "t136" +"target" "t148" +} +// entity 234 +{ +"classname" "point_combat" +"targetname" "t146" +"angle" "180" +"origin" "520 224 -200" +"spawnflags" "0" +} +// entity 235 +{ +"origin" "-336 -1280 -312" +"targetname" "t144" +"classname" "point_combat" +"angle" "360" +"target" "t220" +} +// entity 236 +{ +"origin" "-488 1576 -104" +"targetname" "t143" +"angle" "270" +"classname" "point_combat" +} +// entity 237 +{ +"wait" "-1" +"classname" "path_corner" +"targetname" "t142" +"WaitAction1" "LS_XGETKICKED_N_N_N" +"angle" "90" +"origin" "-240 480 -208" +} +// entity 238 +{ +"classname" "path_corner" +"wait" "-1" +"targetname" "t141" +"origin" "-72 632 -200" +"WaitAction1" "CCH_XONKNEES_N_N_N" +"angle" "180" +} +// entity 239 +{ +"target" "t238" +"classname" "m_nyc_mskinhead2a" +"targetname" "swatkiller" +"spawnflags" "6" +"origin" "40 1312 -120" +"angle" "180" +} +// entity 240 +{ +"spawnflags" "22" +"targetname" "deadswatguy1" +"origin" "-232 1304 -128" +"classname" "m_nyc_mswat" +} +// entity 241 +{ +"origin" "-24 1440 -128" +"script" "tsr1/closetguy" +"targetname" "t54" +"classname" "script_runner" +} +// entity 242 +{ +"classname" "path_corner" +"targetname" "t135" +"origin" "792 -40 -208" +} +// entity 243 +{ +"classname" "path_corner" +"targetname" "t134" +"target" "t135" +"MoveAction" "std_r_n_mrs_2" +"origin" "736 -88 -208" +} +// entity 244 +{ +"classname" "_point_lean" +"origin" "792 -8 -192" +} +// entity 245 +{ +"classname" "m_nyc_mskinhead1" +"spawnflags" "16" +"targetname" "afterguy" +"target" "t134" +"origin" "736 -88 -176" +} +// entity 246 +{ +"classname" "_point_duck" +"origin" "656 -320 -192" +} +// entity 247 +{ +"classname" "m_nyc_mskinhead1" +"targetname" "tollguy" +"spawnflags" "16" +"origin" "496 -496 -176" +} +// entity 248 +{ +"classname" "trigger_once" +"target" "t130" +// brush 0 +{ +( 1064 -24 -216 ) ( 1008 -24 -216 ) ( 1008 -136 -216 ) subway/trigger -48 0 0 1 1 0 144 0 +( 1008 -136 -104 ) ( 1008 -24 -104 ) ( 1064 -24 -104 ) subway/trigger -48 0 0 1 1 0 144 0 +( 1016 -192 -96 ) ( 1072 -192 -96 ) ( 1072 -192 -216 ) subway/trigger -48 0 0 1 1 0 144 0 +( 1064 -128 -96 ) ( 1064 -16 -96 ) ( 1064 -16 -216 ) subway/trigger 16 0 0 1 1 0 144 0 +( 1064 -16 -96 ) ( 1008 -16 -96 ) ( 1008 -16 -216 ) subway/trigger -48 0 0 1 1 0 144 0 +( 1056 -80 -96 ) ( 1056 -192 -96 ) ( 1056 -192 -216 ) subway/trigger 16 0 0 1 1 0 144 0 +} +} +// entity 249 +{ +"classname" "script_runner" +"targetname" "t130" +"script" "tsr1/token" +"origin" "704 -32 -160" +} +// entity 250 +{ +"WaitAction3" "CCH_XONKNEES_N_N_N" +"WaitAction2" "CCH_XONKNEES_N_N_N" +"origin" "1584 824 -200" +"WaitAction1" "CCH_XONKNEES_N_N_N" +"wait" "-1" +"targetname" "t129" +"classname" "path_corner" +} +// entity 251 +{ +"targetname" "lhostage" +"spawnflags" "16390" +"origin" "1584 824 -168" +"target" "t129" +"classname" "m_nyc_mpolitician" +"angle" "225" +} +// entity 252 +{ +"killtarget" "lhostage" +"targetname" "lbadguy1" +"spawnflags" "6" +"angle" "45" +"origin" "1560 776 -168" +"classname" "m_nyc_mskinhead2a" +} +// entity 253 +{ +"origin" "1448 760 -176" +"script" "tsr1/lhostage" +"targetname" "t128" +"classname" "script_runner" +} +// entity 254 +{ +"target" "t128" +"classname" "trigger_once" +// brush 0 +{ +( 1416 800 -216 ) ( 1328 800 -216 ) ( 1328 712 -216 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1328 712 -128 ) ( 1328 800 -128 ) ( 1416 800 -128 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1328 720 -128 ) ( 1416 720 -128 ) ( 1416 720 -168 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1416 712 -128 ) ( 1416 800 -128 ) ( 1416 800 -168 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1416 824 -128 ) ( 1328 824 -128 ) ( 1328 824 -168 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1328 800 -128 ) ( 1328 712 -128 ) ( 1328 712 -168 ) subway/trigger -40 0 0 1 1 0 144 0 +} +} +// entity 255 +{ +"origin" "640 -592 -472" +"targetname" "t127" +"wait " "-1" +"WaitAction1" "STD_XAFRAIDSHAKE_N_N_N" +"classname" "path_corner" +} +// entity 256 +{ +"origin" "-16 -1120 -224" +"script" "tsr1/sodastairs" +"targetname" "t126" +"classname" "script_runner" +} +// entity 257 +{ +"origin" "120 -872 -232" +"classname" "_point_lean" +} +// entity 258 +{ +"spawnflags" "20" +"targetname" "stairguy1" +"origin" "-176 -1320 -288" +"classname" "m_nyc_mskinhead1" +"angle" "270" +} +// entity 259 +{ +"target" "t126" +"classname" "trigger_once" +// brush 0 +{ +( -48 -936 -184 ) ( -48 -976 -184 ) ( -48 -976 -224 ) subway/trigger 16 -24 0 1 1 0 144 0 +( 112 -1048 -208 ) ( 80 -1048 -208 ) ( 80 -1048 -248 ) subway/trigger 32 -24 0 1 1 0 144 0 +( 112 -1024 -200 ) ( 112 -984 -200 ) ( 112 -984 -240 ) subway/trigger 16 -24 0 1 1 0 144 0 +( 0 -1056 -208 ) ( 32 -1056 -208 ) ( 32 -1056 -248 ) subway/trigger 32 -24 0 1 1 0 144 0 +( 80 -896 -168 ) ( 80 -856 -168 ) ( 112 -856 -168 ) subway/trigger 32 -16 0 1 1 0 144 0 +( 104 -856 -280 ) ( 72 -856 -280 ) ( 72 -896 -280 ) subway/trigger 32 -16 0 1 1 0 144 0 +} +} +// entity 260 +{ +"angle" "45" +"classname" "misc_generic_security_camera" +"origin" "536 562 -74" +"killtarget" "behinducam" +} +// entity 261 +{ +"classname" "info_notnull" +"targetname" "behinducamn" +"origin" "556 588 -68" +} +// entity 262 +{ +"volume" "4" +"target" "behinducamn" +"classname" "func_remote_camera" +"targetname" "behinducam" +"origin" "548 576 -60" +"spawnflags" "4" +} +// entity 263 +{ +"angle" "345" +"classname" "m_nyc_mskinhead2a" +"spawnflags" "16" +"targetname" "cornerlean1" +"origin" "1160 24 -176" +} +// entity 264 +{ +"classname" "_point_lean" +"origin" "696 800 -144" +} +// entity 265 +{ +"classname" "_point_lean" +"origin" "-296 1360 -144" +} +// entity 266 +{ +"classname" "trigger_once" +"target" "t124" +// brush 0 +{ +( -512 1192 -48 ) ( -632 1192 -48 ) ( -632 1184 -48 ) subway/trigger 8 -40 0 1 1 0 144 0 +( -632 1184 128 ) ( -632 1192 128 ) ( -512 1192 128 ) subway/trigger 8 -40 0 1 1 0 144 0 +( -624 1184 0 ) ( -504 1184 0 ) ( -504 1184 -32 ) subway/trigger 8 0 0 1 1 0 144 0 +( -504 1184 0 ) ( -504 1192 0 ) ( -504 1192 -32 ) subway/trigger 40 0 0 1 1 0 144 0 +( -512 1192 0 ) ( -632 1192 0 ) ( -632 1192 -32 ) subway/trigger 8 0 0 1 1 0 144 0 +( -632 1192 0 ) ( -632 1184 0 ) ( -632 1184 -32 ) subway/trigger 40 0 0 1 1 0 144 0 +} +} +// entity 267 +{ +"spawnflags" "2" +"origin" "760 328 -472" +"targetname" "trainexplosion" +"classname" "environ_explosion" +} +// entity 268 +{ +"count" "25" +"origin" "440 -568 -408" +"delay" "1" +"targetname" "shake1" +"classname" "func_camerashake" +} +// entity 269 +{ +"origin" "-136 1400 -144" +"classname" "_point_lean" +} +// entity 270 +{ +"script" "tsr1/hostage" +"origin" "48 640 -112" +"targetname" "t122" +"classname" "script_runner" +} +// entity 271 +{ +"target" "t122" +"classname" "trigger_once" +// brush 0 +{ +( 208 832 -168 ) ( 200 832 -168 ) ( 200 704 -168 ) subway/trigger 0 40 0 1 1 0 144 0 +( 200 704 -48 ) ( 200 832 -48 ) ( 208 832 -48 ) subway/trigger 0 40 0 1 1 0 144 0 +( 168 800 -96 ) ( 176 800 -96 ) ( 176 800 -168 ) subway/trigger 0 0 0 1 1 0 144 0 +( 392 744 -96 ) ( 392 872 -96 ) ( 392 872 -168 ) subway/trigger -40 0 0 1 1 0 144 0 +( 216 808 -96 ) ( 208 808 -96 ) ( 208 808 -168 ) subway/trigger 0 0 0 1 1 0 144 0 +( 232 824 -96 ) ( 232 696 -96 ) ( 232 696 -168 ) subway/trigger -40 0 0 1 1 0 144 0 +} +} +// entity 272 +{ +"targetname" "hostage1" +"origin" "-240 480 -176" +"spawnflags" "16390" +"classname" "m_nyc_mpolitician" +"target" "t142" +"angle" "90" +} +// entity 273 +{ +"classname" "light" +"_color" "0.783465 0.684252 .555555" +"origin" "-1776 128 256" +"light" "65" +} +// entity 274 +{ +"classname" "light" +"_color" "0.992157 1.000000 0.905882" +"light" "80" +"origin" "-2488 8 296" +} +// entity 275 +{ +"classname" "light" +"light" "110" +"_color" "1.000000 0.309804 0.309804" +"origin" "-2016 368 272" +} +// entity 276 +{ +"classname" "light" +"_color" "0.783465 0.684252 .555555" +"light" "80" +"_wait" ".7" +"origin" "-2200 -24 184" +} +// entity 277 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.701961" +"light" "85" +"origin" "-2168 -80 232" +} +// entity 278 +{ +"classname" "misc_generic_car_american" +"skin" "0" +"origin" "-1995 391 181" +"angle" "315" +"spawnflags" "12" +"targetname" "copcar1" +} +// entity 279 +{ +"classname" "light" +"_color" "0.992157 1.000000 0.874510" +"_wait" ".5" +"light" "85" +"origin" "-1783 -408 479" +} +// entity 280 +{ +"classname" "light_generic_street_modern" +"light" "2" +"origin" "-2056 171 378" +} +// entity 281 +{ +"spawnflags" "18" +"origin" "1736 2008 -488" +"targetname" "endtrackguy" +"angle" "90" +"classname" "m_nyc_mskinhead2a" +} +// entity 282 +{ +"origin" "1672 2008 -512" +"classname" "_point_lean" +} +// entity 283 +{ +"targetname" "t115" +"origin" "1376 2336 -488" +"script" "tsr1/swat2" +"classname" "script_runner" +} +// entity 284 +{ +"target" "t115" +"classname" "trigger_once" +// brush 0 +{ +( 1464 2160 -536 ) ( 1352 2160 -536 ) ( 1352 2040 -536 ) subway/trigger -40 -56 0 1 1 0 144 0 +( 1352 2040 -464 ) ( 1352 2160 -464 ) ( 1464 2160 -464 ) subway/trigger -40 -56 0 1 1 0 144 0 +( 1392 2152 -480 ) ( 1504 2152 -480 ) ( 1504 2152 -512 ) subway/trigger -40 -8 0 1 1 0 144 0 +( 1424 2040 -480 ) ( 1424 2160 -480 ) ( 1424 2160 -512 ) subway/trigger 56 -8 0 1 1 0 144 0 +( 1472 2304 -480 ) ( 1360 2304 -480 ) ( 1360 2304 -512 ) subway/trigger -40 -8 0 1 1 0 144 0 +( 1312 2160 -480 ) ( 1312 2040 -480 ) ( 1312 2040 -512 ) subway/trigger 56 -8 0 1 1 0 144 0 +} +} +// entity 285 +{ +"health" "5" +"targetname" "swatguyfront" +"spawnflags" "32790" +"angle" "360" +"origin" "1352 2200 -496" +"classname" "m_nyc_mswat" +} +// entity 286 +{ +"classname" "script_runner" +"origin" "-64 -624 -376" +"script" "tsr1/botsteps" +"targetname" "t64" +} +// entity 287 +{ +"targetname" "bstepsguy" +"spawnflags" "4" +"origin" "1944 1856 -384" +"classname" "m_nyc_mskinhead2a" +"angle" "90" +} +// entity 288 +{ +"target" "t162" +"targetname" "endgl2" +"origin" "2000 2264 -432" +"spawnflags" "20" +"angle" "270" +"classname" "m_nyc_mskinhead1" +} +// entity 289 +{ +"classname" "misc_generic_tv_ceiling" +"targetname" "tokentv" +"origin" "426 -221 -138" +} +// entity 290 +{ +"classname" "m_nyc_mpunk" +"targetname" "roundguy" +"spawnflags" "16" +"origin" "1240 -8 -176" +"target" "t136" +} +// entity 291 +{ +"classname" "m_nyc_etourist" +"spawnflags" "16400" +"targetname" "tokvictim" +"origin" "608 216 -176" +"target" "t149" +} +// entity 292 +{ +"classname" "script_runner" +"targetname" "t110" +"script" "tsr1/intoken" +"origin" "608 -192 -136" +} +// entity 293 +{ +"classname" "trigger_once" +"target" "t110" +"killtarget" "locked" +// brush 0 +{ +( 592 -148 -184 ) ( 588 -148 -184 ) ( 588 -216 -184 ) subway/trigger 44 12 0 1 1 0 144 0 +( 588 -216 -144 ) ( 588 -148 -144 ) ( 592 -148 -144 ) subway/trigger 44 12 0 1 1 0 144 0 +( 588 -320 -148 ) ( 592 -320 -148 ) ( 592 -320 -180 ) subway/trigger 44 0 0 1 1 0 144 0 +( 528 -316 -148 ) ( 528 -248 -148 ) ( 528 -248 -180 ) subway/trigger 4 0 0 1 1 0 144 0 +( 592 -96 -148 ) ( 588 -96 -148 ) ( 588 -96 -180 ) subway/trigger 44 0 0 1 1 0 144 0 +( 524 -92 -148 ) ( 524 -160 -148 ) ( 524 -160 -180 ) subway/trigger 4 0 0 1 1 0 144 0 +} +} +// entity 294 +{ +"classname" "_point_stairs_bottom" +"targetname" "t107" +"target" "t108" +"origin" "864 432 -192" +} +// entity 295 +{ +"classname" "_point_stairs_top" +"origin" "696 432 -144" +"target" "t107" +"targetname" "t108" +} +// entity 296 +{ +"classname" "path_corner" +"targetname" "t106" +"origin" "296 1288 -152" +} +// entity 297 +{ +"classname" "misc_generic_tv_wall" +"origin" "413 -255 -139" +"targetname" "tvthing" +} +// entity 298 +{ +"classname" "path_corner" +"targetname" "t104" +"origin" "728 -760 -520" +} +// entity 299 +{ +"classname" "path_corner" +"targetname" "t103" +"target" "t104" +"origin" "752 -968 -528" +} +// entity 300 +{ +"classname" "path_corner" +"targetname" "t102" +"target" "t103" +"origin" "752 -1192 -528" +} +// entity 301 +{ +"classname" "m_nyc_mskinhead2a" +"angle" "90" +"origin" "752 -1192 -496" +"targetname" "endguy1" +"target" "t102" +"spawnflags" "16" +} +// entity 302 +{ +"classname" "trigger_once" +"target" "endguy1" +// brush 0 +{ +( 656 -696 -480 ) ( 640 -696 -480 ) ( 640 -744 -480 ) subway/trigger 32 0 0 1 1 0 144 0 +( 640 -744 -384 ) ( 640 -696 -384 ) ( 656 -696 -384 ) subway/trigger 32 0 0 1 1 0 144 0 +( 640 -760 -384 ) ( 656 -760 -384 ) ( 656 -760 -488 ) subway/trigger 32 0 0 1 1 0 144 0 +( 648 -744 -384 ) ( 648 -696 -384 ) ( 648 -696 -488 ) subway/trigger 0 0 0 1 1 0 144 0 +( 656 -152 -384 ) ( 640 -152 -384 ) ( 640 -152 -488 ) subway/trigger 32 0 0 1 1 0 144 0 +( 640 -608 -384 ) ( 640 -656 -384 ) ( 640 -656 -488 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 303 +{ +"target" "t127" +"origin" "672 -592 -440" +"targetname" "trainvictim1" +"spawnflags" "22" +"angle" "180" +"classname" "m_nyc_mpolitician" +} +// entity 304 +{ +"script" "tsr1/train1" +"origin" "440 -604 -440" +"targetname" "t160" +"classname" "script_runner" +} +// entity 305 +{ +"origin" "-208 -264 -456" +"classname" "_point_flee" +} +// entity 306 +{ +"angle" "90" +"origin" "32 -352 -440" +"spawnflags" "22" +"classname" "m_nyc_mskinhead2a" +"targetname" "stepsguy1" +} +// entity 307 +{ +"origin" "16 -392 -456" +"classname" "_point_lean" +} +// entity 308 +{ +"classname" "_point_lean" +"origin" "-72 -1200 -304" +} +// entity 309 +{ +"classname" "trigger_once" +"target" "t130" +// brush 0 +{ +( 624 240 -216 ) ( 616 240 -216 ) ( 616 88 -216 ) subway/trigger 16 16 0 1 1 0 144 0 +( 616 88 -96 ) ( 616 240 -96 ) ( 624 240 -96 ) subway/trigger 16 16 0 1 1 0 144 0 +( 616 104 -128 ) ( 624 104 -128 ) ( 624 104 -168 ) subway/trigger 16 0 0 1 1 0 144 0 +( 792 88 -128 ) ( 792 240 -128 ) ( 792 240 -168 ) subway/trigger -16 0 0 1 1 0 144 0 +( 632 112 -128 ) ( 624 112 -128 ) ( 624 112 -168 ) subway/trigger 16 0 0 1 1 0 144 0 +( 600 240 -128 ) ( 600 88 -128 ) ( 600 88 -168 ) subway/trigger -16 0 0 1 1 0 144 0 +} +} +// entity 310 +{ +"classname" "trigger_once" +// brush 0 +{ +( 1288 32 -216 ) ( 1136 32 -216 ) ( 1136 24 -216 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1136 24 -120 ) ( 1136 32 -120 ) ( 1288 32 -120 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1136 24 -184 ) ( 1288 24 -184 ) ( 1288 24 -216 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1288 24 -184 ) ( 1288 32 -184 ) ( 1288 32 -216 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1288 32 -184 ) ( 1136 32 -184 ) ( 1136 32 -216 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1136 32 -184 ) ( 1136 24 -184 ) ( 1136 24 -216 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 311 +{ +"classname" "m_nyc_mskinhead1" +"origin" "864 -104 -176" +"target" "t91" +} +// entity 312 +{ +"target" "t89" +"targetname" "t88" +"origin" "112 1456 -152" +"classname" "path_corner" +"MoveAction" "std_r_n_pk_n" +} +// entity 313 +{ +"target" "t88" +"origin" "80 1456 -128" +"targetname" "runningguy" +"spawnflags" "22" +"angle" "180" +"classname" "m_nyc_mskinhead2a" +} +// entity 314 +{ +"targetname" "t121" +"soundName" "subwayupperlevel" +"origin" "-576 1096 24" +"classname" "func_ambientset" +} +// entity 315 +{ +"light" "90" +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"origin" "1080 1852 -408" +} +// entity 316 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"origin" "808 -576 -388" +"light" "60" +} +// entity 317 +{ +"classname" "_point_cover" +"origin" "560 -648 -456" +} +// entity 318 +{ +"classname" "func_breakable_brush" +"material" "7" +"surfaceType" "37" +// brush 0 +{ +( -131 310 -180 ) ( -131 304 -180 ) ( -130 304 -180 ) subway/glass 0 -12 0 1 1 134217728 620759040 0 +( -130 304 -152 ) ( -131 304 -152 ) ( -131 310 -152 ) subway/glass 0 -12 0 1 1 134217728 620759040 0 +( -116 305 -177 ) ( -116 311 -177 ) ( -116 311 -201 ) subway/glass 12 0 0 1 1 134217728 620759040 0 +( -129 305 -180 ) ( -130 305 -180 ) ( -130 305 -204 ) subway/glass 0 0 0 1 1 134217728 620759040 0 +( -130 310 -180 ) ( -130 304 -180 ) ( -130 304 -204 ) subway/glass 12 0 0 1 1 134217728 620759040 0 +( -131 304 -180 ) ( -130 304 -180 ) ( -130 304 -204 ) subway/glass 0 0 0 1 1 134217728 620759040 0 +} +} +// entity 319 +{ +"classname" "func_breakable_brush" +"material" "7" +"surfaceType" "37" +// brush 0 +{ +( -112 1415 -128 ) ( -112 1414 -128 ) ( -112 1414 -152 ) subway/glass 0 0 0 1 1 134217728 620759040 0 +( -106 1414 -128 ) ( -112 1414 -128 ) ( -112 1414 -152 ) subway/glass 0 0 0 1 1 134217728 620759040 0 +( -111 1413 -128 ) ( -111 1414 -128 ) ( -111 1414 -152 ) subway/glass 0 0 0 1 1 134217728 620759040 0 +( -111 1400 -125 ) ( -105 1400 -125 ) ( -105 1400 -149 ) subway/glass 0 0 0 1 1 134217728 620759040 0 +( -112 1414 -104 ) ( -112 1415 -104 ) ( -106 1415 -104 ) subway/glass 0 0 0 1 1 134217728 620759040 0 +( -106 1415 -132 ) ( -112 1415 -132 ) ( -112 1414 -132 ) subway/glass 0 0 0 1 1 134217728 620759040 0 +} +} +// entity 320 +{ +"classname" "light" +"_color" "1.000000 0.912698 0.813492" +"light" "80" +"origin" "-538 1596 -280" +} +// entity 321 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"light" "80" +"origin" "-784 1600 -184" +} +// entity 322 +{ +"spawnflags" "6" +"classname" "m_nyc_mskinhead2a" +"angle" "270" +"origin" "944 1120 -176" +"targetname" "pissguy2" +} +// entity 323 +{ +"classname" "func_group" +// brush 0 +{ +( 1525 920 -207 ) ( 1529 921 -207 ) ( 1530 918 -143 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1529 921 -207 ) ( 1543 884 -209 ) ( 1544 880 -146 ) subway/1_bath_stalldoor -4 32 1 0.650000 1 134217728 16777216 0 +( 1543 884 -209 ) ( 1539 883 -209 ) ( 1540 879 -146 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1539 883 -209 ) ( 1525 920 -207 ) ( 1527 916 -143 ) subway/1_bath_stalldoor -4 32 1 0.650000 1 134217728 16777216 0 +( 1527 916 -143 ) ( 1530 918 -143 ) ( 1544 880 -146 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1529 921 -207 ) ( 1525 920 -207 ) ( 1539 883 -209 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +} +// brush 1 +{ +( 1528 917 -151 ) ( 1529 917 -151 ) ( 1528 921 -151 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1529 917 -147 ) ( 1528 917 -147 ) ( 1526 920 -147 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1529 917 -151 ) ( 1528 917 -151 ) ( 1528 917 -147 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1529 917 -151 ) ( 1529 917 -147 ) ( 1528 921 -147 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1526 920 -151 ) ( 1528 921 -151 ) ( 1528 921 -147 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1528 917 -147 ) ( 1528 917 -151 ) ( 1526 920 -151 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +} +// brush 2 +{ +( 1526 920 -203 ) ( 1528 921 -203 ) ( 1527 925 -202 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1528 921 -199 ) ( 1526 920 -199 ) ( 1525 924 -198 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1526 920 -203 ) ( 1526 920 -199 ) ( 1528 921 -199 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1528 921 -203 ) ( 1528 921 -199 ) ( 1527 925 -198 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1525 924 -198 ) ( 1525 924 -202 ) ( 1527 925 -202 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +( 1526 920 -199 ) ( 1526 920 -203 ) ( 1525 924 -202 ) subway/1_bath_stall 72 -16 0 1 1 134217728 16777216 0 +} +} +// entity 324 +{ +"classname" "func_group" +// brush 0 +{ +( 1634 1089 -208 ) ( 1634 1089 -216 ) ( 1647 1081 -216 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1602 1038 -212 ) ( 1636 1093 -212 ) ( 1649 1084 -212 ) subway/1_bath_stalldoor 21 24 59 0.650000 1 134217728 16777216 0 +( 1612 1055 -216 ) ( 1612 1055 -208 ) ( 1626 1047 -208 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1636 1093 -216 ) ( 1602 1038 -216 ) ( 1615 1030 -216 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1611 1113 -216 ) ( 1611 1113 -208 ) ( 1577 1059 -208 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1631 1025 -208 ) ( 1665 1079 -208 ) ( 1665 1079 -216 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +} +// brush 1 +{ +( 1659 1078 -212 ) ( 1659 1078 -216 ) ( 1657 1074 -216 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1654 1077 -216 ) ( 1656 1080 -216 ) ( 1656 1080 -212 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1650 1079 -216 ) ( 1650 1079 -212 ) ( 1705 1045 -212 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1650 1079 -213 ) ( 1653 1082 -213 ) ( 1707 1048 -213 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1653 1082 -212 ) ( 1653 1082 -216 ) ( 1707 1048 -216 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1653 1082 -215 ) ( 1650 1079 -215 ) ( 1705 1045 -215 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +} +// brush 2 +{ +( 1615 1105 -212 ) ( 1615 1105 -216 ) ( 1613 1102 -216 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1610 1104 -216 ) ( 1612 1107 -216 ) ( 1612 1107 -212 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1606 1106 -216 ) ( 1606 1106 -212 ) ( 1661 1072 -212 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1606 1106 -213 ) ( 1609 1110 -213 ) ( 1663 1076 -213 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1609 1110 -212 ) ( 1609 1110 -216 ) ( 1663 1076 -216 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +( 1609 1110 -215 ) ( 1606 1106 -215 ) ( 1661 1072 -215 ) subway/1_bath_stall 0 0 0 1 1 134217728 16777216 0 +} +} +// entity 325 +{ +"classname" "misc_generic_toilet" +"angle" "180" +"origin" "1566 1329 -200" +"spawnflags" "2" +} +// entity 326 +{ +"classname" "func_group" +// brush 0 +{ +( 1487 1424 -212 ) ( 1490 1426 -212 ) ( 1490 1426 -216 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1487 1429 -216 ) ( 1487 1429 -212 ) ( 1484 1426 -212 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1528 1385 -216 ) ( 1481 1429 -216 ) ( 1481 1429 -212 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1530 1388 -215 ) ( 1484 1432 -215 ) ( 1481 1429 -215 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1530 1388 -212 ) ( 1484 1432 -212 ) ( 1484 1432 -216 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1528 1385 -213 ) ( 1481 1429 -213 ) ( 1484 1432 -213 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +} +// brush 1 +{ +( 1525 1387 -212 ) ( 1527 1390 -212 ) ( 1527 1390 -216 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1525 1393 -216 ) ( 1525 1393 -212 ) ( 1522 1390 -212 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1565 1349 -216 ) ( 1519 1393 -216 ) ( 1519 1393 -212 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1568 1351 -215 ) ( 1522 1396 -215 ) ( 1519 1393 -215 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1568 1351 -212 ) ( 1522 1396 -212 ) ( 1522 1396 -216 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1565 1349 -213 ) ( 1519 1393 -213 ) ( 1522 1396 -213 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +} +// brush 2 +{ +( 1516 1396 -212 ) ( 1505 1407 -212 ) ( 1505 1407 -220 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1522 1402 -216 ) ( 1510 1413 -216 ) ( 1466 1367 -216 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1488 1367 -220 ) ( 1477 1378 -220 ) ( 1477 1378 -212 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1474 1353 -212 ) ( 1463 1364 -212 ) ( 1507 1410 -212 ) subway/1_bath_stall 48 160 45 1 1.100000 134217728 16777216 0 +( 1443 1389 -220 ) ( 1487 1435 -220 ) ( 1487 1435 -212 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1533 1390 -212 ) ( 1533 1390 -220 ) ( 1489 1344 -220 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +} +} +// entity 327 +{ +"classname" "m_nyc_mskinhead1" +"angle" "180" +"spawnflags" "4" +"origin" "1552 1474 -176" +"targetname" "stallguym" +} +// entity 328 +{ +"MoveAction" "std_r_n_mrs_2" +"target" "t76" +"targetname" "t75" +"origin" "568 528 -160" +"classname" "path_corner" +} +// entity 329 +{ +"target" "t73" +"MoveAction" "std_r_n_mrs_2" +"targetname" "t72" +"origin" "648 632 -160" +"classname" "path_corner" +} +// entity 330 +{ +"origin" "528 1256 -48" +"_wait" ".7" +"light" "115" +"_color" "1.000000 0.909449 0.740157" +"classname" "light" +} +// entity 331 +{ +"lip" "0" +"wait" "1" +"delay" "5" +"spawnflags" "1" +"origin" "608 1364 -116" +"targetname" "sparks1" +"classname" "environ_sparkgen" +} +// entity 332 +{ +"classname" "trigger_once" +"target" "t68" +// brush 0 +{ +( 240 1416 -168 ) ( 232 1416 -168 ) ( 232 1328 -168 ) subway/trigger 8 -8 0 1 1 0 144 0 +( 232 1328 -48 ) ( 232 1416 -48 ) ( 240 1416 -48 ) subway/trigger 8 -8 0 1 1 0 144 0 +( 376 1368 -64 ) ( 384 1368 -64 ) ( 384 1368 -136 ) subway/trigger 8 0 0 1 1 0 144 0 +( 400 1384 -64 ) ( 400 1472 -64 ) ( 400 1472 -136 ) subway/trigger 8 0 0 1 1 0 144 0 +( 232 1544 -64 ) ( 224 1544 -64 ) ( 224 1544 -136 ) subway/trigger 8 0 0 1 1 0 144 0 +( 160 1408 -64 ) ( 160 1320 -64 ) ( 160 1320 -136 ) subway/trigger 8 0 0 1 1 0 144 0 +} +} +// entity 333 +{ +"classname" "script_runner" +"targetname" "t68" +"script" "tsr1/npc1" +"origin" "352 1264 -112" +} +// entity 334 +{ +"angle" "315" +"target" "t168" +"classname" "m_nyc_estockbroker" +"origin" "280 1144 -128" +"targetname" "victim1" +"spawnflags" "16406" +} +// entity 335 +{ +"killtarget" "hostage1" +"targetname" "badguy1" +"classname" "m_nyc_mskinhead1" +"angle" "90" +"spawnflags" "134" +"origin" "-248 416 -176" +} +// entity 336 +{ +"classname" "trigger_once" +"target" "t64" +// brush 0 +{ +( 16 -792 -440 ) ( -128 -792 -440 ) ( -128 -808 -440 ) subway/trigger -8 -32 0 1 1 0 144 0 +( -128 -808 -304 ) ( -128 -792 -304 ) ( 16 -792 -304 ) subway/trigger -8 -32 0 1 1 0 144 0 +( -120 -808 -320 ) ( 24 -808 -320 ) ( 24 -808 -400 ) subway/trigger -8 0 0 1 1 0 144 0 +( 8 -808 -320 ) ( 8 -792 -320 ) ( 8 -792 -400 ) subway/trigger 32 0 0 1 1 0 144 0 +( 16 -800 -320 ) ( -128 -800 -320 ) ( -128 -800 -400 ) subway/trigger -8 0 0 1 1 0 144 0 +( -120 -792 -320 ) ( -120 -808 -320 ) ( -120 -808 -400 ) subway/trigger 32 0 0 1 1 0 144 0 +} +} +// entity 337 +{ +"target" "t198" +"spawnflags" "8" +"classname" "trigger_once" +"angle" "90" +// brush 0 +{ +( 264 96 -216 ) ( 200 96 -216 ) ( 200 80 -216 ) subway/trigger 0 0 0 1 1 0 144 0 +( 200 80 -120 ) ( 200 96 -120 ) ( 264 96 -120 ) subway/trigger 0 0 0 1 1 0 144 0 +( 208 80 -152 ) ( 272 80 -152 ) ( 272 80 -184 ) subway/trigger 0 0 0 1 1 0 144 0 +( 280 80 -152 ) ( 280 96 -152 ) ( 280 96 -184 ) subway/trigger 0 0 0 1 1 0 144 0 +( 264 96 -152 ) ( 200 96 -152 ) ( 200 96 -184 ) subway/trigger 0 0 0 1 1 0 144 0 +( 184 96 -152 ) ( 184 80 -152 ) ( 184 80 -184 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 338 +{ +"origin" "1616 952 -176" +"script" "tsr1/gbnyc6" +"targetname" "t57" +"classname" "script_runner" +} +// entity 339 +{ +"spawnflags" "6" +"targetname" "lstallguy2" +"angle" "180" +"origin" "1860 986 -168" +"classname" "m_nyc_mpunk" +} +// entity 340 +{ +"spawnflags" "4" +"targetname" "stall1" +"classname" "func_wall" +// brush 0 +{ +( 1828 1064 -208 ) ( 1816 1064 -208 ) ( 1816 1052 -208 ) subway/origin 4 -12 0 1 1 16777216 128 0 +( 1816 1052 -196 ) ( 1816 1064 -196 ) ( 1828 1064 -196 ) subway/origin 4 -12 0 1 1 16777216 128 0 +( 1816 1052 -200 ) ( 1828 1052 -200 ) ( 1828 1052 -204 ) subway/origin 4 -24 0 1 1 16777216 128 0 +( 1828 1052 -200 ) ( 1828 1064 -200 ) ( 1828 1064 -204 ) subway/origin 12 -24 0 1 1 16777216 128 0 +( 1828 1064 -200 ) ( 1816 1064 -200 ) ( 1816 1064 -204 ) subway/origin 4 -24 0 1 1 16777216 128 0 +( 1816 1064 -200 ) ( 1816 1052 -200 ) ( 1816 1052 -204 ) subway/origin 12 -24 0 1 1 16777216 128 0 +} +// brush 1 +{ +( 1824 1056 -152 ) ( 1820 1056 -152 ) ( 1820 1052 -152 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1820 1052 -148 ) ( 1820 1056 -148 ) ( 1824 1056 -148 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1820 1052 -144 ) ( 1824 1052 -144 ) ( 1824 1052 -208 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1823 1052 -144 ) ( 1823 1056 -144 ) ( 1823 1056 -208 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1824 1056 -144 ) ( 1820 1056 -144 ) ( 1820 1056 -208 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1821 1056 -144 ) ( 1821 1052 -144 ) ( 1821 1052 -208 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +} +// brush 2 +{ +( 1828 1052 -176 ) ( 1820 1052 -176 ) ( 1820 1052 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1824 996 -176 ) ( 1824 1060 -176 ) ( 1824 1060 -192 ) subway/1_bath_stalldoor -22 -16 0 0.650000 1 134217728 16908288 0 +( 1820 1012 -176 ) ( 1828 1012 -176 ) ( 1828 1012 -192 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1820 1052 -176 ) ( 1820 988 -176 ) ( 1820 988 -192 ) subway/1_bath_stalldoor -22 -16 0 0.650000 1 134217728 16908288 0 +( 1820 1060 -144 ) ( 1828 1060 -144 ) ( 1828 996 -144 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1828 996 -208 ) ( 1828 1060 -208 ) ( 1820 1060 -208 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +} +// brush 3 +{ +( 1824 1056 -204 ) ( 1820 1056 -204 ) ( 1820 1052 -204 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1820 1052 -200 ) ( 1820 1056 -200 ) ( 1824 1056 -200 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1820 1052 -196 ) ( 1824 1052 -196 ) ( 1824 1052 -260 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1823 1052 -196 ) ( 1823 1056 -196 ) ( 1823 1056 -260 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1824 1056 -196 ) ( 1820 1056 -196 ) ( 1820 1056 -260 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +( 1821 1056 -196 ) ( 1821 1052 -196 ) ( 1821 1052 -260 ) subway/1_bath_stall 16 -16 0 1 1 134217728 16777216 0 +} +} +// entity 341 +{ +"origin" "576 1024 -160" +"targetname" "camroom_guys" +"target" "t61" +"classname" "trigger_relay" +} +// entity 342 +{ +"target" "t72" +"targetname" "t61" +"origin" "648 568 -128" +"angle" "90" +"spawnflags" "16" +"classname" "m_nyc_mskinhead1" +} +// entity 343 +{ +"target" "t75" +"targetname" "t61" +"origin" "568 520 -128" +"spawnflags" "16" +"classname" "m_nyc_mskinhead1" +} +// entity 344 +{ +"classname" "script_runner" +"script" "tsr1/gbnyc5" +"origin" "664 1200 -136" +"targetname" "t206" +} +// entity 345 +{ +"classname" "trigger_once" +"target" "t59" +"spawnflags" "8" +"targetname" "brokendoor" +// brush 0 +{ +( 632 1148 -168 ) ( 564 1148 -168 ) ( 564 1140 -168 ) subway/trigger 44 0 -180 1 -1 0 160 0 +( 564 1140 -72 ) ( 564 1148 -72 ) ( 632 1148 -72 ) subway/trigger 44 0 -180 1 -1 0 160 0 +( 564 1112 -128 ) ( 632 1112 -128 ) ( 632 1112 -144 ) subway/trigger 44 0 -180 1 -1 0 160 0 +( 648 1140 -128 ) ( 648 1148 -128 ) ( 648 1148 -144 ) subway/trigger 44 0 -180 1 -1 0 160 0 +( 632 1128 -128 ) ( 564 1128 -128 ) ( 564 1128 -144 ) subway/trigger 44 0 -180 1 -1 0 160 0 +( 544 1148 -128 ) ( 544 1140 -128 ) ( 544 1140 -144 ) subway/trigger 44 0 -180 1 -1 0 160 0 +} +} +// entity 346 +{ +"classname" "script_runner" +"targetname" "t59" +"origin" "696 1080 -136" +"script" "tsr1/gbnyc4" +} +// entity 347 +{ +"surfaceType" "28" +"material" "8" +"targetname" "camroom_hole" +"classname" "func_breakable_brush" +"spawnflags" "1" +// brush 0 +{ +( 564 1140 -120 ) ( 564 1124 -120 ) ( 564 1124 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 584 1132 -120 ) ( 624 1132 -120 ) ( 624 1132 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 580 1120 -120 ) ( 580 1136 -120 ) ( 580 1136 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 624 1136 -120 ) ( 584 1136 -120 ) ( 584 1136 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 584 1132 -120 ) ( 560 1132 -120 ) ( 572 1136 -120 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +( 580 1132 -128 ) ( 576 1132 -120 ) ( 578 1136 -124 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +( 568 1132 -140 ) ( 580 1132 -136 ) ( 574 1136 -138 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +( 564 1132 -132 ) ( 568 1132 -140 ) ( 566 1136 -136 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +( 572 1132 -120 ) ( 564 1132 -128 ) ( 568 1136 -124 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +} +// brush 1 +{ +( 628 1136 -144 ) ( 624 1136 -144 ) ( 624 1132 -144 ) subway/origin 32 0 0 0.500000 0.500000 16777216 128 0 +( 624 1132 -132 ) ( 624 1136 -132 ) ( 628 1136 -132 ) subway/origin 32 0 0 0.500000 0.500000 16777216 128 0 +( 624 1128 -56 ) ( 628 1128 -56 ) ( 628 1128 -144 ) subway/origin 32 0 0 0.500000 0.500000 16777216 128 0 +( 632 1132 -56 ) ( 632 1136 -56 ) ( 632 1136 -144 ) subway/origin 0 0 0 0.500000 0.500000 16777216 128 0 +( 628 1140 -56 ) ( 624 1140 -56 ) ( 624 1140 -144 ) subway/origin 32 0 0 0.500000 0.500000 16777216 128 0 +( 620 1136 -56 ) ( 620 1132 -56 ) ( 620 1132 -144 ) subway/origin 0 0 0 0.500000 0.500000 16777216 128 0 +} +} +// entity 348 +{ +"health" "100" +"spawnflags" "4" +"classname" "func_wall" +"targetname" "camroom_door" +// brush 0 +{ +( 628 1136 -108 ) ( 624 1136 -108 ) ( 624 1132 -108 ) subway/origin 32 0 0 0.500000 0.500000 16777216 128 0 +( 624 1132 -96 ) ( 624 1136 -96 ) ( 628 1136 -96 ) subway/origin 32 0 0 0.500000 0.500000 16777216 128 0 +( 624 1128 -20 ) ( 628 1128 -20 ) ( 628 1128 -108 ) subway/origin 32 -56 0 0.500000 0.500000 16777216 128 0 +( 632 1132 -20 ) ( 632 1136 -20 ) ( 632 1136 -108 ) subway/origin 0 -56 0 0.500000 0.500000 16777216 128 0 +( 628 1140 -20 ) ( 624 1140 -20 ) ( 624 1140 -108 ) subway/origin 32 -56 0 0.500000 0.500000 16777216 128 0 +( 620 1136 -20 ) ( 620 1132 -20 ) ( 620 1132 -108 ) subway/origin 0 -56 0 0.500000 0.500000 16777216 128 0 +} +// brush 1 +{ +( 604 1136 -116 ) ( 580 1136 -116 ) ( 580 1128 -116 ) subway/sign3 56 -48 0 0.500000 0.500000 0 0 0 +( 580 1128 -92 ) ( 580 1136 -92 ) ( 604 1136 -92 ) subway/sign3 56 -48 0 0.500000 0.500000 0 0 0 +( 580 1132 -72 ) ( 604 1132 -72 ) ( 604 1132 -160 ) subway/sign3 -22 -12 0 0.500000 0.500000 0 0 0 +( 612 1128 -72 ) ( 612 1136 -72 ) ( 612 1136 -160 ) subway/sign3 48 16 0 0.500000 0.500000 0 0 0 +( 604 1136 -72 ) ( 580 1136 -72 ) ( 580 1136 -160 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 580 1136 -72 ) ( 580 1128 -72 ) ( 580 1128 -160 ) subway/sign3 48 16 0 0.500000 0.500000 0 0 0 +} +// brush 2 +{ +( 672 1136 -120 ) ( 632 1136 -120 ) ( 632 1136 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 628 1120 -120 ) ( 628 1136 -120 ) ( 628 1136 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 632 1132 -120 ) ( 672 1132 -120 ) ( 672 1132 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 612 1140 -120 ) ( 612 1124 -120 ) ( 612 1124 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 632 1140 -80 ) ( 672 1140 -80 ) ( 672 1124 -80 ) subway/3_door4 1652 -1208 0 1 1 0 16777216 0 +( 560 1132 -168 ) ( 584 1132 -168 ) ( 572 1136 -168 ) subway/3_door4 1652 -1208 0 1 1 0 16777216 0 +} +// brush 3 +{ +( 584 1140 -80 ) ( 624 1140 -80 ) ( 624 1124 -80 ) subway/3_door4 1700 -1208 0 1 1 0 16777216 0 +( 564 1140 -120 ) ( 564 1124 -120 ) ( 564 1124 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 584 1132 -120 ) ( 624 1132 -120 ) ( 624 1132 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 580 1120 -120 ) ( 580 1136 -120 ) ( 580 1136 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 624 1136 -120 ) ( 584 1136 -120 ) ( 584 1136 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 560 1132 -120 ) ( 584 1132 -120 ) ( 572 1136 -120 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +} +// brush 4 +{ +( 644 1124 -92 ) ( 644 1140 -92 ) ( 604 1140 -92 ) subway/3_door4 1684 -1208 0 1 1 0 16777216 0 +( 600 1140 -80 ) ( 640 1140 -80 ) ( 640 1124 -80 ) subway/3_door4 1684 -1208 0 1 1 0 16777216 0 +( 580 1140 -120 ) ( 580 1124 -120 ) ( 580 1124 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 600 1132 -120 ) ( 640 1132 -120 ) ( 640 1132 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 612 1120 -120 ) ( 612 1136 -120 ) ( 612 1136 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 640 1136 -120 ) ( 600 1136 -120 ) ( 600 1136 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16777216 0 +} +// brush 5 +{ +( 640 1136 -116 ) ( 600 1136 -116 ) ( 600 1136 -164 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 612 1120 -120 ) ( 612 1136 -120 ) ( 612 1136 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 600 1132 -120 ) ( 640 1132 -120 ) ( 640 1132 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 580 1140 -120 ) ( 580 1124 -120 ) ( 580 1124 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 600 1140 -116 ) ( 640 1140 -116 ) ( 640 1124 -116 ) subway/3_door4 1684 -1208 0 1 1 0 16777216 0 +( 560 1132 -168 ) ( 584 1132 -168 ) ( 572 1136 -168 ) subway/3_door4 1684 -1208 0 1 1 0 16777216 0 +} +// brush 6 +{ +( 624 1124 -168 ) ( 624 1140 -168 ) ( 584 1140 -168 ) subway/3_door4 1700 -1208 0 1 1 0 16777216 0 +( 564 1140 -120 ) ( 564 1124 -120 ) ( 564 1124 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 584 1132 -120 ) ( 624 1132 -120 ) ( 624 1132 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 580 1120 -120 ) ( 580 1136 -120 ) ( 580 1136 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 624 1136 -120 ) ( 584 1136 -120 ) ( 584 1136 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 576 1132 -140 ) ( 564 1132 -140 ) ( 570 1136 -140 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +} +// brush 7 +{ +( 584 1132 -120 ) ( 624 1132 -120 ) ( 624 1132 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 580 1120 -120 ) ( 580 1136 -120 ) ( 580 1136 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 624 1136 -120 ) ( 584 1136 -120 ) ( 584 1136 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 564 1132 -140 ) ( 576 1132 -140 ) ( 570 1136 -140 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +( 580 1132 -136 ) ( 568 1132 -140 ) ( 574 1136 -138 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +} +// brush 8 +{ +( 564 1140 -120 ) ( 564 1124 -120 ) ( 564 1124 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 584 1132 -120 ) ( 624 1132 -120 ) ( 624 1132 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 624 1136 -120 ) ( 584 1136 -120 ) ( 584 1136 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 564 1132 -140 ) ( 576 1132 -140 ) ( 570 1136 -140 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +( 568 1132 -140 ) ( 564 1132 -132 ) ( 566 1136 -136 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +} +// brush 9 +{ +( 564 1140 -120 ) ( 564 1124 -120 ) ( 564 1124 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 584 1132 -120 ) ( 624 1132 -120 ) ( 624 1132 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16777216 0 +( 624 1136 -120 ) ( 584 1136 -120 ) ( 584 1136 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 584 1132 -120 ) ( 560 1132 -120 ) ( 572 1136 -120 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +( 564 1132 -128 ) ( 572 1132 -120 ) ( 568 1136 -124 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +} +// brush 10 +{ +( 584 1132 -120 ) ( 624 1132 -120 ) ( 624 1132 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 580 1120 -120 ) ( 580 1136 -120 ) ( 580 1136 -168 ) subway/3_door4 856 -40 0 1 1 0 16777216 0 +( 624 1136 -120 ) ( 584 1136 -120 ) ( 584 1136 -168 ) subway/3_door4 -46 -40 0 -1 1 0 16908288 0 +( 584 1132 -120 ) ( 560 1132 -120 ) ( 572 1136 -120 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +( 576 1132 -120 ) ( 580 1132 -128 ) ( 578 1136 -124 ) subway/3_door4 -52 -40 0 -1 1 0 16777216 0 +} +} +// entity 349 +{ +"classname" "m_nyc_mskinhead1" +"angle" "0" +"spawnflags" "150" +"origin" "1080 888 -176" +"targetname" "stallshooter" +} +// entity 350 +{ +"target" "t57" +"classname" "trigger_once" +// brush 0 +{ +( 1680 1096 -216 ) ( 1664 1096 -216 ) ( 1664 896 -216 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1664 896 -120 ) ( 1664 1096 -120 ) ( 1680 1096 -120 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1664 896 -120 ) ( 1680 896 -120 ) ( 1680 896 -216 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1696 896 -120 ) ( 1696 1096 -120 ) ( 1696 1096 -216 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1688 912 -120 ) ( 1672 912 -120 ) ( 1672 912 -216 ) subway/trigger -40 0 0 1 1 0 144 0 +( 1464 968 -120 ) ( 1464 768 -120 ) ( 1464 768 -216 ) subway/trigger -40 0 0 1 1 0 144 0 +} +} +// entity 351 +{ +"target" "t58" +"targetname" "setup" +"spawnflags" "4" +"classname" "trigger_once" +// brush 0 +{ +( 1344 912 -216 ) ( 1328 912 -216 ) ( 1328 848 -216 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1328 848 -120 ) ( 1328 912 -120 ) ( 1344 912 -120 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1328 832 -144 ) ( 1344 832 -144 ) ( 1344 832 -192 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1416 848 -144 ) ( 1416 912 -144 ) ( 1416 912 -192 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1344 920 -144 ) ( 1328 920 -144 ) ( 1328 920 -192 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1328 912 -144 ) ( 1328 848 -144 ) ( 1328 848 -192 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 352 +{ +"origin" "-88 1304 -152" +"script" "tsr1/gbnyc2" +"targetname" "t53" +"classname" "script_runner" +} +// entity 353 +{ +"target" "t53" +"classname" "trigger_once" +// brush 0 +{ +( -304 1456 -160 ) ( -448 1456 -160 ) ( -448 1440 -160 ) subway/trigger 0 32 0 1 1 0 144 0 +( -448 1440 16 ) ( -448 1456 16 ) ( -304 1456 16 ) subway/trigger 0 32 0 1 1 0 144 0 +( -448 1448 -112 ) ( -304 1448 -112 ) ( -304 1448 -128 ) subway/trigger 0 0 0 1 1 0 144 0 +( -304 1440 -112 ) ( -304 1456 -112 ) ( -304 1456 -128 ) subway/trigger -32 0 0 1 1 0 144 0 +( -304 1456 -112 ) ( -448 1456 -112 ) ( -448 1456 -128 ) subway/trigger 0 0 0 1 1 0 144 0 +( -448 1456 -112 ) ( -448 1440 -112 ) ( -448 1440 -128 ) subway/trigger -32 0 0 1 1 0 144 0 +} +} +// entity 354 +{ +"classname" "script_runner" +"targetname" "runguy" +"script" "tsr1/gbnyc1" +"origin" "-600 1216 72" +} +// entity 355 +{ +"classname" "m_nyc_mskinhead2a" +"angle" "0" +"spawnflags" "6" +"origin" "-672 1640 -72" +"targetname" "subway_bloke1" +} +// entity 356 +{ +"origin" "-576 976 40" +"angle" "90" +"classname" "info_player_start" +} +// entity 357 +{ +"classname" "func_door_rotating" +"targetname" "fusedoor" +"spawnflags" "32" +"distance" "90" +// brush 0 +{ +( -138 -616 -404 ) ( -146 -616 -404 ) ( -146 -624 -404 ) subway/origin 0 0 0 1 1 16777216 128 0 +( -146 -624 -396 ) ( -146 -616 -396 ) ( -138 -616 -396 ) subway/origin 0 0 0 1 1 16777216 128 0 +( -142 -624 -308 ) ( -134 -624 -308 ) ( -134 -624 -404 ) subway/origin 0 0 0 1 1 16777216 128 0 +( -134 -624 -308 ) ( -134 -616 -308 ) ( -134 -616 -404 ) subway/origin 0 0 0 1 1 16777216 128 0 +( -138 -612 -308 ) ( -146 -612 -308 ) ( -146 -612 -404 ) subway/origin 0 0 0 1 1 16777216 128 0 +( -146 -616 -308 ) ( -146 -624 -308 ) ( -146 -624 -404 ) subway/origin 0 0 0 1 1 16777216 128 0 +} +// brush 1 +{ +( -122 -616 -304 ) ( -146 -616 -304 ) ( -122 -616 -368 ) subway/metal_clean 48 0 0 0.500000 0.500000 0 16777216 0 +( -146 -636 -312 ) ( -146 -532 -312 ) ( -122 -532 -312 ) subway/metal_clean 48 0 0 0.500000 0.500000 0 16777216 0 +( -122 -532 -400 ) ( -146 -532 -400 ) ( -146 -636 -400 ) subway/metal_clean 48 0 0 0.500000 0.500000 0 16777216 0 +( -138 -608 -328 ) ( -138 -576 -328 ) ( -138 -576 -368 ) subway/3_door4 -21 -16 0 -1 1 0 16908288 0 +( -142 -564 -328 ) ( -142 -596 -328 ) ( -142 -596 -368 ) subway/3_door4 -21 -16 0 -1 1 0 16908288 0 +( -382 -680 -304 ) ( -342 -680 -304 ) ( -342 -680 -344 ) subway/metal_clean 48 0 0 0.500000 0.500000 0 16777216 0 +} +} +// entity 358 +{ +"origin" "1248 2368 -456" +"_color" "1.000000 1.000000 0.792157" +"classname" "light" +"light" "65" +} +// entity 359 +{ +"classname" "light" +"_color" "1.000000 0.933071 0.724409" +"color" "1.000000 0.933071 0.724409" +"light" "110" +"origin" "544 -760 -132" +} +// entity 360 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.850980" +"color" "1.000000 1.000000 0.850980" +"light" "45" +"_wait" ".6" +"origin" "712 -72 -176" +} +// entity 361 +{ +"classname" "light" +"_color" "0.623529 1.000000 0.858824" +"origin" "2024 2264 -456" +"light" "55" +} +// entity 362 +{ +"light" "160" +"origin" "1652 -2032 -496" +"color" "1.000000 0.501961 0.000000" +"_color" "1.000000 0.501961 0.000000" +"classname" "light" +} +// entity 363 +{ +"origin" "1651 -2062 -521" +"spawnflags" "4" +"classname" "misc_generic_barrel_burning" +} +// entity 364 +{ +"origin" "1832 560 -480" +"light" "80" +"color" "1.000000 0.858921 0.058091" +"_color" "1.000000 0.858921 0.058091" +"classname" "light" +} +// entity 365 +{ +"origin" "1704 1128 -520" +"light" "80" +"color" "1.000000 0.912698 0.813492" +"_color" "1.000000 0.912698 0.813492" +"classname" "light" +} +// entity 366 +{ +"light" "90" +"origin" "1812 1096 -352" +"_color" "1.000000 1.000000 0.843137" +"classname" "light" +} +// entity 367 +{ +"light" "120" +"origin" "1819 1096 -326" +"_color" "1.000000 1.000000 0.843137" +"classname" "light_generic_caged" +} +// entity 368 +{ +"origin" "1700 776 -400" +"light" "135" +"color" "1.000000 0.392157 0.101961" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 369 +{ +"light" "380" +"origin" "1968 552 -360" +"_mangle" "180 -90" +"_focus" "9" +"_cone" "90" +"color" "1.000000 1.000000 0.843137" +"_color" "1.000000 1.000000 0.843137" +"classname" "light" +} +// entity 370 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.843137" +"color" "1.000000 1.000000 0.843137" +"_cone" "90" +"_focus" "11" +"_mangle" "270 -90" +"origin" "24 -1200 -208" +} +// entity 371 +{ +"classname" "light" +"light" "90" +"origin" "656 -88 -96" +} +// entity 372 +{ +"light" "120" +"classname" "light_generic_hanging" +"origin" "946 450 -98" +"_color" "0.823529 1.000000 1.000000" +} +// entity 373 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "80" +"origin" "-376 1208 -56" +} +// entity 374 +{ +"classname" "light" +"light" "60" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "-416 1456 -112" +} +// entity 375 +{ +"classname" "light_generic_hanging" +"origin" "-26 630 -76" +"_color" "0.823529 1.000000 1.000000" +"light" "120" +} +// entity 376 +{ +"classname" "environ_sparkgen" +"origin" "-372 1546 -36" +"wait" "2" +"delay" "5" +"lip" "0" +"angles" "0 0 90" +"targetname" "t254" +} +// entity 377 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "-564 1450 56" +} +// entity 378 +{ +"classname" "light_generic_hanging" +"_color" "0.823529 1.000000 1.000000" +"color" "0.823529 1.000000 1.000000" +"light" "125" +"origin" "-564 1450 84" +} +// entity 379 +{ +"classname" "func_door_rotating" +"spawnflags" "32" +"distance" "96" +"speed" "16" +"targetname" "closetdoor" +// brush 0 +{ +( -128 1438 -168 ) ( -125 1439 -168 ) ( -124 1495 -168 ) subway/1_door_jam 7 -1 -155 0.500000 0.499890 64 16777216 0 +( -125 1439 -80 ) ( -128 1438 -80 ) ( -127 1494 -80 ) subway/1_door_jam 15 -10 -155 0.500000 0.499890 64 16777216 0 +( -128 1496 -80 ) ( -128 1496 -168 ) ( -124 1496 -168 ) subway/1_door_jam 0 5 -155 0.500000 0.499890 64 16777216 0 +( -132 1434 -80 ) ( -132 1434 -168 ) ( -132 1498 -168 ) subway/3_door4 -16 -39 -180 1 -1 64 16908288 0 +( -128 1432 -168 ) ( -128 1432 -80 ) ( -124 1432 -80 ) subway/1_door_jam 3 -15 -180 0.457222 -0.500000 64 16777216 0 +( -124 1432 -168 ) ( -124 1432 -80 ) ( -124 1496 -80 ) subway/3_door4 -16 -39 -180 1 -1 64 16908288 0 +} +// brush 1 +{ +( -124 1496 -136 ) ( -132 1496 -136 ) ( -132 1488 -136 ) subway/origin 0 0 0 1 1 16777216 128 0 +( -132 1488 -120 ) ( -132 1496 -120 ) ( -124 1496 -120 ) subway/origin 0 0 0 1 1 16777216 128 0 +( -128 1488 -40 ) ( -120 1488 -40 ) ( -120 1488 -128 ) subway/origin 0 0 0 1 1 16777216 128 0 +( -124 1488 -40 ) ( -124 1496 -40 ) ( -124 1496 -128 ) subway/origin 0 0 0 1 1 16777216 128 0 +( -124 1496 -40 ) ( -132 1496 -40 ) ( -132 1496 -128 ) subway/origin 0 0 0 1 1 16777216 128 0 +( -132 1496 -40 ) ( -132 1488 -40 ) ( -132 1488 -128 ) subway/origin 0 0 0 1 1 16777216 128 0 +} +} +// entity 380 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.768627" +"color" "1.000000 1.000000 0.768627" +"light" "95" +"origin" "1792 2536 -248" +} +// entity 381 +{ +"origin" "1568 2064 -408" +"light" "80" +"_color" "1.000000 1.000000 0.792157" +"classname" "light" +} +// entity 382 +{ +"origin" "1864 2424 -400" +"color" "0.941176 1.000000 0.756863" +"_color" "0.941176 1.000000 0.756863" +"light" "65" +"classname" "light" +} +// entity 383 +{ +"color" "0.768627 1.000000 1.000000" +"_color" "0.768627 1.000000 1.000000" +"light" "75" +"origin" "1776 2308 -280" +"classname" "light" +} +// entity 384 +{ +"origin" "1778 2290 -266" +"light" "125" +"classname" "light_generic_hanging" +} +// entity 385 +{ +"spawnflags" "2" +"classname" "misc_generic_bench" +"origin" "-246 733 -199" +"angle" "270" +} +// entity 386 +{ +"spawnflags" "2" +"classname" "misc_generic_bench" +"angle" "270" +"origin" "-178 -1186 -307" +} +// entity 387 +{ +"classname" "misc_generic_train" +"origin" "1130 113 -468" +"spawnflags" "41" +"scripttarget" "runovertrain" +} +// entity 388 +{ +"targetname" "train2" +"classname" "misc_generic_train" +"origin" "758 -995 -469" +"angle" "0" +"spawnflags" "1" +} +// entity 389 +{ +"targetname" "yel1" +"spawnflags" "0" +"light" "180" +"_color" "1.000000 1.000000 0.000000" +"origin" "888 384 -492" +"classname" "light" +} +// entity 390 +{ +"classname" "misc_newyork_trashcan" +"origin" "426 -522 -461" +"angle" "0" +"spawnflags" "2" +} +// entity 391 +{ +"targetname" "red1" +"classname" "light" +"origin" "1056 608 -472" +"_color" "1.000000 0.000000 0.000000" +"light" "180" +"spawnflags" "1" +} +// entity 392 +{ +"spawnflags" "1" +"light" "180" +"_color" "1.000000 0.000000 0.000000" +"origin" "888 384 -472" +"classname" "light" +} +// entity 393 +{ +"spawnflags" "2" +"origin" "396 -308 -462" +"classname" "misc_generic_bench" +} +// entity 394 +{ +"spawnflags" "2" +"origin" "-212 -312 -462" +"classname" "misc_generic_bench" +} +// entity 395 +{ +"origin" "396 -451 -433" +"classname" "misc_generic_phone_booth" +} +// entity 396 +{ +"origin" "120 -855 -390" +"classname" "misc_generic_trash_ashtray" +} +// entity 397 +{ +"soundname" "subwaytunnel" +"targetname" "t8" +"origin" "760 -40 -392" +"classname" "func_ambientset" +} +// entity 398 +{ +"soundname" "subwaylowerlevel" +"targetname" "t7" +"origin" "760 -168 -392" +"classname" "func_ambientset" +} +// entity 399 +{ +"_color" "1.000000 0.000000 0.000000" +"light" "140" +"origin" "756 404 -384" +"classname" "light" +} +// entity 400 +{ +"spawnflags" "2" +"angle" "180" +"origin" "116 -912 -382" +"classname" "misc_generic_bench" +} +// entity 401 +{ +"_color" "1.000000 0.000000 0.000000" +"light" "180" +"origin" "1132 1472 -380" +"classname" "light" +} +// entity 402 +{ +"light" "110" +"origin" "476 -648 -364" +"classname" "light" +} +// entity 403 +{ +"classname" "light" +"origin" "476 -392 -364" +"light" "110" +} +// entity 404 +{ +"classname" "light" +"origin" "476 -264 -364" +"light" "110" +} +// entity 405 +{ +"style" "300" +"targetname" "t44" +"angle" "180" +"origin" "1752 2405 -468" +"classname" "misc_generic_train" +"spawnflags" "9" +} +// entity 406 +{ +"style" "300" +"classname" "misc_generic_train" +"origin" "1914 1141 -468" +"targetname" "skintrain" +"spawnflags" "9" +"angle" "180" +} +// entity 407 +{ +"targetname" "t41" +"angle" "270" +"origin" "-1074 1653 -220" +"classname" "misc_generic_train" +"spawnflags" "17" +} +// entity 408 +{ +"_color" "0.996078 1.000000 0.874510" +"light" "120" +"origin" "-375 -1395 -250" +"classname" "light_generic_caged" +} +// entity 409 +{ +"classname" "light_generic_caged" +"origin" "25 -1395 -250" +"light" "120" +"_color" "0.996078 1.000000 0.874510" +} +// entity 410 +{ +"classname" "light_generic_caged" +"origin" "-175 -1395 -250" +"light" "120" +"_color" "0.996078 1.000000 0.874510" +} +// entity 411 +{ +"soundname" "subwayupperlevel" +"classname" "func_ambientset" +"origin" "1752 1824 -432" +"sounds" "2" +"targetname" "t15" +} +// entity 412 +{ +"soundname" "subwaytunnel" +"classname" "func_ambientset" +"origin" "1748 1688 -400" +"targetname" "t21" +"sounds" "4" +} +// entity 413 +{ +"origin" "-299 486 -206" +"classname" "misc_generic_trash_ashtray" +} +// entity 414 +{ +"classname" "misc_newyork_trashcan" +"origin" "754 -586 -197" +"angle" "90" +"spawnflags" "2" +} +// entity 415 +{ +"angle" "0" +"origin" "-141 535 -197" +"classname" "misc_newyork_trashcan" +"spawnflags" "2" +} +// entity 416 +{ +"origin" "-301 738 -206" +"classname" "misc_generic_trash_ashtray" +} +// entity 417 +{ +"spawnflags" "2" +"classname" "misc_newyork_trashcan" +"origin" "1530 667 -197" +"angle" "90" +} +// entity 418 +{ +"angle" "180" +"origin" "862 -284 -198" +"classname" "misc_generic_bench" +} +// entity 419 +{ +"skin" "1" +"classname" "misc_generic_chair_office" +"origin" "474 -236 -195" +} +// entity 420 +{ +"angle" "180" +"origin" "1685 859 -188" +"classname" "misc_generic_sink" +} +// entity 421 +{ +"classname" "misc_generic_sink" +"origin" "1685 787 -188" +"angle" "180" +} +// entity 422 +{ +"classname" "misc_generic_sink" +"origin" "1685 715 -188" +"angle" "180" +} +// entity 423 +{ +"classname" "misc_generic_comp_keyboard" +"origin" "632 -249 -182" +"angle" "180" +} +// entity 424 +{ +"classname" "misc_generic_fire_extinguisher" +"origin" "-124 299 -166" +"angle" "90" +} +// entity 425 +{ +"spawnflags" "2" +"angle" "180" +"classname" "misc_generic_desk_phone" +"origin" "601 -118 -181" +} +// entity 426 +{ +"classname" "misc_generic_comp_monitor" +"origin" "625 -276 -172" +"angle" "135" +} +// entity 427 +{ +"angle" "270" +"classname" "misc_newyork_trashcan" +"origin" "-262 1373 -149" +"spawnflags" "2" +} +// entity 428 +{ +"angle" "180" +"origin" "772 1073 -149" +"classname" "misc_newyork_trashcan" +"spawnflags" "2" +} +// entity 429 +{ +"soundname" "subwaylowerlevel" +"targetname" "t6" +"origin" "192 -776 -160" +"classname" "func_ambientset" +} +// entity 430 +{ +"soundname" "subwayupperlevel" +"classname" "func_ambientset" +"origin" "360 -776 -152" +"targetname" "t19" +} +// entity 431 +{ +"targetname" "gumball1" +"classname" "misc_newyork_gumball" +"origin" "-144 1368 -151" +} +// entity 432 +{ +"skin" "1" +"origin" "734 1272 -107" +"classname" "misc_generic_chair_office" +} +// entity 433 +{ +"classname" "misc_generic_comp_keyboard" +"origin" "528 1359 -134" +"angle" "270" +} +// entity 434 +{ +"angle" "180" +"origin" "764 1315 -134" +"classname" "misc_generic_comp_keyboard" +} +// entity 435 +{ +"origin" "-116 1407 -120" +"classname" "misc_generic_fire_extinguisher" +"spawnflags" "66" +} +// entity 436 +{ +"origin" "124 1157 -129" +"classname" "misc_generic_phone_booth" +} +// entity 437 +{ +"classname" "misc_generic_comp_monitor" +"origin" "769 1364 -124" +"angle" "225" +} +// entity 438 +{ +"classname" "light_generic_caged" +"origin" "1833 1017 -298" +"light" "160" +"_color" "1.000000 1.000000 0.670588" +} +// entity 439 +{ +"_color" "1.000000 1.000000 0.670588" +"light" "160" +"origin" "1833 1217 -298" +"classname" "light_generic_caged" +} +// entity 440 +{ +"origin" "-546 1741 -93" +"classname" "misc_newyork_trashcan" +"angle" "270" +"spawnflags" "2" +} +// entity 441 +{ +"spawnflags" "2" +"angle" "180" +"origin" "-264 1596 -94" +"classname" "misc_generic_bench" +} +// entity 442 +{ +"spawnflags" "2" +"angle" "180" +"origin" "-264 1688 -94" +"classname" "misc_generic_bench" +} +// entity 443 +{ +"origin" "-28 632 -112" +"soundname" "florescentlight" +"classname" "environ_soundgen" +} +// entity 444 +{ +"classname" "environ_soundgen" +"soundname" "florescentlight" +"origin" "-28 440 -112" +} +// entity 445 +{ +"angle" "270" +"origin" "492 1370 -81" +"classname" "misc_generic_tv_ceiling" +} +// entity 446 +{ +"origin" "444 1324 -81" +"classname" "misc_generic_tv_ceiling" +} +// entity 447 +{ +"angle" "270" +"classname" "misc_generic_tv_ceiling" +"origin" "524 1370 -81" +"targetname" "backlwall" +} +// entity 448 +{ +"targetname" "right" +"classname" "misc_generic_tv_ceiling" +"origin" "444 1284 -81" +} +// entity 449 +{ +"classname" "light_generic_caged" +"origin" "773 445 -62" +"light" "180" +"_color" "0.988235 1.000000 0.666667" +} +// entity 450 +{ +"classname" "light_generic_hanging" +"origin" "-373 1467 -22" +"light" "100" +"_color" "0.823529 1.000000 1.000000" +} +// entity 451 +{ +"light" "3500" +"classname" "func_wall" +// brush 0 +{ +( 552 1384 -128 ) ( 552 1352 -128 ) ( 552 1352 -136 ) subway/1_static_tv 56 0 0 1 1 0 16777216 0 +( 584 1384 -128 ) ( 552 1384 -128 ) ( 552 1384 -136 ) subway/camera1 0 -4 0 1 1 0 637538304 1 +( 584 1352 -128 ) ( 584 1384 -128 ) ( 584 1384 -136 ) subway/1_static_tv 56 0 0 1 1 0 16777216 0 +( 552 1352 -128 ) ( 584 1352 -128 ) ( 584 1352 -136 ) subway/camera1 48 -16 0 0.500000 0.500000 0 637538305 900 +( 552 1352 -104 ) ( 552 1384 -104 ) ( 584 1384 -104 ) subway/1_static_tv 56 0 90 1 1 0 16777216 0 +( 584 1384 -136 ) ( 552 1384 -136 ) ( 552 1352 -136 ) subway/camera1 0 0 0 1 1 0 637538304 1 +} +} +// entity 452 +{ +"classname" "trigger_once" +"target" "t45" +// brush 0 +{ +( 1824 1168 -528 ) ( 1712 1168 -528 ) ( 1712 1160 -528 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1712 1160 -288 ) ( 1712 1168 -288 ) ( 1824 1168 -288 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1696 1160 -320 ) ( 1808 1160 -320 ) ( 1808 1160 -448 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1808 1160 -320 ) ( 1808 1168 -320 ) ( 1808 1168 -448 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1808 1168 -288 ) ( 1696 1168 -288 ) ( 1696 1168 -416 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1696 1168 -320 ) ( 1696 1160 -320 ) ( 1696 1160 -448 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +} +} +// entity 453 +{ +"target" "t44" +"classname" "trigger_once" +"spawnflags" "4" +"targetname" "traintriggerb" +// brush 0 +{ +( 1808 2488 -360 ) ( 1696 2488 -360 ) ( 1696 2424 -360 ) subway/trigger 16 48 0 1 1 0 144 0 +( 1696 2424 -352 ) ( 1696 2488 -352 ) ( 1808 2488 -352 ) subway/trigger 16 48 0 1 1 0 144 0 +( 1708 2240 -352 ) ( 1820 2240 -352 ) ( 1820 2240 -472 ) subway/trigger 16 16 0 1 1 0 144 0 +( 1808 2424 -352 ) ( 1808 2488 -352 ) ( 1808 2488 -472 ) subway/trigger -32 16 0 1 1 0 144 0 +( 1808 2496 -352 ) ( 1696 2496 -352 ) ( 1696 2496 -472 ) subway/trigger 16 16 0 1 1 0 144 0 +( 1696 2488 -352 ) ( 1696 2424 -352 ) ( 1696 2424 -472 ) subway/trigger -32 16 0 1 1 0 144 0 +} +} +// entity 454 +{ +"target" "t43" +"classname" "trigger_once" +// brush 0 +{ +( 1200 960 -536 ) ( 1072 960 -536 ) ( 1072 952 -536 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1072 952 -344 ) ( 1072 960 -344 ) ( 1200 960 -344 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1072 952 -496 ) ( 1200 952 -496 ) ( 1200 952 -520 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1200 952 -496 ) ( 1200 960 -496 ) ( 1200 960 -520 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1200 960 -496 ) ( 1072 960 -496 ) ( 1072 960 -520 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1072 960 -496 ) ( 1072 952 -496 ) ( 1072 952 -520 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 455 +{ +"target" "t160" +"classname" "trigger_once" +// brush 0 +{ +( 320 -552 -480 ) ( 304 -552 -480 ) ( 304 -672 -480 ) subway/trigger 8 -16 0 1 1 0 144 0 +( 304 -672 -384 ) ( 304 -552 -384 ) ( 320 -552 -384 ) subway/trigger 8 -16 0 1 1 0 144 0 +( 312 -664 -432 ) ( 328 -664 -432 ) ( 328 -664 -464 ) subway/trigger 8 0 0 1 1 0 144 0 +( 320 -664 -432 ) ( 320 -544 -432 ) ( 320 -544 -464 ) subway/trigger 16 0 0 1 1 0 144 0 +( 320 -544 -432 ) ( 304 -544 -432 ) ( 304 -544 -464 ) subway/trigger 8 0 0 1 1 0 144 0 +( 200 -552 -432 ) ( 200 -672 -432 ) ( 200 -672 -464 ) subway/trigger 16 0 0 1 1 0 144 0 +} +} +// entity 456 +{ +"wait" "2" +"target" "t41" +"classname" "trigger_once" +// brush 0 +{ +( -464 1560 -112 ) ( -600 1560 -112 ) ( -600 1552 -112 ) subway/trigger -32 24 0 1 1 0 144 0 +( -600 1552 8 ) ( -600 1560 8 ) ( -464 1560 8 ) subway/trigger -32 24 0 1 1 0 144 0 +( -600 1552 -56 ) ( -464 1552 -56 ) ( -464 1552 -120 ) subway/trigger -32 0 0 1 1 0 144 0 +( -464 1552 -56 ) ( -464 1560 -56 ) ( -464 1560 -120 ) subway/trigger -24 0 0 1 1 0 144 0 +( -464 1752 -56 ) ( -600 1752 -56 ) ( -600 1752 -120 ) subway/trigger -32 0 0 1 1 0 144 0 +( -472 1568 -56 ) ( -472 1560 -56 ) ( -472 1560 -120 ) subway/trigger -24 0 0 1 1 0 144 0 +} +} +// entity 457 +{ +"classname" "func_group" +// brush 0 +{ +( 1820 -296 -536 ) ( 1820 -280 -536 ) ( 1824 -280 -528 ) subway/1_trim1 0 -16 0 0.500000 0.500000 134217728 0 0 +( 1820 -276 -536 ) ( 1844 -276 -536 ) ( 1840 -280 -528 ) subway/1_trim1 -16 -16 0 0.500000 0.500000 134217728 0 0 +( 1844 -280 -536 ) ( 1844 -296 -536 ) ( 1840 -296 -528 ) subway/1_trim1 0 -16 0 0.500000 0.500000 134217728 0 0 +( 1844 -300 -536 ) ( 1820 -300 -536 ) ( 1824 -296 -528 ) subway/1_trim1 -16 -16 0 0.500000 0.500000 134217728 0 0 +( 1824 -296 -528 ) ( 1824 -280 -528 ) ( 1840 -280 -528 ) subway/metalfloor1 16 32 0 0.500000 0.500000 134217728 16777216 0 +( 1820 -300 -536 ) ( 1844 -300 -536 ) ( 1844 -276 -536 ) subway/1_trim1 -16 0 0 0.500000 0.500000 134217728 0 0 +} +// brush 1 +{ +( 1840 -280 -528 ) ( 1824 -280 -528 ) ( 1824 -296 -528 ) subway/metalrib1 -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1824 -296 -476 ) ( 1824 -280 -476 ) ( 1840 -280 -476 ) subway/metalrib1 -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1824 -292 -520 ) ( 1840 -292 -520 ) ( 1840 -292 -528 ) subway/metalrib1 -8 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1836 -292 -520 ) ( 1836 -276 -520 ) ( 1836 -276 -528 ) subway/metalrib1 -24 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1840 -284 -520 ) ( 1824 -284 -520 ) ( 1824 -284 -528 ) subway/metalrib1 -8 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1828 -284 -520 ) ( 1828 -300 -520 ) ( 1828 -300 -528 ) subway/metalrib1 -24 -16 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( 1840 -280 -488 ) ( 1824 -280 -488 ) ( 1824 -296 -488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1824 -296 -472 ) ( 1824 -280 -472 ) ( 1840 -280 -472 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1824 -296 -476 ) ( 1840 -296 -476 ) ( 1840 -296 -528 ) subway/button2a 0 -16 0 0.500000 0.500000 134217728 16777216 0 +( 1840 -296 -476 ) ( 1840 -280 -476 ) ( 1840 -280 -528 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1840 -280 -476 ) ( 1824 -280 -476 ) ( 1824 -280 -528 ) subway/button2a 0 -16 0 0.500000 0.500000 0 16777216 0 +( 1824 -280 -476 ) ( 1824 -296 -476 ) ( 1824 -296 -528 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 458 +{ +"classname" "func_group" +// brush 0 +{ +( 2306 2056 -342 ) ( 2330 2056 -342 ) ( 2330 2056 -430 ) subway/1_news_side1 -9 -37 0 0.700195 0.700012 134217728 16777216 0 +( 2294 2088 -344 ) ( 2294 2048 -344 ) ( 2294 2048 -432 ) subway/1_news_front1 80 -36 0 0.699951 0.699982 134217728 16777216 0 +( 2334 2084 -340 ) ( 2310 2084 -340 ) ( 2310 2084 -428 ) subway/1_news_side1 -9 -37 0 0.700195 0.700012 134217728 16777216 0 +( 2312 2052 -344 ) ( 2312 2092 -344 ) ( 2312 2092 -432 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2330 2052 -348 ) ( 2306 2052 -348 ) ( 2306 2092 -348 ) subway/1_news_top1 22 80 0 0.700195 -0.699951 134217728 16777216 0 +( 2306 2088 -376 ) ( 2306 2048 -376 ) ( 2330 2048 -376 ) subway/1_black 12 -15 90 0.500000 0.500000 134217728 0 0 +} +// brush 1 +{ +( 2306 2088 -384 ) ( 2306 2048 -384 ) ( 2330 2048 -384 ) subway/1_black 12 -15 90 0.500000 0.500000 134217728 0 0 +( 2330 2052 -376 ) ( 2306 2052 -376 ) ( 2306 2092 -376 ) subway/1_black 12 -15 90 0.500000 0.500000 134217728 0 0 +( 2308 2056 -352 ) ( 2308 2096 -352 ) ( 2308 2096 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 2334 2080 -348 ) ( 2310 2080 -348 ) ( 2310 2080 -436 ) subway/1_black 12 0 -180 0.500000 -0.500000 134217728 0 0 +( 2298 2088 -352 ) ( 2298 2048 -352 ) ( 2298 2048 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 2306 2060 -350 ) ( 2330 2060 -350 ) ( 2330 2060 -438 ) subway/1_black 12 0 -180 0.500000 -0.500000 134217728 0 0 +} +} +// entity 459 +{ +"classname" "func_group" +// brush 0 +{ +( 2306 2152 -376 ) ( 2306 2112 -376 ) ( 2330 2112 -376 ) subway/1_black 12 -15 90 0.500000 0.500000 134217728 0 0 +( 2330 2116 -348 ) ( 2306 2116 -348 ) ( 2306 2156 -348 ) subway/1_news_topB -9 56 0 0.700195 -0.699951 134217728 16777216 0 +( 2312 2116 -344 ) ( 2312 2156 -344 ) ( 2312 2156 -432 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 2334 2148 -340 ) ( 2310 2148 -340 ) ( 2310 2148 -428 ) subway/1_news_sideB 13 -38 -180 0.699707 -0.700012 134217728 16777216 0 +( 2294 2152 -344 ) ( 2294 2112 -344 ) ( 2294 2112 -432 ) subway/1_news_frontB 56 -38 0 0.699951 0.700012 134217728 16777216 0 +( 2306 2120 -342 ) ( 2330 2120 -342 ) ( 2330 2120 -430 ) subway/1_news_sideB 13 -38 -180 0.699707 -0.700012 134217728 16777216 0 +} +// brush 1 +{ +( 2306 2124 -350 ) ( 2330 2124 -350 ) ( 2330 2124 -438 ) subway/1_black 12 0 -180 0.500000 -0.500000 134217728 0 0 +( 2298 2152 -352 ) ( 2298 2112 -352 ) ( 2298 2112 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 2334 2144 -348 ) ( 2310 2144 -348 ) ( 2310 2144 -436 ) subway/1_black 12 0 -180 0.500000 -0.500000 134217728 0 0 +( 2308 2120 -352 ) ( 2308 2160 -352 ) ( 2308 2160 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 2330 2116 -376 ) ( 2306 2116 -376 ) ( 2306 2156 -376 ) subway/1_black 12 -15 90 0.500000 0.500000 134217728 0 0 +( 2306 2152 -384 ) ( 2306 2112 -384 ) ( 2330 2112 -384 ) subway/1_black 12 -15 90 0.500000 0.500000 134217728 0 0 +} +} +// entity 460 +{ +"classname" "func_group" +// brush 0 +{ +( 776 1020 -134 ) ( 800 1020 -134 ) ( 800 1020 -222 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 768 1048 -136 ) ( 768 1008 -136 ) ( 768 1008 -224 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 804 1040 -132 ) ( 780 1040 -132 ) ( 780 1040 -220 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 778 1016 -136 ) ( 778 1056 -136 ) ( 778 1056 -224 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 800 1012 -160 ) ( 776 1012 -160 ) ( 776 1052 -160 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 776 1048 -168 ) ( 776 1008 -168 ) ( 800 1008 -168 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +} +// brush 1 +{ +( 776 1048 -160 ) ( 776 1008 -160 ) ( 800 1008 -160 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 800 1012 -132 ) ( 776 1012 -132 ) ( 776 1052 -132 ) subway/1_news_topB 0 -31 0 0.700000 -0.700000 134217728 0 0 +( 782 1012 -128 ) ( 782 1052 -128 ) ( 782 1052 -216 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 804 1044 -124 ) ( 780 1044 -124 ) ( 780 1044 -212 ) subway/1_news_sideB 0 16 0 0.700000 0.700000 134217728 0 0 +( 764 1048 -128 ) ( 764 1008 -128 ) ( 764 1008 -216 ) subway/1_news_frontB -32 16 0 0.700000 0.700000 134217728 0 0 +( 776 1016 -126 ) ( 800 1016 -126 ) ( 800 1016 -214 ) subway/1_news_sideB 0 16 0 0.700000 0.700000 134217728 0 0 +} +} +// entity 461 +{ +"classname" "func_group" +// brush 0 +{ +( 164 1536 -134 ) ( 164 1560 -134 ) ( 164 1560 -222 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 136 1528 -136 ) ( 176 1528 -136 ) ( 176 1528 -224 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 144 1564 -132 ) ( 144 1540 -132 ) ( 144 1540 -220 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 168 1538 -136 ) ( 128 1538 -136 ) ( 128 1538 -224 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 172 1560 -160 ) ( 172 1536 -160 ) ( 132 1536 -160 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 136 1536 -168 ) ( 176 1536 -168 ) ( 176 1560 -168 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +} +// brush 1 +{ +( 136 1536 -160 ) ( 176 1536 -160 ) ( 176 1560 -160 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 172 1560 -132 ) ( 172 1536 -132 ) ( 132 1536 -132 ) subway/1_news_topB -30 132 90 0.700000 0.700000 134217728 0 0 +( 172 1542 -128 ) ( 132 1542 -128 ) ( 132 1542 -216 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 140 1564 -124 ) ( 140 1540 -124 ) ( 140 1540 -212 ) subway/1_news_sideB -62 16 0 0.700000 0.700000 134217728 0 0 +( 136 1524 -128 ) ( 176 1524 -128 ) ( 176 1524 -216 ) subway/1_news_frontB 68 16 0 0.700000 0.700000 134217728 0 0 +( 168 1536 -126 ) ( 168 1560 -126 ) ( 168 1560 -214 ) subway/1_news_sideB -62 16 0 0.700000 0.700000 134217728 0 0 +} +} +// entity 462 +{ +"classname" "func_group" +// brush 0 +{ +( 564 1128 -80 ) ( 564 1136 -80 ) ( 560 1136 -76 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 564 1136 -156 ) ( 560 1136 -156 ) ( 560 1136 -164 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 628 1136 -80 ) ( 628 1128 -80 ) ( 632 1128 -76 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 560 1128 -76 ) ( 564 1128 -76 ) ( 564 1128 -84 ) subway/1_black 16 0 0 1 1 0 16777216 0 +( 560 1128 -76 ) ( 560 1136 -76 ) ( 564 1136 -76 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 624 1128 -80 ) ( 624 1136 -80 ) ( 564 1136 -80 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 1 +{ +( 564 1136 -168 ) ( 560 1136 -168 ) ( 560 1128 -168 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 564 1136 -80 ) ( 564 1128 -80 ) ( 560 1128 -76 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 560 1128 -72 ) ( 564 1128 -72 ) ( 564 1128 -80 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 564 1128 -76 ) ( 564 1136 -76 ) ( 564 1136 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 564 1136 -152 ) ( 560 1136 -152 ) ( 560 1136 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 560 1136 -152 ) ( 560 1128 -152 ) ( 560 1128 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +// brush 2 +{ +( 632 1136 -168 ) ( 628 1136 -168 ) ( 628 1128 -168 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 632 1128 -76 ) ( 632 1136 -76 ) ( 636 1136 -72 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 632 1128 -72 ) ( 636 1128 -72 ) ( 636 1128 -80 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 632 1128 -72 ) ( 632 1136 -72 ) ( 632 1136 -80 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 632 1136 -152 ) ( 628 1136 -152 ) ( 628 1136 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +( 628 1136 -76 ) ( 628 1128 -76 ) ( 628 1128 -160 ) subway/1_black 0 0 0 1 1 0 16777216 0 +} +} +// entity 463 +{ +"classname" "func_group" +// brush 0 +{ +( 808 944 -168 ) ( 808 1008 -168 ) ( 744 1008 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 744 1008 -152 ) ( 808 1008 -152 ) ( 808 944 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 824 1048 -152 ) ( 824 1048 -168 ) ( 816 1048 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 816 976 -152 ) ( 816 840 -152 ) ( 816 840 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 816 1056 -168 ) ( 816 1056 -152 ) ( 808 1056 -152 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +( 848 1144 -152 ) ( 848 1144 -168 ) ( 848 1080 -168 ) subway/1_tile_bottom 8 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1 +{ +( 808 944 -152 ) ( 808 1008 -152 ) ( 744 1008 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 744 1008 -120 ) ( 808 1008 -120 ) ( 808 944 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 824 1048 -80 ) ( 824 1048 -152 ) ( 816 1048 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 816 1024 -104 ) ( 816 888 -104 ) ( 816 888 -208 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 816 1056 -152 ) ( 816 1056 -80 ) ( 808 1056 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 848 1144 -80 ) ( 848 1144 -152 ) ( 848 1080 -152 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 2 +{ +( 808 944 -120 ) ( 808 1008 -120 ) ( 744 1008 -120 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 744 1008 -104 ) ( 808 1008 -104 ) ( 808 944 -104 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 824 1048 -64 ) ( 824 1048 -136 ) ( 816 1048 -136 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 816 1024 -88 ) ( 816 888 -88 ) ( 816 888 -192 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 816 1056 -136 ) ( 816 1056 -64 ) ( 808 1056 -64 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +( 848 1144 -64 ) ( 848 1144 -136 ) ( 848 1080 -136 ) subway/1_tile_big_blue 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 3 +{ +( 808 944 -104 ) ( 808 1008 -104 ) ( 744 1008 -104 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 752 1008 -64 ) ( 816 1008 -64 ) ( 816 944 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 824 1048 -48 ) ( 824 1048 -120 ) ( 816 1048 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 816 1024 -72 ) ( 816 888 -72 ) ( 816 888 -176 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 824 1056 -96 ) ( 824 1056 -24 ) ( 816 1056 -24 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 848 1144 -48 ) ( 848 1144 -120 ) ( 848 1080 -120 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 4 +{ +( 848 1144 -8 ) ( 848 1144 -80 ) ( 848 1080 -80 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 824 1056 -56 ) ( 824 1056 16 ) ( 816 1056 16 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 816 1024 -32 ) ( 816 888 -32 ) ( 816 888 -136 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 824 1048 -8 ) ( 824 1048 -80 ) ( 816 1048 -80 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 752 1008 -48 ) ( 816 1008 -48 ) ( 816 944 -48 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +( 808 944 -64 ) ( 808 1008 -64 ) ( 744 1008 -64 ) subway/1_tile_middle 0 130 0 0.500000 -0.500000 0 318767104 0 +} +} +// entity 464 +{ +"classname" "func_group" +// brush 0 +{ +( 780 1248 -168 ) ( 780 1356 -168 ) ( 756 1356 -168 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 756 1356 -144 ) ( 780 1356 -144 ) ( 780 1248 -144 ) subway/metal_clean -256 0 0 0.500000 0.500000 134217728 16777216 0 +( 760 1356 -104 ) ( 760 1248 -104 ) ( 760 1248 -168 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +( 756 1248 -104 ) ( 780 1248 -104 ) ( 780 1248 -168 ) subway/1_duct 0 -48 0 0.500000 0.500000 0 16777216 0 +( 784 1248 -104 ) ( 784 1356 -104 ) ( 784 1356 -168 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 780 1360 -104 ) ( 756 1360 -104 ) ( 756 1360 -168 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 1 +{ +( 780 1352 -104 ) ( 756 1352 -104 ) ( 756 1352 -168 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +( 784 1248 -104 ) ( 784 1356 -104 ) ( 784 1356 -168 ) subway/1_black 0 0 0 0.500000 0.500000 0 16777216 0 +( 756 1248 -104 ) ( 780 1248 -104 ) ( 780 1248 -168 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 752 1356 -104 ) ( 752 1248 -104 ) ( 752 1248 -168 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 756 1356 -136 ) ( 780 1356 -136 ) ( 780 1248 -136 ) subway/con5 0 0 0 0.500000 0.500000 0 285212672 0 +( 780 1248 -144 ) ( 780 1356 -144 ) ( 756 1356 -144 ) subway/1_black -256 0 0 0.500000 0.500000 0 16777216 0 +} +} +// entity 465 +{ +"classname" "func_group" +// brush 0 +{ +( -498 -1311 -328 ) ( -474 -1311 -328 ) ( -474 -1271 -328 ) subway/1_black -14 3 90 0.500000 0.500000 134217728 0 0 +( -474 -1267 -320 ) ( -474 -1307 -320 ) ( -498 -1307 -320 ) subway/1_black -14 3 90 0.500000 0.500000 134217728 0 0 +( -476 -1263 -384 ) ( -476 -1263 -296 ) ( -476 -1303 -296 ) subway/1_black -14 0 0 0.500000 0.500000 134217728 0 0 +( -478 -1279 -380 ) ( -478 -1279 -292 ) ( -502 -1279 -292 ) subway/1_black -4 -15 -180 0.500000 -0.500000 134217728 0 0 +( -466 -1311 -384 ) ( -466 -1311 -296 ) ( -466 -1271 -296 ) subway/1_black -14 0 0 0.500000 0.500000 134217728 0 0 +( -498 -1299 -382 ) ( -498 -1299 -294 ) ( -474 -1299 -294 ) subway/1_black -4 -15 -180 0.500000 -0.500000 134217728 0 0 +} +// brush 1 +{ +( -498 -1303 -374 ) ( -498 -1303 -286 ) ( -474 -1303 -286 ) subway/1_news_sideB 20 -20 0 0.700012 0.699997 134217728 0 0 +( -462 -1311 -376 ) ( -462 -1311 -288 ) ( -462 -1271 -288 ) subway/1_news_frontB 49 44 -180 0.700073 -0.699982 134217728 0 0 +( -478 -1275 -372 ) ( -478 -1275 -284 ) ( -502 -1275 -284 ) subway/1_news_sideB 20 -20 0 0.700012 0.699997 134217728 0 0 +( -480 -1267 -376 ) ( -480 -1267 -288 ) ( -480 -1307 -288 ) subway/1_black -14 0 0 0.500000 0.500000 134217728 16777216 0 +( -474 -1267 -292 ) ( -474 -1307 -292 ) ( -498 -1307 -292 ) subway/1_news_topB 20 49 0 0.700073 0.699951 134217728 0 0 +( -498 -1311 -320 ) ( -474 -1311 -320 ) ( -474 -1271 -320 ) subway/1_black -14 3 90 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 466 +{ +"classname" "func_group" +// brush 0 +{ +( 719 -618 -216 ) ( 719 -594 -216 ) ( 679 -594 -216 ) subway/1_black -1086 -4220 0 0.500000 0.500000 134217728 0 0 +( 675 -594 -208 ) ( 715 -594 -208 ) ( 715 -618 -208 ) subway/1_black -1086 -4220 0 0.500000 0.500000 134217728 0 0 +( 671 -596 -272 ) ( 671 -596 -184 ) ( 711 -596 -184 ) subway/1_black -1086 -96 0 0.500000 0.500000 134217728 0 0 +( 687 -598 -268 ) ( 687 -598 -180 ) ( 687 -622 -180 ) subway/1_black 4220 -96 0 0.500000 0.500000 134217728 0 0 +( 719 -586 -272 ) ( 719 -586 -184 ) ( 679 -586 -184 ) subway/1_black -1086 -96 0 0.500000 0.500000 134217728 0 0 +( 707 -618 -270 ) ( 707 -618 -182 ) ( 707 -594 -182 ) subway/1_black 4220 -96 0 0.500000 0.500000 134217728 0 0 +} +// brush 1 +{ +( 711 -618 -262 ) ( 711 -618 -174 ) ( 711 -594 -174 ) subway/1_news_sideB 4 -52 0 -0.700000 0.700000 134217728 0 0 +( 719 -582 -264 ) ( 719 -582 -176 ) ( 679 -582 -176 ) subway/1_news_frontB -707 -52 0 0.700000 0.700000 134217728 0 0 +( 683 -598 -260 ) ( 683 -598 -172 ) ( 683 -622 -172 ) subway/1_news_sideB 4 -52 0 -0.700000 0.700000 134217728 0 0 +( 675 -600 -264 ) ( 675 -600 -176 ) ( 715 -600 -176 ) subway/1_black -1086 -96 0 0.500000 0.500000 134217728 16777216 0 +( 675 -594 -180 ) ( 715 -594 -180 ) ( 715 -618 -180 ) subway/1_news_topB 4 -579 90 -0.700000 0.700000 134217728 0 0 +( 719 -618 -208 ) ( 719 -594 -208 ) ( 679 -594 -208 ) subway/1_black -1086 -4220 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 467 +{ +"classname" "func_group" +// brush 0 +{ +( 679 -618 -208 ) ( 679 -594 -208 ) ( 639 -594 -208 ) subway/1_black -1838 -1068 0 0.500000 0.500000 134217728 0 0 +( 635 -594 -180 ) ( 675 -594 -180 ) ( 675 -618 -180 ) subway/1_news_top1 4 -10 90 -0.700000 0.700000 134217728 0 0 +( 635 -600 -264 ) ( 635 -600 -176 ) ( 675 -600 -176 ) subway/1_black -5662 -432 0 0.500000 0.500000 134217728 16777216 0 +( 643 -598 -260 ) ( 643 -598 -172 ) ( 643 -622 -172 ) subway/1_news_side1 4 12 0 -0.700000 0.700000 134217728 0 0 +( 679 -582 -264 ) ( 679 -582 -176 ) ( 639 -582 -176 ) subway/1_news_front1 -1482 -308 0 0.700000 0.700000 134217728 16777216 0 +( 671 -618 -262 ) ( 671 -618 -174 ) ( 671 -594 -174 ) subway/1_news_side1 4 12 0 -0.700000 0.700000 134217728 0 0 +} +// brush 1 +{ +( 667 -618 -270 ) ( 667 -618 -182 ) ( 667 -594 -182 ) subway/1_black 4876 -432 0 0.500000 0.500000 134217728 0 0 +( 679 -586 -272 ) ( 679 -586 -184 ) ( 639 -586 -184 ) subway/1_black -5598 -432 0 0.500000 0.500000 134217728 0 0 +( 647 -598 -268 ) ( 647 -598 -180 ) ( 647 -622 -180 ) subway/1_black 4876 -432 0 0.500000 0.500000 134217728 0 0 +( 631 -596 -272 ) ( 631 -596 -184 ) ( 671 -596 -184 ) subway/1_black -5598 -432 0 0.500000 0.500000 134217728 0 0 +( 635 -594 -208 ) ( 675 -594 -208 ) ( 675 -618 -208 ) subway/1_black -1854 -1132 0 0.500000 0.500000 134217728 0 0 +( 679 -618 -216 ) ( 679 -594 -216 ) ( 639 -594 -216 ) subway/1_black -1854 -1132 0 0.500000 0.500000 134217728 0 0 +} +} +// entity 468 +{ +"classname" "func_group" +// brush 0 +{ +( -401 1746 -70 ) ( -401 1770 -70 ) ( -401 1770 -158 ) subway/1_news_side1 54 161 0 0.700000 0.700000 134217728 0 0 +( -433 1734 -72 ) ( -393 1734 -72 ) ( -393 1734 -160 ) subway/1_news_front1 49 -160 0 0.700000 0.700000 134217728 16777216 0 +( -429 1774 -68 ) ( -429 1750 -68 ) ( -429 1750 -156 ) subway/1_news_side1 54 161 0 0.700000 0.700000 134217728 0 0 +( -397 1752 -72 ) ( -437 1752 -72 ) ( -437 1752 -160 ) subway/1_black -3518 -224 0 0.500000 0.500000 134217728 16777216 0 +( -397 1770 -76 ) ( -397 1746 -76 ) ( -437 1746 -76 ) subway/1_news_top1 22 177 90 0.700000 0.700000 134217728 0 0 +( -433 1746 -104 ) ( -393 1746 -104 ) ( -393 1770 -104 ) subway/1_black 306 3572 0 0.500000 0.500000 134217728 0 0 +} +// brush 1 +{ +( -433 1746 -112 ) ( -393 1746 -112 ) ( -393 1770 -112 ) subway/1_black 290 3508 0 0.500000 0.500000 134217728 0 0 +( -397 1770 -104 ) ( -397 1746 -104 ) ( -437 1746 -104 ) subway/1_black 290 3508 0 0.500000 0.500000 134217728 0 0 +( -401 1748 -80 ) ( -441 1748 -80 ) ( -441 1748 -168 ) subway/1_black -3454 -224 0 0.500000 0.500000 134217728 0 0 +( -425 1774 -76 ) ( -425 1750 -76 ) ( -425 1750 -164 ) subway/1_black 236 -224 0 0.500000 0.500000 134217728 0 0 +( -433 1738 -80 ) ( -393 1738 -80 ) ( -393 1738 -168 ) subway/1_black -3454 -224 0 0.500000 0.500000 134217728 0 0 +( -405 1746 -78 ) ( -405 1770 -78 ) ( -405 1770 -166 ) subway/1_black 236 -224 0 0.500000 0.500000 134217728 0 0 +} +} +// entity 469 +{ +"classname" "func_group" +// brush 0 +{ +( -97 738 -208 ) ( -57 738 -208 ) ( -57 762 -208 ) subway/1_black -366 1556 0 0.500000 0.500000 134217728 0 0 +( -61 762 -180 ) ( -61 738 -180 ) ( -101 738 -180 ) subway/1_news_top1 1462 -302 90 0.700000 0.700000 134217728 0 0 +( -61 744 -176 ) ( -101 744 -176 ) ( -101 744 -264 ) subway/1_black -4190 -432 0 0.500000 0.500000 134217728 16777216 0 +( -93 766 -172 ) ( -93 742 -172 ) ( -93 742 -260 ) subway/1_news_side1 1493 12 0 0.700000 0.700000 134217728 0 0 +( -97 726 -176 ) ( -57 726 -176 ) ( -57 726 -264 ) subway/1_news_front1 -430 -308 0 0.700000 0.700000 134217728 16777216 0 +( -65 738 -174 ) ( -65 762 -174 ) ( -65 762 -262 ) subway/1_news_side1 1493 12 0 0.700000 0.700000 134217728 0 0 +} +// brush 1 +{ +( -69 738 -182 ) ( -69 762 -182 ) ( -69 762 -270 ) subway/1_black 2252 -432 0 0.500000 0.500000 134217728 0 0 +( -97 730 -184 ) ( -57 730 -184 ) ( -57 730 -272 ) subway/1_black -4126 -432 0 0.500000 0.500000 134217728 0 0 +( -89 766 -180 ) ( -89 742 -180 ) ( -89 742 -268 ) subway/1_black 2252 -432 0 0.500000 0.500000 134217728 0 0 +( -65 740 -184 ) ( -105 740 -184 ) ( -105 740 -272 ) subway/1_black -4126 -432 0 0.500000 0.500000 134217728 0 0 +( -61 762 -208 ) ( -61 738 -208 ) ( -101 738 -208 ) subway/1_black -382 1492 0 0.500000 0.500000 134217728 0 0 +( -97 738 -216 ) ( -57 738 -216 ) ( -57 762 -216 ) subway/1_black -382 1492 0 0.500000 0.500000 134217728 0 0 +} +} +// entity 470 +{ +"classname" "func_group" +// brush 0 +{ +( -57 738 -216 ) ( -17 738 -216 ) ( -17 762 -216 ) subway/1_black 386 -1596 0 0.500000 0.500000 134217728 0 0 +( -21 762 -208 ) ( -21 738 -208 ) ( -61 738 -208 ) subway/1_black 386 -1596 0 0.500000 0.500000 134217728 0 0 +( -25 740 -184 ) ( -65 740 -184 ) ( -65 740 -272 ) subway/1_black 386 -96 0 0.500000 0.500000 134217728 0 0 +( -49 766 -180 ) ( -49 742 -180 ) ( -49 742 -268 ) subway/1_black 1596 -96 0 0.500000 0.500000 134217728 0 0 +( -57 730 -184 ) ( -17 730 -184 ) ( -17 730 -272 ) subway/1_black 386 -96 0 0.500000 0.500000 134217728 0 0 +( -29 738 -182 ) ( -29 762 -182 ) ( -29 762 -270 ) subway/1_black 1596 -96 0 0.500000 0.500000 134217728 0 0 +} +// brush 1 +{ +( -25 738 -174 ) ( -25 762 -174 ) ( -25 762 -262 ) subway/1_news_sideB 1077 -52 0 0.700000 0.700000 134217728 0 0 +( -57 726 -176 ) ( -17 726 -176 ) ( -17 726 -264 ) subway/1_news_frontB 343 -52 0 0.700000 0.700000 134217728 0 0 +( -53 766 -172 ) ( -53 742 -172 ) ( -53 742 -260 ) subway/1_news_sideB 1077 -52 0 0.700000 0.700000 134217728 0 0 +( -21 744 -176 ) ( -61 744 -176 ) ( -61 744 -264 ) subway/1_black 386 -96 0 0.500000 0.500000 134217728 16777216 0 +( -21 762 -180 ) ( -21 738 -180 ) ( -61 738 -180 ) subway/1_news_topB 1110 407 90 0.700000 0.700000 134217728 0 0 +( -57 738 -208 ) ( -17 738 -208 ) ( -17 762 -208 ) subway/1_black 386 -1596 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 471 +{ +"classname" "func_group" +// brush 0 +{ +( 824 1176 -168 ) ( 824 1136 -168 ) ( 848 1136 -168 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 848 1140 -160 ) ( 824 1140 -160 ) ( 824 1180 -160 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 826 1144 -136 ) ( 826 1184 -136 ) ( 826 1184 -224 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 852 1168 -132 ) ( 828 1168 -132 ) ( 828 1168 -220 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 816 1176 -136 ) ( 816 1136 -136 ) ( 816 1136 -224 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +( 824 1148 -134 ) ( 848 1148 -134 ) ( 848 1148 -222 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 0 0 +} +// brush 1 +{ +( 824 1144 -126 ) ( 848 1144 -126 ) ( 848 1144 -214 ) subway/1_news_side1 -4 16 0 0.700000 0.700000 134217728 16777216 0 +( 812 1176 -128 ) ( 812 1136 -128 ) ( 812 1136 -216 ) subway/1_news_front1 -21 16 0 0.700000 0.700000 134217728 16777216 0 +( 852 1172 -124 ) ( 828 1172 -124 ) ( 828 1172 -212 ) subway/1_news_side1 -4 16 0 0.700000 0.700000 134217728 16777216 0 +( 830 1140 -128 ) ( 830 1180 -128 ) ( 830 1180 -216 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 848 1140 -132 ) ( 824 1140 -132 ) ( 824 1180 -132 ) subway/1_news_top1 -3 -22 0 0.700000 -0.700000 134217728 16777216 0 +( 824 1176 -160 ) ( 824 1136 -160 ) ( 848 1136 -160 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 472 +{ +"classname" "func_group" +// brush 0 +{ +( 523 -778 -534 ) ( 523 -778 -446 ) ( 523 -754 -446 ) subway/1_black 4540 -624 0 0.500000 0.500000 134217728 0 0 +( 535 -746 -536 ) ( 535 -746 -448 ) ( 495 -746 -448 ) subway/1_black -718 -624 0 0.500000 0.500000 134217728 0 0 +( 503 -758 -532 ) ( 503 -758 -444 ) ( 503 -782 -444 ) subway/1_black 4540 -624 0 0.500000 0.500000 134217728 0 0 +( 487 -756 -536 ) ( 487 -756 -448 ) ( 527 -756 -448 ) subway/1_black -718 -624 0 0.500000 0.500000 134217728 0 0 +( 491 -754 -472 ) ( 531 -754 -472 ) ( 531 -778 -472 ) subway/1_black -718 -4540 0 0.500000 0.500000 134217728 0 0 +( 535 -778 -480 ) ( 535 -754 -480 ) ( 495 -754 -480 ) subway/1_black -718 -4540 0 0.500000 0.500000 134217728 0 0 +} +// brush 1 +{ +( 535 -778 -472 ) ( 535 -754 -472 ) ( 495 -754 -472 ) subway/1_black -718 -4540 0 0.500000 0.500000 134217728 16777216 0 +( 491 -754 -444 ) ( 531 -754 -444 ) ( 531 -778 -444 ) subway/1_news_topB 1056 1149 90 -0.700000 -0.700000 134217728 0 0 +( 491 -760 -528 ) ( 491 -760 -440 ) ( 531 -760 -440 ) subway/1_black -718 -624 0 0.500000 0.500000 134217728 16777216 0 +( 499 -758 -524 ) ( 499 -758 -436 ) ( 499 -782 -436 ) subway/1_news_sideB -224 -429 0 -0.700000 0.700000 134217728 0 0 +( 535 -742 -528 ) ( 535 -742 -440 ) ( 495 -742 -440 ) subway/1_news_frontB 1149 -173 0 -0.700000 0.700000 134217728 0 0 +( 527 -778 -526 ) ( 527 -778 -438 ) ( 527 -754 -438 ) subway/1_news_sideB -224 -429 0 -0.700000 0.700000 134217728 0 0 +} +} +// entity 473 +{ +"classname" "func_group" +// brush 0 +{ +( 392 -232 -472 ) ( 392 -192 -472 ) ( 368 -192 -472 ) subway/1_black -1312 -352 0 0.500000 0.500000 134217728 0 0 +( 368 -196 -444 ) ( 392 -196 -444 ) ( 392 -236 -444 ) subway/1_news_top1 1123 529 0 -0.700000 -0.700000 134217728 0 0 +( 386 -196 -440 ) ( 386 -236 -440 ) ( 386 -236 -528 ) subway/1_black 352 -960 0 0.500000 0.500000 134217728 16777216 0 +( 364 -228 -436 ) ( 388 -228 -436 ) ( 388 -228 -524 ) subway/1_news_top1 1123 -429 0 -0.700000 0.700000 134217728 16777216 0 +( 404 -232 -440 ) ( 404 -192 -440 ) ( 404 -192 -528 ) subway/1_news_front1 273 -685 0 0.700000 0.700000 134217728 16777216 0 +( 392 -200 -438 ) ( 368 -200 -438 ) ( 368 -200 -526 ) subway/1_news_side1 1155 -367 0 -0.700000 0.700000 134217728 0 0 +} +// brush 1 +{ +( 392 -204 -446 ) ( 368 -204 -446 ) ( 368 -204 -534 ) subway/1_black -1328 -960 0 0.500000 0.500000 134217728 0 0 +( 400 -232 -448 ) ( 400 -192 -448 ) ( 400 -192 -536 ) subway/1_black 416 -960 0 0.500000 0.500000 134217728 0 0 +( 364 -224 -444 ) ( 388 -224 -444 ) ( 388 -224 -532 ) subway/1_black -1328 -960 0 0.500000 0.500000 134217728 0 0 +( 390 -200 -448 ) ( 390 -240 -448 ) ( 390 -240 -536 ) subway/1_black 416 -960 0 0.500000 0.500000 134217728 0 0 +( 368 -196 -472 ) ( 392 -196 -472 ) ( 392 -236 -472 ) subway/1_black -1328 -416 0 0.500000 0.500000 134217728 0 0 +( 392 -232 -480 ) ( 392 -192 -480 ) ( 368 -192 -480 ) subway/1_black -1328 -416 0 0.500000 0.500000 134217728 0 0 +} +} +// entity 474 +{ +"classname" "trigger_multiple" +"target" "t15" +// brush 0 +{ +( 1680 1784 -320 ) ( 1680 1752 -320 ) ( 1680 1752 -448 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1816 1784 -320 ) ( 1800 1784 -320 ) ( 1800 1784 -448 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1816 1752 -320 ) ( 1816 1784 -320 ) ( 1816 1784 -448 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1808 1776 -320 ) ( 1824 1776 -320 ) ( 1824 1776 -448 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1800 1752 -288 ) ( 1800 1784 -288 ) ( 1816 1784 -288 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1816 1784 -536 ) ( 1800 1784 -536 ) ( 1800 1752 -536 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +} +} +// entity 475 +{ +"classname" "trigger_multiple" +"target" "t21" +// brush 0 +{ +( 1812 1744 -536 ) ( 1796 1744 -536 ) ( 1796 1712 -536 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1796 1712 -288 ) ( 1796 1744 -288 ) ( 1812 1744 -288 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1804 1736 -320 ) ( 1820 1736 -320 ) ( 1820 1736 -448 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1812 1712 -320 ) ( 1812 1744 -320 ) ( 1812 1744 -448 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1812 1744 -320 ) ( 1796 1744 -320 ) ( 1796 1744 -448 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +( 1676 1744 -320 ) ( 1676 1712 -320 ) ( 1676 1712 -448 ) subway/trigger 32 16 0 0.500000 0.500000 0 144 0 +} +} +// entity 476 +{ +"target" "t7" +"classname" "trigger_multiple" +// brush 0 +{ +( 704 -120 -536 ) ( 680 -120 -536 ) ( 680 -144 -536 ) subway/trigger 0 0 0 1 1 0 144 0 +( 692 -144 -328 ) ( 692 -120 -328 ) ( 716 -120 -328 ) subway/trigger 0 0 0 1 1 0 144 0 +( 720 -120 -448 ) ( 744 -120 -448 ) ( 744 -120 -480 ) subway/trigger 0 0 0 1 1 0 144 0 +( 824 -128 -448 ) ( 824 -104 -448 ) ( 824 -104 -480 ) subway/trigger 0 0 0 1 1 0 144 0 +( 712 -112 -552 ) ( 688 -112 -552 ) ( 688 -112 -584 ) subway/trigger 0 0 0 1 1 0 144 0 +( 688 -160 -448 ) ( 688 -184 -448 ) ( 688 -184 -480 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 477 +{ +"target" "t8" +"classname" "trigger_multiple" +// brush 0 +{ +( 688 -112 -448 ) ( 688 -136 -448 ) ( 688 -136 -480 ) subway/trigger 0 0 0 1 1 0 144 0 +( 712 -64 -552 ) ( 688 -64 -552 ) ( 688 -64 -584 ) subway/trigger 0 0 0 1 1 0 144 0 +( 824 -80 -448 ) ( 824 -56 -448 ) ( 824 -56 -480 ) subway/trigger 0 0 0 1 1 0 144 0 +( 720 -72 -448 ) ( 744 -72 -448 ) ( 744 -72 -480 ) subway/trigger 0 0 0 1 1 0 144 0 +( 692 -96 -328 ) ( 692 -72 -328 ) ( 716 -72 -328 ) subway/trigger 0 0 0 1 1 0 144 0 +( 704 -72 -536 ) ( 680 -72 -536 ) ( 680 -96 -536 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 478 +{ +"target" "t6" +"classname" "trigger_multiple" +// brush 0 +{ +( 240 -800 -216 ) ( 208 -800 -216 ) ( 208 -840 -216 ) subway/trigger 0 0 0 1 1 0 144 0 +( 208 -840 -120 ) ( 208 -800 -120 ) ( 240 -800 -120 ) subway/trigger 0 0 0 1 1 0 144 0 +( 208 -848 -144 ) ( 240 -848 -144 ) ( 240 -848 -184 ) subway/trigger 0 0 0 1 1 0 144 0 +( 240 -776 -136 ) ( 240 -736 -136 ) ( 240 -736 -176 ) subway/trigger 0 0 0 1 1 0 144 0 +( 240 -688 -144 ) ( 208 -688 -144 ) ( 208 -688 -184 ) subway/trigger 0 0 0 1 1 0 144 0 +( 232 -808 -144 ) ( 232 -848 -144 ) ( 232 -848 -184 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 479 +{ +"classname" "trigger_multiple" +"target" "t19" +// brush 0 +{ +( 312 -808 -144 ) ( 312 -848 -144 ) ( 312 -848 -184 ) subway/trigger 0 0 0 1 1 0 144 0 +( 320 -688 -144 ) ( 288 -688 -144 ) ( 288 -688 -184 ) subway/trigger 0 0 0 1 1 0 144 0 +( 320 -776 -136 ) ( 320 -736 -136 ) ( 320 -736 -176 ) subway/trigger 0 0 0 1 1 0 144 0 +( 288 -848 -144 ) ( 320 -848 -144 ) ( 320 -848 -184 ) subway/trigger 0 0 0 1 1 0 144 0 +( 288 -840 -120 ) ( 288 -800 -120 ) ( 320 -800 -120 ) subway/trigger 0 0 0 1 1 0 144 0 +( 320 -800 -216 ) ( 288 -800 -216 ) ( 288 -840 -216 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 480 +{ +"surfaceType" "37" +"health" "10" +"classname" "func_breakable_brush" +"material" "7" +"target" "t130" +// brush 0 +{ +( 656 -316 -180 ) ( 656 -228 -180 ) ( 648 -228 -180 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 648 -228 -140 ) ( 656 -228 -140 ) ( 656 -316 -140 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 648 -252 -152 ) ( 648 -252 -148 ) ( 656 -252 -148 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 648 -240 -164 ) ( 648 -240 -160 ) ( 648 -328 -160 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 656 -216 -160 ) ( 656 -216 -156 ) ( 648 -216 -156 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 652 -316 -160 ) ( 652 -316 -156 ) ( 652 -228 -156 ) subway/glass 0 0 0 1 1 0 620759040 0 +} +// brush 1 +{ +( 652 -300 -160 ) ( 652 -300 -156 ) ( 652 -212 -156 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 656 -200 -160 ) ( 656 -200 -156 ) ( 648 -200 -156 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 648 -224 -172 ) ( 648 -224 -168 ) ( 648 -312 -168 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 648 -216 -152 ) ( 648 -216 -148 ) ( 656 -216 -148 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 648 -212 -140 ) ( 656 -212 -140 ) ( 656 -300 -140 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 656 -300 -168 ) ( 656 -212 -168 ) ( 648 -212 -168 ) subway/glass 0 0 0 1 1 0 620759040 0 +} +// brush 2 +{ +( 656 -252 -180 ) ( 656 -164 -180 ) ( 648 -164 -180 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 648 -164 -140 ) ( 656 -164 -140 ) ( 656 -252 -140 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 648 -200 -152 ) ( 648 -200 -148 ) ( 656 -200 -148 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 648 -164 -172 ) ( 648 -164 -168 ) ( 648 -252 -168 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 656 -164 -160 ) ( 656 -164 -156 ) ( 648 -164 -156 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 652 -256 -160 ) ( 652 -256 -156 ) ( 652 -168 -156 ) subway/glass 0 0 0 1 1 0 620759040 0 +} +} +// entity 481 +{ +"classname" "func_group" +// brush 0 +{ +( 1820 572 -536 ) ( 1844 572 -536 ) ( 1844 596 -536 ) subway/1_trim1 16 0 0 0.500000 0.500000 134217728 0 0 +( 1824 576 -528 ) ( 1824 592 -528 ) ( 1840 592 -528 ) subway/metalfloor1 16 -32 0 0.500000 0.500000 134217728 16777216 0 +( 1844 572 -536 ) ( 1820 572 -536 ) ( 1824 576 -528 ) subway/1_trim1 16 16 0 0.500000 0.500000 134217728 0 0 +( 1844 592 -536 ) ( 1844 576 -536 ) ( 1840 576 -528 ) subway/1_trim1 0 16 0 0.500000 0.500000 134217728 0 0 +( 1820 596 -536 ) ( 1844 596 -536 ) ( 1840 592 -528 ) subway/1_trim1 16 16 0 0.500000 0.500000 134217728 0 0 +( 1820 576 -536 ) ( 1820 592 -536 ) ( 1824 592 -528 ) subway/1_trim1 0 16 0 0.500000 0.500000 134217728 0 0 +} +// brush 1 +{ +( 1828 588 -520 ) ( 1828 572 -520 ) ( 1828 572 -528 ) subway/metalrib1 8 16 0 0.500000 0.500000 134217728 16777216 0 +( 1840 588 -520 ) ( 1824 588 -520 ) ( 1824 588 -528 ) subway/metalrib1 24 16 0 0.500000 0.500000 134217728 16777216 0 +( 1836 580 -520 ) ( 1836 596 -520 ) ( 1836 596 -528 ) subway/metalrib1 8 16 0 0.500000 0.500000 134217728 16777216 0 +( 1824 580 -520 ) ( 1840 580 -520 ) ( 1840 580 -528 ) subway/metalrib1 24 16 0 0.500000 0.500000 134217728 16777216 0 +( 1824 576 -476 ) ( 1824 592 -476 ) ( 1840 592 -476 ) subway/metalrib1 24 0 0 0.500000 0.500000 134217728 16777216 0 +( 1840 592 -528 ) ( 1824 592 -528 ) ( 1824 576 -528 ) subway/metalrib1 24 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( 1824 592 -476 ) ( 1824 576 -476 ) ( 1824 576 -528 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1840 592 -476 ) ( 1824 592 -476 ) ( 1824 592 -528 ) subway/button2a 0 16 0 0.500000 0.500000 134217728 16777217 5000 +( 1840 576 -476 ) ( 1840 592 -476 ) ( 1840 592 -528 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1824 576 -476 ) ( 1840 576 -476 ) ( 1840 576 -528 ) subway/button2a 0 16 0 0.500000 0.500000 0 16777217 5000 +( 1824 576 -472 ) ( 1824 592 -472 ) ( 1840 592 -472 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 1840 592 -488 ) ( 1824 592 -488 ) ( 1824 576 -488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 482 +{ +"classname" "func_group" +// brush 0 +{ +( 2040 1920 -432 ) ( 2040 1824 -432 ) ( 2072 1824 -432 ) subway/1_stair_top1 16 16 0 0.500000 0.500000 0 285212672 0 +( 2072 1816 -424 ) ( 2040 1816 -424 ) ( 2040 1912 -424 ) subway/1_stair_top1 0 32 90 0.500000 0.500000 0 285212672 0 +( 2064 1816 -424 ) ( 2064 1912 -424 ) ( 2064 1912 -432 ) subway/1_stair_top1 -16 48 0 0.500000 0.500000 0 285212672 0 +( 2072 1920 -424 ) ( 2040 1920 -424 ) ( 2040 1920 -432 ) subway/1_stair_top1 16 48 0 0.500000 0.500000 0 285212672 0 +( 2040 1920 -424 ) ( 2040 1824 -424 ) ( 2040 1824 -432 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2040 1808 -424 ) ( 2072 1808 -424 ) ( 2072 1808 -432 ) subway/1_stair_top1 16 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 1 +{ +( 2064 1920 -424 ) ( 2064 1824 -424 ) ( 2096 1824 -424 ) subway/1_stair_top1 16 32 0 0.500000 0.500000 0 285212672 0 +( 2096 1816 -416 ) ( 2064 1816 -416 ) ( 2064 1912 -416 ) subway/1_stair_top1 0 48 90 0.500000 0.500000 0 285212672 0 +( 2088 1816 -416 ) ( 2088 1912 -416 ) ( 2088 1912 -424 ) subway/1_stair_top1 -16 0 0 0.500000 0.500000 0 285212672 0 +( 2096 1920 -416 ) ( 2064 1920 -416 ) ( 2064 1920 -424 ) subway/1_stair_top1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2064 1920 -416 ) ( 2064 1824 -416 ) ( 2064 1824 -424 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2064 1808 -416 ) ( 2096 1808 -416 ) ( 2096 1808 -424 ) subway/1_stair_top1 0 0 0 0.500000 0.500000 0 285212672 0 +} +// brush 2 +{ +( 2088 1920 -416 ) ( 2088 1824 -416 ) ( 2120 1824 -416 ) subway/1_stair_top1 16 48 0 0.500000 0.500000 0 285212672 0 +( 2120 1816 -408 ) ( 2088 1816 -408 ) ( 2088 1912 -408 ) subway/1_stair_top1 0 0 90 0.500000 0.500000 0 285212672 0 +( 2112 1816 -408 ) ( 2112 1912 -408 ) ( 2112 1912 -416 ) subway/1_stair_top1 -16 16 0 0.500000 0.500000 0 285212672 0 +( 2120 1920 -408 ) ( 2088 1920 -408 ) ( 2088 1920 -416 ) subway/1_stair_top1 16 16 0 0.500000 0.500000 0 285212672 0 +( 2088 1920 -408 ) ( 2088 1824 -408 ) ( 2088 1824 -416 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2088 1808 -408 ) ( 2120 1808 -408 ) ( 2120 1808 -416 ) subway/1_stair_top1 16 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 3 +{ +( 2136 1808 -392 ) ( 2168 1808 -392 ) ( 2168 1808 -400 ) subway/1_stair_top1 16 48 0 0.500000 0.500000 0 285212672 0 +( 2136 1920 -392 ) ( 2136 1824 -392 ) ( 2136 1824 -400 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2168 1920 -392 ) ( 2136 1920 -392 ) ( 2136 1920 -400 ) subway/1_stair_top1 16 48 0 0.500000 0.500000 0 285212672 0 +( 2160 1816 -392 ) ( 2160 1912 -392 ) ( 2160 1912 -400 ) subway/1_stair_top1 -16 48 0 0.500000 0.500000 0 285212672 0 +( 2168 1816 -392 ) ( 2136 1816 -392 ) ( 2136 1912 -392 ) subway/1_stair_top1 0 32 90 0.500000 0.500000 0 285212672 0 +( 2136 1920 -400 ) ( 2136 1824 -400 ) ( 2168 1824 -400 ) subway/1_stair_top1 16 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 4 +{ +( 2112 1920 -408 ) ( 2112 1824 -408 ) ( 2144 1824 -408 ) subway/1_stair_top1 16 0 0 0.500000 0.500000 0 285212672 0 +( 2144 1816 -400 ) ( 2112 1816 -400 ) ( 2112 1912 -400 ) subway/1_stair_top1 0 16 90 0.500000 0.500000 0 285212672 0 +( 2136 1816 -400 ) ( 2136 1912 -400 ) ( 2136 1912 -408 ) subway/1_stair_top1 -16 32 0 0.500000 0.500000 0 285212672 0 +( 2144 1920 -400 ) ( 2112 1920 -400 ) ( 2112 1920 -408 ) subway/1_stair_top1 0 32 0 0.500000 0.500000 0 285212672 0 +( 2112 1920 -400 ) ( 2112 1824 -400 ) ( 2112 1824 -408 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2112 1808 -400 ) ( 2144 1808 -400 ) ( 2144 1808 -408 ) subway/1_stair_top1 0 32 0 0.500000 0.500000 0 285212672 0 +} +} +// entity 483 +{ +"classname" "func_group" +// brush 0 +{ +( 2032 2176 -480 ) ( 1936 2176 -480 ) ( 1936 2144 -480 ) subway/1_stair_top1 0 48 0 0.500000 0.500000 0 285212672 0 +( 1928 2144 -472 ) ( 1928 2176 -472 ) ( 2024 2176 -472 ) subway/1_stair_top1 24 16 0 0.500000 0.500000 0 285212672 0 +( 1928 2152 -472 ) ( 2024 2152 -472 ) ( 2024 2152 -480 ) subway/1_stair_top1 0 16 0 0.500000 0.500000 0 285212672 0 +( 2032 2144 -472 ) ( 2032 2176 -472 ) ( 2032 2176 -480 ) subway/1_stair_top1 -16 16 0 0.500000 0.500000 0 285212672 0 +( 2032 2176 -472 ) ( 1936 2176 -472 ) ( 1936 2176 -480 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 1920 2176 -472 ) ( 1920 2144 -472 ) ( 1920 2144 -480 ) subway/1_stair_top1 -16 16 0 0.500000 0.500000 0 285212672 0 +} +// brush 1 +{ +( 2032 2152 -472 ) ( 1936 2152 -472 ) ( 1936 2120 -472 ) subway/1_stair_top1 0 0 0 0.500000 0.500000 0 285212672 0 +( 1928 2120 -464 ) ( 1928 2152 -464 ) ( 2024 2152 -464 ) subway/1_stair_top1 24 32 0 0.500000 0.500000 0 285212672 0 +( 1928 2128 -464 ) ( 2024 2128 -464 ) ( 2024 2128 -472 ) subway/1_stair_top1 0 32 0 0.500000 0.500000 0 285212672 0 +( 2032 2120 -464 ) ( 2032 2152 -464 ) ( 2032 2152 -472 ) subway/1_stair_top1 0 32 0 0.500000 0.500000 0 285212672 0 +( 2032 2152 -464 ) ( 1936 2152 -464 ) ( 1936 2152 -472 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 1920 2152 -464 ) ( 1920 2120 -464 ) ( 1920 2120 -472 ) subway/1_stair_top1 0 32 0 0.500000 0.500000 0 285212672 0 +} +// brush 2 +{ +( 2032 2128 -464 ) ( 1936 2128 -464 ) ( 1936 2096 -464 ) subway/1_stair_top1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1928 2096 -456 ) ( 1928 2128 -456 ) ( 2024 2128 -456 ) subway/1_stair_top1 24 48 0 0.500000 0.500000 0 285212672 0 +( 1928 2104 -456 ) ( 2024 2104 -456 ) ( 2024 2104 -464 ) subway/1_stair_top1 0 48 0 0.500000 0.500000 0 285212672 0 +( 2032 2096 -456 ) ( 2032 2128 -456 ) ( 2032 2128 -464 ) subway/1_stair_top1 -16 48 0 0.500000 0.500000 0 285212672 0 +( 2032 2128 -456 ) ( 1936 2128 -456 ) ( 1936 2128 -464 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 1920 2128 -456 ) ( 1920 2096 -456 ) ( 1920 2096 -464 ) subway/1_stair_top1 -16 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 3 +{ +( 1920 2080 -440 ) ( 1920 2048 -440 ) ( 1920 2048 -448 ) subway/1_stair_top1 -16 16 0 0.500000 0.500000 0 285212672 0 +( 2032 2080 -440 ) ( 1936 2080 -440 ) ( 1936 2080 -448 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2032 2048 -440 ) ( 2032 2080 -440 ) ( 2032 2080 -448 ) subway/1_stair_top1 -16 16 0 0.500000 0.500000 0 285212672 0 +( 1928 2056 -440 ) ( 2024 2056 -440 ) ( 2024 2056 -448 ) subway/1_stair_top1 0 16 0 0.500000 0.500000 0 285212672 0 +( 1928 2048 -440 ) ( 1928 2080 -440 ) ( 2024 2080 -440 ) subway/1_stair_top1 24 16 0 0.500000 0.500000 0 285212672 0 +( 2032 2080 -448 ) ( 1936 2080 -448 ) ( 1936 2048 -448 ) subway/1_stair_top1 0 48 0 0.500000 0.500000 0 285212672 0 +} +// brush 4 +{ +( 2032 2104 -456 ) ( 1936 2104 -456 ) ( 1936 2072 -456 ) subway/1_stair_top1 0 32 0 0.500000 0.500000 0 285212672 0 +( 1928 2072 -448 ) ( 1928 2104 -448 ) ( 2024 2104 -448 ) subway/1_stair_top1 24 0 0 0.500000 0.500000 0 285212672 0 +( 1928 2080 -448 ) ( 2024 2080 -448 ) ( 2024 2080 -456 ) subway/1_stair_top1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2032 2072 -448 ) ( 2032 2104 -448 ) ( 2032 2104 -456 ) subway/1_stair_top1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2032 2104 -448 ) ( 1936 2104 -448 ) ( 1936 2104 -456 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 1920 2104 -448 ) ( 1920 2072 -448 ) ( 1920 2072 -456 ) subway/1_stair_top1 0 0 0 0.500000 0.500000 0 285212672 0 +} +} +// entity 484 +{ +"classname" "func_group" +// brush 0 +{ +( 2040 2088 -408 ) ( 2040 2088 -392 ) ( 2040 2032 -392 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2088 -408 ) ( 2048 2088 -392 ) ( 2040 2088 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2072 2088 -392 ) ( 2072 2088 -408 ) ( 2072 1904 -408 ) subway/1_tile_top -16 0 0 0.500000 0.500000 0 318767104 0 +( 2032 2056 -392 ) ( 2056 2056 -392 ) ( 2056 2056 -440 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2032 1968 -392 ) ( 2032 1992 -392 ) ( 2056 1992 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2056 1992 -400 ) ( 2032 1992 -400 ) ( 2032 1968 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1 +{ +( 2056 1992 -432 ) ( 2032 1992 -432 ) ( 2032 1968 -432 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2032 1968 -400 ) ( 2032 1992 -400 ) ( 2056 1992 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2032 2056 -384 ) ( 2056 2056 -384 ) ( 2056 2056 -432 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2072 2088 -376 ) ( 2072 2088 -424 ) ( 2072 1904 -424 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2048 2088 -424 ) ( 2048 2088 -376 ) ( 2040 2088 -376 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2040 2088 -424 ) ( 2040 2088 -376 ) ( 2040 2032 -376 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 2 +{ +( 2040 2088 -448 ) ( 2040 2088 -400 ) ( 2040 2032 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2088 -448 ) ( 2048 2088 -400 ) ( 2040 2088 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2072 2088 -400 ) ( 2072 2088 -448 ) ( 2072 1904 -448 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2032 2056 -400 ) ( 2056 2056 -400 ) ( 2056 2056 -448 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2032 1968 -432 ) ( 2032 1992 -432 ) ( 2056 1992 -432 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 2056 1992 -448 ) ( 2032 1992 -448 ) ( 2032 1968 -448 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3 +{ +( 2040 2088 -464 ) ( 2040 2088 -416 ) ( 2040 2032 -416 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2048 2088 -464 ) ( 2048 2088 -416 ) ( 2040 2088 -416 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2072 2088 -416 ) ( 2072 2088 -464 ) ( 2072 1904 -464 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2032 2056 -416 ) ( 2056 2056 -416 ) ( 2056 2056 -464 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2032 1968 -448 ) ( 2032 1992 -448 ) ( 2056 1992 -448 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2056 1992 -464 ) ( 2032 1992 -464 ) ( 2032 1968 -464 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +} +// entity 485 +{ +"classname" "func_group" +// brush 0 +{ +( 2056 2344 -400 ) ( 2032 2344 -400 ) ( 2032 2320 -400 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2032 2320 -392 ) ( 2032 2344 -392 ) ( 2056 2344 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2032 2408 -392 ) ( 2056 2408 -392 ) ( 2056 2408 -440 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2072 2440 -392 ) ( 2072 2440 -408 ) ( 2072 2256 -408 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2440 -408 ) ( 2048 2440 -392 ) ( 2040 2440 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +( 2040 2440 -408 ) ( 2040 2440 -392 ) ( 2040 2384 -392 ) subway/1_tile_top 16 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 1 +{ +( 2040 2440 -424 ) ( 2040 2440 -376 ) ( 2040 2384 -376 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2048 2440 -432 ) ( 2048 2440 -384 ) ( 2040 2440 -384 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2072 2440 -376 ) ( 2072 2440 -424 ) ( 2072 2256 -424 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2032 2408 -376 ) ( 2056 2408 -376 ) ( 2056 2408 -424 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2032 2320 -400 ) ( 2032 2344 -400 ) ( 2056 2344 -400 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2056 2344 -432 ) ( 2032 2344 -432 ) ( 2032 2320 -432 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2 +{ +( 2056 2344 -448 ) ( 2032 2344 -448 ) ( 2032 2320 -448 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( 2032 2320 -432 ) ( 2032 2344 -432 ) ( 2056 2344 -432 ) subway/1_tile_middle 0 -16 0 0.500000 0.500000 0 318767104 0 +( 2032 2408 -400 ) ( 2056 2408 -400 ) ( 2056 2408 -448 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2072 2440 -400 ) ( 2072 2440 -448 ) ( 2072 2256 -448 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2048 2440 -448 ) ( 2048 2440 -400 ) ( 2040 2440 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 2040 2440 -448 ) ( 2040 2440 -400 ) ( 2040 2384 -400 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3 +{ +( 2056 2344 -464 ) ( 2032 2344 -464 ) ( 2032 2320 -464 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2032 2320 -448 ) ( 2032 2344 -448 ) ( 2056 2344 -448 ) subway/1_tile 32 0 0 0.500000 0.500000 0 318767104 0 +( 2032 2408 -416 ) ( 2056 2408 -416 ) ( 2056 2408 -464 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2072 2440 -416 ) ( 2072 2440 -464 ) ( 2072 2256 -464 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +( 2048 2440 -464 ) ( 2048 2440 -416 ) ( 2040 2440 -416 ) subway/1_tile 32 16 0 0.500000 0.500000 0 318767104 0 +( 2040 2440 -464 ) ( 2040 2440 -416 ) ( 2040 2384 -416 ) subway/1_tile 0 16 0 0.500000 0.500000 0 318767104 0 +} +} +// entity 486 +{ +"classname" "func_group" +// brush 0 +{ +( -280 -944 -376 ) ( -280 -944 -328 ) ( -280 -952 -328 ) subway/1_black 240 -8 0 0.500000 0.500000 134217728 16777216 0 +( -296 -952 -376 ) ( -296 -952 -328 ) ( -240 -952 -328 ) subway/1_poster_top 560 -16 0 0.500000 0.500000 134217728 0 0 +( -248 -952 -376 ) ( -248 -952 -328 ) ( -248 -944 -328 ) subway/1_black 240 -8 0 0.500000 0.500000 134217728 16777216 0 +( -240 -950 -376 ) ( -240 -950 -328 ) ( -296 -950 -328 ) subway/1_poster_top 560 0 0 0.500000 0.500000 134217728 0 800 +( -240 -952 -344 ) ( -296 -952 -344 ) ( -296 -944 -344 ) subway/1_black 560 -240 0 0.500000 0.500000 134217728 16777216 0 +( -296 -944 -348 ) ( -296 -952 -348 ) ( -240 -952 -348 ) subway/1_poster_top 560 -240 0 0.500000 0.500000 134217728 0 0 +} +// brush 1 +{ +( -280 -944 -380 ) ( -280 -944 -332 ) ( -280 -952 -332 ) subway/1_black 240 -8 0 0.500000 0.500000 134217728 16777216 0 +( -296 -952 -380 ) ( -296 -952 -332 ) ( -240 -952 -332 ) subway/1_poster2 560 8 0 0.500000 0.500000 134217728 0 0 +( -248 -952 -380 ) ( -248 -952 -332 ) ( -248 -944 -332 ) subway/1_black 240 -8 0 0.500000 0.500000 134217728 16777216 0 +( -240 -950 -380 ) ( -240 -950 -332 ) ( -296 -950 -332 ) subway/1_poster2 16 8 0 -0.500000 0.500000 134217728 536870912 30000 +( -240 -952 -348 ) ( -296 -952 -348 ) ( -296 -944 -348 ) subway/1_poster2 560 -240 0 0.500000 0.500000 134217728 0 0 +( -296 -944 -380 ) ( -296 -952 -380 ) ( -240 -952 -380 ) subway/1_poster2 560 -240 0 0.500000 0.500000 134217728 0 0 +} +// brush 2 +{ +( -296 -944 -384 ) ( -296 -952 -384 ) ( -240 -952 -384 ) subway/1_black 560 -240 0 0.500000 0.500000 134217728 16777216 0 +( -240 -952 -380 ) ( -296 -952 -380 ) ( -296 -944 -380 ) subway/1_poster_top 560 -232 0 0.500000 0.500000 134217728 0 0 +( -240 -950 -412 ) ( -240 -950 -364 ) ( -296 -950 -364 ) subway/1_poster_top 560 0 0 0.500000 0.500000 134217728 0 800 +( -248 -952 -412 ) ( -248 -952 -364 ) ( -248 -944 -364 ) subway/1_black 240 -8 0 0.500000 0.500000 134217728 16777216 0 +( -296 -952 -412 ) ( -296 -952 -364 ) ( -240 -952 -364 ) subway/1_poster_top 560 0 0 0.500000 0.500000 134217728 0 0 +( -280 -944 -412 ) ( -280 -944 -364 ) ( -280 -952 -364 ) subway/1_black 240 -8 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 487 +{ +"classname" "func_group" +// brush 0 +{ +( -292 -824 -348 ) ( -348 -824 -348 ) ( -348 -832 -348 ) subway/1_poster_top 664 0 0 0.500000 0.500000 134217728 0 0 +( -348 -832 -344 ) ( -348 -824 -344 ) ( -292 -824 -344 ) subway/1_black 664 0 0 0.500000 0.500000 134217728 16777216 0 +( -348 -826 -328 ) ( -292 -826 -328 ) ( -292 -826 -376 ) subway/1_poster_top 664 0 0 0.500000 0.500000 134217728 0 800 +( -300 -832 -328 ) ( -300 -824 -328 ) ( -300 -824 -376 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -292 -824 -328 ) ( -348 -824 -328 ) ( -348 -824 -376 ) subway/1_poster_top 664 -8 0 0.500000 0.500000 134217728 0 0 +( -332 -824 -328 ) ( -332 -832 -328 ) ( -332 -832 -376 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1 +{ +( -292 -824 -380 ) ( -348 -824 -380 ) ( -348 -832 -380 ) subway/1_poster2 664 0 0 0.500000 0.500000 134217728 0 0 +( -348 -832 -348 ) ( -348 -824 -348 ) ( -292 -824 -348 ) subway/1_poster2 664 0 0 0.500000 0.500000 134217728 0 0 +( -348 -826 -332 ) ( -292 -826 -332 ) ( -292 -826 -380 ) subway/1_poster1 152 8 0 0.500000 0.500000 134217728 0 800 +( -300 -832 -332 ) ( -300 -824 -332 ) ( -300 -824 -380 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -292 -824 -332 ) ( -348 -824 -332 ) ( -348 -824 -380 ) subway/1_poster2 664 16 0 0.500000 0.500000 134217728 0 0 +( -332 -824 -332 ) ( -332 -832 -332 ) ( -332 -832 -380 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( -332 -824 -364 ) ( -332 -832 -364 ) ( -332 -832 -412 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -292 -824 -364 ) ( -348 -824 -364 ) ( -348 -824 -412 ) subway/1_poster_top 664 8 0 0.500000 0.500000 134217728 0 0 +( -300 -832 -364 ) ( -300 -824 -364 ) ( -300 -824 -412 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -348 -826 -364 ) ( -292 -826 -364 ) ( -292 -826 -412 ) subway/1_poster_top 664 16 0 0.500000 0.500000 134217728 0 800 +( -348 -832 -380 ) ( -348 -824 -380 ) ( -292 -824 -380 ) subway/1_poster_top 664 8 0 0.500000 0.500000 134217728 0 0 +( -292 -824 -384 ) ( -348 -824 -384 ) ( -348 -832 -384 ) subway/1_black 664 0 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 488 +{ +"classname" "func_group" +// brush 0 +{ +( -132 -824 -348 ) ( -188 -824 -348 ) ( -188 -832 -348 ) subway/1_poster_top 344 0 0 0.500000 0.500000 134217728 0 0 +( -188 -832 -344 ) ( -188 -824 -344 ) ( -132 -824 -344 ) subway/1_black 344 0 0 0.500000 0.500000 134217728 16777216 0 +( -188 -826 -328 ) ( -132 -826 -328 ) ( -132 -826 -376 ) subway/1_poster_top 344 -16 0 0.500000 0.500000 134217728 0 800 +( -140 -832 -328 ) ( -140 -824 -328 ) ( -140 -824 -376 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -132 -824 -328 ) ( -188 -824 -328 ) ( -188 -824 -376 ) subway/1_poster_top 344 -16 0 0.500000 0.500000 134217728 0 0 +( -172 -824 -328 ) ( -172 -832 -328 ) ( -172 -832 -376 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1 +{ +( -132 -824 -380 ) ( -188 -824 -380 ) ( -188 -832 -380 ) subway/1_poster2 344 0 0 0.500000 0.500000 134217728 0 0 +( -188 -832 -348 ) ( -188 -824 -348 ) ( -132 -824 -348 ) subway/1_poster2 344 0 0 0.500000 0.500000 134217728 0 0 +( -188 -826 -332 ) ( -132 -826 -332 ) ( -132 -826 -380 ) subway/1_poster1 152 8 0 0.500000 0.500000 134217728 0 800 +( -140 -832 -332 ) ( -140 -824 -332 ) ( -140 -824 -380 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -132 -824 -332 ) ( -188 -824 -332 ) ( -188 -824 -380 ) subway/1_poster2 344 8 0 0.500000 0.500000 134217728 0 0 +( -172 -824 -332 ) ( -172 -832 -332 ) ( -172 -832 -380 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( -172 -824 -364 ) ( -172 -832 -364 ) ( -172 -832 -412 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -132 -824 -364 ) ( -188 -824 -364 ) ( -188 -824 -412 ) subway/1_poster_top 344 0 0 0.500000 0.500000 134217728 0 0 +( -140 -832 -364 ) ( -140 -824 -364 ) ( -140 -824 -412 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -188 -826 -364 ) ( -132 -826 -364 ) ( -132 -826 -412 ) subway/1_poster_top 344 -16 0 0.500000 0.500000 134217728 0 800 +( -188 -832 -380 ) ( -188 -824 -380 ) ( -132 -824 -380 ) subway/1_poster_top 344 8 0 0.500000 0.500000 134217728 0 0 +( -132 -824 -384 ) ( -188 -824 -384 ) ( -188 -832 -384 ) subway/1_black 344 0 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 489 +{ +"classname" "func_group" +// brush 0 +{ +( -402 -984 -304 ) ( -402 -988 -304 ) ( -400 -988 -302 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( -402 -988 -268 ) ( -402 -984 -268 ) ( -400 -984 -270 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( -484 -988 -270 ) ( -396 -988 -270 ) ( -396 -988 -318 ) subway/1_concrete_floor 11 0 90 0.500000 0.500000 134217728 16777216 0 +( -400 -988 -270 ) ( -400 -984 -270 ) ( -400 -984 -318 ) subway/1_concrete_floor -4 0 90 0.500000 0.500000 134217728 16777216 0 +( -336 -984 -270 ) ( -424 -984 -270 ) ( -424 -984 -318 ) subway/1_concrete_floor -4 0 90 0.500000 0.500000 134217728 16777216 0 +( -402 -984 -268 ) ( -402 -988 -268 ) ( -402 -988 -304 ) subway/1_concrete_floor -4 0 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1 +{ +( -336 -988 -270 ) ( -336 -984 -270 ) ( -400 -984 -270 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -356 -988 -268 ) ( -356 -984 -268 ) ( -268 -984 -268 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -418 -988 -266 ) ( -330 -988 -266 ) ( -330 -988 -314 ) subway/1_concrete_floor 0 4 0 0.500000 0.500000 134217728 16777216 0 +( -336 -984 -270 ) ( -336 -988 -270 ) ( -334 -988 -268 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -270 -984 -266 ) ( -358 -984 -266 ) ( -358 -984 -314 ) subway/1_concrete_floor 0 4 0 0.500000 0.500000 134217728 16777216 0 +( -400 -988 -270 ) ( -400 -984 -270 ) ( -402 -984 -268 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( -334 -988 -304 ) ( -334 -984 -304 ) ( -336 -984 -302 ) subway/1_concrete_floor 0 -4 90 0.500000 0.500000 134217728 16777216 0 +( -334 -984 -268 ) ( -334 -988 -268 ) ( -336 -988 -270 ) subway/1_concrete_floor 0 -4 90 0.500000 0.500000 134217728 16777216 0 +( -418 -988 -270 ) ( -330 -988 -270 ) ( -330 -988 -318 ) subway/1_concrete_floor 11 -4 90 0.500000 0.500000 134217728 16777216 0 +( -334 -984 -304 ) ( -334 -988 -304 ) ( -334 -988 -268 ) subway/1_concrete_floor -4 0 90 0.500000 0.500000 134217728 16777216 0 +( -270 -984 -270 ) ( -358 -984 -270 ) ( -358 -984 -318 ) subway/1_concrete_floor -4 -4 90 0.500000 0.500000 134217728 16777216 0 +( -336 -984 -274 ) ( -336 -988 -274 ) ( -336 -988 -322 ) subway/1_concrete_floor -4 0 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 3 +{ +( -400 -984 -302 ) ( -400 -988 -302 ) ( -402 -988 -304 ) subway/1_concrete_floor 0 -4 0 0.500000 0.500000 134217728 16777216 0 +( -402 -984 -302 ) ( -402 -984 -304 ) ( -334 -984 -304 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -336 -988 -302 ) ( -336 -984 -302 ) ( -334 -984 -304 ) subway/1_concrete_floor 0 -4 0 0.500000 0.500000 134217728 16777216 0 +( -418 -988 -300 ) ( -330 -988 -300 ) ( -330 -988 -348 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -336 -984 -302 ) ( -336 -988 -302 ) ( -400 -988 -302 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -264 -984 -304 ) ( -352 -984 -304 ) ( -352 -988 -304 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 490 +{ +"classname" "func_group" +// brush 0 +{ +( 4 -1600 -344 ) ( 4 -1664 -344 ) ( 68 -1664 -344 ) subway/1_lobby_floor 1056 -1256 0 0.500000 0.500000 0 285212672 0 +( 60 -1648 -336 ) ( -4 -1648 -336 ) ( -4 -1584 -336 ) subway/1_stair_top1 376 -48 0 0.500000 0.500000 0 285212672 0 +( -280 -1496 -344 ) ( -280 -1432 -344 ) ( -280 -1432 -352 ) subway/1_lobby_floor 1264 -208 0 0.500000 0.500000 0 285212672 0 +( -236 -1152 -336 ) ( -300 -1152 -336 ) ( -300 -1152 -344 ) subway/1_stair_side1 680 -224 0 0.500000 0.500000 0 285212672 0 +( -464 -1912 -336 ) ( -464 -1976 -336 ) ( -464 -1976 -344 ) subway/1_lobby_floor 1264 -208 0 0.500000 0.500000 0 285212672 0 +( 4 -1176 -336 ) ( 68 -1176 -336 ) ( 68 -1176 -344 ) subway/1_lobby_floor 1112 -208 0 0.500000 0.500000 0 285212672 0 +} +// brush 1 +{ +( 4 -1576 -352 ) ( 4 -1640 -352 ) ( 68 -1640 -352 ) subway/1_lobby_floor 1104 -1256 0 0.500000 0.500000 0 285212672 0 +( 68 -1624 -344 ) ( 4 -1624 -344 ) ( 4 -1560 -344 ) subway/1_stair_top1 376 0 0 0.500000 0.500000 0 285212672 0 +( -280 -1472 -352 ) ( -280 -1408 -352 ) ( -280 -1408 -360 ) subway/1_lobby_floor 1312 -224 0 0.500000 0.500000 0 285212672 0 +( -236 -1128 -344 ) ( -300 -1128 -344 ) ( -300 -1128 -352 ) subway/1_stair_side1 680 -240 0 0.500000 0.500000 0 285212672 0 +( -464 -1888 -344 ) ( -464 -1952 -344 ) ( -464 -1952 -352 ) subway/1_lobby_floor 1312 -224 0 0.500000 0.500000 0 285212672 0 +( -164 -1152 -344 ) ( -100 -1152 -344 ) ( -100 -1152 -352 ) subway/1_lobby_floor 1112 -224 0 0.500000 0.500000 0 285212672 0 +} +// brush 2 +{ +( 4 -1552 -360 ) ( 4 -1616 -360 ) ( 68 -1616 -360 ) subway/1_lobby_floor 1152 -1256 0 0.500000 0.500000 0 285212672 0 +( 68 -1600 -352 ) ( 4 -1600 -352 ) ( 4 -1536 -352 ) subway/1_stair_top1 376 48 0 0.500000 0.500000 0 285212672 0 +( -280 -1448 -360 ) ( -280 -1384 -360 ) ( -280 -1384 -368 ) subway/1_lobby_floor 1360 -240 0 0.500000 0.500000 0 285212672 0 +( -236 -1104 -352 ) ( -300 -1104 -352 ) ( -300 -1104 -360 ) subway/1_stair_side1 680 -256 0 0.500000 0.500000 0 285212672 0 +( -464 -1864 -352 ) ( -464 -1928 -352 ) ( -464 -1928 -360 ) subway/1_lobby_floor 1360 -240 0 0.500000 0.500000 0 285212672 0 +( -164 -1128 -352 ) ( -100 -1128 -352 ) ( -100 -1128 -360 ) subway/1_lobby_floor 1112 -240 0 0.500000 0.500000 0 285212672 0 +} +// brush 3 +{ +( -4 -1528 -368 ) ( -4 -1592 -368 ) ( 60 -1592 -368 ) subway/1_lobby_floor 1200 -1256 0 0.500000 0.500000 0 285212672 0 +( 68 -1576 -360 ) ( 4 -1576 -360 ) ( 4 -1512 -360 ) subway/1_stair_top1 376 -32 0 0.500000 0.500000 0 285212672 0 +( -280 -1424 -368 ) ( -280 -1360 -368 ) ( -280 -1360 -376 ) subway/1_lobby_floor 1408 -256 0 0.500000 0.500000 0 285212672 0 +( -160 -1080 -360 ) ( -224 -1080 -360 ) ( -224 -1080 -368 ) subway/1_stair_side1 680 -272 0 0.500000 0.500000 0 285212672 0 +( -464 -1840 -360 ) ( -464 -1904 -360 ) ( -464 -1904 -368 ) subway/1_lobby_floor 1408 -256 0 0.500000 0.500000 0 285212672 0 +( -164 -1104 -360 ) ( -100 -1104 -360 ) ( -100 -1104 -368 ) subway/1_lobby_floor 1112 -256 0 0.500000 0.500000 0 285212672 0 +} +// brush 4 +{ +( -88 -1080 -368 ) ( -24 -1080 -368 ) ( -24 -1080 -376 ) subway/1_lobby_floor 1112 -272 0 0.500000 0.500000 0 285212672 0 +( -464 -1816 -368 ) ( -464 -1880 -368 ) ( -464 -1880 -376 ) subway/1_lobby_floor 1456 -272 0 0.500000 0.500000 0 285212672 0 +( -236 -1056 -368 ) ( -300 -1056 -368 ) ( -300 -1056 -376 ) subway/1_stair_side1 680 -288 0 0.500000 0.500000 0 285212672 0 +( -280 -1400 -376 ) ( -280 -1336 -376 ) ( -280 -1336 -384 ) subway/1_lobby_floor 1456 -272 0 0.500000 0.500000 0 285212672 0 +( 60 -1552 -368 ) ( -4 -1552 -368 ) ( -4 -1488 -368 ) subway/1_stair_top1 376 16 0 0.500000 0.500000 0 285212672 0 +( 4 -1504 -376 ) ( 4 -1568 -376 ) ( 68 -1568 -376 ) subway/1_lobby_floor 1056 -1448 0 0.500000 0.500000 0 285212672 0 +} +// brush 5 +{ +( -164 -1056 -376 ) ( -100 -1056 -376 ) ( -100 -1056 -384 ) subway/1_lobby_floor 1112 -288 0 0.500000 0.500000 0 285212672 0 +( -464 -1792 -376 ) ( -464 -1856 -376 ) ( -464 -1856 -384 ) subway/1_lobby_floor 1504 -288 0 0.500000 0.500000 0 285212672 0 +( -236 -1032 -376 ) ( -300 -1032 -376 ) ( -300 -1032 -384 ) subway/1_stair_side1 680 -304 0 0.500000 0.500000 0 285212672 0 +( -280 -1376 -384 ) ( -280 -1312 -384 ) ( -280 -1312 -392 ) subway/1_lobby_floor 1504 -288 0 0.500000 0.500000 0 285212672 0 +( 68 -1528 -376 ) ( 4 -1528 -376 ) ( 4 -1464 -376 ) subway/1_stair_top1 376 0 0 0.500000 0.500000 0 285212672 0 +( 4 -1480 -384 ) ( 4 -1544 -384 ) ( 68 -1544 -384 ) subway/1_lobby_floor 1104 -1448 0 0.500000 0.500000 0 285212672 0 +} +// brush 6 +{ +( -164 -1032 -384 ) ( -100 -1032 -384 ) ( -100 -1032 -392 ) subway/1_lobby_floor 1112 -304 0 0.500000 0.500000 0 285212672 0 +( -464 -1768 -384 ) ( -464 -1832 -384 ) ( -464 -1832 -392 ) subway/1_lobby_floor 1552 -304 0 0.500000 0.500000 0 285212672 0 +( -236 -1008 -384 ) ( -300 -1008 -384 ) ( -300 -1008 -392 ) subway/1_stair_side1 680 -320 0 0.500000 0.500000 0 285212672 0 +( -280 -1352 -392 ) ( -280 -1288 -392 ) ( -280 -1288 -400 ) subway/1_lobby_floor 1552 -304 0 0.500000 0.500000 0 285212672 0 +( 68 -1504 -384 ) ( 4 -1504 -384 ) ( 4 -1440 -384 ) subway/1_stair_top1 376 48 0 0.500000 0.500000 0 285212672 0 +( 4 -1456 -392 ) ( 4 -1520 -392 ) ( 68 -1520 -392 ) subway/1_lobby_floor 1152 -1448 0 0.500000 0.500000 0 285212672 0 +} +// brush 7 +{ +( -164 -1008 -392 ) ( -100 -1008 -392 ) ( -100 -1008 -400 ) subway/1_lobby_floor 1112 -320 0 0.500000 0.500000 0 285212672 0 +( -464 -1744 -392 ) ( -464 -1808 -392 ) ( -464 -1808 -400 ) subway/1_lobby_floor 1600 -320 0 0.500000 0.500000 0 285212672 0 +( -68 -984 -392 ) ( -132 -984 -392 ) ( -132 -984 -400 ) subway/1_stair_side1 680 -336 0 0.500000 0.500000 0 285212672 0 +( -280 -1328 -400 ) ( -280 -1264 -400 ) ( -280 -1264 -408 ) subway/1_lobby_floor 1600 -320 0 0.500000 0.500000 0 285212672 0 +( 68 -1480 -392 ) ( 4 -1480 -392 ) ( 4 -1416 -392 ) subway/1_stair_top1 376 32 0 0.500000 0.500000 0 285212672 0 +( -4 -1432 -400 ) ( -4 -1496 -400 ) ( 60 -1496 -400 ) subway/1_lobby_floor 1200 -1448 0 0.500000 0.500000 0 285212672 0 +} +} +// entity 491 +{ +"classname" "func_group" +// brush 0 +{ +( 1208 976 -440 ) ( 1200 976 -440 ) ( 1200 960 -424 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 0 16777216 0 +( 1200 1080 -440 ) ( 1208 1080 -440 ) ( 1208 1096 -424 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 0 16777216 0 +( 1200 1040 -424 ) ( 1208 1040 -424 ) ( 1208 1008 -424 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 0 16777216 0 +( 1208 1040 -424 ) ( 1208 1040 -448 ) ( 1208 1008 -448 ) subway/metalrib1 -8 -24 90 0.500000 0.500000 0 16777216 0 +( 1200 976 -440 ) ( 1208 976 -440 ) ( 1208 1080 -440 ) subway/metalrib1 0 -24 0 0.500000 0.500000 0 16777216 0 +( 1200 1040 -448 ) ( 1200 1040 -424 ) ( 1200 1008 -424 ) subway/metalrib1 0 -24 90 0.500000 0.500000 0 16777216 0 +} +// brush 1 +{ +( 1200 1104 -496 ) ( 1200 1080 -496 ) ( 1200 1080 -528 ) subway/metalrib1 0 -8 0 0.500000 0.500000 0 16777216 0 +( 1208 1096 -496 ) ( 1200 1096 -496 ) ( 1200 1096 -528 ) subway/metalrib1 -8 -8 0 0.500000 0.500000 0 16777216 0 +( 1208 1080 -496 ) ( 1208 1104 -496 ) ( 1208 1104 -528 ) subway/metalrib1 0 -8 0 0.500000 0.500000 0 16777216 0 +( 1200 1080 -448 ) ( 1208 1080 -448 ) ( 1208 1080 -528 ) subway/metalrib1 0 -8 0 0.500000 0.500000 0 16777216 0 +( 1208 1080 -440 ) ( 1200 1080 -440 ) ( 1200 1096 -424 ) subway/metalrib1 -8 -24 0 0.500000 0.500000 0 16777216 0 +( 1208 1104 -536 ) ( 1200 1104 -536 ) ( 1200 1080 -536 ) subway/metalrib1 -8 -24 0 0.500000 0.500000 0 16777216 0 +} +// brush 2 +{ +( 1200 984 -504 ) ( 1200 960 -504 ) ( 1200 960 -536 ) subway/metalrib1 0 -8 0 0.500000 0.500000 0 16777216 0 +( 1208 976 -448 ) ( 1200 976 -448 ) ( 1200 976 -528 ) subway/metalrib1 0 -8 0 0.500000 0.500000 0 16777216 0 +( 1208 960 -496 ) ( 1208 984 -496 ) ( 1208 984 -528 ) subway/metalrib1 0 -8 0 0.500000 0.500000 0 16777216 0 +( 1200 960 -496 ) ( 1208 960 -496 ) ( 1208 960 -528 ) subway/metalrib1 -8 -8 0 0.500000 0.500000 0 16777216 0 +( 1200 976 -440 ) ( 1208 976 -440 ) ( 1208 960 -424 ) subway/metalrib1 -8 -24 0 0.500000 0.500000 0 16777216 0 +( 1208 984 -536 ) ( 1200 984 -536 ) ( 1200 960 -536 ) subway/metalrib1 -8 -24 0 0.500000 0.500000 0 16777216 0 +} +} +// entity 492 +{ +"classname" "func_group" +// brush 0 +{ +( 1064 1296 -536 ) ( 1064 1296 -504 ) ( 1064 1320 -504 ) subway/metalrib1 0 -24 0 0.500000 0.500000 0 16777216 0 +( 1064 1312 -536 ) ( 1064 1312 -504 ) ( 1056 1312 -504 ) subway/metalrib1 -8 -24 0 0.500000 0.500000 0 16777216 0 +( 1056 1320 -536 ) ( 1056 1320 -504 ) ( 1056 1296 -504 ) subway/metalrib1 0 -24 0 0.500000 0.500000 0 16777216 0 +( 1056 1296 -536 ) ( 1056 1296 -456 ) ( 1064 1296 -456 ) subway/metalrib1 0 -24 0 0.500000 0.500000 0 16777216 0 +( 1064 1312 -424 ) ( 1064 1296 -440 ) ( 1056 1296 -440 ) subway/metalrib1 -8 -24 0 0.500000 0.500000 0 16777216 0 +( 1064 1296 -536 ) ( 1064 1320 -536 ) ( 1056 1320 -536 ) subway/metalrib1 -8 -24 0 0.500000 0.500000 0 16777216 0 +} +} +// entity 493 +{ +"classname" "func_group" +// brush 0 +{ +( 28 -944 -348 ) ( 28 -952 -348 ) ( 84 -952 -348 ) subway/1_poster_top -88 -240 0 0.500000 0.500000 134217728 0 0 +( 84 -952 -344 ) ( 28 -952 -344 ) ( 28 -944 -344 ) subway/1_black -88 -240 0 0.500000 0.500000 134217728 16777216 0 +( 84 -950 -376 ) ( 84 -950 -328 ) ( 28 -950 -328 ) subway/1_poster_top -88 -16 0 0.500000 0.500000 134217728 0 800 +( 76 -952 -376 ) ( 76 -952 -328 ) ( 76 -944 -328 ) subway/1_black 240 -8 0 0.500000 0.500000 134217728 16777216 0 +( 28 -952 -376 ) ( 28 -952 -328 ) ( 84 -952 -328 ) subway/1_poster_top -88 -16 0 0.500000 0.500000 134217728 0 0 +( 44 -944 -376 ) ( 44 -944 -328 ) ( 44 -952 -328 ) subway/1_black 240 -8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1 +{ +( 28 -944 -380 ) ( 28 -952 -380 ) ( 84 -952 -380 ) subway/1_poster2 -88 -240 0 0.500000 0.500000 134217728 0 0 +( 84 -952 -348 ) ( 28 -952 -348 ) ( 28 -944 -348 ) subway/1_poster2 -88 -240 0 0.500000 0.500000 134217728 0 0 +( 84 -950 -380 ) ( 84 -950 -332 ) ( 28 -950 -332 ) subway/1_poster2a -40 8 0 -0.500000 0.500000 134217728 0 800 +( 76 -952 -380 ) ( 76 -952 -332 ) ( 76 -944 -332 ) subway/1_black 240 -8 0 0.500000 0.500000 134217728 16777216 0 +( 28 -952 -380 ) ( 28 -952 -332 ) ( 84 -952 -332 ) subway/1_poster2 -88 8 0 0.500000 0.500000 134217728 0 0 +( 44 -944 -380 ) ( 44 -944 -332 ) ( 44 -952 -332 ) subway/1_black 240 -8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( 44 -944 -412 ) ( 44 -944 -364 ) ( 44 -952 -364 ) subway/1_black 240 -8 0 0.500000 0.500000 134217728 16777216 0 +( 28 -952 -412 ) ( 28 -952 -364 ) ( 84 -952 -364 ) subway/1_poster_top -88 0 0 0.500000 0.500000 134217728 0 0 +( 76 -952 -412 ) ( 76 -952 -364 ) ( 76 -944 -364 ) subway/1_black 240 -8 0 0.500000 0.500000 134217728 16777216 0 +( 84 -950 -412 ) ( 84 -950 -364 ) ( 28 -950 -364 ) subway/1_poster_top -88 -16 0 0.500000 0.500000 134217728 0 800 +( 84 -952 -380 ) ( 28 -952 -380 ) ( 28 -944 -380 ) subway/1_poster_top -88 -232 0 0.500000 0.500000 134217728 0 0 +( 28 -944 -384 ) ( 28 -952 -384 ) ( 84 -952 -384 ) subway/1_black -88 -240 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 494 +{ +"classname" "func_group" +// brush 0 +{ +( 24 -824 -328 ) ( 24 -832 -328 ) ( 24 -832 -376 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 64 -824 -328 ) ( 8 -824 -328 ) ( 8 -824 -376 ) subway/1_poster_top 0 -16 0 0.500000 0.500000 134217728 0 0 +( 56 -832 -328 ) ( 56 -824 -328 ) ( 56 -824 -376 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 8 -826 -328 ) ( 64 -826 -328 ) ( 64 -826 -376 ) subway/1_poster_top 16 0 0 0.500000 0.500000 134217728 0 0 +( 8 -832 -344 ) ( 8 -824 -344 ) ( 64 -824 -344 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 64 -824 -348 ) ( 8 -824 -348 ) ( 8 -832 -348 ) subway/1_poster_top 0 0 0 0.500000 0.500000 134217728 0 0 +} +// brush 1 +{ +( 24 -824 -332 ) ( 24 -832 -332 ) ( 24 -832 -380 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 64 -824 -332 ) ( 8 -824 -332 ) ( 8 -824 -380 ) subway/1_poster2 0 8 0 0.500000 0.500000 134217728 0 0 +( 56 -832 -332 ) ( 56 -824 -332 ) ( 56 -824 -380 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 8 -826 -332 ) ( 64 -826 -332 ) ( 64 -826 -380 ) subway/1_poster2 16 8 0 0.500000 0.500000 134217728 0 0 +( 8 -832 -348 ) ( 8 -824 -348 ) ( 64 -824 -348 ) subway/1_poster2 0 0 0 0.500000 0.500000 134217728 0 0 +( 64 -824 -380 ) ( 8 -824 -380 ) ( 8 -832 -380 ) subway/1_poster2 0 0 0 0.500000 0.500000 134217728 0 0 +} +// brush 2 +{ +( 64 -824 -384 ) ( 8 -824 -384 ) ( 8 -832 -384 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 8 -832 -380 ) ( 8 -824 -380 ) ( 64 -824 -380 ) subway/1_poster_top 0 8 0 0.500000 0.500000 134217728 0 0 +( 8 -826 -364 ) ( 64 -826 -364 ) ( 64 -826 -412 ) subway/1_poster_top 16 0 0 0.500000 0.500000 134217728 0 0 +( 56 -832 -364 ) ( 56 -824 -364 ) ( 56 -824 -412 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( 64 -824 -364 ) ( 8 -824 -364 ) ( 8 -824 -412 ) subway/1_poster_top 0 0 0 0.500000 0.500000 134217728 0 0 +( 24 -824 -364 ) ( 24 -832 -364 ) ( 24 -832 -412 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 495 +{ +"classname" "func_group" +// brush 0 +{ +( -172 -1152 -320 ) ( -236 -1152 -320 ) ( -236 -1152 -328 ) subway/1_lobby_floor 872 -176 0 0.500000 0.500000 0 285212672 0 +( 120 -416 -320 ) ( 120 -352 -320 ) ( 120 -352 -328 ) subway/1_lobby_floor 1600 -176 0 0.500000 0.500000 0 285212672 0 +( -276 -1176 -320 ) ( -212 -1176 -320 ) ( -212 -1176 -328 ) subway/1_stair_side1 440 -192 0 0.500000 0.500000 0 285212672 0 +( -56 -832 -328 ) ( -56 -896 -328 ) ( -56 -896 -336 ) subway/1_lobby_floor 1600 -176 0 0.500000 0.500000 0 285212672 0 +( -412 -680 -320 ) ( -348 -680 -320 ) ( -348 -744 -320 ) subway/1_stair_top1 136 256 0 0.500000 -0.500000 0 285212672 0 +( -340 -728 -328 ) ( -340 -664 -328 ) ( -404 -664 -328 ) subway/1_lobby_floor 960 -1448 0 0.500000 0.500000 0 285212672 0 +} +// brush 1 +{ +( -172 -1128 -312 ) ( -236 -1128 -312 ) ( -236 -1128 -320 ) subway/1_lobby_floor 872 -160 0 0.500000 0.500000 0 285212672 0 +( 120 -392 -312 ) ( 120 -328 -312 ) ( 120 -328 -320 ) subway/1_lobby_floor 1552 -160 0 0.500000 0.500000 0 285212672 0 +( -100 -1152 -312 ) ( -36 -1152 -312 ) ( -36 -1152 -320 ) subway/1_stair_side1 440 -176 0 0.500000 0.500000 0 285212672 0 +( -56 -808 -320 ) ( -56 -872 -320 ) ( -56 -872 -328 ) subway/1_lobby_floor 1552 -160 0 0.500000 0.500000 0 285212672 0 +( -412 -656 -312 ) ( -348 -656 -312 ) ( -348 -720 -312 ) subway/1_stair_top1 136 200 0 0.500000 -0.500000 0 285212672 0 +( -348 -704 -320 ) ( -348 -640 -320 ) ( -412 -640 -320 ) subway/1_lobby_floor 912 -1448 0 0.500000 0.500000 0 285212672 0 +} +// brush 2 +{ +( -172 -1104 -304 ) ( -236 -1104 -304 ) ( -236 -1104 -312 ) subway/1_lobby_floor 872 -144 0 0.500000 0.500000 0 285212672 0 +( 120 -368 -304 ) ( 120 -304 -304 ) ( 120 -304 -312 ) subway/1_lobby_floor 1504 -144 0 0.500000 0.500000 0 285212672 0 +( -100 -1128 -304 ) ( -36 -1128 -304 ) ( -36 -1128 -312 ) subway/1_stair_side1 440 -160 0 0.500000 0.500000 0 285212672 0 +( -56 -784 -312 ) ( -56 -848 -312 ) ( -56 -848 -320 ) subway/1_lobby_floor 1504 -144 0 0.500000 0.500000 0 285212672 0 +( -412 -632 -304 ) ( -348 -632 -304 ) ( -348 -696 -304 ) subway/1_stair_top1 136 224 0 0.500000 -0.500000 0 285212672 0 +( -348 -680 -312 ) ( -348 -616 -312 ) ( -412 -616 -312 ) subway/1_lobby_floor 864 -1448 0 0.500000 0.500000 0 285212672 0 +} +// brush 3 +{ +( -248 -1080 -296 ) ( -312 -1080 -296 ) ( -312 -1080 -304 ) subway/1_lobby_floor 872 -128 0 0.500000 0.500000 0 285212672 0 +( 120 -344 -296 ) ( 120 -280 -296 ) ( 120 -280 -304 ) subway/1_lobby_floor 1456 -128 0 0.500000 0.500000 0 285212672 0 +( -100 -1104 -296 ) ( -36 -1104 -296 ) ( -36 -1104 -304 ) subway/1_stair_side1 440 -144 0 0.500000 0.500000 0 285212672 0 +( -56 -760 -304 ) ( -56 -824 -304 ) ( -56 -824 -312 ) subway/1_lobby_floor 1456 -128 0 0.500000 0.500000 0 285212672 0 +( -404 -608 -296 ) ( -340 -608 -296 ) ( -340 -672 -296 ) subway/1_stair_top1 136 176 0 0.500000 -0.500000 0 285212672 0 +( -348 -656 -304 ) ( -348 -592 -304 ) ( -412 -592 -304 ) subway/1_lobby_floor 816 -1448 0 0.500000 0.500000 0 285212672 0 +} +// brush 4 +{ +( -340 -632 -296 ) ( -340 -568 -296 ) ( -404 -568 -296 ) subway/1_lobby_floor 960 -1256 0 0.500000 0.500000 0 285212672 0 +( -412 -584 -288 ) ( -348 -584 -288 ) ( -348 -648 -288 ) subway/1_stair_top1 136 64 0 0.500000 -0.500000 0 285212672 0 +( -56 -736 -296 ) ( -56 -800 -296 ) ( -56 -800 -304 ) subway/1_lobby_floor 1408 -112 0 0.500000 0.500000 0 285212672 0 +( -176 -1080 -288 ) ( -112 -1080 -288 ) ( -112 -1080 -296 ) subway/1_stair_side1 440 -128 0 0.500000 0.500000 0 285212672 0 +( 120 -320 -288 ) ( 120 -256 -288 ) ( 120 -256 -296 ) subway/1_lobby_floor 1408 -112 0 0.500000 0.500000 0 285212672 0 +( -172 -1056 -288 ) ( -236 -1056 -288 ) ( -236 -1056 -296 ) subway/1_lobby_floor 872 -112 0 0.500000 0.500000 0 285212672 0 +} +// brush 5 +{ +( -348 -608 -288 ) ( -348 -544 -288 ) ( -412 -544 -288 ) subway/1_lobby_floor 912 -1256 0 0.500000 0.500000 0 285212672 0 +( -412 -560 -280 ) ( -348 -560 -280 ) ( -348 -624 -280 ) subway/1_stair_top1 136 8 0 0.500000 -0.500000 0 285212672 0 +( -56 -712 -288 ) ( -56 -776 -288 ) ( -56 -776 -296 ) subway/1_lobby_floor 1360 -96 0 0.500000 0.500000 0 285212672 0 +( -100 -1056 -280 ) ( -36 -1056 -280 ) ( -36 -1056 -288 ) subway/1_stair_side1 440 -112 0 0.500000 0.500000 0 285212672 0 +( 120 -296 -280 ) ( 120 -232 -280 ) ( 120 -232 -288 ) subway/1_lobby_floor 1360 -96 0 0.500000 0.500000 0 285212672 0 +( -172 -1032 -280 ) ( -236 -1032 -280 ) ( -236 -1032 -288 ) subway/1_lobby_floor 872 -96 0 0.500000 0.500000 0 285212672 0 +} +// brush 6 +{ +( -348 -584 -280 ) ( -348 -520 -280 ) ( -412 -520 -280 ) subway/1_lobby_floor 864 -1256 0 0.500000 0.500000 0 285212672 0 +( -412 -536 -272 ) ( -348 -536 -272 ) ( -348 -600 -272 ) subway/1_stair_top1 136 32 0 0.500000 -0.500000 0 285212672 0 +( -56 -688 -280 ) ( -56 -752 -280 ) ( -56 -752 -288 ) subway/1_lobby_floor 1312 -80 0 0.500000 0.500000 0 285212672 0 +( -100 -1032 -272 ) ( -36 -1032 -272 ) ( -36 -1032 -280 ) subway/1_stair_side1 440 -96 0 0.500000 0.500000 0 285212672 0 +( 120 -272 -272 ) ( 120 -208 -272 ) ( 120 -208 -280 ) subway/1_lobby_floor 1312 -80 0 0.500000 0.500000 0 285212672 0 +( -172 -1008 -272 ) ( -236 -1008 -272 ) ( -236 -1008 -280 ) subway/1_lobby_floor 872 -80 0 0.500000 0.500000 0 285212672 0 +} +// brush 7 +{ +( -348 -560 -272 ) ( -348 -496 -272 ) ( -412 -496 -272 ) subway/1_lobby_floor 816 -1256 0 0.500000 0.500000 0 285212672 0 +( -404 -512 -264 ) ( -340 -512 -264 ) ( -340 -576 -264 ) subway/1_stair_top1 136 -16 0 0.500000 -0.500000 0 285212672 0 +( -56 -664 -272 ) ( -56 -728 -272 ) ( -56 -728 -280 ) subway/1_lobby_floor 1264 -64 0 0.500000 0.500000 0 285212672 0 +( -100 -1008 -264 ) ( -36 -1008 -264 ) ( -36 -1008 -272 ) subway/1_stair_side1 440 -80 0 0.500000 0.500000 0 285212672 0 +( 120 -248 -264 ) ( 120 -184 -264 ) ( 120 -184 -272 ) subway/1_lobby_floor 1264 -64 0 0.500000 0.500000 0 285212672 0 +( -348 -984 -264 ) ( -412 -984 -264 ) ( -412 -984 -272 ) subway/1_lobby_floor 872 -64 0 0.500000 0.500000 0 285212672 0 +} +} +// entity 496 +{ +"targetname" "t198" +"distance" "90" +"spawnflags" "32" +"classname" "func_door_rotating_smart" +"soundName" "DoorNormalSwingMetalNorm1" +// brush 0 +{ +( 208 102 -176 ) ( 200 102 -176 ) ( 200 94 -176 ) subway/origin 0 -20 0 0.500000 0.500000 16777216 128 0 +( 200 94 -168 ) ( 200 102 -168 ) ( 208 102 -168 ) subway/origin 0 -20 0 0.500000 0.500000 16777216 128 0 +( 200 94 -88 ) ( 208 94 -88 ) ( 208 94 -176 ) subway/origin 0 0 0 0.500000 0.500000 16777216 128 0 +( 208 98 -88 ) ( 208 106 -88 ) ( 208 106 -176 ) subway/origin 20 0 0 0.500000 0.500000 16777216 128 0 +( 208 106 -88 ) ( 200 106 -88 ) ( 200 106 -176 ) subway/origin 0 0 0 0.500000 0.500000 16777216 128 0 +( 196 102 -88 ) ( 196 94 -88 ) ( 196 94 -176 ) subway/origin 20 0 0 0.500000 0.500000 16777216 128 0 +} +// brush 1 +{ +( 200 102 -128 ) ( 200 94 -128 ) ( 200 94 -160 ) subway/3_door4 26 40 0 1 1 0 16777216 0 +( 264 102 -128 ) ( 200 102 -128 ) ( 200 102 -160 ) subway/3_door4 56 40 0 1 1 0 16908288 0 +( 264 94 -128 ) ( 264 102 -128 ) ( 264 102 -160 ) subway/3_door4 -37 40 0 1 1 0 16777216 0 +( 200 98 -128 ) ( 264 98 -128 ) ( 264 98 -160 ) subway/3_door4 55 40 0 1 1 0 16908288 0 +( 200 94 -128 ) ( 200 102 -128 ) ( 264 102 -128 ) subway/3_door4 55 -19 0 1 1 0 16777216 0 +( 264 102 -216 ) ( 200 102 -216 ) ( 200 94 -216 ) subway/3_door4 56 -19 0 1 1 0 16777216 0 +} +} +// entity 497 +{ +"classname" "func_group" +// brush 0 +{ +( 600 -592 -216 ) ( 600 -552 -216 ) ( 568 -552 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 568 -560 -200 ) ( 600 -560 -200 ) ( 600 -600 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 568 -600 -200 ) ( 568 -600 -160 ) ( 600 -600 -160 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 584 -560 -200 ) ( 584 -560 -160 ) ( 584 -600 -160 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 600 -568 -200 ) ( 600 -568 -160 ) ( 568 -568 -160 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 600 -600 -200 ) ( 600 -600 -160 ) ( 600 -560 -160 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +} +// brush 1 +{ +( 600 -592 -200 ) ( 600 -552 -200 ) ( 568 -552 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 568 -560 -136 ) ( 600 -560 -136 ) ( 600 -600 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 568 -600 -184 ) ( 568 -600 -144 ) ( 600 -600 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -560 -184 ) ( 584 -560 -144 ) ( 584 -600 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -568 -184 ) ( 600 -568 -144 ) ( 568 -568 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -600 -184 ) ( 600 -600 -144 ) ( 600 -560 -144 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2 +{ +( 600 -592 -136 ) ( 600 -552 -136 ) ( 568 -552 -136 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 568 -560 -120 ) ( 600 -560 -120 ) ( 600 -600 -120 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 568 -600 -168 ) ( 568 -600 -128 ) ( 600 -600 -128 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 584 -560 -168 ) ( 584 -560 -128 ) ( 584 -600 -128 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 600 -568 -168 ) ( 600 -568 -128 ) ( 568 -568 -128 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 600 -600 -168 ) ( 600 -600 -128 ) ( 600 -560 -128 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 3 +{ +( 600 -600 -152 ) ( 600 -600 -112 ) ( 600 -560 -112 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -568 -120 ) ( 600 -568 -64 ) ( 584 -568 -64 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -560 -152 ) ( 584 -560 -112 ) ( 584 -600 -112 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -600 -120 ) ( 584 -600 -64 ) ( 600 -600 -64 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -568 -88 ) ( 600 -600 -88 ) ( 584 -600 -88 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -592 -120 ) ( 600 -552 -120 ) ( 568 -552 -120 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 4 +{ +( 600 -592 -88 ) ( 600 -552 -88 ) ( 568 -552 -88 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -552 -64 ) ( 616 -552 -64 ) ( 616 -616 -64 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -600 -88 ) ( 584 -616 -64 ) ( 600 -616 -64 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 584 -560 -120 ) ( 584 -560 -80 ) ( 584 -600 -80 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -568 -88 ) ( 600 -552 -64 ) ( 584 -552 -64 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 600 -600 -88 ) ( 616 -616 -64 ) ( 616 -552 -64 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 5 +{ +( 616 -600 -136 ) ( 616 -600 -96 ) ( 616 -560 -96 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 600 -552 -136 ) ( 600 -552 -96 ) ( 568 -552 -96 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 584 -544 -136 ) ( 584 -544 -96 ) ( 584 -584 -96 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 568 -616 -136 ) ( 568 -616 -96 ) ( 600 -616 -96 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 568 -560 -48 ) ( 600 -560 -48 ) ( 600 -600 -48 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 600 -592 -64 ) ( 600 -552 -64 ) ( 568 -552 -64 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +} +} +// entity 498 +{ +"health" "100" +"material" "10" +"classname" "func_breakable_brush" +// brush 0 +{ +( 688 -152 -72 ) ( 672 -152 -72 ) ( 672 -240 -72 ) subway/1_black -584 32 0 0.500000 0.500000 134217728 16777216 0 +( 672 -240 -56 ) ( 672 -152 -56 ) ( 688 -152 -56 ) subway/1_black -584 32 0 0.500000 0.500000 134217728 16777216 0 +( 672 -240 -48 ) ( 688 -240 -48 ) ( 688 -240 -80 ) subway/1_black -584 208 0 0.500000 0.500000 134217728 16777216 0 +( 680 -240 -48 ) ( 680 -152 -48 ) ( 680 -152 -80 ) subway/1_sign3 -32 208 0 0.500000 0.500000 134217728 0 0 +( 688 -176 -56 ) ( 672 -176 -56 ) ( 672 -176 -88 ) subway/1_black -584 208 0 0.500000 0.500000 134217728 16777216 0 +( 676 -152 -56 ) ( 676 -240 -56 ) ( 676 -240 -88 ) subway/1_sign3 32 208 0 -0.500000 0.500000 134217728 0 0 +} +} +// entity 499 +{ +"surfaceType" "28" +"material" "9" +"mass" "2" +"health" "100" +"classname" "func_breakable_brush" +// brush 0 +{ +( 664 -8 -88 ) ( 664 -48 -88 ) ( 664 -48 -136 ) subway/1_black -32 -80 0 0.500000 0.500000 134217728 16777216 0 +( 720 -8 -88 ) ( 648 -8 -88 ) ( 648 -8 -136 ) subway/1_sign1 48 -80 0 -0.500000 0.500000 134217728 0 0 +( 728 -48 -88 ) ( 728 -8 -88 ) ( 728 -8 -136 ) subway/1_black -32 -80 0 0.500000 0.500000 134217728 16777216 0 +( 672 -16 -88 ) ( 744 -16 -88 ) ( 744 -16 -136 ) subway/1_sign1 80 -80 0 0.500000 0.500000 134217728 0 0 +( 648 -48 -120 ) ( 648 -8 -120 ) ( 720 -8 -120 ) subway/1_black 0 32 0 0.500000 0.500000 134217728 16777216 0 +( 720 -8 -136 ) ( 648 -8 -136 ) ( 648 -48 -136 ) subway/1_black 0 32 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1 +{ +( 668 -10 -76 ) ( 668 -50 -76 ) ( 668 -50 -124 ) subway/1_black 4 0 0 0.500000 0.500000 134217728 16777216 0 +( 716 -10 -76 ) ( 644 -10 -76 ) ( 644 -10 -124 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 672 -46 -76 ) ( 672 -6 -76 ) ( 672 -6 -124 ) subway/1_black 4 0 0 0.500000 0.500000 134217728 16777216 0 +( 616 -14 -76 ) ( 688 -14 -76 ) ( 688 -14 -124 ) subway/1_black 8 0 0 0.500000 0.500000 134217728 16777216 0 +( 644 -50 -112 ) ( 644 -10 -112 ) ( 716 -10 -112 ) subway/1_black 8 -4 0 0.500000 0.500000 134217728 16777216 0 +( 716 -10 -120 ) ( 644 -10 -120 ) ( 644 -50 -120 ) subway/1_black 8 -4 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( 768 -10 -120 ) ( 696 -10 -120 ) ( 696 -50 -120 ) subway/1_black -96 -4 0 0.500000 0.500000 134217728 16777216 0 +( 696 -50 -112 ) ( 696 -10 -112 ) ( 768 -10 -112 ) subway/1_black -96 -4 0 0.500000 0.500000 134217728 16777216 0 +( 668 -14 -76 ) ( 740 -14 -76 ) ( 740 -14 -124 ) subway/1_black -96 0 0 0.500000 0.500000 134217728 16777216 0 +( 724 -46 -76 ) ( 724 -6 -76 ) ( 724 -6 -124 ) subway/1_black 4 0 0 0.500000 0.500000 134217728 16777216 0 +( 768 -10 -76 ) ( 696 -10 -76 ) ( 696 -10 -124 ) subway/1_black -96 0 0 0.500000 0.500000 134217728 16777216 0 +( 720 -10 -76 ) ( 720 -50 -76 ) ( 720 -50 -124 ) subway/1_black 4 0 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 500 +{ +"classname" "func_group" +// brush 0 +{ +( 840 0 -96 ) ( 840 -40 -96 ) ( 840 -40 -136 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 888 8 -96 ) ( 856 8 -96 ) ( 856 8 -136 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 872 -24 -96 ) ( 872 16 -96 ) ( 872 16 -136 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 856 -56 -96 ) ( 888 -56 -96 ) ( 888 -56 -136 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 856 -40 -48 ) ( 856 0 -48 ) ( 888 0 -48 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +( 888 8 -64 ) ( 856 8 -64 ) ( 856 -32 -64 ) subway/1_tile_bottom 0 32 0 0.500000 -0.500000 0 318767104 0 +} +// brush 1 +{ +( 888 8 -88 ) ( 856 8 -88 ) ( 856 -32 -88 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 -56 -64 ) ( 840 8 -64 ) ( 872 8 -64 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 856 -56 -64 ) ( 872 -56 -64 ) ( 872 -40 -88 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 -40 -80 ) ( 872 0 -80 ) ( 872 0 -120 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 8 -64 ) ( 856 8 -64 ) ( 856 -8 -88 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 840 8 -64 ) ( 840 -56 -64 ) ( 856 -40 -88 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 2 +{ +( 856 0 -112 ) ( 856 -40 -112 ) ( 856 -40 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 -8 -64 ) ( 856 -8 -64 ) ( 856 -8 -120 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 -40 -112 ) ( 872 0 -112 ) ( 872 0 -152 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 856 -40 -64 ) ( 872 -40 -64 ) ( 872 -40 -120 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 -40 -88 ) ( 856 -40 -88 ) ( 856 -8 -88 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 888 8 -120 ) ( 856 8 -120 ) ( 856 -32 -120 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 3 +{ +( 888 8 -136 ) ( 856 8 -136 ) ( 856 -32 -136 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 856 -40 -120 ) ( 856 0 -120 ) ( 888 0 -120 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 856 -40 -128 ) ( 888 -40 -128 ) ( 888 -40 -168 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 872 -40 -128 ) ( 872 0 -128 ) ( 872 0 -168 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 888 -8 -128 ) ( 856 -8 -128 ) ( 856 -8 -168 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +( 856 0 -128 ) ( 856 -40 -128 ) ( 856 -40 -168 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +// brush 4 +{ +( 888 8 -200 ) ( 856 8 -200 ) ( 856 -32 -200 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 856 -40 -136 ) ( 856 0 -136 ) ( 888 0 -136 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 856 -40 -144 ) ( 888 -40 -144 ) ( 888 -40 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 872 -40 -144 ) ( 872 0 -144 ) ( 872 0 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 888 -8 -144 ) ( 856 -8 -144 ) ( 856 -8 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +( 856 0 -144 ) ( 856 -40 -144 ) ( 856 -40 -184 ) subway/1_tile 0 0 0 0.500000 0.500000 0 318767104 0 +} +// brush 5 +{ +( 888 8 -216 ) ( 856 8 -216 ) ( 856 -32 -216 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 856 -40 -200 ) ( 856 0 -200 ) ( 888 0 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 856 -40 -160 ) ( 888 -40 -160 ) ( 888 -40 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 872 -40 -160 ) ( 872 0 -160 ) ( 872 0 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 888 -8 -160 ) ( 856 -8 -160 ) ( 856 -8 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +( 856 0 -160 ) ( 856 -40 -160 ) ( 856 -40 -200 ) subway/1_tile_bottom 0 -16 0 0.500000 0.500000 0 318767104 0 +} +} +// entity 501 +{ +"classname" "func_group" +// brush 0 +{ +( -240 1392 -126 ) ( -240 1376 -126 ) ( -240 1376 -214 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -168 1384 -126 ) ( -240 1384 -126 ) ( -240 1384 -214 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -176 1366 -126 ) ( -176 1382 -126 ) ( -176 1382 -214 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -302 1380 -128 ) ( -230 1380 -128 ) ( -230 1380 -216 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -240 1376 -124 ) ( -240 1392 -124 ) ( -168 1392 -124 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -172 1392 -126 ) ( -244 1392 -126 ) ( -244 1376 -126 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 1 +{ +( -174 1392 -126 ) ( -246 1392 -126 ) ( -246 1376 -126 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -242 1376 -90 ) ( -242 1392 -90 ) ( -170 1392 -90 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -304 1380 -94 ) ( -232 1380 -94 ) ( -232 1380 -182 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -240 1370 -92 ) ( -240 1386 -92 ) ( -240 1386 -180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -170 1384 -92 ) ( -242 1384 -92 ) ( -242 1384 -180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -242 1392 -92 ) ( -242 1376 -92 ) ( -242 1376 -180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 2 +{ +( -172 1392 -92 ) ( -244 1392 -92 ) ( -244 1376 -92 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -240 1376 -90 ) ( -240 1392 -90 ) ( -168 1392 -90 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -302 1380 -94 ) ( -230 1380 -94 ) ( -230 1380 -182 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -176 1366 -92 ) ( -176 1382 -92 ) ( -176 1382 -180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -168 1384 -92 ) ( -240 1384 -92 ) ( -240 1384 -180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -240 1392 -92 ) ( -240 1376 -92 ) ( -240 1376 -180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +// brush 3 +{ +( -108 1392 -126 ) ( -180 1392 -126 ) ( -180 1376 -126 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -176 1376 -90 ) ( -176 1392 -90 ) ( -104 1392 -90 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -238 1380 -94 ) ( -166 1380 -94 ) ( -166 1380 -182 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -174 1370 -92 ) ( -174 1386 -92 ) ( -174 1386 -180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -104 1384 -92 ) ( -176 1384 -92 ) ( -176 1384 -180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +( -176 1392 -92 ) ( -176 1376 -92 ) ( -176 1376 -180 ) subway/1_black 0 0 0 1 1 134217728 16777216 0 +} +} +// entity 502 +{ +"classname" "func_group" +// brush 0 +{ +( 816 368 -208 ) ( 816 368 -200 ) ( 752 368 -200 ) subway/metal2 64 0 0 0.500000 0.500000 0 16777216 0 +( 720 1112 -176 ) ( 720 1112 -168 ) ( 720 1048 -168 ) subway/metal2 1216 0 0 0.500000 0.500000 0 16777216 0 +( 536 360 -184 ) ( 536 360 -176 ) ( 600 360 -176 ) subway/metal2 64 0 0 0.500000 0.500000 0 16777216 0 +( 840 360 -200 ) ( 840 368 -200 ) ( 840 368 -216 ) subway/metal2 1216 0 0 0.500000 0.500000 0 16777216 0 +( 840 368 -200 ) ( 840 360 -200 ) ( 720 360 -168 ) subway/metal2 64 -1216 0 0.500000 0.500000 0 16777216 0 +( 816 736 -216 ) ( 752 736 -216 ) ( 752 672 -216 ) subway/metal2 64 -1216 0 0.500000 0.500000 0 16777216 0 +} +// brush 1 +{ +( 816 512 -216 ) ( 816 512 -208 ) ( 752 512 -208 ) subway/1_concrete_floor -4048 -400 0 0.500000 0.500000 0 285212672 0 +( 816 1112 -216 ) ( 816 1112 -208 ) ( 816 1048 -208 ) subway/1_stair_side1 2784 -400 0 0.500000 0.500000 0 285212672 0 +( 632 368 -224 ) ( 632 368 -216 ) ( 696 368 -216 ) subway/1_concrete_floor -4048 -400 0 0.500000 0.500000 0 285212672 0 +( 840 520 -224 ) ( 840 520 -216 ) ( 840 584 -216 ) subway/1_stair_side1 1216 -64 0 0.500000 0.500000 0 285212672 0 +( 752 656 -208 ) ( 752 720 -208 ) ( 816 720 -208 ) subway/1_stair_top1 1248 223 90 0.500000 -0.500000 0 285212672 0 +( 816 736 -216 ) ( 752 736 -216 ) ( 752 672 -216 ) subway/1_concrete_floor -624 640 0 0.500000 0.500000 0 285212672 0 +} +// brush 2 +{ +( 816 888 -216 ) ( 752 888 -216 ) ( 752 824 -216 ) subway/metal2 64 -1216 0 0.500000 0.500000 0 16777216 0 +( 840 520 -200 ) ( 840 512 -200 ) ( 720 512 -168 ) subway/metal2 64 -1216 0 0.500000 0.500000 0 16777216 0 +( 840 512 -200 ) ( 840 520 -200 ) ( 840 520 -216 ) subway/metal2 1216 0 0 0.500000 0.500000 0 16777216 0 +( 536 512 -184 ) ( 536 512 -176 ) ( 600 512 -176 ) subway/metal2 64 0 0 0.500000 0.500000 0 16777216 0 +( 720 1264 -176 ) ( 720 1264 -168 ) ( 720 1200 -168 ) subway/metal2 1216 0 0 0.500000 0.500000 0 16777216 0 +( 816 520 -208 ) ( 816 520 -200 ) ( 752 520 -200 ) subway/metal2 64 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 3 +{ +( 792 736 -208 ) ( 728 736 -208 ) ( 728 672 -208 ) subway/1_concrete_floor -576 640 0 0.500000 0.500000 0 285212672 0 +( 728 656 -200 ) ( 728 720 -200 ) ( 792 720 -200 ) subway/1_stair_top1 1248 175 90 0.500000 -0.500000 0 285212672 0 +( 816 520 -216 ) ( 816 520 -208 ) ( 816 584 -208 ) subway/1_stair_side1 1216 -48 0 0.500000 0.500000 0 285212672 0 +( 608 368 -216 ) ( 608 368 -208 ) ( 672 368 -208 ) subway/1_concrete_floor -4000 -384 0 0.500000 0.500000 0 285212672 0 +( 792 1112 -208 ) ( 792 1112 -200 ) ( 792 1048 -200 ) subway/1_stair_side1 2784 -384 0 0.500000 0.500000 0 285212672 0 +( 792 512 -208 ) ( 792 512 -200 ) ( 728 512 -200 ) subway/1_concrete_floor -4000 -384 0 0.500000 0.500000 0 285212672 0 +} +// brush 4 +{ +( 768 736 -200 ) ( 704 736 -200 ) ( 704 672 -200 ) subway/1_concrete_floor -528 640 0 0.500000 0.500000 0 285212672 0 +( 704 656 -192 ) ( 704 720 -192 ) ( 768 720 -192 ) subway/1_stair_top1 1248 127 90 0.500000 -0.500000 0 285212672 0 +( 792 520 -208 ) ( 792 520 -200 ) ( 792 584 -200 ) subway/1_stair_side1 1216 -32 0 0.500000 0.500000 0 285212672 0 +( 584 368 -208 ) ( 584 368 -200 ) ( 648 368 -200 ) subway/1_concrete_floor -3952 -368 0 0.500000 0.500000 0 285212672 0 +( 768 1112 -200 ) ( 768 1112 -192 ) ( 768 1048 -192 ) subway/1_stair_side1 2784 -368 0 0.500000 0.500000 0 285212672 0 +( 768 512 -200 ) ( 768 512 -192 ) ( 704 512 -192 ) subway/1_concrete_floor -3952 -368 0 0.500000 0.500000 0 285212672 0 +} +// brush 5 +{ +( 744 736 -192 ) ( 680 736 -192 ) ( 680 672 -192 ) subway/1_concrete_floor -480 640 0 0.500000 0.500000 0 285212672 0 +( 680 656 -184 ) ( 680 720 -184 ) ( 744 720 -184 ) subway/1_stair_top1 1248 79 90 0.500000 -0.500000 0 285212672 0 +( 768 520 -200 ) ( 768 520 -192 ) ( 768 584 -192 ) subway/1_stair_side1 1216 -16 0 0.500000 0.500000 0 285212672 0 +( 560 368 -200 ) ( 560 368 -192 ) ( 624 368 -192 ) subway/1_concrete_floor -3904 -352 0 0.500000 0.500000 0 285212672 0 +( 744 1112 -192 ) ( 744 1112 -184 ) ( 744 1048 -184 ) subway/1_stair_side1 2784 -352 0 0.500000 0.500000 0 285212672 0 +( 744 512 -192 ) ( 744 512 -184 ) ( 680 512 -184 ) subway/1_concrete_floor -3904 -352 0 0.500000 0.500000 0 285212672 0 +} +// brush 6 +{ +( 720 736 -184 ) ( 656 736 -184 ) ( 656 672 -184 ) subway/1_concrete_floor -432 640 0 0.500000 0.500000 0 285212672 0 +( 656 656 -176 ) ( 656 720 -176 ) ( 720 720 -176 ) subway/1_stair_top1 1248 31 90 0.500000 -0.500000 0 285212672 0 +( 744 520 -192 ) ( 744 520 -184 ) ( 744 584 -184 ) subway/1_stair_side1 1216 0 0 0.500000 0.500000 0 285212672 0 +( 536 368 -192 ) ( 536 368 -184 ) ( 600 368 -184 ) subway/1_concrete_floor -3856 -336 0 0.500000 0.500000 0 285212672 0 +( 720 1112 -184 ) ( 720 1112 -176 ) ( 720 1048 -176 ) subway/1_stair_side1 2784 -336 0 0.500000 0.500000 0 285212672 0 +( 720 512 -184 ) ( 720 512 -176 ) ( 656 512 -176 ) subway/1_concrete_floor -3856 -336 0 0.500000 0.500000 0 285212672 0 +} +} +// entity 503 +{ +"classname" "func_group" +// brush 0 +{ +( -600 1516 56 ) ( -600 1522 56 ) ( -602 1522 54 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 0 16777216 0 +( -600 1520 88 ) ( -600 1512 88 ) ( -604 1512 92 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 0 16777216 0 +( -600 1516 128 ) ( -528 1516 128 ) ( -528 1516 48 ) subway/1_concrete_floor 0 7 90 0.500000 0.500000 0 16777216 0 +( -600 1522 56 ) ( -600 1516 56 ) ( -600 1516 88 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 0 16777216 0 +( -532 1520 132 ) ( -604 1520 132 ) ( -604 1520 52 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 0 16777216 0 +( -602 1518 132 ) ( -602 1510 132 ) ( -602 1510 52 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 1 +{ +( -640 1516 88 ) ( -640 1508 88 ) ( -560 1508 88 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( -640 1520 160 ) ( -640 1520 88 ) ( -560 1520 88 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( -528 1520 90 ) ( -528 1512 90 ) ( -600 1512 90 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( -632 1516 90 ) ( -632 1516 162 ) ( -552 1516 162 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( -606 1520 94 ) ( -606 1512 94 ) ( -602 1512 90 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( -532 1512 92 ) ( -532 1520 92 ) ( -536 1520 88 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +} +// brush 2 +{ +( -536 1522 56 ) ( -536 1516 56 ) ( -534 1516 54 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 0 16777216 0 +( -536 1512 88 ) ( -536 1520 88 ) ( -532 1520 92 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 0 16777216 0 +( -532 1516 128 ) ( -460 1516 128 ) ( -460 1516 48 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 0 16777216 0 +( -534 1504 136 ) ( -534 1512 136 ) ( -534 1512 56 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 0 16777216 0 +( -464 1520 132 ) ( -536 1520 132 ) ( -536 1520 52 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 0 16777216 0 +( -536 1516 56 ) ( -536 1522 56 ) ( -536 1522 88 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 0 16777216 0 +} +// brush 3 +{ +( -538 1522 58 ) ( -538 1514 58 ) ( -542 1514 62 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( -604 1514 52 ) ( -604 1522 52 ) ( -600 1522 56 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( -636 1520 52 ) ( -636 1520 -20 ) ( -556 1520 -20 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( -532 1512 54 ) ( -532 1520 54 ) ( -604 1520 54 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( -640 1516 -16 ) ( -640 1516 56 ) ( -560 1516 56 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +( -640 1516 56 ) ( -640 1524 56 ) ( -560 1524 56 ) subway/1_concrete_floor 0 0 0 0.500000 0.500000 0 16777216 0 +} +} +// entity 504 +{ +"classname" "func_group" +// brush 0 +{ +( 400 1152 -80 ) ( 392 1152 -80 ) ( 392 912 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1152 -64 ) ( 360 912 -64 ) ( 320 912 -64 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 1344 -80 ) ( 408 1344 -80 ) ( 408 1344 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 360 1184 -48 ) ( 392 1184 -80 ) ( 392 1424 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 9 +( 384 1160 -80 ) ( 320 1160 -48 ) ( 360 1160 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 912 -48 ) ( 400 1152 -48 ) ( 400 1152 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +} +// brush 1 +{ +( 400 1152 -80 ) ( 392 1152 -80 ) ( 392 912 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 1152 -48 ) ( 360 912 -48 ) ( 320 912 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 392 1344 -80 ) ( 408 1344 -80 ) ( 408 1344 -48 ) subway/1_tile_middle 0 0 0 0.500000 0.500000 0 318767104 0 +( 360 1184 -48 ) ( 392 1184 -80 ) ( 392 1424 -80 ) subway/1_tile_middle 0 50 90 0.500000 0.500000 0 318767104 9 +( 384 1160 -80 ) ( 320 1160 -48 ) ( 360 1160 -48 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 400 912 -48 ) ( 400 1152 -48 ) ( 400 1152 -80 ) subway/1_tile -2624 -32 0 0.500000 0.500000 0 318767104 0 +( 440 966 -64 ) ( 440 976 -64 ) ( 368 976 -64 ) subway/1_tile_middle 0 16 0 0.500000 0.500000 0 318767104 0 +} +} +// entity 505 +{ +"spawnflags" "2" +"angle" "270" +"origin" "-346 733 -199" +"classname" "misc_generic_bench" +} +// entity 506 +{ +"spawnflags" "2" +"classname" "misc_generic_bench" +"origin" "-246 370 -199" +"angle" "270" +} +// entity 507 +{ +"spawnflags" "2" +"angle" "225" +"origin" "-354 386 -199" +"classname" "misc_generic_bench" +} +// entity 508 +{ +"classname" "func_group" +// brush 0 +{ +( 870 862 -182 ) ( 878 862 -182 ) ( 878 858 -178 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +( 878 796 -188 ) ( 870 796 -188 ) ( 870 800 -184 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +( 872 766 -188 ) ( 872 766 -260 ) ( 872 846 -260 ) subway/1_concrete_floor 0 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 880 866 -186 ) ( 872 866 -186 ) ( 872 794 -186 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +( 876 762 -256 ) ( 876 762 -184 ) ( 876 842 -184 ) subway/1_concrete_floor 0 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 876 762 -184 ) ( 868 762 -184 ) ( 868 842 -184 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1 +{ +( 876 864 -184 ) ( 870 864 -184 ) ( 870 864 -152 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( 872 936 -108 ) ( 872 864 -108 ) ( 872 864 -188 ) subway/1_concrete_floor 0 15 90 0.500000 -0.500000 134217728 16777216 0 +( 888 866 -104 ) ( 880 866 -104 ) ( 880 866 -184 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( 876 868 -112 ) ( 876 940 -112 ) ( 876 940 -192 ) subway/1_concrete_floor 0 15 90 0.500000 -0.500000 134217728 16777216 0 +( 880 864 -152 ) ( 872 864 -152 ) ( 872 868 -148 ) subway/1_concrete_floor 15 15 0 0.499878 0.500000 134217728 16777216 0 +( 870 864 -184 ) ( 876 864 -184 ) ( 876 866 -186 ) subway/1_concrete_floor 15 15 0 0.499878 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( 876 762 -152 ) ( 884 762 -152 ) ( 884 842 -152 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +( 872 762 -80 ) ( 872 762 -152 ) ( 872 842 -152 ) subway/1_concrete_floor 0 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 872 874 -150 ) ( 880 874 -150 ) ( 880 802 -150 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +( 876 770 -150 ) ( 876 770 -78 ) ( 876 850 -78 ) subway/1_concrete_floor 0 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 872 794 -146 ) ( 880 794 -146 ) ( 880 798 -150 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +( 880 868 -148 ) ( 872 868 -148 ) ( 872 864 -152 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 3 +{ +( 876 800 -184 ) ( 870 800 -184 ) ( 870 798 -186 ) subway/1_concrete_floor 15 15 0 0.499878 0.500000 134217728 16777216 0 +( 872 800 -152 ) ( 880 800 -152 ) ( 880 796 -148 ) subway/1_concrete_floor 15 15 0 0.499878 0.500000 134217728 16777216 0 +( 876 800 -112 ) ( 876 872 -112 ) ( 876 872 -192 ) subway/1_concrete_floor 0 15 90 0.500000 -0.500000 134217728 16777216 0 +( 870 800 -184 ) ( 876 800 -184 ) ( 876 800 -152 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( 872 868 -108 ) ( 872 796 -108 ) ( 872 796 -188 ) subway/1_concrete_floor 0 15 90 0.500000 -0.500000 134217728 16777216 0 +( 874 798 -108 ) ( 882 798 -108 ) ( 882 798 -188 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +} +// brush 4 +{ +( 872 874 -184 ) ( 872 802 -184 ) ( 880 802 -184 ) subway/sign11 -63 -32 -90 0.500000 0.500000 134217728 0 0 +( 880 802 -152 ) ( 872 802 -152 ) ( 872 874 -152 ) subway/sign11 -63 -32 -90 0.500000 0.500000 134217728 0 0 +( 874 804 -104 ) ( 874 876 -104 ) ( 874 876 -184 ) subway/sign11 -64 -47 0 0.500000 0.500000 134217728 0 0 +( 880 864 -104 ) ( 872 864 -104 ) ( 872 864 -184 ) subway/sign11 32 -31 0 0.500000 0.500000 134217728 0 0 +( 872 874 -104 ) ( 872 802 -104 ) ( 872 802 -184 ) subway/sign11 -64 -31 -180 0.500000 -0.500000 134217728 0 0 +( 872 800 -108 ) ( 880 800 -108 ) ( 880 800 -188 ) subway/sign11 32 -31 0 0.500000 0.500000 134217728 0 0 +} +} +// entity 509 +{ +"classname" "func_group" +// brush 0 +{ +( 876 1066 -184 ) ( 868 1066 -184 ) ( 868 1146 -184 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +( 876 1066 -256 ) ( 876 1066 -184 ) ( 876 1146 -184 ) subway/1_concrete_floor 0 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 880 1170 -186 ) ( 872 1170 -186 ) ( 872 1098 -186 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +( 872 1070 -188 ) ( 872 1070 -260 ) ( 872 1150 -260 ) subway/1_concrete_floor 0 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 878 1100 -188 ) ( 870 1100 -188 ) ( 870 1104 -184 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +( 870 1166 -182 ) ( 878 1166 -182 ) ( 878 1162 -178 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1 +{ +( 876 1168 -184 ) ( 870 1168 -184 ) ( 870 1168 -152 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( 872 1240 -108 ) ( 872 1168 -108 ) ( 872 1168 -188 ) subway/1_concrete_floor 0 0 90 0.500000 -0.500000 134217728 16777216 0 +( 888 1170 -104 ) ( 880 1170 -104 ) ( 880 1170 -184 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( 876 1172 -112 ) ( 876 1244 -112 ) ( 876 1244 -192 ) subway/1_concrete_floor 0 0 90 0.500000 -0.500000 134217728 16777216 0 +( 880 1168 -152 ) ( 872 1168 -152 ) ( 872 1172 -148 ) subway/1_concrete_floor 0 15 0 0.500000 0.500000 134217728 16777216 0 +( 870 1168 -184 ) ( 876 1168 -184 ) ( 876 1170 -186 ) subway/1_concrete_floor 0 15 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( 880 1172 -148 ) ( 872 1172 -148 ) ( 872 1168 -152 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +( 872 1098 -146 ) ( 880 1098 -146 ) ( 880 1102 -150 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +( 876 1074 -150 ) ( 876 1074 -78 ) ( 876 1154 -78 ) subway/1_concrete_floor 0 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 872 1178 -150 ) ( 880 1178 -150 ) ( 880 1106 -150 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +( 872 1066 -80 ) ( 872 1066 -152 ) ( 872 1146 -152 ) subway/1_concrete_floor 0 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 876 1066 -152 ) ( 884 1066 -152 ) ( 884 1146 -152 ) subway/1_concrete_floor 0 0 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 3 +{ +( 874 1102 -108 ) ( 882 1102 -108 ) ( 882 1102 -188 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( 872 1172 -108 ) ( 872 1100 -108 ) ( 872 1100 -188 ) subway/1_concrete_floor 0 0 90 0.500000 -0.500000 134217728 16777216 0 +( 870 1104 -184 ) ( 876 1104 -184 ) ( 876 1104 -152 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( 876 1104 -112 ) ( 876 1176 -112 ) ( 876 1176 -192 ) subway/1_concrete_floor 0 0 90 0.500000 -0.500000 134217728 16777216 0 +( 872 1104 -152 ) ( 880 1104 -152 ) ( 880 1100 -148 ) subway/1_concrete_floor 0 15 0 0.500000 0.500000 134217728 16777216 0 +( 876 1104 -184 ) ( 870 1104 -184 ) ( 870 1102 -186 ) subway/1_concrete_floor 0 15 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4 +{ +( 872 1104 -108 ) ( 880 1104 -108 ) ( 880 1104 -188 ) subway/sign11 32 -31 0 0.500000 0.500000 134217728 0 0 +( 872 1178 -104 ) ( 872 1106 -104 ) ( 872 1106 -184 ) subway/sign11 0 -31 -180 0.500000 -0.500000 134217728 0 0 +( 880 1168 -104 ) ( 872 1168 -104 ) ( 872 1168 -184 ) subway/sign11 32 -31 0 0.500000 0.500000 134217728 0 0 +( 874 1108 -104 ) ( 874 1180 -104 ) ( 874 1180 -184 ) subway/sign6 -32 -47 0 0.500000 0.500000 134217728 0 0 +( 880 1106 -152 ) ( 872 1106 -152 ) ( 872 1178 -152 ) subway/sign11 0 -32 -90 0.500000 0.500000 134217728 0 0 +( 872 1178 -184 ) ( 872 1106 -184 ) ( 880 1106 -184 ) subway/sign11 0 -32 -90 0.500000 0.500000 134217728 0 0 +} +} +// entity 510 +{ +"classname" "func_group" +// brush 0 +{ +( 876 906 -184 ) ( 868 906 -184 ) ( 868 986 -184 ) subway/1_concrete_floor 16 -14 -90 0.500000 0.500000 134217728 16777216 0 +( 876 906 -256 ) ( 876 906 -184 ) ( 876 986 -184 ) subway/1_concrete_floor 16 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 880 1010 -186 ) ( 872 1010 -186 ) ( 872 938 -186 ) subway/1_concrete_floor 16 -14 -90 0.500000 0.500000 134217728 16777216 0 +( 872 910 -188 ) ( 872 910 -260 ) ( 872 990 -260 ) subway/1_concrete_floor 16 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 878 940 -188 ) ( 870 940 -188 ) ( 870 944 -184 ) subway/1_concrete_floor 16 -14 -90 0.500000 0.500000 134217728 16777216 0 +( 870 1006 -182 ) ( 878 1006 -182 ) ( 878 1002 -178 ) subway/1_concrete_floor 16 -14 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 1 +{ +( 876 1008 -184 ) ( 870 1008 -184 ) ( 870 1008 -152 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( 872 1080 -108 ) ( 872 1008 -108 ) ( 872 1008 -188 ) subway/1_concrete_floor 0 16 90 0.500000 -0.500000 134217728 16777216 0 +( 888 1010 -104 ) ( 880 1010 -104 ) ( 880 1010 -184 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( 876 1012 -112 ) ( 876 1084 -112 ) ( 876 1084 -192 ) subway/1_concrete_floor 0 16 90 0.500000 -0.500000 134217728 16777216 0 +( 880 1008 -152 ) ( 872 1008 -152 ) ( 872 1012 -148 ) subway/1_concrete_floor 0 15 0 0.500000 0.500000 134217728 16777216 0 +( 870 1008 -184 ) ( 876 1008 -184 ) ( 876 1010 -186 ) subway/1_concrete_floor 0 15 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( 880 1012 -148 ) ( 872 1012 -148 ) ( 872 1008 -152 ) subway/1_concrete_floor 16 -14 -90 0.500000 0.500000 134217728 16777216 0 +( 872 938 -146 ) ( 880 938 -146 ) ( 880 942 -150 ) subway/1_concrete_floor 16 -14 -90 0.500000 0.500000 134217728 16777216 0 +( 876 914 -150 ) ( 876 914 -78 ) ( 876 994 -78 ) subway/1_concrete_floor 16 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 872 1018 -150 ) ( 880 1018 -150 ) ( 880 946 -150 ) subway/1_concrete_floor 16 -14 -90 0.500000 0.500000 134217728 16777216 0 +( 872 906 -80 ) ( 872 906 -152 ) ( 872 986 -152 ) subway/1_concrete_floor 16 -15 -180 0.500000 -0.500000 134217728 16777216 0 +( 876 906 -152 ) ( 884 906 -152 ) ( 884 986 -152 ) subway/1_concrete_floor 16 -14 -90 0.500000 0.500000 134217728 16777216 0 +} +// brush 3 +{ +( 874 942 -108 ) ( 882 942 -108 ) ( 882 942 -188 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( 872 1012 -108 ) ( 872 940 -108 ) ( 872 940 -188 ) subway/1_concrete_floor 0 16 90 0.500000 -0.500000 134217728 16777216 0 +( 870 944 -184 ) ( 876 944 -184 ) ( 876 944 -152 ) subway/1_concrete_floor 0 0 90 0.500000 0.500000 134217728 16777216 0 +( 876 944 -112 ) ( 876 1016 -112 ) ( 876 1016 -192 ) subway/1_concrete_floor 0 16 90 0.500000 -0.500000 134217728 16777216 0 +( 872 944 -152 ) ( 880 944 -152 ) ( 880 940 -148 ) subway/1_concrete_floor 0 15 0 0.500000 0.500000 134217728 16777216 0 +( 876 944 -184 ) ( 870 944 -184 ) ( 870 942 -186 ) subway/1_concrete_floor 0 15 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4 +{ +( 872 944 -108 ) ( 880 944 -108 ) ( 880 944 -188 ) subway/sign11 32 -31 0 0.500000 0.500000 134217728 0 0 +( 872 1018 -104 ) ( 872 946 -104 ) ( 872 946 -184 ) subway/sign11 -64 -31 -180 0.500000 -0.500000 134217728 0 0 +( 880 1008 -104 ) ( 872 1008 -104 ) ( 872 1008 -184 ) subway/sign11 32 -31 0 0.500000 0.500000 134217728 0 0 +( 874 948 -104 ) ( 874 1020 -104 ) ( 874 1020 -184 ) subway/sign8 32 16 0 0.500000 0.500000 134217728 0 0 +( 880 946 -152 ) ( 872 946 -152 ) ( 872 1018 -152 ) subway/sign11 -64 -30 -90 0.500000 0.500000 134217728 0 0 +( 872 1018 -184 ) ( 872 946 -184 ) ( 880 946 -184 ) subway/sign11 -64 -30 -90 0.500000 0.500000 134217728 0 0 +} +} +// entity 511 +{ +"color" "0.768627 1.000000 1.000000" +"_color" "0.768627 1.000000 1.000000" +"light" "75" +"classname" "light" +"origin" "1780 2276 -280" +} +// entity 512 +{ +"classname" "light" +"origin" "1780 2044 -280" +"light" "75" +"_color" "0.768627 1.000000 1.000000" +"color" "0.768627 1.000000 1.000000" +} +// entity 513 +{ +"classname" "light_generic_hanging" +"light" "125" +"origin" "1778 2026 -266" +} +// entity 514 +{ +"origin" "1776 2004 -280" +"classname" "light" +"light" "75" +"_color" "0.768627 1.000000 1.000000" +"color" "0.768627 1.000000 1.000000" +} +// entity 515 +{ +"color" "0.768627 1.000000 1.000000" +"_color" "0.768627 1.000000 1.000000" +"light" "95" +"origin" "1630 2214 -440" +"classname" "light" +} +// entity 516 +{ +"classname" "light" +"light" "65" +"_color" "0.941176 1.000000 0.756863" +"color" "0.941176 1.000000 0.756863" +"origin" "1864 2264 -400" +} +// entity 517 +{ +"origin" "1864 2072 -400" +"color" "0.941176 1.000000 0.756863" +"_color" "0.941176 1.000000 0.756863" +"light" "65" +"classname" "light" +} +// entity 518 +{ +"classname" "light" +"origin" "1736 2284 -280" +"light" "75" +"_color" "0.768627 1.000000 1.000000" +"color" "0.768627 1.000000 1.000000" +} +// entity 519 +{ +"color" "0.768627 1.000000 1.000000" +"_color" "0.768627 1.000000 1.000000" +"light" "75" +"origin" "1736 2020 -280" +"classname" "light" +} +// entity 520 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.792157" +"light" "80" +"origin" "1568 2360 -408" +} +// entity 521 +{ +"color" "0.768627 1.000000 1.000000" +"_color" "0.768627 1.000000 1.000000" +"light" "75" +"origin" "1824 2284 -280" +"classname" "light" +} +// entity 522 +{ +"classname" "light" +"origin" "1824 2020 -280" +"light" "75" +"_color" "0.768627 1.000000 1.000000" +"color" "0.768627 1.000000 1.000000" +} +// entity 523 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.792157" +"light" "80" +"origin" "1976 2128 -312" +} +// entity 524 +{ +"classname" "func_group" +// brush 0 +{ +( 2176 2176 -384 ) ( 2272 2176 -384 ) ( 2272 2208 -384 ) subway/1_stair_top1 -15 15 -90 0.500000 0.500000 0 285212672 0 +( 2280 2208 -376 ) ( 2280 2176 -376 ) ( 2184 2176 -376 ) subway/1_stair_top1 12 16 0 0.500000 -0.500000 0 285212672 0 +( 2296 2200 -376 ) ( 2200 2200 -376 ) ( 2200 2200 -384 ) subway/1_stair_top1 -16 48 0 0.500000 0.500000 0 285212672 0 +( 2160 2208 -376 ) ( 2160 2176 -376 ) ( 2160 2176 -384 ) subway/1_stair_top1 16 48 -180 0.500000 -0.500000 0 285212672 0 +( 2176 2176 -376 ) ( 2272 2176 -376 ) ( 2272 2176 -384 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2320 2176 -376 ) ( 2320 2208 -376 ) ( 2320 2208 -384 ) subway/1_stair_top1 16 48 -180 0.500000 -0.500000 0 285212672 0 +} +// brush 1 +{ +( 2176 2200 -376 ) ( 2272 2200 -376 ) ( 2272 2232 -376 ) subway/1_stair_top1 -15 31 -90 0.500000 0.500000 0 285212672 0 +( 2280 2232 -368 ) ( 2280 2200 -368 ) ( 2184 2200 -368 ) subway/1_stair_top1 12 32 0 0.500000 -0.500000 0 285212672 0 +( 2296 2224 -368 ) ( 2200 2224 -368 ) ( 2200 2224 -376 ) subway/1_stair_top1 -16 0 0 0.500000 0.500000 0 285212672 0 +( 2160 2232 -368 ) ( 2160 2200 -368 ) ( 2160 2200 -376 ) subway/1_stair_top1 0 0 -180 0.500000 -0.500000 0 285212672 0 +( 2192 2200 -368 ) ( 2288 2200 -368 ) ( 2288 2200 -376 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2320 2200 -368 ) ( 2320 2232 -368 ) ( 2320 2232 -376 ) subway/1_stair_top1 0 0 -180 0.500000 -0.500000 0 285212672 0 +} +// brush 2 +{ +( 2176 2224 -368 ) ( 2272 2224 -368 ) ( 2272 2256 -368 ) subway/1_stair_top1 -15 47 -90 0.500000 0.500000 0 285212672 0 +( 2280 2256 -360 ) ( 2280 2224 -360 ) ( 2184 2224 -360 ) subway/1_stair_top1 12 48 0 0.500000 -0.500000 0 285212672 0 +( 2296 2248 -360 ) ( 2200 2248 -360 ) ( 2200 2248 -368 ) subway/1_stair_top1 -16 16 0 0.500000 0.500000 0 285212672 0 +( 2160 2256 -360 ) ( 2160 2224 -360 ) ( 2160 2224 -368 ) subway/1_stair_top1 16 16 -180 0.500000 -0.500000 0 285212672 0 +( 2192 2224 -360 ) ( 2288 2224 -360 ) ( 2288 2224 -368 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2320 2224 -360 ) ( 2320 2256 -360 ) ( 2320 2256 -368 ) subway/1_stair_top1 16 16 -180 0.500000 -0.500000 0 285212672 0 +} +// brush 3 +{ +( 2320 2272 -344 ) ( 2320 2304 -344 ) ( 2320 2304 -352 ) subway/1_stair_top1 16 48 -180 0.500000 -0.500000 0 285212672 0 +( 2192 2272 -344 ) ( 2288 2272 -344 ) ( 2288 2272 -352 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2160 2304 -344 ) ( 2160 2272 -344 ) ( 2160 2272 -352 ) subway/1_stair_top1 16 48 -180 0.500000 -0.500000 0 285212672 0 +( 2280 2296 -344 ) ( 2184 2296 -344 ) ( 2184 2296 -352 ) subway/1_stair_top1 -16 48 0 0.500000 0.500000 0 285212672 0 +( 2280 2304 -344 ) ( 2280 2272 -344 ) ( 2184 2272 -344 ) subway/1_stair_top1 12 16 0 0.500000 -0.500000 0 285212672 0 +( 2176 2272 -352 ) ( 2272 2272 -352 ) ( 2272 2304 -352 ) subway/1_stair_top1 -15 15 -90 0.500000 0.500000 0 285212672 0 +} +// brush 4 +{ +( 2176 2248 -360 ) ( 2272 2248 -360 ) ( 2272 2280 -360 ) subway/1_stair_top1 -15 63 -90 0.500000 0.500000 0 285212672 0 +( 2280 2280 -352 ) ( 2280 2248 -352 ) ( 2184 2248 -352 ) subway/1_stair_top1 12 64 0 0.500000 -0.500000 0 285212672 0 +( 2296 2272 -352 ) ( 2200 2272 -352 ) ( 2200 2272 -360 ) subway/1_stair_top1 -16 32 0 0.500000 0.500000 0 285212672 0 +( 2160 2280 -352 ) ( 2160 2248 -352 ) ( 2160 2248 -360 ) subway/1_stair_top1 0 32 -180 0.500000 -0.500000 0 285212672 0 +( 2192 2248 -352 ) ( 2288 2248 -352 ) ( 2288 2248 -360 ) subway/1_stair_side1 0 0 0 0.500000 0.500000 0 285212672 0 +( 2320 2248 -352 ) ( 2320 2280 -352 ) ( 2320 2280 -360 ) subway/1_stair_top1 0 32 -180 0.500000 -0.500000 0 285212672 0 +} +} +// entity 525 +{ +"origin" "1992 2536 -248" +"light" "95" +"color" "1.000000 1.000000 0.768627" +"_color" "1.000000 1.000000 0.768627" +"classname" "light" +} +// entity 526 +{ +"origin" "2232 2352 -248" +"light" "95" +"color" "1.000000 1.000000 0.768627" +"_color" "1.000000 1.000000 0.768627" +"classname" "light" +} +// entity 527 +{ +"origin" "-564 1282 64" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 528 +{ +"origin" "-564 1282 84" +"light" "125" +"color" "0.823529 1.000000 1.000000" +"_color" "0.823529 1.000000 1.000000" +"classname" "light_generic_hanging" +} +// entity 529 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.792157" +"color" "1.000000 1.000000 0.792157" +"_mangle" "0 -90" +"_focus" "11" +"_cone" "90" +"origin" "-568 1512 80" +} +// entity 530 +{ +"origin" "-536 1658 -40" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 531 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "-584 1658 -40" +} +// entity 532 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "-336 1656 -40" +} +// entity 533 +{ +"origin" "-400 1656 -40" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 534 +{ +"origin" "0 1464 -64" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 535 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "-32 1464 -64" +} +// entity 536 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "192 1464 -64" +} +// entity 537 +{ +"origin" "160 1464 -64" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 538 +{ +"origin" "312 1280 -64" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 539 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "312 1312 -64" +} +// entity 540 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "85" +"origin" "312 864 -64" +} +// entity 541 +{ +"origin" "312 896 -64" +"light" "85" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 542 +{ +"origin" "176 640 -64" +"light" "85" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 543 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "85" +"origin" "208 640 -64" +} +// entity 544 +{ +"origin" "-26 442 -76" +"classname" "light_generic_hanging" +"_color" "0.823529 1.000000 1.000000" +"light" "120" +} +// entity 545 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "95" +"origin" "-28 664 -104" +} +// entity 546 +{ +"origin" "-28 600 -104" +"light" "95" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 547 +{ +"origin" "-28 472 -104" +"light" "95" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 548 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "95" +"origin" "-28 408 -104" +} +// entity 549 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "-24 1360 -128" +} +// entity 550 +{ +"origin" "-64 1272 -128" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 551 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "-564 1178 64" +} +// entity 552 +{ +"origin" "-280 1208 -56" +"light" "80" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +} +// entity 553 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "80" +"origin" "-184 1208 -56" +} +// entity 554 +{ +"origin" "-88 1208 -56" +"light" "80" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +} +// entity 555 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "80" +"origin" "8 1208 -56" +} +// entity 556 +{ +"origin" "-336 1392 -112" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 557 +{ +"origin" "-352 1720 -96" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 558 +{ +"classname" "light" +"light" "60" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "-488 1720 -96" +} +// entity 559 +{ +"origin" "-608 1720 -96" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 560 +{ +"origin" "264 1072 -56" +"light" "80" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +} +// entity 561 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "110" +"origin" "-152 632 -64" +} +// entity 562 +{ +"origin" "-152 440 -64" +"light" "110" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +} +// entity 563 +{ +"origin" "-408 1336 -112" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 564 +{ +"origin" "-560 1400 -8" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 565 +{ +"classname" "light" +"light" "60" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "-208 1360 -136" +} +// entity 566 +{ +"origin" "96 416 -192" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 567 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "1008 1102 -104" +} +// entity 568 +{ +"origin" "1008 1134 -104" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 569 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "60" +"origin" "492 1112 -56" +} +// entity 570 +{ +"origin" "896 832 -192" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 571 +{ +"classname" "light" +"light" "60" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "896 928 -192" +} +// entity 572 +{ +"origin" "896 1032 -192" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 573 +{ +"classname" "light" +"light" "60" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "896 1136 -192" +} +// entity 574 +{ +"origin" "1016 766 -104" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 575 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "1016 798 -104" +} +// entity 576 +{ +"origin" "700 1112 -56" +"light" "60" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +} +// entity 577 +{ +"origin" "608 880 -72" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 578 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "608 848 -72" +} +// entity 579 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "608 624 -72" +} +// entity 580 +{ +"origin" "608 584 -72" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 581 +{ +"classname" "light" +"light" "60" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "744 1096 -152" +} +// entity 582 +{ +"origin" "744 1008 -152" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 583 +{ +"origin" "1152 840 -144" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 584 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "1152 1104 -144" +} +// entity 585 +{ +"classname" "light" +"light" "60" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "1152 1144 -192" +} +// entity 586 +{ +"origin" "1152 776 -192" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 587 +{ +"origin" "1000 648 -136" +"light" "55" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +} +// entity 588 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "55" +"origin" "1000 1216 -136" +} +// entity 589 +{ +"origin" "1080 984 -136" +"light" "55" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +} +// entity 590 +{ +"origin" "946 466 -120" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 591 +{ +"_color" "0.823529 1.000000 1.000000" +"origin" "754 -198 -92" +"classname" "light_generic_hanging" +"light" "110" +} +// entity 592 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "120" +"origin" "730 -198 -114" +} +// entity 593 +{ +"classname" "light_generic_hanging" +"origin" "754 -486 -92" +"_color" "0.823529 1.000000 1.000000" +"light" "110" +} +// entity 594 +{ +"origin" "730 -486 -114" +"light" "120" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 595 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "90" +"origin" "650 -486 -114" +} +// entity 596 +{ +"classname" "light" +"light" "60" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "848 -336 -192" +} +// entity 597 +{ +"origin" "848 -432 -192" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 598 +{ +"classname" "light" +"light" "85" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "616 -568 -192" +} +// entity 599 +{ +"origin" "656 -328 -96" +"light" "90" +"classname" "light" +} +// entity 600 +{ +"origin" "482 -502 -138" +"light" "105" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 601 +{ +"origin" "-368 -996 -248" +"_mangle" "270 -90" +"_focus" "11" +"_cone" "90" +"color" "1.000000 1.000000 0.843137" +"_color" "1.000000 1.000000 0.843137" +"classname" "light" +} +// entity 602 +{ +"classname" "func_wall" +// brush 0 +{ +( -376 -1000 -252 ) ( -376 -1000 -268 ) ( -376 -984 -268 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -360 -984 -268 ) ( -360 -1000 -268 ) ( -360 -1000 -252 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -392 -984 -268 ) ( -392 -1000 -268 ) ( -360 -1000 -268 ) subway/light_yellow -16 16 0 0.500000 0.500000 134217728 16777217 12000 +( -392 -984 -252 ) ( -392 -984 -268 ) ( -360 -984 -268 ) subway/1_black 0 -8 0 0.500000 0.500000 134217728 16777216 0 +( -360 -984 -252 ) ( -360 -1000 -268 ) ( -392 -1000 -268 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 603 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.843137" +"color" "1.000000 1.000000 0.843137" +"_cone" "90" +"_focus" "11" +"_mangle" "180 -90" +"origin" "-128 -760 -316" +} +// entity 604 +{ +"origin" "-128 -648 -316" +"_mangle" "180 -90" +"_focus" "11" +"_cone" "90" +"color" "1.000000 1.000000 0.843137" +"_color" "1.000000 1.000000 0.843137" +"classname" "light" +} +// entity 605 +{ +"origin" "-8 -760 -316" +"_mangle" "0 -90" +"_focus" "11" +"_cone" "90" +"color" "1.000000 1.000000 0.843137" +"_color" "1.000000 1.000000 0.843137" +"classname" "light" +} +// entity 606 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.843137" +"color" "1.000000 1.000000 0.843137" +"_cone" "90" +"_focus" "11" +"_mangle" "0 -90" +"origin" "-8 -648 -316" +} +// entity 607 +{ +"origin" "-64 -424 -316" +"_mangle" "90 -90" +"_focus" "11" +"_cone" "90" +"color" "1.000000 1.000000 0.843137" +"_color" "1.000000 1.000000 0.843137" +"classname" "light" +} +// entity 608 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"color" "1.000000 0.392157 0.101961" +"light" "135" +"origin" "1700 808 -400" +} +// entity 609 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"color" "1.000000 0.392157 0.101961" +"light" "135" +"origin" "1700 1008 -400" +} +// entity 610 +{ +"origin" "1700 1040 -400" +"light" "135" +"color" "1.000000 0.392157 0.101961" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 611 +{ +"origin" "1700 1216 -400" +"light" "100" +"color" "1.000000 0.392157 0.101961" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 612 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"color" "1.000000 0.392157 0.101961" +"light" "100" +"origin" "1700 1248 -400" +} +// entity 613 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"color" "1.000000 0.392157 0.101961" +"light" "135" +"origin" "1700 1448 -400" +} +// entity 614 +{ +"origin" "1700 1480 -400" +"light" "135" +"color" "1.000000 0.392157 0.101961" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 615 +{ +"origin" "1700 1656 -400" +"light" "135" +"color" "1.000000 0.392157 0.101961" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 616 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"color" "1.000000 0.392157 0.101961" +"light" "135" +"origin" "1700 1688 -400" +} +// entity 617 +{ +"light" "120" +"classname" "light_generic_caged" +"_color" "1.000000 1.000000 0.843137" +"origin" "1845 1096 -326" +} +// entity 618 +{ +"light" "90" +"classname" "light" +"_color" "1.000000 1.000000 0.843137" +"origin" "1852 1096 -352" +} +// entity 619 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.843137" +"origin" "1812 904 -352" +"light" "90" +} +// entity 620 +{ +"classname" "light_generic_caged" +"_color" "1.000000 1.000000 0.843137" +"origin" "1819 904 -326" +"light" "120" +} +// entity 621 +{ +"origin" "1845 904 -326" +"_color" "1.000000 1.000000 0.843137" +"classname" "light_generic_caged" +"light" "120" +} +// entity 622 +{ +"origin" "1852 904 -352" +"_color" "1.000000 1.000000 0.843137" +"classname" "light" +"light" "90" +} +// entity 623 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"color" "1.000000 0.392157 0.101961" +"light" "135" +"origin" "1700 392 -400" +} +// entity 624 +{ +"origin" "1700 424 -400" +"light" "135" +"color" "1.000000 0.392157 0.101961" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 625 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"color" "1.000000 0.392157 0.101961" +"light" "135" +"origin" "1972 776 -400" +} +// entity 626 +{ +"origin" "1972 808 -400" +"light" "135" +"color" "1.000000 0.392157 0.101961" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 627 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.843137" +"color" "1.000000 1.000000 0.843137" +"_cone" "90" +"_focus" "13" +"_mangle" "0 -90" +"origin" "816 -600 -400" +"light" "380" +} +// entity 628 +{ +"light" "90" +"origin" "1812 584 -328" +"_color" "1.000000 1.000000 0.843137" +"classname" "light" +} +// entity 629 +{ +"light" "120" +"origin" "1835 584 -302" +"_color" "1.000000 1.000000 0.843137" +"classname" "light_generic_caged" +} +// entity 630 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.843137" +"origin" "1852 584 -328" +"light" "90" +} +// entity 631 +{ +"origin" "1700 -40 -400" +"light" "135" +"color" "1.000000 0.392157 0.101961" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 632 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"color" "1.000000 0.392157 0.101961" +"light" "135" +"origin" "1700 -8 -400" +} +// entity 633 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"color" "1.000000 0.392157 0.101961" +"light" "135" +"origin" "1964 -40 -400" +} +// entity 634 +{ +"origin" "1964 -8 -400" +"light" "135" +"color" "1.000000 0.392157 0.101961" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 635 +{ +"classname" "light" +"_color" "1.000000 0.912698 0.813492" +"color" "1.000000 0.912698 0.813492" +"light" "80" +"origin" "1704 1568 -520" +} +// entity 636 +{ +"origin" "1800 1568 -520" +"light" "80" +"color" "1.000000 0.912698 0.813492" +"_color" "1.000000 0.912698 0.813492" +"classname" "light" +} +// entity 637 +{ +"classname" "light" +"_color" "1.000000 0.912698 0.813492" +"color" "1.000000 0.912698 0.813492" +"light" "80" +"origin" "1832 632 -512" +} +// entity 638 +{ +"classname" "light" +"_color" "1.000000 0.912698 0.813492" +"color" "1.000000 0.912698 0.813492" +"light" "80" +"origin" "1704 616 -520" +} +// entity 639 +{ +"origin" "1960 616 -520" +"light" "80" +"color" "1.000000 0.912698 0.813492" +"_color" "1.000000 0.912698 0.813492" +"classname" "light" +} +// entity 640 +{ +"classname" "light" +"_color" "1.000000 0.912698 0.813492" +"color" "1.000000 0.912698 0.813492" +"light" "80" +"origin" "1960 192 -520" +} +// entity 641 +{ +"origin" "1696 192 -520" +"light" "80" +"color" "1.000000 0.912698 0.813492" +"_color" "1.000000 0.912698 0.813492" +"classname" "light" +} +// entity 642 +{ +"classname" "light" +"_color" "1.000000 0.912698 0.813492" +"color" "1.000000 0.912698 0.813492" +"light" "80" +"origin" "1696 -192 -520" +} +// entity 643 +{ +"origin" "1968 -192 -520" +"light" "80" +"color" "1.000000 0.912698 0.813492" +"_color" "1.000000 0.912698 0.813492" +"classname" "light" +} +// entity 644 +{ +"origin" "1964 -456 -400" +"light" "135" +"color" "1.000000 0.392157 0.101961" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 645 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"color" "1.000000 0.392157 0.101961" +"light" "135" +"origin" "1964 -424 -400" +} +// entity 646 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"color" "1.000000 0.392157 0.101961" +"light" "135" +"origin" "1700 -456 -400" +} +// entity 647 +{ +"origin" "1700 -424 -400" +"light" "135" +"color" "1.000000 0.392157 0.101961" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 648 +{ +"light" "380" +"origin" "1968 -640 -360" +"_mangle" "0 -90" +"_focus" "13" +"_cone" "90" +"color" "1.000000 1.000000 0.843137" +"_color" "1.000000 1.000000 0.843137" +"classname" "light" +} +// entity 649 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.843137" +"color" "1.000000 1.000000 0.843137" +"_cone" "90" +"_focus" "9" +"_mangle" "180 -90" +"origin" "1696 -840 -360" +"light" "380" +} +// entity 650 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.843137" +"origin" "1812 -288 -328" +"light" "90" +} +// entity 651 +{ +"classname" "light_generic_caged" +"_color" "1.000000 1.000000 0.843137" +"origin" "1835 -288 -302" +"light" "120" +} +// entity 652 +{ +"light" "90" +"origin" "1852 -288 -328" +"_color" "1.000000 1.000000 0.843137" +"classname" "light" +} +// entity 653 +{ +"classname" "light" +"_color" "1.000000 0.858921 0.058091" +"color" "1.000000 0.858921 0.058091" +"light" "80" +"origin" "1832 -264 -480" +} +// entity 654 +{ +"origin" "1832 -312 -480" +"light" "80" +"color" "1.000000 0.858921 0.058091" +"_color" "1.000000 0.858921 0.058091" +"classname" "light" +} +// entity 655 +{ +"classname" "light" +"_color" "1.000000 0.858921 0.058091" +"color" "1.000000 0.858921 0.058091" +"light" "80" +"origin" "1832 608 -480" +} +// entity 656 +{ +"origin" "1704 -640 -520" +"light" "80" +"color" "1.000000 0.912698 0.813492" +"_color" "1.000000 0.912698 0.813492" +"classname" "light" +} +// entity 657 +{ +"classname" "light" +"_color" "1.000000 0.912698 0.813492" +"color" "1.000000 0.912698 0.813492" +"light" "80" +"origin" "1960 -640 -520" +} +// entity 658 +{ +"light" "380" +"origin" "1696 1568 -376" +"_mangle" "0 -90" +"_focus" "13" +"_cone" "90" +"color" "1.000000 1.000000 0.843137" +"_color" "1.000000 1.000000 0.843137" +"classname" "light" +} +// entity 659 +{ +"origin" "1700 -1112 -400" +"light" "135" +"color" "1.000000 0.392157 0.101961" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 660 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"color" "1.000000 0.392157 0.101961" +"light" "135" +"origin" "1700 -1080 -400" +} +// entity 661 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"color" "1.000000 0.392157 0.101961" +"light" "135" +"origin" "1964 -1112 -400" +} +// entity 662 +{ +"origin" "1964 -1080 -400" +"light" "135" +"color" "1.000000 0.392157 0.101961" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 663 +{ +"classname" "light" +"_color" "1.000000 0.912698 0.813492" +"color" "1.000000 0.912698 0.813492" +"light" "80" +"origin" "1704 -1352 -520" +} +// entity 664 +{ +"origin" "1960 -1352 -520" +"light" "80" +"color" "1.000000 0.912698 0.813492" +"_color" "1.000000 0.912698 0.813492" +"classname" "light" +} +// entity 665 +{ +"light" "160" +"classname" "light" +"_color" "1.000000 0.501961 0.000000" +"color" "1.000000 0.501961 0.000000" +"origin" "1692 -2064 -496" +} +// entity 666 +{ +"classname" "misc_generic_barrel_burning" +"spawnflags" "4" +"origin" "1835 -2150 -521" +} +// entity 667 +{ +"origin" "1868 -2152 -496" +"color" "1.000000 0.501961 0.000000" +"_color" "1.000000 0.501961 0.000000" +"classname" "light" +"light" "160" +} +// entity 668 +{ +"light" "160" +"classname" "light" +"_color" "1.000000 0.501961 0.000000" +"color" "1.000000 0.501961 0.000000" +"origin" "1796 -2168 -496" +} +// entity 669 +{ +"origin" "1752 -2032 -504" +"light" "90" +"_color" "0.783465 0.984252 1.000000" +"classname" "light" +} +// entity 670 +{ +"origin" "1672 -1984 -464" +"light" "80" +"color" "1.000000 0.912698 0.813492" +"_color" "1.000000 0.912698 0.813492" +"classname" "light" +} +// entity 671 +{ +"origin" "2011 -1982 -521" +"spawnflags" "4" +"classname" "misc_generic_barrel_burning" +} +// entity 672 +{ +"light" "160" +"classname" "light" +"_color" "1.000000 0.501961 0.000000" +"color" "1.000000 0.501961 0.000000" +"origin" "1988 -1984 -496" +} +// entity 673 +{ +"classname" "light" +"_color" "1.000000 0.912698 0.813492" +"color" "1.000000 0.912698 0.813492" +"light" "80" +"origin" "1656 -1904 -504" +} +// entity 674 +{ +"classname" "light" +"origin" "1976 2328 -392" +"light" "55" +"_color" "0.768627 1.000000 1.000000" +"color" "0.768627 1.000000 1.000000" +} +// entity 675 +{ +"color" "0.768627 1.000000 1.000000" +"_color" "0.768627 1.000000 1.000000" +"light" "55" +"origin" "1976 2228 -392" +"classname" "light" +} +// entity 676 +{ +"classname" "light" +"origin" "2240 2248 -248" +"light" "55" +"_color" "0.768627 1.000000 1.000000" +"color" "0.768627 1.000000 1.000000" +} +// entity 677 +{ +"color" "0.768627 1.000000 1.000000" +"_color" "0.768627 1.000000 1.000000" +"light" "55" +"origin" "2240 2084 -248" +"classname" "light" +} +// entity 678 +{ +"light" "55" +"origin" "2272 2152 -360" +"_color" "0.623529 1.000000 0.858824" +"classname" "light" +} +// entity 679 +{ +"classname" "light" +"_color" "0.623529 1.000000 0.858824" +"origin" "2272 2072 -360" +"light" "55" +} +// entity 680 +{ +"origin" "1120 -104 -114" +"light" "90" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 681 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "90" +"origin" "1152 -104 -114" +} +// entity 682 +{ +"origin" "728 -568 -192" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 683 +{ +"origin" "656 -328 -192" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 684 +{ +"classname" "light" +"light" "60" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "696 -208 -192" +} +// entity 685 +{ +"origin" "656 -72 -192" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 686 +{ +"origin" "712 -392 -176" +"_wait" ".6" +"light" "45" +"color" "1.000000 1.000000 0.850980" +"_color" "1.000000 1.000000 0.850980" +"classname" "light" +} +// entity 687 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.850980" +"color" "1.000000 1.000000 0.850980" +"light" "75" +"_wait" ".6" +"origin" "608 -488 -176" +} +// entity 688 +{ +"origin" "404 -848 -132" +"light" "110" +"color" "1.000000 0.933071 0.724409" +"_color" "1.000000 0.933071 0.724409" +"classname" "light" +} +// entity 689 +{ +"classname" "light" +"_color" "1.000000 0.933071 0.724409" +"color" "1.000000 0.933071 0.724409" +"light" "60" +"origin" "120 -776 -164" +} +// entity 690 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "115" +"origin" "40 -784 -154" +} +// entity 691 +{ +"origin" "8 -784 -154" +"light" "115" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 692 +{ +"origin" "56 -1336 -304" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 693 +{ +"classname" "light" +"light" "60" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "-8 -1336 -304" +} +// entity 694 +{ +"origin" "-72 -1336 -304" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 695 +{ +"classname" "light" +"light" "60" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "-264 -1336 -304" +} +// entity 696 +{ +"origin" "-328 -1344 -304" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 697 +{ +"classname" "light" +"light" "60" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "-408 -1344 -304" +} +// entity 698 +{ +"origin" "-208 -1224 -304" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 699 +{ +"classname" "light" +"light" "60" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "-112 -1224 -304" +} +// entity 700 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.792157" +"origin" "1368 2368 -456" +"light" "65" +} +// entity 701 +{ +"origin" "1368 2216 -456" +"_color" "1.000000 1.000000 0.792157" +"classname" "light" +"light" "65" +} +// entity 702 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.792157" +"origin" "1480 2216 -456" +"light" "65" +} +// entity 703 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.843137" +"color" "1.000000 1.000000 0.843137" +"_cone" "90" +"_focus" "11" +"_mangle" "180 -90" +"origin" "-192 -648 -316" +} +// entity 704 +{ +"classname" "trigger_once" +"target" "t54" +// brush 0 +{ +( 80 1400 -168 ) ( -64 1400 -168 ) ( -64 1384 -168 ) subway/trigger 0 0 0 1 1 0 144 0 +( -64 1384 -48 ) ( -64 1400 -48 ) ( 80 1400 -48 ) subway/trigger 0 0 0 1 1 0 144 0 +( -64 1384 -112 ) ( 80 1384 -112 ) ( 80 1384 -128 ) subway/trigger 0 0 0 1 1 0 144 0 +( 72 1384 -112 ) ( 72 1400 -112 ) ( 72 1400 -128 ) subway/trigger 0 0 0 1 1 0 144 0 +( 80 1392 -112 ) ( -64 1392 -112 ) ( -64 1392 -128 ) subway/trigger 0 0 0 1 1 0 144 0 +( -120 1392 -112 ) ( -120 1376 -112 ) ( -120 1376 -128 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 705 +{ +"killtarget" "backof" +"target" "t212" +"targetname" "camdoorkicker" +"angle" "90" +"spawnflags" "262160" +"classname" "m_nyc_mskinhead2a" +"origin" "600 576 -128" +} +// entity 706 +{ +"spawnflags" "4" +"targetname" "stall2" +"classname" "func_wall" +// brush 0 +{ +( 1828 1016 -184 ) ( 1816 1016 -184 ) ( 1816 1004 -184 ) subway/origin 4 -60 0 1 1 16777216 128 0 +( 1816 1004 -172 ) ( 1816 1016 -172 ) ( 1828 1016 -172 ) subway/origin 4 -60 0 1 1 16777216 128 0 +( 1816 1004 -176 ) ( 1828 1004 -176 ) ( 1828 1004 -180 ) subway/origin 4 0 0 1 1 16777216 128 0 +( 1828 1004 -176 ) ( 1828 1016 -176 ) ( 1828 1016 -180 ) subway/origin 60 0 0 1 1 16777216 128 0 +( 1828 1016 -176 ) ( 1816 1016 -176 ) ( 1816 1016 -180 ) subway/origin 4 0 0 1 1 16777216 128 0 +( 1816 1016 -176 ) ( 1816 1004 -176 ) ( 1816 1004 -180 ) subway/origin 60 0 0 1 1 16777216 128 0 +} +// brush 1 +{ +( 1824 1008 -152 ) ( 1820 1008 -152 ) ( 1820 1004 -152 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 1004 -148 ) ( 1820 1008 -148 ) ( 1824 1008 -148 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 1004 -144 ) ( 1824 1004 -144 ) ( 1824 1004 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1823 1004 -144 ) ( 1823 1008 -144 ) ( 1823 1008 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 1008 -144 ) ( 1820 1008 -144 ) ( 1820 1008 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1821 1008 -144 ) ( 1821 1004 -144 ) ( 1821 1004 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 2 +{ +( 1828 1004 -176 ) ( 1820 1004 -176 ) ( 1820 1004 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 944 -176 ) ( 1824 1008 -176 ) ( 1824 1008 -192 ) subway/1_bath_stalldoor 26 -16 0 0.650000 1 134217728 16908288 0 +( 1820 964 -176 ) ( 1828 964 -176 ) ( 1828 964 -192 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 1008 -176 ) ( 1820 944 -176 ) ( 1820 944 -192 ) subway/1_bath_stalldoor 26 -16 0 0.650000 1 134217728 16908288 0 +( 1820 1012 -144 ) ( 1828 1012 -144 ) ( 1828 948 -144 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1828 948 -208 ) ( 1828 1012 -208 ) ( 1820 1012 -208 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +// brush 3 +{ +( 1824 1008 -204 ) ( 1820 1008 -204 ) ( 1820 1004 -204 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 1004 -200 ) ( 1820 1008 -200 ) ( 1824 1008 -200 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1820 1004 -196 ) ( 1824 1004 -196 ) ( 1824 1004 -260 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1823 1004 -196 ) ( 1823 1008 -196 ) ( 1823 1008 -260 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1824 1008 -196 ) ( 1820 1008 -196 ) ( 1820 1008 -260 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +( 1821 1008 -196 ) ( 1821 1004 -196 ) ( 1821 1004 -260 ) subway/1_bath_stall 32 -16 0 1 1 134217728 16777216 0 +} +} +// entity 707 +{ +"spawnflags" "6" +"targetname" "lstallguy1" +"classname" "m_nyc_mskinhead1" +"origin" "1860 1034 -168" +"angle" "180" +} +// entity 708 +{ +"target" "t203" +"waitaction1" "CCH_A_FWD_MS_2" +"wait" "-1" +"origin" "576 -152 -176" +"angle" "45" +"classname" "m_nyc_mskinhead1" +"spawnflags" "134" +"targetname" "tokenguy1" +"killtarget" "t130" +} +// entity 709 +{ +"target" "t204" +"classname" "m_nyc_mskinhead2a" +"angle" "0" +"origin" "552 -200 -176" +"spawnflags" "134" +"targetname" "tokenguy2" +"killtarget" "t130" +} +// entity 710 +{ +"target" "t205" +"origin" "560 -264 -176" +"angle" "0" +"classname" "m_nyc_mskinhead2a" +"spawnflags" "134" +"targetname" "tokenguy3" +"killtarget" "t130" +} +// entity 711 +{ +"target" "t155" +"origin" "-184 -648 -360" +"angle" "360" +"classname" "m_nyc_mskinhead1" +"targetname" "fuseguy" +"spawnflags" "4" +} +// entity 712 +{ +"origin" "1400 1248 -168" +"script" "tsr1/mensroom" +"classname" "script_runner" +"targetname" "t65" +} +// entity 713 +{ +"classname" "trigger_once" +"target" "t65" +// brush 0 +{ +( 1576 1160 -216 ) ( 1216 1160 -216 ) ( 1216 1152 -216 ) subway/trigger 8 0 0 1 1 0 144 0 +( 1216 1152 -104 ) ( 1216 1160 -104 ) ( 1576 1160 -104 ) subway/trigger 8 0 0 1 1 0 144 0 +( 1056 1032 -128 ) ( 1416 1032 -128 ) ( 1416 1032 -168 ) subway/trigger 8 0 0 1 1 0 144 0 +( 1416 1152 -128 ) ( 1416 1160 -128 ) ( 1416 1160 -168 ) subway/trigger 0 0 0 1 1 0 144 0 +( 1688 1160 -128 ) ( 1328 1160 -128 ) ( 1328 1160 -168 ) subway/trigger 8 0 0 1 1 0 144 0 +( 1328 1160 -128 ) ( 1328 1152 -128 ) ( 1328 1152 -168 ) subway/trigger 0 0 0 1 1 0 144 0 +} +} +// entity 714 +{ +"angle" "270" +"origin" "1376 1334 -196" +"classname" "misc_newyork_trashcan" +"spawnflags" "2" +} +// entity 715 +{ +"classname" "misc_generic_sink" +"origin" "1285 1541 -190" +"angle" "270" +} +// entity 716 +{ +"classname" "misc_generic_sink" +"origin" "1551 1187 -190" +"angle" "90" +} +// entity 717 +{ +"angle" "90" +"origin" "1471 1187 -190" +"classname" "misc_generic_sink" +} +// entity 718 +{ +"angle" "90" +"origin" "1257 1187 -190" +"classname" "misc_generic_sink" +} +// entity 719 +{ +"classname" "misc_generic_sink" +"origin" "1307 1187 -190" +"angle" "90" +} +// entity 720 +{ +"classname" "misc_generic_urinal" +"origin" "1230 1321 -183" +"angle" "0" +} +// entity 721 +{ +"angle" "0" +"origin" "1230 1349 -183" +"classname" "misc_generic_urinal" +} +// entity 722 +{ +"angle" "0" +"origin" "1230 1377 -183" +"classname" "misc_generic_urinal" +} +// entity 723 +{ +"angle" "0" +"origin" "1230 1405 -183" +"classname" "misc_generic_urinal" +} +// entity 724 +{ +"angle" "0" +"origin" "1230 1433 -183" +"classname" "misc_generic_urinal" +} +// entity 725 +{ +"spawnflags" "4" +"targetname" "mstalldoor1" +"classname" "func_wall" +// brush 0 +{ +( 1520 1500 -208 ) ( 1508 1500 -208 ) ( 1508 1488 -208 ) subway/origin 52 40 0 1 1 16777216 128 0 +( 1512 1488 -196 ) ( 1512 1500 -196 ) ( 1524 1500 -196 ) subway/origin 52 40 0 1 1 16777216 128 0 +( 1512 1488 -200 ) ( 1524 1488 -200 ) ( 1524 1488 -204 ) subway/origin 52 -24 0 1 1 16777216 128 0 +( 1524 1488 -200 ) ( 1524 1500 -200 ) ( 1524 1500 -204 ) subway/origin -40 -24 0 1 1 16777216 128 0 +( 1524 1500 -200 ) ( 1512 1500 -200 ) ( 1512 1500 -204 ) subway/origin 52 -24 0 1 1 16777216 128 0 +( 1512 1500 -200 ) ( 1512 1488 -200 ) ( 1512 1488 -204 ) subway/origin -40 -24 0 1 1 16777216 128 0 +} +// brush 1 +{ +( 1520 1496 -152 ) ( 1516 1496 -152 ) ( 1516 1492 -152 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1516 1492 -148 ) ( 1516 1496 -148 ) ( 1520 1496 -148 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1516 1492 -144 ) ( 1520 1492 -144 ) ( 1520 1492 -208 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1519 1492 -144 ) ( 1519 1496 -144 ) ( 1519 1496 -208 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1520 1496 -144 ) ( 1516 1496 -144 ) ( 1516 1496 -208 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +( 1517 1496 -144 ) ( 1517 1492 -144 ) ( 1517 1492 -208 ) subway/1_bath_stallurinal 0 0 0 1 1 134217728 16777216 0 +} +// brush 2 +{ +( 1524 1492 -176 ) ( 1516 1492 -176 ) ( 1516 1492 -192 ) subway/1_bath_stalldoor -16 -16 0 0.700000 1 134217728 16777216 0 +( 1520 1436 -176 ) ( 1520 1500 -176 ) ( 1520 1500 -192 ) subway/1_bath_stalldoor -20 -16 0 0.650000 1 134217728 16908288 0 +( 1516 1452 -176 ) ( 1524 1452 -176 ) ( 1524 1452 -192 ) subway/1_bath_stalldoor -16 -16 0 0.700000 1 134217728 16777216 0 +( 1516 1496 -176 ) ( 1516 1432 -176 ) ( 1516 1432 -192 ) subway/1_bath_stalldoor -20 -16 0 0.650000 1 134217728 16908288 0 +( 1516 1500 -144 ) ( 1524 1500 -144 ) ( 1524 1436 -144 ) subway/1_bath_stalldoor -16 -16 0 0.700000 1 134217728 16777216 0 +( 1524 1436 -208 ) ( 1524 1500 -208 ) ( 1516 1500 -208 ) subway/1_bath_stalldoor -16 -16 0 0.700000 1 134217728 16777216 0 +} +// brush 3 +{ +( 1520 1496 -204 ) ( 1516 1496 -204 ) ( 1516 1492 -204 ) subway/1_duct 8 28 0 0.500000 0.500000 134217728 16777216 0 +( 1516 1492 -200 ) ( 1516 1496 -200 ) ( 1520 1496 -200 ) subway/1_duct 8 28 0 0.500000 0.500000 134217728 16777216 0 +( 1516 1492 -196 ) ( 1520 1492 -196 ) ( 1520 1492 -260 ) subway/1_duct 8 -40 0 0.500000 0.500000 134217728 16777216 0 +( 1519 1492 -196 ) ( 1519 1496 -196 ) ( 1519 1496 -260 ) subway/1_duct 4 -40 0 0.500000 0.500000 134217728 16777216 0 +( 1520 1496 -196 ) ( 1516 1496 -196 ) ( 1516 1496 -260 ) subway/1_duct 8 -40 0 0.500000 0.500000 134217728 16777216 0 +( 1517 1496 -196 ) ( 1517 1492 -196 ) ( 1517 1492 -260 ) subway/1_duct 4 -40 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 726 +{ +"light" "65" +"origin" "232 72 -136" +"_color" "1.000000 1.000000 0.792157" +"classname" "light" +} +// entity 727 +{ +"killtarget" "victim1" +"angle" "135" +"origin" "344 1032 -128" +"classname" "m_nyc_mskinhead2a" +"targetname" "chaser1" +"spawnflags" "18" +} +// entity 728 +{ +"target" "t74" +"targetname" "t73" +"classname" "path_corner" +"origin" "656 928 -160" +} +// entity 729 +{ +"angle" "90" +"targetname" "t74" +"origin" "696 1064 -160" +"classname" "path_corner" +"wait" "4" +} +// entity 730 +{ +"target" "t77" +"targetname" "t76" +"classname" "path_corner" +"origin" "568 928 -160" +} +// entity 731 +{ +"angle" "90" +"targetname" "t77" +"origin" "488 1072 -160" +"classname" "path_corner" +"wait" "4" +} +// entity 732 +{ +"origin" "624 432 -72" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 733 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "600 432 -72" +} +// entity 734 +{ +"origin" "456 1056 -72" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 735 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "480 1056 -72" +} +// entity 736 +{ +"origin" "728 1056 -72" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 737 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "696 1056 -72" +} +// entity 738 +{ +"origin" "680 952 -152" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "60" +"classname" "light" +} +// entity 739 +{ +"classname" "light" +"light" "60" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "536 952 -152" +} +// entity 740 +{ +"origin" "1566 1377 -200" +"angle" "180" +"classname" "misc_generic_toilet" +"spawnflags" "2" +} +// entity 741 +{ +"classname" "misc_generic_toilet" +"angle" "180" +"origin" "1566 1425 -200" +"spawnflags" "2" +} +// entity 742 +{ +"origin" "1272 1068 -144" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 743 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "1372 1116 -144" +} +// entity 744 +{ +"origin" "1292 1320 -120" +"light" "55" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +} +// entity 745 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "55" +"origin" "1292 1464 -120" +} +// entity 746 +{ +"origin" "1492 1464 -120" +"light" "55" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +} +// entity 747 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "55" +"origin" "1492 1320 -120" +} +// entity 748 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "1272 884 -144" +} +// entity 749 +{ +"origin" "1364 884 -144" +"light" "60" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 750 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "1440 756 -144" +} +// entity 751 +{ +"origin" "1580 1024 -120" +"light" "55" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +"_wait" ".7" +} +// entity 752 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "55" +"origin" "1580 880 -120" +"_wait" ".7" +} +// entity 753 +{ +"origin" "1580 768 -120" +"light" "55" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +"_wait" ".7" +} +// entity 754 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "55" +"origin" "1692 1024 -120" +"_wait" ".7" +} +// entity 755 +{ +"classname" "misc_generic_toilet" +"angle" "180" +"origin" "1870 1085 -200" +"spawnflags" "2" +} +// entity 756 +{ +"origin" "1870 933 -200" +"angle" "180" +"classname" "misc_generic_toilet" +"spawnflags" "2" +} +// entity 757 +{ +"origin" "1812 1024 -120" +"light" "55" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +"_wait" ".7" +} +// entity 758 +{ +"_wait" ".7" +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "85" +"origin" "1812 932 -176" +} +// entity 759 +{ +"classname" "misc_generic_toilet" +"angle" "360" +"origin" "1482 997 -200" +"spawnflags" "2" +} +// entity 760 +{ +"origin" "1482 949 -200" +"angle" "360" +"classname" "misc_generic_toilet" +"spawnflags" "2" +} +// entity 761 +{ +"classname" "misc_generic_toilet" +"angle" "360" +"origin" "1482 901 -200" +"spawnflags" "2" +} +// entity 762 +{ +"origin" "-756 1600 -184" +"light" "80" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 763 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"light" "80" +"origin" "-538 1600 -160" +} +// entity 764 +{ +"origin" "-408 1600 -160" +"light" "80" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 765 +{ +"origin" "-408 1596 -280" +"light" "80" +"_color" "1.000000 0.912698 0.813492" +"classname" "light" +} +// entity 766 +{ +"light" "380" +"origin" "816 -104 -368" +"_mangle" "0 -90" +"_focus" "13" +"_cone" "90" +"color" "1.000000 1.000000 0.843137" +"_color" "1.000000 1.000000 0.843137" +"classname" "light" +} +// entity 767 +{ +"classname" "func_wall" +// brush 0 +{ +( 832 -68 -392 ) ( 808 -68 -392 ) ( 808 -140 -392 ) subway/light_yellow 0 16 0 0.250000 0.250000 134217728 16777217 30000 +( 808 -108 -280 ) ( 832 -108 -280 ) ( 832 -108 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 824 -140 -280 ) ( 824 -68 -280 ) ( 824 -68 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 840 -100 -280 ) ( 816 -100 -280 ) ( 816 -100 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 816 -60 -280 ) ( 816 -132 -280 ) ( 816 -132 -440 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( 824 -108 -376 ) ( 816 -108 -384 ) ( 820 -100 -380 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 768 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.843137" +"color" "1.000000 1.000000 0.843137" +"_cone" "90" +"_focus" "13" +"_mangle" "0 -90" +"origin" "1192 1028 -400" +"light" "380" +} +// entity 769 +{ +"light" "380" +"origin" "1072 1496 -400" +"_mangle" "0 -90" +"_focus" "13" +"_cone" "90" +"color" "1.000000 1.000000 0.843137" +"_color" "1.000000 1.000000 0.843137" +"classname" "light" +} +// entity 770 +{ +"origin" "560 -520 -456" +"classname" "_point_cover" +} +// entity 771 +{ +"classname" "_point_cover" +"origin" "560 -392 -456" +} +// entity 772 +{ +"origin" "560 -264 -456" +"classname" "_point_cover" +} +// entity 773 +{ +"origin" "808 -624 -388" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +"light" "60" +} +// entity 774 +{ +"light" "60" +"origin" "808 -128 -388" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 775 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"origin" "808 -80 -388" +"light" "60" +} +// entity 776 +{ +"light" "60" +"origin" "852 440 -440" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 777 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"origin" "852 440 -520" +"light" "60" +} +// entity 778 +{ +"light" "60" +"origin" "1048 336 -520" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 779 +{ +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"origin" "1048 336 -440" +"light" "60" +} +// entity 780 +{ +"light" "90" +"origin" "1080 1916 -408" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 781 +{ +"light" "90" +"classname" "light" +"_color" "1.000000 0.392157 0.101961" +"origin" "1184 2364 -408" +} +// entity 782 +{ +"light" "90" +"origin" "1184 2428 -408" +"_color" "1.000000 0.392157 0.101961" +"classname" "light" +} +// entity 783 +{ +"surfaceType" "37" +"classname" "func_breakable_brush" +"material" "7" +"health" "5" +// brush 0 +{ +( 1688 733 -180 ) ( 1688 709 -180 ) ( 1696 709 -180 ) subway/mirror 11 26 0 0.500000 0.500000 134217730 0 0 +( 1696 709 -146 ) ( 1688 709 -146 ) ( 1688 733 -146 ) subway/mirror 11 26 0 0.500000 0.500000 134217730 0 0 +( 1696 712 -132 ) ( 1696 736 -132 ) ( 1696 736 -172 ) subway/mirror 11 26 0 0.500000 0.500000 134217730 0 0 +( 1696 725 -128 ) ( 1688 725 -128 ) ( 1688 725 -168 ) subway/mirror 11 26 0 0.500000 0.500000 134217730 0 0 +( 1694 729 -132 ) ( 1694 705 -132 ) ( 1694 705 -172 ) subway/mirror 11 26 0 0.500000 0.500000 134217730 0 0 +( 1688 705 -132 ) ( 1696 705 -132 ) ( 1696 705 -172 ) subway/mirror 11 26 0 0.500000 0.500000 134217730 0 0 +} +} +// entity 784 +{ +"target" "t90" +"targetname" "t89" +"classname" "path_corner" +"origin" "248 1432 -152" +} +// entity 785 +{ +"targetname" "t90" +"origin" "296 1376 -152" +"classname" "path_corner" +"target" "t106" +} +// entity 786 +{ +"classname" "path_corner" +"origin" "1232 152 -208" +"targetname" "t93" +"target" "t94" +} +// entity 787 +{ +"origin" "-272 -1200 -304" +"classname" "_point_lean" +} +// entity 788 +{ +"classname" "_point_lean" +"origin" "-144 -392 -456" +} +// entity 789 +{ +"target" "t156" +"classname" "m_nyc_mskinhead2a" +"spawnflags" "2064" +"origin" "80 -288 -440" +"targetname" "stepsguy2" +"angle" "180" +} +// entity 790 +{ +"killtarget" "trainvictim1" +"classname" "m_nyc_mskinhead1" +"angle" "45" +"spawnflags" "22" +"targetname" "pusher" +"origin" "600 -632 -432" +} +// entity 791 +{ +"surfaceType" "37" +"material" "7" +"classname" "func_breakable_brush" +"health" "5" +// brush 0 +{ +( 1326 1184 -180 ) ( 1302 1184 -180 ) ( 1302 1176 -180 ) subway/mirror 88 50 -180 0.500000 -0.500000 134217730 0 0 +( 1302 1176 -146 ) ( 1302 1184 -146 ) ( 1326 1184 -146 ) subway/mirror 88 26 -180 0.500000 -0.500000 134217730 0 0 +( 1305 1176 -132 ) ( 1329 1176 -132 ) ( 1329 1176 -172 ) subway/mirror 88 26 -180 0.500000 -0.500000 134217730 0 0 +( 1318 1176 -128 ) ( 1318 1184 -128 ) ( 1318 1184 -168 ) subway/mirror 112 26 -180 0.500000 -0.500000 134217730 0 0 +( 1346 1178 -132 ) ( 1322 1178 -132 ) ( 1322 1178 -172 ) subway/mirror 88 26 -180 0.500000 -0.500000 134217730 0 0 +( 1298 1184 -132 ) ( 1298 1176 -132 ) ( 1298 1176 -172 ) subway/mirror 112 26 -180 0.500000 -0.500000 134217730 0 0 +} +} +// entity 792 +{ +"origin" "560 216 -176" +"targetname" "tokchaser" +"spawnflags" "18" +"classname" "m_nyc_mskinhead2a" +"killtarget" "tokvictim" +} +// entity 793 +{ +"classname" "func_group" +// brush 0 +{ +( 146 -1273 -374 ) ( 146 -1273 -286 ) ( 122 -1273 -286 ) subway/1_news_side1 30 -19 -180 0.700073 -0.700012 134217728 0 0 +( 110 -1265 -376 ) ( 110 -1265 -288 ) ( 110 -1305 -288 ) subway/1_news_front1 -46 44 0 0.699951 0.699982 134217728 16777216 0 +( 126 -1301 -372 ) ( 126 -1301 -284 ) ( 150 -1301 -284 ) subway/1_news_side1 6 -19 -180 0.700073 -0.700012 134217728 0 0 +( 128 -1309 -376 ) ( 128 -1309 -288 ) ( 128 -1269 -288 ) subway/1_black 2 0 -180 0.500000 -0.500000 134217728 16777216 0 +( 122 -1309 -292 ) ( 122 -1269 -292 ) ( 146 -1269 -292 ) subway/1_news_top1 6 -46 -180 0.700073 0.700073 134217728 0 0 +( 146 -1265 -320 ) ( 122 -1265 -320 ) ( 122 -1305 -320 ) subway/1_black 2 4 -90 0.500000 0.500000 134217728 0 0 +} +// brush 1 +{ +( 146 -1265 -328 ) ( 122 -1265 -328 ) ( 122 -1305 -328 ) subway/1_black 2 4 -90 0.500000 0.500000 134217728 0 0 +( 122 -1309 -320 ) ( 122 -1269 -320 ) ( 146 -1269 -320 ) subway/1_black 2 4 -90 0.500000 0.500000 134217728 0 0 +( 124 -1313 -384 ) ( 124 -1313 -296 ) ( 124 -1273 -296 ) subway/1_black 2 0 -180 0.500000 -0.500000 134217728 0 0 +( 126 -1297 -380 ) ( 126 -1297 -292 ) ( 150 -1297 -292 ) subway/1_black -4 0 0 0.500000 0.500000 134217728 0 0 +( 114 -1265 -384 ) ( 114 -1265 -296 ) ( 114 -1305 -296 ) subway/1_black 2 0 -180 0.500000 -0.500000 134217728 0 0 +( 146 -1277 -382 ) ( 146 -1277 -294 ) ( 122 -1277 -294 ) subway/1_black -4 0 0 0.500000 0.500000 134217728 0 0 +} +} +// entity 794 +{ +"classname" "m_nyc_mskinhead1" +"angle" "180" +"spawnflags" "18" +"origin" "1840 2208 -432" +"targetname" "jumpingman" +} +// entity 795 +{ +"light" "2" +"origin" "-1928 184 328" +"color" "0.783465 0.984252 1.000000" +"_color" "0.583465 0.684252 .555555" +"classname" "light" +} +// entity 796 +{ +"origin" "-2096 -240 472" +"light" "630" +"_mangle" "225 80" +"_focus" "11" +"_cone" "90" +"color" "1.000000 1.000000 0.776471" +"_color" "1.000000 1.000000 0.776471" +"classname" "light" +} +// entity 797 +{ +"classname" "func_group" +// brush 0 +{ +( -2433 62 512 ) ( -2337 -34 512 ) ( -2337 -34 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2354 6 512 ) ( -2365 -5 512 ) ( -2365 -5 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2246 -91 512 ) ( -2342 5 512 ) ( -2342 5 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2356 -25 512 ) ( -2345 -14 512 ) ( -2345 -14 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2342 -29 456 ) ( -2439 67 456 ) ( -2427 79 456 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2422 73 448 ) ( -2433 62 448 ) ( -2337 -34 448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1 +{ +( -2419 48 512 ) ( -2323 -48 512 ) ( -2323 -48 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2340 -9 512 ) ( -2351 -20 512 ) ( -2351 -20 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2238 -99 512 ) ( -2334 -3 512 ) ( -2334 -3 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2340 -31 512 ) ( -2329 -20 512 ) ( -2329 -20 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2334 -37 456 ) ( -2431 59 456 ) ( -2419 71 456 ) subway/light_yellow 24 -24 0 0.500000 0.500000 134217728 16777217 30000 +( -2414 65 448 ) ( -2425 54 448 ) ( -2329 -43 448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( -2331 -40 488 ) ( -2331 -40 512 ) ( -2235 -136 512 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2303 -68 488 ) ( -2303 -68 512 ) ( -2292 -57 512 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2292 -45 488 ) ( -2292 -45 512 ) ( -2388 51 512 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2325 -16 488 ) ( -2325 -16 512 ) ( -2336 -27 512 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2218 -130 456 ) ( -2230 -142 456 ) ( -2326 -45 456 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2331 -40 448 ) ( -2235 -136 448 ) ( -2224 -125 448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 3 +{ +( -2315 -57 448 ) ( -2218 -153 448 ) ( -2207 -142 448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2201 -147 456 ) ( -2213 -159 456 ) ( -2309 -62 456 ) subway/light_yellow 24 -24 0 0.500000 0.500000 134217728 16777217 30000 +( -2292 -57 488 ) ( -2292 -57 512 ) ( -2303 -68 512 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2275 -62 488 ) ( -2275 -62 512 ) ( -2371 34 512 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2292 -79 488 ) ( -2292 -79 512 ) ( -2281 -68 512 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2320 -51 488 ) ( -2320 -51 512 ) ( -2224 -147 512 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 4 +{ +( -2303 -45 448 ) ( -2315 -57 448 ) ( -2218 -153 448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2224 -147 456 ) ( -2320 -51 456 ) ( -2309 -40 456 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2235 -136 512 ) ( -2224 -125 512 ) ( -2224 -125 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2128 -210 512 ) ( -2224 -113 512 ) ( -2224 -113 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2281 -68 512 ) ( -2292 -79 512 ) ( -2292 -79 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2315 -57 512 ) ( -2218 -153 512 ) ( -2218 -153 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 5 +{ +( -2303 -68 512 ) ( -2207 -164 512 ) ( -2207 -164 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2224 -125 512 ) ( -2235 -136 512 ) ( -2235 -136 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2122 -215 512 ) ( -2218 -119 512 ) ( -2218 -119 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2224 -147 512 ) ( -2213 -136 512 ) ( -2213 -136 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2218 -153 456 ) ( -2315 -57 456 ) ( -2303 -45 456 ) subway/light_yellow 24 -24 0 0.500000 0.500000 134217728 16777217 30000 +( -2298 -51 448 ) ( -2309 -62 448 ) ( -2213 -159 448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 6 +{ +( -2252 -119 512 ) ( -2156 -215 512 ) ( -2156 -215 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2213 -136 512 ) ( -2224 -147 512 ) ( -2224 -147 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2060 -277 512 ) ( -2156 -181 512 ) ( -2156 -181 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2167 -204 512 ) ( -2156 -193 512 ) ( -2156 -193 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2162 -210 456 ) ( -2258 -113 456 ) ( -2247 -102 456 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2241 -108 448 ) ( -2252 -119 448 ) ( -2156 -215 448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 7 +{ +( -2206 -135 454 ) ( -2223 -151 454 ) ( -2079 -295 454 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2086 -288 658 ) ( -2232 -144 658 ) ( -2214 -126 658 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2095 -279 550 ) ( -2079 -262 550 ) ( -2079 -262 514 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1960 -397 550 ) ( -2104 -253 550 ) ( -2104 -253 514 ) subway/sign12 1 32 0 2.100000 2.800000 134217728 0 0 +( -2350 9 550 ) ( -2367 -7 550 ) ( -2367 -7 514 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2223 -151 550 ) ( -2079 -295 550 ) ( -2079 -295 514 ) subway/1_black 0 3 90 2 2 134217728 0 0 +} +// brush 8 +{ +( -2235 -136 512 ) ( -2139 -232 512 ) ( -2139 -232 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2156 -193 512 ) ( -2167 -204 512 ) ( -2167 -204 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2054 -283 512 ) ( -2150 -187 512 ) ( -2150 -187 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2156 -215 512 ) ( -2145 -204 512 ) ( -2145 -204 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2150 -221 456 ) ( -2247 -125 456 ) ( -2235 -113 456 ) subway/light_yellow 24 -24 0 0.500000 0.500000 134217728 16777217 30000 +( -2230 -119 448 ) ( -2241 -130 448 ) ( -2145 -227 448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 9 +{ +( -2213 -136 448 ) ( -2224 -147 448 ) ( -2128 -243 448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2133 -238 456 ) ( -2230 -142 456 ) ( -2218 -130 456 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2123 -256 512 ) ( -2112 -245 512 ) ( -2112 -245 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2037 -300 512 ) ( -2133 -204 512 ) ( -2133 -204 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2145 -204 512 ) ( -2156 -215 512 ) ( -2156 -215 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2224 -147 512 ) ( -2128 -243 512 ) ( -2128 -243 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 10 +{ +( -2182 -167 448 ) ( -2193 -178 448 ) ( -2097 -275 448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2102 -269 456 ) ( -2199 -173 456 ) ( -2187 -161 456 ) subway/light_yellow 24 -24 0 0.500000 0.500000 134217728 16777217 30000 +( -2108 -263 512 ) ( -2097 -252 512 ) ( -2097 -252 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2006 -331 512 ) ( -2102 -235 512 ) ( -2102 -235 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2108 -241 512 ) ( -2119 -252 512 ) ( -2119 -252 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2187 -184 512 ) ( -2091 -280 512 ) ( -2091 -280 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 11 +{ +( -2165 -184 448 ) ( -2176 -195 448 ) ( -2080 -291 448 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2085 -286 456 ) ( -2182 -190 456 ) ( -2170 -178 456 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2099 -282 512 ) ( -2088 -271 512 ) ( -2088 -271 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -1989 -348 512 ) ( -2085 -252 512 ) ( -2085 -252 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2097 -252 512 ) ( -2108 -263 512 ) ( -2108 -263 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +( -2176 -195 512 ) ( -2080 -291 512 ) ( -2080 -291 488 ) subway/1_black 0 0 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 798 +{ +"classname" "func_group" +// brush 0 +{ +( -1800 368 280 ) ( -1736 368 280 ) ( -1736 304 280 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1736 304 184 ) ( -1736 368 184 ) ( -1800 368 184 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1768 32 288 ) ( -1832 32 288 ) ( -1832 32 296 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1752 280 288 ) ( -1752 344 288 ) ( -1752 344 296 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1816 48 288 ) ( -1752 48 288 ) ( -1752 48 296 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1744 368 288 ) ( -1744 304 288 ) ( -1744 304 296 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +} +// brush 1 +{ +( -1752 48 312 ) ( -1744 48 312 ) ( -1744 32 280 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1744 64 312 ) ( -1752 64 312 ) ( -1752 48 280 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1768 24 280 ) ( -1832 24 280 ) ( -1832 16 280 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1752 64 312 ) ( -1752 48 312 ) ( -1752 32 280 ) subway/3_grocery1 96 100 58 0.500000 0.500000 0 335544320 0 +( -1816 40 312 ) ( -1752 40 312 ) ( -1752 32 312 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1744 48 312 ) ( -1744 64 312 ) ( -1744 48 280 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1648 64 280 ) ( -1648 32 312 ) ( -1658 32 312 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +} +// brush 2 +{ +( -1658 32 312 ) ( -1648 32 312 ) ( -1648 64 280 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1744 64 296 ) ( -1744 32 280 ) ( -1744 32 296 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1752 32 312 ) ( -1752 32 304 ) ( -1816 32 304 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1752 64 312 ) ( -1752 32 296 ) ( -1752 32 280 ) subway/3_grocery1 100 108 29 0.500000 0.500000 0 335544320 0 +( -1832 64 328 ) ( -1832 64 320 ) ( -1768 64 320 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1752 64 296 ) ( -1752 32 280 ) ( -1744 32 280 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1744 64 312 ) ( -1744 32 296 ) ( -1752 32 296 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +} +// brush 3 +{ +( -1800 64 632 ) ( -1736 64 632 ) ( -1736 64 568 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1736 96 568 ) ( -1736 96 632 ) ( -1800 96 632 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1768 40 296 ) ( -1832 40 296 ) ( -1832 32 296 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1752 40 544 ) ( -1752 40 608 ) ( -1752 32 608 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1816 40 312 ) ( -1752 40 312 ) ( -1752 32 312 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1744 40 632 ) ( -1744 40 568 ) ( -1744 32 568 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +} +// brush 4 +{ +( -1752 128 296 ) ( -1744 128 296 ) ( -1744 96 312 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1744 128 280 ) ( -1752 128 280 ) ( -1752 96 296 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1768 96 320 ) ( -1832 96 320 ) ( -1832 96 328 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1752 128 280 ) ( -1752 128 296 ) ( -1752 96 312 ) subway/3_grocery1 100 108 -29 0.500000 0.500000 0 335544320 0 +( -1816 128 304 ) ( -1752 128 304 ) ( -1752 128 312 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1744 128 296 ) ( -1744 128 280 ) ( -1744 96 296 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1648 96 280 ) ( -1648 128 312 ) ( -1658 128 312 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +} +// brush 5 +{ +( -1658 128 312 ) ( -1648 128 312 ) ( -1648 96 280 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1744 112 280 ) ( -1744 96 312 ) ( -1744 112 312 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1752 128 312 ) ( -1752 120 312 ) ( -1816 120 312 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1752 128 280 ) ( -1752 112 312 ) ( -1752 96 312 ) subway/3_grocery1 96 100 -58 0.500000 0.500000 0 335544320 0 +( -1832 144 280 ) ( -1832 136 280 ) ( -1768 136 280 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1752 112 280 ) ( -1752 96 312 ) ( -1744 96 312 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1744 128 280 ) ( -1744 112 312 ) ( -1752 112 312 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +} +// brush 6 +{ +( -1800 448 280 ) ( -1736 448 280 ) ( -1736 384 280 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1736 384 184 ) ( -1736 448 184 ) ( -1800 448 184 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1768 112 288 ) ( -1832 112 288 ) ( -1832 112 296 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1752 360 288 ) ( -1752 424 288 ) ( -1752 424 296 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1816 128 288 ) ( -1752 128 288 ) ( -1752 128 296 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +( -1744 448 288 ) ( -1744 384 288 ) ( -1744 384 296 ) subway/3_grocery1 0 0 0 0.500000 0.500000 0 335544320 0 +} +} +// entity 799 +{ +"classname" "light" +"origin" "-1992 80 168" +"light" "140" +} +// entity 800 +{ +"classname" "misc_generic_fire_hydrant" +"origin" "-2088 -120 170" +} +// entity 801 +{ +"classname" "light_generic_caged" +"origin" "-1755 81 302" +"light" "120" +"_color" "0.783465 0.684252 .555555" +} +// entity 802 +{ +"color" "0.995049 1.000000 0.905941" +"_color" "0.992157 1.000000 0.905882" +"light" "190" +"origin" "-2515 39 318" +"classname" "light_generic_caged" +} +// entity 803 +{ +"spawnflags" "1" +"classname" "misc_generic_train" +"origin" "-2594 685 412" +"angle" "270" +"targetname" "introltrain" +} +// entity 804 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.776471" +"color" "1.000000 1.000000 0.776471" +"_cone" "90" +"_focus" "11" +"_mangle" "225 80" +"light" "630" +"origin" "-2144 -192 472" +} +// entity 805 +{ +"origin" "-2212 -124 472" +"light" "630" +"_mangle" "225 80" +"_focus" "11" +"_cone" "90" +"color" "1.000000 1.000000 0.776471" +"_color" "1.000000 1.000000 0.776471" +"classname" "light" +} +// entity 806 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.776471" +"color" "1.000000 1.000000 0.776471" +"_cone" "90" +"_focus" "11" +"_mangle" "225 80" +"light" "630" +"origin" "-2280 -56 472" +} +// entity 807 +{ +"origin" "-2328 -8 472" +"light" "630" +"_mangle" "225 80" +"_focus" "11" +"_cone" "90" +"color" "1.000000 1.000000 0.776471" +"_color" "1.000000 1.000000 0.776471" +"classname" "light" +} +// entity 808 +{ +"origin" "-2064 176 328" +"light" "630" +"_mangle" "0 -90" +"_focus" "11" +"_cone" "90" +"color" "1.000000 1.000000 0.776471" +"_color" "1.000000 1.000000 0.776471" +"classname" "light" +} +// entity 809 +{ +"origin" "-1655 -408 479" +"light" "85" +"_wait" ".5" +"_color" "0.992157 1.000000 0.874510" +"classname" "light" +} +// entity 810 +{ +"classname" "light" +"_color" "0.992157 1.000000 0.874510" +"_wait" ".5" +"light" "85" +"origin" "-1967 -408 479" +} +// entity 811 +{ +"origin" "-2143 -408 479" +"light" "85" +"_wait" ".5" +"_color" "0.992157 1.000000 0.874510" +"classname" "light" +} +// entity 812 +{ +"origin" "-1999 -424 367" +"light" "130" +"_wait" ".5" +"_color" "1.000000 1.000000 0.768627" +"classname" "light" +} +// entity 813 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.768627" +"_wait" ".5" +"light" "130" +"origin" "-2079 -424 367" +} +// entity 814 +{ +"origin" "-2103 -232 191" +"light" "115" +"_wait" ".5" +"_color" "0.583465 0.684252 .555555" +"classname" "light" +} +// entity 815 +{ +"classname" "light" +"_color" "0.992157 1.000000 0.874510" +"_wait" ".5" +"light" "115" +"origin" "-2423 -24 351" +} +// entity 816 +{ +"classname" "light" +"_color" "0.992157 1.000000 0.874510" +"_wait" ".5" +"light" "115" +"origin" "-2231 -24 351" +} +// entity 817 +{ +"origin" "-2183 488 287" +"light" "80" +"_wait" ".5" +"_color" "0.892157 1.000000 0.874510" +"classname" "light" +} +// entity 818 +{ +"classname" "light" +"_color" "0.783465 0.684252 .555555" +"_wait" ".5" +"light" "80" +"origin" "-2199 440 415" +} +// entity 819 +{ +"origin" "-1839 240 223" +"light" "115" +"_wait" ".5" +"_color" "0.925490 1.000000 1.000000" +"classname" "light" +} +// entity 820 +{ +"classname" "light" +"_color" "0.925490 1.000000 1.000000" +"_wait" ".5" +"light" "90" +"origin" "-1759 248 431" +} +// entity 821 +{ +"origin" "-1831 -80 287" +"light" "115" +"_wait" ".5" +"_color" "0.925490 1.000000 1.000000" +"classname" "light" +} +// entity 822 +{ +"origin" "-1767 -72 431" +"light" "90" +"_wait" ".5" +"_color" "0.992157 1.000000 0.874510" +"classname" "light" +} +// entity 823 +{ +"classname" "light" +"_color" "0.992157 1.000000 0.874510" +"_wait" ".5" +"light" "90" +"origin" "-1719 40 431" +} +// entity 824 +{ +"origin" "-1839 168 287" +"light" "115" +"_wait" ".5" +"_color" "0.583465 0.684252 .555555" +"classname" "light" +} +// entity 825 +{ +"origin" "-2120 -24 184" +"_wait" ".7" +"light" "80" +"_color" "0.783465 0.684252 .555555" +"classname" "light" +} +// entity 826 +{ +"classname" "light" +"_color" "0.783465 0.684252 .555555" +"light" "80" +"_wait" ".7" +"origin" "-2104 -104 184" +} +// entity 827 +{ +"origin" "-2072 -328 200" +"_wait" ".7" +"light" "80" +"_color" "0.783465 0.684252 .555555" +"classname" "light" +} +// entity 828 +{ +"classname" "light" +"_color" "0.783465 0.684252 .555555" +"light" "80" +"_wait" ".7" +"origin" "-1848 -328 200" +} +// entity 829 +{ +"origin" "-1848 -184 200" +"_wait" ".7" +"light" "80" +"_color" "0.783465 0.684252 .555555" +"classname" "light" +} +// entity 830 +{ +"origin" "-1992 -376 200" +"_wait" ".7" +"light" "80" +"_color" "1.000000 1.000000 0.850980" +"classname" "light" +} +// entity 831 +{ +"origin" "-1968 368 272" +"_color" "1.000000 0.309804 0.309804" +"light" "110" +"classname" "light" +} +// entity 832 +{ +"origin" "-2488 72 296" +"light" "80" +"_color" "0.992157 1.000000 0.905882" +"classname" "light" +} +// entity 833 +{ +"origin" "-1776 32 256" +"_color" "0.783465 0.684252 .555555" +"classname" "light" +"light" "65" +} +// entity 834 +{ +"light" "65" +"origin" "-1840 80 200" +"_color" "0.783465 0.684252 .555555" +"classname" "light" +} +// entity 835 +{ +"origin" "-1640 -408 328" +"_wait" ".7" +"light" "80" +"_color" "0.783465 0.684252 .555555" +"classname" "light" +} +// entity 836 +{ +"classname" "light" +"_color" "0.783465 0.684252 .555555" +"light" "80" +"_wait" ".7" +"origin" "-1800 -408 328" +} +// entity 837 +{ +"origin" "-1888 -464 328" +"_wait" ".7" +"light" "80" +"_color" "0.783465 0.684252 .555555" +"classname" "light" +} +// entity 838 +{ +"classname" "light" +"_color" "0.783465 0.684252 .555555" +"light" "80" +"_wait" ".7" +"origin" "-2000 -424 328" +} +// entity 839 +{ +"origin" "-2128 -424 328" +"_wait" ".7" +"light" "80" +"_color" "0.783465 0.684252 .555555" +"classname" "light" +} +// entity 840 +{ +"origin" "-1848 -248 200" +"_wait" ".7" +"light" "80" +"_color" "0.874510 1.000000 1.000000" +"classname" "light" +} +// entity 841 +{ +"classname" "light" +"_color" "0.783465 0.684252 .555555" +"light" "80" +"_wait" ".7" +"origin" "-1912 -376 200" +} +// entity 842 +{ +"origin" "-2040 -360 200" +"_wait" ".7" +"light" "80" +"_color" "0.874510 1.000000 1.000000" +"classname" "light" +} +// entity 843 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.850980" +"light" "80" +"_wait" ".7" +"origin" "-1736 -376 344" +} +// entity 844 +{ +"origin" "-1736 -280 344" +"_wait" ".7" +"light" "80" +"_color" "1.000000 1.000000 0.850980" +"classname" "light" +} +// entity 845 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.850980" +"light" "80" +"_wait" ".7" +"origin" "-1736 -200 344" +} +// entity 846 +{ +"classname" "light" +"_color" "0.925490 1.000000 1.000000" +"light" "80" +"origin" "-1839 464 287" +} +// entity 847 +{ +"origin" "-1839 544 295" +"light" "80" +"_color" "0.583465 0.684252 .555555" +"classname" "light" +} +// entity 848 +{ +"classname" "light" +"_color" "0.583465 0.684252 .555555" +"light" "80" +"origin" "-1839 392 295" +} +// entity 849 +{ +"classname" "light" +"_color" "0.783465 0.684252 .555555" +"color" "0.783465 0.984252 1.000000" +"origin" "-1952 184 328" +"light" "2" +} +// entity 850 +{ +"classname" "light" +"_color" "0.783465 0.984252 1.000000" +"color" "0.783465 0.984252 1.000000" +"origin" "-1928 224 328" +"light" "2" +} +// entity 851 +{ +"targetname" "swatleader" +"origin" "-1890 200 200" +"classname" "m_nyc_mswatleader" +"spawnflags" "74" +"angle" "90" +} +// entity 852 +{ +"classname" "m_nyc_mswat" +"origin" "-1888 400 208" +"targetname" "walkingswatguy" +"spawnflags" "90" +"angle" "270" +} +// entity 853 +{ +"origin" "-1872 548 200" +"classname" "m_nyc_mswat" +"targetname" "introswat3" +"spawnflags" "90" +"angle" "225" +} +// entity 854 +{ +"spawnflags" "0" +"target" "t121" +"classname" "trigger_once" +// brush 0 +{ +( -536 1016 24 ) ( -600 1016 24 ) ( -600 936 24 ) subway/trigger 24 40 0 1 1 0 128 0 +( -600 936 32 ) ( -600 1016 32 ) ( -536 1016 32 ) subway/trigger 24 40 0 1 1 0 128 0 +( -600 944 88 ) ( -536 944 88 ) ( -536 944 24 ) subway/trigger 24 -32 0 1 1 0 128 0 +( -536 936 88 ) ( -536 1016 88 ) ( -536 1016 24 ) subway/trigger -40 -32 0 1 1 0 128 0 +( -536 1008 88 ) ( -600 1008 88 ) ( -600 1008 24 ) subway/trigger 24 -32 0 1 1 0 128 0 +( -616 1016 88 ) ( -616 936 88 ) ( -616 936 24 ) subway/trigger -40 -32 0 1 1 0 128 0 +} +} +// entity 855 +{ +"angle" "180" +"classname" "m_nyc_etourist" +"spawnflags" "16390" +"origin" "-72 632 -176" +"targetname" "hostage2" +"target" "t141" +} +// entity 856 +{ +"origin" "216 952 -144" +"classname" "_point_lean" +} +// entity 857 +{ +"classname" "_point_lean" +"origin" "696 528 -144" +} +// entity 858 +{ +"target" "t144" +"spawnflags" "16" +"classname" "m_nyc_mskinhead2a" +"origin" "-336 -1128 -288" +"angle" "270" +"targetname" "stepsrunguy" +} +// entity 859 +{ +"classname" "_point_lean" +"origin" "-72 -872 -232" +} +// entity 860 +{ +"classname" "_point_duck" +"origin" "664 -80 -192" +} +// entity 861 +{ +"classname" "light" +"_color" "0.443137 0.721569 1.000000" +"_wait" ".8" +"light" "115" +"origin" "-2103 -344 335" +} +// entity 862 +{ +"origin" "-2103 -144 335" +"light" "115" +"_wait" ".8" +"_color" "0.443137 0.721569 1.000000" +"classname" "light" +} +// entity 863 +{ +"origin" "1552 1224 -160" +"angle" "180" +"classname" "m_nyc_mskinhead2a" +"spawnflags" "4" +"targetname" "sinkguy" +} +// entity 864 +{ +"killtarget" "hostage2" +"origin" "-120 632 -176" +"spawnflags" "6" +"angle" "360" +"classname" "m_nyc_mskinhead2a" +"targetname" "badguy2" +} +// entity 865 +{ +"classname" "light" +"_color" "0.443137 0.721569 1.000000" +"_wait" ".8" +"light" "115" +"origin" "-2223 320 399" +} +// entity 866 +{ +"origin" "-2183 240 279" +"light" "80" +"_wait" ".5" +"_color" "0.783465 0.684252 .555555" +"classname" "light" +} +// entity 867 +{ +"classname" "light" +"_color" "0.783465 0.684252 .555555" +"_wait" ".5" +"light" "80" +"origin" "-2183 312 279" +} +// entity 868 +{ +"origin" "936 -88 -200" +"classname" "point_combat" +"targetname" "t148" +} +// entity 869 +{ +"origin" "704 216 -208" +"classname" "path_corner" +"targetname" "t150" +"target" "t151" +} +// entity 870 +{ +"classname" "path_corner" +"origin" "704 -48 -208" +"targetname" "t151" +"target" "t152" +} +// entity 871 +{ +"WaitAction3" "STD_XFEARWAVE_N_N_N" +"WaitAction2" "STD_XFEARWAVE_N_N_N" +"WaitAction1" "STD_XFEARWAVE_N_N_N" +"wait" "-1" +"classname" "path_corner" +"origin" "856 -384 -208" +"targetname" "t152" +"angle" "180" +} +// entity 872 +{ +"targetname" "t157" +"classname" "point_combat" +"origin" "-136 -344 -472" +} +// entity 873 +{ +"classname" "environ_soundgen" +"origin" "-1900 588 244" +"soundName" "CityStreet" +} +// entity 874 +{ +"soundName" "CityStreet" +"origin" "-2156 60 60" +"classname" "environ_soundgen" +} +// entity 875 +{ +"target" "pusher" +"targetname" "t167" +"classname" "trigger_relay" +"origin" "280 -536 -448" +} +// entity 876 +{ +"WaitAction1" "STD_XFEARWAVE_N_N_N" +"wait" "-1" +"targetname" "t170" +"origin" "320 840 -160" +"classname" "path_corner" +} +// entity 877 +{ +"classname" "_region" +"fog_end" "400.0" +"fog_start" "4.0" +"fog_density" ".3" +"fog_color" "80 45 32" +"fog_distance_cull" "2000" +// brush 0 +{ +( -3336 712 168 ) ( -3416 712 168 ) ( -3416 536 168 ) subway/1_tile 16 -16 0 0.500000 0.500000 0 318767104 0 +( -3392 536 176 ) ( -3392 712 176 ) ( -3312 712 176 ) subway/1_tile 16 -16 0 0.500000 0.500000 0 318767104 0 +( -1888 -512 392 ) ( -1808 -512 392 ) ( -1808 -512 136 ) subway/1_tile 16 0 0 0.500000 0.500000 0 318767104 0 +( -2232 416 392 ) ( -2232 592 392 ) ( -2232 592 136 ) subway/1_tile 48 0 0 0.500000 0.500000 0 318767104 0 +( -3184 -504 392 ) ( -3264 -504 392 ) ( -3264 -504 136 ) subway/1_tile 16 0 0 0.500000 0.500000 0 318767104 0 +( -2240 496 392 ) ( -2240 320 392 ) ( -2240 320 136 ) subway/1_tile 48 0 0 0.500000 0.500000 0 318767104 0 +} +} +// entity 878 +{ +"classname" "func_group" +// brush 0 +{ +( 1959 2801 -320 ) ( 1959 2801 -368 ) ( 1969 2813 -368 ) subway/metal2 -55 16 0 0.383118 0.500000 134217728 16777216 0 +( 1943 2785 -340 ) ( 1943 2785 -388 ) ( 1925 2801 -388 ) subway/metal2 5 16 0 0.382935 0.500000 134217728 16777216 0 +( 1947 2780 -388 ) ( 1947 2780 -340 ) ( 1957 2792 -340 ) subway/metal2 -49 16 0 0.383057 0.500000 134217728 16777216 0 +( 2033 2768 -388 ) ( 2082 2726 -388 ) ( 2082 2726 -340 ) subway/metal2 60 16 0 0.382996 0.500000 134217728 16777216 0 +( 1986 2885 -320 ) ( 1967 2901 -320 ) ( 1983 2919 -320 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +( 1984 2921 -324 ) ( 1969 2902 -324 ) ( 1987 2887 -324 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 1 +{ +( 1959 2801 -304 ) ( 1959 2801 -352 ) ( 1969 2813 -352 ) subway/metal2 -55 16 0 0.383118 0.500000 134217728 16777216 0 +( 1943 2785 -324 ) ( 1943 2785 -372 ) ( 1925 2801 -372 ) subway/metal2 5 16 0 0.382935 0.500000 134217728 16777216 0 +( 1947 2780 -372 ) ( 1947 2780 -324 ) ( 1957 2792 -324 ) subway/metal2 -49 16 0 0.383057 0.500000 134217728 16777216 0 +( 2033 2768 -372 ) ( 2082 2726 -372 ) ( 2082 2726 -324 ) subway/metal2 60 16 0 0.382996 0.500000 134217728 16777216 0 +( 1986 2885 -304 ) ( 1967 2901 -304 ) ( 1983 2919 -304 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +( 1984 2921 -308 ) ( 1969 2902 -308 ) ( 1987 2887 -308 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 2 +{ +( 1959 2801 -288 ) ( 1959 2801 -336 ) ( 1969 2813 -336 ) subway/metal2 -55 16 0 0.383118 0.500000 134217728 16777216 0 +( 1943 2785 -308 ) ( 1943 2785 -356 ) ( 1925 2801 -356 ) subway/metal2 5 16 0 0.382935 0.500000 134217728 16777216 0 +( 1947 2780 -356 ) ( 1947 2780 -308 ) ( 1957 2792 -308 ) subway/metal2 -49 16 0 0.383057 0.500000 134217728 16777216 0 +( 2033 2768 -356 ) ( 2082 2726 -356 ) ( 2082 2726 -308 ) subway/metal2 60 16 0 0.382996 0.500000 134217728 16777216 0 +( 1986 2885 -288 ) ( 1967 2901 -288 ) ( 1983 2919 -288 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +( 1984 2921 -292 ) ( 1969 2902 -292 ) ( 1987 2887 -292 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 3 +{ +( 1984 2921 -276 ) ( 1969 2902 -276 ) ( 1987 2887 -276 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +( 1986 2885 -272 ) ( 1967 2901 -272 ) ( 1983 2919 -272 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +( 2033 2768 -340 ) ( 2082 2726 -340 ) ( 2082 2726 -292 ) subway/metal2 60 16 0 0.382996 0.500000 134217728 16777216 0 +( 1947 2780 -340 ) ( 1947 2780 -292 ) ( 1957 2792 -292 ) subway/metal2 -49 16 0 0.383057 0.500000 134217728 16777216 0 +( 1943 2785 -292 ) ( 1943 2785 -340 ) ( 1925 2801 -340 ) subway/metal2 5 16 0 0.382935 0.500000 134217728 16777216 0 +( 1959 2801 -272 ) ( 1959 2801 -320 ) ( 1969 2813 -320 ) subway/metal2 -55 16 0 0.383118 0.500000 134217728 16777216 0 +} +// brush 4 +{ +( 1956 2798 -252 ) ( 1956 2798 -300 ) ( 1967 2810 -300 ) subway/metal2 -54 16 0 0.383057 0.500000 134217728 16777216 0 +( 1956 2801 -272 ) ( 1956 2801 -320 ) ( 1938 2816 -320 ) subway/metal2 35 16 0 0.382935 0.500000 134217728 16777216 0 +( 1944 2777 -320 ) ( 1944 2777 -272 ) ( 1954 2789 -272 ) subway/metal2 -49 16 0 0.383057 0.500000 134217728 16777216 0 +( 2020 2752 -320 ) ( 2069 2711 -320 ) ( 2069 2711 -272 ) subway/metal2 30 16 0 0.382996 0.500000 134217728 16777216 0 +( 1983 2882 -252 ) ( 1965 2898 -252 ) ( 1980 2916 -252 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +( 1983 2919 -336 ) ( 1967 2901 -336 ) ( 1986 2885 -336 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 5 +{ +( 1962 2801 -272 ) ( 1962 2801 -320 ) ( 1974 2791 -320 ) subway/metal2 30 16 0 0.382996 0.500000 134217728 16777216 0 +( 1946 2817 -292 ) ( 1946 2817 -340 ) ( 1962 2835 -340 ) subway/metal2 -27 16 0 0.382935 0.500000 134217728 16777216 0 +( 1941 2813 -340 ) ( 1941 2813 -292 ) ( 1953 2803 -292 ) subway/metal2 37 16 0 0.382996 0.500000 134217728 16777216 0 +( 1929 2727 -340 ) ( 1887 2678 -340 ) ( 1887 2678 -292 ) subway/metal2 -21 16 0 0.382813 0.500000 134217728 16777216 0 +( 2046 2774 -272 ) ( 2062 2793 -272 ) ( 2080 2777 -272 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +( 2082 2776 -276 ) ( 2063 2791 -276 ) ( 2048 2773 -276 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 6 +{ +( 2082 2776 -292 ) ( 2063 2791 -292 ) ( 2048 2773 -292 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +( 2046 2774 -288 ) ( 2062 2793 -288 ) ( 2080 2777 -288 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +( 1929 2727 -356 ) ( 1887 2678 -356 ) ( 1887 2678 -308 ) subway/metal2 -21 16 0 0.382813 0.500000 134217728 16777216 0 +( 1941 2813 -356 ) ( 1941 2813 -308 ) ( 1953 2803 -308 ) subway/metal2 37 16 0 0.382996 0.500000 134217728 16777216 0 +( 1946 2817 -308 ) ( 1946 2817 -356 ) ( 1962 2835 -356 ) subway/metal2 -27 16 0 0.382935 0.500000 134217728 16777216 0 +( 1962 2801 -288 ) ( 1962 2801 -336 ) ( 1974 2791 -336 ) subway/metal2 30 16 0 0.382996 0.500000 134217728 16777216 0 +} +// brush 7 +{ +( 2082 2776 -308 ) ( 2063 2791 -308 ) ( 2048 2773 -308 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +( 2046 2774 -304 ) ( 2062 2793 -304 ) ( 2080 2777 -304 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +( 1929 2727 -372 ) ( 1887 2678 -372 ) ( 1887 2678 -324 ) subway/metal2 -21 16 0 0.382813 0.500000 134217728 16777216 0 +( 1941 2813 -372 ) ( 1941 2813 -324 ) ( 1953 2803 -324 ) subway/metal2 37 16 0 0.382996 0.500000 134217728 16777216 0 +( 1946 2817 -324 ) ( 1946 2817 -372 ) ( 1962 2835 -372 ) subway/metal2 -27 16 0 0.382935 0.500000 134217728 16777216 0 +( 1962 2801 -304 ) ( 1962 2801 -352 ) ( 1974 2791 -352 ) subway/metal2 30 16 0 0.382996 0.500000 134217728 16777216 0 +} +// brush 8 +{ +( 2082 2776 -324 ) ( 2063 2791 -324 ) ( 2048 2773 -324 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +( 2046 2774 -320 ) ( 2062 2793 -320 ) ( 2080 2777 -320 ) subway/metal2 7 38 -39 0.499912 0.499866 134217728 16777216 0 +( 1929 2727 -388 ) ( 1887 2678 -388 ) ( 1887 2678 -340 ) subway/metal2 -21 16 0 0.382813 0.500000 134217728 16777216 0 +( 1941 2813 -388 ) ( 1941 2813 -340 ) ( 1953 2803 -340 ) subway/metal2 37 16 0 0.382996 0.500000 134217728 16777216 0 +( 1946 2817 -340 ) ( 1946 2817 -388 ) ( 1962 2835 -388 ) subway/metal2 -27 16 0 0.382935 0.500000 134217728 16777216 0 +( 1962 2801 -320 ) ( 1962 2801 -368 ) ( 1974 2791 -368 ) subway/metal2 30 16 0 0.382996 0.500000 134217728 16777216 0 +} +} +// entity 879 +{ +"classname" "light" +"origin" "1630 2214 -408" +"light" "95" +"_color" "0.768627 1.000000 1.000000" +"color" "0.768627 1.000000 1.000000" +} +// entity 880 +{ +"classname" "func_group" +// brush 0 +{ +( 2035 2803 -320 ) ( 2035 2803 -368 ) ( 2045 2815 -368 ) subway/metal2 -60 16 0 0.383118 0.500000 134217728 16777216 0 +( 2019 2787 -340 ) ( 2019 2787 -388 ) ( 2001 2803 -388 ) subway/metal2 63 16 0 0.382935 0.500000 134217728 16777216 0 +( 2023 2782 -388 ) ( 2023 2782 -340 ) ( 2033 2794 -340 ) subway/metal2 -54 16 0 0.383057 0.500000 134217728 16777216 0 +( 2109 2770 -388 ) ( 2158 2728 -388 ) ( 2158 2728 -340 ) subway/metal2 54 16 0 0.382996 0.500000 134217728 16777216 0 +( 2062 2887 -320 ) ( 2043 2903 -320 ) ( 2059 2921 -320 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +( 2060 2923 -324 ) ( 2045 2904 -324 ) ( 2063 2889 -324 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 1 +{ +( 2035 2803 -304 ) ( 2035 2803 -352 ) ( 2045 2815 -352 ) subway/metal2 -60 16 0 0.383118 0.500000 134217728 16777216 0 +( 2019 2787 -324 ) ( 2019 2787 -372 ) ( 2001 2803 -372 ) subway/metal2 63 16 0 0.382935 0.500000 134217728 16777216 0 +( 2023 2782 -372 ) ( 2023 2782 -324 ) ( 2033 2794 -324 ) subway/metal2 -54 16 0 0.383057 0.500000 134217728 16777216 0 +( 2109 2770 -372 ) ( 2158 2728 -372 ) ( 2158 2728 -324 ) subway/metal2 54 16 0 0.382996 0.500000 134217728 16777216 0 +( 2062 2887 -304 ) ( 2043 2903 -304 ) ( 2059 2921 -304 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +( 2060 2923 -308 ) ( 2045 2904 -308 ) ( 2063 2889 -308 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 2 +{ +( 2035 2803 -288 ) ( 2035 2803 -336 ) ( 2045 2815 -336 ) subway/metal2 -60 16 0 0.383118 0.500000 134217728 16777216 0 +( 2019 2787 -308 ) ( 2019 2787 -356 ) ( 2001 2803 -356 ) subway/metal2 63 16 0 0.382935 0.500000 134217728 16777216 0 +( 2023 2782 -356 ) ( 2023 2782 -308 ) ( 2033 2794 -308 ) subway/metal2 -54 16 0 0.383057 0.500000 134217728 16777216 0 +( 2109 2770 -356 ) ( 2158 2728 -356 ) ( 2158 2728 -308 ) subway/metal2 54 16 0 0.382996 0.500000 134217728 16777216 0 +( 2062 2887 -288 ) ( 2043 2903 -288 ) ( 2059 2921 -288 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +( 2060 2923 -292 ) ( 2045 2904 -292 ) ( 2063 2889 -292 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 3 +{ +( 2060 2923 -276 ) ( 2045 2904 -276 ) ( 2063 2889 -276 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +( 2062 2887 -272 ) ( 2043 2903 -272 ) ( 2059 2921 -272 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +( 2109 2770 -340 ) ( 2158 2728 -340 ) ( 2158 2728 -292 ) subway/metal2 54 16 0 0.382996 0.500000 134217728 16777216 0 +( 2023 2782 -340 ) ( 2023 2782 -292 ) ( 2033 2794 -292 ) subway/metal2 -54 16 0 0.383057 0.500000 134217728 16777216 0 +( 2019 2787 -292 ) ( 2019 2787 -340 ) ( 2001 2803 -340 ) subway/metal2 63 16 0 0.382935 0.500000 134217728 16777216 0 +( 2035 2803 -272 ) ( 2035 2803 -320 ) ( 2045 2815 -320 ) subway/metal2 -60 16 0 0.383118 0.500000 134217728 16777216 0 +} +// brush 4 +{ +( 2032 2800 -252 ) ( 2032 2800 -300 ) ( 2043 2812 -300 ) subway/metal2 -59 16 0 0.383057 0.500000 134217728 16777216 0 +( 2032 2803 -272 ) ( 2032 2803 -320 ) ( 2014 2818 -320 ) subway/metal2 29 16 0 0.382935 0.500000 134217728 16777216 0 +( 2020 2779 -320 ) ( 2020 2779 -272 ) ( 2030 2791 -272 ) subway/metal2 -54 16 0 0.383057 0.500000 134217728 16777216 0 +( 2096 2754 -320 ) ( 2145 2713 -320 ) ( 2145 2713 -272 ) subway/metal2 24 16 0 0.382996 0.500000 134217728 16777216 0 +( 2059 2884 -252 ) ( 2041 2900 -252 ) ( 2056 2918 -252 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +( 2059 2921 -336 ) ( 2043 2903 -336 ) ( 2062 2887 -336 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 5 +{ +( 2038 2803 -272 ) ( 2038 2803 -320 ) ( 2050 2793 -320 ) subway/metal2 24 16 0 0.382996 0.500000 134217728 16777216 0 +( 2022 2819 -292 ) ( 2022 2819 -340 ) ( 2038 2837 -340 ) subway/metal2 -34 16 0 0.382935 0.500000 134217728 16777216 0 +( 2017 2815 -340 ) ( 2017 2815 -292 ) ( 2029 2805 -292 ) subway/metal2 31 16 0 0.382996 0.500000 134217728 16777216 0 +( 2005 2729 -340 ) ( 1963 2680 -340 ) ( 1963 2680 -292 ) subway/metal2 -27 16 0 0.382813 0.500000 134217728 16777216 0 +( 2122 2776 -272 ) ( 2138 2795 -272 ) ( 2156 2779 -272 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +( 2158 2778 -276 ) ( 2139 2793 -276 ) ( 2124 2775 -276 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +} +// brush 6 +{ +( 2158 2778 -292 ) ( 2139 2793 -292 ) ( 2124 2775 -292 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +( 2122 2776 -288 ) ( 2138 2795 -288 ) ( 2156 2779 -288 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +( 2005 2729 -356 ) ( 1963 2680 -356 ) ( 1963 2680 -308 ) subway/metal2 -27 16 0 0.382813 0.500000 134217728 16777216 0 +( 2017 2815 -356 ) ( 2017 2815 -308 ) ( 2029 2805 -308 ) subway/metal2 31 16 0 0.382996 0.500000 134217728 16777216 0 +( 2022 2819 -308 ) ( 2022 2819 -356 ) ( 2038 2837 -356 ) subway/metal2 -34 16 0 0.382935 0.500000 134217728 16777216 0 +( 2038 2803 -288 ) ( 2038 2803 -336 ) ( 2050 2793 -336 ) subway/metal2 24 16 0 0.382996 0.500000 134217728 16777216 0 +} +// brush 7 +{ +( 2158 2778 -308 ) ( 2139 2793 -308 ) ( 2124 2775 -308 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +( 2122 2776 -304 ) ( 2138 2795 -304 ) ( 2156 2779 -304 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +( 2005 2729 -372 ) ( 1963 2680 -372 ) ( 1963 2680 -324 ) subway/metal2 -27 16 0 0.382813 0.500000 134217728 16777216 0 +( 2017 2815 -372 ) ( 2017 2815 -324 ) ( 2029 2805 -324 ) subway/metal2 31 16 0 0.382996 0.500000 134217728 16777216 0 +( 2022 2819 -324 ) ( 2022 2819 -372 ) ( 2038 2837 -372 ) subway/metal2 -34 16 0 0.382935 0.500000 134217728 16777216 0 +( 2038 2803 -304 ) ( 2038 2803 -352 ) ( 2050 2793 -352 ) subway/metal2 24 16 0 0.382996 0.500000 134217728 16777216 0 +} +// brush 8 +{ +( 2158 2778 -324 ) ( 2139 2793 -324 ) ( 2124 2775 -324 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +( 2122 2776 -320 ) ( 2138 2795 -320 ) ( 2156 2779 -320 ) subway/metal2 19 9 -39 0.499912 0.499866 134217728 16777216 0 +( 2005 2729 -388 ) ( 1963 2680 -388 ) ( 1963 2680 -340 ) subway/metal2 -27 16 0 0.382813 0.500000 134217728 16777216 0 +( 2017 2815 -388 ) ( 2017 2815 -340 ) ( 2029 2805 -340 ) subway/metal2 31 16 0 0.382996 0.500000 134217728 16777216 0 +( 2022 2819 -340 ) ( 2022 2819 -388 ) ( 2038 2837 -388 ) subway/metal2 -34 16 0 0.382935 0.500000 134217728 16777216 0 +( 2038 2803 -320 ) ( 2038 2803 -368 ) ( 2050 2793 -368 ) subway/metal2 24 16 0 0.382996 0.500000 134217728 16777216 0 +} +} +// entity 881 +{ +"_wait" ".5" +"_cone" "90" +"_focus" "8" +"_mangle" "270 -30" +"classname" "light" +"_color" "1.000000 1.000000 0.768627" +"color" "1.000000 1.000000 0.768627" +"light" "200" +"origin" "1952 2712 -304" +} +// entity 882 +{ +"origin" "2056 2712 -304" +"light" "200" +"color" "1.000000 1.000000 0.768627" +"_color" "1.000000 1.000000 0.768627" +"classname" "light" +"_mangle" "270 -30" +"_focus" "8" +"_cone" "90" +"_wait" ".5" +} +// entity 883 +{ +"_wait" ".7" +"color" "0.768627 1.000000 1.000000" +"_color" "0.790000 .892000 .990000" +"light" "80" +"origin" "1824 2020 -344" +"classname" "light" +} +// entity 884 +{ +"classname" "light" +"origin" "1736 2020 -344" +"light" "80" +"_color" "0.790000 .892000 .990000" +"color" "0.768627 1.000000 1.000000" +"_wait" ".7" +} +// entity 885 +{ +"classname" "light" +"origin" "1824 2284 -344" +"light" "80" +"_color" "0.790000 .892000 .990000" +"color" "0.768627 1.000000 1.000000" +"_wait" ".7" +} +// entity 886 +{ +"_wait" ".7" +"color" "0.768627 1.000000 1.000000" +"_color" "0.790000 .892000 .990000" +"light" "80" +"origin" "1736 2284 -344" +"classname" "light" +} +// entity 887 +{ +"classname" "light" +"origin" "2240 2084 -296" +"light" "80" +"_color" "0.790000 .892000 .990000" +"color" "0.768627 1.000000 1.000000" +"_wait" ".7" +} +// entity 888 +{ +"_wait" ".7" +"color" "0.768627 1.000000 1.000000" +"_color" "0.790000 .892000 .990000" +"light" "80" +"origin" "2240 2244 -296" +"classname" "light" +} +// entity 889 +{ +"color" "0.768627 1.000000 1.000000" +"_color" "0.768627 1.000000 1.000000" +"light" "105" +"origin" "1952 2768 -264" +"classname" "light" +} +// entity 890 +{ +"classname" "light" +"origin" "2056 2872 -280" +"light" "55" +"_color" "0.768627 1.000000 1.000000" +"color" "0.768627 1.000000 1.000000" +} +// entity 891 +{ +"classname" "light" +"origin" "2048 2772 -280" +"light" "105" +"_color" "0.790000 .892000 .990000" +"color" "0.768627 1.000000 1.000000" +} +// entity 892 +{ +"_wait" ".7" +"color" "0.768627 1.000000 1.000000" +"_color" "0.790000 .892000 .990000" +"light" "75" +"origin" "1960 2828 -296" +"classname" "light" +} +// entity 893 +{ +"color" "0.768627 1.000000 1.000000" +"_color" "0.768627 1.000000 1.000000" +"light" "55" +"origin" "1968 2872 -280" +"classname" "light" +} +// entity 894 +{ +"origin" "2000 2732 -240" +"light" "95" +"color" "1.000000 1.000000 0.768627" +"_color" "1.000000 1.000000 0.768627" +"classname" "light" +} +// entity 895 +{ +"classname" "light" +"_color" ".950000 0.945098 0.793137" +"light" "105" +"origin" "2016 1976 -304" +} +// entity 896 +{ +"origin" "2104 1904 -304" +"light" "105" +"_color" ".950000 0.945098 0.793137" +"classname" "light" +} +// entity 897 +{ +"classname" "light" +"_color" ".950000 0.945098 0.793137" +"light" "105" +"origin" "2104 1824 -304" +} +// entity 898 +{ +"light" "95" +"classname" "light" +"_color" ".922000 0.501961 0.250980" +"origin" "1808 2356 -520" +} +// entity 899 +{ +"light" "95" +"origin" "1808 1968 -520" +"_color" ".922000 0.501961 0.250980" +"classname" "light" +} +// entity 900 +{ +"light" "95" +"classname" "light" +"_color" ".922000 0.501961 0.250980" +"origin" "1696 1816 -520" +} +// entity 901 +{ +"origin" "1808 1816 -520" +"_color" ".922000 0.501961 0.250980" +"classname" "light" +} +// entity 902 +{ +"targetname" "leadertrain" +"spawnflags" "9" +"classname" "misc_generic_train" +"origin" "1752 1781 -468" +"angle" "180" +"style" "300" +} +// entity 903 +{ +"classname" "light" +"origin" "1976 2228 -456" +"light" "75" +"_color" "0.790000 .892000 .990000" +"color" "0.768627 1.000000 1.000000" +"_wait" ".7" +} +// entity 904 +{ +"_wait" ".7" +"color" "0.768627 1.000000 1.000000" +"_color" "0.790000 .892000 .990000" +"light" "75" +"origin" "1976 2328 -456" +"classname" "light" +} +// entity 905 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.768627" +"color" "1.000000 1.000000 0.768627" +"light" "95" +"origin" "2240 1888 -296" +} +// entity 906 +{ +"origin" "2240 1856 -296" +"light" "95" +"color" "1.000000 1.000000 0.768627" +"_color" "1.000000 1.000000 0.768627" +"classname" "light" +} +// entity 907 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "60" +"origin" "-564 1282 24" +} +// entity 908 +{ +"origin" "-564 1450 24" +"light" "60" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 909 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "60" +"origin" "-564 1178 96" +} +// entity 910 +{ +"origin" "-556 1658 -72" +"light" "60" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 911 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "60" +"origin" "-364 1658 -72" +} +// entity 912 +{ +"origin" "-12 1466 -128" +"light" "60" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 913 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "60" +"origin" "172 1466 -128" +} +// entity 914 +{ +"origin" "312 1298 -128" +"light" "60" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 915 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "90" +"origin" "1008 1118 -168" +} +// entity 916 +{ +"origin" "1016 782 -168" +"light" "90" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 917 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "60" +"origin" "312 882 -128" +} +// entity 918 +{ +"origin" "196 638 -128" +"light" "60" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 919 +{ +"_wait" ".7" +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "95" +"origin" "-28 630 -184" +} +// entity 920 +{ +"_wait" ".7" +"origin" "-36 438 -184" +"light" "95" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 921 +{ +"origin" "-284 600 -136" +"light" "115" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +} +// entity 922 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "115" +"origin" "-284 472 -136" +} +// entity 923 +{ +"origin" "224 216 -120" +"light" "90" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 924 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "90" +"origin" "268 216 -120" +} +// entity 925 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "90" +"origin" "244 214 -184" +"_wait" ".7" +} +// entity 926 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "90" +"origin" "444 220 -120" +} +// entity 927 +{ +"origin" "488 220 -120" +"light" "90" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 928 +{ +"_wait" ".7" +"origin" "464 218 -184" +"light" "90" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 929 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "105" +"origin" "-64 224 -112" +} +// entity 930 +{ +"origin" "20 136 -112" +"light" "105" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +} +// entity 931 +{ +"origin" "588 -520 -400" +"light" "90" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +} +// entity 932 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"light" "90" +"origin" "588 -392 -400" +} +// entity 933 +{ +"origin" "588 -264 -400" +"light" "90" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +} +// entity 934 +{ +"classname" "light" +"origin" "888 304 -496" +"_color" ".900000 0.501961 0.250980" +"light" "90" +"spawnflags" "1" +"_wait" ".7" +} +// entity 935 +{ +"_wait" ".7" +"spawnflags" "1" +"light" "90" +"_color" ".900000 0.501961 0.250980" +"origin" "888 256 -496" +"classname" "light" +} +// entity 936 +{ +"target" "t230" +"classname" "m_nyc_mswatleader" +"angle" "270" +"targetname" "rswat2" +"spawnflags" "22" +"origin" "1952 2744 -288" +} +// entity 937 +{ +"origin" "778 -198 -114" +"light" "120" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 938 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "120" +"origin" "778 -486 -114" +} +// entity 939 +{ +"origin" "730 -198 -184" +"light" "90" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 940 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "60" +"origin" "778 -198 -184" +} +// entity 941 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "90" +"origin" "730 -486 -184" +} +// entity 942 +{ +"origin" "778 -486 -184" +"light" "60" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 943 +{ +"origin" "1022 -104 -184" +"light" "90" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 944 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "90" +"origin" "1174 -104 -184" +} +// entity 945 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "90" +"origin" "1232 152 -114" +} +// entity 946 +{ +"origin" "1264 152 -114" +"light" "90" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 947 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "60" +"origin" "1214 152 -184" +} +// entity 948 +{ +"origin" "1286 152 -184" +"light" "60" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 949 +{ +"origin" "1056 152 -114" +"light" "90" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 950 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "90" +"origin" "1088 152 -114" +} +// entity 951 +{ +"origin" "1038 152 -184" +"light" "60" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 952 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "60" +"origin" "1110 152 -184" +} +// entity 953 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "60" +"origin" "946 434 -120" +} +// entity 954 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "60" +"origin" "950 472 -184" +} +// entity 955 +{ +"origin" "950 416 -184" +"light" "60" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 956 +{ +"origin" "582 432 -152" +"light" "60" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 957 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "60" +"origin" "638 432 -152" +} +// entity 958 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "60" +"origin" "608 600 -152" +} +// entity 959 +{ +"origin" "608 648 -152" +"light" "60" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 960 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "60" +"origin" "608 848 -152" +} +// entity 961 +{ +"origin" "608 896 -152" +"light" "60" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 962 +{ +"origin" "1912 1208 -360" +"angle" "180" +"classname" "m_nyc_mskinhead2a" +"spawnflags" "262160" +"targetname" "rtskinhead2" +} +// entity 963 +{ +"target" "t202" +"targetname" "t201" +"classname" "point_combat" +"origin" "1848 -1432 -512" +} +// entity 964 +{ +"targetname" "t204" +"wait" "-1" +"waitaction1" "CCH_A_FWD_P_2" +"classname" "path_corner" +"origin" "552 -200 -208" +} +// entity 965 +{ +"targetname" "t205" +"wait" "-1" +"waitaction1" "CCH_A_FWD_P_2" +"origin" "552 -264 -208" +"classname" "path_corner" +} +// entity 966 +{ +"classname" "light" +"light" "85" +"_color" "0.623529 1.000000 0.858824" +"color" "0.623529 1.000000 0.858824" +"origin" "-680 1672 -96" +} +// entity 967 +{ +"origin" "-680 1608 -96" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "85" +"classname" "light" +} +// entity 968 +{ +"origin" "616 -440 -192" +"color" "0.623529 1.000000 0.858824" +"_color" "0.623529 1.000000 0.858824" +"light" "85" +"classname" "light" +} +// entity 969 +{ +"origin" "508 -104 -152" +"_mangle" "270 -90" +"_focus" "11" +"_cone" "90" +"color" "1.000000 1.000000 0.843137" +"_color" "1.000000 1.000000 0.843137" +"classname" "light" +} +// entity 970 +{ +"classname" "light" +"targetname" "toptv" +"light" "115" +"origin" "-372 712 -136" +} +// entity 971 +{ +"classname" "light" +"_color" "0.823529 1.000000 1.000000" +"light" "115" +"origin" "466 -774 -122" +} +// entity 972 +{ +"origin" "346 -774 -122" +"light" "115" +"_color" "0.823529 1.000000 1.000000" +"classname" "light" +} +// entity 973 +{ +"origin" "1760 2008 -336" +"targetname" "sabrefade2" +"color" "0.0 0.0 0.0" +"delay" ".1" +"classname" "func_fade" +"spawnflags" "1" +} +// entity 974 +{ +"color" "0.768627 1.000000 1.000000" +"_color" "0.768627 1.000000 1.000000" +"light" "55" +"origin" "2240 2408 -248" +"classname" "light" +} +// entity 975 +{ +"classname" "light" +"origin" "2240 2404 -296" +"light" "80" +"_color" "0.790000 .892000 .990000" +"color" "0.768627 1.000000 1.000000" +"_wait" ".7" +} +// entity 976 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.768627" +"color" "1.000000 1.000000 0.768627" +"light" "95" +"origin" "2240 2536 -248" +} +// entity 977 +{ +"origin" "1488 1390 -192" +"light" "90" +"_color" "0.790000 .892000 .990000" +"classname" "light" +} +// entity 978 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "90" +"origin" "1624 1070 -192" +} +// entity 979 +{ +"origin" "564 1060 -124" +"targetname" "introcam7n" +"classname" "info_notnull" +} +// entity 980 +{ +"classname" "info_notnull" +"targetname" "t216" +"origin" "564 1064 -100" +} +// entity 981 +{ +"classname" "func_remote_camera" +"targetname" "introcam3" +"target" "t216" +"volume" "2" +"origin" "594 1002 -108" +"spawnflags" "4" +} +// entity 982 +{ +"classname" "info_notnull" +"targetname" "t218" +"origin" "560 1108 -112" +} +// entity 983 +{ +"classname" "func_remote_camera" +"targetname" "introcam7a" +"target" "t218" +"origin" "604 1048 -136" +"volume" "2" +"spawnflags" "4" +} +// entity 984 +{ +"classname" "m_x_mmerc" +"targetname" "rhawk" +"spawnflags" "6" +"origin" "2128 2576 -288" +"alertradius" "0" +"angle" "135" +} +// entity 985 +{ +"classname" "info_notnull" +"targetname" "endcam3n" +"origin" "1738 -1792 -476" +} +// entity 986 +{ +"spawnflags" "2" +"classname" "func_remote_camera" +"targetname" "endcam3" +"origin" "1732 -1800 -476" +"volume" "2" +"target" "endcam3n" +} +// entity 987 +{ +"classname" "m_x_mmerc" +"angle" "270" +"spawnflags" "22" +"origin" "1832 -1560 -496" +"targetname" "endhawk1b" +} +// entity 988 +{ +"targetname" "finaltrain" +"angle" "270" +"origin" "-2946 685 412" +"classname" "misc_generic_train" +"spawnflags" "1" +} +// entity 989 +{ +"targetname" "rtskinhead3" +"spawnflags" "262160" +"origin" "1912 1112 -360" +"angle" "180" +"classname" "m_nyc_mskinhead1" +} +// entity 990 +{ +"origin" "-584 1032 80" +"classname" "func_fade" +"targetname" "tsr1fadein" +"spawnflags" "1" +"color" "0.0 0.0 0.0" +"delay" "1" +} +// entity 991 +{ +"fog_distance_cull" "200" +"fog_color" "30 12 0" +"fog_density" "1.0" +"fog_end" "400.0" +"fog_start" "4.0" +"fog_mode" "0" +"classname" "_region" +"fog_density_range" "1.0" +// brush 0 +{ +( 376 2272 -384 ) ( 360 2272 -384 ) ( 360 2272 -488 ) subway/1_tunnelwall -40 0 0 1 1 0 301989888 0 +( 960 -1008 -472 ) ( 960 -992 -472 ) ( 960 -992 -400 ) subway/1_tunnelwall 40 0 0 1 1 0 301989888 0 +( 552 896 -464 ) ( 232 896 -464 ) ( 232 896 -392 ) subway/1_tunnelwall -40 0 0 1 1 0 301989888 0 +( 1296 -1104 -448 ) ( 1296 -1104 -408 ) ( 1296 -1072 -408 ) subway/1_tunnelwall 40 0 0 1 1 0 301989888 0 +( 480 -976 -280 ) ( 496 -976 -280 ) ( 496 -992 -280 ) subway/1_tunnelwall -40 -40 0 1 1 0 301989888 0 +( 296 -960 -544 ) ( 256 -960 -544 ) ( 256 -992 -544 ) subway/1_tunnelwall -40 -40 0 1 1 0 301989888 0 +} +} +// entity 992 +{ +"fog_density_range" "1.0" +"classname" "_region" +"fog_mode" "0" +"fog_start" "4.0" +"fog_end" "400.0" +"fog_density" "1.0" +"fog_color" "30 12 0" +"fog_distance_cull" "200" +// brush 0 +{ +( 296 -2912 -544 ) ( 256 -2912 -544 ) ( 256 -2944 -544 ) subway/1_tunnelwall -40 -40 0 1 1 0 301989888 0 +( 480 -2928 -280 ) ( 496 -2928 -280 ) ( 496 -2944 -280 ) subway/1_tunnelwall -40 -40 0 1 1 0 301989888 0 +( 1216 -3072 -448 ) ( 1216 -3072 -408 ) ( 1216 -3040 -408 ) subway/1_tunnelwall 40 0 0 1 1 0 301989888 0 +( 552 -160 -464 ) ( 232 -160 -464 ) ( 232 -160 -392 ) subway/1_tunnelwall -40 0 0 1 1 0 301989888 0 +( 1040 -2960 -472 ) ( 1040 -2944 -472 ) ( 1040 -2944 -400 ) subway/1_tunnelwall 40 0 0 1 1 0 301989888 0 +( 376 896 -384 ) ( 360 896 -384 ) ( 360 896 -488 ) subway/1_tunnelwall -40 0 0 1 1 0 301989888 0 +} +} +// entity 993 +{ +"fog_distance_cull" "200" +"fog_color" "30 12 0" +"fog_density" "1.0" +"fog_end" "400.0" +"fog_start" "4.0" +"fog_mode" "0" +"classname" "_region" +"fog_density_range" "1.0" +// brush 0 +{ +( 1192 -2016 -568 ) ( 1152 -2016 -568 ) ( 1152 -2048 -568 ) subway/1_tunnelwall 16 -8 0 1 1 0 301989888 0 +( 1384 -2032 -264 ) ( 1400 -2032 -264 ) ( 1400 -2048 -264 ) subway/1_tunnelwall 16 -8 0 1 1 0 301989888 0 +( 2136 -2176 -448 ) ( 2136 -2176 -408 ) ( 2136 -2144 -408 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1512 -2816 -464 ) ( 1192 -2816 -464 ) ( 1192 -2816 -392 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1608 -2064 -472 ) ( 1608 -2048 -472 ) ( 1608 -2048 -400 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 1208 1608 -384 ) ( 1192 1608 -384 ) ( 1192 1608 -488 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +} +} +// entity 994 +{ +"fog_distance_cull" "200" +"fog_color" "30 12 0" +"fog_density" "1.0" +"fog_end" "400.0" +"fog_start" "4.0" +"fog_mode" "0" +"classname" "_region" +"fog_density_range" "1.0" +// brush 0 +{ +( -72 -2088 -544 ) ( -112 -2088 -544 ) ( -112 -2120 -544 ) subway/1_tunnelwall 8 -16 0 1 1 0 301989888 0 +( 112 -2104 -280 ) ( 128 -2104 -280 ) ( 128 -2120 -280 ) subway/1_tunnelwall 8 -16 0 1 1 0 301989888 0 +( 1040 -2240 -448 ) ( 1040 -2240 -408 ) ( 1040 -2208 -408 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 296 40 -464 ) ( -24 40 -464 ) ( -24 40 -392 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +( 672 -2136 -472 ) ( 672 -2120 -472 ) ( 672 -2120 -400 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( -40 904 -384 ) ( -56 904 -384 ) ( -56 904 -488 ) subway/1_tunnelwall 8 0 0 1 1 0 301989888 0 +} +} +// entity 995 +{ +"classname" "light" +"_color" "0.790000 .892000 .990000" +"light" "60" +"origin" "1030 448 -168" +} +// entity 996 +{ +"_wait" ".7" +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "30" +"origin" "1852 1032 -176" +} +// entity 997 +{ +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "30" +"origin" "1540 1472 -184" +} +// entity 998 +{ +"origin" "-88 -1256 -288" +"targetname" "sodaleaner" +"spawnflags" "16" +"classname" "m_nyc_mskinhead2a" +"angle" "270" +} +// entity 999 +{ +"classname" "script_runner" +"targetname" "t222" +"script" "tsr1/sodalean" +"origin" "-40 -904 -176" +} +// entity 1000 +{ +"classname" "trigger_once" +"target" "t222" +// brush 0 +{ +( -56 -800 -184 ) ( -56 -840 -184 ) ( -56 -840 -224 ) subway/trigger -56 -24 0 1 1 0 144 0 +( 104 -856 -208 ) ( 72 -856 -208 ) ( 72 -856 -248 ) subway/trigger 40 -24 0 1 1 0 144 0 +( 104 -888 -200 ) ( 104 -848 -200 ) ( 104 -848 -240 ) subway/trigger -56 -24 0 1 1 0 144 0 +( -8 -864 -208 ) ( 24 -864 -208 ) ( 24 -864 -248 ) subway/trigger 40 -24 0 1 1 0 144 0 +( 72 -760 -168 ) ( 72 -720 -168 ) ( 104 -720 -168 ) subway/trigger 40 56 0 1 1 0 144 0 +( 96 -720 -256 ) ( 64 -720 -256 ) ( 64 -760 -256 ) subway/trigger 40 56 0 1 1 0 144 0 +} +} +// entity 1001 +{ +"targetname" "t226" +"classname" "script_runner" +"script" "tsr1/cnrleaner1" +"origin" "888 384 -96" +} +// entity 1002 +{ +"target" "cornerln1" +"classname" "trigger_once" +// brush 0 +{ +( 1072 296 -184 ) ( 1056 296 -184 ) ( 1056 232 -184 ) subway/trigger 16 24 0 1 1 0 144 0 +( 1056 232 -48 ) ( 1056 296 -48 ) ( 1072 296 -48 ) subway/trigger 16 24 0 1 1 0 144 0 +( 1056 360 -144 ) ( 1072 360 -144 ) ( 1072 360 -192 ) subway/trigger 16 0 0 1 1 0 144 0 +( 784 512 -48 ) ( 784 512 -184 ) ( 784 360 -184 ) subway/trigger -24 0 0 1 1 0 144 0 +( 728 512 -48 ) ( 728 512 -184 ) ( 784 512 -184 ) subway/trigger 16 0 0 1 1 0 144 0 +( 728 512 -184 ) ( 728 512 -48 ) ( 776 360 -48 ) subway/trigger -24 0 0 1 1 0 144 0 +} +} +// entity 1003 +{ +"origin" "-472 1568 -72" +"targetname" "istairsguy" +"spawnflags" "4" +"classname" "m_nyc_mskinhead2a" +"angle" "90" +} +// entity 1004 +{ +"classname" "trigger_relay" +"origin" "944 -32 -136" +"targetname" "cornerln2" +"target" "t227" +} +// entity 1005 +{ +"origin" "1008 -32 -136" +"script" "tsr1/cnrleaner2" +"classname" "script_runner" +"targetname" "t227" +} +// entity 1006 +{ +"classname" "trigger_once" +"target" "cornerln2" +// brush 0 +{ +( 1192 -136 -216 ) ( 1176 -136 -216 ) ( 1176 -200 -216 ) subway/trigger 24 -24 0 1 1 0 144 0 +( 1176 -200 -152 ) ( 1176 -136 -152 ) ( 1192 -136 -152 ) subway/trigger 24 -24 0 1 1 0 144 0 +( 1104 -184 -144 ) ( 1120 -184 -144 ) ( 1120 -184 -192 ) subway/trigger 24 0 0 1 1 0 144 0 +( 896 -240 -144 ) ( 896 -176 -144 ) ( 896 -176 -192 ) subway/trigger 24 0 0 1 1 0 144 0 +( 1208 -24 -144 ) ( 1192 -24 -144 ) ( 1192 -24 -192 ) subway/trigger 24 0 0 1 1 0 144 0 +( 888 -160 -160 ) ( 888 -224 -160 ) ( 888 -224 -208 ) subway/trigger 24 0 0 1 1 0 144 0 +} +} +// entity 1007 +{ +"origin" "1160 0 -176" +"targetname" "cornerlean2" +"spawnflags" "16" +"classname" "m_nyc_mskinhead2a" +"angle" "15" +} +// entity 1008 +{ +"classname" "script_runner" +"targetname" "swat2scr" +"script" "tsr1/swatguard2" +"origin" "1920 2728 -248" +} +// entity 1009 +{ +"targetname" "t231" +"classname" "path_corner" +"angle" "270" +"wait" "-1" +"waitaction1" "STD_A_FWD_P_2" +"origin" "2048 2744 -328" +} +// entity 1010 +{ +"origin" "2096 2712 -248" +"script" "tsr1/swatguard1" +"targetname" "swat1scr" +"classname" "script_runner" +} +// entity 1011 +{ +"classname" "func_group" +// brush 0 +{ +( 1916 -1084 -304 ) ( 1804 -1084 -304 ) ( 1804 -1132 -304 ) subway/1_black -8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1804 -1132 -300 ) ( 1804 -1084 -300 ) ( 1916 -1084 -300 ) subway/1_black -8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1716 -1132 -312 ) ( 1828 -1132 -312 ) ( 1828 -1132 -328 ) subway/1_black -8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1828 -1132 -316 ) ( 1828 -1084 -316 ) ( 1828 -1084 -332 ) subway/1_black -8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1916 -1128 -316 ) ( 1804 -1128 -316 ) ( 1804 -1128 -332 ) subway/1_black -8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1824 -1084 -308 ) ( 1824 -1132 -308 ) ( 1824 -1132 -324 ) subway/1_black -8 8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1 +{ +( 1916 -1032 -304 ) ( 1804 -1032 -304 ) ( 1804 -1080 -304 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1804 -1080 -300 ) ( 1804 -1032 -300 ) ( 1916 -1032 -300 ) subway/1_black -8 0 0 0.500000 0.500000 134217728 16777216 0 +( 1716 -1080 -312 ) ( 1828 -1080 -312 ) ( 1828 -1080 -328 ) subway/1_black -8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1828 -1080 -316 ) ( 1828 -1032 -316 ) ( 1828 -1032 -332 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1916 -1076 -316 ) ( 1804 -1076 -316 ) ( 1804 -1076 -332 ) subway/1_black -8 8 0 0.500000 0.500000 134217728 16777216 0 +( 1824 -1032 -308 ) ( 1824 -1080 -308 ) ( 1824 -1080 -324 ) subway/1_black 0 8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( 1828 -1136 -320 ) ( 1828 -1072 -320 ) ( 1824 -1072 -320 ) subway/1_black -7 -15 90 0.500000 0.500000 134217728 16777216 0 +( 1824 -1072 -304 ) ( 1828 -1072 -304 ) ( 1828 -1136 -304 ) subway/1_black -7 -15 90 0.500000 0.500000 134217728 16777216 0 +( 1824 -1072 -308 ) ( 1824 -1136 -308 ) ( 1824 -1136 -312 ) subway/1_danger 32 0 0 -0.500000 0.500000 134217728 16777216 0 +( 1824 -1136 -308 ) ( 1828 -1136 -308 ) ( 1828 -1136 -312 ) subway/1_black 9 -7 -180 0.500000 -0.500000 134217728 16777216 0 +( 1828 -1136 -308 ) ( 1828 -1072 -308 ) ( 1828 -1072 -312 ) subway/1_danger 32 0 0 -0.500000 0.500000 134217728 16777216 0 +( 1828 -1072 -308 ) ( 1824 -1072 -308 ) ( 1824 -1072 -312 ) subway/1_black 9 -7 -180 0.500000 -0.500000 134217728 16777216 0 +} +} +// entity 1012 +{ +"classname" "func_group" +// brush 0 +{ +( 1832 752 -332 ) ( 1824 752 -332 ) ( 1824 560 -332 ) subway/3_pipes2 0 20 90 0.500000 0.500000 134217728 16777216 0 +( 1824 560 -326 ) ( 1824 752 -326 ) ( 1832 752 -326 ) subway/3_pipes2 0 20 90 0.500000 0.500000 134217728 16777216 0 +( 1832 -280 -300 ) ( 1840 -280 -300 ) ( 1840 -280 -332 ) subway/3_pipes2 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1830 216 -300 ) ( 1830 408 -300 ) ( 1830 408 -332 ) subway/3_pipes2 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1832 752 -300 ) ( 1824 752 -300 ) ( 1824 752 -332 ) subway/3_pipes2 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1824 656 -302 ) ( 1824 464 -302 ) ( 1824 464 -334 ) subway/3_pipes2 0 8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 1 +{ +( 1832 -280 -332 ) ( 1824 -280 -332 ) ( 1824 -472 -332 ) subway/3_pipes2 15 20 90 0.500000 0.500000 134217728 16777216 0 +( 1824 -472 -326 ) ( 1824 -280 -326 ) ( 1832 -280 -326 ) subway/3_pipes2 15 20 90 0.500000 0.500000 134217728 16777216 0 +( 1832 -1312 -300 ) ( 1840 -1312 -300 ) ( 1840 -1312 -332 ) subway/3_pipes2 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1830 -816 -300 ) ( 1830 -624 -300 ) ( 1830 -624 -332 ) subway/3_pipes2 16 8 0 0.500000 0.500000 134217728 16777216 0 +( 1832 -280 -300 ) ( 1824 -280 -300 ) ( 1824 -280 -332 ) subway/3_pipes2 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1824 -504 -302 ) ( 1824 -696 -302 ) ( 1824 -696 -334 ) subway/3_pipes2 16 8 0 0.500000 0.500000 134217728 16777216 0 +} +// brush 2 +{ +( 1832 -1312 -332 ) ( 1824 -1312 -332 ) ( 1824 -1504 -332 ) subway/3_pipes2 -33 20 90 0.500000 0.500000 134217728 16777216 0 +( 1824 -1504 -326 ) ( 1824 -1312 -326 ) ( 1832 -1312 -326 ) subway/3_pipes2 -33 20 90 0.500000 0.500000 134217728 16777216 0 +( 1840 -2536 -300 ) ( 1848 -2536 -300 ) ( 1848 -2536 -332 ) subway/3_pipes2 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1830 -1848 -300 ) ( 1830 -1656 -300 ) ( 1830 -1656 -332 ) subway/3_pipes2 -32 8 0 0.500000 0.500000 134217728 16777216 0 +( 1832 -1312 -300 ) ( 1824 -1312 -300 ) ( 1824 -1312 -332 ) subway/3_pipes2 0 8 0 0.500000 0.500000 134217728 16777216 0 +( 1824 -1536 -302 ) ( 1824 -1728 -302 ) ( 1824 -1728 -334 ) subway/3_pipes2 -32 8 0 0.500000 0.500000 134217728 16777216 0 +} +} +// entity 1013 +{ +"classname" "script_runner" +"targetname" "t232" +"script" "tsr1/raidspwn" +"origin" "2280 1840 -304" +} +// entity 1014 +{ +"classname" "trigger_once" +"target" "t232" +// brush 0 +{ +( 2288 1910 -400 ) ( 2288 1920 -400 ) ( 2104 1920 -400 ) subway/trigger -24 -24 0 1 1 0 144 0 +( 2288 1920 -280 ) ( 2288 1910 -280 ) ( 2104 1910 -280 ) subway/trigger -24 -24 0 1 1 0 144 0 +( 2280 1800 -288 ) ( 2280 1800 -448 ) ( 2096 1800 -448 ) subway/trigger -24 0 0 1 1 0 144 0 +( 2120 1896 -328 ) ( 2120 1904 -328 ) ( 2120 1904 -384 ) subway/trigger 24 0 0 1 1 0 144 0 +( 2288 1928 -448 ) ( 2288 1928 -288 ) ( 2104 1928 -288 ) subway/trigger -24 0 0 1 1 0 144 0 +( 2112 1792 -328 ) ( 2112 1784 -328 ) ( 2112 1784 -384 ) subway/trigger 24 0 0 1 1 0 144 0 +} +} +// entity 1015 +{ +"angle" "90" +"classname" "m_nyc_mskinhead2a" +"spawnflags" "16" +"targetname" "tunnelleaner" +"origin" "1232 1464 -496" +} +// entity 1016 +{ +"target" "t223" +"classname" "trigger_once" +// brush 0 +{ +( 1240 1320 -536 ) ( 1192 1320 -536 ) ( 1192 1280 -536 ) subway/trigger -24 -56 0 1 1 0 144 0 +( 1192 1280 -440 ) ( 1192 1320 -440 ) ( 1240 1320 -440 ) subway/trigger -24 -56 0 1 1 0 144 0 +( 1176 1160 -456 ) ( 1224 1160 -456 ) ( 1224 1160 -536 ) subway/trigger -24 -8 0 1 1 0 144 0 +( 1208 1296 -456 ) ( 1208 1336 -456 ) ( 1208 1336 -536 ) subway/trigger 8 -8 0 1 1 0 144 0 +( 1256 1192 -456 ) ( 1208 1192 -456 ) ( 1208 1192 -536 ) subway/trigger -24 -8 0 1 1 0 144 0 +( 1056 1296 -456 ) ( 1056 1256 -456 ) ( 1056 1256 -536 ) subway/trigger 8 -8 0 1 1 0 144 0 +} +} +// entity 1017 +{ +"targetname" "t223" +"classname" "script_runner" +"origin" "1176 1140 -440" +"script" "tsr1/tunlean" +} +// entity 1018 +{ +"classname" "info_notnull" +"targetname" "introcam6n" +"origin" "-2060 222 204" +} +// entity 1019 +{ +"classname" "func_remote_camera" +"origin" "-1966 174 212" +"targetname" "introcam6" +"target" "introcam6n" +"volume" "2" +"spawnflags" "4" +} +// entity 1020 +{ +"spawnflags" "3" +"classname" "func_wall" +"targetname" "openout" +// brush 0 +{ +( 628 1120 -168 ) ( 620 1120 -168 ) ( 620 1068 -168 ) subway/clip 0 4 0 1 1 196608 144 0 +( 620 1068 -84 ) ( 620 1120 -84 ) ( 628 1120 -84 ) subway/clip 0 4 0 1 1 196608 144 0 +( 624 1076 -32 ) ( 632 1076 -32 ) ( 632 1076 -168 ) subway/clip 0 16 0 1 1 196608 144 0 +( 628 1068 -32 ) ( 628 1120 -32 ) ( 628 1120 -168 ) subway/clip -4 16 0 1 1 196608 144 0 +( 628 1136 -32 ) ( 620 1136 -32 ) ( 620 1136 -168 ) subway/clip 0 16 0 1 1 196608 144 0 +( 624 1120 -32 ) ( 624 1068 -32 ) ( 624 1068 -168 ) subway/clip -4 16 0 1 1 196608 144 0 +} +} +// entity 1021 +{ +"fog_density_range" "1.0" +"classname" "_region" +"fog_mode" "0" +"fog_start" "4.0" +"fog_end" "400.0" +"fog_density" "1.0" +"fog_color" "30 12 0" +// brush 0 +{ +( 1192 -1824 -568 ) ( 1152 -1824 -568 ) ( 1152 -1856 -568 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +( 1384 -1840 -264 ) ( 1400 -1840 -264 ) ( 1400 -1856 -264 ) subway/1_tunnelwall 16 56 0 1 1 0 301989888 0 +( 2136 -1984 -448 ) ( 2136 -1984 -408 ) ( 2136 -1952 -408 ) subway/1_tunnelwall -56 0 0 1 1 0 301989888 0 +( 1640 1608 -464 ) ( 1320 1608 -464 ) ( 1320 1608 -392 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +( 1608 -1872 -472 ) ( 1608 -1856 -472 ) ( 1608 -1856 -400 ) subway/1_tunnelwall -56 0 0 1 1 0 301989888 0 +( 1264 1792 -384 ) ( 1248 1792 -384 ) ( 1248 1792 -488 ) subway/1_tunnelwall 16 0 0 1 1 0 301989888 0 +} +} +// entity 1022 +{ +"target" "t130" +"surfaceType" "37" +"material" "7" +"health" "10" +"classname" "func_breakable_brush" +// brush 0 +{ +( 640 -312 26 ) ( 640 -312 16 ) ( 604 -276 16 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 652 -256 -180 ) ( 608 -344 -180 ) ( 608 -344 -156 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 648 -256 -172 ) ( 652 -256 -172 ) ( 652 -256 -148 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 648 -256 -156 ) ( 604 -344 -156 ) ( 604 -344 -180 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 604 -344 -156 ) ( 608 -344 -156 ) ( 608 -344 -180 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 652 -256 -140 ) ( 608 -344 -140 ) ( 604 -344 -140 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 648 -256 -180 ) ( 604 -344 -180 ) ( 608 -344 -180 ) subway/glass 0 0 0 1 1 0 620759040 0 +} +// brush 1 +{ +( 672 -280 -180 ) ( 672 -276 -180 ) ( 584 -320 -180 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 672 -276 -140 ) ( 672 -280 -140 ) ( 584 -324 -140 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 672 -280 -180 ) ( 672 -280 -156 ) ( 672 -276 -156 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 672 -276 -172 ) ( 672 -276 -148 ) ( 584 -320 -148 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 584 -324 -148 ) ( 584 -324 -172 ) ( 584 -320 -172 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 672 -280 -148 ) ( 672 -280 -172 ) ( 584 -324 -172 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 604 -276 16 ) ( 640 -312 16 ) ( 640 -312 26 ) subway/glass 0 0 0 1 1 0 620759040 0 +( 588 -332 10 ) ( 588 -332 0 ) ( 588 -308 0 ) subway/glass 0 0 0 1 1 0 620759040 0 +} +} +// entity 1023 +{ +"fog_density_range" "1.0" +"classname" "_region" +"fog_mode" "0" +"fog_start" "4.0" +"fog_end" "400.0" +"fog_density" "1.0" +"fog_color" "30 12 0" +"fog_distance_cull" "200" +// brush 0 +{ +( 376 3272 -384 ) ( 360 3272 -384 ) ( 360 3272 -488 ) subway/1_tunnelwall 24 0 0 1 1 0 301989888 0 +( 1040 -496 -472 ) ( 1040 -480 -472 ) ( 1040 -480 -400 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +( 648 2848 -464 ) ( 328 2848 -464 ) ( 328 2848 -392 ) subway/1_tunnelwall 24 0 0 1 1 0 301989888 0 +( 1480 -608 -448 ) ( 1480 -608 -408 ) ( 1480 -576 -408 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +( 480 -464 -280 ) ( 496 -464 -280 ) ( 496 -480 -280 ) subway/1_tunnelwall 24 24 0 1 1 0 301989888 0 +( 296 -448 -544 ) ( 256 -448 -544 ) ( 256 -480 -544 ) subway/1_tunnelwall 24 24 0 1 1 0 301989888 0 +} +} +// entity 1024 +{ +"fog_density_range" "1.0" +"classname" "_region" +"fog_mode" "0" +"fog_start" "4.0" +"fog_end" "400.0" +"fog_density" "1.0" +"fog_color" "30 12 0" +// brush 0 +{ +( 376 2848 -384 ) ( 360 2848 -384 ) ( 360 2848 -488 ) subway/1_tunnelwall -40 0 0 1 1 0 301989888 0 +( 1040 -432 -472 ) ( 1040 -416 -472 ) ( 1040 -416 -400 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +( 584 2272 -464 ) ( 264 2272 -464 ) ( 264 2272 -392 ) subway/1_tunnelwall -40 0 0 1 1 0 301989888 0 +( 1216 -544 -448 ) ( 1216 -544 -408 ) ( 1216 -512 -408 ) subway/1_tunnelwall -24 0 0 1 1 0 301989888 0 +( 480 -400 -280 ) ( 496 -400 -280 ) ( 496 -416 -280 ) subway/1_tunnelwall -40 24 0 1 1 0 301989888 0 +( 296 -384 -544 ) ( 256 -384 -544 ) ( 256 -416 -544 ) subway/1_tunnelwall -40 24 0 1 1 0 301989888 0 +} +} +// entity 1025 +{ +"health" "5" +"material" "7" +"classname" "func_breakable_brush" +"surfaceType" "37" +// brush 0 +{ +( 1688 805 -180 ) ( 1688 781 -180 ) ( 1696 781 -180 ) subway/mirror 11 42 0 0.500000 0.500000 134217730 0 0 +( 1696 781 -146 ) ( 1688 781 -146 ) ( 1688 805 -146 ) subway/mirror 11 42 0 0.500000 0.500000 134217730 0 0 +( 1696 784 -132 ) ( 1696 808 -132 ) ( 1696 808 -172 ) subway/mirror -5 26 0 0.500000 0.500000 134217730 0 0 +( 1696 797 -128 ) ( 1688 797 -128 ) ( 1688 797 -168 ) subway/mirror 11 26 0 0.500000 0.500000 134217730 0 0 +( 1694 801 -132 ) ( 1694 777 -132 ) ( 1694 777 -172 ) subway/mirror -5 26 0 0.500000 0.500000 134217730 0 0 +( 1688 777 -132 ) ( 1696 777 -132 ) ( 1696 777 -172 ) subway/mirror 11 26 0 0.500000 0.500000 134217730 0 0 +} +} +// entity 1026 +{ +"surfaceType" "37" +"classname" "func_breakable_brush" +"material" "7" +"health" "5" +// brush 0 +{ +( 1688 877 -180 ) ( 1688 853 -180 ) ( 1696 853 -180 ) subway/mirror 11 58 0 0.500000 0.500000 134217730 0 0 +( 1696 853 -146 ) ( 1688 853 -146 ) ( 1688 877 -146 ) subway/mirror 11 58 0 0.500000 0.500000 134217730 0 0 +( 1696 856 -132 ) ( 1696 880 -132 ) ( 1696 880 -172 ) subway/mirror -21 26 0 0.500000 0.500000 134217730 0 0 +( 1696 869 -128 ) ( 1688 869 -128 ) ( 1688 869 -168 ) subway/mirror 11 26 0 0.500000 0.500000 134217730 0 0 +( 1694 873 -132 ) ( 1694 849 -132 ) ( 1694 849 -172 ) subway/mirror -21 26 0 0.500000 0.500000 134217730 0 0 +( 1688 849 -132 ) ( 1696 849 -132 ) ( 1696 849 -172 ) subway/mirror 11 26 0 0.500000 0.500000 134217730 0 0 +} +} +// entity 1027 +{ +"health" "5" +"classname" "func_breakable_brush" +"material" "7" +"surfaceType" "37" +// brush 0 +{ +( 1274 1184 -180 ) ( 1250 1184 -180 ) ( 1250 1176 -180 ) subway/mirror -16 49 -180 0.500000 -0.500000 134217730 0 0 +( 1250 1176 -146 ) ( 1250 1184 -146 ) ( 1274 1184 -146 ) subway/mirror -16 25 -180 0.500000 -0.500000 134217730 0 0 +( 1253 1176 -132 ) ( 1277 1176 -132 ) ( 1277 1176 -172 ) subway/mirror -16 25 -180 0.500000 -0.500000 134217730 0 0 +( 1266 1176 -128 ) ( 1266 1184 -128 ) ( 1266 1184 -168 ) subway/mirror 48 26 -180 0.500000 -0.500000 134217730 0 0 +( 1294 1178 -132 ) ( 1270 1178 -132 ) ( 1270 1178 -172 ) subway/mirror -16 25 -180 0.500000 -0.500000 134217730 0 0 +( 1246 1184 -132 ) ( 1246 1176 -132 ) ( 1246 1176 -172 ) subway/mirror 48 26 -180 0.500000 -0.500000 134217730 0 0 +} +} +// entity 1028 +{ +"health" "5" +"classname" "func_breakable_brush" +"material" "7" +"surfaceType" "37" +// brush 0 +{ +( 1489 1184 -180 ) ( 1465 1184 -180 ) ( 1465 1176 -180 ) subway/mirror 30 50 -180 0.500000 -0.500000 134217730 0 0 +( 1465 1176 -146 ) ( 1465 1184 -146 ) ( 1489 1184 -146 ) subway/mirror 30 26 -180 0.500000 -0.500000 134217730 0 0 +( 1468 1176 -132 ) ( 1492 1176 -132 ) ( 1492 1176 -172 ) subway/mirror 30 26 -180 0.500000 -0.500000 134217730 0 0 +( 1481 1176 -128 ) ( 1481 1184 -128 ) ( 1481 1184 -168 ) subway/mirror 48 26 -180 0.500000 -0.500000 134217730 0 0 +( 1509 1178 -132 ) ( 1485 1178 -132 ) ( 1485 1178 -172 ) subway/mirror 30 26 -180 0.500000 -0.500000 134217730 0 0 +( 1461 1184 -132 ) ( 1461 1176 -132 ) ( 1461 1176 -172 ) subway/mirror 48 26 -180 0.500000 -0.500000 134217730 0 0 +} +} +// entity 1029 +{ +"surfaceType" "37" +"material" "7" +"classname" "func_breakable_brush" +"health" "5" +// brush 0 +{ +( 1569 1184 -180 ) ( 1545 1184 -180 ) ( 1545 1176 -180 ) subway/mirror -2 50 -180 0.500000 -0.500000 134217730 0 0 +( 1545 1176 -146 ) ( 1545 1184 -146 ) ( 1569 1184 -146 ) subway/mirror -2 26 -180 0.500000 -0.500000 134217730 0 0 +( 1548 1176 -132 ) ( 1572 1176 -132 ) ( 1572 1176 -172 ) subway/mirror -2 26 -180 0.500000 -0.500000 134217730 0 0 +( 1561 1176 -128 ) ( 1561 1184 -128 ) ( 1561 1184 -168 ) subway/mirror 48 26 -180 0.500000 -0.500000 134217730 0 0 +( 1589 1178 -132 ) ( 1565 1178 -132 ) ( 1565 1178 -172 ) subway/mirror -2 26 -180 0.500000 -0.500000 134217730 0 0 +( 1541 1184 -132 ) ( 1541 1176 -132 ) ( 1541 1176 -172 ) subway/mirror 48 26 -180 0.500000 -0.500000 134217730 0 0 +} +} +// entity 1030 +{ +"health" "5" +"classname" "func_breakable_brush" +"material" "7" +"surfaceType" "37" +// brush 0 +{ +( 1278 1552 -180 ) ( 1278 1544 -180 ) ( 1302 1544 -180 ) subway/mirror -24 34 -180 0.500000 -0.500000 134217730 0 0 +( 1302 1544 -146 ) ( 1278 1544 -146 ) ( 1278 1552 -146 ) subway/mirror -24 9 -180 0.500000 -0.500000 134217730 0 0 +( 1305 1552 -172 ) ( 1305 1552 -132 ) ( 1281 1552 -132 ) subway/mirror -24 25 -180 0.500000 -0.500000 134217730 0 0 +( 1294 1544 -168 ) ( 1294 1544 -128 ) ( 1294 1552 -128 ) subway/mirror 32 26 -180 0.500000 -0.500000 134217730 0 0 +( 1298 1550 -172 ) ( 1298 1550 -132 ) ( 1322 1550 -132 ) subway/mirror -23 25 -180 0.500000 -0.500000 134217730 0 0 +( 1274 1552 -172 ) ( 1274 1552 -132 ) ( 1274 1544 -132 ) subway/mirror 32 26 -180 0.500000 -0.500000 134217730 0 0 +} +} +// entity 1031 +{ +"angle" "180" +"spawnflags" "0" +"origin" "1752 -2555 -468" +"classname" "misc_generic_train" +} +// entity 1032 +{ +"classname" "light" +"_color" "1.000000 0.501961 0.000000" +"color" "1.000000 0.501961 0.000000" +"origin" "1508 -1976 -496" +"light" "160" +} +// entity 1033 +{ +"origin" "1424 -1976 -504" +"light" "80" +"color" "1.000000 0.912698 0.813492" +"_color" "1.000000 0.912698 0.813492" +"classname" "light" +} +// entity 1034 +{ +"classname" "light" +"_color" "1.000000 0.912698 0.813492" +"color" "1.000000 0.912698 0.813492" +"light" "80" +"origin" "1336 -1880 -504" +} +// entity 1035 +{ +"fog_distance_cull" "200" +"fog_density_range" "1.0" +"classname" "_region" +"fog_mode" "0" +"fog_start" "4.0" +"fog_end" "400.0" +"fog_density" "1.0" +"fog_color" "30 12 0" +// brush 0 +{ +( 936 -2128 -568 ) ( 896 -2128 -568 ) ( 896 -2160 -568 ) subway/1_tunnelwall -48 8 0 1 1 0 301989888 0 +( 1128 -2144 -264 ) ( 1144 -2144 -264 ) ( 1144 -2160 -264 ) subway/1_tunnelwall -48 8 0 1 1 0 301989888 0 +( 1608 -2336 -448 ) ( 1608 -2336 -408 ) ( 1608 -2304 -408 ) subway/1_tunnelwall -8 0 0 1 1 0 301989888 0 +( 1232 -2088 -464 ) ( 912 -2088 -464 ) ( 912 -2088 -392 ) subway/1_tunnelwall -48 0 0 1 1 0 301989888 0 +( 1248 -2144 -472 ) ( 1248 -2128 -472 ) ( 1248 -2128 -400 ) subway/1_tunnelwall -8 0 0 1 1 0 301989888 0 +( 960 -1648 -384 ) ( 944 -1648 -384 ) ( 944 -1648 -488 ) subway/1_tunnelwall -48 0 0 1 1 0 301989888 0 +} +} +// entity 1036 +{ +"origin" "1748 -1784 -464" +"color" "1.000000 0.501961 0.000000" +"_color" "1.000000 0.501961 0.000000" +"classname" "light" +"light" "160" +} +// entity 1037 +{ +"light" "160" +"classname" "light" +"_color" "1.000000 0.501961 0.000000" +"color" "1.000000 0.501961 0.000000" +"origin" "1892 -1784 -464" +} +// entity 1038 +{ +"origin" "1828 -1784 -416" +"color" "1.000000 0.501961 0.000000" +"_color" "1.000000 0.501961 0.000000" +"classname" "light" +"light" "160" +} +// entity 1039 +{ +"light" "160" +"classname" "light" +"_color" "1.000000 0.501961 0.000000" +"color" "1.000000 0.501961 0.000000" +"origin" "1836 -2152 -464" +} +// entity 1040 +{ +"light" "160" +"classname" "light" +"_color" "1.000000 0.501961 0.000000" +"color" "1.000000 0.501961 0.000000" +"origin" "1828 -1640 -464" +} +// entity 1041 +{ +"classname" "light" +"_color" "0.783465 0.984252 1.000000" +"light" "90" +"origin" "1752 -1936 -504" +} +// entity 1042 +{ +"origin" "1896 -2272 -472" +"light" "90" +"_color" "0.783465 0.984252 1.000000" +"classname" "light" +} +// entity 1043 +{ +"classname" "light" +"_color" "0.783465 0.984252 1.000000" +"light" "90" +"origin" "1752 -2208 -472" +} +// entity 1044 +{ +"classname" "light" +"_color" "0.783465 0.984252 1.000000" +"light" "90" +"origin" "1832 -1824 -408" +} +// entity 1045 +{ +"classname" "m_nyc_mskinhead2a" +"angle" "90" +"origin" "1800 -2288 -488" +"target" "t233" +"spawnflags" "786436" +"targetname" "endwave1b" +"killtarget" "wave1count" +} +// entity 1046 +{ +"classname" "m_x_mskinboss" +"angle" "90" +"spawnflags" "6" +"origin" "1784 -1992 -480" +"targetname" "tunnelsabre" +} +// entity 1047 +{ +"target" "t234" +"origin" "1752 -2352 -488" +"angle" "90" +"classname" "m_nyc_mskinhead1" +"spawnflags" "786436" +"targetname" "endwave1b" +"killtarget" "wave1count" +} +// entity 1048 +{ +"killtarget" "wave1count" +"targetname" "endwave1b" +"spawnflags" "786436" +"classname" "m_nyc_mskinhead1" +"angle" "90" +"origin" "1752 -2184 -488" +"target" "t236" +} +// entity 1049 +{ +"classname" "light" +"_color" "1.000000 0.912698 0.813492" +"color" "1.000000 0.912698 0.813492" +"light" "80" +"origin" "1976 -1936 -488" +} +// entity 1050 +{ +"origin" "1976 -2032 -488" +"light" "80" +"color" "1.000000 0.912698 0.813492" +"_color" "1.000000 0.912698 0.813492" +"classname" "light" +} +// entity 1051 +{ +"classname" "light" +"_color" "1.000000 0.912698 0.813492" +"color" "1.000000 0.912698 0.813492" +"light" "80" +"origin" "1928 -1976 -488" +} +// entity 1052 +{ +"speed" "900" +"angle" "360" +"targetname" "f_closetpush" +"spawnflags" "3" +"classname" "trigger_push" +// brush 0 +{ +( -16 1488 -168 ) ( -96 1488 -168 ) ( -96 1416 -168 ) subway/trigger -20 -32 -180 1 -1 0 160 0 +( -96 1416 -80 ) ( -96 1488 -80 ) ( -16 1488 -80 ) subway/trigger -20 -32 -180 1 -1 0 160 0 +( -96 1408 -104 ) ( -16 1408 -104 ) ( -16 1408 -168 ) subway/trigger -20 0 -180 1 -1 0 160 0 +( -48 1416 -104 ) ( -48 1488 -104 ) ( -48 1488 -168 ) subway/trigger -36 0 -180 1 -1 0 160 0 +( -24 1520 -104 ) ( -104 1520 -104 ) ( -104 1520 -168 ) subway/trigger -20 0 -180 1 -1 0 160 0 +( -120 1496 -104 ) ( -120 1424 -104 ) ( -120 1424 -168 ) subway/trigger -36 0 -180 1 -1 0 160 0 +} +} +// entity 1053 +{ +"angle" "180" +"classname" "m_nyc_mskinhead2a" +"spawnflags" "20" +"targetname" "raflean1" +"origin" "72 -888 -216" +} +// entity 1054 +{ +"targetname" "health1_door" +"classname" "func_door_rotating" +"spawnflags" "162" +"speed" "200" +"distance" "135" +// brush 0 +{ +( 413 -164 -161 ) ( 414 -164 -161 ) ( 414 -163 -161 ) subway/origin -44 7 -90 1 1 16777216 128 0 +( 414 -163 -160 ) ( 414 -164 -160 ) ( 413 -164 -160 ) subway/origin -44 7 -90 1 1 16777216 128 0 +( 413 -163 -161 ) ( 413 -163 -145 ) ( 413 -164 -145 ) subway/origin -45 5 -180 1 -1 16777216 128 0 +( 414 -163 -176 ) ( 414 -163 -160 ) ( 413 -163 -160 ) subway/origin -8 7 0 1 1 16777216 128 0 +( 414 -164 -161 ) ( 414 -164 -145 ) ( 414 -163 -145 ) subway/origin -45 5 -180 1 -1 16777216 128 0 +( 413 -164 -161 ) ( 413 -164 -145 ) ( 414 -164 -145 ) subway/origin -8 7 0 1 1 16777216 128 0 +} +// brush 1 +{ +( 407 -188 -176 ) ( 423 -188 -176 ) ( 423 -156 -176 ) subway/med_sides -3 -13 -90 1 1 64 0 0 +( 423 -156 -160 ) ( 423 -188 -160 ) ( 407 -188 -160 ) subway/med_sides -3 -13 -90 1 1 64 0 0 +( 413 -157 -184 ) ( 413 -157 -144 ) ( 413 -189 -144 ) subway/med_sides -4 0 -180 1 -1 0 0 0 +( 423 -156 -184 ) ( 423 -156 -144 ) ( 407 -156 -144 ) subway/med_sides 11 0 0 1 1 64 0 0 +( 414 -180 -184 ) ( 414 -180 -144 ) ( 414 -148 -144 ) subway/med_door -11 0 0 0.500000 0.500000 64 0 0 +( 407 -172 -184 ) ( 407 -172 -144 ) ( 423 -172 -144 ) subway/med_sides 11 0 0 1 1 64 0 0 +} +} +// entity 1055 +{ +"_wait" ".7" +"classname" "light" +"_color" "1.000000 0.968627 0.866667" +"color" "1.000000 0.968627 0.866667" +"light" "85" +"origin" "1632 1096 -168" +} +// entity 1056 +{ +"origin" "1240 1268 -168" +"light" "85" +"color" "1.000000 0.968627 0.866667" +"_color" "1.000000 0.968627 0.866667" +"classname" "light" +"_wait" ".7" +} +// entity 1057 +{ +"angle" "360" +"origin" "1496 1046 -168" +"classname" "m_nyc_mskinhead1" +"targetname" "lstallguy3" +"spawnflags" "6" +} +// entity 1058 +{ +"origin" "733 1364 -125" +"classname" "item_equip_c4" +} +// entity 1059 +{ +"target" "t253" +"origin" "-88 1240 -128" +"spawnflags" "4" +"angle" "180" +"classname" "m_nyc_mskinhead1" +} +// entity 1060 +{ +"origin" "440 -132 -136" +"light" "110" +"classname" "light" +} +// entity 1061 +{ +"origin" "722 1356 -130" +"classname" "item_equip_grenade" +} +// entity 1062 +{ +"classname" "light" +"origin" "2008 2652 -296" +"light" "75" +"_color" "0.790000 .892000 .990000" +"color" "0.768627 1.000000 1.000000" +"_wait" ".7" +} +// entity 1063 +{ +"classname" "light" +"_color" "1.000000 1.000000 0.768627" +"color" "1.000000 1.000000 0.768627" +"light" "105" +"origin" "1952 2744 -240" +} +// entity 1064 +{ +"origin" "2048 2744 -240" +"light" "105" +"color" "1.000000 1.000000 0.768627" +"_color" "1.000000 1.000000 0.768627" +"classname" "light" +} diff --git a/Sample/skins/ecto_breakdown.tif b/Sample/skins/ecto_breakdown.tif new file mode 100644 index 0000000..c75cb5e Binary files /dev/null and b/Sample/skins/ecto_breakdown.tif differ diff --git a/Sample/skins/ecto_breakdown_smll.jpg b/Sample/skins/ecto_breakdown_smll.jpg new file mode 100644 index 0000000..0c7c79c Binary files /dev/null and b/Sample/skins/ecto_breakdown_smll.jpg differ diff --git a/Sample/skins/female_breakdown.tif b/Sample/skins/female_breakdown.tif new file mode 100644 index 0000000..011b846 Binary files /dev/null and b/Sample/skins/female_breakdown.tif differ diff --git a/Sample/skins/female_breakdown_smll.jpg b/Sample/skins/female_breakdown_smll.jpg new file mode 100644 index 0000000..688241d Binary files /dev/null and b/Sample/skins/female_breakdown_smll.jpg differ diff --git a/Sample/skins/meso_breakdown.tif b/Sample/skins/meso_breakdown.tif new file mode 100644 index 0000000..e3e3b70 Binary files /dev/null and b/Sample/skins/meso_breakdown.tif differ diff --git a/Sample/skins/meso_breakdown_smll.jpg b/Sample/skins/meso_breakdown_smll.jpg new file mode 100644 index 0000000..45c50c3 Binary files /dev/null and b/Sample/skins/meso_breakdown_smll.jpg differ diff --git a/Sample/textures/textures.qdt b/Sample/textures/textures.qdt new file mode 100644 index 0000000..af8b436 --- /dev/null +++ b/Sample/textures/textures.qdt @@ -0,0 +1,1764 @@ +$mipdir subway + +$load \art\textures\final\ny\con1.tga +$mip con1 0 0 64 64 scale 0.5 0.5 mip detail d_stoneholey2.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\con2.tga +$mip con2 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\con3.tga +$mip con3 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\con4.tga +$mip con4 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\con5.tga +$mip con5 0 0 64 64 scale 0.5 0.5 mip detail d_stonesmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\con6.tga +$mip con6 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\metal1.tga +$mip metal1 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\metal2.tga +$mip metal2 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\metalrib1.tga +$mip metalrib1 0 0 32 32 scale 0.5 0.5 mip detail d_metalsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\metalrib2.tga +$mip metalrib2 0 0 64 64 scale 0.5 0.5 mip detail d_metalsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\brick1.tga +$mip brick1 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_tile.tga +$mip 1_tile 0 0 64 64 scale 0.5 0.5 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_trim1.tga +$mip 1_trim1 0 0 32 32 scale 0.5 0.5 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\trim2.tga +$mip trim2 0 0 32 32 scale 0.5 0.5 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\trim2a.tga +$mip trim2a 0 0 32 32 scale 0.5 0.5 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\3_brick2.tga +$mip 3_brick2 0 0 128 128 scale 0.5 0.5 mip detail d_stonecracked.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_brick3.tga +$mip 2_brick3 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_brick3a.tga +$mip 2_brick3a 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\clip.tga +$mip clip 0 0 64 64 scale 0.5 0.5 monsterclip playerclip nodraw trans33 +$load \art\textures\final\ny\hint.tga +$mip hint 0 0 64 64 scale 0.5 0.5 hint nodraw trans33 +$load \art\textures\final\ny\skip.tga +$mip skip 0 0 64 64 scale 0.5 0.5 nodraw skip trans33 +$load \art\textures\final\ny\trigger.tga +$mip trigger 0 0 64 64 scale 0.5 0.5 nodraw trans33 +$load \art\textures\final\ny\light_florescent.tga +$mip light_florescent 0 0 16 16 scale 0.5 0.5 mip light 30000 material glass +$load \art\textures\final\ny\metalfloor1.tga +$mip metalfloor1 0 0 64 64 scale 0.5 0.5 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\2_water1.tga +$mip 2_water1 0 0 64 64 scale 0.5 0.5 mip water trans66 warping material liquid_blue +$load \art\textures\final\ny\2_warning.tga +$mip 2_warning 0 0 32 32 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\3_woodfence.tga +$mip 3_woodfence 0 0 64 128 scale 0.5 0.5 mip detail d_woodrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\1_duct.tga +$mip 1_duct 0 0 64 64 scale 0.5 0.5 alt 1_duct2.m32 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\3_medcrate1.tga +$mip 3_medcrate1 0 0 64 64 scale 0.5 0.5 mip detail d_woodrough2.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_lbrown +$load \art\textures\final\ny\3_medcrate2.tga +$mip 3_medcrate2 0 0 64 64 scale 0.5 0.5 mip detail d_woodrough2.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\origin.tga +$mip origin 0 0 64 64 scale 0.5 0.5 origin nodraw +$load \art\textures\final\ny\3_brick4.tga +$mip 3_brick4 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_scumconcrete.tga +$mip 2_scumconcrete 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_fuse1.tga +$mip 2_fuse1 0 0 32 64 scale 0.5 0.5 damage 2_fuse2.m32 1 mip spherical env1b.m32 material metal_computer +$load \art\textures\final\ny\2_fuse2.tga +$mip 2_fuse2 0 0 32 64 scale 0.5 0.5 damage 2_fuse3d.m32 1 mip material metal_computer +$load \art\textures\final\ny\2_fuse3.tga +$mip 2_fuse3 0 0 16 32 scale 0.5 0.5 mip spherical env1b.m32 material metal +$load \art\textures\final\ny\newpipe1.tga +$mip newpipe1 0 0 64 32 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\newpipe1hilight.tga +$mip newpipe1hilight 0 0 64 32 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\2_mortar.tga +$mip 2_mortar 0 0 32 32 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\2_oldwall1.tga +$mip 2_oldwall1 0 0 64 64 scale 0.5 0.5 alt 2_oldwall2.m32 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_oldwallwet.tga +$mip 2_oldwallwet 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\2_oldceiling1.tga +$mip 2_oldceiling1 0 0 64 64 scale 0.5 0.5 alt 2_oldceiling1a.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_oldceiling1a.tga +$mip 2_oldceiling1a 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_oldwall2.tga +$mip 2_oldwall2 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_oldceiling1b.tga +$mip 2_oldceiling1b 0 0 64 64 scale 0.5 0.5 alt 2_oldceiling1a.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\light_green.tga +$mip light_green 0 0 16 16 scale 0.5 0.5 mip light 30000 material glass +$load \art\textures\final\ny\light_emergency.tga +$mip light_emergency 0 0 16 16 scale 0.5 0.5 mip light 30000 material glass +$load \art\textures\final\ny\3_redpaint.tga +$mip 3_redpaint 0 0 16 16 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\light_offwhite.tga +$mip light_offwhite 0 0 16 16 scale 0.5 0.5 mip light 30000 material glass +$load \art\textures\final\ny\light_tungsten.tga +$mip light_tungsten 0 0 16 16 scale 0.5 0.5 mip light 30000 material glass +$load \art\textures\final\ny\1_tile_bottom.tga +$mip 1_tile_bottom 0 0 32 32 scale 0.5 0.5 mip detail d_tile.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_middle.tga +$mip 1_tile_middle 0 0 32 32 scale 0.5 0.5 mip detail d_tile.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_top.tga +$mip 1_tile_top 0 0 32 16 scale 0.5 0.5 mip detail d_tile.m32 4 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\light_orange.tga +$mip light_orange 0 0 32 32 scale 0.5 0.5 mip light 30000 material glass +$load \art\textures\final\ny\3_building1a.tga +$mip 3_building1a 0 0 128 32 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_building1b.tga +$mip 3_building1b 0 0 128 32 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\3_building1c.tga +$mip 3_building1c 0 0 128 128 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\3_woodfloor.tga +$mip 3_woodfloor 0 0 64 64 scale 0.5 0.5 mip detail d_woodrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\1_tile_big.tga +$mip 1_tile_big 0 0 32 32 scale 0.5 0.5 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_concrete_floor.tga +$mip 1_concrete_floor 0 0 128 128 scale 0.5 0.5 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\2_water2.tga +$mip 2_water2 0 0 64 64 scale 0.5 0.5 mip water trans66 warping material liquid_green +$load \art\textures\final\ny\3_building2.tga +$mip 3_building2 0 0 128 128 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\3_building3.tga +$mip 3_building3 0 0 128 128 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock.tga +$mip 2_cinderblock 0 0 64 64 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_bottom.tga +$mip 2_cinderblock_bottom 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_top.tga +$mip 2_cinderblock_top 0 0 64 32 scale 0.5 0.5 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\2_cinderblock_cruddy.tga +$mip 2_cinderblock_cruddy 0 0 64 64 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\con1a.tga +$mip con1a 0 0 16 64 scale 0.5 0.5 mip detail d_stonerough.m32 1 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\con1b.tga +$mip con1b 0 0 32 64 scale 0.5 0.5 mip detail d_stonerough.m32 2 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_wall1.tga +$mip 3_wall1 0 0 128 128 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\3_wall2.tga +$mip 3_wall2 0 0 128 128 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\con2_corner.tga +$mip con2_corner 0 0 32 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\con2_pipe1.tga +$mip con2_pipe1 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\con2_pipe2.tga +$mip con2_pipe2 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\1_fusebox.tga +$mip 1_fusebox 0 0 32 64 scale 0.5 0.5 damage 2_fuse3d.m32 1 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\1_fusebox_side.tga +$mip 1_fusebox_side 0 0 16 16 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\grating1.tga +$mip grating1 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 alpha material metal +$load \art\textures\final\ny\2_cinderblock_64.tga +$mip 2_cinderblock_64 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\metal_rust.tga +$mip metal_rust 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\metal_clean.tga +$mip metal_clean 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\1_duct2.tga +$mip 1_duct2 0 0 64 64 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\1_soda_top.tga +$mip 1_soda_top 0 0 64 64 scale 0.5 0.5 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\1_soda_front_a.tga +$mip 1_soda_front_a 0 0 64 64 scale 0.5 0.5 damage 1_soda_front_a3.m32 10 spherical env1b.m32 material sodabroke +$load \art\textures\final\ny\1_soda_front_b.tga +$mip 1_soda_front_b 0 0 64 32 scale 0.5 0.5 damage 1_soda_front_b3.m32 10 spherical env1b.m32 material sodabroke +$load \art\textures\final\ny\1_soda_side_a.tga +$mip 1_soda_side_a 0 0 64 64 scale 0.5 0.5 damage 1_soda_side_ad.m32 10 spherical env1b.m32 material sodabroke +$load \art\textures\final\ny\1_soda_side_b.tga +$mip 1_soda_side_b 0 0 64 32 scale 0.5 0.5 damage 1_soda_side_bd.m32 10 spherical env1b.m32 material sodabroke +$load \art\textures\final\ny\2_open_box.tga +$mip 2_open_box 0 0 64 64 scale 0.5 0.5 damage 2_open_boxd.m32 1 detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\big_pipe1.tga +$mip big_pipe1 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\big_pipe2.tga +$mip big_pipe2 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\1_news_front1.tga +$mip 1_news_front1 0 0 64 64 scale 0.5 0.5 alt 1_news_frontB.m32 damage 1_news_front1d.m32 20 spherical env1b.m32 material metal +$load \art\textures\final\ny\1_news_front2.tga +$mip 1_news_front2 0 0 64 64 scale 0.5 0.5 alt 1_news_frontB.m32 damage 1_news_front1d.m32 1 material metal +$load \art\textures\final\ny\1_news_side1.tga +$mip 1_news_side1 0 0 32 64 scale 0.5 0.5 alt 1_news_sideb.m32 spherical env1b.m32 material metal +$load \art\textures\final\ny\1_news_top1.tga +$mip 1_news_top1 0 0 32 64 scale 0.5 0.5 alt 1_news_topb.m32 spherical env1b.m32 material metal +$load \art\textures\final\ny\1_tunnelwall.tga +$mip 1_tunnelwall 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material sand_dbrown +$load \art\textures\final\ny\1_metal_polished.tga +$mip 1_metal_polished 0 0 32 32 scale 0.5 0.5 mip spherical env1c.m32 material metal +$load \art\textures\final\ny\con1c.tga +$mip con1c 0 0 64 64 scale 0.5 0.5 alt con1.m32 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\1_tunnelwall_pipe.tga +$mip 1_tunnelwall_pipe 0 0 64 64 scale 0.5 0.5 alt 1_tunnelwall.m32 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material sand_dbrown +$load \art\textures\final\ny\1_tunnelwall_floor.tga +$mip 1_tunnelwall_floor 0 0 64 32 scale 0.5 0.5 mip detail d_metalrough.m32 4 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material gravel_dbrown +$load \art\textures\final\ny\1_tunnelwall_2.tga +$mip 1_tunnelwall_2 0 0 64 64 scale 0.5 0.5 alt 1_tunnelwall.m32 detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material sand_dbrown +$load \art\textures\final\ny\1_tunnelwall_3.tga +$mip 1_tunnelwall_3 0 0 64 64 scale 0.5 0.5 alt 1_tunnelwall.m32 detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material sand_dbrown +$load \art\textures\final\ny\1_black.tga +$mip 1_black 0 0 16 16 scale 0.5 0.5 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\1_florescent.tga +$mip 1_florescent 0 0 32 16 scale 0.5 0.5 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\1_tunnel_ceiling.tga +$mip 1_tunnel_ceiling 0 0 64 64 scale 0.5 0.5 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material sand_dbrown +$load \art\textures\final\ny\1_sewer_wall.tga +$mip 1_sewer_wall 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tunnelfloor_1.tga +$mip 1_tunnelfloor_1 0 0 32 32 scale 0.5 0.5 mip detail d_genericsmooth.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\1_tunnelfloor_2.tga +$mip 1_tunnelfloor_2 0 0 32 32 scale 0.5 0.5 mip detail d_genericsmooth.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\1_tunneltrack_1.tga +$mip 1_tunneltrack_1 0 0 64 64 scale 0.5 0.5 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\1_tunneltrack_2.tga +$mip 1_tunneltrack_2 0 0 64 64 scale 0.5 0.5 alt 1_tunneltrack_1.m32 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\1_tunneltrack_3.tga +$mip 1_tunneltrack_3 0 0 64 64 scale 0.5 0.5 alt 1_tunneltrack_1.m32 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\1_tunneltrack_4.tga +$mip 1_tunneltrack_4 0 0 64 64 scale 0.5 0.5 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\1_tunneltrack_end1.tga +$mip 1_tunneltrack_end1 0 0 64 64 scale 0.5 0.5 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\1_tunneltrack_end2.tga +$mip 1_tunneltrack_end2 0 0 64 64 scale 0.5 0.5 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\1_tunneltrack_plain.tga +$mip 1_tunneltrack_plain 0 0 64 64 scale 0.5 0.5 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\fire_extinguisher.tga +$mip fire_extinguisher 0 0 16 32 scale 0.5 0.5 spherical env1b.m32 material glass +$load \art\textures\final\ny\1_news_frontb.tga +$mip 1_news_frontB 0 0 64 64 scale 0.5 0.5 damage 1_news_frontbd.m32 1 spherical env1b.m32 material metal +$load \art\textures\final\ny\1_news_sideb.tga +$mip 1_news_sideB 0 0 32 64 scale 0.5 0.5 spherical env1b.m32 material metal +$load \art\textures\final\ny\1_news_topb.tga +$mip 1_news_topB 0 0 32 64 scale 0.5 0.5 spherical env1b.m32 material metal +$load \art\textures\final\ny\1_danger.tga +$mip 1_danger 0 0 128 32 scale 0.5 0.5 m_spherical detail d_stonecracked.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\1_map.tga +$mip 1_map 0 0 128 64 scale 1 1 damage 1_mapd.m32 10 light 10000 material glass +$load \art\textures\final\ny\1_tile_big_green.tga +$mip 1_tile_big_green 0 0 32 32 scale 0.5 0.5 alt 1_tile_big.m32 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\1_tile_big_blue.tga +$mip 1_tile_big_blue 0 0 32 32 scale 0.5 0.5 alt 1_tile_big.m32 mip detail d_tile.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_bench.tga +$mip 1_bench 0 0 32 32 scale 0.5 0.5 mip detail d_metalribbed.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\1_door_jam.tga +$mip 1_door_jam 0 0 16 16 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\1_sign1.tga +$mip 1_sign1 0 0 128 32 scale 0.5 0.5 damage 1_sign1d.m32 10 detail d_genericsmooth.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material glass_computer +$load \art\textures\final\ny\1_sign2.tga +$mip 1_sign2 0 0 128 32 scale 0.5 0.5 damage 1_sign2d.m32 10 detail d_genericsmooth.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material glass_computer +$load \art\textures\final\ny\1_tunnel_ceiling2.tga +$mip 1_tunnel_ceiling2 0 0 64 64 scale 0.5 0.5 alt 1_tunnel_ceiling.m32 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material sand_dbrown +$load \art\textures\final\ny\1_tunnel_ceiling3.tga +$mip 1_tunnel_ceiling3 0 0 64 64 scale 0.5 0.5 alt 1_tunnel_ceiling.m32 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material sand_dbrown +$load \art\textures\final\ny\1_tunnel_ceiling4.tga +$mip 1_tunnel_ceiling4 0 0 64 64 scale 0.5 0.5 alt 1_tunnel_ceiling.m32 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material sand_dbrown +$load \art\textures\final\ny\1_poster1.tga +$mip 1_poster1 0 0 64 64 scale 0.5 0.5 alt 1_poster3.m32 spherical env1b.m32 material glass +$load \art\textures\final\ny\1_poster2.tga +$mip 1_poster2 0 0 64 64 scale 0.5 0.5 alt 1_poster3.m32 m_parental spherical env1b.m32 material glass +$load \art\textures\final\ny\1_poster3.tga +$mip 1_poster3 0 0 64 64 scale 0.5 0.5 spherical env1b.m32 material glass +$load \art\textures\final\ny\1_poster2a.tga +$mip 1_poster2a 0 0 64 64 scale 0.5 0.5 alt 1_poster3a.m32 m_parental spherical env1b.m32 material glass +$load \art\textures\final\ny\1_poster3a.tga +$mip 1_poster3a 0 0 64 64 scale 0.5 0.5 spherical env1b.m32 material glass +$load \art\textures\final\ny\1_poster_top.tga +$mip 1_poster_top 0 0 64 16 scale 0.5 0.5 mip spherical env1b.m32 material metal +$load \art\textures\final\ny\2_cinderblock_sign1.tga +$mip 2_cinderblock_sign1 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 m_spherical detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\2_cinderblock_sign2.tga +$mip 2_cinderblock_sign2 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 m_spherical detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\2_cinderblock_sign3.tga +$mip 2_cinderblock_sign3 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 m_spherical detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\2_cinderblock_sign4.tga +$mip 2_cinderblock_sign4 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 m_spherical detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 +$load \art\textures\final\ny\2_cinderblock_num2.tga +$mip 2_cinderblock_num2 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_num3.tga +$mip 2_cinderblock_num3 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf1.tga +$mip 2_cinderblock_graf1 0 0 128 64 scale 0.5 0.5 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_oldwall1_sign1.tga +$mip 2_oldwall1_sign1 0 0 64 64 scale 0.5 0.5 alt 2_oldwall2.m32 detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\1_tile_blood.tga +$mip 1_tile_blood 0 0 64 64 scale 0.5 0.5 alt 1_tile.m32 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_damage1.tga +$mip 1_tile_damage1 0 0 64 64 scale 0.5 0.5 alt 1_tile.m32 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_damage2.tga +$mip 1_tile_damage2 0 0 64 64 scale 0.5 0.5 alt 1_tile.m32 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_soda_front_a3.tga +$mip 1_soda_front_a3 0 0 64 64 scale 0.5 0.5 material sodabroke +$load \art\textures\final\ny\1_soda_front_b3.tga +$mip 1_soda_front_b3 0 0 64 32 scale 0.5 0.5 material sodabroke +$load \art\textures\final\ny\2_valve.tga +$mip 2_valve 0 0 32 16 scale 0.5 0.5 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\2_door_1.tga +$mip 2_door_1 0 0 64 128 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\pipe_rusty1.tga +$mip pipe_rusty1 0 0 64 32 scale 0.5 0.5 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\pipe_rusty2.tga +$mip pipe_rusty2 0 0 64 32 scale 0.5 0.5 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\pipe_grey1.tga +$mip pipe_grey1 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\pipe_grey2.tga +$mip pipe_grey2 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\1_tile_graf1.tga +$mip 1_tile_graf1 0 0 64 64 scale 0.5 0.5 alt 1_tile.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf2.tga +$mip 1_tile_graf2 0 0 64 64 scale 0.5 0.5 alt 1_tile_graf2b.m32 m_parental detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf3.tga +$mip 1_tile_graf3 0 0 64 64 scale 0.5 0.5 alt 1_tile.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf4.tga +$mip 1_tile_graf4 0 0 64 64 scale 0.5 0.5 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf5.tga +$mip 1_tile_graf5 0 0 64 64 scale 0.5 0.5 alt 1_tile_graf5b.m32 m_parental detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\2_corrigated_metal.tga +$mip 2_corrigated_metal 0 0 32 32 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\1_tile_graf6.tga +$mip 1_tile_graf6 0 0 64 64 scale 0.5 0.5 alt 1_tile.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf7.tga +$mip 1_tile_graf7 0 0 64 64 scale 0.5 0.5 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf8.tga +$mip 1_tile_graf8 0 0 64 64 scale 0.5 0.5 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf9.tga +$mip 1_tile_graf9 0 0 64 64 scale 0.5 0.5 alt 1_tile_graf9b.m32 m_parental detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\2_orange_paint.tga +$mip 2_orange_paint 0 0 16 16 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material stone_red +$load \art\textures\final\ny\sky2.tga +$mip sky2 0 0 64 64 scale 0.5 0.5 sky +$load \art\textures\final\ny\2_open_box2.tga +$mip 2_open_box2 0 0 64 64 scale 0.5 0.5 damage 2_open_box2d.m32 1 detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\2_open_box3.tga +$mip 2_open_box3 0 0 64 64 scale 0.5 0.5 damage 2_open_box.m32 1 detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal_computer +$load \art\textures\final\ny\1_cork_ceiling.tga +$mip 1_cork_ceiling 0 0 64 64 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material snow +$load \art\textures\final\ny\1_stair_top1.tga +$mip 1_stair_top1 0 0 32 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\1_stair_side1.tga +$mip 1_stair_side1 0 0 16 16 scale 0.5 0.5 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\1_stair_side2.tga +$mip 1_stair_side2 0 0 16 16 scale 0.5 0.5 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_stair_side1.tga +$mip 2_stair_side1 0 0 16 16 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\2_stair_side2.tga +$mip 2_stair_side2 0 0 16 16 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\stair_side.tga +$mip stair_side 0 0 16 16 scale 0.5 0.5 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\2_oldwallwet_2.tga +$mip 2_oldwallwet_2 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\2_oldceiling2.tga +$mip 2_oldceiling2 0 0 64 32 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\1_danger2.tga +$mip 1_danger2 0 0 128 32 scale 0.5 0.5 alt 1_danger2.m32 m_spherical detail d_stonecracked.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\1_grating.tga +$mip 1_grating 0 0 64 64 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR alpha material metal +$load \art\textures\final\ny\2_fan_grate.tga +$mip 2_fan_grate 0 0 128 128 scale 0.5 0.5 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\grating2.tga +$mip grating2 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 alpha material metal +$load \art\textures\final\ny\1_beam1.tga +$mip 1_beam1 0 0 64 32 scale 0.5 0.5 alt 1_beam2.m32 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\1_beam2.tga +$mip 1_beam2 0 0 64 32 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\1_restroom1.tga +$mip 1_restroom1 0 0 32 32 scale 0.5 0.5 spherical env1a.m32 material metal +$load \art\textures\final\ny\1_restroom2.tga +$mip 1_restroom2 0 0 32 32 scale 0.5 0.5 spherical env1a.m32 material metal +$load \art\textures\final\ny\1_switch1.tga +$mip 1_switch1 0 0 16 32 scale 0.5 0.5 damage 1_switch1d.m32 10 spherical env1c.m32 anim 1_switch2.m32 animspeed 1 material metal_computer +$load \art\textures\final\ny\1_switch2.tga +$mip 1_switch2 0 0 16 32 scale 0.5 0.5 damage 1_switch1d.m32 10 spherical env1c.m32 anim 1_switch1.m32 animspeed 1 material metal +$load \art\textures\final\ny\1_shield.tga +$mip 1_shield 0 0 32 32 scale 0.5 0.5 detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\1_cops.tga +$mip 1_cops 0 0 64 64 scale 0.5 0.5 m_nomip spherical env1b.m32 material metal +$load \art\textures\final\ny\1_brushed_metal.tga +$mip 1_brushed_metal 0 0 32 32 scale 0.5 0.5 mip spherical env1c.m32 material metal +$load \art\textures\final\ny\1_bathroom_men.tga +$mip 1_bathroom_men 0 0 64 64 scale 0.5 0.5 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\1_bathroom_men_bottom.tga +$mip 1_bathroom_men_bottom 0 0 32 32 scale 0.5 0.5 mip detail d_tile.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\1_bathroom_men_damage.tga +$mip 1_bathroom_men_damage 0 0 64 64 scale 0.5 0.5 alt 1_bathroom_men.m32 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\1_bathroom_men_top.tga +$mip 1_bathroom_men_top 0 0 32 16 scale 0.5 0.5 mip detail d_tile.m32 4 1 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\1_bathroom_women.tga +$mip 1_bathroom_women 0 0 64 64 scale 0.5 0.5 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\1_bathroom_women_bottom.tga +$mip 1_bathroom_women_bottom 0 0 32 32 scale 0.5 0.5 mip detail d_tile.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\1_bathroom_women_top.tga +$mip 1_bathroom_women_top 0 0 32 16 scale 0.5 0.5 mip detail d_tile.m32 4 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\1_bathroom_floor.tga +$mip 1_bathroom_floor 0 0 64 64 scale 0.5 0.5 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR flowing trans33 trans66 material stone_lbrown +$load \art\textures\final\ny\1_bathroom_floor_edge.tga +$mip 1_bathroom_floor_edge 0 0 64 64 scale 0.5 0.5 alt 1_bathroom_floor.m32 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_bathroom_floor_drain.tga +$mip 1_bathroom_floor_drain 0 0 64 64 scale 0.5 0.5 alt 1_bathroom_floor.m32 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR flowing sky slick trans66 warping material metal +$load \art\textures\final\ny\1_bathroom_men_graf1.tga +$mip 1_bathroom_men_graf1 0 0 64 64 scale 0.5 0.5 alt 1_bathroom_men.m32 m_parental detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\1_bathroom_men_graf2.tga +$mip 1_bathroom_men_graf2 0 0 64 64 scale 0.5 0.5 alt 1_bathroom_men.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\1_bathroom_men_graf4.tga +$mip 1_bathroom_men_graf4 0 0 64 64 scale 0.5 0.5 alt 1_bathroom_men.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\1_bathroom_women_blood.tga +$mip 1_bathroom_women_blood 0 0 64 64 scale 0.5 0.5 alt 1_bathroom_women.m32 mip m_parental detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\1_bathroom_men_graf3.tga +$mip 1_bathroom_men_graf3 0 0 64 64 scale 0.5 0.5 alt 1_bathroom_men.m32 m_parental detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\1_bathroom_streak_bottom.tga +$mip 1_bathroom_streak_bottom 0 0 64 32 scale 0.5 0.5 alt 1_bathroom_women_bottom.m32 mip detail d_tile.m32 8 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\1_bathroom_streak_mid.tga +$mip 1_bathroom_streak_mid 0 0 64 64 scale 0.5 0.5 alt 1_bathroom_women.m32 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\1_bathroom_streak_top.tga +$mip 1_bathroom_streak_top 0 0 64 16 scale 0.5 0.5 mip detail d_tile.m32 8 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\1_bathroom_women_graf1.tga +$mip 1_bathroom_women_graf1 0 0 64 64 scale 0.5 0.5 alt 1_bathroom_women.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\grating3.tga +$mip grating3 0 0 64 128 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR alpha material metal +$load \art\textures\final\ny\1_cops2.tga +$mip 1_cops2 0 0 64 64 scale 0.5 0.5 alt 1_cops.m32 m_nomip spherical env1b.m32 material metal +$load \art\textures\final\ny\1_lobby_floor.tga +$mip 1_lobby_floor 0 0 64 64 scale 0.5 0.5 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\1_sign3.tga +$mip 1_sign3 0 0 128 32 scale 0.5 0.5 damage 1_sign3d.m32 10 detail d_genericsmooth.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material glass_computer +$load \art\textures\final\ny\1_sign4.tga +$mip 1_sign4 0 0 128 32 scale 0.5 0.5 alt 1_sign4b.m32 m_parental detail d_genericsmooth.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass_computer +$load \art\textures\final\ny\2_sign1.tga +$mip 2_sign1 0 0 64 64 scale 0.5 0.5 detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\2_sign3.tga +$mip 2_sign3 0 0 64 64 scale 0.5 0.5 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\2_sign4.tga +$mip 2_sign4 0 0 64 64 scale 0.5 0.5 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_grocery1.tga +$mip 3_grocery1 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_grocery1_window.tga +$mip 3_grocery1_window 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_grocery1_window_wide.tga +$mip 3_grocery1_window_wide 0 0 128 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_grocery2.tga +$mip 3_grocery2 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_white +$load \art\textures\final\ny\3_grocery2_bottom.tga +$mip 3_grocery2_bottom 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_grocery2_bottom2.tga +$mip 3_grocery2_bottom2 0 0 64 64 scale 0.5 0.5 alt 3_grocery2.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_white +$load \art\textures\final\ny\3_grocery2_bottom3.tga +$mip 3_grocery2_bottom3 0 0 64 64 scale 0.5 0.5 alt 3_grocery2.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_white +$load \art\textures\final\ny\3_grocery2_bottom4.tga +$mip 3_grocery2_bottom4 0 0 64 64 scale 0.5 0.5 alt 3_grocery2.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_white +$load \art\textures\final\ny\3_grocery3.tga +$mip 3_grocery3 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_white +$load \art\textures\final\ny\3_grocery3_park.tga +$mip 3_grocery3_park 0 0 128 64 scale 0.5 0.5 alt 3_grocery3.m32 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_white +$load \art\textures\final\ny\sign1.tga +$mip sign1 0 0 32 32 scale 0.5 0.5 detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\sign2.tga +$mip sign2 0 0 32 32 scale 0.5 0.5 material metal +$load \art\textures\final\ny\sign3.tga +$mip sign3 0 0 64 64 scale 0.5 0.5 spherical env1a.m32 material metal +$load \art\textures\final\ny\sign4.tga +$mip sign4 0 0 64 64 scale 0.5 0.5 spherical env1a.m32 material metal +$load \art\textures\final\ny\3_apt.tga +$mip 3_apt 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\3_apt_bottom1.tga +$mip 3_apt_bottom1 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\3_apt_bottom2.tga +$mip 3_apt_bottom2 0 0 64 64 scale 0.5 0.5 alt 3_apt_bottom1.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\3_apt_bottom3.tga +$mip 3_apt_bottom3 0 0 64 64 scale 0.5 0.5 alt 3_apt_bottom1.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_apt_window.tga +$mip 3_apt_window 0 0 64 64 scale 0.5 0.5 damage 3_apt_windowd.m32 20 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_bar.tga +$mip 3_bar 0 0 32 32 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_bar2.tga +$mip 3_bar2 0 0 64 64 scale 1 1 alt 3_bar.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_bar_bottom1.tga +$mip 3_bar_bottom1 0 0 32 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_bar_bottom2.tga +$mip 3_bar_bottom2 0 0 64 64 scale 1 1 alt 3_bar_bottom1.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_bar_bottom3.tga +$mip 3_bar_bottom3 0 0 64 64 scale 1 1 alt 3_bar_bottom1.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_bar_bottom4.tga +$mip 3_bar_bottom4 0 0 64 64 scale 1 1 alt 3_bar_bottom1.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_bar_white.tga +$mip 3_bar_white 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_white +$load \art\textures\final\ny\3_bar_window.tga +$mip 3_bar_window 0 0 64 64 scale 1 1 alt 3_bar2.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_oldbrick.tga +$mip 3_oldbrick 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\3_oldbrick_window.tga +$mip 3_oldbrick_window 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\3_redbrick.tga +$mip 3_redbrick 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_redbrick_bottom1.tga +$mip 3_redbrick_bottom1 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_redbrick_bottom1a.tga +$mip 3_redbrick_bottom1a 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\3_redbrick_bottom1b.tga +$mip 3_redbrick_bottom1b 0 0 64 64 scale 0.5 0.5 alt 3_redbrick_bottom1.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_redbrick_bottom2.tga +$mip 3_redbrick_bottom2 0 0 64 64 scale 0.5 0.5 alt 3_redbrick_bottom1.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_redbrick_trim.tga +$mip 3_redbrick_trim 0 0 16 16 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_redbrick_trim_a.tga +$mip 3_redbrick_trim_a 0 0 64 64 scale 0.5 0.5 alt 3_redbrick.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_redbrick_trim_b.tga +$mip 3_redbrick_trim_b 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\3_redbrick_window_a.tga +$mip 3_redbrick_window_a 0 0 64 64 scale 0.5 0.5 damage 3_redbrick_window_ad1.m32 10 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_redbrick_window_b.tga +$mip 3_redbrick_window_b 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\1_bathroom_men_nos.tga +$mip 1_bathroom_men_nos 0 0 64 64 scale 0.5 0.5 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\1_bathroom_women_nos.tga +$mip 1_bathroom_women_nos 0 0 64 64 scale 0.5 0.5 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\1_beam1_plain.tga +$mip 1_beam1_plain 0 0 16 16 scale 0.5 0.5 alt 1_beam2_plain.m32 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\1_beam2_plain.tga +$mip 1_beam2_plain 0 0 16 16 scale 0.5 0.5 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\1_clock.tga +$mip 1_clock 0 0 32 32 scale 0.5 0.5 damage 1_clockd.m32 10 spherical env1b.m32 material glass_computer +$load \art\textures\final\ny\3_bar_white_bottom.tga +$mip 3_bar_white_bottom 0 0 64 64 scale 0.5 0.5 alt 3_bar_white.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_white +$load \art\textures\final\ny\3_cement.tga +$mip 3_cement 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_cement2.tga +$mip 3_cement2 0 0 64 64 scale 0.5 0.5 alt 3_cement.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_cement_crack.tga +$mip 3_cement_crack 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_cement_crack_edge.tga +$mip 3_cement_crack_edge 0 0 64 64 scale 0.5 0.5 alt 3_cement_crack.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_cement_crack_edge2.tga +$mip 3_cement_crack_edge2 0 0 64 64 scale 0.5 0.5 alt 3_cement_crack.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_cement_crack_line.tga +$mip 3_cement_crack_line 0 0 64 64 scale 0.5 0.5 alt 3_cement_crack.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_cement_crack_line_side.tga +$mip 3_cement_crack_line_side 0 0 64 64 scale 0.5 0.5 alt 3_cement_crack.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_cement_edge.tga +$mip 3_cement_edge 0 0 64 64 scale 0.5 0.5 alt 3_cement.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_cement_line1.tga +$mip 3_cement_line1 0 0 64 64 scale 0.5 0.5 alt 3_cement.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_cement_line2.tga +$mip 3_cement_line2 0 0 64 64 scale 0.5 0.5 alt 3_cement.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_cement_line3.tga +$mip 3_cement_line3 0 0 64 64 scale 0.5 0.5 alt 3_cement.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_cement_line4.tga +$mip 3_cement_line4 0 0 64 64 scale 0.5 0.5 alt 3_cement.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_cement_line_bottom.tga +$mip 3_cement_line_bottom 0 0 64 64 scale 0.5 0.5 alt 3_cement.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_cement_line_top.tga +$mip 3_cement_line_top 0 0 64 64 scale 0.5 0.5 alt 3_cement.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_cobble.tga +$mip 3_cobble 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_cobble_edge1.tga +$mip 3_cobble_edge1 0 0 64 64 scale 0.5 0.5 alt 3_cobble.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_cobble_edge2.tga +$mip 3_cobble_edge2 0 0 64 64 scale 0.5 0.5 alt 3_cobble.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_cobble_edge3.tga +$mip 3_cobble_edge3 0 0 64 64 scale 0.5 0.5 alt 3_cobble.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_cobble_edge4.tga +$mip 3_cobble_edge4 0 0 64 64 scale 0.5 0.5 alt 3_cobble.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\3_cobble_manhole.tga +$mip 3_cobble_manhole 0 0 64 64 scale 0.5 0.5 alt 3_cobble.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_cobble_plate.tga +$mip 3_cobble_plate 0 0 64 64 scale 0.5 0.5 alt 3_cobble.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\3_cobble_stain1.tga +$mip 3_cobble_stain1 0 0 64 64 scale 0.5 0.5 alt 3_cobble.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_dog.tga +$mip 3_dog 0 0 64 32 scale 0.5 0.5 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_door1.tga +$mip 3_door1 0 0 64 128 scale 0.5 0.5 detail d_stonecracked.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\3_door2.tga +$mip 3_door2 0 0 64 128 scale 0.5 0.5 detail d_stoneholey.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_door3.tga +$mip 3_door3 0 0 64 128 scale 0.5 0.5 mip detail d_woodsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\3_door_blocked1.tga +$mip 3_door_blocked1 0 0 64 128 scale 0.5 0.5 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\3_door_blocked2.tga +$mip 3_door_blocked2 0 0 64 128 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_market1.tga +$mip 3_market1 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_market1_bottom.tga +$mip 3_market1_bottom 0 0 64 64 scale 0.5 0.5 alt 3_market1.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_market1_top.tga +$mip 3_market1_top 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_market2.tga +$mip 3_market2 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_market2_bottom.tga +$mip 3_market2_bottom 0 0 64 64 scale 0.5 0.5 alt 3_market2.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_market2_top.tga +$mip 3_market2_top 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_market3.tga +$mip 3_market3 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_market3_bottom.tga +$mip 3_market3_bottom 0 0 64 64 scale 0.5 0.5 alt 3_market3.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_market3_top.tga +$mip 3_market3_top 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_market_door.tga +$mip 3_market_door 0 0 64 128 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_market_sign1.tga +$mip 3_market_sign1 0 0 64 64 scale 0.5 0.5 alt 3_market1.m32 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\3_market_sign2.tga +$mip 3_market_sign2 0 0 64 64 scale 0.5 0.5 alt 3_market1.m32 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\3_market_sign3.tga +$mip 3_market_sign3 0 0 64 64 scale 0.5 0.5 alt 3_market1.m32 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\3_market_window1.tga +$mip 3_market_window1 0 0 64 64 scale 0.5 0.5 alt 3_market_window2.m32 damage 3_market_window1d.m32 10 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_market_window2.tga +$mip 3_market_window2 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_orange.tga +$mip 3_orange 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_orange2.tga +$mip 3_orange2 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_orange2a.tga +$mip 3_orange2a 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_orange2b.tga +$mip 3_orange2b 0 0 64 64 scale 0.5 0.5 alt 3_orange2a.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_orange_bottom1.tga +$mip 3_orange_bottom1 0 0 64 64 scale 0.5 0.5 alt 3_orange2.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_orange_bottom2.tga +$mip 3_orange_bottom2 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_orange_window.tga +$mip 3_orange_window 0 0 64 64 scale 0.5 0.5 damage 3_orange_windowd.m32 20 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_orange_window2.tga +$mip 3_orange_window2 0 0 64 64 scale 0.5 0.5 damage 3_orange_window2d.m32 20 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_private.tga +$mip 3_private 0 0 64 32 scale 0.5 0.5 detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\3_store_brick1.tga +$mip 3_store_brick1 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_store_brick1_bottom.tga +$mip 3_store_brick1_bottom 0 0 64 64 scale 1 1 alt 3_store_brick1.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_store_brick2.tga +$mip 3_store_brick2 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_store_brick2_bottom.tga +$mip 3_store_brick2_bottom 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_store_brick3.tga +$mip 3_store_brick3 0 0 64 64 scale 1 1 alt 3_store_brick1.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_store_brick3_bottom.tga +$mip 3_store_brick3_bottom 0 0 64 64 scale 1 1 alt 3_store_brick3.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_store_brick_door.tga +$mip 3_store_brick_door 0 0 64 128 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\3_store_brick_window.tga +$mip 3_store_brick_window 0 0 64 64 scale 1 1 damage 3_store_brick_windowd.m32 10 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_store_trans.tga +$mip 3_store_trans 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_store_trans_bottom.tga +$mip 3_store_trans_bottom 0 0 64 64 scale 1 1 alt 3_store_trans.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_store_white.tga +$mip 3_store_white 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_store_white2.tga +$mip 3_store_white2 0 0 64 64 scale 1 1 alt 3_store_white.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_store_white_bottom.tga +$mip 3_store_white_bottom 0 0 64 64 scale 1 1 alt 3_store_white.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_store_white_bottom2.tga +$mip 3_store_white_bottom2 0 0 64 64 scale 1 1 alt 3_store_white.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\3_store_white_door.tga +$mip 3_store_white_door 0 0 64 128 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_store_white_sign1.tga +$mip 3_store_white_sign1 0 0 64 64 scale 1 1 alt 3_store_white.m32 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_store_white_sign2.tga +$mip 3_store_white_sign2 0 0 64 64 scale 1 1 alt 3_store_white.m32 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_store_white_sign3.tga +$mip 3_store_white_sign3 0 0 64 64 scale 1 1 alt 3_store_white.m32 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_store_white_sign4.tga +$mip 3_store_white_sign4 0 0 64 64 scale 1 1 alt 3_store_white.m32 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_store_white_sign5.tga +$mip 3_store_white_sign5 0 0 64 64 scale 1 1 alt 3_store_white.m32 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_store_white_sign6.tga +$mip 3_store_white_sign6 0 0 64 64 scale 1 1 alt 3_store_white.m32 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_street.tga +$mip 3_street 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_street2.tga +$mip 3_street2 0 0 64 64 scale 0.5 0.5 alt 3_street.m32 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_street_crack.tga +$mip 3_street_crack 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_street_crack_edge.tga +$mip 3_street_crack_edge 0 0 64 64 scale 0.5 0.5 alt 3_street_crack.m32 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_street_crack_trans1.tga +$mip 3_street_crack_trans1 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_street_crack_trans2.tga +$mip 3_street_crack_trans2 0 0 64 64 scale 0.5 0.5 alt 3_street_crack_trans1.m32 detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_street_edge1.tga +$mip 3_street_edge1 0 0 64 64 scale 0.5 0.5 alt 3_street.m32 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_street_edge2.tga +$mip 3_street_edge2 0 0 64 64 scale 0.5 0.5 alt 3_street.m32 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_street_middle.tga +$mip 3_street_middle 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_street_trans.tga +$mip 3_street_trans 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_sweatwall.tga +$mip 3_sweatwall 0 0 64 64 scale 0.5 0.5 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_sweatwall2.tga +$mip 3_sweatwall2 0 0 64 64 scale 0.5 0.5 alt 3_sweatwall.m32 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_sweatwall3.tga +$mip 3_sweatwall3 0 0 64 64 scale 0.5 0.5 alt 3_sweatwall.m32 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_sweatwall4.tga +$mip 3_sweatwall4 0 0 64 64 scale 0.5 0.5 alt 3_sweatwall.m32 damage 3_sweatwall4d.m32 1 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_sweatwall_bottom.tga +$mip 3_sweatwall_bottom 0 0 64 64 scale 0.5 0.5 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\3_sweatwall_top.tga +$mip 3_sweatwall_top 0 0 64 64 scale 0.5 0.5 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_sweatwall_top2.tga +$mip 3_sweatwall_top2 0 0 64 64 scale 0.5 0.5 alt 3_sweatwall_top.m32 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_sweatwall_top3.tga +$mip 3_sweatwall_top3 0 0 64 128 scale 0.5 0.5 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_tarpaper.tga +$mip 3_tarpaper 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_black +$load \art\textures\final\ny\3_tarpaper_cross.tga +$mip 3_tarpaper_cross 0 0 64 64 scale 0.5 0.5 alt 3_tarpaper.m32 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_black +$load \art\textures\final\ny\3_tarpaper_horiz.tga +$mip 3_tarpaper_horiz 0 0 64 64 scale 0.5 0.5 alt 3_tarpaper.m32 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_black +$load \art\textures\final\ny\3_tarpaper_vert.tga +$mip 3_tarpaper_vert 0 0 64 64 scale 0.5 0.5 alt 3_tarpaper.m32 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_black +$load \art\textures\final\ny\3_elevator_door.tga +$mip 3_elevator_door 0 0 64 128 scale 0.5 0.5 mip detail d_stonecracked.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\3_sweatfloor.tga +$mip 3_sweatfloor 0 0 64 64 scale 0.5 0.5 mip detail d_woodrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_lbrown +$load \art\textures\final\ny\3_sweat_ceil1.tga +$mip 3_sweat_ceil1 0 0 64 64 scale 0.5 0.5 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_white +$load \art\textures\final\ny\3_sweat_ceil1a.tga +$mip 3_sweat_ceil1a 0 0 64 64 scale 0.5 0.5 alt 3_sweat_ceil1.m32 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_white +$load \art\textures\final\ny\3_sweat_ceil_edge1.tga +$mip 3_sweat_ceil_edge1 0 0 64 64 scale 0.5 0.5 alt 3_sweat_ceil1.m32 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_white +$load \art\textures\final\ny\3_sweat_ceil_edge2.tga +$mip 3_sweat_ceil_edge2 0 0 64 64 scale 0.5 0.5 alt 3_sweat_ceil1.m32 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_white +$load \art\textures\final\ny\3_sweat_ceil_edge2a.tga +$mip 3_sweat_ceil_edge2a 0 0 64 64 scale 0.5 0.5 alt 3_sweat_ceil1.m32 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_white +$load \art\textures\final\ny\3_tow_sign.tga +$mip 3_tow_sign 0 0 64 64 scale 0.5 0.5 m_nomip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\sign10.tga +$mip sign10 0 0 64 64 scale 0.5 0.5 alt sign15.m32 m_parental spherical env1b.m32 +$load \art\textures\final\ny\sign5.tga +$mip sign5 0 0 64 64 scale 0.5 0.5 alt sign13b.m32 m_parental spherical env1a.m32 +$load \art\textures\final\ny\sign6.tga +$mip sign6 0 0 128 64 scale 0.5 0.5 alt sign8.m32 m_parental spherical env1b.m32 +$load \art\textures\final\ny\sign7.tga +$mip sign7 0 0 128 64 scale 0.5 0.5 alt sign8.m32 m_parental spherical env1b.m32 +$load \art\textures\final\ny\sign8.tga +$mip sign8 0 0 128 64 scale 0.5 0.5 spherical env1b.m32 +$load \art\textures\final\ny\sign9.tga +$mip sign9 0 0 64 64 scale 0.5 0.5 +$load \art\textures\final\ny\1_sign5.tga +$mip 1_sign5 0 0 64 64 scale 0.5 0.5 alt 1_lobby1a.m32 detail d_genericsmooth.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\1_sign6.tga +$mip 1_sign6 0 0 64 64 scale 0.5 0.5 spherical env1b.m32 material metal +$load \art\textures\final\ny\1_tile_graf10.tga +$mip 1_tile_graf10 0 0 128 64 scale 0.5 0.5 alt 1_tile_graf10b.m32 m_parental detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf11.tga +$mip 1_tile_graf11 0 0 128 64 scale 0.5 0.5 alt 1_tile_graf11b.m32 m_parental detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf12.tga +$mip 1_tile_graf12 0 0 64 64 scale 0.5 0.5 alt 1_tile_graf12b.m32 m_parental detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf13.tga +$mip 1_tile_graf13 0 0 64 64 scale 0.5 0.5 alt 1_tile.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\2_boiler_edge.tga +$mip 2_boiler_edge 0 0 64 64 scale 1 1 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal_waterjet +$load \art\textures\final\ny\2_boiler_side.tga +$mip 2_boiler_side 0 0 64 64 scale 1 1 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal_waterjet +$load \art\textures\final\ny\2_boiler_side1.tga +$mip 2_boiler_side1 0 0 128 64 scale 1 1 alt 2_boiler_side.m32 detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal_waterjet +$load \art\textures\final\ny\2_boiler_side2.tga +$mip 2_boiler_side2 0 0 128 64 scale 1 1 alt 2_boiler_side.m32 detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal_waterjet +$load \art\textures\final\ny\2_cinderblock_graf10.tga +$mip 2_cinderblock_graf10 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf11.tga +$mip 2_cinderblock_graf11 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 m_parental detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\2_cinderblock_graf2.tga +$mip 2_cinderblock_graf2 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock_graf2b.m32 m_parental detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf3.tga +$mip 2_cinderblock_graf3 0 0 128 64 scale 0.5 0.5 alt 2_cinderblock_graf3b.m32 m_parental detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf4.tga +$mip 2_cinderblock_graf4 0 0 128 64 scale 0.5 0.5 alt 2_cinderblock_graf6b.m32 m_parental detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf5.tga +$mip 2_cinderblock_graf5 0 0 128 64 scale 0.5 0.5 alt 2_cinderblock_graf2b.m32 m_parental detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf6.tga +$mip 2_cinderblock_graf6 0 0 128 64 scale 0.5 0.5 alt 2_cinderblock_graf6b.m32 m_parental detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf7.tga +$mip 2_cinderblock_graf7 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf8.tga +$mip 2_cinderblock_graf8 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock_graf8b.m32 m_parental detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf9.tga +$mip 2_cinderblock_graf9 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock_graf9b.m32 m_parental detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\3_door4.tga +$mip 3_door4 0 0 64 128 scale 0.5 0.5 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\3_door_blocked3.tga +$mip 3_door_blocked3 0 0 64 128 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_privatealley.tga +$mip 3_privatealley 0 0 64 32 scale 0.5 0.5 detail d_metalsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\sign11.tga +$mip sign11 0 0 128 64 scale 0.5 0.5 alt sign8.m32 m_parental spherical env1b.m32 +$load \art\textures\final\ny\1_lobby1.tga +$mip 1_lobby1 0 0 64 64 scale 0.5 0.5 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_lobby2.tga +$mip 1_lobby2 0 0 64 64 scale 0.5 0.5 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_lobby3.tga +$mip 1_lobby3 0 0 64 64 scale 0.5 0.5 mip detail d_stucco.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_lobby4.tga +$mip 1_lobby4 0 0 64 64 scale 0.5 0.5 alt 1_lobby3.m32 mip detail d_stucco.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_lobby1a.tga +$mip 1_lobby1a 0 0 64 64 scale 0.5 0.5 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_lobby_floor_edge.tga +$mip 1_lobby_floor_edge 0 0 64 64 scale 0.5 0.5 alt 1_lobby_floor.m32 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\1_turnstile_front.tga +$mip 1_turnstile_front 0 0 16 32 scale 0.5 0.5 spherical env1c.m32 material metal +$load \art\textures\final\ny\1_turnstile_side.tga +$mip 1_turnstile_side 0 0 16 32 scale 0.5 0.5 spherical env1c.m32 material metal +$load \art\textures\final\ny\bars1.tga +$mip bars1 0 0 64 64 scale 0.5 0.5 mip spherical env1c.m32 alpha material metal +$load \art\textures\final\ny\bars2.tga +$mip bars2 0 0 64 64 scale 0.5 0.5 mip spherical env1c.m32 alpha material metal +$load \art\textures\final\ny\ladder_rung.tga +$mip ladder_rung 0 0 32 16 scale 0.5 0.5 mip spherical env1c.m32 alpha material metal +$load \art\textures\final\ny\glass_bulletproof.tga +$mip Glass_bulletproof 0 0 64 64 scale 1 1 mip spherical env1b.m32 material glass +$load \art\textures\final\ny\glass_new.tga +$mip glass_new 0 0 64 64 scale 1 1 damage glass_newd.m32 20 mip spherical env1b.m32 material glass +$load \art\textures\final\ny\glass_new2.tga +$mip Glass_new2 0 0 128 128 scale 1 1 damage glass_new2d.m32 20 mip spherical env1b.m32 material glass +$load \art\textures\final\ny\glass_streaked.tga +$mip glass_streaked 0 0 64 64 scale 1 1 damage glass_streakedd.m32 20 mip material glass +$load \art\textures\final\ny\glass_window.tga +$mip glass_window 0 0 64 64 scale 1 1 damage glass_windowd.m32 20 mip material glass +$load \art\textures\final\ny\physics.tga +$mip PHYSICS 0 0 64 64 scale 0.5 0.5 +$load \art\textures\final\ny\2_watersteam.tga +$mip 2_watersteam 0 0 128 128 scale 1 1 mip material liquid_blue +$load \art\textures\final\ny\3_flatwood.tga +$mip 3_flatwood 0 0 64 64 scale 0.5 0.5 mip detail d_stonesmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\chainlink.tga +$mip chainlink 0 0 32 32 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1c.m32 alpha material metal +$load \art\textures\final\ny\3_dirt.tga +$mip 3_dirt 0 0 128 128 scale 1 1 mip detail d_gravel.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material gravel_dbrown +$load \art\textures\final\ny\3_mrust1.tga +$mip 3_mrust1 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_mrust2.tga +$mip 3_mrust2 0 0 64 64 scale 0.5 0.5 alt 3_mrust1.m32 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_mrust3.tga +$mip 3_mrust3 0 0 64 64 scale 0.5 0.5 alt 3_mrust1.m32 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_mrust4.tga +$mip 3_mrust4 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_mtrim2.tga +$mip 3_mtrim2 0 0 64 32 scale 0.5 0.5 mip detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\2_guage.tga +$mip 2_guage 0 0 16 16 scale 0.5 0.5 detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal_computer +$load \art\textures\final\ny\2_holes.tga +$mip 2_holes 0 0 32 32 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR alpha material metal +$load \art\textures\final\ny\grating4.tga +$mip grating4 0 0 32 32 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR alpha material metal +$load \art\textures\final\ny\3_metalside.tga +$mip 3_metalside 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\3_shingle.tga +$mip 3_shingle 0 0 64 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_grey +$load \art\textures\final\ny\window1.tga +$mip window1 0 0 64 64 scale 0.5 0.5 damage window1_d1.m32 10 mip alpha material glass +$load \art\textures\final\ny\window1_dirt.tga +$mip window1_dirt 0 0 64 64 scale 0.5 0.5 damage window1_dirt_d1.m32 10 mip alpha material glass +$load \art\textures\final\ny\window2.tga +$mip window2 0 0 64 64 scale 0.5 0.5 damage window2_d1.m32 10 mip alpha material glass +$load \art\textures\final\ny\window2_dirt.tga +$mip window2_dirt 0 0 64 64 scale 0.5 0.5 damage window2_dirt_d.m32 10 mip alpha material glass +$load \art\textures\final\ny\calendar.tga +$mip calendar 0 0 32 64 scale 0.5 0.5 alt calendar2b.m32 m_parental +$load \art\textures\final\ny\calendar2.tga +$mip calendar2 0 0 32 64 scale 0.5 0.5 alt calendar2b.m32 m_parental +$load \art\textures\final\ny\catwalk.tga +$mip catwalk 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 alpha material metal +$load \art\textures\final\ny\greenbox_front1.tga +$mip greenbox_front1 0 0 64 64 scale 0.5 0.5 damage greenbox_front3.m32 1 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\greenbox_front2.tga +$mip greenbox_front2 0 0 64 64 scale 0.5 0.5 damage greenbox_front3.m32 1 detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\greenbox_front3.tga +$mip greenbox_front3 0 0 64 64 scale 0.5 0.5 damage greenbox_front3d.m32 1 detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\greenbox_side.tga +$mip greenbox_side 0 0 16 16 scale 0.5 0.5 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\button1a.tga +$mip button1a 0 0 32 32 scale 0.5 0.5 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR anim button1b.m32 material metal +$load \art\textures\final\ny\button1b.tga +$mip button1b 0 0 32 32 scale 0.5 0.5 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\button2a.tga +$mip button2a 0 0 32 32 scale 0.5 0.5 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR anim button2b.m32 animspeed 2 light 2 material metal +$load \art\textures\final\ny\button2b.tga +$mip button2b 0 0 32 32 scale 0.5 0.5 damage button2d.m32 10 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR anim button2a.m32 animspeed 2 light 2 material metal +$load \art\textures\final\ny\exit.tga +$mip exit 0 0 64 32 scale 0.5 0.5 damage exitd.m32 10 light 30000 material glass_computer +$load \art\textures\final\ny\barbwire.tga +$mip barbwire 0 0 128 64 scale 0.5 0.5 detail d_metalsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1c.m32 alpha material metal +$load \art\textures\final\ny\meter1.tga +$mip Meter1 0 0 64 64 scale 0.5 0.5 damage meter1d.m32 1 detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\3_wareceiling1.tga +$mip 3_wareceiling1 0 0 128 128 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\3_woodfloor2.tga +$mip 3_woodfloor2 0 0 128 128 scale 0.5 0.5 mip detail d_woodrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\1_cork_ceiling_edge.tga +$mip 1_cork_ceiling_edge 0 0 64 64 scale 0.5 0.5 alt 1_cork_ceiling.m32 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material snow +$load \art\textures\final\ny\1_cork_ceiling_stain.tga +$mip 1_cork_ceiling_stain 0 0 64 64 scale 0.5 0.5 alt 1_cork_ceiling.m32 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material snow +$load \art\textures\final\ny\3_wall1b.tga +$mip 3_Wall1b 0 0 128 128 scale 0.5 0.5 alt 3_wall1.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\3_wall2_bottom.tga +$mip 3_Wall2_bottom 0 0 128 128 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\dryer16.tga +$mip dryer-16 0 0 16 16 scale 0.5 0.5 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\dryercontrol.tga +$mip dryer-control 0 0 64 16 scale 0.5 0.5 damage dryercontrold.m32 10 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\dryerfrt.tga +$mip dryer-frt 0 0 64 64 scale 0.5 0.5 damage dryerfrtd.m32 10 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\dryerside.tga +$mip dryer-side 0 0 64 64 scale 0.5 0.5 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\dryertop.tga +$mip dryer-top 0 0 64 64 scale 0.5 0.5 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\dump16.tga +$mip dump-16 0 0 16 16 scale 0.5 0.5 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\dumplid.tga +$mip dump-lid 0 0 64 64 scale 0.5 0.5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\washerfrt.tga +$mip washer-frt 0 0 64 64 scale 0.5 0.5 damage washerfrtd.m32 10 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\washertop.tga +$mip washer-top 0 0 64 64 scale 0.5 0.5 damage washertopd.m32 10 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\girdwall.tga +$mip girdwall 0 0 128 128 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\dumpbck.tga +$mip dumpbck 0 0 128 64 scale 0.5 0.5 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\dumpfrt.tga +$mip dumpfrt 0 0 128 32 scale 0.5 0.5 detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\light_blue.tga +$mip light_blue 0 0 32 32 scale 0.5 0.5 mip light 30000 material glass +$load \art\textures\final\ny\light_tube.tga +$mip light_tube 0 0 128 32 scale 0.5 0.5 mip light 30000 material glass +$load \art\textures\final\ny\light_yellow.tga +$mip light_yellow 0 0 32 32 scale 0.5 0.5 mip light 30000 material glass +$load \art\textures\final\ny\light_red.tga +$mip light_red 0 0 32 32 scale 0.5 0.5 mip light 30000 material glass +$load \art\textures\final\ny\light_bluey.tga +$mip light_bluey 0 0 32 32 scale 0.5 0.5 mip light 30000 material glass +$load \art\textures\final\ny\light_square.tga +$mip light_square 0 0 32 32 scale 0.5 0.5 mip light 30000 material glass +$load \art\textures\final\ny\3_store_brick_window2.tga +$mip 3_store_brick_window2 0 0 64 64 scale 1 1 damage 3_store_brick_window2d.m32 10 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\girdwall2.tga +$mip girdwall2 0 0 128 128 scale 1 1 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 alpha material metal +$load \art\textures\final\ny\1_build1_win1.tga +$mip 1_build1_win1 0 0 64 32 scale 1 1 damage 1_build1_win1d.m32 10 mip light 30000 material glass +$load \art\textures\final\ny\1_build1_win2.tga +$mip 1_build1_win2 0 0 64 32 scale 1 1 damage 1_build1_win2d.m32 10 mip material glass +$load \art\textures\final\ny\1_build2_win1.tga +$mip 1_build2_win1 0 0 32 32 scale 1 1 damage 1_build2_win1d.m32 10 mip light 30000 material glass +$load \art\textures\final\ny\1_build2_win2.tga +$mip 1_build2_win2 0 0 32 32 scale 1 1 damage 1_build2_win2d.m32 10 mip material glass +$load \art\textures\final\ny\mirror.tga +$mip mirror 0 0 64 64 scale 1 1 damage mirrord.m32 10 mip spherical env1b.m32 material glass +$load \art\textures\final\ny\sidewalk.tga +$mip sidewalk 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_lobby1aa.tga +$mip 1_lobby1aa 0 0 64 64 scale 0.5 0.5 alt 1_lobby1a.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_lobby1ab.tga +$mip 1_lobby1ab 0 0 64 64 scale 0.5 0.5 alt 1_lobby1a.m32 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_lobby1ac.tga +$mip 1_lobby1ac 0 0 64 64 scale 0.5 0.5 alt 1_lobby1a.m32 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_lobby1ad.tga +$mip 1_lobby1ad 0 0 64 64 scale 0.5 0.5 alt 1_lobby1a.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_lobby1ae.tga +$mip 1_lobby1ae 0 0 64 64 scale 0.5 0.5 alt 1_lobby1a.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_lobby1af.tga +$mip 1_lobby1af 0 0 128 64 scale 0.5 0.5 alt 1_lobby1a.m32 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_lobby1ag.tga +$mip 1_lobby1ag 0 0 128 64 scale 0.5 0.5 alt 1_lobby1agb.m32 m_parental detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_lobby1ah.tga +$mip 1_lobby1ah 0 0 64 64 scale 0.5 0.5 alt 1_lobby1a.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_tilegraf14.tga +$mip 1_tilegraf14 0 0 64 64 scale 0.5 0.5 alt 1_tile.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tilegraf15.tga +$mip 1_tilegraf15 0 0 64 64 scale 0.5 0.5 alt 1_tilegraf15b.m32 m_parental detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tilegraf16.tga +$mip 1_tilegraf16 0 0 64 64 scale 0.5 0.5 alt 1_tilegraf18.m32 m_parental detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tilegraf17.tga +$mip 1_tilegraf17 0 0 64 64 scale 0.5 0.5 alt 1_tile.m32 m_parental detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tilegraf18.tga +$mip 1_tilegraf18 0 0 64 64 scale 0.5 0.5 alt 1_tile.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tilegraf19.tga +$mip 1_tilegraf19 0 0 128 64 scale 0.5 0.5 alt 1_tilegraf19b.m32 m_parental detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tilegraf20.tga +$mip 1_tilegraf20 0 0 128 64 scale 0.5 0.5 alt 1_tile.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\2_cinderblock_graf12.tga +$mip 2_cinderblock_graf12 0 0 128 64 scale 0.5 0.5 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf13.tga +$mip 2_cinderblock_graf13 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf14.tga +$mip 2_cinderblock_graf14 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock_graf15.m32 m_parental detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf15.tga +$mip 2_cinderblock_graf15 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf16.tga +$mip 2_cinderblock_graf16 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 m_parental detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\file_front.tga +$mip file_front 0 0 32 64 scale 1 1 damage file_frontd2.m32 10 mip spherical env1b.m32 material metal +$load \art\textures\final\ny\file_side.tga +$mip file_side 0 0 32 64 scale 1 1 mip spherical env1b.m32 material metal +$load \art\textures\final\ny\file_top.tga +$mip file_top 0 0 32 32 scale 1 1 mip spherical env1b.m32 material metal +$load \art\textures\final\ny\2_cinderblock_graf19.tga +$mip 2_cinderblock_graf19 0 0 64 64 scale 0.5 0.5 alt 2_cinderblock.m32 m_parental detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf20.tga +$mip 2_cinderblock_graf20 0 0 128 64 scale 0.5 0.5 alt 2_cinderblock_graf20b.m32 m_parental detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\doordark1.tga +$mip doordark1 0 0 64 128 scale 1 1 mip spherical env1a.m32 material metal +$load \art\textures\final\ny\doordark2.tga +$mip doordark2 0 0 64 128 scale 1 1 mip spherical env1a.m32 material metal +$load \art\textures\final\ny\light_small.tga +$mip light_small 0 0 32 16 scale 1 1 mip light 30000 material glass +$load \art\textures\final\ny\1_hotdog1.tga +$mip 1_hotdog1 0 0 64 64 scale 1 1 alt 1_hotdog2.m32 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\1_hotdog2.tga +$mip 1_hotdog2 0 0 64 64 scale 1 1 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\1_hotdog3.tga +$mip 1_hotdog3 0 0 16 16 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material stone_red +$load \art\textures\final\ny\1_hotdog4.tga +$mip 1_hotdog4 0 0 32 32 scale 1 1 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\1_hotdog5.tga +$mip 1_hotdog5 0 0 16 32 scale 1 1 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\1_poster4.tga +$mip 1_poster4 0 0 64 64 scale 1 1 alt 1_poster3.m32 damage 1_poster4s.m32 10 spherical env1b.m32 material glass +$load \art\textures\final\ny\1_static1.tga +$mip 1_static1 0 0 64 64 scale 1 1 anim 1_static2.m32 animspeed 50 +$load \art\textures\final\ny\1_static2.tga +$mip 1_static2 0 0 64 64 scale 1 1 anim 1_static3.m32 animspeed 50 +$load \art\textures\final\ny\2_conduit.tga +$mip 2_conduit 0 0 16 16 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1c.m32 material metal_computer +$load \art\textures\final\ny\2_fuseside.tga +$mip 2_fuseside 0 0 16 16 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\light_tube1.tga +$mip light_tube1 0 0 64 32 scale 1 1 mip light 30000 material glass +$load \art\textures\final\ny\light_tube2.tga +$mip light_tube2 0 0 64 16 scale 1 1 mip light 30000 material glass +$load \art\textures\final\ny\sign12.tga +$mip sign12 0 0 128 64 scale 1 1 alt sign16.m32 m_parental spherical env1b.m32 +$load \art\textures\final\ny\sign13.tga +$mip sign13 0 0 128 128 scale 1 1 alt sign13b.m32 m_parental +$load \art\textures\final\ny\1_build1_win1d.tga +$mip 1_build1_win1d 0 0 64 32 scale 1 1 damage 1_build1_win2d.m32 40 mip material glass +$load \art\textures\final\ny\1_build1_win2d.tga +$mip 1_build1_win2d 0 0 64 32 scale 1 1 mip material glass +$load \art\textures\final\ny\1_build2_win1d.tga +$mip 1_build2_win1d 0 0 32 32 scale 1 1 damage 1_build2_win2d.m32 40 mip material glass +$load \art\textures\final\ny\1_build2_win2d.tga +$mip 1_build2_win2d 0 0 32 32 scale 1 1 mip material glass +$load \art\textures\final\ny\1_news_front1d.tga +$mip 1_news_front1d 0 0 64 64 scale 1 1 alt 1_news_frontbd.m32 material metal +$load \art\textures\final\ny\1_sign1d.tga +$mip 1_sign1d 0 0 128 32 scale 1 1 mip detail d_genericsmooth.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\1_sign2d.tga +$mip 1_sign2d 0 0 128 32 scale 1 1 mip detail d_genericsmooth.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\1_sign3d.tga +$mip 1_sign3d 0 0 128 32 scale 1 1 mip detail d_genericsmooth.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\2_fuse3d.tga +$mip 2_fuse3d 0 0 32 64 scale 1 1 mip material metal_computer +$load \art\textures\final\ny\3_store_brick_window2d.tga +$mip 3_store_brick_window2d 0 0 64 64 scale 1 1 damage 3_store_brick_windowd.m32 60 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_store_brick_windowd.tga +$mip 3_store_brick_windowd 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_sweatwall4d.tga +$mip 3_sweatwall4d 0 0 64 64 scale 1 1 alt 3_sweatwall.m32 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\dryercontrold.tga +$mip dryercontrold 0 0 64 16 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\dryerfrtd.tga +$mip dryerfrtd 0 0 64 64 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\exitd.tga +$mip exitd 0 0 64 32 scale 1 1 material glass_computer +$load \art\textures\final\ny\glass_new2d.tga +$mip glass_new2d 0 0 128 128 scale 1 1 mip spherical env1b.m32 material glass +$load \art\textures\final\ny\glass_newd.tga +$mip glass_newd 0 0 64 64 scale 1 1 mip spherical env1b.m32 material glass +$load \art\textures\final\ny\glass_streakedd.tga +$mip glass_streakedd 0 0 64 64 scale 1 1 mip material glass +$load \art\textures\final\ny\glass_windowd.tga +$mip glass_windowd 0 0 64 64 scale 1 1 mip material glass +$load \art\textures\final\ny\greenbox_front3d.tga +$mip greenbox_front3d 0 0 64 64 scale 1 1 detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\light_tubey.tga +$mip light_tubey 0 0 16 64 scale 1 1 mip light 30000 material glass +$load \art\textures\final\ny\mirrord.tga +$mip mirrord 0 0 64 64 scale 1 1 mip material metal +$load \art\textures\final\ny\washerfrtd.tga +$mip washerfrtd 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\washertopd.tga +$mip washertopd 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\window1_d1.tga +$mip window1_d1 0 0 64 64 scale 1 1 damage window1_d2.m32 40 mip material glass +$load \art\textures\final\ny\window1_d2.tga +$mip window1_d2 0 0 64 64 scale 1 1 mip material glass +$load \art\textures\final\ny\window1_dirt_d1.tga +$mip window1_dirt_d1 0 0 64 64 scale 1 1 damage window1_dirt_d2.m32 40 mip material glass +$load \art\textures\final\ny\window1_dirt_d2.tga +$mip window1_dirt_d2 0 0 64 64 scale 1 1 mip material glass +$load \art\textures\final\ny\window2_d1.tga +$mip window2_d1 0 0 64 64 scale 1 1 damage window2_d2.m32 10 mip material glass +$load \art\textures\final\ny\window2_d2.tga +$mip window2_d2 0 0 64 64 scale 1 1 mip material glass +$load \art\textures\final\ny\window2_dirt_d.tga +$mip window2_dirt_d 0 0 64 64 scale 1 1 mip material glass +$load \art\textures\final\ny\3_apt_windowd.tga +$mip 3_apt_windowd 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_grocery1_windowd.tga +$mip 3_grocery1_windowd 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_market_window1d.tga +$mip 3_market_window1d 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_orange_window2d.tga +$mip 3_orange_window2d 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_orange_windowd.tga +$mip 3_orange_windowd 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\file_frontd.tga +$mip file_frontd 0 0 32 64 scale 1 1 damage file_frontd2.m32 10 mip spherical env1b.m32 material metal +$load \art\textures\final\ny\3_redbrick_window_ad1.tga +$mip 3_redbrick_window_ad1 0 0 64 64 scale 1 1 damage 3_redbrick_window_ad2.m32 60 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_redbrick_window_ad2.tga +$mip 3_redbrick_window_ad2 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\d_genericsmooth.tga +$mip d_genericsmooth 0 0 64 64 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_gravel.tga +$mip d_gravel 0 0 64 64 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_metalbump.tga +$mip d_metalbump 0 0 32 32 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_metalribbed.tga +$mip d_metalribbed 0 0 64 64 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_metalrough.tga +$mip d_metalrough 0 0 64 64 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_metalsmooth.tga +$mip d_metalsmooth 0 0 64 64 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_sand.tga +$mip d_sand 0 0 64 64 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_stonecracked.tga +$mip d_stonecracked 0 0 64 64 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_stoneholey.tga +$mip d_stoneholey 0 0 64 64 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_stoneholey2.tga +$mip d_stoneholey2 0 0 64 64 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_stonerough.tga +$mip d_stonerough 0 0 128 128 scale 1 1 m_detail detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_stonesmooth.tga +$mip d_stonesmooth 0 0 64 64 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_stucco.tga +$mip d_stucco 0 0 64 64 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_woodrough.tga +$mip d_woodrough 0 0 64 64 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_woodsmooth.tga +$mip d_woodsmooth 0 0 64 64 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_tile.tga +$mip d_tile 0 0 32 32 scale 1 1 m_detail detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\1_clockd.tga +$mip 1_clockd 0 0 32 32 scale 1 1 material metal +$load \art\textures\final\ny\1_concrete_floor2.tga +$mip 1_concrete_floor2 0 0 128 128 scale 1 1 alt 1_concrete_floor.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\1_duct_rust.tga +$mip 1_duct_rust 0 0 64 64 scale 1 1 alt 1_duct2.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\1_poster4s.tga +$mip 1_poster4s 0 0 64 64 scale 1 1 alt 1_poster3.m32 spherical env1b.m32 material glass +$load \art\textures\final\ny\1_switch1d.tga +$mip 1_switch1d 0 0 16 32 scale 1 1 material metal +$load \art\textures\final\ny\2_cinderblock_bottom2.tga +$mip 2_cinderblock_bottom2 0 0 64 64 scale 1 1 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_oldceiling1ab.tga +$mip 2_oldceiling1ab 0 0 64 64 scale 1 1 alt 2_oldceiling1a.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_oldceiling1ab2.tga +$mip 2_oldceiling1ab2 0 0 64 64 scale 1 1 alt 2_oldceiling1a.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_oldwall2b.tga +$mip 2_oldwall2b 0 0 64 64 scale 1 1 alt 2_oldwall2.m32 mip detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\2_oldwall2c.tga +$mip 2_oldwall2c 0 0 64 64 scale 1 1 alt 2_oldwall2.m32 mip detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_subwood.tga +$mip 2_subwood 0 0 64 64 scale 1 1 mip material wood_dbrown +$load \art\textures\final\ny\2_subwood1.tga +$mip 2_subwood1 0 0 64 64 scale 1 1 mip material wood_dbrown +$load \art\textures\final\ny\2_wirewindow.tga +$mip 2_wirewindow 0 0 64 64 scale 0.5 0.5 detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\con1_drain.tga +$mip con1_drain 0 0 64 64 scale 1 1 alt con1.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\file_frontd2.tga +$mip file_frontd2 0 0 32 64 scale 1 1 mip material metal +$load \art\textures\final\ny\metalfloor1b.tga +$mip metalfloor1b 0 0 64 64 scale 1 1 alt metalfloor1.m32 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\trim3.tga +$mip trim3 0 0 32 32 scale 1 1 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_red +$load \art\textures\final\ny\wood1.tga +$mip wood1 0 0 64 64 scale 1 1 mip detail d_woodrough2.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\1_2_track2.tga +$mip 1_2_track2 0 0 16 32 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\1_2_subfloor_1a.tga +$mip 1_2_subfloor_1a 0 0 64 64 scale 1 1 alt 1_2_subfloor1.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_2_subfloor1.tga +$mip 1_2_subfloor1 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_2_track1.tga +$mip 1_2_track1 0 0 16 32 scale 1 1 alt 1_2_track2.m32 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\1_mapd.tga +$mip 1_mapd 0 0 128 64 scale 1 1 material glass +$load \art\textures\final\ny\2_anglebrk1.tga +$mip 2_anglebrk1 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_cinderblock_dirty1.tga +$mip 2_cinderblock_dirty1 0 0 64 64 scale 1 1 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\2_cinderblock_dirty1b.tga +$mip 2_cinderblock_dirty1b 0 0 64 64 scale 1 1 alt 2_cinderblock_dirty1.m32 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\2_cinderblock_dirty1c.tga +$mip 2_cinderblock_dirty1c 0 0 64 64 scale 1 1 alt 2_cinderblock_dirty1.m32 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\2_cinderblock_dirty1d.tga +$mip 2_cinderblock_dirty1d 0 0 64 64 scale 1 1 alt 2_cinderblock_dirty1c.m32 mip detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\2_cinderblock_dirty1e.tga +$mip 2_cinderblock_dirty1e 0 0 128 64 scale 1 1 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\2_door_2.tga +$mip 2_door_2 0 0 64 128 scale 1 1 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\2_oldwall3.tga +$mip 2_oldwall3 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\cargo_elev_but.tga +$mip cargo_elev_but 0 0 16 32 scale 1 1 damage cargo_elev_butd.m32 10 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\cargo_elev1.tga +$mip cargo_elev1 0 0 64 64 scale 1 1 alt cargo_elev2.m32 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\cargo_elev2.tga +$mip cargo_elev2 0 0 64 64 scale 1 1 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\cargo_elev3.tga +$mip cargo_elev3 0 0 64 64 scale 1 1 alt cargo_elev2.m32 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\cargo_elev4.tga +$mip cargo_elev4 0 0 64 64 scale 1 1 alt cargo_elev2.m32 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material wood_dbrown +$load \art\textures\final\ny\fanblade.tga +$mip fanblade 0 0 32 16 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1c.m32 material metal +$load \art\textures\final\ny\light_tube_d.tga +$mip light_tube_d 0 0 64 32 scale 1 1 mip material glass +$load \art\textures\final\ny\metal_panel.tga +$mip metal_panel 0 0 64 64 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\window_sky.tga +$mip window_sky 0 0 64 64 scale 1 1 mip material glass +$load \art\textures\final\ny\camera1.tga +$mip camera1 0 0 64 64 scale 1 1 anim camera2.m32 animspeed 1 light 1 +$load \art\textures\final\ny\camera2.tga +$mip camera2 0 0 64 64 scale 1 1 anim camera3.m32 animspeed 1 light 1 +$load \art\textures\final\ny\camera3.tga +$mip camera3 0 0 64 64 scale 1 1 anim camera1.m32 animspeed 1 light 1 +$load \art\textures\final\ny\con_ceil.tga +$mip con_ceil 0 0 64 64 scale 1 1 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\con10.tga +$mip con10 0 0 64 64 scale 1 1 mip detail d_metalribbed.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\con11.tga +$mip con11 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\con11_seam.tga +$mip con11_seam 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\con12.tga +$mip con12 0 0 32 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\con13.tga +$mip con13 0 0 128 128 scale 1 1 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\con14.tga +$mip con14 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\d_dirt.tga +$mip d_dirt 0 0 128 128 scale 1 1 m_detail detail d_dirt.m32 6 6 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_grass.tga +$mip d_grass 0 0 128 128 scale 1 1 m_detail detail d_grass.m32 6 6 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_woodrough2.tga +$mip d_woodrough2 0 0 64 64 scale 1 1 m_detail detail d_woodrough2.m32 6 6 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\d_woodsmooth2.tga +$mip d_woodsmooth2 0 0 64 64 scale 1 1 m_detail detail d_woodsmooth2.m32 6 6 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\rail.tga +$mip rail 0 0 16 16 scale 1 1 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1c.m32 material metal +$load \art\textures\final\ny\camerad.tga +$mip camerad 0 0 64 64 scale 1 1 mip material metal +$load \art\textures\final\ny\con_ceil2.tga +$mip con_ceil2 0 0 64 32 scale 1 1 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\sign14.tga +$mip sign14 0 0 64 64 scale 1 1 spherical env1b.m32 material metal +$load \art\textures\final\ny\w_boxside.tga +$mip w_boxside 0 0 64 64 scale 1 1 damage w_boxsided.m32 10 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\w_boxtop.tga +$mip w_boxtop 0 0 64 64 scale 1 1 damage w_boxtopd.m32 10 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\w_crate1.tga +$mip w_crate1 0 0 64 32 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\w_crate2.tga +$mip w_crate2 0 0 32 32 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\w_gardoor1.tga +$mip w_gardoor1 0 0 128 128 scale 1 1 alt w_gardoor3.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_gardoor2.tga +$mip w_gardoor2 0 0 128 128 scale 1 1 alt w_gardoor1.m32 mip m_parental detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_paintbrick1.tga +$mip w_paintbrick1 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\w_palette1.tga +$mip w_palette1 0 0 64 64 scale 1 1 mip detail d_woodrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_lbrown +$load \art\textures\final\ny\w_palette2.tga +$mip w_palette2 0 0 64 64 scale 1 1 mip detail d_woodrough2.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_lbrown +$load \art\textures\final\ny\w_pallette3.tga +$mip w_pallette3 0 0 64 64 scale 1 1 mip detail d_woodrough2.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_lbrown +$load \art\textures\final\ny\w_pntbrick2.tga +$mip w_pntbrick2 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\w_pntbrick3.tga +$mip w_pntbrick3 0 0 64 64 scale 1 1 alt w_pntbrick2.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\w_pntbrick4.tga +$mip w_pntbrick4 0 0 64 64 scale 1 1 alt w_pntbrick2.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_green +$load \art\textures\final\ny\w_semiback.tga +$mip w_semiback 0 0 64 128 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_semiside.tga +$mip w_semiside 0 0 64 128 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_shtmetal1.tga +$mip w_shtmetal1 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_shtmetal2.tga +$mip w_shtmetal2 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\w_window.tga +$mip w_window 0 0 64 64 scale 1 1 damage w_windowd.m32 1 mip material glass +$load \art\textures\final\ny\w_windowd.tga +$mip w_windowd 0 0 64 64 scale 1 1 mip material glass +$load \art\textures\final\ny\sign15.tga +$mip sign15 0 0 64 64 scale 1 1 alt sign9.m32 m_parental spherical env1b.m32 +$load \art\textures\final\ny\sign16.tga +$mip sign16 0 0 128 64 scale 1 1 alt sign6.m32 spherical env1b.m32 +$load \art\textures\final\ny\1_bath_towels.tga +$mip 1_bath_towels 0 0 64 128 scale 1 1 mip spherical env1b.m32 +$load \art\textures\final\ny\1_bath_stall.tga +$mip 1_bath_stall 0 0 64 64 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\1_bath_stalldoor.tga +$mip 1_bath_stalldoor 0 0 64 64 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\1_bath_stallurinal.tga +$mip 1_bath_stallurinal 0 0 32 64 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\1_beam3.tga +$mip 1_beam3 0 0 64 32 scale 1 1 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\1_clock2.tga +$mip 1_clock2 0 0 64 64 scale 1 1 damage 1_clock2d.m32 1 spherical env1b.m32 material glass_computer +$load \art\textures\final\ny\1_clock2d.tga +$mip 1_clock2d 0 0 64 64 scale 1 1 material metal +$load \art\textures\final\ny\1_sign7.tga +$mip 1_sign7 0 0 64 32 scale 1 1 spherical env1b.m32 material metal +$load \art\textures\final\ny\1_soda_side_ad.tga +$mip 1_soda_side_ad 0 0 64 64 scale 1 1 material sodabroke +$load \art\textures\final\ny\1_soda_side_bd.tga +$mip 1_soda_side_bd 0 0 64 32 scale 1 1 material sodabroke +$load \art\textures\final\ny\1_static_tv.tga +$mip 1_static_tv 0 0 32 32 scale 1 1 mip spherical env1b.m32 material metal_computer +$load \art\textures\final\ny\1_static3.tga +$mip 1_static3 0 0 64 64 scale 0.5 0.5 anim 1_static1.m32 animspeed 50 +$load \art\textures\final\ny\2_door3.tga +$mip 2_door3 0 0 64 128 scale 1 1 mip m_spherical detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\2_oldwall3_bot.tga +$mip 2_oldwall3_bot 0 0 64 64 scale 1 1 alt 2_oldwall3.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_pipe_int.tga +$mip 2_pipe_int 0 0 64 64 scale 1 1 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\2_pipe_int2.tga +$mip 2_pipe_int2 0 0 64 64 scale 1 1 alt 2_pipe_int.m32 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\2_sign5.tga +$mip 2_sign5 0 0 64 32 scale 1 1 detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\con15.tga +$mip con15 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\con15b.tga +$mip con15b 0 0 64 64 scale 1 1 alt con15.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\metalrib1b.tga +$mip metalrib1b 0 0 32 32 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\3_door5.tga +$mip 3_door5 0 0 64 128 scale 1 1 mip detail d_woodrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\s_asphalt.tga +$mip s_asphalt 0 0 64 64 scale 1 1 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\s_curb.tga +$mip s_curb 0 0 16 128 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\s_sidewalk.tga +$mip s_sidewalk 0 0 128 128 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_build_win.tga +$mip 1_build_win 0 0 64 64 scale 1 1 damage 1_build_wind.m32 10 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_door6.tga +$mip 3_door6 0 0 64 128 scale 1 1 mip detail d_woodrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\1_beam4.tga +$mip 1_beam4 0 0 64 32 scale 1 1 alt 1_beam3.m32 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\1_news_frontbd.tga +$mip 1_news_frontbd 0 0 64 64 scale 1 1 material metal +$load \art\textures\final\ny\2_brick4.tga +$mip 2_brick4 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_brick4bot.tga +$mip 2_brick4bot 0 0 64 64 scale 1 1 alt 2_brick4.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_brick5.tga +$mip 2_brick5 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_brick5bot.tga +$mip 2_brick5bot 0 0 64 64 scale 1 1 alt 2_brick5.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_cinderbloc.tga +$mip 2_cinderbloc 0 0 32 16 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_conwall1.tga +$mip 2_conwall1 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\2_conwall1bot.tga +$mip 2_conwall1bot 0 0 64 32 scale 1 1 mip detail d_stonerough.m32 4 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\2_conwall2.tga +$mip 2_conwall2 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\2_conwall2bot.tga +$mip 2_conwall2bot 0 0 64 32 scale 1 1 mip detail d_stonerough.m32 4 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\2_open_box2d.tga +$mip 2_open_box2d 0 0 64 64 scale 1 1 detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\2_open_boxd.tga +$mip 2_open_boxd 0 0 64 64 scale 1 1 detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\3_grocery1_window_l.tga +$mip 3_grocery1_window_l 0 0 64 64 scale 1 1 damage 3_grocery1_window_ld.m32 5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_grocery1_window_ld.tga +$mip 3_grocery1_window_ld 0 0 64 64 scale 1 1 damage 3_grocery1_window.m32 5 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_grocery1_window_wide_l.tga +$mip 3_grocery1_window_wide_l 0 0 128 64 scale 1 1 damage 3_grocery1_window_wide_ld.m32 10 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\barrel.tga +$mip barrel 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal_oilspurt +$load \art\textures\final\ny\contrim1.tga +$mip contrim1 0 0 128 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\meter1d.tga +$mip meter1d 0 0 64 64 scale 1 1 detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\pipe_insul1a.tga +$mip pipe_insul1a 0 0 32 32 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\pipe_insul1b.tga +$mip pipe_insul1b 0 0 32 32 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\pipe_insul2a.tga +$mip pipe_insul2a 0 0 32 32 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\pipe_insul2b.tga +$mip pipe_insul2b 0 0 32 32 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\s_asphalt_hole.tga +$mip s_asphalt_hole 0 0 64 64 scale 1 1 alt s_asphalt.m32 detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\2_brick6.tga +$mip 2_brick6 0 0 64 64 scale 1 1 alt 2_brick5.m32 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\2_dirt_floor.tga +$mip 2_dirt_floor 0 0 64 64 scale 1 1 mip detail d_gravel.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material gravel_dbrown +$load \art\textures\final\ny\2_dirt_floor2.tga +$mip 2_dirt_floor2 0 0 64 64 scale 1 1 alt 2_dirt_floor.m32 mip detail d_gravel.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material gravel_dbrown +$load \art\textures\final\ny\barrel_top.tga +$mip barrel_top 0 0 32 32 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal_oilspurt +$load \art\textures\final\ny\pipe_cap.tga +$mip pipe_cap 0 0 64 64 scale 1 1 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\glass_wire.tga +$mip glass_wire 0 0 64 64 scale 1 1 damage glass_wire_d.m32 1 material glass +$load \art\textures\final\ny\glass_wire_d.tga +$mip glass_wire_d 0 0 64 64 scale 1 1 material glass +$load \art\textures\final\ny\3_grocery2_dark.tga +$mip 3_grocery2_dark 0 0 64 64 scale 1 1 mip detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_grocery2_dark_btm.tga +$mip 3_grocery2_dark_btm 0 0 64 64 scale 1 1 alt 3_grocery2_dark.m32 mip detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_woodfence_alpha.tga +$mip 3_woodfence_alpha 0 0 64 128 scale 1 1 mip detail d_woodrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\barrel_big_end.tga +$mip barrel_big_end 0 0 64 64 scale 1 1 alt barrel_big_endb.m32 m_parental detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal_oilspurt +$load \art\textures\final\ny\tire1.tga +$mip tire1 0 0 64 32 scale 1 1 mip material metal +$load \art\textures\final\ny\tire2.tga +$mip tire2 0 0 64 32 scale 1 1 mip material metal +$load \art\textures\final\ny\w_gardoor3.tga +$mip w_gardoor3 0 0 128 128 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_semiback2.tga +$mip w_semiback2 0 0 64 128 scale 1 1 alt w_semiback.m32 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\w_semiback3.tga +$mip w_semiback3 0 0 64 128 scale 1 1 alt w_semiback.m32 mip m_parental detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_semiside2.tga +$mip w_semiside2 0 0 64 128 scale 1 1 alt w_semiside.m32 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\w_semiside3.tga +$mip w_semiside3 0 0 64 128 scale 1 1 alt w_semiside.m32 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\window_paned.tga +$mip window_paned 0 0 64 64 scale 1 1 mip material glass +$load \art\textures\final\ny\ammobox_end.tga +$mip ammobox_end 0 0 32 32 scale 1 1 mip detail d_woodrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\ammobox_side.tga +$mip ammobox_side 0 0 64 32 scale 1 1 mip detail d_woodrough2.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\ammobox_top.tga +$mip ammobox_top 0 0 64 32 scale 1 1 damage ammobox_topd.m32 10 detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\ammobox_topd.tga +$mip ammobox_topd 0 0 64 32 scale 1 1 detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\crate1a.tga +$mip crate1a 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\crate1b.tga +$mip crate1b 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\crate2a.tga +$mip crate2a 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\crate2b.tga +$mip crate2b 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\crate3a.tga +$mip crate3a 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\crate3b.tga +$mip crate3b 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\crate4a.tga +$mip crate4a 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\crate4b.tga +$mip crate4b 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\w_crete1.tga +$mip w_crete1 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\w_metalwall1.tga +$mip w_metalwall1 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\w_win1_noalpha.tga +$mip w_win1_noalpha 0 0 64 64 scale 1 1 damage w_win1_noalphad1.m32 1 mip material glass +$load \art\textures\final\ny\w_win1_noalphad1.tga +$mip w_win1_noalphad1 0 0 64 64 scale 1 1 mip material glass +$load \art\textures\final\ny\w_win1_noalphad2.tga +$mip w_win1_noalphad2 0 0 64 64 scale 1 1 mip material glass +$load \art\textures\final\ny\w_win2_noalpha.tga +$mip w_win2_noalpha 0 0 64 64 scale 1 1 damage window2_dirt_d2.m32 10 mip material glass +$load \art\textures\final\ny\w_win3_noalpha.tga +$mip w_win3_noalpha 0 0 64 64 scale 1 1 damage w_win3_noalphad.m32 1 mip material glass +$load \art\textures\final\ny\w_win4_noalpha.tga +$mip w_win4_noalpha 0 0 64 64 scale 1 1 damage w_win4_noalphad.m32 1 mip material glass +$load \art\textures\final\ny\w_win4_noalphad.tga +$mip w_win4_noalphad 0 0 64 64 scale 1 1 mip material glass +$load \art\textures\final\ny\3_grocery2_bottom_g1.tga +$mip 3_grocery2_bottom_g1 0 0 64 64 scale 1 1 alt 3_grocery2_bottom.m32 mip detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\3_grocery2_bottom_g2.tga +$mip 3_grocery2_bottom_g2 0 0 128 64 scale 1 1 alt 3_grocery2_bottom.m32 detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\w_crane_beam1.tga +$mip w_crane_beam1 0 0 16 16 scale 1 1 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\w_crane_beam1a.tga +$mip w_crane_beam1a 0 0 128 128 scale 1 1 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\w_crane_body_vent.tga +$mip w_crane_body_vent 0 0 32 32 scale 1 1 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\w_crane_body1.tga +$mip w_crane_body1 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\w_crane_body1a.tga +$mip w_crane_body1a 0 0 64 64 scale 1 1 alt w_crane_body1.m32 detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\w_crane_cab.tga +$mip w_crane_cab 0 0 16 16 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_crane_weight.tga +$mip w_crane_weight 0 0 64 64 scale 1 1 alt w_crane_weight2.m32 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\w_crane_weight2.tga +$mip w_crane_weight2 0 0 64 64 scale 1 1 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\w_fencewheel.tga +$mip w_fencewheel 0 0 32 32 scale 1 1 mip material metal +$load \art\textures\final\ny\w_gardoor3_g1.tga +$mip w_gardoor3_g1 0 0 128 128 scale 1 1 alt w_gardoor3.m32 mip m_parental detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_rustwall1.tga +$mip w_rustwall1 0 0 64 64 scale 1 1 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_rustwall2.tga +$mip w_rustwall2 0 0 64 64 scale 1 1 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_rustwall3.tga +$mip w_rustwall3 0 0 128 128 scale 1 1 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_rustwall3a.tga +$mip w_rustwall3a 0 0 128 128 scale 1 1 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_rustwall4.tga +$mip w_rustwall4 0 0 64 64 scale 1 1 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_rustwall5.tga +$mip w_rustwall5 0 0 64 64 scale 1 1 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_rustwall6.tga +$mip w_rustwall6 0 0 64 64 scale 1 1 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_shtmetal_1_g1.tga +$mip w_shtmetal_1_g1 0 0 128 64 scale 1 1 alt w_shtmetal1.m32 detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_shtmetal_1_g2.tga +$mip w_shtmetal_1_g2 0 0 128 64 scale 1 1 alt w_shtmetal_1_g1.m32 m_parental detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_shtmetal_1_g3.tga +$mip w_shtmetal_1_g3 0 0 64 64 scale 1 1 alt w_shtmetal1.m32 detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_shtmetal_1a.tga +$mip w_shtmetal_1a 0 0 64 64 scale 1 1 alt w_shtmetal1.m32 detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_shtmetal_1b.tga +$mip w_shtmetal_1b 0 0 64 64 scale 1 1 alt w_shtmetal1.m32 detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_shtmetal_1c.tga +$mip w_shtmetal_1c 0 0 64 64 scale 1 1 alt w_shtmetal1.m32 detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_shtmetal_1d.tga +$mip w_shtmetal_1d 0 0 64 64 scale 1 1 alt w_shtmetal1.m32 detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_shtmetal_1e.tga +$mip w_shtmetal_1e 0 0 64 64 scale 1 1 alt w_shtmetal1.m32 detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_shtmetal_1f.tga +$mip w_shtmetal_1f 0 0 64 64 scale 1 1 alt w_shtmetal1.m32 detail d_stonerough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_rustwall1a.tga +$mip w_rustwall1a 0 0 64 64 scale 1 1 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_rustwall4b.tga +$mip w_rustwall4b 0 0 64 64 scale 1 1 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\3_door_5_b.tga +$mip 3_door_5_b 0 0 64 128 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\3_door6_burn.tga +$mip 3_door6_burn 0 0 64 128 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\3_elevator_but.tga +$mip 3_elevator_but 0 0 32 64 scale 1 1 damage 3_elevator_butd.m32 10 mip spherical env1b.m32 material metal_computer +$load \art\textures\final\ny\3_slats.tga +$mip 3_slats 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_grey +$load \art\textures\final\ny\sign17.tga +$mip sign17 0 0 64 128 scale 1 1 alt sign18.m32 damage sign17_d.m32 40 m_detail m_parental animspeed 1 light 3000 material glass_computer +$load \art\textures\final\ny\sign18.tga +$mip sign18 0 0 64 128 scale 1 1 damage sign18_d.m32 40 light 3000 +$load \art\textures\final\ny\3_elevator_door_2b.tga +$mip 3_elevator_door_2b 0 0 64 128 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\3_sweat_trim.tga +$mip 3_sweat_trim 0 0 8 8 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\3_sweat_trim1.tga +$mip 3_sweat_trim1 0 0 32 16 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\3_elevator_sign.tga +$mip 3_elevator_sign 0 0 64 32 scale 1 1 detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\3_store_end.tga +$mip 3_store_end 0 0 32 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\3_store_flr_burn.tga +$mip 3_store_flr_burn 0 0 128 128 scale 1 1 mip detail d_metalbump.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\3_store_flr_burn2.tga +$mip 3_store_flr_burn2 0 0 128 128 scale 1 1 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\3_storewall_burn.tga +$mip 3_storewall_burn 0 0 128 128 scale 1 1 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\3_sweat_bars.tga +$mip 3_sweat_bars 0 0 32 32 scale 1 1 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\3_sweat_ceil2.tga +$mip 3_sweat_ceil2 0 0 64 64 scale 1 1 alt 3_sweat_ceil1.m32 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_white +$load \art\textures\final\ny\3_sweat_flr.tga +$mip 3_sweat_flr 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\3_sweat_flr_trim.tga +$mip 3_sweat_flr_trim 0 0 32 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\no_draw.tga +$mip no_draw 0 0 64 64 scale 1 1 nodraw +$load \art\textures\final\ny\sky.tga +$mip sky 0 0 64 64 scale 1 1 +$load \art\textures\final\ny\3_door_5_burn.tga +$mip 3_door_5_burn 0 0 64 128 scale 1 1 mip detail d_woodsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\3_store_flr_burn3.tga +$mip 3_store_flr_burn3 0 0 64 128 scale 1 1 mip detail d_gravel.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_grey +$load \art\textures\final\ny\3_storewall_burn_btm.tga +$mip 3_storewall_burn_btm 0 0 128 128 scale 1 1 alt 3_storewall_burn.m32 mip detail d_stucco.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\crate2a_burn.tga +$mip crate2a_burn 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\crate2b_burn.tga +$mip crate2b_burn 0 0 64 64 scale 1 1 mip detail d_genericsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\3_door7.tga +$mip 3_door7 0 0 64 128 scale 1 1 mip detail d_woodsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material wood_dbrown +$load \art\textures\final\ny\3_store_white_top.tga +$mip 3_store_white_top 0 0 64 32 scale 1 1 mip detail d_stonerough.m32 4 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\testwtr.tga +$mip testwtr 0 0 128 128 scale 1 1 mip material liquid_green +$load \art\textures\final\ny\glass.tga +$mip glass 0 0 32 32 scale 1 1 mip spherical env1b.m32 material glass +$load \art\textures\final\ny\button2d.tga +$mip button2d 0 0 32 32 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\w_win3_noalphad.tga +$mip w_win3_noalphad 0 0 64 64 scale 1 1 mip material glass +$load \art\textures\final\ny\grenade.tga +$mip grenade 0 0 16 16 scale 1 1 mip detail d_genericsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\2_steelceilb.tga +$mip 2_steelceilb 0 0 64 64 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\2_steelwalla.tga +$mip 2_steelwalla 0 0 64 128 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\2_steelwallb.tga +$mip 2_steelwallb 0 0 64 128 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\2_steelwallc5.tga +$mip 2_steelwallc5 0 0 64 64 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\2_steelwallh.tga +$mip 2_steelwallh 0 0 64 128 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\2_steelwallred.tga +$mip 2_steelwallred 0 0 128 128 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\2_steelwallredb.tga +$mip 2_steelwallredb 0 0 128 128 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\3_catwalk2.tga +$mip 3_catwalk2 0 0 64 64 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\3_cweighta.tga +$mip 3_cweighta 0 0 64 32 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal +$load \art\textures\final\ny\3_meter3.tga +$mip 3_meter3 0 0 64 64 scale 1 1 detail d_metalsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\3_oiltank2plain.tga +$mip 3_oiltank2plain 0 0 64 64 scale 1 1 mip detail d_metalsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1a.m32 material metal_oilspurt +$load \art\textures\final\ny\3_panel2.tga +$mip 3_panel2 0 0 64 64 scale 1 1 damage 3_panel2d.m32 10 detail d_metalsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material glass_computer +$load \art\textures\final\ny\3_panel2d.tga +$mip 3_panel2d 0 0 64 64 scale 1 1 detail d_metalsmooth.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\3_panel7.tga +$mip 3_panel7 0 0 128 64 scale 1 1 damage 3_panel7d.m32 10 spherical env1b.m32 material metal_computer +$load \art\textures\final\ny\3_panel7d.tga +$mip 3_panel7d 0 0 128 64 scale 1 1 material metal_computer +$load \art\textures\final\ny\3_pipes2.tga +$mip 3_pipes2 0 0 64 32 scale 1 1 mip spherical env1b.m32 material metal_steam +$load \art\textures\final\ny\h_cretewall.tga +$mip h_cretewall 0 0 64 64 scale 1 1 mip detail d_stonesmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\h_cretewall_dirty.tga +$mip h_cretewall_dirty 0 0 64 64 scale 1 1 mip detail d_stonesmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\h_cretewall_plain.tga +$mip h_cretewall_plain 0 0 64 64 scale 1 1 mip detail d_stonesmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\h_cretewall_yellow.tga +$mip h_cretewall_yellow 0 0 64 64 scale 1 1 mip detail d_stonesmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\h_heli_land_b.tga +$mip h_heli_land_b 0 0 64 64 scale 1 1 mip detail d_stonesmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\h_heli_land_c.tga +$mip h_heli_land_c 0 0 64 64 scale 1 1 mip detail d_stonesmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\h_heli_land_d.tga +$mip h_heli_land_d 0 0 64 64 scale 1 1 mip detail d_stonesmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\h_heli_land1.tga +$mip h_heli_land1 0 0 64 64 scale 1 1 mip detail d_stonesmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\h_light5.tga +$mip h_light5 0 0 32 32 scale 1 1 mip material glass +$load \art\textures\final\ny\h_yardfloor.tga +$mip h_yardfloor 0 0 128 128 scale 1 1 mip detail d_stonecracked.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dbrown +$load \art\textures\final\ny\light_tiny_yellow.tga +$mip light_tiny_yellow 0 0 16 16 scale 1 1 mip material glass +$load \art\textures\final\ny\pipe3b.tga +$mip pipe3b 0 0 128 128 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal +$load \art\textures\final\ny\cargo_elev_butd.tga +$mip cargo_elev_butd 0 0 16 32 scale 1 1 detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal_computer +$load \art\textures\final\ny\1_build_wind.tga +$mip 1_build_wind 0 0 64 64 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_elevator_butd.tga +$mip 3_elevator_butd 0 0 32 64 scale 1 1 mip material metal_computer +$load \art\textures\final\ny\3_grocery1_window_wide_ld.tga +$mip 3_grocery1_window_wide_ld 0 0 128 64 scale 1 1 mip detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\3_grocery1_window_wided.tga +$mip 3_grocery1_window_wided 0 0 128 64 scale 1 1 damage 3_grocery1_window_wided.m32 10 mip detail d_stonerough.m32 0 0 0 0 0 GL_DST_COLOR GL_SRC_COLOR material glass +$load \art\textures\final\ny\w_boxsided.tga +$mip w_boxsided 0 0 64 64 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\w_boxtopd.tga +$mip w_boxtopd 0 0 64 64 scale 1 1 mip detail d_metalsmooth.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR +$load \art\textures\final\ny\nukebox_a.tga +$mip nukebox_a 0 0 64 32 scale 1 1 mip spherical env1c.m32 material metal +$load \art\textures\final\ny\nukebox_b.tga +$mip nukebox_b 0 0 32 32 scale 1 1 mip spherical env1c.m32 material metal +$load \art\textures\final\ny\sign17_d.tga +$mip sign17_d 0 0 64 128 scale 1 1 alt sign18_d.m32 m_parental material metal +$load \art\textures\final\ny\sign18_d.tga +$mip sign18_d 0 0 64 128 scale 1 1 material metal +$load \art\textures\final\ny\1_lobby1agb.tga +$mip 1_lobby1agb 0 0 128 64 scale 1 1 alt 1_lobby1a.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lgrey +$load \art\textures\final\ny\1_sign4b.tga +$mip 1_sign4b 0 0 128 32 scale 1 1 detail d_genericsmooth.m32 2 2 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal +$load \art\textures\final\ny\1_tile_graf10b.tga +$mip 1_tile_graf10b 0 0 128 64 scale 1 1 alt 1_tile.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf11b.tga +$mip 1_tile_graf11b 0 0 128 64 scale 1 1 alt 1_tile.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf12b.tga +$mip 1_tile_graf12b 0 0 64 64 scale 1 1 alt 1_tile_graf4.m32 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf2b.tga +$mip 1_tile_graf2b 0 0 64 64 scale 1 1 alt 1_tile_graf4.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf5b.tga +$mip 1_tile_graf5b 0 0 64 64 scale 1 1 alt 1_tile_graf4.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tile_graf9b.tga +$mip 1_tile_graf9b 0 0 64 64 scale 1 1 alt 1_tile_graf4.m32 mip detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tilegraf15b.tga +$mip 1_tilegraf15b 0 0 64 64 scale 1 1 alt 1_tile_graf4.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\1_tilegraf19b.tga +$mip 1_tilegraf19b 0 0 128 64 scale 1 1 alt 1_tile.m32 detail d_tile.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_lbrown +$load \art\textures\final\ny\2_cinderblock_graf16b.tga +$mip 2_cinderblock_graf16b 0 0 64 64 scale 1 1 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf19b.tga +$mip 2_cinderblock_graf19b 0 0 64 64 scale 1 1 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf20b.tga +$mip 2_cinderblock_graf20b 0 0 128 64 scale 1 1 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf2b.tga +$mip 2_cinderblock_graf2b 0 0 64 64 scale 1 1 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf3b.tga +$mip 2_cinderblock_graf3b 0 0 128 64 scale 1 1 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf6b.tga +$mip 2_cinderblock_graf6b 0 0 128 64 scale 1 1 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf8b.tga +$mip 2_cinderblock_graf8b 0 0 64 64 scale 1 1 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\2_cinderblock_graf9b.tga +$mip 2_cinderblock_graf9b 0 0 64 64 scale 1 1 alt 2_cinderblock.m32 detail d_metalbump.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR material stone_dgrey +$load \art\textures\final\ny\barrel_big_endb.tga +$mip barrel_big_endb 0 0 64 64 scale 1 1 detail d_stonerough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1b.m32 material metal_oilspurt +$load \art\textures\final\ny\calendar2b.tga +$mip calendar2b 0 0 32 64 scale 1 1 spherical env1a.m32 +$load \art\textures\final\ny\sign13b.tga +$mip sign13b 0 0 128 128 scale 1 1 spherical env1b.m32 +$load \art\textures\final\ny\1_sign8.tga +$mip 1_sign8 0 0 128 32 scale 1 1 spherical env1b.m32 material glass_computer +$load \art\textures\final\ny\window2_dirt_d2.tga +$mip window2_dirt_d2 0 0 64 64 scale 1 1 mip material glass +$load \art\textures\final\ny\1_button_off.tga +$mip 1_button_off 0 0 32 32 scale 1 1 mip spherical env1c.m32 anim 1_button_on.m32 material metal +$load \art\textures\final\ny\1_button_on.tga +$mip 1_button_on 0 0 32 32 scale 1 1 mip spherical env1c.m32 material metal +$load \art\textures\final\ny\chain1.tga +$mip chain1 0 0 16 64 scale 1 1 detail d_metalrough.m32 4 4 0 0 0 GL_DST_COLOR GL_SRC_COLOR spherical env1c.m32 material metal +$load \art\textures\final\ny\med_door.tga +$mip med_door 0 0 32 32 scale 1 1 mip spherical env1b.m32 +$load \art\textures\final\ny\med_inside.tga +$mip med_inside 0 0 32 32 scale 1 1 mip anim med_inside_used.m32 +$load \art\textures\final\ny\med_inside_used.tga +$mip med_inside_used 0 0 32 32 scale 1 1 mip +$load \art\textures\final\ny\med_sides.tga +$mip med_sides 0 0 16 16 scale 1 1 mip spherical env1b.m32 +$load \art\textures\final\ny\env1a.tga +$mip env1a 0 0 256 256 scale 1 1 m_nomip m_spherical +$load \art\textures\final\ny\env1b.tga +$mip env1b 0 0 256 256 scale 1 1 m_nomip m_spherical +$load \art\textures\final\ny\env1c.tga +$mip env1c 0 0 256 256 scale 1 1 m_nomip m_spherical +$load \art\textures\final\ny\med_red.tga +$mip med_red 0 0 16 16 scale 1 1 +$load \art\textures\final\ny\med_sign.tga +$mip med_sign 0 0 64 64 scale 1 1 +$load \art\textures\final\ny\med_stripe.tga +$mip med_stripe 0 0 16 16 scale 1 1 +$load \art\textures\final\ny\ctfb_base.tga +$mip ctfb_base 0 0 64 64 scale 1 1 material stone_lgrey +$load \art\textures\final\ny\ctfr_base.tga +$mip ctfr_base 0 0 64 64 scale 1 1 material stone_lgrey +$load \art\textures\final\ny\1_mtrim1.tga +$mip 1_mtrim1 0 0 64 32 scale 1 1 mip detail d_metalrough.m32 8 8 0 0 0 GL_DST_COLOR GL_SRC_COLOR material metal diff --git a/Source/Game/client/amd3d.h b/Source/Game/client/amd3d.h new file mode 100644 index 0000000..84373cd --- /dev/null +++ b/Source/Game/client/amd3d.h @@ -0,0 +1,447 @@ +// Filename:- amd3d.h +// +// Macros to support AMD 3DNow! instructions with MS Visual C++ +// +// +;/****************************************************************** +; * +; * Copyright (c) 1996-1998 ADVANCED MICRO DEVICES, INC. +; * All Rights reserved. +; * +; * This software is unpublished and contains the trade secrets +; * and confidential proprietary information of AMD. Unless +; * otherwise provided in the Software Agreement associated +; * herewith, it is licensed in confidence "AS IS" and +; * is not to be reproduced in whole or part by any means except +; * for backup. Use, duplication, or disclosure by the Government +; * is subject to the restrictions in paragraph(b)(3)(B)of the +; * Rights in Technical Data and Computer Software clause in +; * DFAR 52.227-7013(a)(Oct 1988). Software owned by Advanced +; * Micro Devices Inc., One AMD Place, P.O. Box 3453, Sunnyvale, +; * CA 94088-3453. +; * +; ****************************************************************** + * + * AMD3D.H + * + * MACRO FORMAT + * ============ + * This file contains inline assembly macros that + * generate AMD-3D instructions in binary format. + * Therefore, C or C++ programmer can use AMD-3D instructions + * without any penalty in their C or C++ source code. + * + * The macro's name and format conventions are as follow: + * + * + * 1. First argument of macro is a destination and + * second argument is a source operand. + * ex) _asm PFCMPEQ (m3, m4) + * | | + * dst src + * + * 2. The destination operand can be m0 to m7 only. + * The source operand can be any one of the register + * m0 to m7 or _eax, _ecx, _edx, _ebx, _esi, or _edi + * that contains effective address. + * ex) _asm PFRCP (M7, M6) + * ex) _asm PFRCPIT2 (m0, m4) + * ex) _asm PFMUL (m3, _edi) + * + * 3. The prefetch(w) takes one src operand _eax, ecx, _edx, + * _ebx, _esi, or _edi that contains effective address. + * ex) _asm PREFETCH (_edi) + * + * EXAMPLE + * ======= + * Following program doesn't do anything but it shows you + * how to use inline assembly AMD-3D instructions in C. + * Note that this will only work in flat memory model which + * segment registers cs, ds, ss and es point to the same + * linear address space total less than 4GB. + * + * Used Microsoft VC++ 5.0 + * + * #include + * #include "amd3d.h" + * + * void main () + * { + * float x = (float)1.25; + * float y = (float)1.25; + * float z, zz; + * + * _asm { + * movd mm1, x + * movd mm2, y + * pfmul (m1, m2) + * movd z, mm1 + * femms + * } + * + * printf ("value of z = %f\n", z); + * + * // + * // Demonstration of using the memory instead of + * // multimedia register + * // + * _asm { + * movd mm3, x + * lea esi, y // load effective address of y + * pfmul (m3, _esi) + * movd zz, mm3 + * femms + * } + * + * printf ("value of zz = %f\n", zz); + * } + ******************************************************************/ + +#define _MM0 0xc0 +#define _MM1 0xc1 +#define _MM2 0xc2 +#define _MM3 0xc3 +#define _MM4 0xc4 +#define _MM5 0xc5 +#define _MM6 0xc6 +#define _MM7 0xc7 +#define _mm0 0xc0 +#define _mm1 0xc1 +#define _mm2 0xc2 +#define _mm3 0xc3 +#define _mm4 0xc4 +#define _mm5 0xc5 +#define _mm6 0xc6 +#define _mm7 0xc7 +#define _EAX 0x00 +#define _ECX 0x01 +#define _EDX 0x02 +#define _EBX 0x03 +#define _ESI 0x06 +#define _EDI 0x07 +#define _eax 0x00 +#define _ecx 0x01 +#define _edx 0x02 +#define _ebx 0x03 +#define _esi 0x06 +#define _edi 0x07 +#define PF2ID(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x1d \ +} +#define PFACC(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xae \ +} +#define PFADD(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x9e \ +} +#define PFCMPEQ(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xb0 \ +} +#define PFCMPGE(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x90 \ +} +#define PFCMPGT(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xa0 \ +} +#define PFMAX(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xa4 \ +} +#define PFMIN(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x94 \ +} +#define PFMUL(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xb4 \ +} +#define PFRCP(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x96 \ +} +#define PFRCPIT1(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xa6 \ +} +#define PFRCPIT2(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xb6 \ +} +#define PFRSQRT(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x97 \ +} +#define PFRSQIT1(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xa7 \ +} +#define PFSUB(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x9a \ +} +#define PFSUBR(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xaa \ +} +#define PI2FD(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x0d \ +} +#define FEMMS \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0e \ +} +#define PAVGUSB(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xbf \ +} +#define PMULHRW(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xb7 \ +} +#define PREFETCH(src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0d \ + _asm _emit 0x00 | src \ +} +#define PREFETCHW(src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0d \ + _asm _emit 0x08 | src \ +} +// +// Exactly same as above except macro names are all +// lower case latter. +// +#define pf2id(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x1d \ +} +#define pfacc(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xae \ +} +#define pfadd(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x9e \ +} +#define pfcmpeq(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xb0 \ +} +#define pfcmpge(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x90 \ +} +#define pfcmpgt(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xa0 \ +} +#define pfmax(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xa4 \ +} +#define pfmin(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x94 \ +} +#define pfmul(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xb4 \ +} +#define pfrcp(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x96 \ +} +#define pfrcpit1(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xa6 \ +} +#define pfrcpit2(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xb6 \ +} +#define pfrsqrt(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x97 \ +} +#define pfrsqit1(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xa7 \ +} +#define pfsub(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x9a \ +} +#define pfsubr(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xaa \ +} +#define pi2fd(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0x0d \ +} +#define femms \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0e \ +} +#define pavgusb(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xbf \ +} +#define pmulhrw(dst, src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0f \ + _asm _emit ((dst & 0x3f) << 3) | src \ + _asm _emit 0xb7 \ +} +#define prefetch(src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0d \ + _asm _emit 0x00 | src \ +} +#define prefetchw(src) \ +{\ + _asm _emit 0x0f \ + _asm _emit 0x0d \ + _asm _emit 0x08 | src \ +} + + + + +/* + +Last Updated 07/15/98 +©1999 Advanced Micro Devices, Inc. +Trademark Information + +*/ + +//////////////////////////// eof ///////////////////////////// + + + diff --git a/Source/Game/gamecpp/CWeaponInfo.cpp b/Source/Game/gamecpp/CWeaponInfo.cpp new file mode 100644 index 0000000..60d7d86 --- /dev/null +++ b/Source/Game/gamecpp/CWeaponInfo.cpp @@ -0,0 +1,2689 @@ +#include "g_local.h" +#include "CWeaponInfo.h" +#include "p_body.h" +#include "../strings/items.h" // for the string ID's in pickupModelData +#include "callback.h" // for respawn fadein + +// determines whether or not we want to track pickup information for the next level +extern cvar_t *pickupinfo; + + +void fireKnife(weaponFireInfo_t &wf); +void fireKnifeThrow(weaponFireInfo_t &wf); +void fireStarThrow(weaponFireInfo_t &wf); +void fireBullet(weaponFireInfo_t &wf); +void fireShotgun(weaponFireInfo_t &wf); +void fireSpas(weaponFireInfo_t &wf); +void fireGrenade(weaponFireInfo_t &wf); +void fireRocket(weaponFireInfo_t &wf); +void fireRocketMulti(weaponFireInfo_t &wf); +void fireMicro(weaponFireInfo_t &wf); +void firePistonWhip(weaponFireInfo_t &wf); +void fireShotgunMine(weaponFireInfo_t &wf); +void fireTearGas(weaponFireInfo_t &wf); +void firePhosphorusGrenade(weaponFireInfo_t &wf); +void fireMegaRocket(weaponFireInfo_t &wf); +void fireMicrowaveCone(weaponFireInfo_t &wf); +void fireFlameThrower(weaponFireInfo_t &wf); +void fireAutogun(weaponFireInfo_t &wf); +void fireFlameGlob(weaponFireInfo_t &wf); +void fireDogAttack(weaponFireInfo_t &wf); +void fireGrenade(weaponFireInfo_t &wf); +void fireMolitov(weaponFireInfo_t &wf); +void fireConcGrenade(weaponFireInfo_t &wf); +void fireGasGren(weaponFireInfo_t &wf); +void fireMagicBullet(weaponFireInfo_t &wf); +void fireFlashGren(weaponFireInfo_t &wf); +void fireMachete(weaponFireInfo_t &wf); + +void fireDekker(weaponFireInfo_t &wf); + +void fireProjTest(weaponFireInfo_t &wf); + +void cacheKnife(void); +void cacheKnifeThrow(void); +void cacheStarThrow(void); +void cachePistol1(void); +void cachePistol2(void); +void cacheMPistol(void); +void cacheAssaultR(void); +void cacheSniper(void); +void cacheAutoShot(void); +void cacheConcGren(void); +void cacheShotgun(void); +void cacheMachinegun(void); +void cachePhosGren(void); +void cacheRocket(void); +void cacheRocketMulti(void); +void cacheMicro(void); +void cacheMicro2(void); +void cacheDekkerMicro(void); +void cacheFlameBlast(void); +void cacheFlameGlob(void); +void cacheGrenade(void); +void cacheMolitov(void); +void cacheWeaponCommon(void); + +// *** MODs are only needed where fireBullet() is used in the table below. + +CWeaponInfo wInfo[] = +{ + // soundRange bulletSize EnemySpawnAdd penetrate precachefunc tracerEf index + // inviewflash dmflash enemyflash dmg damageFlag spawnAdd MOD fireFunc absorb efrange bighit + CWeaponInfo("", "", "", 0, 0, 3, 0, 0.00, 0.00, 0, 0, 0, 0, 0, 0, "", false, ATK_NOTHING), + CWeaponInfo("", "weapons/othermz/knife", "weapons/othermz/knife", 0, 22, 3, DT_KNIFE, 0.00, 0.00, 0, fireKnife, 0, .25, cacheKnife, 30, "", false, ATK_KNIFE), + CWeaponInfo("", "", "", 0, 30, 2, DT_KNIFE, 0.00, 0.00, 0, fireKnifeThrow, 0, 0, cacheKnifeThrow, 0, "", false, ATK_KNIFE_ALT), + CWeaponInfo("weapons/playermz/pistol1", "weapons/othermz/pistol1_p", "weapons/othermz/pistol1", 300, 45, 2, 0, 0.03, 0.03, MOD_PISTOL1, fireBullet, 0, 0, cachePistol1, 512, "weapons/world/tracer_s", false, ATK_PISTOL1), + CWeaponInfo("weapons/playermz/pistol2", "weapons/othermz/pistol2_p", "weapons/othermz/pistol2", 700, 120, 5, DT_SEVER, 0.08, 0.08, MOD_PISTOL2, fireBullet, 0.5, 0, cachePistol2, 800, "weapons/world/tracer_l", true, ATK_PISTOL2), + CWeaponInfo("weapons/playermz/machinepistol","weapons/othermz/machinepistol","weapons/othermz/machinepistol", 0, 30, 2, DT_MPISTOL, 0.00, 0.00, MOD_MPISTOL, fireBullet, 0, .5, cacheMPistol, 512, "weapons/world/tracer_s", false, ATK_MACHINEPISTOL), + CWeaponInfo("weapons/playermz/assaultrifle","weapons/othermz/assaultrifle_p","weapons/othermz/assaultrifle", 600, 45, 4, DT_JUGGLE, 0.03, 0.03, MOD_ASSAULTRIFLE, fireBullet, 0, 0, cacheAssaultR, 512, "weapons/world/tracer", false, ATK_ASSAULTRIFLE), + CWeaponInfo("weapons/playermz/sniper", "weapons/othermz/sniper", "weapons/othermz/sniperenemy", 0, 80, 6, DT_SNIPER, 0.00, 0.00, MOD_SNIPERRIFLE, fireBullet, 0.5, 0, cacheSniper, 1600, "weapons/world/tracer_n", false, ATK_SNIPER), + CWeaponInfo("", "", "", 0, 30, 3, 0, 0.00, 0.00, 0, 0, 0, 0, 0, 512, "weapons/world/tracer_n", false, ATK_SNIPER_ALT), + CWeaponInfo("weapons/playermz/autoshot", "weapons/othermz/autoshot_p", "weapons/othermz/autoshot", 400, 80, 3, DT_AUTOSHOTGUN, 0.04, 0.04, MOD_AUTOSHOTGUN, fireShotgun, 0, 0, cacheAutoShot, 512, "", false, ATK_AUTOSHOTGUN), + CWeaponInfo("weapons/playermz/autoalt", "weapons/othermz/autoalt_p", "weapons/othermz/autoalt", 800, 200, 3,DAMAGE_ALL_KNOCKBACK, 0.02, 0.02, MOD_CONC_GRENADE, fireConcGrenade, 0, 0, cacheConcGren, 256, "", false, ATK_AUTOSHOTGUN_ALT), + CWeaponInfo("weapons/playermz/shotgun", "weapons/othermz/shotgun_p", "weapons/othermz/shotgun", 800, 40, 1, DT_SHOTGUN, 0.20, 0.20, MOD_SHOTGUN, fireSpas, 0, .5, cacheShotgun, 128, "", false, ATK_SHOTGUN), // -> damage is per pellet + CWeaponInfo("weapons/playermz/machinegun", "weapons/othermz/machinegun_p", "weapons/othermz/machinegun", 1000, 100, 7, DT_SEVER, 0.08, 0.04, MOD_MACHINEGUN, fireBullet, 0.25, 0, cacheMachinegun, 1024, "weapons/world/tracer_l", true, ATK_MACHINEGUN), + CWeaponInfo("weapons/playermz/phos", "weapons/othermz/phos_p", "weapons/othermz/phos", 500, 30, 3, 0, 0.01, 0.01, 0, firePhosphorusGrenade, 0, 0, cachePhosGren, 512, "", false, ATK_MACHINEGUN_ALT), + CWeaponInfo("weapons/playermz/rocket", "weapons/othermz/rocket_p", "weapons/othermz/rocket", 0, 30, 5, 0, 0.20, 0.20, 0, fireRocket, 0, 0, cacheRocket, 512, "", false, ATK_ROCKET), + CWeaponInfo("weapons/playermz/rocket_alt", "weapons/othermz/rocket_alt_p", "weapons/othermz/rocket_alt", 0, 15, 5, 0, 0.10, 0.10, 0, fireRocketMulti, 0, 0, cacheRocketMulti, 512, "", false, ATK_ROCKET_ALT), + CWeaponInfo("weapons/playermz/mpgbeam1", "", "", 0, 10, 3, 0, 0.00, 0.00, MOD_MPG, fireMicrowaveCone, 1.0, 0, cacheMicro2, 512, "", false, ATK_MICROWAVE), + CWeaponInfo("weapons/playermz/mpg", "weapons/othermz/mpg", "weapons/othermz/mpgenemy", 0, 200, 3, 0, 0.00, 0.00, MOD_MPG, fireMicro, 1.0, 0, cacheMicro, 512, "", false, ATK_MICROWAVE_ALT), + CWeaponInfo("weapons/playermz/flamegun", "", "", 0, 15, 3, 0, 0.00, 0.00, 0, fireFlameThrower, 0, 0, cacheFlameBlast, 512, "", false, ATK_FLAMEGUN), + CWeaponInfo("weapons/playermz/flamerelease","weapons/othermz/flamerelease", "weapons/othermz/flamerelease", 0, 30, 3, 0, 0.30, 0.30, 0, fireFlameGlob, 0, 0, cacheFlameGlob, 512, "", false, ATK_FLAMEGUN_ALT), + CWeaponInfo("", "", "", 0, 30, 3, 0, 0.03, 0.03, 0, fireDogAttack, 0, 0, 0, 512, "", false, ATK_DOG_ATTACK), + CWeaponInfo("", "", "", 0, 10, 3, 0, 0.10, 0.10, 0, fireAutogun, 0, 0, 0, 512, "weapons/world/tracer_l", false, ATK_AUTOGUN), + CWeaponInfo("", "", "", 0, 30, 3, 0, 0.05, 0.05, 0, fireGrenade, 0, 0, cacheGrenade, 512, "", false, ATK_GRENADE), + CWeaponInfo("", "", "", 0, 30, 3, 0, 0.10, 0.10, 0, fireMolitov, 0, 0, 0,/*cacheMolitov,*/ 512, "", false, ATK_MOLITOV), + CWeaponInfo("", "", "", 0, 30, 3, 0, 0.00, 0.00, 0, fireGasGren, 0, 0, 0, 512, "", false, ATK_GASGREN), // fixme + CWeaponInfo("", "", "", 0, 30, 3, 0, 0.00, 0.00, 0, fireMagicBullet, 0, 0, 0, 512, "", false, ATK_MAGICBULLET), // fixme + CWeaponInfo("", "", "", 0, 30, 3, 0, 0.00, 0.00, 0, fireFlashGren, 0, 0, 0, 512, "", false, ATK_FLASHGREN), // fixme + CWeaponInfo("", "", "", 0, 30, 3, 0, 0.00, 0.00, 0, fireMachete, 0, 0, 0, 512, "", false, ATK_MACHETE), // fixme + CWeaponInfo("", "", "", 1500, 180, 15, DT_SEVER, 0.10, 0.10, 0, fireBullet, 0, 0, cacheAssaultR, 512, "weapons/world/tracer_l", false, ATK_HELIGUN), // fixme + CWeaponInfo("", "weapons/othermz/gb_dekmz", "weapons/othermz/gb_dekmz", 0, 300, 3, 0, 0.02, 0.02, 0, fireDekker, 0, 0, cacheDekkerMicro, 512, "weapons/world/tracer_l", true, ATK_DEKKER), // fixme + CWeaponInfo("", "", "", 0, 30, 2, 0, 0.00, 0.00, 0, fireStarThrow, 0, 0, cacheStarThrow, 0, "", false, ATK_THROWSTAR), +}; + +CWeaponInfo::CWeaponInfo(char *newMFlashView, char *newMFlashDM, char *newMFlashSingle, + float soundRange, float damage, float bSize, int dFlags, + float spawnAdd, float enemySpawnAdd, int MeansODeath, void (*infunc)(weaponFireInfo_t &wf), + float newDPenetrate, float newDAbsorb, void (*cacheFunc)(void), float newEfRange, + char *newtracerFX, qboolean newbighit, int newIndex) +{ + sndRange = soundRange; + dmg = damage; + bulletSize = bSize; + damageFlag = dFlags; + MOD=MeansODeath; + + if (newMFlashView) strcpy(mflashView, newMFlashView); + if (newMFlashDM) strcpy(mflashDM, newMFlashDM); + if (newMFlashSingle) strcpy(mflashSingle,newMFlashSingle); + if (tracerFX) strcpy(tracerFX, newtracerFX); + + fire = infunc; + precache = cacheFunc; + dPenetrate = newDPenetrate; + dAbsorb = newDAbsorb; + bighit = newbighit; + + effectiveRange = newEfRange; + + addToSpawn = spawnAdd; + enemyAddToSpawn = enemySpawnAdd; + + mflashEfView = 0; + mflashEfDM = 0; + mflashEfSingle = 0; + + tracerEf = 0; + + index = newIndex; +} + +void CWeaponInfo::cache(void) +{ + // Other muzzle flashes. + if (dm->isDM()) + { // Other player muzzle flash + if(strcmp(mflashDM, "")) + { + mflashEfDM = gi.effectindex(mflashDM); + } + } + else + { // Other enemy AI muzzle flash + if(strcmp(mflashSingle, "")) + { + mflashEfSingle = gi.effectindex(mflashSingle); + } + } + + // in view weapon muzzle flash + if(strcmp(mflashView, "")) + { + mflashEfView = gi.effectindex(mflashView); + } + + // Tracers from other players and enemies + if(strcmp(tracerFX, "")) + { + tracerEf = gi.effectindex(tracerFX); + } + + if(precache) + { + precache(); + } +} + +void CWeaponInfo::attack(edict_t *srcEnt, vec3_t org, vec3_t dir, IGhoulInst *gun, GhoulID myFlashBolt) +{ + if(!fire)return; + if (srcEnt && srcEnt->client) + { + vec3_t dest, face; + VectorCopy(srcEnt->velocity, dest); + VectorAdd(dest, srcEnt->s.origin, dest); + AngleVectors(srcEnt->client->ps.viewangles, face, NULL, NULL); + VectorMA(srcEnt->s.origin, 100, face, face); + + PB_PlaySequenceForAttack(srcEnt, dest, face, NULL); + } + + weaponFireInfo_t info; + info.ent = srcEnt; + VectorCopy(org, info.firePoint); + VectorCopy(dir, info.fwd); + info.weapon = this; + info.gunPointSet = 0; + info.inst = gun; + + if(gun && myFlashBolt) + { + info.gunPointSet = 1; + GetGhoulPosDir(srcEnt->s.origin, srcEnt->s.angles, gun, myFlashBolt, 0, info.gunPoint, 0, 0, 0); + } + + // This is a weak way to handle it, but at least a weapon can have a different spawnadd for enemies versus players + if (srcEnt->ai) + IncreaseSpawnIntensity(enemyAddToSpawn); + else + IncreaseSpawnIntensity(addToSpawn); + + fire(info); +} + +void CWeaponInfo::attack(edict_t *srcEnt, vec3_t org, vec3_t dir, float vel) +{ + if(!fire)return; + + weaponFireInfo_t info; + info.ent = srcEnt; + VectorCopy(org, info.firePoint); + VectorCopy(dir, info.fwd); + info.weapon = this; + info.vel = vel; + info.gunPointSet = 0; + + // This is a weak way to handle it, but at least a weapon can have a different spawnadd for enemies versus players + if (srcEnt->ai) + IncreaseSpawnIntensity(enemyAddToSpawn); + else + IncreaseSpawnIntensity(addToSpawn); + + fire(info); +} + + +void CWeaponInfo::attack(edict_t *srcEnt, vec3_t org, vec3_t dir, void (*bodyfunc)(edict_t *ent, void* data)) +{ + if(!fire)return; + + weaponFireInfo_t info; + info.ent = srcEnt; + VectorCopy(org, info.firePoint); + VectorCopy(dir, info.fwd); + info.weapon = this; + info.hitfunc = bodyfunc; + info.gunPointSet = 0; + + // This is a weak way to handle it, but at least a weapon can have a different spawnadd for enemies versus players + if (srcEnt->ai) + IncreaseSpawnIntensity(enemyAddToSpawn); + else + IncreaseSpawnIntensity(addToSpawn); + + fire(info); +} + + +float CWeaponInfo::getDmg(void) +{ + if (dm->dmRule_REALISTIC_DAMAGE()) + { + switch(getIndex()) + { + case ATK_SNIPER: + case ATK_SNIPER_ALT: + return 110; // any non-limb shot with sniper in realistic mode will kill! mwahaha + break; + default: + break; + } + } + return dmg; +} + +int CWeaponInfo::getDmgFlags(void) +{ + if (dm->dmRule_REALISTIC_DAMAGE()) + { + switch(getIndex()) + { + case ATK_SNIPER: + case ATK_SNIPER_ALT: + case ATK_PISTOL2: + return damageFlag|DAMAGE_NO_ARMOR; // sniper and .44 are armor piercing with realistic damage + break; + default: + break; + } + } + + return damageFlag; +} + +int CWeaponInfo::getMOD(void) +{ + return MOD; +} + +float CWeaponInfo::getPenetrate(void) +{ + return dPenetrate; +} + +float CWeaponInfo::getAbsorb(void) +{ + return dAbsorb; +} + +float CWeaponInfo::getBulletSize(void) +{ + return bulletSize; +} + +float CWeaponInfo::getNoiseRad(void) +{ + return sndRange; +} + +int CWeaponInfo::getMFlashEfView(void) +{ + if (!mflashEfView) + { + if (mflashView) + { + mflashEfView = gi.effectindex(mflashView); + } + } + + return mflashEfView; +} + +int CWeaponInfo::getMFlashEfDM(void) +{ + if (!mflashEfDM) + { + if (mflashDM) + { + mflashEfDM = gi.effectindex(mflashDM); + } + } + + return mflashEfDM; +} + +int CWeaponInfo::getMFlashEfSingle(void) +{ + if (!mflashEfSingle) + { + if (mflashSingle) + { + mflashEfSingle = gi.effectindex(mflashSingle); + } + } + + return mflashEfSingle; +} + +int CWeaponInfo::getTracerEf(void) +{ + if (!tracerEf) + { + if (tracerFX) + { + tracerEf = gi.effectindex(tracerFX); + } + } + + return tracerEf; +} + +float CWeaponInfo::getEffectiveRange(void) +{ + if (dm->isDM()) + { + switch(getIndex()) + { + case ATK_SNIPER: + case ATK_SNIPER_ALT: + return 4800; // sniper has a really long range in dm + break; + default: + break; + } + } + + return effectiveRange; +} + +int CWeaponInfo::getIndex(void) +{ + return index; +} + + +qboolean CWeaponInfo::getBigHit(void) +{ + return bighit; +} + +/*************************** + + CWorldWeapons + +****************************/ + +CWorldWeapons weapons; + +void CWorldWeapons::attack(attacks_e weapID, edict_t *srcEnt, vec3_t org, vec3_t dir, IGhoulInst *gun, GhoulID myFlashBolt) +{ + //normal attacking + + assert(weapID < ATK_NUMWEAPONS); + assert(weapID >= 0); + assert(weaps); + + GhoulID flash = 0; + + if(gun) + { + if(myFlashBolt) + { + flash = myFlashBolt; + } + else + { + flash = gun->GetGhoulObject()->FindPart("flash"); + } + } + + weaps[weapID].attack(srcEnt, org, dir, gun, flash); + + if(gun) + { + if(flash) + { + if (dm->isDM()) + { + fxRunner.execWithInst(weaps[weapID].getMFlashEfDM(), srcEnt, gun, flash, MULTICAST_PHS); + } + else + { + fxRunner.execWithInst(weaps[weapID].getMFlashEfSingle(), srcEnt, gun, flash, MULTICAST_PHS); + } + } + } +} + +void CWorldWeapons::attack(attacks_e weapID, edict_t *srcEnt, vec3_t org, vec3_t dir, IGhoulInst *gun, float *vel) +{ + // for lobbed projectiles + + assert(weapID < ATK_NUMWEAPONS); + assert(weapID >= 0); + assert(weaps); + + weaps[weapID].attack(srcEnt, org, dir, *vel); +} + +void CWorldWeapons::attack(attacks_e weapID, edict_t *srcEnt, vec3_t org, vec3_t dir, + void (*bodyfunc)(edict_t *ent, void* data), IGhoulInst *gun) +{ + // for the dog, I believe + + assert(weapID < ATK_NUMWEAPONS); + assert(weapID >= 0); + assert(weaps); + + weaps[weapID].attack(srcEnt, org, dir, bodyfunc); + + if(gun) + { + GhoulID flash = gun->GetGhoulObject()->FindPart("flash"); + + if(flash) + { + if (dm->isDM()) + { + fxRunner.execWithInst(weaps[weapID].getMFlashEfDM(), srcEnt, gun, flash, MULTICAST_PHS, 1); + } + else + { + fxRunner.execWithInst(weaps[weapID].getMFlashEfSingle(), srcEnt, gun, flash, MULTICAST_PHS, 1); + } + } + } +} + +void W_InitWorldWeaponModels(void) +{ + //hack! precache item shit - make specific later + for(int e = 0; e < SFE_NUMITEMS; e++) + { + cacheForItem((equipment_t)e); + } + + cacheWeaponCommon(); + + weapons.setWeaps(wInfo); +} + +void W_ShutdownWorldWeaponModels(void) +{ + int i; + + for(i = 0; i < SFW_NUM_WEAPONS; i++) + { + } +} + + + +/**************************** + + model data for class Pickup + + ****************************/ + +// any item added for use in single player games MUST GO IN THIS ARRAY...it's a requirement of our save/load routines. +modelSpawnData_t pickupModelData[MD_ITEM_SIZE] = +{ + //dir file surfaceType material health solid materialfile debrisCnt debrisScale objBreakData +/*OBJ_NONE*/ NULL, NULL, SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_NONE +/*OBJ_AMMO_KNIFE*/ "enemy/bolt", "w_knife", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_AMMO_KNIFE +/*OBJ_AMMO_PISTOL*/ "Items/Pick-ups/Ammo", "box", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "box", -4, 0.0, NULL, // OBJ_AMMO_PISTOL, +/*OBJ_AMMO_SHOTGUN*/ "Items/Pick-ups/Ammo", "box", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "box", -4, 0.0, NULL, // OBJ_AMMO_SHOTGUN +/*OBJ_AMMO_PISTOL2*/ "Items/Pick-ups/Ammo", "box", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "box", -4, 0.0, NULL, // OBJ_AMMO_PISTOL2 +/*OBJ_AMMO_AUTO*/ "Items/Pick-ups/Ammo", "box", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "box", -4, 0.0, NULL, // OBJ_AMMO_AUTO +/*OBJ_AMMO_MPG*/ "Items/Pick-ups/Ammo", "box", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "box", -4, 0.0, NULL, // OBJ_AMMO_MPG +/*OBJ_AMMO_GAS*/ "Items/Pick-ups/Ammo", "box", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "box", -4, 0.0, NULL, // OBJ_AMMO_GAS +/*OBJ_AMMO_ROCKET*/ "Items/Pick-ups/Ammo", "box", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "box", -4, 0.0, NULL, // OBJ_AMMO_ROCKET +/*OBJ_AMMO_SLUG*/ "Items/Pick-ups/Ammo", "box", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "box", -4, 0.0, NULL, // OBJ_AMMO_SLUG + +/*OBJ_AMMO_SINGLE_PISTOL*/ "Items/Pick-ups/Ammo_single","ammo_9mm", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "9mm", -4, 0.0, NULL, // OBJ_AMMO_SINGLE_PISTOL, +/*OBJ_AMMO_SINGLE_SHOTGUN*/ "Items/Pick-ups/Ammo_single","ammo_shotgun", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "ammo_shotgun", -4, 0.0, NULL, // OBJ_AMMO_SINGLE_SHOTGUN +/*OBJ_AMMO_SINGLE_PISTOL2*/ "Items/Pick-ups/Ammo_single","ammo_44", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "ammo_44", -4, 0.0, NULL, // OBJ_AMMO_SINGLE_PISTOL2, +/*OBJ_AMMO_SINGLE_AUTO*/ "Items/Pick-ups/Ammo_single","ammo_556", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "ammo_556", -4, 0.0, NULL, // OBJ_AMMO_SINGLE_AUTO, +/*OBJ_AMMO_SINGLE_MPG*/ "Items/Pick-ups/Ammo_single","ammo_battery", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "ammo_battery", -4, 0.0, NULL, // OBJ_AMMO_SINGLE_MPG, +/*OBJ_AMMO_SINGLE_GAS*/ "Items/Pick-ups/Ammo_single","ammo_gas", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "ammo_gas", -4, 0.0, NULL, // OBJ_AMMO_SINGLE_GAS, +/*OBJ_AMMO_SINGLE_ROCKET*/ "Items/Pick-ups/Ammo_single","ammo_rocket", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "ammo_rocket", -4, 0.0, NULL, // OBJ_AMMO_SINGLE_ROCKET, +/*OBJ_AMMO_SINGLE_SLUG*/ "Items/Pick-ups/Ammo_single","ammo_shotgun", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, "ammo_shotgun", -4, 0.0, NULL, // OBJ_AMMO_SINGLE_SLUG, + +/*OBJ_WPN_PISTOL2*/ "enemy/bolt", "w_pistol2", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -2, 0.0, NULL, // OBJ_WPN_PISTOL2 +/*OBJ_WPN_PISTOL1*/ "enemy/bolt", "w_pistol1", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -2, 0.0, NULL, // OBJ_WPN_PISTOL1 +/*OBJ_WPN_MACHINEPISTOL*/ "enemy/bolt", "w_machinepistol", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -2, 0.0, NULL, // OBJ_WPN_MACHINEPISTOL +/*OBJ_WPN_ASSAULTRIFLE*/ "enemy/bolt", "w_assault_rifle", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -2, 0.0, NULL, // OBJ_WPN_ASSAULTRIFLE +/*OBJ_WPN_SNIPER*/ "enemy/bolt", "w_sniperrifle", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -2, 0.0, NULL, // OBJ_WPN_SNIPER +/*OBJ_WPN_AUTOSHOTGUN*/ "enemy/bolt", "w_autoshotgun", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -6, 0.0, NULL, // OBJ_WPN_AUTOSHOTGUN +/*OBJ_WPN_SHOTGUN*/ "enemy/bolt", "w_shotgun", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -2, 0.0, NULL, // OBJ_WPN_SHOTGUN +/*OBJ_WPN_MACHINEGUN*/ "enemy/bolt", "w_machinegun", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -2, 0.0, NULL, // OBJ_WPN_MACHINEGUN +/*OBJ_WPN_ROCKET*/ "enemy/bolt", "w_rocket", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -2, 0.0, NULL, // OBJ_WPN_ROCKET +/*OBJ_WPN_MICROWAVE*/ "enemy/bolt", "w_mpg", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -2, 0.0, NULL, // OBJ_WPN_MICROWAVE +/*OBJ_WPN_FLAMEGUN*/ "enemy/bolt", "w_flamethrower", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -2, 0.0, NULL, // OBJ_WPN_FLAMEGUN + +/*OBJ_ARMOR*/ "Items/Pick-ups/Armor", "armor", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_ARMOR + +/*OBJ_ITM_FLASHPACK*/ "Items/Projectiles", "flashpak", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -6, 0.0, NULL, // OBJ_ITM_FLASHPACK +/*OBJ_ITM_NEURALGRENADE NULL, NULL, SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_ITM_NEURALGRENADE*/ +/*OBJ_ITM_C4*/ "Items/Projectiles", "c4", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -4, 0.0, NULL, // OBJ_ITM_C4 +/*OBJ_ITM_LIGHTGOGGLES*/ "enemy/bolt", "acc_nightvision", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -4, 0.0, NULL, // OBJ_ITM_LIGHTGOGGLES +/*OBJ_ITM_MINE*/ "Items/Projectiles", "claymore", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -4, 0.0, NULL, // OBJ_ITM_MINE +/*OBJ_ITM_MEDKIT*/ "Items/Pick-ups/MedKit", "medkit", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_ITM_MEDKIT +/*OBJ_ITM_GRENADE*/ "Items/Projectiles", "grenade", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, -2, 0.0, NULL, // OBJ_ITM_GRENADE +/*OBJ_CTF_FLAG*/ "Items/ctf_flag", "flag_ground_idle", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_ITM_CTF_FLAG + +/*OBJ_HLTH_SM*/ "Items/Pick-ups/healthsm", "health", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_HLTH_SM +/*OBJ_HLTH_LRG*/ "Items/Pick-ups/healthbig", "health", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_HLTH_LRG + +}; + +// save/load stuff requires that all single player model data be stored in one giant array (pickupModelData) +//that gets referenced in g_save.cpp. since this low poly model is only for deathmatch, we don't have to store +//it in pickupModelData +modelSpawnData_t lowPolyArmorModel = +{ + "Items/Pick-ups/Armor", "armordm", SURF_DEFAULT, MAT_DEFAULT, 1, SOLID_BBOX, NULL, 0, 0.0, NULL +}; + +/**************************** + + +class Pickup + + any item the player can pick up during either a single player or multiplayer game is a Pickup. + + ****************************/ + +PickupRespawnCallback thePickupRespawnCallback; + +bool PickupRespawnCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ // when a pickup respawns it plays a sequence in which it fades into view. at the end of that sequence, + //this function is called, meaning it's time to play the pickup's normal, one-frame sequence. + edict_t *self = (edict_t*)ent; + IGhoulInst *ghoulInst = self?self->ghoulInst:NULL; + PickupInst *pickupInst = thePickupList.GetPickupInstFromEdict(self); + + if (pickupInst) + { + pickupInst->RespawnCallback(); + } + return true; +} + + +Pickup::Pickup() +{ + memset(m_spawnName, 0, MAXCHARSFORPICKUPNAME); + m_type = PU_UNKNOWN; + m_spawnParm = SFW_EMPTYSLOT; // this is kind of arbitrary since it could be one of several enums. i just want it 0 for now. + m_defaultCount = 0; + m_defaultMaxCount = -1; + m_respawnTime = 30; + m_pickupListIndex = OBJ_NONE; + memset(m_worldName, 0, MAXCHARSFORPICKUPNAME); + m_pickupStringIndex = m_ammoPickupStringIndex = m_itemFullStringIndex = 0; + m_modelSpawnData = NULL; + + memset(m_skin, 0, MAXCHARSFORPICKUPNAME); + m_scale = 1.0; + VectorClear(m_bboxAdjustMins); + m_lowPolyModelSpawnData = NULL; + memset(m_fadeInSeq, 0, MAXCHARSFORPICKUPNAME); + m_droppedStringIndex = 0; +} + +Pickup::Pickup( char *yourSpawnNameHere, + pickup_t yourTypeHere, + int yourSpawnParmHere, + float yourRespawnTimeHere, + int yourDefaultCountHere, + int yourDefaultMaxCountHere, + objType_t yourPickupListIndexHere, + char *yourWorldNameHere, + int yourPickupStringIndexHere, + int yourAmmoPickupStringIndexHere, + int yourItemFullStringIndexHere + ) +{ + strncpy(m_spawnName, yourSpawnNameHere, MAXCHARSFORPICKUPNAME); + m_type = yourTypeHere; + m_spawnParm = yourSpawnParmHere; + m_respawnTime = yourRespawnTimeHere; + m_defaultCount = yourDefaultCountHere; + m_defaultMaxCount = yourDefaultMaxCountHere; + m_pickupListIndex = yourPickupListIndexHere; + strncpy(m_worldName, yourWorldNameHere, MAXCHARSFORPICKUPNAME); + m_pickupStringIndex = yourPickupStringIndexHere; + m_ammoPickupStringIndex = yourAmmoPickupStringIndexHere; + m_itemFullStringIndex = yourItemFullStringIndexHere; + m_modelSpawnData = NULL; + + memset(m_skin, 0, MAXCHARSFORPICKUPNAME); + m_scale = 1.0; + VectorClear(m_bboxAdjustMins); + m_lowPolyModelSpawnData = NULL; + memset(m_fadeInSeq, 0, MAXCHARSFORPICKUPNAME); + m_droppedStringIndex = 0; +} + +Pickup::~Pickup() +{ + m_modelSpawnData = NULL; + m_lowPolyModelSpawnData = NULL; +} + +// here's where we set up our modelData pointer. we could maybe put some file verification stuff in here...you know, +//return something helpful if the file isn't where we were told it'd be, that sort of thing. +int Pickup::Init() +{ + m_modelSpawnData = &pickupModelData[m_pickupListIndex]; + return true; +} + +char *Pickup::GetWorldName() +{ + return m_worldName; +} +void Pickup::SetFadeInSeq(char *seq) +{ + if (seq) + { + strncpy(m_fadeInSeq, seq, MAXCHARSFORPICKUPNAME); + } +} + +void Pickup::SetGSQ(char *gsq) +{ + if (gsq) + { + if (m_modelSpawnData && m_modelSpawnData->dir) + { // precache fade-in seqs + ggObjC* obj = game_ghoul.FindObject(m_modelSpawnData->dir, gsq); + obj = NULL; + } + } +} + +int Pickup::GetDefaultMaxCount() +{ + // no maximum in deathmatch + return (dm->isDM()?-1:m_defaultMaxCount); +} + +/**************************** + +class MedKitPickup + +****************************/ + +MedKitPickup::MedKitPickup( char *yourSpawnNameHere, + pickup_t yourTypeHere, + int yourSpawnParmHere, + float yourRespawnTimeHere, + int yourDefaultCountHere, + int yourDefaultMaxCountHere, + objType_t yourPickupListIndexHere, + char *yourWorldNameHere, + int yourPickupStringIndexHere, + int yourAmmoPickupStringIndexHere, + int yourItemFullStringIndexHere + ) +{ + strncpy(m_spawnName, yourSpawnNameHere, MAXCHARSFORPICKUPNAME); + m_type = yourTypeHere; + m_spawnParm = yourSpawnParmHere; + m_respawnTime = yourRespawnTimeHere; + m_defaultCount = yourDefaultCountHere; + m_defaultMaxCount = yourDefaultMaxCountHere; + m_pickupListIndex = yourPickupListIndexHere; + strncpy(m_worldName, yourWorldNameHere, MAXCHARSFORPICKUPNAME); + m_pickupStringIndex = yourPickupStringIndexHere; + m_ammoPickupStringIndex = yourAmmoPickupStringIndexHere; + m_itemFullStringIndex = yourItemFullStringIndexHere; + m_modelSpawnData = NULL; + + memset(m_skin, 0, MAXCHARSFORPICKUPNAME); + m_scale = 1.0; + VectorClear(m_bboxAdjustMins); + m_lowPolyModelSpawnData = NULL; + memset(m_fadeInSeq, 0, MAXCHARSFORPICKUPNAME); +} + +MedKitPickup::~MedKitPickup() +{ + m_modelSpawnData = NULL; + m_lowPolyModelSpawnData = NULL; +} + +int MedKitPickup::GetDefaultMaxCount() +{ + if (dm->dmRule_REALISTIC_DAMAGE()) + { + return 1; + } + return m_defaultMaxCount; +} + +/**************************** + +class LightGogglesPickup + +****************************/ + +LightGogglesPickup::LightGogglesPickup( char *yourSpawnNameHere, + pickup_t yourTypeHere, + int yourSpawnParmHere, + float yourRespawnTimeHere, + int yourDefaultCountHere, + int yourDefaultMaxCountHere, + objType_t yourPickupListIndexHere, + char *yourWorldNameHere, + int yourPickupStringIndexHere, + int yourAmmoPickupStringIndexHere, + int yourItemFullStringIndexHere + ) +{ + strncpy(m_spawnName, yourSpawnNameHere, MAXCHARSFORPICKUPNAME); + m_type = yourTypeHere; + m_spawnParm = yourSpawnParmHere; + m_respawnTime = yourRespawnTimeHere; + m_defaultCount = yourDefaultCountHere; + m_defaultMaxCount = yourDefaultMaxCountHere; + m_pickupListIndex = yourPickupListIndexHere; + strncpy(m_worldName, yourWorldNameHere, MAXCHARSFORPICKUPNAME); + m_pickupStringIndex = yourPickupStringIndexHere; + m_ammoPickupStringIndex = yourAmmoPickupStringIndexHere; + m_itemFullStringIndex = yourItemFullStringIndexHere; + m_modelSpawnData = NULL; + + memset(m_skin, 0, MAXCHARSFORPICKUPNAME); + m_scale = 1.0; + VectorClear(m_bboxAdjustMins); + m_lowPolyModelSpawnData = NULL; + memset(m_fadeInSeq, 0, MAXCHARSFORPICKUPNAME); +} + +int LightGogglesPickup::GetDefaultMaxCount() +{ + // always 100 whether singleplayer or deathmatch + return m_defaultMaxCount; +} + + +/**************************** + +class WeaponPickup + +****************************/ + +WeaponPickup::WeaponPickup( char *yourSpawnNameHere, + pickup_t yourTypeHere, + int yourSpawnParmHere, + float yourRespawnTimeHere, + int yourDefaultCountHere, + int yourDefaultMaxCountHere, + objType_t yourPickupListIndexHere, + char *yourWorldNameHere, + int yourPickupStringIndexHere, + int yourAmmoPickupStringIndexHere, + int yourItemFullStringIndexHere, + int yourWpnFlagsHere + ) +{ + strncpy(m_spawnName, yourSpawnNameHere, MAXCHARSFORPICKUPNAME); + m_type = yourTypeHere; + m_spawnParm = yourSpawnParmHere; + m_respawnTime = yourRespawnTimeHere; + m_defaultCount = yourDefaultCountHere; + m_defaultMaxCount = yourDefaultMaxCountHere; + m_pickupListIndex = yourPickupListIndexHere; + strncpy(m_worldName, yourWorldNameHere, MAXCHARSFORPICKUPNAME); + m_pickupStringIndex = yourPickupStringIndexHere; + m_ammoPickupStringIndex = yourAmmoPickupStringIndexHere; + m_itemFullStringIndex = yourItemFullStringIndexHere; + m_modelSpawnData = NULL; + m_wpnFlags = yourWpnFlagsHere; + + memset(m_skin, 0, MAXCHARSFORPICKUPNAME); + m_scale = 1.0; + VectorClear(m_bboxAdjustMins); + m_lowPolyModelSpawnData = NULL; + memset(m_fadeInSeq, 0, MAXCHARSFORPICKUPNAME); +} + +/**************************** + +class AmmoPickup + +****************************/ + +AmmoPickup::AmmoPickup( char *yourSpawnNameHere, + pickup_t yourTypeHere, + int yourSpawnParmHere, + float yourRespawnTimeHere, + int yourDefaultCountHere, + int yourDefaultMaxCountHere, + objType_t yourPickupListIndexHere, + char *yourWorldNameHere, + int yourPickupStringIndexHere, + int yourAmmoPickupStringIndexHere, + int yourItemFullStringIndexHere, + int yourAmmoFlagsHere + ) +{ + strncpy(m_spawnName, yourSpawnNameHere, MAXCHARSFORPICKUPNAME); + m_type = yourTypeHere; + m_spawnParm = yourSpawnParmHere; + m_respawnTime = yourRespawnTimeHere; + m_defaultCount = yourDefaultCountHere; + m_defaultMaxCount = yourDefaultMaxCountHere; + m_pickupListIndex = yourPickupListIndexHere; + strncpy(m_worldName, yourWorldNameHere, MAXCHARSFORPICKUPNAME); + m_pickupStringIndex = yourPickupStringIndexHere; + m_ammoPickupStringIndex = yourAmmoPickupStringIndexHere; + m_itemFullStringIndex = yourItemFullStringIndexHere; + m_modelSpawnData = NULL; + m_ammoFlags = yourAmmoFlagsHere; + + memset(m_skin, 0, MAXCHARSFORPICKUPNAME); + m_scale = 1.0; + VectorClear(m_bboxAdjustMins); + m_lowPolyModelSpawnData = NULL; + memset(m_fadeInSeq, 0, MAXCHARSFORPICKUPNAME); +} + +/**************************** + + +class PickupInst + + + **************************/ + +PickupInst::PickupInst(edict_t *ent) +{ + m_edict = ent; + m_pickup = thePickupList.GetPickupIndexFromEdict(ent); + m_fadeStatus = fading_NONE; +} + +PickupInst::~PickupInst() +{ + m_edict = NULL; +} + +IGhoulInst *PickupInst::GetGhoulInst() +{ + return (m_edict?m_edict->ghoulInst:NULL); +} + +void PickupInst::FadeIn() +{ + IGhoulInst *inst = GetGhoulInst(); + + if (GetPickup()->GetFadeInSeq() && inst && + ((m_fadeStatus == fading_FALSE) || (m_fadeStatus == fading_NONE)) ) + { + GhoulID tempNote=0; + + // play the sequence + if (SimpleModelSetSequence2(inst, GetPickup()->GetFadeInSeq(), SMSEQ_HOLD)) + { + // set a callback to switch back to normal sequence at the end of the fadein + tempNote=inst->GetGhoulObject()->FindNoteToken("EOS"); + if (tempNote) + { + inst->AddNoteCallBack(&thePickupRespawnCallback,tempNote); + } + m_fadeStatus = fading_TRUE; // begin fading + } + } +} + +void PickupInst::RespawnCallback() +{ + IGhoulInst *ghoulInst = GetGhoulInst(); + + if (ghoulInst && GetPickup()) + { + if (m_fadeStatus != fading_TRUE) + { // already reached this callback for this particular inst. so leave. + return; + } + if (GetPickup()->GetModelName()) + { + if (GetPickup()->GetPickupListIndex() == OBJ_ITM_C4) + { // c4 shouldn't blink + SimpleModelSetSequence2(ghoulInst, GetPickup()->GetModelName(), SMSEQ_HOLD); + } + else if (GetPickup()->GetType() == PU_ARMOR) + { // use special low-poly armor model + SimpleModelSetSequence(m_edict, GetPickup()->GetLowPolyModel()->file, SMSEQ_HOLD); + } + else + { + SimpleModelSetSequence2(ghoulInst, GetPickup()->GetModelName(), SMSEQ_LOOP); + } + } + } + // I'm finished fading in. please remove my callback. + m_fadeStatus = fading_REMOVECALLBACK; + + // Oh, and, by the way, you may want to pick me up at some point... + m_edict->solid = SOLID_TRIGGER; +} + +bool PickupInst::RemoveCallBack() +{ + GhoulID tempNote=0; + IGhoulInst *ghoulInst = NULL; + + if (ghoulInst = GetGhoulInst()) + { + tempNote=ghoulInst->GetGhoulObject()->FindNoteToken("EOS"); + } + m_fadeStatus = fading_FALSE; + if (tempNote) + { + ghoulInst->RemoveNoteCallBack(&thePickupRespawnCallback,tempNote); + return true; + } + return false; +} + +bool PickupInst::EdictCompare(edict_t *ent) +{ + return (m_edict == ent); +} + + +/**************************** + + class PickupInfo + +****************************/ + +PickupInfo::PickupInfo(objType_t type) +{ + m_objType = type; +} + +PickupInfo::~PickupInfo() +{ + list::iterator it; + + for (it = m_insts.begin(); it != m_insts.end(); it++) + { + delete (PickupInstInfo*)(*it); + } + m_insts.clear(); +} + +PickupInstInfo *PickupInfo::AddInst(PickupInst *pickupInst, int type /*PickupInstInfo::type_LOADTIME*/) +{ + PickupInstInfo *newInfo = NULL; + + // is this guy already in our list? + if (newInfo = Find(pickupInst)) + { // yup. return it. + return newInfo; + } + // wasn't in our list already, so add it + newInfo = new PickupInstInfo(pickupInst, type); + m_insts.push_back(newInfo); + return newInfo; +} + +PickupInstInfo *PickupInfo::Find(edict_t *ent) +{ + list::iterator it; + + for(it = m_insts.begin(); it != m_insts.end(); it++) + { + if ((*it)->Compare(ent)) + { + return (PickupInstInfo*)(*it); + } + } + return NULL; +} + +PickupInstInfo *PickupInfo::Find(PickupInst *pickupInst) +{ + list::iterator it; + + for(it = m_insts.begin(); it != m_insts.end(); it++) + { + if ((*it)->Compare(pickupInst)) + { + return (PickupInstInfo*)(*it); + } + } + return NULL; +} + +bool PickupInfo::PickedUp(PickupInst *pickupInst, float fTime) +{ + PickupInstInfo *info = Find(pickupInst); + + if (NULL == info) + { + return false; + } + info->PickedUp(fTime); + return true; +} + +bool PickupInfo::SetRespawnTime(PickupInst *pickupInst, float fTime) +{ + PickupInstInfo *info = Find(pickupInst); + + if (NULL == info) + { + return false; + } + info->SetRespawnTime(fTime); + return true; +} + +bool PickupInfo::Touch(PickupInst *pickupInst, float fTime) +{ + PickupInstInfo *info = Find(pickupInst); + + if (NULL == info) + { + return false; + } + info->Touch(fTime); + return true; +} + +/**************************** + + class PickupInstInfo + +****************************/ + +PickupInstInfo::PickupInstInfo(PickupInst *inst, int type /*type_LOADTIME*/) +{ + m_pickUpInst = inst; + m_pickedUpCount = 0; + m_lastRespawnTime = 0; + m_lastPickedUpTime = 0.0; + m_totalPickedUpDelay = 0.0; + m_avgPickedUpDelay = 0.0; + m_totalRespawnPickUpDelay = 0.0; + m_avgRespawnPickUpDelay = 0.0; + m_touchCount = 0; + m_lastTouchTime = 0.0; + m_totalTouchDelay = 0.0; + m_avgTouchDelay = 0.0; + m_type = type; +} + +PickupInstInfo::~PickupInstInfo() +{ +} + +void PickupInstInfo::PickedUp(float fTime) +{ + float delay = fTime - m_lastPickedUpTime; + + m_totalPickedUpDelay += delay; + m_pickedUpCount++; + m_avgPickedUpDelay = m_totalPickedUpDelay/m_pickedUpCount; + + m_totalRespawnPickUpDelay += (fTime - m_lastRespawnTime); + m_avgRespawnPickUpDelay = m_totalRespawnPickUpDelay/m_pickedUpCount; + + m_lastPickedUpTime = fTime; +} + +void PickupInstInfo::Touch(float fTime) +{ + m_touchCount++; + m_totalTouchDelay += (fTime - m_lastTouchTime); + m_avgTouchDelay = m_totalTouchDelay/m_touchCount; + m_lastTouchTime = fTime; +} + +bool PickupInstInfo::Compare(PickupInst* pickupInst) +{ + return (m_pickUpInst == pickupInst); +} + +bool PickupInstInfo::Compare(edict_t *ent) +{ + edict_t *myEnt = m_pickUpInst?m_pickUpInst->GetEdict():NULL; + + return (myEnt && (myEnt == ent)); +} + +/**************************** + + class PickupInfoList + +****************************/ + +PickupInfoList::PickupInfoList() +{ + memset(m_failedMsgs, 0, event_MAXEVENTS); + m_infoFile = NULL; + m_bInfoFileOpened = false; +} + +PickupInfoList::~PickupInfoList() +{ + map::iterator it; + + for (it = m_info.begin(); it != m_info.end(); it++) + { + delete (PickupInfo*)((*it).second); + } + m_info.clear(); + + if (m_infoFile) + { + fclose(m_infoFile); + m_infoFile = NULL; + } +} + +PickupInfo* PickupInfoList::AddPickupInst(PickupInst *pickupInst, int type /*type_LOADTIME*/) +{ + map::iterator it; + objType_t objType = OBJ_NONE; + + if ((NULL == pickupInst) || (NULL == pickupInst->GetPickup())) + { + return NULL; + } + it = m_info.find(objType = pickupInst->GetPickup()->GetPickupListIndex()); + if (it != m_info.end()) + { // add this inst to our list of insts for this type of pickup + (PickupInfo*)((*it).second)->AddInst(pickupInst, type); + return (PickupInfo*)((*it).second); + } + else + { // not in our list yet, so add it. + m_info[objType] = new PickupInfo(objType); + + // now add the instance of this PickupInfo. + it = m_info.find(objType); + if (it == m_info.end()) + { // couldn't add to map? bad bad bad. + return NULL; + } + (PickupInfo*)((*it).second)->AddInst(pickupInst, type); + return (PickupInfo*)m_info[objType]; + } +} + +bool PickupInfoList::HandleEvent(int nEvent, PickupInst *pickupInst) +{ + bool bRetVal = false; + switch(nEvent) + { + case event_NONE: + { + m_failedMsgs[event_NONE]++; + break; + } + case event_CREATE_LOADTIME: + { + bRetVal = (NULL != AddPickupInst(pickupInst,PickupInstInfo::type_LOADTIME)); + break; + } + case event_CREATE_RUNTIME: + { + bRetVal = (NULL != AddPickupInst(pickupInst,PickupInstInfo::type_RUNTIME)); + break; + } + case event_PICKEDUP: + { + PickupInfo *info = AddPickupInst(pickupInst,PickupInstInfo::type_RUNTIME); + if (NULL == info) + { + m_failedMsgs[event_PICKEDUP]++; + break; + } + info->PickedUp(pickupInst, level.time); + bRetVal = true; + break; + } + case event_RESPAWN: + { + PickupInfo *info = AddPickupInst(pickupInst,PickupInstInfo::type_RUNTIME); + if (NULL == info) + { + m_failedMsgs[event_RESPAWN]++; + break; + } + info->SetRespawnTime(pickupInst, level.time); + bRetVal = true; + break; + } + case event_TOUCHED: + { + PickupInfo *info = AddPickupInst(pickupInst,PickupInstInfo::type_RUNTIME); + if (NULL == info) + { + m_failedMsgs[event_TOUCHED]++; + break; + } + info->Touch(pickupInst, level.time); + bRetVal = true; + break; + } + default: + { + m_failedMsgs[event_UNKNOWN]++; + break; + } + } + return bRetVal; +} + +PickupInstInfo *PickupInfoList::Find(PickupInst *pickupInst) +{ + map::iterator it; + PickupInstInfo *info = NULL; + + if ( (NULL == pickupInst) || (NULL == pickupInst->GetPickup()) ) + { + return NULL; + } + it = m_info.find(pickupInst->GetPickup()->GetPickupListIndex()); + if (it == m_info.end()) + { + return NULL; + } + return (PickupInstInfo*)((*it).second)->Find(pickupInst); +} + +int PickupInfoList::GetPickedUpCount(PickupInst *pickupInst) +{ + PickupInstInfo *info = Find(pickupInst); + + if (NULL == info) + { + return -1; + } + return info->GetPickedUpCount(); +} + +float PickupInfoList::GetAvgPickedUpDelay(PickupInst *pickupInst) +{ + PickupInstInfo *info = Find(pickupInst); + + if (NULL == info) + { + return -1; + } + return info->GetAvgPickedUpDelay(); +} + +float PickupInfoList::GetAvgRespawnPickUpDelay(PickupInst *pickupInst) +{ + PickupInstInfo *info = Find(pickupInst); + + if (NULL == info) + { + return -1; + } + return info->GetAvgRespawnPickUpDelay(); +} + +float PickupInfoList::GetAvgTouchDelay(PickupInst *pickupInst) +{ + PickupInstInfo *info = Find(pickupInst); + + if (NULL == info) + { + return -1; + } + return info->GetAvgTouchDelay(); +} + +int PickupInfoList::GetTouchCount(PickupInst *pickupInst) +{ + PickupInstInfo *info = Find(pickupInst); + + if (NULL == info) + { + return -1; + } + return info->GetTouchCount(); +} + +int PickupInfoList::GetType(PickupInst *pickupInst) +{ + PickupInstInfo *info = Find(pickupInst); + + if (NULL == info) + { + return -1; + } + return info->GetType(); +} + +void PickupInfoList::WriteLine(char *text) +{ + if (NULL == m_infoFile) + { + char name[MAX_QPATH]; + + Com_sprintf (name, sizeof(name), "%s/pickups.log", gi.FS_Userdir()); + if (m_bInfoFileOpened) + { // file's already been started so append to it + m_infoFile = fopen(name, "a"); + } + else + { // file hasn't been created yet, so create one...overwrite any previous file + m_infoFile = fopen(name, "w"); + m_bInfoFileOpened = true; + } + if (NULL == m_infoFile) + { + return; + } + } + fprintf(m_infoFile, "%s", text); + fflush(m_infoFile); // force it to save every time + fclose(m_infoFile); + m_infoFile = NULL; +} + +/**************************** + + class CratePickupInstList + + tracks all of the pickups that are going to spring forth from a busted-open crate + ****************************/ + +void CratePickupInstList::Create(char *name) +{ + edict_t *t = NULL; + + if (name) + { + if (!Compare(name)) + { + Clear(); + while ((t = G_Find (t, FOFS(targetname), name))) + { + Push(thePickupList.GetPickupInstFromEdict(t)); + } + } + } +} + +/**************************** + + +class PickupList + + the queen mother list of items. + + ****************************/ + +PickupList::PickupList() +{ + // if you want to see a list of all available pickups, type the command listpickups at the console + + //spawnName type spawnParm respawnTime defaultCount defaultMaxCount index worldName (FIXME) pickupstringindex ammopickupstringindex itemfullstringindex flags + m_pickups[OBJ_NONE] = new Pickup (); + m_pickups[OBJ_AMMO_KNIFE] = new AmmoPickup ("item_ammo_knife", PU_AMMO, AMMO_KNIFE, 30, 1, -1, OBJ_AMMO_KNIFE, "Knife", ITEMS_KNIFE_PICKUP, ITEMS_KNIFE_PICKUP, ITEMS_KNIFE_FULL, AmmoPickup::ammoFlag_BULLET); + m_pickups[OBJ_AMMO_PISTOL] = new AmmoPickup ("item_ammo_pistol", PU_AMMO, AMMO_9MM, 30, 30, -1, OBJ_AMMO_PISTOL, "9mm Ammo", ITEMS_9MM_AMMO_PICKUP, ITEMS_9MM_AMMO_PICKUP, ITEMS_9MM_AMMO_FULL, AmmoPickup::ammoFlag_BULLET); + m_pickups[OBJ_AMMO_SHOTGUN] = new AmmoPickup ("item_ammo_shotgun", PU_AMMO, AMMO_SHELLS, 30, 5, -1, OBJ_AMMO_SHOTGUN, "12 gauge shells", ITEMS_12_GAUGE_AMMO_PICKUP, ITEMS_12_GAUGE_AMMO_PICKUP, ITEMS_12_GAUGE_AMMO_FULL, AmmoPickup::ammoFlag_BULLET); + m_pickups[OBJ_AMMO_PISTOL2] = new AmmoPickup ("item_ammo_pistol2", PU_AMMO, AMMO_44, 30, 5, -1, OBJ_AMMO_PISTOL2, ".44 Ammo", ITEMS_44_AMMO_PICKUP, ITEMS_44_AMMO_PICKUP, ITEMS_44_AMMO_FULL, AmmoPickup::ammoFlag_BULLET); + m_pickups[OBJ_AMMO_AUTO] = new AmmoPickup ("item_ammo_auto", PU_AMMO, AMMO_556, 30, 30, -1, OBJ_AMMO_AUTO, "5.56 Ammo", ITEMS_556_AMMO_PICKUP, ITEMS_556_AMMO_PICKUP, ITEMS_556_AMMO_FULL, AmmoPickup::ammoFlag_BULLET); + m_pickups[OBJ_AMMO_MPG] = new AmmoPickup ("item_ammo_battery", PU_AMMO, AMMO_MWAVE, 30, 30, -1, OBJ_AMMO_MPG, "Battery", ITEMS_BATTERY_PICKUP, ITEMS_BATTERY_PICKUP, ITEMS_BATTERY_FULL); + m_pickups[OBJ_AMMO_GAS] = new AmmoPickup ("item_ammo_gas", PU_AMMO, AMMO_FTHROWER, 30, 30, -1, OBJ_AMMO_GAS, "Flamethrower Gas", ITEMS_GAS_PICKUP, ITEMS_GAS_PICKUP, ITEMS_GAS_FULL); + m_pickups[OBJ_AMMO_ROCKET] = new AmmoPickup ("item_ammo_rocket", PU_AMMO, AMMO_ROCKET, 30, 5, -1, OBJ_AMMO_ROCKET, "NM-22 Rockets", ITEMS_ROCKET_AMMO_PICKUP, ITEMS_ROCKET_AMMO_PICKUP, ITEMS_ROCKET_AMMO_FULL); + m_pickups[OBJ_AMMO_SLUG] = new AmmoPickup ("item_ammo_slug", PU_AMMO, AMMO_SLUG, 30, 10, -1, OBJ_AMMO_SLUG, "Slugs", ITEMS_SLUGS_PICKUP, ITEMS_SLUGS_PICKUP, ITEMS_SLUGS_FULL); + + m_pickups[OBJ_AMMO_SINGLE_PISTOL] = new AmmoPickup ("item_ammo_sp_pistol", PU_AMMO, AMMO_9MM, 30, 30, -1, OBJ_AMMO_SINGLE_PISTOL, "9mm Ammo", ITEMS_9MM_AMMO_PICKUP, ITEMS_9MM_AMMO_PICKUP, ITEMS_9MM_AMMO_FULL, AmmoPickup::ammoFlag_BULLET); + m_pickups[OBJ_AMMO_SINGLE_SHOTGUN]= new AmmoPickup ("item_ammo_sp_shotgun", PU_AMMO, AMMO_SHELLS, 30, 5, -1, OBJ_AMMO_SINGLE_SHOTGUN,"12 gauge shells", ITEMS_12_GAUGE_AMMO_PICKUP, ITEMS_12_GAUGE_AMMO_PICKUP, ITEMS_12_GAUGE_AMMO_FULL, AmmoPickup::ammoFlag_BULLET); + m_pickups[OBJ_AMMO_SINGLE_PISTOL2] =new AmmoPickup ("item_ammo_sp_pistol2", PU_AMMO, AMMO_44, 30, 5, -1, OBJ_AMMO_SINGLE_PISTOL2,".44 Ammo", ITEMS_44_AMMO_PICKUP, ITEMS_44_AMMO_PICKUP, ITEMS_44_AMMO_FULL, AmmoPickup::ammoFlag_BULLET); + m_pickups[OBJ_AMMO_SINGLE_AUTO]= new AmmoPickup ("item_ammo_sp_auto", PU_AMMO, AMMO_556, 30, 30, -1, OBJ_AMMO_SINGLE_AUTO, "5.56 Ammo", ITEMS_556_AMMO_PICKUP, ITEMS_556_AMMO_PICKUP, ITEMS_556_AMMO_FULL, AmmoPickup::ammoFlag_BULLET); + m_pickups[OBJ_AMMO_SINGLE_MPG] = new AmmoPickup ("item_ammo_sp_battery", PU_AMMO, AMMO_MWAVE, 30, 30, -1, OBJ_AMMO_SINGLE_MPG, "Battery", ITEMS_BATTERY_PICKUP, ITEMS_BATTERY_PICKUP, ITEMS_BATTERY_FULL); + m_pickups[OBJ_AMMO_SINGLE_GAS] = new AmmoPickup ("item_ammo_sp_gas", PU_AMMO, AMMO_FTHROWER, 30, 30, -1, OBJ_AMMO_SINGLE_GAS, "Flamethrower Gas", ITEMS_GAS_PICKUP, ITEMS_GAS_PICKUP, ITEMS_GAS_FULL); + m_pickups[OBJ_AMMO_SINGLE_ROCKET] = new AmmoPickup ("item_ammo_sp_rocket", PU_AMMO, AMMO_ROCKET, 30, 5, -1, OBJ_AMMO_SINGLE_ROCKET, "NM-22 Rockets", ITEMS_ROCKET_AMMO_PICKUP, ITEMS_ROCKET_AMMO_PICKUP, ITEMS_ROCKET_AMMO_FULL); + m_pickups[OBJ_AMMO_SINGLE_SLUG]= new AmmoPickup ("item_ammo_sp_slug", PU_AMMO, AMMO_SLUG, 30, 10, -1, OBJ_AMMO_SINGLE_SLUG, "Slugs", ITEMS_SLUGS_PICKUP, ITEMS_SLUGS_PICKUP, ITEMS_SLUGS_FULL); + + m_pickups[OBJ_WPN_PISTOL2] = new WeaponPickup ("item_weapon_pistol2", PU_WEAPON, SFW_PISTOL2, 30, 0, -1, OBJ_WPN_PISTOL2, ".44 Pistol", ITEMS_44_PISTOL_PICKUP, ITEMS_44_AMMO_PICKUP, ITEMS_44_AMMO_FULL, WeaponPickup::wpnFlag_BULLET); + m_pickups[OBJ_WPN_PISTOL1] = new WeaponPickup ("item_weapon_pistol1", PU_WEAPON, SFW_PISTOL1, 30, 0, -1, OBJ_WPN_PISTOL1, "9mm Pistol", ITEMS_9MM_PISTOL_PICKUP, ITEMS_9MM_AMMO_PICKUP, ITEMS_9MM_AMMO_FULL, WeaponPickup::wpnFlag_BULLET); + m_pickups[OBJ_WPN_MACHINEPISTOL] = new WeaponPickup ("item_weapon_machinepistol", PU_WEAPON, SFW_MACHINEPISTOL, 30, 0, -1, OBJ_WPN_MACHINEPISTOL, "9mm Suppressed SMG", ITEMS_9MM_SMG_PICKUP, ITEMS_9MM_AMMO_PICKUP, ITEMS_9MM_AMMO_FULL, WeaponPickup::wpnFlag_BULLET); + m_pickups[OBJ_WPN_ASSAULTRIFLE] = new WeaponPickup ("item_weapon_assault_rifle", PU_WEAPON, SFW_ASSAULTRIFLE, 30, 0, -1, OBJ_WPN_ASSAULTRIFLE, "5.56 SMG", ITEMS_556_SMG_PICKUP, ITEMS_556_AMMO_PICKUP, ITEMS_556_AMMO_FULL, WeaponPickup::wpnFlag_BULLET); + m_pickups[OBJ_WPN_SNIPER] = new WeaponPickup ("item_weapon_sniper_rifle", PU_WEAPON, SFW_SNIPER, 30, 0, -1, OBJ_WPN_SNIPER, "5.56 Sniper Rifle", ITEMS_556_SNIPER_PICKUP, ITEMS_556_AMMO_PICKUP, ITEMS_556_AMMO_FULL, WeaponPickup::wpnFlag_BULLET); + m_pickups[OBJ_WPN_AUTOSHOTGUN] = new WeaponPickup ("item_weapon_autoshotgun", PU_WEAPON, SFW_AUTOSHOTGUN, 60, 0, -1, OBJ_WPN_AUTOSHOTGUN, "Repeating Slug Thrower", ITEMS_SLUGTHROWER_PICKUP, ITEMS_SLUGS_PICKUP, ITEMS_SLUGS_FULL); + m_pickups[OBJ_WPN_SHOTGUN] = new WeaponPickup ("item_weapon_shotgun", PU_WEAPON, SFW_SHOTGUN, 30, 0, -1, OBJ_WPN_SHOTGUN, "12 Gauge Shotgun", ITEMS_12_GAUGE_SHOTGUN_PICKUP, ITEMS_12_GAUGE_AMMO_PICKUP, ITEMS_12_GAUGE_AMMO_FULL, WeaponPickup::wpnFlag_BULLET); + m_pickups[OBJ_WPN_MACHINEGUN] = new WeaponPickup ("item_weapon_machinegun", PU_WEAPON, SFW_MACHINEGUN, 30, 0, -1, OBJ_WPN_MACHINEGUN, "Heavy Machinegun", ITEMS_HEAVY_MACHINEGUN_PICKUP, ITEMS_556_AMMO_PICKUP, ITEMS_556_AMMO_FULL, WeaponPickup::wpnFlag_BULLET); + m_pickups[OBJ_WPN_ROCKET] = new WeaponPickup ("item_weapon_rocketlauncher", PU_WEAPON, SFW_ROCKET, 75, 0, -1, OBJ_WPN_ROCKET, "M-1943 Rocket Launcher", ITEMS_ROCKET_LAUNCHER_PICKUP, ITEMS_ROCKET_AMMO_PICKUP, ITEMS_ROCKET_AMMO_FULL); + m_pickups[OBJ_WPN_MICROWAVE] = new WeaponPickup ("item_weapon_microwavepulse", PU_WEAPON, SFW_MICROWAVEPULSE, 90, 0, -1, OBJ_WPN_MICROWAVE, "Microwave Pulse", ITEMS_MICROWAVE_PULSE_PICKUP, ITEMS_BATTERY_PICKUP, ITEMS_BATTERY_FULL); + m_pickups[OBJ_WPN_FLAMEGUN] = new WeaponPickup ("item_weapon_flamethrower", PU_WEAPON, SFW_FLAMEGUN, 60, 0, -1, OBJ_WPN_FLAMEGUN, "L-32 Flame Gun", ITEMS_FLAME_GUN_PICKUP, ITEMS_GAS_PICKUP, ITEMS_GAS_FULL); + m_pickups[OBJ_ARMOR] = new Pickup ("item_equip_armor", PU_ARMOR, 0, 30, 50, -1, OBJ_ARMOR, "Armor", ITEMS_ARMOR_PICKUP, ITEMS_ARMOR_PICKUP, ITEMS_ARMOR_ALREADY_FULL); + m_pickups[OBJ_ITM_FLASHPACK] = new Pickup ("item_equip_flashpack", PU_INV, SFE_FLASHPACK, 30, 1, 6, OBJ_ITM_FLASHPACK, "Flashpack", ITEMS_FLASHPACK_PICKUP, ITEMS_FLASHPACK_PICKUP, ITEMS_FLASHPACK_FULL); +// m_pickups[OBJ_ITM_NEURALGRENADE] = new Pickup ("item_equip_neural_grenade", PU_INV, SFE_NEURAL_GRENADE, 30, 1, -1, OBJ_ITM_NEURALGRENADE, "Neural Pulse Grenade", ITEMS_NEURALGRENADE_PICKUP, ITEMS_NEURALGRENADE_PICKUP, ITEMS_NEURALGRENADE_FULL); + m_pickups[OBJ_ITM_C4] = new Pickup ("item_equip_c4", PU_INV, SFE_C4, 30, 1, 4, OBJ_ITM_C4, "C4", ITEMS_C4_PICKUP, ITEMS_C4_PICKUP, ITEMS_C4_FULL); + m_pickups[OBJ_ITM_LIGHTGOGGLES] = new LightGogglesPickup ("item_equip_light_goggles", PU_INV, SFE_LIGHT_GOGGLES, 30, 100, 100, OBJ_ITM_LIGHTGOGGLES, "Light Amplification Goggles", ITEMS_LIGHTGOGGLES_PICKUP, ITEMS_LIGHTGOGGLES_PICKUP, ITEMS_LIGHTGOGGLES_FULL); + m_pickups[OBJ_ITM_MINE] = new Pickup ("item_equip_claymore", PU_INV, SFE_CLAYMORE, 30, 1, -1, OBJ_ITM_MINE, "Mine", ITEMS_CLAYMORE_PICKUP, ITEMS_CLAYMORE_PICKUP, ITEMS_CLAYMORE_FULL); + m_pickups[OBJ_ITM_MEDKIT] = new MedKitPickup ("item_equip_medkit", PU_INV, SFE_MEDKIT, 30, 1, 2, OBJ_ITM_MEDKIT, "MedKit", ITEMS_MEDKIT_PICKUP, ITEMS_MEDKIT_PICKUP, ITEMS_MEDKIT_FULL); + m_pickups[OBJ_ITM_GRENADE] = new Pickup ("item_equip_grenade", PU_INV, SFE_GRENADE, 30, 1, 6, OBJ_ITM_GRENADE, "Grenade", ITEMS_GRENADE_PICKUP, ITEMS_GRENADE_PICKUP, ITEMS_GRENADE_FULL); + m_pickups[OBJ_CTF_FLAG] = new Pickup ("item_ctf_flag", PU_INV, SFE_CTFFLAG, 30, 1, -1, OBJ_CTF_FLAG, "Flag", ITEMS_CTF_FLAG_PICKUP, ITEMS_CTF_FLAG_PICKUP_2, ITEMS_CTF_FLAG_PICKUP); + m_pickups[OBJ_HLTH_SM] = new Pickup ("item_health_small", PU_HEALTH, SFH_SMALL_HEALTH, 30, 25, -1, OBJ_HLTH_SM, "Small Health", ITEMS_HEALTH_PICKUP, ITEMS_HEALTH_PICKUP, ITEMS_HEALTH_PICKUP); + m_pickups[OBJ_HLTH_LRG] = new Pickup ("item_health_large", PU_HEALTH, SFH_LARGE_HEALTH, 30, 50, -1, OBJ_HLTH_LRG, "Large Health", ITEMS_HEALTH_PICKUP, ITEMS_HEALTH_PICKUP, ITEMS_HEALTH_PICKUP); + + m_pickupInfoList = NULL; + + m_bDisplayedWeaponArenaHelp = false; +} + +PickupList::~PickupList() +{ + list::iterator it; + + for (int i = 0; i < MAX_ITM_OBJS; i++) + { + delete m_pickups[i]; + m_pickups[i] = NULL; + } + + for (it = m_pickupInsts.begin(); it != m_pickupInsts.end(); it++) + { + delete (*it); + } + m_pickupInsts.clear(); + + delete m_pickupInfoList; + m_pickupInfoList = NULL; +} + +// set up the modelSpawnData for all of our pickups. +int PickupList::PreSpawnInit() +{ + int retVal = true; + + for (int i = 0; i < MAX_ITM_OBJS; i++) + { + if (m_pickups[i]->Init()) + { + // there's some per-model special stuff that has to happen before we can use each item...setting up + //a skin, making some bbox modifications, etc. + SetPickupSkin(i); + ModifyPickupBBox(i); + SetPickupScale(i); + SetPickupLowPolyModel(i); + SetGSQ(i); + SetDroppedStringIndex(i); + } + else + {// something failed in the init'ing of this item's modelSpawnData. file missing? + retVal = false; + } + } + + m_pickupInsts.clear(); + + if (pickupinfo->value) + { + m_pickupInfoList = new PickupInfoList; + } + + return retVal; +} + +int PickupList::PostSpawnInit() +{ + list::iterator it; + edict_t *ent = NULL; + + // for starters, check if any pickups are inside of crates + + for (it = m_pickupInsts.begin(); it != m_pickupInsts.end(); it++) + { + if ( (ent = (*it)->GetEdict()) && + (ent->spawnflags & SF_PICKUP_START_CRATED) ) + { + InitCrated(ent); + } + } + + return true; +} + +void PickupList::Destroy() +{ + // kef -- see if we want to dump our pickup list to a file + if (pickupinfo->value > 1) + { + DumpList(PickupList::print_FILE); + } + delete m_pickupInfoList; + m_pickupInfoList = NULL; + + m_crateList.Destroy(); + + // DO NOT call this before the above DumpList. + UnregisterAll(); +} + +void PickupList::WriteLine(int printDest, char *outLine, ...) +{ + va_list argptr; + char text[1024]; + + va_start (argptr, outLine); + vsprintf (text, outLine, argptr); + va_end (argptr); + + if (print_CONSOLE == printDest) + { + Com_Printf(text); + } + else if (print_FILE == printDest) + { + if (m_pickupInfoList) + { + m_pickupInfoList->WriteLine(text); + } + } +} + +// output the contents of m_pickups to the console. output version, too? +void PickupList::DumpList(int printDest/*print_CONSOLE*/) +{ + list::iterator it; + int i = -1; + edict_t *ent = NULL; + Pickup *pickup = NULL; + char buf[256], buf2[32]; + int nClassname = 6, + nIndex = 32, + nCount = 39, + nLocation = 46, + nCurPos = 0; + int gametime = (int)(level.time - level.startTime); + int gamehours=0, gameminutes=0, gameseconds=0; + + gamehours = (gametime)/(int)3600; + gameminutes = ((gametime) - (gamehours*3600))/(int)60; + gameseconds = (gametime) - (gamehours*3600 + gameminutes*60); + memset(buf, 0, 64); + WriteLine(printDest, "//\n// begin pickup list -- map:%s, elapsed gametime: %d:%s%d:%s%d\n//\n", level.mapname, + gamehours, (gameminutes<10?"0":""), gameminutes, (gameseconds<10?"0":""), gameseconds); + WriteLine(printDest,"# classname index count location\n\n"); + if (m_pickupInfoList) + { // output info for each pickupinst + WriteLine(printDest, " type of # of times average average # of times average\n"); + WriteLine(printDest, " creation picked up pickup respawn touched touch \n"); + WriteLine(printDest, " delay pickup delay \n\n"); + } + for (it = m_pickupInsts.begin(), i = 0; it != m_pickupInsts.end(); it++, i++) + { + ent = (*it)->GetEdict(); + pickup = (*it)->GetPickup(); + // print the number + strcpy(buf, itoa(i, buf2, 10)); + strcat(buf, ":"); // add 1 for the : + nCurPos = strlen(buf2)+1; + // get to the position for printing the classname + while (nCurPos < nClassname) + { + strcat(buf, " "); + nCurPos++; + } + // print the classname + strncat(buf, ent->classname, 32); + nCurPos += strlen(ent->classname); + // get to the position for printing the index + while (nCurPos < nIndex) + { + strcat(buf, " "); + nCurPos++; + } + // print the pickup index + strcat(buf, itoa(pickup->GetPickupListIndex(), buf2, 10)); + nCurPos += strlen(buf2); + // get to the position for printing the count + while (nCurPos < nCount) + { + strcat(buf, " "); + nCurPos++; + } + // print the count for the object + strcat(buf, itoa(ent->count, buf2, 10)); + nCurPos += strlen(buf2); + // get to the position for printing the location + while (nCurPos < nLocation) + { + strcat(buf, " "); + nCurPos++; + } + strcpy(buf2, vtos(ent->s.origin)); + strcat(buf, buf2); + nCurPos += strlen(buf2); + + if (m_pickupInfoList) + { // output the info for this pickupinst + int nInfo0 = nLocation + 23, + nInfo1 = nInfo0 + 10, + nInfo2 = nInfo1 + 11, + nInfo3 = nInfo2 + 9, + nInfo4 = nInfo3 + 9, + nInfo5 = nInfo4 + 12; + + + // get to the position for printing the creation type + while (nCurPos < nInfo0) + { + strcat(buf, " "); + nCurPos++; + } + // print the pickup count + if (m_pickupInfoList->GetType(*it) == PickupInstInfo::type_LOADTIME) + { + strcat(buf, "Design"); + nCurPos += strlen("Design"); + } + else + { + strcat(buf, "Dropped"); + nCurPos += strlen("Dropped"); + } + + // get to the position for printing the pickup count + while (nCurPos < nInfo1) + { + strcat(buf, " "); + nCurPos++; + } + // print the pickup count + strcat(buf, itoa(m_pickupInfoList->GetPickedUpCount(*it), buf2, 10)); + nCurPos += strlen(buf2); + + // get to the position for printing the avg pickup delay + while (nCurPos < nInfo2) + { + strcat(buf, " "); + nCurPos++; + } + // print the pickup count + strcat(buf, itoa(m_pickupInfoList->GetAvgPickedUpDelay(*it), buf2, 10)); + nCurPos += strlen(buf2); + + // get to the position for printing the avg respawn-pickup delay + while (nCurPos < nInfo3) + { + strcat(buf, " "); + nCurPos++; + } + // print the pickup count + strcat(buf, itoa(m_pickupInfoList->GetAvgRespawnPickUpDelay(*it), buf2, 10)); + nCurPos += strlen(buf2); + + // get to the position for printing the number of times touched + while (nCurPos < nInfo4) + { + strcat(buf, " "); + nCurPos++; + } + // print the pickup count + strcat(buf, itoa(m_pickupInfoList->GetTouchCount(*it), buf2, 10)); + nCurPos += strlen(buf2); + + // get to the position for printing the number of avg touch delay + while (nCurPos < nInfo5) + { + strcat(buf, " "); + nCurPos++; + } + // print the pickup count + strcat(buf, itoa(m_pickupInfoList->GetAvgTouchDelay(*it), buf2, 10)); + nCurPos += strlen(buf2); + } + WriteLine(printDest, "%s\n", buf); + } + WriteLine(printDest, "//\n// end pickup list\n//\n"); +} + +// called every frame, this fn polls pickups for removal of used callbacks. G_FreeEdict() calls our Unregister fn +//for every PickupInst getting freed +int PickupList::FrameUpdate() +{ + list::iterator it; + + for (it = m_pickupInsts.begin(); it != m_pickupInsts.end(); it++) + { + switch((*it)->GetFadeStatus()) + { + case PickupInst::fading_REMOVECALLBACK: + { // this inst has finished fading in so remove its callback. + (*it)->RemoveCallBack(); + HandleInfoEvent(PickupInfoList::event_RESPAWN, (*it)->GetEdict()); + break; + } + default: + break; + } + } + return true; +} + +float PickupList::WeaponArena(float cvarVal) +{ + return cvarVal; +} + +void PickupList::WeaponArenaHelp() +{ + if (!m_bDisplayedWeaponArenaHelp) + { + m_bDisplayedWeaponArenaHelp = true; + Com_Printf("*\n* weaponarena usage\n*\n"); + for (int i = OBJ_NONE; i < MAX_ITM_OBJS; i++) + { + Com_Printf("%d: %s\n", i, m_pickups[i]->GetSpawnName()); + } + Com_Printf("*\n* end weaponarena usage\n*\n\n"); + } +} + +// some pickups, like ammo boxes, use the same model but a different skin +void PickupList::SetPickupSkin(int listIndex) +{ + switch(listIndex) + { + case OBJ_NONE: + break; + case OBJ_AMMO_KNIFE: + break; + case OBJ_AMMO_PISTOL: + m_pickups[listIndex]->SetSkin("pistolbox"); + break; + case OBJ_AMMO_SHOTGUN: + m_pickups[listIndex]->SetSkin("shotgunbox"); + break; + case OBJ_AMMO_PISTOL2: + m_pickups[listIndex]->SetSkin("pistol2box"); + break; + case OBJ_AMMO_AUTO: + m_pickups[listIndex]->SetSkin("autobox"); + break; + case OBJ_AMMO_MPG: + m_pickups[listIndex]->SetSkin("batterybox"); + break; + case OBJ_AMMO_GAS: + m_pickups[listIndex]->SetSkin("gasbox"); + break; + case OBJ_AMMO_ROCKET: + m_pickups[listIndex]->SetSkin("rocketbox"); + break; + case OBJ_AMMO_SLUG: + m_pickups[listIndex]->SetSkin("slugbox"); + break; + + case OBJ_AMMO_SINGLE_PISTOL: + m_pickups[listIndex]->SetSkin("ammo_9mm_single"); + break; + case OBJ_AMMO_SINGLE_SHOTGUN: + m_pickups[listIndex]->SetSkin("ammo_00_single"); + break; + case OBJ_AMMO_SINGLE_PISTOL2: + m_pickups[listIndex]->SetSkin("ammo_44_single"); + break; + case OBJ_AMMO_SINGLE_AUTO: + m_pickups[listIndex]->SetSkin("ammo_556_single"); + break; + case OBJ_AMMO_SINGLE_MPG: + m_pickups[listIndex]->SetSkin("ammo_bat"); + break; + case OBJ_AMMO_SINGLE_GAS: + m_pickups[listIndex]->SetSkin("ammo_gas_single"); + break; + case OBJ_AMMO_SINGLE_ROCKET: + m_pickups[listIndex]->SetSkin("ammo_rocket_single"); + break; + case OBJ_AMMO_SINGLE_SLUG: + m_pickups[listIndex]->SetSkin("ammo_slug_single"); + break; + + case OBJ_WPN_PISTOL2: + break; + case OBJ_WPN_PISTOL1: + break; + case OBJ_WPN_MACHINEPISTOL: + break; + case OBJ_WPN_ASSAULTRIFLE: + break; + case OBJ_WPN_SNIPER: + break; + case OBJ_WPN_AUTOSHOTGUN: + break; + case OBJ_WPN_SHOTGUN: + break; + case OBJ_WPN_MACHINEGUN: + break; + case OBJ_WPN_ROCKET: + break; + case OBJ_WPN_MICROWAVE: + break; + case OBJ_WPN_FLAMEGUN: + break; + case OBJ_ARMOR: + break; + case OBJ_ITM_FLASHPACK: + break; +// case OBJ_ITM_NEURALGRENADE: +// break; + case OBJ_ITM_C4: + break; + case OBJ_ITM_LIGHTGOGGLES: + break; + case OBJ_ITM_MINE: + break; + case OBJ_ITM_MEDKIT: + break; + case OBJ_ITM_GRENADE: + break; + case OBJ_CTF_FLAG: + break; + case OBJ_HLTH_SM: + break; + case OBJ_HLTH_LRG: + break; + } +} + +// some pickups need help laying down on flat surfaces +void PickupList::ModifyPickupBBox(int listIndex) +{ + vec3_t adjMins = {0,0,0}; + + switch(listIndex) + { + case OBJ_AMMO_PISTOL: + case OBJ_AMMO_SHOTGUN: + case OBJ_AMMO_PISTOL2: + case OBJ_AMMO_AUTO: + case OBJ_AMMO_MPG: + case OBJ_AMMO_GAS: + case OBJ_AMMO_ROCKET: + case OBJ_AMMO_SLUG: + adjMins[2] = -6; + break; + + case OBJ_AMMO_SINGLE_PISTOL: + adjMins[2] = 0; + break; + case OBJ_AMMO_SINGLE_SHOTGUN: + adjMins[2] = 1; + break; + case OBJ_AMMO_SINGLE_PISTOL2: + break; + case OBJ_AMMO_SINGLE_AUTO: + break; + case OBJ_AMMO_SINGLE_MPG: + break; + case OBJ_AMMO_SINGLE_GAS: + break; + case OBJ_AMMO_SINGLE_ROCKET: + adjMins[2] = -0.5; + break; + case OBJ_AMMO_SINGLE_SLUG: + adjMins[2] = 1; + break; + + case OBJ_WPN_PISTOL2: + case OBJ_WPN_PISTOL1: + adjMins[2] = -1.5; + break; + case OBJ_WPN_MACHINEPISTOL: + adjMins[2] = -3.0; + break; + case OBJ_WPN_ASSAULTRIFLE: + adjMins[2] = -2.0; + break; + case OBJ_WPN_SNIPER: + adjMins[2] = -2.0; + break; + case OBJ_WPN_AUTOSHOTGUN: + adjMins[2] = -8.5; + break; + case OBJ_WPN_SHOTGUN: + adjMins[2] = -3.0; + break; + case OBJ_WPN_MACHINEGUN: + adjMins[2] = -3.0; + break; + case OBJ_WPN_ROCKET: + adjMins[2] = -10.5; + break; + case OBJ_WPN_MICROWAVE: + adjMins[2] = -8.0; + break; + case OBJ_WPN_FLAMEGUN: + adjMins[2] = -2.5; + break; + + case OBJ_ARMOR: + break; + + case OBJ_ITM_FLASHPACK: + adjMins[2] = -9; + break; +// case OBJ_ITM_NEURALGRENADE: // 12/28/99 who knows? we don't have a model yet. +// break; + case OBJ_ITM_C4: + adjMins[2] = -5.0; + break; + case OBJ_ITM_LIGHTGOGGLES: + adjMins[2] = -4.5; + break; + case OBJ_ITM_MINE: + adjMins[2] = -5.0; + break; + case OBJ_ITM_MEDKIT: + adjMins[2] = 0.5; + break; + case OBJ_ITM_GRENADE: + adjMins[2] = 0; + break; + + case OBJ_CTF_FLAG: + break; + + case OBJ_HLTH_SM: + break; + case OBJ_HLTH_LRG: + break; + } + m_pickups[listIndex]->SetBBoxAdjustMins(adjMins); +} + +// a lot of pickups get scaled differently +void PickupList::SetPickupScale(int listIndex) +{ + switch(listIndex) + { + case OBJ_NONE: + break; + case OBJ_AMMO_KNIFE: + // knives use the default scale of 1 because we don't want them growing when someone dies with + //knives stuck in them + break; + case OBJ_AMMO_PISTOL: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_AMMO_SHOTGUN: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_AMMO_PISTOL2: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_AMMO_AUTO: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_AMMO_MPG: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_AMMO_GAS: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_AMMO_ROCKET: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_AMMO_SLUG: + m_pickups[listIndex]->SetScale(1.75); + break; + + case OBJ_AMMO_SINGLE_PISTOL: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_AMMO_SINGLE_SHOTGUN: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_AMMO_SINGLE_PISTOL2: + m_pickups[listIndex]->SetScale(2.00); + break; + case OBJ_AMMO_SINGLE_AUTO: + m_pickups[listIndex]->SetScale(2.00); + break; + case OBJ_AMMO_SINGLE_MPG: + m_pickups[listIndex]->SetScale(2.00); + break; + case OBJ_AMMO_SINGLE_GAS: + m_pickups[listIndex]->SetScale(2.00); + break; + case OBJ_AMMO_SINGLE_ROCKET: + m_pickups[listIndex]->SetScale(2.00); + break; + case OBJ_AMMO_SINGLE_SLUG: + m_pickups[listIndex]->SetScale(2.00); // need to be bigger than OBJ_AMMO_SINGLE_SHOTGUN + break; + + case OBJ_WPN_PISTOL2: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_WPN_PISTOL1: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_WPN_MACHINEPISTOL: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_WPN_ASSAULTRIFLE: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_WPN_SNIPER: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_WPN_AUTOSHOTGUN: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_WPN_SHOTGUN: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_WPN_MACHINEGUN: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_WPN_ROCKET: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_WPN_MICROWAVE: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_WPN_FLAMEGUN: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_ARMOR: + m_pickups[listIndex]->SetScale(1.25); + break; + case OBJ_ITM_FLASHPACK: + m_pickups[listIndex]->SetScale(1.75); + break; +// case OBJ_ITM_NEURALGRENADE: +// m_pickups[listIndex]->SetScale(1.75); +// break; + case OBJ_ITM_C4: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_ITM_LIGHTGOGGLES: + m_pickups[listIndex]->SetScale(2.0); + break; + case OBJ_ITM_MINE: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_ITM_MEDKIT: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_ITM_GRENADE: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_CTF_FLAG: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_HLTH_SM: + m_pickups[listIndex]->SetScale(1.75); + break; + case OBJ_HLTH_LRG: + m_pickups[listIndex]->SetScale(1.75); + break; + } +} + +// currently, only needed for armor, which uses a lower poly model in deathmatch than in single player. +void PickupList::SetPickupLowPolyModel(int listIndex) +{ + switch(listIndex) + { + case OBJ_NONE: + break; + case OBJ_AMMO_KNIFE: + break; + case OBJ_AMMO_PISTOL: + break; + case OBJ_AMMO_SHOTGUN: + break; + case OBJ_AMMO_PISTOL2: + break; + case OBJ_AMMO_AUTO: + break; + case OBJ_AMMO_MPG: + break; + case OBJ_AMMO_GAS: + break; + case OBJ_AMMO_ROCKET: + break; + case OBJ_AMMO_SLUG: + break; + case OBJ_AMMO_SINGLE_PISTOL: + break; + case OBJ_AMMO_SINGLE_SHOTGUN: + break; + case OBJ_WPN_PISTOL2: + break; + case OBJ_WPN_PISTOL1: + break; + case OBJ_WPN_MACHINEPISTOL: + break; + case OBJ_WPN_ASSAULTRIFLE: + break; + case OBJ_WPN_SNIPER: + break; + case OBJ_WPN_AUTOSHOTGUN: + break; + case OBJ_WPN_SHOTGUN: + break; + case OBJ_WPN_MACHINEGUN: + break; + case OBJ_WPN_ROCKET: + break; + case OBJ_WPN_MICROWAVE: + break; + case OBJ_WPN_FLAMEGUN: + break; + case OBJ_ARMOR: + m_pickups[listIndex]->SetLowPolyModel(&lowPolyArmorModel); + break; + case OBJ_ITM_FLASHPACK: + break; +// case OBJ_ITM_NEURALGRENADE: +// break; + case OBJ_ITM_C4: + break; + case OBJ_ITM_LIGHTGOGGLES: + break; + case OBJ_ITM_MINE: + break; + case OBJ_ITM_MEDKIT: + break; + case OBJ_ITM_GRENADE: + break; + case OBJ_CTF_FLAG: + break; + case OBJ_HLTH_SM: + break; + case OBJ_HLTH_LRG: + break; + } +} + +void PickupList::SetGSQ(int listIndex) +{ + switch(listIndex) + { + case OBJ_NONE: + break; + case OBJ_AMMO_KNIFE: + break; + case OBJ_AMMO_PISTOL: + case OBJ_AMMO_SHOTGUN: + case OBJ_AMMO_PISTOL2: + case OBJ_AMMO_AUTO: + case OBJ_AMMO_MPG: + case OBJ_AMMO_GAS: + case OBJ_AMMO_ROCKET: + case OBJ_AMMO_SLUG: + m_pickups[listIndex]->SetGSQ("box"); + m_pickups[listIndex]->SetFadeInSeq("fade_box"); + break; + case OBJ_AMMO_SINGLE_PISTOL: + break; + case OBJ_AMMO_SINGLE_SHOTGUN: + break; + case OBJ_AMMO_SINGLE_AUTO: + m_pickups[listIndex]->SetGSQ("ammo_556"); + m_pickups[listIndex]->SetFadeInSeq("fade_ammo_556"); + break; + case OBJ_AMMO_SINGLE_ROCKET: + m_pickups[listIndex]->SetGSQ("ammo_rocket"); + m_pickups[listIndex]->SetFadeInSeq("fade_ammo_rocket"); + break; + case OBJ_WPN_PISTOL2: + m_pickups[listIndex]->SetGSQ("pistol2"); + m_pickups[listIndex]->SetFadeInSeq("fade_pistol2"); + break; + case OBJ_WPN_PISTOL1: + m_pickups[listIndex]->SetGSQ("pistol1"); + m_pickups[listIndex]->SetFadeInSeq("fade_pistol1"); + break; + case OBJ_WPN_MACHINEPISTOL: + m_pickups[listIndex]->SetGSQ("machinepistol"); + m_pickups[listIndex]->SetFadeInSeq("fade_machinepistol"); + break; + case OBJ_WPN_ASSAULTRIFLE: + m_pickups[listIndex]->SetGSQ("assault_rifle"); + m_pickups[listIndex]->SetFadeInSeq("fade_assault_rifle"); + break; + case OBJ_WPN_SNIPER: + m_pickups[listIndex]->SetGSQ("sniperrifle"); + m_pickups[listIndex]->SetFadeInSeq("fade_sniperrifle"); + break; + case OBJ_WPN_AUTOSHOTGUN: + m_pickups[listIndex]->SetGSQ("autoshotgun"); + m_pickups[listIndex]->SetFadeInSeq("fade_autoshotgun"); + break; + case OBJ_WPN_SHOTGUN: + m_pickups[listIndex]->SetGSQ("shotgun"); + m_pickups[listIndex]->SetFadeInSeq("fade_shotgun"); + break; + case OBJ_WPN_MACHINEGUN: + m_pickups[listIndex]->SetGSQ("machinegun"); + m_pickups[listIndex]->SetFadeInSeq("fade_machinegun"); + break; + case OBJ_WPN_ROCKET: + m_pickups[listIndex]->SetGSQ("rocket"); + m_pickups[listIndex]->SetFadeInSeq("fade_rocket"); + break; + case OBJ_WPN_MICROWAVE: + m_pickups[listIndex]->SetGSQ("mpg"); + m_pickups[listIndex]->SetFadeInSeq("fade_mpg"); + break; + case OBJ_WPN_FLAMEGUN: + m_pickups[listIndex]->SetGSQ("flamethrower"); + m_pickups[listIndex]->SetFadeInSeq("fade_flamethrower"); + break; + case OBJ_ARMOR: + m_pickups[listIndex]->SetGSQ("armor"); + m_pickups[listIndex]->SetFadeInSeq("armorfade"); + break; + case OBJ_ITM_FLASHPACK: + m_pickups[listIndex]->SetGSQ("flashpak"); + m_pickups[listIndex]->SetFadeInSeq("fade_flashpak"); + break; +// case OBJ_ITM_NEURALGRENADE: +// break; + case OBJ_ITM_C4: + m_pickups[listIndex]->SetGSQ("c4"); + m_pickups[listIndex]->SetFadeInSeq("fade_c4"); + break; + case OBJ_ITM_LIGHTGOGGLES: + m_pickups[listIndex]->SetGSQ("nightvision"); + m_pickups[listIndex]->SetFadeInSeq("fade_nightvision"); + break; + case OBJ_ITM_MINE: + m_pickups[listIndex]->SetGSQ("claymore"); + m_pickups[listIndex]->SetFadeInSeq("fade_claymore"); + break; + case OBJ_ITM_MEDKIT: + m_pickups[listIndex]->SetGSQ("medkit"); + m_pickups[listIndex]->SetFadeInSeq("fade_medkit"); + break; + case OBJ_ITM_GRENADE: + m_pickups[listIndex]->SetGSQ("grenade"); + m_pickups[listIndex]->SetFadeInSeq("fade_grenade"); + break; + case OBJ_CTF_FLAG: + break; + case OBJ_HLTH_SM: + m_pickups[listIndex]->SetGSQ("health"); + m_pickups[listIndex]->SetFadeInSeq("fade_health"); + break; + case OBJ_HLTH_LRG: + m_pickups[listIndex]->SetGSQ("health"); + m_pickups[listIndex]->SetFadeInSeq("fade_health"); + break; + } +} + +void PickupList::SetDroppedStringIndex(int listIndex) +{ + switch(listIndex) + { + case OBJ_NONE: + case OBJ_AMMO_KNIFE: + case OBJ_AMMO_PISTOL: + case OBJ_AMMO_SHOTGUN: + case OBJ_AMMO_PISTOL2: + case OBJ_AMMO_AUTO: + case OBJ_AMMO_MPG: + case OBJ_AMMO_GAS: + case OBJ_AMMO_ROCKET: + case OBJ_AMMO_SLUG: + case OBJ_AMMO_SINGLE_PISTOL: + case OBJ_AMMO_SINGLE_SHOTGUN: + case OBJ_AMMO_SINGLE_AUTO: + case OBJ_ARMOR: + case OBJ_ITM_FLASHPACK: + case OBJ_ITM_C4: + case OBJ_ITM_LIGHTGOGGLES: + case OBJ_ITM_MINE: + case OBJ_ITM_MEDKIT: + case OBJ_ITM_GRENADE: + case OBJ_CTF_FLAG: + case OBJ_HLTH_SM: + case OBJ_HLTH_LRG: + break; + case OBJ_WPN_PISTOL2: + m_pickups[listIndex]->SetDroppedStringIndex(ITEMS_DROPPED_44PISTOL); + break; + case OBJ_WPN_PISTOL1: + m_pickups[listIndex]->SetDroppedStringIndex(ITEMS_DROPPED_9MMPISTOL); + break; + case OBJ_WPN_MACHINEPISTOL: + m_pickups[listIndex]->SetDroppedStringIndex(ITEMS_DROPPED_9MMSUPSMG); + break; + case OBJ_WPN_ASSAULTRIFLE: + m_pickups[listIndex]->SetDroppedStringIndex(ITEMS_DROPPED_556SMG); + break; + case OBJ_WPN_SNIPER: + m_pickups[listIndex]->SetDroppedStringIndex(ITEMS_DROPPED_SNIPER); + break; + case OBJ_WPN_AUTOSHOTGUN: + m_pickups[listIndex]->SetDroppedStringIndex(ITEMS_DROPPED_SLUGTHROWER); + break; + case OBJ_WPN_SHOTGUN: + m_pickups[listIndex]->SetDroppedStringIndex(ITEMS_DROPPED_SHOTGUN); + break; + case OBJ_WPN_MACHINEGUN: + m_pickups[listIndex]->SetDroppedStringIndex(ITEMS_DROPPED_HVYMACH); + break; + case OBJ_WPN_ROCKET: + m_pickups[listIndex]->SetDroppedStringIndex(ITEMS_DROPPED_ROCKETLAUNCHER); + break; + case OBJ_WPN_MICROWAVE: + m_pickups[listIndex]->SetDroppedStringIndex(ITEMS_DROPPED_MPG); + break; + case OBJ_WPN_FLAMEGUN: + m_pickups[listIndex]->SetDroppedStringIndex(ITEMS_DROPPED_FLAMEGUN); + break; + default: + break; + } +} + + +Pickup *PickupList::GetPickupFromSpawnName(char *name) +{ + if (NULL == name) + { + return NULL; + } + + for (int i = 0; i < MAX_ITM_OBJS; i++) + { + if (0 == strcmp(name, m_pickups[i]->GetSpawnName())) + { + return m_pickups[i]; + } + } + // ctf flags change their class name frequently but they'll always begin with 'ctf' + if (name[0] == 'c' && name[1] == 't' && name[2] == 'f') + { // found a ctf flag + return m_pickups[OBJ_CTF_FLAG]; + } + return NULL; +} + +// in the dark times, we stored (index into itemSpawns[]) of an item in edict_t::dmg, so a lot of code +//looked like itemSpawns[ent->dmg]... +// +//it gives me a creepy feeling just thinking about it. +// +Pickup *PickupList::GetPickupFromEdict(edict_t *ent) +{ + // it's unfortunate, but the quickest way (for now) to find the Pickup that corresponds to an edict_t + //is to do strcmp's on edict_t::classname. we could go back to storing an index in edict_t::dmg, but + //that is soooooo lame. quick, but lame. + + // putting a binary search here would be a simple way to improve things. just create an ordered list of Pickup + //names, like PickupList::m_pickupNames or something. + + if (NULL == ent) + { + return NULL; + } + return GetPickupFromSpawnName(ent->classname); +} + +int PickupList::GetPickupIndexFromEdict(edict_t *ent) +{ + // it's unfortunate, but the quickest way (for now) to find the Pickup that corresponds to an edict_t + //is to do strcmp's on edict_t::classname. we could go back to storing an index in edict_t::dmg, but + //that is soooooo lame. quick, but lame. + + // putting a binary search here would be a simple way to improve things. just create an ordered list of Pickup + //names, like PickupList::m_pickupNames or something. + + if (NULL == ent) + { + return 0; + } + if (NULL == ent->classname) + { + return 0; + } + + for (int i = 0; i < MAX_ITM_OBJS; i++) + { + if (0 == strcmp(ent->classname, m_pickups[i]->GetSpawnName())) + { + return i; + } + } + // ctf flags change their class name frequently but they'll always begin with 'ctf' + if (0 == strncmp(ent->classname, "ctf", 3)) + { // found a ctf flag + return OBJ_CTF_FLAG; + } + return 0; +} + +Pickup *PickupList::GetPickupFromType(pickup_t type, int spawnParm) +{ + for (int i = 0; i < MAX_ITM_OBJS; i++) + { + if (m_pickups[i]->ComparePickupType(type) && m_pickups[i]->CompareSpawnParm(spawnParm)) + { + return m_pickups[i]; + } + } + return NULL; +} + +PickupInst *PickupList::GetPickupInstFromTargetname(char* targetname) +{ + list::iterator it; + edict_t *ent = NULL; + + if (NULL == targetname) + { + return NULL; + } + for (it = m_pickupInsts.begin(); it != m_pickupInsts.end(); it++) + { + if ( (ent = (*it)->GetEdict()) && (0 == strcmp(targetname, ent->targetname)) ) + { + return (PickupInst*)(*it); + } + } + return NULL; +} + +PickupInst *PickupList::GetPickupInstFromEdict(edict_t *ent) +{ + list::iterator it; + + if (NULL == ent) + { + return NULL; + } + for (it = m_pickupInsts.begin(); it != m_pickupInsts.end(); it++) + { + if ((*it)->EdictCompare(ent)) + { + return (PickupInst*)(*it); + } + } + return NULL; +} + +// adds an instance of a pickup to the list of edicts that gets polled in FrameUpdate() +void PickupList::RegisterEdict(edict_t *ent) +{ + if (ent) + { + list::iterator it; + + for (it = m_pickupInsts.begin(); it != m_pickupInsts.end(); it++) + { + if ((*it)->EdictCompare(ent)) + { // already registered + return; + } + } + ent->flags |= FL_PICKUP; + + m_pickupInsts.push_back(new PickupInst(ent)); + + // this check probably doesn't cover all cases of runtime PickUp creation + if (ent->spawnflags&DROPPED_ITEM) + { + HandleInfoEvent(PickupInfoList::event_CREATE_RUNTIME, ent); + } + else + { + HandleInfoEvent(PickupInfoList::event_CREATE_LOADTIME, ent); + } + + // if we have a single-player pickup that can respawn we need to precache the respawn effect + if (ent->spawnflags & SF_PICKUP_RESPAWN) + { + gi.effectindex("environ/irespawn"); + gi.soundindex("dm/irespawn.wav"); + } + + } +} + +// remove this edict from our list-to-be-polled-by-FrameUpdate. if it ain't in the list, return false. +bool PickupList::Unregister(edict_t *ent) +{ + list::iterator it; + + for (it = m_pickupInsts.begin(); it != m_pickupInsts.end(); it++) + { + if (((PickupInst*)(*it))->EdictCompare(ent)) + { // found him. remove him. + + delete (*it); + m_pickupInsts.erase(it); + return true; + } + } + return false; +} + +bool PickupList::UnregisterAll() +{ + list::iterator it; + + for (it = m_pickupInsts.begin(); it != m_pickupInsts.end(); it++) + { + delete (*it); + } + m_pickupInsts.clear(); + return true; +} + +bool PickupList::HandleInfoEvent(int nEvent, edict_t *ent) +{ + PickupInst *pickupInst = NULL; + + if ( (NULL == m_pickupInfoList) || + (NULL == (pickupInst = GetPickupInstFromEdict(ent))) ) + { + return false; + } + + return m_pickupInfoList->HandleEvent(nEvent, pickupInst); +} + +// if this pickup starts off in a crate, set it to SOLID_NOT until the crate is broken +void PickupList::InitCrated(edict_t *ent) +{ + ent->solid = SOLID_NOT; + // it should be invisible + if (ent->ghoulInst) + { + ent->ghoulInst->SetOnOff(false, level.time); + } +} + +// de-crate any pickups targeted by this crate +void PickupList::BustCrate(edict_t *crate) +{ + PickupInst *pickupInst = NULL; + edict_t *ent = NULL; + + if (crate && crate->target) + { + m_crateList.Create(crate->target); + + while (pickupInst = m_crateList.Pop()) + { + if ( (ent = pickupInst->GetEdict()) && + (ent->spawnflags & SF_PICKUP_START_CRATED) ) + { + ent->solid = SOLID_TRIGGER; + // it should be visible + if (ent->ghoulInst) + { + ent->ghoulInst->SetOnOff(true, level.time); + } + } + } + } +} + +Pickup *PickupInst::GetPickup() +{ + return thePickupList.GetPickup(m_pickup); +} + +void PickupInst::Read(void) +{ + PickupInst temp; + + gi.ReadFromSavegame('PLPI', &temp, sizeof(temp)); + + m_pickup = temp.m_pickup; + m_edict = GetEdictPtr((int)temp.m_edict); + m_fadeStatus = temp.m_fadeStatus; +} + +void PickupInst::Write(void) +{ + PickupInst temp; + + temp.m_pickup = m_pickup; + *(int *)&temp.m_edict = GetEdictNum(m_edict); + temp.m_fadeStatus = m_fadeStatus; + + gi.AppendToSavegame('PLPI', &temp, sizeof(temp)); +} + +void PickupList::Read(void) +{ + int i, count; + PickupInst *inst; + + gi.ReadFromSavegame('PLNM', &count, sizeof(count)); + for(i = 0; i < count; i++) + { + inst = new PickupInst; + inst->Read(); + m_pickupInsts.push_back(inst); + } + gi.ReadFromSavegame('PLWA', &m_bDisplayedWeaponArenaHelp, sizeof(m_bDisplayedWeaponArenaHelp)); +} + +void PickupList::Write(void) +{ + list::iterator it; + int count; + + count = m_pickupInsts.size(); + gi.AppendToSavegame('PLNM', &count, sizeof(count)); + + for(it = m_pickupInsts.begin(); it != m_pickupInsts.end(); it++) + { + (*it)->Write(); + } + gi.AppendToSavegame('PLWA', &m_bDisplayedWeaponArenaHelp, sizeof(m_bDisplayedWeaponArenaHelp)); +} + +// end \ No newline at end of file diff --git a/Source/Game/gamecpp/CWeaponInfo.h b/Source/Game/gamecpp/CWeaponInfo.h new file mode 100644 index 0000000..8b3e524 --- /dev/null +++ b/Source/Game/gamecpp/CWeaponInfo.h @@ -0,0 +1,694 @@ +#ifndef __CWEAPONINFO_H_ +#define __CWEAPONINFO_H_ + +#include "matrix4.h" +#include "..\ghoul\ighoul.h" +#include "w_types.h" + +//--------------------------------------------------------------------------------------- + + +// 12/27/99 kef -- this is old school item management. it worked, but barely. also, it sucked. now +//we're going to use thePickupList (see declaration below of class PickupList). +struct itemSpawnInfo_s +{ + char *spawnName; + int type; + int spawnParm; + int defaultCount; + int index; + char *worldName; + int pickupstringindex; + int ammopickupstringindex; + int itemfullstringindex; +}; + +typedef struct itemSpawnInfo_s itemSpawnInfo_t; + + +// +// kef -- I'm real fuzzy on the definition and use of spawnflags for pickups, I know there's +// SF_PICKUP_RESPAWN in g_local.h, but I really don't want to touch g_local right now. or ever, actually. +// +#define SF_PICKUP_START_CRATED 8 + +//--------------------------------------------------------------------------------------- + + +// 12/27/99 kef -- we're going to use instances of class Pickup (stored in thePickupList) instead of +//itemSpawnInfo_t. +// +// m_spawnName name used by the editor to identify this item. this is what designers see in Radiant. +// m_type what type of item this is (e.g. weapon). pickup_t is defined in qcommon/w_types.h. +// m_spawnParm one of several possible enums, depending on the m_type. all possible values are defined in qcommon/w_types.h. +// m_defaultCount the default amount of this item you receive when you pick it up +// m_defaultMaxCount the default maximum amount of this item that can be carried +// m_pickupListIndex uniquely identifies this item. use this value as an index into the global list of Pickups, thePickupList. +// m_worldName what gets displayed during gameplay when you drop this item. need to be string-packaged. this may be a legacy comment, but FIXME. +// m_pickupStringIndex displayed during gameplay when you pickup an item of this type. +// m_ammoPickupStringIndex displayed during gameplay when you pickup a weapon of this type but you already have it so all you get is ammo. +// m_itemFullStringIndex displayed during gameplay when you touch an item of this type but can't carry any more. +// m_modelSpawnData this is the model data (name of model, skin, etc.) needed to create a pickup of this type. +// m_fadeInSeq this is the sequence that's called when a deathmatch pickup respawns + + /* + NOTE: I'm so, so sorry to do it this way, but apparently the save/load stuff in + g_save.cpp needs an array of model info for the pickups so I have to store + each pickup's data in a big array somewhere and only keep a pointer to it + (hence, m_modelSpawnData) in each Pickup instance. + + still, this is better than it was...in the dark times... + */ + +// +// ----------> TO ADD NEW ITEMS <----------- +// +// you'll need to add a modelSpawnData entry to pickupModelData[] in CWeaponInfo.cpp, which means increasing the +//size of MD_ITEM_SIZE accordingly. also, you'll need to add an entry to PickupList::m_pickups in PickupList::PickupList(...) +//which also resides in CWeaponInfo.cpp. finally (I think), add an entry to the objType_t enum type in qcommon/w_types.h +// if the item you've added has any special stuff associated with it (needs bbox adjustment to lay flat, has a special +//skin, needs to be scaled up or down, etc.) see the helpers like PickupList::SetPickupSkin in CWeaponInfo.cpp. +// + +#define MAXCHARSFORPICKUPNAME 64 +#define CLIP_SHOULD_BE_FILLED -2 + +class Pickup +{ +protected: + char m_spawnName[MAXCHARSFORPICKUPNAME]; + pickup_t m_type; + int m_spawnParm; + int m_defaultCount; + int m_defaultMaxCount; + objType_t m_pickupListIndex; + char m_worldName[MAXCHARSFORPICKUPNAME]; + int m_pickupStringIndex; + int m_ammoPickupStringIndex; + int m_itemFullStringIndex; + modelSpawnData_t *m_modelSpawnData; + int m_fadeStatus; + float m_respawnTime; + + // extra stuff that a given pickup may or may not need + char m_skin[MAXCHARSFORPICKUPNAME]; + float m_scale; + vec3_t m_bboxAdjustMins; + modelSpawnData_t *m_lowPolyModelSpawnData; + char m_fadeInSeq[MAXCHARSFORPICKUPNAME]; + int m_droppedStringIndex; // because Keith was naughty and didn't package the worldnames + + +public: + Pickup(); + + // i anticipate this is the only constructor we'll ever use...a list of 'em should be in the + //constructor for class PickupList. therefore thePickupList will have to call Init on each Pickup prior to + //spawning any items, probably in SpawnEntities. + Pickup( char *yourSpawnNameHere, + pickup_t yourTypeHere, + int yourSpawnParmHere, + float yourRespawnTimeHere, + int yourDefaultCountHere, + int yourDefaultMaxCountHere, + objType_t yourPickupListIndexHere, + char *yourWorldNameHere, + int yourPickupStringIndexHere, + int yourAmmoPickupStringIndexHere, + int yourItemFullStringIndexHere + ); + virtual ~Pickup(); + + // call this before spawning any pickups + int Init(); + + char *GetSpawnName() { return m_spawnName; } + pickup_t GetType() { return m_type; } + int GetSpawnParm() { return m_spawnParm; } + int GetDefaultCount() { return m_defaultCount; } + virtual int GetDefaultMaxCount(); + float GetRespawnTime() { return m_respawnTime; } + objType_t GetPickupListIndex() { return m_pickupListIndex; } + char *GetWorldName(); + int GetPickupStringIndex() { return m_pickupStringIndex; } + int GetAmmoPickupStringIndex() { return m_ammoPickupStringIndex; } + int GetItemFullStringIndex() { return m_itemFullStringIndex; } + modelSpawnData_t *GetModelSpawnData() { return m_modelSpawnData; } + char *GetModelName() { return m_modelSpawnData?m_modelSpawnData->file:NULL; } + char *GetModelDir() { return m_modelSpawnData?m_modelSpawnData->dir:NULL; } + int GetDroppedStringIndex() {return m_droppedStringIndex;} + + void SetSkin(char *skin) { strncpy(m_skin, skin, MAXCHARSFORPICKUPNAME); } + char *GetSkin() { return (m_skin[0] == 0?NULL:m_skin); } + void SetScale(float scale) { m_scale = scale; } + float GetScale() { return m_scale; } + void SetBBoxAdjustMins(vec3_t adj) { VectorCopy(adj, m_bboxAdjustMins); } + void GetBBoxAdjustMins(vec3_t putAdjHere) { VectorCopy(m_bboxAdjustMins, putAdjHere); } + void SetLowPolyModel(modelSpawnData_t *modelData) { m_lowPolyModelSpawnData = modelData; } + modelSpawnData_t *GetLowPolyModel() { return m_lowPolyModelSpawnData; } + char *GetFadeInSeq() { return m_fadeInSeq; } + void SetFadeInSeq(char *seq); + void SetGSQ(char *gsq); + void SetDroppedStringIndex(int dropIndex) { m_droppedStringIndex = dropIndex; } + + bool ComparePickupType(pickup_t type) { return (m_type == type); } + bool CompareEquipmentType(equipment_t type) { return ( (PU_INV==m_type)?(m_spawnParm == type):false ); } + bool CompareWeaponType(weapons_t type) { return ( (PU_WEAPON==m_type)?(m_spawnParm == type):false ); } + bool CompareSpawnParm(int spawnParm) { return (spawnParm == m_spawnParm); } + + virtual bool IsBulletWpn() { return false; } + virtual bool IsProjectileWpn() { return false; } + virtual bool IsExplosiveWpn() { return false; } + virtual bool IsBulletAmmo() { return false; } + virtual bool IsProjectileAmmo() { return false; } + virtual bool IsExplosiveAmmo() { return false; } +}; + + +//--------------------------------------------------------------------------------------- + +class MedKitPickup : public Pickup +{ +public: + MedKitPickup(); + + // i anticipate this is the only constructor we'll ever use...a list of 'em should be in the + //constructor for class PickupList. therefore thePickupList will have to call Init on each Pickup prior to + //spawning any items, probably in SpawnEntities. + MedKitPickup( char *yourSpawnNameHere, + pickup_t yourTypeHere, + int yourSpawnParmHere, + float yourRespawnTimeHere, + int yourDefaultCountHere, + int yourDefaultMaxCountHere, + objType_t yourPickupListIndexHere, + char *yourWorldNameHere, + int yourPickupStringIndexHere, + int yourAmmoPickupStringIndexHere, + int yourItemFullStringIndexHere + ); + virtual ~MedKitPickup(); + int GetDefaultMaxCount(); +}; + +//--------------------------------------------------------------------------------------- + +class LightGogglesPickup : public Pickup +{ +public: + LightGogglesPickup(); + + // i anticipate this is the only constructor we'll ever use...a list of 'em should be in the + //constructor for class PickupList. therefore thePickupList will have to call Init on each Pickup prior to + //spawning any items, probably in SpawnEntities. + LightGogglesPickup( char *yourSpawnNameHere, + pickup_t yourTypeHere, + int yourSpawnParmHere, + float yourRespawnTimeHere, + int yourDefaultCountHere, + int yourDefaultMaxCountHere, + objType_t yourPickupListIndexHere, + char *yourWorldNameHere, + int yourPickupStringIndexHere, + int yourAmmoPickupStringIndexHere, + int yourItemFullStringIndexHere + ); + int GetDefaultMaxCount(); +}; + +//--------------------------------------------------------------------------------------- + +class WeaponPickup : public Pickup +{ +public: + + enum + { + wpnFlag_NONE = 0, + wpnFlag_BULLET = (1<<0), + wpnFlag_PROJECTILE = (1<<1), + wpnFlag_EXPLOSIVE = (1<<2) + } wpnPickupFlags_e; + +private: + int m_wpnFlags; + +public: + WeaponPickup(); + + // i anticipate this is the only constructor we'll ever use...a list of 'em should be in the + //constructor for class PickupList. therefore thePickupList will have to call Init on each Pickup prior to + //spawning any items, probably in SpawnEntities. + WeaponPickup( char *yourSpawnNameHere, + pickup_t yourTypeHere, + int yourSpawnParmHere, + float yourRespawnTimeHere, + int yourDefaultCountHere, + int yourDefaultMaxCountHere, + objType_t yourPickupListIndexHere, + char *yourWorldNameHere, + int yourPickupStringIndexHere, + int yourAmmoPickupStringIndexHere, + int yourItemFullStringIndexHere, + int yourWpnFlagsHere = 0 + ); + + virtual bool IsBulletWpn() { return !!(m_wpnFlags & wpnFlag_BULLET); } + virtual bool IsProjectileWpn() { return !!(m_wpnFlags & wpnFlag_PROJECTILE); } + virtual bool IsExplosiveWpn() { return !!(m_wpnFlags & wpnFlag_EXPLOSIVE); } +}; + +//--------------------------------------------------------------------------------------- + +class AmmoPickup : public Pickup +{ +public: + + enum + { + ammoFlag_NONE = 0, + ammoFlag_BULLET = (1<<0), + ammoFlag_PROJECTILE = (1<<1), + ammoFlag_EXPLOSIVE = (1<<2) + } ammoPickupFlags_e; + +private: + int m_ammoFlags; + +public: + AmmoPickup(); + + // i anticipate this is the only constructor we'll ever use...a list of 'em should be in the + //constructor for class PickupList. therefore thePickupList will have to call Init on each Pickup prior to + //spawning any items, probably in SpawnEntities. + AmmoPickup( char *yourSpawnNameHere, + pickup_t yourTypeHere, + int yourSpawnParmHere, + float yourRespawnTimeHere, + int yourDefaultCountHere, + int yourDefaultMaxCountHere, + objType_t yourPickupListIndexHere, + char *yourWorldNameHere, + int yourPickupStringIndexHere, + int yourAmmoPickupStringIndexHere, + int yourItemFullStringIndexHere, + int yourAmmoFlagsHere = 0 + ); + + virtual bool IsBulletAmmo() { return !!(m_ammoFlags & ammoFlag_BULLET); } + virtual bool IsProjectileAmmo() { return !!(m_ammoFlags & ammoFlag_PROJECTILE); } + virtual bool IsExplosiveAmmo() { return !!(m_ammoFlags & ammoFlag_EXPLOSIVE); } +}; + +//--------------------------------------------------------------------------------------- + +// +// class PickupInst +// +// this is an instance of a Pickup. +// + +class PickupInst +{ +private: + int m_pickup; + edict_t *m_edict; + int m_fadeStatus; + +public: + // used to indicate whether or not a PickupInst is fading in + enum + { + fading_NONE = -1, // never done any fading...only init'd + fading_FALSE, // finished fading in + fading_TRUE, // in the process of fading in + fading_REMOVECALLBACK, // I just finished fading, please remove my callback + fading_MAX // don't move this value. keep it at the end of the list. + }; + + PickupInst(edict_t *ent); + PickupInst(void) { m_edict = NULL; } + virtual ~PickupInst(); + + IGhoulInst *GetGhoulInst(); + edict_t *GetEdict() { return m_edict; } + Pickup *GetPickup(); + bool SetFadeStatus(int status) { if ((status>=fading_NONE)&&(status m_insts; + +public: + PickupInfo(objType_t type); + virtual ~PickupInfo(); + + PickupInstInfo *AddInst(PickupInst *pickupInst, int type = PickupInstInfo::type_LOADTIME); + PickupInstInfo *Find(edict_t *ent); + PickupInstInfo *Find(PickupInst *pickupInst); + + bool PickedUp(PickupInst *pickupInst, float fTime); + bool SetRespawnTime(PickupInst *pickupInst, float fTime); + bool Touch(PickupInst *pickupInst, float fTime); +}; + + +// +// class PickupInfoList +// +// PickupInfoList corresponds to PickupList...it keeps track of all of the PickupInfo's. +// +class PickupInfoList +{ +public: + // this enum represents various events that we might want to keep track of for pickups + enum + { + event_UNKNOWN = -1, + event_NONE = 0, + event_CREATE_LOADTIME, + event_CREATE_RUNTIME, + event_PICKEDUP, + event_RESPAWN, + event_TOUCHED, + event_MAXEVENTS + }; + +private: + map m_info; + int m_failedMsgs[event_MAXEVENTS]; + + // file pointer for dumping info + FILE *m_infoFile; + bool m_bInfoFileOpened; + +private: + PickupInfo* AddPickupInst(PickupInst *pickupInst, int type = PickupInstInfo::type_LOADTIME); + PickupInstInfo *Find(PickupInst *pickupInst); + +public: + PickupInfoList(); + virtual ~PickupInfoList(); + + bool HandleEvent(int nEvent, PickupInst *pickupInst); + int GetPickedUpCount(PickupInst *pickupInst); + float GetAvgPickedUpDelay(PickupInst *pickupInst); + float GetAvgRespawnPickUpDelay(PickupInst *pickupInst); + float GetAvgTouchDelay(PickupInst *pickupInst); + int GetTouchCount(PickupInst *pickupInst); + int GetType(PickupInst *pickupInst); + + void WriteLine(char *text); +}; + + +//--------------------------------------------------------------------------------------- + +// CratePickupInsts are just PickupInsts that become available to the player when a crate is broken open. +//this class mostly serves as a node in a linked list stack. +class CratePickupInst +{ +public: + CratePickupInst *m_next; + + PickupInst *m_pickupInst; + +public: + CratePickupInst(PickupInst *inst) { m_next = NULL; m_pickupInst = inst; } + virtual ~CratePickupInst() { m_next = NULL; m_pickupInst = NULL; } + +}; + +// CratePickupInstList is the manager for the CratePickupInsts being created when a crate is broken open. +//mostly a wrapper for a linked list stack. +class CratePickupInstList +{ +public: + CratePickupInst *m_head; + + // don't allocate space for m_name cuz it just points to the edict_t::target of the crate + char *m_name; + +public: + CratePickupInstList() { m_head = NULL; m_name = NULL; } + virtual ~CratePickupInstList() { Clear(); m_name = NULL; } + + void Create(char *name); + void Destroy() { Clear(); } + + void Push(PickupInst *inst) { CratePickupInst *newInst = new CratePickupInst(inst); newInst->m_next = m_head; m_head = newInst; } + PickupInst *Pop() { CratePickupInst *popped = m_head; if(!popped)return NULL; PickupInst *poppedPickup = popped->m_pickupInst; m_head = m_head->m_next; delete popped; return poppedPickup;} + +protected: + void Clear() {while (m_head) Pop();} + + bool Compare(char *name) { if (m_name) return !strcmp(name, m_name); return false; } +}; + + +// 12/27/99 kef -- we're going to have a single, global instance of class PickupList called thePickupList. +//it replaces any and all references to itemSpawns. + +class PickupList +{ +public: + enum + { + print_NONE = 0, + print_CONSOLE, + print_FILE + }; + +private: + // this is the actual data for the global list of items. there simply is no good way to represent it...dynamic + //sizing is bad, static sizing is bad. dynamic allocation is bad, static allocation is bad. grrr. + //since we're using objType_t as a valid, unique index into this list, though, we may as well declare this + //array in terms of the maximum size of objType_t. + Pickup *m_pickups[MAX_ITM_OBJS]; + + // this is a list of entities currently using callbacks. we poll them in FrameUpdate to see if they're done + //with their callback, in which case we remove the callback. + list m_pickupInsts; + + // if pickupinfo tells us to, create a PickupInfoList in PickupList::Init() + PickupInfoList *m_pickupInfoList; + + // have we display help for weaponarena already? + bool m_bDisplayedWeaponArenaHelp; + + + // manager for pickups stored in crates + CratePickupInstList m_crateList; + + // these are some helpers set up to deal with per-pickup modifications + void SetPickupSkin(int listIndex); + void ModifyPickupBBox(int listIndex); + void SetPickupScale(int listIndex); + void SetPickupLowPolyModel(int listIndex); + void SetGSQ(int listIndex); + void SetDroppedStringIndex(int listIndex); + + void WriteLine(int printDest, char *outLine, ...); + + void InitCrated(edict_t *ent); + +public: + PickupList(); + virtual ~PickupList(); + + // init the modelSpawnData for all pickups. call this from someplace like SpawnEntities. + int PreSpawnInit(); + + // call this after spawning pickups + int PostSpawnInit(); + + void Destroy(); // call before changing maps/quitting game + int FrameUpdate(); // checks the list each frame, mostly for removal of callbacks + void DumpList(int printDest = print_CONSOLE); // output the contents of m_pickups to the console or a file + + Pickup *GetPickup(int listIndex) { return ((listIndex>OBJ_NONE)&&(listIndex= 0); assert(weaps); return weaps[num];} + void attack(attacks_e weapID, edict_t *srcEnt, vec3_t org, vec3_t dir, IGhoulInst *gun = 0, GhoulID myFlashBolt = 0); + void attack(attacks_e weapID, edict_t *srcEnt, vec3_t org, vec3_t dir, void (*bodyfunc)(edict_t *ent, void* data), IGhoulInst *gun = 0); + void attack(attacks_e weapID, edict_t *srcEnt, vec3_t org, vec3_t dir, IGhoulInst *gun, float *vel); + void setWeaps(CWeaponInfo *newWeaps){weaps = newWeaps;} +}; + +extern CWorldWeapons weapons; +extern PickupList thePickupList; + +void W_InitWorldWeaponModels(void); +void W_ShutdownWorldWeaponModels(void); + +void W_InitInv(edict_t &ent); +void W_RefreshWeapon(edict_t &ent); + +#endif // __CWEAPONINFO_H_ diff --git a/Source/Game/gamecpp/actionids.h b/Source/Game/gamecpp/actionids.h new file mode 100644 index 0000000..5db736b --- /dev/null +++ b/Source/Game/gamecpp/actionids.h @@ -0,0 +1,29 @@ +// All action type classes should have an ID here + +typedef enum +{ + ACTION = 0, + STAND_ACTION, + PAIN_ACTION, + DEATH_ACTION, + DEATHCORPSE_ACTION, + DEATHARMOR_ACTION, + ENDSCRIPT_ACTION, + WALK_ACTION, + DOG_WALK_ACTION, + JUMP_ACTION, + FALL_ACTION, + SURRENDER_ACTION, + CAPTURE_ACTION, + SHOOT_ATTACK_ACTION, + RUNNING_MELEE_ATTACK_ACTION, + + HELI_ACTION, + HELIMOVE_ACTION, + HELIFACE_ACTION, + HELIATTACK_ACTION, + HELIDEATH_ACTION, + SNOWCAT_ACTION, + TANK_ACTION, +}; + diff --git a/Source/Game/gamecpp/ai.cpp b/Source/Game/gamecpp/ai.cpp new file mode 100644 index 0000000..c53331c --- /dev/null +++ b/Source/Game/gamecpp/ai.cpp @@ -0,0 +1,3134 @@ +#include "g_local.h" +#include "ai_private.h" +#include "m_generic.h" +#include "m_ecto.h" +#include "m_meso.h" +#include "m_female.h" +#include "m_heliai.h" +#include "m_tankai.h" +#include "m_snowcatai.h" +#include "fields.h" +#include "ai_pathfinding.h" +#include "..\strings\singleplr.h" + +#if _DEBUG +char *decName; +#endif + +static ai_c *AICurrentlyThinking=0; + +qboolean IsLevelNamed (const char * thisname) +{ + if (!stricmp(thisname, level.mapname)) + { + return true; + } + char altname[100]; + Com_sprintf(altname, sizeof(altname), "final/%s", thisname); + if (!stricmp(thisname, level.mapname)) + { + return true; + } + // fixme: kef -- eventually, want this chunk out of here. right now, though, the + //designers really need it + if (strstr(level.mapname, thisname)) + { + return true; + } + + if (!stricmp(thisname, level_ai_name)) + { // over-ride + return true; + } + + return false; +} + +void GetLevelSoundSuffix(char *putSuffixHere) +{ + if (!putSuffixHere) + { + return; + } + putSuffixHere[0]=0; + switch(GetInterpCode()) + { + default: + case LEVCODE_TUTORIAL: + strcpy(putSuffixHere, "tut1"); + break; + case LEVCODE_UNKNOWN: + case LEVCODE_NYC_SUBWAY: + strcpy(putSuffixHere, "TSR1"); + break; + case LEVCODE_NYC_SUBWAY2: + strcpy(putSuffixHere, "TSR2"); + break; + case LEVCODE_AFR_TRAIN: + strcpy(putSuffixHere, "trn1"); + break; + case LEVCODE_KOS_SEWER: + strcpy(putSuffixHere, "kos1"); + break; + case LEVCODE_KOS_BIGGUN: + strcpy(putSuffixHere, "kos2"); + break; + case LEVCODE_KOS_HANGAR: + strcpy(putSuffixHere, "kos3"); + break; + case LEVCODE_SIB_CANYON: + strcpy(putSuffixHere, "sib1"); + break; + case LEVCODE_SIB_BASE: + strcpy(putSuffixHere, "sib2"); + break; + case LEVCODE_SIB_PLANT: + strcpy(putSuffixHere, "sib3"); + break; + case LEVCODE_IRQ_TOWNA: + strcpy(putSuffixHere, "irq1a"); + break; + case LEVCODE_IRQ_BUNKER: + strcpy(putSuffixHere, "irq2a"); + break; + case LEVCODE_IRQ_CARGO: + strcpy(putSuffixHere, "irq3a"); + break; + case LEVCODE_NYC_WARE: + strcpy(putSuffixHere, "nyc1"); + break; + case LEVCODE_NYC_STEAM: + strcpy(putSuffixHere, "nyc2"); + break; + case LEVCODE_NYC_STREETS: + strcpy(putSuffixHere, "nyc3"); + break; + case LEVCODE_AFR_YARD: + strcpy(putSuffixHere, "sud1"); + break; + case LEVCODE_AFR_HOUSE: + strcpy(putSuffixHere, "sud2"); + break; + case LEVCODE_AFR_FACT: + strcpy(putSuffixHere, "sud3"); + break; + case LEVCODE_TOK_STREET: + strcpy(putSuffixHere, "jpn1"); + break; + case LEVCODE_TOK_OFFICE: + strcpy(putSuffixHere, "jpn2"); + break; + case LEVCODE_TOK_PENT: + strcpy(putSuffixHere, "jpn3"); + break; + case LEVCODE_IRQ_STREETS: + strcpy(putSuffixHere, "irq1b"); + break; + case LEVCODE_IRQ_FORT: + strcpy(putSuffixHere, "irq2b"); + break; + case LEVCODE_IRQ_OIL: + strcpy(putSuffixHere, "irq3b"); + break; + case LEVCODE_CAS_1: + strcpy(putSuffixHere, "ger1"); + break; + case LEVCODE_CAS_2: + strcpy(putSuffixHere, "ger2"); + break; + case LEVCODE_CAS_3: + strcpy(putSuffixHere, "ger3"); + break; + case LEVCODE_CAS_4: + strcpy(putSuffixHere, "ger4"); + break; + case LEVCODE_ARM_1: + strcpy(putSuffixHere, "arm1"); + break; + case LEVCODE_ARM_2: + strcpy(putSuffixHere, "arm2"); + break; + case LEVCODE_ARM_3: + strcpy(putSuffixHere, "arm3"); + break; + } +} + +lev_interp_code GetInterpCode(void) +{ + if (IsLevelNamed("tut1")) + { + return LEVCODE_TUTORIAL; + } + if (IsLevelNamed("tsr1")) + { + return LEVCODE_NYC_SUBWAY; + } + if (IsLevelNamed("tsr2")) + { + return LEVCODE_NYC_SUBWAY2; + } + if (IsLevelNamed("arm1")) + { + return LEVCODE_ARM_1; + } + if (IsLevelNamed("arm2")) + { + return LEVCODE_ARM_2; + } + if (IsLevelNamed("arm3")) + { + return LEVCODE_ARM_3; + } + if (IsLevelNamed("trn1")) + { + return LEVCODE_AFR_TRAIN; + } + if (IsLevelNamed("sib2")) + { + return LEVCODE_SIB_BASE; + } + if (IsLevelNamed("kos1")) + { + return LEVCODE_KOS_SEWER; + } + if (IsLevelNamed("kos2")) + { + return LEVCODE_KOS_BIGGUN; + } + if (IsLevelNamed("kos3")) + { + return LEVCODE_KOS_HANGAR; + } + if (IsLevelNamed("sib1")) + { + return LEVCODE_SIB_CANYON; + } + if (IsLevelNamed("sib3")) + { + return LEVCODE_SIB_PLANT; + } + if (IsLevelNamed("irq1a")) + { + return LEVCODE_IRQ_TOWNA; + } + if (IsLevelNamed("irq2a")) + { + return LEVCODE_IRQ_BUNKER; + } + if (IsLevelNamed("irq3a")) + { + return LEVCODE_IRQ_CARGO; + } + if (IsLevelNamed("nyc1")) + { + return LEVCODE_NYC_WARE; + } + if (IsLevelNamed("nyc2")) + { + return LEVCODE_NYC_STEAM; + } + if (IsLevelNamed("nyc3")) + { + return LEVCODE_NYC_STREETS; + } + if (IsLevelNamed("sud1")) + { + return LEVCODE_AFR_YARD; + } + if (IsLevelNamed("sud2")) + { + return LEVCODE_AFR_HOUSE; + } + if (IsLevelNamed("sud3")) + { + return LEVCODE_AFR_FACT; + } + if (IsLevelNamed("jpn1")) + { + return LEVCODE_TOK_STREET; + } + if (IsLevelNamed("jpn2")) + { + return LEVCODE_TOK_OFFICE; + } + if (IsLevelNamed("jpn3")) + { + return LEVCODE_TOK_PENT; + } + if (IsLevelNamed("irq1b")) + { + return LEVCODE_IRQ_STREETS; + } + if (IsLevelNamed("irq2b")) + { + return LEVCODE_IRQ_FORT; + } + if (IsLevelNamed("irq3b")) + { + return LEVCODE_IRQ_OIL; + } + if (IsLevelNamed("ger1")) + { + return LEVCODE_CAS_1; + } + if (IsLevelNamed("ger2")) + { + return LEVCODE_CAS_2; + } + if (IsLevelNamed("ger3")) + { + return LEVCODE_CAS_3; + } + if (IsLevelNamed("ger4")) + { + return LEVCODE_CAS_4; + } + return LEVCODE_UNKNOWN; +} + +//rubbishy save/load stuff first, to make a good first impression :( +ai_public_c *ai_public_c::NewClassForCode(int code) +{ + switch (code) + { + default: + case AI_PUBLIC: + case AI_BASE: + case AI_GENERIC: + case AI_GENERIC_NPC: + case AI_GENERIC_ENEMY_NPC: + case AI_GENERIC_DOG: + case AI_GENERIC_MERC: + gi.dprintf("ERROR: invalid ai class code: %d\n",code); + return new ai_c(); + + case AI_GENERIC_COW: + return new cow_ai(); +/* case AI_GENERIC_MERC_GRUNT: + return new merc_grunt_ai(); + case AI_GENERIC_MERC_DEMO: + return new merc_demo_ai(); + case AI_GENERIC_MERC_SNIPER: + return new merc_sniper_ai(); + case AI_GENERIC_MERC_MEDIC: + return new merc_medic_ai(); + case AI_GENERIC_MERC_HEAVY: + return new merc_heavy_ai(); + case AI_GENERIC_MERC_TECH: + return new merc_tech_ai(); +*/ + case AI_HELI: + return new generic_ghoul_heli_ai(); + case AI_TANK: + return new generic_ghoul_tank_ai(); + case AI_SNOWCAT: + return new generic_ghoul_snowcat_ai(); + + case AI_DOG_HUSKY: + return new dog_husky_ai(); + case AI_DOG_ROTTWEILER: + return new dog_rottweiler_ai(); + case AI_BLOWNPART: + return new blownpart_ai(); + case AI_PLAYERCORPSE: + return new playercorpse_ai(); + + case AI_ECTO_SKINLEADER: + return new skinleader_ai(); + case AI_ECTO_STOCKBROKER: + return new stockbroker_ai(); + case AI_ECTO_DCTOURIST: + return new tourist_ai(); + case AI_ECTO_NYCBUM: + return new bum_ai(); + case AI_ECTO_COLPRISONER1: + return new prisoner1_ai(); + case AI_ECTO_COLPRISONER2: + return new prisoner2_ai(); + case AI_ECTO_IRAQCITIZEN: + return new irqcitizen_ai(); + case AI_ECTO_UGNCOMMANDER: + return new commander_ai(); + case AI_ECTO_SERBOFFICER: + return new serbofficer_ai(); + case AI_ECTO_KOSREFUGEE: + return new kosrefugee_ai(); + case AI_ECTO_IRAQOFFICER: + return new iraqofficer_ai(); + case AI_ECTO_FACTORY: + return new factoryworker_ai(); + case AI_ECTO_CHEMIST: + return new chemist_ai(); + case AI_ECTO_SIBSUIT: + return new sibsuit_ai(); + case AI_ECTO_SIBSCIENCE: + return new sibscientist_ai(); + case AI_ECTO_PUNK2: + return new zitpunk_ai(); + + case AI_MESO_JOHN: + return new john_ai(); + case AI_MESO_JOHN_SNOW: + return new john_snow_ai(); + case AI_MESO_JOHN_DESERT: + return new john_desert_ai(); + case AI_MESO_HAWK: + return new hawk_ai(); + case AI_MESO_HURTHAWK: + return new hurthawk_ai(); + case AI_MESO_SAM: + return new sam_ai(); + case AI_MESO_IRAQWORKER: + return new irqworker_ai(); + case AI_MESO_NYCPUNK: + return new nypunk_ai(); + case AI_MESO_AMU: + return new amu_ai(); + case AI_MESO_RAIDERBOSS: + return new raiderboss_ai(); + case AI_MESO_RAIDERBOSS2: + return new raiderboss2_ai(); + case AI_MESO_IRAQSOLDIER1: + return new irqsoldier1_ai(); + case AI_MESO_IRAQSOLDIER2: + return new irqsoldier2_ai(); + case AI_MESO_IRAQSOLDIER2B: + return new irqsoldier2b_ai(); + case AI_MESO_IRAQREPGUARD: + return new irqrepgd_ai(); + case AI_MESO_IRAQREPGUARDB: + return new irqrepgdb_ai(); + case AI_MESO_IRAQPOLICE: + return new irqpolice_ai(); + case AI_MESO_IRAQCOMMANDER: + return new irqcommander_ai(); + case AI_MESO_IRAQBRUTEA: + return new irqbrutea_ai(); + case AI_MESO_IRAQBRUTEB: + return new irqbruteb_ai(); + case AI_MESO_IRAQBODYGUARD: + return new irqbodyguard_ai(); + case AI_MESO_IRAQROCKET: + return new irqrocket_ai(); + case AI_MESO_IRAQSADDAM: + return new irqsaddam_ai(); + case AI_MESO_IRAQMAN2: + return new irqman2_ai(); + case AI_MESO_UGNSNIPER: + return new ugsniper_ai(); + case AI_MESO_UGNBRUTE: + return new ugbrute_ai(); + case AI_MESO_UGNROCKET: + return new ugrocket_ai(); + case AI_MESO_UGNSOLDIER1: + return new ugsoldier1_ai(); + case AI_MESO_UGNSOLDIER1B: + return new ugsoldier1b_ai(); + case AI_MESO_UGNSOLDIER2: + return new ugsoldier2_ai(); + case AI_MESO_UGNSOLDIER3: + return new ugsoldier3_ai(); + case AI_MESO_NYCSWATGUY: + return new nyswatguy_ai(); + case AI_MESO_NYCSWATLEADER: + return new nyswatleader_ai(); + case AI_MESO_RAIDER1: + return new raider1_ai(); + case AI_MESO_RAIDER2A: + return new raider2_ai(); + case AI_MESO_RAIDER2B: + return new raider2b_ai(); + case AI_MESO_RAIDERBRUTE: + return new raiderbrute_ai(); + case AI_MESO_RAIDERROCKET: + return new raiderrocket_ai(); + case AI_MESO_SIBTROOPER2: + return new sibtrooper2_ai(); + case AI_MESO_SIBCLEANSUIT: + return new sibcleansuit_ai(); + case AI_MESO_SERBGRUNT1: + return new serbgrunt1_ai(); + case AI_MESO_SERBGRUNT2: + return new serbgrunt2_ai(); + case AI_MESO_SERBGRUNT3: + return new serbgrunt3_ai(); + case AI_MESO_SERBSNIPER1A: + return new serbsniper1a_ai(); + case AI_MESO_SERBSNIPER1B: + return new serbsniper1b_ai(); + case AI_MESO_SERBCOMTROOP: + return new serbcomtroop_ai(); + case AI_MESO_SERBBRUTE1A: + return new serbbrute1a_ai(); + case AI_MESO_SERBBRUTE1B: + return new serbbrute1b_ai(); + case AI_MESO_SERBMECHANIC: + return new serbmechanic_ai(); + case AI_MESO_KOSREBEL: + return new kosrebel_ai(); + case AI_MESO_KOSKLAGUY: + return new kosklaguy_ai(); + case AI_MESO_SKINHEAD1: + return new skinhead1_ai(); + case AI_MESO_SKINHEAD2A: + return new skinhead2a_ai(); + case AI_MESO_SKINHEAD2B: + return new skinhead2b_ai(); + case AI_MESO_SKINHEADBOSS: + return new skinheadboss_ai(); + case AI_MESO_MALEPOLITICIAN: + return new malepolitician_ai(); + case AI_MESO_TOKHENCH1: + return new tokhench1_ai(); + case AI_MESO_TOKHENCH2: + return new tokhench2_ai(); + case AI_MESO_TOKKILLER: + return new tokkiller_ai(); + case AI_MESO_TOKNINJA: + return new tokninja_ai(); + case AI_MESO_TOKBRUTE: + return new tokbrute_ai(); + case AI_MESO_TOKMALEHOSTAGE: + return new tokmalehostage_ai(); + case AI_MESO_JAPANSUIT: + return new japansuit_ai(); + case AI_MESO_SIBTROOPER1A: + return new sibtrooper1a_ai(); + case AI_MESO_SIBTROOPER1B: + return new sibtrooper1b_ai(); + case AI_MESO_SIBGUARD: + return new sibguard_ai(); + case AI_MESO_SIBGUARD3: + return new sibguard3_ai(); + case AI_MESO_SIBGUARD4: + return new sibguard4_ai(); + case AI_MESO_SIBMECH: + return new sibmech_ai(); + + case AI_FEMALE_SKINCHICK: + return new skinchick_ai(); + case AI_FEMALE_NYWOMAN: + return new nycwoman_ai(); + case AI_FEMALE_SIBGUARD: + return new fsibguard_ai(); + case AI_FEMALE_SIBSCIENCE: + return new fsibscience_ai(); + case AI_FEMALE_IRQWOMAN1: + return new irqwoman1_ai(); + case AI_FEMALE_IRQWOMAN2: + return new irqwoman2_ai(); + case AI_FEMALE_TOKWOMAN1: + return new tokwoman1_ai(); + case AI_FEMALE_TOKWOMAN2: + return new tokwoman2_ai(); + case AI_FEMALE_TOKASSASSIN: + return new tokassassin_ai(); + case AI_FEMALE_RAIDER: + return new fraider_ai(); + case AI_FEMALE_TAYLOR: + return new taylor_ai(); + } +} + +ai_public_c::ai_public_c(ai_public_c *orig) +{ + VectorCopy(orig->velocity, velocity); + VectorCopy(orig->ideal_angles, ideal_angles); +} + +void ai_public_c::Evaluate(ai_public_c *orig) +{ + VectorCopy(orig->velocity, velocity); + VectorCopy(orig->ideal_angles, ideal_angles); +} + +// --------------------------------------------------------------------------------- + +ai_c::ai_c(ai_c *orig) +: ai_public_c(orig) +{ + int i; + + lFootPos = orig->lFootPos; + rFootPos = orig->rFootPos; + + done_firstframe = orig->done_firstframe; + allowActionChangeTime = orig->allowActionChangeTime; + + for(i = 0; i < BBOX_PRESET_NUMBER; i++) + { + VectorCopy(orig->preset_mins[i], preset_mins[i]); + VectorCopy(orig->preset_maxs[i], preset_maxs[i]); + } + + current_bbox = orig->current_bbox; + ground = orig->ground; + hasHadTarget = orig->hasHadTarget; + lastTargetTime = orig->lastTargetTime; + firstTargetTime = orig->firstTargetTime; + abusedByTeam = orig->abusedByTeam; + lastNonTargetTime = orig->lastNonTargetTime; + + nextWakeReactTime = orig->nextWakeReactTime; + + nodeData = orig->nodeData; + *(int *)&ent = GetEdictNum(orig->ent); + *(int *)&curTarget = GetEdictNum(orig->curTarget); + + current_action.MakeIndex(orig->current_action); + recycle_action.MakeIndex(orig->recycle_action); + + linkcount = orig->linkcount; + isActive = orig->isActive; + isStartleable = orig->isStartleable; + m_bHostage = orig->m_bHostage; + m_bSpecialBuddy = orig->m_bSpecialBuddy; + m_bConcentratingOnPlayer = orig->m_bConcentratingOnPlayer; + + VectorCopy(orig->requestedMoveDir, requestedMoveDir); + + scale = orig->scale; + sense_mask = orig->sense_mask; + jumpdistance = orig->jumpdistance; + jumpheight = orig->jumpheight; + fallheight = orig->fallheight; + stepheight = orig->stepheight; + move_mask = orig->move_mask; + + worldpriority = orig->worldpriority; + lastCheckTime = orig->lastCheckTime; + attentionLevel = orig->attentionLevel; + watchState = orig->watchState; + + miscFlags = orig->miscFlags; + + lastCorpseCheck = orig->lastCorpseCheck; + + rank = orig->rank; + + mySkills = orig->mySkills; + + body.MakeIndex(orig->body); + MyGhoulObj.MakeIndex(orig->MyGhoulObj); + + VectorCopy(orig->aim_angles, aim_angles); + VectorCopy(orig->look_angles, look_angles); +} + +void ai_c::Evaluate(ai_c *orig) +{ + int i; + + lFootPos = orig->lFootPos; + rFootPos = orig->rFootPos; + + done_firstframe = orig->done_firstframe; + allowActionChangeTime = orig->allowActionChangeTime; + + for(i = 0; i < BBOX_PRESET_NUMBER; i++) + { + VectorCopy(orig->preset_mins[i], preset_mins[i]); + VectorCopy(orig->preset_maxs[i], preset_maxs[i]); + } + + current_bbox = orig->current_bbox; + ground = orig->ground; + hasHadTarget = orig->hasHadTarget; + lastTargetTime = orig->lastTargetTime; + firstTargetTime = orig->firstTargetTime; + abusedByTeam = orig->abusedByTeam; + lastNonTargetTime = orig->lastNonTargetTime; + + nextWakeReactTime = orig->nextWakeReactTime; + + nodeData = orig->nodeData; + + ent = GetEdictPtr((int)orig->ent); + curTarget = GetEdictPtr((int)orig->curTarget); + + current_action.MakePtr(*(int *)&orig->current_action); + recycle_action.MakePtr(*(int *)&orig->recycle_action); + + linkcount = orig->linkcount; + isActive = orig->isActive; + isStartleable = orig->isStartleable; + m_bHostage = orig->m_bHostage; + m_bSpecialBuddy = orig->m_bSpecialBuddy; + m_bConcentratingOnPlayer = orig->m_bConcentratingOnPlayer; + + VectorCopy(orig->requestedMoveDir, requestedMoveDir); + + scale = orig->scale; + sense_mask = orig->sense_mask; + jumpdistance = orig->jumpdistance; + jumpheight = orig->jumpheight; + fallheight = orig->fallheight; + stepheight = orig->stepheight; + move_mask = orig->move_mask; + + worldpriority = orig->worldpriority; + lastCheckTime = orig->lastCheckTime; + attentionLevel = orig->attentionLevel; + watchState = orig->watchState; + + miscFlags = orig->miscFlags; + + lastCorpseCheck = orig->lastCorpseCheck; + + rank = orig->rank; + mySkills = orig->mySkills; + + body.MakePtr(*(int *)&orig->body); + MyGhoulObj.MakePtr(*(int *)&orig->MyGhoulObj); + + VectorCopy(orig->aim_angles, aim_angles); + VectorCopy(orig->look_angles, look_angles); + + ai_public_c::Evaluate(orig); +} + +void ai_c::Read() +{ + int i, count; + int *index_list; + char loaded[sizeof(ai_c)]; + + gi.ReadFromSavegame('AIAI', loaded, AI_SAVE_SIZE); + Evaluate((ai_c *)loaded); + + gi.ReadFromSavegame('AISL', &count, sizeof(count)); + if(count) + { + index_list = new int [count]; + gi.ReadFromSavegame('AISE', index_list, count * sizeof(int)); + for(i = 0; i < count; i++) + { + senses.push_back(senseL.GetPointerFromIndex(index_list[i])); + } + delete [] index_list; + } + + gi.ReadFromSavegame('AIDL', &count, sizeof(count)); + if(count) + { + index_list = new int [count]; + gi.ReadFromSavegame('AIDE', index_list, count * sizeof(int)); + for(i = 0; i < count; i++) + { + decisions.push_back(decisionL.GetPointerFromIndex(index_list[i])); + } + delete [] index_list; + } + + gi.ReadFromSavegame('AIAL', &count, sizeof(count)); + if(count) + { + index_list = new int [count]; + gi.ReadFromSavegame('AIAE', index_list, count * sizeof(int)); + for(i = 0; i < count; i++) + { + actions.push_back(actionL.GetPointerFromIndex(index_list[i])); + } + delete [] index_list; + } + + if(ent->ai) + { + ent->ai = this; + } +} + +void ai_c::Write() +{ + ai_c *savable; + list::iterator ia; + list::iterator is; + list::iterator id; + int count, i; + int *index_list; + + savable = new ai_c(this); + gi.AppendToSavegame('AIAI', savable, AI_SAVE_SIZE); + savable->current_action = NULL; + savable->recycle_action = NULL; + savable->body = NULL; + savable->MyGhoulObj = NULL; + delete savable; + + count = senses.size(); + gi.AppendToSavegame('AISL', &count, sizeof(count)); + if(count) + { + index_list = new int [count]; + for (is = senses.begin(), i = 0; is != senses.end(); is++, i++) + { + index_list[i] = (*is).GetIndex(); + } + gi.AppendToSavegame('AISE', index_list, count * sizeof(int)); + delete index_list; + } + + count = decisions.size(); + gi.AppendToSavegame('AIDL', &count, sizeof(count)); + if(count) + { + index_list = new int [count]; + for (id = decisions.begin(), i = 0; id != decisions.end(); id++, i++) + { + index_list[i] = (*id).GetIndex(); + } + gi.AppendToSavegame('AIDE', index_list, count * sizeof(int)); + delete index_list; + } + + count = actions.size(); + gi.AppendToSavegame('AIAL', &count, sizeof(count)); + if(count) + { + index_list = new int [count]; + for (ia = actions.begin(), i = 0; ia != actions.end(); ia++, i++) + { + index_list[i] = (*ia).GetIndex(); + } + gi.AppendToSavegame('AIAE', index_list, count * sizeof(int)); + delete index_list; + } +} + +void ai_c::AddBody(edict_t *monster) +{ + if (!monster) + { + return; + } +// body = new bodyhuman_c(); +} + +void ai_c::UseMonster(edict_t *user) +{ + if (ent && OnSameTeam(ent, user)) + { + SetAbusedByTeam(true); + } + if (body) + { + body->UseMonster(*ent, user); + } +} + +void ai_c::TouchMonster(edict_t *user) +{ + if (body) + { + body->TouchMonster(*ent, user); + } +} + +void ai_c::Init(edict_t *monster, char *ghoulname, char *subname) +{ + if(body) + { + body->SetOwner(monster); + } +} + +//ACHTUNG! need to have rf_ghoul set on edict by now! +ai_c::ai_c(edict_t *monster) +{ + int i; + + VectorClear(velocity); + VectorClear(ideal_angles); + + for(i = 0; i < BBOX_PRESET_NUMBER; i++) + { + VectorClear(preset_mins[i]); + VectorClear(preset_maxs[i]); + } + + lFootPos = 0; + rFootPos = 0; + done_firstframe = false; + allowActionChangeTime = 0.0F; + + current_bbox = BBOX_PRESET_NUMBER; + ground = 0.0F; + hasHadTarget = false; + lastTargetTime = 0.0F; + firstTargetTime = 0.0F; + lastNonTargetTime = 0.0F; + abusedByTeam = false; + + nextWakeReactTime = -20.0F; + + //constructors? Who needs constructors? I'm really regretting making this a plain vanilla struct + VectorClear(nodeData.curSpot); + VectorClear(nodeData.goPoint); + nodeData.curNode = 0; + nodeData.curRegion = 0; + nodeData.nextNode = 0; + nodeData.finalNode = 0; + nodeData.blocked = 0; + nodeData.lastNode = 0; + nodeData.lastNode2 = 0; + nodeData.lastNode3 = 0; + nodeData.backingUp = 0; + nodeData.approaching = 0; + nodeData.corner1 = -1; + nodeData.corner2 = -1; + nodeData.corner3 = -1; + nodeData.corner4 = -1; + VectorClear(nodeData.lastDir); + nodeData.lastDirSetTime = 0; + // End of nodeData setup + + ent = monster; + curTarget = NULL; + current_action = NULL; + recycle_action = NULL; + linkcount = 0; + isActive = false; + isStartleable = true; + m_bHostage = false; + m_bSpecialBuddy = false; + m_bConcentratingOnPlayer = false; + VectorClear(requestedMoveDir); + scale = 1.0F; + sense_mask = alarm_mask|sight_mask|sound_mask; + jumpdistance = 100.0F; + jumpheight = 50.0F; + fallheight = 1000000.0F; + stepheight = 24.0F; + move_mask = jump_movemask|fall_movemask|step_movemask; + worldpriority = PRIORITY_LOW; + lastCheckTime = 0; + attentionLevel = ATTENTION_IDLE; + watchState = 0; + lastCorpseCheck = 0; + miscFlags = 0; + rank = 0;//grunt + body = NULL; + MyGhoulObj = NULL; + + VectorClear(aim_angles); + if (monster) + { + SetLookAngles(monster->s.angles); + } + //eek, no ent yet, set me to trash + else + { + SetLookVector(vec3_up); + } +} + +ai_c::~ai_c(void) +{ + list::iterator ia; + list::iterator is; + list::iterator id; + + if (body) + { + body.Destroy(); + } + + // lists will clean up their nodes during their destruction + // huh? should have list-eating separated out + for (is=senses.begin();is != senses.end();is++) + { + (*is).Destroy(); + } + + for (ia=actions.begin();ia!=actions.end();ia++) + { + (*ia).Destroy(); + } + + for (id=decisions.begin();id!=decisions.end();id++) + { + (*id).Destroy(); + } + + if (current_action) + { + current_action.Destroy(); + } + + if (recycle_action) + { + recycle_action.Destroy(); + } +} + +float ai_c::GetAimConeDegrees(edict_t &monster, bbox_preset bbox) +{ + //if i'm crouching or prone, lemme aim wider than if i'm standing. + if (bbox==BBOX_PRESET_CROUCH||bbox==BBOX_PRESET_PRONE) + { + return 45.0; + } + return 20.0; +} + +float ai_c::GetAimDeviationDegrees(edict_t &monster) +{ + CRadiusContent rad(monster.s.origin, 200, 1, 0); + //got pals around, be careful. + if (rad.getNumFound()) + { + return 5.0/(float)rad.getNumFound(); + } + //nobody's around, can be sloppy + return 20.0; +} + +qboolean ai_c::IsFirstFrameTime(void) +{ + return !done_firstframe; +} + +void ai_c::FirstFrame(edict_t *monster) +{ + done_firstframe = true; +} + +bool ai_c::AmIAsGoodAsDead() +{ + bodyorganic_c *body = (bodyorganic_c*)GetBody(); + + if (body) + { + return body->IsNextShotGonnaKillMe(); + } + return false; +} + +qboolean ai_c::IsArmed(edict_t &monster) +{ + if (body) + { + return (body->GetBestWeapon(monster)!=ATK_NOTHING); + } + return false; +} + +qboolean ai_c::SafeToRemove(edict_t &monster) +{ + list::iterator ia; + list::iterator is; + list::iterator id; + + // go thru all lists, make sure everything is good to go + + // go thru senses, make sure everything is good to go + for (is=senses.begin();is != senses.end();is++) + { + if (!(*is)->SafeToRemove(monster)) + { + return false; + } + } + + // go thru actions, make sure everything is good to go + for (ia=actions.begin();ia!=actions.end();ia++) + { + if (!(*ia)->SafeToRemove(monster)) + { + return false; + } + } + + // go thru decisions, make sure everything is good to go + for (id=decisions.begin();id!=decisions.end();id++) + { + if (!(*id)->SafeToRemove(monster)) + { + return false; + } + } + + // check my current action, make sure everything is good to go + if (current_action) + { + if (!current_action->SafeToRemove(monster)) + { + return false; + } + } + + //pay no attention to recycle_action (it's not really there) + + return true;//everything returned ok for removal +} + +void ai_c::NewSense(sense_c *new_sense, edict_t *monster) +{ + if (monster->deadflag == DEAD_DEAD) + { + //just in case the new sense is in the pointer class list already: + sense_c_ptr bad_sense = new_sense; + bad_sense.Destroy(); + } + else + { + assert(senses.size()<30); + senses.push_back(new_sense); + } +} + +void ai_c::NewAction(action_c *new_action, edict_t *monster, qboolean activatenow) +{ + if (activatenow && !isActive) + { + Activate(*monster); + } +/* if (monster->deadflag == DEAD_DEAD) + { + //just in case the new action is in the pointer class list already: + action_c_ptr bad_action = new_action; + bad_action.Destroy(); + } + else + { +*/ actions.push_back(new_action); +// } +} + +void ai_c::NewNextAction(action_c *new_action, edict_t *monster, qboolean activatenow) +{ + if (activatenow && !isActive) + { + Activate(*monster); + } +/* if (monster->deadflag == DEAD_DEAD) + { + //just in case the new action is in the pointer class list already: + action_c_ptr bad_action = new_action; + bad_action.Destroy(); + } + else + { +*/ actions.push_front(new_action); +// } +} + + +void ai_c::NewDecision(decision_c *new_decision, edict_t *monster) +{ + //eek!script stuff expects this decision to stick around! should be safe to allow it--death action shouldn't ever finish! +// if (monster->deadflag == DEAD_DEAD) +// { +// //just in case the new decision is in the pointer class list already: +// decision_c_ptr bad_decision = new_decision; +// bad_decision.Destroy(); +// } +// else +// { + decisions.push_back(new_decision); +// } +} + +void ai_c::NewCurrentAction(action_c *new_action, edict_t &monster) +{ + if (current_action) + { + current_action->SetInterrupted(true); + actions.push_front(current_action); + } + + current_action = new_action; + current_action->BeginAction(*this,monster); +} + +void ai_c::NewDeathArmorAction(edict_t &monster) +{ + NewCurrentAction( DeathArmorAction( NULL, NULL, NULL, + monster, NULL, NULL, + 0, vec3_origin), + monster); +} + +void ai_c::NextAction(edict_t &monster) +{ + list::iterator ia; + + if (current_action) + { + //save whatever i was doing to be recycled (cuts down on allocation costs) + if (recycle_action) + { + //only save off one action per guy for recycling + recycle_action.Destroy(); + } + recycle_action=current_action; + current_action=NULL; + } + + if (actions.size()) + { + ia = actions.begin(); + current_action = *ia; + current_action->BeginAction(*this,monster); + actions.erase(ia); + } +} + +void ai_c::EvaluateDecisions(edict_t &monster) +{ + list::iterator id, pick, t_id; + int priority, max_priority; + bool found; + int i,dec_siz; + + +#ifdef _DEBUG + char *chosenDec; +#endif + + dec_siz=decisions.size(); + + if (dec_siz==0) + { + return; + } + + max_priority = 0; + found = false; + for (id=decisions.begin(), i=dec_siz;i>0;i--) + { + if((*id)->Consider(*this, monster))//decision has let me know it's used up, trash it. + { + t_id = id; + id--; + (*t_id).Destroy(); + decisions.erase(t_id); + } + else + { + priority = (*id)->Priority(); + + if (priority > max_priority) + { + pick = id; + max_priority = priority; + found = true; +#ifdef _DEBUG + chosenDec = decName;// global string pointer that has the name of the chosen decision + // I have this in here because I want to see what guys are doing when they + // are standing around looking less than clever... They shouldn't do that :) +#endif + } + } + id++; + } + + if (found) + { +#ifdef _DEBUG + if(aidec_show->value) + { + Enemy_Printf(this, "I have chosen to do a %s; priority of %d; my priority is %s\n", chosenDec, max_priority, (worldpriority)?"low":"high"); +// gi.dprintf("I have chosen to do a %s; priority of %d\n", chosenDec, max_priority); + } +#endif + (*pick)->Perform(*this, monster); + + NextAction(monster); + + } +} + +void ai_c::EvaluateSenses(edict_t &monster) +{ + list::iterator is,t_is; + sense_c *ptr = NULL; + int i; + + sensedEntInfo_t temp; + + if((worldpriority == PRIORITY_LOW)&&(lastCheckTime > level.time - 2.0)) + { // if yer not important, yer not allowed to look around much + return; + } + + for (is=senses.begin(),i=senses.size();i>0;i--) + { + if ((*is)->Evaluate(sense_mask,*this, monster))//sense resolved, ditch it + { + (*is)->UpdateSensedClient(sense_mask, temp); + if (temp.ent && (body->GetBestWeapon(monster) != ATK_NOTHING)) + { + int n = 1; + ptr = (*is); + } + t_is = is; + (*is).Destroy(); + is++; + senses.erase(t_is); + } + else + { + (*is)->UpdateSensedClient(sense_mask, temp); + if (temp.ent && (body->GetBestWeapon(monster) != ATK_NOTHING)) + { + int n = 1; + ptr = (*is); + } + is++; + } + } + + lastCheckTime = level.time + 1.0; + + sensedEntInfo_t sensed_client, sensed_monster; + GetSensedClientInfo(smask_all, sensed_client); + GetSensedMonsterInfo(smask_all, sensed_monster); + + //as the sensed_client always gets preference + if (sensed_client.ent && sensed_client.ent->health>0) + { + if(sensed_client.time < level.time - 1.0) + { + firstTargetTime = level.time + gi.flrand(-.2,.2); + } + } + +} + +void ai_c::MuteSenses(unsigned mask, float degree, smute_recovery recovery_code, float recovery_time) +{ + list::iterator is; + + for (is=senses.begin();is!=senses.end();is++) + { + (*is)->Mute(mask,degree,recovery_code,recovery_time); + } +} + +void ai_c::RegisterSenseEvent(unsigned mask, vec3_t event_origin, float event_time, edict_t *event_edict, ai_sensetype_e event_code) +{ + list::iterator is; + + for (is=senses.begin();is!=senses.end();is++) + { + assert(event_edict); + (*is)->RegisterSenseEvent(mask,event_origin,event_time,event_edict,event_code); + } +} + +float ai_c::GetSenseMutedLevel(unsigned mask) +{ + list::iterator is; + float cur, best=0; + + for (is=senses.begin();is!=senses.end();is++) + { + cur = (*is)->GetMutedLevel(mask); + if (cur>best) + { + best = cur; + } + } + return best; +} + +void ai_c::GetSensedClientInfo(unsigned mask, sensedEntInfo_t &sensedEnt) +{ + list::iterator is; + + sensedEnt.ent=NULL; + VectorClear(sensedEnt.pos); + sensedEnt.time=-99999999; + sensedEnt.senseType=AI_SENSETYPE_UNKNOWN; +/* + if(getTarget()) + { + if(getTarget() == level.sight_client) + { + //just to see + sensedEnt.time = level.time - .1; + sensedEnt.ent = level.sight_client; + lastTargetTime = level.time - .1; + VectorCopy(level.sight_client->s.origin, sensedEnt.pos); + return; + } + } +*/ + for (is=senses.begin();is!=senses.end();is++) + { + (*is)->UpdateSensedClient(mask,sensedEnt); + + if (sensedEnt.senseType==AI_SENSETYPE_SOUND_WAKEUP) + { + nextWakeReactTime=sensedEnt.time+12.0F; + sensedEnt.senseType=AI_SENSETYPE_SOUND_INVESTIGATE; + (*is)->ChangeClientSenseType(AI_SENSETYPE_SOUND_INVESTIGATE); + } + } + +} + +void ai_c::GetSensedMonsterInfo(unsigned mask, sensedEntInfo_t &sensedEnt) +{ + list::iterator is; + + sensedEnt.ent=NULL; + VectorClear(sensedEnt.pos); + sensedEnt.time=-99999999; + + for (is=senses.begin();is!=senses.end();is++) + { + (*is)->UpdateSensedMonster(mask,sensedEnt); + } +} + +qboolean ai_c::getTargetPos(vec3_t putPosHere) +{ + sensedEntInfo_t sensedEnt; + + if (curTarget) + { + if (curTarget->client) + { + GetSensedClientInfo(smask_all, sensedEnt); + } + else + { + GetSensedMonsterInfo(smask_all, sensedEnt); + } + if (sensedEnt.ent==curTarget) + { + VectorCopy(sensedEnt.pos, putPosHere); + return true; + } + } + + //couldn't find the guy... +// VectorClear(putPosHere); + VectorCopy(ent->s.origin, putPosHere); + return false; +} + +// kef +#include "m_heliai.h" + +void ai_c::Activate(edict_t &monster) +{ + if (!isActive) + { + isActive=true; + monster.movetype = MOVETYPE_STEP; + monster.spawnflags&=~SPAWNFLAG_TRIGGER_SPAWN; + monster.solid = SOLID_BBOX; + attentionLevel = ATTENTION_ALERT; + + //grr, stupid dekker... + if (GetClassCode()==AI_MESO_RAIDERBOSS2) + { + trace_t tr; + gi.trace(monster.s.origin, monster.mins, monster.maxs, monster.s.origin, &monster, MASK_MONSTERSOLID, &tr); + if (tr.allsolid) + { + monster.s.origin[0]+=32.0; + gi.trace(monster.s.origin, monster.mins, monster.maxs, monster.s.origin, &monster, MASK_MONSTERSOLID, &tr); + if (tr.allsolid) + { + monster.s.origin[0]-=64.0; + } + } + } + + gi.linkentity(&monster); + } +} + +void ai_c::Think(edict_t &monster) +{ +// vec3_t testpos; +// VectorCopy(monster.s.origin,testpos); +// testpos[2]+=monster.maxs[2]; +// FX_MakeDustPuff(testpos); + monster.nextthink = level.time + FRAMETIME; + + if(BeingWatched()) + { + int asdf = 9; + } + + // if this joker is fleeing and he has the infamous NO_WOUND spawnflag, make + //sure he fires his killtarget + if (monster.spawnflags & SPAWNFLAG_NO_WOUND) + { + bool bFleeing = false; + decision_c *curDecision = current_action?current_action->GetOwnerDecision():NULL; + + bFleeing = (curDecision && (curDecision->GetClassCode() == RETREAT_DECISION)); + if (bFleeing) + { + monster.spawnflags &= ~SPAWNFLAG_NO_WOUND; + edict_t *t = NULL; + if (t = G_Find (t, FOFS(targetname), monster.killtarget)) + { + t->use(t, &monster, &monster); + monster.killtarget = NULL; + } + } + } + if ( (monster.spawnflags & SPAWNFLAG_FACE_PLAYER) && + (1 == monster.wait) ) + { // if wait == 1, face the player + vec3_t vPlayer, vTemp; + VectorCopy(g_edicts[1].s.origin, vPlayer); + VectorSubtract(vPlayer, monster.s.origin, vTemp); + vTemp[2] = 0; + vectoangles(vTemp, monster.s.angles); + } + + + // kef + if (game.cinematicfreeze) + { // if we're in a cinematic, only let appropriate people think + + // using 255 here as a flag. poor, I know, but if you hate it that much, change it yourself. + if ( (monster.count != 255) && + (HasHadTarget() || (monster.flags & FL_SPAWNED_IN)) ) + { // this guy is not being used by the current cinematic so he doesn't get to think + monster.flags |= FL_CINEMATIC_CULL; + monster.nextthink = -(monster.nextthink - level.time); + // neither does he get to interact with the world + monster.solid = SOLID_NOT; + // he shouldn't even be visible + if (monster.ghoulInst) + { + monster.ghoulInst->SetOnOff(false, level.time); + } + return; + } + } + + + if(ai_dumb->value) + { + if(monster.spawnflags & SPAWNFLAG_BLIND) + { + fxRunner.exec("cantsee", &monster); + } + if(monster.spawnflags & SPAWNFLAG_DEAF) + { + fxRunner.exec("canthear", &monster); + } + /*if(monster.spawnflags & SPAWNFLAG_HOLD_POSITION) + { + fxRunner.exec("environ/firelarge2", &monster); + }*/ + } + + +// debug_drawbox(&monster, NULL, NULL, NULL, 0); +/* if(worldpriority == PRIORITY_LOW) + { + monster.ghoulInst->TurnMatrixCallBacksOff(); + } + else + { + monster.ghoulInst->TurnMatrixCallBacksOn(level.time); + }*/ // this doesn't seem to work so well :( + + if (ai_freeze&&ai_freeze->value) + { + return; + } + + if(ai_goretest&&ai_goretest->value&&!(monster.spawnflags&SPAWNFLAG_TRIGGER_SPAWN)) + { + Activate(monster); + } + + if (!isActive) + { + if (monster.spawnflags&SPAWNFLAG_START_ACTIVE) + { + Activate(monster); + } + else + { + if((lastCorpseCheck < level.time) && !(monster.spawnflags&SPAWNFLAG_TRIGGER_SPAWN)) + { + if(CheckForCorpseActivate(monster)) + { + Activate(monster); + } + + lastCorpseCheck = level.time + 1.0; + } + + if(!isActive) + { + vec3_t tdist; + if (level.sight_client && !(monster.spawnflags&SPAWNFLAG_TRIGGER_SPAWN)) + { + VectorSubtract(monster.s.origin, level.sight_client->s.origin, tdist); + if (VectorLengthSquared(tdist)<640000) + { + Activate(monster); + } + else + { + return; + } + } + else + { + return; + } + } + } + } + + EvaluateSenses(monster); + + if (!current_action) + { // do some thinking - this is not correct + if (actions.size()) + { + NextAction(monster); + } + else // aren't any more actions + { + EvaluateDecisions(monster); + } + } + + if (current_action) + { + if ((nextWakeReactTime >= level.time-1.0F) && (nextWakeReactTime < level.time) + && body) + { +// body->VoiceSound("react", monster, 0); + nextWakeReactTime=level.time-20.0F; + } + + AICurrentlyThinking=this; + int val = current_action->Think(*this, monster); + AICurrentlyThinking=0; + + if (val) + { + NextAction(monster); + } + } + + if (monster.linkcount != linkcount) + { + linkcount = monster.linkcount; + gmonster.CheckGround (&monster); + } + gmonster.CatagorizePosition (&monster); + gmonster.WorldEffects (&monster);//leaving this in for drowning, lava damage, etc., but it should prolly be handled in ai class somewhere + + //camera stuff for debugging + watchState = false; + + if ((worldpriority == PRIORITY_LOW)&&(monster.flags & FL_SPAWNED_IN)) + { // guys who are spawned in but too far away are silly and worth nothing + Escape(monster); + } + + if (attentionLevel == ATTENTION_ESCAPED) + { // yeah - makes no sense, huh. Fun. + Escape(monster); + } + + //if monster is dead, consider removing it + if (monster.health <= 0) + { // kef -- moved to body_human_c + //DealWithArmor(monster, GetBody()); + //get ai to poll actions, decisions, & senses to check if removal is ok + if (SafeToRemove(monster)) + { + // if we do this too quickly we may wind up removing him before and bolted-on knives + //can be turned into knife pickups. so if he still has any sticking out of him, + //free them now. + if (GetBody()) + { + ((bodyorganic_c*)GetBody())->FreeKnives(monster); + } + G_FreeEdict (&monster); + return; + } + } +} + + + +qboolean ai_c::Damage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb) +{ + // fixme: centralize skill level stuff + int take; + + // friendly fire avoidance--allowing possibility of non-clients on your team + // if enabled you can't hurt teammates (but you can hurt yourself) + // knockback still occurs + if (&monster != attacker) + { + //fixme: come up with method of determining whether to take damage or not + if (OnSameTeam (&monster, attacker)) + { + if ((attacker->client) && (mod != MOD_TELEFRAG)) + { + SetAbusedByTeam(true); + } + else + { + +// if(dm->dmRule_NO_FRIENDLY_FIRE()) +// { +// damage = 0; dk disabled this because we want friendly fire on for demo +// } +// else +// { +// mod |= MOD_FRIENDLY_FIRE; +// } + } + } + } + + //HACKITY HACK! + if (mod == MOD_TELEFRAG) + { + return false; + } + +// if (!attacker)// || !attacker->client) +// { +// damage = 0; +// } + + VectorNormalize(dir); + +// bonus damage for suprising a monster + if (!(dflags & DAMAGE_RADIUS) && (attacker->client) && (!monster.enemy) && (monster.health > 0)) + { + damage *= 2; + } + + if (monster.flags & FL_NO_KNOCKBACK) + { + knockback = 0; + } + + + take = damage; + +// if (take) +// { + //throw up visible signs o' damage-gorezores, bloodspray, etc. + //notice that i've been shot, here + RegisterSenseEvent(smask_all, attacker->s.origin, level.time, attacker, AI_SENSETYPE_SOUND_WEAPON); + if (body && take) + { + hasHadTarget=true; + take=damage=body->ShowDamage(monster, inflictor, attacker, dir, point, origin, damage, knockback, dflags, mod, penetrate, absorb); + } +// } + + //this used to be only if i took damage; now, knockback applies regardless.--ss +// do the damage + // figure momentum add + if (!(dflags & DAMAGE_NO_KNOCKBACK)) + { + if ((knockback) && + (monster.movetype != MOVETYPE_NONE) && + (monster.movetype != MOVETYPE_BOUNCE) && + (monster.movetype != MOVETYPE_PUSH) && + (monster.movetype != MOVETYPE_NOCLIP) && + (monster.movetype != MOVETYPE_STOP)) + { + vec3_t kvel; + float mass; + vec3_t kbdir; + + if (monster.mass < 50) + { + mass = 50; + } + else + { + mass = monster.mass; + } + +// Bit of Knockback Fakery here. +// dir[2] += 0.3; // might this work? + + VectorCopy(dir, kbdir); // NOTE: WE MUST DO THIS TO AVOID MODIFYING THE VECTOR WE PASSED HERE BY REFERENCE. + if (dflags&DAMAGE_ALL_KNOCKBACK) + { + kbdir[2] *= 0.2; + } + else + { + kbdir[2] += 0.3; // might this work? + } + VectorNormalize(kbdir); + VectorScale (kbdir, 500.0 * ((float)knockback) / mass, kvel); + +// Com_Printf("dir: X: %f Y: %f Z: %f \n", dir[0], dir[1], dir[2]); +// Com_Printf("Knockback: X: %f Y: %f Z: %f \n", kvel[0], kvel[1], kvel[2]); + + VectorAdd (monster.velocity, kvel, monster.velocity); +// dk monster.groundentity = NULL; + } + } + + if (take) + { + if (attacker && attacker->client && monster.health > 0 && IsHostage()) + { + gi.SP_Print(attacker, SINGLEPLR_HOSTAGE_HIT); + } + + monster.health = monster.health - take; + + } + + //even if i didn't do damage this time, count this as a new kill time if guy is dead--so guys with armor will keep twitching when they're dead --ss + if (monster.health <= 0) + { + + monster.flags |= FL_NO_KNOCKBACK; + Die (monster, inflictor, attacker, take, point, dflags); + return true; + } + + if(body->GetArmorCode() != ARMOR_FULL || take) + { //armor guys should not wince unless they are hurt + Pain (monster, attacker, point, knockback, take); + } + + if (take) + { + return true; + } + + return false;//no hit! +} + +void ai_c::Die(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags) +{ + if (AICurrentlyThinking==this) + { + // cannot die while thinking....::thinks are on the stack and still executing. + monster.health = 1; + return; + } + if (monster.health > 0) + { + monster.health = 0; + } + + if (monster.health < -999) + { + monster.health = -999; + } + + + PlayerNoise(attacker, monster.s.origin, AI_SENSETYPE_SOUND_INVESTIGATE, &monster, 600, nodeData.curNode, dflags & (DT_STEALTHY), 1); + + if(level.sight_client) + { + if(!OnSameTeam(level.sight_client, &monster)) + { + if(monster.deadflag != DEAD_DEAD) + { + gmonster.SpookEnemies(monster.s.origin, 128, SPOOK_DEAD_FRIEND); + } + } + } + + if(monster.deadflag != DEAD_DEAD) + { + if(!game.cinematicfreeze) + { + if(!OnSameTeam(level.sight_client, &monster)) + { + level.guysKilled++; + level.cashEarned += mySkills.getCashValue() * game.playerSkills.getMoney(); + } + else + { + level.friendliesKilled++; + //level.cashEarned -= mySkills.getCashValue() * 10 * game.playerSkills.getMoney(); + } + } + } + + if (monster.killtarget && (monster.deadflag != DEAD_DEAD)) + { + qboolean useThatTarget=true; + + //if killfacing set, i might Not want to use that target! + if (monster.killfacing) + { + vec3_t forward, tokillpoint; + edict_t *target = NULL; + useThatTarget=false; + + AngleVectors(monster.s.angles, forward, NULL, NULL); + target = G_Find(target, FOFS(targetname), monster.killfacing); + if (target) + { + VectorSubtract(target->s.origin, monster.s.origin, tokillpoint); + tokillpoint[2] = 0; + forward[2] = 0; + VectorNormalize(tokillpoint); + VectorNormalize(forward); + if (DotProduct(tokillpoint, forward) > .96) // within 15 degrees either way + { + useThatTarget=true; + } + } + else + { + gi.dprintf("Couldn't find killfacing ent %s--will use killtarget anyway!\n",monster.killfacing); + } + } + + if (useThatTarget) + { + edict_t *t = NULL; + qboolean foundScript=false; + qboolean foundTarget=false; + while ((t = G_Find (t, FOFS(targetname), monster.killtarget))) + { + foundTarget=true; + t->use(t, &monster, &monster); + if (!strcmp(t->classname, "script_runner") && (t->spawnflags&1)) + { + foundScript=true; + gi.dprintf("%s is running a WILL_KILL_USER script, and won't die right now!\n", monster.classname); + monster.health=monster.max_health; + + //clear out all actions, so the script stuff happens immediately + list::iterator ia; + + for (ia=actions.begin();ia!=actions.end();ia++) + { + (*ia).Destroy(); + } + while (actions.size()) + { + actions.pop_front(); + } + if (current_action) + { + current_action.Destroy(); + } + if (recycle_action) + { + recycle_action.Destroy(); + } + } + } + if (foundScript) + { + VectorClear(monster.velocity); + return; + } + else if (!foundTarget) + { + gi.dprintf("Couldn't find killtarget %s!\n",monster.killtarget); + } + } + } + +/* if(!(monster.svflags & SVF_DEADMONSTER)) + { + if(gi.irand(0, 3) == 1) + { // drop a bit of armor every so often + //item_equip_kevlar + edict_t *armor = MakeItem("item_equip_kevlar", monster.s.origin); + armor->count = gi.irand(10, 40);//hmm... hardcodedness is mine - we've really got to improve this end up stuff + + armor->movetype = MOVETYPE_DAN; + armor->friction = 1.0; + armor->gravity = 1.0; + armor->airresistance = 0.0; + armor->bouyancy = .7; + armor->elasticity = 0.3; + + armor->velocity[2] = 600;// hmm... + } + }*/ + +// monster.solid = SOLID_BBOX; + monster.solid = SOLID_CORPSE; + + monster.clipmask = CONTENTS_DEADMONSTER|MASK_DEADSOLID; + monster.svflags |= SVF_DEADMONSTER; + monster.movetype = MOVETYPE_STEP; // in case a guy is killed while NO_CLIP in scripting + monster.friction = .5; + + monster.enemy = attacker;//for awarding credit? + // CHECKME possible issues: + // If monster is killed by barrel, should we chain to find who was the barrel's killer? + // what about being clever and using architecture to kill monsters (like 16 ton weights) + + if (GetBody()) + { + if (!GetBody()->GetInitialKilledTime()) + { + GetBody()->SetInitialKilledTime(level.time); + } + GetBody()->SetLastKilledTime(level.time); + GetBody()->SetLastDFlags(dflags); + } + if ( (monster.deadflag != DEAD_DEAD) || ((monster.spawnflags & SPAWNFLAG_ARMOR_PICKUP) && (current_action && current_action->GetClassCode()== DEATHARMOR_ACTION))) + { + vec3_t facedir; + list::iterator ia; + list::iterator is; + list::iterator id; + + + // kef -- if this chunk of code gets called more than once per entity, that's bad + if ( (strstr(monster.classname, "swat")) && + (attacker->client) && + !(monster.spawnflags & SPAWNFLAG_ARMOR_PICKUP) ) + { // if the player kills a cop, game over. + if (level.maxDeadHostages==-1) + { + level.maxDeadHostages=0; + } + level.deadHostages=level.maxDeadHostages+1; + } + else if (IsHostage()) + { // keep track of number of dead hostages in this level + level.deadHostages++; + } + else if (IsSpecialBuddy()&&attacker->client) + { + //yick. well, it's an easy way to fail. + if (level.maxDeadHostages==-1) + { + level.maxDeadHostages=0; + } + level.deadHostages=level.maxDeadHostages+1; + } + +/* if (game.GameStats->CanBuy(attacker)) + { + //changed this to be conditional so it wouldn't crash --ss + if(CMonsterStats *MonsterStats = game.GameStats->GetMonsterStats(&monster)) + { + GetPlayerStats(attacker)->AdjustCashToBeAwarded(MonsterStats->GetKilledValue()); + } + else + { + gi.dprintf("Error: no stats for monster!\n"); + } + // this stuff gets put into bank account at "end" of mission + }*/ + +//fixme: do need the npc check, but do it a good way +// if (!(monster.monsterinfo.aiflags & AI_GOOD_GUY)) +// { + level.killed_monsters++; +/* if (coop->value && attacker->client) + { + attacker->client->resp.score++; + }*/ +// } + + // huh? should have list-eating separated out? + for (is=senses.begin();is != senses.end();is++) + { + (*is).Destroy(); + } + + for (ia=actions.begin();ia!=actions.end();ia++) + { + (*ia).Destroy(); + } + + for (id=decisions.begin();id!=decisions.end();id++) + { + (*id).Destroy(); + } + + + //now ditch nodes + while (senses.size()) + { + senses.pop_front(); + } + + while (actions.size()) + { + actions.pop_front(); + } + + while (decisions.size()) + { + decisions.pop_front(); + } + + if (current_action && !(monster.spawnflags & SPAWNFLAG_ARMOR_PICKUP) ) + { + current_action.Destroy(); + } + + if (recycle_action) + { + recycle_action.Destroy(); + } + + PickDeathAnim(monster, inflictor, attacker, damage, point, dflags); + + monster.touch = NULL;//do we need this here? + monster.deadflag = DEAD_DEAD; + + // kef -- cut off any sounds he's making + gi.sound(&monster, CHAN_VOICE, 0 , .6, ATTN_NORM, 0); + + VectorSubtract(point,monster.s.origin,facedir); + VectorCopy(monster.s.angles, ideal_angles); + gi.linkentity (&monster); + } +} + +void ai_c::Pain(edict_t &monster, edict_t *other, vec3_t point, float kick, int damage) +{ + if (monster.health > 0 && body) + { + mmove_t *newpain; + + if (other->client) + { + if (IsSpecialBuddy())//if i'm a special buddy, print a special message + { + gi.SP_Print(other, SINGLEPLR_BUDDY_HIT); + } + } + + if (newpain = body->GetSequenceForPain(monster, point, kick, damage)) + { + NewCurrentAction(PainAction(NULL, current_action, newpain, monster, other, kick, damage, 10.0), monster); + } + } +} + +void ai_c::Escape(edict_t &monster) +{ // sort of a ::die lite - makes guys safe to toss + + // make certain I'm out of view or life will be poor indeed + if(gi.inPVS(monster.s.origin, level.sight_client->s.origin)) + { + return;//don't wanna see folks disappearing for no reason + } + + attentionLevel = ATTENTION_DISTRACTED;//? eh, I don't care. As long as they don't get here again + + monster.health = 0; + + if (monster.killtarget && (monster.deadflag != DEAD_DEAD)) + { + qboolean useThatTarget=true; + + //if killfacing set, i might Not want to use that target! + if (monster.killfacing) + { + vec3_t forward, tokillpoint; + edict_t *target = NULL; + useThatTarget=false; + + AngleVectors(monster.s.angles, forward, NULL, NULL); + target = G_Find(target, FOFS(targetname), monster.killfacing); + if (target) + { + VectorSubtract(target->s.origin, monster.s.origin, tokillpoint); + tokillpoint[2] = 0; + forward[2] = 0; + VectorNormalize(tokillpoint); + VectorNormalize(forward); + if (DotProduct(tokillpoint, forward) > .96) // within 15 degrees either way + { + useThatTarget=true; + } + } + else + { + gi.dprintf("Couldn't find killfacing ent %s--will use killtarget anyway!\n",monster.killfacing); + } + } + + if (useThatTarget) + { + edict_t *t = NULL; + qboolean foundScript=false; + qboolean foundTarget=false; + while ((t = G_Find (t, FOFS(targetname), monster.killtarget))) + { + foundTarget=true; + t->use(t, &monster, &monster); + if (!strcmp(t->classname, "script_runner") && (t->spawnflags&1)) + { + foundScript=true; + gi.dprintf("%s is running a WILL_KILL_USER script, and won't die right now!\n", monster.classname); + monster.health=monster.max_health; + + //clear out all actions, so the script stuff happens immediately + list::iterator ia; + + for (ia=actions.begin();ia!=actions.end();ia++) + { + (*ia).Destroy(); + } + while (actions.size()) + { + actions.pop_front(); + } + if (current_action) + { + current_action.Destroy(); + } + if (recycle_action) + { + recycle_action.Destroy(); + } + } + } + if (foundScript) + { + VectorClear(monster.velocity); + return; + } + else if (!foundTarget) + { + gi.dprintf("Couldn't find killtarget %s!\n",monster.killtarget); + } + } + } + + monster.solid = SOLID_NOT; + monster.clipmask = 0; + monster.svflags |= SVF_DEADMONSTER|SVF_NOCLIENT;// I don't want see this + monster.movetype = MOVETYPE_NONE; // in case a guy is killed while NO_CLIP in scripting + + if (GetBody()) + { + GetBody()->SetInitialKilledTime(level.time - 25);//give him 5 seconds to go away + GetBody()->SetLastDFlags(0); + } + if (monster.deadflag != DEAD_DEAD) + { + list::iterator ia; + list::iterator is; + list::iterator id; + + + // huh? should have list-eating separated out? + for (is=senses.begin();is != senses.end();is++) + { + (*is).Destroy(); + } + + for (ia=actions.begin();ia!=actions.end();ia++) + { + (*ia).Destroy(); + } + + for (id=decisions.begin();id!=decisions.end();id++) + { + (*id).Destroy(); + } + + + //now ditch nodes + while (senses.size()) + { + senses.pop_front(); + } + + while (actions.size()) + { + actions.pop_front(); + } + + while (decisions.size()) + { + decisions.pop_front(); + } + + if (current_action) + { + current_action.Destroy(); + } + + if (recycle_action) + { + recycle_action.Destroy(); + } + + monster.touch = NULL;//do we need this here? + monster.deadflag = DEAD_DEAD; + + gi.linkentity (&monster);//? I need him around for a bit to be safe, but that is all + } +} + +void ai_c::SetGround(float groundval) +{ +// if (ent && ent->ghoulInst && !ent->ghoulInst->GetPlayingSequence()) +// { +// return; +// } + + ground=groundval; +} + +void ai_c::InitBBoxPreset(bbox_preset preset_index, vec_t xMinVal, vec_t yMinVal, vec_t zMinVal, + vec_t xMaxVal, vec_t yMaxVal, vec_t zMaxVal) +{ + //invalid preset index + if (preset_index < 0 || preset_index >= BBOX_PRESET_NUMBER) + { + return; + } + + VectorSet(preset_mins[preset_index], xMinVal, yMinVal, zMinVal); + VectorSet(preset_maxs[preset_index], xMaxVal, yMaxVal, zMaxVal); +} + +void ai_c::ConfirmBBox (edict_t &monster, mmove_t *curMove) +{ +// Hmm, do we really care if a dead guy's bbox intersects architecture? I don't think so, so I'm going to give it a shot. +// But, we can only do this with x-y, lest he fall throught the world + + monster.mins[0] = preset_mins[current_bbox][0]; + monster.mins[1] = preset_mins[current_bbox][1]; + monster.maxs[0] = preset_maxs[current_bbox][0]; + monster.maxs[1] = preset_maxs[current_bbox][1]; +} + +qboolean ai_c::AttemptSetBBox (edict_t &monster, bbox_preset preset_index, qboolean forceZ) +{ + trace_t tr; + + vec3_t testpos,testmins,testmaxs; + + qboolean minorAdjust = false; + + //invalid preset index + if (preset_index < 0 || preset_index >= BBOX_PRESET_NUMBER) + { + return false; + } + + VectorCopy(monster.s.origin,testpos); + VectorScale(preset_mins[preset_index],scale,testmins); +// testpos[2]-=testmins[2]-monster.mins[2]; + VectorScale(preset_maxs[preset_index],scale,testmaxs); + + + if (preset_index == current_bbox /*&& monster.ghoulInst && monster.ghoulInst->GetPlayingSequence()*/) + { + + if (monster.mins[2]-ground>15.0) + { + ground = monster.mins[2] - 15; + } + if (monster.mins[2]-ground<-15.0) + { + ground = monster.mins[2] + 15; + } + + float adjust2 = fabs(monster.mins[2]-ground); + if (!monster.groundentity && (monster.solid != SOLID_CORPSE)) + { + return true; + } + + //commented out the groundentity check to allow guys in air to twiddle with their bboxes + if (/*(!monster.groundentity&&monster.movetype==MOVETYPE_STEP) ||*/ adjust2 < 1) + { + return true; + } +// gi.dprintf("minor adjustment: %f\n",monster.mins[2]-ground); + minorAdjust = true; +// testpos[2]=monster.s.origin[2]; + testpos[2]-=ground-monster.mins[2]; + testmaxs[2]+=ground-testmins[2]; + testmins[2]=ground; + } + else + { + float majorAdjustLen = monster.mins[2]-testmins[2]; +// gi.dprintf("major adjustment: %f\n",majorAdjustLen); +// testpos[2]-=majorAdjustLen; + testmaxs[2]+=majorAdjustLen; + testmins[2]+=majorAdjustLen; + } + +// set upper bound of box to the greater of the head height of the monster or the height of the +// preset bounding box. +// bool heightadjust = false; + if (((monster.viewheight) > testmaxs[2]) && (fabs(monster.viewheight - testmaxs[2]) > 4)) + { + testmaxs[2] = monster.viewheight; +// heightadjust = true; + } + +// if (monster.deadflag==DEAD_DEAD) +// { +// gi.trace(testpos, testmins, testmaxs, testpos, &monster, monster.clipmask, &tr); +// } +// else + if (monster.movetype == MOVETYPE_NOCLIP) // awful badness for crazy climbing animations and such + { + tr.allsolid = false; + } + else + { + gi.trace(testpos, testmins, testmaxs, testpos, &monster, MASK_MONSTERSOLID, &tr); + } + + if (!tr.allsolid) + { + VectorCopy(testmins, monster.mins); + VectorCopy(testmaxs, monster.maxs); + VectorCopy(testpos, monster.s.origin); + gi.linkentity (&monster); + + //in case i come back here this frame, set my ground to my testmins so i don't hop back where i was +// if (!minorAdjust) +// { +// ground=testmins[2]; +// } + + //early attempt at preventing spawn-sprouting +// if (monster.ghoulInst && !monster.ghoulInst->GetPlayingSequence()) +// { +// ground=testmins[2]; +// } + +// if (!heightadjust) + { + current_bbox = preset_index; + } + return true; + } + + if (forceZ /*&& !minorAdjust*/) + { + testmins[0]=monster.mins[0]; + testmins[1]=monster.mins[1]; + testmaxs[0]=monster.maxs[0]; + testmaxs[1]=monster.maxs[1]; + + +// if (monster.deadflag==DEAD_DEAD) +// { +// gi.trace(testpos, testmins, testmaxs, testpos, &monster, monster.clipmask, &tr); +// } +// else + { + gi.trace(testpos, testmins, testmaxs, testpos, &monster, MASK_MONSTERSOLID, &tr); + } + + if (!tr.allsolid && !tr.startsolid || (monster.deadflag & DEAD_DEAD)) + { + VectorCopy(testmins, monster.mins); + VectorCopy(testmaxs, monster.maxs); + VectorCopy(testpos, monster.s.origin); + gi.linkentity (&monster); + +// if (!heightadjust) + { + current_bbox = preset_index;//achtung! not really! + } + return true; + } +#if _DEBUG + Com_Printf("Unable to force bbox z component!\n"); +#endif + } + return minorAdjust; +} + +void ai_c::Emote(edict_t &monster, emotion_index new_emotion, float emotion_duration, qboolean scripted_emoting) +{ + if (body) + { + body->Emote(monster,new_emotion,emotion_duration,scripted_emoting); + } +} + +emotion_index ai_c::GetMood(edict_t &monster) +{ + if (body) + { + return body->GetMood(monster); + } + return EMOTION_NORMAL; +} + +void ai_c::FinishMove(edict_t &monster) +{ + if (body) + { + body->FinishMove(monster); + } +} + +void ai_c::InAirFrame(edict_t &monster, float frameTime) +{ + if (body) + { + body->HoldAnimation(monster, HOLDCODE_INAIR, frameTime); + } +} + +void ai_c::JumpFrame(edict_t &monster) +{ + if (body) + { + body->SetFlags(monster, FRAMEFLAG_JUMP); + } +} + +void ai_c::LandFrame(edict_t &monster) +{ + if (body) + { + body->SetFlags(monster, FRAMEFLAG_LAND); + } +} + +void ai_c::AttackFrame(edict_t &monster) +{ + if (body) + { + body->SetFlags(monster, FRAMEFLAG_ATTACK); + } +} + +void ai_c::ThrowFrame(edict_t &monster) +{ + if (body) + { + body->SetFlags(monster, FRAMEFLAG_THROW); + } +} + +void ai_c::MeleeFrame(edict_t &monster) +{ + if (body) + { + body->SetFlags(monster, FRAMEFLAG_MELEE); + } +} + +void ai_c::HandleCallBack(IGhoulInst *me,void *user,float now,const void *data) +{ + edict_t *ent = (edict_t *)user; + + if (!strcmp((char*)data,"rstep")) + { + FX_SetEvent(ent, EV_FOOTSTEPRIGHT); + } + else if (!strcmp((char*)data,"lstep")) + { + FX_SetEvent(ent, EV_FOOTSTEPLEFT); + } + else if (!strcmp((char*)data,"ooze")) + { + vec3_t curVec; + + VectorCopy(ent->s.origin, curVec); + curVec[2] += 10; + + FX_MakeDecalBelow(curVec,FXDECAL_BLOODPOOL,0); + } +} + +mmove_t *ai_c::GetMove(void) +{ + if (body) + { + return body->GetMove(); + } + return NULL; +} + +void ai_c::SetMove(mmove_t *newmove) +{ + if (body) + { + body->SetMove(newmove); + } +} + +//if you pass in NULL, will return any old scripted decision +scripted_decision *ai_c::FindScriptedDecision(edict_t* ScriptEntity) +{ + list::iterator IterDecision; + + for(IterDecision = decisions.begin(); IterDecision != decisions.end(); IterDecision++) + { + if ((*IterDecision)->MatchScriptEnt(ScriptEntity) || (!ScriptEntity && (*IterDecision)->GetClassCode()==SCRIPTED_DECISION)) + { + return (scripted_decision*)((decision_c*)(*IterDecision)); + } + } + return NULL; +} + +void ai_c::CancelScripting(edict_t* ScriptEntity) +{ + list::iterator IterDecision; + list::iterator IterAction, IterAction2; + + //find the scripting decision + for(IterDecision = decisions.begin(); IterDecision != decisions.end(); IterDecision++) + { + //ok, got the decision... + if ((*IterDecision)->MatchScriptEnt(ScriptEntity) || (!ScriptEntity && (*IterDecision)->GetClassCode()==SCRIPTED_DECISION)) + { + //get rid of all the actions in the action queue that are owned by the scripted decision + for(IterAction = actions.begin(); IterAction != actions.end(); ) + { + if (ent && (*IterAction) && (*IterAction)->GetOwnerDecision()==(*IterDecision)) + { + for(IterAction2 = actions.begin(); IterAction2 != actions.end(); IterAction2++) + { + if ((*IterAction2)->GetOwnerAction()==(*IterAction)) + { + (*IterAction2)->SetOwnerAction(NULL); + } + } + if (current_action && current_action->GetOwnerAction()==(*IterAction)) + { + current_action->SetOwnerAction(NULL); + } + (*IterAction).Destroy(); + actions.erase(IterAction++); + } + else + { + IterAction++; + } + } + + //if the current_action is owned by the scripted decision, get rid of it too + if (ent && current_action && current_action->GetOwnerDecision()==(*IterDecision)) + { + NextAction(*ent); + } + + //ok, there shouldn't be any pointers left to the scripted decision; get rid of it. + (*IterDecision).Destroy(); + decisions.erase(IterDecision); + + break;//this will be messy if a scriptent has more than one decision, but that shouldn't ever happen... + } + } +} + +decision_c *ai_c::FindOrderDecision() +{ + list::iterator IterDecision; + + for(IterDecision = decisions.begin(); IterDecision != decisions.end(); IterDecision++) + { + if ((*IterDecision)->GetClassCode() == ORDER_DECISION) + { + return (*IterDecision); + } + } + return NULL; +} + +bool ai_c::GetLastActionDestination(vec3_t Destination) +{ +// The function should return the goal position for the lastest action with such a position + list::iterator IterAction; + + for(IterAction = (--actions.end()); IterAction != actions.end(); IterAction--) + { + if (*IterAction) + { + (*IterAction)->GetDest(Destination); + } + else + { + continue; + } + if (!(VectorCompare(Destination, vec3_origin))) + { + return true; + } + } + // check the current action + if (current_action) + { + current_action->GetDest(Destination); + } + if (!(VectorCompare(Destination, vec3_origin))) + { + return true; + } + return false; +} + +void ai_c::PickDeathAnim(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags) +{ + mmove_t *mydeath; + if (body) + { + mydeath = body->GetSequenceForDeath(monster, inflictor, attacker, damage, point, dflags); + if (mydeath && mydeath->suggested_action != ACTCODE_DEATH) + { + gi.dprintf("Death action %s not really a death!\n", mydeath->ghoulSeqName); + } + if (!mydeath) + { + mydeath=&generic_move_death_long; + } + } + + if (monster.spawnflags & SPAWNFLAG_ARMOR_PICKUP) + { + NewCurrentAction(new deathcorpse_action(NULL, NULL, mydeath, monster, inflictor, attacker, damage, point), monster); + } + else + { + NewCurrentAction(DeathAction(NULL, NULL, mydeath, monster, inflictor, attacker, damage, point), monster); + } +} + +action_c *ai_c::GetLastAction() +{ + list::iterator ActionIter; + + ActionIter = actions.end(); + ActionIter--; + + return (*ActionIter); +} + +void ai_c::RemoveOldDecisions (int code) +{ + list::iterator DecisionIter; + + for (DecisionIter = decisions.begin();DecisionIter!=decisions.end();DecisionIter++) + { + if ((*DecisionIter)->GetClassCode() == code) + { + list::iterator ActionIter; + + // eliminate old order actions + for (ActionIter=actions.begin();ActionIter!=actions.end();ActionIter++) + { + if ((*ActionIter)->GetOwnerDecision() == (*DecisionIter)) + { + (*ActionIter).Destroy(); + } + } + (*DecisionIter).Destroy(); + } + } +} + +//eek, has ballooned into a large blimpy thing... +void ai_c::SetTargetTime(float now, edict_t *target, vec3_t position) +{ + //if i'm first being alerted, notify other folks! + if (!hasHadTarget && ent) + { + //HACK ALERT! ...but only if i'm close to the guy... + vec3_t topos; + VectorSubtract(position, ent->s.origin, topos); +// if (VectorLengthSquared(topos)<250000) + if (VectorLengthSquared(topos)<1000000)//this is tweaked to work on trn1 + { + if (isStartleable) + { + SetStartleability(false); + + //only play alert sound if perception was immediate, and enemy is client...(fixme?) + if (target->client && body) + { + body->VoiceWakeSound(*ent, 0.9); +// PlayerNoise(target, position, AI_SENSETYPE_SOUND_WAKEUP, NULL, 500); + PlayerNoise(target, ent->s.origin, AI_SENSETYPE_SOUND_WAKEUP, NULL, 500); + } + } + } + } + + hasHadTarget=true; + if (now>lastTargetTime) + { + lastTargetTime=now; + } + if (ent && GetClassCode()!=AI_MESO_RAIDERBOSS2 && GetClassCode()!=AI_MESO_SKINHEADBOSS) + { + ent->spawnflags&=~SPAWNFLAG_SENSE_MUTE; + + //give me senses--i'm after somebody! + if (ent->spawnflags&SPAWNFLAG_BLIND) + { + NewSense(new normalsight_sense(), ent); + ent->spawnflags&=(~SPAWNFLAG_BLIND); + } + if (ent->spawnflags&SPAWNFLAG_DEAF) + { + NewSense(new sound_sense(), ent); + ent->spawnflags&=(~SPAWNFLAG_DEAF); + } + } + + assert((!target)||(target->inuse < 10)); + curTarget = target; + +} + +void ai_c::UpdatePathPosition(edict_t *myEnt) +{ + if(aiPoints.isActive()) + { + aiPoints.linkEnemyIntoPath(ent->s.origin, &nodeData); + } +} + +int ai_c::CheckForCorpseActivate(edict_t &monster) +{ + edict_t *curSearch = 0; + + CRadiusContent rad(monster.s.origin, 200); + + for(int i = 0; i < rad.getNumFound(); i++) + { + curSearch = rad.foundEdict(i); + + if(curSearch->deadflag == DEAD_DEAD) + { // is this a valid search? + return 1; + } + } + return 0; +} + +void ai_c::RegisterShotForDodge(vec3_t start, vec3_t end, edict_t *shooter) +{ + list::iterator id, pick, t_id; + int i,dec_siz; + + dec_siz=decisions.size(); + + if (dec_siz==0) + { + return; + } + + RegisterSenseEvent(sound_mask, start, level.time, shooter, AI_SENSETYPE_SOUND_WHIZ); + + for (id=decisions.begin(), i=dec_siz;i>0;i--) + { + (*id)->SetInfoForDodge(start, end); + id++; + } +} + +void ai_c::RegisterShotForReply(vec3_t start, vec3_t end, edict_t *shooter) +{ + list::iterator id, pick, t_id; + int i,dec_siz; + + dec_siz=decisions.size(); + + if (dec_siz==0) + { + return; + } + + for (id=decisions.begin(), i=dec_siz;i>0;i--) + { + (*id)->SetInfoForReply(start, end); + id++; + } +} + +void ai_c::Spook(float amount, vec3_t center) +{ + list::iterator id, pick, t_id; + int i,dec_siz; + + dec_siz=decisions.size(); + + if (dec_siz==0) + { + return; + } + + for (id=decisions.begin(), i=dec_siz;i>0;i--) + { + (*id)->AddFear(amount, center); + id++; + } + +} + +action_c *ai_c::WalkAction(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing, float timeout, qboolean fullAnimation) +{ + if (recycle_action && recycle_action->GetClassCode()==WALK_ACTION) + { + walk_action *returnme=(walk_action*)(action_c*)recycle_action; + recycle_action = NULL; + returnme->Init(od, oa, newanim, destination, facing, timeout, fullAnimation); + return returnme; + } + + return new walk_action(od, oa, newanim, destination, facing, timeout,fullAnimation); +} + +action_c *ai_c::DefaultAction(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing, edict_t *target, float timeout, qboolean fullAnimation) +{ + if (recycle_action && recycle_action->GetClassCode()==STAND_ACTION) + { + stand_action *returnme=(stand_action*)(action_c*)recycle_action; + recycle_action = NULL; + returnme->Init(od, oa, newanim, destination, facing, target, timeout, fullAnimation); + return returnme; + } + + return new stand_action(od, oa, newanim, destination, facing, target, timeout,fullAnimation); +} + +action_c *ai_c::PainAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *other, float kick, int damage, float timeout, qboolean fullAnimation) +{ + return new pain_action(od, oa, newanim, monster, other, kick, damage, timeout,fullAnimation); +} + +action_c *ai_c::DeathAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + return new death_action(od, oa, newanim, monster, inflictor, attacker, damage, point); +} + +action_c *ai_c::DeathAction(decision_c *od, action_c *oa, mmove_t *newanim1, mmove_t *newanim2, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + return new death_action(od, oa, newanim1, newanim2, monster, inflictor, attacker, damage, point); +} + +action_c *ai_c::DeathArmorAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + return new deatharmor_action(od, oa, newanim, monster, inflictor, attacker, damage, point); +} + +action_c *ai_c::DeathArmorAction(decision_c *od, action_c *oa, mmove_t *newanim1, mmove_t *newanim2, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + return new deatharmor_action(od, oa, newanim1, newanim2, monster, inflictor, attacker, damage, point); +} + +action_c *ai_c::AttackAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t attackPos, vec3_t facing, float timeout, qboolean fullAnimation, bool shouldKill, int NullTarget) +{ + return new shoot_attack_action(od, oa, newanim, attackTarget, attackPos, facing, timeout,fullAnimation, shouldKill, NullTarget); +} + +action_c *ai_c::JumpAction(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing, float timeout, qboolean fullAnimation) +{ + return new jump_action(od, oa, newanim, destination, facing, timeout,fullAnimation); +} + +action_c *ai_c::FallAction(decision_c *od, action_c *oa, mmove_t *newanim, mmove_t *newanim2, vec3_t destination, vec3_t facing, float timeout, qboolean fullAnimation) +{ + return new fall_action(od, oa, newanim, newanim2, destination, facing, timeout,fullAnimation); +} + +action_c *ai_c::SurrenderAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *surrenderTo, vec3_t attackerPos, vec3_t facing, float timeout, qboolean fullAnimation) +{ + return new surrender_action(od, oa, newanim, surrenderTo, attackerPos, facing, timeout,fullAnimation); +} + +action_c *ai_c::CaptureAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t attackPos, vec3_t facing, float timeout, qboolean fullAnimation) +{ + return new capture_action(od, oa, newanim, attackTarget, attackPos, facing, timeout,fullAnimation); +} + +action_c *ai_c::EndScriptAction(decision_c *od) +{ + return new endscript_action(od); +} + +void ai_c::RequestMoveOutOfWay(vec3_t moveDir) +{ + VectorCopy(moveDir, requestedMoveDir); +} + +ai_c *ai_c::Create(int classcode, edict_t *monster, char *ghoulname, char *subname) +{ + ai_c *new_ai = (ai_c*)NewClassForCode(classcode); + new_ai->SetEnt(monster); + new_ai->AddBody(monster); + new_ai->Init(monster, ghoulname, subname); + if((classcode >= AI_ECTO_SKINLEADER)&&(classcode <= AI_FEMALE_TAYLOR)) + { + new_ai->mySkills = enemySkills[classcode - AI_ECTO_SKINLEADER];//easiest way to do all this with minimal code + if(monster) + { + float myVal = gi.RegionDistance(monster->s.origin); + if(myVal != -1) + { //sigh... this is pretty general + if(myVal > 1200) + { + new_ai->mySkills.adjustAccuracy(.66);//? + } + else + { + new_ai->mySkills.adjustAccuracy(.33);//? + } + } + } + } + new_ai->mySkills.InitStyles(monster); + return new_ai; +} + + + + + + + +// CAISkills Stuff + +tempStyle_t enemyActionStyles[] = +{ +// shot at, no visibility friend killed attacked out of range too close explosive + {ESSA_ATTACK_DIRECTION, ESFK_IGNORE, ESAT_APPROACH, ESOR_ATTACK_IF_POSSIBLE, ESTC_HOLD_POSITION, ESEX_IGNORE}, //EST_AGGRESSIVE + {ESSA_RETREAT_TO_COVER, ESFK_IGNORE, ESAT_DUCK, ESOR_APPROACH, ESTC_ROLL_TO_SIDE, ESEX_DODGE}, //EST_EVASIVE + {ESSA_FLEE_TO_COVER, ESFK_RETREAT_TO_AMBUSH, ESAT_COVER_AND_AMBUSH, ESOR_APPROACH, ESTC_RETREAT, ESEX_DODGE}, //EST_SNEAKY + {ESSA_ATTACK_DIRECTION, ESFK_RETREAT_TO_COVER, ESAT_CIRCLE, ESOR_APPROACH, ESTC_CIRCLE, ESEX_DODGE}, //EST_TACTICAL + {ESSA_FLEE_TO_COVER, ESFK_RETREAT_TO_COVER, ESAT_COVER_AND_ATTACK, ESOR_HOLD_POSITION, ESTC_RETREAT, ESEX_DODGE}, //EST_COWARDLY + {ESSA_RETREAT_TO_COVER, ESFK_RETREAT_TO_ALLIES, ESAT_COVER_AND_ATTACK, ESOR_HOLD_POSITION, ESTC_RETREAT, ESEX_DODGE}, //EST_CAUTIOUS +}; + +CAISkills::CAISkills(void) +{ + idealRangeMin = 100; + idealRangeMax = 300; + dodgeAbility = .8; + + shootingAccuracy = 1.0; + + hesitation = 0.0; + aimTime = 0.0f; + cashValue = 0.0f; + turnSpeed = 1.0; + + flags = 0; + + shotAt = 0; + friendsKilled = 0; + attacked = 0; + outOfRange = 0; + tooClose = 0; + explosive = 0; +} + +void CAISkills::setSkills(float rangeMin, float rangeMax, float dodge, float accuracy, + float newHesitation, float newAimTime, float newCashValue, float newTurnSpeed, float newFlags) +{ + idealRangeMin = rangeMin; + idealRangeMax = rangeMax; + dodgeAbility = dodge; + shootingAccuracy = accuracy; + hesitation = newHesitation; + aimTime = newAimTime; + cashValue = newCashValue; + flags = newFlags; + turnSpeed = newTurnSpeed; +} + +void CAISkills::setStyles(int newShotAt, int newFriendsKilled, int newAttacked, int newOutOfRange, + int newTooClose, int newExplosive) +{ + shotAt = newShotAt; + friendsKilled = newFriendsKilled; + attacked = newAttacked; + outOfRange = newOutOfRange; + tooClose = newTooClose; + explosive = newExplosive; +} + +void CAISkills::setStyles(int styleNum) +{ + if(styleNum >= 0 && styleNum < EST_NUM_STYLES) + { + setStyles(enemyActionStyles[styleNum].shotAt, enemyActionStyles[styleNum].friendsKilled, + enemyActionStyles[styleNum].attacked, enemyActionStyles[styleNum].outOfRange, + enemyActionStyles[styleNum].tooClose, enemyActionStyles[styleNum].explosive); + } +} + +CAISkills::CAISkills(float rangeMin, float rangeMax, float dodge, float accuracy, + float newHesitation, float newAimTime, float newCashValue, float newTurnSpeed, float newFlags, + int newShotAt, int newFriendsKilled, int newAttacked, int newOutOfRange, + int newTooClose, int newExplosive) +{ + setSkills(rangeMin, rangeMax, dodge, accuracy, newHesitation, newAimTime, newCashValue, newTurnSpeed, newFlags); + setStyles(newShotAt, newFriendsKilled, newAttacked, newOutOfRange, newTooClose, newExplosive); +} + +void CAISkills::operator=(CAISkills &that) +{ + idealRangeMin = that.idealRangeMin; + idealRangeMax = that.idealRangeMax; + dodgeAbility = that.dodgeAbility; + + shootingAccuracy = that.shootingAccuracy; + + hesitation = that.hesitation; + aimTime = that.aimTime; + cashValue = that.cashValue; + turnSpeed = that.turnSpeed; + flags = that.flags; + + shotAt = that.shotAt; + friendsKilled = that.friendsKilled; + attacked = that.attacked; + outOfRange = that.outOfRange; + tooClose = that.tooClose; + explosive = that.explosive; + + //Eh? BAD BAD BAD - this is naughty! People pay me to write this kind of stuff? Incredible! + if((!strncmp(level.mapname, "tsr", 3))|| + (!strncmp(level.mapname, "trn", 3))|| + ((!(strncmp(level.mapname, "irq", 3)))&&(level.mapname[4] == 'a'))) + { + hesitation += .25; + shootingAccuracy *= .75; + aimTime += 2; + cashValue *= .5; + } +} + +void CAISkills::InitStyles(edict_t *monster) +{ + if(!monster) + { + return; + } + + if(monster->personality) + { + setStyles(monster->personality - 1); + } + else + { + //default it properly here later based on flags set in the skill stuff here + setStyles(gi.irand(0, EST_NUM_STYLES-1)); + } +} \ No newline at end of file diff --git a/Source/Game/gamecpp/ai.h b/Source/Game/gamecpp/ai.h new file mode 100644 index 0000000..3343f74 --- /dev/null +++ b/Source/Game/gamecpp/ai.h @@ -0,0 +1,559 @@ +#ifndef __AI_H +#define __AI_H + +void vectoangles(vec3_t in, vec3_t out);//urk. the body of the stuff that uses this should be in .cpp, but for now, it's more convenient in here + +#define SPAWNFLAG_ECON_OVERRIDE (1<<0) +#define SPAWNFLAG_BLIND (1<<1) +#define SPAWNFLAG_DEAF (1<<2) +#define SPAWNFLAG_NOSCALE (1<<3) +#define SPAWNFLAG_TRIGGER_SPAWN (1<<4) +#define SPAWNFLAG_SENSE_MUTE (1<<5) +#define SPAWNFLAG_START_ACTIVE (1<<6) +#define SPAWNFLAG_HOLD_POSITION (1<<7) +// +// bits 8 through 12 (0-indexed) are used in g_local.h for difficulty settings, deathmatch, and coop +// +#define SPAWNFLAG_NEVER_STARTLED (1<<13) +#define SPAWNFLAG_HOSTAGE (1<<14) +#define SPAWNFLAG_NO_ARMOR (1<<15) +#define SPAWNFLAG_ARMOR_PICKUP (1<<16) +#define SPAWNFLAG_NO_WEAPONS (1<<17) +#define SPAWNFLAG_NO_WOUND (1<<18) +#define SPAWNFLAG_HAS_PROJECTILE (1<<19) +#define SPAWNFLAG_FACE_PLAYER (1<<20) + +#define MISC_FLAG_FIRINGBLIND 0x00000001 + +// +// Rick sez we've got up to bit 20 +// + + +#define AIS_NODROPWEAPON 0x00000001 +#define AIS_WONTADVANCE 0x00000002 +#define AIS_NOKNOCKOVER 0x00000004 +#define AIS_NOATTACKONRETREAT 0X00000008 +#define AIS_NODUCK 0x00000010 +#define AIS_NOSUPPRESS 0x00000020 +#define AIS_CHEATERSEARCH 0x00000040 +#define AIS_ATTACKONLYINRANGE 0x00000080 + +typedef enum +{ + LEVCODE_UNKNOWN, + LEVCODE_TUTORIAL, + LEVCODE_NYC_SUBWAY, + LEVCODE_NYC_SUBWAY2, + LEVCODE_AFR_TRAIN, + LEVCODE_KOS_SEWER, + LEVCODE_KOS_BIGGUN, + LEVCODE_KOS_HANGAR, + LEVCODE_SIB_CANYON, + LEVCODE_SIB_BASE, + LEVCODE_SIB_PLANT, + LEVCODE_IRQ_TOWNA, + LEVCODE_IRQ_BUNKER, + LEVCODE_IRQ_CARGO, + LEVCODE_NYC_WARE, + LEVCODE_NYC_STEAM, + LEVCODE_NYC_STREETS, + LEVCODE_AFR_YARD, + LEVCODE_AFR_HOUSE, + LEVCODE_AFR_FACT, + LEVCODE_TOK_STREET, + LEVCODE_TOK_OFFICE, + LEVCODE_TOK_PENT, + LEVCODE_IRQ_STREETS, + LEVCODE_IRQ_FORT, + LEVCODE_IRQ_OIL, + LEVCODE_CAS_1, + LEVCODE_CAS_2, + LEVCODE_CAS_3, + LEVCODE_CAS_4, + LEVCODE_ARM_1, + LEVCODE_ARM_2, + LEVCODE_ARM_3, +} lev_interp_code; + +//enemy styles +enum +{ + EST_AGGRESSIVE, + EST_EVASIVE, + EST_SNEAKY, + EST_TACTICAL, + EST_COWARDLY, + EST_CAUTIOUS, + EST_NUM_STYLES +}; + +//enemy style shot at +enum +{ + ESSA_RETREAT_TO_COVER, + ESSA_FLEE_TO_COVER, + ESSA_ATTACK_DIRECTION +}; + +//enemy style friends killed +enum +{ + ESFK_IGNORE, + ESFK_RETREAT_TO_COVER, + ESFK_RETREAT_TO_ALLIES, + ESFK_RETREAT_TO_AMBUSH +}; + +//enemy style attacked +enum +{ + ESAT_DUCK, + ESAT_APPROACH, + ESAT_CIRCLE, + ESAT_COVER_AND_ATTACK, + ESAT_COVER_AND_AMBUSH +}; + +//enemy style out of range +enum +{ + ESOR_APPROACH, + ESOR_HOLD_POSITION, + ESOR_ATTACK_IF_POSSIBLE +}; + +//enemy style too close +enum +{ + ESTC_ROLL_TO_SIDE, + ESTC_RETREAT, + ESTC_HOLD_POSITION, + ESTC_CIRCLE +}; + +//enemy style explosive +enum +{ //huh huh, huh huh + ESEX_RETREAT, + ESEX_DUCK, + ESEX_DODGE, + ESEX_IGNORE +}; + +typedef struct tempStyle_s +{ + int shotAt; + int friendsKilled; + int attacked; + int outOfRange; + int tooClose; + int explosive; +}tempStyle_t; + +class CAISkills +{ +protected: + float idealRangeMin; + float idealRangeMax; + float dodgeAbility; + float shootingAccuracy; + float hesitation; // way to make guys less certain about attacking + float aimTime; + float cashValue; + int flags; + float turnSpeed; + + int shotAt; + int friendsKilled; + int attacked; + int outOfRange; + int tooClose; + int explosive; +public: + CAISkills(void); + CAISkills(float rangeMin, float rangeMax, float dodge, float accuracy, + float newHesitation, float newAimTime, float newCashValue, float newTurnSpeed,float newFlags, + int newShotAt = 0, int newFriendsKilled = 0, int newAttacked = 0, int newOutOfRange = 0, + int newTooClose = 0, int newExplosive = 0); + + void CAISkills::operator=(CAISkills &that); + + float getRangeMin(void){return idealRangeMin;} + float getRangeMax(void){return idealRangeMax;} + float getDodge(void){return dodgeAbility;} + float getAccuracy(void){return shootingAccuracy;} + float getHesitation(void){return hesitation;} + float getAimTime(void){return aimTime;} + float getCashValue(void){return cashValue;} + float getDropWeap(void){return (flags & AIS_NODROPWEAPON) == 0;} + float getTurnSpeed(void){return turnSpeed;} + int testFlag(int flag){return (flags & flag);} + + // rangeMin and Max are in terms of world units, dodge, accuracy, mobility, tactics, and cowardice are from 0 to 1, + // and aimMax is in world units. absoluteMin is in world units. + void setSkills(float rangeMin, float rangeMax, float dodge, float accuracy, + float newHesitation, float newAimTime, float newCashValue, float newTurnSpeed, float newFlags); + + int getShotAt(void){return shotAt;} + int getFriendsKilled(void){return friendsKilled;} + int getAttacked(void){return attacked;} + int getOutOfRange(void){return outOfRange;} + int getTooClose(void){return tooClose;} + int getExplosive(void){return explosive;} + + void setStyles(int newShotAt, int newFriendsKilled, int newAttacked, int newOutOfRange, + int newTooClose, int newExplosive); + + void setStyles(int styleNum); + void InitStyles(edict_t *monster); + + void adjustAccuracy(float val){shootingAccuracy *= val;} + +}; + +// external table of skills so that guys know what they are +extern CAISkills enemySkills[]; + +typedef enum +{ + LINK_NORMAL, + LINK_STAIR_UP, + LINK_STAIR_DOWN, + LINK_LADDER_UP, + LINK_LADDER_DOWN, + LINK_JUMP, +}connectType; + +typedef struct nodeData_s +{ + vec3_t curSpot;//used internally + vec3_t goPoint; + int curNode; // node we're at + int curRegion; + int nextNode; // node we're going to next + int finalNode; // node that is ultimately our destination + + int blocked; // flag indicating we have been seriously impeded + + int lastNode; // I was here before + int lastNode2; // and before + int lastNode3; // and before + + int backingUp; // keep movements less jerky, please + int approaching; // + + int corner1; // floors my corners are on + int corner2; + int corner3; + int corner4; + + vec3_t lastDir; + float lastDirSetTime; +}nodeData_t; + +lev_interp_code GetInterpCode(void); +void GetLevelSoundSuffix(char *putSuffixHere); + +class ai_c: public ai_public_c +{ +private: + + float lFootPos, rFootPos; + + qboolean done_firstframe; + + float allowActionChangeTime; + + vec3_t preset_mins[BBOX_PRESET_NUMBER]; + vec3_t preset_maxs[BBOX_PRESET_NUMBER]; + bbox_preset current_bbox; + float ground; + qboolean hasHadTarget; + float lastTargetTime; + float firstTargetTime;//when guys wake up, they need a bit of time to get the sleep out of their eyes, as it were... + qboolean abusedByTeam; + float lastNonTargetTime;//when guys search, set this. Need it for aiming and such too + + float nextWakeReactTime; + + // shared between all decisions + nodeData_t nodeData; + +// enemyWorldInfo_e enemyInfo; +// float enemyInfoTime; + +protected: + edict_t *ent; + + edict_t *curTarget; + + action_c_ptr current_action; + action_c_ptr recycle_action; + //moved from mosterinfo: keeps track of whether my standing support has gone gone away + int linkcount; + + qboolean isActive; + + //when i first get a target, should i consider going through the startled sequence? + qboolean isStartleable; + + qboolean m_bHostage; + qboolean m_bSpecialBuddy; + qboolean m_bConcentratingOnPlayer; + + vec3_t requestedMoveDir;//for guys bumpn into each other. + + float scale; + int sense_mask; + float jumpdistance; + float jumpheight; + float fallheight; + float stepheight; + int move_mask; + + int miscFlags; + + priority_index worldpriority; + int lastCheckTime; + attention_index attentionLevel; + int watchState; + + int lastCorpseCheck; + + //the higher the rank, the more likely others will make room for me? + int rank; + + CAISkills mySkills; + + body_c_ptr body; + gg_obj_c_ptr MyGhoulObj; + + vec3_t aim_angles; + vec3_t look_angles; +#define AI_SAVE_SIZE (offsetof(ai_c, look_angles) + sizeof(look_angles)) + + list senses; + list actions; + list decisions; + + virtual void Pain(edict_t &monster, edict_t *other, vec3_t point, float kick, int damage); + virtual void Die(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags = 0); + virtual void Escape(edict_t &monster); + void InitBBoxPreset(bbox_preset preset_index, vec_t xMinVal, vec_t yMinVal, vec_t zMinVal, + vec_t xMaxVal, vec_t yMaxVal, vec_t zMaxVal); + virtual void AddBody(edict_t *monster); + + virtual void PickDeathAnim(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags = 0); + +public: + + ai_c(edict_t *monster=NULL); + virtual ~ai_c(void); + + virtual qboolean IsFirstFrameTime(void); + virtual void SetEnt(edict_t *monster){ent=monster;} + virtual void FirstFrame(edict_t *monster); + virtual void Init(edict_t *monster, char *ghoulname="enemy/meso", char *subname=""); + + //the extent to which aim can deviate from edict's angles (in degrees) + virtual float GetAimConeDegrees(edict_t &monster, bbox_preset bbox); + + //the extent of inaccuracy in aiming--that is, the difference between where i want to aim and where i do aim (in degrees) + virtual float GetAimDeviationDegrees(edict_t &monster); + + //fixme: this is a shoddy way of handling save/load + virtual int GetClassCode(void){return AI_BASE;}//this should be different for everybody in this class family + + //adjust this to return something moderately compatible with player team types + virtual int GetTeam(edict_t &monster){return 1;} + // someone can be on the other team and still be innocent (iraqi civilians) + virtual int IsInnocent() { return 0; } + virtual bool AmIAsGoodAsDead(); + + virtual qboolean SafeToRemove(edict_t &monster); + + virtual void Emote(edict_t &monster, emotion_index new_emotion, float emotion_duration, qboolean scripted_emoting=false); + virtual emotion_index GetMood(edict_t &monster); + + virtual void SetPriority(priority_index newp){worldpriority = newp;} + virtual priority_index GetPriority(void){return worldpriority;} + + virtual void UseMonster(edict_t *user); + virtual void TouchMonster(edict_t *user); + + virtual void SetAbusedByTeam(qboolean newa){abusedByTeam = newa;} + virtual qboolean GetAbusedByTeam(void){return abusedByTeam;} + + virtual void NewSense(sense_c *new_sense, edict_t *monster); + +// enemyWorldInfo_e LastEnemyInfo(void){return enemyInfo;} +// enemyWorldInfo_e CurrentEnemyInfo(void){if (enemyInfoTime > level.time-0.2)return enemyInfo; else return EWI_NUM;} + + //add action to my action list; override Activate to let ai know I want to be considered activated (scripts, etc) + virtual void NewAction(action_c *new_action, edict_t *monster, qboolean activatenow=false); + virtual void NewNextAction(action_c *new_action, edict_t *monster, qboolean activatenow=false); + virtual void NewDecision(decision_c *new_decision, edict_t *monster); + virtual void NewCurrentAction(action_c *new_action, edict_t &monster); + virtual void NewDeathArmorAction(edict_t &monster); + virtual void NextAction(edict_t &monster); + virtual void EvaluateDecisions(edict_t &monster); + virtual void EvaluateSenses(edict_t &monster); + virtual void Think(edict_t &monster); + virtual qboolean Damage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb); + + virtual float GetJumpDistance(void){return jumpdistance;} + virtual float GetJumpHeight(void){return jumpheight;} + virtual float GetFallHeight(void){return fallheight;} + virtual float GetStepHeight(void){return stepheight;} + virtual int GetMoveMask(void){return move_mask;} + + virtual int GetRank(void){return rank;} + virtual void SetRank(int newrank){rank=newrank;} + + virtual void GetSensedClientInfo(unsigned mask, sensedEntInfo_t &sensedEnt); + virtual void GetSensedMonsterInfo(unsigned mask, sensedEntInfo_t &sensedEnt); + + virtual qboolean IsActive(void){return isActive;} + virtual void Activate(edict_t &monster); + + virtual void SetStartleability(qboolean newVal){isStartleable=newVal;} + virtual qboolean GetStartleability(void){return isStartleable;} + + virtual void SetHostage(qboolean bHostage) { m_bHostage = bHostage; } + virtual qboolean IsHostage() { return m_bHostage; } + + virtual void SetSpecialBuddy(qboolean bBuddy) { m_bSpecialBuddy = bBuddy; } + virtual qboolean IsSpecialBuddy() { return m_bSpecialBuddy; } + + virtual void SetConcentratingOnPlayer(qboolean bConcentrating) { m_bConcentratingOnPlayer = bConcentrating; } + virtual qboolean IsConcentratingOnPlayer() { return m_bConcentratingOnPlayer; } + + //do i have a weapon? + virtual qboolean IsArmed(edict_t &monster); + + virtual qboolean HasTarget(void){return (hasHadTarget && level.time-lastTargetTime<1.0);} + virtual qboolean HasHadTarget(void){return hasHadTarget;} + virtual void SetTargetTime(float now, edict_t *target, vec3_t position); + virtual edict_t *getTarget(void){return curTarget;} + virtual void setTarget(edict_t *target){assert((!target)||(target->inuse < 10));curTarget = target;} + virtual void setFirstTargetTime(float newTime){firstTargetTime = newTime;} + virtual float getFirstTargetTime(void){return firstTargetTime;} + virtual void setLastNonTargetTime(float newTime){lastNonTargetTime = newTime;} + virtual float getLastNonTargetTime(void){return lastNonTargetTime;} + virtual float getLastTargetTime(void){return lastTargetTime;} + + virtual qboolean getTargetPos(vec3_t putPosHere); + + virtual void MuteSenses(unsigned mask, float degree, smute_recovery recovery_code, float recovery_time); + virtual void RegisterSenseEvent(unsigned mask, vec3_t event_origin, float event_time, edict_t *event_edict, ai_sensetype_e event_code); + + //go through senses asking them their muted level with this mask, and return highest response + virtual float GetSenseMutedLevel(unsigned mask); + + virtual mmove_t *GetMove(void); + virtual void SetMove(mmove_t *newmove); + + virtual body_c *GetBody(void){return body;} + virtual ggObjC *GetGhoulObj(void){return MyGhoulObj;} + + virtual void SetAimAngles(vec3_t newaim){VectorCopy(newaim, aim_angles);} + virtual void SetAimVector(vec3_t newaim){vectoangles(newaim, aim_angles);} + virtual void GetAimAngles(vec3_t myaim){VectorCopy(aim_angles,myaim);} + virtual void GetAimVector(vec3_t forward){AngleVectors(aim_angles, forward, NULL, NULL);} + + virtual void SetLookAngles(vec3_t newaim){VectorCopy(newaim, look_angles);} + virtual void SetLookVector(vec3_t newaim){vectoangles(newaim, look_angles);} + virtual void GetLookAngles(vec3_t myaim){VectorCopy(look_angles,myaim);} + virtual void GetLookVector(vec3_t forward){AngleVectors(look_angles, forward, NULL, NULL);} + virtual attention_index GetAttention(edict_t &monster){return attentionLevel;} + + virtual void HandleCallBack(IGhoulInst *me,void *user,float now,const void *data); + + virtual float GetLeftFootPos(void){return lFootPos;} + virtual float GetRightFootPos(void){return rFootPos;} + virtual void SetLeftFootPos(float newpos){lFootPos=newpos;} + virtual void SetRightFootPos(float newpos){rFootPos=newpos;} + + virtual float GetGround(void){return ground;} + virtual void SetGround(float groundval); + + virtual void FinishMove(edict_t &monster); + + //send frames to body for storage + virtual void InAirFrame(edict_t &monster, float frameTime); + virtual void JumpFrame(edict_t &monster); + virtual void LandFrame(edict_t &monster); + virtual void AttackFrame(edict_t &monster); + virtual void MeleeFrame(edict_t &monster); + virtual void ThrowFrame(edict_t &monster); + + virtual qboolean AttemptSetBBox (edict_t &monster, bbox_preset preset_index, qboolean forceZ = false); + virtual void ConfirmBBox (edict_t &monster, mmove_t *curMove); + virtual void GetBBoxPreset (bbox_preset preset_index, vec3_t pmins, vec3_t pmaxs){VectorCopy(preset_mins[preset_index],pmins);VectorCopy(preset_maxs[preset_index],pmaxs);} + virtual bbox_preset GetBBoxPresetIndex(edict_t &monster){return current_bbox;} + + // Find a scripted decision + //if you pass in NULL, will return any old scripted decision + virtual scripted_decision *FindScriptedDecision(edict_t* ScriptEntity); + virtual void CancelScripting(edict_t* ScriptEntity); + // Find an order decision + decision_c *FindOrderDecision(); + + void RemoveOldDecisions(int code); + virtual action_c *GetLastAction(); + int &GetMiscFlags(void){return miscFlags;} + + bool GetLastActionDestination(vec3_t destination); + virtual void SetAttentionLevel(attention_index newIndex){assert(newIndex >= ATTENTION_DISTRACTED);assert(newIndex <= ATTENTION_ESCAPED); attentionLevel = newIndex;} + + + // Accessor function to Die + virtual void AnimDie(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point){Die(monster, inflictor, attacker, damage, point);}; + + // Get a default action + virtual action_c *DefaultAction(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination = vec3_origin, vec3_t facing = vec3_origin, edict_t *target = NULL, float timeout=0/*999999999999*/, qboolean fullAnimation = false);//for standing + virtual action_c *WalkAction(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false); + virtual action_c *PainAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *other, float kick, int damage, float timeout=999999999999, qboolean fullAnimation = true); + virtual action_c *DeathAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + virtual action_c *DeathAction(decision_c *od, action_c *oa, mmove_t *newanim1, mmove_t *newanim2, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + virtual action_c *DeathArmorAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + virtual action_c *DeathArmorAction(decision_c *od, action_c *oa, mmove_t *newanim1, mmove_t *newanim2, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + virtual action_c *AttackAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t attackPos, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false, bool shouldKill = false, int NullTarget = 0); + virtual action_c *JumpAction(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false); + virtual action_c *FallAction(decision_c *od, action_c *oa, mmove_t *newanim, mmove_t *newanim2, vec3_t destination, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false); + virtual action_c *SurrenderAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *surrenderTo, vec3_t attackerPos, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false); + virtual action_c *CaptureAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t attackPos, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false); + virtual action_c *EndScriptAction(decision_c *od); + + nodeData_t &getPathData(void){return nodeData;} + + virtual qboolean BeingWatched(void){return watchState;} + virtual void WatchMe(void){watchState = true;} + + virtual void UpdatePathPosition(edict_t *myEnt); + virtual int getMyNode(void){return nodeData.curNode;} + + virtual void RegisterShotForDodge(vec3_t start, vec3_t end, edict_t *shooter); + virtual void RegisterShotForReply(vec3_t start, vec3_t end, edict_t *shooter); + virtual void Spook(float amount, vec3_t center); + + virtual int CheckForCorpseActivate(edict_t &monster); + virtual void RequestMoveOutOfWay(vec3_t moveDir); + virtual float *GetMoveOutOfWay(void){return requestedMoveDir;} + + virtual CAISkills *GetMySkills(void){return &mySkills;} + + static ai_c *Create(int classcode, edict_t *monster=NULL, char *ghoulname="enemy/meso", char *subname=""); + + ai_c(ai_c *orig); + virtual void Evaluate(ai_c *orig); + virtual void Write(); + virtual void Read(); +}; + +/********************************************************************************** + **********************************************************************************/ + + +#endif \ No newline at end of file diff --git a/Source/Game/gamecpp/ai_actions.cpp b/Source/Game/gamecpp/ai_actions.cpp new file mode 100644 index 0000000..243bfcc --- /dev/null +++ b/Source/Game/gamecpp/ai_actions.cpp @@ -0,0 +1,3355 @@ +#include "g_local.h" +#include "ai_private.h" +#include "ds.h" +#include "..\qcommon\ef_flags.h" + +////////////////////////////////////////////////////////////////////////////// + +action_c *action_c::NewClassForCode(int code) +{ + switch (code) + { + case STAND_ACTION: + return new stand_action(); + case PAIN_ACTION: + return new pain_action(); + case DEATH_ACTION: + return new death_action(); + case DEATHCORPSE_ACTION: + return new deathcorpse_action(); + case DEATHARMOR_ACTION: + return new deatharmor_action(); + case ENDSCRIPT_ACTION: + return new endscript_action(); + case WALK_ACTION: + return new walk_action(); + case DOG_WALK_ACTION: + return new dog_walk_action(); + case JUMP_ACTION: + return new jump_action(); + case FALL_ACTION: + return new fall_action(); + case SURRENDER_ACTION: + return new surrender_action(); + case CAPTURE_ACTION: + return new capture_action(); + case SHOOT_ATTACK_ACTION: + return new shoot_attack_action(); + case RUNNING_MELEE_ATTACK_ACTION: + return new running_melee_attack_action(); + case HELI_ACTION: + return new heli_action(); + case HELIMOVE_ACTION: + return new helimove_action(); + case HELIFACE_ACTION: + return new heliface_action(); + case HELIATTACK_ACTION: + return new heliattack_action(); + case HELIDEATH_ACTION: + return new helideath_action(); + case SNOWCAT_ACTION: + return new snowcat_action(); + case TANK_ACTION: + return new tank_action(); + case ACTION: + gi.dprintf("ERROR: only allowed to use leaves of action class tree: %d\n",code); + break; + default: + gi.dprintf("ERROR: invalid action class code: %d\n",code); + break; + } + return new action_c(); +} + +action_c::action_c(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing, edict_t *target, float timeout, qboolean fullAnimation) +{ + anim = newanim; + + VectorCopy(facing, face); + VectorCopy(destination, dest); + faceUpdatedTime = level.time; + interrupted = false; + abortAction = false; + + owner_decision = od; + owner_action = oa; + if (newanim) + { + velScale = newanim->velScale; + default_turn = newanim->maxTurn * 2.0f; + } + else + { + velScale = 1.0f; + default_turn = 30; + } + move_mask = step_movemask; + start_time = level.time; + timeout_interval = timeout; + timeout_time = start_time + timeout_interval; + VectorClear(jump_intent); + jump_finish_time = level.time + 999; + waitForAnim = fullAnimation; + SignalEvent = NULL; + isLethal = false; + NullTarget = 0; + + action_target = target; +} + +action_c::action_c(void) +{ + VectorClear(face); + VectorClear(dest); + VectorClear(jump_intent); + timeout_interval = 999999999999; + abortAction = false; + owner_decision = NULL; + owner_action = NULL; + velScale = 0; + default_turn = 0.0; + move_mask = step_movemask; + anim = &generic_move_stand; + action_target = NULL; + waitForAnim=false; + faceUpdatedTime=level.time; + interrupted = false; + jump_finish_time = level.time + 999; + SignalEvent = NULL; + isLethal = false; + NullTarget = 0; +} + +void action_c::Init(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing, edict_t *target, float timeout, qboolean fullAnimation) +{ + anim = newanim; + + VectorCopy(facing, face); + VectorCopy(destination, dest); + faceUpdatedTime = level.time; + interrupted = false; + abortAction = false; + + owner_decision = od; + owner_action = oa; + if (newanim) + { + velScale = newanim->velScale; + default_turn = newanim->maxTurn * 2.0f; + } + else + { + velScale = 1.0f; + default_turn = 30; + } + move_mask = step_movemask; + start_time = level.time; + timeout_interval = timeout; + timeout_time = start_time + timeout_interval; + VectorClear(jump_intent); + jump_finish_time = level.time + 999; + waitForAnim = fullAnimation; + SignalEvent = NULL; + isLethal = false; + NullTarget = 0; + + action_target = target; +} + +void action_c::Init(void) +{ + VectorClear(face); + VectorClear(dest); + VectorClear(jump_intent); + timeout_interval = 999999999999; + abortAction = false; + owner_decision = NULL; + owner_action = NULL; + velScale = 0; + default_turn = 0.0; + move_mask = step_movemask; + anim = &generic_move_stand; + action_target = NULL; + waitForAnim=false; + faceUpdatedTime=level.time; + interrupted = false; + jump_finish_time = level.time + 999; + SignalEvent = NULL; + isLethal = false; + NullTarget = 0; +} + +void action_c::ResolveAction(ai_c &which_ai, edict_t &monster, float decision_success, float action_success) +{ + if (owner_decision) + { + owner_decision->ActionCompleted(*this, which_ai, monster, decision_success); + } + if (owner_action) + { + owner_action->ActionCompleted(*this, which_ai, monster, action_success); + } +} + +void action_c::SetTurnDestination(ai_c &which_ai, edict_t &monster) +{ + vec3_t v; + + if (face[0]||face[1]||face[2]) + { + VectorSubtract (face, monster.s.origin, v); + // uhhh.... this makes me a bit sick to my stomach... guys shoot from a bit above their waist + // so, bump the spot up + v[2] -= MONSTER_SHOOT_HEIGHT; + } + //if no turn destination specified, turn toward movement destination + else if (((monster.s.origin[0]-dest[0])||(monster.s.origin[1]-dest[1]))&&!VectorCompare(dest,vec3_origin)) + { + VectorSubtract (dest, monster.s.origin, v); + } + else + { + VectorCopy(monster.s.angles,which_ai.ideal_angles); + return; + } + + //Enemy_Printf(&which_ai, "%f, %f, %f\n", v[0], v[1], v[2]); + + vectoangles(v, which_ai.ideal_angles); +} + +//fixme: should not do this in actions! +qboolean action_c::AdjustBBox(ai_c &which_ai, edict_t &monster) +{ + if (which_ai.AttemptSetBBox(monster, anim->bbox)) + { + return true; + } + return false; +} + +//PerformBodilyFunctions: +//the boolean that gets returned tells caller whether to abort action (false == abort) +//the vector that gets passed in is set to reflect movement intention +qboolean action_c::PerformBodilyFunctions(ai_c &which_ai, edict_t &monster, vec3_t curDist) +{ + turninfo_s turninfo; +// Com_Printf("action!--performing body functions!\n"); + //abortAction will be set when child scripted action fails + if (abortAction || !which_ai.GetBody()) + { + return false; + } + + which_ai.GetBody()->UpdateFace(monster); + ((bodyorganic_c*)which_ai.GetBody())->UpdateSoundsByWeapon(monster, which_ai); + InterpretFlags(NextFlags(which_ai, monster), which_ai, monster); + + AdjustBBox(which_ai, monster); + + //if i have a turn destination, turn toward it + SetTurnDestination(which_ai, monster);//45 + NextTurn(1.0, which_ai, monster, turninfo);//70 + Turn(which_ai, monster, turninfo);//bout 70 + + NextMovement(which_ai, monster, curDist);//bout 115 + return true; +} + +qboolean action_c::Think(ai_c &which_ai, edict_t &monster) +{ + vec3_t mydist; + + if (!PerformBodilyFunctions(which_ai, monster, mydist)) + { + ResolveAction(which_ai, monster, 0.0, 0.0); + return true; + } + + if (monster.movetype == MOVETYPE_STEP) + { + mydist[2]=0; + } + EvaluateMovement(which_ai, monster, mydist); + if ((waitForAnim && which_ai.GetBody() && !which_ai.GetBody()->IsAnimationFinished() + && !which_ai.GetBody()->IsAnimationHeld(HOLDCODE_NO) && (level.time < timeout_time)) + || (!waitForAnim && (level.time < timeout_time))) + { + return false; + } + //finish action pronto, and let owners know about it + else + { + ResolveAction(which_ai, monster, 1.0, 1.0); + return true; + } +} + +qboolean action_c::MatchAnimation(ai_c &which_ai, edict_t &monster) +{ + qboolean success; + //just bein safe + if (!which_ai.GetBody()) + { + gi.dprintf("action::MatchAnimation--ai has no body!\n"); + return false; + } + success = which_ai.GetBody()->MatchAnimation(monster, anim); + //my anim should always be valid, lemme know if it's not + if (!success) + { +// gi.dprintf("action::MatchAnimation--sequence %s not found!\n", anim->ghoulSeqName); + } + return success; +} + +qboolean action_c::SetAnimation(ai_c &which_ai, edict_t &monster) +{ + qboolean success; + //just bein safe + if (!which_ai.GetBody()) + { + gi.dprintf("action::SetAnimation--ai has no body!\n"); + return false; + } + success = which_ai.GetBody()->SetAnimation(monster, anim); + //my anim should always be valid, lemme know if it's not + if (!success) + { +// gi.dprintf("action::SetAnimation--sequence %s not found!\n", anim->ghoulSeqName); + } + return success; +} + +qboolean action_c::ForceAnimation(ai_c &which_ai, edict_t &monster) +{ + qboolean success; + //just bein safe + if (!which_ai.GetBody()) + { + gi.dprintf("action::ForceAnimation--ai has no body!\n"); + return false; + } + success = which_ai.GetBody()->ForceAnimation(monster, anim); + //my anim should always be valid, lemme know if it's not + if (!success) + { +// gi.dprintf("action::ForceAnimation--sequence %s not found!\n", anim->ghoulSeqName); + } + return success; +} + +void action_c::NextMovement(ai_c &which_ai, edict_t &monster, vec3_t curDist) +{ + //just bein safe + if (!which_ai.GetBody()) + { + gi.dprintf("action::NextMovement--ai has no body!\n"); + VectorClear(curDist); + return; + } + which_ai.GetBody()->NextMovement(monster, curDist, velScale); +} + +void action_c::NextTurn(float scale, ai_c &which_ai, edict_t &monster, turninfo_s &turninfo) +{ + //just bein safe + if (!which_ai.GetBody()) + { + gi.dprintf("action::NextTurn--ai has no body!\n"); + turninfo.max_turn=0.0; + turninfo.min_turn=0.0; + return; + } + which_ai.GetBody()->NextTurn(scale, monster, default_turn, turninfo); +} + +int action_c::NextFlags(ai_c &which_ai, edict_t &monster) +{ + //just bein safe + if (!which_ai.GetBody()) + { + gi.dprintf("action::NextFlags--ai has no body!\n"); + return 0; + } + return which_ai.GetBody()->NextFlags(monster); +} + +void action_c::InterpretFlags(int cur_flags, ai_c &which_ai, edict_t &monster) +{ + //if frameflags specify jump & this action is primed for jumping, then jump + if (cur_flags & FRAMEFLAG_JUMP) + { + if (move_mask & jump_movemask) + { + Jump(which_ai, monster, jump_intent); + } + } + + //this ok? no keeping track of whether i've played this sound recently? + if (cur_flags & FRAMEFLAG_LAND) + { +// if (monster.groundentity) + { +// gi.dprintf("\n"); + switch(rand()%3) + { + default: + case 0: + gi.sound (&monster, CHAN_BODY, gi.soundindex ("impact/gore/fall1.wav"), 1.0, ATTN_NORM, 0); + break; + case 1: + gi.sound (&monster, CHAN_BODY, gi.soundindex ("impact/gore/fall2.wav"), 1.0, ATTN_NORM, 0); + break; + case 2: + gi.sound (&monster, CHAN_BODY, gi.soundindex ("impact/gore/fall3.wav"), 1.0, ATTN_NORM, 0); + break; + } + } + } + + //play footsteps + if (cur_flags & FRAMEFLAG_FOOTSTEP) + { + FX_SetEvent(&monster, EV_FOOTSTEPLEFT); + } + + //do an attack--call some weapon class attack routine, eventually? + if (cur_flags & FRAMEFLAG_ATTACK) + { + if (which_ai.GetBody()) + { + if (isLethal || NullTarget) + { + which_ai.setTarget(action_target); + } + which_ai.GetBody()->FirePrimaryWeapon(monster, isLethal, NullTarget); + isLethal = false; + } + } + + if (cur_flags & FRAMEFLAG_THROW) + { + // need to call the actual attack function + body_c* body = which_ai.GetBody(); + if (body) + { + body->ThrowProjectile(monster); + } + cur_flags &= ~FRAMEFLAG_THROW; + } + //frame holding--holds for random period of time, vey primitive. + if (cur_flags & FRAMEFLAG_HOLDFRAME) + { + } +} + +//jumpvec is horizontal movement--change so jump accepts goal position? +void action_c::Jump (ai_c &which_ai, edict_t &monster, vec3_t jumpvec) +{ + float frameboost; + float jump_time, vertical_vel; + float attempted_speed; + + //only go through with jump if on ground + if (!monster.groundentity || monster.movetype == MOVETYPE_FLY) + { + return; + } + + //abort jump if this action not set up for jumping + if ( !(move_mask & jump_movemask) ) + { + return; + } + + monster.groundentity = NULL; + + //add a little extra velocity, just for this frame--minimum between gravity and jumpheight + if (which_ai.GetJumpHeight() < sv_gravity->value*FRAMETIME) + { + frameboost = which_ai.GetJumpHeight(); + } + else + { + frameboost = sv_gravity->value*FRAMETIME; + } + + vertical_vel = jumpvec[2]; + jumpvec[2] = 0; + + attempted_speed = VectorLength(jumpvec); + jump_time=((vertical_vel)/(sv_gravity->value*FRAMETIME))*2.0; + + //cap horizontal velocity so i don't jump farther than i'm supposed to + if (jump_time * attempted_speed > which_ai.GetJumpDistance()) + { + VectorNormalize(jumpvec); + VectorScale(jumpvec, which_ai.GetJumpDistance() / jump_time, jumpvec); + attempted_speed=which_ai.GetJumpDistance() / jump_time; + } + + VectorCopy(jumpvec, monster.velocity); + + //fixme: don't have to jump this high; also, store value as jump velocity + monster.velocity[2]=vertical_vel;//fixme? May be Possible to go higher than jumpheight, i don't think so tho + + monster.groundentity = NULL; + + //store away when i expect to finish the jump, for vel adjustment + jump_finish_time = level.time + (jump_time*FRAMETIME); +} + + +qboolean action_c::Move (ai_c &which_ai, edict_t &monster, vec3_t dist)//fixme?: do i want all movement here? + //i'd like to have movement inherited, + // with option for ai to replace it & do special kindsa movement + //this is an abbreviated version of what q2 monsters go thru when they move (no fly or swim) + + //option to not relink was removed--add it in again, for mvmt tests? +{ + float move_length; + vec3_t oldorg, neworg, end; + trace_t trace; + float stepsize; + vec3_t test; + int contents; + trace_t dbtrace; + +// try the move + VectorCopy (monster.s.origin, oldorg); + VectorAdd (monster.s.origin, dist, neworg); + + + //hmmm...i don't especially like this, but to make ai stuff useful for non-humanoids it may have to stay. :(= + if ( monster.movetype != MOVETYPE_STEP ) + { + int i; + + move_length = VectorLengthSquared(dist); + //if not really moving, just touch triggers and call it a successful move + if (move_length<=0.01) + { +// G_TouchTriggers (&monster); + return true; + } + // try one move with vertical motion, then one without + for (i=0 ; i<2 ; i++) + { + VectorAdd (monster.s.origin, dist, neworg); + if (i == 1) + { + neworg[2] = monster.s.origin[2]; + } + + if (monster.movetype == MOVETYPE_NOCLIP) + { + gi.trace (monster.s.origin, monster.mins, monster.maxs, neworg, &monster, 0, &trace); + } + else + { + gi.trace (monster.s.origin, monster.mins, monster.maxs, neworg, &monster, MASK_MONSTERSOLID, &trace); + } + + // fly monsters don't enter water voluntarily + if (monster.flags & FL_FLY) + { + if (!monster.waterlevel) + { + test[0] = trace.endpos[0]; + test[1] = trace.endpos[1]; + test[2] = trace.endpos[2] + monster.mins[2] + 1; + contents = gi.pointcontents(test); + if (contents & MASK_WATER) + return false; + } + } + + // swim monsters don't exit water voluntarily + if (monster.flags & FL_SWIM) + { + if (monster.waterlevel < 2) + { + test[0] = trace.endpos[0]; + test[1] = trace.endpos[1]; + test[2] = trace.endpos[2] + monster.mins[2] + 1; + contents = gi.pointcontents(test); + if (!(contents & MASK_WATER)) + return false; + } + } + + if (trace.fraction == 1) + { + //FIXME!!!!!!!!!!!!!!! if physics weren't broken, wouldn't need this! + // { // actually covered some distance + //test only--did last trace take me into a solid?!!!!!!!!! + if (monster.movetype != MOVETYPE_NOCLIP) + { + gi.trace (trace.endpos, monster.mins, monster.maxs, trace.endpos, &monster, MASK_MONSTERSOLID, &dbtrace); + if (dbtrace.startsolid || dbtrace.allsolid) + { + return false; + } + } + // } + VectorCopy (trace.endpos, monster.s.origin); + gi.linkentity (&monster); +// G_TouchTriggers (&monster); + return true; + } + } + + return false; + } + + + //don't allow movement if caught in midair + if (!monster.groundentity) + { + return false; + } + + //sliding, don't move. + if (VectorLengthSquared(monster.velocity)>100) + { + return false; + } + + move_length = VectorLengthSquared(dist); + //if not really moving, just touch triggers and call it a successful move + if (move_length<=0.01) + { +// G_TouchTriggers (&monster); + return true; + } + +// push down from a step height above the wished position + if (move_mask & step_movemask) + { + stepsize = which_ai.GetStepHeight(); + } + else + { + stepsize = 2;//turning off stepping not recommended (will jerk around on small irregularities in floor), + //but you can if you want. + } + + neworg[2] += stepsize; + VectorCopy (neworg, end); + end[2] -= stepsize*2; + + gi.trace (neworg, monster.mins, monster.maxs, end, &monster, MASK_MONSTERSOLID, &trace); + + //if the trace started intersecting w/ solid, there's no headroom to step up--try to just step over & down + if (trace.allsolid||trace.startsolid) + { + neworg[2] -= stepsize*0.5; + gi.trace (neworg, monster.mins, monster.maxs, end, &monster, MASK_MONSTERSOLID, &trace); + if (trace.allsolid || trace.startsolid)//this intersects w/ solid too, forget it + { + neworg[2] -= stepsize*0.5; + gi.trace (neworg, monster.mins, monster.maxs, end, &monster, MASK_MONSTERSOLID, &trace); + if (trace.allsolid || trace.startsolid)//this intersects w/ solid too, forget it + { +// gi.dprintf("monster %s cannot move--in solid!\n",monster.targetname); + return false; + } + } + } + + + // don't go in to water + if (monster.waterlevel == 0) + { + test[0] = trace.endpos[0]; + test[1] = trace.endpos[1]; + test[2] = trace.endpos[2] + monster.mins[2] + 1; + contents = gi.pointcontents(test); + + //fixme: this shouldn't be hardcoded to avoid h2o, some monsters shouldn't mind + if (contents & MASK_WATER) + { + return false; + } + } + +//commented out, because i want the option to fall (using act_checkbottom) in all cases-- +//this move rejection ignores possibility of being able to fall further than stepheight, +//even if it is a quick trivial rejection; could restore this, with a check for fall_movemask? +/* if (trace.fraction == 1) + { + // if monster had the ground pulled out, go ahead and fall + if ( monster.flags & FL_PARTIALGROUND ) + { + VectorAdd (monster.s.origin, move, monster.s.origin); + gi.linkentity (&monster); + G_TouchTriggers (&monster); + monster.groundentity = NULL; + return true; + } + + return false; // walked off an edge + } +*/ + +//DANGER!! ACHTUNG!!! just because i uncommented this doesn't mean it's guaranteed to work fine! + //FIXME!!!!!!!!!!!!!!! if physics weren't broken, wouldn't need this! +// { // actually covered some distance + //test only--did last trace take me into a solid?!!!!!!!!! + gi.trace (trace.endpos, monster.mins, monster.maxs, trace.endpos, &monster, MASK_MONSTERSOLID, &dbtrace); + if (dbtrace.startsolid || dbtrace.allsolid) + { +// VectorScale(trace.endpos,9,trace.endpos); +// VectorAdd(trace.endpos,neworg,trace.endpos); +// VectorScale(trace.endpos,0.1,trace.endpos); + + //AAAAAAAAHHHHH!!! FIXME!!!! +// gi.trace (trace.endpos, monster.mins, monster.maxs, trace.endpos, &monster, MASK_MONSTERSOLID, &dbtrace); +// if (dbtrace.startsolid || dbtrace.allsolid) +// { +//#if _DEBUG +// gi.dprintf("qphysics ERROR!--moved into solid!\n"); +//#endif + return false; +// } + } +// } + + //if i landed on somebody, don't do the move! + if (trace.ent && trace.ent != monster.groundentity && (trace.ent->client || trace.ent->ai) + && !(trace.ent->deadflag & DEAD_DEAD)//ok to walk on corpses(!?!) + && !(move_mask & fall_movemask)//ok to fall on guys + && trace.endpos[2]>trace.ent->s.origin[2]+trace.ent->maxs[2]+monster.mins[2]-1) + { + return false; + } + + //move successful, unless i walked off an edge + VectorCopy (trace.endpos, monster.s.origin); + + // check point traces down for dangling corners + //checkbottom checks stepheight or fallheight beneath new position + //(depending on move_mask); if there is room to land, the move is ok + if (!gmonster.CheckBottom (which_ai, &monster, monster.s.origin, move_mask)) + { + if (move_mask&fall_movemask) + { + vec3_t newtestpos; + VectorCopy(monster.s.origin, newtestpos); + newtestpos[2]-=20; + gi.trace (monster.s.origin, monster.mins, monster.maxs, newtestpos, &monster, MASK_MONSTERSOLID, &dbtrace); + if (!dbtrace.startsolid && !dbtrace.allsolid && dbtrace.fraction>0.8) + { + monster.flags &= ~FL_PARTIALGROUND; + return false; + } + monster.flags |= FL_PARTIALGROUND; + return false; + } + + if ( monster.flags & FL_PARTIALGROUND ) + { // entity had floor mostly pulled out from underneath it + // and is trying to correct + gi.linkentity (&monster); +// G_TouchTriggers (&monster); + return true; + } + if (gmonster.CheckBottom (which_ai, &monster, oldorg, move_mask)) + { + VectorCopy (oldorg, monster.s.origin); + return false; + } + else + { + gi.linkentity (&monster); +// G_TouchTriggers (&monster); + return true; + } + } + + //since move was successful, ground not being pulled out from under me + if ( monster.flags & FL_PARTIALGROUND ) + { + monster.flags &= ~FL_PARTIALGROUND; + } + monster.groundentity = trace.ent; + monster.groundentity_linkcount = trace.ent->linkcount; + +// the move is ok + gi.linkentity (&monster); +// G_TouchTriggers (&monster); + + return true; +} + + + + + + + + + +#define MAX_PLAYERSPEED 225 +#define SPEED_DODGE_EFFECT .6 +#define DUCK_DODGE_EFFECT .3 +#define JUMP_DODGE_EFFECT .4 + +#define MISSBY 48 + +#define DODGE_UNKNOWN 0 +#define DODGE_DOWN 1 +#define DODGE_UP 2 +#define DODGE_LEFT 3 +#define DODGE_RIGHT 4 + +void CalcPlayerAim(vec3_t ang, ai_c &which_ai, edict_t &monster, edict_t &target) +{ + float chance; + vec3_t dif, dir; + float dist; + float distMod; + float aimCone; + float playerHitValue = 1.0; + vec3_t targMoveDir; + float targSpeed; + int missDirection = DODGE_UNKNOWN; + float strafeValue; + float angAdd; + float missAng; + float awakeTimeValue; + + VectorSubtract(target.s.origin, monster.s.origin, dif); + + if(target.client->ps.pmove.pm_flags & PMF_DUCKED) + { //aim lower for ducking folk + dif[2] -= 20;//? + } + + dist = VectorNormalize(dif); + AngleVectors(monster.s.angles, dir, 0, 0); + + awakeTimeValue = level.time - which_ai.getFirstTargetTime() - (which_ai.GetMySkills()->getHesitation()*game.playerSkills.getHesitation()); + + // calculate the effect of distance on the aiming + if(dist < 64) + { // closer than this, and accuracy starts getting REALLY good + chance = 1.0; + } + else + { + if(dist < 512) + { + distMod = 1.0; + } + else + { // steep curve fall off + distMod = 512 / dist; + distMod *= distMod; + } + + // calculate the effect of player dodging on the shooting + playerHitValue = 1.0; + if(target.client->ps.pmove.pm_flags & PMF_DUCKED) + { + playerHitValue *= 1.0 - DUCK_DODGE_EFFECT; + missDirection = DODGE_DOWN; + } + if(!(target.client->ps.pmove.pm_flags & PMF_ON_GROUND)) + { + playerHitValue *= 1.0 - JUMP_DODGE_EFFECT; + missDirection = DODGE_UP; + } + + //conventional maximum speed is 300, it would appear + VectorCopy(target.velocity, targMoveDir); + targSpeed = VectorNormalize(targMoveDir); + //basically, moving perpendicular to someone targetting you at high speeds is a dodge + //moving towards or away doesn't help at all + strafeValue = 1.0 - fabs(DotProduct(targMoveDir, dir)); + playerHitValue *= 1.0 - (targSpeed/MAX_PLAYERSPEED)*SPEED_DODGE_EFFECT*strafeValue; + if(strafeValue * (targSpeed/MAX_PLAYERSPEED) > .1) + { // enough strafing that we should base our misfires off of it + vec3_t fakeSide; + //not a proper rotation, but good enough for now + fakeSide[0] = dif[1]; + fakeSide[1] = -dif[0]; + fakeSide[2] = dif[2]; + + if(DotProduct(fakeSide, targMoveDir) > 0) + { + missDirection = DODGE_LEFT; + } + else + { + missDirection = DODGE_RIGHT;//? + } + } + + chance = which_ai.GetMySkills()->getAccuracy() * DotProduct(dif, dir) * distMod * + game.playerSkills.getAccuracy() * playerHitValue; + } + + if(awakeTimeValue < which_ai.GetMySkills()->getAimTime()*game.playerSkills.getHesitation()) + { + float extraChance; + extraChance = awakeTimeValue / (which_ai.GetMySkills()->getAimTime()*game.playerSkills.getHesitation());//not ready, I say + if(extraChance < 0) + { + extraChance = 0; + } + if(extraChance > 1.0) + { + extraChance = 1.0; + } + chance *= extraChance; + } + + if(dist >= 64 && dist < 128) + {//secondary close range + chance = chance * ((dist - 64.0)/64.0) + (1.0 - ((dist - 64.0)/64.0)); + } + + vectoangles(dif, ang); + + angAdd = atan2(MISSBY, dist) * 180/M_PI; + + ang[YAW] += gi.flrand(-3, 3); + ang[PITCH] += gi.flrand(-3, 3); + + if(gi.flrand(0,1) > chance) + { // missed + switch(missDirection) + { + case DODGE_UNKNOWN: + missAng = gi.flrand(0, 3.14); + ang[YAW] += cos(missAng) * angAdd * 1.0; + ang[PITCH] -= sin(missAng) * angAdd * .5; + break; + case DODGE_UP: + ang[PITCH] += angAdd; + ang[YAW] += gi.flrand(-10, 10); + break; + case DODGE_DOWN: + ang[PITCH] -= angAdd; + ang[YAW] += gi.flrand(-10, 10); + break; + case DODGE_LEFT: + ang[YAW] += angAdd;//? I don't know what left and right mean here =/ I"ll just make 'em work, yeah. + ang[PITCH] += gi.flrand(-10, 10); + break; + case DODGE_RIGHT: + ang[YAW] -= angAdd; + ang[PITCH] += gi.flrand(-10, 10); + break; + } + } + else + { + ang[PITCH] += gi.flrand(angAdd * -.3, angAdd * .3); + ang[YAW] += gi.flrand(angAdd * -.3, angAdd * .3); + } + + //keep it in range + if (which_ai.GetBody()&&which_ai.GetBody()->GetMove()) + { + aimCone = which_ai.GetAimConeDegrees(monster, which_ai.GetBody()->GetMove()->bbox); + } + else + { + aimCone = 1.0; + } + while(ang[YAW] - monster.s.angles[YAW] > 180)ang[YAW] -= 360; + while(ang[YAW] - monster.s.angles[YAW] < -180)ang[YAW] += 360; + if(ang[YAW] - monster.s.angles[YAW] > aimCone)ang[YAW] = monster.s.angles[YAW] + aimCone; + if(ang[YAW] - monster.s.angles[YAW] < -aimCone)ang[YAW] = monster.s.angles[YAW] - aimCone; +} + +#define AIM_DEVIATION_PITCHMOD 0.5 + +#define AIM_DEVIATION_INITIAL 0.75 +#define AIM_DEVIATION_FINALSHAKE 0.25 + +#define AIMDIST_MIN 92 + +void getDistDeviate(vec3_t org1, vec3_t org2, int isPlayer, float *scale, float *distDeviate, CAISkills &skills) +{ + vec3_t dif; + VectorSubtract(org2, org1, dif); + float dist = VectorLength(dif); + + if(isPlayer) + { // turn faster the closer a player is + if(dist < AIMDIST_MIN) + { + *scale = 2.0; + } + else if(dist > 512 * game.playerSkills.getAimMaxDist()) + { + *scale = 1.0; + } + else + { // the internal value runs from 0 up close to 1 far away + *scale = 2.0 - (dist - AIMDIST_MIN)/((512 * game.playerSkills.getAimMaxDist()) - AIMDIST_MIN); + } + } + else + { // turn faster the closer the guy is - more severe than for regular player turning + if(dist < AIMDIST_MIN) + { + *scale = 10.0; + } + else if(dist > 512 * game.playerSkills.getAimMaxDist()) + { + *scale = 1.0; + } + else + { // the internal value runs from 0 up close to 1 far away + *scale = 10.0 - (dist - AIMDIST_MIN)/((512 * game.playerSkills.getAimMaxDist()) - AIMDIST_MIN) * 10.0; + } + } + + if(dist > 512 * game.playerSkills.getAimMaxDist()) + { + *distDeviate += (dist - (512 * game.playerSkills.getAimMaxDist()))/256.0; + } + else if(dist < AIMDIST_MIN) + { + *distDeviate = (dist / AIMDIST_MIN)*(dist / AIMDIST_MIN); + } + + if(!isPlayer) + { //more likely to hit non-players + *distDeviate *= .4; + } +} + +void action_c::Aim(ai_c &which_ai, edict_t &monster) +{ + //if i'm just standing around with nothing to do, don't bother aiming + if (!which_ai.HasHadTarget()) + { + which_ai.SetAimAngles(monster.s.angles); + return; + } + + assert((!which_ai.HasTarget())||(!which_ai.getTarget())||(which_ai.getTarget()->inuse < 10)); + edict_t *ed = which_ai.getTarget(); + if(which_ai.HasTarget() && ed && ed->client) + { // players are a bit of a special case + vec3_t aimAngs; + + CalcPlayerAim(aimAngs, which_ai, monster, *which_ai.getTarget()); + + which_ai.SetAimAngles(aimAngs); + return; + } + + float ideal; + float current; + float move; + vec3_t my_aim; + vec3_t my_targ_pos; + + float tempAng; + float aimCone; + float aimDeviation; + + //adjust for distance to target + + float distScale = 1.0; + float distDeviate = 1.0; + + which_ai.getTargetPos(my_targ_pos); + + if(which_ai.getTarget()) + { + getDistDeviate(my_targ_pos, monster.s.origin, (which_ai.getTarget()->client != 0), &distScale, &distDeviate, *(which_ai.GetMySkills())); + } + + which_ai.GetAimAngles(my_aim); + + //yaw aim first + + if (which_ai.GetBody()&&which_ai.GetBody()->GetMove()) + { + aimCone = which_ai.GetAimConeDegrees(monster, which_ai.GetBody()->GetMove()->bbox); + } + else + { + aimCone = 1.0; + } + aimDeviation = which_ai.GetAimDeviationDegrees(monster) * distDeviate * (1.0 - which_ai.GetMySkills()->getAccuracy()) * game.playerSkills.getAccuracy(); + tempAng = anglemod(which_ai.ideal_angles[YAW]-monster.s.angles[YAW]); + + //if i'm scripted to do this, do it right! + if (owner_decision && ((owner_decision->GetClassCode() == SCRIPTED_DECISION) || (owner_decision->GetClassCode() == PATHCOMBAT_DECISION) + || (owner_decision->GetClassCode() == PATHIDLE_DECISION))) + { + VectorCopy(which_ai.ideal_angles, my_aim); + aimDeviation = 0; + } + + current = my_aim[YAW]; + + //make sure roll is cleared out + my_aim[ROLL]=0; + + + //i'm inside the aim cone...use ideal_angles for aiming + if (tempAng < aimCone || tempAng > 360.0-aimCone) + { + ideal = anglemod(which_ai.ideal_angles[YAW]+gi.flrand(-1.0,1.0)*aimDeviation*AIM_DEVIATION_INITIAL); + } + //i'm outside the cone--use the edge of the cone + else if (tempAng < 180.0) + { + ideal = anglemod(monster.s.angles[YAW]+aimCone+gi.flrand(-1.0,1.0)*aimDeviation*AIM_DEVIATION_INITIAL); + } + //outside on the other side + else + { + ideal = anglemod(monster.s.angles[YAW]-aimCone+gi.flrand(-1.0,1.0)*aimDeviation*AIM_DEVIATION_INITIAL); + } + + + move = ideal - current; + + //make sure we take shortest route to desired yaw + if (ideal > current) + { + if (move >= 180) + { + move = move - 360; + } + } + else + { + if (move <= -180) + { + move = move + 360; + } + } + + float moveScale = distScale; + + //only make the aim adjustment if there's a significant difference between ideal & + if (move < 30 && move > -30) + { + moveScale *= 0.125; + } + else if (move < 60 && move > -60) + { + moveScale *= 0.25; + } + + if(moveScale < 1.0) + { + move *= moveScale; + } + + + + aimDeviation *= .4;//up and down should be a bit more accurate than left and right - just looks better + + //adjust aiming yaw + my_aim[YAW] = anglemod (current + move + gi.flrand(-1.0,1.0)*aimDeviation*AIM_DEVIATION_FINALSHAKE); + + //now pitch aim--don't bother with the cone here + + current = my_aim[PITCH]; + ideal = anglemod(which_ai.ideal_angles[PITCH]+gi.flrand(-1.0,1.0)*aimDeviation*AIM_DEVIATION_INITIAL*AIM_DEVIATION_PITCHMOD); + + move = ideal - current; + + //make sure we take shortest route to desired yaw + if (ideal > current) + { + if (move >= 180) + { + move = move - 360; + } + } + else + { + if (move <= -180) + { + move = move + 360; + } + } + + moveScale = distScale; + + //only make the aim adjustment if there's a significant difference between ideal & + if (move < 15 && move > -15) + { + moveScale *= 0.125; + } + else if (move < 30 && move > -30) + { + moveScale *= 0.25; + } + + if(moveScale < 1.0) + { + move *= moveScale; + } + + //adjust aiming pitch + my_aim[PITCH] = anglemod (current + move + gi.flrand(-1.0,1.0)*aimDeviation*AIM_DEVIATION_FINALSHAKE*AIM_DEVIATION_PITCHMOD); + + which_ai.SetAimAngles(my_aim); +} + +qboolean action_c::Turn(ai_c &which_ai, edict_t &monster, turninfo_s &turninfo) +{ + float ideal; + float current; + float move; + + if (which_ai.IsConcentratingOnPlayer()&&monster.health>0) + { + if (level.sight_client) + { + vec3_t toPlayer; + VectorSubtract(level.sight_client->s.origin, monster.s.origin, toPlayer); + toPlayer[2]=0; + VectorNormalize(toPlayer); + vectoangles(toPlayer, monster.s.angles); + return true; + } + } + + current = anglemod(monster.s.angles[YAW]); + +// if monster's anim is flagged as a backwards, left or right scripted action, add to the ideal_angles! + if (owner_decision && ((owner_decision->GetClassCode() == SCRIPTED_DECISION) || (owner_decision->GetClassCode() == PATHCOMBAT_DECISION) + || (owner_decision->GetClassCode() == PATHIDLE_DECISION))) + { + if (anim->actionFlags & ACTFLAG_BACKUP) + { + ideal = anglemod(which_ai.ideal_angles[YAW] + 180); + } + else if (anim->actionFlags & ACTFLAG_LEFTSTRAFE) + { + ideal = anglemod(which_ai.ideal_angles[YAW] + 90); + } + else if (anim->actionFlags & ACTFLAG_RIGHTSTRAFE) + { + ideal = anglemod(which_ai.ideal_angles[YAW] - 90); + } + else + { + ideal = anglemod(which_ai.ideal_angles[YAW]); + } + } + else + { + ideal = anglemod(which_ai.ideal_angles[YAW]); + } + + //already facing ideal direction; consider turn successful + if (current == ideal &&(turninfo.max_turn >= 0 && turninfo.min_turn <= 0)) + { + Aim(which_ai, monster); + return true; + } + + move = ideal - current; + + //make sure we take shortest route to desired yaw + if (ideal > current) + { + if (move >= 180) + { + move = move - 360; + } + } + else + { + if (move <= -180) + { + move = move + 360; + } + } + + //cap turning speed to yawspeed +// if (move > 0) +// { +// if (move > turninfo.max_turn) +// { +// move = turninfo.max_turn; +// } +// } +// else +// { +// if (move < turninfo.min_turn) +// { +// move = turninfo.min_turn; +// } +// } + + if (move > turninfo.max_turn) + { + if (ai_pathtest->value && monster.health<=0)//debug breakpoint + { + gi.dprintf("dead monster forcing turn at %3.3f degrees.\n", turninfo.max_turn); + } + move = turninfo.max_turn; + } + else if (move < turninfo.min_turn) + { + if (ai_pathtest->value && monster.health<=0)//debug breakpoint + { + gi.dprintf("dead monster forcing turn at %3.3f degrees.\n", turninfo.min_turn); + } + move = turninfo.min_turn; + } + + monster.s.angles[YAW] = anglemod (current + move); + + Aim(which_ai, monster); + + return true; +} + +//EvaluateMovement no longer checks if we've reached goal position, just checks if we've been blocked +qboolean action_c::EvaluateMovement(ai_c &which_ai, edict_t &monster, vec3_t distance) +{ + vec3_t vel_adjust,dir_to_dest,dist_dir; + VectorScale(which_ai.velocity, 0.9, which_ai.velocity); + + VectorCopy(distance, dist_dir); + VectorNormalize(dist_dir); + VectorSubtract(dest, monster.s.origin, dir_to_dest); + VectorNormalize(dir_to_dest); + + //going exactly the wrong way. hmp. + if (DotProduct(dist_dir, dir_to_dest)<0) + { +// return false; +// VectorScale(distance,-1.0,distance); + } + + //move forward the amount current frame specifies + if (!Move (which_ai, monster, distance))//blocked--finish unsuccessful + { + //i'm stopped, dammit + VectorClear(which_ai.velocity); + return false; + } + + //make sure i know if i'm stopped on purpose + if (VectorLengthSquared(distance)<=1) + { + VectorClear(which_ai.velocity); + } + else + { + VectorScale(distance, 0.1, vel_adjust); + VectorAdd(which_ai.velocity, vel_adjust, which_ai.velocity); + } + + return true;//still walking--let ai know i'm not done yet +} + +void action_c::BeginAction(ai_c &which_ai, edict_t &monster) +{ + if (!abortAction) + { + if (which_ai.GetBody()) + { + if (which_ai.GetBody()->IsAnimationFinished() && anim && !(anim->actionFlags&ACTFLAG_LOOPANIM)) + { + ForceAnimation(which_ai, monster); + } + else + { + SetAnimation(which_ai, monster); + } + } + start_time = level.time; + timeout_time = start_time + timeout_interval; + } +} + +void action_c::SetSignalEventState (qboolean done) +{ + if (SignalEvent) + { + SignalEvent->SetEventState(done); + } + return; +} + +action_c::action_c(action_c *orig) +{ + *(int *)&anim = GetMmoveNum(orig->anim); + + VectorCopy(orig->face, face); + VectorCopy(orig->dest, dest); + + faceUpdatedTime = orig->faceUpdatedTime; + interrupted = orig->interrupted; + abortAction = orig->abortAction; + + owner_decision.MakeIndex(orig->owner_decision); + owner_action.MakeIndex(orig->owner_action); + + velScale = orig->velScale; + default_turn = orig->default_turn; + move_mask = orig->move_mask; + start_time = orig->start_time; + timeout_interval = orig->timeout_interval; + timeout_time = orig->timeout_time; + + VectorCopy(orig->jump_intent, jump_intent); + + jump_finish_time = orig->jump_finish_time; + waitForAnim = orig->waitForAnim; + *(int *)&SignalEvent= GetEventNum(orig->SignalEvent); + isLethal = orig->isLethal; + NullTarget = orig->NullTarget; + + *(int *)&action_target = GetEdictNum(orig->action_target); +} + +void action_c::Evaluate(action_c *orig) +{ + anim = GetMmovePtr((int)orig->anim); + + VectorCopy(orig->face, face); + VectorCopy(orig->dest, dest); + + faceUpdatedTime = orig->faceUpdatedTime; + interrupted = orig->interrupted; + abortAction = orig->abortAction; + + owner_decision.MakePtr(*(int *)&orig->owner_decision); + owner_action.MakePtr(*(int *)&orig->owner_action); + + velScale = orig->velScale; + default_turn = orig->default_turn; + move_mask = orig->move_mask; + start_time = orig->start_time; + timeout_interval = orig->timeout_interval; + timeout_time = orig->timeout_time; + + VectorCopy(orig->jump_intent, jump_intent); + + jump_finish_time = orig->jump_finish_time; + waitForAnim = orig->waitForAnim; + SignalEvent = GetEventPtr((int)orig->SignalEvent); + isLethal = orig->isLethal; + NullTarget = orig->NullTarget; + + action_target = GetEdictPtr((int)orig->action_target); +} + +/********************************************************************************** + **********************************************************************************/ + +move_action::move_action(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing, float timeout, qboolean fullAnimation) +:action_c(od, oa, newanim, destination, facing, NULL, timeout,fullAnimation) +{ + VectorCopy(destination, dest); +} + +void move_action::Init(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing, float timeout, qboolean fullAnimation) +{ + action_c::Init(od, oa, newanim, destination, facing, NULL, timeout,fullAnimation); + VectorCopy(destination, dest); +} + +qboolean move_action::Think(ai_c &which_ai, edict_t &monster) +{ + vec3_t mydist; + qboolean moveSuccess; + + //stack of actions has been toppled--abort! abort! + //the only place abortAction is currently set true is when an owned action returns false-- + //and the only time actions can now own each other is when scripting decisions stack them up + if (!PerformBodilyFunctions(which_ai, monster, mydist)) + { + ResolveAction(which_ai, monster, 0.0, 0.0); + return true; + } + + //fixme: z move should be ok! + mydist[2]=0; + + bool bTest1 = !!(moveSuccess=EvaluateMovement(which_ai, monster, mydist)), + bTest2 = !!waitForAnim, + bTest3 = !!which_ai.GetBody(), + bTest4 = !!(bTest3?which_ai.GetBody()->IsAnimationFinished():false), + bTest5 = !!(bTest3?which_ai.GetBody()->IsAnimationHeld(HOLDCODE_NO):false), + bTest6 = (level.time > timeout_time), + bTest7 = !!(anim->actionFlags & ACTFLAG_FULLANIM); + + // kef 10/12/99 -- here's the old way. it would stop an anim as soon as it finished its first + //cycle even if the anim was supposed to be held for a long period of time + //(e.g. "holding for 30 seconds" in a script wouldn't work) +// if( (!bTest1 || (bTest2 && bTest3 && (bTest4 || bTest5 || bTest6)) || (!bTest2 && bTest6)) && +// (!bTest7 || bTest4) ) + if( (!bTest1 || (bTest2 && bTest4 && (bTest5 || bTest6)) || (!bTest2 && bTest6)) && + (!bTest7 || bTest4) ) + {//movement failed, or action timed out--abort. + ResolveAction(which_ai, monster, 0.0, 0.0); + return true; + } + //movement successful + else + { + float dist_to_goal_sq;//only in xy here + + //check to see if i'm close enough (only checking xy) to stop action + dist_to_goal_sq=(monster.s.origin[0]-dest[0])*(monster.s.origin[0]-dest[0])+ + (monster.s.origin[1]-dest[1])*(monster.s.origin[1]-dest[1]); + + if ((!waitForAnim && dist_to_goal_sq <= (VectorLengthSquared(mydist)+1)*9) + &&(!((anim->actionFlags & ACTFLAG_FULLANIM)&&(!which_ai.GetBody()->IsAnimationFinished()))))//fixme: should do a more accurate check, + //calculating my turning radius, and checking off of that so i don't circle a point + {//reached destination--return successful + ResolveAction(which_ai, monster, 1.0, 1.0); + return true; + } + + //still going--let ai know to not get rid of me + return false; + } +} + +move_action::move_action(move_action *orig) +: action_c(orig) +{ +} + +void move_action::Evaluate(move_action *orig) +{ + action_c::Evaluate(orig); +} + +/********************************************************************************** + **********************************************************************************/ +pain_action::pain_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *other, float kick, int damage, float timeout, qboolean fullAnimation): +action_c(od,oa,newanim,monster.s.origin,vec3_origin,NULL,timeout,fullAnimation){} + +void pain_action::BeginAction(ai_c &which_ai, edict_t &monster) +{ + monster.s.sound = 0; + monster.s.sound_data = 0; + + start_time = level.time; + timeout_time = start_time + timeout_interval; + + //don't start over if i've been interrupted... + if (!interrupted) + { + ForceAnimation(which_ai, monster); + } +} + +void pain_action::SetTurnDestination(ai_c &which_ai, edict_t &monster) +{ + VectorCopy(monster.s.angles, which_ai.ideal_angles); +} + +qboolean pain_action::Think(ai_c &which_ai, edict_t &monster) +{ + vec3_t mydist; + + //allow aborting of pain action, so pain can be stacked in scripted events. + if (!PerformBodilyFunctions(which_ai, monster, mydist)) + { + //let owners know i'm finished + ResolveAction(which_ai, monster, 0.0, 0.0); + return true; + } + + EvaluateMovement(which_ai, monster, mydist); + + if ((waitForAnim && which_ai.GetBody() && !which_ai.GetBody()->IsAnimationFinished() + && !which_ai.GetBody()->IsAnimationHeld(HOLDCODE_NO) && (level.time < timeout_time)) + || (!waitForAnim && (level.time < timeout_time))) + { + return false; + } + //let owners know i'm finished + //abort previous action, tell decision that an action failed + ResolveAction(which_ai, monster, 0.0, 0.0); + + return true; + +} + +pain_action::pain_action(pain_action *orig) +: action_c(orig) +{ +} + +void pain_action::Evaluate(pain_action *orig) +{ + action_c::Evaluate(orig); +} + +void pain_action::Read() +{ + char loaded[sizeof(pain_action)]; + + gi.ReadFromSavegame('AIPA', loaded, sizeof(pain_action)); + Evaluate((pain_action *)loaded); +} + +void pain_action::Write() +{ + pain_action *savable; + + savable = new pain_action(this); + gi.AppendToSavegame('AIPA', savable, sizeof(*this)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ +death_action::death_action(decision_c *od, action_c *oa, mmove_t *newanim1, mmove_t *newanim2, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +:action_c(od,oa, newanim1) +{ + if (!newanim1) + { + anim=newanim2; + } + anim2 = newanim2; + time_of_death = level.time; + drip = false; +} + +death_action::death_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +:action_c(od,oa, newanim) +{ + anim2 = NULL; + time_of_death = level.time; + drip = false; +} + +void death_action::InterpretFlags(int cur_flags, ai_c &which_ai, edict_t &monster) +{ + if (cur_flags & FRAMEFLAG_OOZE) + { + vec3_t curVec; + + VectorCopy(monster.s.origin, curVec); + curVec[2] += 10; + + FX_MakeDecalBelow(curVec, FXDECAL_BLOODPOOL, 0); + } + action_c::InterpretFlags(cur_flags&~FRAMEFLAG_OOZE,which_ai,monster); +} + +#define MAX_SEEN_ENEMIES 5 +#define MONSTER_CORPSE_FADE 3.0F + +qboolean death_action::SafeToRemove(edict_t &monster) +{ + int i; + edict_t *client; + vec3_t client_facing, client_to_body; + + // If it's gibbed, then all parts are turned off anyway. + if (monster.gibbed) + { + return true; + } + + // See if already fading + if (monster.s.effects & EF_FADE) + { + if (FXA_CheckFade(&monster)) + { // Remove that sucker + return true; + } + + //I'm in the process of fading--don't bother doing anything else until I'm done disappearing + return false; + } + + //if we are seeing too many guys, corpse is outta here no matter what + if((gmonster.GetSeenEnemyCount() >= ai_maxcorpses->value)&&(!game.cinematicfreeze)&&(!OnSameTeam(&monster, level.sight_client))) + { + if (level.time > time_of_death + 3) + { + if(monster.ghoulInst) + { + FXA_SetFadeOut(&monster, MONSTER_CORPSE_FADE); // Three second fade out time. + + return false;//now we start fading + } + else + { + return true; + } + } + } + else + {//corpse count as seen enemies too + gmonster.AddSeenEnemy(); + } + + //don't consider removing until after a while + if (level.time-time_of_death < 15.0 * ai_maxcorpses->value) + { + return false; + } + //only remove if it won't look screwy to clients + for (i=0 ; iinuse) + { + continue; + } + VectorSubtract(monster.s.origin, client->s.origin, client_to_body); + + //if e's greater than 800 units away, assume he can't see me + if (VectorLengthSquared(client_to_body)>640000) + { + continue; + } + + if (!gi.inPVS(monster.s.origin, monster.s.origin)) + { + continue; + } + AngleVectors(client->s.angles, client_facing, NULL, NULL); + VectorNormalize(client_to_body); + //if client is looking in my general dir, don't remove for sure + if (DotProduct(client_to_body, client_facing)>-.35) // this may seem excessive, but it since bodies are so big, + // we need to allow for some leeway. + { + time_of_death = level.time - 25; + return false; + } + } + + //danger: if time_of_death gets used for anything other than in this func, replace this with something else!!!! + time_of_death = level.time - 25; + return true; +} + +#define MAX_FLOOR_ALIGN_INCREMENT 2.5 + +qboolean death_action::AdjustBBox(ai_c &which_ai, edict_t &monster) +{ + if (which_ai.AttemptSetBBox(monster, anim->bbox, true)) + { + return true; + } + return false; +} + +void death_action::TiltToFloor(ai_c &which_ai, edict_t &monster) +{ + trace_t trace; + vec3_t up, down, forward, ftemp, right, tangles; + float rotateDist; + vec3_t normal, norm_accum, norm_temp, norm_compare; + + //corpse-angling code: now in extra-balky! + VectorCopy(monster.s.origin, norm_compare); + norm_compare[2]+=monster.mins[2]+1; + VectorClear(norm_accum); + + VectorCopy(monster.s.origin, down); + VectorAdd(down, monster.mins, down); + VectorCopy(down, up); + up[2]+=1; + down[2]-=20; + gi.trace(up, vec3_origin, vec3_origin, down, &monster, MASK_DEADSOLID, &trace); + if (trace.allsolid || trace.startsolid) + { + VectorSubtract(up, norm_compare, norm_temp); + } + else + { + VectorSubtract(trace.endpos, norm_compare, norm_temp); + } + VectorScale(norm_temp, -1.0, norm_temp); + norm_temp[2]*=16.0; + VectorNormalize(norm_temp); + VectorAdd(norm_temp, norm_accum, norm_accum); + + down[0]+=monster.maxs[0]-monster.mins[0]; + up[0]+=monster.maxs[0]-monster.mins[0]; + gi.trace(up, vec3_origin, vec3_origin, down, &monster, MASK_DEADSOLID, &trace); + if (trace.allsolid || trace.startsolid) + { + VectorSubtract(up, norm_compare, norm_temp); + } + else + { + VectorSubtract(trace.endpos, norm_compare, norm_temp); + } + VectorScale(norm_temp, -1.0, norm_temp); + norm_temp[2]*=16.0; + VectorNormalize(norm_temp); + VectorAdd(norm_temp, norm_accum, norm_accum); + + down[1]+=monster.maxs[1]-monster.mins[1]; + up[1]+=monster.maxs[1]-monster.mins[1]; + gi.trace(up, vec3_origin, vec3_origin, down, &monster, MASK_DEADSOLID, &trace); + if (trace.allsolid || trace.startsolid) + { + VectorSubtract(up, norm_compare, norm_temp); + } + else + { + VectorSubtract(trace.endpos, norm_compare, norm_temp); + } + VectorScale(norm_temp, -1.0, norm_temp); + norm_temp[2]*=16.0; + VectorNormalize(norm_temp); + VectorAdd(norm_temp, norm_accum, norm_accum); + + down[0]-=monster.maxs[0]-monster.mins[0]; + up[0]-=monster.maxs[0]-monster.mins[0]; + gi.trace(up, vec3_origin, vec3_origin, down, &monster, MASK_DEADSOLID, &trace); + if (trace.allsolid || trace.startsolid) + { + VectorSubtract(up, norm_compare, norm_temp); + } + else + { + VectorSubtract(trace.endpos, norm_compare, norm_temp); + } + VectorScale(norm_temp, -1.0, norm_temp); + norm_temp[2]*=16.0; + VectorNormalize(norm_temp); + VectorAdd(norm_temp, norm_accum, norm_accum); + + VectorNormalize(norm_accum); + VectorCopy(norm_accum, normal); + +// if (trace.fraction < 1.0) +// { +// VectorCopy(trace.plane.normal, normal); + //get current orientation + AngleVectors(monster.s.angles,forward,right,up); + + //find out how much current orientation deviates from ideal + rotateDist = -DotProduct(forward, normal)*90.0; + if (rotateDist > MAX_FLOOR_ALIGN_INCREMENT) + { + rotateDist = MAX_FLOOR_ALIGN_INCREMENT; + } + else if (rotateDist < -MAX_FLOOR_ALIGN_INCREMENT) + { + rotateDist = -MAX_FLOOR_ALIGN_INCREMENT; + } + //rotate me to face ideal + VectorCopy(forward, ftemp); + RotatePointAroundVector(forward, right, ftemp, rotateDist); + + //convert to angular form + vectoangles(forward, monster.s.angles); + + //...now do the same for roll... + + //find out how much current orientation deviates from ideal + rotateDist = DotProduct(right, normal)*90.0; + if (rotateDist > MAX_FLOOR_ALIGN_INCREMENT) + { + rotateDist = MAX_FLOOR_ALIGN_INCREMENT; + } + else if (rotateDist < -MAX_FLOOR_ALIGN_INCREMENT) + { + rotateDist = -MAX_FLOOR_ALIGN_INCREMENT; + } + //rotate me to face ideal + VectorCopy(right, ftemp); + RotatePointAroundVector(right, forward, ftemp, rotateDist); + + //convert to angular form + vectoangles(right, tangles); + + //combine pitch & roll calcs + monster.s.angles[ROLL] = tangles[PITCH]; +// } + + //quick lil sliding test, to see how easy it would be to put slidy corpses in...looks good so far... + if (normal[2]>0) + { + normal[2]=0; + if (VectorLengthSquared(normal)>0.0025/*0.05*/) + { + VectorScale(normal, 100, normal); + if (fabs(monster.velocity[0])value*FRAMETIME+10; + } + } + } + else + { +// gi.dprintf("Warning! corpse under ground!\n"); + } +} +/* + BLAH this was started and never finished! +void death_action::AlternateTiltToFloor(ai_c &which_ai, edict_t &monster) +{ + vec3_t forwardTest,middleTest,backTest; + vec3_t forwardGround, middleGround, backGround; + vec3_t forward,right,up,backward; + float halfHeight; + trace_t trace; + + + //set up three start points + halfHeight = monster.mins[2]+monster.maxs[2]; + VectorCopy(monster.s.origin, middleTest); + middleTest[2]+=halfHeight; + AngleVectors(monster.s.angles, forward, right, up); + forward[2]=0; + VectorNormalize(forward); + VectorScale(forward,16,forward); + VectorAdd(forward,middleTest,forwardTest); + VectorScale(forward,-1,backward); + VectorAdd(backward,middleTest,backTest); + + //trace down from three start points + + +} +*/ + +qboolean death_action::Think(ai_c &which_ai, edict_t &monster) +{ //go thru pain anim once, then nothing. + vec3_t mydist; + + AdjustBBox(which_ai, monster); +// TiltToFloor(which_ai, monster); +// AlternateTiltToFloor(which_ai, monster); + if (monster.groundentity) + { + if (which_ai.GetBody()&&which_ai.GetBody()->IsAnimationHeld(HOLDCODE_INAIR)) + { + which_ai.LandFrame(monster); + which_ai.GetBody()->ResumeAnimation(monster); + } + } + InterpretFlags(NextFlags(which_ai, monster), which_ai, monster); + + // handle rotational motion tracks + turninfo_s turninfo; + SetTurnDestination(which_ai, monster); + NextTurn(1.0, which_ai, monster, turninfo); + Turn (which_ai, monster, turninfo); + NextMovement(which_ai, monster, mydist); + + //special case--if + if (which_ai.GetBody() && which_ai.GetBody()->IsAnimationFinished())//animation done--drip + { + VectorClear(mydist); + if (!drip) + { + which_ai.GetBody()->Drip(monster); + drip = true; + } + } + + EvaluateMovement(which_ai, monster, mydist); +/* + if(((level.time - which_ai.GetBody()->GetLastKilledTime()) > .5) && (which_ai.GetBody()->GetMove() == &generic_move_death_dance)) + { + anim=anim2; + SetAnimation(which_ai, monster); + } +*/ + if (which_ai.GetBody()) + { + anim=which_ai.GetBody()->GetSequenceForDeath(monster, &monster, &monster, 0, monster.s.origin, which_ai.GetBody()->GetLastDFlags()|DAMAGE_NO_PROTECTION); + if (anim && anim->suggested_action != ACTCODE_DEATH) + { + gi.dprintf("Death action %s not really a death!\n", anim->ghoulSeqName); + } + which_ai.GetBody()->UpdateFace(monster); + if (anim) + { + SetAnimation(which_ai, monster); + } + which_ai.GetBody()->SetLastDFlags(0); + } + return false; +} + +void death_action::BeginAction(ai_c &which_ai, edict_t &monster) +{ + monster.s.sound = 0; + monster.s.sound_data = 0; + + if (monster.health > 0) + { + monster.health = -1; + monster.deadflag = DEAD_DEAD; + + monster.solid = SOLID_BBOX; + monster.clipmask = CONTENTS_DEADMONSTER; + monster.svflags |= SVF_DEADMONSTER; + monster.touch = NULL;//do we need this here? + } + + //if i'm running the thrown back animation, and i'm not being thrown back, fall back to generic thrown + if (anim==&generic_move_deaththrown && monster.velocity[2]<10) + { + vec3_t to_dam; + AngleVectors(monster.s.angles, to_dam, NULL, NULL); + VectorScale(to_dam, -200, to_dam); + VectorAdd(monster.velocity, to_dam, monster.velocity); + monster.velocity[2]=100;//people have complained about the height of this at times... + monster.maxs[2]-=26; + monster.s.origin[2]+=26; + } + action_c::BeginAction(which_ai, monster); +} + +death_action::death_action(death_action *orig) +: action_c(orig) +{ + time_of_death = orig->time_of_death; + drip = orig->drip; + *(int *)&anim2 = GetMmoveNum(orig->anim2); +} + +void death_action::Evaluate(death_action *orig) +{ + time_of_death = orig->time_of_death; + drip = orig->drip; + anim2 = GetMmovePtr((int)orig->anim2); + + action_c::Evaluate(orig); +} + +void death_action::Read() +{ + char loaded[sizeof(death_action)]; + + gi.ReadFromSavegame('AIDA', loaded, sizeof(death_action)); + Evaluate((death_action *)loaded); +} + +void death_action::Write() +{ + death_action *savable; + + savable = new death_action(this); + gi.AppendToSavegame('AIDA', savable, sizeof(*this)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ +deathcorpse_action::deathcorpse_action(decision_c *od, action_c *oa, mmove_t *newanim1, mmove_t *newanim2, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +:death_action(od, oa, newanim1, newanim2, monster, inflictor, attacker, damage, point) +{ +} + +deathcorpse_action::deathcorpse_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +:death_action(od, oa, newanim, monster, inflictor, attacker, damage, point) +{ +} + +void deathcorpse_action::BeginAction(ai_c &which_ai, edict_t &monster) +{ +/* + monster.health = -1; + monster.deadflag = DEAD_DEAD; + + monster.solid = SOLID_BBOX; // has to be BBOX or you can't shoot the body :{ + monster.clipmask = CONTENTS_DEADMONSTER; + monster.svflags |= SVF_DEADMONSTER; + monster.touch = NULL;//do we need this here? + + // need to play the last frame of a given death animation + if (monster.ghoulInst) + { + monster.ghoulInst->Play(which_ai.GetBody()->GetSequence(monster, &generic_move_death_fallforward), + level.time, + 1.5, // how far into the anim to start. I'm pretty much guessing here. + true, // yes, restart + IGhoulInst::EndCondition::Hold, + false, // no, don't match current position + false // no, dont' reverse the anim + ); + } + + anim = &generic_move_death_fallforward; + //action_c::BeginAction(which_ai, monster); +*/ +} + +deathcorpse_action::deathcorpse_action(deathcorpse_action *orig) +:death_action(orig) +{ +} + +void deathcorpse_action::Evaluate(deathcorpse_action *orig) +{ + time_of_death = orig->time_of_death; + drip = orig->drip; + anim2 = GetMmovePtr((int)orig->anim2); + + action_c::Evaluate(orig); +} + +void deathcorpse_action::Read() +{ + char loaded[sizeof(deathcorpse_action)]; + + gi.ReadFromSavegame('AIXA', loaded, sizeof(deathcorpse_action)); + Evaluate((deathcorpse_action *)loaded); +} + +void deathcorpse_action::Write() +{ + deathcorpse_action *savable; + + savable = new deathcorpse_action(this); + gi.AppendToSavegame('AIXA', savable, sizeof(*this)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ +deatharmor_action::deatharmor_action(decision_c *od, action_c *oa, mmove_t *newanim1, mmove_t *newanim2, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +:death_action(od, oa, newanim1, newanim2, monster, inflictor, attacker, damage, point) +{ +} + +deatharmor_action::deatharmor_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +:death_action(od, oa, newanim, monster, inflictor, attacker, damage, point) +{ +} + +qboolean deatharmor_action::SafeToRemove(edict_t &monster) +{ + // our target is the item_equip_armor we spawned over this guy's corpse. if we can't + //find that armor, the player got it so we can ditch this body + edict_t *armor = NULL; + + if (monster.targetname) + { // find the armor pickup in question + do + { + armor = G_Find (armor, FOFS(target), monster.targetname); + } while (armor && strcmp(armor->classname, "item_equip_armor")); + } + if (armor) + { // our armor's still here so don't remove the corpse yet + return false; + } + else + { // our armor's gone so treat us like a regular corpse + return death_action::SafeToRemove(monster); + } +} + +qboolean deatharmor_action::Think(ai_c &which_ai, edict_t &monster) +{ + AdjustBBox(which_ai, monster); + /* + // we don't want this joker's gore animating. he's dead, for heaven's sake. + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + if (myInstance) + { + myInstance->StopAnimatingAtAllBolts(); + } + */ + //hey! i need a face! + if (which_ai.GetBody()) + { + which_ai.GetBody()->UpdateFace(monster); + } + return false; +} + +void deatharmor_action::BeginAction(ai_c &which_ai, edict_t &monster) +{ + monster.health = -1; + monster.deadflag = DEAD_DEAD; + + monster.solid = SOLID_BBOX; // has to be BBOX or you can't shoot the body :{ + monster.clipmask = CONTENTS_DEADMONSTER; + monster.svflags |= SVF_DEADMONSTER; + monster.touch = NULL;//do we need this here? + + // need to play the last frame of a given death animation + if (monster.ghoulInst) + { + monster.ghoulInst->Play(which_ai.GetBody()->GetSequence(monster, &generic_move_death_fallforward), + level.time, + 1.5, // how far into the anim to start. I'm pretty much guessing here. + true, // yes, restart + IGhoulInst::EndCondition::Hold, + false, // no, don't match current position + false // no, dont' reverse the anim + ); + } + + if (which_ai.GetBody()) + { + which_ai.GetBody()->SetVocalCordsWorking(false); + } + + anim = &generic_move_death_fallforward; + //action_c::BeginAction(which_ai, monster); +} + +deatharmor_action::deatharmor_action(deatharmor_action *orig) +:death_action(orig) +{ + time_of_death = orig->time_of_death; + drip = orig->drip; + *(int *)&anim2 = GetMmoveNum(orig->anim2); +} + +void deatharmor_action::Evaluate(deatharmor_action *orig) +{ + time_of_death = orig->time_of_death; + drip = orig->drip; + anim2 = GetMmovePtr((int)orig->anim2); + + action_c::Evaluate(orig); +} + +void deatharmor_action::Read() +{ + char loaded[sizeof(deatharmor_action)]; + + gi.ReadFromSavegame('AIXA', loaded, sizeof(deatharmor_action)); + Evaluate((deatharmor_action *)loaded); +} + +void deatharmor_action::Write() +{ + deatharmor_action *savable; + + savable = new deatharmor_action(this); + gi.AppendToSavegame('AIXA', savable, sizeof(*this)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ + +int attack_action::NextFlags(ai_c &which_ai, edict_t &monster) +{ + int myFlags=action_c::NextFlags(which_ai, monster); + if (anim && (anim->actionFlags & ACTFLAG_OPTATTACK) && which_ai.GetBody() && which_ai.GetBody()->RightHandWeaponReady(monster)) + { + myFlags|=FRAMEFLAG_ATTACK; + } + return myFlags; +} + +attack_action::attack_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t gohere, vec3_t facing, float timeout, qboolean fullAnimation, bool shouldKill, int theNullTarget) +:move_action(od,oa,newanim, gohere,facing,timeout,fullAnimation) +{ + + if (attackTarget) + { + if ((shouldKill == true) && (attackTarget->health > 1)) // kill oughta be initialized, but with the current setup I'm not sure of a convenient way to do it + { + attackTarget->health = 1; + // can we get rid of armor here? + + } + init_health = attackTarget->health; + } + else + { + init_health = 1; + } + action_target = attackTarget; + next_attack_time = level.time; + isLethal = shouldKill; + NullTarget = theNullTarget; +} + +void attack_action::BeginAction(ai_c &which_ai, edict_t &monster) +{ + if (!abortAction) + { + if (anim && anim->actionFlags&ACTFLAG_LOOPANIM) + { + SetAnimation(which_ai, monster); + } + else + { + ForceAnimation(which_ai, monster); + } + move_action::BeginAction(which_ai,monster); + } +} + +qboolean attack_action::Think(ai_c &which_ai, edict_t &monster) +{ +// vec3_t v; + vec3_t mydist; + float mypercent; + bool bTest1 = false, bTest2 = false, bTest3 = false, bTest4 = false, + bTest5 = false, bTest6 = false, bTest7 = false, bTest8 = false, + bTest9 = false; + + if (!PerformBodilyFunctions(which_ai, monster, mydist)) + { + //let owners know i'm finished + ResolveAction(which_ai, monster, 0.0, 0.0); + return true; + } + + //move, but i don't care if i'm blocked by default +// gi.dprintf("attack mvmt: %s\n",vtos(mydist)); + if (EvaluateMovement(which_ai, monster, mydist)) + { + mypercent = 1.0; + } + else + { + mypercent = 0.0; + } + + // kef -- and this is _after_ it was cleaned up... + bTest1 = (!!action_target); + bTest2 = bTest1?(action_target->health <= 0):false; + bTest3 = bTest1?(!action_target->inuse):false; + bTest4 = bTest1?(action_target->health <= 0):false; + bTest5 = timeout_time < level.time; + bTest6 = (!!which_ai.GetBody()); + bTest7 = (bTest6?(!!which_ai.GetBody()->IsAnimationFinished()):false); + bTest8 = (bTest6?(!!which_ai.GetBody()->IsAnimationHeld(HOLDCODE_NO)):false); + bTest9 = (!waitForAnim || (bTest6 && (bTest7 || bTest8))); + //is action over? if animation over, or target no longer valid, then it is + if ( (!isLethal || (bTest1 && bTest2)) && + ((bTest1 && (bTest3 || bTest4)) || ((bTest5 && bTest9))) ) + { + float targetremains; + + // kef -- i thought it was a little easier to read if i added this extra + //condition here rather than a dozen lines earlier. this ensures that anims + //are finished even if a scripted kill occurs before the end of the anim + if (bTest1 && bTest4 && !bTest7) + { + return false; + } + //was action successful? adjust percent_success accordingly + //fixme: might take a little time to damage player (rocket, etc) + if (!action_target || !action_target->inuse || action_target->health >= init_health) + { +// mypercent = 0.0; + } + else + { +// mypercent = 1.0; + } + + //if target is destroyed, signal owner action to abort (hey, is this a good idea?). + if (!action_target || !action_target->inuse || (action_target->health <=0)) + { + targetremains=0.0; + } + else + { + targetremains=1.0; + } + + //let owners know i'm finished + ResolveAction(which_ai, monster, mypercent, targetremains); + return true; + } + else + { + return false; + } +} + +attack_action::attack_action(attack_action *orig) +: move_action(orig) +{ + init_health = orig->init_health; + next_attack_time = orig->next_attack_time; +} + +void attack_action::Evaluate(attack_action *orig) +{ + init_health = orig->init_health; + next_attack_time = orig->next_attack_time; + + move_action::Evaluate(orig); +} + +/********************************************************************************** + **********************************************************************************/ + +void jump_action::JumpToPosition(ai_c &which_ai, edict_t &monster, vec3_t jumpgoal) +{ + vec3_t horiz_vel; + float dist_to_cover,vert_vel; + float jump_time, jump_vel; + float frameboost; + vec3_t tJumpGoal; + + //no specific jump goal--just go 64 forward + if (VectorCompare(monster.s.origin, jumpgoal)) + { + vec3_t forward; + AngleVectors(monster.s.angles, forward, NULL, NULL); + VectorMA(monster.s.origin, 64, forward, tJumpGoal); + VectorCopy(tJumpGoal, jumpgoal); + } + else + { + VectorCopy(jumpgoal, tJumpGoal); + } + //separate out direction and distance to goal + tJumpGoal[2]-=monster.mins[2]; + VectorSubtract(tJumpGoal, monster.s.origin, horiz_vel); + horiz_vel[2]=0; + dist_to_cover = VectorNormalize(horiz_vel); + + //cap velocity so i don't jump farther than i'm supposed to + if (dist_to_cover > which_ai.GetJumpDistance()) + { + dist_to_cover = which_ai.GetJumpDistance(); + } + + //find out how long i'll be in the air + if (which_ai.GetJumpHeight() < sv_gravity->value*FRAMETIME) + { + frameboost = which_ai.GetJumpHeight(); + } + else + { + frameboost = sv_gravity->value*FRAMETIME; + } + //fixme: don't have to jump this high; also, store value as jump velocity + //time going up + vert_vel=sqrt(which_ai.GetJumpHeight()*2.0*sv_gravity->value)+frameboost; + jump_time=vert_vel/(sv_gravity->value*FRAMETIME); + //time coming down--assuming goal is not higher than jumpheight!!!!!! + if ((monster.s.origin[2]+which_ai.GetJumpHeight()-tJumpGoal[2])>0) + { + if (tJumpGoal[2]>monster.s.origin[2]) + { + vert_vel=sqrt((tJumpGoal[2]-monster.s.origin[2])*2.0*sv_gravity->value)+frameboost*2; + jump_time=vert_vel/(sv_gravity->value*FRAMETIME); + } + else + { + jump_time+=(sqrt((monster.s.origin[2]+which_ai.GetJumpHeight()-tJumpGoal[2]) + *2.0*sv_gravity->value)+frameboost)/(sv_gravity->value*FRAMETIME); + } + } + + //now set my jump velocity so i'll reach horizontal dest at right time + jump_vel = 10*dist_to_cover/jump_time; + VectorScale(horiz_vel, jump_vel, horiz_vel); + horiz_vel[2]=vert_vel; + + VectorCopy(horiz_vel, jump_intent); + +// Jump(which_ai, monster, horiz_vel); +} + +void jump_action::BeginAction(ai_c &which_ai, edict_t &monster) +{ + JumpToPosition(which_ai, monster, dest); + + //store off horizontal velocity for restoration while i'm in air + VectorCopy(monster.velocity, jumpvel); + jumpvel[2]=0; + which_ai.GetBody()->ResumeAnimation(monster); + ForceAnimation(which_ai, monster); +} + +qboolean jump_action::Think(ai_c &which_ai, edict_t &monster) +{ + vec3_t mydist; + + //achtung!! could still be in mid-air here, so be careful + if (!PerformBodilyFunctions(which_ai, monster, mydist)) + { + ResolveAction(which_ai, monster, 0.0, 0.0); + return true; + } + + EvaluateMovement(which_ai, monster, mydist); + + //once i've landed, i'm done + if (((which_ai.GetBody() && which_ai.GetBody()->IsAnimationFinished()) || (jump_finish_time+3 < level.time)) + && monster.groundentity) + { + VectorClear(monster.velocity); + //let owners know i'm finished + VectorSubtract(monster.s.origin,dest,mydist); + if (VectorLengthSquared(mydist)<900) + { + ResolveAction(which_ai, monster, 1.0, 1.0); + } + else + { + ResolveAction(which_ai, monster, 0.0, 1.0); + } + return true; + } + else + { + if (monster.groundentity || monster.movetype == MOVETYPE_FLY) + { + which_ai.GetBody()->ResumeAnimation(monster); + } + + //adjust velocity to slide up a wall to a step + //no adjust if i've come to a complete stop--be nice to physics, it zeroes out velocity when it needs to + //to prevent getting stuck on slopes, only adjust until action times out + + //FIXME: this counts as a hack + if ((VectorLengthSquared(monster.velocity)>0.01) && (jump_finish_time > level.time) && monster.velocity[2]>0) + { + vec3_t jump_nudge; + + jump_nudge[0]=(dest[0]-monster.s.origin[0])/(jump_finish_time - level.time); + jump_nudge[1]=(dest[1]-monster.s.origin[1])/(jump_finish_time - level.time); + jump_nudge[2]=0; + + if (VectorLengthSquared(jump_nudge)>16000000) + { + VectorNormalize(jump_nudge); + VectorScale(jump_nudge,4000.0,jump_nudge); + } + monster.velocity[0]=jump_nudge[0]; + monster.velocity[1]=jump_nudge[1]; + } + return false; + } +} + +jump_action::jump_action(jump_action *orig) +: move_action(orig) +{ + VectorCopy(orig->jumpvel, jumpvel); +} + +void jump_action::Evaluate(jump_action *orig) +{ + VectorCopy(orig->jumpvel, jumpvel); + + move_action::Evaluate(orig); +} + +void jump_action::Read() +{ + char loaded[sizeof(jump_action)]; + + gi.ReadFromSavegame('AIJA', loaded, sizeof(jump_action)); + Evaluate((jump_action *)loaded); +} + +void jump_action::Write() +{ + jump_action *savable; + + savable = new jump_action(this); + gi.AppendToSavegame('AIJA', savable, sizeof(*this)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ + +qboolean fall_action::PerformBodilyFunctions(ai_c &which_ai, edict_t &monster, vec3_t curDist) +{ + turninfo_s turninfo; + //abortAction will be set when child scripted action fails + if (abortAction) + { + return false; + } + + which_ai.GetBody()->UpdateFace(monster); + InterpretFlags(NextFlags(which_ai, monster), which_ai, monster); + + AdjustBBox(which_ai, monster); + + //if i have a turn destination, turn toward it + SetTurnDestination(which_ai, monster); + NextTurn(1.0, which_ai, monster, turninfo); + Turn(which_ai, monster, turninfo); + + NextMovement(which_ai, monster, curDist); + return true; +} + +qboolean fall_action::Think(ai_c &which_ai, edict_t &monster) +{ + vec3_t mydist,forward; + + //achtung!! could still be in mid-air here, so be careful + if (!PerformBodilyFunctions(which_ai, monster, mydist)) + { + ResolveAction(which_ai, monster, 0.0, 0.0); + return true; + } + + //urk--this is an ugly way to make sure i'm moving forward. + if (!started_falling) + { + mydist[2]=0; + + if (VectorLengthSquared(mydist)<25 && anim==anim2) + { + if (dest && !VectorCompare(dest, vec3_origin)) + { + VectorSubtract(dest, monster.s.origin, forward); + forward[2]=0; + VectorNormalize(forward); + VectorScale(forward, 20.0, forward); + } + else + { + AngleVectors(monster.s.angles,forward,NULL,NULL); + VectorScale(forward,20.0,forward); + } + VectorAdd(mydist,forward,mydist); + } + } + + //if i haven't started falling yet, and can't move, try to fall + if (!EvaluateMovement(which_ai, monster, mydist)/*&&!(move_mask&fall_movemask)*/) + { + move_mask |= fall_movemask; + + if (EvaluateMovement(which_ai, monster, mydist)) + { + started_falling = true; + anim=anim2; + } + //gads, this is not good--i'm trapped + else if ((!(monster.flags & FL_PARTIALGROUND) || monster.velocity[2]<-5)&&(!started_falling && !monster.groundentity))//if (level.time>timeout_time) + { + started_falling = true; +// started_falling = false; + anim=anim; + } + } + + //using timeout for first half of action, while stepmovement keeps me on ground + if (/*timeout_time < level.time &&*/ !monster.groundentity && !started_falling) + { +// started_falling = true; + anim=anim2; + } + + //once i've landed, i'm done + if (monster.groundentity&&started_falling) + { + float my_success=1.0; + + which_ai.GetBody()->ResumeAnimation(monster); + if (which_ai.GetBody() && which_ai.GetBody()->IsAnimationFinished()) + { + if (monster.s.origin[2]-dest[2]+monster.mins[2]>10) + { + my_success=0.0; + } + VectorClear(monster.velocity); + //let owners know i'm finished + ResolveAction(which_ai, monster, my_success, my_success); + return true; + } + return false; + } + else + { + return false; + } +} + +fall_action::fall_action(fall_action *orig) +: move_action(orig) +{ + started_falling = orig->started_falling; + *(int *)&anim2 = GetMmoveNum(orig->anim2); +} + +void fall_action::Evaluate(fall_action *orig) +{ + started_falling = orig->started_falling; + anim2 = GetMmovePtr((int)orig->anim2); + + move_action::Evaluate(orig); +} + +void fall_action::Read() +{ + char loaded[sizeof(fall_action)]; + + gi.ReadFromSavegame('AIFA', loaded, sizeof(fall_action)); + Evaluate((fall_action *)loaded); +} + +void fall_action::Write() +{ + fall_action *savable; + + savable = new fall_action(this); + gi.AppendToSavegame('AIFA', savable, sizeof(*this)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ + +surrender_action::surrender_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *surrenderTo, vec3_t gohere, vec3_t facing, float timeout, qboolean fullAnimation) +:move_action(od,oa,newanim, gohere,facing, timeout,fullAnimation) +{ + action_target = surrenderTo; +} + +qboolean surrender_action::Think(ai_c &which_ai, edict_t &monster) +{ +// vec3_t v; + vec3_t mydist; + + if (!PerformBodilyFunctions(which_ai, monster, mydist)) + { + //let owners know i'm finished + ResolveAction(which_ai, monster, 0.0, 0.0); + return true; + } + + //move, but i don't care if i'm blocked by default + EvaluateMovement(which_ai, monster, mydist); + + //finish when i timeout + if ( timeout_time < level.time) + { + //let owners know i'm finished--always successful + ResolveAction(which_ai, monster, 1.0, 1.0); + + return true; + } + else + { + return false; + } +} + +surrender_action::surrender_action(surrender_action *orig) +: move_action(orig) +{ +} + +void surrender_action::Evaluate(surrender_action *orig) +{ + move_action::Evaluate(orig); +} + +void surrender_action::Read() +{ + char loaded[sizeof(surrender_action)]; + + gi.ReadFromSavegame('AISA', loaded, sizeof(surrender_action)); + Evaluate((surrender_action *)loaded); +} + +void surrender_action::Write() +{ + surrender_action *savable; + + savable = new surrender_action(this); + gi.AppendToSavegame('AISA', savable, sizeof(*this)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ +capture_action::capture_action(decision_c *od, action_c *oa,mmove_t *newanim, edict_t *attackTarget, vec3_t gohere, vec3_t facing, float timeout, qboolean fullAnimation) +:move_action(od,oa,newanim,gohere,facing,timeout,fullAnimation) +{ + action_target = attackTarget; +} + +qboolean capture_action::Think(ai_c &which_ai, edict_t &monster) +{ +// vec3_t v; + vec3_t mydist; + + if (!PerformBodilyFunctions(which_ai, monster, mydist)) + { + //let owners know i'm finished + ResolveAction(which_ai, monster, 0.0, 0.0); + + return true; + } + + //move, but i don't care if i'm blocked by default + EvaluateMovement(which_ai, monster, mydist); + + //finish when i timeout + if ( timeout_time < level.time) + { + //let owners know i'm finished--always successful??? shouldn't be. + ResolveAction(which_ai, monster, 1.0, 1.0); + + return true; + } + else + { + return false; + } +} + +capture_action::capture_action(capture_action *orig) +: move_action(orig) +{ +} + +void capture_action::Evaluate(capture_action *orig) +{ + move_action::Evaluate(orig); +} + +void capture_action::Read() +{ + char loaded[sizeof(capture_action)]; + + gi.ReadFromSavegame('AICA', loaded, sizeof(capture_action)); + Evaluate((capture_action *)loaded); +} + +void capture_action::Write() +{ + capture_action *savable; + + savable = new capture_action(this); + gi.AppendToSavegame('AICA', savable, sizeof(*this)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ +endscript_action::endscript_action(decision_c *od) : action_c () +{ + od->FinishScript(); + timeout_interval = 0; +} + +qboolean endscript_action::Think(ai_c &which_ai, edict_t &monster) +{ + //add sight & sound if i spawned deaf & blind + if (monster.spawnflags&SPAWNFLAG_BLIND) + { + which_ai.NewSense(new normalsight_sense(), &monster); + monster.spawnflags&=(~SPAWNFLAG_BLIND); + } + if (monster.spawnflags&SPAWNFLAG_DEAF) + { + which_ai.NewSense(new sound_sense(), &monster); + monster.spawnflags&=(~SPAWNFLAG_DEAF); + } + ResolveAction(which_ai, monster, 1.0, 1.0); + return true; +} + +endscript_action::endscript_action(endscript_action *orig) +: action_c(orig) +{ +} + +void endscript_action::Evaluate(endscript_action *orig) +{ + action_c::Evaluate(orig); +} + +void endscript_action::Read() +{ + char loaded[sizeof(endscript_action)]; + + gi.ReadFromSavegame('AIEA', loaded, sizeof(endscript_action)); + Evaluate((endscript_action *)loaded); +} + +void endscript_action::Write() +{ + endscript_action *savable; + + savable = new endscript_action(this); + gi.AppendToSavegame('AIEA', savable, sizeof(*this)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ +running_melee_attack_action::running_melee_attack_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t gohere, vec3_t facing, float timeout, qboolean fullAnimation) +:attack_action(od, oa, newanim, attackTarget, gohere, facing, timeout, fullAnimation) +{ + m_nActionCode = MELEE_ACTION_NONE; +} + +qboolean running_melee_attack_action::Turn(ai_c &which_ai, edict_t &monster, turninfo_s &turninfo) +{ + float ideal; + float current; + float move; + + current = anglemod(monster.s.angles[YAW]); + ideal = anglemod(which_ai.ideal_angles[YAW]); + + //already facing ideal direction; consider turn successful + if (current == ideal) + { + Aim(which_ai, monster); + return true; + } + + move = ideal - current; + + //make sure we take shortest route to desired yaw + if (ideal > current) + { + if (move >= 180) + { + move = move - 360; + } + } + else + { + if (move <= -180) + { + move = move + 360; + } + } + + //cap turning speed to yawspeed + if (move > 0) + { + if (move > turninfo.max_turn) + { + move = turninfo.max_turn; + } + } + else + { + if (move < turninfo.min_turn) + { + move = turninfo.min_turn; + } + } + + monster.s.angles[YAW] = anglemod (current + move); + + Aim(which_ai, monster); + + return true; +} + +void running_melee_attack_action::SetTurnDestination(ai_c &which_ai, edict_t &monster) +{ + vec3_t v,temp_v; + sensedEntInfo_t sensed_client, sensed_monster; + + which_ai.GetSensedClientInfo(smask_all, sensed_client); + which_ai.GetSensedMonsterInfo(smask_all, sensed_monster); + + // once we jump we don't want to change our direction unless + //a) we hit someone + //b) we land + if (m_nActionCode == MELEE_ACTION_JUMPED) + { + // we just jumped so don't let anyone change our facing + } + else if (m_nActionCode == MELEE_ACTION_HIT) + { + // we hit someone during our attack. we changed our facing + //in running_melee_attack_action::InterpretFlags at the time + //of impact, so now just keep going straight through the end + //of this animation + } + else + { + // we aren't jumping yet and we haven't hit anyone yet so + //face wherever the heck + + //keep in touch with the current position of my target, for greater accuracy + if (action_target && sensed_monster.ent == action_target) + { + VectorCopy(sensed_monster.pos, face); + VectorSubtract (face, monster.s.origin, v); + + v[2]-=monster.viewheight; + + VectorAdd(sensed_monster.ent->mins,sensed_monster.ent->maxs,temp_v); + VectorScale(temp_v,0.5,temp_v); + VectorAdd(v,temp_v,v); + } + else if (action_target && sensed_client.ent == action_target) + { + VectorCopy(sensed_client.pos, face); + VectorSubtract (face, monster.s.origin, v); + + v[2]-=monster.viewheight; + + VectorAdd(sensed_client.ent->mins,sensed_client.ent->maxs,temp_v); + VectorScale(temp_v,0.5,temp_v); + VectorAdd(v,temp_v,v); + } + //if i have a turn destination, turn toward it--DANGER!!--this will not work if you really want to be facing 0,0,0 + else if (face[0]||face[1]||face[2]) + { + VectorSubtract (face, monster.s.origin, v); + } + //if no turn destination specified, turn toward movement destination + else + { + VectorSubtract (dest, monster.s.origin, v); + } + vectoangles(v, which_ai.ideal_angles); + } +} + +void running_melee_attack_action::InterpretFlags(int cur_flags, ai_c &which_ai, edict_t &monster) +{ + //if frameflags specify jump & this action is primed for jumping, record + //our desired jump direction so it doesn't get changed until we land + if (cur_flags & FRAMEFLAG_JUMP) + { + if (move_mask & jump_movemask) + { + //Jump(which_ai, monster, jump_intent); + m_nActionCode = MELEE_ACTION_JUMPED; + } + } + + //this ok? no keeping track of whether i've played this sound recently? + if (cur_flags & FRAMEFLAG_LAND) + { +// if (monster.groundentity) + { +// gi.dprintf("\n"); + switch(rand()%3) + { + default: + case 0: + gi.sound (&monster, CHAN_BODY, gi.soundindex ("impact/gore/fall1.wav"), 1.0, ATTN_NORM, 0); + break; + case 1: + gi.sound (&monster, CHAN_BODY, gi.soundindex ("impact/gore/fall2.wav"), 1.0, ATTN_NORM, 0); + break; + case 2: + gi.sound (&monster, CHAN_BODY, gi.soundindex ("impact/gore/fall3.wav"), 1.0, ATTN_NORM, 0); + break; + } + } + } + + //play footsteps + if (cur_flags & FRAMEFLAG_FOOTSTEP) + { + FX_SetEvent(&monster, EV_FOOTSTEPLEFT); + } + + if (cur_flags & FRAMEFLAG_ATTACK) + { + // need to call the actual attack function + body_c* body = which_ai.GetBody(); + if (body) + { + body->FirePrimaryWeapon(monster, isLethal, NullTarget); + isLethal = false; + } + } + + if (cur_flags & FRAMEFLAG_THROW) + { + // need to call the actual attack function + body_c* body = which_ai.GetBody(); + if (body) + { + body->ThrowProjectile(monster); + } + cur_flags &= ~FRAMEFLAG_THROW; + } + + + if (cur_flags & FRAMEFLAG_MELEE) + { + // this flag means we hit someone with our attack so we need + //to change the direction of our motion + m_nActionCode = MELEE_ACTION_HIT; + if (rand()%2) + { + which_ai.ideal_angles[YAW] -= 20; + if (which_ai.ideal_angles[YAW] < 0) + { + which_ai.ideal_angles[YAW] += 360; + } + } + else + { + which_ai.ideal_angles[YAW] += 20; + if (which_ai.ideal_angles[YAW] > 360) + { + which_ai.ideal_angles[YAW] -= 360; + } + } + } + + //frame holding--holds for random period of time, vey primitive. + if (cur_flags & FRAMEFLAG_HOLDFRAME) + { + } +} + +running_melee_attack_action::running_melee_attack_action(running_melee_attack_action *orig) +: attack_action(orig) +{ + m_nActionCode = orig->m_nActionCode; +} + +void running_melee_attack_action::Evaluate(running_melee_attack_action *orig) +{ + m_nActionCode = orig->m_nActionCode; + + attack_action::Evaluate(orig); +} + +void running_melee_attack_action::Read() +{ + char loaded[sizeof(running_melee_attack_action)]; + + gi.ReadFromSavegame('AIRA', loaded, sizeof(running_melee_attack_action)); + Evaluate((running_melee_attack_action *)loaded); +} + +void running_melee_attack_action::Write() +{ + running_melee_attack_action *savable; + + savable = new running_melee_attack_action(this); + gi.AppendToSavegame('AIRA', savable, sizeof(*this)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ +dog_walk_action::dog_walk_action(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing, float timeout, qboolean fullAnimation) +:move_action(od,oa,newanim, destination, facing, timeout,fullAnimation) +{ + m_MoveStraightAnim = newanim; + m_MoveLeftAnim = newanim; + m_MoveRightAnim = newanim; +} + +qboolean dog_walk_action::Turn(ai_c &which_ai, edict_t &monster, turninfo_s &turninfo) +{ + float ideal; + float current; + float move; + + anim = m_MoveStraightAnim; + current = anglemod(monster.s.angles[YAW]); + ideal = anglemod(which_ai.ideal_angles[YAW]); + + //already facing ideal direction; consider turn successful + if (current == ideal) + { + Aim(which_ai, monster); + return true; + } + + move = ideal - current; + + // if we're turning to the left, use our 'walking left' anim, else 'walking right' + if (move < 0) + { + anim = m_MoveLeftAnim; + } + else + { + anim = m_MoveRightAnim; + } + + if (anim != m_MoveStraightAnim) + { + BeginAction(which_ai, monster); + } + + //make sure we take shortest route to desired yaw + if (ideal > current) + { + if (move >= 180) + { + move = move - 360; + } + } + else + { + if (move <= -180) + { + move = move + 360; + } + } + + //cap turning speed to yawspeed + if (move > 0) + { + if (move > turninfo.max_turn) + { + move = turninfo.max_turn; + } + } + else + { + if (move < turninfo.min_turn) + { + move = turninfo.min_turn; + } + } + + monster.s.angles[YAW] = anglemod (current + move); + + Aim(which_ai, monster); + + return true; +} + +dog_walk_action::dog_walk_action(dog_walk_action *orig) +: move_action(orig) +{ + *(int *)&m_MoveStraightAnim = GetMmoveNum(orig->m_MoveStraightAnim); + *(int *)&m_MoveLeftAnim = GetMmoveNum(orig->m_MoveLeftAnim); + *(int *)&m_MoveRightAnim = GetMmoveNum(orig->m_MoveRightAnim); +} + +void dog_walk_action::Evaluate(dog_walk_action *orig) +{ + m_MoveStraightAnim = GetMmovePtr((int)orig->m_MoveStraightAnim); + m_MoveLeftAnim = GetMmovePtr((int)orig->m_MoveLeftAnim); + m_MoveRightAnim = GetMmovePtr((int)orig->m_MoveRightAnim); + + move_action::Evaluate(orig); +} + +void dog_walk_action::Read() +{ + char loaded[sizeof(dog_walk_action)]; + + gi.ReadFromSavegame('AIDW', loaded, sizeof(dog_walk_action)); + Evaluate((dog_walk_action *)loaded); +} + +void dog_walk_action::Write() +{ + dog_walk_action *savable; + + savable = new dog_walk_action(this); + gi.AppendToSavegame('AIDW', savable, sizeof(*this)); + delete savable; +} + +// ------------------------------------------------------------- + +stand_action::stand_action(stand_action *orig) +: action_c(orig) +{ +} + +void stand_action::Evaluate(stand_action *orig) +{ + action_c::Evaluate(orig); +} + +void stand_action::Read() +{ + char loaded[sizeof(stand_action)]; + + gi.ReadFromSavegame('AISA', loaded, sizeof(stand_action)); + Evaluate((stand_action *)loaded); +} + +void stand_action::Write() +{ + stand_action *savable; + + savable = new stand_action(this); + gi.AppendToSavegame('AISA', savable, sizeof(*this)); + delete savable; +} + +// ------------------------------------------------------------- + +walk_action::walk_action(walk_action *orig) +: move_action(orig) +{ +} + +void walk_action::Evaluate(walk_action *orig) +{ + move_action::Evaluate(orig); +} + +void walk_action::Read() +{ + char loaded[sizeof(walk_action)]; + + gi.ReadFromSavegame('AIWA', loaded, sizeof(walk_action)); + Evaluate((walk_action *)loaded); +} + +void walk_action::Write() +{ + walk_action *savable; + + savable = new walk_action(this); + gi.AppendToSavegame('AIWA', savable, sizeof(*this)); + delete savable; +} + +// ------------------------------------------------------------- + +shoot_attack_action::shoot_attack_action(shoot_attack_action *orig) +: attack_action(orig) +{ +} + +void shoot_attack_action::Evaluate(shoot_attack_action *orig) +{ + attack_action::Evaluate(orig); +} + +void shoot_attack_action::Read() +{ + char loaded[sizeof(shoot_attack_action)]; + + gi.ReadFromSavegame('AIAA', loaded, sizeof(shoot_attack_action)); + Evaluate((shoot_attack_action *)loaded); +} + +void shoot_attack_action::Write() +{ + shoot_attack_action *savable; + + savable = new shoot_attack_action(this); + gi.AppendToSavegame('AIAA', savable, sizeof(*this)); + delete savable; +} + +// end diff --git a/Source/Game/gamecpp/ai_actions.h b/Source/Game/gamecpp/ai_actions.h new file mode 100644 index 0000000..1c37e14 --- /dev/null +++ b/Source/Game/gamecpp/ai_actions.h @@ -0,0 +1,497 @@ +class Event; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////// +/////// stand around action branch (root branch) +/////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +class action_c +{ +public: +private: +protected: + mmove_t *anim; + vec3_t face,dest; + float faceUpdatedTime; + bool interrupted; + qboolean abortAction; + decision_c_ptr owner_decision; + action_c_ptr owner_action; + float velScale; + float default_turn; + int move_mask; + float start_time; // set when action is first executed + float timeout_interval; // passed in during construction + float timeout_time; // sum of start_time + timeout_interval +// edict_t *action_target; + vec3_t jump_intent; + float jump_finish_time;//when i expect to finish up the jump + qboolean waitForAnim; + Event *SignalEvent; + bool isLethal; + int NullTarget; + + virtual void ResolveAction(ai_c &which_ai, edict_t &monster, float decision_success, float action_success); + + virtual void InterpretFlags(int cur_flags, ai_c &which_ai, edict_t &monster);//trigger frame-based actions in here + + //animation stuff--should just call body funcs of the same name + virtual qboolean SetAnimation(ai_c &which_ai, edict_t &monster); + virtual qboolean ForceAnimation(ai_c &which_ai, edict_t &monster); + virtual qboolean MatchAnimation(ai_c &which_ai, edict_t &monster); + virtual void NextMovement(ai_c &which_ai, edict_t &monster, vec3_t curDist); + virtual void NextTurn(float scale, ai_c &which_ai, edict_t &monster, turninfo_s &turninfo); + virtual int NextFlags(ai_c &which_ai, edict_t &monster); + + virtual void Jump(ai_c &which_ai, edict_t &monster, vec3_t jumpvec); + virtual qboolean Move(ai_c &which_ai, edict_t &monster, vec3_t dist); + virtual qboolean Turn(ai_c &which_ai, edict_t &monster, turninfo_s &turninfo); + virtual void Aim(ai_c &which_ai, edict_t &monster); + virtual qboolean EvaluateMovement(ai_c &which_ai, edict_t &monster, vec3_t distance); + + virtual void SetTurnDestination(ai_c &which_ai, edict_t &monster); + + //this guy combines bbox adjusting, frame advancing, frame event handling, turning, getting movement intention and abort check + virtual qboolean PerformBodilyFunctions(ai_c &which_ai, edict_t &monster, vec3_t curDist); + + virtual qboolean AdjustBBox(ai_c &which_ai, edict_t &monster); +public: + edict_t *action_target; + + action_c(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination = vec3_origin, vec3_t facing = vec3_origin, edict_t *target = NULL, float timeout = 99999999999, qboolean fullAnimation = false); + action_c(void); + virtual void Init(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination = vec3_origin, vec3_t facing = vec3_origin, edict_t *target = NULL, float timeout = 99999999999, qboolean fullAnimation = false); + virtual void Init(void); + virtual ~action_c(void) {} + + //fixme: this is a shoddy way of handling save/load + virtual void GetDest(vec3_t destination){VectorCopy(dest, destination);}; + virtual void BeginAction(ai_c &which_ai, edict_t &monster); + virtual qboolean Think(ai_c &which_ai, edict_t &monster); + virtual qboolean SafeToRemove(edict_t &monster){return true;}; + virtual actiontype_e Type(void){return atype_default;}; + virtual decision_c *GetOwnerDecision(void){return owner_decision;}; + virtual action_c *GetOwnerAction(void){return owner_action;}; + + void SetOwnerAction(action_c *newowner){owner_action = newowner;}//grrrr...don't really like doing this, but need to in order to set up action chains + + virtual Event* GetSignalEvent(){return SignalEvent;}; + virtual void SetSignalEventState(qboolean done); + virtual void AttachSignalEvent(Event *theEvent){SignalEvent = theEvent;}; + virtual void SetInterrupted(const bool newval){interrupted = newval;} + + //0.0 percent_success reserved for aborted actions + virtual void ActionCompleted(action_c &which_action, ai_c &which_ai, edict_t &monster, float percent_success) + {if (percent_success < 0.001)abortAction=true; else abortAction = false;}; + + + action_c(action_c *orig); + void Evaluate(action_c *orig); + virtual void Write() { assert(0); } + virtual void Read() { assert(0); } + + virtual int GetClassCode(void) { return ACTION; } +static action_c *NewClassForCode(int code); +}; + +//useable leaf of basic action +class stand_action : public action_c +{ +public: + stand_action(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination = vec3_origin, vec3_t facing = vec3_origin, edict_t *target = NULL, float timeout = 99999999999, qboolean fullAnimation = false): + action_c(od, oa, newanim, destination, facing, target, timeout, fullAnimation){}; + stand_action(void):action_c(){}; + + stand_action(stand_action *orig); + void Evaluate(stand_action *orig); + virtual void Write(); + virtual void Read(); + + virtual int GetClassCode(void) { return STAND_ACTION; } +}; + +/********************************************************************************** + **********************************************************************************/ + +class pain_action : public action_c +{ +private: +protected: + virtual void SetTurnDestination(ai_c &which_ai, edict_t &monster); + +public: + + pain_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *other, float kick, int damage, float timeout=999999999999, qboolean fullAnimation = false); + pain_action(void):action_c(){} + virtual ~pain_action(void) {} + + virtual actiontype_e Type(void){return atype_pain;} + virtual void BeginAction(ai_c &which_ai, edict_t &monster); + virtual qboolean Think(ai_c &which_ai, edict_t &monster); + + pain_action(pain_action *orig); + void Evaluate(pain_action *orig); + virtual void Write(); + virtual void Read(); + + virtual int GetClassCode(void) { return PAIN_ACTION; } +}; + +/********************************************************************************** + **********************************************************************************/ + +class death_action : public action_c +{ +protected: + float time_of_death; + bool drip; + mmove_t *anim2; + +protected: + virtual void InterpretFlags(int cur_flags, ai_c &which_ai, edict_t &monster);//trigger frame-based actions in here + virtual qboolean AdjustBBox(ai_c &which_ai, edict_t &monster); + void TiltToFloor(ai_c &which_ai, edict_t &monster); + void AlternateTiltToFloor(ai_c &which_ai, edict_t &monster); + +public: + + death_action(decision_c *od, action_c *oa, mmove_t *newanim1, mmove_t *newanim2, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + death_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + death_action(void):action_c(){drip = false;} + virtual ~death_action(void) {} + + virtual actiontype_e Type(void){return atype_death;} + virtual qboolean SafeToRemove(edict_t &monster); + virtual qboolean Think(ai_c &which_ai, edict_t &monster); + virtual void BeginAction(ai_c &which_ai, edict_t &monster); + + death_action(death_action *orig); + void Evaluate(death_action *orig); + virtual void Write(); + virtual void Read(); + + virtual int GetClassCode(void) { return DEATH_ACTION; } +}; + + +/********************************************************************************** + **********************************************************************************/ + +class deathcorpse_action : public death_action +{ +private: + +protected: + +public: + + deathcorpse_action(decision_c *od, action_c *oa, mmove_t *newanim1, mmove_t *newanim2, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + deathcorpse_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + deathcorpse_action(void):death_action(){} + virtual ~deathcorpse_action(void) {} + + virtual void BeginAction(ai_c &which_ai, edict_t &monster); + + deathcorpse_action(deathcorpse_action *orig); + void Evaluate(deathcorpse_action *orig); + virtual void Write(); + virtual void Read(); + + virtual int GetClassCode(void) { return DEATHCORPSE_ACTION; } +}; + +/********************************************************************************** + **********************************************************************************/ + +class deatharmor_action : public death_action +{ +private: + +protected: + +public: + + deatharmor_action(decision_c *od, action_c *oa, mmove_t *newanim1, mmove_t *newanim2, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + deatharmor_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + deatharmor_action(void):death_action(){} + virtual ~deatharmor_action(void) {} + +// virtual actiontype_e Type(void){return atype_deatharmor;} + virtual qboolean SafeToRemove(edict_t &monster); + virtual qboolean Think(ai_c &which_ai, edict_t &monster); + virtual void BeginAction(ai_c &which_ai, edict_t &monster); + + deatharmor_action(deatharmor_action *orig); + void Evaluate(deatharmor_action *orig); + virtual void Write(); + virtual void Read(); + + virtual int GetClassCode(void) { return DEATHARMOR_ACTION; } +}; + + +/********************************************************************************** + **********************************************************************************/ + +class endscript_action : public action_c +{ +private: +protected: +public: + endscript_action(decision_c *od); + endscript_action(void):action_c(){} + virtual ~endscript_action(void){} + + virtual void BeginAction(ai_c &which_ai, edict_t &monster){} + virtual qboolean Think(ai_c &which_ai, edict_t &monster); + + endscript_action(endscript_action *orig); + void Evaluate(endscript_action *orig); + virtual void Write(); + virtual void Read(); + + virtual int GetClassCode(void) { return ENDSCRIPT_ACTION; } +}; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////// +/////// move around action branch +/////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/********************************************************************************** + **********************************************************************************/ + +class move_action : public action_c +{ +private: +protected: +public: + + move_action(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false); + move_action(void):action_c(){} + virtual void Init(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false); + virtual ~move_action(void) {} + + virtual actiontype_e Type(void){return atype_walk;} + virtual qboolean Think(ai_c &which_ai, edict_t &monster); + + move_action(move_action *orig); + virtual void Evaluate(move_action *orig); +}; + +class walk_action : public move_action +{ +public: + + walk_action(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false) + :move_action(od, oa, newanim, destination, facing, timeout, fullAnimation){}; + walk_action(void):move_action(){} + + walk_action(walk_action *orig); + void Evaluate(walk_action *orig); + virtual void Write(); + virtual void Read(); + + virtual int GetClassCode(void) { return WALK_ACTION; } +}; + +class dog_walk_action : public move_action +{ +private: + mmove_t *m_MoveStraightAnim; + mmove_t *m_MoveLeftAnim; + mmove_t *m_MoveRightAnim; +protected: + virtual qboolean Turn(ai_c &which_ai, edict_t &monster, turninfo_s &turninfo); +public: + dog_walk_action(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false); + dog_walk_action(void):move_action(){} + virtual ~dog_walk_action(void) {} + + dog_walk_action(dog_walk_action *orig); + void Evaluate(dog_walk_action *orig); + virtual void Write(); + virtual void Read(); + + virtual int GetClassCode(void) { return DOG_WALK_ACTION; } +}; + +/********************************************************************************** + **********************************************************************************/ +//when i'm on ground, end action (should perform jump in BeginAction) +class jump_action : public move_action +{ +private: + vec3_t jumpvel;//horizontal velocity of jump--constantly restored +protected: + virtual void JumpToPosition(ai_c &which_ai, edict_t &monster, vec3_t jumpgoal); +public: + jump_action(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t gohere, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false) + :move_action(od,oa,newanim,gohere,facing,timeout){move_mask = step_movemask|jump_movemask;} + jump_action(void):move_action(){} + virtual ~jump_action(void) {} + + virtual actiontype_e Type(void){return atype_jump;} + virtual qboolean Think(ai_c &which_ai, edict_t &monster); + virtual void BeginAction(ai_c &which_ai, edict_t &monster); + + //abort action if returning from pain--this allows for throwback for damage + virtual void ActionCompleted(action_c &which_action, ai_c &which_ai, edict_t &monster, float percent_success) + {if (percent_success < 0.001||which_action.Type()==atype_pain)abortAction=true; else abortAction = false;} + + jump_action(jump_action *orig); + void Evaluate(jump_action *orig); + virtual void Write(); + virtual void Read(); + + virtual int GetClassCode(void) { return JUMP_ACTION; } +}; + +/********************************************************************************** + **********************************************************************************/ +//two stages: first, +//when i'm on ground, end action (should perform a jump in BeginAction, so it's really a jumpyfall) +class fall_action : public move_action +{ +private: + qboolean started_falling; + mmove_t *anim2; +protected: + virtual qboolean PerformBodilyFunctions(ai_c &which_ai, edict_t &monster, vec3_t curDist); +public: + fall_action(decision_c *od, action_c *oa, mmove_t *newanim, mmove_t *newanim2, vec3_t gohere, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false) + :move_action(od,oa,newanim,gohere,facing,timeout){ started_falling = false; anim2=newanim2;} + fall_action(void):move_action(){} + virtual ~fall_action(void) {} + + virtual actiontype_e Type(void){return atype_fall;} + virtual qboolean Think(ai_c &which_ai, edict_t &monster); + + virtual void StartFallAnim(ai_c &which_ai, edict_t &monster){} + + fall_action(fall_action *orig); + void Evaluate(fall_action *orig); + virtual void Write(); + virtual void Read(); + + virtual int GetClassCode(void) { return FALL_ACTION; } +}; + +/********************************************************************************** + **********************************************************************************/ + +class surrender_action : public move_action +{ +private: +public: + surrender_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *surrenderTo, vec3_t gohere, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false); + surrender_action(void):move_action(){} + virtual ~surrender_action(void) {} + + virtual actiontype_e Type(void){return atype_surrender;} + virtual qboolean Think(ai_c &which_ai, edict_t &monster); + + surrender_action(surrender_action *orig); + void Evaluate(surrender_action *orig); + virtual void Write(); + virtual void Read(); + + virtual int GetClassCode(void) { return SURRENDER_ACTION; } +}; + +/********************************************************************************** + **********************************************************************************/ + +class capture_action : public move_action +{ +private: +protected: +public: + capture_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t gohere, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false); + capture_action(void):move_action(){} + virtual ~capture_action(void) {} + + virtual actiontype_e Type(void){return atype_attack;} + virtual qboolean Think(ai_c &which_ai, edict_t &monster); + + capture_action(capture_action *orig); + void Evaluate(capture_action *orig); + virtual void Write(); + virtual void Read(); + + virtual int GetClassCode(void) { return CAPTURE_ACTION; } +}; + +/********************************************************************************** + **********************************************************************************/ + +class attack_action : public move_action +{ +private: + int init_health; + float next_attack_time; + +protected: + virtual int NextFlags(ai_c &which_ai, edict_t &monster); +public: + attack_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t gohere, + vec3_t facing = vec3_origin, float timeout=0/*999999999999*/, qboolean fullAnimation = false, + bool shouldKill = false, int theNullTarget = 0); + attack_action(void):move_action(){} + virtual ~attack_action(void) {} + virtual actiontype_e Type(void){return atype_attack;} + virtual void BeginAction(ai_c &which_ai, edict_t &monster); + virtual qboolean Think(ai_c &which_ai, edict_t &monster); + + attack_action(attack_action *orig); + virtual void Evaluate(attack_action *orig); +}; + +class shoot_attack_action : public attack_action +{ +public: + shoot_attack_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t gohere, vec3_t facing = vec3_origin, float timeout=0/*999999999999*/, qboolean fullAnimation = false, bool shouldKill = false, int NullTarget = 0) + :attack_action(od, oa, newanim, attackTarget, gohere, facing, timeout, fullAnimation, shouldKill, NullTarget){} + shoot_attack_action(void):attack_action(){} + + shoot_attack_action(shoot_attack_action *orig); + void Evaluate(shoot_attack_action *orig); + virtual void Write(); + virtual void Read(); + + virtual int GetClassCode(void) { return SHOOT_ATTACK_ACTION; } +}; + +/********************************************************************************** + **********************************************************************************/ + +#define MELEE_ACTION_NONE 0 +#define MELEE_ACTION_JUMPED 1 +#define MELEE_ACTION_HIT 2 + +class running_melee_attack_action : public attack_action +{ +private: + int m_nActionCode; + +protected: + virtual qboolean Turn(ai_c &which_ai, edict_t &monster, turninfo_s &turninfo); + virtual void SetTurnDestination(ai_c &which_ai, edict_t &monster); +public: + running_melee_attack_action(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t gohere, vec3_t facing = vec3_origin, float timeout=0/*999999999999*/, qboolean fullAnimation = false); + running_melee_attack_action(void):attack_action(){} + virtual ~running_melee_attack_action(void) {} + + virtual void InterpretFlags(int cur_flags, ai_c &which_ai, edict_t &monster);//trigger frame-based actions in here + + running_melee_attack_action(running_melee_attack_action *orig); + void Evaluate(running_melee_attack_action *orig); + virtual void Write(); + virtual void Read(); + + virtual int GetClassCode(void) { return RUNNING_MELEE_ATTACK_ACTION; } +}; + +// end \ No newline at end of file diff --git a/Source/Game/gamecpp/ai_body.cpp b/Source/Game/gamecpp/ai_body.cpp new file mode 100644 index 0000000..ce63db7 --- /dev/null +++ b/Source/Game/gamecpp/ai_body.cpp @@ -0,0 +1,1933 @@ + +//body--handle all super-basic animation stuff +#include "g_local.h" +#include "matrix4.h" + +#include "ai_body.h" +#include "ai_bodynoghoul.h" +#include "ai_bodyhuman.h" +#include "ai_bodydekker.h" +#include "ai_bodydog.h" +#include "ai_bodycow.h" +#include "ai.h" + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +extern int ai_loadAllBolts; + +body_c *body_c::NewClassForCode(int code) +{ + switch (code) + { + default: + case BODY: + case BODY_HUMAN: + case BODY_DOG: + case BODY_ORGANIC: + gi.dprintf("ERROR: invalid body class code: %d\n",code); + case BODY_MESO: + return new bodymeso_c(); + case BODY_ECTO: + return new bodyecto_c(); + case BODY_HUSKY: + return new bodyhusky_c(); + case BODY_ROTT: + return new bodyrott_c(); + case BODY_FEMALE: + return new bodyfemale_c(); + case BODY_HELI: + return new body_heli(); + case BODY_TANK: + return new body_tank(); + case BODY_SNOWCAT: + return new body_snowcat(); + case BODY_COW: + return new bodycow_c(); + case BODY_DEKKER: + return new bodydekker_c(); + } +} + +//static GroundTransformationCallBack TheGroundTransformationCallBack; + +body_c::body_c() +{ + currentmove = NULL; + owner = NULL; + currentMoveFinished = true; + holdCode = HOLDCODE_NO; + frame_flags = 0; + emotion_expire=level.time; + emotion = EMOTION_NORMAL; + emotionScripted=false; + rLastFireTime=level.time-10; + lLastFireTime=level.time-10; + InitialKilledTime = 0.0; + LastKilledTime = 0.0; + lastStartTime=level.time; + LastDFlags = 0; + ForceNextAnim = false; + TrainDeath = false; +} + +void body_c::FinishMove(edict_t &monster) +{ +// gi.dprintf("finishing anim at %f\n",level.time); + currentMoveFinished = true; +} + +void body_c::HoldAnimation(edict_t &monster, hold_code whyHold, float holdTime) +{ + GhoulID curAnim; + + curAnim = GetSequence(monster, currentmove); + if (!curAnim) + { + return; + } + monster.ghoulInst->Pause(holdTime); + holdCode = whyHold; +} + +void body_c::ResumeAnimation(edict_t &monster) +{ + GhoulID curAnim; + + if ((holdCode == HOLDCODE_NO) || (holdCode == HOLDCODE_GIBBED)) + { + return; + } + + curAnim = GetSequence(monster, currentmove); + if (!curAnim) + { + return; + } + + //fixme: ghoul glitch makes motion track go nuts while held +// VectorClear(monster.intend_velocity); + monster.ghoulInst->Resume(level.time); + holdCode = HOLDCODE_NO; +} + +qboolean body_c::IsAnimationHeld(hold_code queryCode) +{ + if (queryCode == HOLDCODE_NO) + { + return (holdCode != HOLDCODE_NO); + } + return (holdCode == queryCode); +} + + +qboolean body_c::IsAnimationFinished() +{ + if (!currentmove) + { + return true; + } + if (currentmove->actionFlags & ACTFLAG_LOOPANIM && !(currentmove->actionFlags&ACTFLAG_FULLANIM)) + { + return true; + } + return currentMoveFinished; + +} + +//super-secret version of IsAnimationFinished--doesn't make exceptions for looping animations. +//use sparingly--i only added this for path_corners, so you specify a cluster of animations (including looping ones) +// and it could wait until each one finishes before going to the next. +qboolean body_c::HasAnimationHitEOS() +{ + if (!currentmove) + { + return true; + } + return currentMoveFinished; +} + +qboolean body_c::IsAnimationReversed() +{ + if (currentmove) + { + return currentmove->actionFlags & ACTFLAG_REVERSEANIM; + } + return false; +} + +GhoulID body_c::GetSequence(edict_t &monster, mmove_t *newanim) +{ + ggObjC *myObject; + if (monster.ghoulInst && newanim && newanim->ghoulSeqName && (myObject=game_ghoul.FindObject(monster.ghoulInst->GetGhoulObject()))) + { + char seqName[GGHOUL_OBJ_NAME_LEN]; + Com_sprintf(seqName, GGHOUL_OBJ_NAME_LEN, "ghoul/%s/%s.ghl",myObject->GetName(),newanim->ghoulSeqName); + return monster.ghoulInst->GetGhoulObject()->FindSequence(seqName); + } + return NULL_GhoulID; +} + +qboolean body_c::IsAvailableSequence(edict_t &monster, mmove_t *newanim) +{ + if(monster.ai) + { + ai_c *the_ai = (ai_c*)((ai_public_c*)monster.ai); + + if(the_ai) + { + ggObjC *myObj = the_ai->GetGhoulObj(); + if(myObj) + { + if(!strncmp(myObj->GetName(), "enemy/meso", strlen("enemy/meso")) || + !strncmp(myObj->GetName(), "enemy/ecto", strlen("enemy/ecto")) || + !strncmp(myObj->GetName(), "enemy/female", strlen("enemy/female"))) + { + return myObj->IsSequenceAvailable(newanim - MMoves); + } + } + } + } + return (GetSequence(monster, newanim)!=NULL_GhoulID); +} + +qboolean body_c::PlayAnimation(edict_t &monster, mmove_t *newanim, bool forceRestart) +{ + //if monster has valid ghoul model, and animseq has valid ghoul seq., then play the sequence + GhoulID curAnim; + bool reverseAnim=false; + float playPos=newanim->playPos; + bool matchAnim=(1&&(newanim->actionFlags&ACTFLAG_MATCHANIM)); + float startTime=level.time; + + //what goes on in here (GetSequence calls mostly, it looks like) seems to be expensive, so just accept it if the play call isn't going to do anything anyway + if (newanim==currentmove && !forceRestart && !currentMoveFinished) + { + //just make sure i'm not paused + ResumeAnimation(monster); + return true; + } + + //don't match the end of a sequence--if the new anim isn't looping, it'll never finish!!! + if (currentmove && !(currentmove->actionFlags&ACTFLAG_LOOPANIM) && currentMoveFinished && matchAnim) + { + matchAnim=false; + forceRestart=true; + } + + if(newanim->actionFlags & ACTFLAG_FIREFROMGUN) + { + startTime = level.time + .1; + } + //SFS--Note: the contents of the next set of brackets is a trashy hack. if we can do without it, that would be nice. + else if (currentmove && (currentmove->actionFlags & ACTFLAG_FIREFROMGUN))//just coming from a firefromgun anim, consider screwing with angles and messing everything up + { + if ((newanim->suggested_action == ACTCODE_PAIN)||(newanim->suggested_action == ACTCODE_DEATH))//only bother with pains & deaths; other anims will wait till firfromguns sort theyselves out + { + Matrix4 m; + vec3_t mouthface, mouthangs; + ai_c *my_ai = (ai_c *)((ai_public_c *)monster.ai); + int taxis; + monster.ghoulInst->GetBoltMatrix(level.time, m, monster.ghoulInst->GetGhoulObject()->FindPart("sbolt_mouth"), IGhoulInst::MatrixType::Entity); + + if (my_ai) + { + m.GetRow(0,*(Vect3 *)mouthface);//forward vector, hopefully + mouthface[2] = 0; + vectoangles(mouthface,mouthangs); + if (GetClassCode() == BODY_HUSKY || GetClassCode() == BODY_ROTT) + { + mouthangs[YAW] -= 90; + } + VectorAdd(mouthangs, monster.s.angles,mouthangs); + for (taxis=0;taxis<3;taxis++) + { + mouthangs[taxis]=anglemod(mouthangs[taxis]); + } + + VectorCopy(mouthangs, monster.s.angles); +// VectorCopy(mouthangs, mouthface); +// my_ai->SetLookAngles(mouthface); +// AngleVectors(mouthangs,mouthface,NULL,NULL); + } + } + } + + if (holdCode == HOLDCODE_GIBBED) + { + return false; + } + + curAnim = GetSequence(monster, newanim); + if (!curAnim) + { + if (monster.classname && monster.targetname) + { + gi.dprintf("%s %s couldn't play animation %s!\n", monster.classname, monster.targetname, newanim->ghoulSeqName); + } + else if (monster.classname) + { + gi.dprintf("Some %s couldn't play animation %s!\n", monster.classname, newanim->ghoulSeqName); + } + else + { + gi.dprintf("Unknown monster couldn't play animation %s!\n", newanim->ghoulSeqName); + } + return false; + } + + if (newanim->actionFlags & ACTFLAG_MATCHABS) + { + //only match for similar sequences + if (newanim!=currentmove && currentmove->suggested_action==newanim->suggested_action) + { + startTime=lastStartTime; + } + } + + //reverse the animation? + if (newanim->actionFlags & ACTFLAG_REVERSEANIM) + { + reverseAnim = true; + // fixme? kef -- given that you can now store the playPos as part of the mmove_t struct, + //I don't know if we want to just plain override it here. + playPos = 1.0f; + } + +// get the old quakeorigin -- THIS WAS A WEAK ATTEMPT TO SOLVE THE POPPING BETWEEN ANIMATIONS. DIDN'T WORK! +/* Matrix4 BoltMatrix; + bool doit = false; + vec3_t oldOrigin; + + if (monster.ghoulInst->GetStateSequence()) + { + Vect3 OldQuakeOrigin; + int oldGhoulID; + + doit = true; + oldGhoulID = monster.ghoulInst->GetGhoulObject()->FindPart("quake_ground"); + monster.ghoulInst->GetBoltMatrix(level.time, BoltMatrix, oldGhoulID, IGhoulInst::MatrixType::Entity); + BoltMatrix.GetRow(3,OldQuakeOrigin); + VectorCopy((float *)&OldQuakeOrigin, oldOrigin); + } +*/ + //check to see if this should loop + if (newanim->actionFlags & ACTFLAG_LOOPANIM) + { + monster.ghoulInst->Play(curAnim,startTime,playPos,forceRestart,IGhoulInst::Loop, matchAnim, reverseAnim); + } + else + { + monster.ghoulInst->Play(curAnim,startTime,playPos,forceRestart,IGhoulInst::Hold, matchAnim, reverseAnim); + } + + lastStartTime=startTime; + + if (curAnim!=GetSequence(monster, currentmove) + /*(!newanim || !currentmove || stricmp(newanim->ghoulSeqName, currentmove->ghoulSeqName))*/ + /*newanim != currentmove*/ + ||forceRestart) + { + currentMoveFinished = false; + + //quake_ground may be drastically changed--i'll try to adjust bbox again this frame, so set the ground for that + if (monster.ai) + { + + // get the new quake origin + Matrix4 m; + int newGhoulID; + vec3_t curPos; + ai_c *my_ai = (ai_c *)((ai_public_c *)monster.ai); + + + newGhoulID = monster.ghoulInst->GetGhoulObject()->FindPart("quake_ground"); + + if (newGhoulID) + { + monster.ghoulInst->GetBoltMatrix(level.time, m, newGhoulID, IGhoulInst::MatrixType::Entity); + m.GetRow(3,*(Vect3 *)curPos); + // if (self->groundentity) + { + if (my_ai) + { + my_ai->SetGround(curPos[2]); + } + } + } + } + + } + +/* if (doit) + { + + // get the new quake origin + Vect3 NewQuakeOrigin; + vec3_t newOrigin; + int newGhoulID; + + newGhoulID = monster.ghoulInst->GetGhoulObject()->FindPart("quake_ground"); + + monster.ghoulInst->GetBoltMatrix(level.time, BoltMatrix, newGhoulID, IGhoulInst::MatrixType::Entity); + BoltMatrix.GetRow(3,NewQuakeOrigin); + VectorCopy((float *)&NewQuakeOrigin, newOrigin); + + float change = oldOrigin[2] - newOrigin[2]; +// monster.s.origin[2] += 5; + monster.s.origin[2] += change; + } +*/ SetMove(newanim); + + ResumeAnimation(monster); + + return true; +} + +qboolean body_c::MatchAnimation(edict_t &monster, mmove_t *newanim) +{ + return PlayAnimation(monster, newanim, false); +} + +qboolean body_c::SetAnimation(edict_t &monster, mmove_t *newanim) +{ + return PlayAnimation(monster, newanim, false); +} + +qboolean body_c::ForceAnimation(edict_t &monster, mmove_t *newanim) +{ + return PlayAnimation(monster, newanim, true); +} + +#define MAX_VEL_COMPONENT 50.0 + +void body_c::NextMovement(edict_t &monster, vec3_t curDist, float scale) +{ + vec3_t forward,right,up,tempdist,distaccum; + int i; + + AngleVectors(monster.s.angles,forward,right,up); + VectorScale(monster.intend_velocity, FRAMETIME, curDist); +// VectorCopy(monster.intend_velocity, curDist); + for (i = 0; i < 3; i++) + { + if (curDist[i]>MAX_VEL_COMPONENT) + { +// gi.dprintf("warning! capping monster %d vel component to %f (from %f)!\n", i, MAX_VEL_COMPONENT, curDist[i]); + curDist[i]=MAX_VEL_COMPONENT; + } + if (curDist[i]<-MAX_VEL_COMPONENT) + { +// gi.dprintf("warning! capping monster %d vel component to -%f (from %f)!\n", i, MAX_VEL_COMPONENT, curDist[i]); + curDist[i]=-MAX_VEL_COMPONENT; + } + } + //plop in default vel, too--fixme, shouldn't be here + VectorScale(forward, curDist[0]*scale, tempdist); + VectorCopy(tempdist,distaccum); + VectorScale(right, curDist[1]*scale, tempdist); + VectorAdd(distaccum,tempdist,distaccum); + VectorScale(up, curDist[2]*scale, tempdist); + VectorAdd(distaccum,tempdist,curDist); +} + +#define TURNDIST_MIN 64 +#define TURNDIST_MAX 192 + +void body_c::NextTurn(float scale, edict_t &monster, float default_turn, turninfo_s &turninfo) +{ +// return scale * default_turn + VectorLength(monster.intend_avelocity)*FRAMETIME; + ai_c *the_ai=NULL; + + if (monster.ai) + { + the_ai = (ai_c*)((ai_public_c*)monster.ai); + } + + if (!currentmove || !the_ai) + { + turninfo.max_turn = /*scale * */default_turn /*+ VectorLength(monster.intend_avelocity)*FRAMETIME*/; + turninfo.min_turn = /*scale * */-default_turn /*+ VectorLength(monster.intend_avelocity)*FRAMETIME*/; + } + else + { + float scale = 1.0; + + if(the_ai->getTarget()&&monster.health>0) + { + vec3_t dif; + vec3_t targ_pos; + + the_ai->getTargetPos(targ_pos); + + VectorSubtract(monster.s.origin, targ_pos, dif); + float dist = VectorLength(dif); + + if(the_ai->getTarget()->client) + { // turn faster the closer a player is + if(dist < TURNDIST_MIN) + { + scale = 2.0; + } + else if(dist > TURNDIST_MAX) + { + scale = 1.0; + } + else + { // the internal value runs from 0 up close to 1 far away + scale = 2.0 - (dist - TURNDIST_MIN)/(TURNDIST_MAX - TURNDIST_MIN); + } + + scale *= the_ai->GetMySkills()->getTurnSpeed();//different guys turn at different speeds + } + else + { // turn faster the closer the guy is - more severe than for regular player turning + if(dist < TURNDIST_MIN) + { + scale = 3.0; + } + else if(dist > TURNDIST_MAX) + { + scale = 1.0; + } + else + { // the internal value runs from 0 up close to 1 far away + scale = 3.0 - (dist - TURNDIST_MIN)/(TURNDIST_MAX - TURNDIST_MIN) * 2.0; + } + } + + } + + VectorScale(monster.intend_avelocity,0.1,monster.intend_avelocity); + VectorRadiansToDegrees(monster.intend_avelocity, monster.intend_avelocity); + turninfo.max_turn = currentmove->maxTurn + monster.intend_avelocity[YAW] * scale; + turninfo.min_turn = currentmove->minTurn + monster.intend_avelocity[YAW] * scale; +// if (monster.intend_avelocity[YAW] > 1.0 && ai_pathtest->value) +// { +// gi.dprintf("screwy turn value: %3.3f degrees!\n", monster.intend_avelocity[YAW]*RADTODEG); +// } + VectorClear(monster.intend_avelocity); + } +} + +int body_c::NextFlags(edict_t &monster) +{ + int returnflags=frame_flags; + + frame_flags=0; + return returnflags; +} + +void body_c::Emote(edict_t &monster, emotion_index new_emotion, float emotion_duration, qboolean scripted_emoting) +{ + //allow overriding of current emotion if: 1) new is higher priority, or 2) current emotion is about to expire anyway + //--also, make sure I don't interrupt scripted emotions with non-scripted emotions. +// if (((new_emotion0.25) && (!scripted_emoting || emotion==EMOTION_DEAD)) +// || (emotionScripted && !scripted_emoting && new_emotion!=EMOTION_DEAD)) + if (/*((emotion_expire-level.time>0.25) && (!scripted_emoting || emotion==EMOTION_DEAD)) + || */(emotionScripted && !scripted_emoting && new_emotion!=EMOTION_DEAD) || + (!scripted_emoting&&(emotion==EMOTION_DEAD||emotion==EMOTION_PAIN)&&(new_emotion!=EMOTION_DEAD))) + { + return; + } + emotion=new_emotion; + emotion_expire = level.time+emotion_duration; + emotionScripted=scripted_emoting; +} + +emotion_index body_c::GetMood(edict_t &monster) +{ + return emotion; +} + +//fixme: this could probably be better done with an array of ghoulid's, generated upon face setting +void body_c::UpdateFace(edict_t &monster) +{ + if (level.time > emotion_expire) + { + emotion=EMOTION_NORMAL; + emotionScripted=false; + } +} + +qboolean body_c::ApplySkin(edict_t &monster, ggOinstC *myInstance, char *matName, char *skinName) +{ + //fixme? go off myInstance, or get rid of it? + return monster.ghoulInst->SetFrameOverride(matName, skinName); +} + +//yurk, fixme: these arguments are trash! they're worse than delaware! +qboolean body_c::AddRandomBoltedItem(float percent_chance, edict_t &monster, char *myBolt, char *itemClass, char *itemSeq, char *itemBolt, ggOinstC *myInstance, char *itemSkinName, float scale) +{ + if ((gi.flrand(0.0, 1.0) < percent_chance)||(ai_loadAllBolts)) + { + if(ai_loadAllBolts) + { + AddBoltedItem(monster, myBolt, itemClass, itemSeq, itemBolt, myInstance, itemSkinName, scale); + return false; + } + return (NULL != AddBoltedItem(monster, myBolt, itemClass, itemSeq, itemBolt, myInstance, itemSkinName, scale)); + } + return false; +} + +//yurk, fixme: these arguments are trash! they're worse than delaware! +ggBinstC *body_c::AddBoltedItem(edict_t &monster, GhoulID mybolt, ggObjC *gun, char *itemSeq, GhoulID itemBolt, ggOinstC *myInstance, char *itemSkinName, float scale) +{ + GhoulID gunSeq=0; + + if (gun && itemBolt) + { + if (itemSkinName && itemSkinName[0]) + { + gun->RegisterSkin(itemSkinName); + } + + gun->RegistrationLock(); + + gunSeq=game_ghoul.FindObjectSequence(gun,itemSeq); + + if (gunSeq) + { + //fixme? just call this off myInstance? for more flexibility, a game_ghoul func could be made that goes off the edict + return game_ghoul.AddBoltInstance(myInstance, mybolt, gun, itemBolt, gunSeq, itemSkinName, scale); + } + else + { + return game_ghoul.AddBoltInstance(myInstance, mybolt, gun, itemBolt, itemSkinName, scale); + } + } + return NULL; +} + +//yurk, fixme: these arguments are trash! they're worse than delaware! +ggBinstC *body_c::AddBoltedItem(edict_t &monster, GhoulID mybolt, char *itemClass, char *itemSeq, GhoulID itemBolt, ggOinstC *myInstance, char *itemSkinName, float scale) +{ + ggObjC *gun=NULL; + char accessoryName[GGHOUL_ID_NAME_LEN]; + + GhoulID gunSeq=0; + +// sprintf(accessoryName,"simple%s",itemSeq); + strcpy(accessoryName,itemSeq); + + gun=game_ghoul.FindObject(itemClass,accessoryName,false,itemSkinName); + + if (gun && itemBolt) + { + if (itemSkinName && itemSkinName[0]) + { + gun->RegisterSkin(itemSkinName); + } + + gun->RegistrationLock(); + + gunSeq=game_ghoul.FindObjectSequence(gun,itemSeq); + + if (gunSeq) + { + //fixme? just call this off myInstance? for more flexibility, a game_ghoul func could be made that goes off the edict + return game_ghoul.AddBoltInstance(myInstance, mybolt, gun, itemBolt, gunSeq, itemSkinName, scale); + } + else + { + return game_ghoul.AddBoltInstance(myInstance, mybolt, gun, itemBolt, itemSkinName, scale); + } + } + return NULL; +} + +//yurk, fixme: these arguments are trash! they're worse than delaware! +ggBinstC *body_c::AddBoltedItem(edict_t &monster, GhoulID mybolt, char *itemClass, char *itemSeq, char *itemBolt, ggOinstC *myInstance, char *itemSkinName, float scale) +{ + ggObjC *gun=NULL; + GhoulID gunBolt=0; + char accessoryName[GGHOUL_ID_NAME_LEN]; + + GhoulID gunSeq=0; + +// sprintf(accessoryName,"simple%s",itemSeq); + strcpy(accessoryName,itemSeq); + + gun=game_ghoul.FindObject(itemClass,accessoryName,false,itemSkinName); + + if (gun) + { + if (itemSkinName && itemSkinName[0]) + { + gun->RegisterSkin(itemSkinName); + } + + gun->RegistrationLock(); + + gunSeq=game_ghoul.FindObjectSequence(gun,itemSeq); + + if (gunSeq) + { + gunBolt=gun->GetMyObject()->FindPart(itemBolt); + if (gunBolt) + { + //fixme? just call this off myInstance? for more flexibility, a game_ghoul func could be made that goes off the edict + return game_ghoul.AddBoltInstance(myInstance, mybolt, gun, gunBolt, gunSeq, itemSkinName, scale); + } + } + else + { + gunBolt=gun->GetMyObject()->FindPart(itemBolt); + if (gunBolt) + { + return game_ghoul.AddBoltInstance(myInstance, mybolt, gun, gunBolt, itemSkinName, scale); + } + } + } + return NULL; +} +//yurk, fixme: these arguments are trash! they're worse than delaware! +ggBinstC *body_c::AddBoltedItem(edict_t &monster, char *myBolt, char *itemClass, char *itemSeq, char *itemBolt, ggOinstC *myInstance, char *itemSkinName, float scale) +{ + if (monster.ghoulInst&&monster.ghoulInst->GetGhoulObject()) + { + GhoulID tbolt=monster.ghoulInst->GetGhoulObject()->FindPart(myBolt); + if(tbolt) + { + return AddBoltedItem(monster, tbolt, itemClass, itemSeq, itemBolt, myInstance, itemSkinName, scale); + } + } + return NULL; +} + +//this is 'cording to design doc, hope that's ok +float body_c::FireInterval(attacks_e weaponType, int curAmmo) +{ + //just pickin' values that feel good in the game now + switch(weaponType) + { + case ATK_PISTOL2: + //return gi.flrand(1.125F, 1.375F); + //return 4.0/9.0; + return 1.5; + case ATK_PISTOL1: + //return gi.flrand(0.75F, 1.25F); +// return gi.flrand(0.075F, 0.125F); + //return 5.0/18.0; + return .8; + case ATK_SNIPER: + //return gi.flrand(0.9F, 1.1F); + return 2.5; + case ATK_MACHINEGUN: + //return gi.flrand(0.054F, 0.066F); + return gi.flrand(0.5F, 1.0F); // this is essentially the pause between bursts //.01; + case ATK_KNIFE: + return gi.flrand(1.35F, 1.65F); + case ATK_FLAMEGUN: + //return gi.flrand(0.75, 1.25F); + //return gi.flrand(0.0774F, 0.0946F); + return .01; +// return gi.flrand(0.0225F, 0.0275F); + case ATK_ASSAULTRIFLE: + //return gi.flrand(0.0774F, 0.0946F); + return gi.flrand(.1F, .5F); // little bursts for SMG fire.01; + case ATK_MACHINEPISTOL: + //return gi.flrand(0.045F, 0.055F); + return .01; + case ATK_AUTOSHOTGUN: + //this will cause it to fire in 3 shot bursts - not accurate for the weapon, but cool for enemies + if((curAmmo%3) == 1) + { + return 2.0; + } + else + { + return .6; + } + return 1.0;//projectiles, so these need to be dodged for funness + case ATK_SHOTGUN: + //return gi.flrand(2.25F, 2.75F); + //return 5.0/8.0; + //return 4.0; + return 4.0; + case ATK_ROCKET: + //return gi.flrand(2, 3); + return 4.0; + case ATK_MICROWAVE: + case ATK_MICROWAVE_ALT: + return 6.0; + case ATK_DEKKER: + //return gi.flrand(6.25F, 8.75F); + return 2.5; + case ATK_NOTHING: + return 0; + } + return 0; +} + +weapons_t body_c::GetWeaponType(ggBinstC *weapon) +{ + if (!weapon) + { + return SFW_EMPTYSLOT; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_pistol2")) + { + return SFW_PISTOL2; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_pistol1")) + { + return SFW_PISTOL1; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_sniperrifle")) + { + return SFW_SNIPER; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_machinegun")) + { + return SFW_MACHINEGUN; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_knife")) + { + return SFW_KNIFE; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_bat")) + { + return SFW_KNIFE; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_flamethrower")) + { + return SFW_FLAMEGUN; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_assault_rifle")) + { + return SFW_ASSAULTRIFLE; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_machinepistol")) + { + return SFW_MACHINEPISTOL; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_autoshotgun")) + { + return SFW_AUTOSHOTGUN; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_kantana")) + { + return SFW_KNIFE; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_shotgun")) + { + return SFW_SHOTGUN; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_rocket")) + { + return SFW_ROCKET; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_mpg")) + { + return SFW_MICROWAVEPULSE; + } + return SFW_EMPTYSLOT; +} + +attacks_e body_c::GetWeaponAttackType(ggBinstC *weapon) +{ + if (!weapon) + { + return ATK_NOTHING; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_pistol2")) + { + return ATK_PISTOL2; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_pistol1")) + { + return ATK_PISTOL1; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_sniperrifle")) + { + return ATK_SNIPER; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_machinegun")) + { + return ATK_MACHINEGUN; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_knife")) + { + return ATK_KNIFE; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_bat")) + { + return ATK_KNIFE; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_flamethrower")) + { + return ATK_FLAMEGUN; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_assault_rifle")) + { + return ATK_ASSAULTRIFLE; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_machinepistol")) + { + return ATK_MACHINEPISTOL; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_autoshotgun")) + { + return ATK_AUTOSHOTGUN; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_kantana")) + { + return ATK_KNIFE; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_shotgun")) + { + return ATK_SHOTGUN; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_rocket")) + { + return ATK_ROCKET; + } + if (!stricmp(weapon->GetBolteeObject()->GetSubName(),"w_mpg")) + { + return ATK_MICROWAVE; + } + return ATK_NOTHING; +} + +qboolean body_c::RightHandWeaponReady(edict_t &monster) +{ + return false; +} + +void body_c::FireRightHandWeapon(edict_t &monster, bool isLethal, int NullTarget, qboolean forceFireRate) +{ +} + +body_c::body_c(body_c *orig) +{ + *(int *)¤tmove = GetMmoveNum(orig->currentmove); + *(int *)&owner = GetEdictNum(orig->owner); + currentMoveFinished = orig->currentMoveFinished; + holdCode = orig->holdCode; + frame_flags = orig->frame_flags; + emotion_expire = orig->emotion_expire; + emotion = orig->emotion; + emotionScripted = orig->emotionScripted; + rLastFireTime = orig->rLastFireTime; + lLastFireTime = orig->lLastFireTime; + InitialKilledTime = orig->InitialKilledTime; + LastKilledTime = orig->LastKilledTime; + lastStartTime = orig->lastStartTime; + LastDFlags = orig->LastDFlags; + ForceNextAnim = orig->ForceNextAnim; + TrainDeath = orig->TrainDeath; +} + +void body_c::Evaluate(body_c *orig) +{ + currentmove = GetMmovePtr((int)orig->currentmove); + owner = GetEdictPtr((int)orig->owner); + currentMoveFinished = orig->currentMoveFinished; + holdCode = orig->holdCode; + frame_flags = orig->frame_flags; + emotion_expire = orig->emotion_expire; + emotion = orig->emotion; + emotionScripted = orig->emotionScripted; + rLastFireTime = orig->rLastFireTime; + lLastFireTime = orig->lLastFireTime; + InitialKilledTime = orig->InitialKilledTime; + LastKilledTime = orig->LastKilledTime; + lastStartTime = orig->lastStartTime; + LastDFlags = orig->LastDFlags; + ForceNextAnim = orig->ForceNextAnim; + TrainDeath = orig->TrainDeath; +} + +// ---------------------------------------------------------- + +/// Someone please put this in the right header +void EntToWorldMatrix(vec3_t org, vec3_t angles, Matrix4 &m); +extern Vect3 trStartKnarlyGilHack; + +body_heli::body_heli(edict_t* self) +{ + m_gunBarrelInst = NULL; + m_gunBarrelNULLInst = NULL; + m_gunnerHeadInst = NULL; + m_pilotHeadInst = NULL; + m_cockpitInst = NULL; + m_mainRotorInst = NULL; + m_tailRotorInst = NULL; + + m_fuselageObj = NULL; + m_gunBarrelObj = NULL; + m_mainRotorObj = NULL; + m_tailRotorObj = NULL; + + m_gunBolt = 0; + m_gunNULLBolt = 0; + m_gunnerHeadBolt = 0; + m_pilotHeadBolt = 0; + + m_mainRotorBoltInst = NULL; + m_tailRotorBoltInst = NULL; + + VectorClear(m_vGunBoltOffset); + VectorClear(m_vGunnerBoltOffset); + VectorClear(m_vPilotBoltOffset); + + m_bPilotDead = m_bGunnerDead = false; + + VectorClear(m_v3HeliDesiredPos_Start); + VectorClear(m_v3HeliDesiredPos_Stop); + VectorClear(m_v3HeliDesiredPos_Halfway); + VectorClear(m_v3HeliPadRestPos); + VectorClear(m_v3HeliFireAtCoords); + VectorClear(m_v3HeliDesiredPos_Smart); + VectorClear(m_v3HeliHeadStop); + VectorClear(m_v3HeliTraceMins); + VectorClear(m_v3HeliTraceMaxs); + + m_fHeliTurnStartYaw = 0; + m_fHeliMoveSpeed = 0; + m_fHeliFireAtTimer = 0; + m_fHeliFirePitch = 0; + m_fHeliHoverTimer = 0; + m_iHeliHealth = 100; + m_fRotorSoundTimer = 0; + + m_fLastDamageTime = 0.0f; + m_fHeliRocketFireDebounceTime = 0; + m_iHeliRocketsLeft = 8; + + m_nRandGunWait = 0; + m_bGunFiring = false; + m_bLOS = false; + m_bRotorEOS = false; + m_bFuselageEOS = false; + + // variables passed into script actions + m_target = NULL; + VectorClear(m_vPos); + m_fArg = 0.0f; + + m_flags = 0; + + m_iLastEntFoundIndex=0; + m_fLastGetEntTime=0; + m_AITarget=NULL; + m_fNewTargetTimer=0; + m_bFiring = 0; + + owner = NULL; + m_iHeliAITable = -1; + m_iHeliAIIndex = 0; + m_fSideStrafeDist = 0.0f; + m_iSideStrafeDir = 0.0f; + m_iWhichRandVolume = 0; + VectorClear(m_v3HeliFireAtCoords_Original); + m_fHeliAITimer = 0; + m_nCanopyHealth = 1; // 1 shot to kill the pilot with the sniper rifle + m_bCanBeSniped = true; +} + +//do all inst-related stuff here, rather than in constructor: ghoulInst won't exist when body gets alloc'd +void body_heli::SetHeliEdict(edict_t *self) +{ + if (NULL == self || NULL == self->ghoulInst) + { + return; + } + m_heli = self; + + GetHeliInst()->TurnCallBacksOn(level.time); +} + + +int body_heli::ShowDamage(edict_t &monster, edict_t *inflictor, + edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, + int damage, int knockback, int dflags, int mod, float penetrate, float absorb) +{ +// vec3_t bodyloc;//, footorigin; +// gz_info *frontHole=NULL; +// gz_code frontCode; +// gz_info *backHole=NULL; +// gz_code backCode; +// vec3_t bloodDir; +// vec3_t forward, right, up; +// vec3_t to_impact; +// float forward_back, right_left, up_down; +// kef ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); +// ggOinstC *blownInst; + int i; + int take; +// float curGoreDist,bestGoreDist,tdist; +// vec3_t EntryPos,ExitPos,tvec; + Vect3 zonePos; + Matrix4 ZoneMatrix; + + Matrix4 ToEnt,ToWorld; + EntToWorldMatrix(monster.s.origin,monster.s.angles,ToWorld); + //but we want to put the ray into ent space, need inverse + ToEnt.Inverse(ToWorld); + Vect3 EntDir,EntStart; + VectorCopy(origin,*((vec3_t*)&trStartKnarlyGilHack)); + ToEnt.XFormPoint(EntStart,trStartKnarlyGilHack); + ToEnt.XFormVect(EntDir,*(Vect3 *)dir); + + take = 0; + + Vect3 vNormal, vImpact, vSparksNormal, vSparksPos; + + typedef enum + { + hit_NONE = 0, + hit_COCKPIT, + hit_PILOT, + hit_GUNNER, + hit_FUSELAGE + } heliHit_e; + + heliHit_e whatDidIHit = hit_NONE; + +// kef int numHits=myInstance->GetInstPtr()->RayTrace(level.time,EntStart,EntDir,Hits,20); +// bullet_numHits = monster.ghoulInst->RayTrace(level.time,EntStart,EntDir,bullet_Hits,20); + //NO HITS!!! + if (bullet_numHits == 0) + { + return 0; + } + + qboolean bSniper = false; + + if (attacker && attacker->client && attacker->client->inv) + { + if ( (SFW_SNIPER == attacker->client->inv->getCurWeaponType()) && + (IsSnipeable()) ) + { + bSniper = true; + } + } + + //get entrance wound + for (i=0;i= --m_nCanopyHealth ) + { + // capped the pilot + m_bPilotDead = true; + break; + } + } + take = damage; + break; + case hit_GUNNER: + if (bSniper) + { + if ( 0 >= --m_nCanopyHealth ) + { + // capped the gunner + m_bGunnerDead = true; + break; + } + } + take = damage; + break; + case hit_COCKPIT: + take = damage; + break; + case hit_FUSELAGE: + take = (int)(0.1 * damage); + break; + } + + if (0 == take) + { + take = damage; + vNormal.Set(bullet_Hits[i].Normal[0], bullet_Hits[i].Normal[1], bullet_Hits[i].Normal[2]); + vImpact.Set(bullet_Hits[i].ContactPoint[0], bullet_Hits[i].ContactPoint[1], bullet_Hits[i].ContactPoint[2]); + } + + if (take && (level.time - m_fLastDamageTime) > 0.3f && !bSniper) + { + // make sparks at point of impact + ToWorld.XFormPoint(vSparksPos, vImpact); + ToWorld.XFormVect(vSparksNormal, vNormal); + FX_MakeSparks(*(vec3_t*)&vSparksPos, *(vec3_t*)&vNormal, gi.irand(0,2)); + // ricochet sounds are already precached in cacheweaponcommon() + gi.sound(&monster, CHAN_ENT1, gi.soundindex(va("Weapons/FX/Rics/ric%d.wav", gi.irand(1,6))), .9, ATTN_NORM, 0); + +// gi.sound (self, CHAN_ENT1, gi.soundindex("Impact/Surfs/Metal1.wav"), .6, ATTN_NORM, 0); + m_fLastDamageTime = level.time; + } + return take; +} + +void body_heli::UpdateSmoke(edict_t* self, float fHealthPercentage) +{ + IGhoulObj *obj = GetHeliInst()->GetGhoulObject(); + GhoulID smoke1 = (obj?obj->FindPart("smoke_engine"):NULL); + GhoulID smoke2 = (obj?obj->FindPart("smoke_tail"):NULL); + + if (NULL == smoke1 || NULL == smoke2) + { + return; + } + if (fHealthPercentage < 0) + { // turn off the smoke + fxRunner.stopContinualEffect("environ/helismoke", self, smoke1); + fxRunner.stopContinualEffect("environ/helismoke", self, smoke2); + } + else if (fHealthPercentage < 0.25f) + { + fxRunner.editContinualEffect("environ/helismoke", self, smoke1, 2); + fxRunner.editContinualEffect("environ/helismoke", self, smoke2, 1); + } + else if (fHealthPercentage < 0.5f) + { + fxRunner.editContinualEffect("environ/helismoke", self, smoke1, 1.5); + fxRunner.editContinualEffect("environ/helismoke", self, smoke2, .75); + } + else if (fHealthPercentage < 0.75f) + { + if (!fxRunner.hasEffect("environ/helismoke", self, smoke1)) + { + // prepare smoke effects for damage + smoke2 = obj->FindPart("smoke_tail"); + + fxRunner.execContinualEffect("environ/helismoke", self, smoke1); + fxRunner.execContinualEffect("environ/helismoke", self, smoke2); + } + fxRunner.editContinualEffect("environ/helismoke", self, smoke1, 1); + fxRunner.editContinualEffect("environ/helismoke", self, smoke2, 0.5); + } +} + +void body_heli::ChangeCockpitSkin(int nSkin) +{ + IGhoulObj* cockpitObj = GetCockpitInst()->GetGhoulObject(); + + if (NULL == cockpitObj) + { + return; + } + + GhoulID matID = cockpitObj->FindMaterial("canopy"); + GhoulID skinID = 0; + + switch(nSkin) + { + case HC_SKIN_GUNNER: + { + skinID = cockpitObj->FindSkin(matID, "glass_blood_fnt"); + break; + } + case HC_SKIN_PILOT: + { + skinID = cockpitObj->FindSkin(matID, "glass_blood_bk"); + break; + } + case HC_SKIN_BOTH: + { + skinID = cockpitObj->FindSkin(matID, "glass_bloody"); + break; + } + default: + { + break; + } + } + GetCockpitInst()->SetFrameOverride(matID, skinID); +} + +void body_heli::SetFiring(bool bFiring) +{ + if (m_bFiring = bFiring) + { + // turn on firing sequence + if (GetBarrelInst()) + { + SimpleModelSetSequence2(GetBarrelInst(), "barrel", SMSEQ_LOOP); + } + } + else + { + // turn off firing sequence + if (GetBarrelInst()) + { + SimpleModelSetSequence2(GetBarrelInst(), "barrel_still", SMSEQ_HOLD); + } + } +} + +body_heli::body_heli(body_heli *orig) +: body_c(orig) +{ + *(int *)&m_heli = GetEdictNum(orig->m_heli); + + m_gunBarrelInst.MakeIndex(orig->m_gunBarrelInst); + m_gunBarrelNULLInst.MakeIndex(orig->m_gunBarrelNULLInst); + m_gunnerHeadInst.MakeIndex(orig->m_gunnerHeadInst); + m_pilotHeadInst.MakeIndex(orig->m_pilotHeadInst); + m_cockpitInst.MakeIndex(orig->m_cockpitInst); + m_mainRotorInst.MakeIndex(orig->m_mainRotorInst); + m_tailRotorInst.MakeIndex(orig->m_tailRotorInst); + + m_fuselageObj.MakeIndex(orig->m_fuselageObj); + m_gunBarrelObj.MakeIndex(orig->m_gunBarrelObj); + m_mainRotorObj.MakeIndex(orig->m_mainRotorObj); + m_tailRotorObj.MakeIndex(orig->m_tailRotorObj); + + m_gunBolt = orig->m_gunBolt; + m_gunNULLBolt = orig->m_gunNULLBolt; + m_gunnerHeadBolt = orig->m_gunnerHeadBolt; + m_pilotHeadBolt = orig->m_pilotHeadBolt; + + m_mainRotorBoltInst.MakeIndex(orig->m_mainRotorBoltInst); + m_tailRotorBoltInst.MakeIndex(orig->m_tailRotorBoltInst); + + VectorCopy(orig->m_vGunBoltOffset, m_vGunBoltOffset); + VectorCopy(orig->m_vGunnerBoltOffset, m_vGunnerBoltOffset); + VectorCopy(orig->m_vPilotBoltOffset, m_vPilotBoltOffset); + + m_nCanopyHealth = orig->m_nCanopyHealth; + m_bPilotDead = orig->m_bPilotDead; + m_bGunnerDead = orig->m_bGunnerDead; + m_bFiring = orig->m_bFiring; + + VectorCopy(orig->m_v3HeliDesiredPos_Start,m_v3HeliDesiredPos_Start); + VectorCopy(orig->m_v3HeliDesiredPos_Stop,m_v3HeliDesiredPos_Stop); + VectorCopy(orig->m_v3HeliDesiredPos_Halfway,m_v3HeliDesiredPos_Halfway); + VectorCopy(orig->m_v3HeliPadRestPos, m_v3HeliPadRestPos); + VectorCopy(orig->m_v3HeliFireAtCoords, m_v3HeliFireAtCoords); + VectorCopy(orig->m_v3HeliDesiredPos_Smart, m_v3HeliDesiredPos_Smart); + VectorCopy(orig->m_v3HeliHeadStop, m_v3HeliHeadStop); + VectorCopy(orig->m_v3HeliTraceMins, m_v3HeliTraceMins); + VectorCopy(orig->m_v3HeliTraceMaxs, m_v3HeliTraceMaxs); + VectorCopy(orig->m_v3HeliDeathDest, m_v3HeliDeathDest); + + m_fHeliTurnStartYaw = orig->m_fHeliTurnStartYaw; + m_fHeliMoveSpeed = orig->m_fHeliMoveSpeed; + m_fHeliFireAtTimer = orig->m_fHeliFireAtTimer; + m_fHeliFirePitch = orig->m_fHeliFirePitch; + m_fHeliHoverTimer = orig->m_fHeliHoverTimer; + m_iHeliHealth = orig->m_iHeliHealth; + m_fRotorSoundTimer = orig->m_fRotorSoundTimer; + VectorCopy(orig->m_v3HeliFireAtCoords_Original, m_v3HeliFireAtCoords_Original); + m_fHeliAITimer = orig->m_fHeliAITimer; + m_iHeliAITable = orig->m_iHeliAITable; + m_iHeliAIIndex = orig->m_iHeliAIIndex; + + m_fLastDamageTime = orig->m_fLastDamageTime; + m_fHeliRocketFireDebounceTime = orig->m_fHeliRocketFireDebounceTime; + m_iHeliRocketsLeft = orig->m_iHeliRocketsLeft; + + m_nRandGunWait = orig->m_nRandGunWait; + m_bGunFiring = orig->m_bGunFiring; + m_bLOS = orig->m_bLOS; + m_bRotorEOS = orig->m_bRotorEOS; + m_bFuselageEOS = orig->m_bFuselageEOS; + + *(int *)&m_target = GetEdictNum(orig->m_target); + VectorCopy(orig->m_vPos, m_vPos); + m_fArg = orig->m_fArg; + + m_flags = orig->m_flags; + + m_iLastEntFoundIndex = orig->m_iLastEntFoundIndex; + m_fLastGetEntTime = orig->m_fLastGetEntTime; + *(int *)&m_AITarget = GetEdictNum(orig->m_AITarget); + m_fNewTargetTimer = orig->m_fNewTargetTimer; + m_fSideStrafeDist = orig->m_fSideStrafeDist; + m_iSideStrafeDir = orig->m_iSideStrafeDir; + m_iWhichRandVolume = orig->m_iWhichRandVolume; + m_fAIAggressiveness = orig->m_fAIAggressiveness; + + m_bCanBeSniped = orig->m_bCanBeSniped; +} + +void body_heli::Evaluate(body_heli *orig) +{ + m_heli = GetEdictPtr((int)orig->m_heli); + + m_gunBarrelInst.MakePtr(*(int *)&orig->m_gunBarrelInst); + m_gunBarrelNULLInst.MakePtr(*(int *)&orig->m_gunBarrelNULLInst); + m_gunnerHeadInst.MakePtr(*(int *)&orig->m_gunnerHeadInst); + m_pilotHeadInst.MakePtr(*(int *)&orig->m_pilotHeadInst); + m_cockpitInst.MakePtr(*(int *)&orig->m_cockpitInst); + m_mainRotorInst.MakePtr(*(int *)&orig->m_mainRotorInst); + m_tailRotorInst.MakePtr(*(int *)&orig->m_tailRotorInst); + + m_fuselageObj.MakePtr(*(int *)&orig->m_fuselageObj); + m_gunBarrelObj.MakePtr(*(int *)&orig->m_gunBarrelObj); + m_mainRotorObj.MakePtr(*(int *)&orig->m_mainRotorObj); + m_tailRotorObj.MakePtr(*(int *)&orig->m_tailRotorObj); + + m_gunBolt = orig->m_gunBolt; + m_gunNULLBolt = orig->m_gunNULLBolt; + m_gunnerHeadBolt = orig->m_gunnerHeadBolt; + m_pilotHeadBolt = orig->m_pilotHeadBolt; + + m_mainRotorBoltInst.MakePtr(*(int *)&orig->m_mainRotorBoltInst); + m_tailRotorBoltInst.MakePtr(*(int *)&orig->m_tailRotorBoltInst); + + VectorCopy(orig->m_vGunBoltOffset, m_vGunBoltOffset); + VectorCopy(orig->m_vGunnerBoltOffset, m_vGunnerBoltOffset); + VectorCopy(orig->m_vPilotBoltOffset, m_vPilotBoltOffset); + + m_nCanopyHealth = orig->m_nCanopyHealth; + m_bPilotDead = orig->m_bPilotDead; + m_bGunnerDead = orig->m_bGunnerDead; + m_bFiring = orig->m_bFiring; + + VectorCopy(orig->m_v3HeliDesiredPos_Start,m_v3HeliDesiredPos_Start); + VectorCopy(orig->m_v3HeliDesiredPos_Stop,m_v3HeliDesiredPos_Stop); + VectorCopy(orig->m_v3HeliDesiredPos_Halfway,m_v3HeliDesiredPos_Halfway); + VectorCopy(orig->m_v3HeliPadRestPos, m_v3HeliPadRestPos); + VectorCopy(orig->m_v3HeliFireAtCoords, m_v3HeliFireAtCoords); + VectorCopy(orig->m_v3HeliDesiredPos_Smart, m_v3HeliDesiredPos_Smart); + VectorCopy(orig->m_v3HeliHeadStop, m_v3HeliHeadStop); + VectorCopy(orig->m_v3HeliTraceMins, m_v3HeliTraceMins); + VectorCopy(orig->m_v3HeliTraceMaxs, m_v3HeliTraceMaxs); + VectorCopy(orig->m_v3HeliDeathDest, m_v3HeliDeathDest); + + m_fHeliTurnStartYaw = orig->m_fHeliTurnStartYaw; + m_fHeliMoveSpeed = orig->m_fHeliMoveSpeed; + m_fHeliFireAtTimer = orig->m_fHeliFireAtTimer; + m_fHeliFirePitch = orig->m_fHeliFirePitch; + m_fHeliHoverTimer = orig->m_fHeliHoverTimer; + m_iHeliHealth = orig->m_iHeliHealth; + m_fRotorSoundTimer = orig->m_fRotorSoundTimer; + VectorCopy(orig->m_v3HeliFireAtCoords_Original, m_v3HeliFireAtCoords_Original); + m_fHeliAITimer = orig->m_fHeliAITimer; + m_iHeliAITable = orig->m_iHeliAITable; + m_iHeliAIIndex = orig->m_iHeliAIIndex; + + m_fLastDamageTime = orig->m_fLastDamageTime; + m_fHeliRocketFireDebounceTime = orig->m_fHeliRocketFireDebounceTime; + m_iHeliRocketsLeft = orig->m_iHeliRocketsLeft; + + m_nRandGunWait = orig->m_nRandGunWait; + m_bGunFiring = orig->m_bGunFiring; + m_bLOS = orig->m_bLOS; + m_bRotorEOS = orig->m_bRotorEOS; + m_bFuselageEOS = orig->m_bFuselageEOS; + + m_target = GetEdictPtr((int)orig->m_target); + VectorCopy(orig->m_vPos, m_vPos); + m_fArg = orig->m_fArg; + + m_flags = orig->m_flags; + + m_iLastEntFoundIndex = orig->m_iLastEntFoundIndex; + m_fLastGetEntTime = orig->m_fLastGetEntTime; + m_AITarget = GetEdictPtr((int)orig->m_AITarget); + m_fNewTargetTimer = orig->m_fNewTargetTimer; + m_fSideStrafeDist = orig->m_fSideStrafeDist; + m_iSideStrafeDir = orig->m_iSideStrafeDir; + m_iWhichRandVolume = orig->m_iWhichRandVolume; + m_fAIAggressiveness = orig->m_fAIAggressiveness; + + m_bCanBeSniped = orig->m_bCanBeSniped; + body_c::Evaluate(orig); +} + +void body_heli::Read() +{ + char loaded[sizeof(body_heli)]; + + gi.ReadFromSavegame('HELI', loaded, sizeof(body_heli)); + Evaluate((body_heli *)loaded); +} + +void body_heli::Write() +{ + body_heli *savable; + + savable = new body_heli(this); + gi.AppendToSavegame('HELI', savable, sizeof(*this)); + delete savable; +} + +///////////////////////////////////////////////////////////////////// +// // +// tank stuff // +// // +///////////////////////////////////////////////////////////////////// + +body_tank::body_tank(edict_t* self) +{ + m_target = NULL; + VectorClear(m_vPos); + m_fArg = 0.0f; + + m_tank = NULL; // the tank body is the root object (hopefully) + m_turretInst = NULL; // the turret + m_cannonInst = NULL; // the barrel of the main gun + m_machGunInst = NULL; // the machine gun on the turret + m_machGunNullInst = NULL; // goes between machine gun and the turret + + m_tankObj = NULL; + m_turretObj = NULL; + + m_turretBolt = NULL_GhoulID; + m_cannonBolt = NULL_GhoulID; + m_machGunBolt = NULL_GhoulID; + m_machGunNullBolt = NULL_GhoulID; + + m_turretBoltInst = NULL; + m_bDeactivated = false; + m_bTreads = false; + m_bTreadFire = false; + m_fLastDamageTime = 0.0f; + m_fMaxYawSpeed = 20.0f; // degrees + m_fMaxFwdSpeed = 50.0f; + m_fTurretSpeed = 0.04f; // radians + m_fCannonSpeed = 0.03f; // radians + m_fMachGunSpeed = 0.05f; // radians + m_fShellFlightDist = 0.0f; // world units + m_nMachGunHealth = 150; + VectorClear(m_vGroundZero); +} + +//do all inst-related stuff here, rather than in constructor: ghoulInst won't exist when body gets alloc'd +void body_tank::SetTankEdict(edict_t *self) +{ + if (NULL == self || NULL == self->ghoulInst) + { + return; + } + m_tank = self; + GetTankInst()->TurnCallBacksOn(level.time); +} + +body_tank::body_tank(body_tank *orig) +: body_c(orig) +{ + *(int *)&m_target = GetEdictNum(orig->m_target); + VectorCopy(orig->m_vPos, m_vPos); + m_fArg = orig->m_fArg; + + *(int *)&m_tank = GetEdictNum(orig->m_tank); + + m_turretInst.MakeIndex(orig->m_turretInst); + m_cannonInst.MakeIndex(orig->m_cannonInst); + m_machGunInst.MakeIndex(orig->m_machGunInst); + m_machGunNullInst.MakeIndex(orig->m_machGunNullInst); + + m_tankObj.MakeIndex(orig->m_tankObj); + m_turretObj.MakeIndex(orig->m_turretObj); + + m_turretBolt = orig->m_turretBolt; + m_cannonBolt = orig->m_cannonBolt; + m_machGunBolt = orig->m_machGunBolt; + m_machGunNullBolt = orig->m_machGunNullBolt; + + m_turretBoltInst.MakeIndex(orig->m_turretBoltInst); + + m_bDeactivated = orig->m_bDeactivated; + m_bTreads = orig->m_bTreads; + m_bTreadFire = orig->m_bTreadFire; + m_fLastDamageTime = orig->m_fLastDamageTime; + + m_fMaxYawSpeed = orig->m_fMaxYawSpeed; + m_fMaxFwdSpeed = orig->m_fMaxFwdSpeed; + m_fTurretSpeed = orig->m_fTurretSpeed; + m_fCannonSpeed = orig->m_fCannonSpeed; + m_fMachGunSpeed = orig->m_fMachGunSpeed; + + m_fShellFlightDist = orig->m_fShellFlightDist; + m_nMachGunHealth = orig->m_nMachGunHealth; + VectorCopy(orig->m_vGroundZero, m_vGroundZero); +} + +void body_tank::Evaluate(body_tank *orig) +{ + m_target = GetEdictPtr((int)orig->m_target); + VectorCopy(orig->m_vPos, m_vPos); + m_fArg = orig->m_fArg; + + m_tank = GetEdictPtr((int)orig->m_tank); + + m_turretInst.MakePtr(*(int *)&orig->m_turretInst); + m_cannonInst.MakePtr(*(int *)&orig->m_cannonInst); + m_machGunInst.MakePtr(*(int *)&orig->m_machGunInst); + m_machGunNullInst.MakePtr(*(int *)&orig->m_machGunNullInst); + + m_tankObj.MakePtr(*(int *)&orig->m_tankObj); + m_turretObj.MakePtr(*(int *)&orig->m_turretObj); + + m_turretBolt = orig->m_turretBolt; + m_cannonBolt = orig->m_cannonBolt; + m_machGunBolt = orig->m_machGunBolt; + m_machGunNullBolt = orig->m_machGunNullBolt; + + m_turretBoltInst.MakePtr(*(int *)&orig->m_turretBoltInst); + + m_bDeactivated = orig->m_bDeactivated; + m_bTreads = orig->m_bTreads; + m_bTreadFire = orig->m_bTreadFire; + m_fLastDamageTime = orig->m_fLastDamageTime; + + m_fMaxYawSpeed = orig->m_fMaxYawSpeed; + m_fMaxFwdSpeed = orig->m_fMaxFwdSpeed; + m_fTurretSpeed = orig->m_fTurretSpeed; + m_fCannonSpeed = orig->m_fCannonSpeed; + m_fMachGunSpeed = orig->m_fMachGunSpeed; + + m_fShellFlightDist = orig->m_fShellFlightDist; + m_nMachGunHealth = orig->m_nMachGunHealth; + VectorCopy(orig->m_vGroundZero, m_vGroundZero); + + body_c::Evaluate(orig); +} + +void body_tank::Read() +{ + char loaded[sizeof(body_tank)]; + + gi.ReadFromSavegame('TANK', loaded, sizeof(body_tank)); + Evaluate((body_tank *)loaded); +} + +void body_tank::Write() +{ + body_tank *savable; + + savable = new body_tank(this); + gi.AppendToSavegame('TANK', savable, sizeof(*this)); + delete savable; +} + +void body_tank::SetTreads(bool bOn) +{ + if (m_bTreads = bOn) + { // set the treads in motion + SimpleModelSetSequence2(GetTankInst(), "tank", SMSEQ_LOOP); + } + else + { // stop the treads + SimpleModelSetSequence2(GetTankInst(), "tank", SMSEQ_HOLD); + } +} + +int body_tank::ShowDamage(edict_t &monster, edict_t *inflictor, + edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, + int damage, int knockback, int dflags, int mod, float penetrate, float absorb) +{ + int i; + int take; + Vect3 zonePos; + Matrix4 ZoneMatrix; + + Matrix4 ToEnt,ToWorld; + EntToWorldMatrix(monster.s.origin,monster.s.angles,ToWorld); + //but we want to put the ray into ent space, need inverse + ToEnt.Inverse(ToWorld); + Vect3 EntDir,EntStart; + VectorCopy(origin,*((vec3_t*)&trStartKnarlyGilHack)); + ToEnt.XFormPoint(EntStart,trStartKnarlyGilHack); + ToEnt.XFormVect(EntDir,*(Vect3 *)dir); + + take = 0; + + Vect3 vNormal, vImpact, vSparksNormal, vSparksPos; + + //NO HITS!!! + if (bullet_numHits == 0) + { + return 0; + } + + qboolean bSniper = false; + + if (attacker && attacker->client && attacker->client->inv) + { + // knives can't hurt tanks, silly. + if (SFW_KNIFE == attacker->client->inv->getCurWeaponType()) + { + return 0; + } + if (SFW_SNIPER == attacker->client->inv->getCurWeaponType()) + { + bSniper = true; + } + } + + //get entrance wound + for (i=0;i 0) + { + m_nMachGunHealth -= damage; + if (m_nMachGunHealth <= 0) + { + m_nMachGunHealth = 0; + // killed the machine gun -- attach a smoke effect + IGhoulObj *obj = bullet_Hits[i].Inst->GetGhoulObject(); + if (obj) + { + fxRunner.execWithInst("environ/machgun_smoke2", GetTankEdict(), + bullet_Hits[i].Inst, obj->FindPart("to_bolt_machine_gun")); + } + } + } + if (0 == take) + { + take = damage; + vNormal.Set(bullet_Hits[i].Normal[0], bullet_Hits[i].Normal[1], bullet_Hits[i].Normal[2]); + vImpact.Set(bullet_Hits[i].ContactPoint[0], bullet_Hits[i].ContactPoint[1], bullet_Hits[i].ContactPoint[2]); + } + } + } + + if (take && (level.time - m_fLastDamageTime) > 0.3f && !bSniper) + { + // make sparks at point of impact + ToWorld.XFormPoint(vSparksPos, vImpact); + ToWorld.XFormVect(vSparksNormal, vNormal); + FX_MakeSparks(*(vec3_t*)&vSparksPos, *(vec3_t*)&vNormal, gi.irand(0,2)); + m_fLastDamageTime = level.time; + } + return take; +} + +void body_tank::UpdateSmoke(edict_t* self, float fHealthPercentage) +{ + // presumably we'll eventually want a visible indication of damage (like the heli) +} + + +///////////////////////////////////////////////////////////////////// +// // +// snowcat stuff // +// // +///////////////////////////////////////////////////////////////////// + +body_snowcat::body_snowcat(edict_t* self) +:body_tank(self) +{ + m_machGun2Inst = NULL; // the second machine gun on the turret + m_leftHeadLightInst = NULL; + m_rightHeadLightInst = NULL; + + m_machGun2Bolt = NULL_GhoulID; + m_leftHeadLightBolt = NULL_GhoulID; + m_rightHeadLightBolt = NULL_GhoulID; + + m_fMaxYawSpeed = 30.0f; // degrees + m_fMaxFwdSpeed = 70.0f; + m_fTurretSpeed = 0.06f+(game.playerSkills.getEnemyValue()*.01); // radians + m_fCannonSpeed = 0.00f; // radians (no cannon for the snowcat) + m_fMachGunSpeed = 0.00f; // radians (no separate mach gun for the snowcat) + m_fShellFlightDist = 0.0f; // world units + m_nMachGunHealth = 150; +} + +body_snowcat::body_snowcat(body_snowcat *orig) +: body_tank(orig) +{ + m_machGun2Inst.MakeIndex(orig->m_machGun2Inst); + m_leftHeadLightInst.MakeIndex(orig->m_leftHeadLightInst); + m_rightHeadLightInst.MakeIndex(orig->m_rightHeadLightInst); + + m_machGun2Bolt = orig->m_machGun2Bolt; + m_leftHeadLightBolt = orig->m_leftHeadLightBolt; + m_rightHeadLightBolt = orig->m_rightHeadLightBolt; +} + +void body_snowcat::SetTreads(bool bOn) +{ + GhoulID cBolterBolt=0; + IGhoulObj *boltObj = NULL; + + if (m_bTreads = bOn) + { // set the treads in motion + SimpleModelSetSequence2(GetTankInst(), "body", SMSEQ_LOOP); + // turn on snowspray effect + if ( m_tank->ghoulInst && (boltObj = m_tank->ghoulInst->GetGhoulObject()) ) + { + // left + if (cBolterBolt = boltObj->FindPart("snow_effect_left")) + { + fxRunner.execContinualEffect("environ/snowspray", m_tank, cBolterBolt); + } + // right + if (cBolterBolt = boltObj->FindPart("snow_effect_right")) + { + fxRunner.execContinualEffect("environ/snowspray", m_tank, cBolterBolt); + } + } + } + else + { // stop the treads + SimpleModelSetSequence2(GetTankInst(), "body", SMSEQ_HOLD); + // turn off snowspray effect + if ( m_tank->ghoulInst && (boltObj = m_tank->ghoulInst->GetGhoulObject()) ) + { + // left + if (cBolterBolt = boltObj->FindPart("snow_effect_left")) + { + fxRunner.stopContinualEffect("environ/snowspray", m_tank, cBolterBolt); + } + // right + if (cBolterBolt = boltObj->FindPart("snow_effect_right")) + { + fxRunner.stopContinualEffect("environ/snowspray", m_tank, cBolterBolt); + } + } + } +} + +void body_snowcat::Evaluate(body_snowcat *orig) +{ + m_machGun2Inst.MakePtr(*(int *)&orig->m_machGun2Inst); + m_leftHeadLightInst.MakePtr(*(int *)&orig->m_leftHeadLightInst); + m_rightHeadLightInst.MakePtr(*(int *)&orig->m_rightHeadLightInst); + + m_machGun2Bolt = orig->m_machGun2Bolt; + m_leftHeadLightBolt = orig->m_leftHeadLightBolt; + m_rightHeadLightBolt = orig->m_rightHeadLightBolt; + + // gotta have this at the end of body_snowcat::Evaluate() cuz it calls + //body_c::Evaluate() + body_tank::Evaluate(orig); +} + +void body_snowcat::Read() +{ + char loaded[sizeof(body_snowcat)]; + + gi.ReadFromSavegame('SCAT', loaded, sizeof(body_snowcat)); + Evaluate((body_snowcat *)loaded); +} + +void body_snowcat::Write() +{ + body_snowcat *savable; + + savable = new body_snowcat(this); + gi.AppendToSavegame('SCAT', savable, sizeof(*this)); + delete savable; +} + +void body_snowcat::UpdateSmoke(edict_t* self, float fHealthPercentage) +{ + // presumably we'll eventually want a visible indication of damage (like the heli) +} + +void body_snowcat::Deactivate(bool bDeactivate) +{ + GhoulID cBolterBolt=0; + IGhoulObj *boltObj = NULL; + + if (m_bDeactivated = bDeactivate) + { // we're deactive so turn off headlights and exhaust + + // turn off beams + SimpleModelTurnOnOff(GetLeftHeadLightInst(), false); + SimpleModelTurnOnOff(GetRightHeadLightInst(), false); + // headlights + SimpleModelRemoveObject(m_tank, "front_left"); + SimpleModelRemoveObject(m_tank, "front_right"); + // taillights + SimpleModelRemoveObject(m_tank, "rear_left"); + SimpleModelRemoveObject(m_tank, "rear_right"); + // exhaust effects + if (m_tank->ghoulInst && (boltObj = m_tank->ghoulInst->GetGhoulObject()) ) + { + // left + if (cBolterBolt = boltObj->FindPart("exhuast_left")) // love Joe's spelling of exhaust + { + fxRunner.stopContinualEffect("environ/kf_exhaust01", m_tank, cBolterBolt); + } + // right + if (cBolterBolt = boltObj->FindPart("exhuast_right")) // love Joe's spelling of exhaust + { + fxRunner.stopContinualEffect("environ/kf_exhaust01", m_tank, cBolterBolt); + } + } + } + else + { // we're live so turn on headlights and exhaust + + // turn on beams + SimpleModelTurnOnOff(GetLeftHeadLightInst(), true); + SimpleModelTurnOnOff(GetRightHeadLightInst(), true); + // headlights + SimpleModelAddObject(m_tank, "front_left"); + SimpleModelAddObject(m_tank, "front_right"); + // taillights + SimpleModelAddObject(m_tank, "rear_left"); + SimpleModelAddObject(m_tank, "rear_right"); + // exhaust effects + if (m_tank->ghoulInst && (boltObj = m_tank->ghoulInst->GetGhoulObject()) ) + { + // left + if (cBolterBolt = boltObj->FindPart("exhuast_left")) // love Joe's spelling of exhaust + { + fxRunner.execContinualEffect("environ/kf_exhaust01", m_tank, cBolterBolt, 0); + } + // right + if (cBolterBolt = boltObj->FindPart("exhuast_right")) // love Joe's spelling of exhaust + { + fxRunner.execContinualEffect("environ/kf_exhaust01", m_tank, cBolterBolt, 0); + } + } + } +} diff --git a/Source/Game/gamecpp/ai_body.h b/Source/Game/gamecpp/ai_body.h new file mode 100644 index 0000000..2d1a0eb --- /dev/null +++ b/Source/Game/gamecpp/ai_body.h @@ -0,0 +1,556 @@ +enum +{ + BODY, + BODY_HUMAN, + BODY_DOG, + BODY_MESO, + BODY_ECTO, + BODY_HUSKY, + BODY_ROTT, + BODY_ORGANIC, + BODY_FEMALE, + BODY_HELI, + BODY_TANK, + BODY_SNOWCAT, + BODY_COW, + BODY_DEKKER +}; + +typedef enum +{ + HOLDCODE_NO, + HOLDCODE_INAIR, + HOLDCODE_GIBBED, +} hold_code; + +typedef enum +{ + ACTSUB_ATTITUDE, + ACTSUB_FEAR, + ACTSUB_NORMAL, +} actionsub_code; + +typedef enum +{ + ARMOR_NONE, + ARMOR_CHEST, + ARMOR_CHESTLIMBS, + ARMOR_FULL, + ARMOR_SOMEWHAT_TOUGH,//eric wants weaker flamethrower guys + ARMOR_TOUGH +} armor_code; + +enum deathvoice_code +{ + DEATHVOICE_DEFAULT, + DEATHVOICE_SKINHEAD, + DEATHVOICE_ARAB, + DEATHVOICE_RUSSIAN, + DEATHVOICE_ASIAN, + DEATHVOICE_FEMALE, + DEATHVOICE_RAIDER, + DEATHVOICE_PLAYER//special deathvoice that overrides directory-chooser and specifies its directory explicitly +}; + +class body_c +{ +protected: + mmove_t *currentmove; + edict_t *owner; + qboolean currentMoveFinished; + hold_code holdCode; + int frame_flags; + float emotion_expire; + emotion_index emotion; + qboolean emotionScripted; + float rLastFireTime; + float lLastFireTime; + float InitialKilledTime;//the time the guy is first killed + float LastKilledTime;//the most recent time he was killed + float lastStartTime;//last time i started an animation at... + int LastDFlags; + bool ForceNextAnim; + bool TrainDeath; // horrible awful hack put in by me... somebody come up with something cool, please! dk + + virtual qboolean PlayAnimation(edict_t &monster, mmove_t *newanim, bool forceRestart); + + + virtual attacks_e GetWeaponAtBolt(edict_t &monster, char *boltname){return ATK_NOTHING;} + float FireInterval(attacks_e weaponType, int curAmmo); + +public: + + virtual void VoiceSound(char *base, edict_t &monster, int num, float vol = 1.0){} + virtual void VoiceWakeSound(edict_t &monster, float vol = .6){} + + GhoulID GetSequence(edict_t &monster, mmove_t *newanim); + //this getsequencefor... is different from the others in that it actually creates an action--the others just return what move they prefer + //also, the parameters passed in are very subject to change; the other getsequencefor...'s are pretty much set. + virtual mmove_t *GetSequenceForDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;} + virtual mmove_t *GetSequenceForPain(edict_t &monster, vec3_t point, float kick, int damage, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;} + + virtual mmove_t *GetSequenceForMovement(edict_t &monster, vec3_t dest, vec3_t face, vec3_t org, vec3_t ang, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;} + virtual mmove_t *GetSequenceForStand(edict_t &monster, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;} + virtual mmove_t *GetSequenceForJump(edict_t &monster, vec3_t dest, vec3_t face, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;} + virtual mmove_t *GetSequenceForAttack(edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;} + virtual mmove_t *GetSequenceForDodge(edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int leftSide = 0, int reject_actionflags=0){return NULL;} + virtual mmove_t *GetSequenceForReload(edict_t &monster, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;} + virtual mmove_t *GetPostShootSequence(edict_t &monster, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;} + + virtual bool IsInStationaryDeathAnim() { return false; } + + virtual void UseMonster(edict_t &monster, edict_t *user){} + virtual void TouchMonster(edict_t &monster, edict_t *user){} + + virtual void RightStep(edict_t &monster){} + virtual void LeftStep(edict_t &monster){} + + virtual void Drip(edict_t &monster){} + + virtual qboolean IsAvailableSequence(edict_t &monster, mmove_t *newanim); + virtual qboolean MatchAnimation(edict_t &monster, mmove_t *newanim); + virtual qboolean SetAnimation(edict_t &monster, mmove_t *newanim); + virtual qboolean ForceAnimation(edict_t &monster, mmove_t *newanim); + virtual void HoldAnimation(edict_t &monster, hold_code whyHold, float holdTime); + virtual void ResumeAnimation(edict_t &monster); + qboolean ApplySkin(edict_t &monster, ggOinstC *myInstance, char *matName, char *skinName); + + void SetMove(mmove_t *newmove){currentmove = newmove;} + virtual void FinishMove(edict_t &monster); + virtual void SetFlags(edict_t & monster, int newflags){frame_flags|=newflags;} + + virtual qboolean IsAnimationFinished(); + //this is Very similar to IsAnimationFinished, but ignores whether anim is looping or not--because of low-frame anim silliness, you normally want to use IsAnimationFinished. + virtual qboolean HasAnimationHitEOS(); + + virtual qboolean IsAnimationHeld(hold_code queryCode); + virtual qboolean IsAnimationReversed(); + virtual void NextMovement(edict_t &monster, vec3_t curDist, float scale); + virtual void NextTurn(float scale, edict_t &monster, float default_turn, turninfo_s &turninfo); + virtual int NextFlags(edict_t &monster); + mmove_t *GetMove(void){return currentmove;} + + virtual void SetRootBolt(edict_t &monster){} + virtual void SetArmor(edict_t &monster, armor_code newarmor){} + virtual armor_code GetArmorCode() { return ARMOR_NONE; } + virtual float GetArmorPercentRemaining() { return 0; } + virtual void StripArmor(){} + + virtual int ShowDamage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb){return damage;} + + weapons_t GetWeaponType(ggBinstC *weapon); + attacks_e GetWeaponAttackType(ggBinstC *weapon); + + //set my specific and general directories + virtual void SetVoiceDirectories(edict_t &monster, const char *base, int possible_varieties, deathvoice_code death, char *deathdir=NULL){} + + //forceFireRate will not fire the gun if it's been fired more recently than design doc says that kind of gun should fire. + virtual void FirePrimaryWeapon(edict_t &monster, bool lethal = false, int NullTarget = 0, qboolean forceFireRate = false) { FireRightHandWeapon(monster, lethal, NullTarget, forceFireRate); } + virtual void FireRightHandWeapon(edict_t &monster, bool isLethal = false, int NullTarget = 0, qboolean forceFireRate = false); + virtual qboolean RightHandWeaponReady(edict_t &monster); + virtual void ThrowProjectile(edict_t &monster){} + + virtual attacks_e GetRightHandWeapon(edict_t &monster){return ATK_NOTHING;} + virtual attacks_e GetLeftHandWeapon(edict_t &monster){return ATK_NOTHING;} + + virtual void SetRightHandWeapon(edict_t &monster, attacks_e newRightWeap){} + virtual void SetLeftHandWeapon(edict_t &monster, attacks_e newLeftWeap){} + + virtual attacks_e GetBestWeapon(edict_t &monster){return ATK_NOTHING;} + + void Emote(edict_t &monster, emotion_index new_emotion, float emotion_duration, qboolean scripted_emoting=false); + emotion_index GetMood(edict_t &monster); + virtual void UpdateFace(edict_t &monster); + virtual void SetFace(edict_t &monster, char *face){} + + virtual ggBinstC *AddBoltedItem(edict_t &monster, GhoulID mybolt, ggObjC *gun, char *itemSeq, GhoulID itemBolt, ggOinstC *myInstance, char *itemSkinName=NULL, float scale = 1.0); + virtual ggBinstC *AddBoltedItem(edict_t &monster, GhoulID myBolt, char *itemClass, char *itemSeq, GhoulID itemBolt, ggOinstC *myInstance, char *itemSkinName=NULL, float scale = 1.0); + virtual ggBinstC *AddBoltedItem(edict_t &monster, GhoulID myBolt, char *itemClass, char *itemSeq, char *itemBolt, ggOinstC *myInstance, char *itemSkinName=NULL, float scale = 1.0); + virtual ggBinstC *AddBoltedItem(edict_t &monster, char *myBolt, char *itemClass, char *itemSeq, char *itemBolt, ggOinstC *myInstance, char *itemSkinName=NULL, float scale = 1.0); + virtual qboolean AddRandomBoltedItem(float percent_chance, edict_t &monster, char *myBolt, char *itemClass, char *itemSeq, char *itemBolt, ggOinstC *myInstance, char *itemSkinName=NULL, float scale = 1.0); + virtual int DropBoltOn(edict_t &monster, ggBinstC *boltedptr, Vect3 &pos, Vect3 &Direction, int damage, edict_t *attacker = NULL){return damage;} + virtual void FreeKnives(edict_t &monster){} + + virtual void SetVocalCordsWorking(bool bCords) {} + + body_c(); + virtual ~body_c(){} + + virtual void MakeRetreatNoise(edict_t &monster){} + + virtual float GetLastKilledTime(){return LastKilledTime;}; + virtual float GetInitialKilledTime(){return InitialKilledTime;}; + virtual void SetLastKilledTime(float time){LastKilledTime = time;}; + virtual void SetInitialKilledTime(float time){InitialKilledTime = time;}; + virtual int GetLastDFlags(){return LastDFlags;}; + virtual void SetLastDFlags(int flags){LastDFlags = flags;}; + virtual bool GetTrainDeath(){return TrainDeath;}; + virtual void SetTrainDeath(bool condition){TrainDeath = condition;}; + + virtual int TestDamage(void){return 0;} + + virtual int GetClassCode(void){return BODY;}//this should be different for everybody in this class family + virtual int IsMovementImpeded(void){return 0;} +static body_c *NewClassForCode(int code); + + void SetOwner(edict_t *own) { owner = own; } + + body_c(body_c *orig); + virtual void Evaluate(body_c *orig); + virtual void Write(void) { assert(0); } + virtual void Read(void) { assert(0); } +}; + +// skins for bloodying the cockpit after the gunner or pilot gets sniped +#define HC_SKIN_GUNNER 1 +#define HC_SKIN_PILOT 2 +#define HC_SKIN_BOTH 3 + + +class body_heli : public body_c +{ +private: + edict_t *m_heli; + gg_binst_c_ptr m_gunBarrelInst; + gg_binst_c_ptr m_gunBarrelNULLInst; + gg_binst_c_ptr m_gunnerHeadInst; + gg_binst_c_ptr m_pilotHeadInst; + gg_binst_c_ptr m_cockpitInst; + gg_binst_c_ptr m_mainRotorInst; + gg_binst_c_ptr m_tailRotorInst; + + gg_obj_c_ptr m_fuselageObj; + gg_obj_c_ptr m_gunBarrelObj; + gg_obj_c_ptr m_mainRotorObj; + gg_obj_c_ptr m_tailRotorObj; + + GhoulID m_gunBolt; + GhoulID m_gunNULLBolt; + GhoulID m_gunnerHeadBolt; + GhoulID m_pilotHeadBolt; + + gg_binst_c_ptr m_mainRotorBoltInst; + gg_binst_c_ptr m_tailRotorBoltInst; + + vec3_t m_vGunBoltOffset; + vec3_t m_vGunnerBoltOffset; + vec3_t m_vPilotBoltOffset; + + int m_nCanopyHealth; // for use with sniper rifle shots + qboolean m_bPilotDead; + qboolean m_bGunnerDead; + bool m_bFiring; // used by Cobra2_ToggleGun + + bool m_bCanBeSniped; +public: + // kef -- gotta make a lot of the heli's member variables public for now cuz + //it'd take about 57 man-months to change Ste's movement code to access them + //through public functions + vec3_t m_v3HeliDesiredPos_Start; + vec3_t m_v3HeliDesiredPos_Stop; + vec3_t m_v3HeliDesiredPos_Halfway; + vec3_t m_v3HeliPadRestPos; + vec3_t m_v3HeliFireAtCoords; + vec3_t m_v3HeliDesiredPos_Smart; + vec3_t m_v3HeliHeadStop; + vec3_t m_v3HeliTraceMins; + vec3_t m_v3HeliTraceMaxs; + vec3_t m_v3HeliDeathDest; + + float m_fHeliTurnStartYaw; + float m_fHeliMoveSpeed; + float m_fHeliFireAtTimer; + float m_fHeliFirePitch; + float m_fHeliHoverTimer; + int m_iHeliHealth; + float m_fRotorSoundTimer; + vec3_t m_v3HeliFireAtCoords_Original;// + float m_fHeliAITimer;// + int m_iHeliAITable;// + int m_iHeliAIIndex;// + + float m_fLastDamageTime; + float m_fHeliRocketFireDebounceTime; + int m_iHeliRocketsLeft; // 0..HELI_MAX_ROCKETS + + int m_nRandGunWait; + qboolean m_bGunFiring; + qboolean m_bLOS; + qboolean m_bRotorEOS; + qboolean m_bFuselageEOS; + + // variables passed into script actions + edict_t *m_target; + vec3_t m_vPos; + float m_fArg; + + int m_flags; + + // vars for heli's internal keep-itself-busy-when-not-scripted AI... + // + int m_iLastEntFoundIndex; + float m_fLastGetEntTime; + edict_t *m_AITarget; + float m_fNewTargetTimer; + float m_fSideStrafeDist; // + int m_iSideStrafeDir; // 0,1,2,3 clockwise from North + int m_iWhichRandVolume; // for AI type 3 logic + float m_fAIAggressiveness; // this needs to actually be set somewhere in the spawner, should be in range 0..10 + + body_heli() {} + body_heli(edict_t* self); + + int GetFlags() { return m_flags; } + virtual void SetFlags(edict_t & monster, int newflags) { m_flags = newflags; } + + edict_t *GetHeliEdict() { return m_heli; } + void SetHeliEdict(edict_t *monster); + void SetBarrelInst(ggBinstC* inst) { m_gunBarrelInst = inst; } + void SetBarrelNULLInst(ggBinstC* inst) { m_gunBarrelNULLInst = inst; } + void SetGunnerInst(ggBinstC* inst) { m_gunnerHeadInst = inst; } + void SetPilotInst(ggBinstC* inst) { m_pilotHeadInst = inst; } + void SetCockpitInst(ggBinstC* inst) { m_cockpitInst = inst; } + void SetMainRotorInst(ggBinstC* inst) { m_mainRotorInst = inst; } + void SetTailRotorInst(ggBinstC* inst) { m_tailRotorInst = inst; } + + void SetFuselageObj(ggObjC* obj) { m_fuselageObj = obj; } + void SetBarrelObj(ggObjC* obj) { m_gunBarrelObj = obj; } + void SetMainRotorObj(ggObjC* obj) { m_mainRotorObj = obj; } + void SetTailRotorObj(ggObjC* obj) { m_tailRotorObj = obj; } + + void SetBarrelBolt(GhoulID bolt) { m_gunBolt = bolt; } + void SetBarrelNULLBolt(GhoulID bolt) { m_gunNULLBolt = bolt; } + void SetGunnerBolt(GhoulID bolt) { m_gunnerHeadBolt = bolt; } + void SetPilotBolt(GhoulID bolt) { m_pilotHeadBolt = bolt; } + + void SetMainRotorBoltInst(ggBinstC* inst) { m_mainRotorBoltInst = inst; } + void SetTailRotorBoltInst(ggBinstC* inst) { m_tailRotorBoltInst = inst; } + + void SetGunBoltOffset(vec3_t vOffset) { VectorCopy(vOffset, m_vGunBoltOffset); } + void SetGunBoltOffset(float x, float y, float z) { VectorSet(m_vGunBoltOffset, x, y, z); } + void SetGunnerBoltOffset(vec3_t vOffset) { VectorCopy(vOffset, m_vGunnerBoltOffset); } + void SetGunnerBoltOffset(float x, float y, float z) { VectorSet(m_vGunnerBoltOffset, x, y, z); } + void SetPilotBoltOffset(vec3_t vOffset) { VectorCopy(vOffset, m_vPilotBoltOffset); } + void SetPilotBoltOffset(float x, float y, float z) { VectorSet(m_vPilotBoltOffset, x, y, z); } + + IGhoulInst* GetHeliInst() { if (m_heli) return m_heli->ghoulInst; return NULL; } + IGhoulInst* GetBarrelInst() { if (m_gunBarrelInst) return m_gunBarrelInst->GetInstPtr(); return NULL;} + IGhoulInst* GetBarrelNULLInst() { if (m_gunBarrelNULLInst) return m_gunBarrelNULLInst->GetInstPtr(); return NULL;} + IGhoulInst* GetGunnerInst() { if (m_gunnerHeadInst) return m_gunnerHeadInst->GetInstPtr(); return NULL;} + IGhoulInst* GetPilotInst() { if (m_pilotHeadInst) return m_pilotHeadInst->GetInstPtr(); return NULL; } + IGhoulInst* GetCockpitInst() { if (m_cockpitInst) return m_cockpitInst->GetInstPtr(); return NULL;} + IGhoulInst* GetMainRotorInst() { if (m_mainRotorInst) return m_mainRotorInst->GetInstPtr(); return NULL;} + IGhoulInst* GetTailRotorInst() { if (m_tailRotorInst) return m_tailRotorInst->GetInstPtr(); return NULL;} + + ggObjC* GetFuselageObj() { return m_fuselageObj; } + ggObjC* GetBarrelObj() { return m_gunBarrelObj; } + ggObjC* GetMainRotorObj() { return m_mainRotorObj; } + ggObjC* GetTailRotorObj() { return m_tailRotorObj; } + + GhoulID GetBarrelBolt() { return m_gunBolt; } + GhoulID GetBarrelNULLBolt() { return m_gunNULLBolt; } + GhoulID GetGunnerBolt() { return m_gunnerHeadBolt; } + GhoulID GetPilotBolt() { return m_pilotHeadBolt; } + + ggBinstC* GetMainRotorBoltInst() { return m_mainRotorBoltInst; } + ggBinstC* GetTailRotorBoltInst() { return m_tailRotorBoltInst; } + + void GetGunBoltOffset(vec3_t vOut) { VectorCopy(m_vGunBoltOffset, vOut); } + void GetGunnerBoltOffset(vec3_t vOut) { VectorCopy(m_vGunnerBoltOffset, vOut); } + void GetPilotBoltOffset(vec3_t vOut) { VectorCopy(m_vPilotBoltOffset, vOut); } + + + qboolean SetRotorEOS(qboolean b) { qboolean bOld = m_bRotorEOS; m_bRotorEOS = b; return bOld; } + qboolean GetRotorEOS() { return m_bRotorEOS; } + + qboolean SetFuselageEOS(qboolean b) { qboolean bOld = m_bFuselageEOS; m_bFuselageEOS = b; return bOld; } + qboolean GetFuselageEOS() { return m_bFuselageEOS; } + + void SetPosStart(vec3_t vPos) { VectorCopy(vPos, m_v3HeliDesiredPos_Start); } + void SetPosStop(vec3_t vPos) { VectorCopy(vPos, m_v3HeliDesiredPos_Stop); } + void SetPosHalfway(vec3_t vPos) { VectorCopy(vPos, m_v3HeliDesiredPos_Halfway); } + void GetPosStart(vec3_t vPos) { VectorCopy(m_v3HeliDesiredPos_Start, vPos); } + void GetPosStop(vec3_t vPos) { VectorCopy(m_v3HeliDesiredPos_Stop, vPos); } + void GetPosHalfway(vec3_t vPos) { VectorCopy(m_v3HeliDesiredPos_Halfway, vPos); } + + void SetStartYaw(float fYaw) { m_fHeliTurnStartYaw = fYaw; } + float GetStartYaw() { return m_fHeliTurnStartYaw; } + + virtual int ShowDamage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb); + virtual void UpdateSmoke(edict_t* self, float fHealthPercentage); + + void ResetScriptParams() {m_target = NULL; VectorSet(m_vPos,0,0,0); m_fArg = 0;} + + qboolean IsPilotDead() { return m_bPilotDead; } + qboolean IsGunnerDead() { return m_bGunnerDead; } + + void ChangeCockpitSkin(int nSkin); + void SetFiring(bool bFiring); + bool IsFiring() { return m_bFiring; } + + void SetSnipeability(bool bSnipeable) { m_bCanBeSniped = bSnipeable; } + bool IsSnipeable() { return m_bCanBeSniped; } + + virtual int GetClassCode(void){return BODY_HELI;}//this should be different for everybody in this class family +static body_heli *NewClassForCode(int code); + + body_heli(body_heli *orig); + virtual void Evaluate(body_heli *orig); + virtual void Write(); + virtual void Read(); +}; + +class body_tank : public body_c +{ +public: + // variables passed into script actions + edict_t *m_target; + vec3_t m_vPos; + float m_fArg; + +protected: + edict_t *m_tank; // the tank body is the root object (hopefully) + gg_binst_c_ptr m_turretInst; // the turret + gg_binst_c_ptr m_cannonInst; // the barrel of the main gun + gg_binst_c_ptr m_machGunInst; // the machine gun on the turret + gg_binst_c_ptr m_machGunNullInst; // between machine gun and the turret + + gg_obj_c_ptr m_tankObj; + gg_obj_c_ptr m_turretObj; + + GhoulID m_turretBolt; + GhoulID m_cannonBolt; + GhoulID m_machGunBolt; + GhoulID m_machGunNullBolt; + + gg_binst_c_ptr m_turretBoltInst; + + bool m_bDeactivated; + bool m_bTreads; + bool m_bTreadFire; + float m_fLastDamageTime; + + float m_fMaxYawSpeed; + float m_fMaxFwdSpeed; + float m_fTurretSpeed; + float m_fCannonSpeed; + float m_fMachGunSpeed; + + float m_fShellFlightDist; + int m_nMachGunHealth; + vec3_t m_vGroundZero; +public: + body_tank() {} + body_tank(edict_t* self); + + void SetTankEdict(edict_t *monster); + void SetTurretInst(ggBinstC* inst) { m_turretInst = inst; } + void SetCannonInst(ggBinstC* inst) { m_cannonInst = inst; } + void SetMachGunInst(ggBinstC* inst) { m_machGunInst = inst; } + void SetMachGunNullInst(ggBinstC* inst) { m_machGunNullInst = inst; } + + void SetTankObj(ggObjC* obj) { m_tankObj = obj; } + void SetTurretObj(ggObjC* obj) { m_turretObj = obj; } + + void SetTurretBolt(GhoulID bolt) { m_turretBolt = bolt; } + void SetCannonBolt(GhoulID bolt) { m_cannonBolt = bolt; } + void SetMachGunBolt(GhoulID bolt) { m_machGunBolt = bolt; } + void SetMachGunNullBolt(GhoulID bolt) { m_machGunNullBolt = bolt; } + + void SetTurretBoltInst(ggBinstC* inst) { m_turretBoltInst = inst; } + + edict_t* GetTankEdict() { return m_tank; } + IGhoulInst* GetTankInst() { if (m_tank) return m_tank->ghoulInst; return NULL; } + IGhoulInst* GetTurretInst() { if (m_turretInst) return m_turretInst->GetInstPtr(); return NULL;} + IGhoulInst* GetCannonInst() { if (m_cannonInst) return m_cannonInst->GetInstPtr(); return NULL;} + IGhoulInst* GetMachGunInst() { if (m_machGunInst) return m_machGunInst->GetInstPtr(); return NULL;} + IGhoulInst* GetMachGunNullInst() { if (m_machGunNullInst) return m_machGunNullInst->GetInstPtr(); return NULL;} + + ggObjC* GetTankObj() { return m_tankObj; } + ggObjC* GetTurretObj() { return m_turretObj; } + + GhoulID GetTurretBolt() { return m_turretBolt; } + GhoulID GetCannonBolt() { return m_cannonBolt; } + GhoulID GetMachGunBolt() { return m_machGunBolt; } + GhoulID GetMachGunNullBolt() { return m_machGunNullBolt; } + + ggBinstC* GetTurretBoltInst() { return m_turretBoltInst;} + + virtual void SetTreads(bool bOn); + bool GetTreads() { return m_bTreads; } + void SetTreadFire(bool bOn) { m_bTreadFire = bOn; } + bool GetTreadFire() { return m_bTreadFire; } + virtual void Deactivate(bool bDeactivate) { m_bDeactivated = bDeactivate; } + bool IsDeactivated() { return m_bDeactivated; } + + virtual int ShowDamage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb); + virtual void UpdateSmoke(edict_t* self, float fHealthPercentage); + + void ResetScriptParams() {m_target = NULL; VectorSet(m_vPos,0,0,0); m_fArg = 0;} + float GetMaxYawSpeed() { return m_fMaxYawSpeed; } // degrees + float GetMaxFwdSpeed() { return m_fMaxFwdSpeed; } // tank speed + float GetTurretSpeed() { return m_fTurretSpeed; } // yaw, in radians + float GetCannonSpeed() { return m_fCannonSpeed; } // pitch, in radians + float GetMachGunSpeed() { return m_fMachGunSpeed; } // pitch and yaw, in radians + float GetCurProjectileDist() { return m_fShellFlightDist; } + void SetCurProjectileDist(float fDist) { m_fShellFlightDist = fDist; } + void GetGroundZero(vec3_t vPos) { VectorCopy(m_vGroundZero, vPos); } + void SetGroundZero(vec3_t vPos) { VectorCopy(vPos, m_vGroundZero); } + bool IsMachGunFunctioning() { return (m_nMachGunHealth > 0); } + + virtual int GetClassCode(void){return BODY_TANK;}//this should be different for everybody in this class family +static body_tank *NewClassForCode(int code); + + body_tank(body_tank *orig); + virtual void Evaluate(body_tank *orig); + virtual void Write(); + virtual void Read(); +}; + +class body_snowcat : public body_tank +{ +private: + gg_binst_c_ptr m_machGun2Inst; // the machine gun on the turret + gg_binst_c_ptr m_leftHeadLightInst; // left headlight beam + gg_binst_c_ptr m_rightHeadLightInst; // right headlight beam + + GhoulID m_machGun2Bolt; + GhoulID m_leftHeadLightBolt; + GhoulID m_rightHeadLightBolt; + +public: + body_snowcat() {} + body_snowcat(edict_t* self); + + virtual void SetTreads(bool bOn); + void SetMachGun2Inst(ggBinstC* inst) { m_machGun2Inst = inst; } + void SetMachGun2Bolt(GhoulID bolt) { m_machGun2Bolt = bolt; } + + void SetLeftHeadLightInst(ggBinstC* inst) { m_leftHeadLightInst = inst; } + void SetLeftHeadLightBolt(GhoulID bolt) { m_leftHeadLightBolt = bolt; } + + void SetRightHeadLightInst(ggBinstC* inst) { m_rightHeadLightInst = inst; } + void SetRightHeadLightBolt(GhoulID bolt) { m_rightHeadLightBolt = bolt; } + + IGhoulInst* GetMachGun2Inst() { if (m_machGun2Inst) return m_machGun2Inst->GetInstPtr(); return NULL;} + IGhoulInst* GetLeftHeadLightInst() { if (m_leftHeadLightInst) return m_leftHeadLightInst->GetInstPtr(); return NULL;} + IGhoulInst* GetRightHeadLightInst() { if (m_rightHeadLightInst) return m_rightHeadLightInst->GetInstPtr(); return NULL;} + + GhoulID GetMachGun2Bolt() { return m_machGun2Bolt; } + GhoulID GetLeftHeadLightBolt() { return m_leftHeadLightBolt; } + GhoulID GetRightHeadLightBolt() { return m_rightHeadLightBolt; } + + virtual void UpdateSmoke(edict_t* self, float fHealthPercentage); + virtual void Deactivate(bool bDeactivate); + + virtual int GetClassCode(void){return BODY_SNOWCAT;}//this should be different for everybody in this class family +static body_snowcat *NewClassForCode(int code); + + body_snowcat(body_snowcat *orig); + virtual void Evaluate(body_snowcat *orig); + virtual void Write(); + virtual void Read(); +}; + + +// end \ No newline at end of file diff --git a/Source/Game/gamecpp/ai_bodycow.cpp b/Source/Game/gamecpp/ai_bodycow.cpp new file mode 100644 index 0000000..ea9d9cc --- /dev/null +++ b/Source/Game/gamecpp/ai_bodycow.cpp @@ -0,0 +1,1297 @@ +#include "g_local.h" +#include "matrix4.h" +#include "ai_private.h" +#include "callback.h" + +#if 1 + +gz_blown_part cow_blown_parts[GBLOWN_COW_NUM+1] = +{ + // + // cow + // + + GBLOWN_COW_NUM, GBLOWN_COW_NUM, GBLOWNAREA_FINISH, GBLOWNCODE_SPECIAL, "", +}; + +//fixme--change this to include bbox info for shot prt, some kind of indication of what the monster model should do to make up for part loss (eg. change from headbald to headcrew) +extern Vect3 trStartKnarlyGilHack; + +///find me a home +void EntToWorldMatrix(vec3_t org, vec3_t angles, Matrix4 &m); + +int GetMinimumDamageForLevel(int damageLevel); + +// from ai_bodyhuman.cpp +extern void blownpartremove_think(edict_t *self); + +char* gzcownames[]= +{ + "GZ_HEAD", + "GZ_CHEST", + "GZ_FRONT_R", + "GZ_FRONT_L", + "GZ_BACK_R", + "GZ_BACK_L", + "NUM_COWGOREZONES" +}; + +#define MAX_VEL_COMPONENT 50.0 + +GroundCallback TheCowGroundCallback; +SetVectorCallback TheCowSetVectorCallback; +FireCallBack TheCowFireCallBack; +FollowGenericPivot TheCowFollowGenericPivot; +MouthCallback TheCowMouthCallback; +FootRightCallback TheCowFootRightCallback; +FootLeftCallback TheCowFootLeftCallback; +MonsterSeqEndCallback TheCowMonsterSeqEndCallback; +MonsterSeqBeginCallback TheCowMonsterSeqBeginCallback; + +//static GroundTransformationCallBack TheGroundTransformationCallBack; + +// for use when the cow's melee attack hits a target +/* +void CowAttackSuccess(edict_t *self, void* data) +{ + bodycow_c*body = NULL; + if (self && self->ai) + { + body=(bodycow_c*)((ai_c*)((ai_public_c*)self->ai))->GetBody(); + ((ai_c*)((ai_public_c*)self->ai))->MeleeFrame(*self); + } + if (body) + { + body->SetLastAttackTime(*(float*)data); + } +} +*/ +void bodycow_c::PlayMooSound(edict_t &monster) +{ + if (level.time - m_fLastMooSoundTime > 30) + { + m_fLastMooSoundTime = level.time; + + switch(gi.irand(0,1)) + { + case 0: + gi.sound (&monster, CHAN_BODY, gi.soundindex ("Enemy/Cow/Moo1.wav"), .8, ATTN_NORM, 0); + break; + case 1: + gi.sound (&monster, CHAN_BODY, gi.soundindex ("Enemy/Cow/Moo2.wav"), .8, ATTN_NORM, 0); + break; + } + } +} + +void bodycow_c::PlayPainSound(edict_t &monster) +{ + if ( (level.time - m_fLastPainSoundTime > .5) && (monster.health > 0) ) + { + m_fLastPainSoundTime = level.time; + gi.sound (&monster, CHAN_BODY, gi.soundindex ("Enemy/Cow/Die.wav"), .9, ATTN_NORM, 0); + } +} + + +bodycow_c::bodycow_c() +{ + emotion = EMOTION_NORMAL; + emotion_expire=level.time; + emotionScripted=false; + currentmove = NULL; + holdCode = HOLDCODE_NO; + currentMoveFinished = true; + frame_flags = 0; + fJumpDist = 85.0f; + fJumpSpeed = 100.0f; + fLastAttackTime = 0; + fLastHeadTurnTime = 0; + bTurnedAfterAttack = false; + FinalAnim = false; + FinalSound = false; + nNextShotKillsMe = NEXTSHOT_NULL; + m_fLastMooSoundTime = 0; + m_fLastPainSoundTime = 0; + m_fLastDeathSoundTime = 0; +} +#if 0 +mmove_t *bodycow_c::GetSequenceForMovement(edict_t &monster, vec3_t dest, vec3_t face, vec3_t org, vec3_t ang, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + + mmove_t* returnAnim = NULL; + + if(!currentMoveFinished) + { + return currentmove; + } + + if (IsAvailableSequence(monster, &generic_cow_move_walk)) + { + return &generic_cow_move_walk; + } + + +/* + // if he was sitting, stand up + if (currentmove == &generic_dog_move_sit && + IsAvailableSequence(monster, &generic_cow_move_standup)) + { + return &generic_dog_move_standup; + } + + // this is a sad, sad approach, but we don't want the dog beginning any transitions + //if he's attacked recently, cuz the ai has a tendency to request attack sequences for + //several frames, then request a movement sequence for one frame, then more attack seqs, + //the result being that if we recommend a sniff transition in the middle of those attacks + //the overall effect is jerky and yucky + if (level.time - fLastAttackTime < 1.0f) + { + return &generic_dog_move_run; + } + + // doing a walk rather than a sniff. if we don't have a target, + //every now and then turn our head. + returnAnim = currentmove; + if (the_ai && !the_ai->HasTarget()) + { + // if we were sniffing, we have since lost our target. therefore transition to a walk + if (currentmove == &generic_dog_move_sniff && + VerifySequence(monster, &generic_dog_move_walk_from_sniff, reject_actionflags)) + { + returnAnim = &generic_dog_move_walk_from_sniff; + } + else + { + // if the dog is walking with a looping anim (looking straight, looking left, looking + //right) then we can hold off on transitioning to a different walk...looks more random. + //if the dog has just been init'd and therefore has no current anim, jump in there and + //give it one. if it's just finished a transition anim we _have_ to change anims. + if ((currentmove == NULL || + currentmove == &generic_dog_move_walkl_from_walk || + currentmove == &generic_dog_move_walk_from_walkl || + currentmove == &generic_dog_move_walkr_from_walk || + currentmove == &generic_dog_move_walk_from_walkr || + currentmove == &generic_dog_move_walkl_walkr) || + ((currentmove == &generic_dog_move_walk || + currentmove == &generic_dog_move_walkl || + currentmove == &generic_dog_move_walkr) && + !(rand()%3))) + { + fLastHeadTurnTime = level.time; + // if we were walking looking straight (or if we were swiveling left + //and right), start turning one way or the other + if (currentmove == &generic_dog_move_walk || currentmove == &generic_dog_move_walkl_walkr) + { + int nRand = rand()%3; + if (nRand == 0 && VerifySequence(monster, &generic_dog_move_walkl_from_walk, reject_actionflags)) + { + // start turning to look left + returnAnim = &generic_dog_move_walkl_from_walk; + } + else if (nRand == 1 && VerifySequence(monster, &generic_dog_move_walkr_from_walk, reject_actionflags)) + { + // start turning to look right + returnAnim = &generic_dog_move_walkr_from_walk; + } + else if (nRand == 2 && VerifySequence(monster, &generic_dog_move_walkl_walkr, reject_actionflags)) + { + // start swiveling left and right + returnAnim = &generic_dog_move_walkl_walkr; + } + } + else if (currentmove == &generic_dog_move_walkl) + { + // we were looking left, so start turning to look straight + if (VerifySequence(monster, &generic_dog_move_walk_from_walkl, reject_actionflags)) + { + returnAnim = &generic_dog_move_walk_from_walkl; + } + } + else if (currentmove == &generic_dog_move_walkr) + { + // we were looking right, so start turning to look straight + if (VerifySequence(monster, &generic_dog_move_walk_from_walkr, reject_actionflags)) + { + returnAnim = &generic_dog_move_walk_from_walkr; + } + } + // if we were turning from left to straight or right to straight, now look straight + else if (currentmove == &generic_dog_move_walk_from_walkl || + currentmove == &generic_dog_move_walk_from_walkr) + { + if (VerifySequence(monster, &generic_dog_move_walk, reject_actionflags)) + { + returnAnim = &generic_dog_move_walk; + } + } + else if (currentmove == &generic_dog_move_walkr_from_walk) + { + // we were turning from straight to right, so now look right + if (VerifySequence(monster, &generic_dog_move_walkr, reject_actionflags)) + { + returnAnim = &generic_dog_move_walkr; + } + } + else if (currentmove == &generic_dog_move_walkl_from_walk) + { + // we were turning from straight to left, so now look right + if (VerifySequence(monster, &generic_dog_move_walkl, reject_actionflags)) + { + returnAnim = &generic_dog_move_walkl; + } + } + else + { + // just have the dumb thing do its regular walk + returnAnim = &generic_dog_move_walk; + } + } + else + { + // based on a random number we decided not to switch animations this frame. + //our walking anims can only be switched at the end of the anim, though, so + //reset our currentMoveFinished boolean so that we won't try to switch until + //we hit the current anim's EOS again + currentMoveFinished = 0; + } + } + } + else + { + // we have a target, so sniff our way towards it. + + // if our current anim is NULL, or isn't sniff-related, or it's a non-looping sniff-related anim, or + //it's a looping sniff-related anim and we feel like it, change to a new anim + if (currentmove == NULL || + (currentmove != &generic_dog_move_sniff && + currentmove != &generic_dog_move_walk_from_sniff && + currentmove != &generic_dog_move_walk && + currentmove != &generic_dog_move_sniff_from_walk) || + !(currentmove->actionFlags & ACTFLAG_LOOPANIM) || + !(rand()%4)) + { + if (currentmove == &generic_dog_move_sniff && + VerifySequence(monster, &generic_dog_move_walk_from_sniff, reject_actionflags)) + { + returnAnim = &generic_dog_move_walk_from_sniff; + } + else if (currentmove == &generic_dog_move_walk_from_sniff && + VerifySequence(monster, &generic_dog_move_walk, reject_actionflags)) + { + returnAnim = &generic_dog_move_walk; + } + else if (currentmove == &generic_dog_move_walk && + VerifySequence(monster, &generic_dog_move_sniff_from_walk, reject_actionflags)) + { + returnAnim = &generic_dog_move_sniff_from_walk; + } + else if (currentmove == &generic_dog_move_sniff_from_walk && + VerifySequence(monster, &generic_dog_move_sniff, reject_actionflags)) + { + returnAnim = &generic_dog_move_sniff; + } + else // our last anim was something non-sniff-related. just walk for now + { + returnAnim = &generic_dog_move_walk; + } + } + else + { + // need to clear this so we'll wait for the entire current anim to finish + //before switching to a new one + currentMoveFinished = 0; + } + } +*/ + return returnAnim; +} +#endif // #if 0 +mmove_t *bodycow_c::GetSequenceForStand(edict_t &monster, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + + if (currentmove && (currentmove->suggested_action==ACTCODE_STAND)&&(!IsAnimationFinished())) + { + return currentmove; + } + +// if (currentmove == &generic_cow_move_idle) + { + if (!(rand()%60)) + { + if (VerifySequence(monster, &generic_cow_move_moo, reject_actionflags)) + { // moo + PlayMooSound(monster); + return &generic_cow_move_moo; + } + } + else if (!(rand()%60)) + { + if (VerifySequence(monster, &generic_cow_move_looking, reject_actionflags)) + { // look around once in a while + return &generic_cow_move_looking; + } + } + } + return &generic_cow_move_idle; +} + +mmove_t *bodycow_c::GetSequenceForAttack(edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + fLastAttackTime = level.time; + + return NULL; +} + +mmove_t *bodycow_c::GetSequenceForPain(edict_t &monster, vec3_t point, float kick, int damage, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + if (VerifySequence(monster, &generic_cow_move_pain, reject_actionflags)) + { // Ow! Hey, stop that! + return &generic_cow_move_pain; + } + return currentmove; +} + +mmove_t *bodycow_c::GetSequenceForDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + mmove_t *animation = &generic_dog_move_walk; + + // don't interrupt our first dying animation + if ( (currentmove->suggested_action==ACTCODE_DEATH) && + !(currentmove->actionFlags&ACTFLAG_ALWAYSPRONE) && + !currentMoveFinished) + { + return currentmove; + } + + return &generic_cow_move_die_right; + +/* + //are we already in a death animation? + if (currentmove && currentmove->suggested_action==ACTCODE_DEATH) + { + float lastHit = level.time-LastKilledTime; + + //if we're twitching on our backs, see if we should continue + if ((currentmove==&generic_dog_move_death_lbshotloop2) && (lastHit > 0.3)) + { + if (IsAvailableSequence(monster, &generic_dog_move_death_lbshotdeath)) + { + FinalAnim = true; + FinalSound = true; + animation = &generic_dog_move_death_lbshotdeath; + } + } + //if we're in a prone anim, or at the end of one that ends up prone, and we're shot, call the corpse juggle thingy + else if (((currentmove->actionFlags & ACTFLAG_ALWAYSPRONE)||(currentMoveFinished)) && (lastHit <= .1)) // corpse was just hit + { + if ((dflags & DT_JUGGLE) && IsAvailableSequence(monster, &generic_dog_move_death_lbshotloop2)) + { + FinalAnim = true; + FinalSound = true; + // check for laying on left side vs. right side + if ( (currentmove == &generic_dog_move_deathside) || + (currentmove == &generic_dog_move_death_lbshotdeath) || + (currentmove == &generic_dog_move_death_lbshotloop2) ) + { + animation = &generic_dog_move_death_lbshotloop2; + } + else + { + animation = &generic_dog_move_death_lbshotloop2; + } + } + else if (IsAvailableSequence(monster, &generic_dog_move_death_lbshotdeath) && currentmove!=&generic_dog_move_death_lbshotloop) + { + FinalAnim = true; + FinalSound = true; + ForceNextAnim = true; + // ideally, there'd be a check here similar to the one above, cuz the anim + //we play here should be determined by how we died. sadly, we don't + //currently have a shot-after-dead anim to be played if we died running + animation = &generic_dog_move_death_lbshotdeath; + } + else + { + animation = currentmove; + } + } + else + { + animation = currentmove; + } + + } + else + { + // first check if we've taken a _lot_ of damage (c4, etc.) + if (damage > 90) + { + // blown backward from a lot of damage + vec3_t vDmg; + animation = &generic_dog_move_death_back; + // make sure we're blown away from whatever did the damage + if (inflictor) + { + VectorSubtract(monster.s.origin, inflictor->s.origin, vDmg); + vDmg[2] = 0; + VectorNegate(vDmg, vDmg); + vectoangles(vDmg, monster.s.angles); + } + } + else if (currentmove == &generic_dog_move_run && IsAvailableSequence(monster, &generic_dog_move_deathrun)) + { + animation = &generic_dog_move_deathrun; + } + else if (IsAvailableSequence(monster, &generic_dog_move_deathside)) + { + animation = &generic_dog_move_deathside; + } + } + + return animation; +*/ +} + +void bodycow_c::RecognizeGoreZones(edict_t &monster) +{ + RecognizeCowGoreZones(monster); +} + +/* cow gore zones + + GZ_COW_HEAD, + GZ_COW_CHEST, + GZ_COW_R_FRONT, + GZ_COW_L_FRONT, + GZ_COW_R_BACK, + GZ_COW_L_BACK, + NUM_COWGOREZONES +*/ +void bodycow_c::RecognizeCowGoreZones(edict_t &monster) +{ + GhoulID tempHole = 0; + int i; + + InitializeGoreZoneLevels(monster); + + for (i=0;iGetGhoulObject()->FindPart("_body_1"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_COW_HEAD].parent_id=tempHole; + SetGoreZone(monster, "GZ_HEAD", GZ_COW_HEAD); + gzones[GZ_COW_CHEST].parent_id=tempHole; + SetGoreZone(monster, "GZ_CHEST", GZ_COW_CHEST); + gzones[GZ_COW_R_FRONT].parent_id=tempHole; + SetGoreZone(monster, "GZ_FRONT_R", GZ_COW_R_FRONT); + gzones[GZ_COW_L_FRONT].parent_id=tempHole; + SetGoreZone(monster, "GZ_FRONT_L", GZ_COW_L_FRONT); + gzones[GZ_COW_R_BACK].parent_id=tempHole; + SetGoreZone(monster, "GZ_BACK_R", GZ_COW_R_BACK); + gzones[GZ_COW_L_BACK].parent_id=tempHole; + SetGoreZone(monster, "GZ_BACK_L", GZ_COW_L_BACK); + } +/* + + // blown caps are the chunks of meat on the blown off part that get turned on at the + //point of separation + SetGoreBlownCap(monster, "_CAP_HUSKY_RLEG_RSHOLDR", GZ_DOG_RLEG_FRONT); + SetGoreBlownCap(monster, "_CAP_HUSKY__LLEG_LSHOLDR", GZ_DOG_LLEG_FRONT); + SetGoreBlownCap(monster, "_CAP_HUSKY_RHIP_BODY", GZ_DOG_RHIP); + SetGoreBlownCap(monster, "_CAP_HUSKY_LLEG_LHIP", GZ_DOG_LLEG_BACK); + + // blown cap bolts are the points at which the separation occurs when a part is + //blown off (used as the origin for various blood-related effects). they point from + //the separated part toward the parent (e.g. from the leg to the hip) + // + //the dog doesn't have any. + // + + // caps are the chunks of meat on the parent part that get turned on at the + //point of separation + SetGoreCap(monster, "_CAP_HUSKY_TORSO_RSHOLDR", GZ_DOG_RLEG_FRONT); + SetGoreCap(monster, "_CAP_HUSKY_TORSO_LSHOLDR", GZ_DOG_LLEG_FRONT); + SetGoreCap(monster, "_CAP_HUSKY_TORSO_RHIP", GZ_DOG_RHIP); + SetGoreCap(monster, "_CAP_HUSKY_LHIP_LLEG", GZ_DOG_LLEG_BACK); + + // cap bolts are the points at which the separation occurs when a part is + //blown off (used as the origin for various blood-related effects). they point from + //the parent toward the separated part (e.g. from the hip to the leg) + SetGoreCapBolt(monster, "GBOLT_CAP_HUSKY_TORSO_RSHOLDR", GZ_DOG_RLEG_FRONT); + SetGoreCapBolt(monster, "GBOLT_CAP_HUSKY_TORSO_LSHOLDR", GZ_DOG_LLEG_FRONT); + SetGoreCapBolt(monster, "GBOLT_CAP_HUSKY_TORSO_RHIP", GZ_DOG_RHIP); + SetGoreCapBolt(monster, "GBOLT_CAP_HUSKY_LHIP_LLEG", GZ_DOG_LLEG_BACK); +*/ + // bolts are used for hit location detection (which bolt is the dmg nearest?) and + //placing exit wounds (probably not for the dog, though) + SetGoreBolt(monster, "gbolt_head", GZ_COW_HEAD); + SetGoreBolt(monster, "gbolt_chest", GZ_COW_CHEST); + SetGoreBolt(monster, "gbolt_front_r", GZ_COW_R_FRONT); + SetGoreBolt(monster, "gbolt_front_l", GZ_COW_L_FRONT); + SetGoreBolt(monster, "gbolt_back_r", GZ_COW_R_BACK); + SetGoreBolt(monster, "gbolt_back_l", GZ_COW_L_BACK); +/* + // blowme's are the parts that'll get blown off when an area is hit. the possible + //values are in the first column of dogblown_parts[], which are entries in dogblown_index. + gzones[GZ_DOG_LLEG_FRONT].blowme = &husky_blown_parts[GBLOWN_HUSKY_LLEG_FRONT]; + gzones[GZ_DOG_RLEG_FRONT].blowme = &husky_blown_parts[GBLOWN_HUSKY_RLEG_FRONT]; + gzones[GZ_DOG_LLEG_BACK].blowme = &husky_blown_parts[GBLOWN_HUSKY_LLEG_BACK]; + gzones[GZ_DOG_RHIP].blowme = &husky_blown_parts[GBLOWN_HUSKY_RHIP]; + gzones[GZ_DOG_RLEG_BACK].blowme = &husky_blown_parts[GBLOWN_HUSKY_RHIP]; + + // childzone's are used for turning off decals and maybe caps when subparts are + //blown off of parts (e.g. lower arm blown off then upper arm blown off). + gzones[GZ_DOG_RHIP].childzone = GZ_DOG_RLEG_BACK; + gzones[GZ_DOG_RLEG_BACK].childzone = GZ_DOG_RHIP; + + // a little weirdness here to make the right hip and right leg react the same + //when shot (they're both s'posed to fly off, attached to each other, when shot) + SetGoreBlownCap(monster, "_CAP_HUSKY_RHIP_BODY", GZ_DOG_RLEG_BACK); + SetGoreCap(monster, "_CAP_HUSKY_TORSO_RHIP", GZ_DOG_RLEG_BACK); + SetGoreCapBolt(monster, "GBOLT_CAP_HUSKY_TORSO_RHIP", GZ_DOG_RLEG_BACK); +*/ +} + + +int GetDamageLevel(int amount); +/*{ + if (amount<=0) + { + return 0; + } + if (amount<=100) + { + return 1; + } + if (amount<=200) + { + return 2; + } + return 3; +} +*/ +int bodycow_c::ShowDamage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb) +{ + vec3_t bodyloc;//, footorigin; + gz_info *frontHole=NULL; + gz_code frontCode; + gz_info *backHole=NULL; + gz_code backCode; + vec3_t forward, right, up; + vec3_t to_impact; + float forward_back, right_left, up_down; + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + ggOinstC *blownInst; + int i,j; + int take; + float curGoreDist,bestGoreDist,tdist; + Vect3 EntryPos; + vec3_t ExitPos,tvec; + Vect3 zonePos; + Vect3 Direction; + Matrix4 ZoneMatrix; + + Matrix4 ToEnt,ToWorld; + + + for (i=0;i<3;i++) + { + Direction[i]=dir[i]; + } + + // if we're the target of a scripted kill...well...we're gonna die right the heck now + switch(nNextShotKillsMe) + { + case NEXTSHOT_EXPLODE_MY_NUG: + { + dflags |= DT_SEVER; + // no break...intentional. + } + case NEXTSHOT_KILLS: + { + damage = 9999; + + // I suppose that bad things might happen if this flag is on and we get shot again + nNextShotKillsMe = NEXTSHOT_NULL; + break; + } + default: + break; + } + + // Only show damage from projectile weapons and melee weapons, else return. + + if(!(dflags&DT_PROJECTILE|DT_MELEE)) + { + return(damage); + } + + take = damage; + + //NO HITS!!! + + if ( (dflags&DT_PROJECTILE) && (bullet_numHits == 0) ) + { + return 0; + } + + PlayPainSound(monster); + + if (ai_goretest->value) + { + gi.dprintf("%d hits!\n", bullet_numHits); + } + + //get entrance wound + for (i=0;iGetInstPtr()) + { + //hit something + if (bullet_Hits[i].Mesh) + { + VectorScale(*(vec3_t*)(&bullet_EntDir),bullet_Hits[i].Distance,*(vec3_t*)(&EntryPos)); + EntryPos += bullet_EntStart; + if (ai_goretest->value) + { + gi.dprintf("Entry wound position: %2.2f %2.2f %2.2f\n",EntryPos[0],EntryPos[1],EntryPos[2]); + } + tdist=bestGoreDist=9999999; + for (j=0;jvalue) + { + gi.dprintf("considering %s for frontHole\n",gzcownames[j]); + } + if (!gzones[j].bolt) + { + if (!frontHole || tdist>bullet_Hits[i].Distance) + { + tdist=bullet_Hits[i].Distance; + frontHole=&gzones[j]; + frontCode = (gz_cowcode)j; + if (ai_goretest->value) + { + gi.dprintf("Setting frontHole to %s\n",gzcownames[j]); + } + } + } + else + { + //is this a better match than what's already in fronthole? + bullet_Hits[i].Inst->GetBoltMatrix(level.time,ZoneMatrix,gzones[j].bolt,IGhoulInst::MatrixType::Entity); + ZoneMatrix.GetRow(3,zonePos); + if (ai_goretest->value) + { + gi.dprintf("Candidate position: %2.2f %2.2f %2.2f\n",zonePos[0],zonePos[1],zonePos[2]); + } + VectorSubtract(*(vec3_t*)(&EntryPos),*(vec3_t*)(&zonePos),tvec); + curGoreDist = VectorLengthSquared(tvec); + if (!frontHole || curGoreDistvalue) + { + gi.dprintf("Setting frontHole to %s\n",gzcownames[j]); + } + } + } + } + } + if (frontHole) + { + int k; + VectorScale(dir,tdist,*(vec3_t*)(&EntryPos)); + for (k=0;k<3;k++) + { + EntryPos[k]+=point[k]; + } + for (k=0;k<3;k++) + { + if (EntryPos[k]monster.s.origin[k]+monster.maxs[k]) + { + EntryPos[k]=monster.s.origin[k]+monster.maxs[k]; + } + } + if (ai_goretest->value) + { + gi.dprintf("spraying blood from %2.2f %2.2f %2.2f; monster pos %2.2f %2.2f %2.2f\n",EntryPos[0],EntryPos[1],EntryPos[2],monster.s.origin[0],monster.s.origin[1],monster.s.origin[2]); + } + FX_MakeBloodSpray(ExitPos, dir, 200, 1, &monster); + + break; + } + } + } + //hit a bolt-on + else if (!frontHole) + { + ggBinstC *boltPiece; + boltPiece = myInstance->FindBoltInstance(bullet_Hits[i].Inst); + if (boltPiece && boltPiece->GetBolterBolt()) + { + int k; + VectorScale(dir,tdist,*(vec3_t*)(&EntryPos)); + for (k=0;k<3;k++) + { + EntryPos[k]+=point[k]; + } + take = DropBoltOn(monster, boltPiece, EntryPos, Direction, take); + if (take <= 0) + { + return 0; + } + } + } + } + + + //get exit wound + for (i=bullet_numHits-1;i>=0;i--) + { + //hit something + if (bullet_Hits[i].Mesh) + { + //hit my instance + if (bullet_Hits[i].Inst==myInstance->GetInstPtr()) + { + VectorScale(*(vec3_t*)(&bullet_EntDir),bullet_Hits[i].Distance,ExitPos); + Vec3AddAssign(*(vec3_t*)(&bullet_EntStart), ExitPos); + if (ai_goretest->value) + { + gi.dprintf("Exit wound position: %2.2f %2.2f %2.2f\n",ExitPos[0],ExitPos[1],ExitPos[2]); + } + tdist=bestGoreDist=9999999; + for (j=0;jvalue) + { + gi.dprintf("considering %s for backHole\n",gzcownames[j]); + } + if (!gzones[j].bolt) + { + if (!backHole || tdist>bullet_Hits[i].Distance) + { + tdist=bullet_Hits[i].Distance; + backHole=&gzones[j]; + backCode = (gz_cowcode)j; + if (ai_goretest->value) + { + gi.dprintf("Setting backHole to %s\n",gzcownames[j]); + } + } + } + else + { + //is this a better match than what's already in fronthole? + bullet_Hits[i].Inst->GetBoltMatrix(level.time,ZoneMatrix,gzones[j].bolt,IGhoulInst::MatrixType::Entity); + ZoneMatrix.GetRow(3,zonePos); + if (ai_goretest->value) + { + gi.dprintf("Zone's bolt position: %2.2f %2.2f %2.2f\n",zonePos[0],zonePos[1],zonePos[2]); + } + VectorSubtract(ExitPos,*(vec3_t*)(&zonePos),tvec); + curGoreDist = VectorLengthSquared(tvec); + if (!backHole || curGoreDistvalue) + { + gi.dprintf("Setting backHole to %s\n",gzcownames[j]); + } + } + } + } + } + if (backHole) + { + VectorScale(dir,tdist,ExitPos); + VectorAdd(point,ExitPos,ExitPos); + break; + } + else + { + EntryPos=EntryPos;//debug breakpoint--removme! + } + } + //hit a bolt-on: do something! + else + { + EntryPos=EntryPos;//debug breakpoint--removme! + } + } + } + + + AngleVectors(monster.s.angles, forward, right, up); + VectorSubtract(point, monster.s.origin, to_impact); + VectorNormalize(to_impact); + forward_back = DotProduct(forward, to_impact); + right_left = DotProduct(right, to_impact); + up_down = DotProduct(up, to_impact); + + Emote(monster, EMOTION_PAIN, 10.0); + + VectorSubtract(point, monster.s.origin, bodyloc); + + //dying--drop weapons + if (false && monster.health <= take) + { + ggBinstC *bolted; + vec3_t handPos; + VectorSet(handPos,0,0,0); + monster.ghoulInst->GetBoltMatrix(level.time,ZoneMatrix,monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l"),IGhoulInst::MatrixType::Entity); + ZoneMatrix.GetRow(3,zonePos); + handPos[0]=zonePos[0]; + handPos[1]=zonePos[1]; + handPos[2]=zonePos[2]; + while (myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l"))) + { + bolted=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l")); + DropBoltOn(monster, bolted, zonePos, Direction, take); + } + monster.ghoulInst->GetBoltMatrix(level.time,ZoneMatrix,monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"),IGhoulInst::MatrixType::Entity); + ZoneMatrix.GetRow(3,zonePos); + handPos[0]=zonePos[0]; + handPos[1]=zonePos[1]; + handPos[2]=zonePos[2]; + while (myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"))) + { + bolted=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r")); + DropBoltOn(monster, bolted, zonePos, Direction, take); + } + } + + + if (frontHole&& frontHole->parent_id && myInstance->GetInstPtr()->GetPartOnOff(frontHole->parent_id)) + { + int newlevel; + frontHole->damage+=take; +// newlevel=1; + newlevel = GetDamageLevel(frontHole->damage); + if ((frontHole->id) && (!lock_gorezones)) + { + monster.ghoulInst->SetPartOnOff(frontHole->id, true); + } + if (monster.health <= damage && frontHole->cap && (ai_goretest->value || (dflags & DT_SEVER)) && (!lock_sever)) + { + edict_t *danglyBit; + Emote(monster, EMOTION_DEAD, 1.0); + UpdateFace(monster); + danglyBit=MakeBlownPart(monster, frontCode, dir, &blownInst); + if (frontHole->blownCapBolt && blownInst) + { + if (frontHole->capPiece) + { + if (frontHole->capPieceBolt) + { + AddBoltedItem(monster, frontHole->blownCapBolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), frontHole->capPieceBolt, blownInst); + } + else + { + AddBoltedItem(monster, frontHole->blownCapBolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), "to_gbolt", blownInst); + } + } + else + { + AddBoltedItem(monster, frontHole->blownCapBolt, "Enemy/bolt", "g_cap1", "to_gbolt", blownInst); + } + } + if (frontHole->blownCap) + { + danglyBit->ghoulInst->SetPartOnOff(frontHole->blownCap,true); + danglyBit->ghoulInst->SetFrameOverride("c","c_blood",frontHole->blownCap); + } + BlowPart(monster,frontHole->blowme,danglyBit); + BlowZone(monster,frontHole->childzone,frontHole->childzone,danglyBit); + if (frontHole->parent_id) + { + myInstance->GetInstPtr()->SetPartOnOff(frontHole->parent_id,false); + } + if (frontHole->id) + { + myInstance->GetInstPtr()->SetPartOnOff(frontHole->id,false); + } + if (backHole && backHole->id) + { + myInstance->GetInstPtr()->SetPartOnOff(backHole->id,false); + } + myInstance->GetInstPtr()->SetPartOnOff(frontHole->cap,true); + myInstance->GetInstPtr()->SetFrameOverride("c","c_blood",frontHole->cap); + if (frontHole->capbolt) + { + if (frontHole->capPiece) + { + if (frontHole->capPieceBolt) + { + AddBoltedItem(monster, frontHole->capbolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), frontHole->capPieceBolt, myInstance); + } + else + { + AddBoltedItem(monster, frontHole->capbolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), "to_gbolt", myInstance); + } + } + else + { + AddBoltedItem(monster, frontHole->capbolt, "Enemy/bolt", "g_cap1", "to_gbolt", myInstance); + } + if (monster.health>0) + { +// gi.sound (&monster, CHAN_BODY, gi.soundindex ("impact/gore/spout.wav"), .8, ATTN_NORM, 0); + FX_Bleed(&monster, frontHole->capbolt, 50); + } + else + { + FX_BloodCloud(&monster, frontHole->capbolt, 100); + } + } + if (spout == -1) + { + if (frontHole->capbolt) + { + monster.ghoulInst->AddMatrixCallBack(&TheCowSetVectorCallback,frontHole->capbolt,IGhoulInst::MatrixType::Entity); + spout = frontHole - gzones; + } + else if (frontHole->bolt) + { + monster.ghoulInst->AddMatrixCallBack(&TheCowSetVectorCallback,frontHole->bolt,IGhoulInst::MatrixType::Entity); + spout = frontHole - gzones; + } + } + } + else if (newlevel>frontHole->damage_level) + { + int i; + + //knock off loose parts + ShakePart(monster, frontHole->blowme, Direction); + + if ((frontHole->id) && (!lock_gorezones)) + { + i=rand()%3; + + //if this zone was already active, match up the row + if (frontHole->damage_level) + { + GhoulID skinID=myInstance->GetInstPtr()->GetFrameOverride("gz",frontHole->id); + if (skinID) + { + for (i=0;i<4;i++) + { + if (skinID==gzone_levels[frontHole->damage_level-1][i]) + break; + } + } + } + + if (i<4 && gzone_levels[newlevel-1][i] != NULL_GhoulID) + { + myInstance->GetInstPtr()->SetFrameOverride("gz",gzone_levels[newlevel-1][i],frontHole->id); + } + } + if (frontHole->bolt) + { + FX_Bleed(&monster, frontHole->bolt, 25); + if ((frontHole==&gzones[GZ_GUT_FRONT]) && (!lock_gorezones)) +// if (newlevel==3) + { + myInstance->RemoveBolt(frontHole->bolt); + AddBoltedItem(monster, frontHole->bolt, "Enemy/bolt", "g_guts", "to_gbolt_gut_f", myInstance); + } + } + if (!lock_gorezones) + { + frontHole->damage_level=newlevel; + } + } + } + if (backHole && backHole->id && backHole->parent_id && backHole != frontHole && myInstance->GetInstPtr()->GetPartOnOff(backHole->parent_id)) + { + int i=rand()%3; + //exit wound--massive damage + backHole->damage=GetMinimumDamageForLevel(3); + if (backHole->damage_level<3) + { + + //if this zone was already active, match up the row + if (backHole->damage_level) + { + GhoulID skinID=myInstance->GetInstPtr()->GetFrameOverride("gz",backHole->id); + if (skinID) + { + for (i=0;i<4;i++) + { + if (skinID==gzone_levels[backHole->damage_level-1][i]) + break; + } + } + } + + if (i<4) + { + myInstance->GetInstPtr()->SetFrameOverride("gz",gzone_levels[2][i],backHole->id); + } + backHole->damage_level=3; + } + if (!lock_gorezones) + { + monster.ghoulInst->SetPartOnOff(backHole->id, true); + } + } + return take; +} + +void bodycow_c::SetRootBolt(edict_t &monster) +{ + GhoulID tempID; + GhoulID tempBolt; + GhoulID tempNote; + + // the death animations look a little weird if the cow obtains a knockback-induced velocity + monster.flags &= ~FL_NO_KNOCKBACK; + + AllocateGoreZones(monster); + RecognizeGoreZones(monster); + tempBolt=monster.ghoulInst->GetGhoulObject()->FindPart("quake_origin"); + if (tempBolt) + { + monster.ghoulInst->AddMatrixCallBack(&TheCowFollowGenericPivot,tempBolt,IGhoulInst::MatrixType::JacobianEntity); + } + else + { + gi.dprintf("WARNING: monster origin not found--wacky!!\n"); + } + + tempID=monster.ghoulInst->GetGhoulObject()->FindPart("quake_ground"); + if (tempID) + { + monster.ghoulInst->AddMatrixCallBack(&TheCowGroundCallback,tempID,IGhoulInst::MatrixType::Entity); + } + tempBolt=monster.ghoulInst->GetGhoulObject()->FindPart("GBOLT_HEAD"); + if (tempBolt) + { + monster.ghoulInst->AddMatrixCallBack(&TheCowMouthCallback,tempBolt,IGhoulInst::MatrixType::Entity); + } + else + { + gi.dprintf("WARNING: monster mouth not found--sight will be defective!!\n"); + } + + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("BOS"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheCowMonsterSeqBeginCallback,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("EOS"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheCowMonsterSeqEndCallback,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("fire"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheCowFireCallBack,tempNote); + } +} + +attacks_e bodycow_c::GetBestWeapon(edict_t &monster) +{ + return ATK_DOG_ATTACK; +} + +void bodycow_c::BiteMe(edict_t &monster, qboolean forceFireRate) +{ + Matrix4 boltToCow, cowToWorld, final; + vec3_t firePoint = {0,0,0}, forward, rotateangs; + IGhoulInst *instCow = monster.ghoulInst; + IGhoulObj *obj = NULL; + GhoulID boltID = 0; + if (instCow) + { + if(obj = instCow->GetGhoulObject()) + { + boltID = obj->FindPart("GBOLT_CHEST"); + } + } + if (boltID) + { + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + if (the_ai) + { + instCow->GetBoltMatrix(level.time, boltToCow, boltID,IGhoulInst::MatrixType::Entity); + VectorDegreesToRadians(monster.s.angles,rotateangs); + cowToWorld.Identity(); + cowToWorld.Rotate(rotateangs[2],rotateangs[0],-rotateangs[1]);//grr. + final.Concat(boltToCow,cowToWorld); + final.GetRow(3,(Vect3)firePoint); + VectorAdd(monster.s.origin,firePoint,firePoint); + + the_ai->GetAimVector(forward); + + +// weapons.attack(ATK_DOG_ATTACK, &monster, firePoint, forward, DogAttackSuccess); + + rLastFireTime = level.time; + } + } +} + +void bodycow_c::NextMovement(edict_t &monster, vec3_t curDist, float scale) +{ + vec3_t forward,right,up,tempdist,distaccum; + int i; +/* + if (currentmove==&generic_dog_move_attack && (level.time - fLastAttackTime) < 2*FRAMETIME && + !bTurnedAfterAttack) + { + // turn the dog 45degrees to one side after he bites + monster.s.angles[YAW] -= 60; + if (monster.s.angles[YAW] < 0) + { + monster.s.angles[YAW] += 360; + } + bTurnedAfterAttack = true; + } + */ + AngleVectors(monster.s.angles,forward,right,up); + VectorScale(monster.intend_velocity, FRAMETIME, curDist); + +// VectorCopy(monster.intend_velocity, curDist); + for (i = 0; i < 3; i++) + { + if (curDist[i]>MAX_VEL_COMPONENT) + { +// gi.dprintf("warning! capping monster %d vel component to %f (from %f)!\n", i, MAX_VEL_COMPONENT, curDist[i]); + curDist[i]=MAX_VEL_COMPONENT; + } + if (curDist[i]<-MAX_VEL_COMPONENT) + { +// gi.dprintf("warning! capping monster %d vel component to -%f (from %f)!\n", i, MAX_VEL_COMPONENT, curDist[i]); + curDist[i]=-MAX_VEL_COMPONENT; + } + } + + //plop in default vel, too--fixme, shouldn't be here + VectorScale(forward, curDist[0]*scale, tempdist); + VectorCopy(tempdist,distaccum); + VectorScale(right, curDist[1]*scale, tempdist); + VectorAdd(distaccum,tempdist,distaccum); + VectorScale(up, curDist[2]*scale, tempdist); + VectorAdd(distaccum,tempdist,curDist); +} + +void bodycow_c::FinishMove(edict_t &monster) +{ + bodyorganic_c::FinishMove(monster); +/* if (currentmove==&generic_dog_move_attack) + { + bTurnedAfterAttack = false; + } +*/ +} + +qboolean bodycow_c::PlayAnimation(edict_t &monster, mmove_t *newanim, bool forceRestart) +{ + forceRestart |= ForceNextAnim; + ForceNextAnim = false; + + return bodyorganic_c::PlayAnimation(monster, newanim, forceRestart); +} + +bodycow_c::bodycow_c(bodycow_c *orig) +: bodyorganic_c(orig) +{ + bTurnedAfterAttack = orig->bTurnedAfterAttack; + FinalAnim = orig->FinalAnim; + FinalSound = orig->FinalSound; + nNextShotKillsMe = orig->nNextShotKillsMe; + + fJumpDist = orig->fJumpDist; + fJumpSpeed = orig->fJumpSpeed; + fLastAttackTime = orig->fLastAttackTime; + fLastHeadTurnTime = orig->fLastHeadTurnTime; + m_fLastMooSoundTime = orig->m_fLastMooSoundTime; + m_fLastPainSoundTime = orig->m_fLastPainSoundTime; + m_fLastDeathSoundTime = orig->m_fLastDeathSoundTime; +} + +void bodycow_c::Evaluate(bodycow_c *orig) +{ + bTurnedAfterAttack = orig->bTurnedAfterAttack; + FinalAnim = orig->FinalAnim; + FinalSound = orig->FinalSound; + nNextShotKillsMe = orig->nNextShotKillsMe; + + fJumpDist = orig->fJumpDist; + fJumpSpeed = orig->fJumpSpeed; + fLastAttackTime = orig->fLastAttackTime; + fLastHeadTurnTime = orig->fLastHeadTurnTime; + m_fLastMooSoundTime = orig->m_fLastMooSoundTime; + m_fLastPainSoundTime = orig->m_fLastPainSoundTime; + m_fLastDeathSoundTime = orig->m_fLastDeathSoundTime; + + bodyorganic_c::Evaluate(orig); +} + +void bodycow_c::AllocateGoreZones(edict_t &monster) +{ + //eliminate old gore zones... + bodyorganic_c::AllocateGoreZones(monster); + numGoreZones=NUM_COWGOREZONES; + gzones=new gz_info[numGoreZones]; +} + +void bodycow_c::Read() +{ + char loaded[sizeof(bodycow_c)]; + + gi.ReadFromSavegame('AIBC', loaded, sizeof(bodycow_c)); + Evaluate((bodycow_c *)loaded); +} + +void bodycow_c::Write() +{ + bodycow_c *savable; + + savable = new bodycow_c(this); + gi.AppendToSavegame('AIBC', savable, sizeof(*this)); + delete savable; + + WriteGZ(); +} + +#endif \ No newline at end of file diff --git a/Source/Game/gamecpp/ai_bodycow.h b/Source/Game/gamecpp/ai_bodycow.h new file mode 100644 index 0000000..a7a343f --- /dev/null +++ b/Source/Game/gamecpp/ai_bodycow.h @@ -0,0 +1,91 @@ +#if 1 + +typedef enum +{ + GZ_COW_HEAD, + GZ_COW_CHEST, + GZ_COW_R_FRONT, + GZ_COW_L_FRONT, + GZ_COW_R_BACK, + GZ_COW_L_BACK, + NUM_COWGOREZONES +} gz_cowcode; + +//not including gorezones in this list, need to be handled separately +typedef enum +{ +/* GBLOWN_COW_LLEG_FRONT, + GBLOWN_COW_RLEG_FRONT, + GBLOWN_COW_LLEG_BACK, + GBLOWN_COW_RHIP, + GBLOWN_COW_RLEG_BACK,*/ + GBLOWN_COW_NUM = 0 +} cow_blown_index; + + +extern gz_blown_part cow_blown_parts[GBLOWN_COW_NUM+1]; + + +class bodycow_c: public bodyorganic_c +{ +protected: + qboolean bTurnedAfterAttack; + qboolean FinalAnim; // When set, the current anim or series of anims is intended to be the last ones played. also has sound implications + qboolean FinalSound; + int nNextShotKillsMe; // used for scripted kills + + + float fJumpDist; // preferred dist from target at which we'll do a jump-attack + float fJumpSpeed; // magnitude of our jump-attack's velocity + float fLastAttackTime; + float fLastHeadTurnTime; + float m_fLastMooSoundTime; + float m_fLastPainSoundTime; + float m_fLastDeathSoundTime; + + virtual void RecognizeGoreZones(edict_t &monster); + virtual void PlayMooSound(edict_t &monster); + virtual void PlayPainSound(edict_t &monster); + + virtual qboolean PlayAnimation(edict_t &monster, mmove_t *newanim, bool forceRestart); + + //fixme: these should be the RecognizegoreZones for different classes--AddBody stuff needs to get resolved + void RecognizeCowGoreZones(edict_t &monster); + + virtual void AllocateGoreZones(edict_t &monster); + virtual void BiteMe(edict_t &monster, qboolean forceFireRate); +public: + bodycow_c(); + virtual mmove_t *GetSequenceForDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); +// virtual mmove_t *GetSequenceForMovement(edict_t &monster, vec3_t dest, vec3_t face, vec3_t org, vec3_t ang, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForStand(edict_t &monster, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForAttack(edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForPain(edict_t &monster, vec3_t point, float kick, int damage, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + + virtual void NextMovement(edict_t &monster, vec3_t curDist, float scale); + virtual void FinishMove(edict_t &monster); + + virtual void SetRootBolt(edict_t &monster); + + virtual int ShowDamage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb); + + virtual attacks_e GetBestWeapon(edict_t &monster); + virtual void FirePrimaryWeapon(edict_t &monster, bool lethal = false, int NullTarget = 0, qboolean forceFireRate = false) { BiteMe(monster, forceFireRate); } + + bodydog_c(); + + virtual int GetClassCode(void){return BODY_COW;}//this should be different for everybody in this class family + + float GetLastAttackTime() { return fLastAttackTime; } + void SetLastAttackTime(float fTime) { fLastAttackTime = fTime; } + virtual void NextShotsGonnaKillMe(int nKill) {nNextShotKillsMe = nKill;} + virtual bool IsNextShotGonnaKillMe() {return !!nNextShotKillsMe;} + + bodycow_c(bodycow_c *orig); + virtual void Evaluate(bodycow_c *orig); + virtual void Write(); + virtual void Read(); +}; + + +#endif diff --git a/Source/Game/gamecpp/ai_bodydekker.cpp b/Source/Game/gamecpp/ai_bodydekker.cpp new file mode 100644 index 0000000..7a1efa4 --- /dev/null +++ b/Source/Game/gamecpp/ai_bodydekker.cpp @@ -0,0 +1,768 @@ +#include "g_local.h" +#include "matrix4.h" +#include "ai_private.h" +#include "callback.h" +#include "ai_pathfinding.h" + +extern int bulletTraceHitCheck(trace_t *tr, vec3_t start, vec3_t end, int clipMask); +extern void DropKnife(edict_t &monster, edict_t *knife); +extern float Skill_DisablityModifier(edict_t *monster); + +bodydekker_c::bodydekker_c() +: bodymeso_c() +{ + lastDekkerPain=0.0; + totalDamage=0; +} + +bodydekker_c::bodydekker_c(bodydekker_c *orig) +: bodymeso_c(orig) +{ + lastDekkerPain = orig->lastDekkerPain; + totalDamage = orig->totalDamage; +} + +void bodydekker_c::Evaluate(bodydekker_c *orig) +{ + lastDekkerPain = orig->lastDekkerPain; + totalDamage = orig->totalDamage; + + bodymeso_c::Evaluate(orig); +} + +void bodydekker_c::Read() +{ + char loaded[sizeof(bodydekker_c)]; + + gi.ReadFromSavegame('AIBK', loaded, sizeof(bodydekker_c)); + Evaluate((bodydekker_c *)loaded); +} + +void bodydekker_c::Write() +{ + bodydekker_c *savable; + + savable = new bodydekker_c(this); + gi.AppendToSavegame('AIBK', savable, sizeof(*this)); + delete savable; + + WriteGZ(); +} + +mmove_t *bodydekker_c::GetSequenceForPain(edict_t &monster, vec3_t point, float kick, int damage, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + if (level.time-lastDekkerPain<5.0) + { + return NULL; + } + lastDekkerPain=level.time; + return bodyhuman_c::GetSequenceForPain(monster, point, kick, damage, dest, face, seqtype, goal_bbox, ideal_move, reject_actionflags); +} + +#define MAX_FRONTCODES 5 + +int bodydekker_c::ShowDamage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb) +{ + vec3_t bodyloc;//, footorigin; + gz_code listOfFrontCodes[MAX_FRONTCODES]; + int numOfFrontCodes=0; + gz_code frontCode=numGoreZones; + gz_code backCode=numGoreZones; + vec3_t forward, right, up; + vec3_t to_impact; + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + int i,j,backHoleHitNum; + int take; + float curGoreDist,bestGoreDist,tdist; + Vect3 EntryPos; + bool EntryPosIsValid=false; + vec3_t ExitPos,tvec; + Vect3 zonePos; + Vect3 Direction; + Matrix4 ZoneMatrix; + ggBinstC *oldLeftWeap, *oldRightWeap; + ggBinstC *boltPiece=NULL;//contender for being shot off + qboolean oneLimbSevered=false; +// vec3_t debrisNorm; + bool bKnife = false; + bool bArmor = false; // need to know this to handle the knife properly + int nNearMissZone = -1; + + bDropBoltons = false; // Dekker can't have stuff blown off of him + + if (attacker==&monster) + { + return 0; + } + + dflags&=~(DT_SEVER|DT_MANGLE); + + //first, store off what i got in my hands... + oldLeftWeap=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l")); + oldRightWeap=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r")); + + if (monster.spawnflags & SPAWNFLAG_NO_WOUND) + { // rather than just exit without wounding, let's fire our killtarget here + monster.spawnflags &= ~SPAWNFLAG_NO_WOUND; + edict_t *t = NULL; + if (t = G_Find (t, FOFS(targetname), monster.killtarget)) + { + t->use(t, &monster, &monster); + monster.killtarget = NULL; + } + } + + // if we're the target of a scripted kill...well...we're gonna die right the heck now + switch(nNextShotKillsMe) + { + case NEXTSHOT_EXPLODE_MY_NUG: + { + dflags |= DT_SEVER; + // no break...intentional. + } + case NEXTSHOT_KILLS: + { + damage = 9999; + + // I suppose that bad things might happen if this flag is on and we get shot again + nNextShotKillsMe = NEXTSHOT_NULL; + break; + } + default: + //i'm dekker, be gentle... + if (damage > 10) + { + damage = 10; + } + break; + } + + for (i=0;i<3;i++) + { + Direction[i]=dir[i]; + } + + if (inflictor) + { + bKnife = ((254 == inflictor->elasticity) && attacker->client); + } + + //if unknown type of damage, don't even bother, just accept the value + if( !(dflags & (DT_PROJECTILE|DT_MELEE|DT_DIRECTIONALGORE|DT_MANGLE)) && + !bKnife) + { +// return damage;//other tests? I dunno - knife should be here maybe too + if (damage<1) + { + return damage; + } + if (damage<5 && gi.irand(0,1))//just magical armor is all + { + return 0; + } + + return 1;//other tests? I dunno - knife should be here maybe too + } + else if (bKnife) + { + // need to perform special trace here, treating thrown knife like a bullet + trace_t tr; + vec3_t endPos, firePoint, fwd; + + // knife velocity is stored in pos1 (cuz knife->velocity is zero after impact) + VectorCopy(inflictor->pos1, fwd); + VectorAdd(attacker->s.origin, attacker->client->ps.viewoffset, firePoint); +// VectorCopy(attacker->s.origin, firePoint); + VectorMA(firePoint, 2, fwd, endPos); // gives a length of 1600 + + gi.polyTrace(firePoint, NULL, NULL, endPos, inflictor, CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_DEADMONSTER|CONTENTS_SHOT, + &tr, bulletTraceHitCheck); + if (0 == bullet_numHits) + { // entered this guy's bbox but missed him. in a perfect world we'd be able to allow + //the knife to fly along its merry way til it actually hits something, but for now i'll + //just drop it here + if ( (nNearMissZone = HandleNearMiss(monster, inflictor)) == -1) + { // couldn't find a zone anywhere near the knife + return 0; + } + } + VectorCopy(fwd, dir); + VectorCopy(endPos, point); + VectorCopy(firePoint, origin); + dflags = DT_PROJECTILE; + } + + take = damage; + + //shotgun shot--plop on generic damage for now + if (!((dflags&(DT_PROJECTILE|DT_DIRECTIONALGORE|DT_MANGLE)))) + { + //new, very random zone-chooser. + vec3_t myFacing, dmgFacing, mySide, myUp; + + AngleVectors(monster.s.angles, myFacing, mySide, myUp); + + VectorSubtract(monster.s.origin, origin, dmgFacing); + VectorNormalize(dmgFacing); + + if(DotProduct(myFacing, dmgFacing) > .707) + {//nearly colinear - being hit from behind + backCode=GZ_CHEST_FRONT; + switch(gi.irand(0,3)) + { + case 0: + listOfFrontCodes[numOfFrontCodes++]=GZ_CHEST_BACK; + break; + case 1: + listOfFrontCodes[numOfFrontCodes++]=GZ_SHLDR_LEFT_BACK; + break; + case 2: + listOfFrontCodes[numOfFrontCodes++]=GZ_SHLDR_RIGHT_BACK; + break; + default: + case 3: + listOfFrontCodes[numOfFrontCodes++]=GZ_GUT_BACK; + break; + } + } + else if(DotProduct(myFacing, dmgFacing) < -.707) + {//in the front - ow! + backCode=GZ_CHEST_BACK; + switch(gi.irand(0,3)) + { + case 0: + listOfFrontCodes[numOfFrontCodes++]=GZ_CHEST_FRONT; + break; + case 1: + listOfFrontCodes[numOfFrontCodes++]=GZ_SHLDR_LEFT_FRONT; + break; + case 2: + listOfFrontCodes[numOfFrontCodes++]=GZ_SHLDR_RIGHT_FRONT; + break; + default: + case 3: + listOfFrontCodes[numOfFrontCodes++]=GZ_GUT_FRONT; + break; + } + } + else if(DotProduct(mySide, dmgFacing) > 0) + {//um... + backCode=GZ_CHEST_BACK; + switch(gi.irand(0,4)) + { + case 0: + listOfFrontCodes[numOfFrontCodes++]=GZ_CHEST_FRONT; + break; + case 1: + listOfFrontCodes[numOfFrontCodes++]=GZ_ARM_UPPER_LEFT; + break; + case 2: + listOfFrontCodes[numOfFrontCodes++]=GZ_GUT_BACK; + break; + case 3: + listOfFrontCodes[numOfFrontCodes++]=GZ_SHLDR_LEFT_BACK; + break; + default: + case 4: + listOfFrontCodes[numOfFrontCodes++]=GZ_GUT_FRONT; + break; + } + + } + else + {//er... + backCode=GZ_CHEST_BACK; + switch(gi.irand(0,4)) + { + case 0: + listOfFrontCodes[numOfFrontCodes++]=GZ_CHEST_FRONT; + break; + case 1: + listOfFrontCodes[numOfFrontCodes++]=GZ_ARM_UPPER_RIGHT; + break; + case 2: + listOfFrontCodes[numOfFrontCodes++]=GZ_GUT_BACK; + break; + case 3: + listOfFrontCodes[numOfFrontCodes++]=GZ_SHLDR_RIGHT_BACK; + break; + default: + case 4: + listOfFrontCodes[numOfFrontCodes++]=GZ_GUT_FRONT; + break; + } + } + } + else if(dflags & DT_DIRECTIONALGORE) + { + // sort out what sort of damage should be shown based on which side is being pelted + // note that all of this is kind of a 2d representation of everything - good enough for now, I s'pose =/ + + vec3_t myFacing, dmgFacing, mySide; + + AngleVectors(monster.s.angles, myFacing, mySide, 0); + + VectorSubtract(monster.s.origin, origin, dmgFacing); + VectorNormalize(dmgFacing); + + if(DotProduct(myFacing, dmgFacing) > .707) + {//nearly colinear - being hit from behind + backCode=GZ_CHEST_FRONT; + listOfFrontCodes[numOfFrontCodes++]=GZ_CHEST_BACK; + listOfFrontCodes[numOfFrontCodes++]=GZ_SHLDR_LEFT_BACK; + listOfFrontCodes[numOfFrontCodes++]=GZ_SHLDR_RIGHT_BACK; + listOfFrontCodes[numOfFrontCodes++]=GZ_GUT_BACK; + } + else if(DotProduct(myFacing, dmgFacing) < -.707) + {//in the front - ow! + backCode=GZ_CHEST_BACK; + listOfFrontCodes[numOfFrontCodes++]=GZ_CHEST_FRONT; + listOfFrontCodes[numOfFrontCodes++]=GZ_SHLDR_LEFT_FRONT; + listOfFrontCodes[numOfFrontCodes++]=GZ_SHLDR_RIGHT_FRONT; + listOfFrontCodes[numOfFrontCodes++]=GZ_GUT_FRONT; + } + else if(DotProduct(mySide, dmgFacing) > 0) + {//um... + backCode=GZ_CHEST_BACK; + listOfFrontCodes[numOfFrontCodes++]=GZ_CHEST_FRONT; + listOfFrontCodes[numOfFrontCodes++]=GZ_ARM_UPPER_LEFT; + listOfFrontCodes[numOfFrontCodes++]=GZ_GUT_BACK; + listOfFrontCodes[numOfFrontCodes++]=GZ_SHLDR_LEFT_BACK; + listOfFrontCodes[numOfFrontCodes++]=GZ_GUT_FRONT; + + } + else + {//er... + backCode=GZ_CHEST_BACK; + listOfFrontCodes[numOfFrontCodes++]=GZ_CHEST_FRONT; + listOfFrontCodes[numOfFrontCodes++]=GZ_ARM_UPPER_RIGHT; + listOfFrontCodes[numOfFrontCodes++]=GZ_GUT_BACK; + listOfFrontCodes[numOfFrontCodes++]=GZ_SHLDR_RIGHT_BACK; + listOfFrontCodes[numOfFrontCodes++]=GZ_GUT_FRONT; + } + } + //projectile--go through the trace and get the best frontHole + else + { + + + + //NO HITS!!! + if (bullet_numHits == 0 && (nNearMissZone == -1) ) + { + //if i'm a client, try again :( + if (monster.client && monster.ghoulInst) + { + } + if (bullet_numHits == 0) + { +// gi.dprintf("Missed!\n"); + return 0; + } + } + + if (!bKnife) + { + //get exit wound + //doing exit wound first, so i can get multiple entry wounds and stop consideration at the exit wound--the other way around wouldn't work: only want one exit wound. + for (i=bullet_numHits-1;i>=0;i--) + { + //hit my instance + if (bullet_Hits[i].Inst==myInstance->GetInstPtr()) + { + //hit something + if (bullet_Hits[i].Mesh) + { + boltPiece=NULL;//don't blow stuff off that got hit after this. + + + //don't already have a backhole + if (backCode==numGoreZones) + { + VectorScale(*(vec3_t*)(&bullet_EntDir),bullet_Hits[i].Distance,ExitPos); + Vec3AddAssign(*(vec3_t*)(&bullet_EntStart), ExitPos); + tdist=bestGoreDist=9999999; + for (j=0;jbullet_Hits[i].Distance) + { + tdist=bullet_Hits[i].Distance; + backCode = (gz_code)j; + } + } + else + { + //is this a better match than what's already in fronthole? + bullet_Hits[i].Inst->GetBoltMatrix(level.time,ZoneMatrix,gzones[j].bolt,IGhoulInst::MatrixType::Entity); + ZoneMatrix.GetRow(3,zonePos); + VectorSubtract(ExitPos,*(vec3_t*)(&zonePos),tvec); + curGoreDist = VectorLengthSquared(tvec); + if (backCode==numGoreZones || curGoreDistFindBoltInstance(bullet_Hits[i].Inst); + } + } + } // if (!bKnife) + else + { + backHoleHitNum = bullet_numHits - 1; + } + + //if the first thing this shot hit was a bolt-on, try to blow it off. + if (boltPiece && boltPiece->GetBolterBolt()) + { + int k; + VectorScale(dir,tdist,*(vec3_t*)(&EntryPos)); + for (k=0;k<3;k++) + { + EntryPos[k]+=point[k]; + } + bool bTooToughToDropWeapon = false, bHitAWeapon = false; + float fArmorPercentLeft = GetArmorPercentRemaining(); + float fHealthPercentLeft = (float)monster.health / (float)monster.max_health; + + ai_c *my_ai = (ai_c *)((ai_public_c *)monster.ai); + + // if this is an armored guy... + //only let him drop his gun if he's down to < 50% armor or < 50% health. + if(my_ai && !(my_ai->GetMySkills()->getDropWeap())) + { // rocket guys dropping their guns is weak + bTooToughToDropWeapon = true; + } + if ( (fArmorPercentLeft > 0.50) && (fHealthPercentLeft > 0.50) ) + { + bTooToughToDropWeapon = true; + } + bHitAWeapon = false;//(GetWeaponType(boltPiece) != SFW_EMPTYSLOT); + if(monster.flags & FL_IAMTHEBOSS) + { // the boss hates it when you shoot his weapon. So do so. + } + else if ( (bHitAWeapon && !bTooToughToDropWeapon) || + (!bHitAWeapon) || + dm->isDM()) + { + take = DropBoltOn(monster, boltPiece, EntryPos, Direction, take); + } + else if (bHitAWeapon && bTooToughToDropWeapon) + { // if we hit a weapon but this guy is too tough to drop it yet, return + //some minimal amount of damage + return 0;//take*.25; + } + + //did i get a weapon shot out of my hands??? + if(oldLeftWeap&&oldLeftWeap!=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l"))) + { + lWeaponShot=true; + } + if (oldRightWeap&&oldRightWeap!=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"))) + { + rWeaponShot=true; + } + + if (take == 0) // this is purty hacky, right hyaw... + { + return 0;//1; + } + } + + //get entrance wound--stop at one! + for (i=0;iGetInstPtr()) + { + //hit something + if (bullet_Hits[i].Mesh) + { + VectorScale(*(vec3_t*)(&bullet_EntDir),bullet_Hits[i].Distance,*(vec3_t*)(&EntryPos)); + EntryPos += bullet_EntStart; + tdist=bestGoreDist=9999999; + for (j=0;jbullet_Hits[i].Distance) + { + tdist=bullet_Hits[i].Distance; + frontCode = (gz_code)j; + } + } + else + { + //is this a better match than what's already in fronthole? + bullet_Hits[i].Inst->GetBoltMatrix(level.time,ZoneMatrix,gzones[j].bolt,IGhoulInst::MatrixType::Entity); + ZoneMatrix.GetRow(3,zonePos); + VectorSubtract(*(vec3_t*)(&EntryPos),*(vec3_t*)(&zonePos),tvec); + curGoreDist = VectorLengthSquared(tvec); + if (frontCode==numGoreZones || curGoreDistmonster.s.origin[k]+monster.maxs[k]) + { + EntryPos[k]=monster.s.origin[k]+monster.maxs[k]; + } + } + EntryPosIsValid=true; + + listOfFrontCodes[numOfFrontCodes++]=frontCode; + } + } + } + } + } + + // if we're here because of a near miss from a thrown knife, fake a couple of things + if (nNearMissZone != -1) + { + numOfFrontCodes = 1; + listOfFrontCodes[0] = nNearMissZone; + } + + //update for monster armor here + if (monster.ai) + { + //go thru all front holes, distributing damage amongst the armor + for (i=0;i= 0 && frontCode < numGoreZones) + { + //if fronthole has armor, evaluate + if (gzones[frontCode].damage<0) + { + // kef -- I _think_ getting in here means we hit armor + bArmor = true; + + //first, show the armor damage (this may immediately switch over to bloodiness, but that should be ok) + if (gzones[frontCode].id&&myInstance->GetInstPtr()->SetFrameOverride("gz", "gz_armor", gzones[frontCode].id)) + { + myInstance->GetInstPtr()->SetPartOnOff(gzones[frontCode].id, true); + } + + //update buddy zone, if any + if (gzones[frontCode].buddyzoneGetInstPtr()->SetFrameOverride("gz", "gz_armor", gzones[gzones[frontCode].buddyzone].id)) + { + myInstance->GetInstPtr()->SetPartOnOff(gzones[gzones[frontCode].buddyzone].id, true); + } + + // this handles the special properties some of the weapons have regarding armor piercing / absorbtion + float penetrateDmg = 0; + if(gzones[frontCode].damage < 0) + { + take -= (take * absorb); + //penetrateDmg = take * penetrate; + //take -= penetrateDmg; + } + + float tempDmg;//to handle armor piercers + tempDmg = take; + if(penetrate > 0) + { + tempDmg *= 2; + } + + //all damage covered + if (tempDmg <= -gzones[frontCode].damage) + { + bodyDamage&=~BODYDAMAGE_RECENT; + gzones[frontCode].damage+=tempDmg; + + if (EntryPosIsValid) + { + vec3_t sparkdir; + VectorSubtract(origin,point,sparkdir); + VectorNormalize(sparkdir); + VectorScale(dir,-1.0f,sparkdir); + fxRunner.setDir(sparkdir); + /*if(absorb) + { + fxRunner.exec("weakspark", *((vec3_t*)&EntryPos));//eh, using same spark as walls now--hope that's ok + } + else if(penetrate) + { + fxRunner.exec("armorhit", *((vec3_t*)&EntryPos));//eh, using same spark as walls now--hope that's ok + } + else*/ + { + fxRunner.exec("spark2", *((vec3_t*)&EntryPos));//eh, using same spark as walls now--hope that's ok + } + gi.sound (&monster, CHAN_AUTO, gi.soundindex ("impact/armor/hit.wav"), .6, ATTN_NORM, 0); +// FX_MakeSparks(*((vec3_t*)&EntryPos), sparkdir, 1); + } + // kef -- handle thrown knives properly + if (bKnife) + { // just drop the knife where it hit the guy + DropKnife(monster, inflictor); + } + return 0; + } + //not all damage covered + else + { + tempDmg+=gzones[frontCode].damage; + gzones[frontCode].damage=0; + } + if(penetrate > 0) + { // if we were destroying armor a second ago, return to our appropriate damage amount + tempDmg *= .5; + } + take = tempDmg; + } + } + } + } + + //for each of the front holes, scale the damage (this should cover massive headshot damage, and lower armshot damage) + for (i=0;i= 0 && frontCode < numGoreZones) + { + take=(int)((float)take*gzones[frontCode].damScale); + } + } + + AngleVectors(monster.s.angles, forward, right, up); + VectorSubtract(point, monster.s.origin, to_impact); + VectorNormalize(to_impact); + + Emote(monster, EMOTION_PAIN, 10.0); + + VectorSubtract(point, monster.s.origin, bodyloc); + + + //DON'T ADJUST TAKE AFTER THIS POINT!!!!!!! I CHECK TO SEE IF I'M DEAD HERE!!!!! + + //dying--drop weapons + if (monster.health <= take) + { + ggBinstC *bolted; + vec3_t handPos; + int safeIters=0; + Emote(monster, EMOTION_PAIN, 99999.0); + VectorSet(handPos,0,0,0); + + // this is a little sad, but we can't drop boltons if we were hit by a train + if (bDropBoltons) + { + // drop what's in left hand + monster.ghoulInst->GetBoltMatrix(level.time,ZoneMatrix,monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l"),IGhoulInst::MatrixType::Entity); + // EntToWorldMatrix(monster.s.origin, monster.s.angles, ZoneMatrix); + ZoneMatrix.GetRow(3,zonePos); + handPos[0]=zonePos[0]; + handPos[1]=zonePos[1]; + handPos[2]=zonePos[2]; + while (myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l"))&&safeIters++<10) + { + bolted=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l")); + DropBoltOn(monster, bolted, zonePos, Direction, take); + } + + //drop what's in right hand + monster.ghoulInst->GetBoltMatrix(level.time,ZoneMatrix,monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"),IGhoulInst::MatrixType::Entity); + // EntToWorldMatrix(monster.s.origin, monster.s.angles, ZoneMatrix); + ZoneMatrix.GetRow(3,zonePos); + handPos[0]=zonePos[0]; + handPos[1]=zonePos[1]; + handPos[2]=zonePos[2]; + safeIters=0; + while (myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"))&&safeIters++<10) + { + bolted=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r")); + DropBoltOn(monster, bolted, zonePos, Direction, take); + } + + //lose any headgear + monster.ghoulInst->GetBoltMatrix(level.time,ZoneMatrix,monster.ghoulInst->GetGhoulObject()->FindPart("abolt_head_t"),IGhoulInst::MatrixType::Entity); + // EntToWorldMatrix(monster.s.origin, monster.s.angles, ZoneMatrix); + ZoneMatrix.GetRow(3,zonePos); + handPos[0]=zonePos[0]; + handPos[1]=zonePos[1]; + handPos[2]=zonePos[2]; + safeIters=0; + while (myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("abolt_head_t"))&&safeIters++<10) + { + bolted=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("abolt_head_t")); + DropBoltOn(monster, bolted, zonePos, Direction, take); + } + } // if (bDropBoltons) + + } + + for (i=0;iai) + { + body=(bodydog_c*)((ai_c*)((ai_public_c*)self->ai))->GetBody(); + ((ai_c*)((ai_public_c*)self->ai))->MeleeFrame(*self); + } + if (body) + { + body->SetLastAttackTime(*(float*)data); + } +} + +void blowndogpart_think(edict_t *self) +{ + if (VectorLengthSquared(self->velocity)<10) + { + gi.sound (self, CHAN_VOICE, gi.soundindex ("impact/gore/limbfall.wav"), .6, ATTN_NORM, 0); + VectorClear(self->avelocity); + self->s.angles[ROLL]=-90; + //self->s.angles[2]=0; + self->think = blownpartremove_think; + self->nextthink=level.time+45; + return; + } + self->nextthink=level.time+0.1; +} + +void bodydog_c::PlayBarkSound(edict_t &monster) +{ + if (level.time - m_fLastBarkSoundTime > .5) + { + m_fLastBarkSoundTime = level.time; + + switch(gi.irand(0,2)) + { + case 0: + gi.sound (&monster, CHAN_BODY, gi.soundindex ("Enemy/Dog/Bark1.wav"), .8, ATTN_NORM, 0); + break; + case 1: + gi.sound (&monster, CHAN_BODY, gi.soundindex ("Enemy/Dog/Bark2.wav"), .8, ATTN_NORM, 0); + break; + case 2: + gi.sound (&monster, CHAN_BODY, gi.soundindex ("Enemy/Dog/Bark3.wav"), .8, ATTN_NORM, 0); + break; + } + } +} + +void bodydog_c::PlayBiteSound(edict_t &monster) +{ + if (level.time - m_fLastBiteSoundTime > .5) + { + m_fLastBiteSoundTime = level.time; + switch(gi.irand(0,1)) + { + case 0: + gi.sound (&monster, CHAN_BODY, gi.soundindex ("Enemy/Dog/Bite1.wav"), .8, ATTN_NORM, 0); + break; + case 1: + gi.sound (&monster, CHAN_BODY, gi.soundindex ("Enemy/Dog/Bite2.wav"), .8, ATTN_NORM, 0); + break; + } + } +} + +void bodydog_c::PlayPainSound(edict_t &monster) +{ + if ( (monster.health > 0) && (level.time - m_fLastPainSoundTime > .5) ) + { + m_fLastPainSoundTime = level.time; + gi.sound (&monster, CHAN_BODY, gi.soundindex ("Enemy/Dog/Die.wav"), .8, ATTN_NORM, 0); + } +} + +bodydog_c::bodydog_c() +{ + emotion = EMOTION_NORMAL; + emotion_expire=level.time; + emotionScripted=false; + currentmove = NULL; + holdCode = HOLDCODE_NO; + currentMoveFinished = true; + frame_flags = 0; + fJumpDist = 85.0f; + fJumpSpeed = 100.0f; + fLastAttackTime = 0; + fLastHeadTurnTime = 0; + bTurnedAfterAttack = false; + FinalAnim = false; + FinalSound = false; + m_fLastBarkSoundTime = 0; + m_fLastBiteSoundTime = 0; + m_fLastPainSoundTime = 0; +} + +void bodydog_c::SetGoreZoneDamageScale(edict_t &monster) +{ + if (numGoreZonesHasTarget()) + { + // if we were sniffing, we have since lost our target. therefore transition to a walk + if (currentmove == &generic_dog_move_sniff && + VerifySequence(monster, &generic_dog_move_walk_from_sniff, reject_actionflags)) + { + returnAnim = &generic_dog_move_walk_from_sniff; + } + else + { + // if the dog is walking with a looping anim (looking straight, looking left, looking + //right) then we can hold off on transitioning to a different walk...looks more random. + //if the dog has just been init'd and therefore has no current anim, jump in there and + //give it one. if it's just finished a transition anim we _have_ to change anims. + if ((currentmove == NULL || + currentmove == &generic_dog_move_walkl_from_walk || + currentmove == &generic_dog_move_walk_from_walkl || + currentmove == &generic_dog_move_walkr_from_walk || + currentmove == &generic_dog_move_walk_from_walkr || + currentmove == &generic_dog_move_walkl_walkr) || + ((currentmove == &generic_dog_move_walk || + currentmove == &generic_dog_move_walkl || + currentmove == &generic_dog_move_walkr) && + !(rand()%3))) + { + fLastHeadTurnTime = level.time; + // if we were walking looking straight (or if we were swiveling left + //and right), start turning one way or the other + if (currentmove == &generic_dog_move_walk || currentmove == &generic_dog_move_walkl_walkr) + { + int nRand = rand()%3; + if (nRand == 0 && VerifySequence(monster, &generic_dog_move_walkl_from_walk, reject_actionflags)) + { + // start turning to look left + returnAnim = &generic_dog_move_walkl_from_walk; + } + else if (nRand == 1 && VerifySequence(monster, &generic_dog_move_walkr_from_walk, reject_actionflags)) + { + // start turning to look right + returnAnim = &generic_dog_move_walkr_from_walk; + } + else if (nRand == 2 && VerifySequence(monster, &generic_dog_move_walkl_walkr, reject_actionflags)) + { + // start swiveling left and right + returnAnim = &generic_dog_move_walkl_walkr; + } + } + else if (currentmove == &generic_dog_move_walkl) + { + // we were looking left, so start turning to look straight + if (VerifySequence(monster, &generic_dog_move_walk_from_walkl, reject_actionflags)) + { + returnAnim = &generic_dog_move_walk_from_walkl; + } + } + else if (currentmove == &generic_dog_move_walkr) + { + // we were looking right, so start turning to look straight + if (VerifySequence(monster, &generic_dog_move_walk_from_walkr, reject_actionflags)) + { + returnAnim = &generic_dog_move_walk_from_walkr; + } + } + // if we were turning from left to straight or right to straight, now look straight + else if (currentmove == &generic_dog_move_walk_from_walkl || + currentmove == &generic_dog_move_walk_from_walkr) + { + if (VerifySequence(monster, &generic_dog_move_walk, reject_actionflags)) + { + returnAnim = &generic_dog_move_walk; + } + } + else if (currentmove == &generic_dog_move_walkr_from_walk) + { + // we were turning from straight to right, so now look right + if (VerifySequence(monster, &generic_dog_move_walkr, reject_actionflags)) + { + returnAnim = &generic_dog_move_walkr; + } + } + else if (currentmove == &generic_dog_move_walkl_from_walk) + { + // we were turning from straight to left, so now look right + if (VerifySequence(monster, &generic_dog_move_walkl, reject_actionflags)) + { + returnAnim = &generic_dog_move_walkl; + } + } + else + { + // just have the dumb thing do its regular walk + returnAnim = &generic_dog_move_walk; + } + } + else + { + // based on a random number we decided not to switch animations this frame. + //our walking anims can only be switched at the end of the anim, though, so + //reset our currentMoveFinished boolean so that we won't try to switch until + //we hit the current anim's EOS again + currentMoveFinished = 0; + } + } + } + else + { + // we have a target, so sniff our way towards it. + + // if our current anim is NULL, or isn't sniff-related, or it's a non-looping sniff-related anim, or + //it's a looping sniff-related anim and we feel like it, change to a new anim + + //? + return GetSequenceForAttack(monster, dest, face, the_ai->getTarget(), seqtype, goal_bbox, ideal_move, reject_actionflags); + + if (currentmove == NULL || + (currentmove != &generic_dog_move_sniff && + currentmove != &generic_dog_move_walk_from_sniff && + currentmove != &generic_dog_move_walk && + currentmove != &generic_dog_move_sniff_from_walk) || + !(currentmove->actionFlags & ACTFLAG_LOOPANIM) || + !(rand()%4)) + { + if (currentmove == &generic_dog_move_sniff && + VerifySequence(monster, &generic_dog_move_walk_from_sniff, reject_actionflags)) + { + returnAnim = &generic_dog_move_walk_from_sniff; + } + else if (currentmove == &generic_dog_move_walk_from_sniff && + VerifySequence(monster, &generic_dog_move_walk, reject_actionflags)) + { + returnAnim = &generic_dog_move_walk; + } + else if (currentmove == &generic_dog_move_walk && + VerifySequence(monster, &generic_dog_move_sniff_from_walk, reject_actionflags)) + { + returnAnim = &generic_dog_move_sniff_from_walk; + } + else if (currentmove == &generic_dog_move_sniff_from_walk && + VerifySequence(monster, &generic_dog_move_sniff, reject_actionflags)) + { + returnAnim = &generic_dog_move_sniff; + } + else // our last anim was something non-sniff-related. just walk for now + { + returnAnim = &generic_dog_move_walk; + } + } + else + { + // need to clear this so we'll wait for the entire current anim to finish + //before switching to a new one + currentMoveFinished = 0; + } + } + + return returnAnim; +} + +mmove_t *bodydog_c::GetSequenceForStand(edict_t &monster, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + + if (currentmove && (currentmove->suggested_action==ACTCODE_STAND)&&(!IsAnimationFinished())) + { + return currentmove; + } + + if (currentmove == &generic_dog_move_sitdown && + VerifySequence(monster, &generic_dog_move_sit, reject_actionflags)) + { + // if our current anim is 'sitting down', and we got here, that means + //we just finished sitting down so go to 'sitting' + return &generic_dog_move_sit; + } + else if (currentmove == &generic_dog_move_sniff && + VerifySequence(monster, &generic_dog_move_walk_from_sniff, reject_actionflags)) + { + return &generic_dog_move_walk_from_sniff; + } + + if(currentmove != &generic_dog_move_sit) + { + if (!(rand()%5) && VerifySequence(monster, &generic_dog_move_sitdown, reject_actionflags)) + { + return &generic_dog_move_sitdown; + } + } + else + { + if (!(rand()%5) && VerifySequence(monster, &generic_dog_move_standup, reject_actionflags)) + { + return &generic_dog_move_standup; + } + else + { + return currentmove; + } + } + + if (the_ai && the_ai->HasHadTarget()) + { + if(!(rand()%3) && currentmove != &generic_dog_move_bark && VerifySequence(monster, &generic_dog_move_bark, reject_actionflags)) + { + PlayBarkSound(monster); + return &generic_dog_move_bark; + } + } + if(VerifySequence(monster, &generic_dog_move_pant, reject_actionflags)) + { + return &generic_dog_move_pant; + } + + return &generic_dog_move_walk; +} + +mmove_t *bodydog_c::GetSequenceForJump(edict_t &monster, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + return &generic_dog_move_walk; +} + +mmove_t *bodydog_c::GetSequenceForAttack(edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + vec3_t vToTarget, vForward; + float fToTarget; + qboolean bInFront = false; + + fLastAttackTime = level.time; + + // make sure the pooch finishes his attack + if (currentmove==&generic_dog_move_attack && !currentMoveFinished) + { + return currentmove; + } + + // if he was sitting, stand up + if (currentmove == &generic_dog_move_sit && + IsAvailableSequence(monster, &generic_dog_move_standup)) + { + return &generic_dog_move_standup; + } + else if (currentmove == &generic_dog_move_sniff && + VerifySequence(monster, &generic_dog_move_walk_from_sniff, reject_actionflags)) + { + return &generic_dog_move_walk_from_sniff; + } + + if (the_ai) + { + the_ai->GetAimVector(vForward); + } + else if (monster.client) + { + AngleVectors(monster.client->ps.viewangles, vForward, NULL, NULL); + } + else + { + AngleVectors(monster.s.angles, vForward, NULL, NULL); + } + +/* Com_Printf("%f, %f, %f\n", vForward[0], vForward[1], vForward[2]); + VectorSubtract(face, monster.s.origin, vForward); + VectorNormalize(vForward);*/ + + if (target) + { + VectorSubtract(target->s.origin, monster.s.origin, vToTarget); + fToTarget = VectorNormalize(vToTarget); + bInFront = (DotProduct(vToTarget, vForward) > 0.5); + } + if (bInFront) // if we're pointed at our target... + { + if ((fToTarget <= (fJumpDist*1.2f)) && //...and we're close enough... + (fToTarget >= (fJumpDist*0.8f))) //...but not too close + { + return &generic_dog_move_attack; + } + else if (fToTarget > (fJumpDist*1.2f)) // too far away. run towards target + { + if (0 == gi.irand(0, 3)) + { + PlayBarkSound(monster); + } + return &generic_dog_move_run; + } + else // (fToTarget < (fJumpDist*0.8f)) too close + { + // same attack as above but it starts 40% into the anim + if (&generic_dog_move_attack2 != currentmove) + { // play attack sound at beginning of attack + PlayBarkSound(monster); + } + return &generic_dog_move_attack2; + } + } + if (0 == gi.irand(0, 19)) + { + PlayBarkSound(monster); + } + return &generic_dog_move_walk; + //return &generic_dog_move_run; +} + +mmove_t *bodydog_c::GetSequenceForDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + mmove_t *animation = &generic_dog_move_walk; + + // don't interrupt our first dying animation + if (currentmove && (currentmove->suggested_action==ACTCODE_DEATH) && + !(currentmove->actionFlags&ACTFLAG_ALWAYSPRONE) && + !currentMoveFinished) + { + return currentmove; + } + + //are we already in a death animation? + if (currentmove && currentmove->suggested_action==ACTCODE_DEATH) + { + float lastHit = level.time-LastKilledTime; + + //if we're twitching on our backs, see if we should continue + if ((currentmove==&generic_dog_move_death_lbshotloop2) && (lastHit > 0.3)) + { + if (IsAvailableSequence(monster, &generic_dog_move_death_lbshotdeath)) + { + FinalAnim = true; + FinalSound = true; + animation = &generic_dog_move_death_lbshotdeath; + } + } + //if we're in a prone anim, or at the end of one that ends up prone, and we're shot, call the corpse juggle thingy + else if (((currentmove->actionFlags & ACTFLAG_ALWAYSPRONE)||(currentMoveFinished)) && (lastHit <= .1)) // corpse was just hit + { + if ((dflags & DT_JUGGLE) && IsAvailableSequence(monster, &generic_dog_move_death_lbshotloop2)) + { + FinalAnim = true; + FinalSound = true; + // check for laying on left side vs. right side + if ( (currentmove == &generic_dog_move_deathside) || + (currentmove == &generic_dog_move_death_lbshotdeath) || + (currentmove == &generic_dog_move_death_lbshotloop2) ) + { + animation = &generic_dog_move_death_lbshotloop2; + } + else + { + animation = &generic_dog_move_death_lbshotloop2; + } + } + else if (IsAvailableSequence(monster, &generic_dog_move_death_lbshotdeath) && currentmove!=&generic_dog_move_death_lbshotloop) + { + FinalAnim = true; + FinalSound = true; + ForceNextAnim = true; + // ideally, there'd be a check here similar to the one above, cuz the anim + //we play here should be determined by how we died. sadly, we don't + //currently have a shot-after-dead anim to be played if we died running + animation = &generic_dog_move_death_lbshotdeath; + } + else + { + animation = currentmove; + } + } + else + { + animation = currentmove; + } + + } + else + { + // first check if we've taken a _lot_ of damage (c4, etc.) + if (damage > 90) + { + // blown backward from a lot of damage + vec3_t vDmg; + animation = &generic_dog_move_death_back; + // make sure we're blown away from whatever did the damage + if (inflictor) + { + VectorSubtract(monster.s.origin, inflictor->s.origin, vDmg); + vDmg[2] = 0; + VectorNegate(vDmg, vDmg); + vectoangles(vDmg, monster.s.angles); + } + } + else if (currentmove == &generic_dog_move_run && IsAvailableSequence(monster, &generic_dog_move_deathrun)) + { + animation = &generic_dog_move_deathrun; + } + else if (IsAvailableSequence(monster, &generic_dog_move_deathside)) + { + animation = &generic_dog_move_deathside; + } + } + + return animation; +} + +void bodydog_c::RecognizeGoreZones(edict_t &monster) +{ +} + +/* doggie gore zones + + GZ_DOG_HEAD, + GZ_DOG_LCHEST, + GZ_DOG_RCHEST, + GZ_DOG_FRONT, + GZ_DOG_LLEG_FRONT, + GZ_DOG_RLEG_FRONT, + GZ_DOG_LHIP, + GZ_DOG_RHIP, + GZ_DOG_LLEG_BACK, + GZ_DOG_RLEG_BACK, +*/ +void bodydog_c::RecognizeHuskyGoreZones(edict_t &monster) +{ + GhoulID tempHole = 0; + int i; + + InitializeGoreZoneLevels(monster); + + SetGoreZoneDamageScale(monster); + for (i=0;iGetGhoulObject()->FindPart("_husky_torso"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_DOG_HEAD].parent_id=tempHole; + SetGoreZone(monster, "GZ_HEAD", GZ_DOG_HEAD); + gzones[GZ_DOG_LCHEST].parent_id=tempHole; + SetGoreZone(monster, "GZ_LCHEST", GZ_DOG_LCHEST); + gzones[GZ_DOG_RCHEST].parent_id=tempHole; + SetGoreZone(monster, "GZ_RCHEST", GZ_DOG_RCHEST); + gzones[GZ_DOG_FRONT].parent_id=tempHole; + SetGoreZone(monster, "GZ_FRONT", GZ_DOG_FRONT); + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_husky_lleg_front"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_DOG_LLEG_FRONT].parent_id=tempHole; + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_husky_rleg_front"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_DOG_RLEG_FRONT].parent_id=tempHole; + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_husky_lhip"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_DOG_LHIP].parent_id=tempHole; + SetGoreZone(monster, "GZ_LHIP", GZ_DOG_LHIP); + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_husky_rhip"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_DOG_RHIP].parent_id=tempHole; + SetGoreZone(monster, "GZ_RHIP", GZ_DOG_RHIP); + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_husky_lleg_back"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_DOG_LLEG_BACK].parent_id=tempHole; + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_husky_rleg_back"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_DOG_RLEG_BACK].parent_id=tempHole; + } + + + // blown caps are the chunks of meat on the blown off part that get turned on at the + //point of separation + SetGoreBlownCap(monster, "_CAP_HUSKY_RLEG_RSHOLDR", GZ_DOG_RLEG_FRONT); + SetGoreBlownCap(monster, "_CAP_HUSKY__LLEG_LSHOLDR", GZ_DOG_LLEG_FRONT); + SetGoreBlownCap(monster, "_CAP_HUSKY_RHIP_BODY", GZ_DOG_RHIP); + SetGoreBlownCap(monster, "_CAP_HUSKY_LLEG_LHIP", GZ_DOG_LLEG_BACK); + + // blown cap bolts are the points at which the separation occurs when a part is + //blown off (used as the origin for various blood-related effects). they point from + //the separated part toward the parent (e.g. from the leg to the hip) + // + //the dog doesn't have any. + // + + // caps are the chunks of meat on the parent part that get turned on at the + //point of separation + SetGoreCap(monster, "_CAP_HUSKY_TORSO_RSHOLDR", GZ_DOG_RLEG_FRONT); + SetGoreCap(monster, "_CAP_HUSKY_TORSO_LSHOLDR", GZ_DOG_LLEG_FRONT); + SetGoreCap(monster, "_CAP_HUSKY_TORSO_RHIP", GZ_DOG_RHIP); + SetGoreCap(monster, "_CAP_HUSKY_LHIP_LLEG", GZ_DOG_LLEG_BACK); + + // cap bolts are the points at which the separation occurs when a part is + //blown off (used as the origin for various blood-related effects). they point from + //the parent toward the separated part (e.g. from the hip to the leg) + SetGoreCapBolt(monster, "GBOLT_CAP_HUSKY_TORSO_RSHOLDR", GZ_DOG_RLEG_FRONT); + SetGoreCapBolt(monster, "GBOLT_CAP_HUSKY_TORSO_LSHOLDR", GZ_DOG_LLEG_FRONT); + SetGoreCapBolt(monster, "GBOLT_CAP_HUSKY_TORSO_RHIP", GZ_DOG_RHIP); + SetGoreCapBolt(monster, "GBOLT_CAP_HUSKY_LHIP_LLEG", GZ_DOG_LLEG_BACK); + + // bolts are used for hit location detection (which bolt is the dmg nearest?) and + //placing exit wounds (probably not for the dog, though) + SetGoreBolt(monster, "gbolt_head", GZ_DOG_HEAD); + SetGoreBolt(monster, "gbolt_front", GZ_DOG_FRONT); + SetGoreBolt(monster, "gbolt_lchest", GZ_DOG_LCHEST); + SetGoreBolt(monster, "gbolt_rchest", GZ_DOG_RCHEST); + + // blowme's are the parts that'll get blown off when an area is hit. the possible + //values are in the first column of dogblown_parts[], which are entries in dogblown_index. + gzones[GZ_DOG_LLEG_FRONT].blowme = &husky_blown_parts[GBLOWN_HUSKY_LLEG_FRONT]; + gzones[GZ_DOG_RLEG_FRONT].blowme = &husky_blown_parts[GBLOWN_HUSKY_RLEG_FRONT]; + gzones[GZ_DOG_LLEG_BACK].blowme = &husky_blown_parts[GBLOWN_HUSKY_LLEG_BACK]; + gzones[GZ_DOG_RHIP].blowme = &husky_blown_parts[GBLOWN_HUSKY_RHIP]; + gzones[GZ_DOG_RLEG_BACK].blowme = &husky_blown_parts[GBLOWN_HUSKY_RHIP]; + + // childzone's are used for turning off decals and maybe caps when subparts are + //blown off of parts (e.g. lower arm blown off then upper arm blown off). + gzones[GZ_DOG_RHIP].childzone = GZ_DOG_RLEG_BACK; + gzones[GZ_DOG_RLEG_BACK].childzone = GZ_DOG_RHIP; + + // a little weirdness here to make the right hip and right leg react the same + //when shot (they're both s'posed to fly off, attached to each other, when shot) + SetGoreBlownCap(monster, "_CAP_HUSKY_RHIP_BODY", GZ_DOG_RLEG_BACK); + SetGoreCap(monster, "_CAP_HUSKY_TORSO_RHIP", GZ_DOG_RLEG_BACK); + SetGoreCapBolt(monster, "GBOLT_CAP_HUSKY_TORSO_RHIP", GZ_DOG_RLEG_BACK); +} + +void bodydog_c::RecognizeRottweilerGoreZones(edict_t &monster) +{ + GhoulID tempHole = 0; + int i; + + InitializeGoreZoneLevels(monster); + + SetGoreZoneDamageScale(monster); + for (i=0;iGetGhoulObject()->FindPart("_rot_torso"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_DOG_HEAD].parent_id=tempHole; + SetGoreZone(monster, "GZ_HEAD", GZ_DOG_HEAD); + gzones[GZ_DOG_LCHEST].parent_id=tempHole; + SetGoreZone(monster, "GZ_LCHEST", GZ_DOG_LCHEST); + gzones[GZ_DOG_RCHEST].parent_id=tempHole; + SetGoreZone(monster, "GZ_RCHEST", GZ_DOG_RCHEST); + gzones[GZ_DOG_FRONT].parent_id=tempHole; + SetGoreZone(monster, "GZ_FRONT", GZ_DOG_FRONT); + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rot_lleg_front"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_DOG_LLEG_FRONT].parent_id=tempHole; + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rot_rleg_front"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_DOG_RLEG_FRONT].parent_id=tempHole; + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rot_torso"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_DOG_LHIP].parent_id=tempHole; + SetGoreZone(monster, "GZ_LHIP", GZ_DOG_LHIP); + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rot_rleg_back"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_DOG_RHIP].parent_id=tempHole; + SetGoreZone(monster, "GZ_RHIP", GZ_DOG_RHIP); + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rot_lleg_back"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_DOG_LLEG_BACK].parent_id=tempHole; + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rot_rleg_back"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_DOG_RLEG_BACK].parent_id=tempHole; + } + + + // blown caps are the chunks of meat on the blown off part that get turned on at the + //point of separation + SetGoreBlownCap(monster, "_CAP_ROT_RLEG_SHOULDER", GZ_DOG_RLEG_FRONT); + SetGoreBlownCap(monster, "_CAP_ROT_LLEG_SHOULDER", GZ_DOG_LLEG_FRONT); + SetGoreBlownCap(monster, "_CAP_ROT_RLEG_HIP", GZ_DOG_RHIP); + SetGoreBlownCap(monster, "_CAP_ROT_LLEG_HIP", GZ_DOG_LLEG_BACK); + + // blown cap bolts are the points at which the separation occurs when a part is + //blown off (used as the origin for various blood-related effects). they point from + //the separated part toward the parent (e.g. from the leg to the hip) + // + //the dog doesn't have any. + // + + // caps are the chunks of meat on the parent part that get turned on at the + //point of separation + SetGoreCap(monster, "_CAP_ROT_TORSO_RSHOULDER", GZ_DOG_RLEG_FRONT); + SetGoreCap(monster, "_CAP_ROT_TORSO_LSHOULDER", GZ_DOG_LLEG_FRONT); + SetGoreCap(monster, "_CAP_ROT_TORSO_RHIP", GZ_DOG_RHIP); + SetGoreCap(monster, "_CAP_ROT_TORSO_LHIP", GZ_DOG_LLEG_BACK); + + // cap bolts are the points at which the separation occurs when a part is + //blown off (used as the origin for various blood-related effects). they point from + //the parent toward the separated part (e.g. from the hip to the leg) + SetGoreCapBolt(monster, "GBOLT_CAP_ROT_TORSO_RSHOULDER", GZ_DOG_RLEG_FRONT); + SetGoreCapBolt(monster, "GBOLT_CAP_ROT_TORSO_LSHOULDER", GZ_DOG_LLEG_FRONT); + SetGoreCapBolt(monster, "GBOLT_CAP_ROT_TORSO_RHIP", GZ_DOG_RHIP); + SetGoreCapBolt(monster, "GBOLT_CAP_ROT_TORSO_LHIP", GZ_DOG_LLEG_BACK); + + // bolts are used for hit location detection (which bolt is the dmg nearest?) and + //placing exit wounds (probably not for the dog, though) + SetGoreBolt(monster, "gbolt_head", GZ_DOG_HEAD); + SetGoreBolt(monster, "gbolt_front", GZ_DOG_FRONT); + SetGoreBolt(monster, "gbolt_lchest", GZ_DOG_LCHEST); + SetGoreBolt(monster, "gbolt_rchest", GZ_DOG_RCHEST); + + // blowme's are the parts that'll get blown off when an area is hit. the possible + //values are in the first column of dogblown_parts[], which are entries in dogblown_index. + gzones[GZ_DOG_LLEG_FRONT].blowme = &rott_blown_parts[GBLOWN_ROTT_LLEG_FRONT]; + gzones[GZ_DOG_RLEG_FRONT].blowme = &rott_blown_parts[GBLOWN_ROTT_RLEG_FRONT]; + gzones[GZ_DOG_LLEG_BACK].blowme = &rott_blown_parts[GBLOWN_ROTT_LLEG_BACK]; + gzones[GZ_DOG_RHIP].blowme = &rott_blown_parts[GBLOWN_ROTT_RHIP]; + gzones[GZ_DOG_RLEG_BACK].blowme = &rott_blown_parts[GBLOWN_ROTT_RHIP]; + + // childzone's are used for turning off decals and maybe caps when subparts are + //blown off of parts (e.g. lower arm blown off then upper arm blown off). + gzones[GZ_DOG_RHIP].childzone = GZ_DOG_RLEG_BACK; + gzones[GZ_DOG_RLEG_BACK].childzone = GZ_DOG_RHIP; + + // a little weirdness here to make the right hip and right leg react the same + //when shot (they're both s'posed to fly off, attached to each other, when shot) + SetGoreBlownCap(monster, "_CAP_ROT_RLEG_HIP", GZ_DOG_RLEG_BACK); + SetGoreCap(monster, "_CAP_ROT_TORSO_RHIP", GZ_DOG_RLEG_BACK); + SetGoreCapBolt(monster, "GBOLT_CAP_ROT_TORSO_RHIP", GZ_DOG_RLEG_BACK); +} + + +int GetDamageLevel(int amount); +/*{ + if (amount<=0) + { + return 0; + } + if (amount<=100) + { + return 1; + } + if (amount<=200) + { + return 2; + } + return 3; +} +*/ + + + +int bodydog_c::ShowDamage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb) +{ + vec3_t bodyloc;//, footorigin; + gz_code listOfFrontCodes[3]; + int numOfFrontCodes=0; + gz_info *frontHole=NULL; + gz_code frontCode; + gz_info *backHole=NULL; + gz_code backCode; + vec3_t forward, right, up; + vec3_t to_impact; + float forward_back, right_left, up_down; + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + ggOinstC *blownInst; + int i,j; + int take; + float curGoreDist,bestGoreDist,tdist; + Vect3 EntryPos; + vec3_t ExitPos,tvec; + Vect3 zonePos; + Vect3 Direction; + Matrix4 ZoneMatrix; + + Matrix4 ToEnt,ToWorld; + + + for (i=0;i<3;i++) + { + Direction[i]=dir[i]; + } + + // Only show damage from projectile weapons and melee weapons, else return. + + if(!(dflags&DT_PROJECTILE|DT_MELEE)) + { + return(damage); + } + + take = damage; + + //NO HITS!!! + + if ( (dflags&DT_PROJECTILE) && (bullet_numHits == 0) ) + { + return 0; + } + + // play pain sound + PlayPainSound(monster); + + if (ai_goretest->value) + { + gi.dprintf("%d hits!\n", bullet_numHits); + } + + //shotgun shot--plop on generic damage for now + if (dflags&DT_DIRECTIONALGORE) + { + //new, very random zone-chooser. + vec3_t myFacing, dmgFacing, mySide, myUp; + + AngleVectors(monster.s.angles, myFacing, mySide, myUp); + + VectorSubtract(monster.s.origin, origin, dmgFacing); + VectorNormalize(dmgFacing); + + if(DotProduct(myFacing, dmgFacing) > .707) + {//nearly colinear - being hit from behind + backCode=GZ_DOG_FRONT; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_LLEG_BACK; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_RLEG_BACK; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_LHIP; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_RHIP; + } + else if(DotProduct(myFacing, dmgFacing) < -.707) + {//in the front - ow! + //backCode=GZ_CHEST_BACK; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_HEAD; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_RCHEST; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_LCHEST; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_FRONT; + } + else if(DotProduct(mySide, dmgFacing) > 0) + {//um... + backCode=GZ_DOG_LLEG_FRONT; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_RCHEST; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_RLEG_FRONT; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_RHIP; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_RLEG_BACK; + } + else + {//er... + backCode=GZ_DOG_RLEG_FRONT; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_LCHEST; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_LLEG_FRONT; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_LHIP; + listOfFrontCodes[numOfFrontCodes++]=GZ_DOG_LLEG_BACK; + } + } + else + { + //get entrance wound + for (i=0;iGetInstPtr()) + { + //hit something + if (bullet_Hits[i].Mesh) + { + VectorScale(*(vec3_t*)(&bullet_EntDir),bullet_Hits[i].Distance,*(vec3_t*)(&EntryPos)); + EntryPos += bullet_EntStart; + if (ai_goretest->value) + { + gi.dprintf("Entry wound position: %2.2f %2.2f %2.2f\n",EntryPos[0],EntryPos[1],EntryPos[2]); + } + tdist=bestGoreDist=9999999; + for (j=0;jvalue) + { + gi.dprintf("considering %s for frontHole\n",gzdognames[j]); + } + if (!gzones[j].bolt) + { + if (!frontHole || tdist>bullet_Hits[i].Distance) + { + tdist=bullet_Hits[i].Distance; + frontHole=&gzones[j]; + frontCode = (gz_dogcode)j; + if (ai_goretest->value) + { + gi.dprintf("Setting frontHole to %s\n",gzdognames[j]); + } + } + } + else + { + //is this a better match than what's already in fronthole? + bullet_Hits[i].Inst->GetBoltMatrix(level.time,ZoneMatrix,gzones[j].bolt,IGhoulInst::MatrixType::Entity); + ZoneMatrix.GetRow(3,zonePos); + if (ai_goretest->value) + { + gi.dprintf("Candidate position: %2.2f %2.2f %2.2f\n",zonePos[0],zonePos[1],zonePos[2]); + } + VectorSubtract(*(vec3_t*)(&EntryPos),*(vec3_t*)(&zonePos),tvec); + curGoreDist = VectorLengthSquared(tvec); + if (!frontHole || curGoreDistvalue) + { + gi.dprintf("Setting frontHole to %s\n",gzdognames[j]); + } + } + } + } + } + if (frontHole) + { + int k; + VectorScale(dir,tdist,*(vec3_t*)(&EntryPos)); + for (k=0;k<3;k++) + { + EntryPos[k]+=point[k]; + } + for (k=0;k<3;k++) + { + if (EntryPos[k]monster.s.origin[k]+monster.maxs[k]) + { + EntryPos[k]=monster.s.origin[k]+monster.maxs[k]; + } + } + if (ai_goretest->value) + { + gi.dprintf("spraying blood from %2.2f %2.2f %2.2f; monster pos %2.2f %2.2f %2.2f\n",EntryPos[0],EntryPos[1],EntryPos[2],monster.s.origin[0],monster.s.origin[1],monster.s.origin[2]); + } + FX_MakeBloodSpray(ExitPos, dir, 200, 1, &monster); + + break; + } + } + } + //hit a bolt-on + else if (!frontHole) + { + ggBinstC *boltPiece; + boltPiece = myInstance->FindBoltInstance(bullet_Hits[i].Inst); + if (boltPiece && boltPiece->GetBolterBolt()) + { + int k; + VectorScale(dir,tdist,*(vec3_t*)(&EntryPos)); + for (k=0;k<3;k++) + { + EntryPos[k]+=point[k]; + } + take = DropBoltOn(monster, boltPiece, EntryPos, Direction, take); + if (take <= 0) + { + return 0; + } + } + } + } + + + //get exit wound + for (i=bullet_numHits-1;i>=0;i--) + { + //hit something + if (bullet_Hits[i].Mesh) + { + //hit my instance + if (bullet_Hits[i].Inst==myInstance->GetInstPtr()) + { + VectorScale(*(vec3_t*)(&bullet_EntDir),bullet_Hits[i].Distance,ExitPos); + Vec3AddAssign(*(vec3_t*)(&bullet_EntStart), ExitPos); + if (ai_goretest->value) + { + gi.dprintf("Exit wound position: %2.2f %2.2f %2.2f\n",ExitPos[0],ExitPos[1],ExitPos[2]); + } + tdist=bestGoreDist=9999999; + for (j=0;jvalue) + { + gi.dprintf("considering %s for backHole\n",gzdognames[j]); + } + if (!gzones[j].bolt) + { + if (!backHole || tdist>bullet_Hits[i].Distance) + { + tdist=bullet_Hits[i].Distance; + backHole=&gzones[j]; + backCode = (gz_dogcode)j; + if (ai_goretest->value) + { + gi.dprintf("Setting backHole to %s\n",gzdognames[j]); + } + } + } + else + { + //is this a better match than what's already in fronthole? + bullet_Hits[i].Inst->GetBoltMatrix(level.time,ZoneMatrix,gzones[j].bolt,IGhoulInst::MatrixType::Entity); + ZoneMatrix.GetRow(3,zonePos); + if (ai_goretest->value) + { + gi.dprintf("Zone's bolt position: %2.2f %2.2f %2.2f\n",zonePos[0],zonePos[1],zonePos[2]); + } + VectorSubtract(ExitPos,*(vec3_t*)(&zonePos),tvec); + curGoreDist = VectorLengthSquared(tvec); + if (!backHole || curGoreDistvalue) + { + gi.dprintf("Setting backHole to %s\n",gzdognames[j]); + } + } + } + } + } + if (backHole) + { + VectorScale(dir,tdist,ExitPos); + VectorAdd(point,ExitPos,ExitPos); + break; + } + else + { + EntryPos=EntryPos;//debug breakpoint--removme! + } + } + //hit a bolt-on: do something! + else + { + EntryPos=EntryPos;//debug breakpoint--removme! + } + } + } + } + + //for each of the front holes, scale the damage (this should cover massive headshot damage, and lower armshot damage) + for (i=0;i= 0 && frontCode < numGoreZones) + { + take=(int)((float)take*gzones[frontCode].damScale); + } + } + + AngleVectors(monster.s.angles, forward, right, up); + VectorSubtract(point, monster.s.origin, to_impact); + VectorNormalize(to_impact); + forward_back = DotProduct(forward, to_impact); + right_left = DotProduct(right, to_impact); + up_down = DotProduct(up, to_impact); + + Emote(monster, EMOTION_PAIN, 10.0); + + VectorSubtract(point, monster.s.origin, bodyloc); + + //dying--drop weapons + if (false && monster.health <= take) + { + ggBinstC *bolted; + vec3_t handPos; + VectorSet(handPos,0,0,0); + monster.ghoulInst->GetBoltMatrix(level.time,ZoneMatrix,monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l"),IGhoulInst::MatrixType::Entity); + ZoneMatrix.GetRow(3,zonePos); + handPos[0]=zonePos[0]; + handPos[1]=zonePos[1]; + handPos[2]=zonePos[2]; + while (myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l"))) + { + bolted=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l")); + DropBoltOn(monster, bolted, zonePos, Direction, take); + } + monster.ghoulInst->GetBoltMatrix(level.time,ZoneMatrix,monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"),IGhoulInst::MatrixType::Entity); + ZoneMatrix.GetRow(3,zonePos); + handPos[0]=zonePos[0]; + handPos[1]=zonePos[1]; + handPos[2]=zonePos[2]; + while (myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"))) + { + bolted=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r")); + DropBoltOn(monster, bolted, zonePos, Direction, take); + } + } + + + if (frontHole&& frontHole->parent_id && myInstance->GetInstPtr()->GetPartOnOff(frontHole->parent_id)) + { + int newlevel; + frontHole->damage+=take; +// newlevel=1; + newlevel = GetDamageLevel(frontHole->damage); + if ((frontHole->id) && (!lock_gorezones)) + { + monster.ghoulInst->SetPartOnOff(frontHole->id, true); + } + if (monster.health <= damage && frontHole->cap && (ai_goretest->value || (dflags & DT_SEVER)) && (!lock_sever)) +// if (monster.health <= damage && frontHole->blownCap && (ai_goretest->value || (dflags & DT_SEVER)) && (!lock_sever)) + { + edict_t *danglyBit; + Emote(monster, EMOTION_DEAD, 1.0); + UpdateFace(monster); + danglyBit=MakeBlownPart(monster, frontCode, dir, &blownInst); + if (frontHole->blownCapBolt && blownInst) + { + if (frontHole->capPiece) + { + if (frontHole->capPieceBolt) + { + AddBoltedItem(monster, frontHole->blownCapBolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), frontHole->capPieceBolt, blownInst); + } + else + { + AddBoltedItem(monster, frontHole->blownCapBolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), "to_gbolt", blownInst); + } + } + else + { + AddBoltedItem(monster, frontHole->blownCapBolt, "Enemy/bolt", "g_cap1", "to_gbolt", blownInst); + } + } + if (frontHole->blownCap) + { + danglyBit->ghoulInst->SetPartOnOff(frontHole->blownCap,true); + danglyBit->ghoulInst->SetFrameOverride("c","c_blood",frontHole->blownCap); + } + BlowPart(monster,frontHole->blowme,danglyBit); + BlowZone(monster,frontHole->childzone,frontHole->childzone,danglyBit); + if (frontHole->parent_id) + { + myInstance->GetInstPtr()->SetPartOnOff(frontHole->parent_id,false); + } + if (frontHole->id) + { + myInstance->GetInstPtr()->SetPartOnOff(frontHole->id,false); + } + if (backHole && backHole->id) + { + myInstance->GetInstPtr()->SetPartOnOff(backHole->id,false); + } + if (frontHole->cap) + { + myInstance->GetInstPtr()->SetPartOnOff(frontHole->cap,true); + myInstance->GetInstPtr()->SetFrameOverride("c","c_blood",frontHole->cap); + } + if (frontHole->capbolt) + { + if (frontHole->capPiece) + { + if (frontHole->capPieceBolt) + { + AddBoltedItem(monster, frontHole->capbolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), frontHole->capPieceBolt, myInstance); + } + else + { + AddBoltedItem(monster, frontHole->capbolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), "to_gbolt", myInstance); + } + } + else + { + AddBoltedItem(monster, frontHole->capbolt, "Enemy/bolt", "g_cap1", "to_gbolt", myInstance); + } + if (monster.health>0) + { +// gi.sound (&monster, CHAN_BODY, gi.soundindex ("impact/gore/spout.wav"), .8, ATTN_NORM, 0); + FX_Bleed(&monster, frontHole->capbolt, 50); + } + else + { + FX_BloodCloud(&monster, frontHole->capbolt, 100); + } + } + if (spout == -1) + { + if (frontHole->capbolt) + { + monster.ghoulInst->AddMatrixCallBack(&TheDogSetVectorCallback,frontHole->capbolt,IGhoulInst::MatrixType::Entity); + spout = frontHole - gzones; + } + else if (frontHole->bolt) + { + monster.ghoulInst->AddMatrixCallBack(&TheDogSetVectorCallback,frontHole->bolt,IGhoulInst::MatrixType::Entity); + spout = frontHole - gzones; + } + } + } + else if (newlevel>frontHole->damage_level) + { + int i; + + //knock off loose parts + ShakePart(monster, frontHole->blowme, Direction); + + if ((frontHole->id) && (!lock_gorezones)) + { + i=rand()%3; + + //if this zone was already active, match up the row + if (frontHole->damage_level) + { + GhoulID skinID=myInstance->GetInstPtr()->GetFrameOverride("gz",frontHole->id); + if (skinID) + { + for (i=0;i<4;i++) + { + if (skinID==gzone_levels[frontHole->damage_level-1][i]) + break; + } + } + } + + if (i<4 && gzone_levels[newlevel-1][i] != NULL_GhoulID) + { + myInstance->GetInstPtr()->SetFrameOverride("gz",gzone_levels[newlevel-1][i],frontHole->id); + } + } + if (frontHole->bolt) + { + FX_Bleed(&monster, frontHole->bolt, 25); + if ((frontHole==&gzones[GZ_GUT_FRONT]) && (!lock_gorezones)) +// if (newlevel==3) + { + myInstance->RemoveBolt(frontHole->bolt); + AddBoltedItem(monster, frontHole->bolt, "Enemy/bolt", "g_guts", "to_gbolt_gut_f", myInstance); + } + } + if (!lock_gorezones) + { + frontHole->damage_level=newlevel; + } + } + } + if (backHole && backHole->id && backHole->parent_id && backHole != frontHole && myInstance->GetInstPtr()->GetPartOnOff(backHole->parent_id)) + { + int i=rand()%3; + //exit wound--massive damage + backHole->damage=GetMinimumDamageForLevel(3); + if (backHole->damage_level<3) + { + + //if this zone was already active, match up the row + if (backHole->damage_level) + { + GhoulID skinID=myInstance->GetInstPtr()->GetFrameOverride("gz",backHole->id); + if (skinID) + { + for (i=0;i<4;i++) + { + if (skinID==gzone_levels[backHole->damage_level-1][i]) + break; + } + } + } + + if (i<4) + { + myInstance->GetInstPtr()->SetFrameOverride("gz",gzone_levels[2][i],backHole->id); + } + backHole->damage_level=3; + } + if (!lock_gorezones) + { + monster.ghoulInst->SetPartOnOff(backHole->id, true); + } + } + + // throw some fleshy debris chunks for the kiddies + if (!VectorCompare(point, vec3_origin)) + { + int numchunks = gi.irand(0,5); + FX_ThrowDebris(point,vec3_origin, numchunks, DEBRIS_TINY, MAT_ROCK_FLESH, 0, 0, 0, SURF_BLOOD); + } + + return take; +} + +void bodydog_c::SetRootBolt(edict_t &monster) +{ + GhoulID tempID; + GhoulID tempBolt; + GhoulID tempNote; + + // the death animations look a little weird if the dog obtains a knockback-induced velocity + monster.flags &= ~FL_NO_KNOCKBACK; + + AllocateGoreZones(monster); + RecognizeGoreZones(monster); + tempBolt=monster.ghoulInst->GetGhoulObject()->FindPart("quake_origin"); + if (tempBolt) + { + monster.ghoulInst->AddMatrixCallBack(&TheDogFollowGenericPivot,tempBolt,IGhoulInst::MatrixType::JacobianEntity); + } + else + { + gi.dprintf("WARNING: monster origin not found--wacky!!\n"); + } + + tempID=monster.ghoulInst->GetGhoulObject()->FindPart("quake_ground"); + if (tempID) + { + monster.ghoulInst->AddMatrixCallBack(&TheDogGroundCallback,tempID,IGhoulInst::MatrixType::Entity); + } + tempBolt=monster.ghoulInst->GetGhoulObject()->FindPart("GBOLT_HEAD"); + if (tempBolt) + { + monster.ghoulInst->AddMatrixCallBack(&TheDogMouthCallback,tempBolt,IGhoulInst::MatrixType::Entity); + } + else + { + gi.dprintf("WARNING: monster mouth not found--sight will be defective!!\n"); + } + + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("BOS"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheDogMonsterSeqBeginCallback,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("EOS"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheDogMonsterSeqEndCallback,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("jump"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheDogJumpCallBack,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("thud"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheDogThudCallBack,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("knee"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheDogKneeCallBack,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("inair"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheDogInAirCallBack,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("fire"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheDogFireCallBack,tempNote); + } +} + +attacks_e bodydog_c::GetBestWeapon(edict_t &monster) +{ + return ATK_DOG_ATTACK; +} + +void bodydog_c::BiteMe(edict_t &monster, qboolean forceFireRate) +{ + Matrix4 boltToDog, dogToWorld, final; + vec3_t firePoint = {0,0,0}, forward, rotateangs; + IGhoulInst *instDog = monster.ghoulInst; + IGhoulObj *obj = NULL; + GhoulID boltID = 0; + if (instDog) + { + if(obj = instDog->GetGhoulObject()) + { + boltID = obj->FindPart("SBOLT_HUSKY_TONGUE"); + } + } + if (boltID) + { + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + if (the_ai) + { + instDog->GetBoltMatrix(level.time, boltToDog, boltID,IGhoulInst::MatrixType::Entity); + VectorDegreesToRadians(monster.s.angles,rotateangs); + dogToWorld.Identity(); + dogToWorld.Rotate(rotateangs[2],rotateangs[0],-rotateangs[1]);//grr. + final.Concat(boltToDog,dogToWorld); + final.GetRow(3,(Vect3)firePoint); + VectorAdd(monster.s.origin,firePoint,firePoint); + + the_ai->GetAimVector(forward); + + + weapons.attack(ATK_DOG_ATTACK, &monster, firePoint, forward, DogAttackSuccess); + + rLastFireTime = level.time; + } + } + PlayBiteSound(monster); +} + +void bodydog_c::NextMovement(edict_t &monster, vec3_t curDist, float scale) +{ + vec3_t forward,right,up,tempdist,distaccum; + int i; +/* + if (currentmove==&generic_dog_move_attack && (level.time - fLastAttackTime) < 2*FRAMETIME && + !bTurnedAfterAttack) + { + // turn the dog 45degrees to one side after he bites + monster.s.angles[YAW] -= 60; + if (monster.s.angles[YAW] < 0) + { + monster.s.angles[YAW] += 360; + } + bTurnedAfterAttack = true; + } + */ + AngleVectors(monster.s.angles,forward,right,up); + VectorScale(monster.intend_velocity, FRAMETIME, curDist); + +// VectorCopy(monster.intend_velocity, curDist); + for (i = 0; i < 3; i++) + { + if (curDist[i]>MAX_VEL_COMPONENT) + { +// gi.dprintf("warning! capping monster %d vel component to %f (from %f)!\n", i, MAX_VEL_COMPONENT, curDist[i]); + curDist[i]=MAX_VEL_COMPONENT; + } + if (curDist[i]<-MAX_VEL_COMPONENT) + { +// gi.dprintf("warning! capping monster %d vel component to -%f (from %f)!\n", i, MAX_VEL_COMPONENT, curDist[i]); + curDist[i]=-MAX_VEL_COMPONENT; + } + } + + //plop in default vel, too--fixme, shouldn't be here + VectorScale(forward, curDist[0]*scale, tempdist); + VectorCopy(tempdist,distaccum); + VectorScale(right, curDist[1]*scale, tempdist); + VectorAdd(distaccum,tempdist,distaccum); + VectorScale(up, curDist[2]*scale, tempdist); + VectorAdd(distaccum,tempdist,curDist); +} + +void bodydog_c::FinishMove(edict_t &monster) +{ + bodyorganic_c::FinishMove(monster); + if (currentmove==&generic_dog_move_attack) + { + bTurnedAfterAttack = false; + } +} + +qboolean bodydog_c::PlayAnimation(edict_t &monster, mmove_t *newanim, bool forceRestart) +{ + forceRestart |= ForceNextAnim; + ForceNextAnim = false; + + return bodyorganic_c::PlayAnimation(monster, newanim, forceRestart); +} + +bodydog_c::bodydog_c(bodydog_c *orig) +: bodyorganic_c(orig) +{ + bTurnedAfterAttack = orig->bTurnedAfterAttack; + FinalAnim = orig->FinalAnim; + FinalSound = orig->FinalSound; + + fJumpDist = orig->fJumpDist; + fJumpSpeed = orig->fJumpSpeed; + fLastAttackTime = orig->fLastAttackTime; + fLastHeadTurnTime = orig->fLastHeadTurnTime; + m_fLastBarkSoundTime = orig->m_fLastBarkSoundTime; + m_fLastBiteSoundTime = orig->m_fLastBiteSoundTime; + m_fLastPainSoundTime = orig->m_fLastPainSoundTime; +} + +void bodydog_c::Evaluate(bodydog_c *orig) +{ + bTurnedAfterAttack = orig->bTurnedAfterAttack; + FinalAnim = orig->FinalAnim; + FinalSound = orig->FinalSound; + + fJumpDist = orig->fJumpDist; + fJumpSpeed = orig->fJumpSpeed; + fLastAttackTime = orig->fLastAttackTime; + fLastHeadTurnTime = orig->fLastHeadTurnTime; + + m_fLastBarkSoundTime = orig->m_fLastBarkSoundTime; + m_fLastBiteSoundTime = orig->m_fLastBiteSoundTime; + m_fLastPainSoundTime = orig->m_fLastPainSoundTime; + bodyorganic_c::Evaluate(orig); +} + +/////////////////////////////////////////////////////////////////////////////////////////////// +// +// husky-specific +// +/////////////////////////////////////////////////////////////////////////////////////////////// + +bodyhusky_c::bodyhusky_c() +: bodydog_c() +{ +} + +void bodyhusky_c::RecognizeGoreZones(edict_t &monster) +{ + RecognizeHuskyGoreZones(monster); +} + +gz_blown_part *bodyhusky_c::GetBlownPartForIndex(blown_index theIndex) +{ + if (theIndex < 0 || theIndex > GBLOWN_HUSKY_NUM) + { + return &husky_blown_parts[GBLOWN_HUSKY_NUM]; + } + return &husky_blown_parts[theIndex]; +} + +void bodyhusky_c::AllocateGoreZones(edict_t &monster) +{ + //eliminate old gore zones... + bodyorganic_c::AllocateGoreZones(monster); + numGoreZones=NUM_DOGGOREZONES; + gzones=new gz_info[numGoreZones]; +} + +bodyhusky_c::bodyhusky_c(bodyhusky_c *orig) +: bodydog_c(orig) +{ +} + +void bodyhusky_c::Evaluate(bodyhusky_c *orig) +{ + bodydog_c::Evaluate(orig); +} + +void bodyhusky_c::Read() +{ + char loaded[sizeof(bodyhusky_c)]; + + gi.ReadFromSavegame('AIBH', loaded, sizeof(bodyhusky_c)); + Evaluate((bodyhusky_c *)loaded); +} + +void bodyhusky_c::Write() +{ + bodyhusky_c *savable; + + savable = new bodyhusky_c(this); + gi.AppendToSavegame('AIBH', savable, sizeof(*this)); + delete savable; + + WriteGZ(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////// +// +// rottweiler-specific +// +/////////////////////////////////////////////////////////////////////////////////////////////// + +bodyrott_c::bodyrott_c() +: bodydog_c() +{ +} + +void bodyrott_c::RecognizeGoreZones(edict_t &monster) +{ + RecognizeRottweilerGoreZones(monster); +} + +gz_blown_part *bodyrott_c::GetBlownPartForIndex(blown_index theIndex) +{ + if (theIndex < 0 || theIndex > GBLOWN_ROTT_NUM) + { + return &rott_blown_parts[GBLOWN_ROTT_NUM]; + } + return &rott_blown_parts[theIndex]; +} + +void bodyrott_c::AllocateGoreZones(edict_t &monster) +{ + //eliminate old gore zones... + bodyorganic_c::AllocateGoreZones(monster); + numGoreZones = NUM_DOGGOREZONES; + gzones = new gz_info[numGoreZones]; +} + +bodyrott_c::bodyrott_c(bodyrott_c *orig) +: bodydog_c(orig) +{ +} + +void bodyrott_c::Evaluate(bodyrott_c *orig) +{ + bodydog_c::Evaluate(orig); +} + +void bodyrott_c::Read() +{ + char loaded[sizeof(bodyrott_c)]; + + gi.ReadFromSavegame('AIBR', loaded, sizeof(bodyrott_c)); + Evaluate((bodyrott_c *)loaded); +} + +void bodyrott_c::Write() +{ + bodyrott_c *savable; + + savable = new bodyrott_c(this); + gi.AppendToSavegame('AIBR', savable, sizeof(*this)); + delete savable; + + WriteGZ(); +} + diff --git a/Source/Game/gamecpp/ai_bodydog.h b/Source/Game/gamecpp/ai_bodydog.h new file mode 100644 index 0000000..000cc4f --- /dev/null +++ b/Source/Game/gamecpp/ai_bodydog.h @@ -0,0 +1,132 @@ + +typedef enum +{ + GZ_DOG_HEAD, + GZ_DOG_LCHEST, + GZ_DOG_RCHEST, + GZ_DOG_FRONT, + GZ_DOG_LLEG_FRONT, + GZ_DOG_RLEG_FRONT, + GZ_DOG_LHIP, + GZ_DOG_RHIP, + GZ_DOG_LLEG_BACK, + GZ_DOG_RLEG_BACK, + NUM_DOGGOREZONES +} gz_dogcode; + +//not including gorezones in this list, need to be handled separately +typedef enum +{ + GBLOWN_HUSKY_LLEG_FRONT, + GBLOWN_HUSKY_RLEG_FRONT, + GBLOWN_HUSKY_LLEG_BACK, + GBLOWN_HUSKY_RHIP, + GBLOWN_HUSKY_RLEG_BACK, + GBLOWN_HUSKY_NUM, +} husky_blown_index; + + // rottweiler (or rise of the triad) +typedef enum +{ + GBLOWN_ROTT_LLEG_FRONT, + GBLOWN_ROTT_RLEG_FRONT, + GBLOWN_ROTT_LLEG_BACK, + GBLOWN_ROTT_RHIP, + GBLOWN_ROTT_RLEG_BACK, + GBLOWN_ROTT_NUM, +} rott_blown_index; + + +extern gz_blown_part husky_blown_parts[GBLOWN_HUSKY_NUM+1]; +extern gz_blown_part rott_blown_parts[GBLOWN_ROTT_NUM+1]; + + +class bodydog_c: public bodyorganic_c +{ +protected: + qboolean bTurnedAfterAttack; + qboolean FinalAnim; // When set, the current anim or series of anims is intended to be the last ones played. also has sound implications + qboolean FinalSound; + + + float fJumpDist; // preferred dist from target at which we'll do a jump-attack + float fJumpSpeed; // magnitude of our jump-attack's velocity + float fLastAttackTime; + float fLastHeadTurnTime; + float m_fLastBarkSoundTime; + float m_fLastBiteSoundTime; + float m_fLastPainSoundTime; + + virtual void RecognizeGoreZones(edict_t &monster); + + virtual qboolean PlayAnimation(edict_t &monster, mmove_t *newanim, bool forceRestart); + virtual void PlayBarkSound(edict_t &monster); + virtual void PlayBiteSound(edict_t &monster); + virtual void PlayPainSound(edict_t &monster); + + //fixme: these should be the RecognizegoreZones for different classes--AddBody stuff needs to get resolved + void RecognizeHuskyGoreZones(edict_t &monster); + void RecognizeRottweilerGoreZones(edict_t &monster); + virtual void SetGoreZoneDamageScale(edict_t &monster); + + virtual void BiteMe(edict_t &monster, qboolean forceFireRate); +public: + virtual mmove_t *GetSequenceForDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForMovement(edict_t &monster, vec3_t dest, vec3_t face, vec3_t org, vec3_t ang, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForStand(edict_t &monster, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForJump(edict_t &monster, vec3_t dest, vec3_t face, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForAttack(edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + + virtual void NextMovement(edict_t &monster, vec3_t curDist, float scale); + virtual void FinishMove(edict_t &monster); + + virtual void SetRootBolt(edict_t &monster); + + virtual int ShowDamage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb); + + virtual attacks_e GetBestWeapon(edict_t &monster); + virtual void FirePrimaryWeapon(edict_t &monster, bool lethal = false, int NullTarget = 0, qboolean forceFireRate = false) { BiteMe(monster, forceFireRate); } + + bodydog_c(); + + virtual int GetClassCode(void){return BODY_DOG;}//this should be different for everybody in this class family + + float GetLastAttackTime() { return fLastAttackTime; } + void SetLastAttackTime(float fTime) { fLastAttackTime = fTime; } + + bodydog_c(bodydog_c *orig); + virtual void Evaluate(bodydog_c *orig); +}; + + +class bodyhusky_c : public bodydog_c +{ +protected: + virtual void RecognizeGoreZones(edict_t &monster); + virtual gz_blown_part *GetBlownPartForIndex(blown_index theIndex); + virtual void AllocateGoreZones(edict_t &monster); +public: + bodyhusky_c(); + virtual int GetClassCode(void){return BODY_HUSKY;}//this should be different for everybody in this class family + + bodyhusky_c(bodyhusky_c *orig); + virtual void Evaluate(bodyhusky_c *orig); + virtual void Write(); + virtual void Read(); +}; + +class bodyrott_c : public bodydog_c +{ +protected: + virtual void RecognizeGoreZones(edict_t &monster); + virtual gz_blown_part *GetBlownPartForIndex(blown_index theIndex); + virtual void AllocateGoreZones(edict_t &monster); +public: + bodyrott_c(); + virtual int GetClassCode(void){return BODY_ROTT;}//this should be different for everybody in this class family + + bodyrott_c(bodyrott_c *orig); + virtual void Evaluate(bodyrott_c *orig); + virtual void Write(); + virtual void Read(); +}; diff --git a/Source/Game/gamecpp/ai_bodyhuman.cpp b/Source/Game/gamecpp/ai_bodyhuman.cpp new file mode 100644 index 0000000..b895685 --- /dev/null +++ b/Source/Game/gamecpp/ai_bodyhuman.cpp @@ -0,0 +1,14221 @@ +#include "g_local.h" +#include "matrix4.h" +#include "ai_private.h" +#include "callback.h" +#include "ai_pathfinding.h" +#include "..\qcommon\ef_flags.h" + +#define GIB_HEALTH_LIMIT -300 + +#define SCREAMNUMBER 8 +#define WRITHENUMBER 7 + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +bool lock_sever; +bool lock_gorezones; +bool lock_deaths; + +extern int ai_loadAllBolts; +void DoPiss(edict_t &monster); + +static gz_code s_FrontCode = NUM_HUMANGOREZONES; // arbitrary value, really + +gz_code currentGoreZone = GZ_CHEST_FRONT; // Store gore zone location of current damage process. + +typedef int gunvariety_t; + +#define GUNVARIETY_PNONAUTO 0x00000001 +#define GUNVARIETY_LAUNCHER 0x00000002 +#define GUNVARIETY_RIFLE 0x00000004 +#define GUNVARIETY_SHOTGUN 0x00000008 +#define GUNVARIETY_MACHINE 0x00000010 +#define GUNVARIETY_KNIFE 0x00000020 +#define GUNVARIETY_PAUTO 0x00000040 + +#define GUNVARIETY_NONE 0x00000000 + +#define GUNVARIETY_PISTOL (GUNVARIETY_PNONAUTO|GUNVARIETY_PAUTO) +#define GUNVARIETY_MS (GUNVARIETY_MACHINE|GUNVARIETY_SHOTGUN) +#define GUNVARIETY_MRS (GUNVARIETY_MS|GUNVARIETY_RIFLE) +#define GUNVARIETY_PK (GUNVARIETY_PISTOL|GUNVARIETY_KNIFE) + +qboolean Skill_NoPain(edict_t *monster) +{ + if(game.playerSkills.getEnemyValue() > 3.9) + { + return true; + } + return false; +} + +//the higher the skill, the lower the disability modifier +float Skill_DisablityModifier(edict_t *monster) +{ + float tempSkill=game.playerSkills.getEnemyValue(); + if (tempSkill > 4.0) + { + tempSkill = 4.0; + } + if (tempSkill < 0.0) + { + tempSkill = 0.0; + } + + //convert to value between 0 (for skill 4) and 1 (for skill 0) + tempSkill = (4.0-tempSkill)/4.0; + return tempSkill; +// return 3.0/(tempSkill*tempSkill/**tempSkill*/); +} + +qboolean DoesVoiceSoundExist(char *soundName) +{ + return gi.FS_FileExists(soundName); + +/* char *Buffer; + int size; + +// FUCK!!!!!!!!!!!!!!!!! + //this will prevent guys spawned 1)on the fly and 2)by spawners from using voice stuff. but i don't know any better solution yet. the alternative is to chug the game every time a spawner spits out a guy. + if (level.time > 2.0) + { + return false; + } + + size = gi. + + size = gi.FS_LoadFile(soundName, (void **)&Buffer); + if (size == -1) + { + return false; + } + + gi.FS_FreeFile(Buffer); + return true;*/ +} + + +gunvariety_t GetGunVariety(attacks_e attack) +{ + switch(attack) + { + case ATK_PISTOL1: + case ATK_PISTOL2: + return GUNVARIETY_PNONAUTO; + case ATK_MACHINEPISTOL: + return GUNVARIETY_PAUTO; + case ATK_MACHINEGUN: + case ATK_ASSAULTRIFLE: + case ATK_FLAMEGUN: + return GUNVARIETY_MACHINE; + case ATK_SNIPER: + return GUNVARIETY_RIFLE; + case ATK_SHOTGUN: + case ATK_AUTOSHOTGUN: + case ATK_MICROWAVE: + case ATK_MICROWAVE_ALT: + case ATK_DEKKER: + return GUNVARIETY_SHOTGUN; + case ATK_ROCKET: + return GUNVARIETY_LAUNCHER; + case ATK_KNIFE: + return GUNVARIETY_KNIFE; + } + return GUNVARIETY_NONE; +} + +bool FollowGenericPivot::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + edict_t *self=(edict_t *)ent; + const Matrix4 *m=(const Matrix4 *)matrix; + vec3_t angs1; + + m->GetRow(3,*(Vect3 *)self->intend_velocity); + m->GetRow(0,*(Vect3 *)angs1); + self->intend_velocity[1] = -self->intend_velocity[1]; + if (fabs(atan2(angs1[0],angs1[1]))>0.0000001) + { + self->intend_avelocity[YAW]=-VectorLength(angs1)*atan2(angs1[0],angs1[1]); +// while (self->intend_avelocity[YAW] > 1.0) +// { +// self->intend_avelocity[YAW]*=0.3;//hiya! i like to call this little bit of code...a HACK! The parts of anims that aren't over the threshold will go too fast, but the other parts should be totally fixed. +// } +// if (ai_pathtest->value && self->intend_avelocity[YAW] > 1.0) +// { +// gi.dprintf("monster wants to turn %3.3f degrees.\n", self->intend_avelocity[YAW]*RADTODEG); +// } + } + + if(self->ai) + { + ai_c *my_ai = (ai_c *)((ai_public_c *)self->ai); + + mmove_t *move = my_ai->GetBody()->GetMove(); + + if((move == &generic_move_fcornerr_m2)|| + (move == &generic_move_fcornerr_p)|| + (move == &generic_move_fcornerl_m2)|| + (move == &generic_move_fcornerl_p)) + { + self->intend_velocity[2] = 0; + + if(my_ai->GetBody()->IsAnimationFinished()) + { // this is very nice + VectorInverse(self->intend_velocity); + } + } + } + + return true; +} + +bool FootRightCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + const Matrix4 *m=(const Matrix4 *)matrix; + vec3_t curPos; + edict_t *self=(edict_t *)ent; + ai_c *my_ai = (ai_c *)((ai_public_c *)self->ai); + + if(self->health <= 0) + { //dead folk don't walk much + return true; + } + + if (!my_ai) + { + return true; + } + + float groundPos=my_ai->GetGround(); + + m->GetRow(3,*(Vect3 *)curPos); + if (my_ai->GetRightFootPos() > 9) + { + if (curPos[2]-groundPos < 7) + { + if (my_ai->GetBody() && (my_ai->GetBody()->GetArmorCode() == ARMOR_FULL)) + { // these guys are clanky + FX_SetEvent(self, EV_FOOTSTEPMETALRIGHT); + } + else + { + FX_SetEvent(self, EV_FOOTSTEPRIGHT); + } + my_ai->SetRightFootPos(curPos[2]-groundPos); + my_ai->GetBody()->RightStep(*self); + } + } + else + { + my_ai->SetRightFootPos(curPos[2]-groundPos); + } + return true; +} + + +bool FootLeftCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + const Matrix4 *m=(const Matrix4 *)matrix; + vec3_t curPos; + edict_t *self=(edict_t *)ent; + ai_c *my_ai = (ai_c *)((ai_public_c *)self->ai); + + if(self->health <= 0) + { //dead folk don't walk much + return true; + } + + if (!my_ai) + { + return true; + } + + float groundPos=my_ai->GetGround(); + + m->GetRow(3,*(Vect3 *)curPos); + if (my_ai->GetLeftFootPos() > 9) + { + if (curPos[2]-groundPos < 7) + { + if (my_ai->GetBody() && (my_ai->GetBody()->GetArmorCode() == ARMOR_FULL)) + { // these guys are clanky + FX_SetEvent(self, EV_FOOTSTEPMETALLEFT); + } + else + { + FX_SetEvent(self, EV_FOOTSTEPLEFT); + } + my_ai->SetLeftFootPos(curPos[2]-groundPos); + my_ai->GetBody()->LeftStep(*self); + } + } + else + { + my_ai->SetLeftFootPos(curPos[2]-groundPos); + } + return true; +} + +bool GroundCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + const Matrix4 *m=(const Matrix4 *)matrix; + vec3_t curPos; + edict_t *self=(edict_t *)ent; + ai_c *my_ai = (ai_c *)((ai_public_c *)self->ai); + + m->GetRow(3,*(Vect3 *)curPos); + if (self->groundentity || (self->solid == SOLID_CORPSE)) + { + if (my_ai) + { + my_ai->SetGround(curPos[2]); + } + } + return true; +} + +bool MouthCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + const Matrix4 *m=(const Matrix4 *)matrix; + vec3_t curPos; + vec3_t pos,dir,postemp; + vec3_t forward, right, up; + edict_t *self=(edict_t *)ent; + ai_c *my_ai = (ai_c *)((ai_public_c *)self->ai); + int i; + + m->GetRow(0,*(Vect3 *)curPos);//forward vector, hopefully + curPos[2] = 0; + VectorCopy(curPos,dir); + if (self->ai) + { + vectoangles(dir,forward); + if (my_ai->GetBody() && (my_ai->GetBody()->GetClassCode() == BODY_HUSKY + || my_ai->GetBody()->GetClassCode() == BODY_ROTT)) + { + forward[YAW] -= 90; + } +// forward[YAW]-=90; + VectorAdd(forward,self->s.angles,forward); + for (i=0;i<3;i++) + { + forward[i]=anglemod(forward[i]); + } + VectorCopy(forward, dir); + my_ai->SetLookAngles(dir); + AngleVectors(forward,dir,NULL,NULL); + } + + + m->GetRow(3,*(Vect3 *)curPos);//translation + + AngleVectors(self->s.angles,forward,right,up); + VectorScale(forward,curPos[0],pos); + VectorScale(right,-curPos[1],postemp); + VectorAdd(postemp,pos,pos); + VectorScale(up,curPos[2],postemp); + VectorAdd(postemp,pos,pos); + +// VectorAdd(pos,self->s.origin,pos); +// pos[2]+=self->mins[2]; + +// VectorCopy(curPos,pos); + self->viewheight = pos[2];//this is my viewheight! use it! + VectorAdd(self->s.origin, pos, pos); +// FX_MakeSparks(pos, dir, 1); + return true; +} + + +//sets pos1 to the position of the bolt, rotated correctly to the world, but still assuming ent origin to be 0,0,0 (will deal with that later, when pos1 is used) +bool SetVectorCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + const Matrix4 *m=(const Matrix4 *)matrix; + edict_t *self=(edict_t *)ent; + vec3_t forward,right,up,curPos,pos,postemp; + + m->GetRow(3,*(Vect3 *)curPos);//forward vector, hopefully + + AngleVectors(self->s.angles,forward,right,up); + VectorScale(forward,curPos[0],pos); + VectorScale(right,-curPos[1],postemp); + VectorAdd(postemp,pos,pos); + VectorScale(up,curPos[2],postemp); + VectorAdd(postemp,pos,self->pos1); + return true; +} + +bool MonsterSeqEndCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + edict_t *self=(edict_t *)ent; + ai_c *my_ai = (ai_c *)((ai_public_c *)self->ai); + + if (self->ai) + { + my_ai->FinishMove(*self); + } + else if (self->client && self->client->body) + { + self->client->body->FinishMove(*self); + } + return true; +} + +bool MonsterSeqBeginCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + edict_t *self=(edict_t *)ent; + ai_c *my_ai = (ai_c *)((ai_public_c *)self->ai); + body_c *body = NULL; + + // if we're playing a sequence in reverse and we hit the first frame, + //we've finished the sequence + if (self->ai) + { + body = my_ai->GetBody(); + if (body && body->IsAnimationReversed()) + { + my_ai->FinishMove(*self); + } + } + return true; +} + +bool InAirCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + edict_t *ent = (edict_t *)user; + ai_c *my_ai = (ai_c *)((ai_public_c *)ent->ai); + + if (my_ai) + { + my_ai->InAirFrame(*ent,now); + } + return true; +} + +bool JumpCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + edict_t *ent = (edict_t *)user; + ai_c *my_ai = (ai_c *)((ai_public_c *)ent->ai); + + if (my_ai) + { + my_ai->JumpFrame(*ent); + } + return true; +} + +bool ThudCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + edict_t *ent = (edict_t *)user; + ai_c *my_ai = (ai_c *)((ai_public_c *)ent->ai); + + if (my_ai) + { + my_ai->LandFrame(*ent); + } + return true; +} + +bool KneeCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + edict_t *ent = (edict_t *)user; + ai_c *my_ai = (ai_c *)((ai_public_c *)ent->ai); + + if (my_ai) + { + my_ai->LandFrame(*ent); + } + return true; +} + +bool FireCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + edict_t *ent = (edict_t *)user; + + ai_c *my_ai = (ai_c *)((ai_public_c *)ent->ai); + + if (!ent || !ent->ai) + { + return true; + } + + // don't set the attack flag here, set it in the callback from the actual + //actual firing of the attack (i.e. only if we hit someone) +// my_ai->AttackFrame(*ent); + body_c *my_body = my_ai->GetBody(); + + if (!my_body) + { + return true; + } + +// my_body->FirePrimaryWeapon(*my_ai, *ent); +// my_body->SetFlags(*my_ai, *ent, FRAMEFLAG_ATTACK); + my_ai->AttackFrame(*ent); + + return true; +} + +bool ThrowCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + edict_t *ent = (edict_t *)user; + ai_c *my_ai = (ai_c *)((ai_public_c *)ent->ai); + + if (my_ai) + { + my_ai->ThrowFrame(*ent); + } + return true; +} + + +bool DropWeaponCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + edict_t *ent = (edict_t *)user; + ai_c *my_ai = ( ent?(ai_c *)((ai_public_c *)ent->ai):NULL ); + bodyorganic_c *body = NULL; + + if (my_ai && (body = (bodyorganic_c*)my_ai->GetBody()) ) + { // beginning of a death anim. if we're holding a weapon, drop it. if we're sporting + //the fashionable "no wound" flag, well, it's a little late to be worrying about + //wounds, isn't it? + if (ent->spawnflags & SPAWNFLAG_NO_WOUND) + { + ent->spawnflags &= ~SPAWNFLAG_NO_WOUND; + } + // if we've got the "no weapon" flag, don't drop a weapon + if ( !(ent->spawnflags & SPAWNFLAG_NO_WEAPONS) ) + { + body->DropWeapon(ent, me); + } + } + return true; +} + + + + + +bool MonsterSoundCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + char buffer[256]; + edict_t *self = (edict_t *)user; + + Com_sprintf(buffer, 256, "%s.wav", (char *)data); + + gi.sound(self, CHAN_AUTO, gi.soundindex(buffer), .6, ATTN_NORM, 0); //fixme change? + + return true; +} + +class EnemySoundPrecacheCallBack: public IGhoulCallBack +{ + public:virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data) + { + char buffer[256]; + + Com_sprintf(buffer, sizeof(buffer), "%s.wav", (char *)data); +// gi.dprintf("HEY! I'M PRECACHING %s DAMMIT!\n",buffer); + gi.soundindex(buffer); + return true; + } +}; + +bool LimbEOSCallback::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + edict_t *self = (edict_t *)user; + + if (self && self->ghoulInst) + self->ghoulInst->Pause(level.time); // want limb to in the exact position is was during the sever process + + return true; +} + + +gz_blown_part ecto_blown_parts[GBLOWN_ECTO_NUM+1]= +{ + //ecto: + GBLOWN_ECTO_CHEST, GBLOWN_ECTO_SHOULD_RF, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_chest", + GBLOWN_ECTO_SHOULD_RF, GBLOWN_ECTO_SHOULD_RB, GBLOWNAREA_RFSHLD, GBLOWNCODE_PART, "", + GBLOWN_ECTO_SHOULD_RB, GBLOWN_ECTO_SHOULD_LF, GBLOWNAREA_RBSHLD, GBLOWNCODE_PART, "", + GBLOWN_ECTO_SHOULD_LF, GBLOWN_ECTO_SHOULDBOLT_L, GBLOWNAREA_LFSHLD, GBLOWNCODE_PART, "", + GBLOWN_ECTO_SHOULDBOLT_L, GBLOWN_ECTO_SHOULDBOLT_R, GBLOWNAREA_LFSHLD, GBLOWNCODE_BOLT, "abolt_shoulder_l", + GBLOWN_ECTO_SHOULDBOLT_R, GBLOWN_ECTO_BACKBOLT, GBLOWNAREA_RFSHLD, GBLOWNCODE_BOLT, "abolt_shoulder_r", + GBLOWN_ECTO_BACKBOLT, GBLOWN_ECTO_SHOULD_LB, GBLOWNAREA_CHEST, GBLOWNCODE_BOLT, "abolt_back", + GBLOWN_ECTO_SHOULD_LB, GBLOWN_ECTO_COATCHEST, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "", + GBLOWN_ECTO_COATCHEST, GBLOWN_ECTO_CHESTFINISH, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_coatchest", + + //shared: + GBLOWN_ECTO_CHESTFINISH, GBLOWN_ECTO_NUM, GBLOWNAREA_CHEST, GBLOWNCODE_SPECIAL, "", + + //ecto: + GBLOWN_ECTO_HEADBALD, GBLOWN_ECTO_HEADCREW, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_headbald", + GBLOWN_ECTO_HEADCREW, GBLOWN_ECTO_HEADBEARD, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_headcrew", + GBLOWN_ECTO_HEADBEARD, GBLOWN_ECTO_HEADHELMET, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_headbeard", + GBLOWN_ECTO_HEADHELMET, GBLOWN_ECTO_BANGLEFT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_headhelmet", + GBLOWN_ECTO_BANGLEFT, GBLOWN_ECTO_BANGRIGHT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_lhairbang", + GBLOWN_ECTO_BANGRIGHT, GBLOWN_ECTO_HAIRMOHAWK, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_rhairbang", + GBLOWN_ECTO_HAIRMOHAWK, GBLOWN_ECTO_HAIRPONYTAIL, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_hairmohawk", + GBLOWN_ECTO_HAIRPONYTAIL, GBLOWN_ECTO_EARLEFT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_hairponytail", + + //shared: + GBLOWN_ECTO_EARLEFT, GBLOWN_ECTO_EARRIGHT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_lear", + GBLOWN_ECTO_EARRIGHT, GBLOWN_ECTO_HEADBOLT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_rear", + GBLOWN_ECTO_HEADBOLT, GBLOWN_ECTO_NUM, GBLOWNAREA_HEAD, GBLOWNCODE_BOLT, "abolt_head_t", + + //ecto: + GBLOWN_ECTO_BICEPLEFT, GBLOWN_ECTO_FOREARMLEFT, GBLOWNAREA_LBICEP, GBLOWNCODE_PART, "_lbicep", + + //ecto: + GBLOWN_ECTO_FOREARMLEFT, GBLOWN_ECTO_FOREARMCUFFLEFT, GBLOWNAREA_LFOREARM,GBLOWNCODE_PART, "_lforearm", + GBLOWN_ECTO_FOREARMCUFFLEFT, GBLOWN_ECTO_FOREARMCUFFCAPLEFT, GBLOWNAREA_LFOREARM,GBLOWNCODE_PART, "_lforearmcuff", + GBLOWN_ECTO_FOREARMCUFFCAPLEFT, GBLOWN_ECTO_OPENHANDLEFT, GBLOWNAREA_LFOREARM,GBLOWNCODE_PART, "_Cap_lforearmcuff_lhand", + GBLOWN_ECTO_OPENHANDLEFT, GBLOWN_ECTO_CLOSEDHANDLEFT, GBLOWNAREA_LHAND, GBLOWNCODE_PART, "_lhand_open", + GBLOWN_ECTO_CLOSEDHANDLEFT, GBLOWN_ECTO_HANDBOLTLEFT, GBLOWNAREA_LHAND, GBLOWNCODE_PART, "_lhand_closed", + + //shared: + GBLOWN_ECTO_HANDBOLTLEFT, GBLOWN_ECTO_NUM, GBLOWNAREA_LHAND, GBLOWNCODE_BOLT, "wbolt_hand_l", + + //ecto: + GBLOWN_ECTO_BICEPRIGHT, GBLOWN_ECTO_FOREARMRIGHT, GBLOWNAREA_RBICEP, GBLOWNCODE_PART, "_rbicep", + + //ecto: + GBLOWN_ECTO_FOREARMRIGHT, GBLOWN_ECTO_FOREARMCUFFRIGHT, GBLOWNAREA_RFOREARM,GBLOWNCODE_PART, "_rforearm", + GBLOWN_ECTO_FOREARMCUFFRIGHT, GBLOWN_ECTO_FOREARMCUFFCAPRIGHT,GBLOWNAREA_RFOREARM,GBLOWNCODE_PART, "_rforearmcuff", + GBLOWN_ECTO_FOREARMCUFFCAPRIGHT,GBLOWN_ECTO_OPENHANDRIGHT, GBLOWNAREA_RFOREARM,GBLOWNCODE_PART, "_Cap_rforearmcuff_rhand", + GBLOWN_ECTO_OPENHANDRIGHT, GBLOWN_ECTO_CLOSEDHANDRIGHT, GBLOWNAREA_RHAND, GBLOWNCODE_PART, "_rhand_open", + GBLOWN_ECTO_CLOSEDHANDRIGHT, GBLOWN_ECTO_HANDBOLTRIGHT, GBLOWNAREA_RHAND, GBLOWNCODE_PART, "_rhand_closed", + + //shared: + GBLOWN_ECTO_HANDBOLTRIGHT, GBLOWN_ECTO_NUM, GBLOWNAREA_RHAND, GBLOWNCODE_BOLT, "wbolt_hand_r", + + //ecto: + GBLOWN_ECTO_THIGHRIGHT, GBLOWN_ECTO_THIGHBOLTRIGHT, GBLOWNAREA_RTHIGH, GBLOWNCODE_PART, "_rthigh", + + //shared: + GBLOWN_ECTO_THIGHBOLTRIGHT, GBLOWN_ECTO_THIGHRIGHTSPECIAL, GBLOWNAREA_RTHIGH, GBLOWNCODE_BOLT, "abolt_thigh_r", + GBLOWN_ECTO_THIGHRIGHTSPECIAL, GBLOWN_ECTO_CALFRIGHT, GBLOWNAREA_RTHIGH, GBLOWNCODE_SPECIAL, "", + + //ecto: + GBLOWN_ECTO_CALFRIGHT, GBLOWN_ECTO_CALFCUFFRIGHT, GBLOWNAREA_RCALF, GBLOWNCODE_PART, "_rcalf", + GBLOWN_ECTO_CALFCUFFRIGHT, GBLOWN_ECTO_CALFCUFFCAPRIGHT, GBLOWNAREA_RCALF, GBLOWNCODE_PART, "_rcalfcuff", + GBLOWN_ECTO_CALFCUFFCAPRIGHT, GBLOWN_ECTO_CALFBOLTRIGHT, GBLOWNAREA_RCALF, GBLOWNCODE_PART, "_cap_rcalfcuff_rfoot", + + //shared: + GBLOWN_ECTO_CALFBOLTRIGHT, GBLOWN_ECTO_FOOTRIGHT, GBLOWNAREA_RCALF, GBLOWNCODE_BOLT, "abolt_calf_r", + + //ecto: + GBLOWN_ECTO_FOOTRIGHT, GBLOWN_ECTO_NUM, GBLOWNAREA_RFOOT, GBLOWNCODE_PART, "_rfoot", + + //ecto: + GBLOWN_ECTO_THIGHLEFT, GBLOWN_ECTO_THIGHBOLTLEFT, GBLOWNAREA_LTHIGH, GBLOWNCODE_PART, "_lthigh", + + //shared: + GBLOWN_ECTO_THIGHBOLTLEFT, GBLOWN_ECTO_THIGHLEFTSPECIAL, GBLOWNAREA_LTHIGH, GBLOWNCODE_BOLT, "abolt_thigh_l", + GBLOWN_ECTO_THIGHLEFTSPECIAL, GBLOWN_ECTO_CALFLEFT, GBLOWNAREA_LTHIGH, GBLOWNCODE_SPECIAL, "", + + //ecto: + GBLOWN_ECTO_CALFLEFT, GBLOWN_ECTO_CALFCUFFLEFT, GBLOWNAREA_LCALF, GBLOWNCODE_PART, "_lcalf", + GBLOWN_ECTO_CALFCUFFLEFT, GBLOWN_ECTO_CALFCUFFCAPLEFT, GBLOWNAREA_LCALF, GBLOWNCODE_PART, "_lcalfcuff", + GBLOWN_ECTO_CALFCUFFCAPLEFT, GBLOWN_ECTO_CALFBOLTLEFT, GBLOWNAREA_LCALF, GBLOWNCODE_PART, "_cap_lcalfcuff_lfoot", + + //shared: + GBLOWN_ECTO_CALFBOLTLEFT, GBLOWN_ECTO_FOOTLEFT, GBLOWNAREA_LCALF, GBLOWNCODE_BOLT, "abolt_calf_l", + + //ecto: + GBLOWN_ECTO_FOOTLEFT, GBLOWN_ECTO_NUM, GBLOWNAREA_LFOOT, GBLOWNCODE_PART, "_lfoot", + + GBLOWN_ECTO_GROIN, GBLOWN_ECTO_NUM, GBLOWNAREA_GROIN, GBLOWNCODE_SPECIAL, "", + GBLOWN_ECTO_NUM, GBLOWN_ECTO_NUM, GBLOWNAREA_FINISH, GBLOWNCODE_SPECIAL, "", +}; + +gz_blown_part female_blown_parts[GBLOWN_FEMALE_NUM+1]= +{ + GBLOWN_FEMALE_CHEST, GBLOWN_FEMALE_SHOULD_RF, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_chest", + GBLOWN_FEMALE_SHOULD_RF, GBLOWN_FEMALE_SHOULD_RB, GBLOWNAREA_RFSHLD, GBLOWNCODE_PART, "", + GBLOWN_FEMALE_SHOULD_RB, GBLOWN_FEMALE_SHOULD_LF, GBLOWNAREA_RBSHLD, GBLOWNCODE_PART, "", + GBLOWN_FEMALE_SHOULD_LF, GBLOWN_FEMALE_SHOULD_LB, GBLOWNAREA_LFSHLD, GBLOWNCODE_PART, "", + GBLOWN_FEMALE_SHOULD_LB, GBLOWN_FEMALE_SHOULDBOLT_L, GBLOWNAREA_LBSHLD, GBLOWNCODE_PART, "", + GBLOWN_FEMALE_SHOULDBOLT_L, GBLOWN_FEMALE_SHOULDBOLT_R, GBLOWNAREA_LFSHLD, GBLOWNCODE_BOLT, "abolt_shoulder_l", + GBLOWN_FEMALE_SHOULDBOLT_R, GBLOWN_FEMALE_BACKBOLT, GBLOWNAREA_RFSHLD, GBLOWNCODE_BOLT, "abolt_shoulder_r", + GBLOWN_FEMALE_BACKBOLT, GBLOWN_FEMALE_NECK, GBLOWNAREA_CHEST, GBLOWNCODE_BOLT, "abolt_back", + GBLOWN_FEMALE_NECK, GBLOWN_FEMALE_ARMORCHEST, GBLOWNAREA_NECK, GBLOWNCODE_PART, "_neck", + GBLOWN_FEMALE_ARMORCHEST, GBLOWN_FEMALE_CHESTFINISH, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_armorchest", + GBLOWN_FEMALE_CHESTFINISH, GBLOWN_FEMALE_NUM, GBLOWNAREA_CHEST, GBLOWNCODE_SPECIAL, "", + + GBLOWN_FEMALE_HEAD, GBLOWN_FEMALE_FACE, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_headcrew", + GBLOWN_FEMALE_FACE, GBLOWN_FEMALE_CREWHAIR, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_comface", + GBLOWN_FEMALE_CREWHAIR, GBLOWN_FEMALE_MEDHAIR, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_crewhair", + GBLOWN_FEMALE_MEDHAIR, GBLOWN_FEMALE_BANGLEFT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_medmhairmhead", + GBLOWN_FEMALE_BANGLEFT, GBLOWN_FEMALE_BANGRIGHT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_lbang", + GBLOWN_FEMALE_BANGRIGHT, GBLOWN_FEMALE_EARLEFT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_rbang", + + GBLOWN_FEMALE_EARLEFT, GBLOWN_FEMALE_EARRIGHT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_lear", + GBLOWN_FEMALE_EARRIGHT, GBLOWN_FEMALE_HEADBOLT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_rear", + GBLOWN_FEMALE_HEADBOLT, GBLOWN_FEMALE_NUM, GBLOWNAREA_HEAD, GBLOWNCODE_BOLT, "abolt_head_t", + + GBLOWN_FEMALE_BICEPLEFT, GBLOWN_FEMALE_FOREARMLEFT, GBLOWNAREA_LBICEP, GBLOWNCODE_PART, "_ltightbicep", + GBLOWN_FEMALE_FOREARMLEFT, GBLOWN_FEMALE_OPENHANDLEFT, GBLOWNAREA_LFOREARM,GBLOWNCODE_PART, "_ltightforearm", + GBLOWN_FEMALE_OPENHANDLEFT, GBLOWN_FEMALE_CLOSEDHANDLEFT, GBLOWNAREA_LHAND, GBLOWNCODE_PART, "_lopen", + GBLOWN_FEMALE_CLOSEDHANDLEFT, GBLOWN_FEMALE_HANDBOLTLEFT, GBLOWNAREA_LHAND, GBLOWNCODE_PART, "_lclosed", + GBLOWN_FEMALE_HANDBOLTLEFT, GBLOWN_FEMALE_NUM, GBLOWNAREA_LHAND, GBLOWNCODE_BOLT, "wbolt_hand_l", + + GBLOWN_FEMALE_BICEPRIGHT, GBLOWN_FEMALE_FOREARMRIGHT, GBLOWNAREA_RBICEP, GBLOWNCODE_PART, "_rtightbicep", + GBLOWN_FEMALE_FOREARMRIGHT, GBLOWN_FEMALE_OPENHANDRIGHT, GBLOWNAREA_RFOREARM,GBLOWNCODE_PART, "_rtightforearm", + GBLOWN_FEMALE_OPENHANDRIGHT, GBLOWN_FEMALE_CLOSEDHANDRIGHT, GBLOWNAREA_RHAND, GBLOWNCODE_PART, "_ropen", + GBLOWN_FEMALE_CLOSEDHANDRIGHT, GBLOWN_FEMALE_HANDBOLTRIGHT, GBLOWNAREA_RHAND, GBLOWNCODE_PART, "_rclosed", + GBLOWN_FEMALE_HANDBOLTRIGHT, GBLOWN_FEMALE_NUM, GBLOWNAREA_RHAND, GBLOWNCODE_BOLT, "wbolt_hand_r", + + GBLOWN_FEMALE_THIGHRIGHT, GBLOWN_FEMALE_THIGHBOLTRIGHT, GBLOWNAREA_RTHIGH, GBLOWNCODE_PART, "_rtightthigh", + GBLOWN_FEMALE_THIGHBOLTRIGHT, GBLOWN_FEMALE_THIGHRIGHTSPECIAL, GBLOWNAREA_RTHIGH, GBLOWNCODE_BOLT, "abolt_thigh_r", + GBLOWN_FEMALE_THIGHRIGHTSPECIAL, GBLOWN_FEMALE_CALFRIGHT, GBLOWNAREA_RTHIGH, GBLOWNCODE_SPECIAL, "", + + GBLOWN_FEMALE_CALFRIGHT, GBLOWN_FEMALE_CALFBOLTRIGHT, GBLOWNAREA_RCALF, GBLOWNCODE_PART, "_rtightcalf", + GBLOWN_FEMALE_CALFBOLTRIGHT, GBLOWN_FEMALE_FOOTRIGHT, GBLOWNAREA_RCALF, GBLOWNCODE_BOLT, "abolt_calf_r", + GBLOWN_FEMALE_FOOTRIGHT, GBLOWN_FEMALE_NUM, GBLOWNAREA_RFOOT, GBLOWNCODE_PART, "_rheels", + + GBLOWN_FEMALE_THIGHLEFT, GBLOWN_FEMALE_THIGHBOLTLEFT, GBLOWNAREA_LTHIGH, GBLOWNCODE_PART, "_ltightthigh", + GBLOWN_FEMALE_THIGHBOLTLEFT, GBLOWN_FEMALE_THIGHLEFTSPECIAL, GBLOWNAREA_LTHIGH, GBLOWNCODE_BOLT, "abolt_thigh_l", + GBLOWN_FEMALE_THIGHLEFTSPECIAL, GBLOWN_FEMALE_CALFLEFT, GBLOWNAREA_LTHIGH, GBLOWNCODE_SPECIAL, "", + + GBLOWN_FEMALE_CALFLEFT, GBLOWN_FEMALE_CALFBOLTLEFT, GBLOWNAREA_LCALF, GBLOWNCODE_PART, "_ltightcalf", + GBLOWN_FEMALE_CALFBOLTLEFT, GBLOWN_FEMALE_FOOTLEFT, GBLOWNAREA_LCALF, GBLOWNCODE_BOLT, "abolt_calf_l", + GBLOWN_FEMALE_FOOTLEFT, GBLOWN_FEMALE_NUM, GBLOWNAREA_LFOOT, GBLOWNCODE_PART, "_lheels", + + GBLOWN_FEMALE_GROIN, GBLOWN_FEMALE_NUM, GBLOWNAREA_GROIN, GBLOWNCODE_SPECIAL, "", + GBLOWN_FEMALE_NUM, GBLOWN_FEMALE_NUM, GBLOWNAREA_FINISH, GBLOWNCODE_SPECIAL, "", +}; + +gz_blown_part meso_blown_parts[GBLOWN_MESO_NUM+1]= +{ + //meso: + GBLOWN_MESO_TIGHTCHEST, GBLOWN_MESO_MASKCHEST, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_tightchest", + GBLOWN_MESO_MASKCHEST, GBLOWN_MESO_BULKYCHEST, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_maskchest", + GBLOWN_MESO_BULKYCHEST, GBLOWN_MESO_ARMORCHEST, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_bulkychest", + GBLOWN_MESO_ARMORCHEST, GBLOWN_MESO_BOSSCHEST, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_armorchest", + GBLOWN_MESO_BOSSCHEST, GBLOWN_MESO_BTCHEST, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_bosschest", + GBLOWN_MESO_BTCHEST, GBLOWN_MESO_NECK, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_chest_b_t", + GBLOWN_MESO_NECK, GBLOWN_MESO_BOSSNECK, GBLOWNAREA_NECK, GBLOWNCODE_PART, "_neck", + GBLOWN_MESO_BOSSNECK, GBLOWN_MESO_MASKNECK, GBLOWNAREA_NECK, GBLOWNCODE_PART, "_bossneck", + GBLOWN_MESO_MASKNECK, GBLOWN_MESO_HOODNECK, GBLOWNAREA_NECK, GBLOWNCODE_PART, "_maskneck", + GBLOWN_MESO_HOODNECK, GBLOWN_MESO_HEADCAP_NECK, GBLOWNAREA_NECK, GBLOWNCODE_PART, "_hoodneck", + GBLOWN_MESO_HEADCAP_NECK, GBLOWN_MESO_HEADCAP_BOSSNECK, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_cap_head_neck", + GBLOWN_MESO_HEADCAP_BOSSNECK, GBLOWN_MESO_SHOULD_RF, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_cap_head_neck_boss", + GBLOWN_MESO_SHOULD_RF, GBLOWN_MESO_SHOULD_RB, GBLOWNAREA_RFSHLD, GBLOWNCODE_PART, "", + GBLOWN_MESO_SHOULD_RB, GBLOWN_MESO_SHOULD_LF, GBLOWNAREA_RBSHLD, GBLOWNCODE_PART, "", + GBLOWN_MESO_SHOULD_LF, GBLOWN_MESO_SHOULD_LB, GBLOWNAREA_LFSHLD, GBLOWNCODE_PART, "", + GBLOWN_MESO_SHOULD_LB, GBLOWN_MESO_SHOULDBOLT_L, GBLOWNAREA_LBSHLD, GBLOWNCODE_PART, "", + GBLOWN_MESO_SHOULDBOLT_L, GBLOWN_MESO_SHOULDBOLT_R, GBLOWNAREA_LFSHLD, GBLOWNCODE_BOLT, "abolt_shoulder_l", + GBLOWN_MESO_SHOULDBOLT_R, GBLOWN_MESO_BACKBOLT, GBLOWNAREA_RFSHLD, GBLOWNCODE_BOLT, "abolt_shoulder_r", + GBLOWN_MESO_BACKBOLT, GBLOWN_MESO_CHEST_RARMCAP3, GBLOWNAREA_CHEST, GBLOWNCODE_BOLT, "abolt_back", + GBLOWN_MESO_CHEST_RARMCAP3, GBLOWN_MESO_CHEST_LARMCAP3, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_cap_chest_rbicep_bulky", + GBLOWN_MESO_CHEST_LARMCAP3, GBLOWN_MESO_RARMCAP_CHEST3, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_cap_chest_lbicep_bulky", + GBLOWN_MESO_RARMCAP_CHEST3, GBLOWN_MESO_LARMCAP_CHEST3, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_cap_rbicep_chest_bulky", + GBLOWN_MESO_LARMCAP_CHEST3, GBLOWN_MESO_CHEST_RARMCAP4, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_cap_lbicep_chest_bulky", + GBLOWN_MESO_CHEST_RARMCAP4, GBLOWN_MESO_CHEST_LARMCAP4, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_cap_chest_rbicep_boss", + GBLOWN_MESO_CHEST_LARMCAP4, GBLOWN_MESO_RARMCAP_CHEST4, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_cap_chest_lbicep_boss", + GBLOWN_MESO_RARMCAP_CHEST4, GBLOWN_MESO_LARMCAP_CHEST4, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_cap_rbicep_chest_boss", + GBLOWN_MESO_LARMCAP_CHEST4, GBLOWN_MESO_CHESTFINISH, GBLOWNAREA_CHEST, GBLOWNCODE_PART, "_cap_lbicep_chest_boss", + + //shared: + GBLOWN_MESO_CHESTFINISH, GBLOWN_MESO_NUM, GBLOWNAREA_CHEST, GBLOWNCODE_SPECIAL, "", + + //meso: + GBLOWN_MESO_HEADBALD, GBLOWN_MESO_HEADCREW, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_baldhead", + GBLOWN_MESO_HEADCREW, GBLOWN_MESO_HEADBEARD, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_crewhead", + GBLOWN_MESO_HEADBEARD, GBLOWN_MESO_HEADHELMET, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_beardhead", + GBLOWN_MESO_HEADHELMET, GBLOWN_MESO_HEADHOOD, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_helmethead", + GBLOWN_MESO_HEADHOOD, GBLOWN_MESO_HEADMASK, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_hoodhead", + GBLOWN_MESO_HEADMASK, GBLOWN_MESO_HEADBOSS, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_maskhead", + GBLOWN_MESO_HEADBOSS, GBLOWN_MESO_COMFACE, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_bosshead", + GBLOWN_MESO_COMFACE, GBLOWN_MESO_BEARDFACE, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_comface", + GBLOWN_MESO_BEARDFACE, GBLOWN_MESO_HELMETFACE, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_beardface", + GBLOWN_MESO_HELMETFACE, GBLOWN_MESO_BOSSFACE, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_helmetface", + GBLOWN_MESO_BOSSFACE, GBLOWN_MESO_BANGLEFT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_bossface", + GBLOWN_MESO_BANGLEFT, GBLOWN_MESO_BANGRIGHT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_lbang", + GBLOWN_MESO_BANGRIGHT, GBLOWN_MESO_HAIRMOHAWK, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_rbang", + GBLOWN_MESO_HAIRMOHAWK, GBLOWN_MESO_HAIRPONYTAIL, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_mohawk", + GBLOWN_MESO_HAIRPONYTAIL, GBLOWN_MESO_EARLEFT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_ponytail", + + //shared: + GBLOWN_MESO_EARLEFT, GBLOWN_MESO_EARRIGHT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_lear", + GBLOWN_MESO_EARRIGHT, GBLOWN_MESO_BOSSEARLEFT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_rear", + GBLOWN_MESO_BOSSEARLEFT, GBLOWN_MESO_BOSSEARRIGHT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_lbossear", + GBLOWN_MESO_BOSSEARRIGHT, GBLOWN_MESO_HEADBOLT, GBLOWNAREA_HEAD, GBLOWNCODE_PART, "_rbossear", + GBLOWN_MESO_HEADBOLT, GBLOWN_MESO_NUM, GBLOWNAREA_HEAD, GBLOWNCODE_BOLT, "abolt_head_t", + + //meso: + GBLOWN_MESO_BICEPLEFT, GBLOWN_MESO_BICEPLEFT2, GBLOWNAREA_LBICEP, GBLOWNCODE_PART, "_lbossbicep", + GBLOWN_MESO_BICEPLEFT2, GBLOWN_MESO_BICEPLEFT3, GBLOWNAREA_LBICEP, GBLOWNCODE_PART, "_lbicep_t_t", + GBLOWN_MESO_BICEPLEFT3, GBLOWN_MESO_BICEPLEFT4, GBLOWNAREA_LBICEP, GBLOWNCODE_PART, "_lbicep_t_b", + GBLOWN_MESO_BICEPLEFT4, GBLOWN_MESO_BICEPLEFT5, GBLOWNAREA_LBICEP, GBLOWNCODE_PART, "_lbicep_b_b", + GBLOWN_MESO_BICEPLEFT5, GBLOWN_MESO_FOREARMLEFT, GBLOWNAREA_LBICEP, GBLOWNCODE_PART, "_lbicep_b_t", + + //meso: + GBLOWN_MESO_FOREARMLEFT, GBLOWN_MESO_FOREARMLEFT2, GBLOWNAREA_LFOREARM,GBLOWNCODE_PART, "_lforearm_t_t", + GBLOWN_MESO_FOREARMLEFT2, GBLOWN_MESO_FOREARMLEFT3, GBLOWNAREA_LFOREARM,GBLOWNCODE_PART, "_lforearm_t_c", + GBLOWN_MESO_FOREARMLEFT3, GBLOWN_MESO_FOREARMLEFT4, GBLOWNAREA_LFOREARM,GBLOWNCODE_PART, "_lforearm_t_b", + GBLOWN_MESO_FOREARMLEFT4, GBLOWN_MESO_FOREARMLEFT5, GBLOWNAREA_LFOREARM,GBLOWNCODE_PART, "_lforearm_b_t", + GBLOWN_MESO_FOREARMLEFT5, GBLOWN_MESO_FOREARMLEFT6, GBLOWNAREA_LFOREARM,GBLOWNCODE_PART, "_lforearm_b_b", + GBLOWN_MESO_FOREARMLEFT6, GBLOWN_MESO_OPENHANDLEFT, GBLOWNAREA_LFOREARM,GBLOWNCODE_PART, "_lbossforearm", + GBLOWN_MESO_OPENHANDLEFT, GBLOWN_MESO_CLOSEDHANDLEFT, GBLOWNAREA_LHAND, GBLOWNCODE_PART, "_lopen", + GBLOWN_MESO_CLOSEDHANDLEFT, GBLOWN_MESO_OPENHANDLEFT2, GBLOWNAREA_LHAND, GBLOWNCODE_PART, "_lclosed", + GBLOWN_MESO_OPENHANDLEFT2, GBLOWN_MESO_CLOSEDHANDLEFT2, GBLOWNAREA_LHAND, GBLOWNCODE_PART, "_lbossopen", + GBLOWN_MESO_CLOSEDHANDLEFT2, GBLOWN_MESO_HANDBOLTLEFT, GBLOWNAREA_LHAND, GBLOWNCODE_PART, "_lbossclosed", + + //shared: + GBLOWN_MESO_HANDBOLTLEFT, GBLOWN_MESO_NUM, GBLOWNAREA_LHAND, GBLOWNCODE_BOLT, "wbolt_hand_l", + + //meso: + GBLOWN_MESO_BICEPRIGHT, GBLOWN_MESO_BICEPRIGHT2, GBLOWNAREA_RBICEP, GBLOWNCODE_PART, "_rbossbicep", + GBLOWN_MESO_BICEPRIGHT2, GBLOWN_MESO_BICEPRIGHT3, GBLOWNAREA_RBICEP, GBLOWNCODE_PART, "_rbicep_t_t", + GBLOWN_MESO_BICEPRIGHT3, GBLOWN_MESO_BICEPRIGHT4, GBLOWNAREA_RBICEP, GBLOWNCODE_PART, "_rbicep_t_b", + GBLOWN_MESO_BICEPRIGHT4, GBLOWN_MESO_BICEPRIGHT5, GBLOWNAREA_RBICEP, GBLOWNCODE_PART, "_rbicep_b_b", + GBLOWN_MESO_BICEPRIGHT5, GBLOWN_MESO_FOREARMRIGHT, GBLOWNAREA_RBICEP, GBLOWNCODE_PART, "_rbicep_b_t", + + //meso: + GBLOWN_MESO_FOREARMRIGHT, GBLOWN_MESO_FOREARMRIGHT2, GBLOWNAREA_RFOREARM,GBLOWNCODE_PART, "_rforearm_t_t", + GBLOWN_MESO_FOREARMRIGHT2, GBLOWN_MESO_FOREARMRIGHT3, GBLOWNAREA_RFOREARM,GBLOWNCODE_PART, "_rforearm_t_c", + GBLOWN_MESO_FOREARMRIGHT3, GBLOWN_MESO_FOREARMRIGHT4, GBLOWNAREA_RFOREARM,GBLOWNCODE_PART, "_rforearm_t_b", + GBLOWN_MESO_FOREARMRIGHT4, GBLOWN_MESO_FOREARMRIGHT5, GBLOWNAREA_RFOREARM,GBLOWNCODE_PART, "_rforearm_b_t", + GBLOWN_MESO_FOREARMRIGHT5, GBLOWN_MESO_FOREARMRIGHT6, GBLOWNAREA_RFOREARM,GBLOWNCODE_PART, "_rforearm_b_b", + GBLOWN_MESO_FOREARMRIGHT6, GBLOWN_MESO_OPENHANDRIGHT, GBLOWNAREA_RFOREARM,GBLOWNCODE_PART, "_rbossforearm", + GBLOWN_MESO_OPENHANDRIGHT, GBLOWN_MESO_CLOSEDHANDRIGHT, GBLOWNAREA_RHAND, GBLOWNCODE_PART, "_ropen", + GBLOWN_MESO_CLOSEDHANDRIGHT, GBLOWN_MESO_OPENHANDRIGHT2, GBLOWNAREA_RHAND, GBLOWNCODE_PART, "_rclosed", + GBLOWN_MESO_OPENHANDRIGHT2, GBLOWN_MESO_CLOSEDHANDRIGHT2, GBLOWNAREA_RHAND, GBLOWNCODE_PART, "_rbossopen", + GBLOWN_MESO_CLOSEDHANDRIGHT2, GBLOWN_MESO_HANDBOLTRIGHT, GBLOWNAREA_RHAND, GBLOWNCODE_PART, "_rbossclosed", + + //shared: + GBLOWN_MESO_HANDBOLTRIGHT, GBLOWN_MESO_NUM, GBLOWNAREA_RHAND, GBLOWNCODE_BOLT, "wbolt_hand_r", + + //meso: + GBLOWN_MESO_THIGHRIGHT, GBLOWN_MESO_THIGHRIGHT2, GBLOWNAREA_RTHIGH, GBLOWNCODE_PART, "_rbossthigh", + GBLOWN_MESO_THIGHRIGHT2, GBLOWN_MESO_THIGHRIGHT3, GBLOWNAREA_RTHIGH, GBLOWNCODE_PART, "_rtightthigh", + GBLOWN_MESO_THIGHRIGHT3, GBLOWN_MESO_THIGHBOLTRIGHT, GBLOWNAREA_RTHIGH, GBLOWNCODE_PART, "_rbulkythigh", + + //shared: + GBLOWN_MESO_THIGHBOLTRIGHT, GBLOWN_MESO_THIGHRIGHTSPECIAL, GBLOWNAREA_RTHIGH, GBLOWNCODE_BOLT, "abolt_thigh_r", + GBLOWN_MESO_THIGHRIGHTSPECIAL, GBLOWN_MESO_CALFRIGHT, GBLOWNAREA_RTHIGH, GBLOWNCODE_SPECIAL, "", + + //meso: + GBLOWN_MESO_CALFRIGHT, GBLOWN_MESO_CALFRIGHT2, GBLOWNAREA_RCALF, GBLOWNCODE_PART, "_rtightcalf", + GBLOWN_MESO_CALFRIGHT2, GBLOWN_MESO_CALFRIGHT3, GBLOWNAREA_RCALF, GBLOWNCODE_PART, "_rcalfcuff", + GBLOWN_MESO_CALFRIGHT3, GBLOWN_MESO_CALFRIGHT4, GBLOWNAREA_RCALF, GBLOWNCODE_PART, "_rbulkycalf", + GBLOWN_MESO_CALFRIGHT4, GBLOWN_MESO_CALFRIGHT5, GBLOWNAREA_RCALF, GBLOWNCODE_PART, "_rbosscalf", + GBLOWN_MESO_CALFRIGHT5, GBLOWN_MESO_CALFBOLTRIGHT, GBLOWNAREA_RCALF, GBLOWNCODE_PART, "_rcalf_t_b", + + //shared: + GBLOWN_MESO_CALFBOLTRIGHT, GBLOWN_MESO_FOOTRIGHT, GBLOWNAREA_RCALF, GBLOWNCODE_BOLT, "abolt_calf_r", + + //meso: + GBLOWN_MESO_FOOTRIGHT, GBLOWN_MESO_FOOTRIGHT2, GBLOWNAREA_RFOOT, GBLOWNCODE_PART, "_rbootfoot", + GBLOWN_MESO_FOOTRIGHT2, GBLOWN_MESO_NUM, GBLOWNAREA_RFOOT, GBLOWNCODE_PART, "_rshoefoot", + + //meso: + GBLOWN_MESO_THIGHLEFT, GBLOWN_MESO_THIGHLEFT2, GBLOWNAREA_LTHIGH, GBLOWNCODE_PART, "_lbossthigh", + GBLOWN_MESO_THIGHLEFT2, GBLOWN_MESO_THIGHLEFT3, GBLOWNAREA_LTHIGH, GBLOWNCODE_PART, "_ltightthigh", + GBLOWN_MESO_THIGHLEFT3, GBLOWN_MESO_THIGHBOLTLEFT, GBLOWNAREA_LTHIGH, GBLOWNCODE_PART, "_lbulkythigh", + + //shared: + GBLOWN_MESO_THIGHBOLTLEFT, GBLOWN_MESO_THIGHLEFTSPECIAL, GBLOWNAREA_LTHIGH, GBLOWNCODE_BOLT, "abolt_thigh_l", + GBLOWN_MESO_THIGHLEFTSPECIAL, GBLOWN_MESO_CALFLEFT, GBLOWNAREA_LTHIGH, GBLOWNCODE_SPECIAL, "", + + //meso: + GBLOWN_MESO_CALFLEFT, GBLOWN_MESO_CALFLEFT2, GBLOWNAREA_LCALF, GBLOWNCODE_PART, "_ltightcalf", + GBLOWN_MESO_CALFLEFT2, GBLOWN_MESO_CALFLEFT3, GBLOWNAREA_LCALF, GBLOWNCODE_PART, "_lcalfcuff", + GBLOWN_MESO_CALFLEFT3, GBLOWN_MESO_CALFLEFT4, GBLOWNAREA_LCALF, GBLOWNCODE_PART, "_lbulkycalf", + GBLOWN_MESO_CALFLEFT4, GBLOWN_MESO_CALFLEFT5, GBLOWNAREA_LCALF, GBLOWNCODE_PART, "_lbosscalf", + GBLOWN_MESO_CALFLEFT5, GBLOWN_MESO_CALFBOLTLEFT, GBLOWNAREA_LCALF, GBLOWNCODE_PART, "_lcalf_t_b", + + //shared: + GBLOWN_MESO_CALFBOLTLEFT, GBLOWN_MESO_FOOTLEFT, GBLOWNAREA_LCALF, GBLOWNCODE_BOLT, "abolt_calf_l", + + //meso: + GBLOWN_MESO_FOOTLEFT, GBLOWN_MESO_FOOTLEFT2, GBLOWNAREA_LFOOT, GBLOWNCODE_PART, "_lbootfoot", + GBLOWN_MESO_FOOTLEFT2, GBLOWN_MESO_NUM, GBLOWNAREA_LFOOT, GBLOWNCODE_PART, "_lshoefoot", + + GBLOWN_MESO_GROIN, GBLOWN_MESO_NUM, GBLOWNAREA_GROIN, GBLOWNCODE_SPECIAL, "", + GBLOWN_MESO_NUM, GBLOWN_MESO_NUM, GBLOWNAREA_FINISH, GBLOWNCODE_SPECIAL, "", +}; + +typedef struct +{ + char *name; + qboolean flimsy;//will fall off if damage occurs nearby + qboolean hatHead;//when i get blown off, need to switch to non-hat head (which may be the same as hat head) + qboolean stopsDmg; // kef -- glasses shouldn't stop bullets +} boltOnInfo_t; +//fixme--change this to include bbox info for shot prt, some kind of indication of what the monster model should do to make up for part loss (eg. change from headbald to headcrew) +boltOnInfo_t shootableParts[]= +{ +// name flimsy hatHead stopsDmg + "acc_antenna", false, false, false, + "acc_backpack_low", false, false, true, + "acc_backpack_smll", false, false, true, + "acc_box_hip", false, false, true, + "acc_box_hip_lrg", false, false, true, + "acc_box_hip_smll", false, false, true, + "acc_ecto_glasses", true, false, false, + "acc_faceplate", false, false, false, + "acc_faceplate2", false, false, false, +// "acc_gas_mask", false, false, false, + "acc_gas_mask2", true, false, false, + "acc_glasses", true, false, false, + "acc_hat_baseball", false, true, false, + "acc_hat_beret", false, true, false, + "acc_hat_flop2", false, true, false, + "acc_hat_general", false, true, false, + "acc_hat_general2", false, true, false, + "acc_hat_hard", false, true, true, + "acc_hat_tall", false, true, false, + "acc_hat_top", false, true, false, + "acc_hat_turbin", false, true, false, + "acc_helmet", false, true, true, +// "acc_helmet2", false, true, false, + "acc_holster", false, false, false, + "acc_machette", false, false, false, + "acc_nightvision2", false, false, false, + "acc_sword", false, false, false, + "w_assault_rifle", false, false, true, + "w_autoshotgun", false, false, true, + "w_bat", false, false, true, + "w_briefcase", true, false, true, + "w_flamethrower", false, false, true, + "w_kantana", false, false, true, + "w_knife", false, false, true, + "w_machete", false, false, true, + "w_machinegun", false, false, true, + "w_machinepistol", false, false, true, + "w_mpg", false, false, true, + "w_pistol1", false, false, true, + "w_pistol2", false, false, true, + "w_rocket", false, false, true, + "w_sack", true, false, true, + "w_shotgun", false, false, true, + "w_sniperrifle", false, false, true, + "", false, false, false, +}; + +#define AI_GORETEST_PRINTF if (ai_goretest->value)gi.dprintf + +int GetDamageLevel(int amount) +{ + if (amount<=0) + { + return 0; + } + if (amount<=100) + { + return 1; + } + if (amount<=200) + { + return 2; + } + return 3; +} + +int GetMinimumDamageForLevel(int damageLevel) +{ + if (damageLevel<=0) + { + return 0; + } + if (damageLevel<=1) + { + return 1; + } + if (damageLevel<=2) + { + return 101; + } + return 201; +} + +///find me a home +void EntToWorldMatrix(vec3_t org, vec3_t angles, Matrix4 &m); +Vect3 trStartKnarlyGilHack; + +char* gznames[]= +{ + "GZ_HEAD_FRONT", + "GZ_HEAD_BACK", + "GZ_NECK", + "GZ_SHLDR_RIGHT_FRONT", + "GZ_SHLDR_RIGHT_BACK", + "GZ_SHLDR_LEFT_FRONT", + "GZ_SHLDR_LEFT_BACK", + "GZ_CHEST_FRONT", + "GZ_CHEST_BACK", + "GZ_ARM_UPPER_RIGHT", + "GZ_ARM_UPPER_LEFT", + "GZ_ARM_LOWER_RIGHT", + "GZ_ARM_LOWER_LEFT", + "GZ_GUT_FRONT", + "GZ_GUT_BACK", + "GZ_GROIN", + "GZ_LEG_UPPER_RIGHT_FRONT", + "GZ_LEG_UPPER_RIGHT_BACK", + "GZ_LEG_UPPER_LEFT_FRONT", + "GZ_LEG_UPPER_LEFT_BACK", + "GZ_LEG_LOWER_RIGHT", + "GZ_LEG_LOWER_LEFT", + "GZ_FOOT_RIGHT", + "GZ_FOOT_LEFT", + "GZ_GUT_FRONT_EXTRA", + "GZ_GUT_BACK_EXTRA", + "NUM_HUMANGOREZONES" +}; + +#define MAX_VEL_COMPONENT 50.0 + +/* +void blownpartremove_think(edict_t *self) +{ + int i; + bool removeme=true; + edict_t *client; + vec3_t client_facing, client_to_part; + //only remove if it won't look screwy to clients + for (i=0 ; iinuse) + { + continue; + } + VectorSubtract(self->s.origin, client->s.origin, client_to_part); + + //if e's greater than 800 units away, assume he can't see me + if (VectorLengthSquared(client_to_part)>640000) + { + continue; + } + + if (!gi.inPVS(self->s.origin, self->s.origin)) + { + continue; + } + AngleVectors(client->s.angles, client_facing, NULL, NULL); + VectorNormalize(client_to_part); + //if client is looking in my general dir, don't remove for sure + if (DotProduct(client_to_part, client_facing)>-.2) + { + removeme = false; + break; + } + } + + self->nextthink = level.time + 15; + + if (removeme) + { + G_FreeEdict(self); + return; + } +} +*/ + +void blownpartremove_think(edict_t *self) +{ + int i; + bool freeMe=true; + edict_t *ent; + vec3_t ent_facing, ent_to_me; + + if (!self->touch_debounce_time) + { + self->touch_debounce_time = level.time - 0.1; + } + + //if it's been over 60 seconds since i was severed, git ridda me no matter what. + if (level.time-self->touch_debounce_timeinuse) + { + continue; + } + VectorSubtract(ent->s.origin, self->s.origin, ent_to_me); + + //if e's greater than 800 units away, assume he can't see me + if (VectorLengthSquared(ent_to_me)>640000) + { + continue; + } + + //if client can't possibly see me, will have no effect on whether i remove or no + if (!gi.inPVS(self->s.origin, self->s.origin)) + { + continue; + } + AngleVectors(ent->s.angles, ent_facing, NULL, NULL); + VectorNormalize(ent_to_me); + //if client is looking in my general dir, don't remove for sure + if (DotProduct(ent_to_me, ent_facing)<.2) + { + freeMe = false; + break; + } + } + } + + if (freeMe) + { + FXA_SetFadeOut(self, BLOWN_PART_FADE); + + // remove when we are done fading. + self->nextthink=level.time+BLOWN_PART_FADE+0.1; + self->think = G_FreeEdict; + return; + } + + self->nextthink = level.time + 1.0; +} + +GroundCallback TheGroundCallback; +SetVectorCallback TheSetVectorCallback; +FireCallBack TheFireCallBack; +JumpCallBack TheJumpCallBack; +ThudCallBack TheThudCallBack; +KneeCallBack TheKneeCallBack; +InAirCallBack TheInAirCallBack; +FollowGenericPivot TheFollowGenericPivot; +MouthCallback TheMouthCallback; +FootRightCallback TheFootRightCallback; +FootLeftCallback TheFootLeftCallback; +MonsterSeqEndCallback TheMonsterSeqEndCallback; +MonsterSeqBeginCallback TheMonsterSeqBeginCallback; +MonsterSoundCallBack TheMonsterSoundCallBack; +ThrowCallBack TheThrowCallBack; +DropWeaponCallBack TheDropWeaponCallBack; + +EnemySoundPrecacheCallBack soundPrecacher; + +LimbEOSCallback TheLimbEOSCallback; + +////////////////////////////////////////////////////////////////////////////////// +// +// shared among all organic guys! +// +////////////////////////////////////////////////////////////////////////////////// + +bodyorganic_c::bodyorganic_c() +{ + useGround2=false; + spout = -1; + numGoreZones=0; + gzones = NULL; + memset(gzone_levels, 0, sizeof(gzone_levels)); +} + +bodyorganic_c::~bodyorganic_c() +{ + if (gzones) + { + delete [] gzones; + } +} + +void bodyorganic_c::InitializeGoreZoneLevels(edict_t &monster) +{ + GhoulID tempMat=NULL; + char zone[20]; + int i; + + if (monster.ghoulInst) + { + tempMat=monster.ghoulInst->GetGhoulObject()->FindMaterial("gz"); + } + + if (!tempMat) + { + return; + } + + Com_sprintf(zone, 20, "gz_sing1"); + gzone_levels[0][0]=monster.ghoulInst->GetGhoulObject()->FindSkin(tempMat,zone); + for (i=1;i<=2;i++) + { + Com_sprintf(zone, 20, "gz_sing%d",i+1); + gzone_levels[0][i]=monster.ghoulInst->GetGhoulObject()->FindSkin(tempMat,zone); + } + gzone_levels[0][3]=monster.ghoulInst->GetGhoulObject()->FindSkin(tempMat,"gz_sing_k"); + + Com_sprintf(zone, 20, "gz_multi1"); + gzone_levels[1][0]=monster.ghoulInst->GetGhoulObject()->FindSkin(tempMat,zone); + for (i=1;i<=2;i++) + { + Com_sprintf(zone, 20, "gz_multi%d",i+1); + gzone_levels[1][i]=monster.ghoulInst->GetGhoulObject()->FindSkin(tempMat,zone); + } + gzone_levels[1][3]=monster.ghoulInst->GetGhoulObject()->FindSkin(tempMat,"gz_multi_k"); + + Com_sprintf(zone, 20, "gz_mass1"); + gzone_levels[2][0]=monster.ghoulInst->GetGhoulObject()->FindSkin(tempMat,zone); + for (i=1;i<=2;i++) + { + Com_sprintf(zone, 20, "gz_mass%d",i+1); + gzone_levels[2][i]=monster.ghoulInst->GetGhoulObject()->FindSkin(tempMat,zone); + } + gzone_levels[2][3]=monster.ghoulInst->GetGhoulObject()->FindSkin(tempMat,"gz_mass_k"); + +#if _DEBUG + assert(gzone_levels[0][3]&&gzone_levels[1][3]&&gzone_levels[2][3]); +#endif +} +void bodyorganic_c::BlowPart(edict_t &monster, gz_blown_part *part, edict_t *dangler) +{ + GhoulID blowpart=0; + GhoulID blowbolt=0; + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + if (part->area==GBLOWNAREA_FINISH || !myInstance || (!dangler && (part->area != GBLOWNAREA_HEAD))) + { + return; + } + if (part->code == GBLOWNCODE_PART) + { + blowpart=monster.ghoulInst->GetGhoulObject()->FindPart(part->name); + if (blowpart) + { + if (dangler && myInstance->GetInstPtr()->GetPartOnOff(blowpart)) + { + dangler->ghoulInst->SetPartOnOff(blowpart,true); + } + myInstance->GetInstPtr()->SetPartOnOff(blowpart,false); + } + } + else if (part->code == GBLOWNCODE_BOLT) + { + blowbolt=monster.ghoulInst->GetGhoulObject()->FindPart(part->name); + if (blowbolt) + { + ggBinstC *bolted; + ggOinstC *blownInstance=NULL; + if (dangler && dangler->ghoulInst) + { + blownInstance=game_ghoul.FindOInst(dangler->ghoulInst); + } + + if (!stricmp(part->name, "wbolt_hand_r")||!stricmp(part->name, "wbolt_hand_l")) + { + DropWeapon(&monster, monster.ghoulInst); + } + + while (bolted=myInstance->GetBoltInstance(blowbolt)) + { + if (blownInstance&&(!monster.client || (stricmp(part->name, "wbolt_hand_r")&&stricmp(part->name, "wbolt_hand_l")))) + { +// AddBoltedItem(monster, blowbolt, "Enemy/bolt", bolted->GetBolteeObject()->GetSubName(), bolted->GetBolt(), blownInstance); + AddBoltedItem(monster, blowbolt, "Enemy/bolt", bolted->GetBolteeObject()->GetSubName(), bolted->GetBolt(), blownInstance, bolted->GetBolteeObject()->GetSkinName()); + } + myInstance->RemoveBoltInstance(bolted); + } + } + } + else if (part->code == GBLOWNCODE_SPECIAL) + { + BlowSpecialPart(monster, part, dangler); + } + BlowPart(monster, GetBlownPartForIndex(part->child_index), dangler); +} + +//affect surrounding gzones when hit +void bodyorganic_c::ShakePart(edict_t &monster, gz_blown_part *part, Vect3 &Direction) +{ + GhoulID blowbolt=0; + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + if (part->area==GBLOWNAREA_FINISH || !myInstance) + { + return; + } + if (part->code == GBLOWNCODE_BOLT) + { + blowbolt=monster.ghoulInst->GetGhoulObject()->FindPart(part->name); + if (blowbolt) + { + ggBinstC *bolted; + + bolted=myInstance->GetBoltInstance(blowbolt); + if (bolted) + { + Matrix4 ZoneMatrix; + Vect3 zonePos; + monster.ghoulInst->GetBoltMatrix(level.time,ZoneMatrix,blowbolt,IGhoulInst::MatrixType::Entity); + ZoneMatrix.GetRow(3,zonePos); + DropBoltOn(monster, bolted, zonePos, Direction, 1); + } + } + } + else if (part->code == GBLOWNCODE_SPECIAL) + { + ShakeSpecialPart(monster, part, Direction); + } + ShakePart(monster, GetBlownPartForIndex(part->child_index), Direction); +} + +void bodyorganic_c::Drip(edict_t &monster) +{ + if (spout == -1) + { + FX_MakeDecalBelow(monster.s.origin,FXDECAL_BLOODPOOL,0); + } + else + { + vec3_t pos; + VectorAdd(monster.s.origin,monster.pos1,pos); + FX_MakeDecalBelow(pos,FXDECAL_BLOODPOOL,0); + } +} + +void bodyorganic_c::AllocateGoreZones(edict_t &monster) +{ + if (gzones) + { + delete [] gzones; + } + numGoreZones=0; +} + +void bodyorganic_c::BlowZone(edict_t &monster, gz_code part, gz_code originalPart, edict_t *dangler) +{ + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + if (part==numGoreZones || !myInstance) + { + return; + } + if (gzones[part].id) + { + //copy over gorezones that are turned on + if (dangler && myInstance->GetInstPtr()->GetPartOnOff(gzones[part].id)) + { + dangler->ghoulInst->SetPartOnOff(gzones[part].id,true); + } + //...as for gorezones that aren't turned on, consider turning them on, too + else + { + //only do this if gorezones are ok! + if (!lock_gorezones) + { + //pretty good chance i'll turn the part on + if (dangler && myInstance->GetInstPtr()->GetPartOnOff(gzones[part].parent_id)/* && gi.irand(0,10)*/) + { + dangler->ghoulInst->SetPartOnOff(gzones[part].id,true); + //set the skin to any of the non-armor skins + dangler->ghoulInst->SetFrameOverride("gz", gzone_levels[gi.irand(0,2)][gi.irand(0,2)], gzones[part].id); + } + } + } + myInstance->GetInstPtr()->SetPartOnOff(gzones[part].id,false); + } + if (gzones[part].cap) + { + if (dangler && myInstance->GetInstPtr()->GetPartOnOff(gzones[part].cap)) + { + dangler->ghoulInst->SetPartOnOff(gzones[part].cap,true); + } + myInstance->GetInstPtr()->SetPartOnOff(gzones[part].cap,false); + } + if (gzones[part].capbolt) + { + char headSkinName[128]; + char faceSkinName[128]; + GhoulID headSkin; + GhoulID faceSkin; + ggBinstC *theNewBolt; + + + ggBinstC *bolted; + ggOinstC *blownInstance=NULL; + + if (dangler && dangler->ghoulInst) + { + blownInstance=game_ghoul.FindOInst(dangler->ghoulInst); + } + + while (bolted=myInstance->GetBoltInstance(gzones[part].capbolt)) + { + if (blownInstance) + { + theNewBolt=AddBoltedItem(monster, gzones[part].capbolt, bolted->GetBolteeObject()/*"Enemy/bolt"*/, bolted->GetBolteeObject()->GetSubName(), bolted->GetBolt(), blownInstance); + } + + //irritating skin craziness for half-heads + if (theNewBolt && bolted->GetInstPtr() && bolted->GetBolteeObject() && + bolted->GetBolteeObject()->GetSubName() && !strcmp(bolted->GetBolteeObject()->GetSubName(), "g_half_head")) + { + // for the half head bolt on, we want to put the living guy's skins on the new bolt on + + headSkin = bolted->GetInstPtr()->GetFrameOverride("h"); + if (headSkin) + { + bolted->GetInstPtr()->GetGhoulObject()->GetSkinName(headSkin, headSkinName); + theNewBolt->GetInstPtr()->SetFrameOverride("h", headSkinName); + } + + faceSkin = bolted->GetInstPtr()->GetFrameOverride("f"); + if (faceSkin) + { + bolted->GetInstPtr()->GetGhoulObject()->GetSkinName(faceSkin, faceSkinName); + theNewBolt->GetInstPtr()->SetFrameOverride("f", faceSkinName); + } + + theNewBolt->GetInstPtr()->SetFrameOverride("gz", "gz_half_head"); + } + + myInstance->RemoveBoltInstance(bolted); + } + myInstance->GetInstPtr()->SetPartOnOff(gzones[part].capbolt,false); +// myInstance->RemoveBolt(gzones[part].capbolt); + } + if (gzones[part].blownCapBolt) + { + ggBinstC *bolted; + ggOinstC *blownInstance=NULL; + edict_t *knife = NULL; + vec3_t fwd; + + if (dangler && dangler->ghoulInst) + { + blownInstance=game_ghoul.FindOInst(dangler->ghoulInst); + } + + while (bolted=myInstance->GetBoltInstance(gzones[part].blownCapBolt)) + { + if (0 == strcmp(bolted->GetBolteeObject()->GetSubName(), "w_knife")) + { // if the thing attached to this blownCapBolt is a knife, create a new + //knife entity and drop it like a spawned item + if (knife = G_Spawn()) + { + Matrix4 matOld; + IGhoulInst *oldKnife, *newKnife; + + game_ghoul.SetSimpleGhoulModel(knife, "Enemy/Bolt", "w_knife"); + if ((oldKnife = bolted->GetInstPtr()) && + (newKnife = knife->ghoulInst)) + { + oldKnife->GetXForm(matOld); + newKnife->SetXForm(matOld); + } + GetGhoulPosDir(monster.s.origin, monster.s.angles, + bolted->GetInstPtr(), NULL, "tip", knife->s.origin, fwd, NULL, NULL); + knife->spawnflags|=DROPPED_ITEM; + I_SpawnKnife(knife); + knife->gravity = 1.0; +// itemDropToFloor(knife); + } + } + myInstance->RemoveBoltInstance(bolted); + } + myInstance->GetInstPtr()->SetPartOnOff(gzones[part].blownCapBolt,false); + } + if (gzones[part].bolt) + { + ggBinstC *bolted; + ggOinstC *blownInstance=NULL; + if (dangler && dangler->ghoulInst) + { + blownInstance=game_ghoul.FindOInst(dangler->ghoulInst); + } + + while (bolted=myInstance->GetBoltInstance(gzones[part].bolt)) + { + if (blownInstance) + { + AddBoltedItem(monster, gzones[part].bolt, "Enemy/bolt", bolted->GetBolteeObject()->GetSubName(), bolted->GetBolt(), blownInstance); + } + myInstance->RemoveBoltInstance(bolted); + } +// myInstance->RemoveBolt(gzones[part].bolt); + } + if (gzones[part].childzone != originalPart) + { + BlowZone(monster, gzones[part].childzone, originalPart,dangler); + } +} + +qboolean bodyorganic_c::VerifySequence(edict_t &monster, mmove_t *newanim, int reject_actionflags) +{ + ai_c *ai; + + if (!newanim || newanim->actionFlags&reject_actionflags) + { + return false; + } + + if (!IsAvailableSequence(monster, newanim)) + { + return false; + } + + //if i'm ai-less, accept the sequence here; otherwise, make sure bbox stuff'll work + if (!monster.ai) + { + return true; + } + + ai=(ai_c *)((ai_public_c *)monster.ai); + + if (newanim->suggested_action==ACTCODE_DEATH) + { + return ai->AttemptSetBBox(monster,newanim->bbox,true); + } + return ai->AttemptSetBBox(monster,newanim->bbox); +} + +void bodyorganic_c::SetGoreZone(edict_t &monster, char *zonename, gz_code slot) +{ + GhoulID tempHole; + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart(zonename); + if (tempHole) + { + gzones[slot].id=tempHole; + } +// else +// { +// gi.dprintf("SetGoreZone Error! Couldn't find %s!\n",zonename); +// } +} + +void bodyorganic_c::SetGoreCap(edict_t &monster, char *capname, gz_code slot) +{ + GhoulID tempHole; + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart(capname); + if (tempHole) + { + gzones[slot].cap=tempHole; + } +// else +// { +// gi.dprintf("SetGoreCap Error! Couldn't find %s!\n",capname); +// } +} + +void bodyorganic_c::SetGoreBlownCap(edict_t &monster, char *capname, gz_code slot) +{ + GhoulID tempHole; + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart(capname); + if (tempHole) + { + gzones[slot].blownCap=tempHole; + } +// else +// { +// gi.dprintf("SetGoreBlownCap Error! Couldn't find %s!\n",capname); +// } +} + +void bodyorganic_c::SetGoreCapBolt(edict_t &monster, char *capname, gz_code slot) +{ + gzones[slot].capbolt=monster.ghoulInst->GetGhoulObject()->FindPart(capname); +// if (!gzones[slot].capbolt) +// { +// gi.dprintf("SetGoreCapBolt Error! Couldn't find %s!\n",capname); +// } +} + +void bodyorganic_c::SetGoreBlownCapBolt(edict_t &monster, char *capname, gz_code slot) +{ + gzones[slot].blownCapBolt=monster.ghoulInst->GetGhoulObject()->FindPart(capname); +// if (!gzones[slot].blownCapBolt) +// { +// gi.dprintf("SetGoreBlownCapBolt Error! Couldn't find %s!\n",capname); +// } +} + +void bodyorganic_c::SetGoreCapPiece(edict_t &monster, char *capname, char *boltname, gz_code slot) +{ + //it's a head--do magical hacking right here. + if (!stricmp(capname,"g_half_head")) + { + GhoulID myHead=monster.ghoulInst->GetFrameOverride("h"); + //find the half-head with the same skin as me... + if (myHead) + { + char headskin[256]; + monster.ghoulInst->GetGhoulObject()->GetSkinName(myHead,headskin); + gzones[slot].capPiece=game_ghoul.FindObject("Enemy/Bolt", capname, false, headskin); + } + else + { + //eh? hey, there's supposed to be a head here... + } + } + //not a head--pretend the hack doesn't exist... + else + { + gzones[slot].capPiece=game_ghoul.FindObject("Enemy/Bolt", capname); + } + + if (boltname[0] && gzones[slot].capPiece) + { + gzones[slot].capPieceBolt=gzones[slot].capPiece->GetMyObject()->FindPart(boltname); + } +} + +void bodyorganic_c::SetGoreBolt(edict_t &monster, char *boltname, gz_code slot) +{ + GhoulID tempHole; + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart(boltname); + if (tempHole) + { + gzones[slot].bolt=tempHole; + } +} + +void BlownPartTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + gi.sound (self, CHAN_BODY, gi.soundindex ("impact/gore/limbfall.wav"), .6, ATTN_NORM, 0); + self->touch = NULL; +} + +void GetReadyForBlownPartAIToTakeOver(edict_t *ent) +{ + ent->nextthink = level.time + 0.1; +} + +edict_t *bodyorganic_c::MakeBlownPart(edict_t &monster, gz_code part, vec3_t dir, ggOinstC **blownInst, bool includeEffects) +{ + edict_t *blownPart; + Matrix4 m,m1,m2; + int i; + ggObjC *object; + GhoulID BlownCapBolt; + + blownPart = G_Spawn(); + blownPart->solid = SOLID_NOT; + blownPart->clipmask = MASK_DEADSOLID|CONTENTS_DEADMONSTER; + blownPart->svflags |= SVF_DEADMONSTER; + VectorScale(dir, 75, blownPart->velocity); + blownPart->velocity[2] = gi.irand(30, 70); + VectorSet(blownPart->avelocity, 0, 0, 0); + object = game_ghoul.FindObject(monster.ghoulInst->GetGhoulObject()); + blownPart->owner = &monster; + blownPart->ai = ai_c::Create(AI_BLOWNPART, blownPart, object->GetName(), object->GetSubName()); +// blownPart->think = NULL; + blownPart->think = GetReadyForBlownPartAIToTakeOver; + blownPart->touch = BlownPartTouch; + blownPart->nextthink=level.time+0.1; + blownPart->movetype = MOVETYPE_TOUCHNOTSOLID; + blownPart->friction = 0.5; + blownPart->gravity = 1.0; + blownPart->airresistance = 0.1; + blownPart->bouyancy = 0.7; + blownPart->elasticity = 0.5; + + + //if the blown piece successfully gave itself a ghoul instance derived from the same object as the parent, just change the skins +/* if (blownPart->ghoulInst && blownPart->ghoulInst->GetGhoulObject()==monster.ghoulInst->GetGhoulObject()) + { + GhoulID tmat; + + //this is just for universal overrides! need to do per-part overrides too (should just be for gzones)! + for (tmat=object->GetMyObject()->NumMaterials();tmat>0;tmat--) + { + blownPart->ghoulInst->SetFrameOverride(tmat, monster.ghoulInst->GetFrameOverride(tmat)); + } + } + else + { +*/ + *blownInst = object->CloneInstance(blownPart, monster.ghoulInst); +// } + + + blownPart->s.renderfx = RF_GHOUL; + + if (gzones[part].blownCapBolt) + { + BlownCapBolt=gzones[part].blownCapBolt; + } + else + { + BlownCapBolt=gzones[part].capbolt; + } + + if (BlownCapBolt&&gzones[part].parent_id) + { + if(includeEffects) + { + FX_BloodCloud(blownPart, BlownCapBolt, 400); + } + blownPart->gib_health = gzones[part].parent_id; + + // get the transformation from entity space to world space + Matrix4 EntityToWorld; + + EntToWorldMatrix(monster.s.origin, monster.s.angles, EntityToWorld); + + // get the transformation from bolt space to entity space + Matrix4 BoltToEntity; + + monster.ghoulInst->GetBoltMatrix(level.time,BoltToEntity,BlownCapBolt,IGhoulInst::MatrixType::Entity); + + // multiply to get transform from bolt space to world space + Matrix4 BoltToWorld; + + BoltToWorld.Concat(BoltToEntity, EntityToWorld); + + // 3rd row of BoltToWorld is the world coordinates of the bolt + vec3_t LimbLoc; + BoltToWorld.GetRow(3,*(Vect3 *)LimbLoc); + +// blownPart->ghoulInst->SetMyBolt(GhoulID(0)); // otherwise will interfere with computation + blownPart->ghoulInst->SetMyBolt(monster.ghoulInst->GetMyBolt()); //ECK! will be different for players & monsters! + + blownPart->ghoulInst->Pause(level.time); // want limb to in the exact position is was during the sever process +// blownPart->ghoulInst->AddNoteCallBack(&TheLimbEOSCallback, "EOS"); + + // we are going to work in entity space. + Matrix4 id; + + id.Identity(); + Vect3 mins,maxs; + Vect3 center; + + //now get realistic bbox/xform info + blownPart->ghoulInst->GetBoundBox(level.time+.3,id,mins,maxs,gzones[part].parent_id,true); + //gi.dprintf("id: %d mins: %2.2f %2.2f %2.2f maxs: %2.2f %2.2f %2.2f\n",gzones[part].parent_id,mins[0],mins[1],mins[2],maxs[0],maxs[1],maxs[2]); + center=mins; + center+=maxs; + center*=.5f; + + VectorSet (blownPart->mins, mins.x() - center.x(), mins.y() - center.y(), mins.z() - center.z()); + VectorSet (blownPart->maxs, maxs.x() - center.x(), maxs.y() - center.y(), maxs.z() - center.z()); + + // put limb at bolt + VectorCopy(LimbLoc, blownPart->s.origin); + + // now put in correct orientation + Matrix4 t1, t2, XForm, final; + + VectorClear(blownPart->s.angles); + monster.ghoulInst->GetXForm(XForm); + t1.Concat(XForm,EntityToWorld); + EntToWorldMatrix(blownPart->s.origin, blownPart->s.angles, t2); + t2.Inverse(t2); + final.Concat(t1,t2); + blownPart->ghoulInst->SetXForm(final); + + + { // Add some velocity to the body part away from the torso + vec3_t diff; + + VectorSubtract(blownPart->s.origin, monster.s.origin, diff); + VectorNormalize(diff); + + VectorSet(blownPart->velocity, gi.flrand(-50,50), gi.flrand(-50,50), gi.flrand(-50,50)); + VectorMA(blownPart->velocity, gi.flrand(100,200), diff, blownPart->velocity); + + blownPart->s.angles[YAW] += gi.flrand(-30,30); + } + + + // perform analysis on limbs to determine if it was shot off in a relatively vertical position + // if it was, begin rotating the limb. Note that this is quite hacky, and will only work + // on creatures with roughly long limbs (as opposed to square or something). + + DoLimbRotate(blownPart); + } + else if (IsAvailableSequence(monster, &generic_move_stand)) + { + blownPart->ghoulInst->Play(GetSequence(monster, &generic_move_stand),level.time,0.0,true,IGhoulInst::Hold, false, false); + VectorCopy(monster.s.origin, blownPart->s.origin); + blownPart->s.origin[2] += 24; + VectorSet (blownPart->mins, -8, -8, -8); + VectorSet (blownPart->maxs, 8, 8, 0); + } + else + { + G_FreeEdict(blownPart); + return NULL; + } + + blownPart->health = 300; + gi.linkentity(blownPart); + + for (i=1;i<=monster.ghoulInst->GetGhoulObject()->NumParts();i++) + { + if (monster.ghoulInst->GetGhoulObject()->GetPartType(i)==ptMesh) + { + blownPart->ghoulInst->SetPartOnOff(i,false); + } + } + + if(includeEffects) + { +// gi.sound (&monster, CHAN_BODY, gi.soundindex ("impact/gore/spout.wav"), .8, ATTN_NORM, 0); + FX_Bleed(blownPart, BlownCapBolt, 50); + } + + //testing... +// TestBoltPosition(blownPart->s.origin, blownPart->s.angles); + + return blownPart; +} + +void bodyorganic_c::DoLimbRotate(edict_t * monster) +{ +/* + This fuction finds the greatest axial dimension. If it is z, we are going to assume that this is + an arm or a leg in an upright position and begin rotating it so that it doesn't look too screwy + when it lands... I hope... +*/ + float xlength, ylength, zlength; + + xlength = monster->maxs[0] - monster->mins[0]; + ylength = monster->maxs[1] - monster->mins[1]; + zlength = monster->maxs[2] - monster->mins[2]; + + if ((zlength > xlength) && (zlength > ylength)) + { + monster->avelocity[0] = -150; + } + + return; +} + +void bodyorganic_c::UseGround2(edict_t &monster, qboolean toggleVal) +{ + GhoulID tempID; + if (toggleVal && !useGround2) + { + tempID=monster.ghoulInst->GetGhoulObject()->FindPart("quake_ground"); + if (tempID) + { + monster.ghoulInst->RemoveMatrixCallBack(&TheGroundCallback,tempID,IGhoulInst::MatrixType::Entity); + } + tempID=monster.ghoulInst->GetGhoulObject()->FindPart("quake_ground2"); + if (tempID) + { + monster.ghoulInst->AddMatrixCallBack(&TheGroundCallback,tempID,IGhoulInst::MatrixType::Entity); + } + } + else if (useGround2 && !toggleVal) + { + tempID=monster.ghoulInst->GetGhoulObject()->FindPart("quake_ground2"); + if (tempID) + { + monster.ghoulInst->RemoveMatrixCallBack(&TheGroundCallback,tempID,IGhoulInst::MatrixType::Entity); + } + tempID=monster.ghoulInst->GetGhoulObject()->FindPart("quake_ground"); + if (tempID) + { + monster.ghoulInst->AddMatrixCallBack(&TheGroundCallback,tempID,IGhoulInst::MatrixType::Entity); + } + } + useGround2=toggleVal; +} + +bodyorganic_c::bodyorganic_c(bodyorganic_c *orig) +: body_c(orig) +{ + int i, j; + + for(i = 0; i < 3; i++) + { + for(j = 0; j < 4; j++) + { + gzone_levels[i][j] = orig->gzone_levels[i][j]; + } + } + useGround2 = orig->useGround2; + spout = orig->spout; + numGoreZones = 0; + gzones = NULL; +} + +void bodyorganic_c::Evaluate(bodyorganic_c *orig) +{ + useGround2 = orig->useGround2; + spout = orig->spout; + numGoreZones = 0; + gzones = NULL; + + body_c::Evaluate(orig); + + AllocateGoreZones(*owner); + RecognizeGoreZones(*owner); + ReadGZ(); +} + +void bodyorganic_c::WriteGZ() +{ + int *damages; + int i; + + if(numGoreZones) + { + damages = new int [numGoreZones]; + + for(i = 0; i < numGoreZones; i++) + { + damages[i] = gzones[i].damage; + } + gi.AppendToSavegame('AIGZ', damages, numGoreZones * sizeof(int)); + delete [] damages; + } +} + +void bodyorganic_c::ReadGZ() +{ + int *damages; + int i; + + if(numGoreZones) + { + damages = new int [numGoreZones]; + + gi.ReadFromSavegame('AIGZ', damages, numGoreZones * sizeof(int)); + for(i = 0; i < numGoreZones; i++) + { + gzones[i].damage = damages[i]; + gzones[i].damage_level = GetDamageLevel(damages[i]); + } + + delete [] damages; + } +} + +///////////////////////////////////////////////////////////////////////////// +// +// human specific! +// +///////////////////////////////////////////////////////////////////////////// + +void bodyhuman_c::GetLevelDeathSoundDir(char *putSuffixHere, deathvoice_code death) +{ + deathvoice_code theVoice=death; + if (!putSuffixHere) + { + return; + } + + if (theVoice==DEATHVOICE_PLAYER) + { + strcpy(putSuffixHere, voiceDirDeath); + return; + } + putSuffixHere[0]=0; + + //mess with deathvoice code here + switch(GetInterpCode()) + { + default: + case LEVCODE_UNKNOWN: + case LEVCODE_NYC_SUBWAY: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_SKINHEAD; + } + break; + case LEVCODE_AFR_TRAIN: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_ARAB; + } + break; + case LEVCODE_KOS_SEWER: + case LEVCODE_NYC_SUBWAY2: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_RUSSIAN; + } + break; + case LEVCODE_KOS_BIGGUN: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_RUSSIAN; + } + break; + case LEVCODE_KOS_HANGAR: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_RUSSIAN; + } + break; + case LEVCODE_SIB_CANYON: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_RUSSIAN; + } + break; + case LEVCODE_SIB_BASE: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_RUSSIAN; + } + break; + case LEVCODE_SIB_PLANT: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_RUSSIAN; + } + break; + case LEVCODE_IRQ_TOWNA: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_ARAB; + } + break; + case LEVCODE_IRQ_BUNKER: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_ARAB; + } + break; + case LEVCODE_IRQ_CARGO: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_ARAB; + } + break; + case LEVCODE_NYC_WARE: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_SKINHEAD; + } + break; + case LEVCODE_NYC_STEAM: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_SKINHEAD; + } + break; + case LEVCODE_NYC_STREETS: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_SKINHEAD; + } + break; + case LEVCODE_AFR_YARD: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_ARAB; + } + break; + case LEVCODE_AFR_HOUSE: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_ARAB; + } + break; + case LEVCODE_AFR_FACT: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_ARAB; + } + break; + case LEVCODE_TOK_STREET: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_ASIAN; + } + break; + case LEVCODE_TOK_OFFICE: + if (theVoice == DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_DEFAULT; + } + else + { + theVoice=DEATHVOICE_ASIAN; + } + break; + case LEVCODE_TOK_PENT: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_ASIAN; + } + break; + case LEVCODE_IRQ_STREETS: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_ARAB; + } + break; + case LEVCODE_IRQ_FORT: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_ARAB; + } + break; + case LEVCODE_IRQ_OIL: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_ARAB; + } + break; + case LEVCODE_CAS_1: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_RAIDER; + } + break; + case LEVCODE_CAS_2: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_RAIDER; + } + break; + case LEVCODE_CAS_3: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_RAIDER; + } + break; + case LEVCODE_CAS_4: + if (theVoice != DEATHVOICE_FEMALE) + { + theVoice=DEATHVOICE_RAIDER; + } + break; + case LEVCODE_TUTORIAL: + case LEVCODE_ARM_1: + case LEVCODE_ARM_2: + case LEVCODE_ARM_3: + theVoice=DEATHVOICE_DEFAULT; + touchSound = false; + break; + } + + switch(theVoice) + { + case DEATHVOICE_DEFAULT: + break; + case DEATHVOICE_FEMALE: + strcpy(putSuffixHere, "enemy/dth/fem"); + break; + case DEATHVOICE_SKINHEAD: + strcpy(putSuffixHere, "enemy/dth/skin"); + break; + case DEATHVOICE_ARAB: + strcpy(putSuffixHere, "enemy/dth/arab"); + break; + case DEATHVOICE_RUSSIAN: + strcpy(putSuffixHere, "enemy/dth/russ"); + break; + case DEATHVOICE_ASIAN: + strcpy(putSuffixHere, "enemy/dth/jpn"); + break; + case DEATHVOICE_RAIDER: + strcpy(putSuffixHere, "enemy/dth/rad"); + break; + } +} + +bodyhuman_c::bodyhuman_c() +{ + curSoundIndex = 0; + curVol = 0; + curAtten = 1.0; + emotion = EMOTION_NORMAL; + emotion_expire=level.time; + emotionScripted=false; + currentmove = NULL; + holdCode = HOLDCODE_NO; + currentMoveFinished = true; + bodyDamage = bodyDamageAccumulated = BODYDAMAGE_NONE; + bodyDamageEndRecent=level.time; + rHandOpen=false; + lHandOpen=false; + rWeaponShot=false; + lWeaponShot=false; + frame_flags = 0; + memset(face_base, 0, 64); + memset(curface, 0, 64); + blink_time=level.time; + breathe_time=level.time; + rLastFireTime=level.time-10; + lLastFireTime=level.time-10; + nextGreetTime=level.time; + numGreets = 0; + numWakes = 0; + curGreet = 0; + touchSound = true; + deathVoiceType=DEATHVOICE_DEFAULT; + FinalAnim = false; + FinalSound = false; + freezeMyBolts = false; + gutsOut = false; + justFiredRight = false; + memset(voiceDirGeneral, 0, 64); + memset(voiceDirDeath, 0, 64); + voiceDirNumber=1; + lHandAtk = ATK_NOTHING; + rHandAtk = ATK_NOTHING; + armorCode = ARMOR_NONE; + nNextShotKillsMe = NEXTSHOT_NULL; + bDropBoltons = true; + bBoxConfirmed = false; + bVocalCordsWorking = true; + grenadeInHand = false; +} + +void bodyhuman_c::ShakeSpecialPart(edict_t &monster, gz_blown_part *part, Vect3 &Direction) +{ + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + if (part->area==GBLOWNAREA_FINISH || !myInstance) + { + return; + } + if (part->code == GBLOWNCODE_SPECIAL) + { + if (part->area == GBLOWNAREA_CHEST) + { + ShakePart(monster, gzones[GZ_HEAD_FRONT].blowme, Direction); + ShakePart(monster, gzones[GZ_ARM_UPPER_RIGHT].blowme, Direction); + ShakePart(monster, gzones[GZ_ARM_UPPER_LEFT].blowme, Direction); + } + } +} + +void bodyhuman_c::BlowSpecialPart(edict_t &monster, gz_blown_part *part, edict_t *dangler) +{ + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + if (part->area==GBLOWNAREA_FINISH || !myInstance) + { + return; + } + if (part->code == GBLOWNCODE_SPECIAL) + { + if (part->area == GBLOWNAREA_CHEST) + { + BlowPart(monster, gzones[GZ_HEAD_FRONT].blowme, dangler); + BlowPart(monster, gzones[GZ_ARM_UPPER_RIGHT].blowme, dangler); + BlowPart(monster, gzones[GZ_ARM_UPPER_LEFT].blowme, dangler); + BlowZone(monster, GZ_ARM_UPPER_RIGHT, GZ_ARM_UPPER_RIGHT,dangler); + BlowZone(monster, GZ_ARM_UPPER_LEFT, GZ_ARM_UPPER_LEFT,dangler); + BlowZone(monster, GZ_HEAD_FRONT, GZ_HEAD_FRONT,dangler); + } + else if (part->area == GBLOWNAREA_RTHIGH) + { + BlowZone(monster, GZ_LEG_LOWER_RIGHT, GZ_LEG_LOWER_RIGHT,dangler); + } + else if (part->area == GBLOWNAREA_LTHIGH) + { + BlowZone(monster, GZ_LEG_LOWER_LEFT, GZ_LEG_LOWER_LEFT,dangler); + } + } +} + +void bodyhuman_c::UseMonster(edict_t &monster, edict_t *user) +{ + if (monster.health > 0 && level.time > nextGreetTime && (OnSameTeam(&monster, user) || GetRightHandWeapon(monster)==ATK_NOTHING)) + { +/* ai_c *my_ai = (ai_c *)((ai_public_c *)monster.ai); + if ((my_ai->IsInnocent()||my_ai->GetTeam(monster)==0)&&!(monster.spawnflags & SPAWNFLAG_HOLD_POSITION)) + { // everybody likes me, so i get pushed around; is that fair?!?! + vec3_t from_user; + VectorSubtract(monster.s.origin, user->s.origin, from_user); + VectorNormalize(from_user); + T_Damage(&monster, user, user, from_user, monster.s.origin, user->s.origin, 0, 50, 0, 0, 0.0, 0.0); + } +*/ + // kef -- adding a new command to the scriptor would be too costly right now + if (monster.health != 9999) + { + if (emotion==EMOTION_PAIN || emotion==EMOTION_AFRAID) + { + Emote(monster, EMOTION_FEARTALK, 2.0); + } + else if (emotion==EMOTION_NORMAL) + { + Emote(monster, EMOTION_TALK, 2.0); + } + VoiceGreetSound(monster, 0.9); + } + nextGreetTime = level.time + 10.0f; + } +} + +void bodyhuman_c::TouchMonster(edict_t &monster, edict_t *user) +{ + if (touchSound && monster.health > 0 && level.time > nextGreetTime && (OnSameTeam(&monster, user) || GetRightHandWeapon(monster)==ATK_NOTHING)) + { + VoiceGreetSound(monster, 0.9); + nextGreetTime = level.time + 10.0f; + } +} + +void bodyhuman_c::MakeRetreatNoise(edict_t &monster) +{ + if (currentmove && currentmove->suggested_action != ACTCODE_PAIN) + { +// VoiceSound("retreat", monster, 0); + } +} + +void bodyhuman_c::VoiceSound(char *base, edict_t &monster, int num, float vol) +{ + char buffer[256]; + int tindex; + + char levSuffix[256]; + + if (!voiceDirGeneral[0]) + { + return; + } + + if ((monster.ai && monster.ai->FindScriptedDecision(&monster))||game.cinematicfreeze) + { + return; + } + + GetLevelSoundSuffix(levSuffix); + + if (!monster.ghoulInst || !gzones) + { + return; + } + + //no vocal cords, no scream + if (!AreVocalCordsWorking()) + { + return; + } + + // no screaming after a certain point + if (FinalSound) + { + return; + } + + if (!gmonster.IsReadyForVoiceSound()) + { + return; + } + + voiceCode_e newVoice=VOICECODE_UNKNOWN; + + if (!stricmp(base, "backup")) + { + newVoice=VOICECODE_BACKUP; + } + else if (!stricmp(base, "throw")) + { + newVoice=VOICECODE_THROW; + } + else if (!stricmp(base, "duck")) + { + newVoice=VOICECODE_DUCK; + } + else if (!stricmp(base, "retreat")) + { + newVoice=VOICECODE_RETREAT; + } + else if (!stricmp(base, "help")) + { + newVoice=VOICECODE_HELP; + } + else if (!stricmp(base, "react")) + { + newVoice=VOICECODE_REACT; + } + + if (newVoice==gmonster.GetVoiceCode()) + { + return; + } + + gmonster.SetVoiceSoundTime(level.time); + gmonster.SetVoiceCode(newVoice); + + if (num==0) + { + Com_sprintf(buffer, 256, "%s%d/%s/%s.wav", voiceDirGeneral, voiceDirNumber, levSuffix, base); + } + else + { + Com_sprintf(buffer, 256, "%s%d/%s/%s%d.wav", voiceDirGeneral, voiceDirNumber, levSuffix, base, gi.irand(1,num)); + } + + AI_GORETEST_PRINTF("voice sound: %s\n",buffer); + + if (DoesVoiceSoundExist(buffer)) + { + if (tindex=gi.soundindex (buffer)) + { + curSoundIndex=tindex; + curVol=vol; + curAtten = 1.6; + } + } +// gi.sound (&monster, CHAN_VOICE, curSoundIndex, vol, 1.6, 0); +} +static int lastWake; +void bodyhuman_c::VoiceWakeSound(edict_t &monster, float vol) +{ + char buffer[256]; + int tindex; + + char levSuffix[256]; + + if (!voiceDirGeneral[0]) + { + return; + } + + if ((monster.ai && monster.ai->FindScriptedDecision(&monster))||game.cinematicfreeze) + { + return; + } + + GetLevelSoundSuffix(levSuffix); + + //no vocal cords, no scream + if (!AreVocalCordsWorking()) + { + return; + } + if (monster.health <= 0 || FinalSound || numWakes <= 0) + { + return; + } + + if (!gmonster.IsReadyForWakeSound()) + { + return; + } + gmonster.SetWakeSoundTime(level.time); + + int curWake; + + //do unrandomizing trickery here + if (lastWake > 0 && lastWake <= numWakes && numWakes >= 2) + { + curWake = gi.irand(1,numWakes-1); + if (curWake >= lastWake) + { + curWake+=1; + } + } + else + { + curWake = gi.irand(1,numWakes); + } + lastWake = curWake; + + Com_sprintf(buffer, 256, "%s%d/%s/Wake%d.wav", voiceDirGeneral, voiceDirNumber, levSuffix, curWake); + + AI_GORETEST_PRINTF("wake sound: %s\n",buffer); + + if (tindex=gi.soundindex (buffer)) + { + curSoundIndex=tindex; + curVol=vol; + curAtten = 1.6; + } +} +static int lastGreet; +void bodyhuman_c::VoiceGreetSound(edict_t &monster, float vol) +{ + char buffer[256]; + int tindex; + + char levSuffix[256]; + + if (!voiceDirGeneral[0]) + { + return; + } + + if ((monster.ai && monster.ai->FindScriptedDecision(&monster))||game.cinematicfreeze) + { + return; + } + + GetLevelSoundSuffix(levSuffix); + + //no vocal cords, no scream + if (!AreVocalCordsWorking()) + { + return; + } + if (monster.health <= 0 || FinalSound || numGreets <= 0) + { + return; + } + + if (curGreet == 0) + { + //do unrandomizing trickery here + if (lastGreet > 0 && lastGreet <= numGreets && numGreets >= 2) + { + curGreet = gi.irand(1,numGreets-1); + if (curGreet >= lastGreet) + { + curGreet+=1; + } + } + else + { + curGreet = gi.irand(1,numGreets); + } + } + lastGreet = curGreet; + + Com_sprintf(buffer, 256, "%s%d/%s/Greet%d.adp", voiceDirGeneral, voiceDirNumber, levSuffix, curGreet); + + AI_GORETEST_PRINTF("greet sound: %s\n",buffer); + + if (tindex=gi.soundindex (buffer)) + { + curSoundIndex=tindex; + curVol=vol; + curAtten = 1.6; + } +} + +void bodyhuman_c::VoiceGeneralSound(char *base, edict_t &monster, int num, float vol) +{ + char buffer[256]; + int tindex; + + char levSuffix[256]; + +// GetLevelSoundSuffix(levSuffix); + GetLevelDeathSoundDir(levSuffix, deathVoiceType); + + assert(gzones);//NPM: I got a crash here + //no vocal cords, no scream + if (!AreVocalCordsWorking()&&stricmp(base, "choke")) + { + return; + } + + // no screaming after a certain point + if (FinalSound || levSuffix[0]==0) + { + return; + } + + Com_sprintf(buffer, 256, "%s/%s%d.wav", levSuffix, base, gi.irand(1,num)); + + AI_GORETEST_PRINTF("general voice sound: %s\n",buffer); + + if (tindex=gi.soundindex (buffer)) + { + // increase the player's loudness +// Com_Printf("%s %s making noise\n", monster.classname, monster.targetname?monster.targetname:"someguy"); + IncreaseSpawnIntensity(.05); + + curSoundIndex=tindex; + curVol=vol; + curAtten = 2.0; + } +// gi.sound (&monster, CHAN_VOICE, curSoundIndex, vol, 1.6, 0); +} + +void bodyhuman_c::VoiceSoundCache(char *base, edict_t &monster, int num) +{ + char buffer[256]; + int i; + + char levSuffix[256]; + + if (!voiceDirGeneral[0]) + { + return; + } + + GetLevelSoundSuffix(levSuffix); + + if(ai_loadAllBolts) + { + for(int j = 1; j <= voiceDirNumber; j++) + { + if (num==0) + { + Com_sprintf(buffer, 256, "%s%d/%s/%s.wav", voiceDirGeneral, j, levSuffix, base); + + AI_GORETEST_PRINTF("voice cache: %s\n",buffer); + + if (DoesVoiceSoundExist(buffer)) + { + gi.soundindex(buffer); + } + } + else + { + for (i=1;i<=num;i++) + { + Com_sprintf(buffer, 256, "%s%d/%s/%s%d.wav", voiceDirGeneral, j, levSuffix, base, i); + + AI_GORETEST_PRINTF("voice cache: %s\n",buffer); + + if (DoesVoiceSoundExist(buffer)) + { + gi.soundindex(buffer); + } + } + } + } + } + else + { + if (num==0) + { + Com_sprintf(buffer, 256, "%s%d/%s/%s.wav", voiceDirGeneral, voiceDirNumber, levSuffix, base); + + AI_GORETEST_PRINTF("voice cache: %s\n",buffer); + + if (DoesVoiceSoundExist(buffer)) + { + gi.soundindex(buffer); + } + } + else + { + for (i=1;i<=num;i++) + { + Com_sprintf(buffer, 256, "%s%d/%s/%s%d.wav", voiceDirGeneral, voiceDirNumber, levSuffix, base, i); + + AI_GORETEST_PRINTF("voice cache: %s\n",buffer); + + if (DoesVoiceSoundExist(buffer)) + { + gi.soundindex(buffer); + } + } + } + } +} + +void bodyhuman_c::VoiceWakeSoundCache(edict_t &monster) +{ + char buffer[256]; + int i; + + char levSuffix[256]; + + if (!voiceDirGeneral[0]) + { + return; + } + + GetLevelSoundSuffix(levSuffix); + + if (numWakes <= 0) + { + qboolean lastWake=false; + i=0; + while (!lastWake) + { + i++; + Com_sprintf(buffer, 256, "sound/%s%d/%s/Wake%d.wav", voiceDirGeneral, voiceDirNumber, levSuffix, i); + + //sound has level-specific override... + if (!DoesVoiceSoundExist(buffer)) + { + lastWake = true; + } + } + + //no sounds! + if (i<=1) + { + return; + } + + numWakes=i-1; + } + + if(ai_loadAllBolts) + { + for(int j = 1; j <= voiceDirNumber; j++) + { + for (i=1;i<=numWakes;i++) + { + Com_sprintf(buffer, 256, "%s%d/%s/Wake%d.wav", voiceDirGeneral, j, levSuffix, i); + + AI_GORETEST_PRINTF("voice cache: %s\n",buffer); + + gi.soundindex(buffer); + } + } + } + else + { + for (i=1;i<=numWakes;i++) + { + Com_sprintf(buffer, 256, "%s%d/%s/Wake%d.wav", voiceDirGeneral, voiceDirNumber, levSuffix, i); + + AI_GORETEST_PRINTF("voice cache: %s\n",buffer); + + gi.soundindex(buffer); + } + } +} + +void bodyhuman_c::VoiceGreetSoundCache(edict_t &monster) +{ + char buffer[256]; + int i; + + char levSuffix[256]; + + if (!voiceDirGeneral[0]) + { + return; + } + + GetLevelSoundSuffix(levSuffix); + + if (numGreets <= 0) + { + qboolean lastWake=false; + i=0; + while (!lastWake) + { + i++; + Com_sprintf(buffer, 256, "sound/%s%d/%s/Greet%d.adp", voiceDirGeneral, voiceDirNumber, levSuffix, i); + + //sound has level-specific override... + if (!DoesVoiceSoundExist(buffer)) + { + lastWake = true; + } + } + + //no sounds! + if (i<=1) + { + return; + } + + numGreets=i-1; + } + + if(ai_loadAllBolts) + { + for(int j = 1; j <= voiceDirNumber; j++) + { + for (i=1;i<=numGreets;i++) + { + Com_sprintf(buffer, 256, "%s%d/%s/Greet%d.adp", voiceDirGeneral, j, levSuffix, i); + + AI_GORETEST_PRINTF("voice cache: %s\n",buffer); + + gi.soundindex(buffer); + } + } + } + else + { + for (i=1;i<=numGreets;i++) + { + Com_sprintf(buffer, 256, "%s%d/%s/Greet%d.adp", voiceDirGeneral, voiceDirNumber, levSuffix, i); + + AI_GORETEST_PRINTF("voice cache: %s\n",buffer); + + gi.soundindex(buffer); + } + } +} + +void bodyhuman_c::VoiceGeneralSoundCache(char *base, edict_t &monster, int num) +{ + char buffer[256]; + int i; + + char levSuffix[256]; + +// GetLevelSoundSuffix(levSuffix); + GetLevelDeathSoundDir(levSuffix, deathVoiceType); + + if (levSuffix[0]==0) + { + return; + } + + for (i=1;i<=num;i++) + { + Com_sprintf(buffer, 256, "%s/%s%d.wav", levSuffix, base, i); + + //sound has level-specific override... +// if (DoesVoiceSoundExist(buffer)) +// { + gi.soundindex(buffer); +// } + //no level-specific override, use default sounds +// else +// { +// Com_sprintf(buffer, 256, "%sGen/%s%d.wav", voiceDirGeneral, base, i); +// gi.soundindex(buffer); +// } + + AI_GORETEST_PRINTF("general voice cache: %s\n",buffer); + } + +} + +void bodyhuman_c::SetVoiceDirectories(edict_t &monster, const char *base, int possible_varieties, deathvoice_code death, char *deathdir) +{ + assert(possible_varieties >= 1); + + deathVoiceType = death; + if (death==DEATHVOICE_PLAYER) + { + if (deathdir) + { + strcpy(voiceDirDeath, deathdir); + } + else + { + voiceDirDeath[0]=0; + } + } + else + { + voiceDirDeath[0]=0; + } + + if (!base || !base[0]) + { + voiceDirGeneral[0]=0; + } + else + { + sprintf(voiceDirGeneral, "Enemy/%s", base); + } + + voiceDirNumber=gi.irand(1,possible_varieties); + + if(ai_loadAllBolts) + { + voiceDirNumber = possible_varieties; + } +} + +void bodyhuman_c::SetRightHandWeapon(edict_t &monster, attacks_e newRightWeap) +{ + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + ggBinstC *boltedptr; + bool noAttack=true; + + if (!myInstance) + { + return; + } + + boltedptr=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r")); + if (boltedptr) + { + myInstance->RemoveBoltInstance(boltedptr); + } + + switch(newRightWeap) + { + case ATK_PISTOL2: + AddWeaponTypeForPrecache(SFW_PISTOL2); + noAttack=!AddBoltedItem(monster, "wbolt_hand_r", "Enemy/Bolt", "w_pistol2", "to_wbolt_hand_r", myInstance); + break; + case ATK_PISTOL1: + AddWeaponTypeForPrecache(SFW_PISTOL1); + noAttack=!AddBoltedItem(monster, "wbolt_hand_r", "Enemy/Bolt", "w_pistol1", "to_wbolt_hand_r", myInstance); + break; + case ATK_SNIPER: + case ATK_SNIPER_ALT: + AddWeaponTypeForPrecache(SFW_SNIPER); + noAttack=!AddBoltedItem(monster, "wbolt_hand_r", "Enemy/Bolt", "w_sniperrifle", "to_wbolt_hand_r", myInstance); + break; + case ATK_MACHINEGUN: + case ATK_MACHINEGUN_ALT: + AddWeaponTypeForPrecache(SFW_MACHINEGUN); + noAttack=!AddBoltedItem(monster, "wbolt_hand_r", "Enemy/Bolt", "w_machinegun", "to_wbolt_hand_r", myInstance); + break; + case ATK_KNIFE: + case ATK_KNIFE_ALT: + AddWeaponTypeForPrecache(SFW_KNIFE); + noAttack=!AddBoltedItem(monster, "wbolt_hand_r", "Enemy/Bolt", "w_knife", "to_wbolt_hand_r", myInstance); + break; + case ATK_FLAMEGUN: + case ATK_FLAMEGUN_ALT: + AddWeaponTypeForPrecache(SFW_FLAMEGUN); + noAttack=!AddBoltedItem(monster, "wbolt_hand_r", "Enemy/Bolt", "w_flamethrower", "to_wbolt_hand_r", myInstance); + break; + case ATK_ASSAULTRIFLE: + AddWeaponTypeForPrecache(SFW_ASSAULTRIFLE); + noAttack=!AddBoltedItem(monster, "wbolt_hand_r", "Enemy/Bolt", "w_assault_rifle", "to_wbolt_hand_r", myInstance); + break; + case ATK_MACHINEPISTOL: + // 1/11/00 kef -- don't put Hawk's machinepistol in the pak file + if(strcmp(monster.classname, "m_x_mmerc")) + { + AddWeaponTypeForPrecache(SFW_MACHINEPISTOL); + } + noAttack=!AddBoltedItem(monster, "wbolt_hand_r", "Enemy/Bolt", "w_machinepistol", "to_wbolt_hand_r", myInstance); + break; + case ATK_AUTOSHOTGUN: + case ATK_AUTOSHOTGUN_ALT: + AddWeaponTypeForPrecache(SFW_AUTOSHOTGUN); + noAttack=!AddBoltedItem(monster, "wbolt_hand_r", "Enemy/Bolt", "w_autoshotgun", "_to_wbolt_hand_r", myInstance); + break; + case ATK_SHOTGUN: + AddWeaponTypeForPrecache(SFW_SHOTGUN); + noAttack=!AddBoltedItem(monster, "wbolt_hand_r", "Enemy/Bolt", "w_shotgun", "to_wbolt_hand_r", myInstance); + break; + case ATK_ROCKET: + AddWeaponTypeForPrecache(SFW_ROCKET); + noAttack=!AddBoltedItem(monster, "wbolt_hand_r", "Enemy/Bolt", "w_rocket", "to_wbolt_hand_r", myInstance); + break; + case ATK_MICROWAVE: + case ATK_MICROWAVE_ALT: + case ATK_DEKKER: + AddWeaponTypeForPrecache(SFW_MICROWAVEPULSE); + noAttack=!AddBoltedItem(monster, "wbolt_hand_r", "Enemy/Bolt", "w_mpg", "_to_wbolt_hand_r", myInstance); + break; + default: + case ATK_NOTHING: + break; + } + + //only set rHandAtk if i was successful bolting the thing on. + if (noAttack) + { + rHandAtk = ATK_NOTHING;//unset whatever was there before, because we just removed it + } + else + { + rHandAtk = newRightWeap; + } +} + +void bodyhuman_c::SetLeftHandWeapon(edict_t &monster, attacks_e newLeftWeap) +{ + lHandAtk = newLeftWeap; + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + ggBinstC *boltedptr; + + if (!myInstance) + { + return; + } + + boltedptr=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l")); + if (boltedptr) + { + myInstance->RemoveBoltInstance(boltedptr); + } + + if (lHandAtk==ATK_MACHETE) + { + if (!AddBoltedItem(monster, "wbolt_hand_l", "Enemy/Bolt", "w_machete", "to_wbolt_hand_l", myInstance)) + { + lHandAtk=ATK_NOTHING; + } + } + //thrown item--make sure i've got the anims avail... + else + { + if(!IsAvailableSequence(monster, &generic_move_throw_gren) + && !IsAvailableSequence(monster, &generic_move_lob_grenade_crouch) + && !IsAvailableSequence(monster, &generic_move_throwstar)) + { +// if (monster.targetname) +// { +// gi.dprintf("Attention! Canceling thrown weapon for %s--no anim support!\n",monster.targetname); +// } +// else if (monster.classname) +// { +// gi.dprintf("Attention! Canceling thrown weapon for %s--no anim support!\n",monster.classname); +// } +// else +// { +// gi.dprintf("Attention! Canceling thrown weapon for unknown--no anim support!\n"); +// } + lHandAtk=ATK_NOTHING; + } + } +} + +int bodyhuman_c::UseLeftHandAttack(edict_t &monster, edict_t *target) +{ + //ahem, machetes go in the left hand... + attacks_e myLeftHand=GetLeftHandWeapon(monster); + if(myLeftHand == ATK_NOTHING)return 0; + if(!(monster.spawnflags & SPAWNFLAG_HAS_PROJECTILE)&&(myLeftHand != ATK_THROWSTAR))return 0; + if(!target)return 0; + if(gi.flrand(0,1) > .1 /*&&(myLeftHand != ATK_THROWSTAR)*//*for testing*/)return 0; + + CRadiusContent rad(target->s.origin, 200, 1, 1); + + for(int i = 0; i < rad.getNumFound(); i++) + { + edict_t *search = rad.foundEdict(i); + + if (myLeftHand == ATK_THROWSTAR && search == &monster) + continue; + + if(OnSameTeam(&monster, search)) + { + return 0; + } + } + + //fixme - what about the ceiling? + // can't fix everything, but let's at least not ram the wall + vec3_t checkDir, checkSpot; + trace_t tr; + + AngleVectors(monster.s.angles, checkDir, 0, 0); + + VectorMA(monster.s.origin, 96, checkDir, checkSpot); + gi.trace(monster.s.origin, 0, 0, checkSpot, &monster, MASK_PLAYERSOLID, &tr); + if(tr.fraction < 1.0) + { //? + return 0; + } + + return 1; +} + + +mmove_t *bodyhuman_c::GetSequenceForDisability(edict_t &monster, int reject_actionflags) +{ + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + float blindLevel=0; + mmove_t *auxmove; + + if (the_ai) + { + blindLevel=the_ai->GetSenseMutedLevel(sight_mask); + } + + //okay, i'm blind. now what? +// if (currentmove && currentmove->bbox == BBOX_PRESET_STAND) +// { + if (blindLevel >= smute_degree_severe) + { + //ooh, not showing the blinded yet. so let's go! + if (currentmove && currentmove->bodyPosition != BODYPOS_BLINDED) + { + if(VerifySequence(monster, &generic_move_blindedto, reject_actionflags)) + { + return &generic_move_blindedto; + } + } + if(VerifySequence(monster, &generic_move_blindedloop, reject_actionflags)) + { + return &generic_move_blindedloop; + } + } + //ooh, still showing the blinded. stop already! + if (currentmove && currentmove->bodyPosition == BODYPOS_BLINDED) + { + if(VerifySequence(monster, &generic_move_blindedfrom, reject_actionflags)) + { + return &generic_move_blindedfrom; + } + } +// } + + if (Skill_NoPain(&monster)) + { + bodyDamage&=~BODYDAMAGE_RECENT; + } + //owee, i'm hurt + else if (bodyDamage & BODYDAMAGE_RECENT && currentmove && currentmove->bbox==BBOX_PRESET_STAND) + { + //randomly get tired of this shtick(sp?)--fixme: should store time, or something more reliable +// if ((gi.flrand(0.0,10.0)*Skill_DisablityModifier(&monster)<1.0)) + if (level.time > bodyDamageEndRecent) + { + bodyDamage&=~BODYDAMAGE_RECENT; + } + //hit in leg + if (bodyDamage & (BODYDAMAGE_RIGHTLEG)) + { + if (IsAvailableSequence(monster, &generic_move_hop_lleg)) + { + if (currentmove!=&generic_move_hop_lleg/*||currentMoveFinished*/) + { + VoiceGeneralSound("Writhe", monster, WRITHENUMBER); + } + return &generic_move_hop_lleg; + } + } + if (bodyDamage & (BODYDAMAGE_LEFTLEG)) + { + if (IsAvailableSequence(monster, &generic_move_hop_rleg)) + { + if (currentmove!=&generic_move_hop_rleg/*||currentMoveFinished*/) + { + VoiceGeneralSound("Writhe", monster, WRITHENUMBER); + } + return &generic_move_hop_rleg; + } + } + if (bodyDamage & (BODYDAMAGE_RIGHTARM)) + { + if (IsAvailableSequence(monster, &generic_move_hurt_rarm)) + { + if (currentmove!=&generic_move_hurt_rarm/*||currentMoveFinished*/) + { + VoiceGeneralSound("Writhe", monster, WRITHENUMBER); + } + return &generic_move_hurt_rarm; + } + } + if (bodyDamage & (BODYDAMAGE_LEFTARM)) + { + if (IsAvailableSequence(monster, &generic_move_hurt_larm)) + { + if (currentmove!=&generic_move_hurt_larm/*||currentMoveFinished*/) + { + VoiceGeneralSound("Writhe", monster, WRITHENUMBER); + } + return &generic_move_hurt_larm; + } + } + } + + + //okay, i want to be able to be startled anywhere, so i'll call spasticness a disability + if (currentmove && currentmove->bbox == BBOX_PRESET_STAND && currentmove->bodyPosition == BODYPOS_IDLE + && the_ai && the_ai->HasTarget()) + { + //only be startled sometimes? + if (the_ai->GetStartleability()/*&& gi.irand(0,3)*/) + { + the_ai->SetStartleability(false); + + //only play alert sound if perception was immediate, and enemy is client...(fixme?) + sensedEntInfo_t sensed; + the_ai->GetSensedClientInfo(0, sensed); + if (!sensed.ent || sensed.time > level.time - 7.0) + { + if (currentmove && currentmove->suggested_action != ACTCODE_PAIN) + { + VoiceWakeSound(monster, 0.9); + } + } + + if(VerifySequence(monster, &generic_move_startled, reject_actionflags)) + { + + + return &generic_move_startled; + } + } + } + + + //danger! if i need to reload, won't play ideal_move! + if (GetBestWeapon(monster)!=ATK_NOTHING) + { + if (MustReloadRWeapon(monster)) + { + justFiredRight = false; + if (auxmove=GetSequenceForReload(monster/*, dest, face, seqtype, goal_bbox, ideal_move, reject_actionflags*/)) + { + return auxmove; + } + } + else if (justFiredRight) + { + justFiredRight = false; + if (auxmove=GetPostShootSequence(monster)) + { + return auxmove; + } + } + } + + //just came from startled--consider reloading + //fixme: force reloading here, or earlier (this is hacky)? + if (currentmove && currentmove==&generic_move_startled && IsAnimationFinished() + && GetBestWeapon(monster)!=ATK_NOTHING) + { + if (gi.irand(0,1)) + { + if (auxmove=GetSequenceForReload(monster)) + { + return auxmove; + } + } + } + + //eh, nothing going on here. what's on tv? + return NULL; +} + +mmove_t *bodyhuman_c::GetSequenceForTransition(edict_t &monster, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, int reject_actionflags) +{ + if (!currentmove||goal_bbox==BBOX_PRESET_NUMBER||goal_bbox==currentmove->bbox) + { + return NULL; + } + gunvariety_t rightHandWeapVariety=GetGunVariety(GetRightHandWeapon(monster)); + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + bool isAggressive=monster.client||(the_ai&&the_ai->getTarget()&&!OnSameTeam(the_ai->getTarget(),&monster)&&rightHandWeapVariety!=GUNVARIETY_NONE&&emotion!=EMOTION_AFRAID); + + switch(currentmove->bbox) + { + case BBOX_PRESET_CROUCH: + if(goal_bbox == BBOX_PRESET_STAND) + { + if (GetBestWeapon(monster)==ATK_NOTHING && VerifySequence(monster, &generic_move_crouch_cower_up, reject_actionflags)) + { + return &generic_move_crouch_cower_up; + } + if((rightHandWeapVariety&GUNVARIETY_MRS)&&VerifySequence(monster, &generic_move_duck_up_mrs, reject_actionflags)) + { + return &generic_move_duck_up_mrs; + } + if((rightHandWeapVariety&GUNVARIETY_LAUNCHER)&&VerifySequence(monster, &generic_move_duck_up_l, reject_actionflags)) + { + return &generic_move_duck_up_l; + } + if(VerifySequence(monster, &generic_move_duck_up, reject_actionflags)) + { + return &generic_move_duck_up; + } + } + break; + case BBOX_PRESET_STAND: + if(goal_bbox == BBOX_PRESET_CROUCH) + { + if(isAggressive && (rightHandWeapVariety & GUNVARIETY_PISTOL) && VerifySequence(monster, &generic_move_crouchdwnpistol1h, reject_actionflags)) + { + return &generic_move_crouchdwnpistol1h; + } + + if (GetBestWeapon(monster)==ATK_NOTHING && VerifySequence(monster, &generic_move_crouch_cower_dwn, reject_actionflags)) + { + return &generic_move_crouch_cower_dwn; + } + + if (IsAvailableSequence(monster, &generic_move_roll_to_crouch) && !(monster.spawnflags&SPAWNFLAG_HOLD_POSITION) && !(monster.flags&FL_NO_KNOCKBACK)) + { + vec3_t to_dest, forward; + float to_dest_dist; + VectorSubtract(dest, monster.s.origin, to_dest); + AngleVectors(monster.s.angles, forward, NULL, NULL); + to_dest_dist=VectorNormalize(to_dest); + if (to_dest_dist>2 && DotProduct(to_dest, forward)>0.5 && VerifySequence(monster, &generic_move_roll_to_crouch, reject_actionflags)) + { + return &generic_move_roll_to_crouch; + } + } + + if((rightHandWeapVariety&GUNVARIETY_MRS)&&VerifySequence(monster, &generic_move_duck_down_mrs, reject_actionflags)) + { + return &generic_move_duck_down_mrs; + } + if((rightHandWeapVariety&GUNVARIETY_LAUNCHER)&&VerifySequence(monster, &generic_move_duck_down_l, reject_actionflags)) + { + return &generic_move_duck_down_l; + } + if(VerifySequence(monster, &generic_move_duck_down, reject_actionflags)) + { + return &generic_move_duck_down; + } + } + else if (goal_bbox == BBOX_PRESET_PRONE) + { + if(VerifySequence(monster, &generic_move_go_prone, reject_actionflags)) + { + return &generic_move_go_prone; + } + } + break; + case BBOX_PRESET_LAYSIDE: + if (monster.spawnflags & SPAWNFLAG_HOLD_POSITION) + { + return NULL; + } + if(VerifySequence(monster, &generic_move_prone_to_stand, reject_actionflags)) + { + monster.s.angles[YAW]-=90.0f; + monster.s.angles[YAW]=anglemod(monster.s.angles[YAW]); + return &generic_move_prone_to_stand; + } + break; + case BBOX_PRESET_PRONE: + if (monster.spawnflags & SPAWNFLAG_HOLD_POSITION) + { + return NULL; + } + if(VerifySequence(monster, &generic_move_prone_to_stand, reject_actionflags)) + { + return &generic_move_prone_to_stand; + } + break; + case BBOX_PRESET_LAYBACK: + if (monster.spawnflags & SPAWNFLAG_HOLD_POSITION) + { + return NULL; + } + if(VerifySequence(monster, &generic_move_upfromback, reject_actionflags)) + { + VoiceGeneralSound("Getup", monster, 1); + return &generic_move_upfromback; + } + break; + } + //nothing appropriate found. oh well. + return NULL; +} + +mmove_t *bodyhuman_c::GetSequenceForRunAimStrafe(edict_t &monster, vec3_t to_dest_dir, vec3_t forward, vec3_t right, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + gunvariety_t rightHandWeapVariety=GetGunVariety(GetRightHandWeapon(monster)); + + vec3_t velocityDir; + + if (monster.ai) + { + VectorCopy(monster.ai->velocity, velocityDir); + VectorNormalize(velocityDir); + if (DotProduct(velocityDir, to_dest_dir)<0.25) + { + return NULL; + } + } + + if (fabs(DotProduct(to_dest_dir, forward))<0.8) + { + //go right... + if (DotProduct(to_dest_dir, right)<0) + { + if (rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_raimstrafr_mrs, reject_actionflags)) + { + return &generic_move_raimstrafr_mrs; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER && VerifySequence(monster, &generic_move_raimstrafr_l, reject_actionflags)) + { + return &generic_move_raimstrafr_l; + } + if (VerifySequence(monster, &generic_move_raimstrafr_p, reject_actionflags)) + { + return &generic_move_raimstrafr_p; + } + } + //go left... + else + { + if (rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_raimstrafl_mrs, reject_actionflags)) + { + return &generic_move_raimstrafl_mrs; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER && VerifySequence(monster, &generic_move_raimstrafl_l, reject_actionflags)) + { + return &generic_move_raimstrafl_l; + } + if (VerifySequence(monster, &generic_move_raimstrafl_p, reject_actionflags)) + { + return &generic_move_raimstrafl_p; + } + } + } + return NULL; +} + +mmove_t *bodyhuman_c::GetSequenceForWalkAimStrafe(edict_t &monster, vec3_t to_dest_dir, vec3_t forward, vec3_t right, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + gunvariety_t rightHandWeapVariety=GetGunVariety(GetRightHandWeapon(monster)); + + if (fabs(DotProduct(to_dest_dir, forward))<0.8) + { + //go right... + if (DotProduct(to_dest_dir, right)<0) + { + + if (rightHandWeapVariety&GUNVARIETY_MS && VerifySequence(monster, &generic_move_waimstrafr_ms, reject_actionflags)) + { + return &generic_move_waimstrafr_ms; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE && VerifySequence(monster, &generic_move_waimstrafr_r, reject_actionflags)) + { + return &generic_move_waimstrafr_r; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER && VerifySequence(monster, &generic_move_waimstrafr_l, reject_actionflags)) + { + return &generic_move_waimstrafr_l; + } + if (VerifySequence(monster, &generic_move_waimstrafr_p, reject_actionflags)) + { + return &generic_move_waimstrafr_p; + } + + } + //go left... + else + { + if (rightHandWeapVariety&GUNVARIETY_MS && VerifySequence(monster, &generic_move_waimstrafl_ms, reject_actionflags)) + { + return &generic_move_waimstrafl_ms; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE && VerifySequence(monster, &generic_move_waimstrafl_r, reject_actionflags)) + { + return &generic_move_waimstrafl_r; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER && VerifySequence(monster, &generic_move_waimstrafl_l, reject_actionflags)) + { + return &generic_move_waimstrafl_l; + } + if (VerifySequence(monster, &generic_move_waimstrafl_p, reject_actionflags)) + { + return &generic_move_waimstrafl_p; + } + } + + } + return NULL; +} + +bool bodyhuman_c::IsInStationaryDeathAnim() +{ + if ( (currentmove == &generic_move_death_stumble_2frnt ) || + (currentmove == &generic_move_death_violent ) || + (currentmove == &generic_move_deaththrown ) || + (currentmove == &generic_move_death_tumble_toback ) || + (currentmove == &generic_move_death_sinback_tofront ) || + (currentmove == &generic_move_death_shldrright ) || + (currentmove == &generic_move_death_shldrleft ) ) + { + return false; + } + return true; +} + +mmove_t *bodyhuman_c::GetSequenceForMovement(edict_t &monster, vec3_t dest, vec3_t face, vec3_t org, vec3_t ang, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + vec3_t to_dest,to_dest_dir,to_face,to_face_dir; + float angle_dist_to_dest,angle_dist_to_face; + vec3_t forward,right; + float tdot; + + gunvariety_t rightHandWeapVariety=GetGunVariety(GetRightHandWeapon(monster)); + + //to restrict when guys use their aim anims... + bool isAggressive=monster.client||(the_ai&&the_ai->getTarget()&&!OnSameTeam(the_ai->getTarget(),&monster)&&rightHandWeapVariety!=GUNVARIETY_NONE&&emotion!=EMOTION_AFRAID); + + if (ideal_move && VerifySequence(monster, ideal_move, reject_actionflags)) + { + return ideal_move; + } + + if (monster.spawnflags & SPAWNFLAG_HOLD_POSITION) + { + return GetSequenceForStand(monster, vec3_origin, vec3_origin, seqtype, goal_bbox, ideal_move, reject_actionflags); + } + + //if i'm disabled, i'm disabled. what can you do about something like that? + mmove_t *auxmove; + if (auxmove=GetSequenceForDisability(monster)) + { + return auxmove; + } + + if (auxmove=GetSequenceForTransition(monster, dest, face, seqtype, goal_bbox)) + { + return auxmove; + } + + if (monster.ai) + { + //hit in leg + if (bodyDamageAccumulated & (BODYDAMAGE_RIGHTLEG)) + { + if (IsAvailableSequence(monster, &generic_move_limp_lleg)) + { + return &generic_move_limp_lleg; + } + } + if (bodyDamageAccumulated & (BODYDAMAGE_LEFTLEG)) + { + if (IsAvailableSequence(monster, &generic_move_limp_rleg)) + { + return &generic_move_limp_rleg; + } + } + } + + if (currentmove&&(currentmove->bbox==BBOX_PRESET_PRONE ||currentmove->bbox==BBOX_PRESET_ALLFOURS)) + { + if(VerifySequence(monster, &generic_move_praim_mrs, reject_actionflags)) + { + return &generic_move_praim_mrs; + } + } + + if(currentmove&¤tmove->bbox == BBOX_PRESET_LAYSIDE) + { + return currentmove; + } + + //get the direction i was facing, so i can see how out of my way dest is + AngleVectors(ang, forward, right, NULL); + + VectorSubtract(dest, org, to_dest); + VectorCopy(to_dest, to_dest_dir); + to_dest_dir[2]=0; + VectorNormalize(to_dest_dir); + angle_dist_to_dest = DotProduct (forward, to_dest_dir) + 1; + + VectorSubtract(face, org, to_face); + VectorCopy(to_face, to_face_dir); + VectorNormalize(to_face_dir); + angle_dist_to_face = DotProduct (forward, to_face_dir) + 1; + + if (currentmove&¤tmove->bbox==BBOX_PRESET_CROUCH) + { + //yikes! i'm trapped down here! + + //roll right + if (DotProduct(to_dest_dir, right)>0.75) + { + if(VerifySequence(monster, &generic_move_rollrt_p, reject_actionflags)) + { + return &generic_move_rollrt_p; + } + } + //roll left + else if (DotProduct(to_dest_dir, right)<-0.75) + { + if(VerifySequence(monster, &generic_move_rolllt_p, reject_actionflags)) + { + return &generic_move_rolllt_p; + } + + } + //going forward... + else if (DotProduct(to_dest_dir, forward)>0.0) + { + if (isAggressive) + { + if ((rightHandWeapVariety&GUNVARIETY_MRS) && VerifySequence(monster, &generic_move_crouch_run_mrs, reject_actionflags)) + { + return &generic_move_crouch_run_mrs; + } + if ((rightHandWeapVariety&GUNVARIETY_LAUNCHER) && VerifySequence(monster, &generic_move_crouch_launcher_run_aim, reject_actionflags)) + { + return &generic_move_crouch_launcher_run_aim; + } + if ((rightHandWeapVariety&GUNVARIETY_KNIFE) && VerifySequence(monster, &generic_move_crouch_knife_run_aim, reject_actionflags)) + { + return &generic_move_crouch_knife_run_aim; + } + if(VerifySequence(monster, &generic_move_crouch_run_p, reject_actionflags)) + { + return &generic_move_crouch_run_p; + } + } + } + //going backward... + else// if (DotProduct(to_dest_dir, forward)>0.0) + { + if (isAggressive) + { + if ((rightHandWeapVariety&GUNVARIETY_MRS) && VerifySequence(monster, &generic_move_crouch_rbk_mrs, reject_actionflags)) + { + return &generic_move_crouch_rbk_mrs; + } + if ((rightHandWeapVariety&GUNVARIETY_LAUNCHER) && VerifySequence(monster, &generic_move_crouch_launcher_runbk_aim, reject_actionflags)) + { + return &generic_move_crouch_launcher_runbk_aim; + } + if ((rightHandWeapVariety&GUNVARIETY_KNIFE) && VerifySequence(monster, &generic_move_crouch_knife_runbk_aim, reject_actionflags)) + { + return &generic_move_crouch_knife_runbk_aim; + } + if(VerifySequence(monster, &generic_move_crouch_rbk_p, reject_actionflags)) + { + return &generic_move_crouch_rbk_p; + } + } + } + + if (isAggressive) + { + if((rightHandWeapVariety&GUNVARIETY_RIFLE) && VerifySequence(monster, &generic_move_caim_r, reject_actionflags)) + { + return &generic_move_caim_r; + } + if((rightHandWeapVariety&GUNVARIETY_MS) && VerifySequence(monster, &generic_move_caim_ms, reject_actionflags)) + { + return &generic_move_caim_ms; + } + if((rightHandWeapVariety&GUNVARIETY_LAUNCHER) && VerifySequence(monster, &generic_move_caim_l, reject_actionflags)) + { + return &generic_move_caim_l; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL && VerifySequence(monster, &generic_move_chaim2, reject_actionflags)) + { + return &generic_move_chaim2; + } + } + } + + //check for stairs here + + //this is the new way of doing it. yippee!! +/* if (the_ai) + { + int EnemyInfoType; + CAIPathNode *curNode; + CAIPathNode *nextNode; + vec3_t EnemyInfoSource, EnemyInfoDest, EnemyInfoDir; + vec3_t EnemyInfoMins, EnemyInfoMaxs;//bounds of current path + int i; + bool acceptInfoPoint=true; + + EnemyInfoType=the_ai->GetCurrentEnemyInfoPoint(); + + curNode=aiPoints.getNode(the_ai->getPathData().curNode); + nextNode=aiPoints.getNode(the_ai->getPathData().nextNode); + + if (curNode && nextNode) + { + curNode->getPos(EnemyInfoSource); + nextNode->getPos(EnemyInfoDest); + for (i=0;i<2;i++) + { + if (EnemyInfoSource[i]>EnemyInfoDest[i]) + { + EnemyInfoMins[i]=EnemyInfoDest[i]; + EnemyInfoMaxs[i]=EnemyInfoSource[i]; + } + else + { + EnemyInfoMaxs[i]=EnemyInfoDest[i]; + EnemyInfoMins[i]=EnemyInfoSource[i]; + } + } + VectorSubtract(EnemyInfoDest, EnemyInfoSource, EnemyInfoDir); + EnemyInfoDir[2]=0; + VectorNormalize(EnemyInfoDir); +*/ + //going down stairs? +/* if (the_ai->getPathData().typeOfPath==LINK_STAIR_DOWN) + { + for (i=0;i<=2;i++) + { + //reject if outside the boundaries of the staricase + if (monster.s.origin[i]-EnemyInfoMaxs[i]>32&&monster.s.origin[i]-EnemyInfoMins[i]<-32) + { + acceptInfoPoint=false; + } + } + //reject if not going the same direction as the staircase + if (DotProduct(to_dest_dir, EnemyInfoDir)<0.75) + { + acceptInfoPoint=false; + } + if (acceptInfoPoint) + { + if((rightHandWeapVariety&GUNVARIETY_MRS)&&VerifySequence(monster, &generic_move_rdwnstairs_mrs, reject_actionflags)) + { + return &generic_move_rdwnstairs_mrs; + } + if((rightHandWeapVariety&GUNVARIETY_LAUNCHER)&&VerifySequence(monster, &generic_move_rdwnstairs_l, reject_actionflags)) + { + return &generic_move_rdwnstairs_l; + } + if(VerifySequence(monster, &generic_move_rdwnstairs_p, reject_actionflags)) + { + return &generic_move_rdwnstairs_p; + } + } + } + + + //going up stairs? + if (the_ai->getPathData().typeOfPath==LINK_STAIR_UP) + { + for (i=0;i<=2;i++) + { + //reject if outside the boundaries of the staricase + if (monster.s.origin[i]-EnemyInfoMaxs[i]>32&&monster.s.origin[i]-EnemyInfoMins[i]<-32) + { + acceptInfoPoint=false; + } + } + //reject if not going the same direction as the staircase + if (DotProduct(to_dest_dir, EnemyInfoDir)<0.75) + { + acceptInfoPoint=false; + } + if (acceptInfoPoint) + { + if((rightHandWeapVariety&GUNVARIETY_MRS)&&VerifySequence(monster, &generic_move_rupstairs_mrs, reject_actionflags)) + { + return &generic_move_rupstairs_mrs; + } + if((rightHandWeapVariety&GUNVARIETY_LAUNCHER)&&VerifySequence(monster, &generic_move_rupstairs_l, reject_actionflags)) + { + return &generic_move_rupstairs_l; + } + if(VerifySequence(monster, &generic_move_rupstairs_p, reject_actionflags)) + { + return &generic_move_rupstairs_p; + } + } + }*/ + +/* } + }*/ + //fixme: this check is just plain silly + //prefer walking here + if ((angle_dist_to_face * VectorLength(to_dest) < 10)||(GetArmorCode()==ARMOR_FULL)) + { + + tdot=DotProduct (right, to_dest_dir); + + if (GetBestWeapon(monster)!=ATK_NOTHING) + { + float dist_to_dest = VectorLength(to_dest); + if (angle_dist_to_face < 0.1 && dist_to_dest < 10 && dist_to_dest > 0) + { + if(rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_wturn180_mrs, reject_actionflags)) + { + return &generic_move_wturn180_mrs; + } + } + if (((angle_dist_to_face < 1.9 && currentmove&&(currentmove->bodyPosition==BODYPOS_WALKTURN))|| + (angle_dist_to_face < 1.2)) && dist_to_dest < 10 && dist_to_dest > 0) + { + if (tdot > 0.0) + { + if(rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_wturn90r_mrs, reject_actionflags)) + { + return &generic_move_wturn90r_mrs; + } + if(VerifySequence(monster, &generic_move_wturn90r_p, reject_actionflags)) + { + return &generic_move_wturn90r_p; + } + } + else + { + if(rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_wturn90l_mrs, reject_actionflags)) + { + return &generic_move_wturn90l_mrs; + } + if(VerifySequence(monster, &generic_move_wturn90l_p, reject_actionflags)) + { + return &generic_move_wturn90l_p; + } + } + } + + if (isAggressive) + { + //wanna strafewalk... + if (auxmove = GetSequenceForWalkAimStrafe(monster, to_dest_dir, forward, right, dest, face, seqtype, goal_bbox, ideal_move, reject_actionflags)) + { + return auxmove; + } + //walk back... + if (DotProduct(to_dest_dir, forward)<-0.75) + { + if (rightHandWeapVariety&GUNVARIETY_RIFLE && VerifySequence(monster, &generic_move_wbackaim_r, reject_actionflags)) + { + return &generic_move_wbackaim_r; + } + if (rightHandWeapVariety&GUNVARIETY_MS && VerifySequence(monster, &generic_move_wbackaim_ms, reject_actionflags)) + { + return &generic_move_wbackaim_ms; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER && VerifySequence(monster, &generic_move_wbackaim_l, reject_actionflags)) + { + return &generic_move_wbackaim_l; + } + if (VerifySequence(monster, &generic_move_wbackaim_p, reject_actionflags)) + { + return &generic_move_wbackaim_p; + } + } + } + + if(rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_walk_mrs, reject_actionflags)) + { + return &generic_move_walk_mrs; + } + if(rightHandWeapVariety&GUNVARIETY_LAUNCHER && VerifySequence(monster, &generic_move_walk_l, reject_actionflags)) + { + return &generic_move_walk_l; + } + if(VerifySequence(monster, &generic_move_walk_attitude, reject_actionflags)) + { + return &generic_move_walk_attitude; + } + if(VerifySequence(monster, &generic_move_walk, reject_actionflags)) + { + return &generic_move_walk; + } + } + //unarmed + else + { + if (((angle_dist_to_face < 1.9 && currentmove && (currentmove->bodyPosition==BODYPOS_WALKTURN))|| + (angle_dist_to_face < 1.2)) && VectorLength(to_dest) < 10) + { + if (tdot > 0.0) + { + if(VerifySequence(monster, &generic_move_wturn90r_p, reject_actionflags)) + { + return &generic_move_wturn90r_p; + } + } + else + { + if(VerifySequence(monster, &generic_move_wturn90l_p, reject_actionflags)) + { + return &generic_move_wturn90l_p; + } + } + } + //wanna strafewalk... + if (isAggressive) + { + if (auxmove = GetSequenceForWalkAimStrafe(monster, to_dest_dir, forward, right, dest, face, seqtype, goal_bbox, ideal_move, reject_actionflags)) + { + return auxmove; + } + } + + //walk backwerd... + if (DotProduct(to_dest_dir, forward)<-0.75) + { + if (isAggressive && VerifySequence(monster, &generic_move_wbackaim_p, reject_actionflags)) + { + return &generic_move_wbackaim_p; + } + } + if(VerifySequence(monster, &generic_move_walk, reject_actionflags)) + { + return &generic_move_walk; + } + if (GetBestWeapon(monster)==ATK_NOTHING) + { + if(VerifySequence(monster, &generic_move_runscared, reject_actionflags)) + { + return &generic_move_runscared; + } + } + } + + if(rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_walk_jog_mrs, reject_actionflags)) + { + return &generic_move_walk_jog_mrs; + } + if(rightHandWeapVariety&GUNVARIETY_PISTOL && VerifySequence(monster, &generic_move_walk_jog_gunup_p, reject_actionflags)) + { + return &generic_move_walk_jog_gunup_p; + } +// if(rightHandWeapVariety&GUNVARIETY_PISTOL && VerifySequence(monster, &generic_move_walk_jog_gundwn_p, reject_actionflags)) +// { +// return &generic_move_walk_jog_gundwn_p; +// } + if(rightHandWeapVariety&GUNVARIETY_PISTOL && VerifySequence(monster, &generic_move_run_gunup, reject_actionflags)) + { + return &generic_move_run_gunup; + } + if(rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_run_mrs, reject_actionflags)) + { + return &generic_move_run_mrs; + } + if(VerifySequence(monster, &generic_move_run, reject_actionflags)) + { + return &generic_move_run; + } + + if (isAggressive) + { + if (rightHandWeapVariety&GUNVARIETY_PK && VerifySequence(monster, &generic_move_waim_p, reject_actionflags)) + { + return &generic_move_waim_p; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE && VerifySequence(monster, &generic_move_waim_r, reject_actionflags)) + { + return &generic_move_waim_r; + } + if (rightHandWeapVariety&GUNVARIETY_MS && VerifySequence(monster, &generic_move_waim_ms, reject_actionflags)) + { + return &generic_move_waim_ms; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER && VerifySequence(monster, &generic_move_waim_l, reject_actionflags)) + { + return &generic_move_waim_l; + } + } + + //yike! i don't know how to move!! + if(rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_stand_mrs, reject_actionflags)) + { + return &generic_move_stand_mrs; + } + if(VerifySequence(monster, &generic_move_stand, reject_actionflags)) + { + return &generic_move_stand; + } + if(/*rightHandWeapVariety&GUNVARIETY_PK &&*/ VerifySequence(monster, &generic_move_alert_p, reject_actionflags)) + { + return &generic_move_alert_p; + } + return &generic_move_stand; + } + //prefer running here + else + { + if (isAggressive) + { + //wanna straferun... + if (auxmove = GetSequenceForRunAimStrafe(monster, to_dest_dir, forward, right, dest, face, seqtype, goal_bbox, ideal_move, reject_actionflags)) + { + return auxmove; + } + if (auxmove = GetSequenceForWalkAimStrafe(monster, to_dest_dir, forward, right, dest, face, seqtype, goal_bbox, ideal_move, reject_actionflags)) + { + return auxmove; + } + } + + if (GetBestWeapon(monster)==ATK_NOTHING) + { + if(VerifySequence(monster, &generic_move_runscared, reject_actionflags)) + { + return &generic_move_runscared; + } + } + tdot=DotProduct (right, to_dest_dir); + if (isAggressive) + { + //run forward... + if (DotProduct(to_dest_dir, forward)>0) + { + if (rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_raim_mrs, reject_actionflags)) + { + return &generic_move_raim_mrs; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL && VerifySequence(monster, &generic_move_raim_p2, reject_actionflags)) + { + return &generic_move_raim_p2; + } + if (rightHandWeapVariety&GUNVARIETY_PK && VerifySequence(monster, &generic_move_raim_p1, reject_actionflags)) + { + return &generic_move_raim_p1; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER && VerifySequence(monster, &generic_move_raim_l, reject_actionflags)) + { + return &generic_move_raim_l; + } + } + //run back... + else + { + if (rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_rbackaim_mrs, reject_actionflags)) + { + return &generic_move_rbackaim_mrs; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL && VerifySequence(monster, &generic_move_rbackaim_p2, reject_actionflags)) + { + return &generic_move_rbackaim_p2; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER && VerifySequence(monster, &generic_move_rbackaim_l, reject_actionflags)) + { + return &generic_move_rbackaim_l; + } + } + } + if(rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_run_mrs, reject_actionflags)) + { + return &generic_move_run_mrs; + } + if(VerifySequence(monster, &generic_move_run, reject_actionflags)) + { + return &generic_move_run; + } + if(rightHandWeapVariety&GUNVARIETY_PISTOL && VerifySequence(monster, &generic_move_run_gunup, reject_actionflags)) + { + return &generic_move_run_gunup; + } + if(rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_walk_jog_mrs, reject_actionflags)) + { + return &generic_move_walk_jog_mrs; + } + if(rightHandWeapVariety&GUNVARIETY_PISTOL && VerifySequence(monster, &generic_move_walk_jog_gunup_p, reject_actionflags)) + { + return &generic_move_walk_jog_gunup_p; + } +// if(rightHandWeapVariety&GUNVARIETY_PISTOL && VerifySequence(monster, &generic_move_walk_jog_gundwn_p, reject_actionflags)) +// { +// return &generic_move_walk_jog_gundwn_p; +// } + if(rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_walk_mrs, reject_actionflags)) + { + return &generic_move_walk_mrs; + } + if(rightHandWeapVariety&GUNVARIETY_LAUNCHER && VerifySequence(monster, &generic_move_walk_l, reject_actionflags)) + { + return &generic_move_walk_l; + } + if(VerifySequence(monster, &generic_move_walk, reject_actionflags)) + { + return &generic_move_walk; + } + + if (isAggressive) + { + if (rightHandWeapVariety&GUNVARIETY_PK && VerifySequence(monster, &generic_move_waim_p, reject_actionflags)) + { + return &generic_move_waim_p; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE && VerifySequence(monster, &generic_move_waim_r, reject_actionflags)) + { + return &generic_move_waim_r; + } + if (rightHandWeapVariety&GUNVARIETY_MS && VerifySequence(monster, &generic_move_waim_ms, reject_actionflags)) + { + return &generic_move_waim_ms; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER && VerifySequence(monster, &generic_move_waim_l, reject_actionflags)) + { + return &generic_move_waim_l; + } + } + + //yike! i don't know how to move!! + if(rightHandWeapVariety&GUNVARIETY_MRS && VerifySequence(monster, &generic_move_stand_mrs, reject_actionflags)) + { + return &generic_move_stand_mrs; + } + if(VerifySequence(monster, &generic_move_stand, reject_actionflags)) + { + return &generic_move_stand; + } + if(/*rightHandWeapVariety&GUNVARIETY_PK &&*/ VerifySequence(monster, &generic_move_alert_p, reject_actionflags)) + { + return &generic_move_alert_p; + } + return &generic_move_stand; + } +} + +#define MAX_PRONE_DIST_SQUARED 65000 + +mmove_t *bodyhuman_c::GetSequenceForDodge(edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int leftSide, int reject_actionflags) +{ +/* if (currentmove && currentmove->suggested_action==ACTCODE_DODGE) + { + return currentmove; + }*/ + + vec3_t dif; + +// if (currentmove && currentmove->suggested_action != ACTCODE_PAIN) +// { +// VoiceSound("duck", monster, 0); +// } + + if (monster.spawnflags & SPAWNFLAG_HOLD_POSITION) + { +// return GetSequenceForStand(monster, vec3_origin, vec3_origin, seqtype, goal_bbox, ideal_move, reject_actionflags); + return NULL; + } + + if(target) + { + VectorSubtract(target->s.origin, monster.s.origin, dif); + } + else + { + VectorClear(dif); + } + + if(VectorLengthSquared(dif) > MAX_PRONE_DIST_SQUARED) + { + // generic_move_go_prone + // if running, dive 'cause it's cool - fixme + + float rVal = gi.flrand(0,1); + +// if (/*!leftSide && rVal < 0.25 && */VerifySequence(monster, &generic_move_jumpthrowstars_bk, reject_actionflags)) +// { +// return &generic_move_jumpthrowstars_bk; +// } +// if (/*!leftSide && rVal < 0.25 && */VerifySequence(monster, &generic_move_jumpthrowstars, reject_actionflags)) +// { +// return &generic_move_jumpthrowstars; +// } + if(rVal < 0.25) + { + if(VerifySequence(monster, &generic_move_backflip, reject_actionflags)) + { + return &generic_move_backflip; + } + } + if(rVal < .25) + { + if(VerifySequence(monster, &generic_move_roll_to_crouch, reject_actionflags)) + { + return &generic_move_roll_to_crouch; + } + } + if(rVal < .5) + { + if(VerifySequence(monster, &generic_move_dive_toprone, reject_actionflags)) + { + return &generic_move_dive_toprone; + } + } + + if(leftSide == -1) + { + if(VerifySequence(monster, &generic_move_rollrt_p, reject_actionflags)) + { + return &generic_move_rollrt_p; + } + } + else if(leftSide == 1) + { + if(VerifySequence(monster, &generic_move_rolllt_p, reject_actionflags)) + { + return &generic_move_rolllt_p; + } + + } + } +// if (/*!leftSide && !gi.irand(0,10) && */VerifySequence(monster, &generic_move_jumpthrowstars_bk, reject_actionflags)) +// { +// return &generic_move_jumpthrowstars_bk; +// } +// if (/*!leftSide && !gi.irand(0,10) && */VerifySequence(monster, &generic_move_jumpthrowstars, reject_actionflags)) +// { +// return &generic_move_jumpthrowstars; +// } + if(leftSide == -1) + { + if(VerifySequence(monster, &generic_move_rollrt_p, reject_actionflags)) + { + return &generic_move_rollrt_p; + } + } + else if(leftSide == 1) + { + if(VerifySequence(monster, &generic_move_rolllt_p, reject_actionflags)) + { + return &generic_move_rolllt_p; + } + } + if(VerifySequence(monster, &generic_move_backflip, reject_actionflags)) + { + return &generic_move_backflip; + } + if(VerifySequence(monster, &generic_move_roll_to_crouch, reject_actionflags)) + { + return &generic_move_roll_to_crouch; + } + +// return currentmove; + return NULL; +} + +mmove_t *bodyhuman_c::GetSequenceForStand(edict_t &monster, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + gunvariety_t rightHandWeapVariety=GetGunVariety(GetRightHandWeapon(monster)); + + if (ideal_move && VerifySequence(monster, ideal_move, reject_actionflags)) + { + return ideal_move; + } + + //if i'm disabled, i'm disabled. what can you do about something like that? + mmove_t *auxmove; + if (auxmove=GetSequenceForDisability(monster, reject_actionflags)) + { + return auxmove; + } + + //hit in leg--can consolidate these into simple bodyDamage&BODYDAMAGE_ANY chack? + if (bodyDamage & BODYDAMAGE_ANY) + { + if (GetBestWeapon(monster)==ATK_NOTHING&&(monster.ai || goal_bbox==BBOX_PRESET_CROUCH)) + { + if (auxmove=GetSequenceForTransition(monster, dest, face, seqtype, BBOX_PRESET_CROUCH, reject_actionflags)) + { + return auxmove; + } + if (currentmove && (currentmove==&generic_move_crouch_cower_mid2 || &generic_move_crouch_cower_mid) && + !IsAnimationFinished()) + { + return currentmove; + } + if((gi.irand(0,2)||!VerifySequence(monster, &generic_move_crouch_cower_mid2, reject_actionflags))&& + VerifySequence(monster, &generic_move_crouch_cower_mid, reject_actionflags)) + { + return &generic_move_crouch_cower_mid; + } + if(VerifySequence(monster, &generic_move_crouch_cower_mid2, reject_actionflags)) + { + return &generic_move_crouch_cower_mid2; + } + } + // guys look bad with this anim - you can wander around them and they just stand there +/* if (GetRightHandWeapon(monster)!=ATK_NOTHING&&(monster.ai || goal_bbox==BBOX_PRESET_STAND)&&IsAvailableSequence(monster, &generic_move_hurt_aim)) + { + return &generic_move_hurt_aim; + }*/ + } + + if (auxmove=GetSequenceForTransition(monster, dest, face, seqtype, goal_bbox, reject_actionflags)) + { + return auxmove; + } + + float aimCone; + float tempAng; + + if (the_ai) + { + tempAng = anglemod(the_ai->ideal_angles[YAW]-monster.s.angles[YAW]); + if (currentmove) + { + aimCone = the_ai->GetAimConeDegrees(monster, currentmove->bbox); + } + else + { + aimCone = the_ai->GetAimConeDegrees(monster, BBOX_PRESET_STAND); + } + } + else + { + tempAng = 0;//uh?? + aimCone = 10;//eh? + } + + if (currentmove && (currentmove->suggested_action==ACTCODE_STAND/* || currentmove->suggested_action==ACTCODE_ATTACK*/) + && (!(currentmove->actionFlags&ACTFLAG_OPTATTACK))&&(!IsAnimationFinished())) + { +// if (!/*(currentmove->suggested_action==ACTCODE_ATTACK) || */(monster.client || (the_ai && the_ai->HasTarget()))) + //if i have a target, or i need to turn, then forget whatever animation i'm in now + if (!(monster.client || (the_ai && the_ai->HasTarget()))&&!(tempAng > aimCone && tempAng < 360.0-aimCone)) + { + return currentmove; // ask steve about this when back from vacation + } + } + + if (currentmove&&(currentmove->bbox==BBOX_PRESET_PRONE ||currentmove->bbox==BBOX_PRESET_ALLFOURS)) + { + if(VerifySequence(monster, &generic_move_praim_mrs, reject_actionflags)) + { + return &generic_move_praim_mrs; + } + } + + if(currentmove&¤tmove->bbox == BBOX_PRESET_CROUCH) + { + if (GetBestWeapon(monster)==ATK_NOTHING && emotion == EMOTION_AFRAID) + { + if(gi.irand(0,1)&&VerifySequence(monster, &generic_move_crouch_cower_mid, reject_actionflags)) + { + return &generic_move_crouch_cower_mid; + } + if(VerifySequence(monster, &generic_move_crouch_cower_mid2, reject_actionflags)) + { + return &generic_move_crouch_cower_mid2; + } + } + if(rightHandWeapVariety&GUNVARIETY_RIFLE && VerifySequence(monster, &generic_move_caim_r, reject_actionflags)) + { + return &generic_move_caim_r; + } + if(rightHandWeapVariety&GUNVARIETY_MS && VerifySequence(monster, &generic_move_caim_ms, reject_actionflags)) + { + return &generic_move_caim_ms; + } + if((rightHandWeapVariety&GUNVARIETY_LAUNCHER) && VerifySequence(monster, &generic_move_caim_l, reject_actionflags)) + { + return &generic_move_caim_l; + } + if (IsAvailableSequence(monster, &generic_move_duck_shoot) && VerifySequence(monster, &generic_move_chaim2, reject_actionflags)) + { + return &generic_move_chaim2; + } + } + + if(currentmove&¤tmove->bbox == BBOX_PRESET_LAYSIDE) + { + return currentmove; + } + + if(currentmove&¤tmove->bbox == BBOX_PRESET_LAYBACK) + { + if (auxmove=GetSequenceForTransition(monster, dest, face, seqtype, BBOX_PRESET_STAND, reject_actionflags)) + { + return auxmove; + } + + //er, try scooching? + if (VerifySequence(monster, &generic_move_layback_scooch, reject_actionflags)) + { + if (currentmove != &generic_move_layback_scooch) + { + VoiceGeneralSound("Writhe",monster,WRITHENUMBER); + } + return &generic_move_layback_scooch; + } + if (VerifySequence(monster, &generic_move_layback_die_shoot, reject_actionflags)) + { + return &generic_move_layback_die_shoot; + } + + //forget it--count me dead + if (VerifySequence(monster, &generic_move_death_lbshotdeath, reject_actionflags)) + { + return &generic_move_death_lbshotdeath; + } + + return currentmove;//ah! yikes! + } + + vec3_t forward, right, to_dest_dir; + VectorSubtract(face, monster.s.origin, to_dest_dir); + VectorNormalize(to_dest_dir); + AngleVectors(monster.s.angles, forward, right, NULL); + + if (the_ai && level.time-the_ai->getLastTargetTime()<10.0 && the_ai->HasHadTarget()) + { + //i'm outside the aim cone...use ideal_angles for aiming + if (tempAng > aimCone && tempAng < 360.0-aimCone) + { + if (rightHandWeapVariety&GUNVARIETY_MS&&VerifySequence(monster, &generic_move_ashuffle_ms, reject_actionflags)) + { + return &generic_move_ashuffle_ms; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_ashuffle_r, reject_actionflags)) + { + return &generic_move_ashuffle_r; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_ashuffle_p2, reject_actionflags)) + { + return &generic_move_ashuffle_p2; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_ashuffle_pcb, reject_actionflags)) + { + return &generic_move_ashuffle_pcb; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_ashuffle_l, reject_actionflags)) + { + return &generic_move_ashuffle_l; + } + } + + if (rightHandWeapVariety&GUNVARIETY_MRS) + { + if (rightHandWeapVariety&GUNVARIETY_MS&&VerifySequence(monster, &generic_move_staim_ms, reject_actionflags)) + { + return &generic_move_staim_ms; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_staim_r, reject_actionflags)) + { + return &generic_move_staim_r; + } + if(VerifySequence(monster, &generic_move_alert_mrs, reject_actionflags)) + { + return &generic_move_alert_mrs; + } + } + else if (rightHandWeapVariety==GUNVARIETY_NONE) + { + if(emotion == EMOTION_AFRAID && VerifySequence(monster, &generic_move_fear_wave, reject_actionflags) && !gi.irand(0,10)) + { + return &generic_move_fear_wave; + } + if(emotion == EMOTION_AFRAID && VerifySequence(monster, &generic_move_cower, reject_actionflags)) + { + return &generic_move_cower; + } + } + + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staim_p2, reject_actionflags)) + { + return &generic_move_staim_p2; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staim_pcb, reject_actionflags)) + { + return &generic_move_staim_pcb; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_staim_l, reject_actionflags)) + { + return &generic_move_staim_l; + } + if(VerifySequence(monster, &generic_move_alert_p, reject_actionflags)) + { + return &generic_move_alert_p; + } + + } + if (the_ai && level.time-the_ai->getLastTargetTime()<20.0 && the_ai->HasHadTarget()) + { + //i'm outside the aim cone...use ideal_angles for aiming + if (tempAng > aimCone && tempAng < 360.0-aimCone) + { + if (rightHandWeapVariety&GUNVARIETY_MS&&VerifySequence(monster, &generic_move_ashuffle_ms, reject_actionflags)) + { + return &generic_move_ashuffle_ms; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_ashuffle_r, reject_actionflags)) + { + return &generic_move_ashuffle_r; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_ashuffle_p2, reject_actionflags)) + { + return &generic_move_ashuffle_p2; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_ashuffle_pcb, reject_actionflags)) + { + return &generic_move_ashuffle_pcb; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_ashuffle_l, reject_actionflags)) + { + return &generic_move_ashuffle_l; + } + } + + if (rightHandWeapVariety&GUNVARIETY_MRS) + { + if((rand()%15) && VerifySequence(monster, &generic_move_atkpause1_mrs, reject_actionflags)) + { + return &generic_move_atkpause1_mrs; + } + if(VerifySequence(monster, &generic_move_atkpause2_mrs, reject_actionflags)) + { + return &generic_move_atkpause2_mrs; + } + if (rightHandWeapVariety&GUNVARIETY_MS&&VerifySequence(monster, &generic_move_staim_ms, reject_actionflags)) + { + return &generic_move_staim_ms; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_staim_r, reject_actionflags)) + { + return &generic_move_staim_r; + } + if(VerifySequence(monster, &generic_move_alert_mrs, reject_actionflags)) + { + return &generic_move_alert_mrs; + } + } + else if (rightHandWeapVariety==GUNVARIETY_NONE) + { + if(emotion == EMOTION_AFRAID && VerifySequence(monster, &generic_move_fear_wave, reject_actionflags) && !gi.irand(0,10)) + { + return &generic_move_fear_wave; + } + if(emotion == EMOTION_AFRAID && VerifySequence(monster, &generic_move_cower, reject_actionflags)) + { + return &generic_move_cower; + } + } + + if((rand()%15) && VerifySequence(monster, &generic_move_atkpause1_p, reject_actionflags)) + { + return &generic_move_atkpause1_p; + } + if(VerifySequence(monster, &generic_move_atkpause2_p, reject_actionflags)) + { + return &generic_move_atkpause2_p; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staim_p2, reject_actionflags)) + { + return &generic_move_staim_p2; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staim_pcb, reject_actionflags)) + { + return &generic_move_staim_pcb; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_staim_l, reject_actionflags)) + { + return &generic_move_staim_l; + } + if(VerifySequence(monster, &generic_move_alert_p, reject_actionflags)) + { + return &generic_move_alert_p; + } + + } + if (the_ai && !the_ai->HasHadTarget()) + { + //mgun, rifle moves + if (rightHandWeapVariety&GUNVARIETY_MRS) + { + if(!(rand()%5) && currentmove != &generic_move_standlook_mrs && VerifySequence(monster, &generic_move_standlook_mrs, reject_actionflags)) + { + return &generic_move_standlook_mrs; + } + if(!(rand()%3) && currentmove != &generic_move_standstretch_mrs && VerifySequence(monster, &generic_move_standstretch_mrs, reject_actionflags)) + { + return &generic_move_standstretch_mrs; + } + if(VerifySequence(monster, &generic_move_stand_mrs, reject_actionflags)) + { + return &generic_move_stand_mrs; + } + } + + if(!(rand()%6) && currentmove != &generic_move_standlook && VerifySequence(monster, &generic_move_standlook, reject_actionflags)) + { + return &generic_move_standlook; + } + if(!(gi.irand(0,50)) && currentmove != &generic_move_ishift && VerifySequence(monster, &generic_move_ishift, reject_actionflags)) + { + return &generic_move_ishift; + } + if(!(rand()%4) && currentmove != &generic_move_standstretch && VerifySequence(monster, &generic_move_standstretch, reject_actionflags)) + { + return &generic_move_standstretch; + } + if(VerifySequence(monster, &generic_move_stand, reject_actionflags)) + { + return &generic_move_stand; + } + if(rightHandWeapVariety&GUNVARIETY_PK && VerifySequence(monster, &generic_move_alert_p, reject_actionflags)) + { + return &generic_move_alert_p; + } + } + else if (the_ai) + { + //i'm outside the aim cone...use ideal_angles for aiming + if (tempAng > aimCone && tempAng < 360.0-aimCone) + { + if (rightHandWeapVariety&GUNVARIETY_MS&&VerifySequence(monster, &generic_move_ashuffle_ms, reject_actionflags)) + { + return &generic_move_ashuffle_ms; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_ashuffle_r, reject_actionflags)) + { + return &generic_move_ashuffle_r; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_ashuffle_p2, reject_actionflags)) + { + return &generic_move_ashuffle_p2; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_ashuffle_pcb, reject_actionflags)) + { + return &generic_move_ashuffle_pcb; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_ashuffle_l, reject_actionflags)) + { + return &generic_move_ashuffle_l; + } + } + + if (rightHandWeapVariety&GUNVARIETY_MRS) + { + if(!(rand()%13) && currentmove != &generic_move_alertlkrt_mrs && VerifySequence(monster, &generic_move_alertlkrt_mrs, reject_actionflags)) + { + return &generic_move_alertlkrt_mrs; + } + if(!(rand()%11) && currentmove != &generic_move_alerttrnlt_mrs && VerifySequence(monster, &generic_move_alerttrnlt_mrs, reject_actionflags)) + { + return &generic_move_alerttrnlt_mrs; + } + if(VerifySequence(monster, &generic_move_alert_mrs, reject_actionflags)) + { + return &generic_move_alert_mrs; + } + } + else if (rightHandWeapVariety==GUNVARIETY_NONE) + { + if(emotion == EMOTION_AFRAID && VerifySequence(monster, &generic_move_fear_wave, reject_actionflags) && !gi.irand(0,10)) + { + return &generic_move_fear_wave; + } + if(emotion == EMOTION_AFRAID && VerifySequence(monster, &generic_move_cower, reject_actionflags)) + { + return &generic_move_cower; + } + } + + if((!(rand()%15)) && currentmove != &generic_move_alertlklt_p && VerifySequence(monster, &generic_move_alertlklt_p, reject_actionflags)) + { + return &generic_move_alertlklt_p; + } + if((!(rand()%9)) && currentmove != &generic_move_alerttrnrt_p && VerifySequence(monster, &generic_move_alerttrnrt_p, reject_actionflags)) + { + return &generic_move_alerttrnrt_p; + } + if( VerifySequence(monster, &generic_move_alert_p, reject_actionflags)) + { + return &generic_move_alert_p; + } + } + + //should not be getting here!!! + if (rightHandWeapVariety&GUNVARIETY_MRS) + { + if(VerifySequence(monster, &generic_move_stand_mrs, reject_actionflags)) + { + return &generic_move_stand_mrs; + } + } + if(VerifySequence(monster, &generic_move_stand, reject_actionflags)) + { + return &generic_move_stand; + } + if (rightHandWeapVariety&GUNVARIETY_MRS) + { + if(VerifySequence(monster, &generic_move_walk_mrs, reject_actionflags)) + { + return &generic_move_walk_mrs; + } + } + if(VerifySequence(monster, &generic_move_walk, reject_actionflags)) + { + return &generic_move_walk; + } +// if(rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_alert_p, reject_actionflags)) +// { +// return &generic_move_alert_p; +// } + if(rightHandWeapVariety&GUNVARIETY_MRS&&VerifySequence(monster, &generic_move_alert_mrs, reject_actionflags)) + { + return &generic_move_alert_mrs; + } + + //aiming up--use as aim and attack + if (to_dest_dir[2]>0.25) + { + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staimup_p, reject_actionflags)) + { + return &generic_move_staimup_p; + } + if (rightHandWeapVariety&GUNVARIETY_MRS&&VerifySequence(monster, &generic_move_staimup_mrs, reject_actionflags)) + { + return &generic_move_staimup_mrs; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_staimup_l, reject_actionflags)) + { + return &generic_move_staimup_l; + } + } + //aiming down + if (to_dest_dir[2]<-0.25) + { + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staimdn_p, reject_actionflags)) + { + return &generic_move_staimdn_p; + } + if (rightHandWeapVariety&GUNVARIETY_MRS&&VerifySequence(monster, &generic_move_staimdn_mrs, reject_actionflags)) + { + return &generic_move_staimdn_mrs; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_staimdn_l, reject_actionflags)) + { + return &generic_move_staimdn_l; + } + } + + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staim_p2, reject_actionflags)) + { + return &generic_move_staim_p2; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staim_pcb, reject_actionflags)) + { + return &generic_move_staim_pcb; + } + if (rightHandWeapVariety&GUNVARIETY_MS&&VerifySequence(monster, &generic_move_staim_ms, reject_actionflags)) + { + return &generic_move_staim_ms; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_staim_r, reject_actionflags)) + { + return &generic_move_staim_r; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_staim_l, reject_actionflags)) + { + return &generic_move_staim_l; + } + if(/*rightHandWeapVariety&GUNVARIETY_KNIFE&&*/VerifySequence(monster, &generic_move_alert_p, reject_actionflags)) + { + return &generic_move_alert_p; + } + + if (dm->isDM()) + { + return currentmove; + } + return &generic_move_stand; +} + +mmove_t *bodyhuman_c::GetSequenceForJump(edict_t &monster, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + gunvariety_t rightHandWeapVariety=GetGunVariety(GetRightHandWeapon(monster)); + if (ideal_move && VerifySequence(monster, ideal_move, reject_actionflags)) + { + return ideal_move; + } + + //if i'm disabled, i'm disabled. what can you do about something like that? + mmove_t *auxmove; + if (auxmove=GetSequenceForDisability(monster, reject_actionflags)) + { + return auxmove; + } + + if (auxmove=GetSequenceForTransition(monster, dest, face, seqtype, goal_bbox, reject_actionflags)) + { + return auxmove; + } + + if((rightHandWeapVariety&GUNVARIETY_LAUNCHER)&&VerifySequence(monster, &generic_move_jumpstrup_jump_l, reject_actionflags)) + { + return &generic_move_jumpstrup_jump_l; + } + + if(VerifySequence(monster, &generic_move_jumpstrup_jump, reject_actionflags)) + { + return &generic_move_jumpstrup_jump; + } + if(VerifySequence(monster, &generic_move_jumpup_jump, reject_actionflags)) + { + return &generic_move_jumpup_jump; + } + return GetSequenceForStand(monster, dest, face, seqtype, goal_bbox, ideal_move, reject_actionflags); +} + +mmove_t *bodyhuman_c::GetPostShootSequence(edict_t &monster, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + if (!currentmove || currentmove->bbox != BBOX_PRESET_STAND) + { + return NULL; + } + + attacks_e rightHandWeapAttack=GetRightHandWeapon(monster); + gunvariety_t rightHandWeapVariety=GetGunVariety(rightHandWeapAttack); + + if (currentmove->bbox == BBOX_PRESET_STAND) + { + if (rightHandWeapAttack==ATK_SHOTGUN&&VerifySequence(monster, &generic_move_scock_s, reject_actionflags)) + { + return &generic_move_scock_s; + } + if (rightHandWeapAttack==ATK_SNIPER&&VerifySequence(monster, &generic_move_scock_r, reject_actionflags)) + { + return &generic_move_scock_r; + } + } + + if (currentmove->bbox == BBOX_PRESET_CROUCH) + { + if (rightHandWeapAttack==ATK_SHOTGUN&&VerifySequence(monster, &generic_move_ccock_s, reject_actionflags)) + { + return &generic_move_ccock_s; + } + } + + return NULL; +} + +mmove_t *bodyhuman_c::GetSequenceForReload(edict_t &monster, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *auxmove; + + if (currentmove && currentmove->suggested_action != ACTCODE_PAIN) + { +// VoiceSound("reload", monster, 0); + } + +// if (auxmove=GetSequenceForTransition(monster, dest, face, seqtype, BBOX_PRESET_STAND, reject_actionflags)) + if (auxmove=GetSequenceForTransition(monster, dest, face, seqtype, goal_bbox, reject_actionflags)) + { + return auxmove; + } + + gunvariety_t rightHandWeapVariety=GetGunVariety(GetRightHandWeapon(monster)); + vec3_t to_dest, to_dest_dir; +// vec3_t to_face, to_face_dir; + vec3_t forward, right, up; + float to_dest_dist; +// float to_face_dist; + + if (VectorCompare(dest, vec3_origin)||VectorCompare(dest, monster.s.origin)) + { + VectorCopy(vec3_origin, to_dest); + VectorCopy(vec3_origin, to_dest_dir); + to_dest_dist=0; + } + else + { + VectorSubtract(dest, monster.s.origin, to_dest); + VectorCopy(to_dest, to_dest_dir); + to_dest_dist = VectorNormalize(to_dest_dir); + } + + AngleVectors(monster.s.angles, forward, right, up); +/* + if (VectorCompare(face, vec3_origin)||VectorCompare(face, monster.s.origin)) + { + VectorCopy(vec3_origin, to_face); + VectorCopy(vec3_origin, to_face_dir); + to_face_dist=0; + } + else + { + VectorSubtract(face, monster.s.origin, to_face); + VectorCopy(to_face, to_face_dir); + to_face_dist = VectorNormalize(to_face_dir); + } +*/ + ReloadRWeapon(monster); + + if (rightHandWeapVariety&GUNVARIETY_MS) + { + if (goal_bbox==BBOX_PRESET_CROUCH) + { + //want to move and reload + if (to_dest_dist > 1) + { + if (DotProduct(forward, to_dest_dir)<-0.5 && VerifySequence(monster, &generic_move_reload_crun_bk_ms, reject_actionflags)) + { + return &generic_move_reload_crun_bk_ms; + } + if (VerifySequence(monster, &generic_move_reload_crun_fwd_ms, reject_actionflags)) + { + return &generic_move_reload_crun_fwd_ms; + } + } + if (VerifySequence(monster, &generic_move_reload_c_ms, reject_actionflags)) + { + return &generic_move_reload_c_ms; + } + } + //want to run and reload + if (to_dest_dist > 200) + { + if (DotProduct(right, to_dest_dir) > 0.5 && VerifySequence(monster, &generic_move_reload_run_rt_ms, reject_actionflags)) + { + return &generic_move_reload_run_rt_ms; + } + if (DotProduct(right, to_dest_dir) < -0.5 && VerifySequence(monster, &generic_move_reload_run_lt_ms, reject_actionflags)) + { + return &generic_move_reload_run_lt_ms; + } + if (DotProduct(forward, to_dest_dir)<-0.5 && VerifySequence(monster, &generic_move_reload_run_bk_ms, reject_actionflags)) + { + return &generic_move_reload_run_bk_ms; + } + if (VerifySequence(monster, &generic_move_reload_run_fwd_ms, reject_actionflags)) + { + return &generic_move_reload_run_fwd_ms; + } + } + //want to walk and reload + if (to_dest_dist > 1) + { + if (DotProduct(right, to_dest_dir) > 0.5 && VerifySequence(monster, &generic_move_reload_walk_rt_ms, reject_actionflags)) + { + return &generic_move_reload_walk_rt_ms; + } + if (DotProduct(right, to_dest_dir) < -0.5 && VerifySequence(monster, &generic_move_reload_walk_lt_ms, reject_actionflags)) + { + return &generic_move_reload_walk_lt_ms; + } + if (DotProduct(forward, to_dest_dir)<-0.5 && VerifySequence(monster, &generic_move_reload_walk_bk_ms, reject_actionflags)) + { + return &generic_move_reload_walk_bk_ms; + } + if (VerifySequence(monster, &generic_move_reload_walk_fwd_ms, reject_actionflags)) + { + return &generic_move_reload_walk_fwd_ms; + } + } + if (VerifySequence(monster, &generic_move_reload_ms, reject_actionflags)) + { + return &generic_move_reload_ms; + } + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL) + { + if (goal_bbox==BBOX_PRESET_CROUCH) + { + //want to move and reload + if (to_dest_dist > 1) + { + if (DotProduct(forward, to_dest_dir)<-0.5 && VerifySequence(monster, &generic_move_reload_crun_bk_p, reject_actionflags)) + { + return &generic_move_reload_crun_bk_p; + } + if (VerifySequence(monster, &generic_move_reload_crun_fwd_p, reject_actionflags)) + { + return &generic_move_reload_crun_fwd_p; + } + } + if (VerifySequence(monster, &generic_move_reload_c_p, reject_actionflags)) + { + return &generic_move_reload_c_p; + } + } + //want to run and reload + if (to_dest_dist > 200) + { + if (DotProduct(right, to_dest_dir) > 0.5 && VerifySequence(monster, &generic_move_reload_run_rt_p, reject_actionflags)) + { + return &generic_move_reload_run_rt_p; + } + if (DotProduct(right, to_dest_dir) < -0.5 && VerifySequence(monster, &generic_move_reload_run_lt_p, reject_actionflags)) + { + return &generic_move_reload_run_lt_p; + } + if (DotProduct(forward, to_dest_dir)<-0.5 && VerifySequence(monster, &generic_move_reload_run_bk_p, reject_actionflags)) + { + return &generic_move_reload_run_bk_p; + } + if (VerifySequence(monster, &generic_move_reload_run_fwd_p, reject_actionflags)) + { + return &generic_move_reload_run_fwd_p; + } + } + //want to walk and reload + if (to_dest_dist > 1) + { + if (DotProduct(right, to_dest_dir) > 0.5 && VerifySequence(monster, &generic_move_reload_walk_rt_p, reject_actionflags)) + { + return &generic_move_reload_walk_rt_p; + } + if (DotProduct(right, to_dest_dir) < -0.5 && VerifySequence(monster, &generic_move_reload_walk_lt_p, reject_actionflags)) + { + return &generic_move_reload_walk_lt_p; + } + if (DotProduct(forward, to_dest_dir)<-0.5 && VerifySequence(monster, &generic_move_reload_walk_bk_p, reject_actionflags)) + { + return &generic_move_reload_walk_bk_p; + } + if (VerifySequence(monster, &generic_move_reload_walk_fwd_p, reject_actionflags)) + { + return &generic_move_reload_walk_fwd_p; + } + } + if (VerifySequence(monster, &generic_move_reload_p, reject_actionflags)) + { + return &generic_move_reload_p; + } + if (VerifySequence(monster, &generic_move_reload_p1, reject_actionflags)) + { + return &generic_move_reload_p1; + } + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE) + { + if (goal_bbox==BBOX_PRESET_CROUCH) + { + //want to move and reload + if (to_dest_dist > 1) + { + if (DotProduct(forward, to_dest_dir)<-0.5 && VerifySequence(monster, &generic_move_reload_crun_bk_r, reject_actionflags)) + { + return &generic_move_reload_crun_bk_r; + } + if (VerifySequence(monster, &generic_move_reload_crun_fwd_r, reject_actionflags)) + { + return &generic_move_reload_crun_fwd_r; + } + } + if (VerifySequence(monster, &generic_move_reload_c_r, reject_actionflags)) + { + return &generic_move_reload_c_r; + } + } + //want to run and reload + if (to_dest_dist > 200) + { + if (DotProduct(right, to_dest_dir) > 0.5 && VerifySequence(monster, &generic_move_reload_run_rt_r, reject_actionflags)) + { + return &generic_move_reload_run_rt_r; + } + if (DotProduct(right, to_dest_dir) < -0.5 && VerifySequence(monster, &generic_move_reload_run_lt_r, reject_actionflags)) + { + return &generic_move_reload_run_lt_r; + } + if (DotProduct(forward, to_dest_dir)<-0.5 && VerifySequence(monster, &generic_move_reload_run_bk_r, reject_actionflags)) + { + return &generic_move_reload_run_bk_r; + } + if (VerifySequence(monster, &generic_move_reload_run_fwd_r, reject_actionflags)) + { + return &generic_move_reload_run_fwd_r; + } + } + //want to walk and reload + if (to_dest_dist > 1) + { + if (DotProduct(right, to_dest_dir) > 0.5 && VerifySequence(monster, &generic_move_reload_walk_rt_r, reject_actionflags)) + { + return &generic_move_reload_walk_rt_r; + } + if (DotProduct(right, to_dest_dir) < -0.5 && VerifySequence(monster, &generic_move_reload_walk_lt_r, reject_actionflags)) + { + return &generic_move_reload_walk_lt_r; + } + if (DotProduct(forward, to_dest_dir)<-0.5 && VerifySequence(monster, &generic_move_reload_walk_bk_r, reject_actionflags)) + { + return &generic_move_reload_walk_bk_r; + } + if (VerifySequence(monster, &generic_move_reload_walk_fwd_r, reject_actionflags)) + { + return &generic_move_reload_walk_fwd_r; + } + } + if (VerifySequence(monster, &generic_move_reload_r, reject_actionflags)) + { + return &generic_move_reload_r; + } + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER) + { + if (goal_bbox==BBOX_PRESET_CROUCH) + { + //want to move and reload + if (to_dest_dist > 1) + { + if (DotProduct(forward, to_dest_dir)<-0.5 && VerifySequence(monster, &generic_move_reload_crun_bk_l, reject_actionflags)) + { + return &generic_move_reload_crun_bk_l; + } + if (VerifySequence(monster, &generic_move_reload_crun_fwd_l, reject_actionflags)) + { + return &generic_move_reload_crun_fwd_l; + } + } + if (VerifySequence(monster, &generic_move_reload_c_l, reject_actionflags)) + { + return &generic_move_reload_c_l; + } + } + //want to run and reload + if (to_dest_dist > 200) + { + if (DotProduct(right, to_dest_dir) > 0.5 && VerifySequence(monster, &generic_move_reload_run_rt_l, reject_actionflags)) + { + return &generic_move_reload_run_rt_l; + } + if (DotProduct(right, to_dest_dir) < -0.5 && VerifySequence(monster, &generic_move_reload_run_lt_l, reject_actionflags)) + { + return &generic_move_reload_run_lt_l; + } + if (DotProduct(forward, to_dest_dir)<-0.5 && VerifySequence(monster, &generic_move_reload_run_bk_l, reject_actionflags)) + { + return &generic_move_reload_run_bk_l; + } + if (VerifySequence(monster, &generic_move_reload_run_fwd_l, reject_actionflags)) + { + return &generic_move_reload_run_fwd_l; + } + } + //want to walk and reload + if (to_dest_dist > 1) + { + if (DotProduct(right, to_dest_dir) > 0.5 && VerifySequence(monster, &generic_move_reload_walk_rt_l, reject_actionflags)) + { + return &generic_move_reload_walk_rt_l; + } + if (DotProduct(right, to_dest_dir) < -0.5 && VerifySequence(monster, &generic_move_reload_walk_lt_l, reject_actionflags)) + { + return &generic_move_reload_walk_lt_l; + } + if (DotProduct(forward, to_dest_dir)<-0.5 && VerifySequence(monster, &generic_move_reload_walk_bk_l, reject_actionflags)) + { + return &generic_move_reload_walk_bk_l; + } + if (VerifySequence(monster, &generic_move_reload_walk_fwd_l, reject_actionflags)) + { + return &generic_move_reload_walk_fwd_l; + } + } + if (VerifySequence(monster, &generic_move_reload_l, reject_actionflags)) + { + return &generic_move_reload_l; + } + } + return NULL; +} + +mmove_t *bodyhuman_c::GetSequenceForAttack(edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + vec3_t to_dest; + float to_dest_dist;//heh. well, i was already normalizing the dest dir, so i'll reuse the result + mmove_t *auxmove; + gunvariety_t rightHandWeapVariety=GetGunVariety(GetRightHandWeapon(monster)); + + qboolean rhandReady; + + if (ideal_move && VerifySequence(monster, ideal_move, reject_actionflags)) + { + return ideal_move; + } + + //if i'm disabled, i'm disabled. what can you do about something like that? + if (auxmove=GetSequenceForDisability(monster)) + { + return auxmove; + } + + //if i'm not facing near my target, don't shoot + vec3_t to_targ,my_facing; + VectorSubtract(face, monster.s.origin, to_targ); + VectorNormalize(to_targ); + + if (the_ai) + { + //the_ai->GetAimVector(my_facing); + AngleVectors(monster.s.angles, my_facing, NULL, NULL); + } + else if (monster.client) + { + AngleVectors(monster.client->ps.viewangles, my_facing, NULL, NULL); + } + else + { + AngleVectors(monster.s.angles, my_facing, NULL, NULL); + } + + if (bodyDamage & (BODYDAMAGE_ANY)) + { + //if i need to turn, don't bother aiming--limp around + if (DotProduct(to_targ, my_facing)<0.85) + { + if (bodyDamageAccumulated & (BODYDAMAGE_RIGHTLEG)) + { + if (VerifySequence(monster, &generic_move_limp_lleg, reject_actionflags)) + { + return &generic_move_limp_lleg; + } + } + if (bodyDamageAccumulated & (BODYDAMAGE_LEFTLEG)) + { + if (VerifySequence(monster, &generic_move_limp_rleg, reject_actionflags)) + { + return &generic_move_limp_rleg; + } + } + } + if (GetBestWeapon(monster)==ATK_NOTHING) + { + if (auxmove=GetSequenceForTransition(monster, dest, face, seqtype, BBOX_PRESET_CROUCH, reject_actionflags)) + { + return auxmove; + } + if (currentmove && (currentmove==&generic_move_crouch_cower_mid2 || &generic_move_crouch_cower_mid) && + !IsAnimationFinished()) + { + return currentmove; + } + if((gi.irand(0,2)||!VerifySequence(monster, &generic_move_crouch_cower_mid2, reject_actionflags))&& + VerifySequence(monster, &generic_move_crouch_cower_mid, reject_actionflags)) + { + return &generic_move_crouch_cower_mid; + } + if(VerifySequence(monster, &generic_move_crouch_cower_mid2, reject_actionflags)) + { + return &generic_move_crouch_cower_mid2; + } + } + // This is being removed because it looks awful and also not smart when behind the man +/* if (GetRightHandWeapon(monster)!=ATK_NOTHING&&IsAvailableSequence(monster, &generic_move_hurt_atk)) + { + return &generic_move_hurt_atk; + }*/ + } + + if (auxmove=GetSequenceForTransition(monster, dest, face, seqtype, goal_bbox, reject_actionflags)) + { + return auxmove; + } + + //set whether my right hand gun is ready + rhandReady = RightHandWeaponReady(monster); + if (DotProduct(to_targ, my_facing)bbox==BBOX_PRESET_PRONE ||currentmove->bbox==BBOX_PRESET_ALLFOURS)) + { + if(VerifySequence(monster, &generic_move_prfire_mrs, reject_actionflags)) + { + return &generic_move_prfire_mrs; + } + } + + if(currentmove&¤tmove->bbox == BBOX_PRESET_LAYSIDE) + { + return currentmove; + } + + if(currentmove&¤tmove->bbox == BBOX_PRESET_LAYBACK) + { + if (auxmove=GetSequenceForTransition(monster, dest, face, seqtype, BBOX_PRESET_STAND, reject_actionflags)) + { + return auxmove; + } + + if (VerifySequence(monster, &generic_move_layback_die_shoot, reject_actionflags)) + { + return &generic_move_layback_die_shoot; + } + //er, try scooching? + if (VerifySequence(monster, &generic_move_layback_scooch, reject_actionflags)) + { + if (currentmove != &generic_move_layback_scooch) + { + VoiceGeneralSound("Writhe",monster,WRITHENUMBER); + } + return &generic_move_layback_scooch; + } + + //forget it--count me dead + if (VerifySequence(monster, &generic_move_death_lbshotdeath, reject_actionflags)) + { + return &generic_move_death_lbshotdeath; + } + + return currentmove;//ah! yikes! + } + + if(goal_bbox == BBOX_PRESET_STAND) + { + if (currentmove&¤tmove->bbox==BBOX_PRESET_CROUCH) + { + //yikes! i'm trapped down here! + if(rhandReady) + { + if(rightHandWeapVariety&GUNVARIETY_MACHINE&&VerifySequence(monster, &generic_move_cfire_m, reject_actionflags)) + { + return &generic_move_cfire_m; + } + if(rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_cfire_r, reject_actionflags)) + { + return &generic_move_cfire_r; + } + if(rightHandWeapVariety&GUNVARIETY_SHOTGUN&&VerifySequence(monster, &generic_move_cfire_s, reject_actionflags)) + { + return &generic_move_cfire_s; + } + if (rightHandWeapVariety&GUNVARIETY_PNONAUTO&&VerifySequence(monster, &generic_move_duck_shoot, reject_actionflags)) + { + return &generic_move_duck_shoot; + } + if (rightHandWeapVariety&GUNVARIETY_PAUTO&&VerifySequence(monster, &generic_move_caim_p_auto, reject_actionflags)) + { + return &generic_move_caim_p_auto; + } + if((rightHandWeapVariety&GUNVARIETY_LAUNCHER) && VerifySequence(monster, &generic_move_crouch_launcher_fire, reject_actionflags)) + { + return &generic_move_crouch_launcher_fire; + } + } + + if(rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_caim_r, reject_actionflags)) + { + return &generic_move_caim_r; + } + if(rightHandWeapVariety&GUNVARIETY_MS&&VerifySequence(monster, &generic_move_caim_ms, reject_actionflags)) + { + return &generic_move_caim_ms; + } + if((rightHandWeapVariety&GUNVARIETY_LAUNCHER) && VerifySequence(monster, &generic_move_caim_l, reject_actionflags)) + { + return &generic_move_caim_l; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_chaim2, reject_actionflags)) + { + return &generic_move_chaim2; + } + } + + VectorSubtract(dest, monster.s.origin, to_dest); + + float aimCone; + float tempAng; + if (the_ai) + { + tempAng = anglemod(the_ai->ideal_angles[YAW]-monster.s.angles[YAW]); + if (currentmove) + { + aimCone = the_ai->GetAimConeDegrees(monster, currentmove->bbox); + } + else + { + aimCone = the_ai->GetAimConeDegrees(monster, BBOX_PRESET_STAND); + } + } + else + { + tempAng = 0;//uh?? + aimCone = 10;//eh? + } + + //i'm outside the aim cone...use ideal_angles for aiming + if (tempAng > aimCone && tempAng < 360.0-aimCone) + { + if (rightHandWeapVariety&GUNVARIETY_MS&&VerifySequence(monster, &generic_move_ashuffle_ms, reject_actionflags)) + { + return &generic_move_ashuffle_ms; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_ashuffle_r, reject_actionflags)) + { + return &generic_move_ashuffle_r; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_ashuffle_p2, reject_actionflags)) + { + return &generic_move_ashuffle_p2; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_ashuffle_pcb, reject_actionflags)) + { + return &generic_move_ashuffle_pcb; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_ashuffle_l, reject_actionflags)) + { + return &generic_move_ashuffle_l; + } + } + + //wanna run.. + //fixme: if i'm already running, be more lenient here + if ((to_dest_dist>20)&&(GetArmorCode()!=ARMOR_FULL)) + { + if (auxmove = GetSequenceForRunAimStrafe(monster, to_dest_dir, forward, right, dest, face, seqtype, goal_bbox, ideal_move, reject_actionflags)) + { + return auxmove; + } + if (auxmove = GetSequenceForWalkAimStrafe(monster, to_dest_dir, forward, right, dest, face, seqtype, goal_bbox, ideal_move, reject_actionflags)) + { + return auxmove; + } + //run forward... + if (DotProduct(to_dest_dir, forward)>0) + { +// if (rightHandWeapVariety&GUNVARIETY_PISTOL && VerifySequence(monster, &generic_move_raim_p1, reject_actionflags)) +// { +// return &generic_move_raim_p1; +// } + + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_raim_p2, reject_actionflags)) + { + return &generic_move_raim_p2; + } +/* if (rightHandWeapVariety&GUNVARIETY_PK&&VerifySequence(monster, &generic_move_raim_p1, reject_actionflags)) + { + return &generic_move_raim_p1; + } +*/ if (rightHandWeapVariety&GUNVARIETY_KNIFE&&VerifySequence(monster, &generic_move_playerstrunswipe, reject_actionflags)) + { + return &generic_move_playerstrunswipe; + } + if (rightHandWeapVariety&GUNVARIETY_MRS&&VerifySequence(monster, &generic_move_raim_mrs, reject_actionflags)) + { + return &generic_move_raim_mrs; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_raim_l, reject_actionflags)) + { + return &generic_move_raim_l; + } + } + //run back... + else + { + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_rbackaim_p2, reject_actionflags)) + { + if (currentmove && currentmove->suggested_action != ACTCODE_PAIN) + { +// VoiceSound("backup", monster, 0); + } + return &generic_move_rbackaim_p2; + } + if (rightHandWeapVariety&GUNVARIETY_MRS&&VerifySequence(monster, &generic_move_rbackaim_mrs, reject_actionflags)) + { + if (currentmove && currentmove->suggested_action != ACTCODE_PAIN) + { +// VoiceSound("backup", monster, 0); + } + return &generic_move_rbackaim_mrs; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_rbackaim_l, reject_actionflags)) + { + if (currentmove && currentmove->suggested_action != ACTCODE_PAIN) + { +// VoiceSound("backup", monster, 0); + } + return &generic_move_rbackaim_l; + } + } + } + + // er, is this a good spot to check for grenadeness + if(UseLeftHandAttack(monster, target)) + { + if(VerifySequence(monster, &generic_move_throw_gren, reject_actionflags)) + { + if (currentmove && currentmove->suggested_action != ACTCODE_PAIN) + { +// VoiceSound("throw", monster, 0); + } + return &generic_move_throw_gren; + } + if(VerifySequence(monster, &generic_move_throwstar, reject_actionflags)) + { + if (currentmove && currentmove->suggested_action != ACTCODE_PAIN) + { +// VoiceSound("throw", monster, 0); + } + return &generic_move_throwstar; + } + } + + + //wanna walk.. + //fixme: if i'm already walking, be more lenient here + if (to_dest_dist>10||(currentmove && currentmove->bodyPosition==BODYPOS_AIMWALK && to_dest_dist>5)) + { + //wanna strafewalk... + if (auxmove = GetSequenceForWalkAimStrafe(monster, to_dest_dir, forward, right, dest, face, seqtype, goal_bbox, ideal_move, reject_actionflags)) + { + return auxmove; + } + + //walk forward... + if (DotProduct(to_dest_dir, forward)>0) + { + if (rightHandWeapVariety&GUNVARIETY_PK&&VerifySequence(monster, &generic_move_waim_p, reject_actionflags)) + { + return &generic_move_waim_p; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_waim_r, reject_actionflags)) + { + return &generic_move_waim_r; + } + if (rightHandWeapVariety&GUNVARIETY_MS&&VerifySequence(monster, &generic_move_waim_ms, reject_actionflags)) + { + return &generic_move_waim_ms; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_waim_l, reject_actionflags)) + { + return &generic_move_waim_l; + } + } + //walk back... + else + { + if (rightHandWeapVariety&GUNVARIETY_PK&&VerifySequence(monster, &generic_move_wbackaim_p, reject_actionflags)) + { + if (currentmove && currentmove->suggested_action != ACTCODE_PAIN) + { +// VoiceSound("backup", monster, 0); + } + return &generic_move_wbackaim_p; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_wbackaim_r, reject_actionflags)) + { + if (currentmove && currentmove->suggested_action != ACTCODE_PAIN) + { +// VoiceSound("backup", monster, 0); + } + return &generic_move_wbackaim_r; + } + if (rightHandWeapVariety&GUNVARIETY_MS&&VerifySequence(monster, &generic_move_wbackaim_ms, reject_actionflags)) + { + if (currentmove && currentmove->suggested_action != ACTCODE_PAIN) + { +// VoiceSound("backup", monster, 0); + } + return &generic_move_wbackaim_ms; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_wbackaim_l, reject_actionflags)) + { + if (currentmove && currentmove->suggested_action != ACTCODE_PAIN) + { +// VoiceSound("backup", monster, 0); + } + return &generic_move_wbackaim_l; + } + } + } + + //if i've got a knife, make sure i slash... + if (rightHandWeapVariety&GUNVARIETY_KNIFE&&rhandReady && VerifySequence(monster, &generic_move_slash_kp, reject_actionflags)) + { + return &generic_move_slash_kp; + } + + //aiming up--use as aim and attack + if (to_targ[2]>0.25) + { + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staimup_p, reject_actionflags)) + { + return &generic_move_staimup_p; + } + if (rightHandWeapVariety&GUNVARIETY_MRS&&VerifySequence(monster, &generic_move_staimup_mrs, reject_actionflags)) + { + return &generic_move_staimup_mrs; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_staimup_l, reject_actionflags)) + { + return &generic_move_staimup_l; + } + } + //aiming down + if (to_targ[2]<-0.25) + { + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staimdn_p, reject_actionflags)) + { + return &generic_move_staimdn_p; + } + if (rightHandWeapVariety&GUNVARIETY_MRS&&VerifySequence(monster, &generic_move_staimdn_mrs, reject_actionflags)) + { + return &generic_move_staimdn_mrs; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_staimdn_l, reject_actionflags)) + { + return &generic_move_staimdn_l; + } + } + + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&rhandReady && (!gi.irand(0,5)) && VerifySequence(monster, &generic_move_attack_attitude, reject_actionflags)) + { + return &generic_move_attack_attitude; + } + if (rightHandWeapVariety&GUNVARIETY_PNONAUTO&&rhandReady && VerifySequence(monster, &generic_move_attack, reject_actionflags)) + { + return &generic_move_attack; + } + if (rightHandWeapVariety&GUNVARIETY_PNONAUTO&&rhandReady && VerifySequence(monster, &generic_move_attackb, reject_actionflags)) + { + return &generic_move_attackb; + } + if (rightHandWeapVariety&GUNVARIETY_KNIFE&&rhandReady && VerifySequence(monster, &generic_move_slash_kp, reject_actionflags)) + { + return &generic_move_slash_kp; + } + if (rightHandWeapVariety&GUNVARIETY_PNONAUTO&&rhandReady && VerifySequence(monster, &generic_move_firecb, reject_actionflags)) + { + return &generic_move_firecb; + } + if (rightHandWeapVariety&GUNVARIETY_PAUTO&&VerifySequence(monster, &generic_move_caim_p_auto, reject_actionflags)) + { + return &generic_move_staim_p_auto; + } + if (rightHandWeapVariety&GUNVARIETY_MACHINE&&rhandReady && (GetRightHandWeapon(monster)==ATK_FLAMEGUN || (!gi.irand(0,2)||(gi.irand(0,5) + &¤tmove==&generic_move_atksweep_mgun))) && VerifySequence(monster, &generic_move_atksweep_mgun, reject_actionflags)) + { //flamethrower guys need to always use this one + return &generic_move_atksweep_mgun; + } + if (rightHandWeapVariety&GUNVARIETY_MACHINE&&rhandReady && VerifySequence(monster, &generic_move_attack_mgun, reject_actionflags)) + { + return &generic_move_attack_mgun; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE&&rhandReady && VerifySequence(monster, &generic_move_attack_rif, reject_actionflags)) + { + return &generic_move_attack_rif; + } + if (rightHandWeapVariety&GUNVARIETY_SHOTGUN&&rhandReady && VerifySequence(monster, &generic_move_attack_sgun, reject_actionflags)) + { + return &generic_move_attack_sgun; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&rhandReady && VerifySequence(monster, &generic_move_attack_l, reject_actionflags)) + { + return &generic_move_attack_l; + } + } + if (currentmove&¤tmove->bbox==BBOX_PRESET_CROUCH) + { + // ?? + if(UseLeftHandAttack(monster, target)) + { + if(VerifySequence(monster, &generic_move_lob_grenade_crouch, reject_actionflags)) + { + return &generic_move_lob_grenade_crouch; + } + } + + if (to_dest_dist>10||(currentmove && currentmove->bodyPosition==BODYPOS_AIMWALK && to_dest_dist>5)) + { + //going forward + if (DotProduct(to_dest_dir, forward)>0) + { + if (rightHandWeapVariety&GUNVARIETY_KNIFE&&VerifySequence(monster, &generic_move_playercrunswipe, reject_actionflags)) + { + return &generic_move_playercrunswipe; + } + } + //going backward + else + { + if (rightHandWeapVariety&GUNVARIETY_KNIFE&&VerifySequence(monster, &generic_move_playercrunswipe, reject_actionflags)) + { + return &generic_move_playercrunswipe; + } + } + } + + if(rhandReady) + { + if(rightHandWeapVariety&GUNVARIETY_MACHINE&&VerifySequence(monster, &generic_move_cfire_m, reject_actionflags)) + { + return &generic_move_cfire_m; + } + if(rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_cfire_r, reject_actionflags)) + { + return &generic_move_cfire_r; + } + if(rightHandWeapVariety&GUNVARIETY_SHOTGUN&&VerifySequence(monster, &generic_move_cfire_s, reject_actionflags)) + { + return &generic_move_cfire_s; + } + if (rightHandWeapVariety&GUNVARIETY_PNONAUTO&&VerifySequence(monster, &generic_move_duck_shoot, reject_actionflags)) + { + return &generic_move_duck_shoot; + } + if (rightHandWeapVariety&GUNVARIETY_PAUTO&&VerifySequence(monster, &generic_move_caim_p_auto, reject_actionflags)) + { + return &generic_move_caim_p_auto; + } + if((rightHandWeapVariety&GUNVARIETY_LAUNCHER) && VerifySequence(monster, &generic_move_crouch_launcher_fire, reject_actionflags)) + { + return &generic_move_crouch_launcher_fire; + } + } + if(rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_caim_r, reject_actionflags)) + { + return &generic_move_caim_r; + } + if(rightHandWeapVariety&GUNVARIETY_MS&&VerifySequence(monster, &generic_move_caim_ms, reject_actionflags)) + { + return &generic_move_caim_ms; + } + if((rightHandWeapVariety&GUNVARIETY_LAUNCHER) && VerifySequence(monster, &generic_move_caim_l, reject_actionflags)) + { + return &generic_move_caim_l; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL && IsAvailableSequence(monster, &generic_move_duck_shoot) && + VerifySequence(monster, &generic_move_chaim2, reject_actionflags)) + { + return &generic_move_chaim2; + } + } + //fixme: this check is just plain silly; also, the animation is silly (in most sits, anyhow) +// if (!VectorCompare(face, vec3_origin) && DotProduct (forward, to_targ)<0.95) +// { +// if (rightHandWeapVariety&GUNVARIETY_MS&&VerifySequence(monster, &generic_move_ashuffle_ms, reject_actionflags)) +// { +// return &generic_move_ashuffle_ms; +// } +// if (rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_ashuffle_r, reject_actionflags)) +// { +// return &generic_move_ashuffle_r; +// } +// if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_ashuffle_p2, reject_actionflags)) +// { +// return &generic_move_ashuffle_p2; +// } +// if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_ashuffle_pcb, reject_actionflags)) +// { +// return &generic_move_ashuffle_pcb; +// } +// } + + + //aiming up + if (to_targ[2]>0.25) + { + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staimup_p, reject_actionflags)) + { + return &generic_move_staimup_p; + } + if (rightHandWeapVariety&GUNVARIETY_MRS&&VerifySequence(monster, &generic_move_staimup_mrs, reject_actionflags)) + { + return &generic_move_staimup_mrs; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_staimup_l, reject_actionflags)) + { + return &generic_move_staimup_l; + } + } + //aiming down + if (to_targ[2]<-0.25) + { + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staimdn_p, reject_actionflags)) + { + return &generic_move_staimdn_p; + } + if (rightHandWeapVariety&GUNVARIETY_MRS&&VerifySequence(monster, &generic_move_staimdn_mrs, reject_actionflags)) + { + return &generic_move_staimdn_mrs; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_staimdn_l, reject_actionflags)) + { + return &generic_move_staimdn_l; + } + } + + //fixme--check which stance i was in--if firing 2-handed, f'rinstance, aim 2-handed + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staim_p2, reject_actionflags)) + { + return &generic_move_staim_p2; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staim_pcb, reject_actionflags)) + { + return &generic_move_staim_pcb; + } + if (rightHandWeapVariety&GUNVARIETY_MS&&VerifySequence(monster, &generic_move_staim_ms, reject_actionflags)) + { + return &generic_move_staim_ms; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_staim_r, reject_actionflags)) + { + return &generic_move_staim_r; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_staim_l, reject_actionflags)) + { + return &generic_move_staim_l; + } + + //ack! shouldn't get here! + if (rightHandWeapVariety&GUNVARIETY_MRS) + { + if((rand()%15) && VerifySequence(monster, &generic_move_atkpause1_mrs, reject_actionflags)) + { + return &generic_move_atkpause1_mrs; + } + if(VerifySequence(monster, &generic_move_atkpause2_mrs, reject_actionflags)) + { + return &generic_move_atkpause2_mrs; + } + if (rightHandWeapVariety&GUNVARIETY_MS&&VerifySequence(monster, &generic_move_staim_ms, reject_actionflags)) + { + return &generic_move_staim_ms; + } + if (rightHandWeapVariety&GUNVARIETY_RIFLE&&VerifySequence(monster, &generic_move_staim_r, reject_actionflags)) + { + return &generic_move_staim_r; + } + if(VerifySequence(monster, &generic_move_alert_mrs, reject_actionflags)) + { + return &generic_move_alert_mrs; + } + } + else if (rightHandWeapVariety==GUNVARIETY_NONE) + { + if(emotion == EMOTION_AFRAID && VerifySequence(monster, &generic_move_fear_wave, reject_actionflags) && !gi.irand(0,10)) + { + return &generic_move_fear_wave; + } + if(emotion == EMOTION_AFRAID && VerifySequence(monster, &generic_move_cower, reject_actionflags)) + { + return &generic_move_cower; + } + } + + if((rand()%15) && VerifySequence(monster, &generic_move_atkpause1_p, reject_actionflags)) + { + return &generic_move_atkpause1_p; + } + if(VerifySequence(monster, &generic_move_atkpause2_p, reject_actionflags)) + { + return &generic_move_atkpause2_p; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staim_p2, reject_actionflags)) + { + return &generic_move_staim_p2; + } + if (rightHandWeapVariety&GUNVARIETY_PISTOL&&VerifySequence(monster, &generic_move_staim_pcb, reject_actionflags)) + { + return &generic_move_staim_pcb; + } + if (rightHandWeapVariety&GUNVARIETY_LAUNCHER&&VerifySequence(monster, &generic_move_staim_l, reject_actionflags)) + { + return &generic_move_staim_l; + } + if(VerifySequence(monster, &generic_move_alert_p, reject_actionflags)) + { + return &generic_move_alert_p; + } + + if (GetBestWeapon(monster)!=ATK_NOTHING) + { + if(VerifySequence(monster, &generic_move_stand_mrs, reject_actionflags)) + { + return &generic_move_stand_mrs; + } + } + if(VerifySequence(monster, &generic_move_stand, reject_actionflags)) + { + return &generic_move_stand; + } + if(VerifySequence(monster, &generic_move_alert_p, reject_actionflags)) + { + return &generic_move_alert_p; + } + return &generic_move_stand; +} + +mmove_t *bodyhuman_c::GetSequenceForTrainDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *animation = NULL; + + if (currentmove!=&generic_move_tumble_front) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + } + FinalAnim = true; + FinalSound = true; + + if(IsAvailableSequence(monster, &generic_move_tumble_front)) + { + animation = &generic_move_tumble_front; + } + return animation; +} + +mmove_t *bodyhuman_c::GetSequenceForParentalLockDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *animation = NULL; + + // FIXME: until it is decided how to handle the deathanim lock, I'll just fudge some crap in here + if(currentmove && currentmove->suggested_action==ACTCODE_DEATH) + { + // fixme. This currently has an annoying side effect. If you happen to turn on the lock_deaths cvar + // WHILE a guy is in a looping death anim, he'll continue to do it forever. + return currentmove; + } + + if (currentmove && currentmove->bbox==BBOX_PRESET_SIT && VerifySequence(monster, &generic_move_death_lbshotdeath, reject_actionflags)) + { + animation = &generic_move_death_lbshotdeath; + FinalSound = true; + } + else if(VerifySequence(monster, &generic_move_death_fallforward, reject_actionflags)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + animation = &generic_move_death_fallforward; + FinalSound = true; + } + + return animation; +} + + +mmove_t *bodyhuman_c::GetSequenceForDeathFromFront(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, vec3_t to_dam, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *animation = NULL; + + + switch(gi.irand(0,2)) + { + + case 0: + default: + if (IsAvailableSequence(monster, &generic_move_death_chestfront)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + animation = &generic_move_death_chestfront; + FinalSound = true; + } + break; + case 1: + if (IsAvailableSequence(monster, &generic_move_death_violent)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + animation = &generic_move_death_violent; + FinalSound = true; + } + case 2: +// if ((monster.health < -30) && (!gi.irand(0,2)) && VerifySequence(monster, &generic_move_deaththrown, reject_actionflags)) +// *** FIXME *** + if (IsAvailableSequence(monster, &generic_move_deaththrown)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + +// VectorScale(to_dam, -200, to_dam); +// VectorAdd(monster.velocity, to_dam, monster.velocity); +// monster.velocity[2]=50;//people have complained about the height of this at times... +// monster.maxs[2]-=26; +// monster.s.origin[2]+=26; + animation = &generic_move_deaththrown; + FinalSound = true; + FinalAnim = true; + } + + break; + } + + return animation; +} + +mmove_t *bodyhuman_c::GetSequenceForDeathFromBack(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, vec3_t to_dam, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *animation = NULL; + + switch(gi.irand(0,0)) + { + case 0: + default: + if (IsAvailableSequence(monster, &generic_move_death_sinback_tofront)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + animation = &generic_move_death_sinback_tofront; + FinalSound = true; + FinalAnim = true; + } + break; + } + return animation; +} + +mmove_t *bodyhuman_c::GetSequenceForFacingBasedDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + + vec3_t forward, to_shooter; + mmove_t *animation = NULL; + + AngleVectors(monster.s.angles, forward, NULL, NULL); + + if (inflictor) + { + VectorSubtract(inflictor->s.origin, monster.s.origin, to_shooter); + VectorNormalize(to_shooter); + } + else + { + VectorCopy(vec3_up, to_shooter); + } + + if (DotProduct(to_shooter, forward) >= 0) + { // fixme not working! + animation = GetSequenceForDeathFromFront(monster, inflictor, attacker, damage, point, dflags, to_shooter, goal_bbox, ideal_move); + } + else + { + animation = GetSequenceForDeathFromBack(monster, inflictor, attacker, damage, point, dflags, to_shooter, goal_bbox, ideal_move); + } + return animation; +} + +mmove_t *bodyhuman_c::GetSequenceForCatchAllDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *animation = NULL; + + switch (gi.irand(0,0)) + { // random deaths with no particular code support + default: + case 0: + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + if (IsAvailableSequence(monster, &generic_move_death_long)) + { + animation = &generic_move_death_long; + FinalSound = true; + FinalAnim = true; + } + break; + } + return animation; +} + +mmove_t *bodyhuman_c::GetSequenceForGoreZoneDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *animation = NULL; + + if (gzones[spout].blowme->area == GBLOWNAREA_NECK) + { + if (IsAvailableSequence(monster, &generic_move_deadthroat)) + { + GhoulID tempBolt; + + tempBolt=monster.ghoulInst->GetGhoulObject()->FindPart("sbolt_mouth"); + if (tempBolt) + { +// gi.sound (&monster, CHAN_BODY, gi.soundindex ("impact/gore/spout.wav"), .8, ATTN_NORM, 0); + FX_Bleed(&monster, tempBolt, 100); + } + VoiceGeneralSound("Choke", monster, 2); + FinalSound = true; + animation = &generic_move_deadthroat; + + if (!game.cinematicfreeze) + { + level.throatShots++; + } + } + else + { + gi.dprintf("eek. That hurt my neck.\n"); + } + } + else if (gzones[spout].blowme->area == GBLOWNAREA_HEAD) + { + if (IsAvailableSequence(monster, &generic_move_death_fallforward)) + { + animation = &generic_move_death_fallforward; // use for head shot + FinalSound = true; + if (!game.cinematicfreeze) + { + level.headShots++; + } + } + } + else if (gzones[spout].blowme->area == GBLOWNAREA_LFOOT) + { + if (IsAvailableSequence(monster, &generic_move_death_legleft)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + animation = &generic_move_death_legleft; + } + else + { + gi.dprintf("eek. That hurt my left foot.\n"); + } + } + else if (gzones[spout].blowme->area == GBLOWNAREA_RFOOT) + { + if (IsAvailableSequence(monster, &generic_move_death_legright)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + animation = &generic_move_death_legright; + } + else + { + gi.dprintf("eek. That hurt my right foot.\n"); + } + } + else if (gzones[spout].blowme->area == GBLOWNAREA_GROIN)//ick. + { + if (IsAvailableSequence(monster, &generic_move_deadgroin)) + { + VoiceGeneralSound("Crotch", monster, 2); + animation = &generic_move_deadgroin; + if (!game.cinematicfreeze) + { + level.nutShots++; + } + } + else + { + gi.dprintf("eek. That hurt my groin.\n"); + } + } + else if (gzones[spout].blowme->area == GBLOWNAREA_RTHIGH || gzones[spout].blowme->area == GBLOWNAREA_RCALF) + { + if (IsAvailableSequence(monster, &generic_move_death_legright)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + animation = &generic_move_death_legright; + } + else + { + gi.dprintf("Couldn't find right leg death.\n"); + } + } + else if (gzones[spout].blowme->area == GBLOWNAREA_LTHIGH || gzones[spout].blowme->area == GBLOWNAREA_LCALF) + { + if (IsAvailableSequence(monster, &generic_move_death_legleft)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + animation = &generic_move_death_legleft; + } + else + { + gi.dprintf("Couldn't find left leg death.\n"); + } + } +// else if (gzones[spout].childzone == GZ_SHLDR_LEFT_FRONT)//yick. this should really be right front shoulder + else if (gzones[spout].blowme->area == GBLOWNAREA_RFSHLD || gzones[spout].blowme->area == GBLOWNAREA_LBSHLD) + { + if (IsAvailableSequence(monster, &generic_move_death_shldrright)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + animation = &generic_move_death_shldrright; + } + else + { + gi.dprintf("Couldn't find right shoulder death.\n"); + } + } +// else if (gzones[spout].childzone == GZ_SHLDR_RIGHT_BACK)//yick. this should really be left front shoulder + else if (gzones[spout].blowme->area == GBLOWNAREA_RBSHLD || gzones[spout].blowme->area == GBLOWNAREA_LFSHLD) + { + if (IsAvailableSequence(monster, &generic_move_death_shldrleft)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + animation = &generic_move_death_shldrleft; + } + else + { + gi.dprintf("Couldn't find left shoulder death.\n"); + } + } + else if (spout == GZ_GUT_FRONT) + { + if (IsAvailableSequence(monster, &generic_move_death_gut_toside)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + animation = &generic_move_death_gut_toside; + } + else + { + gi.dprintf("Couldn't find gut death.\n"); + } + } + return animation; +} + +mmove_t *bodyhuman_c::GetSequenceForRunningDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *animation = NULL; + float rnum = gi.flrand(0,1); + + if (rnum < .5) + { + if (IsAvailableSequence(monster, &generic_move_death_tumble_toback)) + { + animation = &generic_move_death_tumble_toback; + } + } + else + { + if (IsAvailableSequence(monster, &generic_move_death_stumble_2frnt)) + { + animation = &generic_move_death_stumble_2frnt; + } + } + return animation; +} + +mmove_t *bodyhuman_c::GetSequenceForJuggleDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *animation = NULL; + + if (IsAvailableSequence(monster, &generic_move_death_dance)) + { + animation = &generic_move_death_dance; + } + + return animation; +} + +mmove_t *bodyhuman_c::GetSequenceForBurningDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *animation = NULL; + + static float deathtime=0; + + // Hey! One problem we have is that if there are several burning deaths at once, you get the "disco fever dance club", + // where everyone flails in perfect time. This is not super-pretty, but a fair way of making sure we don't + // always use a single sequence for everyone's death. + // Note that the second check stems from the fact that we don't reset the counter on level load (bad also, I know). + if (level.time - deathtime <= 0.1 && level.time - deathtime >= -0.5) + { + animation = GetSequenceForFacingBasedDeath(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move); + } + else + { // Die as normal. + deathtime = level.time; + + if(IsAvailableSequence(monster, &generic_move_death_onfire)) + { + animation = &generic_move_death_onfire; + VoiceGeneralSound("Burn", monster, 1); + FinalSound = true; + } + } + return animation; +} + +mmove_t *bodyhuman_c::GetSequenceForPulseGunDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *animation = NULL; + + if((dflags & DT_SHOCK)&&(IsAvailableSequence(monster, &generic_move_death_pulse_gun))) + { + animation = &generic_move_death_pulse_gun; + VoiceGeneralSound("Choke", monster, 2); + FinalSound = true; + fxRunner.exec("environ/shockdeath", &monster, 0); + } + else if(IsAvailableSequence(monster, &generic_move_microwave_death)) + { + animation = &generic_move_microwave_death; + VoiceGeneralSound("Choke", monster, 2); + FinalSound = true; + fxRunner.exec("environ/pulsecook", &monster, 0); + gi.sound(&monster, CHAN_BODY, gi.soundindex("Weapons/MPG/Expand.wav"), .6, ATTN_NORM, 0); + } + + if (monster.ghoulInst) + { // Set the death a random amount slower. + // This is to avoid a complete recompile of all the wads, which would be bad at this late juncture. + // This also is to avoid the disco-inferno sychronized deaths. + switch(gi.irand(0, 4)) + { + case 1: + monster.ghoulInst->SetSpeed(gs12Over8); + break; + case 2: + monster.ghoulInst->SetSpeed(gs13Over8); + break; + case 3: + monster.ghoulInst->SetSpeed(gs14Over8); + break; + case 4: + monster.ghoulInst->SetSpeed(gs15Over8); + break; + default: + monster.ghoulInst->SetSpeed(gs16Over8); + break; + } + } + + return animation; +} + +mmove_t *bodyhuman_c::GetSequenceForProneDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *animation = NULL; + + if (IsAvailableSequence(monster, &generic_move_death_lfshotdeath)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + FinalSound = true; +// monster.s.angles[YAW]+=180.0;//urg. i'd normally fold over into this anim, so do that quick... + animation = &generic_move_death_lfshotdeath; + } + return animation; +} + +mmove_t *bodyhuman_c::GetSequenceForCrouchDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *animation = NULL; + + if (currentmove == &generic_move_crouch_onknees && IsAvailableSequence(monster, &generic_move_death_cch_sonknees)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + animation = &generic_move_death_cch_sonknees; + } + if (IsAvailableSequence(monster, &generic_move_death_crouchshot)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + animation = &generic_move_death_crouchshot; + } + return animation; +} + +mmove_t *bodyhuman_c::GetSequenceForPostMortem(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + + mmove_t *animation = NULL; + float flailLimit = 3 + gi.flrand(0,3); + float lastHit = level.time-LastKilledTime; + + //if we're dancing, check to see if we should keep dancing + if (currentmove==&generic_move_death_dance) + { + if (lastHit > 0.3) + { + if (IsAvailableSequence(monster, &generic_move_death_fallforward)) + { + FinalAnim = true; + FinalSound = true; + animation = &generic_move_death_fallforward; + } + } + else // keep dancing + { + if (emotion == EMOTION_DEAD) + { + if(!(rand()%8))VoiceGeneralSound("Hit", monster, 3); + } + else + { + if(!(rand()%8))VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + } + } + } + //if we're twitching on our backs, see if we should continue + else if ((currentmove==&generic_move_death_lbshotloop) && (lastHit > 0.3)) + { + if (IsAvailableSequence(monster, &generic_move_death_lbshotdeath)) + { + FinalAnim = true; + FinalSound = true; + animation = &generic_move_death_lbshotdeath; + } + } + //if we're in a prone anim, or at the end of one that ends up prone, and we're shot, call the corpse juggle thingy + else if (((currentmove->actionFlags & ACTFLAG_ALWAYSPRONE)||(currentMoveFinished)) && (lastHit <= .1) && ((currentmove && currentmove->bbox == BBOX_PRESET_LAYBACK)||(currentmove && currentmove->bbox == BBOX_PRESET_LAYSIDE))) // corpse was just hit + { + //sucky rotation check + if (currentmove->bbox == BBOX_PRESET_LAYSIDE) + { + monster.s.angles[YAW] += 180; + } + + if ((dflags & DT_JUGGLE) && IsAvailableSequence(monster, &generic_move_death_lbshotloop)) + { + + FinalAnim = true; + FinalSound = true; + animation = &generic_move_death_lbshotloop; + } + else if (IsAvailableSequence(monster, &generic_move_death_lbshotdeath) && currentmove!=&generic_move_death_lbshotloop) + { + FinalAnim = true; + FinalSound = true; + ForceNextAnim = true; + animation = &generic_move_death_lbshotdeath; + } + } + else if ((currentmove==&generic_move_death_lfshotloop) && (lastHit > 0.3)) + { + if (IsAvailableSequence(monster, &generic_move_death_lfshotdeath)) + { + FinalAnim = true; + FinalSound = true; + animation = &generic_move_death_lfshotdeath; + } + } + else if (((currentmove->actionFlags & ACTFLAG_ALWAYSPRONE)||(currentMoveFinished)) && (lastHit <= .1) && (currentmove && currentmove->bbox == BBOX_PRESET_LAYFRONT)) // corpse was just hit + { + // lame hacky rotation -- the following lines seem to depend on animator's whims. This should be fixed after E3 with rotation motion tracks +// if (((currentmove == &generic_move_death_shldrright)||(currentmove == &generic_move_death_shldrleft)) && IsAvailableSequence(monster, &generic_move_death_lfshotloop)) +// if ((currentmove == &generic_move_death_fallforward) && IsAvailableSequence(monster, &generic_move_death_lfshotloop)) +// { +// monster.s.angles[YAW] += 180; +// } + if ((dflags & DT_JUGGLE) && IsAvailableSequence(monster, &generic_move_death_lfshotloop)) + { + FinalAnim = true; + FinalSound = true; + animation = &generic_move_death_lfshotloop; + } + else if (IsAvailableSequence(monster, &generic_move_death_lfshotdeath) && currentmove!=&generic_move_death_lfshotloop) + { + FinalAnim = true; + ForceNextAnim = true; + FinalSound = true; + animation = &generic_move_death_lfshotdeath; + } + } + + else if ((currentmove==&generic_move_death_backflail && currentMoveFinished) && (flailLimit < lastHit)) + { + if (IsAvailableSequence(monster, &generic_move_death_backflaildie)) + { + FinalAnim = true; + FinalSound = true; + animation = &generic_move_death_backflaildie; + } + } + else if ((currentmove==&generic_move_death_backrtleg && currentMoveFinished) && (flailLimit < lastHit)) + { + if (IsAvailableSequence(monster, &generic_move_death_backrtlegdie)) + { + FinalSound = true; + FinalAnim = true; + animation = &generic_move_death_backrtlegdie; + } + } + else if ((currentmove==&generic_move_death_backltleg && currentMoveFinished) && (flailLimit < lastHit)) + { + if (IsAvailableSequence(monster, &generic_move_death_backltlegdie)) + { + FinalSound = true; + FinalAnim = true; + animation = &generic_move_death_backltlegdie; + } + } + else if ((currentmove->bbox==BBOX_PRESET_LAYBACK && currentMoveFinished) && !FinalAnim) + { + if (currentmove == &generic_move_death_legright) + { + if (IsAvailableSequence(monster, &generic_move_death_tobackrtleg) && (!gi.irand(0,2)) + && gzones[GZ_HEAD_FRONT].parent_id && monster.ghoulInst->GetPartOnOff(gzones[GZ_HEAD_FRONT].parent_id)) + { + VoiceGeneralSound("Writhe", monster, WRITHENUMBER); + FinalSound = true; + animation = &generic_move_death_tobackrtleg; + } + else + { + FinalSound = true; + FinalAnim = true; + } + + } + else if (currentmove == &generic_move_death_tobackrtleg) + { + if (IsAvailableSequence(monster, &generic_move_death_backrtleg)) + { + FinalSound = true; + animation = &generic_move_death_backrtleg; + } + } + else if (currentmove == &generic_move_death_legleft) + { + if (IsAvailableSequence(monster, &generic_move_death_tobackltleg) && (!gi.irand(0,2)) + && gzones[GZ_HEAD_FRONT].parent_id && monster.ghoulInst->GetPartOnOff(gzones[GZ_HEAD_FRONT].parent_id)) + { + VoiceGeneralSound("Writhe", monster, WRITHENUMBER); + FinalSound = true; + animation = &generic_move_death_tobackltleg; + } + else + { + FinalSound = true; + FinalAnim = true; + } + } + else if (currentmove == &generic_move_death_tobackltleg) + { + if (IsAvailableSequence(monster, &generic_move_death_backltleg)) + { + animation = &generic_move_death_backltleg; + } + } + else if (currentmove == &generic_move_death_tobackflail) + { + if (IsAvailableSequence(monster, &generic_move_death_backflail)) + { + animation = &generic_move_death_backflail; + } + } + else if (!(currentmove->actionFlags & ACTFLAG_LOOPANIM)) + { + if (IsAvailableSequence(monster, &generic_move_death_tobackflail) && (!gi.irand(0,2)) + && gzones[GZ_HEAD_FRONT].parent_id && monster.ghoulInst->GetPartOnOff(gzones[GZ_HEAD_FRONT].parent_id)) + { + VoiceGeneralSound("Writhe", monster, WRITHENUMBER); + FinalSound = true; + animation = &generic_move_death_tobackflail; + } + else + { + FinalSound = true; + FinalAnim = true; + } + } + } + + if (animation) + { + return animation; + } + return currentmove; +} + + +void DealWithArmor(edict_t &monster, body_c *body) +{ + int nArmorAmount = 0; + if (nArmorAmount = (int)body->GetArmorPercentRemaining()) + { // spawn armor pickup + edict_t *armor = G_Spawn(); + armor->count = (nArmorAmount<50)?50:nArmorAmount; + VectorCopy(monster.s.origin, armor->s.origin); + armor->s.origin[2] += (monster.maxs[2] - armor->mins[2] + 2); + VectorCopy(monster.s.angles, armor->s.angles); + // remove armor from corpse + body->StripArmor(); + I_SpawnArmor(armor); + } +} + +mmove_t *bodyhuman_c::GetSequenceForDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *animation = &default_death; + + // if we just played the microwave gun death, detonate this guy + + if (!lock_deaths&& currentMoveFinished && (currentmove == &generic_move_microwave_death)) + { + vec3_t fwd, dir, origin; + float knockback = 500; + int mod = 1; // never gets used + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + + if (myInstance && !freezeMyBolts) + { + freezeMyBolts = true; + myInstance->StopAnimatingAtAllBolts(); + AngleVectors(monster.s.angles, fwd, NULL, NULL); + VectorNegate(fwd, dir); + VectorMA(monster.s.origin, -100, vec3_up, origin); + Gib(monster, vec3_up, dflags|DT_NEURAL); // For some reason the DT_NEURAL gets lost off the body dflags... + gi.sound(&monster, CHAN_AUTO, gi.soundindex("Weapons/MPG/Burst.wav"), 1.0, ATTN_NORM, 0); + return &generic_move_death_fallforward; + } + else + { + FinalAnim = true; + FinalSound = true; + } + return currentmove; + } + + //added the actcode_death bit because the first time i go through here i'll be playing a non-death animation; if that's finished, i don't want to go through this stuff --sfs + if (currentMoveFinished && (currentmove && currentmove->suggested_action==ACTCODE_DEATH)) + { + // kef -- I'm gonna assume this means he's _dead_ dead + DealWithArmor(monster, this); + FreeKnives(monster); + + if (!bBoxConfirmed && monster.groundentity) + { + ai_c *ai; + ai=(ai_c *)((ai_public_c *)monster.ai); + if(ai) + { + // Not in DM. + ai->ConfirmBBox(monster, currentmove); + bBoxConfirmed = true; + } + } + } + + //to let guys show pain through part of their death... + if (currentMoveFinished && emotion != EMOTION_DEAD && (FinalAnim||level.time-LastKilledTime>10)) + { + Emote(monster, EMOTION_DEAD, 999999.9); + } + + //stop gore animation after 5 seconds of initial kill + if (level.time-LastKilledTime<=.1) + { + // need this bit to make sure StopAnimatingAtAllBolts is called if post-mortem limb-severing occurs + freezeMyBolts=false; + } + if (monster.ghoulInst && ((level.time-InitialKilledTime>5) || currentMoveFinished) && !freezeMyBolts) + { + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + if (myInstance) + { + freezeMyBolts=true; + myInstance->StopAnimatingAtAllBolts(); + } + } + + if (monster.spawnflags & SPAWNFLAG_ARMOR_PICKUP) + { // if this joker's actually a corpse, just go away + if (lock_deaths) + { + return &generic_move_death_fallforward; + } + return &generic_move_death_lfshotdeath; + } + + // if parental lock in on, nip this in the bud + if(lock_deaths) + { + animation = GetSequenceForParentalLockDeath(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move); + return animation; + } + + //if we're being passed an anim, verify it. if it checks, use it. + if (ideal_move && VerifySequence(monster, ideal_move, reject_actionflags)) + { + return ideal_move; + } + + //hack for train. forces the tumble animation + if (TrainDeath == true) + { + if (animation = GetSequenceForTrainDeath(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move)) + { + return animation; + } + } + + //are we already in a death animation? + if (currentmove && currentmove->suggested_action==ACTCODE_DEATH) + { + if (animation = GetSequenceForPostMortem(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move)) + { + return animation; + } + } + + //if i'm crouching, do crouch die + if (currentmove && currentmove->bbox == BBOX_PRESET_CROUCH) + { + if (animation = GetSequenceForCrouchDeath(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move)) + { + return animation; + } + } + + //if i'm prone, do prone die + if (currentmove && currentmove->bbox == BBOX_PRESET_PRONE) + { + if (animation = GetSequenceForProneDeath(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move)) + { + return animation; + } + } + + //are we already in a death animation? + if (currentmove && (currentmove->bbox == BBOX_PRESET_LAYBACK)) + { + if (animation = GetSequenceForPostMortem(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move)) + { + return animation; + } + } + + if ((dflags & DT_MANGLE) && currentmove && (currentmove->bbox == BBOX_PRESET_STAND)) + { + if (animation = GetSequenceForC4Death(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move)) + { + return animation; + } + } + + if ((dflags & DT_NEURAL) && currentmove && (currentmove->bbox == BBOX_PRESET_STAND)) + { + if (animation = GetSequenceForPulseGunDeath(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move)) + { + return animation; + } + } + + if ((dflags & DT_FIRE) && currentmove && (currentmove->bbox == BBOX_PRESET_STAND)) + { + if (animation = GetSequenceForBurningDeath(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move)) + { + return animation; + } + } + + if ((dflags & DT_JUGGLE) && currentmove && (currentmove->bbox == BBOX_PRESET_STAND)) + { + if (animation = GetSequenceForJuggleDeath(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move)) + { + return animation; + } + } + + if (spout != -1)//specific deaths for specific body parts + { + if (animation = GetSequenceForGoreZoneDeath(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move)) + { + return animation; + } + } + + if(gi.irand(0,3)) + { + if (animation = GetSequenceForFacingBasedDeath(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move)) + { + return animation; + } + } + + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + + if(gi.irand(0,3) && the_ai && (DotProduct(the_ai->velocity, the_ai->velocity) > 40)) // running + { + if (animation = GetSequenceForRunningDeath(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move)) + { + return animation; + } + } + + + if (animation = GetSequenceForCatchAllDeath(monster, inflictor, attacker, damage, point, dflags, goal_bbox, ideal_move)) + { + return animation; + } + + return &default_death; +} + +mmove_t *bodyhuman_c::GetSequenceForC4Death(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ + mmove_t *animation = &generic_move_death_long; + vec3_t facing, toc4; + + AngleVectors (monster.s.angles, facing, NULL, NULL); + VectorSubtract(inflictor->s.origin, monster.s.origin, toc4); + + if ((DotProduct(facing, toc4) < 0) && IsAvailableSequence(monster, &generic_move_death_fallforward)) + { + animation = &generic_move_death_fallforward; + } + else if (IsAvailableSequence(monster, &generic_move_death_violent)) + { + animation = &generic_move_death_violent; + } + + FinalAnim = true; + FinalSound = true; + return animation; +} + +mmove_t *bodyhuman_c::GetSequenceForPain(edict_t &monster, vec3_t point, float kick, int damage, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags) +{ +// if (Skill_NoPain(&monster)) +// { +// return NULL; +// } + + if (currentmove && currentmove->bbox == BBOX_PRESET_STAND) + { + if (rWeaponShot/* || lWeaponShot*/) + { + bool bTooToughToDropWeapon = false; + float fArmorPercentLeft = GetArmorPercentRemaining(); + float fHealthPercentLeft = (float)monster.health / (float)monster.max_health; + + ai_c *my_ai = (ai_c *)((ai_public_c *)monster.ai); + + rWeaponShot=lWeaponShot=false; + // if this is an armored guy... + //only let him drop his gun if he's down to < 50% armor or < 50% health. + //if(GetArmorCode() == ARMOR_FULL) + if(my_ai && !(my_ai->GetMySkills()->getDropWeap())) + { // rocket guys dropping their guns is weak + bTooToughToDropWeapon = true; + } + if ( (fArmorPercentLeft > 0.50) && (fHealthPercentLeft > 0.50) ) + { + bTooToughToDropWeapon = true; + } + if (!bTooToughToDropWeapon && IsAvailableSequence(monster, &generic_move_gunshotpain)) + { + VoiceGeneralSound("Disarm", monster, 1); + return &generic_move_gunshotpain; + } + if (IsAvailableSequence(monster, &generic_move_pain_rarm)) + { + return &generic_move_pain_rarm; + } + } + vec3_t toPoint, forward; + VectorSubtract(point, monster.s.origin, toPoint); + VectorNormalize(toPoint); + AngleVectors(monster.s.angles, forward, NULL, NULL); + + //took a limb shot + if (bodyDamage & BODYDAMAGE_RECENT) + { + if (bodyDamage & BODYDAMAGE_RIGHTLEG) + { + if (IsAvailableSequence(monster, &generic_move_pain_rleg)) + { + VoiceGeneralSound("Scream",monster,SCREAMNUMBER); + return &generic_move_pain_rleg; + } + else if (IsAvailableSequence(monster, &generic_move_pain_rleg_unhurt)) + { + return &generic_move_pain_rleg_unhurt; + } + } + if (bodyDamage & BODYDAMAGE_LEFTLEG) + { + if (IsAvailableSequence(monster, &generic_move_pain_lleg)) + { + VoiceGeneralSound("Scream",monster,SCREAMNUMBER); + return &generic_move_pain_lleg; + } + else if (IsAvailableSequence(monster, &generic_move_pain_lleg_unhurt)) + { + return &generic_move_pain_lleg_unhurt; + } + } + if (bodyDamage & BODYDAMAGE_RIGHTARM) + { + if (IsAvailableSequence(monster, &generic_move_pain_rarm)) + { + VoiceGeneralSound("Scream",monster,5); + return &generic_move_pain_rarm; + } + else if (IsAvailableSequence(monster, &generic_move_pain_rarm_unhurt)) + { + return &generic_move_pain_rarm_unhurt; + } + } + if (lWeaponShot || (bodyDamage & BODYDAMAGE_LEFTARM)) + { + if (IsAvailableSequence(monster, &generic_move_pain_larm)) + { + VoiceGeneralSound("Scream",monster,SCREAMNUMBER); + return &generic_move_pain_larm; + } + else if (IsAvailableSequence(monster, &generic_move_pain_larm_unhurt)) + { + return &generic_move_pain_larm_unhurt; + } + } + } + + //hit from back + if (DotProduct(forward, toPoint)<0) + { + if (IsAvailableSequence(monster, &generic_move_sunhurtfwd_mrs)) + { + return &generic_move_sunhurtfwd_mrs; + } + if (IsAvailableSequence(monster, &generic_move_sunhurtfwd_p)) + { + return &generic_move_sunhurtfwd_p; + } + } + //hit from front + else + { + //fixme--make this dependant on force of attack... + if (kick>75 && !gi.irand(0,5)) + { + if (IsAvailableSequence(monster, &generic_move_armorblown) && IsAvailableSequence(monster, &generic_move_upfromback) && (GetArmorCode() != ARMOR_FULL)) + { + VoiceGeneralSound("Scream", monster, SCREAMNUMBER); + return &generic_move_armorblown; + } + } + if (IsAvailableSequence(monster, &generic_move_sunhurtbk_mrs)) + { + return &generic_move_sunhurtbk_mrs; + } + if (IsAvailableSequence(monster, &generic_move_sunhurtbk_p)) + { + return &generic_move_sunhurtbk_p; + } + } + } + + return NULL; +} + +#define ARMORVALUE_STANDARD 300 +//Achtung! this won't cancel out old armor settings! +void bodyhuman_c::SetArmor(edict_t &monster, armor_code newarmor) +{ + int theArmorValue=ARMORVALUE_STANDARD; + + //PH3@r m3, 3y3 \/\/|LL h@><0r TH3 5h33@t oUT oF j00!!!!!!!!!!!1!111 + if (GetClassCode()==BODY_DEKKER) + { + switch (game.playerSkills.getEnemyValue()) + { + case 0://super-easy + theArmorValue=(int)((float)theArmorValue*0.25); + break; + case 1://sorta easy + theArmorValue=(int)((float)theArmorValue*0.3333333); + break; + case 2://medium + theArmorValue=(int)((float)theArmorValue*0.5); + break; + case 3://hard + theArmorValue=(int)((float)theArmorValue*0.5); + break; + default: + break; + } + } + + //no clients! they handle armor differently! + if (monster.client) + { + return; + } + + //make sure i've allocated my gzones--they'll be fiddled with, most likely + if (numGoreZones < NUM_HUMANGOREZONES) + { + return; + } + + armorCode = newarmor; + + switch (newarmor) + { + case ARMOR_NONE: + gzones[GZ_HEAD_FRONT].damage = 0; + gzones[GZ_HEAD_BACK].damage = 0; + gzones[GZ_NECK].damage = 0; + gzones[GZ_ARM_UPPER_RIGHT].damage =0; + gzones[GZ_ARM_UPPER_LEFT].damage =0; + gzones[GZ_ARM_LOWER_RIGHT].damage =0; + gzones[GZ_ARM_LOWER_LEFT].damage =0; + gzones[GZ_GROIN].damage =0; + gzones[GZ_LEG_UPPER_RIGHT_FRONT].damage =0; + gzones[GZ_LEG_UPPER_RIGHT_BACK].damage =0; + gzones[GZ_LEG_UPPER_LEFT_FRONT].damage =0; + gzones[GZ_LEG_UPPER_LEFT_BACK].damage =0; + gzones[GZ_LEG_LOWER_RIGHT].damage =0; + gzones[GZ_LEG_LOWER_LEFT].damage =0; + gzones[GZ_FOOT_RIGHT].damage =0; + gzones[GZ_FOOT_LEFT].damage =0; + gzones[GZ_GUT_FRONT_EXTRA].damage =0; + gzones[GZ_GUT_BACK_EXTRA].damage =0; + gzones[GZ_SHLDR_RIGHT_FRONT].damage =0; + gzones[GZ_SHLDR_RIGHT_BACK].damage =0; + gzones[GZ_SHLDR_LEFT_FRONT].damage =0; + gzones[GZ_SHLDR_LEFT_BACK].damage =0; + gzones[GZ_CHEST_FRONT].damage =0; + gzones[GZ_CHEST_BACK].damage =0; + gzones[GZ_GUT_FRONT].damage =0; + gzones[GZ_GUT_BACK].damage =0; + break; + case ARMOR_FULL: + gzones[GZ_HEAD_FRONT].damage-=theArmorValue; + gzones[GZ_HEAD_BACK].damage-=theArmorValue; + gzones[GZ_NECK].damage-=theArmorValue; + //no break! more armor coming! + case ARMOR_CHESTLIMBS: + gzones[GZ_ARM_UPPER_RIGHT].damage-=theArmorValue; + gzones[GZ_ARM_UPPER_LEFT].damage-=theArmorValue; + gzones[GZ_ARM_LOWER_RIGHT].damage-=theArmorValue; + gzones[GZ_ARM_LOWER_LEFT].damage-=theArmorValue; + gzones[GZ_GROIN].damage-=theArmorValue; + gzones[GZ_LEG_UPPER_RIGHT_FRONT].damage-=theArmorValue; + gzones[GZ_LEG_UPPER_RIGHT_BACK].damage-=theArmorValue; + gzones[GZ_LEG_UPPER_LEFT_FRONT].damage-=theArmorValue; + gzones[GZ_LEG_UPPER_LEFT_BACK].damage-=theArmorValue; + gzones[GZ_LEG_LOWER_RIGHT].damage-=theArmorValue; + gzones[GZ_LEG_LOWER_LEFT].damage-=theArmorValue; + gzones[GZ_FOOT_RIGHT].damage-=theArmorValue; + gzones[GZ_FOOT_LEFT].damage-=theArmorValue; + gzones[GZ_GUT_FRONT_EXTRA].damage-=theArmorValue; + gzones[GZ_GUT_BACK_EXTRA].damage-=theArmorValue; + //no break! more armor coming! + case ARMOR_CHEST: + gzones[GZ_SHLDR_RIGHT_FRONT].damage-=theArmorValue; + gzones[GZ_SHLDR_RIGHT_BACK].damage-=theArmorValue; + gzones[GZ_SHLDR_LEFT_FRONT].damage-=theArmorValue; + gzones[GZ_SHLDR_LEFT_BACK].damage-=theArmorValue; + gzones[GZ_CHEST_FRONT].damage-=theArmorValue; + gzones[GZ_CHEST_BACK].damage-=theArmorValue; + gzones[GZ_GUT_FRONT].damage-=theArmorValue; + gzones[GZ_GUT_BACK].damage-=theArmorValue; + break; + case ARMOR_SOMEWHAT_TOUGH: + monster.health *= 1.5; + monster.max_health *= 1.5; + break; + case ARMOR_TOUGH: + monster.health*=2; + monster.max_health*=2; + break; + } +} + +armor_code bodyhuman_c::GetArmorCode() +{ + return armorCode; +} + +float bodyhuman_c::GetArmorPercentRemaining() +{ + int nNumArmoredZones = 0; + float fTotalRemaining = 0, fOrigTotal = 0; + + switch (armorCode) + { + case ARMOR_NONE: + // not getting any armor off of this guy + return 0; + break; + case ARMOR_FULL: + // if there's any armor left on any gore zones, add it to the total + //(remember that armor is stored as a negative amount of damage) + if (gzones[GZ_HEAD_FRONT].damage < 0) + { + fTotalRemaining -= gzones[GZ_HEAD_FRONT].damage; + } + if (gzones[GZ_HEAD_BACK].damage < 0) + { + fTotalRemaining -= gzones[GZ_HEAD_BACK].damage; + } + if (gzones[GZ_NECK].damage < 0) + { + fTotalRemaining -= gzones[GZ_NECK].damage; + } + nNumArmoredZones += 3; + //no break! more armor coming! + case ARMOR_CHESTLIMBS: + // if there's any armor left on any gore zones, add it to the total + //(remember that armor is stored as a negative amount of damage) + if (gzones[GZ_ARM_UPPER_RIGHT].damage < 0) + { + fTotalRemaining -= gzones[GZ_ARM_UPPER_RIGHT].damage; + } + if (gzones[GZ_ARM_UPPER_LEFT].damage < 0) + { + fTotalRemaining -= gzones[GZ_ARM_UPPER_LEFT].damage; + } + if (gzones[GZ_ARM_LOWER_RIGHT].damage < 0) + { + fTotalRemaining -= gzones[GZ_ARM_LOWER_RIGHT].damage; + } + if (gzones[GZ_ARM_LOWER_LEFT].damage < 0) + { + fTotalRemaining -= gzones[GZ_ARM_LOWER_LEFT].damage; + } + if (gzones[GZ_GROIN].damage < 0) + { + fTotalRemaining -= gzones[GZ_GROIN].damage; + } + if (gzones[GZ_LEG_UPPER_RIGHT_FRONT].damage < 0) + { + fTotalRemaining -= gzones[GZ_LEG_UPPER_RIGHT_FRONT].damage; + } + if (gzones[GZ_LEG_UPPER_RIGHT_BACK].damage < 0) + { + fTotalRemaining -= gzones[GZ_LEG_UPPER_RIGHT_BACK].damage; + } + if (gzones[GZ_LEG_UPPER_LEFT_FRONT].damage < 0) + { + fTotalRemaining -= gzones[GZ_LEG_UPPER_LEFT_FRONT].damage; + } + if (gzones[GZ_LEG_UPPER_LEFT_BACK].damage < 0) + { + fTotalRemaining -= gzones[GZ_LEG_UPPER_LEFT_BACK].damage; + } + if (gzones[GZ_LEG_LOWER_RIGHT].damage < 0) + { + fTotalRemaining -= gzones[GZ_LEG_LOWER_RIGHT].damage; + } + if (gzones[GZ_LEG_LOWER_LEFT].damage < 0) + { + fTotalRemaining -= gzones[GZ_LEG_LOWER_LEFT].damage; + } + if (gzones[GZ_FOOT_RIGHT].damage < 0) + { + fTotalRemaining -= gzones[GZ_FOOT_RIGHT].damage; + } + if (gzones[GZ_FOOT_LEFT].damage < 0) + { + fTotalRemaining -= gzones[GZ_FOOT_LEFT].damage; + } + if (gzones[GZ_GUT_FRONT_EXTRA].damage < 0) + { + fTotalRemaining -= gzones[GZ_GUT_FRONT_EXTRA].damage; + } + if (gzones[GZ_GUT_BACK_EXTRA].damage < 0) + { + fTotalRemaining -= gzones[GZ_GUT_BACK_EXTRA].damage; + } + nNumArmoredZones += 15; + //no break! more armor coming! + case ARMOR_CHEST: + // if there's any armor left on any gore zones, add it to the total + //(remember that armor is stored as a negative amount of damage) + if (gzones[GZ_SHLDR_RIGHT_FRONT].damage < 0) + { + fTotalRemaining -= gzones[GZ_SHLDR_RIGHT_FRONT].damage; + } + if (gzones[GZ_SHLDR_RIGHT_BACK].damage < 0) + { + fTotalRemaining -= gzones[GZ_SHLDR_RIGHT_BACK].damage; + } + if (gzones[GZ_SHLDR_LEFT_FRONT].damage < 0) + { + fTotalRemaining -= gzones[GZ_SHLDR_LEFT_FRONT].damage; + } + if (gzones[GZ_SHLDR_LEFT_BACK].damage < 0) + { + fTotalRemaining -= gzones[GZ_SHLDR_LEFT_BACK].damage; + } + if (gzones[GZ_CHEST_FRONT].damage < 0) + { + fTotalRemaining -= gzones[GZ_CHEST_FRONT].damage; + } + if (gzones[GZ_CHEST_BACK].damage < 0) + { + fTotalRemaining -= gzones[GZ_CHEST_BACK].damage; + } + if (gzones[GZ_GUT_FRONT].damage < 0) + { + fTotalRemaining -= gzones[GZ_GUT_FRONT].damage; + } + if (gzones[GZ_GUT_BACK].damage < 0) + { + fTotalRemaining -= gzones[GZ_GUT_BACK].damage; + } + nNumArmoredZones += 8; + break; + case ARMOR_SOMEWHAT_TOUGH: + return 0; + break; + case ARMOR_TOUGH: + // not getting any armor off of this guy + return 0; + break; + } + fOrigTotal = (float)(nNumArmoredZones * ARMORVALUE_STANDARD); + return 100 * (fTotalRemaining / fOrigTotal); +} + +void bodyhuman_c::StripArmor() +{ + switch (armorCode) + { + case ARMOR_NONE: + break; + case ARMOR_FULL: + gzones[GZ_HEAD_FRONT].damage = 0; + gzones[GZ_HEAD_BACK].damage = 0; + gzones[GZ_NECK].damage = 0; + //no break! more armor coming! + case ARMOR_CHESTLIMBS: + gzones[GZ_ARM_UPPER_RIGHT].damage = 0; + gzones[GZ_ARM_UPPER_LEFT].damage = 0; + gzones[GZ_ARM_LOWER_RIGHT].damage = 0; + gzones[GZ_ARM_LOWER_LEFT].damage = 0; + gzones[GZ_GROIN].damage = 0; + gzones[GZ_LEG_UPPER_RIGHT_FRONT].damage = 0; + gzones[GZ_LEG_UPPER_RIGHT_BACK].damage = 0; + gzones[GZ_LEG_UPPER_LEFT_FRONT].damage = 0; + gzones[GZ_LEG_UPPER_LEFT_BACK].damage = 0; + gzones[GZ_LEG_LOWER_RIGHT].damage = 0; + gzones[GZ_LEG_LOWER_LEFT].damage = 0; + gzones[GZ_FOOT_RIGHT].damage = 0; + gzones[GZ_FOOT_LEFT].damage = 0; + gzones[GZ_GUT_FRONT_EXTRA].damage = 0; + gzones[GZ_GUT_BACK_EXTRA].damage = 0; + //no break! more armor coming! + case ARMOR_CHEST: + gzones[GZ_SHLDR_RIGHT_FRONT].damage = 0; + gzones[GZ_SHLDR_RIGHT_BACK].damage = 0; + gzones[GZ_SHLDR_LEFT_FRONT].damage = 0; + gzones[GZ_SHLDR_LEFT_BACK].damage = 0; + gzones[GZ_CHEST_FRONT].damage = 0; + gzones[GZ_CHEST_BACK].damage = 0; + gzones[GZ_GUT_FRONT].damage = 0; + gzones[GZ_GUT_BACK].damage = 0; + break; + case ARMOR_SOMEWHAT_TOUGH: + break; + case ARMOR_TOUGH: + break; + } + armorCode = ARMOR_NONE; +} + +void bodyhuman_c::ReloadRWeapon(edict_t &monster) +{ + switch(GetRightHandWeapon(monster)) + { + case ATK_PISTOL2: + rWeaponAmmo = 9; + break; + case ATK_PISTOL1: + rWeaponAmmo = 18; + break; + case ATK_SNIPER: + rWeaponAmmo = 6; + break; + case ATK_MACHINEGUN: + //rWeaponAmmo = 50; + //eric wants this changed + rWeaponAmmo = 30; + break; + case ATK_KNIFE: + rWeaponAmmo = 1;//huh? + break; + case ATK_FLAMEGUN: + rWeaponAmmo = 100000;//eh?- no reloading for this + break; + case ATK_ASSAULTRIFLE: + rWeaponAmmo = 40; + break; + case ATK_MACHINEPISTOL: + rWeaponAmmo = 33; + break; + case ATK_AUTOSHOTGUN: + rWeaponAmmo = 10; + break; + case ATK_SHOTGUN: + rWeaponAmmo = 8; + break; + case ATK_ROCKET: + rWeaponAmmo = 4; + break; + case ATK_MICROWAVE: + case ATK_MICROWAVE_ALT: + case ATK_DEKKER: + rWeaponAmmo = 100;//eh? + break; + default: + case ATK_NOTHING: + rWeaponAmmo = 1; + break; + } +} + +void bodyhuman_c::AdjustAimByWeapon(edict_t &monster, vec3_t aimDir) +{ + float rVal; + + switch(GetRightHandWeapon(monster)) + { + case ATK_PISTOL2: + rVal = 0; + break; + case ATK_PISTOL1: + rVal = .1; + break; + case ATK_SNIPER: + rVal = 0; + break; + case ATK_MACHINEGUN: + rVal = .2; + break; + case ATK_KNIFE: + rVal = 0; + break; + case ATK_FLAMEGUN: + rVal = .2; + break; + case ATK_MICROWAVE: + case ATK_MICROWAVE_ALT: + case ATK_DEKKER: + rVal = .2; + break; + case ATK_ROCKET: + rVal = 0; + break; + case ATK_ASSAULTRIFLE: + rVal = .3; + break; + case ATK_MACHINEPISTOL: + rVal = .4; + break; + case ATK_AUTOSHOTGUN: + rVal = .2; + break; + case ATK_SHOTGUN: + rVal = .2; + break; + default: + case ATK_NOTHING: + rVal = 0; + break; + } + + aimDir[0] += gi.flrand(-rVal, rVal); + aimDir[1] += gi.flrand(-rVal, rVal); + aimDir[2] += gi.flrand(-rVal, rVal); + VectorNormalize(aimDir); +} + +qboolean bodyhuman_c::PlayAnimation(edict_t &monster, mmove_t *newanim, bool forceRestart) +{ + //make sure i'm using ground instead of ground2 as my ground reference + if (forceRestart || newanim != currentmove || ForceNextAnim) + { + UseGround2(monster, false); + } + + if (newanim->actionFlags & ACTFLAG_RHANDOPEN) + { + OpenRightHand(monster, true); + } + else + { + OpenRightHand(monster, false); + } + + if (newanim->actionFlags & ACTFLAG_LHANDOPEN) + { + OpenLeftHand(monster, true); + } + else + { + OpenLeftHand(monster, false); + } + + if (newanim->actionFlags & ACTFLAG_GRENADE) + { + GrenadeHand(monster, true, false); + } + else + { + GrenadeHand(monster, false, false); + } + + if (newanim->actionFlags & ACTFLAG_PISS) + { + DoPiss(monster); + } + + forceRestart |= ForceNextAnim; + ForceNextAnim = false; + + return bodyorganic_c::PlayAnimation(monster, newanim, forceRestart); +} + + +void bodyhuman_c::SetFlags(edict_t & monster, int newflags) +{ + frame_flags|=newflags; + //fixme! if the jumping isn't successful, and i stay on the ground, this will look weird! + if (newflags & FRAMEFLAG_JUMP && currentmove->actionFlags & ACTFLAG_JUMPTOGROUND2) + { + UseGround2(monster, true); + } +} + +void bodyhuman_c::OpenRightHand(edict_t &monster, qboolean toggleVal) +{ + GhoulID tempID; + if (!monster.ghoulInst) + { + return; + } + + IGhoulObj *MyObject=monster.ghoulInst->GetGhoulObject(); + IGhoulInst *MyInst=monster.ghoulInst; + + if (MyObject && toggleVal && !rHandOpen) + { + //if i have a closed hand turned on, switch to appropriate open hand + tempID=MyObject->FindPart("_rclosed"); + if (tempID&&MyInst->GetPartOnOff(tempID)) + { + MyInst->SetPartOnOff(tempID,false); + tempID=MyObject->FindPart("_ropen"); + if (tempID) + { + MyInst->SetPartOnOff(tempID,true); + } + } + tempID=MyObject->FindPart("_rbossclosed"); + if (tempID&&MyInst->GetPartOnOff(tempID)) + { + MyInst->SetPartOnOff(tempID,false); + tempID=MyObject->FindPart("_rbossopen"); + if (tempID) + { + MyInst->SetPartOnOff(tempID,true); + } + } + tempID=MyObject->FindPart("_rhand_closed"); + if (tempID&&MyInst->GetPartOnOff(tempID)) + { + MyInst->SetPartOnOff(tempID,false); + tempID=MyObject->FindPart("_rhand_open"); + if (tempID) + { + MyInst->SetPartOnOff(tempID,true); + } + } + } + else if (MyObject && rHandOpen && !toggleVal) + { + //if i have a open hand turned on, switch to appropriate closed hand + tempID=MyObject->FindPart("_ropen"); + if (tempID&&MyInst->GetPartOnOff(tempID)) + { + MyInst->SetPartOnOff(tempID,false); + tempID=MyObject->FindPart("_rclosed"); + if (tempID) + { + MyInst->SetPartOnOff(tempID,true); + } + } + tempID=MyObject->FindPart("_rbossopen"); + if (tempID&&MyInst->GetPartOnOff(tempID)) + { + MyInst->SetPartOnOff(tempID,false); + tempID=MyObject->FindPart("_rbossclosed"); + if (tempID) + { + MyInst->SetPartOnOff(tempID,true); + } + } + tempID=MyObject->FindPart("_rhand_open"); + if (tempID&&MyInst->GetPartOnOff(tempID)) + { + MyInst->SetPartOnOff(tempID,false); + tempID=MyObject->FindPart("_rhand_closed"); + if (tempID) + { + MyInst->SetPartOnOff(tempID,true); + } + } + } + rHandOpen=toggleVal; +} + + +void bodyhuman_c::OpenLeftHand(edict_t &monster, qboolean toggleVal) +{ + GhoulID tempID,tempID2; + if (!monster.ghoulInst) + { + return; + } + + IGhoulObj *MyObject=monster.ghoulInst->GetGhoulObject(); + IGhoulInst *MyInst=monster.ghoulInst; + + if (MyObject && toggleVal && !lHandOpen) + { + //if i have a closed hand turned on, switch to appropriate open hand + tempID=MyObject->FindPart("_lclosed"); + tempID2=MyObject->FindPart("_lopen"); + if (tempID2&&(!tempID||MyInst->GetPartOnOff(tempID))) + { + if (tempID) + { + MyInst->SetPartOnOff(tempID,false); + } + if (tempID2) + { + MyInst->SetPartOnOff(tempID2,true); + } + } + tempID=MyObject->FindPart("_lbossclosed"); + tempID2=MyObject->FindPart("_lbossopen"); + if (tempID2&&(!tempID||MyInst->GetPartOnOff(tempID))) + { + if (tempID) + { + MyInst->SetPartOnOff(tempID,false); + } + if (tempID2) + { + MyInst->SetPartOnOff(tempID2,true); + } + } + tempID=MyObject->FindPart("_lhand_closed"); + tempID2=MyObject->FindPart("_lhand_open"); + if (tempID2&&(!tempID||MyInst->GetPartOnOff(tempID))) + { + if (tempID) + { + MyInst->SetPartOnOff(tempID,false); + } + if (tempID2) + { + MyInst->SetPartOnOff(tempID2,true); + } + } + } + else if (MyObject && lHandOpen && !toggleVal) + { + //if i have a open hand turned on, switch to appropriate closed hand + tempID=MyObject->FindPart("_lopen"); + tempID2=MyObject->FindPart("_lclosed"); + if (tempID2&&(!tempID||MyInst->GetPartOnOff(tempID))) + { + if (tempID) + { + MyInst->SetPartOnOff(tempID,false); + } + if (tempID2) + { + MyInst->SetPartOnOff(tempID2,true); + } + } + tempID=MyObject->FindPart("_lbossopen"); + tempID2=MyObject->FindPart("_lbossclosed"); + if (tempID2&&(!tempID||MyInst->GetPartOnOff(tempID))) + { + if (tempID) + { + MyInst->SetPartOnOff(tempID,false); + } + if (tempID2) + { + MyInst->SetPartOnOff(tempID2,true); + } + } + tempID=MyObject->FindPart("_lhand_open"); + tempID2=MyObject->FindPart("_lhand_closed"); + if (tempID2&&(!tempID||MyInst->GetPartOnOff(tempID))) + { + if (tempID) + { + MyInst->SetPartOnOff(tempID,false); + } + if (tempID2) + { + MyInst->SetPartOnOff(tempID2,true); + } + } + } + lHandOpen=toggleVal; +} + + +void bodyhuman_c::GrenadeHand(edict_t &monster, qboolean toggleVal, qboolean nodrop) +{ + if (!monster.ghoulInst) + { + return; + } + + IGhoulObj *MyObject=monster.ghoulInst->GetGhoulObject(); + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + + if (MyObject && toggleVal && !grenadeInHand) + { //if I don't have a grenade in my hand, add one to the bolton. + if (AddBoltedItem(monster, "wbolt_hand_l", "Items/Projectiles", "grenade", "to_wbolt_hand_l", myInstance)) + { + grenadeInHand=true; + } + } + else if (MyObject && grenadeInHand && !toggleVal) + { // If I have a grenade in my hand, turn it off and DROP it at my feet! (if not player) + ggBinstC *boltedptr; + + boltedptr=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l")); + if (boltedptr) + { + myInstance->RemoveBoltInstance(boltedptr); + } + + grenadeInHand=false; + } +} + + +// Start the pissing effect at the correct bolt-on... +void DoPiss(edict_t &monster) +{ + if (monster.ghoulInst && !lock_textures) + { + fxRunner.exec("environ/takeleak", &monster, monster.ghoulInst->GetGhoulObject()->FindPart("gbolt_groin")); + } +} + + +void Testboltzap(edict_t *ent) +{ + vec3_t orient; + ent->nextthink=level.time+0.1; + AngleVectors(ent->s.angles, orient, NULL, NULL); + FX_MakeElectricArc(ent->s.origin, 64, orient); +} + +void TestBoltPosition(vec3_t origin, vec3_t direction) +{ + edict_t *ent=G_Spawn(); + VectorCopy(origin, ent->s.origin); + VectorCopy(direction, ent->s.angles); + ent->think=Testboltzap; + ent->nextthink=level.time+0.1; +} + + +//#define BRAIN_SCALE 1.142857142857 +#define BRAIN_SCALE 1.17 + +void bodyhuman_c::ShowBackHoleDamage (edict_t &monster, gz_code frontCode, gz_code backCode, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int take, int knockback, int dflags, int mod) +{ + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + GhoulID tempHole=0; + gz_info *frontHole=NULL; + + if (take <= 0) + { + return; + } + + if (frontCode != numGoreZones) + { + frontHole=&gzones[frontCode]; + } + gz_info *backHole=NULL; + if (backCode != numGoreZones) + { + backHole=&gzones[backCode]; + } + int i=gi.irand(0,2); + //exit wound--massive damage, but only if guy wasn't dead before (to prevent super-fast damage-stacking on dead guys) + if ((take > monster.health) && (monster.health > 0) && backHole && frontHole && backHole->id && backHole->parent_id && backHole != frontHole && myInstance->GetInstPtr()->GetPartOnOff(backHole->parent_id)) + { + backHole->damage=GetMinimumDamageForLevel(3); + if (backHole->damage_level<3) + { + //if this zone was already active, match up the row + if (backHole->damage_level) + { + GhoulID skinID=myInstance->GetInstPtr()->GetFrameOverride("gz",backHole->id); + if (skinID) + { + for (i=0;i<4;i++) + { + if (skinID==gzone_levels[backHole->damage_level-1][i]) + break; + } + } + } + + // 1/10/00 kef -- there seemed to be some random stompage of i here...it somehow got a value of 4, which + //severely spooged the following frameoverride stuff. so, in a feat of empiric programming, I'm clamping + //i to [0,3]. + if (i < 0) + { + i = 0; + } + else if (i > 3) + { + i = 3; + } + backHole->damage_level=3; + if (gzone_levels[2][i] != NULL_GhoulID) + { + myInstance->GetInstPtr()->SetFrameOverride("gz",gzone_levels[2][i],backHole->id); + if (backHole->buddyzone != numGoreZones && gzones[backHole->buddyzone].id) + { + gzones[backHole->buddyzone].damage=backHole->damage; + gzones[backHole->buddyzone].damage_level=backHole->damage_level; + monster.ghoulInst->SetPartOnOff(gzones[backHole->buddyzone].id, true); + myInstance->GetInstPtr()->SetFrameOverride("gz",gzone_levels[2][i],gzones[backHole->buddyzone].id); + } + } + + if (backHole->bolt) + { + myInstance->RemoveBolt(backHole->bolt); + + if (frontHole==&gzones[GZ_HEAD_FRONT]&&backHole==&gzones[GZ_HEAD_BACK]&&take>monster.health&&take>80) + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_headbeard"); + if (!tempHole || tempHole!=frontHole->parent_id) + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_headhelmet"); + if (tempHole) + { + frontHole->parent_id=tempHole; + BlowPart(monster,frontHole->blowme,NULL); + monster.ghoulInst->SetPartOnOff(backHole->id, false); + monster.ghoulInst->SetPartOnOff(frontHole->id, false); + monster.ghoulInst->SetPartOnOff(frontHole->parent_id, true); + SetGoreZone(monster, "gz_headhelmet_f", GZ_HEAD_FRONT); + if (frontHole->id) + { + monster.ghoulInst->SetPartOnOff(frontHole->id, true); + if (frontHole->damage_level>=1 && gzone_levels[frontHole->damage_level-1][i] != NULL_GhoulID) + { + myInstance->GetInstPtr()->SetFrameOverride("gz",gzone_levels[frontHole->damage_level-1][i],frontHole->id); + } + } + SetGoreBolt(monster, "abolt_head_t", GZ_HEAD_BACK); + if (backHole->bolt) + { + AddBoltedItem(monster, backHole->bolt, "Enemy/bolt", "g_brain", "to_abolt_head_t", myInstance, "", BRAIN_SCALE); + } + return;//don't turn the gorezone back on! + } + } + } + + //bolt on exit wound + AddBoltedItem(monster, backHole->bolt, "Enemy/bolt", "g_exit_chunky_anim1", "to_gbolt", myInstance); + FX_BloodCloud(&monster, backHole->bolt, 100); + if ( dflags & DT_PROJECTILE ) + { + FX_BloodJet(&monster, point, dir); + } + } + } + monster.ghoulInst->SetPartOnOff(backHole->id, true); + } + else if (monster.health <= 0 && backHole && backHole->id && gi.irand(0,1)) + { // Just do some blood... + if (backHole->bolt) + FX_BloodCloud(&monster, backHole->bolt, 50); + else if (backHole->capbolt) + FX_BloodCloud(&monster, backHole->capbolt, 50); + } + if ((monster.health <= 0) && (!gi.irand(0,2)) && (dflags & DT_PROJECTILE)) + { + FX_BloodJet(&monster, point, dir); + } +} + +gutCallback theGutCallback; + +bool gutCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + edict_t *self = (edict_t*)ent; + ggBinstC *gutBolt=NULL; + ai_public_c *aipub = self->ai; + ai_c *ai = (ai_c*)aipub; // sigh, is this really necessary? + ggOinstC *myInstance = game_ghoul.FindOInst(self->ghoulInst); + GhoulID gutSeq=0; + ggObjC *gut=NULL; + + if (!ai || (ai->GetBody() && (level.time-ai->GetBody()->GetInitialKilledTime()>3)) || !ai->GetGhoulObj()) + { + return true; + } + + gutBolt=myInstance->GetBoltInstance(ai->GetGhoulObj()->GetMyObject()->FindPart("gbolt_gut_f")); + gut=game_ghoul.FindObject("Enemy/bolt","guts_bolton"); + + if (gut && gutBolt) + { + gutSeq=game_ghoul.FindObjectSequence(gut,"g_exit_guts_anim2"); + if (gutSeq) + { + gutBolt->PlaySequence(gutSeq, level.time); + } + } + return true; +} + +qboolean bodyhuman_c::ShowFrontHoleDamage (edict_t &monster, gz_code frontCode, gz_code backCode, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int take, int knockback, int dflags, int mod) +{ + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + ggOinstC *blownInst=NULL; + Vect3 Direction; + int i; + gz_info *frontHole=NULL; + qboolean blewOneOff = false; + vec3_t debrisNorm; + bool bKnife = false; + + if (take <= 0) + { + return false; + } + + assert(gzones); + + // For gib calls, essentially. + currentGoreZone = frontCode; + + // if I'm taking head/neck damage, no vocal cords for me + if ( (frontCode == GZ_HEAD_FRONT) || (backCode == GZ_HEAD_FRONT) || + (frontCode == GZ_HEAD_BACK) || (backCode == GZ_HEAD_BACK) || + (frontCode == GZ_NECK) || (backCode == GZ_NECK) ) + { + SetVocalCordsWorking(false); + } + + if (inflictor && inflictor->ghoulInst) + { + bKnife = ((254 == inflictor->elasticity) && attacker->client); + inflictor->ghoulInst->SetUserData(inflictor); + } + if (frontCode != numGoreZones) + { + frontHole=&gzones[frontCode]; + } + gz_info *backHole=NULL; + if (backCode != numGoreZones) + { + backHole=&gzones[backCode]; + } + + for (i=0;i<3;i++) + { + Direction[i]=dir[i]; + } + + // if we just hit this joker with a thrown knife, try to bolt it on + //AddBoltedItem(edict_t &monster, GhoulID mybolt, ggObjC *gun, char *itemSeq, GhoulID itemBolt, + // ggOinstC *myInstance, char *itemSkinName, float scale) + if (bKnife && frontHole) + { + IGhoulInst *instKnife = inflictor->ghoulInst; + IGhoulObj *objKnife = (instKnife?instKnife->GetGhoulObject():NULL); + ggOinstC *oInstKnife = game_ghoul.FindOInst(instKnife); + ggObjC *ggObjKnife = NULL; + ggBinstC *boltedKnife = NULL; + GhoulID boltKnife = NULL_GhoulID; + GhoulID blownCapBolt = frontHole->blownCapBolt; + + // the blowncapbolts normally associated with the shoulder gore zones don't + //look quite right for bolting on thrown knives. hopefully these will look + //a little better + if ((frontCode > GZ_NECK) && (frontCode < GZ_CHEST_FRONT)) + { + IGhoulObj *myObj = monster.ghoulInst->GetGhoulObject(); + switch(frontCode) + { + case GZ_SHLDR_RIGHT_FRONT: + case GZ_SHLDR_RIGHT_BACK: + blownCapBolt = myObj->FindPart("gbolt_cap_rbicep_chest_tight"); + break; + case GZ_SHLDR_LEFT_FRONT: + case GZ_SHLDR_LEFT_BACK: + blownCapBolt = myObj->FindPart("gbolt_cap_lbicep_chest_tight"); + break; + } + } + if (NULL == blownCapBolt) + { + // use a default hip location if there's no blownCapBolt where the knife landed + IGhoulObj *myObj = monster.ghoulInst->GetGhoulObject(); + + if (myObj) + { + switch(frontCode) + { + case GZ_FOOT_RIGHT: + blownCapBolt = myObj->FindPart("sbolt_heel_r"); + break; + case GZ_FOOT_LEFT: + blownCapBolt = myObj->FindPart("sbolt_heel_l"); + break; + case GZ_NECK: + //blownCapBolt = gzones[GZ_HEAD_FRONT].blownCapBolt; + blownCapBolt = myObj->FindPart("abolt_chest"); + if (blownCapBolt) + break; +// blownCapBolt = myObj->FindPart("sbolt_heel_l"); +// break; + default: + blownCapBolt = myObj->FindPart("abolt_hip_r"); + break; + } + } + } + +// if (blownCapBolt) +// { +// IGhoulObj *myObj = monster.ghoulInst->GetGhoulObject(); +// char rubbish[100]; +// myObj->GetPartName(blownCapBolt, rubbish); +// gi.dprintf("bolting knife to %s\n", rubbish); +// } + + // we need a blownCapBolt for the knife, so if our frontHole doesn't have one, use its capBolt + if ( oInstKnife && (ggObjKnife = oInstKnife->GetParentObject()) && + objKnife && (boltKnife = objKnife->FindPart("tip")) ) + { + boltedKnife = AddBoltedItem(monster, blownCapBolt, ggObjKnife, "w_knife", + boltKnife, myInstance); + if (boltedKnife && (instKnife = boltedKnife->GetInstPtr())) + { + // make sure the knife is aligned such that its hilt points back towards the thrower + //(woohoo! code reuse!) + boltonOrientation_c boltonInfo; +// vec3_t vPos, vTemp; + vec3_t boltFaceAngs, boltFaceVec; + + + //i confess total ignorance on how the orientbolton way of lining up the knife figured this + //out, but i'm using the actual thrown knife's velocity to determine which way it should be sticking out... + VectorCopy(inflictor->velocity, boltFaceVec); + + //theoretically, i should have to invert the velocity to get the correct direction, but it works more + //often if i don't. that's sad. +// VectorInverse(boltFaceVec); + + //turn the velocity into a set of angles + VectorNormalize(boltFaceVec); + vectoangles(boltFaceVec, boltFaceAngs); + + //smash the pitch to 90 degrees--to make the knives stick out horizontally. i dunno, it seemed like a good thing to do... + boltFaceAngs[PITCH]=90.0; + + //translate the angles from degrees to radians. + boltFaceAngs[PITCH]*=DEGTORAD; + boltFaceAngs[YAW]*=DEGTORAD; + + Matrix4 EntityToWorld, BoltToEntity, BoltToWorld, WorldToBolt, NewWorldToBolt; + Matrix4 matOld, matR1, matR2, matTemp, matNew, matTemp2; + Vect3 tempVector; + + //do a bunch of calculations, all to get the WorldToBolt matrix, so we can use our world-relative rotation + EntToWorldMatrix(monster.s.origin,monster.s.angles,EntityToWorld); + monster.ghoulInst->GetBoltMatrix(level.time,BoltToEntity,blownCapBolt, + IGhoulInst::MatrixType::Entity, true); + BoltToWorld.Concat(BoltToEntity,EntityToWorld); + WorldToBolt.Inverse(BoltToWorld); + + //take the translation off our world-to-bolt matrix--we'll use it later, since the knife's velocity + //(and therefore our calculated angles) are relative to world; but we don't want to reverse the translation on the bolt + WorldToBolt.SetRow(3); + + //surprisingly, the calculated yaw works best if thrown into the final pitch :/ + matR1.Rotate(PITCH, boltFaceAngs[YAW]); + //...and the pitch only seems effective if it's thrown into the yaw. + matR2.Rotate(YAW, boltFaceAngs[PITCH]); + + //well, either way, they need to be mashed together into one matrix. + matTemp.Concat(matR2, WorldToBolt); + + //this was just a desperate attempt to fix things by mindlessly fiddling with the blowncapbolt's matrix. + //surprisingly, it didn't do much good. +// NewWorldToBolt.Identity(); +// WorldToBolt.GetRow(0, tempVector); +// NewWorldToBolt.SetRow(1, tempVector); +// WorldToBolt.GetRow(1, tempVector); +// NewWorldToBolt.SetRow(2, tempVector); +// WorldToBolt.GetRow(2, tempVector); +// NewWorldToBolt.SetRow(0, tempVector); + + //our real rotation needs to be concatenated with the inverse of the bolt's rotation, because it's relative to world, not relative to bolt + matNew.Concat(matR1, matTemp); + + //so that's it--whatever trash we've ended up with gets thrown on the knife. + instKnife->SetXForm(matNew); + + + + //this here's the original way of bolting on the knives. i don't know why it's erratic, anymore than + //i know why the above code is erratic. +// GetGhoulPosDir(monster.s.origin, monster.s.angles, +// instKnife, NULL, "tip", vPos, vTemp, NULL, NULL); +// VectorSubtract(vPos, attacker->s.origin, vTemp); +// boltonInfo.root = &monster; +// boltonInfo.boltonInst = instKnife; +// boltonInfo.boltonID = boltKnife; +// boltonInfo.parentID = blownCapBolt; +// boltonInfo.parentInst = monster.ghoulInst; +// VectorAdd(vPos, vTemp, boltonInfo.vTarget); +// boltonInfo.fMinPitch = -1000; +// boltonInfo.fMaxPitch = 1000; +// boltonInfo.fMinYaw = -1000; +// boltonInfo.fMaxYaw = 1000; +// boltonInfo.fMaxTurnSpeed = 1000; +// boltonInfo.bUsePitch = true; +// boltonInfo.bUseYaw = true; +// boltonInfo.bToRoot = true; +// if (blownCapBolt) +// { +// boltonInfo.OrientBolton(); +// } + } + } + // AddBoltedItem created a new ggBinstC of the knife, so we can free the original. + //HOWEVER, the thrown knife gets freed in knifeThrowCollide, shortly after returning + //from this function. + } + if (frontHole && frontHole->id && frontHole->parent_id && myInstance->GetInstPtr()->GetPartOnOff(frontHole->parent_id)) + { + int newlevel; + if (monster.health <=0 && take < 5) + { + frontHole->damage+=10; + } + else + { + if (monster.health > 0 && take > monster.health) + { + frontHole->damage+=monster.health; + } + else + { + frontHole->damage+=take; + } + } + newlevel=GetDamageLevel(frontHole->damage); + if (!lock_gorezones) + { + monster.ghoulInst->SetPartOnOff(frontHole->id, true); + } + if (newlevel>frontHole->damage_level) + { + //knock off loose parts + ShakePart(monster, frontHole->blowme, Direction); + + i = gi.irand(0,2); + + if (mod == MOD_KNIFE_SLASH) + { + i=3; + } + + //if this zone was already active, match up the row + if ((frontHole->damage_level) && (!lock_gorezones) && i!=3) + { + GhoulID skinID=myInstance->GetInstPtr()->GetFrameOverride("gz",frontHole->id); + if (skinID) + { + for (i=0;i<4;i++) + { + if (skinID==gzone_levels[frontHole->damage_level-1][i]) + break; + } + + //eh, previous injury was knife slash: ditch it + if (i==3) + { + i = gi.irand(0,2); + } + } + } + if (frontHole->bolt) + { + if ((monster.health > 0) && (!(dflags & DT_DIRECTIONALGORE))) + { +// gi.sound (&monster, CHAN_BODY, gi.soundindex ("impact/gore/spout.wav"), .8, ATTN_NORM, 0); + FX_Bleed(&monster, frontHole->bolt, 40); + } + + if ((frontHole==&gzones[GZ_GUT_FRONT]) && (monster.health <= take) && !gutsOut && (dflags & DT_SEVER) && (!lock_gorezones)) + { + newlevel=2; + gutsOut=true; + myInstance->RemoveBolt(frontHole->bolt); +// AddBoltedItem(monster, frontHole->bolt, "Enemy/bolt", "g_guts3", "to_gbolt_gut_f", myInstance); + AddBoltedItem(monster, frontHole->bolt, "Enemy/bolt", "guts_bolton", "to_gbolt_gut_f", myInstance); + + ggObjC *gut=NULL; + ggBinstC *gutBolt=NULL; + + gut=game_ghoul.FindObject("Enemy/bolt","guts_bolton"); + gutBolt=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("gbolt_gut_f")); + if (gutBolt && gut) + { + GhoulID gutSeq=0; + GhoulID tempNote=0; + + //changed this to false, can't cache new seqs in after instances are created --ss + gutSeq=game_ghoul.FindObjectSequence(gut,"g_exit_guts_anim1"); + if (gutSeq) + { + gutBolt->PlaySequence(gutSeq, level.time, 0.0, true, IGhoulInst::Hold); + // Setup call to twitchy gut when done playing sequence + tempNote=gut->GetMyObject()->FindNoteToken("EOS"); + if (tempNote) + { + gutBolt->GetInstPtr()->AddNoteCallBack(&theGutCallback,tempNote); + } + } + } + } + } + if ((gzone_levels[newlevel-1][i] != NULL_GhoulID) && (!lock_gorezones)) + { + myInstance->GetInstPtr()->SetFrameOverride("gz",gzone_levels[newlevel-1][i],frontHole->id); + if (frontHole->buddyzone != numGoreZones && gzones[frontHole->buddyzone].id) + { + gzones[frontHole->buddyzone].damage=frontHole->damage; + gzones[frontHole->buddyzone].damage_level=frontHole->damage_level; + monster.ghoulInst->SetPartOnOff(gzones[frontHole->buddyzone].id, true); + myInstance->GetInstPtr()->SetFrameOverride("gz",gzone_levels[newlevel-1][i],gzones[frontHole->buddyzone].id); + } + } + if (!lock_gorezones) + { + frontHole->damage_level=newlevel; + } + } + if (monster.health <= take) + { + if (frontHole->cap && (ai_goretest->value || (dflags & DT_SEVER) || (dflags & DT_MANGLE) || (frontHole->damage>500))) +// if (frontHole->blownCap && (ai_goretest->value || (dflags & DT_SEVER) || (dflags & DT_MANGLE) || (frontHole->damage>500))) + { + qboolean allowSever = true; + +// if (!(dflags & DT_MANGLE)) + { + // don't allow torso separation unless DT_MANGLE is specified + if (frontHole->blowme->area==GBLOWNAREA_CHEST) + { + allowSever = false; + } + } + if ((allowSever) && (!lock_sever)) + { + edict_t *danglyBit = NULL; + if (frontHole->blowme->area == GBLOWNAREA_HEAD) // we're gonna sever the head + { + // no head, no sound + SetVocalCordsWorking(false); + Emote(monster, EMOTION_DEAD, 1.0); + // chunky exploding head goodness + GhoulID tempBolt; + tempBolt=monster.ghoulInst->GetGhoulObject()->FindPart("sbolt_mouth"); + if (tempBolt) + { + int numchunks = gi.irand(1,3); + VectorClear(debrisNorm); + FX_ThrowDebris(point,debrisNorm, numchunks, DEBRIS_SM, MAT_ROCK_FLESH, 0, 0, 0, SURF_BLOOD); + numchunks = gi.irand(3,6); + FX_ThrowDebris(point,debrisNorm, numchunks, DEBRIS_TINY, MAT_ROCK_FLESH, 0, 0, 0, SURF_BLOOD); + FX_HeadExplosion(&monster, tempBolt); + gi.sound (&monster, CHAN_BODY, gi.soundindex ("impact/gore/headexp.wav"), .6, ATTN_NORM, 0); + } + } + UpdateFace(monster); + if (frontHole->blowme->area != GBLOWNAREA_HEAD) + { + danglyBit=MakeBlownPart(monster, frontCode, dir, &blownInst); + } + if (frontHole->blownCapBolt && blownInst) + { + if (frontHole->capPiece) + { + if (frontHole->capPieceBolt) + { + AddBoltedItem(monster, frontHole->blownCapBolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), frontHole->capPieceBolt, blownInst); + } + else + { + AddBoltedItem(monster, frontHole->blownCapBolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), "to_gbolt", blownInst); + } + } + else + { + AddBoltedItem(monster, frontHole->blownCapBolt, "Enemy/bolt", "g_cap1", "to_gbolt", blownInst); + } + } + if (frontHole->blownCap) + { + if (danglyBit && danglyBit->ghoulInst) + { + danglyBit->ghoulInst->SetPartOnOff(frontHole->blownCap,true); + danglyBit->ghoulInst->SetFrameOverride("c","c_blood",frontHole->blownCap); + } + } +// BlowZone(monster,frontHole->childzone,frontHole->childzone,danglyBit); + BlowZone(monster,frontCode,frontCode,danglyBit); + BlowPart(monster,frontHole->blowme,danglyBit); + blewOneOff = true; + if (frontHole->cap) + { + myInstance->GetInstPtr()->SetFrameOverride("c","c_blood",frontHole->cap); + } + if (frontHole->capbolt) + { + if (frontHole->capPiece) + { + if (frontHole->capPieceBolt) + { + AddBoltedItem(monster, frontHole->capbolt, frontHole->capPiece, frontHole->capPiece->GetSubName(), frontHole->capPieceBolt, myInstance); + } + else + { + AddBoltedItem(monster, frontHole->capbolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), "to_gbolt", myInstance); + } + } + else + { + AddBoltedItem(monster, frontHole->capbolt, "Enemy/bolt", "g_cap1", "to_gbolt", myInstance); + } + if (frontHole->capPiece && !strcmp(frontHole->capPiece->GetSubName(), "g_half_head")) + { + // for the half head bolt on, we want to put the living guy's skins on the new bolt on + char headSkinName[128]; + char faceSkinName[128]; + + GhoulID headSkin = monster.ghoulInst->GetFrameOverride("h"); + if (headSkin) + { + monster.ghoulInst->GetGhoulObject()->GetSkinName(headSkin, headSkinName); + myInstance->GetBoltInstance(frontHole->capbolt)->GetInstPtr()->SetFrameOverride("h", headSkinName, ""); + } + + GhoulID faceSkin = monster.ghoulInst->GetFrameOverride("f"); + if (faceSkin) + { + monster.ghoulInst->GetGhoulObject()->GetSkinName(faceSkin, faceSkinName); + myInstance->GetBoltInstance(frontHole->capbolt)->GetInstPtr()->SetFrameOverride("f", faceSkinName, ""); + } + + myInstance->GetBoltInstance(frontHole->capbolt)->GetInstPtr()->SetFrameOverride("gz", "gz_half_head"); + } + FX_BloodCloud(&monster, frontHole->capbolt, 100); + } + + if ((danglyBit) || (frontHole->blowme->area == GBLOWNAREA_HEAD)) + { + if (frontHole->parent_id) + { + myInstance->GetInstPtr()->SetPartOnOff(frontHole->parent_id,false); + } + if (frontHole->id) + { + myInstance->GetInstPtr()->SetPartOnOff(frontHole->id,false); + } + if (backHole && backHole->id) + { + myInstance->GetInstPtr()->SetPartOnOff(backHole->id,false); + } + if (frontHole->cap) + { + myInstance->GetInstPtr()->SetPartOnOff(frontHole->cap,true); + } + } + } + } + } + else + { + //Fixme - this currently overrides all other sounds :/ + VoiceGeneralSound("Hit", monster, 3); + } + } + if ((spout == -1) && monster.health < take)//fixme: this should only be used once, so no callback jive please. + { + if (frontHole->capbolt) + { + monster.ghoulInst->AddMatrixCallBack(&TheSetVectorCallback,frontHole->capbolt,IGhoulInst::MatrixType::Entity); + spout = frontHole - gzones; + } + else if (frontHole->bolt) + { + monster.ghoulInst->AddMatrixCallBack(&TheSetVectorCallback,frontHole->bolt,IGhoulInst::MatrixType::Entity); + spout = frontHole - gzones; + } + else + { + VectorClear(monster.pos1); + spout = frontHole - gzones; + } + } + + if ((monster.health < take) && frontHole && frontHole->id /*&& gi.irand(0,1)*/) + { // Just do some blood, If the character is dead, I don't believe we have yet spawned blood... + if (frontHole->bolt) + FX_BloodCloud(&monster, frontHole->bolt, 50); + else if (frontHole->capbolt) + FX_BloodCloud(&monster, frontHole->capbolt, 50); + } + + return blewOneOff; +} + +void bodyhuman_c::HealGoreZones(edict_t &monster, int damagedHealth, int healedHealth) +{ // repair a certain number of gore zones based on how badly damaged we were + //and how much better we are now that we're healed. + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + + // for starters, heal all of 'em + if (myInstance && monster.ghoulInst) + { + for (int j = 0; j < numGoreZones; j++) + { + if (gzones[j].id) + { + gzones[j].damage=0; + gzones[j].damage_level=0; + monster.ghoulInst->SetPartOnOff(gzones[j].id, false); + } + } + } +} + +#define MAX_FRONTCODES 5 + +extern int bulletTraceHitCheck(trace_t *tr, vec3_t start, vec3_t end, int clipMask); + +void DropKnife(edict_t &monster, edict_t *knife) +{ + vec3_t vTemp; + Matrix4 m; + + if (NULL == knife->ghoulInst) + { + return; + } + VectorScale(knife->pos1, -1, vTemp); // velocity's in pos1 + VectorNormalize(vTemp); // ouch + VectorMA(monster.s.origin, 40, vTemp, knife->s.origin); + VectorClear(knife->velocity); + // make sure it's laying flat + knife->ghoulInst->GetXForm(m); + m.Rotate(0, M_PI*-0.5); + m.CalcFlags(); + knife->ghoulInst->SetXForm(m); + knife->gravity = 1.0; + if(dm->isDM()) + { // can't have these piling up... + knife->think = G_FreeEdict; + knife->nextthink = level.time + 30.0; + } + // stop that infernal spinning! + VectorClear(knife->avelocity); + knife->owner = NULL; + knife->spawnflags|=DROPPED_ITEM; + I_SpawnKnife(knife); + knife->elasticity = 253; // flag this entity so knifeThrowCollide won't free it +} + + +qboolean CheckBackStab(edict_t &monster, vec3_t origin) +{ + vec3_t myFacing, dmgFacing; + + AngleVectors(monster.s.angles, myFacing, NULL, NULL); + + VectorSubtract(monster.s.origin, origin, dmgFacing); + VectorNormalize(dmgFacing); + + if(DotProduct(myFacing, dmgFacing) > .707) + {//nearly colinear - being hit from behind + return true; + } + + return false; +} + + +int bodyhuman_c::HandleNearMiss(edict_t &monster, edict_t *knife) +{ + Matrix4 EntityToWorld, WorldToEnt, BoltToEntity; + Vect3 vEntKnife, vKnife(*(Vect3*)&knife->s.origin), vEntBolt; + vec3_t vDist; + float fDist = 0, fBestDist = 999999; + int nBestZone = -1; + + EntToWorldMatrix(monster.s.origin, monster.s.angles, EntityToWorld); + WorldToEnt.Inverse(EntityToWorld); + // get position of knife (at time of collision with bbox) with respect to entity + WorldToEnt.XFormPoint(vEntKnife, vKnife); + + for (int j = 0; j < numGoreZones; j++) + { + if (gzones[j].bolt) + { + // get position of bolt with respect to entity + monster.ghoulInst->GetBoltMatrix(level.time,BoltToEntity,gzones[j].bolt, + IGhoulInst::MatrixType::Entity); + BoltToEntity.GetRow(3, vEntBolt); + VectorSubtract(*(vec3_t*)(&vEntBolt), *(vec3_t*)(&vEntKnife), vDist); + // get distance from current bolt to knife + fDist = VectorLengthSquared(vDist); + if (dm->isDM() && + ((j == GZ_HEAD_FRONT) || (j == GZ_HEAD_BACK) || (j == GZ_NECK)) ) + { // make headshots harder in deathmatch + if (fDist < 2500) + { + fDist *= 1.3f; + if (fDist < fBestDist) + { // current bolt is the closest one yet + fBestDist = fDist; + nBestZone = j; + } + } + } + else + { + if (fDist < fBestDist) + { // current bolt is the closest one yet + fBestDist = fDist; + nBestZone = j; + } + } + } + } + return nBestZone; +} + + +int bodyhuman_c::ResolveKnifeImpact(edict_t &monster, edict_t *inflictor, edict_t *attacker, int *nNearMissZone, vec3_t dir, vec3_t point, vec3_t origin, int *dflags) +{ + // need to perform special trace here, treating thrown knife like a bullet + trace_t tr; + vec3_t endPos, firePoint, fwd; + + // knife velocity is stored in pos1 (cuz knife->velocity is zero after impact) + VectorCopy(inflictor->pos1, fwd); + VectorAdd(attacker->s.origin, attacker->client->ps.viewoffset, firePoint); +// VectorCopy(attacker->s.origin, firePoint); + VectorMA(firePoint, 2, fwd, endPos); // gives a length of 1600 + + // 1/9/00 kef -- I'm fairly certain this won't screw anything up, and I _need_ to make this change so that + //NugBuddies and LeanBuddies will work, so I'm passing in 'attacker' instead of 'inflictor' + gi.polyTrace(firePoint, NULL, NULL, endPos, attacker, CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_DEADMONSTER|CONTENTS_SHOT, + &tr, bulletTraceHitCheck); + if (0 == bullet_numHits) + { // entered this guy's bbox but missed him. in a perfect world we'd be able to allow + //the knife to fly along its merry way til it actually hits something, but for now i'll + //just drop it here + if ( (*nNearMissZone = HandleNearMiss(monster, inflictor)) == -1) + { // couldn't find a zone anywhere near the knife + return 0; + } + // make headshots a little tougher in deathmatch + if ( dm->isDM() && (*nNearMissZone < GZ_SHLDR_RIGHT_FRONT) ) + { + vec3_t monsterFwd; + bool bAttackerInFront = false; + + if (0 == *nNearMissZone && (gi.irand(0, 1) != 0)) // GZ_HEAD_FRONT + { + *nNearMissZone = GZ_SHLDR_RIGHT_FRONT; + } + else if (1 == *nNearMissZone && (gi.irand(0, 1) != 0)) // GZ_HEAD_BACK + { + *nNearMissZone = GZ_SHLDR_RIGHT_BACK; + } + else if ((2 == *nNearMissZone) && (gi.irand(0,1) != 0))// GZ_NECK + { + AngleVectors(monster.s.angles, monsterFwd, NULL, NULL); + bAttackerInFront = (DotProduct(monsterFwd, fwd) < 0); + *nNearMissZone = bAttackerInFront?GZ_CHEST_FRONT:GZ_CHEST_BACK; + } + } + } + VectorCopy(fwd, dir); + VectorCopy(endPos, point); + VectorCopy(firePoint, origin); + *dflags = DT_PROJECTILE; + + return 69; +} + +void PrintGoreZones(gz_code *listOfZones, int numOfZones) +{ + for (int i = 0; i < numOfZones; i++) + { + switch(listOfZones[i]) + { + case GZ_HEAD_FRONT: + gi.dprintf("GZ_HEAD_FRONT "); + break; + case GZ_HEAD_BACK: + gi.dprintf("GZ_HEAD_BACK "); + break; + case GZ_NECK: + gi.dprintf("GZ_NECK "); + break; + case GZ_SHLDR_RIGHT_FRONT: + gi.dprintf("GZ_SHLDR_RIGHT_FRONT "); + break; + case GZ_SHLDR_RIGHT_BACK: + gi.dprintf("GZ_SHLDR_RIGHT_BACK "); + break; + case GZ_SHLDR_LEFT_FRONT: + gi.dprintf("GZ_SHLDR_LEFT_FRONT "); + break; + case GZ_SHLDR_LEFT_BACK: + gi.dprintf("GZ_SHLDR_LEFT_BACK "); + break; + case GZ_CHEST_FRONT: + gi.dprintf("GZ_CHEST_FRONT "); + break; + case GZ_CHEST_BACK: + gi.dprintf("GZ_CHEST_BACK "); + break; + case GZ_ARM_UPPER_RIGHT: + gi.dprintf("GZ_ARM_UPPER_RIGHT "); + break; + case GZ_ARM_UPPER_LEFT: + gi.dprintf("GZ_ARM_UPPER_LEFT "); + break; + case GZ_ARM_LOWER_RIGHT: + gi.dprintf("GZ_ARM_LOWER_RIGHT "); + break; + case GZ_ARM_LOWER_LEFT: + gi.dprintf("GZ_ARM_LOWER_LEFT "); + break; + case GZ_GUT_FRONT: + gi.dprintf("GZ_GUT_FRONT "); + break; + case GZ_GUT_BACK: + gi.dprintf("GZ_GUT_BACK "); + break; + case GZ_GROIN: + gi.dprintf("GZ_GROIN "); + break; + case GZ_LEG_UPPER_RIGHT_FRONT: + gi.dprintf("GZ_LEG_UPPER_RIGHT_FRONT "); + break; + case GZ_LEG_UPPER_RIGHT_BACK: + gi.dprintf("GZ_LEG_UPPER_RIGHT_BACK "); + break; + case GZ_LEG_UPPER_LEFT_FRONT: + gi.dprintf("GZ_LEG_UPPER_LEFT_FRONT "); + break; + case GZ_LEG_UPPER_LEFT_BACK: + gi.dprintf("GZ_LEG_UPPER_LEFT_BACK "); + break; + case GZ_LEG_LOWER_RIGHT: + gi.dprintf("GZ_LEG_LOWER_RIGHT "); + break; + case GZ_LEG_LOWER_LEFT: + gi.dprintf("GZ_LEG_LOWER_LEFT "); + break; + case GZ_FOOT_RIGHT: + gi.dprintf("GZ_FOOT_RIGHT "); + break; + case GZ_FOOT_LEFT: + gi.dprintf("GZ_FOOT_LEFT "); + break; + case GZ_GUT_FRONT_EXTRA: + gi.dprintf("GZ_GUT_FRONT_EXTRA "); + break; + case GZ_GUT_BACK_EXTRA: + gi.dprintf("GZ_GUT_BACK_EXTRA "); + break; + } + } + gi.dprintf("\n"); +} + +// going to add to listOfFrontCodes random selections from the list presented in listOfChoices +void AddRandomGoreZones(gz_code *listOfFrontCodes, int *numOfFrontCodes, gz_code *listOfChoices, int numOfChoices, int nChoices) +{ + int newChoice = 0, swapVal = -1; + + if ((nChoices < 1) || (numOfChoices < 1)) + { + return; + } + if (nChoices > numOfChoices) + { + nChoices = numOfChoices; + } + for (int i = 0; i < nChoices; i++) + { + newChoice = gi.irand(i, numOfChoices-1); + swapVal = listOfChoices[i]; + listOfChoices[i] = listOfChoices[newChoice]; + listOfChoices[newChoice] = swapVal; + listOfFrontCodes[(*numOfFrontCodes)++]=listOfChoices[i]; + } +// PrintGoreZones(listOfChoices, nChoices); + +} + +void ShotgunStand(edict_t &monster, vec3_t origin, vec3_t point, gz_code *backCode, gz_code *listOfFrontCodes, int *numOfFrontCodes) +{ + vec3_t myFacing, dmgFacing, mySide, myUp, preNormFacing; + bool bHitFromBehind = false; + int headShotChance = 10; // default to one-in-ten chance + bool bShotsAimingUp = false; + float monsterHeadHeight = monster.s.origin[2] + monster.maxs[2]; + gz_code listOfChoices[NUM_HUMANGOREZONES]; + +// memset(listOfChoices, 9, sizeof(gz_code)*NUM_HUMANGOREZONES); + +// just here for reference... +// +// InitBBoxPreset(BBOX_PRESET_STAND, -16, -16, -32, 16, 16, 41); // scaled-up 8/7ths +// + VectorCopy(monster.s.angles, preNormFacing); + preNormFacing[2] = 0; + AngleVectors(preNormFacing, myFacing, mySide, myUp); + + VectorSubtract(monster.s.origin, origin, dmgFacing); + // make sure you set bShotsAimingUp _before_ you normalize the dmgFacing + bShotsAimingUp = (dmgFacing[2] > 0); + dmgFacing[2] = 0; + VectorNormalize(dmgFacing); + + // if our shot is coming from above, higher chance for a headshot. if it's coming from below and hits + //near the top of our bbox, higher chance then, too. + if (origin[2] > monster.s.origin[2]) + { // shot's coming from above + headShotChance = 6; + } + else if (bShotsAimingUp) + { + // 'point' is where the damage intersects monster's bbox + if (abs(point[2]-monsterHeadHeight) < 10) + { + headShotChance = 4; + } + } + bHitFromBehind = (DotProduct(myFacing, dmgFacing) > .707); + + if (point[2] > monster.s.origin[2]) + { // hit above the belt + if(bHitFromBehind) + {//nearly colinear - being hit from behind + *backCode=GZ_CHEST_FRONT; + // hit at least one gz + listOfChoices[0] = GZ_CHEST_BACK; + listOfChoices[1] = GZ_SHLDR_LEFT_BACK; + listOfChoices[2] = GZ_SHLDR_RIGHT_BACK; + listOfChoices[3] = GZ_GUT_BACK; + memset(&listOfChoices[4], GZ_GUT_BACK, NUM_HUMANGOREZONES - 4); + AddRandomGoreZones(listOfFrontCodes, numOfFrontCodes, listOfChoices, 4, gi.irand(1, 4)); + // small chance of hitting the head + if (0 == gi.irand(0, headShotChance)) + { + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_HEAD_BACK; + } + } + else if(DotProduct(myFacing, dmgFacing) < -.707) + {//in the front - ow! + *backCode=GZ_CHEST_BACK; + listOfChoices[0] = GZ_CHEST_FRONT; + listOfChoices[1] = GZ_SHLDR_LEFT_FRONT; + listOfChoices[2] = GZ_SHLDR_RIGHT_FRONT; + listOfChoices[3] = GZ_GUT_FRONT; + memset(&listOfChoices[4], GZ_GUT_FRONT, NUM_HUMANGOREZONES - 4); + AddRandomGoreZones(listOfFrontCodes, numOfFrontCodes, listOfChoices, 4, gi.irand(1, 4)); + // small chance of hitting the head + if (0 == gi.irand(0, headShotChance)) + { + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_HEAD_FRONT; + } + } + else if(DotProduct(mySide, dmgFacing) > 0) + {//um... + *backCode=GZ_CHEST_BACK; + listOfChoices[0] = GZ_CHEST_FRONT; + listOfChoices[1] = GZ_ARM_UPPER_LEFT; + listOfChoices[2] = GZ_GUT_BACK; + listOfChoices[3] = GZ_SHLDR_LEFT_BACK; + memset(&listOfChoices[4], GZ_SHLDR_LEFT_BACK, NUM_HUMANGOREZONES - 4); + AddRandomGoreZones(listOfFrontCodes, numOfFrontCodes, listOfChoices, 4, gi.irand(1, 4)); + // small chance of hitting the head + if (0 == gi.irand(0, headShotChance)) + { + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_HEAD_FRONT; + } + } + else + {//er... + *backCode=GZ_CHEST_BACK; + listOfChoices[0] = GZ_CHEST_FRONT; + listOfChoices[1] = GZ_ARM_UPPER_RIGHT; + listOfChoices[2] = GZ_GUT_BACK; + listOfChoices[3] = GZ_SHLDR_RIGHT_BACK; + memset(&listOfChoices[4], GZ_SHLDR_RIGHT_BACK, NUM_HUMANGOREZONES - 4); + AddRandomGoreZones(listOfFrontCodes, numOfFrontCodes, listOfChoices, 4, gi.irand(1, 4)); + // small chance of hitting the head + if (0 == gi.irand(0, headShotChance)) + { + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_HEAD_FRONT; + } + } + } + else + { // hit below the belt + if(DotProduct(myFacing, dmgFacing) < 0) // from front + { + *backCode=GZ_LEG_UPPER_RIGHT_BACK; + listOfChoices[0] = GZ_LEG_UPPER_RIGHT_FRONT; + listOfChoices[1] = GZ_LEG_LOWER_RIGHT; + listOfChoices[2] = GZ_LEG_LOWER_LEFT; + listOfChoices[3] = GZ_LEG_UPPER_LEFT_FRONT; + memset(&listOfChoices[4], GZ_LEG_UPPER_LEFT_FRONT, NUM_HUMANGOREZONES - 4); + AddRandomGoreZones(listOfFrontCodes, numOfFrontCodes, listOfChoices, 4, gi.irand(1, 4)); + } + else // from back + { + *backCode=GZ_LEG_UPPER_RIGHT_FRONT; + listOfChoices[0] = GZ_LEG_UPPER_RIGHT_BACK; + listOfChoices[1] = GZ_LEG_LOWER_RIGHT; + listOfChoices[2] = GZ_LEG_LOWER_LEFT; + listOfChoices[3] = GZ_LEG_UPPER_LEFT_BACK; + memset(&listOfChoices[4], GZ_LEG_UPPER_LEFT_BACK, NUM_HUMANGOREZONES - 4); + AddRandomGoreZones(listOfFrontCodes, numOfFrontCodes, listOfChoices, 4, gi.irand(1, 4)); + } + } +} + +void ShotgunCrouch(edict_t &monster, vec3_t origin, vec3_t point, gz_code *backCode, gz_code *listOfFrontCodes, int *numOfFrontCodes) +{ + vec3_t myFacing, dmgFacing, mySide, myUp, preNormFacing; + bool bHitFromBehind = false; + int headShotChance = 10; // default to one-in-ten chance + bool bShotsAimingUp = false; + float monsterHeadHeight = monster.s.origin[2] + monster.maxs[2]; + gz_code listOfChoices[NUM_HUMANGOREZONES]; + +// just here for reference... +// +// InitBBoxPreset(BBOX_PRESET_CROUCH, -16, -16, -16, 16, 16, 28); +// + VectorCopy(monster.s.angles, preNormFacing); + preNormFacing[2] = 0; + AngleVectors(preNormFacing, myFacing, mySide, myUp); + + // dmgFacing is the vector from the attacker to the intersection of the damage vector and the monster's bbox + VectorSubtract(point, origin, dmgFacing); + // make sure you set bShotsAimingUp _before_ you normalize the dmgFacing + bShotsAimingUp = (dmgFacing[2] > 0); + dmgFacing[2] = 0; + VectorNormalize(dmgFacing); + + // if our shot is coming from above, higher chance for a headshot. if it's coming from below and hits + //near the top of our bbox, higher chance then, too. + if (origin[2] > monster.s.origin[2]) + { // shot's coming from above + headShotChance = 6; + } + else if (bShotsAimingUp) + { + // 'point' is where the damage intersects monster's bbox + if (abs(point[2]-monsterHeadHeight) < 10) + { + headShotChance = 4; + } + } + bHitFromBehind = (DotProduct(myFacing, dmgFacing) > .707); + + if(bHitFromBehind) + {//nearly colinear - being hit from behind + *backCode=GZ_CHEST_FRONT; + listOfChoices[0] = GZ_CHEST_BACK; + listOfChoices[1] = GZ_SHLDR_LEFT_BACK; + listOfChoices[2] = GZ_SHLDR_RIGHT_BACK; + listOfChoices[3] = GZ_GUT_BACK; + memset(&listOfChoices[4], GZ_GUT_BACK, NUM_HUMANGOREZONES - 4); + AddRandomGoreZones(listOfFrontCodes, numOfFrontCodes, listOfChoices, 4, gi.irand(1, 4)); + // small chance of hitting the head + if (0 == gi.irand(0, headShotChance)) + { + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_HEAD_BACK; + } + } + else if(DotProduct(myFacing, dmgFacing) < -.707) + {//in the front - ow! + *backCode=GZ_CHEST_BACK; + listOfChoices[0] = GZ_CHEST_FRONT; + listOfChoices[1] = GZ_SHLDR_LEFT_FRONT; + listOfChoices[2] = GZ_SHLDR_RIGHT_FRONT; + listOfChoices[3] = GZ_GUT_FRONT; + listOfChoices[4] = GZ_LEG_UPPER_RIGHT_FRONT; + memset(&listOfChoices[5], GZ_LEG_LOWER_LEFT, NUM_HUMANGOREZONES - 5); + AddRandomGoreZones(listOfFrontCodes, numOfFrontCodes, listOfChoices, 5, gi.irand(1, 5)); + // small chance of hitting the head + if (0 == gi.irand(0, headShotChance)) + { + if (*numOfFrontCodes >= MAX_FRONTCODES) + { + listOfFrontCodes[MAX_FRONTCODES-1]=GZ_HEAD_FRONT; + } + else + { + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_HEAD_FRONT; + } + } + } + else if(DotProduct(mySide, dmgFacing) > 0) + {//um... + *backCode=GZ_CHEST_BACK; + listOfChoices[0] = GZ_CHEST_FRONT; + listOfChoices[1] = GZ_SHLDR_LEFT_FRONT; + listOfChoices[2] = GZ_LEG_UPPER_LEFT_FRONT; + listOfChoices[3] = GZ_ARM_LOWER_LEFT; + listOfChoices[4] = GZ_SHLDR_LEFT_BACK; + memset(&listOfChoices[5], GZ_LEG_LOWER_LEFT, NUM_HUMANGOREZONES - 5); + AddRandomGoreZones(listOfFrontCodes, numOfFrontCodes, listOfChoices, 5, gi.irand(1, 5)); + // small chance of hitting the head + if (0 == gi.irand(0, headShotChance)) + { + if (*numOfFrontCodes >= MAX_FRONTCODES) + { + listOfFrontCodes[MAX_FRONTCODES-1]=GZ_HEAD_FRONT; + } + else + { + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_HEAD_FRONT; + } + } + } + else + {//er... + *backCode=GZ_CHEST_BACK; + listOfChoices[0] = GZ_CHEST_FRONT; + listOfChoices[1] = GZ_SHLDR_RIGHT_FRONT; + listOfChoices[2] = GZ_LEG_UPPER_RIGHT_FRONT; + listOfChoices[3] = GZ_ARM_LOWER_RIGHT; + listOfChoices[4] = GZ_SHLDR_RIGHT_BACK; + memset(&listOfChoices[5], GZ_LEG_LOWER_RIGHT, NUM_HUMANGOREZONES - 5); + AddRandomGoreZones(listOfFrontCodes, numOfFrontCodes, listOfChoices, 5, gi.irand(1, 5)); + // small chance of hitting the head + if (0 == gi.irand(0, headShotChance)) + { + if (*numOfFrontCodes >= MAX_FRONTCODES) + { + listOfFrontCodes[MAX_FRONTCODES-1]=GZ_HEAD_FRONT; + } + else + { + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_HEAD_FRONT; + } + } + } +} + +void ShotgunProne(edict_t &monster, vec3_t origin, vec3_t point, gz_code *backCode, gz_code *listOfFrontCodes, int *numOfFrontCodes) +{ +} + +void ShotgunLayBack(edict_t &monster, vec3_t origin, vec3_t point, gz_code *backCode, gz_code *listOfFrontCodes, int *numOfFrontCodes) +{ +} + +void bodyhuman_c::ChooseShotgunGoreZones(edict_t &monster, vec3_t origin, vec3_t point, gz_code *backCode, gz_code *listOfFrontCodes, int *numOfFrontCodes) +{ + // 'point' is supposedly the worldspace intersection of the damage vector and monster's bbox + + vec3_t myFacing, dmgFacing, mySide, myUp, preNormFacing; + bool bHitFromBehind = false; + + VectorCopy(monster.s.angles, preNormFacing); + preNormFacing[2] = 0; + AngleVectors(preNormFacing, myFacing, mySide, myUp); + + VectorSubtract(monster.s.origin, origin, dmgFacing); + dmgFacing[2] = 0; + VectorNormalize(dmgFacing); + + bHitFromBehind = (DotProduct(myFacing, dmgFacing) > .707); + + // if our magic shot hit a gore zone, that's where we want to focus our damage + if (s_FrontCode != NUM_HUMANGOREZONES) + { + switch (s_FrontCode) + { + case GZ_HEAD_FRONT: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_NECK; + break; + case GZ_HEAD_BACK: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_NECK; + break; + case GZ_NECK: + if (bHitFromBehind) + { + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_HEAD_BACK; + } + else + { + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_HEAD_FRONT; + } + break; + case GZ_SHLDR_RIGHT_FRONT: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_LEFT_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_CHEST_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_ARM_UPPER_RIGHT; + break; + case GZ_SHLDR_RIGHT_BACK: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_LEFT_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_CHEST_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_ARM_UPPER_RIGHT; + break; + case GZ_SHLDR_LEFT_FRONT: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_RIGHT_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_CHEST_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_ARM_UPPER_LEFT; + break; + case GZ_SHLDR_LEFT_BACK: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_RIGHT_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_CHEST_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_ARM_UPPER_LEFT; + break; + case GZ_CHEST_FRONT: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_RIGHT_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_LEFT_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GUT_FRONT; + break; + case GZ_CHEST_BACK: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_RIGHT_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_LEFT_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GUT_BACK; + break; + case GZ_ARM_UPPER_RIGHT: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_RIGHT_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_ARM_LOWER_RIGHT; + break; + case GZ_ARM_UPPER_LEFT: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_LEFT_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_ARM_LOWER_LEFT; + break; + case GZ_ARM_LOWER_RIGHT: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_ARM_UPPER_RIGHT; + break; + case GZ_ARM_LOWER_LEFT: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_ARM_UPPER_LEFT; + break; + case GZ_GUT_FRONT: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_RIGHT_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_CHEST_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GROIN; + break; + case GZ_GUT_BACK: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_LEFT_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_CHEST_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_RIGHT_BACK; + break; + case GZ_GROIN: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GROIN; + break; + case GZ_LEG_UPPER_RIGHT_FRONT: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GROIN; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_LEG_LOWER_RIGHT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GUT_FRONT; + break; + case GZ_LEG_UPPER_RIGHT_BACK: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GROIN; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_LEG_LOWER_RIGHT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GUT_BACK; + break; + case GZ_LEG_UPPER_LEFT_FRONT: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GROIN; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_LEG_LOWER_LEFT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GUT_FRONT; + break; + case GZ_LEG_UPPER_LEFT_BACK: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GROIN; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_LEG_LOWER_LEFT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GUT_BACK; + break; + case GZ_LEG_LOWER_RIGHT: + if (bHitFromBehind) + { + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_LEG_UPPER_RIGHT_BACK; + } + else + { + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_LEG_UPPER_RIGHT_FRONT; + } + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_FOOT_RIGHT; + break; + case GZ_LEG_LOWER_LEFT: + if (bHitFromBehind) + { + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_LEG_UPPER_LEFT_BACK; + } + else + { + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_LEG_UPPER_LEFT_FRONT; + } + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_FOOT_LEFT; + break; + case GZ_FOOT_RIGHT: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_LEG_LOWER_RIGHT; + break; + case GZ_FOOT_LEFT: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_LEG_LOWER_LEFT; + break; + case GZ_GUT_FRONT_EXTRA: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_RIGHT_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_CHEST_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GROIN; + break; + case GZ_GUT_BACK_EXTRA: + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_LEFT_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_CHEST_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_RIGHT_BACK; + break; + } + } + else + { + // 12/29/99 kef -- sadly, we need to check in here if the guy is standing, crouched, or prone + if (NULL == currentmove) + { + ShotgunStand(monster, origin, point, backCode, listOfFrontCodes, numOfFrontCodes); + } + else + { + switch(currentmove->bbox) + { + case BBOX_PRESET_STAND: + ShotgunStand(monster, origin, point, backCode, listOfFrontCodes, numOfFrontCodes); + break; + case BBOX_PRESET_CROUCH: + ShotgunCrouch(monster, origin, point, backCode, listOfFrontCodes, numOfFrontCodes); + break; + case BBOX_PRESET_PRONE: + case BBOX_PRESET_LAYFRONT: + ShotgunCrouch(monster, origin, point, backCode, listOfFrontCodes, numOfFrontCodes); + break; + case BBOX_PRESET_LAYBACK: + case BBOX_PRESET_LAYSIDE: + ShotgunCrouch(monster, origin, point, backCode, listOfFrontCodes, numOfFrontCodes); + break; + default: // no clue what to do here + ShotgunStand(monster, origin, point, backCode, listOfFrontCodes, numOfFrontCodes); + break; + } + } + } + s_FrontCode = NUM_HUMANGOREZONES; +} + +void bodyhuman_c::ChooseDirectionalGoreZones(edict_t &monster, vec3_t origin, gz_code *backCode, gz_code *listOfFrontCodes, int *numOfFrontCodes) +{ + vec3_t myFacing, dmgFacing, mySide; + + AngleVectors(monster.s.angles, myFacing, mySide, 0); + + VectorSubtract(monster.s.origin, origin, dmgFacing); + VectorNormalize(dmgFacing); + + if(DotProduct(myFacing, dmgFacing) > .707) + {//nearly colinear - being hit from behind + *backCode=GZ_CHEST_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_CHEST_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_LEFT_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_RIGHT_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GUT_BACK; + } + else if(DotProduct(myFacing, dmgFacing) < -.707) + {//in the front - ow! + *backCode=GZ_CHEST_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_CHEST_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_LEFT_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_RIGHT_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GUT_FRONT; + } + else if(DotProduct(mySide, dmgFacing) > 0) + {//um... + *backCode=GZ_CHEST_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_CHEST_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_ARM_UPPER_LEFT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GUT_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_LEFT_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GUT_FRONT; + + } + else + {//er... + *backCode=GZ_CHEST_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_CHEST_FRONT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_ARM_UPPER_RIGHT; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GUT_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_SHLDR_RIGHT_BACK; + listOfFrontCodes[(*numOfFrontCodes)++]=GZ_GUT_FRONT; + } +} + +int bodyhuman_c::GetProjectileFrontHole(edict_t &monster, edict_t *attacker, vec3_t origin, vec3_t dir, vec3_t point, gz_code *backCode, + int nNearMissZone, bool bKnife, ggOinstC *myInstance, ggBinstC *boltPiece, + vec3_t ExitPos, Vect3 EntryPos, Matrix4 ZoneMatrix, Vect3 zonePos, Vect3 Direction, + int *take, ggBinstC *oldLeftWeap, ggBinstC *oldRightWeap, int *numOfFrontCodes, + gz_code *frontCode, bool *EntryPosIsValid, gz_code *listOfFrontCodes) +{ + int i, j,backHoleHitNum; + float bestGoreDist, tdist; + float curGoreDist; + vec3_t tvec; + + + //NO HITS!!! + if (bullet_numHits == 0 && (nNearMissZone == -1) ) + { + //if i'm a client, try again :( + if (monster.client && monster.ghoulInst) + { + } + if (bullet_numHits == 0) + { +// gi.dprintf("Missed!\n"); + return 0; + } + } + + AI_GORETEST_PRINTF("%d hits!\n", bullet_numHits); + if (!bKnife) + { + //get exit wound + //doing exit wound first, so i can get multiple entry wounds and stop consideration at the exit wound--the other way around wouldn't work: only want one exit wound. + for (i=bullet_numHits-1;i>=0;i--) + { + //hit my instance + if (bullet_Hits[i].Inst==myInstance->GetInstPtr()) + { + //hit something + if (bullet_Hits[i].Mesh) + { + boltPiece=NULL;//don't blow stuff off that got hit after this. + + + //don't already have a backhole + if (*backCode==numGoreZones) + { + VectorScale(*(vec3_t*)(&bullet_EntDir),bullet_Hits[i].Distance,ExitPos); + Vec3AddAssign(*(vec3_t*)(&bullet_EntStart), ExitPos); + AI_GORETEST_PRINTF("Exit wound position: %2.2f %2.2f %2.2f\n",ExitPos[0],ExitPos[1],ExitPos[2]); + tdist=bestGoreDist=9999999; + for (j=0;jbullet_Hits[i].Distance) + { + tdist=bullet_Hits[i].Distance; + *backCode = (gz_code)j; + AI_GORETEST_PRINTF("Setting backHole to %s\n",gznames[j]); + } + } + else + { + //is this a better match than what's already in fronthole? + bullet_Hits[i].Inst->GetBoltMatrix(level.time,ZoneMatrix,gzones[j].bolt,IGhoulInst::MatrixType::Entity); + ZoneMatrix.GetRow(3,zonePos); + AI_GORETEST_PRINTF("Zone's bolt position: %2.2f %2.2f %2.2f\n",zonePos[0],zonePos[1],zonePos[2]); + VectorSubtract(ExitPos,*(vec3_t*)(&zonePos),tvec); + curGoreDist = VectorLengthSquared(tvec); + if (*backCode==numGoreZones || curGoreDistFindBoltInstance(bullet_Hits[i].Inst); + } + } + } // if (!bKnife) + else + { + backHoleHitNum = bullet_numHits - 1; + } + + bool hitEnemyAfterBoltOn = true; + + //if the first thing this shot hit was a bolt-on, try to blow it off. + if (boltPiece && boltPiece->GetBolterBolt()) + { + hitEnemyAfterBoltOn = false; + + int k; + VectorScale(dir,tdist,*(vec3_t*)(&EntryPos)); + for (k=0;k<3;k++) + { + EntryPos[k]+=point[k]; + } + if (SpecialActionBoltOn(monster, boltPiece, EntryPos, Direction, *take)) + { // e.g. shooting the air tanks off of a Serbian soldier + return 99999; + } + else + { + bool bTooToughToDropWeapon = false, bHitAWeapon = false; + float fArmorPercentLeft = GetArmorPercentRemaining(); + float fHealthPercentLeft = (float)monster.health / (float)monster.max_health; + + ai_c *my_ai = (ai_c *)((ai_public_c *)monster.ai); + + // if this is an armored guy... + //only let him drop his gun if he's down to < 50% armor or < 50% health. + if(my_ai && !(my_ai->GetMySkills()->getDropWeap())) + { // rocket guys dropping their guns is weak + bTooToughToDropWeapon = true; + } + if ( (fArmorPercentLeft > 0.50) && (fHealthPercentLeft > 0.50) ) + { + bTooToughToDropWeapon = true; + } + bHitAWeapon = (GetWeaponType(boltPiece) != SFW_EMPTYSLOT); + if(monster.flags & FL_IAMTHEBOSS) + { // the boss hates it when you shoot his weapon. So do so. + } + else if ( (bHitAWeapon && !bTooToughToDropWeapon) || + (!bHitAWeapon) || + dm->isDM()) + { + *take = DropBoltOn(monster, boltPiece, EntryPos, Direction, *take, attacker); + + } + else if (bHitAWeapon && bTooToughToDropWeapon) + { // if we hit a weapon but this guy is too tough to drop it yet, return + //some minimal amount of damage + return *take*.25; + } + } + + //did i get a weapon shot out of my hands??? + if(oldLeftWeap&&oldLeftWeap!=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l"))) + { + lWeaponShot=true; + } + if (oldRightWeap&&oldRightWeap!=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"))) + { + rWeaponShot=true; + } + + if (take == 0) // this is purty hacky, right hyaw... + { + return 1; + } + } + + //get entrance wound--stop at one! + for (i=0;iGetInstPtr()) + { + //hit something + if (bullet_Hits[i].Mesh) + { + hitEnemyAfterBoltOn = true; + + VectorScale(*(vec3_t*)(&bullet_EntDir),bullet_Hits[i].Distance,*(vec3_t*)(&EntryPos)); + EntryPos += bullet_EntStart; + AI_GORETEST_PRINTF("Entry wound position: %2.2f %2.2f %2.2f\n",EntryPos[0],EntryPos[1],EntryPos[2]); + tdist=bestGoreDist=9999999; + for (j=0;jbullet_Hits[i].Distance) + { + tdist=bullet_Hits[i].Distance; + *frontCode = (gz_code)j; + AI_GORETEST_PRINTF("Setting frontHole to %s\n",gznames[j]); + } + } + else + { + //is this a better match than what's already in fronthole? + bullet_Hits[i].Inst->GetBoltMatrix(level.time,ZoneMatrix,gzones[j].bolt,IGhoulInst::MatrixType::Entity); + ZoneMatrix.GetRow(3,zonePos); + AI_GORETEST_PRINTF("Candidate position: %2.2f %2.2f %2.2f\n",zonePos[0],zonePos[1],zonePos[2]); + VectorSubtract(*(vec3_t*)(&EntryPos),*(vec3_t*)(&zonePos),tvec); + curGoreDist = VectorLengthSquared(tvec); + if ( bKnife && dm->isDM() && + ((*frontCode == GZ_HEAD_FRONT) || (*frontCode == GZ_HEAD_BACK) || (*frontCode == GZ_NECK)) ) + { // make knife headshots harder in deathmatch + curGoreDist *= 1.3f; + if (*frontCode==numGoreZones || curGoreDistmonster.s.origin[k]+monster.maxs[k]) + { + EntryPos[k]=monster.s.origin[k]+monster.maxs[k]; + } + } + *EntryPosIsValid=true; + + listOfFrontCodes[(*numOfFrontCodes)++]=*frontCode; + } + } + } + } + if (!hitEnemyAfterBoltOn) + { + return 0; + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // MESSY PLAYER HEAD HACK BEGIN + /////////////////////////////////////////////////////////////////////////////////////////// + + //HOO BOY! LOOKIT DIS! YOU FUCKIN HOODHEADS THINK YOU'RE SO SPECIAL NOW, RIGHT? + if (monster.client && (*numOfFrontCodes == 1) && (*frontCode == GZ_HEAD_BACK) + && (gzones[*frontCode].parent_id == monster.ghoulInst->GetGhoulObject()->FindPart("_HOODHEAD"))) + { + Matrix4 ToEnt,ToWorld; + Vect3 transform; + int tempReturn; + GhoulID tempHole; + + monster.ghoulInst->SetPartOnOff("_HOODHEAD", false); + monster.ghoulInst->SetPartOnOff("_BALDHEAD", true); + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_baldhead"); + if (tempHole) + { + gzones[GZ_HEAD_BACK].parent_id=tempHole; + } + + EntToWorldMatrix(monster.s.origin,monster.s.angles,ToWorld); + //but we want to put the ray into ent space, need inverse + ToEnt.Inverse(ToWorld); + + VectorCopy(origin,*((vec3_t*)&transform)); + ToEnt.XFormPoint(bullet_EntStart,transform); + ToEnt.XFormVect(bullet_EntDir,*(Vect3 *)dir); + bullet_EntDir.Norm(); + bullet_numHits = monster.ghoulInst->RayTrace(level.time,bullet_EntStart,bullet_EntDir,bullet_Hits,20); + + //OH MY LORD I LIKE THIS! Also, it should be safe, as the hood head is now turned off--won't come back here infinitely + tempReturn = GetProjectileFrontHole(monster, attacker, origin, dir, point, backCode, + nNearMissZone, bKnife, myInstance, boltPiece, + ExitPos, EntryPos, ZoneMatrix, zonePos, Direction, + take, oldLeftWeap, oldRightWeap, numOfFrontCodes, + frontCode, EntryPosIsValid, listOfFrontCodes); + + monster.ghoulInst->SetPartOnOff("_HOODHEAD", true); + monster.ghoulInst->SetPartOnOff("_BALDHEAD", false); + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_hoodhead"); + if (tempHole) + { + gzones[GZ_HEAD_BACK].parent_id=tempHole; + } + return tempReturn; + } + + //HOO BOY! LOOKIT DIS! YOU FUCKIN MASKHEAD ASSHOLES THINK YOU'RE SPECIAL AS WELL, YES? + if (monster.client && *numOfFrontCodes == 1 && ((*frontCode == GZ_HEAD_BACK)||(*frontCode == GZ_HEAD_FRONT)) && + (gzones[*frontCode].parent_id == monster.ghoulInst->GetGhoulObject()->FindPart("_MASKHEAD"))) + { + Matrix4 ToEnt,ToWorld; + Vect3 transform; + int tempReturn; + GhoulID tempHole; + + monster.ghoulInst->SetPartOnOff("_MASKHEAD", false); + monster.ghoulInst->SetPartOnOff("_BALDHEAD", true); + monster.ghoulInst->SetPartOnOff("_COMFACE", true); + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_baldhead"); + if (tempHole) + { + gzones[GZ_HEAD_BACK].parent_id=tempHole; + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_COMFACE"); + if (tempHole) + { + gzones[GZ_HEAD_FRONT].parent_id=tempHole; + } + + EntToWorldMatrix(monster.s.origin,monster.s.angles,ToWorld); + //but we want to put the ray into ent space, need inverse + ToEnt.Inverse(ToWorld); + + VectorCopy(origin,*((vec3_t*)&transform)); + ToEnt.XFormPoint(bullet_EntStart,transform); + ToEnt.XFormVect(bullet_EntDir,*(Vect3 *)dir); + bullet_EntDir.Norm(); + bullet_numHits = monster.ghoulInst->RayTrace(level.time,bullet_EntStart,bullet_EntDir,bullet_Hits,20); + + //OH MY LORD I LIKE THIS! Also, it should be safe, as the hood head is now turned off--won't come back here infinitely + tempReturn = GetProjectileFrontHole(monster, attacker, origin, dir, point, backCode, + nNearMissZone, bKnife, myInstance, boltPiece, + ExitPos, EntryPos, ZoneMatrix, zonePos, Direction, + take, oldLeftWeap, oldRightWeap, numOfFrontCodes, + frontCode, EntryPosIsValid, listOfFrontCodes); + + monster.ghoulInst->SetPartOnOff("_MASKHEAD", true); + monster.ghoulInst->SetPartOnOff("_BALDHEAD", false); + monster.ghoulInst->SetPartOnOff("_COMFACE", false); + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_MASKHEAD"); + if (tempHole) + { + gzones[GZ_HEAD_BACK].parent_id=tempHole; + gzones[GZ_HEAD_FRONT].parent_id=tempHole; + } + return tempReturn; + } + + //sfs--while I'm making a mess here, might as well ignore shots that only hit a mohawk + if (monster.client && (*numOfFrontCodes == 0) + && (bullet_Hits[0].Mesh == monster.ghoulInst->GetGhoulObject()->FindPart("_MOHAWK"))) + { + return 0; + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // MESSY PLAYER HEAD HACK END + /////////////////////////////////////////////////////////////////////////////////////////// + + return -1; +} + + + +extern int hackGlobalGibCalls; + +int bodyhuman_c::ShowDamage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb) +{ + vec3_t bodyloc;//, footorigin; + gz_code listOfFrontCodes[MAX_FRONTCODES]; + int numOfFrontCodes=0; + gz_code frontCode=numGoreZones; + gz_code backCode=numGoreZones; + vec3_t forward, right, up; + vec3_t to_impact; + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + int i; + int take; + Vect3 EntryPos; + bool EntryPosIsValid=false; + vec3_t ExitPos; + Vect3 zonePos; + Vect3 Direction; + Matrix4 ZoneMatrix; + ggBinstC *oldLeftWeap, *oldRightWeap; + ggBinstC *boltPiece=NULL;//contender for being shot off + qboolean oneLimbSevered=false; + vec3_t debrisNorm; + bool bKnife = false; + bool bArmor = false; // need to know this to handle the knife properly + int nNearMissZone = -1; + + //first, store off what i got in my hands... + oldLeftWeap=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l")); + oldRightWeap=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r")); + + // if I'm taking damage from the neural pulse-a-majiggy, disable my vocal cords + if (dflags & DT_NEURAL) + { + SetVocalCordsWorking(false); + } + + // if we're the target of a scripted kill...well...we're gonna die right the heck now + switch(nNextShotKillsMe) + { + case NEXTSHOT_EXPLODE_MY_NUG: + { + dflags |= DT_SEVER; + // no break...intentional. + } + case NEXTSHOT_KILLS: + { + damage = 9999; + + // I suppose that bad things might happen if this flag is on and we get shot again + nNextShotKillsMe = NEXTSHOT_NULL; + break; + } + default: + break; + } + + for (i=0;i<3;i++) + { + Direction[i]=dir[i]; + } + + if (inflictor) + { + bKnife = ((254 == inflictor->elasticity) && attacker->client); + } + + if((dflags & DT_ENEMY_ROCKET) && (GetArmorCode() == ARMOR_FULL)) + { //these guys are immune to their own attack, at least for now. Maybe we adjust later? + return 0; + } + + //if unknown type of damage, don't even bother, just accept the value + + // 12/29/99 kef -- added DT_SEVER to this check. is that bad? sue me. + if( !(dflags & (DT_PROJECTILE|DT_MELEE|DT_DIRECTIONALGORE|DT_MANGLE|DT_SEVER)) && + !bKnife) + { + // if we fell, and realistic damage is on, take leg damage + if (dflags & DT_FALL) + { + VoiceGeneralSound("hit", monster, 3); + if ( dm->dmRule_REALISTIC_DAMAGE() ) + { + incMovescale(&monster,0.1); + } + } + return damage;//other tests? I dunno - knife should be here maybe too + } + else if (bKnife) + { + int knifeDamage = 69; + // determine gore zone that the knife will affect. Nearmiss things are handled here too. + knifeDamage = ResolveKnifeImpact(monster, inflictor, attacker, &nNearMissZone, dir, point, origin, &dflags); + if (knifeDamage == 0) + { + return 0; + } + } + + // For backstabs, we shall check to see if the attack came from behind. + if (dflags & DT_BACKSTAB) + { + if (CheckBackStab(monster, origin)) + damage *= 2.5; + } + + take = damage; + + //shotgun shot--plop on generic damage for now + // 12/29/99 kef -- Dan and I -- mostly Dan, in case this whole thing goes south -- changed this. + //using the DT_PROJECTILE check cuz we don't want the first magic shot + //from the shotgun attack (see fireSpas()) to go through ChooseShotgunGoreZones, only the actual damage that comes after + //said magic shot. + if ( ((dflags & DT_SHOTGUN) && !(dflags & DT_PROJECTILE)) || + ((dflags & DT_BACKSTAB) && (0 == bullet_numHits)) ) + { + //new, very random zone-chooser. + ChooseShotgunGoreZones(monster, origin, point, &backCode, listOfFrontCodes, &numOfFrontCodes); + // sad + if (dflags & DT_BACKSTAB) + { // a knife...only use one gorezone + numOfFrontCodes = 1; + if ((listOfFrontCodes[0] <= GZ_NECK) || (listOfFrontCodes[0] >= GZ_LEG_LOWER_RIGHT)) + { // dunno what to do here. punt. + listOfFrontCodes[0] = GZ_CHEST_BACK; + } + } + } + else if(dflags & DT_MANGLE) + { + // do stuff + if(dflags & DT_DIRECTIONALGORE) + { + // sort out what sort of damage should be shown based on which side is being pelted + // note that all of this is kind of a 2d representation of everything - good enough for now, I s'pose =/ + + ChooseDirectionalGoreZones(monster, origin, &backCode, listOfFrontCodes, &numOfFrontCodes); + } + } + else if(dflags & DT_DIRECTIONALGORE) + { + // sort out what sort of damage should be shown based on which side is being pelted + // note that all of this is kind of a 2d representation of everything - good enough for now, I s'pose =/ + + ChooseDirectionalGoreZones(monster, origin, &backCode, listOfFrontCodes, &numOfFrontCodes); + } + //projectile--go through the trace and get the best frontHole + else + { + int returnDamage = -1; + returnDamage = GetProjectileFrontHole(monster, attacker, origin, dir, point, &backCode, nNearMissZone, bKnife, myInstance, + boltPiece, ExitPos, EntryPos, ZoneMatrix, zonePos, Direction, &take, oldLeftWeap, oldRightWeap, &numOfFrontCodes, + &frontCode, &EntryPosIsValid, listOfFrontCodes); + // 12/29/99 kef -- shotguns may want to know if our "magic shot" hits a gore zone + s_FrontCode = frontCode; + if (returnDamage == 0) + { + return 0; + } + } + + //make adjustment for armor here--is this a good way to handle it? or should players & enemies handle armor the same? + if (monster.client) + { + int bodydmg = 0; + + if(dflags&DAMAGE_NO_ARMOR) + { + // Ignore protective effects of armor for armor-piercing weapons + bodydmg=take; + } + else if(!(dm->isDM()) || !(dm->dmRule_REALISTIC_DAMAGE()) || (numOfFrontCodes == 0)) + { + // Always adjust damage due to protective effects of armor in single player and non-realistic DM modes + bodydmg=monster.client->inv->adjustDamageByArmor(take, penetrate, absorb); + } + else + { + // Determine whether armor is protecting for each frontCode in Realistic DM + int damagePerZone = (int)((float)take / (float)numOfFrontCodes); + + for(int goreCount = 0; goreCount < numOfFrontCodes; goreCount++) + { + if(dm->IsUnprotectedGoreZone(listOfFrontCodes[goreCount])) + { + bodydmg += damagePerZone; + } + else + { + bodydmg += monster.client->inv->adjustDamageByArmor(damagePerZone, penetrate, absorb); + } + } + } + + if (bodydmg) + { + monster.flags |= FL_BODY_DAMAGE; + } + if (bodydmg < take) + { + bArmor = true; + monster.flags |= FL_ARMOR_DAMAGE; + take = bodydmg; + if (bodydmg<=0) + { + if (EntryPosIsValid) + { + vec3_t sparkdir; + AI_GORETEST_PRINTF("spraying sparks from %2.2f %2.2f %2.2f; monster pos %2.2f %2.2f %2.2f\n",EntryPos[0],EntryPos[1],EntryPos[2],monster.s.origin[0],monster.s.origin[1],monster.s.origin[2]); + VectorSubtract(origin,point,sparkdir); + VectorNormalize(sparkdir); + VectorScale(dir,-1.0f,sparkdir); + fxRunner.setDir(sparkdir); + if(absorb) + { + fxRunner.exec("weakspark", *((vec3_t*)&EntryPos));//eh, using same spark as walls now--hope that's ok + } + else if(penetrate) + { + fxRunner.exec("armorhit", *((vec3_t*)&EntryPos));//eh, using same spark as walls now--hope that's ok + } + else + { + fxRunner.exec("spark2", *((vec3_t*)&EntryPos));//eh, using same spark as walls now--hope that's ok + } + gi.sound (&monster, CHAN_AUTO, gi.soundindex ("impact/armor/hit.wav"), .6, ATTN_NORM, 0); + } + if (bKnife) + { // drop the knife where it hit the guy + DropKnife(monster, inflictor); + } + return 0; + } + } + } + + // if we're here because of a near miss from a thrown knife, fake a couple of things + if (nNearMissZone != -1) + { + numOfFrontCodes = 1; + listOfFrontCodes[0] = nNearMissZone; + } + + //update for monster armor here. if Mr. Monster's taking mangle damage, though, (e.g. c4) his + //armor don't mean squat. + if (monster.ai && !(dflags & DT_MANGLE)) + { + //go thru all front holes, distributing damage amongst the armor + for (i=0;i= 0 && frontCode < numGoreZones) + { + //if fronthole has armor, evaluate + if (gzones[frontCode].damage<0) + { + // kef -- I _think_ getting in here means we hit armor + bArmor = true; + + //first, show the armor damage (this may immediately switch over to bloodiness, but that should be ok) + if (gzones[frontCode].id&&myInstance->GetInstPtr()->SetFrameOverride("gz", "gz_armor", gzones[frontCode].id)) + { + myInstance->GetInstPtr()->SetPartOnOff(gzones[frontCode].id, true); + } + + //update buddy zone, if any + if (gzones[frontCode].buddyzoneGetInstPtr()->SetFrameOverride("gz", "gz_armor", gzones[gzones[frontCode].buddyzone].id)) + { + myInstance->GetInstPtr()->SetPartOnOff(gzones[gzones[frontCode].buddyzone].id, true); + } + + // this handles the special properties some of the weapons have regarding armor piercing / absorbtion + float penetrateDmg = 0; + if(gzones[frontCode].damage < 0) + { + take -= (take * absorb); + //penetrateDmg = take * penetrate; + //take -= penetrateDmg; + } + + float tempDmg;//to handle armor piercers + tempDmg = take; + if(penetrate > 0) + { + tempDmg *= 2; + } + + //all damage covered + if (tempDmg <= -gzones[frontCode].damage) + { + bodyDamage&=~BODYDAMAGE_RECENT; + gzones[frontCode].damage+=tempDmg; + + if (EntryPosIsValid) + { + vec3_t sparkdir; + AI_GORETEST_PRINTF("spraying sparks from %2.2f %2.2f %2.2f; monster pos %2.2f %2.2f %2.2f\n",EntryPos[0],EntryPos[1],EntryPos[2],monster.s.origin[0],monster.s.origin[1],monster.s.origin[2]); + VectorSubtract(origin,point,sparkdir); + VectorNormalize(sparkdir); + VectorScale(dir,-1.0f,sparkdir); + fxRunner.setDir(sparkdir); + if(absorb) + { + fxRunner.exec("weakspark", *((vec3_t*)&EntryPos));//eh, using same spark as walls now--hope that's ok + } + else if(penetrate) + { + fxRunner.exec("armorhit", *((vec3_t*)&EntryPos));//eh, using same spark as walls now--hope that's ok + } + else + { + fxRunner.exec("spark2", *((vec3_t*)&EntryPos));//eh, using same spark as walls now--hope that's ok + } + gi.sound (&monster, CHAN_AUTO, gi.soundindex ("impact/armor/hit.wav"), .6, ATTN_NORM, 0); +// FX_MakeSparks(*((vec3_t*)&EntryPos), sparkdir, 1); + } + // kef -- handle thrown knives properly + if (bKnife) + { // just drop the knife where it hit the guy + DropKnife(monster, inflictor); + } + return 0; + } + //not all damage covered + else + { + tempDmg+=gzones[frontCode].damage; + gzones[frontCode].damage=0; + } + if(penetrate > 0) + { // if we were destroying armor a second ago, return to our appropriate damage amount + tempDmg *= .5; + } + take = tempDmg; + } + } + } + } + + // kef -- if we get here with a boltPiece but numFrontCodes is 0, we hit a bolton but + //didn't hit any part of this monster's body. we've already dropped the bolton so just + //return 0 damage. + if ( (numOfFrontCodes == 0) && (boltPiece) ) + { + return 0; + } + // throw some fleshy debris chunks for the kiddies + if (!VectorCompare(point, vec3_origin)) + { + int numchunks = gi.irand(0,5); + VectorClear(debrisNorm); + FX_ThrowDebris(point,debrisNorm, numchunks, DEBRIS_TINY, MAT_ROCK_FLESH, 0, 0, 0, SURF_BLOOD); + } + + if (EntryPosIsValid) + { + AI_GORETEST_PRINTF("spraying blood from %2.2f %2.2f %2.2f; monster pos %2.2f %2.2f %2.2f\n",EntryPos[0],EntryPos[1],EntryPos[2],monster.s.origin[0],monster.s.origin[1],monster.s.origin[2]); + FX_MakeBloodSpray(ExitPos, dir, 200, 1, &monster); + } + + //for each of the front holes, scale the damage (this should cover massive headshot damage, and lower armshot damage) + if (!(dflags&DT_MANGLE)) // If I'm mangling, do full damage. + { + float newtake, totaltake=0; + + for (i=0;i= 0 && frontCode < numGoreZones) + { + //delay the gibbing as long as we can... + if (monster.health <= 0) + { + if (take > 0) + { + if (gzones[frontCode].cap) + { + totaltake += 3; + } + else + { + totaltake += 12; + } + } + } + else + { + newtake=(int)((float)take*gzones[frontCode].damScale); + if (dm->isDM() && dm->dmRule_REALISTIC_DAMAGE() && dm->IsLimbZone(frontCode)) + { + // can't kill a guy with limbshots in realstic DM + newtake = min(newtake, (int)(monster.health * .33)); + } + totaltake += newtake; + } + } + else + { // boy, this is not so good + assert(false); + } + } + + // Average the damage out between the codes. Multiple codes are mainly found for shotguns. + // Note that mangles don't use this code. --Pat + if (numOfFrontCodes>0) + { + take=totaltake/(float)numOfFrontCodes; + } + } + + AngleVectors(monster.s.angles, forward, right, up); + VectorSubtract(point, monster.s.origin, to_impact); + VectorNormalize(to_impact); + + Emote(monster, EMOTION_PAIN, 10.0); + + VectorSubtract(point, monster.s.origin, bodyloc); + + if (monster.health > 0 && take > monster.health+150) + { + take = monster.health + 150; + } + + //DON'T ADJUST TAKE AFTER THIS POINT!!!!!!! I CHECK TO SEE IF I'M DEAD HERE!!!!! + + //dying--drop weapons + if (monster.health <= take) + { + ggBinstC *bolted; + vec3_t handPos; + int safeIters=0; + Emote(monster, EMOTION_PAIN, 99999.0); + VectorSet(handPos,0,0,0); + + // this is a little sad, but we can't drop boltons if we were hit by a train + if (bDropBoltons) + { + // drop what's in left hand + monster.ghoulInst->GetBoltMatrix(level.time,ZoneMatrix,monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l"),IGhoulInst::MatrixType::Entity); + // EntToWorldMatrix(monster.s.origin, monster.s.angles, ZoneMatrix); + ZoneMatrix.GetRow(3,zonePos); + handPos[0]=zonePos[0]; + handPos[1]=zonePos[1]; + handPos[2]=zonePos[2]; + while (myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l"))&&safeIters++<10) + { + bolted=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l")); + DropBoltOn(monster, bolted, zonePos, Direction, take); + } + + //drop what's in right hand + monster.ghoulInst->GetBoltMatrix(level.time,ZoneMatrix,monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"),IGhoulInst::MatrixType::Entity); + // EntToWorldMatrix(monster.s.origin, monster.s.angles, ZoneMatrix); + ZoneMatrix.GetRow(3,zonePos); + handPos[0]=zonePos[0]; + handPos[1]=zonePos[1]; + handPos[2]=zonePos[2]; + safeIters=0; + while (myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"))&&safeIters++<10) + { + bolted=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r")); + DropBoltOn(monster, bolted, zonePos, Direction, take); + } + + //lose any headgear + monster.ghoulInst->GetBoltMatrix(level.time,ZoneMatrix,monster.ghoulInst->GetGhoulObject()->FindPart("abolt_head_t"),IGhoulInst::MatrixType::Entity); + // EntToWorldMatrix(monster.s.origin, monster.s.angles, ZoneMatrix); + ZoneMatrix.GetRow(3,zonePos); + handPos[0]=zonePos[0]; + handPos[1]=zonePos[1]; + handPos[2]=zonePos[2]; + safeIters=0; + while (myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("abolt_head_t"))&&safeIters++<10) + { + bolted=myInstance->GetBoltInstance(monster.ghoulInst->GetGhoulObject()->FindPart("abolt_head_t")); + DropBoltOn(monster, bolted, zonePos, Direction, take); + } + } // if (bDropBoltons) + + if (((dflags & DT_MANGLE) && (monster.health-take < -50)) || (monster.health-take < -750)) + { + hackGlobalGibCalls++; // only up the Gib count if we're smashing living guys + Gib(monster, dir, dflags); + if(dflags & DT_FIRE) + { //fireballs + Ignite(&monster, inflictor, 2); + } + } + + // right, then...we're dead. so find out how we died and, perhaps, silence our vocal cords. + if (AreVocalCordsWorking()) + { + if (dflags & DT_STEALTHY) + { // killed by a stealthy weapon so don't scream. + SetVocalCordsWorking(false); + } + } + + // Shut off associated looping sounds too... + monster.s.sound = 0; + monster.s.sound_data = 0; + } + + int hasArmor = 0; + + if (monster.client) + { + hasArmor=(monster.client->inv->getArmorCount()>0); + } + + for (i=0;i= 0) && (frontCode < NUM_HUMANGOREZONES) ); +// if (!Skill_NoPain(&monster)) +// { + // remember leg injury + if (frontCode==GZ_LEG_LOWER_RIGHT || frontCode == GZ_FOOT_RIGHT || + frontCode == GZ_LEG_UPPER_RIGHT_FRONT || frontCode == GZ_LEG_UPPER_RIGHT_BACK) + { + bodyDamage = BODYDAMAGE_RIGHTLEG|BODYDAMAGE_RECENT; + bodyDamageAccumulated |= BODYDAMAGE_RIGHTLEG; + if (dm->dmRule_REALISTIC_DAMAGE()) + { // reduce our movement due to leg damage + incMovescale(&monster,0.1); + } + bodyDamageEndRecent = level.time + gi.flrand(5.0,7.5)*Skill_DisablityModifier(&monster); + } + if (frontCode==GZ_LEG_LOWER_LEFT || frontCode == GZ_FOOT_LEFT || + frontCode == GZ_LEG_UPPER_LEFT_FRONT || frontCode == GZ_LEG_UPPER_LEFT_BACK) + { + bodyDamage = BODYDAMAGE_LEFTLEG|BODYDAMAGE_RECENT; + bodyDamageAccumulated |= BODYDAMAGE_LEFTLEG; + if (dm->dmRule_REALISTIC_DAMAGE()) + { // reduce our movement due to leg damage + incMovescale(&monster,0.1); + } + bodyDamageEndRecent = level.time + gi.flrand(5.0,7.5)*Skill_DisablityModifier(&monster); + } + //remember arm injury too + if (frontCode == GZ_ARM_UPPER_RIGHT || frontCode == GZ_ARM_LOWER_RIGHT) + { + bodyDamage = BODYDAMAGE_RIGHTARM|BODYDAMAGE_RECENT; + bodyDamageAccumulated |= BODYDAMAGE_RIGHTARM; + bodyDamageEndRecent = level.time + gi.flrand(5.0,7.5)*Skill_DisablityModifier(&monster); + } + if (frontCode == GZ_ARM_UPPER_LEFT || frontCode == GZ_ARM_LOWER_LEFT) + { + bodyDamage = BODYDAMAGE_LEFTARM|BODYDAMAGE_RECENT; + bodyDamageAccumulated |= BODYDAMAGE_LEFTARM; + bodyDamageEndRecent = level.time + gi.flrand(5.0,7.5)*Skill_DisablityModifier(&monster); + } +// } + + if (!oneLimbSevered) + { + // kef -- handle armor properly in case of throwing knife + if (bArmor && bKnife) + { + DropKnife(monster, inflictor); + // setting inflictor to NULL will prevent ShowFrontHoleDamage from sticking the knife in our boy. it + //shouldn't affect anything else in that fn, though. + inflictor = NULL; + } + if(!(dm->isDM()) || !hasArmor || (!(dm->dmRule_REALISTIC_DAMAGE()) || dm->IsUnprotectedGoreZone(frontCode))) + { +// We don't want to ShowFrontHoleDamage if we are in Realistic DM and we have armor on + oneLimbSevered=ShowFrontHoleDamage (monster, frontCode, backCode, inflictor, attacker, dir, point, origin, take, knockback, dflags, mod); + } + } + } + + if (!lock_gorezones) + { + ShowBackHoleDamage (monster, frontCode, backCode, inflictor, attacker, dir, ExitPos, origin, take, knockback, dflags, mod); + } + return take; +} + + +//void bodyhuman_c::Emote(edict_t &monster, emotion_index new_emotion, float emotion_duration, qboolean scripted_emoting) +//{ + //allow overriding of current emotion if: 1) new is higher priority, or 2) current emotion is about to expire anyway +// if (new_emotion < emotion && emotion_expire-level.time > 0.25) +// { +// return; +// } +// emotion=new_emotion; +// emotion_expire = level.time+emotion_duration; +//} + +emotion_index bodyhuman_c::GetMood(edict_t &monster) +{ + return emotion; +} + +//fixme: this could probably be better done with an array of ghoulid's, generated upon face setting +void bodyhuman_c::UpdateFace(edict_t &monster) +{ + char tempface[64]; + bool foundAcceptableFace=false;//currently only using this for talking, so it's still fairly smooth at lower priorities. + + bodyorganic_c::UpdateFace(monster); + + if (curSoundIndex) + { + gi.sound (&monster, CHAN_VOICE, curSoundIndex, curVol, curAtten, 0); + curSoundIndex=0; + } + + //make sure the base for the face is valid + if (!face_base[0]) + { +// gi.dprintf("monster face not specified--no emotion!\n"); + + //still breathe + if (breathe_time < level.time) + { + if (monster.health <= 0) + { + breathe_time=level.time + 99999.9; + } + else + { + breathe_time=level.time + gi.flrand(2.5F, 4.5F); + } + + lev_interp_code myInterpCode = GetInterpCode(); + if ((myInterpCode==LEVCODE_NYC_SUBWAY2)||(myInterpCode==LEVCODE_SIB_BASE)|| + (myInterpCode==LEVCODE_SIB_CANYON)||(myInterpCode==LEVCODE_SIB_PLANT)) + { + fxRunner.exec("enemy/breathe", &monster, monster.ghoulInst->GetGhoulObject()->FindPart("sbolt_mouth")); + } + } + + return; + } + + //determine current expression + //fixme: allow guys to writhe around + if (emotion==EMOTION_DEAD)//dead + { + strcpy(tempface,"d"); + } + else if (emotion==EMOTION_PAIN) + { + strcpy(tempface,"p"); + } + else if (emotion==EMOTION_MEAN) + { + strcpy(tempface,"m"); + } + else if (emotion==EMOTION_AFRAID) + { + strcpy(tempface,"f"); + } + //fix dis shit! just getting it all in and working first... + else if (emotion==EMOTION_TALK) + { + if (!gi.irand(0,3)) + { + Com_sprintf(tempface,64, "%snt3",face_base); + if (monster.ghoulInst->GetGhoulObject()->FindSkin(monster.ghoulInst->GetGhoulObject()->FindMaterial("f"), tempface)) + { + strcpy(tempface,"nt3"); + foundAcceptableFace=true; + } + } + + if (!foundAcceptableFace && !gi.irand(0,2)) + { + Com_sprintf(tempface,64, "%snt2",face_base); + if (monster.ghoulInst->GetGhoulObject()->FindSkin(monster.ghoulInst->GetGhoulObject()->FindMaterial("f"), tempface)) + { + strcpy(tempface,"nt2"); + foundAcceptableFace=true; + } + } + + if (!foundAcceptableFace && !gi.irand(0,1)) + { + Com_sprintf(tempface,64, "%snt1",face_base); + if (monster.ghoulInst->GetGhoulObject()->FindSkin(monster.ghoulInst->GetGhoulObject()->FindMaterial("f"), tempface)) + { + strcpy(tempface,"nt1"); + foundAcceptableFace=true; + } + } + + if (!foundAcceptableFace && blink_timeGetGhoulObject()->FindSkin(monster.ghoulInst->GetGhoulObject()->FindMaterial("f"), tempface)) + { + strcpy(tempface,"mt3"); + foundAcceptableFace=true; + } + } + + if (!foundAcceptableFace && !gi.irand(0,2)) + { + Com_sprintf(tempface,64, "%smt2",face_base); + if (monster.ghoulInst->GetGhoulObject()->FindSkin(monster.ghoulInst->GetGhoulObject()->FindMaterial("f"), tempface)) + { + strcpy(tempface,"mt2"); + foundAcceptableFace=true; + } + } + + if (!foundAcceptableFace && !gi.irand(0,1)) + { + Com_sprintf(tempface,64, "%smt1",face_base); + if (monster.ghoulInst->GetGhoulObject()->FindSkin(monster.ghoulInst->GetGhoulObject()->FindMaterial("f"), tempface)) + { + strcpy(tempface,"mt1"); + foundAcceptableFace=true; + } + } + + if (!foundAcceptableFace) + { + strcpy(tempface,"m"); + } + } + else if (emotion==EMOTION_FEARTALK) + { + if (!gi.irand(0,3)) + { + Com_sprintf(tempface,64, "%sft3",face_base); + if (monster.ghoulInst->GetGhoulObject()->FindSkin(monster.ghoulInst->GetGhoulObject()->FindMaterial("f"), tempface)) + { + strcpy(tempface,"ft3"); + foundAcceptableFace=true; + } + } + + if (!foundAcceptableFace && !gi.irand(0,2)) + { + Com_sprintf(tempface,64, "%sft2",face_base); + if (monster.ghoulInst->GetGhoulObject()->FindSkin(monster.ghoulInst->GetGhoulObject()->FindMaterial("f"), tempface)) + { + strcpy(tempface,"ft2"); + foundAcceptableFace=true; + } + } + + if (!foundAcceptableFace && !gi.irand(0,1)) + { + Com_sprintf(tempface,64, "%sft1",face_base); + if (monster.ghoulInst->GetGhoulObject()->FindSkin(monster.ghoulInst->GetGhoulObject()->FindMaterial("f"), tempface)) + { + strcpy(tempface,"ft1"); + foundAcceptableFace=true; + } + } + + if (!foundAcceptableFace) + { + strcpy(tempface,"f"); + } + } + else if (blink_timeSetFrameOverride("f",tempface)) + { +// gi.dprintf("ACK! monster face skin %s not found!\n", tempface); + //default to normal face + Com_sprintf(tempface, 64, "%sn",face_base); + monster.ghoulInst->SetFrameOverride("f",tempface); + } + } + + if (breathe_time < level.time) + { + switch(emotion) + { + case EMOTION_DEAD: + breathe_time=level.time + 99999.9; + return;//i'm dead--no breathing! + case EMOTION_PAIN: + breathe_time=level.time + gi.flrand(1.0F, 1.5F); + break; + case EMOTION_MEAN: + breathe_time=level.time + gi.flrand(1.25F, 2.0F); + break; + case EMOTION_AFRAID: + breathe_time=level.time + gi.flrand(1.0F, 1.5F); + break; + default: + breathe_time=level.time + gi.flrand(2.5F, 4.5F); + break; + } + + //heh. this should be replaced with something clever. +// if (level.mapname[0]=='s'&& level.mapname[1]=='i'&& level.mapname[2]=='b') + lev_interp_code myInterpCode = GetInterpCode(); + if ((myInterpCode==LEVCODE_NYC_SUBWAY2)||(myInterpCode==LEVCODE_SIB_BASE)|| + (myInterpCode==LEVCODE_SIB_CANYON)||(myInterpCode==LEVCODE_SIB_PLANT)) + { + fxRunner.exec("enemy/breathe", &monster, monster.ghoulInst->GetGhoulObject()->FindPart("sbolt_mouth")); + } + } +} + +void bodyhuman_c::SetFace(edict_t &monster, char *face) +{ + strcpy(face_base, face); +} + +void bodyhuman_c::PrecacheGore(edict_t &monster) +{ + ggObjC *cacheObj; + //cache my own personal half-head + if (monster.ghoulInst) + { + GhoulID myHead=monster.ghoulInst->GetFrameOverride("h"); + if (myHead) + { + char headskin[256]; + monster.ghoulInst->GetGhoulObject()->GetSkinName(myHead,headskin); + cacheObj=game_ghoul.FindObject("Enemy/bolt", "g_half_head", false, headskin); + cacheObj->RegisterSkin("h", headskin); + if (cacheObj) + { + char faceskin[256]; + cacheObj->RegisterSkin("gz", "gz_half_head"); + //i have a changeable face + if (face_base[0]) + { + Com_sprintf(faceskin, 256, "%sd", face_base); + cacheObj->RegisterSkin("f", faceskin); + } + //no changeable face--register whatever static face i got + else + { + GhoulID myFace=monster.ghoulInst->GetFrameOverride("f"); + if (myFace) + { + monster.ghoulInst->GetGhoulObject()->GetSkinName(myFace,faceskin); + cacheObj->RegisterSkin("f", faceskin); + } + } + cacheObj->RegistrationLock(); + } + } + } +} + +void bodyhuman_c::SetRootBolt(edict_t &monster) +{ + GhoulID tempID; + GhoulID tempBolt; + GhoulID tempNote; + + char buffer[256]; + int tindex; + + PrecacheGore(monster); + + //cache sounds + for (tindex = 1; tindex < 4; tindex++) + { + Com_sprintf(buffer, 256, "impact/gore/fall%d.wav", tindex); + gi.soundindex (buffer); + } + for (tindex = 1; tindex < 4; tindex++) + { + Com_sprintf(buffer, 256, "impact/gore/impact%d.wav", tindex); + gi.soundindex (buffer); + } + gi.soundindex ("impact/gore/limbfall.wav"); +// gi.soundindex ("impact/gore/spout.wav"); - sound is now embedded in effect + gi.soundindex ("impact/gore/sizzle.wav"); + gi.soundindex ("impact/gore/hitflesh.wav"); + gi.soundindex ("impact/gore/headexp.wav"); + + VoiceGeneralSoundCache("Burn",monster,1); + VoiceGeneralSoundCache("Choke",monster,2); + VoiceGeneralSoundCache("Crotch",monster,2); + VoiceGeneralSoundCache("Hit",monster,3); + VoiceGeneralSoundCache("Scream",monster,SCREAMNUMBER); + VoiceGeneralSoundCache("Writhe",monster,WRITHENUMBER); +// VoiceGeneralSoundCache("Fly",monster,2); + VoiceGeneralSoundCache("Limp",monster,3); + VoiceGeneralSoundCache("Getup",monster,1); + VoiceGeneralSoundCache("Disarm",monster,1); + +// VoiceSoundCache("backup", monster, 0); +// VoiceSoundCache("throw", monster, 0); +// VoiceSoundCache("duck", monster, 0); +// VoiceSoundCache("help", monster, 0); +// VoiceSoundCache("retreat", monster, 0); +// VoiceSoundCache("reload", monster, 0); + + VoiceWakeSoundCache(monster); + VoiceGreetSoundCache(monster); + + entDebrisToCache[CLGHL_CHUNKROCKTINY] = DEBRIS_YES; + + + gi.soundindex ("Weapons/gren/throw.wav"); + gi.soundindex ("impact/armor/hit.wav"); + + gi.effectindex("gore/stumpblood"); + gi.effectindex("gore/headcloud"); + gi.effectindex("gore/bloodcloud"); + gi.effectindex("gore/bloodcloud_s"); + gi.effectindex("gore/noblood"); + gi.effectindex("gore/noblood_s"); + gi.effectindex("gore/gibbody"); + gi.effectindex("spark2"); + gi.effectindex("weakspark"); + gi.effectindex("armorhit"); + gi.effectindex("gore/bloodpool"); + gi.effectindex("gore/danglyblood"); + gi.effectindex("gore/hugeburst2"); + gi.effectindex("environ/gb_exitw"); + + if (level.mapname[0]=='s'&& level.mapname[1]=='i'&& level.mapname[2]=='b') + { + gi.effectindex("enemy/breathe"); + } + + CacheAttack(GetLeftHandWeapon(monster)); + CacheAttack(GetRightHandWeapon(monster)); + + AllocateGoreZones(monster); + + if (!monster.ghoulInst) + { + return; + } + + RecognizeGoreZones(monster); + + //going to allow players to run callback routines, i think... + if (monster.client) + { + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("EOS"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheMonsterSeqEndCallback,tempNote); + } + } + else + { + tempBolt=monster.ghoulInst->GetGhoulObject()->FindPart("quake_origin"); + if (tempBolt) + { + monster.ghoulInst->AddMatrixCallBack(&TheFollowGenericPivot,tempBolt,IGhoulInst::MatrixType::JacobianEntity); + } + else + { + gi.dprintf("WARNING: monster origin not found--wacky!!\n"); + } + + tempBolt=monster.ghoulInst->GetGhoulObject()->FindPart("sbolt_heel_r"); + if (tempBolt) + { + monster.ghoulInst->AddMatrixCallBack(&TheFootRightCallback,tempBolt,IGhoulInst::MatrixType::Entity); + } + + tempBolt=monster.ghoulInst->GetGhoulObject()->FindPart("sbolt_heel_l"); + if (tempBolt) + { + monster.ghoulInst->AddMatrixCallBack(&TheFootLeftCallback,tempBolt,IGhoulInst::MatrixType::Entity); + } + + tempID=monster.ghoulInst->GetGhoulObject()->FindPart("quake_ground"); + if (tempID) + { + monster.ghoulInst->AddMatrixCallBack(&TheGroundCallback,tempID,IGhoulInst::MatrixType::Entity); + } + tempBolt=monster.ghoulInst->GetGhoulObject()->FindPart("sbolt_mouth"); + if (tempBolt) + { + monster.ghoulInst->AddMatrixCallBack(&TheMouthCallback,tempBolt,IGhoulInst::MatrixType::Entity); + } + else + { + gi.dprintf("WARNING: monster mouth not found--sight will be defective!!\n"); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("BOS"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheMonsterSeqBeginCallback,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("EOS"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheMonsterSeqEndCallback,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("jump"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheJumpCallBack,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("thud"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheThudCallBack,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("knee"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheKneeCallBack,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("inair"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheInAirCallBack,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("fire"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheFireCallBack,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("sound"); + if (tempNote) + { + monster.ghoulInst->GetGhoulObject()->FireAllNoteCallBacks(&soundPrecacher,tempNote); + monster.ghoulInst->AddNoteCallBack(&TheMonsterSoundCallBack,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("throw"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheThrowCallBack,tempNote); + } + + tempNote=monster.ghoulInst->GetGhoulObject()->FindNoteToken("dropweapon"); + if (tempNote) + { + monster.ghoulInst->AddNoteCallBack(&TheDropWeaponCallBack,tempNote); + } + + ReloadRWeapon(monster); + } +} + +attacks_e bodyhuman_c::GetWeaponAtBolt(edict_t &monster, char *boltname) +{ + GhoulID bolt; + ggBinstC *weapon; + + if (!monster.ghoulInst) + { + return ATK_NOTHING; + } + bolt = monster.ghoulInst->GetGhoulObject()->FindPart(boltname); + weapon = game_ghoul.FindOInst(monster.ghoulInst)->GetBoltInstance(bolt); + return GetWeaponAttackType(weapon); +} + +attacks_e bodyhuman_c::GetRightHandWeapon(edict_t &monster) +{ +/* GhoulID bolt=0; + ggBinstC *weapon=NULL; + + if (monster.client) + { + bolt = monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"); + weapon = game_ghoul.FindOInst(monster.ghoulInst)->GetBoltInstance(bolt); + if (!weapon) + { + return ATK_NOTHING; + } + } +*/ + return rHandAtk; +// return GetWeaponAtBolt(monster, "wbolt_hand_r"); +} + +attacks_e bodyhuman_c::GetLeftHandWeapon(edict_t &monster) +{ + return lHandAtk; + //return GetWeaponAtBolt(monster, "wbolt_hand_l"); +} + +attacks_e bodyhuman_c::GetBestWeapon(edict_t &monster) +{ + attacks_e left, right; + left = GetLeftHandWeapon(monster); + right = GetRightHandWeapon(monster); + if (left>right) + { + return left; + } + return right; +} + +qboolean bodyhuman_c::RightHandWeaponReady(edict_t &monster) +{ + if(GetRightHandWeapon(monster) == ATK_MICROWAVE && rLastFireTime < 0) + { + rLastFireTime = level.time - 1;//make 'em pause + return 0; + } + //return (level.time-rLastFireTime > FireInterval(GetRightHandWeapon(monster))); + return (level.time-rLastFireTime > + ((FireInterval(GetRightHandWeapon(monster),rWeaponAmmo) + * game.playerSkills.getHesitation()) + * ((bodyDamage) ? 2:1) + * ((gmonster.GetClosestEnemy() == &monster) ? .75:1)));//closest guy gets to attack extra quickly +} + +void bodyhuman_c::DropWeapon(edict_t *ent, IGhoulInst *me) +{ + vec3_t fwd; + Vect3 vPos, vDir; + + rHandAtk = ATK_NOTHING; + + if (!ent || !ent->ghoulInst) + { + return; + } + me=ent->ghoulInst; + ggBinstC *oldLeftWeap = NULL, *oldRightWeap = NULL; + ggOinstC *myInstance = game_ghoul.FindOInst(me); + GhoulID idLeft = NULL_GhoulID, idRight = NULL_GhoulID; + + if (NULL == myInstance) + { + return; + } + AngleVectors(ent->s.angles, fwd, NULL, NULL); + VectorNegate(fwd, *(vec3_t*)&vDir); + if(oldLeftWeap = myInstance->GetBoltInstance(idLeft = me->GetGhoulObject()->FindPart("wbolt_hand_l"))) + { // get the position of the bolted-on item + GetGhoulPosDir(ent->s.origin, ent->s.angles, oldLeftWeap->GetInstPtr(), NULL, "TO_WBOLT_HAND_L", + *(vec3_t*)&vPos, fwd, NULL, NULL); + // drop it + DropBoltOn(*ent, oldLeftWeap, vPos, vDir, 2); + } + if (oldRightWeap = myInstance->GetBoltInstance(idRight = me->GetGhoulObject()->FindPart("wbolt_hand_r"))) + { // get the position of the bolted-on item + GetGhoulPosDir(ent->s.origin, ent->s.angles, oldRightWeap->GetInstPtr(), NULL, "TO_WBOLT_HAND_R", + *(vec3_t*)&vPos, fwd, NULL, NULL); + // drop it + DropBoltOn(*ent, oldRightWeap, vPos, vDir, 2); + } +} + + +// defines for null targeting +#define HEAD 1 +//#define NECK 2 +#define LSHOULDER 3 +#define RSHOULDER 4 +#define CHEST 5 +#define GUT 6 +#define GROIN 7 +#define GUNHAND 8 +#define NUG_O_POPPIN 9 + +#define FLAMETHROW_MAX_WEDGE 0 + +void bodyhuman_c::FireRightHandWeapon(edict_t &monster, bool isLethal, int NullTarget, qboolean forceFireRate) +{ + vec3_t forward; + Matrix4 firebolt,rotate,final; + edict_t *targ; + + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + + if(!the_ai) + { + return; + } + + float pausing = ((FireInterval(GetRightHandWeapon(monster),rWeaponAmmo) * game.playerSkills.getHesitation()) * ((bodyDamage) ? 2.5:1)* ((gmonster.GetClosestEnemy() == &monster) ? .5:1)); + + if (forceFireRate && level.time-rLastFireTime < + ((FireInterval(GetRightHandWeapon(monster),rWeaponAmmo) * game.playerSkills.getHesitation()) * ((bodyDamage) ? 2.5:1)* ((gmonster.GetClosestEnemy() == &monster) ? .5:1))) + { //injured people fire a lot less often because, well, they're injured and very unhappy + return; + } + + IGhoulInst *my_inst = monster.ghoulInst; + if (!my_inst) + { + return; + } + + GhoulID my_hand = monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"); + + if (!my_hand) + { + return; + } + + ggBinstC *my_weapon = game_ghoul.FindOInst(monster.ghoulInst)->GetBoltInstance(my_hand); + + if (!my_weapon) + { + return; + } + + GhoulID myFlash = my_weapon->GetBolteeObject()->GetMyObject()->FindPart("flash"); + if (!myFlash) + { + return; + } + + targ = the_ai->getTarget(); + + rWeaponAmmo-=1; + + //this ensures that it's from exactly the right spot (particularly height wise) - but what about the bbox? It must be inside! + + vec3_t fpos; + //GetGhoulPosDir(monster.s.origin, monster.s.angles, my_weapon->GetInstPtr(), NULL, "flash", fpos, fdir, NULL, NULL); + VectorCopy(monster.s.origin, fpos); + fpos[2] += MONSTER_SHOOT_HEIGHT; + + int rWeap = GetRightHandWeapon(monster); + + if ((isLethal || NullTarget) && targ) + { + vec3_t TargetPoint; + + VectorCopy(targ->s.origin, TargetPoint); + if (NullTarget) // Try to get a null's point + { + Matrix4 EntityToWorld; + Matrix4 BoltToEntity; + Matrix4 BoltToWorld; + GhoulID Bolt; + + switch (NullTarget) + { + case HEAD: // fixme rearrange this so switch only assigns correct bolt + Bolt = targ->ghoulInst->GetGhoulObject()->FindPart("sbolt_mouth"); + break; +// case NECK: +// Bolt = targ->ghoulInst->GetGhoulObject()->FindPart("gbolt_cap_head_chest"); // don't think this works +// break; + case LSHOULDER: + Bolt = targ->ghoulInst->GetGhoulObject()->FindPart("gbolt_shoulder_lf"); + break; + case RSHOULDER: + Bolt = targ->ghoulInst->GetGhoulObject()->FindPart("gbolt_shoulder_rf"); + break; + case CHEST: + Bolt = targ->ghoulInst->GetGhoulObject()->FindPart("gbolt_chest_f"); + break; + case GROIN: + Bolt = targ->ghoulInst->GetGhoulObject()->FindPart("gbolt_groin"); + break; + case GUT: + Bolt = targ->ghoulInst->GetGhoulObject()->FindPart("gbolt_gut_f"); + break; + case GUNHAND: + Bolt = targ->ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"); + DropWeapon(targ, targ->ghoulInst); + break; + case NUG_O_POPPIN: // this means explode the head like a melon + Bolt = targ->ghoulInst->GetGhoulObject()->FindPart("sbolt_mouth"); + break; + default: + break; + } + if (Bolt && NullTarget) + { + // get the transformation from entity space to world space + EntToWorldMatrix(targ->s.origin, targ->s.angles, EntityToWorld); + // get the transformation from bolt space to entity space + targ->ghoulInst->GetBoltMatrix(level.time,BoltToEntity,Bolt,IGhoulInst::MatrixType::Entity); + // multiply to get transform from bolt space to world space + BoltToWorld.Concat(BoltToEntity, EntityToWorld); + // 3rd row of BoltToWorld is the world coordinates of the bolt + BoltToWorld.GetRow(3,*(Vect3 *)TargetPoint); + } + } + VectorSubtract(TargetPoint, fpos, forward); // firing vector will be targetted point (defaults to origin) + + gi.dprintf("attacking, targetpoint: %2.3f %2.3f %2.3f\n", TargetPoint[0], TargetPoint[1], TargetPoint[2]); + + ai_c *target_ai=(ai_c*)((ai_public_c*)targ->ai); + bodyorganic_c* targetbody = NULL; + if (isLethal && target_ai) + { +// target_ai->GetBody()->SetArmor(*the_ai->getTarget(), ARMOR_NONE); // turn target's armor off on a scripted kill + + // rather than turn a guy's armor off when he's scripted to die, we'll set his + //"next shot's gonna kill me" flag + if ( targetbody = ((bodyorganic_c*)target_ai->GetBody()) ) + { + if (NullTarget == NUG_O_POPPIN) + { + targetbody->NextShotsGonnaKillMe(NEXTSHOT_EXPLODE_MY_NUG); // thought I was kidding about the name, didn't you? + } + else + { + targetbody->NextShotsGonnaKillMe(NEXTSHOT_KILLS); // thought I was kidding about the name, didn't you? + } + } + } + } + else + { + if(targ) + { //because shooting out of your back, while being an extremely useful talent, + // is not something our guys can do. + + vec3_t to_targ,my_facing; + VectorSubtract(targ->s.origin, monster.s.origin, to_targ); + to_targ[2] = 0; + VectorNormalize(to_targ); + + AngleVectors(monster.s.angles, my_facing, NULL, NULL); + my_facing[2] = 0; + VectorNormalize(my_facing); + + if ((!game.cinematicfreeze)&& + ((DotProduct(to_targ, my_facing)GetMiscFlags() & MISC_FLAG_FIRINGBLIND)))//fixme - does this vary according to the bbox? + { + rWeaponAmmo+=1;//didn't use it after all + return; + } + } + + if(currentmove->actionFlags&ACTFLAG_FIREFROMGUN) + { + GetGhoulPosDir(monster.s.origin, monster.s.angles, my_weapon->GetInstPtr(), NULL, "flash", fpos, forward, 0, 0); + } + else + { + the_ai->GetAimVector(forward); + } + } + + justFiredRight = true; + + if(targ && (!(the_ai->GetMiscFlags() & MISC_FLAG_FIRINGBLIND))) + { + if((rWeap == ATK_MICROWAVE)||(rWeap == ATK_MICROWAVE_ALT) + ||(rWeap == ATK_ROCKET)||(rWeap == ATK_FLAMEGUN)||(rWeap == ATK_AUTOSHOTGUN)) + { //projectiles shouldn't miss - they look really bad and are also poor for gameplay + vec3_t targOrigin; + VectorCopy(targ->s.origin, targOrigin); + // kef -- there's probably a better way of altering our target position based on the + //target's crouchingness, but... + if (targ && targ->client && (targ->client->ps.pmove.pm_flags & PMF_DUCKED)) + { + targOrigin[2] -= 16; + } + + VectorSubtract(targOrigin, fpos, forward); + forward[2] = targOrigin[2] - monster.s.origin[2]; + VectorNormalize(forward); + } + else if((rWeap == ATK_SHOTGUN)) + { // so this doesn't miss by nearly as much as most other weapons + vec3_t fd; + VectorScale(forward, .6, forward); + VectorSubtract(targ->s.origin, fpos, fd); + VectorNormalize(fd); + VectorMA(forward, .4, fd, forward); + } + } + + if(targ) + { //wake my pals up + PlayerNoise(targ, targ->s.origin, AI_SENSETYPE_SOUND_WEAPON, NULL, 300, gmonster.GetClientNode()); + } + + if(the_ai->GetMiscFlags() & MISC_FLAG_FIRINGBLIND) + { + forward[0] += gi.flrand(-.15, .15); + forward[1] += gi.flrand(-.15, .15); + forward[2] += gi.flrand(-.15, .15); + + VectorNormalize(forward); + } + + weapons.attack(GetRightHandWeapon(monster), &monster, fpos, forward, my_weapon->GetInstPtr(), myFlash); + + if(targ && targ->client) + { // we know what to do here! + SetActionMusic(*targ); + } + + //hey! if e's not dead yet and i wanna kill im, finish im off! + if (isLethal && targ && targ->health>0) + { +// weapons.attack(ATK_MAGICBULLET, &monster, fpos, forward, my_weapon->GetInstPtr()); + } + + rLastFireTime = level.time; + +// Com_Printf("A: %8.3f B: %8.3f\nC: %8.3f D: %8.3f\n", +// set1Time/1000.0, set2Time/1000.0, set3Time/1000.0, set4Time/1000.0); +} + +#define THROW_UP (30*M_PI/180) +#define MAX_THROW_ANG 80 +#define THROW_ERROR 20 +#define MIN_THROW_DIST 200 +#define THROWCONE .707 +// if we throw a bit high it looks better + +void bodyhuman_c::ThrowProjectile(edict_t &monster) +{ + // need a bunch more checks in here and stuff + + attacks_e myLeftHand = GetLeftHandWeapon(monster); + + if (myLeftHand == ATK_MACHETE || myLeftHand == ATK_NOTHING) + { + return; + } + + vec3_t fwd; + + ai_c *the_ai=(ai_c*)((ai_public_c*)monster.ai); + + if(!the_ai) + { + return; + } + + if(!the_ai->getTarget())return; + + vec3_t dif; + VectorSubtract(the_ai->getTarget()->s.origin, monster.s.origin, dif); + if(myLeftHand != ATK_THROWSTAR && VectorLength(dif) < MIN_THROW_DIST) + { // screw this! + return; + } + + CRadiusContent rad(the_ai->getTarget()->s.origin, 175, 1, 1); + + for(int i = 0; i < rad.getNumFound(); i++) + { // don't throw now! + edict_t *search = rad.foundEdict(i); + + if (myLeftHand == ATK_THROWSTAR && search == &monster) + continue; + + if(OnSameTeam(&monster, search)) + { + return; + } + } + + vec3_t fpos; + float vel; + + GetGhoulPosDir(monster.s.origin, monster.s.angles, monster.ghoulInst, NULL, "wbolt_hand_l", fpos, 0, 0, 0); + + the_ai->GetAimVector(fwd); + + fwd[2] = 0; + VectorNormalize(fwd);//we are going to just grab the z component here + + //throwing stars go straight, everything else gets lobbed + if (myLeftHand == ATK_THROWSTAR) + { + vel = 500; + VectorCopy(monster.s.origin, fpos); + VectorSubtract(the_ai->getTarget()->s.origin, fpos, fwd); + + VectorNormalize(fwd); + } + else + { + vec3_t temp; + VectorSubtract(the_ai->getTarget()->s.origin, monster.s.origin, temp); + temp[2] = 0; + + VectorNormalize(temp); + + if(DotProduct(temp, fwd) < THROWCONE) + { + return; + } + + VectorScale(temp, 2, temp); + VectorAdd(fwd, temp, fwd); + VectorNormalize(fwd); + + vec3_t dist; + + float hDif = the_ai->getTarget()->s.origin[2] - monster.s.origin[2] + gi.flrand(0, THROW_ERROR); + VectorSubtract(the_ai->getTarget()->s.origin, monster.s.origin, dist); + float distf = VectorLength(dist); + float throwAng = asin(hDif/distf) + THROW_UP; + if(throwAng > MAX_THROW_ANG*M_PI/180)throwAng = MAX_THROW_ANG*M_PI/180;//irk + + float throwFwd = cos(throwAng); + float throwUp = sin(throwAng); + + VectorScale(fwd, throwFwd, fwd); + fwd[2] = throwUp;//make this go at a good angle + + vel = sqrt((-800*-800*-1*distf*distf)/(-2*hDif*-800*throwFwd*throwFwd + 2*-800*distf*throwUp*throwFwd)); + } + + weapons.attack(GetLeftHandWeapon(monster), &monster, fpos, fwd, 0, &vel); + + gi.sound (&monster, CHAN_AUTO, gi.soundindex ("Weapons/gren/throw.wav"), .6, ATTN_NORM, 0); +} + +/* +// Don't block any longer +void boltDropNotSolid(edict_t *self) +{ + if (!(strncmp (self->classname, "item_weapon", 11)==0)) // Non-weapons aren't solid + { + self->movetype = MOVETYPE_NONE; + self->solid = SOLID_NOT; + } + self->think = blownpartremove_think; + self->nextthink = level.time + 30.0; + +} +*/ + +// Don't block any longer +void boltDropNotSolid(edict_t *self) +{ + self->touch_debounce_time = level.time; + self->think = blownpartremove_think; + self->nextthink = level.time + 30.0; + + if (!(strncmp (self->classname, "item_weapon", 11)==0)) // Non-weapons aren't solid + { + self->movetype = MOVETYPE_NONE; + self->solid = SOLID_NOT; + self->nextthink = level.time + 0.1; + } +} + +int bodyhuman_c::DropBoltOn(edict_t &monster, ggBinstC *boltedptr, Vect3 &pos, Vect3 &Direction, int damage, edict_t *attacker) +{ + weapons_t boltedWeapon = GetWeaponType(boltedptr); + Pickup *pickup = NULL; + GhoulID inworldBolt; + edict_t *ent; + vec3_t shootOut; + vec3_t dir; + int i,weaponFlg; + char *boltedname; + + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + if (!myInstance) + { + return damage; + } + + ggObjC *myObject=myInstance->GetParentObject(); + + if (!myObject) + { + return damage; + } + + if (!bDropBoltons) + { // we're not allowed to drop stuff (probably cuz we were hit by a train) + return damage; + } + + for (i=0;i<3;i++) + { + dir[i]=Direction[i]; + } + + if (!boltedptr || !boltedptr->GetBolteeObject()) + { + return damage; + } + + if(monster.client) + { + // Players can only drop weapons. And don't do this when dying - in + // that case, it *needs* to be done elsewhere. + + if(dm->dmRule_REALISTIC_DAMAGE() && attacker && attacker->client/*&&(monster.health>damage)*/) + { + // Some weapons are not as likely to cause weapondrops + switch(attacker->client->inv->getCurWeaponType()) + { + case SFW_PISTOL1: + case SFW_PISTOL2: + case SFW_SNIPER: + break; // always cause a drop with these weapons + case SFW_SHOTGUN: + case SFW_MACHINEPISTOL: + case SFW_ASSAULTRIFLE: + case SFW_MACHINEGUN: + case SFW_AUTOSHOTGUN: + if (gi.flrand(0,1) < .8) + { + return (damage * gi.flrand(0,1)); + } + break; // much reduced (20%) chance to cause drop with these weapons, some damage is also absorbed by the weapon + case SFW_KNIFE: + case SFW_ROCKET: + case SFW_FLAMEGUN: + case SFW_MICROWAVEPULSE: + default: + return damage; + break; // these weapons never cause drops + } + + + // Can only shoot weapon out of player's hands - anything else, just return. + + boltedname = boltedptr->GetBolteeObject()->GetSubName(); + + char putBoltNameHere[100]; + + monster.ghoulInst->GetGhoulObject()->GetPartName(boltedptr->GetBolterBolt(),putBoltNameHere); + + if(!stricmp(putBoltNameHere,"wbolt_hand_r") && dm->IsShootableWeapon(boltedname)) + { + monster.client->inv->addCommand("weaponlose"); + return 0; + } + } + + return(damage); + } + + if(strcmp(monster.classname, "m_x_mmerc") == 0) + { + // Cant' shoot stuff off of Hawk. and I think he's supposed to be invincible, too. + + return 0; + } + + boltedname = boltedptr->GetBolteeObject()->GetSubName(); + + for (i=0;*shootableParts[i].name;i++) + { + if (!stricmp(shootableParts[i].name,boltedname)) + { + if ((shootableParts[i].flimsy)||(damage>1)) + { + // If it's a weapon they spawn a little different - they need touch functions. + weaponFlg = false; + if (boltedWeapon!=SFW_EMPTYSLOT) + { + if (pickup = thePickupList.GetPickupFromType(PU_WEAPON, boltedWeapon)) + { + if (boltedptr->GetBolterBolt()) + { + char putBoltNameHere[100]; + + monster.ghoulInst->GetGhoulObject()->GetPartName(boltedptr->GetBolterBolt(),putBoltNameHere); + if (!stricmp(putBoltNameHere, "wbolt_hand_r")) + { + rHandAtk = ATK_NOTHING; + } + else if (!stricmp(putBoltNameHere, "wbolt_hand_l")) + { + lHandAtk = ATK_NOTHING; + } + } + weaponFlg = true; + // if anyone has the "no_wound" spawnflag don't let 'em drop weapons + if (monster.spawnflags & SPAWNFLAG_NO_WOUND) + { + return damage; + } + } + } + // Spawn the thingy. + ent = G_Spawn(); + VectorCopy(monster.s.origin,ent->s.origin); + ent->owner = &monster; + + boltedptr->GetBolteeObject()->CloneInstance(ent, boltedptr->GetInstPtr()); + ent->s.renderfx = RF_GHOUL; + + inworldBolt=boltedptr->GetBolteeObject()->GetMyObject()->FindPart("inworld"); + if (inworldBolt) + { + ent->ghoulInst->SetMyBolt(inworldBolt); + } + else + { + ent->ghoulInst->SetMyBolt(boltedptr->GetInstPtr()->GetMyBolt()); + } + + if (weaponFlg) + { + I_Spawn (ent, pickup); + } + + //move it! + ent->velocity[2]+=300; + VectorScale(dir,150,ent->velocity); + VectorSubtract(*(vec3_t*)(&pos), monster.s.origin, shootOut); + VectorNormalize(shootOut); + VectorScale(shootOut, 150, shootOut); + VectorAdd(ent->velocity, shootOut, ent->velocity); + + // Spawn at a random angle, so we don't get nice rows of boltons. + ent->s.angles[YAW] = gi.flrand(-180, 180); + + // Was item already spawned by I_Spawn + if (!weaponFlg) + { + ent->movetype = MOVETYPE_BOUNCE; + ent->solid = SOLID_BBOX; + ent->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID; + VectorSet (ent->mins, -1, -1, -1); + VectorSet (ent->maxs, 1, 1, 1); + ent->health = 10000; + ent->takedamage = DAMAGE_NO; + BboxRotate(ent); + gi.linkentity (ent); + } + + ent->nextthink = level.time + 5; + ent->think = boltDropNotSolid; + + myInstance->RemoveBoltInstance(boltedptr); + + if(shootableParts[i].hatHead) // we're losing a hat, make sure we've got a good + // head on our shoulders + { + GhoulID newHeadType = 0; + GhoulID headType = 0; + GhoulID newFaceType = 0; + GhoulID faceType = 0; + + headType = monster.ghoulInst->GetGhoulObject()->FindPart("_headhelmet"); + // hey, guess what, ecto guys with helmets have _headhelmets and meso guys + // have _helmetheads! Yeah, artists! + // Also, here's where we take care of swapping gore zones. + if (headType && monster.ghoulInst->GetPartOnOff(headType)) // got an ecto helmet + { + newHeadType = monster.ghoulInst->GetGhoulObject()->FindPart("_headbald"); + if (newHeadType) + { + monster.ghoulInst->SetPartOnOff(headType, false); + monster.ghoulInst->SetPartOnOff(newHeadType, true); + gzones[GZ_HEAD_FRONT].parent_id=gzones[GZ_HEAD_BACK].parent_id=newHeadType; + SetGoreZone(monster, "gz_headbald_f", GZ_HEAD_FRONT); + SetGoreZone(monster, "gz_headbald_b", GZ_HEAD_BACK); + } + } + else + { + headType = monster.ghoulInst->GetGhoulObject()->FindPart("_helmethead"); + + if (headType && monster.ghoulInst->GetPartOnOff(headType)) // got a meso helmet + { + newHeadType = monster.ghoulInst->GetGhoulObject()->FindPart("_baldhead"); + if (newHeadType) + { + monster.ghoulInst->SetPartOnOff(headType, false); + monster.ghoulInst->SetPartOnOff(newHeadType, true); + gzones[GZ_HEAD_BACK].parent_id=newHeadType; + SetGoreZone(monster, "gz_baldhead_b", GZ_HEAD_BACK); + faceType = monster.ghoulInst->GetGhoulObject()->FindPart("_helmetface"); + newFaceType = monster.ghoulInst->GetGhoulObject()->FindPart("_comface"); + if (faceType && newFaceType) + { + monster.ghoulInst->SetPartOnOff(faceType, false); + monster.ghoulInst->SetPartOnOff(newFaceType, true); + gzones[GZ_HEAD_FRONT].parent_id=newFaceType; + SetGoreZone(monster, "gz_comface", GZ_HEAD_FRONT); + } + } + } + } + } +// return damage*0.1; + + if (attacker && attacker->client && (attacker->client->inv->getCurWeaponType() == SFW_SNIPER)) + { + // no bolt-ons stop player-fired sniper rifle rounds + return damage; + } + return (shootableParts[i].stopsDmg?0:damage); + } // if ((shootableParts[i].flimsy)||(damage>1)) + else + { +// return damage; + return 0; + } + } + } + return damage; +} + +void bodyhuman_c::RightStep(edict_t &monster) +{ + if (bodyDamageAccumulated & BODYDAMAGE_RIGHTLEG && currentmove == &generic_move_limp_lleg) + { + if (gi.irand(0,1)) + { + VoiceGeneralSound("Limp", monster, 3, 0.75); + } + } +} + +void bodyhuman_c::LeftStep(edict_t &monster) +{ + if (bodyDamageAccumulated & BODYDAMAGE_LEFTLEG && currentmove == &generic_move_limp_rleg) + { + if (gi.irand(0,1)) + { + VoiceGeneralSound("Limp", monster, 3, 0.75); + } + } +} + +// anyone for blowing off an air tank? +int bodyhuman_c::SpecialActionBoltOn(edict_t &monster, ggBinstC *boltedptr, Vect3 &pos, Vect3 &Direction, int damage) +{ + char *boltedname = NULL; + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + + if (!myInstance) + { + return false; + } + + if (boltedptr && boltedptr->GetBolteeObject() && + (boltedname = boltedptr->GetBolteeObject()->GetSubName())) + { // now special case anything and everything that could be attached to the entity in question + if (!stricmp("acc_tanks", boltedname)) + { // we hit air tanks. blow 'em up. + myInstance->RemoveBoltInstance(boltedptr); + // damage the guy first so RadiusBurn will blacken 'im like a Cajun chicken breast + //(this is a very demented business in which I find myself working) + monster.health = 0; + + T_RadiusDamage (&monster, &monster, 250, &monster, 175, MOD_EXPLOSIVE, DT_FIRE); + RadiusBurn(&monster, 175); // since this has a check to make sure guys that are still living dont blacken, this should be ok + + gmonster.RadiusDeafen(&monster, 200, 200); + + fxRunner.exec("weapons/world/airexplode", &monster); + + ShakeCameras (*((vec3_t*)&pos), 100, 100*2, DEFAULT_JITTER_DELTA); + return true; + } + } + return false; +} + +void bodyhuman_c::Gib2(edict_t &monster, vec3_t dir, int dflags) +{ + vec3_t debrisNorm; + +// first some chunks + int numchunks = gi.irand(10,20); + FX_ThrowDebris(monster.s.origin, debrisNorm, numchunks, DEBRIS_TINY, MAT_ROCK_FLESH, 0, 0, 0, SURF_BLOOD); + numchunks = gi.irand(5,10); + FX_ThrowDebris(monster.s.origin,debrisNorm, numchunks, DEBRIS_SM, MAT_ROCK_FLESH, 0, 0, 0, SURF_BLOOD); + numchunks = gi.irand(0,2); + FX_ThrowDebris(monster.s.origin, debrisNorm, numchunks, DEBRIS_MED, MAT_ROCK_FLESH, 0, 0, 0, SURF_BLOOD); +// monster.ghoulInst->SetAllPartsOnOff(false); + RecursiveTurnOff(monster.ghoulInst); + monster.ghoulInst->TurnCallBacksOff(); + monster.solid = SOLID_NOT; + HoldAnimation(monster, HOLDCODE_GIBBED, level.time); +} + +int hackGlobalSpawnedBitsForThisGuy; + +void bodyhuman_c::Gib(edict_t &monster, vec3_t dir, int dflags) +{ + gz_info *frontHole=NULL; + gz_info *backHole=NULL; + gz_code frontCode; + gz_code backCode; + int totalsevers=0; + vec3_t throwdir; + + SetVocalCordsWorking(false); + + if(lock_sever) + { + return; + } + + if (monster.gibbed) + { + return; + } + + //make me fall down so giblets look ok--VERY IMPORTANT to only switch to non-death animations, as death animations are NOT EVER to be used without a guarantee of death action--should be safe here, but just don't do it! + if(currentmove && ((currentmove->bbox == BBOX_PRESET_STAND)||(currentmove->bbox == BBOX_PRESET_CROUCH))) + { + vec3_t forward; + AngleVectors(monster.s.angles, forward, NULL, NULL); + + //fall forward + if (DotProduct(forward, dir)>0) + { +// if(IsAvailableSequence(monster, &generic_move_dive_toprone)) +// SetAnimation(monster, &generic_move_dive_toprone); + + if (IsAvailableSequence(monster, &generic_move_fakedeath_lfshotdeath)) + SetAnimation(monster, &generic_move_fakedeath_lfshotdeath); + } + + //fall back (note we can get here even if shot in back, if dive to prone isn't available +// if (IsAvailableSequence(monster, &generic_move_armorblown)) +// SetAnimation(monster, &generic_move_armorblown); + + if(IsAvailableSequence(monster, &generic_move_fakedeath_lbshotdeath)) + SetAnimation(monster, &generic_move_fakedeath_lbshotdeath); + } + + if (!game.cinematicfreeze) + { + level.gibs++; + } + + hackGlobalSpawnedBitsForThisGuy = 0; + + if (!(lock_blood) && (hackGlobalGibCalls < 4)) + { + if(dflags & DT_NEURAL) + { + monster.ghoulInst->SetTint(1.0, 0.3, 0.0, 1.0); + + fxRunner.exec("gore/mpgsplatter", monster.s.origin); + } + else + { + fxRunner.exec("gore/hugeburst2", monster.s.origin); + } + } + + Emote(monster, EMOTION_DEAD, 1.0); + UpdateFace(monster); + +/* + //sfs--testing backpack bidness s'more + if (gzones[GZ_CHEST_FRONT].parent_id&&monster.ghoulInst&&monster.ghoulInst->GetPartOnOff(gzones[GZ_CHEST_FRONT].parent_id)) + { + frontHole = &gzones[GZ_CHEST_FRONT]; + frontCode = GZ_CHEST_FRONT; + backHole = &gzones[GZ_CHEST_BACK]; + backCode = GZ_CHEST_BACK; + + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + } +*/ + +/* ShowFrontHoleDamage (monster, GZ_CHEST_FRONT, GZ_CHEST_BACK, inflictor, attacker, dir, point, origin, 80, knockback, dflags, mod); + ShowFrontHoleDamage (monster, GZ_HEAD_FRONT, GZ_HEAD_BACK, inflictor, attacker, dir, point, origin, 80, knockback, dflags, mod); + ShowFrontHoleDamage (monster, GZ_SHLDR_RIGHT_FRONT, GZ_SHLDR_RIGHT_BACK, inflictor, attacker, dir, point, origin, 80, knockback, dflags, mod); + ShowFrontHoleDamage (monster, GZ_SHLDR_LEFT_FRONT, GZ_SHLDR_LEFT_BACK, inflictor, attacker, dir, point, origin, 80, knockback, dflags, mod); + ShowFrontHoleDamage (monster, GZ_ARM_UPPER_RIGHT, GZ_ARM_UPPER_RIGHT, inflictor, attacker, dir, point, origin, 80, knockback, dflags, mod); + ShowFrontHoleDamage (monster, GZ_ARM_UPPER_LEFT, GZ_ARM_UPPER_LEFT, inflictor, attacker, dir, point, origin, 80, knockback, dflags, mod); + ShowFrontHoleDamage (monster, GZ_GUT_FRONT, GZ_GUT_BACK, inflictor, attacker, dir, point, origin, 80, knockback, dflags, mod); + ShowFrontHoleDamage (monster, GZ_GUT_BACK, GZ_GUT_FRONT, inflictor, attacker, dir, point, origin, 80, knockback, dflags, mod); + ShowFrontHoleDamage (monster, GZ_LEG_UPPER_RIGHT_FRONT, GZ_LEG_UPPER_RIGHT_BACK, inflictor, attacker, dir, point, origin, 80, knockback, dflags, mod); + ShowFrontHoleDamage (monster, GZ_LEG_UPPER_RIGHT_BACK, GZ_LEG_UPPER_RIGHT_FRONT, inflictor, attacker, dir, point, origin, 80, knockback, dflags, mod); + ShowFrontHoleDamage (monster, GZ_HEAD_BACK, GZ_HEAD_FRONT, inflictor, attacker, dir, point, origin, 80, knockback, dflags, mod); + ShowFrontHoleDamage (monster, GZ_SHLDR_RIGHT_BACK, GZ_SHLDR_RIGHT_FRONT, inflictor, attacker, dir, point, origin, 80, knockback, dflags, mod); + ShowFrontHoleDamage (monster, GZ_SHLDR_LEFT_BACK, GZ_SHLDR_LEFT_FRONT, inflictor, attacker, dir, point, origin, 80, knockback, dflags, mod); + ShowFrontHoleDamage (monster, GZ_CHEST_BACK, GZ_CHEST_FRONT, inflictor, attacker, dir, point, origin, 80, knockback, dflags, mod); +*/ + + // If this is mangle damage, just gib anyway... + currentGoreZone = GZ_CHEST_FRONT; + + switch(currentGoreZone) + { + case GZ_HEAD_FRONT: + case GZ_HEAD_BACK: + case GZ_NECK: + // Sever head + frontHole = &gzones[GZ_HEAD_FRONT]; + frontCode = GZ_HEAD_FRONT; + backHole = &gzones[GZ_HEAD_BACK]; + backCode = GZ_HEAD_BACK; + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + break; + + case GZ_ARM_UPPER_RIGHT: + frontHole = &gzones[GZ_ARM_UPPER_RIGHT]; + frontCode = GZ_ARM_UPPER_RIGHT; + backHole = &gzones[GZ_ARM_UPPER_RIGHT]; + backCode = GZ_ARM_UPPER_RIGHT; + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + break; + + case GZ_ARM_UPPER_LEFT: + frontHole = &gzones[GZ_ARM_UPPER_LEFT]; + frontCode = GZ_ARM_UPPER_LEFT; + backHole = &gzones[GZ_ARM_UPPER_LEFT]; + backCode = GZ_ARM_UPPER_LEFT; + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + break; + + case GZ_ARM_LOWER_RIGHT: + frontHole = &gzones[GZ_ARM_LOWER_RIGHT]; + frontCode = GZ_ARM_LOWER_RIGHT; + backHole = &gzones[GZ_ARM_LOWER_RIGHT]; + backCode = GZ_ARM_LOWER_RIGHT; + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + break; + + case GZ_ARM_LOWER_LEFT: + frontHole = &gzones[GZ_ARM_LOWER_LEFT]; + frontCode = GZ_ARM_LOWER_LEFT; + backHole = &gzones[GZ_ARM_LOWER_LEFT]; + backCode = GZ_ARM_LOWER_LEFT; + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + break; + + case GZ_LEG_UPPER_RIGHT_FRONT: + case GZ_LEG_UPPER_RIGHT_BACK: + frontHole = &gzones[GZ_LEG_UPPER_RIGHT_FRONT]; + frontCode = GZ_LEG_UPPER_RIGHT_FRONT; + backHole = &gzones[GZ_LEG_UPPER_RIGHT_BACK]; + backCode = GZ_LEG_UPPER_RIGHT_BACK; + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + break; + + case GZ_LEG_UPPER_LEFT_FRONT: + case GZ_LEG_UPPER_LEFT_BACK: + frontHole = &gzones[GZ_LEG_UPPER_LEFT_FRONT]; + frontCode = GZ_LEG_UPPER_LEFT_FRONT; + backHole = &gzones[GZ_LEG_UPPER_LEFT_BACK]; + backCode = GZ_LEG_UPPER_LEFT_BACK; + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + break; + + case GZ_LEG_LOWER_RIGHT: + case GZ_FOOT_RIGHT: + frontHole = &gzones[GZ_ARM_LOWER_RIGHT]; + frontCode = GZ_ARM_LOWER_RIGHT; + backHole = &gzones[GZ_ARM_LOWER_RIGHT]; + backCode = GZ_ARM_LOWER_RIGHT; + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + break; + + case GZ_LEG_LOWER_LEFT: + case GZ_FOOT_LEFT: + frontHole = &gzones[GZ_ARM_LOWER_LEFT]; + frontCode = GZ_ARM_LOWER_LEFT; + backHole = &gzones[GZ_ARM_LOWER_LEFT]; + backCode = GZ_ARM_LOWER_LEFT; + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + break; + + case GZ_SHLDR_RIGHT_FRONT: + case GZ_SHLDR_RIGHT_BACK: + case GZ_SHLDR_LEFT_FRONT: + case GZ_SHLDR_LEFT_BACK: + case GZ_CHEST_FRONT: + case GZ_CHEST_BACK: + case GZ_GUT_FRONT: + case GZ_GUT_BACK: + case GZ_GROIN: + case GZ_GUT_FRONT_EXTRA: + case GZ_GUT_BACK_EXTRA: + default: + // Randomly remove a bunch of limbs and turn the body into goo. + // pop the head + if (gzones[GZ_HEAD_FRONT].parent_id&&monster.ghoulInst&&monster.ghoulInst->GetPartOnOff(gzones[GZ_HEAD_FRONT].parent_id)) + { + if(gi.irand(0,1)) + { + throwdir[0] = dir[0] + gi.flrand(-1.5, 1.5); + throwdir[1] = dir[1] + gi.flrand(-1.5, 1.5); + throwdir[2] = dir[2] + gi.flrand(1.0, 2.0); + + frontHole = &gzones[GZ_HEAD_FRONT]; + frontCode = GZ_HEAD_FRONT; + backHole = &gzones[GZ_HEAD_BACK]; + backCode = GZ_HEAD_BACK; + + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + totalsevers++; + } + } + else + { + totalsevers++; + } + + if (gzones[GZ_ARM_UPPER_LEFT].parent_id&&monster.ghoulInst&&monster.ghoulInst->GetPartOnOff(gzones[GZ_ARM_UPPER_LEFT].parent_id)) + { + if(gi.irand(0,1)) + { + throwdir[0] = dir[0] + gi.flrand(-1.5, 1.5); + throwdir[1] = dir[1] + gi.flrand(-1.5, 1.5); + throwdir[2] = dir[2] + gi.flrand(1.0, 2.0); + + frontHole = &gzones[GZ_ARM_UPPER_LEFT]; + frontCode = GZ_ARM_UPPER_LEFT; + backHole = &gzones[GZ_ARM_UPPER_LEFT]; + backCode = GZ_ARM_UPPER_LEFT; + + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + totalsevers++; + } + } + else + { + totalsevers++; + } + + if (gzones[GZ_ARM_UPPER_RIGHT].parent_id&&monster.ghoulInst&&monster.ghoulInst->GetPartOnOff(gzones[GZ_ARM_UPPER_RIGHT].parent_id)) + { + if(gi.irand(0,1)) + { + throwdir[0] = dir[0] + gi.flrand(-1.5, 1.5); + throwdir[1] = dir[1] + gi.flrand(-1.5, 1.5); + throwdir[2] = dir[2] + gi.flrand(1.0, 2.0); + + frontHole = &gzones[GZ_ARM_UPPER_RIGHT]; + frontCode = GZ_ARM_UPPER_RIGHT; + backHole = &gzones[GZ_ARM_UPPER_RIGHT]; + backCode = GZ_ARM_UPPER_RIGHT; + + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + totalsevers++; + } + } + else + { + totalsevers++; + } + + if (gzones[GZ_ARM_LOWER_LEFT].parent_id&&monster.ghoulInst&&monster.ghoulInst->GetPartOnOff(gzones[GZ_ARM_LOWER_LEFT].parent_id)) + { + if(gi.irand(0,1)) + { + throwdir[0] = dir[0] + gi.flrand(-1.5, 1.5); + throwdir[1] = dir[1] + gi.flrand(-1.5, 1.5); + throwdir[2] = dir[2] + gi.flrand(1.0, 2.0); + + frontHole = &gzones[GZ_ARM_LOWER_LEFT]; + frontCode = GZ_ARM_LOWER_LEFT; + backHole = &gzones[GZ_ARM_LOWER_LEFT]; + backCode = GZ_ARM_LOWER_LEFT; + + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + totalsevers++; + } + } + else + { + totalsevers++; + } + + if (gzones[GZ_ARM_LOWER_RIGHT].parent_id&&monster.ghoulInst&&monster.ghoulInst->GetPartOnOff(gzones[GZ_ARM_LOWER_RIGHT].parent_id)) + { + if(gi.irand(0,1)) + { + throwdir[0] = dir[0] + gi.flrand(-1.5, 1.5); + throwdir[1] = dir[1] + gi.flrand(-1.5, 1.5); + throwdir[2] = dir[2] + gi.flrand(1.0, 2.0); + + frontHole = &gzones[GZ_ARM_LOWER_RIGHT]; + frontCode = GZ_ARM_LOWER_RIGHT; + backHole = &gzones[GZ_ARM_LOWER_RIGHT]; + backCode = GZ_ARM_LOWER_RIGHT; + + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + totalsevers++; + } + } + else + { + totalsevers++; + } + + if (gzones[GZ_LEG_UPPER_LEFT_FRONT].parent_id&&monster.ghoulInst&&monster.ghoulInst->GetPartOnOff(gzones[GZ_LEG_UPPER_LEFT_FRONT].parent_id)) + { + if(gi.irand(0,1)) + { + throwdir[0] = dir[0] + gi.flrand(-1.5, 1.5); + throwdir[1] = dir[1] + gi.flrand(-1.5, 1.5); + throwdir[2] = dir[2] + gi.flrand(1.0, 2.0); + + frontHole = &gzones[GZ_LEG_UPPER_LEFT_FRONT]; + frontCode = GZ_LEG_UPPER_LEFT_FRONT; + backHole = &gzones[GZ_LEG_UPPER_LEFT_BACK]; + backCode = GZ_LEG_UPPER_LEFT_BACK; + + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + totalsevers++; + } + } + else + { + totalsevers++; + } + + if (gzones[GZ_LEG_UPPER_RIGHT_FRONT].parent_id&&monster.ghoulInst&&monster.ghoulInst->GetPartOnOff(gzones[GZ_LEG_UPPER_RIGHT_FRONT].parent_id)) + { + if(gi.irand(0,1)) + { + throwdir[0] = dir[0] + gi.flrand(-1.5, 1.5); + throwdir[1] = dir[1] + gi.flrand(-1.5, 1.5); + throwdir[2] = dir[2] + gi.flrand(1.0, 2.0); + + frontHole = &gzones[GZ_LEG_UPPER_RIGHT_FRONT]; + frontCode = GZ_LEG_UPPER_RIGHT_FRONT; + backHole = &gzones[GZ_LEG_UPPER_RIGHT_BACK]; + backCode = GZ_LEG_UPPER_RIGHT_BACK; + + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + totalsevers++; + } + } + else + { + totalsevers++; + } + + if (gzones[GZ_LEG_LOWER_LEFT].parent_id&&monster.ghoulInst&&monster.ghoulInst->GetPartOnOff(gzones[GZ_LEG_LOWER_LEFT].parent_id)) + { + if(gi.irand(0,1)) + { + throwdir[0] = dir[0] + gi.flrand(-1.5, 1.5); + throwdir[1] = dir[1] + gi.flrand(-1.5, 1.5); + throwdir[2] = dir[2] + gi.flrand(1.0, 2.0); + + frontHole = &gzones[GZ_LEG_LOWER_LEFT]; + frontCode = GZ_LEG_LOWER_LEFT; + backHole = &gzones[GZ_LEG_LOWER_LEFT]; + backCode = GZ_LEG_LOWER_LEFT; + + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + totalsevers++; + } + } + else + { + totalsevers++; + } + + if (gzones[GZ_LEG_LOWER_RIGHT].parent_id&&monster.ghoulInst&&monster.ghoulInst->GetPartOnOff(gzones[GZ_LEG_LOWER_RIGHT].parent_id)) + { + if(gi.irand(0,1)) + { + throwdir[0] = dir[0] + gi.flrand(-1.5, 1.5); + throwdir[1] = dir[1] + gi.flrand(-1.5, 1.5); + throwdir[2] = dir[2] + gi.flrand(1.0, 2.0); + + frontHole = &gzones[GZ_LEG_LOWER_RIGHT]; + frontCode = GZ_LEG_LOWER_RIGHT; + backHole = &gzones[GZ_LEG_LOWER_RIGHT]; + backCode = GZ_LEG_LOWER_RIGHT; + + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + totalsevers++; + } + } + else + { + totalsevers++; + } + + // A severed chest looks MIGHTY dumb... :-/ + if(!gi.irand(0,2)) + { + if (gzones[GZ_CHEST_FRONT].parent_id&&monster.ghoulInst&&monster.ghoulInst->GetPartOnOff(gzones[GZ_CHEST_FRONT].parent_id)) + { + throwdir[0] = dir[0] + gi.flrand(-1.5, 1.5); + throwdir[1] = dir[1] + gi.flrand(-1.5, 1.5); + throwdir[2] = dir[2] + gi.flrand(1.0, 2.0); + + frontHole = &gzones[GZ_CHEST_FRONT]; + frontCode = GZ_CHEST_FRONT; + backHole = &gzones[GZ_CHEST_BACK]; + backCode = GZ_CHEST_BACK; + + SeverRoutine(monster, throwdir, frontCode, backCode, frontHole, backHole); + } + } + + + if ((totalsevers>6) || (dflags&(DT_MANGLE|DT_NEURAL))) + { // Destroy the torso. +/* // Throw big chunks + FX_ThrowDebris(monster.s.origin, dir, gi.flrand(3,4), DEBRIS_MED, MAT_ROCK_FLESH, 0, 0, 0, SURF_BLOOD); + // Throw smaller chunks + FX_ThrowDebris(monster.s.origin, dir, gi.flrand(4,5), DEBRIS_SM, MAT_ROCK_FLESH, 0, 0, 0, SURF_BLOOD); + // Throw tiny chunks + FX_ThrowDebris(monster.s.origin, dir, gi.flrand(4,6), DEBRIS_TINY, MAT_ROCK_FLESH, 0, 0, 0, SURF_BLOOD); +*/ + + monster.gibbed = true; + monster.solid = SOLID_NOT; + fxRunner.exec("gore/gibbody", &monster); + + // Now just remove all remaining bits, I hate having a severed groin remain forever... + if (monster.ghoulInst) + { + monster.ghoulInst->SetOnOff(false, level.time); + game_ghoul.FindOInst(monster.ghoulInst)->RemoveAllBolts(); + } + } + break; + } +} + + +void danglyTouch (edict_t *ent, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if (!lock_blood) + { + if(other) + { + if(other == world) + { + if(VectorLength(ent->velocity) > 2) + { + vec3_t myDir; + + VectorScale(plane->normal, -1, myDir); + fxRunner.setDir(myDir); + fxRunner.exec("gore/danglyblood", ent->s.origin); + } + } + } + } + + VectorSet(ent->avelocity, 0, 0, 0); +} + +void bodyhuman_c::SeverRoutine(edict_t &monster, vec3_t dir, gz_code frontCode, gz_code backCode, gz_info *frontHole, gz_info *backHole, bool forceSever) +{ + gz_info *blownPiece=NULL; + edict_t *danglyBit=0; + ggOinstC *blownInst=0; + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + + if(lock_sever) + { + return; + } + + if (frontHole->blowme->area != GBLOWNAREA_HEAD) + { + //make it less likely to even spawn danglybits after a certain number are gibbed + if (hackGlobalGibCalls < 5 && hackGlobalSpawnedBitsForThisGuy < 2) + { + danglyBit=MakeBlownPart(monster, frontCode, dir, &blownInst, false); + } + } + +/* + if (!danglyBit) + { // couldn't blow off some part + return; + } + */ + + //if there's no cap, I can't allow the part to be blown off + //oop, forgot about all the self-capping biz for armorchests, and there's some other stuff too, I'm sure + //should be safe if we check both cap and capbolt, and make sure suspect guys like mask head don't set either one. + if (!frontHole->cap&&!frontHole->capbolt) + { + return; + } + + if (danglyBit && blownInst) + { + // put proper caps on + if (frontHole->blownCapBolt && blownInst) + { + if (frontHole->capPiece) + { + if (frontHole->capPieceBolt) + { + AddBoltedItem(monster, frontHole->blownCapBolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), frontHole->capPieceBolt, blownInst); + } + else + { + AddBoltedItem(monster, frontHole->blownCapBolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), "to_gbolt", blownInst); + } + } + else + { + AddBoltedItem(monster, frontHole->blownCapBolt, "Enemy/bolt", "g_cap1", "to_gbolt", blownInst); + } + } + if (frontHole->blownCap) + { + danglyBit->ghoulInst->SetPartOnOff(frontHole->blownCap,true); + danglyBit->ghoulInst->SetFrameOverride("c","c_blood",frontHole->blownCap); + } + } +// BlowZone(monster,frontHole->childzone,frontHole->childzone,danglyBit); + BlowZone(monster,frontCode,frontCode,danglyBit); + BlowPart(monster, frontHole->blowme, danglyBit); +/* + if (frontHole->parent_id) + { + myInstance->GetInstPtr()->SetPartOnOff(frontHole->parent_id,false); + } + if (frontHole->id) + { + myInstance->GetInstPtr()->SetPartOnOff(frontHole->id,false); + } + if (backHole && backHole->id) + { + myInstance->GetInstPtr()->SetPartOnOff(backHole->id,false); + } +*/ + // kef -- this has cause an assert in GhoulInst::SetPartOnOff() from grenades and rockets + if (frontHole->cap) + { + myInstance->GetInstPtr()->SetPartOnOff(frontHole->cap,true); + myInstance->GetInstPtr()->SetFrameOverride("c","c_blood",frontHole->cap); + } + if (frontHole->capbolt) + { + if (frontHole->capPiece) + { +/* + if (frontHole->capPieceBolt) + { + AddBoltedItem(monster, frontHole->capbolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), frontHole->capPieceBolt, myInstance); + } + else + { + AddBoltedItem(monster, frontHole->capbolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), "to_gbolt", myInstance); + } +*/ + if (frontHole->capPieceBolt) + { + AddBoltedItem(monster, frontHole->capbolt, frontHole->capPiece, frontHole->capPiece->GetSubName(), frontHole->capPieceBolt, myInstance); + } + else + { + AddBoltedItem(monster, frontHole->capbolt, "Enemy/bolt", frontHole->capPiece->GetSubName(), "to_gbolt", myInstance); + } + if (!strcmp(frontHole->capPiece->GetSubName(), "g_half_head")) + { + if (myInstance->GetBoltInstance(frontHole->capbolt)) + { + // for the half head bolt on, we want to put the living guy's skins on the new bolt on + char headSkinName[128]; + char faceSkinName[128]; + + GhoulID headSkin = monster.ghoulInst->GetFrameOverride("h"); + if (headSkin) + { + monster.ghoulInst->GetGhoulObject()->GetSkinName(headSkin, headSkinName); + myInstance->GetBoltInstance(frontHole->capbolt)->GetInstPtr()->SetFrameOverride("h", headSkinName); + } + + GhoulID faceSkin = monster.ghoulInst->GetFrameOverride("f"); + if (faceSkin) + { + monster.ghoulInst->GetGhoulObject()->GetSkinName(faceSkin, faceSkinName); + myInstance->GetBoltInstance(frontHole->capbolt)->GetInstPtr()->SetFrameOverride("f", faceSkinName); + } + + myInstance->GetBoltInstance(frontHole->capbolt)->GetInstPtr()->SetFrameOverride("gz", "gz_half_head"); + } + } + } + else + { + AddBoltedItem(monster, frontHole->capbolt, "Enemy/bolt", "g_cap1", "to_gbolt", myInstance); + } + if (monster.health>0) + { +// gi.sound (&monster, CHAN_BODY, gi.soundindex ("impact/gore/spout.wav"), .8, ATTN_NORM, 0); +// FX_Bleed(&monster, frontHole->capbolt, 40); + } + else + { +// FX_BloodCloud(&monster, frontHole->capbolt, 100); + } + } + + if (danglyBit) + { + if(((hackGlobalSpawnedBitsForThisGuy >= 2) || (hackGlobalGibCalls > 2)) && !forceSever) + { + G_FreeEdict(danglyBit);//this could be opitmized =/ + return; + } + else + { + VectorScale(dir, gi.flrand(100, 200), danglyBit->velocity); +// danglyBit->avelocity[YAW] = gi.flrand(-750, 750); + danglyBit->touch = danglyTouch; + + if (frontHole->blowme->area != GBLOWNAREA_HEAD) + { + hackGlobalSpawnedBitsForThisGuy++; + } + + if (forceSever) + { + danglyBit->nextthink=level.time+60.0; + } + } + } +} + +void bodyhuman_c::AllocateGoreZones(edict_t &monster) +{ + //eliminate old gore zones... + bodyorganic_c::AllocateGoreZones(monster); + numGoreZones=NUM_HUMANGOREZONES; + gzones=new gz_info[numGoreZones]; +} + +void bodyhuman_c::SetGoreZoneDamageScale(edict_t &monster) +{ + if (numGoreZonesisDM()) + { // this is kind of cheesy, but returning flags won't mean a whole lot in w_fire.cpp + // + // 0 = no movement-impeding damage + //-1 = left leg damaged + // 1 = right leg damaged + if (bodyDamageAccumulated & BODYDAMAGE_LEFTLEG) + { + return -1; + } + else if (bodyDamageAccumulated & BODYDAMAGE_RIGHTLEG) + { + return 1; + } + return 0; + } + else + { // this is standard single player stuff. only used by decisions (at least when I wrote this, anyway). + return bodyDamage & BODYDAMAGE_ANY; + } +} + +int bodyhuman_c::IsAimImpeded(void) +{ + if (dm->isDM()) + { // this is kind of cheesy, but returning flags won't mean a whole lot in w_fire.cpp + // + // 0 = no aim-impeding damage + //-1 = left arm damaged + // 1 = right arm damaged + if (bodyDamageAccumulated & BODYDAMAGE_LEFTARM) + { + return -1; + } + else if (bodyDamageAccumulated & BODYDAMAGE_RIGHTARM) + { + return 1; + } + return 0; + } + return 0; +} + +void bodyhuman_c::RemoveLimbDamage(void) +{ + bodyDamageAccumulated = BODYDAMAGE_NONE; +} + +void bodyhuman_c::AssignFrontAndBackGZones(gz_info **frontHole, gz_code *frontCode, gz_info **backHole, gz_code *backCode) +{ + *frontHole = &gzones[GZ_CHEST_FRONT]; + *frontCode = GZ_CHEST_FRONT; + *backHole = &gzones[GZ_CHEST_BACK]; + *backCode = GZ_CHEST_BACK; +} + + +bodyhuman_c::bodyhuman_c(bodyhuman_c *orig) +: bodyorganic_c(orig) +{ + int i; + + curSoundIndex = orig->curSoundIndex; + curVol = orig->curVol; + curAtten = orig->curAtten; + for(i = 0; i < 64; i++) + { + voiceDirGeneral[i] = orig->voiceDirGeneral[i]; + voiceDirDeath[i] = orig->voiceDirDeath[i]; + } + voiceDirNumber = orig->voiceDirNumber; + for(i = 0; i < 64; i++) + { + face_base[i] = orig->face_base[i]; + } + for(i = 0; i < 64; i++) + { + curface[i] = orig->curface[i]; + } + blink_time = orig->blink_time; + breathe_time = orig->breathe_time; + rLastFireTime = orig->rLastFireTime; + lLastFireTime = orig->lLastFireTime; + nextGreetTime = orig->nextGreetTime; + numGreets = orig->numGreets; + numWakes = orig->numWakes; + curGreet = orig->curGreet; + touchSound = orig->touchSound; + rHandOpen = orig->rHandOpen; + lHandOpen = orig->lHandOpen; + grenadeInHand = orig->grenadeInHand; + bodyDamage = orig->bodyDamage; + bodyDamageAccumulated = orig->bodyDamageAccumulated; + bodyDamageEndRecent = orig->bodyDamageEndRecent; + FinalAnim = orig->FinalAnim; + FinalSound = orig->FinalSound; + rWeaponShot = orig->rWeaponShot; + lWeaponShot = orig->lWeaponShot; + rWeaponAmmo = orig->rWeaponAmmo; + freezeMyBolts = orig->freezeMyBolts; + gutsOut = orig->gutsOut; + justFiredRight = orig->justFiredRight; + lHandAtk = orig->lHandAtk; + rHandAtk = orig->rHandAtk; + deathVoiceType = orig->deathVoiceType; + armorCode = orig->armorCode; + nNextShotKillsMe = orig->nNextShotKillsMe; + bDropBoltons = orig->bDropBoltons; + bBoxConfirmed = orig->bBoxConfirmed; + bVocalCordsWorking = orig->bVocalCordsWorking; +} + +void bodyhuman_c::Evaluate(bodyhuman_c *orig) +{ + int i; + + curSoundIndex = orig->curSoundIndex; + curVol = orig->curVol; + curAtten = orig->curAtten; + for(i = 0; i < 64; i++) + { + voiceDirGeneral[i] = orig->voiceDirGeneral[i]; + voiceDirDeath[i] = orig->voiceDirDeath[i]; + } + voiceDirNumber = orig->voiceDirNumber; + for(i = 0; i < 64; i++) + { + face_base[i] = orig->face_base[i]; + } + for(i = 0; i < 64; i++) + { + curface[i] = orig->curface[i]; + } + blink_time = orig->blink_time; + breathe_time = orig->breathe_time; + rLastFireTime = orig->rLastFireTime; + lLastFireTime = orig->lLastFireTime; + nextGreetTime = orig->nextGreetTime; + numGreets = orig->numGreets; + numWakes = orig->numWakes; + curGreet = orig->curGreet; + touchSound = orig->touchSound; + rHandOpen = orig->rHandOpen; + lHandOpen = orig->lHandOpen; + grenadeInHand = orig->grenadeInHand; + bodyDamage = orig->bodyDamage; + bodyDamageAccumulated = orig->bodyDamageAccumulated; + bodyDamageEndRecent = orig->bodyDamageEndRecent; + FinalAnim = orig->FinalAnim; + FinalSound = orig->FinalSound; + rWeaponShot = orig->rWeaponShot; + lWeaponShot = orig->lWeaponShot; + rWeaponAmmo = orig->rWeaponAmmo; + freezeMyBolts = orig->freezeMyBolts; + gutsOut = orig->gutsOut; + justFiredRight = orig->justFiredRight; + rHandAtk = orig->rHandAtk; + lHandAtk = orig->lHandAtk; + deathVoiceType = orig->deathVoiceType; + armorCode = orig->armorCode; + nNextShotKillsMe = orig->nNextShotKillsMe; + bDropBoltons = orig->bDropBoltons; + bBoxConfirmed = orig->bBoxConfirmed; + bVocalCordsWorking = orig->bVocalCordsWorking; + + bodyorganic_c::Evaluate(orig); +} + +bool bodyhuman_c::FreeKnife(edict_t &monster, ggBinstC* bolted, GhoulID boltKnife) +{ + edict_t *knife = NULL; + Matrix4 EntityToWorld; + Matrix4 BoltToEntity, KnifeToEntity; + Matrix4 KnifeToWorld; + + EntToWorldMatrix(monster.s.origin, monster.s.angles, EntityToWorld); + + if (0 == strcmp(bolted->GetBolteeObject()->GetSubName(), "w_knife")) + { // if the thing attached to this bolt is a knife, create a new + //knife entity and put it where the bolted-on knife was + if (knife = G_Spawn()) + { + Matrix4 matOld, matTip, TipToWorld; + IGhoulInst *oldKnife, *newKnife; + GhoulID boltTip; + + game_ghoul.SetSimpleGhoulModel(knife, "Enemy/Bolt", "w_knife"); + if ((oldKnife = bolted->GetInstPtr()) && + (newKnife = knife->ghoulInst)) + { + oldKnife->GetXForm(matOld); + + monster.ghoulInst->GetBoltMatrix(level.time,BoltToEntity,boltKnife, + IGhoulInst::MatrixType::Entity); + boltTip = knife->ghoulInst->GetGhoulObject()->FindPart("tip"); + knife->ghoulInst->GetBoltMatrix(level.time,matTip,boltTip, + IGhoulInst::MatrixType::Entity); + matTip.Inverse(matTip); + + // concat with the xform of the knife itself + KnifeToEntity.Concat(matOld, BoltToEntity); + + KnifeToWorld.Concat(KnifeToEntity, EntityToWorld); + TipToWorld.Concat(matTip, KnifeToWorld); + + // 3rd row of KnifeToWorld is the world coordinates of the knife + TipToWorld.GetRow(3,*(Vect3 *)knife->s.origin); + + // having retrieved the origin of the matrix, zero it out so it doesn't + //get applied again + Vect3 zero(0,0,0); + TipToWorld.SetRow(3, zero); + + // orient the knife + //KnifeToWorld.Scale(1.0); + + // make sure the only orientation we're giving the knife is due to it's xform + VectorClear(knife->s.angles); +// Matrix4 matOrig(KnifeToWorld), matRot; +// matRot.Rotate(1, M_PI*0.5); +// KnifeToWorld.Concat(matOrig, matRot); + newKnife->SetXForm(TipToWorld); + knife->movetype = MOVETYPE_DAN; + knife->solid = SOLID_BBOX; + knife->clipmask = CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_DEADMONSTER|CONTENTS_SHOT|CONTENTS_WINDOW; + VectorSet (knife->mins, -4, -2, -4); + VectorSet (knife->maxs, 3, 2, 4); + knife->health = 10000; + gi.linkentity(knife); + } + knife->spawnflags|=DROPPED_ITEM; + I_SpawnKnife(knife); + knife->gravity = 1.0; + } + return true; + } + return false; +} + +void bodyhuman_c::FreeKnives(edict_t &monster) +{ + // need to remove all bolted-on knives and replace them with actual knife edicts + ggBinstC *bolted; + ggOinstC *myInstance=game_ghoul.FindOInst(monster.ghoulInst); + + if (NULL == myInstance) + { + return; + } + for (int i = 0; i < numGoreZones; i++) + { + if (gzones[i].blownCapBolt) + { + while (bolted=myInstance->GetBoltInstance(gzones[i].blownCapBolt)) + { + if (FreeKnife(monster, bolted, gzones[i].blownCapBolt)) + { + myInstance->RemoveBoltInstance(bolted); + gi.dprintf("FreeKnives() -- gzones[%d].blownCapBolt\n", i); + } + } + //myInstance->GetInstPtr()->SetPartOnOff(gzones[i].blownCapBolt,false); + } + } + // search default locations for knives + GhoulID defaultBolt = monster.ghoulInst->GetGhoulObject()->FindPart("abolt_hip_r"); + if (bolted=myInstance->GetBoltInstance(defaultBolt)) + { + if (FreeKnife(monster, bolted, defaultBolt)) + { + myInstance->RemoveBoltInstance(bolted); + gi.dprintf("FreeKnives() -- abolt_hip_r\n"); + } + } + defaultBolt = monster.ghoulInst->GetGhoulObject()->FindPart("sbolt_heel_r"); + if (bolted=myInstance->GetBoltInstance(defaultBolt)) + { + if (FreeKnife(monster, bolted, defaultBolt)) + { + myInstance->RemoveBoltInstance(bolted); + gi.dprintf("FreeKnives() -- sbolt_heel_r\n"); + } + } + defaultBolt = monster.ghoulInst->GetGhoulObject()->FindPart("sbolt_heel_l"); + if (bolted=myInstance->GetBoltInstance(defaultBolt)) + { + if (FreeKnife(monster, bolted, defaultBolt)) + { + myInstance->RemoveBoltInstance(bolted); + gi.dprintf("FreeKnives() -- sbolt_heel_l\n"); + } + } + defaultBolt = monster.ghoulInst->GetGhoulObject()->FindPart("gbolt_cap_rbicep_chest_tight"); + if (bolted=myInstance->GetBoltInstance(defaultBolt)) + { + if (FreeKnife(monster, bolted, defaultBolt)) + { + myInstance->RemoveBoltInstance(bolted); + gi.dprintf("FreeKnives() -- gbolt_cap_rbicep_chest_tight\n"); + } + } + defaultBolt = monster.ghoulInst->GetGhoulObject()->FindPart("gbolt_cap_lbicep_chest_tight"); + if (bolted=myInstance->GetBoltInstance(defaultBolt)) + { + if (FreeKnife(monster, bolted, defaultBolt)) + { + myInstance->RemoveBoltInstance(bolted); + gi.dprintf("FreeKnives() -- gbolt_cap_lbicep_chest_tight\n"); + } + } +} + +void bodyhuman_c::UpdateSoundsByWeapon(edict_t &monster, ai_c &which_ai) +{ + // don't do the sound if we have a target or if we're playing a cinematic +/* if( (!which_ai.getTarget()) && + !(game.cinematicfreeze) ) + { + if(gi.irand(1, 160) == 1) + { + char *mySound = 0; + switch(GetRightHandWeapon(monster)) + { + case ATK_FLAMEGUN: + break; + case ATK_MACHINEGUN: + mySound = "Weapons/MGun/Rattle.wav"; + break; + case ATK_PISTOL1: + mySound = "weapons/gpistol/cock.wav"; + break; + case ATK_PISTOL2: + if(gi.irand(0,1)) + { + mySound = "weapons/dpistol/adjust.wav"; + } + else + { + mySound = "weapons/dpistol/cock.wav"; + } + break; + case ATK_SHOTGUN: + mySound = "weapons/shotgun/cock.wav"; + break; + case ATK_SNIPER: + mySound = "Weapons/Sniper/Cock.wav"; + break; + case ATK_ASSAULTRIFLE: + if(gi.irand(0,1)) + { + mySound = "weapons/ipistol/catch.wav"; + } + else + { + mySound = "weapons/dpistol/spinready.wav"; + } + break; + case ATK_MACHINEPISTOL: + mySound = "weapons/ipistol/cock.wav"; + break; + } + if(mySound) + { + gi.sound (&monster, CHAN_WEAPON, gi.soundindex (mySound), .7, 2, 0); + } + } + }*/ + + if(GetRightHandWeapon(monster) != ATK_FLAMEGUN && GetRightHandWeapon(monster) != ATK_MICROWAVE && GetRightHandWeapon(monster) != ATK_MICROWAVE_ALT) + { + return;//if not used below, don't bother + } + + //FIXME!!!FIXME!!! GROSSLY SLOW! + + IGhoulInst *my_inst = monster.ghoulInst; + if (!my_inst) + { + return; + } + + GhoulID my_hand = monster.ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"); + + if (!my_hand) + { + return; + } + + ggBinstC *my_weapon = game_ghoul.FindOInst(monster.ghoulInst)->GetBoltInstance(my_hand); + + if (!my_weapon) + { + return; + } + + GhoulID flash = my_weapon->GetBolteeObject()->GetMyObject()->FindPart("flash"); + + float size; + + if (flash) + { + switch(GetRightHandWeapon(monster)) + { + case ATK_FLAMEGUN: + fxRunner.execWithInst("weapons/othermz/flamecharge", &monster, my_weapon->GetInstPtr(), flash); + if(level.time-rLastFireTime < .5) + { + monster.s.sound = gi.soundindex("Weapons/flamegun/Fire.wav"); + monster.s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + else + { + monster.s.sound = 0; + monster.s.sound_data = 0; + } + break; + case ATK_SNIPER: + /* if(level.time-rLastFireTime > .2) + { + if(VectorLengthSquared(monster.intend_velocity) < 10) + { // time ta zoom, I say. + gi.sound (&monster, CHAN_WEAPON, gi.soundindex ("Weapons/Sniper/zoom.wav"), .7, 1, 0); + } + }*/ + break; + case ATK_MICROWAVE_ALT: + case ATK_MICROWAVE: + //hmm + if(level.time-rLastFireTime > 1.0) + { + size = .1 + ((level.time-rLastFireTime) / 6.0)*.9; + if(size > 1.0) + { + size = 1.0; + } + fxRunner.setScale(size); + fxRunner.execWithInst("weapons/othermz/mpgcharge", &monster, my_weapon->GetInstPtr(), flash); + + if(!(((int)(level.time*5))%5)) + { + fxRunner.exec("weapons/othermz/mpgcharge2", monster.s.origin); + } + } + break; + } + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////// +// +// ecto-specific +// +/////////////////////////////////////////////////////////////////////////////////////////////// + +bodyecto_c::bodyecto_c() +: bodyhuman_c() +{ +} + +void bodyecto_c::RecognizeGoreZones(edict_t &monster) +{ + GhoulID tempHole = 0; + int i; + + InitializeGoreZoneLevels(monster); + + for (i=0;iGetGhoulObject()->FindPart("_headbald"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_FRONT].parent_id=gzones[GZ_HEAD_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_headbald_f", GZ_HEAD_FRONT); + SetGoreZone(monster, "gz_headbald_b", GZ_HEAD_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_headcrew"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_FRONT].parent_id=gzones[GZ_HEAD_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_headcrew_f", GZ_HEAD_FRONT); + SetGoreZone(monster, "gz_headcrew_b", GZ_HEAD_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_headbeard"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_FRONT].parent_id=gzones[GZ_HEAD_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_headbeard_f", GZ_HEAD_FRONT); + SetGoreZone(monster, "gz_headbeard_b", GZ_HEAD_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_headhelmet"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_FRONT].parent_id=gzones[GZ_HEAD_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_headhelmet_f", GZ_HEAD_FRONT); + } + } + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_chest"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_SHLDR_RIGHT_FRONT].parent_id=gzones[GZ_SHLDR_RIGHT_BACK].parent_id= + gzones[GZ_SHLDR_LEFT_FRONT].parent_id=gzones[GZ_SHLDR_LEFT_BACK].parent_id= + gzones[GZ_CHEST_FRONT].parent_id=gzones[GZ_CHEST_BACK].parent_id=tempHole; + SetGoreCap(monster, "_Cap_chest_head", GZ_HEAD_FRONT); + SetGoreCap(monster, "_Cap_chest_head", GZ_HEAD_BACK); + SetGoreCap(monster, "_Cap_chest_rbicep", GZ_ARM_UPPER_RIGHT); + SetGoreCap(monster, "_Cap_chest_lbicep", GZ_ARM_UPPER_LEFT); + SetGoreCap(monster, "_Cap_hips_chest", GZ_CHEST_FRONT); + SetGoreCap(monster, "_Cap_hips_chest", GZ_CHEST_BACK); + SetGoreBlownCap(monster, "_Cap_chest_hips", GZ_CHEST_FRONT); + SetGoreBlownCap(monster, "_Cap_chest_hips", GZ_CHEST_BACK); + SetGoreZone(monster, "gz_chest_rfshldr", GZ_SHLDR_RIGHT_FRONT); + SetGoreZone(monster, "gz_chest_lfshldr", GZ_SHLDR_LEFT_FRONT); + SetGoreZone(monster, "gz_chest_rbshldr", GZ_SHLDR_RIGHT_BACK); + SetGoreZone(monster, "gz_chest_lbshldr", GZ_SHLDR_LEFT_BACK); + SetGoreZone(monster, "gz_chest_f", GZ_CHEST_FRONT); + SetGoreZone(monster, "gz_chest_b", GZ_CHEST_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_coatchest"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_SHLDR_RIGHT_FRONT].parent_id=gzones[GZ_SHLDR_RIGHT_BACK].parent_id= + gzones[GZ_SHLDR_LEFT_FRONT].parent_id=gzones[GZ_SHLDR_LEFT_BACK].parent_id= + gzones[GZ_CHEST_FRONT].parent_id=gzones[GZ_CHEST_BACK].parent_id=tempHole; + SetGoreCap(monster, "_Cap_coatchest_head", GZ_HEAD_FRONT); + SetGoreCap(monster, "_Cap_coatchest_head", GZ_HEAD_BACK); + SetGoreCap(monster, "_Cap_coatchest_rbicep", GZ_ARM_UPPER_RIGHT); + SetGoreCap(monster, "_Cap_coatchest_lbicep", GZ_ARM_UPPER_LEFT); + SetGoreCap(monster, "_Cap_coathips_coatchest", GZ_CHEST_FRONT); + SetGoreCap(monster, "_Cap_coathips_coatchest", GZ_CHEST_BACK); + SetGoreBlownCap(monster, "_Cap_coatchest_coathips", GZ_CHEST_FRONT); + SetGoreBlownCap(monster, "_Cap_coatchest_coathips", GZ_CHEST_BACK); + SetGoreZone(monster, "gz_coatchest_rfshldr", GZ_SHLDR_RIGHT_FRONT); + SetGoreZone(monster, "gz_coatchest_lfshldr", GZ_SHLDR_LEFT_FRONT); + SetGoreZone(monster, "gz_coatchest_rbshldr", GZ_SHLDR_RIGHT_BACK); + SetGoreZone(monster, "gz_coatchest_lbshldr", GZ_SHLDR_LEFT_BACK); + SetGoreZone(monster, "gz_coatchest_f", GZ_CHEST_FRONT); + SetGoreZone(monster, "gz_coatchest_b", GZ_CHEST_BACK); + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rbicep"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_UPPER_RIGHT].parent_id=tempHole; + gzones[GZ_ARM_UPPER_RIGHT].childzone=GZ_ARM_LOWER_RIGHT; + SetGoreZone(monster, "gz_rbicep", GZ_ARM_UPPER_RIGHT); + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lbicep"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_UPPER_LEFT].parent_id=tempHole; + gzones[GZ_ARM_UPPER_LEFT].childzone=GZ_ARM_LOWER_LEFT; + SetGoreZone(monster, "gz_lbicep", GZ_ARM_UPPER_LEFT); + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lforearm"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lforearm", GZ_ARM_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lforearm_lbicep", GZ_ARM_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lforearmcuff"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lforearmcuff", GZ_ARM_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lforearmcuff_lbicep", GZ_ARM_LOWER_LEFT); + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rforearm"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rforearm", GZ_ARM_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rforearm_rbicep", GZ_ARM_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rforearmcuff"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rforearmcuff", GZ_ARM_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rforearmcuff_rbicep", GZ_ARM_LOWER_RIGHT); + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_coathips"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_GUT_FRONT].parent_id= + gzones[GZ_GUT_BACK].parent_id= + gzones[GZ_LEG_UPPER_RIGHT_FRONT].parent_id= + gzones[GZ_LEG_UPPER_RIGHT_BACK].parent_id= + gzones[GZ_LEG_UPPER_LEFT_FRONT].parent_id= + gzones[GZ_LEG_UPPER_LEFT_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_coathips_fgut", GZ_GUT_FRONT); + SetGoreZone(monster, "gz_coathips_bgut", GZ_GUT_BACK); + SetGoreZone(monster, "gz_coathips_rbthigh", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreZone(monster, "gz_coathips_rfthigh", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreZone(monster, "gz_coathips_lbthigh", GZ_LEG_UPPER_LEFT_BACK); + SetGoreZone(monster, "gz_coathips_lfthigh", GZ_LEG_UPPER_LEFT_FRONT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_hips"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_GUT_FRONT].parent_id=tempHole; + gzones[GZ_GUT_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_hips_fgut", GZ_GUT_FRONT); + SetGoreZone(monster, "gz_hips_bgut", GZ_GUT_BACK); + SetGoreCapBolt(monster, "gbolt_Cap_hips_rthigh", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreCapBolt(monster, "gbolt_Cap_hips_rthigh", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreCapBolt(monster, "gbolt_Cap_hips_lthigh", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreCapBolt(monster, "gbolt_Cap_hips_lthigh", GZ_LEG_UPPER_LEFT_BACK); + SetGoreBlownCapBolt(monster, "gbolt_Cap_rthigh_hips", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreBlownCapBolt(monster, "gbolt_Cap_rthigh_hips", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreBlownCapBolt(monster, "gbolt_Cap_lthigh_hips", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreBlownCapBolt(monster, "gbolt_Cap_lthigh_hips", GZ_LEG_UPPER_LEFT_BACK); + SetGoreCap(monster, "_Cap_hips_rthigh", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreCap(monster, "_Cap_hips_rthigh", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreCap(monster, "_Cap_hips_lthigh", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreCap(monster, "_Cap_hips_lthigh", GZ_LEG_UPPER_LEFT_BACK); + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rthigh"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_UPPER_RIGHT_BACK].parent_id= + gzones[GZ_LEG_UPPER_RIGHT_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_rfthigh", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreZone(monster, "gz_rbthigh", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreCap(monster, "_Cap_rthigh_rcalf", GZ_LEG_LOWER_RIGHT); + SetGoreCapBolt(monster, "gbolt_Cap_rthigh_rcalf", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCapBolt(monster, "gbolt_Cap_rcalf_rthigh", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rthigh_hips", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreBlownCap(monster, "_Cap_rthigh_hips", GZ_LEG_UPPER_RIGHT_BACK); + gzones[GZ_LEG_UPPER_RIGHT_FRONT].childzone=GZ_LEG_UPPER_RIGHT_BACK; + gzones[GZ_LEG_UPPER_RIGHT_BACK].childzone=GZ_LEG_UPPER_RIGHT_FRONT; + gzones[GZ_LEG_UPPER_RIGHT_FRONT].blowme=&ecto_blown_parts[GBLOWN_ECTO_THIGHRIGHT]; + gzones[GZ_LEG_UPPER_RIGHT_BACK].blowme=&ecto_blown_parts[GBLOWN_ECTO_THIGHRIGHT]; + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lthigh"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_UPPER_LEFT_BACK].parent_id= + gzones[GZ_LEG_UPPER_LEFT_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_lfthigh", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreZone(monster, "gz_lbthigh", GZ_LEG_UPPER_LEFT_BACK); + SetGoreCap(monster, "_Cap_lthigh_lcalf", GZ_LEG_LOWER_LEFT); + SetGoreCapBolt(monster, "gbolt_Cap_lthigh_lcalf", GZ_LEG_LOWER_LEFT); + SetGoreBlownCapBolt(monster, "gbolt_Cap_lcalf_lthigh", GZ_LEG_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lthigh_hips", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreBlownCap(monster, "_Cap_lthigh_hips", GZ_LEG_UPPER_LEFT_BACK); + gzones[GZ_LEG_UPPER_LEFT_FRONT].childzone=GZ_LEG_UPPER_LEFT_BACK; + gzones[GZ_LEG_UPPER_LEFT_BACK].childzone=GZ_LEG_UPPER_LEFT_FRONT; + gzones[GZ_LEG_UPPER_LEFT_FRONT].blowme=&ecto_blown_parts[GBLOWN_ECTO_THIGHLEFT]; + gzones[GZ_LEG_UPPER_LEFT_BACK].blowme=&ecto_blown_parts[GBLOWN_ECTO_THIGHLEFT]; + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lcalf"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lcalf", GZ_LEG_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lcalf_lthigh", GZ_LEG_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lcalfcuff"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lcalfcuff", GZ_LEG_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lcalfcuff_lthigh", GZ_LEG_LOWER_LEFT); + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rcalf"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rcalf", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rcalf_rthigh", GZ_LEG_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rcalfcuff"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rcalfcuff", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rcalfcuff_rthigh", GZ_LEG_LOWER_RIGHT); + } + } +} + +gz_blown_part *bodyecto_c::GetBlownPartForIndex(blown_index theIndex) +{ + if (theIndex < 0 || theIndex > GBLOWN_ECTO_NUM) + { + return &ecto_blown_parts[GBLOWN_ECTO_NUM]; + } + return &ecto_blown_parts[theIndex]; +} + +bodyecto_c::bodyecto_c(bodyecto_c *orig) +: bodyhuman_c(orig) +{ +} + +void bodyecto_c::Evaluate(bodyecto_c *orig) +{ + bodyhuman_c::Evaluate(orig); +} + +void bodyecto_c::Read() +{ + char loaded[sizeof(bodyecto_c)]; + + gi.ReadFromSavegame('AIBE', loaded, sizeof(bodyecto_c)); + Evaluate((bodyecto_c *)loaded); +} + +void bodyecto_c::Write() +{ + bodyecto_c *savable; + + savable = new bodyecto_c(this); + gi.AppendToSavegame('AIBE', savable, sizeof(*this)); + delete savable; + + WriteGZ(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////// +// +// meso-specific +// +/////////////////////////////////////////////////////////////////////////////////////////////// + +bodymeso_c::bodymeso_c() +: bodyhuman_c() +{ +} + +void bodymeso_c::RecognizeGoreZones(edict_t &monster) +{ + GhoulID tempHole = 0; + int i; + + InitializeGoreZoneLevels(monster); + + for (i=0;iGetGhoulObject()->FindPart("_baldhead"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_baldhead_b", GZ_HEAD_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_crewhead"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_crewhead_b", GZ_HEAD_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_beardhead"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_beardhead_b", GZ_HEAD_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_hoodhead"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_hoodhead_b", GZ_HEAD_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_bosshead"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_bosshead_b", GZ_HEAD_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_maskhead"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_BACK].parent_id=gzones[GZ_HEAD_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_maskhead_b", GZ_HEAD_BACK); + SetGoreZone(monster, "gz_maskhead_f", GZ_HEAD_FRONT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_helmethead"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_BACK].parent_id=tempHole; + } + } + } + } + } + } + } + + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_comface"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_comface", GZ_HEAD_FRONT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_beardface"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_beardface", GZ_HEAD_FRONT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_helmetface"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_helmetface", GZ_HEAD_FRONT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_bossface"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_bossface", GZ_HEAD_FRONT); + } + } + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_neck"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_NECK].parent_id=tempHole; + SetGoreCap(monster, "_Cap_neck_head", GZ_HEAD_FRONT); + SetGoreCap(monster, "_Cap_neck_head", GZ_HEAD_BACK); + SetGoreBlownCap(monster, "_Cap_head_neck", GZ_HEAD_FRONT); + SetGoreBlownCap(monster, "_Cap_head_neck", GZ_HEAD_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_bossneck"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_NECK].parent_id=tempHole; + SetGoreCap(monster, "_Cap_neck_head_boss", GZ_HEAD_FRONT); + SetGoreCap(monster, "_Cap_neck_head_boss", GZ_HEAD_BACK); + SetGoreBlownCap(monster, "_Cap_head_neck_boss", GZ_HEAD_FRONT); + SetGoreBlownCap(monster, "_Cap_head_neck_boss", GZ_HEAD_BACK); + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_tightchest"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_SHLDR_RIGHT_FRONT].parent_id=gzones[GZ_SHLDR_RIGHT_BACK].parent_id= + gzones[GZ_SHLDR_LEFT_FRONT].parent_id=gzones[GZ_SHLDR_LEFT_BACK].parent_id= + gzones[GZ_CHEST_FRONT].parent_id=gzones[GZ_CHEST_BACK].parent_id=tempHole; + SetGoreCap(monster, "_Cap_chest_rbicep_tight", GZ_ARM_UPPER_RIGHT); + SetGoreCap(monster, "_Cap_chest_lbicep_tight", GZ_ARM_UPPER_LEFT); + SetGoreBlownCap(monster, "_Cap_chest_hips_tight", GZ_CHEST_FRONT); + SetGoreBlownCap(monster, "_Cap_chest_hips_tight", GZ_CHEST_BACK); + SetGoreZone(monster, "gz_tightchest_rfshldr", GZ_SHLDR_RIGHT_FRONT); + SetGoreZone(monster, "gz_tightchest_lfshldr", GZ_SHLDR_LEFT_FRONT); + SetGoreZone(monster, "gz_tightchest_rbshldr", GZ_SHLDR_RIGHT_BACK); + SetGoreZone(monster, "gz_tightchest_lbshldr", GZ_SHLDR_LEFT_BACK); + SetGoreZone(monster, "gz_tightchest_f", GZ_CHEST_FRONT); + SetGoreZone(monster, "gz_tightchest_b", GZ_CHEST_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_bulkychest"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_SHLDR_RIGHT_FRONT].parent_id=gzones[GZ_SHLDR_RIGHT_BACK].parent_id= + gzones[GZ_SHLDR_LEFT_FRONT].parent_id=gzones[GZ_SHLDR_LEFT_BACK].parent_id= + gzones[GZ_CHEST_FRONT].parent_id=gzones[GZ_CHEST_BACK].parent_id=tempHole; + SetGoreCap(monster, "_Cap_chest_rbicep_bulky", GZ_ARM_UPPER_RIGHT); + SetGoreCap(monster, "_Cap_chest_lbicep_bulky", GZ_ARM_UPPER_LEFT); + SetGoreBlownCap(monster, "_Cap_chest_hips_bulky", GZ_CHEST_FRONT); + SetGoreBlownCap(monster, "_Cap_chest_hips_bulky", GZ_CHEST_BACK); + SetGoreZone(monster, "gz_bulkychest_rfshldr", GZ_SHLDR_RIGHT_FRONT); + SetGoreZone(monster, "gz_bulkychest_lfshldr", GZ_SHLDR_LEFT_FRONT); + SetGoreZone(monster, "gz_bulkychest_rbshldr", GZ_SHLDR_RIGHT_BACK); + SetGoreZone(monster, "gz_bulkychest_lbshldr", GZ_SHLDR_LEFT_BACK); + SetGoreZone(monster, "gz_bulkychest_f", GZ_CHEST_FRONT); + SetGoreZone(monster, "gz_bulkychest_b", GZ_CHEST_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_chest_b_t"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_SHLDR_RIGHT_FRONT].parent_id=gzones[GZ_SHLDR_RIGHT_BACK].parent_id= + gzones[GZ_SHLDR_LEFT_FRONT].parent_id=gzones[GZ_SHLDR_LEFT_BACK].parent_id= + gzones[GZ_CHEST_FRONT].parent_id=gzones[GZ_CHEST_BACK].parent_id=tempHole; + SetGoreCap(monster, "_Cap_chest_rbicep_bulky", GZ_ARM_UPPER_RIGHT); + SetGoreCap(monster, "_Cap_chest_lbicep_bulky", GZ_ARM_UPPER_LEFT); + SetGoreBlownCap(monster, "_Cap_chest_hips_tight", GZ_CHEST_FRONT); + SetGoreBlownCap(monster, "_Cap_chest_hips_tight", GZ_CHEST_BACK); + SetGoreZone(monster, "gz_chest_b_t_rfshldr", GZ_SHLDR_RIGHT_FRONT); + SetGoreZone(monster, "gz_chest_b_t_lfshldr", GZ_SHLDR_LEFT_FRONT); + SetGoreZone(monster, "gz_chest_b_t_rbshldr", GZ_SHLDR_RIGHT_BACK); + SetGoreZone(monster, "gz_chest_b_t_lbshldr", GZ_SHLDR_LEFT_BACK); + SetGoreZone(monster, "gz_chest_b_t_f", GZ_CHEST_FRONT); + SetGoreZone(monster, "gz_chest_b_t_b", GZ_CHEST_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_bosschest"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_SHLDR_RIGHT_FRONT].parent_id=gzones[GZ_SHLDR_RIGHT_BACK].parent_id= + gzones[GZ_SHLDR_LEFT_FRONT].parent_id=gzones[GZ_SHLDR_LEFT_BACK].parent_id= + gzones[GZ_CHEST_FRONT].parent_id=gzones[GZ_CHEST_BACK].parent_id=tempHole; + SetGoreCap(monster, "_Cap_chest_rbicep_boss", GZ_ARM_UPPER_RIGHT); + SetGoreCap(monster, "_Cap_chest_lbicep_boss", GZ_ARM_UPPER_LEFT); + SetGoreBlownCap(monster, "_Cap_chest_hips_boss", GZ_CHEST_FRONT); + SetGoreBlownCap(monster, "_Cap_chest_hips_boss", GZ_CHEST_BACK); + SetGoreZone(monster, "gz_bosschest_rfshldr", GZ_SHLDR_RIGHT_FRONT); + SetGoreZone(monster, "gz_bosschest_lfshldr", GZ_SHLDR_LEFT_FRONT); + SetGoreZone(monster, "gz_bosschest_rbshldr", GZ_SHLDR_RIGHT_BACK); + SetGoreZone(monster, "gz_bosschest_lbshldr", GZ_SHLDR_LEFT_BACK); + SetGoreZone(monster, "gz_bosschest_f", GZ_CHEST_FRONT); + SetGoreZone(monster, "gz_bosschest_b", GZ_CHEST_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_armorchest"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_SHLDR_RIGHT_FRONT].parent_id=gzones[GZ_SHLDR_RIGHT_BACK].parent_id= + gzones[GZ_SHLDR_LEFT_FRONT].parent_id=gzones[GZ_SHLDR_LEFT_BACK].parent_id= + gzones[GZ_CHEST_FRONT].parent_id=gzones[GZ_CHEST_BACK].parent_id=tempHole; + SetGoreBlownCap(monster, "_Cap_chest_hips_bulky", GZ_CHEST_FRONT); + SetGoreBlownCap(monster, "_Cap_chest_hips_bulky", GZ_CHEST_BACK); + SetGoreZone(monster, "gz_armorchest_rfshldr", GZ_SHLDR_RIGHT_FRONT); + SetGoreZone(monster, "gz_armorchest_lfshldr", GZ_SHLDR_LEFT_FRONT); + SetGoreZone(monster, "gz_armorchest_rbshldr", GZ_SHLDR_RIGHT_BACK); + SetGoreZone(monster, "gz_armorchest_lbshldr", GZ_SHLDR_LEFT_BACK); + SetGoreZone(monster, "gz_armorchest_f", GZ_CHEST_FRONT); + SetGoreZone(monster, "gz_armorchest_b", GZ_CHEST_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_maskchest"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_CHEST_FRONT].parent_id=gzones[GZ_CHEST_BACK].parent_id=tempHole; + SetGoreCap(monster, "_Cap_chest_rbicep_bulky", GZ_ARM_UPPER_RIGHT); + SetGoreCap(monster, "_Cap_chest_lbicep_bulky", GZ_ARM_UPPER_LEFT); + SetGoreBlownCap(monster, "_Cap_chest_hips_bulky", GZ_CHEST_FRONT); + SetGoreBlownCap(monster, "_Cap_chest_hips_bulky", GZ_CHEST_BACK); + SetGoreZone(monster, "gz_maskchest_f", GZ_CHEST_FRONT); + SetGoreZone(monster, "gz_maskchest_b", GZ_CHEST_BACK); + + //no blown off heads! and get off my lawn, you damn kids! + SetGoreCapBolt(monster, "no_gore_for_me_please", GZ_HEAD_FRONT); + SetGoreCapBolt(monster, "no_gore_for_me_please", GZ_HEAD_BACK); + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_maskneck"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_SHLDR_RIGHT_FRONT].parent_id=gzones[GZ_SHLDR_RIGHT_BACK].parent_id= + gzones[GZ_SHLDR_LEFT_FRONT].parent_id=gzones[GZ_SHLDR_LEFT_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_maskneck_rfshldr", GZ_SHLDR_RIGHT_FRONT); + SetGoreZone(monster, "gz_maskneck_lfshldr", GZ_SHLDR_LEFT_FRONT); + SetGoreZone(monster, "gz_maskneck_rbshldr", GZ_SHLDR_RIGHT_BACK); + SetGoreZone(monster, "gz_maskneck_lbshldr", GZ_SHLDR_LEFT_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_hoodneck"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_SHLDR_RIGHT_FRONT].parent_id=gzones[GZ_SHLDR_RIGHT_BACK].parent_id= + gzones[GZ_SHLDR_LEFT_FRONT].parent_id=gzones[GZ_SHLDR_LEFT_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_hoodneck_rfshldr", GZ_SHLDR_RIGHT_FRONT); + SetGoreZone(monster, "gz_hoodneck_lfshldr", GZ_SHLDR_LEFT_FRONT); + SetGoreZone(monster, "gz_hoodneck_rbshldr", GZ_SHLDR_RIGHT_BACK); + SetGoreZone(monster, "gz_hoodneck_lbshldr", GZ_SHLDR_LEFT_BACK); + } + } + } + } + } + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rbicep_b_b"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_UPPER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rbicep_b_b", GZ_ARM_UPPER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rbicep_chest_bulky", GZ_ARM_UPPER_RIGHT); + SetGoreCap(monster, "_Cap_rbicep_rforearm_b", GZ_ARM_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rbicep_b_t"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_UPPER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rbicep_b_t", GZ_ARM_UPPER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rbicep_chest_bulky", GZ_ARM_UPPER_RIGHT); + SetGoreCap(monster, "_Cap_rbicep_rforearm_t", GZ_ARM_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rbicep_t_b"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_UPPER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rbicep_t_b", GZ_ARM_UPPER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rbicep_chest_tight", GZ_ARM_UPPER_RIGHT); + SetGoreCap(monster, "_Cap_rbicep_rforearm_b", GZ_ARM_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rbicep_t_t"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_UPPER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rbicep_t_t", GZ_ARM_UPPER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rbicep_chest_tight", GZ_ARM_UPPER_RIGHT); + SetGoreCap(monster, "_Cap_rbicep_rforearm_t", GZ_ARM_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rbossbicep"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_UPPER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rbossbicep", GZ_ARM_UPPER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rbicep_chest_boss", GZ_ARM_UPPER_RIGHT); + SetGoreCap(monster, "_Cap_rbicep_rforearm_boss", GZ_ARM_LOWER_RIGHT); + } + } + } + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lbicep_b_b"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_UPPER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lbicep_b_b", GZ_ARM_UPPER_LEFT); + SetGoreBlownCap(monster, "_Cap_lbicep_chest_bulky", GZ_ARM_UPPER_LEFT); + SetGoreCap(monster, "_Cap_lbicep_lforearm_b", GZ_ARM_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lbicep_b_t"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_UPPER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lbicep_b_t", GZ_ARM_UPPER_LEFT); + SetGoreBlownCap(monster, "_Cap_lbicep_chest_bulky", GZ_ARM_UPPER_LEFT); + SetGoreCap(monster, "_Cap_lbicep_lforearm_t", GZ_ARM_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lbicep_t_b"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_UPPER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lbicep_t_b", GZ_ARM_UPPER_LEFT); + SetGoreBlownCap(monster, "_Cap_lbicep_chest_tight", GZ_ARM_UPPER_LEFT); + SetGoreCap(monster, "_Cap_lbicep_lforearm_b", GZ_ARM_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lbicep_t_t"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_UPPER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lbicep_t_t", GZ_ARM_UPPER_LEFT); + SetGoreBlownCap(monster, "_Cap_lbicep_chest_tight", GZ_ARM_UPPER_LEFT); + SetGoreCap(monster, "_Cap_lbicep_lforearm_t", GZ_ARM_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lbossbicep"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_UPPER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lbossbicep", GZ_ARM_UPPER_LEFT); + SetGoreBlownCap(monster, "_Cap_lbicep_chest_boss", GZ_ARM_UPPER_LEFT); + SetGoreCap(monster, "_Cap_lbicep_lforearm_boss", GZ_ARM_LOWER_LEFT); + } + } + } + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lforearm_b_b"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lforearm_b_b", GZ_ARM_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lforearm_lbicep_b", GZ_ARM_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lforearm_b_t"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lforearm_b_t", GZ_ARM_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lforearm_lbicep_b", GZ_ARM_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lforearm_t_t"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lforearm_t_t", GZ_ARM_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lforearm_lbicep_t", GZ_ARM_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lforearm_t_b"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lforearm_t_b", GZ_ARM_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lforearm_lbicep_t", GZ_ARM_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lforearm_t_c"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lforearm_t_c", GZ_ARM_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lforearm_lbicep_t", GZ_ARM_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lbossforearm"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lbossforearm", GZ_ARM_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lforearm_lbicep_boss", GZ_ARM_LOWER_LEFT); + } + } + } + } + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rforearm_b_b"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rforearm_b_b", GZ_ARM_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rforearm_rbicep_b", GZ_ARM_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rforearm_b_t"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rforearm_b_t", GZ_ARM_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rforearm_rbicep_b", GZ_ARM_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rforearm_t_t"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rforearm_t_t", GZ_ARM_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rforearm_rbicep_t", GZ_ARM_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rforearm_t_b"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rforearm_t_b", GZ_ARM_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rforearm_rbicep_t", GZ_ARM_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rforearm_t_c"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rforearm_t_c", GZ_ARM_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rforearm_rbicep_t", GZ_ARM_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rbossforearm"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rbossforearm", GZ_ARM_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rforearm_rbicep_boss", GZ_ARM_LOWER_RIGHT); + } + } + } + } + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_coathips"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_GUT_FRONT].parent_id= + gzones[GZ_GUT_BACK].parent_id= + gzones[GZ_GROIN].parent_id= + tempHole; + SetGoreZone(monster, "gz_coathips_lfthigh", GZ_GUT_FRONT_EXTRA); + SetGoreZone(monster, "gz_coathips_lbthigh", GZ_GUT_BACK_EXTRA); + SetGoreZone(monster, "gz_coathips_rfthigh", GZ_GUT_FRONT); + SetGoreZone(monster, "gz_coathips_rbthigh", GZ_GUT_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_tighthips"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_GUT_FRONT].parent_id= + gzones[GZ_GROIN].parent_id= + gzones[GZ_GUT_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_tighthips_f", GZ_GUT_FRONT); + SetGoreZone(monster, "gz_tighthips_b", GZ_GUT_BACK); + SetGoreCap(monster, "_Cap_hips_chest_tight", GZ_CHEST_FRONT); + SetGoreCap(monster, "_Cap_hips_chest_tight", GZ_CHEST_BACK); + SetGoreCap(monster, "_Cap_hips_rthigh_tight", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreCap(monster, "_Cap_hips_rthigh_tight", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreCap(monster, "_Cap_hips_lthigh_tight", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreCap(monster, "_Cap_hips_lthigh_tight", GZ_LEG_UPPER_LEFT_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_bulkyhips"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_GUT_FRONT].parent_id= + gzones[GZ_GROIN].parent_id= + gzones[GZ_GUT_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_bulkyhips_fgut", GZ_GUT_FRONT); + SetGoreZone(monster, "gz_bulkyhips_bgut", GZ_GUT_BACK); + SetGoreCap(monster, "_Cap_hips_chest_bulky", GZ_CHEST_FRONT); + SetGoreCap(monster, "_Cap_hips_chest_bulky", GZ_CHEST_BACK); + SetGoreCap(monster, "_Cap_hips_rthigh_bulky", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreCap(monster, "_Cap_hips_rthigh_bulky", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreCap(monster, "_Cap_hips_lthigh_bulky", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreCap(monster, "_Cap_hips_lthigh_bulky", GZ_LEG_UPPER_LEFT_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_bosships"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_GUT_FRONT].parent_id= + gzones[GZ_GROIN].parent_id= + gzones[GZ_GUT_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_bosships_fgut", GZ_GUT_FRONT); + SetGoreZone(monster, "gz_bosships_bgut", GZ_GUT_BACK); + SetGoreCap(monster, "_Cap_hips_chest_boss", GZ_CHEST_FRONT); + SetGoreCap(monster, "_Cap_hips_chest_boss", GZ_CHEST_BACK); + SetGoreCap(monster, "_Cap_hips_rthigh_boss", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreCap(monster, "_Cap_hips_rthigh_boss", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreCap(monster, "_Cap_hips_lthigh_boss", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreCap(monster, "_Cap_hips_lthigh_boss", GZ_LEG_UPPER_LEFT_BACK); + } + } + } + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rtightthigh"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_UPPER_RIGHT_BACK].parent_id= + gzones[GZ_LEG_UPPER_RIGHT_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_rtightthigh_f", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreZone(monster, "gz_rtightthigh_b", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreCap(monster, "_Cap_rthigh_rcalf_tight", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rthigh_hips_tight", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreBlownCap(monster, "_Cap_rthigh_hips_tight", GZ_LEG_UPPER_RIGHT_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rbulkythigh"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_UPPER_RIGHT_BACK].parent_id= + gzones[GZ_LEG_UPPER_RIGHT_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_rbulkythigh_f", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreZone(monster, "gz_rbulkythigh_b", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreCap(monster, "_Cap_rthigh_rcalf_bulky", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rthigh_hips_bulky", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreBlownCap(monster, "_Cap_rthigh_hips_bulky", GZ_LEG_UPPER_RIGHT_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rbossthigh"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_UPPER_RIGHT_BACK].parent_id= + gzones[GZ_LEG_UPPER_RIGHT_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_rbossthigh_f", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreZone(monster, "gz_rbossthigh_b", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreCap(monster, "_Cap_rthigh_rcalf_boss", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rthigh_hips_boss", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreBlownCap(monster, "_Cap_rthigh_hips_boss", GZ_LEG_UPPER_RIGHT_BACK); + } + } + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_ltightthigh"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_UPPER_LEFT_BACK].parent_id= + gzones[GZ_LEG_UPPER_LEFT_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_ltightthigh_f", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreZone(monster, "gz_ltightthigh_b", GZ_LEG_UPPER_LEFT_BACK); + SetGoreCap(monster, "_Cap_lthigh_lcalf_tight", GZ_LEG_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lthigh_hips_tight", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreBlownCap(monster, "_Cap_lthigh_hips_tight", GZ_LEG_UPPER_LEFT_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lbulkythigh"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_UPPER_LEFT_BACK].parent_id= + gzones[GZ_LEG_UPPER_LEFT_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_lbulkythigh_f", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreZone(monster, "gz_lbulkythigh_b", GZ_LEG_UPPER_LEFT_BACK); + SetGoreCap(monster, "_Cap_lthigh_lcalf_bulky", GZ_LEG_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lthigh_hips_bulky", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreBlownCap(monster, "_Cap_lthigh_hips_bulky", GZ_LEG_UPPER_LEFT_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lbossthigh"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_UPPER_LEFT_BACK].parent_id= + gzones[GZ_LEG_UPPER_LEFT_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_lbossthigh_f", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreZone(monster, "gz_lbossthigh_b", GZ_LEG_UPPER_LEFT_BACK); + SetGoreCap(monster, "_Cap_lthigh_lcalf_boss", GZ_LEG_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lthigh_hips_boss", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreBlownCap(monster, "_Cap_lthigh_hips_boss", GZ_LEG_UPPER_LEFT_BACK); + } + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_ltightcalf"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_ltightcalf", GZ_LEG_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lcalf_lthigh_tight", GZ_LEG_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lcalf_t_b"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lcalf_t_b", GZ_LEG_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lcalf_lthigh_tight", GZ_LEG_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lbulkycalf"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lbulkycalf", GZ_LEG_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lcalf_lthigh_bulky", GZ_LEG_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lbosscalf"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lbosscalf", GZ_LEG_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lcalf_lthigh_boss", GZ_LEG_LOWER_LEFT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lcalfcuff"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_lcalfcuff", GZ_LEG_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lcalf_lthigh_tight", GZ_LEG_LOWER_LEFT); + } + } + } + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rtightcalf"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rtightcalf", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rcalf_rthigh_tight", GZ_LEG_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rcalf_t_b"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rcalf_t_b", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rcalf_rthigh_tight", GZ_LEG_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rbulkycalf"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rbulkycalf", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rcalf_rthigh_bulky", GZ_LEG_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rbosscalf"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rbosscalf", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rcalf_rthigh_boss", GZ_LEG_LOWER_RIGHT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rcalfcuff"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rcalfcuff", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rcalf_rthigh_tight", GZ_LEG_LOWER_RIGHT); + } + } + } + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lbootfoot"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_FOOT_LEFT].parent_id=tempHole; + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lshoefoot"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_FOOT_LEFT].parent_id=tempHole; + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rbootfoot"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_FOOT_RIGHT].parent_id=tempHole; + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rshoefoot"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_FOOT_RIGHT].parent_id=tempHole; + } + } +} + +gz_blown_part *bodymeso_c::GetBlownPartForIndex(blown_index theIndex) +{ + if (theIndex < 0 || theIndex > GBLOWN_MESO_NUM) + { + return &meso_blown_parts[GBLOWN_MESO_NUM]; + } + return &meso_blown_parts[theIndex]; +} + +bodymeso_c::bodymeso_c(bodymeso_c *orig) +: bodyhuman_c(orig) +{ +} + +void bodymeso_c::Evaluate(bodymeso_c *orig) +{ + bodyhuman_c::Evaluate(orig); +} + +void bodymeso_c::Read() +{ + char loaded[sizeof(bodymeso_c)]; + + gi.ReadFromSavegame('AIBM', loaded, sizeof(bodymeso_c)); + Evaluate((bodymeso_c *)loaded); +} + +void bodymeso_c::Write() +{ + bodymeso_c *savable; + + savable = new bodymeso_c(this); + gi.AppendToSavegame('AIBM', savable, sizeof(*this)); + delete savable; + + WriteGZ(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////// +// +// female-specific +// +/////////////////////////////////////////////////////////////////////////////////////////////// + +bodyfemale_c::bodyfemale_c() +: bodyhuman_c() +{ +} + +void bodyfemale_c::RecognizeGoreZones(edict_t &monster) +{ + GhoulID tempHole = 0; + int i; + + InitializeGoreZoneLevels(monster); + + for (i=0;iGetGhoulObject()->FindPart("_crewhair"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_crewhair_b", GZ_HEAD_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_MEDMHAIRMHEAD"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_MEDMHAIRMHEAD_b", GZ_HEAD_BACK); + } + } + + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_comface"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_HEAD_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_comface", GZ_HEAD_FRONT); + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_neck"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_NECK].parent_id=tempHole; + SetGoreCap(monster, "_Cap_chest_neck", GZ_HEAD_FRONT); + SetGoreCap(monster, "_Cap_chest_neck", GZ_HEAD_BACK); + SetGoreBlownCap(monster, "_Cap_neck_chest", GZ_HEAD_FRONT); + SetGoreBlownCap(monster, "_Cap_neck_chest", GZ_HEAD_BACK); + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_tightchest"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_SHLDR_RIGHT_FRONT].parent_id=gzones[GZ_SHLDR_RIGHT_BACK].parent_id= + gzones[GZ_SHLDR_LEFT_FRONT].parent_id=gzones[GZ_SHLDR_LEFT_BACK].parent_id= + gzones[GZ_CHEST_FRONT].parent_id=gzones[GZ_CHEST_BACK].parent_id=tempHole; + +// SetGoreCap(monster, "_Cap_chest_rbicep_tight", GZ_ARM_UPPER_RIGHT); +// SetGoreCap(monster, "_Cap_chest_lbicep_tight", GZ_ARM_UPPER_LEFT); + SetGoreCap(monster, "_Cap_chest_rbicep_tight", GZ_ARM_UPPER_LEFT); + SetGoreCap(monster, "_Cap_chest_lbicep_tight", GZ_ARM_UPPER_RIGHT); + + SetGoreBlownCap(monster, "_Cap_chest_hips_tight", GZ_CHEST_FRONT); + SetGoreBlownCap(monster, "_Cap_chest_hips_tight", GZ_CHEST_BACK); + SetGoreZone(monster, "gz_tightchest_rfshldr", GZ_SHLDR_RIGHT_FRONT); + SetGoreZone(monster, "gz_tightchest_lfshldr", GZ_SHLDR_LEFT_FRONT); + SetGoreZone(monster, "gz_tightchest_rbshldr", GZ_SHLDR_RIGHT_BACK); + SetGoreZone(monster, "gz_tightchest_lbshldr", GZ_SHLDR_LEFT_BACK); + SetGoreZone(monster, "gz_tightchest_fgut", GZ_CHEST_FRONT); + SetGoreZone(monster, "gz_tightchest_bgut", GZ_CHEST_BACK); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_armorchest"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_SHLDR_RIGHT_FRONT].parent_id=gzones[GZ_SHLDR_RIGHT_BACK].parent_id= + gzones[GZ_SHLDR_LEFT_FRONT].parent_id=gzones[GZ_SHLDR_LEFT_BACK].parent_id= + gzones[GZ_CHEST_FRONT].parent_id=gzones[GZ_CHEST_BACK].parent_id=tempHole; + SetGoreBlownCap(monster, "_Cap_chest_hips_tight", GZ_CHEST_FRONT); + SetGoreBlownCap(monster, "_Cap_chest_hips_tight", GZ_CHEST_BACK); + SetGoreZone(monster, "gz_armorchest_rfshldr", GZ_SHLDR_RIGHT_FRONT); + SetGoreZone(monster, "gz_armorchest_lfshldr", GZ_SHLDR_LEFT_FRONT); + SetGoreZone(monster, "gz_armorchest_rbshldr", GZ_SHLDR_RIGHT_BACK); + SetGoreZone(monster, "gz_armorchest_lbshldr", GZ_SHLDR_LEFT_BACK); + SetGoreZone(monster, "gz_armorchest_f", GZ_CHEST_FRONT); + SetGoreZone(monster, "gz_armorchest_b", GZ_CHEST_BACK); + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rtightbicep"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_UPPER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rtightbicep", GZ_ARM_UPPER_RIGHT); + +// SetGoreBlownCap(monster, "_Cap_rbicep_chest_tight", GZ_ARM_UPPER_RIGHT); + SetGoreBlownCap(monster, "_Cap_lbicep_chest_tight", GZ_ARM_UPPER_RIGHT); + +// SetGoreCap(monster, "_Cap_rbicep_rforearm_tight", GZ_ARM_LOWER_RIGHT); + SetGoreCap(monster, "_Cap_lbicep_lforearm_tight", GZ_ARM_LOWER_RIGHT); + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_ltightbicep"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_UPPER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_ltightbicep", GZ_ARM_UPPER_LEFT); + +// SetGoreBlownCap(monster, "_Cap_lbicep_chest_tight", GZ_ARM_UPPER_LEFT); + SetGoreBlownCap(monster, "_Cap_rbicep_chest_tight", GZ_ARM_UPPER_LEFT); + +// SetGoreCap(monster, "_Cap_lbicep_lforearm_tight", GZ_ARM_LOWER_LEFT); + SetGoreCap(monster, "_Cap_rbicep_rforearm_tight", GZ_ARM_LOWER_LEFT); + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_ltightforearm"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_ltightforearm", GZ_ARM_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lforearm_lbicep_tight", GZ_ARM_LOWER_LEFT); + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rtightforearm"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_ARM_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rtightforearm", GZ_ARM_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rforearm_rbicep_tight", GZ_ARM_LOWER_RIGHT); + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_dresships"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_GUT_FRONT].parent_id= + gzones[GZ_GUT_BACK].parent_id= + gzones[GZ_LEG_UPPER_RIGHT_FRONT].parent_id= + gzones[GZ_LEG_UPPER_RIGHT_BACK].parent_id= + gzones[GZ_LEG_UPPER_LEFT_FRONT].parent_id= + gzones[GZ_LEG_UPPER_LEFT_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_dresships_fgut", GZ_GUT_FRONT); + SetGoreZone(monster, "gz_dresships_bgut", GZ_GUT_BACK); + SetGoreZone(monster, "gz_dresships_rbthigh", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreZone(monster, "gz_dresships_rfthigh", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreZone(monster, "gz_dresships_lbthigh", GZ_LEG_UPPER_LEFT_BACK); + SetGoreZone(monster, "gz_dresships_lfthigh", GZ_LEG_UPPER_LEFT_FRONT); + } + else + { + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_tighthips"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_GUT_FRONT].parent_id=tempHole; + gzones[GZ_GUT_BACK].parent_id=tempHole; + SetGoreZone(monster, "gz_tighthips_fgut", GZ_GUT_FRONT); + SetGoreZone(monster, "gz_tighthips_bgut", GZ_GUT_BACK); + SetGoreCapBolt(monster, "gbolt_Cap_hips_rthigh_tight", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreCapBolt(monster, "gbolt_Cap_hips_rthigh_tight", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreCapBolt(monster, "gbolt_Cap_hips_lthigh_tight", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreCapBolt(monster, "gbolt_Cap_hips_lthigh_tight", GZ_LEG_UPPER_LEFT_BACK); + SetGoreBlownCapBolt(monster, "gbolt_Cap_rthigh_hips_tight", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreBlownCapBolt(monster, "gbolt_Cap_rthigh_hips_tight", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreBlownCapBolt(monster, "gbolt_Cap_lthigh_hips_tight", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreBlownCapBolt(monster, "gbolt_Cap_lthigh_hips_tight", GZ_LEG_UPPER_LEFT_BACK); + SetGoreCap(monster, "_Cap_hips_rthigh_tight", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreCap(monster, "_Cap_hips_rthigh_tight", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreCap(monster, "_Cap_hips_lthigh_tight", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreCap(monster, "_Cap_hips_lthigh_tight", GZ_LEG_UPPER_LEFT_BACK); + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rtightthigh"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_UPPER_RIGHT_BACK].parent_id= + gzones[GZ_LEG_UPPER_RIGHT_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_rtightthigh_f", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreZone(monster, "gz_rtightthigh_b", GZ_LEG_UPPER_RIGHT_BACK); + SetGoreCap(monster, "_Cap_rthigh_rcalf_tight", GZ_LEG_LOWER_RIGHT); + SetGoreCapBolt(monster, "gbolt_Cap_rthigh_rcalf_tight", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCapBolt(monster, "gbolt_Cap_rcalf_rthigh_tight", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rthigh_hips_tight", GZ_LEG_UPPER_RIGHT_FRONT); + SetGoreBlownCap(monster, "_Cap_rthigh_hips_tight", GZ_LEG_UPPER_RIGHT_BACK); + gzones[GZ_LEG_UPPER_RIGHT_FRONT].childzone=GZ_LEG_UPPER_RIGHT_BACK; + gzones[GZ_LEG_UPPER_RIGHT_BACK].childzone=GZ_LEG_UPPER_RIGHT_FRONT; + gzones[GZ_LEG_UPPER_RIGHT_FRONT].blowme=&female_blown_parts[GBLOWN_FEMALE_THIGHRIGHT]; + gzones[GZ_LEG_UPPER_RIGHT_BACK].blowme=&female_blown_parts[GBLOWN_FEMALE_THIGHRIGHT]; + } + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_ltightthigh"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_UPPER_LEFT_BACK].parent_id= + gzones[GZ_LEG_UPPER_LEFT_FRONT].parent_id=tempHole; + SetGoreZone(monster, "gz_ltightthigh_f", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreZone(monster, "gz_ltightthigh_b", GZ_LEG_UPPER_LEFT_BACK); + SetGoreCap(monster, "_Cap_lthigh_lcalf_tight", GZ_LEG_LOWER_LEFT); + SetGoreCapBolt(monster, "gbolt_Cap_lthigh_lcalf_tight", GZ_LEG_LOWER_LEFT); + SetGoreBlownCapBolt(monster, "gbolt_Cap_lcalf_lthigh_tight", GZ_LEG_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lthigh_hips_tight", GZ_LEG_UPPER_LEFT_FRONT); + SetGoreBlownCap(monster, "_Cap_lthigh_hips_tight", GZ_LEG_UPPER_LEFT_BACK); + gzones[GZ_LEG_UPPER_LEFT_FRONT].childzone=GZ_LEG_UPPER_LEFT_BACK; + gzones[GZ_LEG_UPPER_LEFT_BACK].childzone=GZ_LEG_UPPER_LEFT_FRONT; + gzones[GZ_LEG_UPPER_LEFT_FRONT].blowme=&female_blown_parts[GBLOWN_FEMALE_THIGHLEFT]; + gzones[GZ_LEG_UPPER_LEFT_BACK].blowme=&female_blown_parts[GBLOWN_FEMALE_THIGHLEFT]; + } + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_ltightcalf"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_LEFT].parent_id=tempHole; + SetGoreZone(monster, "gz_ltightcalf", GZ_LEG_LOWER_LEFT); + SetGoreBlownCap(monster, "_Cap_lcalf_lthigh_tight", GZ_LEG_LOWER_LEFT); + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rtightcalf"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_LEG_LOWER_RIGHT].parent_id=tempHole; + SetGoreZone(monster, "gz_rtightcalf", GZ_LEG_LOWER_RIGHT); + SetGoreBlownCap(monster, "_Cap_rcalf_rthigh_tight", GZ_LEG_LOWER_RIGHT); + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_lheels"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_FOOT_LEFT].parent_id=tempHole; + } + + tempHole=monster.ghoulInst->GetGhoulObject()->FindPart("_rheels"); + if (tempHole && monster.ghoulInst->GetPartOnOff(tempHole)) + { + gzones[GZ_FOOT_RIGHT].parent_id=tempHole; + } +} + +gz_blown_part *bodyfemale_c::GetBlownPartForIndex(blown_index theIndex) +{ + if (theIndex < 0 || theIndex > GBLOWN_FEMALE_NUM) + { + return &female_blown_parts[GBLOWN_FEMALE_NUM]; + } + return &female_blown_parts[theIndex]; +} + +bodyfemale_c::bodyfemale_c(bodyfemale_c *orig) +: bodyhuman_c(orig) +{ +} + +void bodyfemale_c::Evaluate(bodyfemale_c *orig) +{ + bodyhuman_c::Evaluate(orig); +} + +void bodyfemale_c::Read() +{ + char loaded[sizeof(bodyfemale_c)]; + + gi.ReadFromSavegame('AIBF', loaded, sizeof(bodyfemale_c)); + Evaluate((bodyfemale_c *)loaded); +} + +void bodyfemale_c::Write() +{ + bodyfemale_c *savable; + + savable = new bodyfemale_c(this); + gi.AppendToSavegame('AIBF', savable, sizeof(*this)); + delete savable; + + WriteGZ(); +} + diff --git a/Source/Game/gamecpp/ai_bodyhuman.h b/Source/Game/gamecpp/ai_bodyhuman.h new file mode 100644 index 0000000..48ef84c --- /dev/null +++ b/Source/Game/gamecpp/ai_bodyhuman.h @@ -0,0 +1,759 @@ + + +extern int bullet_numHits; +extern HitRecord bullet_Hits[20]; +extern Vect3 bullet_EntDir,bullet_EntStart; + +typedef int gz_code; + +// cos of the maximum firing wedge - this used to be 60 degs in either direction (!) +#define MAX_FIRE_WEDGE .717 + +enum// used for scripted kills +{ + NEXTSHOT_NULL = 0, + NEXTSHOT_KILLS, + NEXTSHOT_EXPLODE_MY_NUG, +}; + +typedef enum +{ + GZ_HEAD_FRONT, + GZ_HEAD_BACK, + GZ_NECK, + GZ_SHLDR_RIGHT_FRONT, + GZ_SHLDR_RIGHT_BACK, + GZ_SHLDR_LEFT_FRONT, + GZ_SHLDR_LEFT_BACK, + GZ_CHEST_FRONT, + GZ_CHEST_BACK, + GZ_ARM_UPPER_RIGHT, + GZ_ARM_UPPER_LEFT, + GZ_ARM_LOWER_RIGHT, + GZ_ARM_LOWER_LEFT, + GZ_GUT_FRONT, + GZ_GUT_BACK, + GZ_GROIN, + GZ_LEG_UPPER_RIGHT_FRONT, + GZ_LEG_UPPER_RIGHT_BACK, + GZ_LEG_UPPER_LEFT_FRONT, + GZ_LEG_UPPER_LEFT_BACK, + GZ_LEG_LOWER_RIGHT, + GZ_LEG_LOWER_LEFT, + GZ_FOOT_RIGHT, + GZ_FOOT_LEFT, + GZ_GUT_FRONT_EXTRA, + GZ_GUT_BACK_EXTRA, + NUM_HUMANGOREZONES +} gz_humancode; + +#define blown_index int + +typedef enum +{ + GBLOWNAREA_CHEST, + GBLOWNAREA_RFSHLD, + GBLOWNAREA_RBSHLD, + GBLOWNAREA_LFSHLD, + GBLOWNAREA_LBSHLD, + GBLOWNAREA_NECK, + GBLOWNAREA_HEAD, + GBLOWNAREA_LBICEP, + GBLOWNAREA_LFOREARM, + GBLOWNAREA_LHAND, + GBLOWNAREA_RBICEP, + GBLOWNAREA_RFOREARM, + GBLOWNAREA_RHAND, + GBLOWNAREA_LTHIGH, + GBLOWNAREA_LCALF, + GBLOWNAREA_LFOOT, + GBLOWNAREA_RTHIGH, + GBLOWNAREA_RCALF, + GBLOWNAREA_RFOOT, + GBLOWNAREA_GROIN, + GBLOWNAREA_FINISH + +} blown_area; + +//not including gorezones in this list, need to be handled separately +typedef enum +{ + //ecto: + GBLOWN_ECTO_CHEST, + GBLOWN_ECTO_SHOULD_RF, + GBLOWN_ECTO_SHOULD_RB, + GBLOWN_ECTO_SHOULD_LF, + GBLOWN_ECTO_SHOULDBOLT_L, + GBLOWN_ECTO_SHOULDBOLT_R, + GBLOWN_ECTO_BACKBOLT, + GBLOWN_ECTO_SHOULD_LB, + GBLOWN_ECTO_COATCHEST, + + //shared: + GBLOWN_ECTO_CHESTFINISH, + + //ecto: + GBLOWN_ECTO_HEADBALD, + GBLOWN_ECTO_HEADCREW, + GBLOWN_ECTO_HEADBEARD, + GBLOWN_ECTO_HEADHELMET, + GBLOWN_ECTO_BANGLEFT, + GBLOWN_ECTO_BANGRIGHT, + GBLOWN_ECTO_HAIRMOHAWK, + GBLOWN_ECTO_HAIRPONYTAIL, + + //shared: + GBLOWN_ECTO_EARLEFT, + GBLOWN_ECTO_EARRIGHT, + GBLOWN_ECTO_HEADBOLT, + + //ecto: + GBLOWN_ECTO_BICEPLEFT, + + //ecto: + GBLOWN_ECTO_FOREARMLEFT, + GBLOWN_ECTO_FOREARMCUFFLEFT, + GBLOWN_ECTO_FOREARMCUFFCAPLEFT, + GBLOWN_ECTO_OPENHANDLEFT, + GBLOWN_ECTO_CLOSEDHANDLEFT, + + //shared: + GBLOWN_ECTO_HANDBOLTLEFT, + + //ecto: + GBLOWN_ECTO_BICEPRIGHT, + + //ecto: + GBLOWN_ECTO_FOREARMRIGHT, + GBLOWN_ECTO_FOREARMCUFFRIGHT, + GBLOWN_ECTO_FOREARMCUFFCAPRIGHT, + GBLOWN_ECTO_OPENHANDRIGHT, + GBLOWN_ECTO_CLOSEDHANDRIGHT, + + //shared: + GBLOWN_ECTO_HANDBOLTRIGHT, + + //ecto: + GBLOWN_ECTO_THIGHRIGHT, + + //shared: + GBLOWN_ECTO_THIGHBOLTRIGHT, + GBLOWN_ECTO_THIGHRIGHTSPECIAL, + + //ecto: + GBLOWN_ECTO_CALFRIGHT, + GBLOWN_ECTO_CALFCUFFRIGHT, + GBLOWN_ECTO_CALFCUFFCAPRIGHT, + + //shared: + GBLOWN_ECTO_CALFBOLTRIGHT, + + //ecto: + GBLOWN_ECTO_FOOTRIGHT, + + //ecto: + GBLOWN_ECTO_THIGHLEFT, + + //shared: + GBLOWN_ECTO_THIGHBOLTLEFT, + GBLOWN_ECTO_THIGHLEFTSPECIAL, + + //ecto: + GBLOWN_ECTO_CALFLEFT, + GBLOWN_ECTO_CALFCUFFLEFT, + GBLOWN_ECTO_CALFCUFFCAPLEFT, + + //shared: + GBLOWN_ECTO_CALFBOLTLEFT, + + //ecto: + GBLOWN_ECTO_FOOTLEFT, + + GBLOWN_ECTO_GROIN, + GBLOWN_ECTO_NUM +} ecto_blown_index; + + +typedef enum +{ + GBLOWN_FEMALE_CHEST, + GBLOWN_FEMALE_SHOULD_RF, + GBLOWN_FEMALE_SHOULD_RB, + GBLOWN_FEMALE_SHOULD_LF, + GBLOWN_FEMALE_SHOULD_LB, + GBLOWN_FEMALE_SHOULDBOLT_L, + GBLOWN_FEMALE_SHOULDBOLT_R, + GBLOWN_FEMALE_BACKBOLT, + GBLOWN_FEMALE_NECK, + GBLOWN_FEMALE_ARMORCHEST, + GBLOWN_FEMALE_CHESTFINISH, + + GBLOWN_FEMALE_HEAD, + GBLOWN_FEMALE_FACE, + GBLOWN_FEMALE_CREWHAIR, + GBLOWN_FEMALE_MEDHAIR, + GBLOWN_FEMALE_BANGLEFT, + GBLOWN_FEMALE_BANGRIGHT, + + GBLOWN_FEMALE_EARLEFT, + GBLOWN_FEMALE_EARRIGHT, + GBLOWN_FEMALE_HEADBOLT, + + GBLOWN_FEMALE_BICEPLEFT, + GBLOWN_FEMALE_FOREARMLEFT, + GBLOWN_FEMALE_OPENHANDLEFT, + GBLOWN_FEMALE_CLOSEDHANDLEFT, + GBLOWN_FEMALE_HANDBOLTLEFT, + + GBLOWN_FEMALE_BICEPRIGHT, + GBLOWN_FEMALE_FOREARMRIGHT, + GBLOWN_FEMALE_OPENHANDRIGHT, + GBLOWN_FEMALE_CLOSEDHANDRIGHT, + GBLOWN_FEMALE_HANDBOLTRIGHT, + + GBLOWN_FEMALE_THIGHRIGHT, + GBLOWN_FEMALE_THIGHBOLTRIGHT, + GBLOWN_FEMALE_THIGHRIGHTSPECIAL, + + GBLOWN_FEMALE_CALFRIGHT, + GBLOWN_FEMALE_CALFBOLTRIGHT, + GBLOWN_FEMALE_FOOTRIGHT, + + GBLOWN_FEMALE_THIGHLEFT, + GBLOWN_FEMALE_THIGHBOLTLEFT, + GBLOWN_FEMALE_THIGHLEFTSPECIAL, + + GBLOWN_FEMALE_CALFLEFT, + GBLOWN_FEMALE_CALFBOLTLEFT, + GBLOWN_FEMALE_FOOTLEFT, + + GBLOWN_FEMALE_GROIN, + GBLOWN_FEMALE_NUM, +} female_blown_index; + +//not including gorezones in this list, need to be handled separately +typedef enum +{ + //meso: + GBLOWN_MESO_TIGHTCHEST, + GBLOWN_MESO_MASKCHEST, + GBLOWN_MESO_BULKYCHEST, + GBLOWN_MESO_ARMORCHEST, + GBLOWN_MESO_BOSSCHEST, + GBLOWN_MESO_BTCHEST, + GBLOWN_MESO_NECK, + GBLOWN_MESO_BOSSNECK, + GBLOWN_MESO_MASKNECK, + GBLOWN_MESO_HOODNECK, + GBLOWN_MESO_HEADCAP_NECK, + GBLOWN_MESO_HEADCAP_BOSSNECK, + GBLOWN_MESO_SHOULD_RF, + GBLOWN_MESO_SHOULD_RB, + GBLOWN_MESO_SHOULD_LF, + GBLOWN_MESO_SHOULD_LB, + GBLOWN_MESO_SHOULDBOLT_L, + GBLOWN_MESO_SHOULDBOLT_R, + GBLOWN_MESO_BACKBOLT, + GBLOWN_MESO_CHEST_RARMCAP3, + GBLOWN_MESO_CHEST_LARMCAP3, + GBLOWN_MESO_RARMCAP_CHEST3, + GBLOWN_MESO_LARMCAP_CHEST3, + GBLOWN_MESO_CHEST_RARMCAP4, + GBLOWN_MESO_CHEST_LARMCAP4, + GBLOWN_MESO_RARMCAP_CHEST4, + GBLOWN_MESO_LARMCAP_CHEST4, + + //shared: + GBLOWN_MESO_CHESTFINISH, + + //meso: + GBLOWN_MESO_HEADBALD, + GBLOWN_MESO_HEADCREW, + GBLOWN_MESO_HEADBEARD, + GBLOWN_MESO_HEADHELMET, + GBLOWN_MESO_HEADHOOD, + GBLOWN_MESO_HEADMASK, + GBLOWN_MESO_HEADBOSS, + GBLOWN_MESO_COMFACE, + GBLOWN_MESO_BEARDFACE, + GBLOWN_MESO_HELMETFACE, + GBLOWN_MESO_BOSSFACE, + GBLOWN_MESO_BANGLEFT, + GBLOWN_MESO_BANGRIGHT, + GBLOWN_MESO_HAIRMOHAWK, + GBLOWN_MESO_HAIRPONYTAIL, + + //shared: + GBLOWN_MESO_EARLEFT, + GBLOWN_MESO_EARRIGHT, + GBLOWN_MESO_BOSSEARLEFT, + GBLOWN_MESO_BOSSEARRIGHT, + GBLOWN_MESO_HEADBOLT, + + //meso: + GBLOWN_MESO_BICEPLEFT, + GBLOWN_MESO_BICEPLEFT2, + GBLOWN_MESO_BICEPLEFT3, + GBLOWN_MESO_BICEPLEFT4, + GBLOWN_MESO_BICEPLEFT5, + + //meso: + GBLOWN_MESO_FOREARMLEFT, + GBLOWN_MESO_FOREARMLEFT2, + GBLOWN_MESO_FOREARMLEFT3, + GBLOWN_MESO_FOREARMLEFT4, + GBLOWN_MESO_FOREARMLEFT5, + GBLOWN_MESO_FOREARMLEFT6, + GBLOWN_MESO_OPENHANDLEFT, + GBLOWN_MESO_CLOSEDHANDLEFT, + GBLOWN_MESO_OPENHANDLEFT2, + GBLOWN_MESO_CLOSEDHANDLEFT2, + + //shared: + GBLOWN_MESO_HANDBOLTLEFT, + + //meso: + GBLOWN_MESO_BICEPRIGHT, + GBLOWN_MESO_BICEPRIGHT2, + GBLOWN_MESO_BICEPRIGHT3, + GBLOWN_MESO_BICEPRIGHT4, + GBLOWN_MESO_BICEPRIGHT5, + + //meso: + GBLOWN_MESO_FOREARMRIGHT, + GBLOWN_MESO_FOREARMRIGHT2, + GBLOWN_MESO_FOREARMRIGHT3, + GBLOWN_MESO_FOREARMRIGHT4, + GBLOWN_MESO_FOREARMRIGHT5, + GBLOWN_MESO_FOREARMRIGHT6, + GBLOWN_MESO_OPENHANDRIGHT, + GBLOWN_MESO_CLOSEDHANDRIGHT, + GBLOWN_MESO_OPENHANDRIGHT2, + GBLOWN_MESO_CLOSEDHANDRIGHT2, + + //shared: + GBLOWN_MESO_HANDBOLTRIGHT, + + //meso: + GBLOWN_MESO_THIGHRIGHT, + GBLOWN_MESO_THIGHRIGHT2, + GBLOWN_MESO_THIGHRIGHT3, + + //shared: + GBLOWN_MESO_THIGHBOLTRIGHT, + GBLOWN_MESO_THIGHRIGHTSPECIAL, + + //meso: + GBLOWN_MESO_CALFRIGHT, + GBLOWN_MESO_CALFRIGHT2, + GBLOWN_MESO_CALFRIGHT3, + GBLOWN_MESO_CALFRIGHT4, + GBLOWN_MESO_CALFRIGHT5, + + //shared: + GBLOWN_MESO_CALFBOLTRIGHT, + + //meso: + GBLOWN_MESO_FOOTRIGHT, + GBLOWN_MESO_FOOTRIGHT2, + + //meso: + GBLOWN_MESO_THIGHLEFT, + GBLOWN_MESO_THIGHLEFT2, + GBLOWN_MESO_THIGHLEFT3, + + //shared: + GBLOWN_MESO_THIGHBOLTLEFT, + GBLOWN_MESO_THIGHLEFTSPECIAL, + + //meso: + GBLOWN_MESO_CALFLEFT, + GBLOWN_MESO_CALFLEFT2, + GBLOWN_MESO_CALFLEFT3, + GBLOWN_MESO_CALFLEFT4, + GBLOWN_MESO_CALFLEFT5, + + //shared: + GBLOWN_MESO_CALFBOLTLEFT, + + //meso: + GBLOWN_MESO_FOOTLEFT, + GBLOWN_MESO_FOOTLEFT2, + + GBLOWN_MESO_GROIN, + GBLOWN_MESO_NUM +} meso_blown_index; + +typedef enum +{ + GBLOWNCODE_PART, + GBLOWNCODE_BOLT, + GBLOWNCODE_SPECIAL +} blown_code; + + +typedef struct +{ + blown_index my_index; + blown_index child_index; + blown_area area; + blown_code code; + char name[30]; +} gz_blown_part; + +extern gz_blown_part ecto_blown_parts[]; +extern gz_blown_part meso_blown_parts[]; +extern gz_blown_part female_blown_parts[]; + +typedef struct gz_info_s +{ + GhoulID id; + GhoulID parent_id;//to check if there's body available to put gore on... + GhoulID bolt; + + GhoulID cap; + GhoulID blownCap; + GhoulID blownCapBolt; + GhoulID capbolt; + ggObjC *capPiece; + GhoulID capPieceBolt; + gz_code childzone; + gz_code buddyzone;//keep my gore levels equivalent with my buddyzone's + gz_blown_part *blowme; + + int damage;//not sure whether to use raw damage or damagelevel increments or both... + int damage_level; + + float damScale;//amount to scale damage, once armor is depleted + +} gz_info; + +#define BODYDAMAGE_RIGHTARM 0x00000001 +#define BODYDAMAGE_LEFTARM 0x00000002 +#define BODYDAMAGE_RIGHTLEG 0x00000004 +#define BODYDAMAGE_LEFTLEG 0x00000008 + +#define BODYDAMAGE_UNKOWNAREA 0x40000000 //i'm damaged in a definitely unkown area + //(ears currently qualify, also any known area not on the bodydamage list) +#define BODYDAMAGE_RECENT 0x80000000 //i've been hit recently--disable me in addition to pain animation + +#define BODYDAMAGE_ANY 0xffffffff //for convenient checking +#define BODYDAMAGE_NONE 0x00000000 //for convenient checking + +class bodyorganic_c: public body_c +{ +protected: + qboolean useGround2; + int spout; + GhoulID gzone_levels[3][4]; + int numGoreZones; + gz_info *gzones; + + virtual void SetGoreZoneDamageScale(edict_t &monster){} + virtual void InitializeGoreZoneLevels(edict_t &monster); + virtual gz_blown_part *GetBlownPartForIndex(blown_index theIndex){return &ecto_blown_parts[GBLOWN_ECTO_NUM];} + virtual void BlowSpecialPart(edict_t &monster, gz_blown_part *part, edict_t *dangler){} + virtual void ShakeSpecialPart(edict_t &monster, gz_blown_part *part, Vect3 &Direction){} + void UseGround2(edict_t &monster, qboolean toggleVal); + + void BlowPart(edict_t &monster, gz_blown_part *part, edict_t *dangler); + void ShakePart(edict_t &monster, gz_blown_part *part, Vect3 &Direction); + void BlowZone(edict_t &monster, gz_code part, gz_code originalPart, edict_t *dangler); + + void SetGoreZone(edict_t &monster, char *zonename, gz_code slot); + void SetGoreCap(edict_t &monster, char *capname, gz_code slot); + void SetGoreBlownCap(edict_t &monster, char *capname, gz_code slot); + void SetGoreBlownCapBolt(edict_t &monster, char *capname, gz_code slot); + void SetGoreCapBolt(edict_t &monster, char *capname, gz_code slot); + void SetGoreCapPiece(edict_t &monster, char *capname, char *boltname, gz_code slot); + void SetGoreBolt(edict_t &monster, char *boltname, gz_code slot); + + edict_t *MakeBlownPart(edict_t &monster, gz_code part, vec3_t dir, ggOinstC **blownInst, bool includeEffects = true); + void DoLimbRotate(edict_t *monster ); + + //NEED to call this before RecognizeGoreZones, AND not after! + virtual void AllocateGoreZones(edict_t &monster); + virtual void RecognizeGoreZones(edict_t &monster){} + + virtual void PrecacheGore(edict_t &monster){} + + virtual bool FreeKnife(edict_t &monster, ggBinstC* bolted, GhoulID boltKnife) { return false; } + virtual int HandleNearMiss(edict_t &monster, edict_t *knife){ return -1; } +public: + bodyorganic_c(); + virtual ~bodyorganic_c(); + + virtual qboolean VerifySequence(edict_t &monster, mmove_t *newanim, int reject_actionflags); + virtual void Drip(edict_t &monster); + virtual int GetClassCode(void){return BODY_ORGANIC;}//this should be different for everybody in this class family + + void WriteGZ(void); + void ReadGZ(void); + bodyorganic_c(bodyorganic_c *orig); + virtual void Evaluate(bodyorganic_c *orig); + virtual void FreeKnives(edict_t &monster) { return;} + virtual void DropWeapon(edict_t *ent, IGhoulInst *me) { return; } + virtual void NextShotsGonnaKillMe(int bKill) {return;} + virtual bool IsNextShotGonnaKillMe() {return false;} + virtual void CanDropBoltons(bool bDrop) { return; } + virtual void SetArmor(edict_t &monster, armor_code newarmor) { return; } + virtual void UpdateSoundsByWeapon(edict_t &monster, ai_c &which_ai) {} +}; + +class bodyhuman_c: public bodyorganic_c +{ +protected: + int curSoundIndex; + float curVol; + float curAtten; + char voiceDirGeneral[64]; + char voiceDirDeath[64];//really only for players--could be moved to client struct? + int voiceDirNumber; + char face_base[64]; + char curface[64]; + float blink_time; + float breathe_time; + float rLastFireTime; + float lLastFireTime; + float nextGreetTime; + int numGreets; + int numWakes; + int curGreet; + qboolean touchSound; + qboolean rHandOpen; + qboolean lHandOpen; + qboolean grenadeInHand; + int bodyDamage;//bitfield for restricting animations + int bodyDamageAccumulated;//bitfield for affecting movement and aim in realistic dm + float bodyDamageEndRecent; + qboolean FinalAnim; // When set, the current anim or series of anims is intended to be the last ones played. also has sound implications + qboolean FinalSound; + qboolean rWeaponShot; + qboolean lWeaponShot; + int rWeaponAmmo; + qboolean freezeMyBolts; + qboolean gutsOut; + qboolean justFiredRight;//used for cocking shotguns and rifles + attacks_e lHandAtk; + attacks_e rHandAtk; + deathvoice_code deathVoiceType; + armor_code armorCode; // how much armor this joker starts off with + int nNextShotKillsMe; // used for scripted kills + bool bDropBoltons; + bool bBoxConfirmed; // whether I've made a last-ditch attempt at a normal post-mortem bbox + bool bVocalCordsWorking; + + virtual qboolean PlayAnimation(edict_t &monster, mmove_t *newanim, bool forceRestart); + + virtual void GetLevelDeathSoundDir(char *putSuffixHere, deathvoice_code death); + + //play sound from my specific voice directory (e.g. "enemy/skinhead2") + void VoiceGreetSound(edict_t &monster, float vol = .6); + //play sound from my general voice directory (e.g. "enemy/skinhead") + void VoiceGeneralSound(char *base, edict_t &monster, int num, float vol = 0.8); + + //cache sound for my specific voice directory (e.g. "enemy/skinhead2") + void VoiceSoundCache(char *base, edict_t &monster, int num); + void VoiceWakeSoundCache(edict_t &monster); + void VoiceGreetSoundCache(edict_t &monster); + //cache sound for my general voice directory (e.g. "enemy/skinhead") + void VoiceGeneralSoundCache(char *base, edict_t &monster, int num); + + //set my specific and general directories + virtual void SetVoiceDirectories(edict_t &monster, const char *base, int possible_varieties, deathvoice_code death, char *deathdir=NULL); + + virtual void RightStep(edict_t &monster); + virtual void LeftStep(edict_t &monster); + + + virtual void OpenRightHand(edict_t &monster, qboolean toggleVal); + void OpenLeftHand(edict_t &monster, qboolean toggleVal); + void GrenadeHand(edict_t &monster, qboolean toggleVal, qboolean nodrop); + + virtual void SetGoreZoneDamageScale(edict_t &monster); + + virtual int TestDamage(void){return bodyDamage & BODYDAMAGE_ANY;} + + virtual void RecognizeGoreZones(edict_t &monster){} + + qboolean ShowFrontHoleDamage (edict_t &monster, gz_code frontCode, gz_code backCode, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int take, int knockback, int dflags, int mod); + void ShowBackHoleDamage (edict_t &monster, gz_code frontCode, gz_code backCode, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int take, int knockback, int dflags, int mod); + + virtual attacks_e GetWeaponAtBolt(edict_t &monster, char *boltname); + + //casual (non-pain, non-death) GetSequence funcs should call this before getting wise on their own-- + //it should get seqs for blindness, limping/pulling in guts, etc. + virtual mmove_t *GetSequenceForDisability(edict_t &monster, int reject_actionflags=0); + virtual void AllocateGoreZones(edict_t &monster); + + virtual void PrecacheGore(edict_t &monster); + + virtual void BlowSpecialPart(edict_t &monster, gz_blown_part *part, edict_t *dangler); + virtual void ShakeSpecialPart(edict_t &monster, gz_blown_part *part, Vect3 &Direction); + + virtual bool FreeKnife(edict_t &monster, ggBinstC* bolted, GhoulID boltKnife); + virtual int HandleNearMiss(edict_t &monster, edict_t *knife); + int ResolveKnifeImpact(edict_t &monster, edict_t *inflictor, edict_t *attacker, + int *nNearMissZone, vec3_t dir, vec3_t point, vec3_t origin, int *dflags); + void ChooseShotgunGoreZones(edict_t &monster, vec3_t origin, vec3_t point, gz_code *backCode, + gz_code *listOfFrontCodes, int *numOfFrontCodes); + void ChooseDirectionalGoreZones(edict_t &monster, vec3_t origin, gz_code *backCode, + gz_code *listOfFrontCodes, int *numOfFrontCodes); + int GetProjectileFrontHole(edict_t &monster, edict_t *attacker, vec3_t origin, vec3_t dir, vec3_t point, + gz_code *backCode, int nNearMissZone, bool bKnife, ggOinstC *myInstance, + ggBinstC *boltPiece, vec3_t ExitPos, Vect3 EntryPos, Matrix4 ZoneMatrix, Vect3 zonePos, + Vect3 Direction, int *take, ggBinstC *oldLeftWeap, ggBinstC *oldRightWeap, int *numOfFrontCodes, + gz_code *frontCode, bool *EntryPosIsValid, gz_code *listOfFrontCodes); + + + + +public: + virtual void VoiceSound(char *base, edict_t &monster, int num, float vol = 0.8); + virtual void VoiceWakeSound(edict_t &monster, float vol = 0.4); + + virtual void FreeKnives(edict_t &monster); + virtual mmove_t *GetSequenceForDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForPostMortem(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForCrouchDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForProneDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForPulseGunDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForBurningDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForJuggleDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForGoreZoneDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForRunningDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForFacingBasedDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForDeathFromFront(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, vec3_t to_dam, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForDeathFromBack(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, vec3_t to_dam, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForCatchAllDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForParentalLockDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForTrainDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForC4Death(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForPain(edict_t &monster, vec3_t point, float kick, int damage, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForMovement(edict_t &monster, vec3_t dest, vec3_t face, vec3_t org, vec3_t ang, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForStand(edict_t &monster, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForJump(edict_t &monster, vec3_t dest, vec3_t face, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForAttack(edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForTransition(edict_t &monster, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, int reject_actionflags=0); + virtual mmove_t *GetSequenceForDodge(edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int leftSide = 0, int reject_actionflags=0); + virtual mmove_t *GetSequenceForReload(edict_t &monster, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetPostShootSequence(edict_t &monster, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0); + + virtual mmove_t *GetSequenceForRunAimStrafe(edict_t &monster, vec3_t to_dest_dir, vec3_t forward, vec3_t right, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags); + virtual mmove_t *GetSequenceForWalkAimStrafe(edict_t &monster, vec3_t to_dest_dir, vec3_t forward, vec3_t right, vec3_t dest, vec3_t face, actionsub_code seqtype, bbox_preset goal_bbox, mmove_t *ideal_move, int reject_actionflags); + + virtual bool IsInStationaryDeathAnim(); + + virtual void SetRootBolt(edict_t &monster); + virtual void SetArmor(edict_t &monster, armor_code newarmor); + virtual armor_code GetArmorCode(); + virtual float GetArmorPercentRemaining(); + virtual void StripArmor(); + + virtual void MakeRetreatNoise(edict_t &monster); + + virtual void NextShotsGonnaKillMe(int nKill) {nNextShotKillsMe = nKill;} + virtual bool IsNextShotGonnaKillMe() {return !!nNextShotKillsMe;} + virtual void CanDropBoltons(bool bDrop) { bDropBoltons = bDrop; } + + virtual void UseMonster(edict_t &monster, edict_t *user); + virtual void TouchMonster(edict_t &monster, edict_t *user); + + virtual int ShowDamage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb); + + //forceFireRate will not fire the gun if it's been fired more recently than design doc says that kind of gun should fire. + virtual void FireRightHandWeapon(edict_t &monster, bool isLethal = false, int NullTarget = 0, qboolean forceFireRate = false); + virtual qboolean RightHandWeaponReady(edict_t &monster); + virtual void ThrowProjectile(edict_t &monster); + + virtual attacks_e GetRightHandWeapon(edict_t &monster); + virtual attacks_e GetLeftHandWeapon(edict_t &monster); + virtual attacks_e GetBestWeapon(edict_t &monster); + virtual int UseLeftHandAttack(edict_t &monster, edict_t *target); + + virtual void SetRightHandWeapon(edict_t &monster, attacks_e newRightWeap); + virtual void SetLeftHandWeapon(edict_t &monster, attacks_e newLeftWeap); + + virtual void SetFlags(edict_t & monster, int newflags); + +// virtual void Emote(edict_t &monster, emotion_index new_emotion, float emotion_duration, qboolean scripted_emoting=false); + virtual emotion_index GetMood(edict_t &monster); + virtual void UpdateFace(edict_t &monster); + virtual void UpdateSoundsByWeapon(edict_t &monster, ai_c &which_ai); + virtual void SetFace(edict_t &monster, char *face); + virtual int DropBoltOn(edict_t &monster, ggBinstC *boltedptr, Vect3 &pos, Vect3 &Direction, int damage, edict_t *attacker = NULL); + virtual void DropWeapon(edict_t *ent, IGhoulInst *me); + virtual int SpecialActionBoltOn(edict_t &monster, ggBinstC *boltedptr, Vect3 &pos, Vect3 &Direction, int damage); + + virtual qboolean MustReloadRWeapon(edict_t &monster){return (rWeaponAmmo<=0);} + virtual void ReloadRWeapon(edict_t &monster); + virtual void AdjustAimByWeapon(edict_t &monster, vec3_t aimDir); + virtual void Gib(edict_t &monster, vec3_t dir, int dflags); + virtual void Gib2(edict_t &monster, vec3_t dir, int dflags); + + virtual void SetVocalCordsWorking(bool bCords) { bVocalCordsWorking = bCords; } + virtual bool AreVocalCordsWorking() { return bVocalCordsWorking; } + bodyhuman_c(); + + virtual int GetClassCode(void){return BODY_HUMAN;}//this should be different for everybody in this class family + + bodyhuman_c(bodyhuman_c *orig); + virtual void Evaluate(bodyhuman_c *orig); + + virtual int IsMovementImpeded(void); + virtual int IsAimImpeded(void); + virtual void RemoveLimbDamage(void); + virtual void AssignFrontAndBackGZones(gz_info **frontHole, gz_code *frontCode, gz_info **backHole, gz_code *backCode); + void SeverRoutine(edict_t &monster, vec3_t dir, gz_code frontCode, gz_code backCode, gz_info *frontHole, gz_info *backHole, bool forceSever = false); + virtual void HealGoreZones(edict_t &monster, int damagedHealth, int healedHealth); + +}; + +class bodyecto_c : public bodyhuman_c +{ +protected: + virtual void RecognizeGoreZones(edict_t &monster); + virtual gz_blown_part *GetBlownPartForIndex(blown_index theIndex); + virtual void OpenRightHand(edict_t &monster, qboolean toggleVal){} + virtual void OpenLeftHand(edict_t &monster, qboolean toggleVal){} + virtual void GrenadeHand(edict_t &monster, qboolean toggleVal, qboolean nodrop){} +public: + bodyecto_c(); + virtual int GetClassCode(void){return BODY_ECTO;}//this should be different for everybody in this class family + + bodyecto_c(bodyecto_c *orig); + virtual void Evaluate(bodyecto_c *orig); + virtual void Write(); + virtual void Read(); +}; + +class bodymeso_c : public bodyhuman_c +{ +protected: + virtual void RecognizeGoreZones(edict_t &monster); + virtual gz_blown_part *GetBlownPartForIndex(blown_index theIndex); +public: + bodymeso_c(); + virtual int GetClassCode(void){return BODY_MESO;}//this should be different for everybody in this class family + + bodymeso_c(bodymeso_c *orig); + virtual void Evaluate(bodymeso_c *orig); + virtual void Write(); + virtual void Read(); +}; + +class bodyfemale_c : public bodyhuman_c +{ +protected: + virtual void RecognizeGoreZones(edict_t &monster); + virtual gz_blown_part *GetBlownPartForIndex(blown_index theIndex); +public: + bodyfemale_c(); + virtual int GetClassCode(void){return BODY_FEMALE;}//this should be different for everybody in this class family + + bodyfemale_c(bodyfemale_c *orig); + virtual void Evaluate(bodyfemale_c *orig); + virtual void Write(); + virtual void Read(); +}; + diff --git a/Source/Game/gamecpp/ai_bodynoghoul.cpp b/Source/Game/gamecpp/ai_bodynoghoul.cpp new file mode 100644 index 0000000..2d66eba --- /dev/null +++ b/Source/Game/gamecpp/ai_bodynoghoul.cpp @@ -0,0 +1,828 @@ + +#include "g_local.h" +#include "ai_private.h" + +// ghoulSeqName velScale minTurn bbox playpos bodyposition +// suggested_action maxTurn actionFlags + +mmove_t ScriptReleaseMove[MMOVE_SCRIPT_SIZE]= +{ + {"std_istand_n_a_n", ACTCODE_SCRIPTRELEASE, 0, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN} +}; + +mmove_t MMoves[MMOVE_HUMAN_SIZE]= +{ + //0 + {"std_istand_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_wnormal_n_pk_a", ACTCODE_MOVE, 1, 30, -30, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_r_n_pk_n", ACTCODE_MOVE, 1, 40, -40, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_f_n_p_2", ACTCODE_ATTACK, 0, 10, -10, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_rgunup_n_p_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //5 + {"std_stoknees_2bk_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"std_jupto_n_a_a", ACTCODE_JUMP, 0, 0, 0, ACTFLAG_JUMPTOGROUND2|ACTFLAG_RHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_fattitude_n_p_a", ACTCODE_ATTACK, 1, 10, -10, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wattitude_n_pk_a", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_jdrop_n_a_a", ACTCODE_FALL, 1, 5, -5, ACTFLAG_RHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //10 + {"std_raim_n_p_n", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_raim_n_p_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xcrouch_dwn_pk_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_xcrouch_mid_pk_a", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_f_fwd_p_2", ACTCODE_ATTACK, 0, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //15 + {"cch_xcrouch_up_pk_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ilooking_n_a_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_istretch_n_a_a", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_sblown_2bk_n_n", ACTCODE_DEATH, 1, 0, -0, ACTFLAG_RHANDOPEN|ACTFLAG_LHANDOPEN, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"std_rafraid_n_n_n", ACTCODE_MOVE, 1, 40, -40, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //20 + {"cch_a_fwd_p_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_a_fwd_p_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_a_fwd_p_cb", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_f_fwd_p_cb", ACTCODE_ATTACK, 0, 10, -10, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_sdance_n_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_RHANDOPEN|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //25 + {"std_shead_2frnt_n_n", ACTCODE_DEATH, 1, 0, 0, 0, BBOX_PRESET_LAYFRONT, 0, BODYPOS_UNKNOWN}, + {"std_f_fwd_p_2", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_slegrt_2bk_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"std_sleglt_2bk_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"std_sshoulder_rt_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_RHANDOPEN|ACTFLAG_LHANDOPEN, BBOX_PRESET_LAYFRONT, 0, BODYPOS_UNKNOWN}, + + //30 + {"std_sshoulder_lt_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_RHANDOPEN|ACTFLAG_LHANDOPEN, BBOX_PRESET_LAYFRONT, 0, BODYPOS_UNKNOWN}, + {"lb_pgeneric_n_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"lb_pholdleg_rt_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"lb_pholdleg_lt_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"cch_sdead_2bk_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + + //35 + {"std_ashuffle_n_p_2", ACTCODE_STAND, 1, 30, -30, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ashuffle_n_p_a", ACTCODE_STAND, 1, 30, -30, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_f_fwd_m_2", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_a_fwd_ms_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_istand_n_mrs_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + + //40 + {"std_ilooking_n_mrs_2", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_istretch_n_mrs_2", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_wpatrol_n_mrs_2", ACTCODE_MOVE, 1, 30, -30, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_icleangun2_n_pk_n", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_imonitorup_n_a_n", ACTCODE_STAND, 0, 20, -20, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + + //45 + {"std_italk_n_a_n", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_italkgest1_n_a_n", ACTCODE_STAND, 0, 20, -20, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_italkgest2_n_a_n", ACTCODE_STAND, 0, 20, -20, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_italkgest3_n_a_n", ACTCODE_STAND, 0, 20, -20, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_iwipebrow_n_a_n", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + + //50 + {"std_xalarmpush_n_a_n", ACTCODE_STAND, 0, 10, -10, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xyellpoint_fwd_a_n", ACTCODE_STAND, 0, 10, -10, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xyellwave_bk_a_n", ACTCODE_STAND, 0, 10, -10, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_jdive2prone_n_a_n", ACTCODE_MOVE, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_PRONE, 0, BODYPOS_UNKNOWN}, + {"std_xboomcrouch_n_a_n", ACTCODE_STAND, 0, 10, -10, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //55 + {"std_xtumble_2frnt_n_n", ACTCODE_DEATH, 1, 0, 0, 0, BBOX_PRESET_LAYFRONT, 0, BODYPOS_UNKNOWN}, + {"std_wcarry1_n_n_n", ACTCODE_MOVE, 1, 30, -30, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wpatrol_n_mrs_2", ACTCODE_MOVE, 1, 30, -30, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_r_n_mrs_2", ACTCODE_MOVE, 1, 25, -25, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_f_fwd_s_2", ACTCODE_ATTACK, 0, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //60 + {"cch_f_fwd_r_2", ACTCODE_ATTACK, 0, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_a_fwd_ms_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_a_fwd_r_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_fcornerpeak_lt_m_2", ACTCODE_ATTACK, 1, 0, 0, ACTFLAG_FIREFROMGUN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_fcornerpeak_rt_m_2", ACTCODE_ATTACK, 1, 0, 0, ACTFLAG_FIREFROMGUN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //65 + {"std_fcornerpeak_lt_p_a", ACTCODE_ATTACK, 1, 0, 0, ACTFLAG_FIREFROMGUN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_fcornerpeak_rt_p_a", ACTCODE_ATTACK, 1, 0, 0, ACTFLAG_FIREFROMGUN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wbcksignal_n_n_n", ACTCODE_MOVE, 1, 30, -30, ACTFLAG_BACKUP, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wturn90_lt_pk_n", ACTCODE_MOVE, 1, 1, -2, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_WALKTURN}, + {"std_wturn90_rt_pk_n", ACTCODE_MOVE, 1, 2, -1, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_WALKTURN}, + + //70 + {"std_wturn90_lt_mrs_2", ACTCODE_MOVE, 1, 1, -2, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_WALKTURN}, + {"std_wturn90_rt_mrs_2", ACTCODE_MOVE, 1, 2, -1, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_WALKTURN}, + {"lb_pholdlegto_rt_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"lb_pholdlegto_lt_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"lb_pgenericto_n_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + + //75 + {"lb_pholdlegdie_rt_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"lb_pholdlegdie_lt_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"lb_pgenericdie_n_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"std_waimstraf_lt_l_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_LEFTSTRAFE, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + {"std_waimstraf_rt_l_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_RIGHTSTRAFE, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + + //80 + {"std_wbackaim_n_l_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_BACKUP, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + {"std_w_n_l_2", ACTCODE_MOVE, 1, 30, -30, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xatkpause1_n_mrs_2", ACTCODE_STAND, 0, 30, -30, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xatkpause2_n_mrs_2", ACTCODE_STAND, 0, 30, -30, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xatkpause1_n_pk_n", ACTCODE_STAND, 0, 30, -30, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //85 + {"std_xatkpause2_n_pk_n", ACTCODE_STAND, 0, 30, -30, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"lb_sautofire_loop_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"lb_sautofire_end_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"cch_f_fwd_m_2", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_wturn180_lt_mrs_2", ACTCODE_MOVE, 1, 0, 0, /*ACTFLAG_MATCHABS|*/ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM,BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //90 + {"std_f_fwd_s_2", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xopendoor_n_a_n", ACTCODE_STAND, 0, 10, -10, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_f_fwd_r_2", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_a_fwd_r_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xcrouch_dwn_mrs_2", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //95 + {"cch_xcrouch_up_mrs_2", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_raimstraf_lt_p_cbn", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_LEFTSTRAFE, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_raimstraf_rt_p_cbn", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_RIGHTSTRAFE, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_raimstraf_lt_mrs_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_LEFTSTRAFE, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_raimstraf_rt_mrs_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_RIGHTSTRAFE, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //100 + {"std_raim_n_mrs_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ashuffle_n_ms_2", ACTCODE_STAND, 1, 30, -30, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ashuffle_n_r_2", ACTCODE_STAND, 1, 30, -30, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ialert_n_p_n", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_ialertlk_lt_p_n", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + + //105 + {"std_xroll_rt_a_a", ACTCODE_MOVE, 1, 5, -5, ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_xroll_lt_a_a", ACTCODE_MOVE, 1, 5, -5, ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_ialerttrn_rt_p_n", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_ialert_n_mrs_2", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_raimstraf_lt_l_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_LEFTSTRAFE, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //110 + {"std_ialertlk_rt_mrs_2", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ialerttrn_lt_mrs_2", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_tgrenade_n_a_n", ACTCODE_ATTACK, 1, 2, -2, ACTFLAG_FULLANIM|ACTFLAG_GRENADE, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_sgroin_2side_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_LAYSIDE, 0, BODYPOS_UNKNOWN}, + {"std_sthroat_2side_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYSIDE, 0, BODYPOS_UNKNOWN}, + + //115 + {"std_fautosweep_n_m_2", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_italk_n_mrs_2", ACTCODE_STAND, 0, 10, -10, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_italkgest1_n_mrs_2", ACTCODE_STAND, 0, 10, -10, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_italkgest2_n_mrs_2", ACTCODE_STAND, 0, 10, -10, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_italkgest3_n_mrs_2", ACTCODE_STAND, 0, 10, -10, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + + //120 + {"prn_a_n_mrs_2", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_PRONE, 0, BODYPOS_UNKNOWN}, + {"prn_a_n_mrs_2", ACTCODE_ATTACK, 0, 0, 0, ACTFLAG_OPTATTACK, BBOX_PRESET_PRONE, 0, BODYPOS_UNKNOWN}, + {"lf_sautofire_loop_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYFRONT, 0, BODYPOS_UNKNOWN}, + {"lf_sautofire_end_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYFRONT, 0, BODYPOS_UNKNOWN}, + {"std_xafraidshake_n_n_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_RHANDOPEN|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //125 + {"std_sgunfromhand_n_n_n", ACTCODE_PAIN, 0, 10, -10, ACTFLAG_RHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_jrun_fwd_a_a", ACTCODE_JUMP, 1, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"RUBBISHWASstd_xjitter_n_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN|ACTFLAG_LOOPANIM, BBOX_PRESET_PRONE, 0, BODYPOS_UNKNOWN}, + {"RUBBISHWASstd_xjitter2_n_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN|ACTFLAG_LOOPANIM, BBOX_PRESET_PRONE, 0, BODYPOS_UNKNOWN}, + {"std_r_dwnst_pn_a", ACTCODE_MOVE, 1, 40, -40, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //130 + {"std_r_upst_pn_a", ACTCODE_MOVE, 1, 40, -40, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_sonknees_2frnt_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_LAYFRONT, 0, BODYPOS_UNKNOWN}, + {"cch_xonknees_n_n_n", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_iturnvalve_frm_n_n", ACTCODE_STAND, 0, 10, -10, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_iturnvalve_n_n_n", ACTCODE_STAND, 0, 10, -10, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + + //135 + {"std_iturnvalve_to_n_n", ACTCODE_STAND, 0, 10, -10, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_mkicklow_n_a_a", ACTCODE_STAND, 0, 10, -10, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_mpistolwhip_n_p_n", ACTCODE_STAND, 0, 10, -10, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_sinback_2frnt_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYFRONT, 0, BODYPOS_UNKNOWN}, + {"ls_xgetkicked_n_n_n", ACTCODE_PAIN, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYSIDE, 0, BODYPOS_UNKNOWN}, + + //140 + {"si_xbywall_n_n_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_SIT, 0, BODYPOS_UNKNOWN}, + {"std_sstumble_2bk_p_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"std_wpush_n_n_n", ACTCODE_MOVE, 1, 30, -30, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xkickdoor_n_a_a", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xyellatyou_n_a_a", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //145 + {"std_ileanlook_frm_pk_n", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_ileanlook_mid_pk_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_ileanlook_to_pk_n", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_jdown_n_a_a", ACTCODE_JUMP, 1, 0, 0, ACTFLAG_JUMPTOGROUND2, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_xcchcower_mid_a_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //150 + {"cch_xcchcower2_mid_a_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_waimstraf_lt_ms_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_LEFTSTRAFE, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + {"std_waimstraf_lt_r_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_LEFTSTRAFE, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + {"std_waimstraf_lt_p_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_LEFTSTRAFE, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + {"std_waimstraf_rt_ms_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_RIGHTSTRAFE, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + + //155 + {"std_waimstraf_rt_r_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_RIGHTSTRAFE, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + {"std_waimstraf_rt_p_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_RIGHTSTRAFE, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + {"std_waim_fwd_p_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + {"std_waim_fwd_r_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + {"std_waim_fwd_ms_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + + //160 + {"std_wbackaim_n_p_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_BACKUP, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + {"std_wbackaim_n_r_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_BACKUP, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + {"std_wbackaim_n_ms_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_BACKUP, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + {"std_sunhurt_fwd_pk_n", ACTCODE_PAIN, 0, 10, -10, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_sunhurt_fwd_mrs_2", ACTCODE_PAIN, 0, 10, -10, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //165 + {"std_sunhurt_bk_pk_n", ACTCODE_PAIN, 0, 10, -10, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_sunhurt_bk_mrs_2", ACTCODE_PAIN, 0, 10, -10, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_pblinded_to_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_BLINDED}, + {"std_pblinded_loop_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_BLINDED}, + {"std_pblinded_frm_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //170 + {"std_ishift_n_a_n", ACTCODE_STAND, 0, 2, -2, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xstartled_n_a_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_l_n_p_2", ACTCODE_STAND, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_l_n_ms_2", ACTCODE_STAND, 0, 2, -2, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_sleg_rt_n_n", ACTCODE_PAIN, 0, 10, -10, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_RLEGHURT}, + + //175 + {"std_sleg_lt_n_n", ACTCODE_PAIN, 0, 10, -10, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_LLEGHURT}, + {"std_phop_rt_n_n", ACTCODE_PAIN, 0, 5, -5, 0, BBOX_PRESET_STAND, 0, BODYPOS_RLEGHURT}, + {"std_phop_lt_n_n", ACTCODE_PAIN, 0, 5, -5, 0, BBOX_PRESET_STAND, 0, BODYPOS_LLEGHURT}, + {"std_plimp_rt_n_n", ACTCODE_MOVE, 1, 5, -5, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_RLEGHURT}, + {"std_plimp_lt_n_n", ACTCODE_MOVE, 1, 5, -5, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_LLEGHURT}, + + //180 + {"std_l_n_r_2", ACTCODE_STAND, 0, 2, -2, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xcchcower_dwn_a_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_rbackaim_n_mrs_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_BACKUP, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_rbackaim_n_p_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_BACKUP, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_sarm_rt_n_n", ACTCODE_PAIN, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_RLEGHURT}, + + //185 + {"std_sarm_lt_n_n", ACTCODE_PAIN, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_RLEGHURT}, + {"std_parm_rt_n_n", ACTCODE_PAIN, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_RLEGHURT}, + {"std_parm_lt_n_n", ACTCODE_PAIN, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_RLEGHURT}, + {"std_xdontshoot_n_a_n", ACTCODE_STAND, 0, 5, -5, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xfearwave_n_n_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //190 + {"std_r_dwnst_mrs_2", ACTCODE_MOVE, 1, 40, -40, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_r_upst_mrs_2", ACTCODE_MOVE, 1, 40, -40, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_paim_n_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_LLEGHURT}, + {"std_paim_n_a_n", ACTCODE_ATTACK, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_OPTATTACK, BBOX_PRESET_STAND, 0, BODYPOS_LLEGHURT}, + {"cch_xcchcower_up_a_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //195 + {"std_l_n_p_n", ACTCODE_STAND, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_sviolent_n_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"prn_xcoverhead_to_a_a", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_PRONE, 0, BODYPOS_UNKNOWN}, + {"prn_xcoverhead_n_a_a", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_PRONE, 0, BODYPOS_UNKNOWN}, + {"std_schest_2frnt_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_LAYFRONT, 0, BODYPOS_UNKNOWN}, + + //200 + {"std_sgut_2side_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_LAYSIDE, 0, BODYPOS_UNKNOWN}, + {"std_snervegun_2bck_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"std_icleangun2_n_mrs_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_imonitorup2_n_a_n", ACTCODE_STAND, 0, 20, -20, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_itouchnuts_n_a_n", ACTCODE_STAND, 0, 20, -20, 0, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + + //205 + {"std_ismoke_frm_a_n", ACTCODE_STAND, 0, 20, -20, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_ismoke_n_a_n", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_ismoke_to_a_n", ACTCODE_STAND, 0, 20, -20, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_wjog_n_mrs_2", ACTCODE_MOVE, 1, 30, -30, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wjoggundwn_n_p_2", ACTCODE_MOVE, 1, 30, -30, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //210 + {"std_wjoggunup_n_p_a", ACTCODE_MOVE, 1, 30, -30, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wpushcart_n_n_n", ACTCODE_MOVE, 1, 30, -30, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_fautosweep_n_pm_a", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_fgangbanger_n_m_2", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_fswatstyle_fwd_m_2", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //215 + {"std_fviolent_dwn_m_2", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_FIREFROMGUN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_fviolent_dwn_p_n", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_FIREFROMGUN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_mninjakick_n_a_b", ACTCODE_STAND, 0, 10, -10, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_mriflebutt_n_mrs_2", ACTCODE_STAND, 0, 10, -10, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_sfallfwd_2frnt_n_n", ACTCODE_FALL, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYFRONT, 0, BODYPOS_UNKNOWN}, + + //220 + {"std_sstumble_2frnt_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYFRONT, 0, BODYPOS_UNKNOWN}, + {"std_xchoke_n_n_n", ACTCODE_STAND, 0, 10, -10, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xdance_n_n_n", ACTCODE_STAND, 1, 10, -10, ACTFLAG_FULLANIM|ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_xgoprone_n_a_a", ACTCODE_MOVE, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_PRONE, 0, BODYPOS_UNKNOWN}, + {"std_xladder_dwn_a_a", ACTCODE_MOVE, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //225 + {"std_xladder_up_a_a", ACTCODE_MOVE, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xrolltocch_fwd_a_a", ACTCODE_MOVE, 1, 5, -5, ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_xstumble_n_a_a", ACTCODE_STAND, 1, 10, -10, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"si_isit_n_a_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_SIT, 0, BODYPOS_IDLE}, + {"si_xalertstand_up_a_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //230 + {"prn_xfalling_n_n_n", ACTCODE_FALL, 1, 40, -40, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"prn_xfallland_n_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYFRONT, 0, BODYPOS_UNKNOWN}, + {"prn_xtostand_n_a_a", ACTCODE_STAND, 1, 3, -3, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_raim_fwd_mrs_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_raim_fwd_p_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //235 + {"lb_pcrawl_bk_p_n", ACTCODE_MOVE, 1, 5, -5, ACTFLAG_LOOPANIM|ACTFLAG_FULLANIM|ACTFLAG_MATCHANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"lb_xleanupshoot_n_p_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"cch_f_fwd_l_2", ACTCODE_ATTACK, 0, 10, -10, 0, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_raim_n_l_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_tlobgrenade_n_a_n", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //240 + {"a4_cscramble_n_a_n", ACTCODE_MOVE, 1, 40, -40, ACTFLAG_LOOPANIM, BBOX_PRESET_PRONE, 0, BODYPOS_UNKNOWN}, + {"prn_c_n_a_2", ACTCODE_MOVE, 1, 40, -40, ACTFLAG_LOOPANIM, BBOX_PRESET_PRONE, 0, BODYPOS_UNKNOWN}, + {"std_a_up_mrs_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_OPTATTACK|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_a_up_p_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_OPTATTACK, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_a_up_l_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_OPTATTACK, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //245 + {"std_sonfire_2bk_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"std_mslash_n_kp_n", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_mslash_n_kp_n", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0.6f, BODYPOS_UNKNOWN}, + {"std_echokeknees_to_n_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_echokeknees_n_n_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //250 + {"cch_xcrouch_up_l_2", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_raimstraf_rt_l_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_RIGHTSTRAFE, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xcrouch_dwn_l_2", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_r_dwnst_l_2", ACTCODE_MOVE, 1, 40, -40, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_r_upst_l_2", ACTCODE_MOVE, 1, 40, -40, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //255 + {"std_raim_n_l_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_rbackaim_n_l_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM|ACTFLAG_BACKUP, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_jstraitup_up_l_2", ACTCODE_JUMP, 0, 0, 0, ACTFLAG_RHANDOPEN, BBOX_PRESET_STAND, 0.8f, BODYPOS_UNKNOWN}, + {"std_waim_fwd_l_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_OPTATTACK|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + {"std_l_n_l_2", ACTCODE_STAND, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //260 + {"std_ashuffle_n_l_2", ACTCODE_STAND, 1, 30, -30, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_a_dwn_l_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_OPTATTACK, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_a_fwd_l_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_f_fwd_l_2", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_echokedeath_n_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + + //265 + {"std_selectrocute_n_n_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_eoffladder_up_a_n", ACTCODE_MOVE, 1, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_epounddoor_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_jstraitup_up_a_a", ACTCODE_JUMP, 0, 0, 0, ACTFLAG_RHANDOPEN, BBOX_PRESET_STAND, 0.8f, BODYPOS_UNKNOWN}, + {"cch_a_fwd_l_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //270 + {"cch_raim_fwd_mrs_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM|ACTFLAG_REVERSEANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_raim_fwd_p_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM|ACTFLAG_REVERSEANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_ebustglass_n_mrs_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_efliptable_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_epushbuttons_n_n_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_RHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //275 + {"std_epushcrate_n_a_n", ACTCODE_MOVE, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_esignalalarm_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_etyping_n_n_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ewall2walk_n_mrs_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ewall2walk_n_pk_n", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //280 + {"std_ewallidle_n_mrs_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ewallidle_n_pk_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ewalllook_lt_mrs_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ewalllook_lt_pk_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ewalllook_rt_mrs_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //285 + {"std_ewalllook_rt_pk_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ewrenchh_frm_n_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ewrenchh_n_n_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ewrenchh_to_n_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ewrenchv_frm_n_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //290 + {"std_ewrenchv_n_n_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ewrenchv_to_n_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ecomehere_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ipiss_n_a_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_FULLANIM|ACTFLAG_PISS, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_athreat_dwn_p_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //295 + {"std_athreat_fwd_p_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_athreatyel_dwn_p_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_athreatyel_fwd_p_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_eexaminewall_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_jbackflip_n_p_n", ACTCODE_JUMP, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_BACKUP, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + + //300 will this nightmare never end? + {"std_erageshoot_n_p_n", ACTCODE_ATTACK, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_esabremock_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_rtostop_n_pk_n", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_etalkboth_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + {"std_etalk_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + + //305 + {"std_eheadnod_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_eheadshake_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ejumprail_n_a_n", ACTCODE_JUMP, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wtostop_n_pk_a", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_espin180_lt_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //310 + {"std_espin180_rt_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_etorun_n_p_n", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ilean_n_p_n", ACTCODE_STAND, 1, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_etalkright_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + {"std_eclimbledg_dwn_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //315 + {"std_eclimbledg_mid_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_eclimbledge_up_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_edropgrenade_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_efalldeath_n_n_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_efallimpact_n_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //320 + {"std_efrmshadow_n_mrs_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_efrmshadow_n_p_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ehandtalk_frm_p_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + {"std_ehandtalk_n_p_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + {"std_ehandtalk_to_mrs_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + + //325 + {"std_ehandtalk_to_p_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + {"std_ehandtalk_frm_mrs_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + {"std_eheadset_frm_p_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_eheadset_mid_p_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_eheadset_to_p_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //330 + {"std_esalute_frm_mrs_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_esalute_n_mrs_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_esalute_to_mrs_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_etalkleft_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + {"std_etalklklt_frm_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + + //335 + {"std_etalklklt_mid_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + {"std_etalklklt_to_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + {"std_etalklkrt_frm_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + {"std_etalklkrt_mid_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + {"std_etalklkrt_to_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + + //340 + {"std_etorun_n_mrs_2", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_eturn90_lt_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_eturn90_rt_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_igunup_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_ronfire_n_n_n", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_RHANDOPEN|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //345 + {"std_ronfiretodth_n_n_n", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_rtostop_n_mrs_2", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_edropcrouch_n_a_a", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_trun_n_a_n", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_w_n_pn_n", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //350 + {"std_wcarry2_n_n_n", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wtalk_lt_mrs_2", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + {"a4_cscramble_n_a_n", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_LOOPANIM, BBOX_PRESET_PRONE, 0, BODYPOS_UNKNOWN}, + {"cch_enodleft_n_a_a", ACTCODE_STAND, 1, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_enodright_n_a_a", ACTCODE_STAND, 1, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //355 + {"cch_escantalk_lt_a_a", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_escantalk_rt_a_a", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_iready_n_a_a", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_IDLE}, + {"std_echokeshoot_n_a_n", ACTCODE_ATTACK, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_hleanltsht_to_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_PLAYERLEANLEFT}, + + //360 + {"std_hleanltsht_to_l_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_PLAYERLEANLEFT}, + {"std_hleanltsht_mid_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_PLAYERLEANLEFT}, + {"std_hleanltsht_mid_l_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_PLAYERLEANLEFT}, + {"std_hleanltsht_frm_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_hleanltsht_frm_l_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //365 + {"std_hleanrtsht_to_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_PLAYERLEANRIGHT}, + {"std_hleanrtsht_to_l_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_PLAYERLEANRIGHT}, + {"std_hleanrtsht_mid_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_PLAYERLEANRIGHT}, + {"std_hleanrtsht_mid_l_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_PLAYERLEANRIGHT}, + {"std_hleanrtsht_frm_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //370 + {"std_hleanrtsht_frm_l_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_hleanltsht_to_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_PLAYERLEANLEFT}, + {"cch_hleanltsht_to_l_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_PLAYERLEANLEFT}, + {"cch_hleanltsht_mid_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_PLAYERLEANLEFT}, + {"cch_hleanltsht_mid_l_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_PLAYERLEANLEFT}, + + //375 + {"cch_hleanltsht_frm_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_hleanltsht_frm_l_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_hleanrtsht_to_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_PLAYERLEANRIGHT}, + {"cch_hleanrtsht_to_l_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_PLAYERLEANRIGHT}, + {"cch_hleanrtsht_mid_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_PLAYERLEANRIGHT}, + + //380 + {"cch_hleanrtsht_mid_l_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_PLAYERLEANRIGHT}, + {"cch_hleanrtsht_frm_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_hleanrtsht_frm_l_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_etalk_frm_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_TALKING}, + {"std_etalk_to_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_TALKING}, + + //385 + {"std_mswipe_n_kp_b", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_rswipe_n_k_n", ACTCODE_MOVE, 0, 10, -10, ACTFLAG_FULLANIM|ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_rswipe_n_k_n", ACTCODE_MOVE, 0, 10, -10, ACTFLAG_FULLANIM|ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_jdrop_to_a_n", ACTCODE_JUMP, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_athreatsht_dwn_p_n", ACTCODE_ATTACK, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //390 + {"std_a_dwn_p_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_OPTATTACK|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_a_dwn_mrs_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_OPTATTACK|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"RUBBISHWAS std_xcock_n_s_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_xladderfrm_up_a_a", ACTCODE_MOVE, 1, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_etostand_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //395 + {"std_ininja_n_p_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_xhandspring_fwd_a_n", ACTCODE_MOVE, 1, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xcock_n_s_2", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xcock_n_r_2", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_xcock_n_s_2", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //400 + //special non-death sblown for armored guys + {"std_sblown_2bk_n_n", ACTCODE_PAIN, 1, 0, -0, ACTFLAG_RHANDOPEN|ACTFLAG_LHANDOPEN, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"lb_xgetup_n_a_n", ACTCODE_STAND, 1, 3, -3, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_raim_n_l_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM|ACTFLAG_REVERSEANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_r_n_pk_n", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_r_n_pk_n", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM|ACTFLAG_REVERSEANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //405 + {"std_egangsalute_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_wbackwards_n_a_n", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ssabredeath_bk_n_n", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"std_wstealth_n_pk_n", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_jthrowstar_fwd_a_n", ACTCODE_JUMP, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //410 + {"prn_a_n_a_2", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_PRONE, 0, BODYPOS_UNKNOWN}, + {"std_eyell_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ialertlk_rt_mrs_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_epushbuttonh_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_rdynamic_n_a_n", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //415 -- and Dan thought this was ugly at 300... + {"std_ietalkpose_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + {"std_frapidsweep_lt_p_2", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ialerttrn_lt_p_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_esuprise90_lt_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_fautosweep_up_m_2", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //420 + {"si_ewallidle_n_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_ALWAYSPRONE|ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"si_ewalltalk_n_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_ALWAYSPRONE|ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"std_etoaim_n_p_2", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"si_ewallfear_n_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_ALWAYSPRONE|ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"std_esalute_to_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //425 + {"std_esalute_n_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"std_esalute_frm_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_esalutations_n_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_eclimbshaft_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_w_n_a_n", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //430 + {"cch_ewalk2cch_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_etalk_dwn_p_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_italkpose_up_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + {"cch_italkpose_dwn_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_etalk_up_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_IDLE}, + + //435 + {"cch_eheadnod_n_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_ecch2walk_n_a_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_wfast_n_a_n", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_erageidle_n_p_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ietalkpose_rt_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_TALKING}, + + //440 + {"std_smicro_n_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"std_ebooklook_n_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ebookscan_n_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_eheadset_frm_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_eheadset_mid_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //445 + {"std_w_n_mrs_2", ACTCODE_MOVE, 1, 20,-20, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_edkraim_n_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_ehawkknees_n_n_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_edkraimtalk_n_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_edkrfirelk_rt_a_n", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //450 + {"cch_ehawkdeath_n_n_n", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"cch_ehawkkneetlk_n_n_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_ehawkcrouch_n_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_eheadset_to_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"lb_eslide_n_pk_n", ACTCODE_MOVE, 1, 5, -5, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + + //455 + {"std_igunuplook_n_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_frapid_n_p_2", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_edkraimlk_fwd_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_hsignalgo_n_a_a", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_hsignalstop_n_a_a", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //460 + {"std_htaunt_n_a_a", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ewhirl_rt_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_fsweepup_frm_a_a", ACTCODE_STAND, 0, 10, -10, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_fsweepup_to_a_a", ACTCODE_STAND, 0, 10, -10, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xtakecover_n_a_n", ACTCODE_MOVE, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //465 + {"std_tstar_fwd_a_n", ACTCODE_ATTACK, 1, 2, -2, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_sarmunhurt_lt_a_n", ACTCODE_PAIN, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_RLEGHURT}, + {"std_sarmunhurt_rt_a_n", ACTCODE_PAIN, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_RLEGHURT}, + {"std_slegunhurt_lt_a_n", ACTCODE_PAIN, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_RLEGHURT}, + {"std_slegunhurt_rt_a_n", ACTCODE_PAIN, 0, 0, 0, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_RLEGHURT}, + + //470 + {"std_jthrowstar_bk_a_n", ACTCODE_JUMP, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN|ACTFLAG_BACKUP, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_esabrebluff_n_a_a", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_eautosweep_n_pm_a", ACTCODE_ATTACK, 0, 10, -10, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_tknife_n_k_a", ACTCODE_ATTACK, 1, 2, -2, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_tgrenade_n_a_n", ACTCODE_ATTACK, 1, 2, -2, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0.9f, BODYPOS_UNKNOWN}, + + //475 + {"cch_a_fwd_p_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_OPTATTACK|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_a_fwd_p_2", ACTCODE_STAND, 0, 20, -20, ACTFLAG_OPTATTACK|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xhandspring_bk_a_n", ACTCODE_MOVE, 1, 2, -2, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_soutwindow_n_a_n", ACTCODE_MOVE, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_xcrouch_dwn_p_2", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //480 + {"std_tunder_n_a_n", ACTCODE_ATTACK, 1, 2, -2, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0.9f, BODYPOS_UNKNOWN}, + {"std_xcrouch_dwn_p_a", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_wfire_fwd_ms_2", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_AIMWALK}, + {"cch_afire_fwd_ms_2", ACTCODE_ATTACK, 1, 20, -20, ACTFLAG_LHANDOPEN|ACTFLAG_LOOPANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_epushover_n_pk_a", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //485 + {"std_lrun_bk_p_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lrun_fwd_p_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lrunstraf_lt_p_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lrunstraf_rt_p_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lrun_bk_l_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //490 + {"std_lrun_fwd_l_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lrunstraf_lt_l_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lrunstraf_rt_l_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lrun_bk_ms_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lrun_fwd_ms_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //495 + {"std_lrunstraf_lt_ms_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lrunstraf_rt_ms_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lrun_bk_r_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lrun_fwd_r_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lrunstraf_lt_r_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //500 + {"std_lrunstraf_rt_r_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lwalk_bk_p_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lwalk_fwd_p_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lwalkstraf_lt_p_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lwalkstraf_rt_p_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //505 + {"std_lwalk_bk_l_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lwalk_fwd_l_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lwalkstraf_lt_l_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lwalkstraf_rt_l_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lwalk_bk_ms_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //510 + {"std_lwalk_fwd_ms_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lwalkstraf_lt_ms_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lwalkstraf_rt_ms_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lwalk_bk_r_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lwalk_fwd_r_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //515 + {"std_lwalkstraf_lt_r_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_lwalkstraf_rt_r_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_l_fwd_p_2", ACTCODE_STAND, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_l_fwd_l_2", ACTCODE_STAND, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_l_fwd_ms_2", ACTCODE_STAND, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //520 + {"cch_l_fwd_r_2", ACTCODE_STAND, 0, 2, -2, ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_lrun_bk_p_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_lrun_fwd_p_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_lrun_bk_l_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_lrun_fwd_l_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + + //525 + {"cch_lrun_bk_ms_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_lrun_fwd_ms_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_lrun_bk_r_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"cch_lrun_fwd_r_2", ACTCODE_MOVE, 0, 2, -2, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_FULLANIM, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"std_emerchall_n_a_a", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //530 + {"std_emerchone_n_a_a", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_iemerchant_n_a_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_emerchwave_rt_a_a", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_emerchtalk_n_a_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_emerchwave_lt_a_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_FULLANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //535 + {"std_ebeg_n_a_a", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"cch_xcchcower_n_a_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_LHANDOPEN|ACTFLAG_RHANDOPEN, BBOX_PRESET_CROUCH, 0, BODYPOS_UNKNOWN}, + {"lb_sautofire_end_n_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + {"lf_sautofire_end_n_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYBACK, 0, BODYPOS_UNKNOWN}, + +//keep this move at the end of the list please!!! pathcorners will know the list is finished when they hit it! + {"", ACTCODE_STAND, 0, 0, 0, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + +}; + +mmove_t MDogMoves[MMOVE_DOG_SIZE]= +{ + //0 + {"std_ibark_n", ACTCODE_STAND, 0, 10, -10, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ipant_n", ACTCODE_STAND, 0, 10, -10, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_r_n", ACTCODE_MOVE, 1.1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_stoside_rt", ACTCODE_DEATH, 1, 0, 0, 0, BBOX_PRESET_LAYSIDE, 0, BODYPOS_UNKNOWN}, + {"std_w_n", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //5 + {"unused", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_jattack_n", ACTCODE_ATTACK, 1, 20, -20, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wsniff_n", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_jattack_n", ACTCODE_ATTACK, 1, 20, -20, 0, BBOX_PRESET_STAND, 0.4f, BODYPOS_UNKNOWN}, + {"std_stumble_rt", ACTCODE_DEATH, 1.0, 0, 0, 0, BBOX_PRESET_LAYFRONT, 0, BODYPOS_UNKNOWN}, + + //10 + {"sit_i_n", ACTCODE_STAND, 0, 10, -10, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"sit_itostand_n", ACTCODE_STAND, 1.0, 10, -10, 0, BBOX_PRESET_STAND, 0.0f, BODYPOS_UNKNOWN}, + {"std_itosit_n", ACTCODE_STAND, 1.0, 10, -10, 0, BBOX_PRESET_STAND, 0.0f, BODYPOS_UNKNOWN}, + {"std_wsniff_frm", ACTCODE_MOVE, 1, 20, -20, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wsniff_to", ACTCODE_MOVE, 1, 20, -20, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //15 + {"std_wlooklt_frm", ACTCODE_MOVE, 1, 20, -20, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wlooklt_n", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wlooklt_to", ACTCODE_MOVE, 1, 20, -20, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wlookltrt_n", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wlookrt_frm", ACTCODE_MOVE, 1, 20, -20, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + + //20 + {"std_wlookrt_n", ACTCODE_MOVE, 1, 20, -20, ACTFLAG_LOOPANIM|ACTFLAG_MATCHANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_wlookrt_to", ACTCODE_MOVE, 1, 20, -20, 0, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"sid_prdl_rt", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYSIDE, 0, BODYPOS_UNKNOWN}, + {"sid_prdl2_rt", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYSIDE, 0, BODYPOS_UNKNOWN}, + {"sid_prdl3_rt", ACTCODE_DEATH, 0, 0, 0, ACTFLAG_LOOPANIM|ACTFLAG_ALWAYSPRONE, BBOX_PRESET_LAYSIDE, 0, BODYPOS_UNKNOWN}, + + // 25 + {"std_sblown_2bk", ACTCODE_DEATH, 1.0, 0, 0, 0, BBOX_PRESET_LAYSIDE, 0, BODYPOS_UNKNOWN}, +}; + + +mmove_t MCowMoves[MMOVE_COW_SIZE]= +{ + //0 + {"std_i_n", ACTCODE_STAND, 0, 0, 0, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_w_n", ACTCODE_MOVE, 1, 10, -10, ACTFLAG_LOOPANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_s_rt", ACTCODE_DEATH, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_LAYSIDE, 0, BODYPOS_UNKNOWN}, + {"std_imoo_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_ilooking_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, + {"std_p_n", ACTCODE_STAND, 1, 0, 0, ACTFLAG_FULLANIM, BBOX_PRESET_STAND, 0, BODYPOS_UNKNOWN}, +}; diff --git a/Source/Game/gamecpp/ai_bodynoghoul.h b/Source/Game/gamecpp/ai_bodynoghoul.h new file mode 100644 index 0000000..9fca5ff --- /dev/null +++ b/Source/Game/gamecpp/ai_bodynoghoul.h @@ -0,0 +1,638 @@ + +//animation action flags + +#define ACTFLAG_JUMPTOGROUND2 0x00000800 //once "inair" note track is hit, use ground2 instead of ground +#define ACTFLAG_OPTATTACK 0x00001000 //this is an aim--can choose to attack or not any frame. +#define ACTFLAG_RHANDOPEN 0x00002000 //use open right hand instead of closed +#define ACTFLAG_LHANDOPEN 0x00004000 //use open left hand instead of closed +#define ACTFLAG_BACKUP 0x00008000 //for a backwards walk. needed for scripting +#define ACTFLAG_LEFTSTRAFE 0x00010000 //for left strafe. needed for scripting +#define ACTFLAG_RIGHTSTRAFE 0x00020000 //for right strafe. needed for scripting +#define ACTFLAG_FIREFROMGUN 0x00040000 //certain animations need to fire from the gun endpoint rather than the guy center (!) + +//simple summary of how animation finishes--fix a few of these as specific, like endattack????? +#define ACTFLAG_FULLANIM 0x00400000 // when setting up an action, tell it to play the full animation (disallow cutting it off under normal circumstances--for pain or death it's ok) + // use sparingly! guys don't do much thinking while they're performing actions, so they can lose track of targets, etc. while running these anims! + +#define ACTFLAG_ALWAYSPRONE 0x00800000 // means the anim is eligible to have the "shot while lying down" anim +#define ACTFLAG_MATCHANIM 0x01000000 // match relative position of similar action type (so leg position in run lines up to what it was in walk) +#define ACTFLAG_MATCHABS 0x02000000 // match the absolute position of similar action type (for 180 turn, has a walk cycle at beginning) +#define ACTFLAG_REVERSEANIM 0x04000000 +#define ACTFLAG_LOOPANIM 0x08000000 + +#define ACTFLAG_GRENADE 0x10000000 // Bolt on the grenade, remove when throw call is made... + +#define ACTFLAG_PISS 0x20000000 // Call takeleak effect on the proper bolt-on. Parental lockout. +#define ACTFLAG_VOMIT 0x40000000 // Call vomit effect on the proper bolt-on. Parental lockout. + +//anyone should be able to use this--not really an animation thing, just for use with the GetSequenceFor stuff +extern mmove_t ScriptReleaseMove[]; + + +extern mmove_t MMoves[]; + +extern mmove_t MDogMoves[]; + +extern mmove_t MCowMoves[]; + +//fixme: want a method of finding the best move given a list of parameters; these are too hardcoded! +//the parameters are: + +//what's in each hand (body can figure this one out itself, can HOPEFULLY leave a blank spot +// in the organization for body to fill in itself--as long as other aspects +// of animation stay consistent no matter what's in yer hand) + +//body position at start of action (body will know what position last move resulted in--works only if we can +// assume that moves that are started always make their end positions happen) + +//desired position at end of action (needs to be passed in) + +//movement desired on each axis (needs to be passed in) + +//basic kind of action: death, injury, attack, or none of the above (needs to be passed in) + +//specific kind of action: intimidate/threaten hostage, cower in fear, aim weapon up/down/straight, +// specific idle, semaphore command, etc.? (needs to be passed in) + +//whether monster is noticeably injured (if needed, body Could theoretically know this, though it doesn't now) + +//amount/direction we want to turn (needs to be passed in) + + +#define default_death MMoves[25] +#define generic_move_stand MMoves[0] +#define generic_move_walk MMoves[1] +#define generic_move_run MMoves[2] +#define generic_move_attack MMoves[3] +#define generic_move_run_gunup MMoves[4] +#define generic_move_death_long MMoves[5] +#define generic_move_jumpup_jump MMoves[6] +#define generic_move_attack_attitude MMoves[7] +#define generic_move_walk_attitude MMoves[8] +#define generic_move_jumpdrop MMoves[9] +#define generic_move_raim_p1 MMoves[10] +#define generic_move_raim_p2 MMoves[11] +#define generic_move_duck_down MMoves[12] +#define generic_move_duck_hold MMoves[13] +#define generic_move_duck_shoot MMoves[14] +#define generic_move_duck_up MMoves[15] +#define generic_move_standlook MMoves[16] +#define generic_move_standstretch MMoves[17] +#define generic_move_deaththrown MMoves[18] +#define generic_move_runscared MMoves[19] +#define generic_move_chaim2 MMoves[20] +#define generic_move_staim_p2 MMoves[21] +#define generic_move_staim_pcb MMoves[22] +#define generic_move_firecb MMoves[23] +#define generic_move_death_dance MMoves[24] +#define generic_move_death_fallforward MMoves[25] +#define generic_move_attackb MMoves[26] +#define generic_move_death_legright MMoves[27] +#define generic_move_death_legleft MMoves[28] +#define generic_move_death_shldrright MMoves[29] +#define generic_move_death_shldrleft MMoves[30] +#define generic_move_death_backflail MMoves[31] +#define generic_move_death_backrtleg MMoves[32] +#define generic_move_death_backltleg MMoves[33] +#define generic_move_death_crouchshot MMoves[34] +#define generic_move_ashuffle_p2 MMoves[35] +#define generic_move_ashuffle_pcb MMoves[36] +#define generic_move_attack_mgun MMoves[37] +#define generic_move_staim_ms MMoves[38] +#define generic_move_stand_mrs MMoves[39] +#define generic_move_standlook_mrs MMoves[40] +#define generic_move_standstretch_mrs MMoves[41] +#define generic_move_walk_mrs MMoves[42] +#define generic_move_cleangun MMoves[43] +#define generic_move_monitor_up MMoves[44] +#define generic_move_idletalk MMoves[45] +#define generic_move_idletalk_gest1 MMoves[46] +#define generic_move_idletalk_gest2 MMoves[47] +#define generic_move_idletalk_gest3 MMoves[48] +#define generic_move_wipebrow MMoves[49] +#define generic_move_alarm_push MMoves[50] +#define generic_move_yell_point MMoves[51] +#define generic_move_yell_wave MMoves[52] +#define generic_move_dive_toprone MMoves[53] +#define generic_move_boom_crouch MMoves[54] +#define generic_move_tumble_front MMoves[55] +#define generic_move_walk_carry MMoves[56] +#define generic_move_walk_patrol MMoves[57] +#define generic_move_run_mrs MMoves[58] +#define generic_move_cfire_s MMoves[59] +#define generic_move_cfire_r MMoves[60] +#define generic_move_caim_ms MMoves[61] +#define generic_move_caim_r MMoves[62] +#define generic_move_fcornerl_m2 MMoves[63] +#define generic_move_fcornerr_m2 MMoves[64] +#define generic_move_fcornerl_p MMoves[65] +#define generic_move_fcornerr_p MMoves[66] +#define generic_move_walk_back_signal MMoves[67] +#define generic_move_wturn90l_p MMoves[68] +#define generic_move_wturn90r_p MMoves[69] +#define generic_move_wturn90l_mrs MMoves[70] +#define generic_move_wturn90r_mrs MMoves[71] +#define generic_move_death_tobackrtleg MMoves[72] +#define generic_move_death_tobackltleg MMoves[73] +#define generic_move_death_tobackflail MMoves[74] +#define generic_move_death_backrtlegdie MMoves[75] +#define generic_move_death_backltlegdie MMoves[76] +#define generic_move_death_backflaildie MMoves[77] +#define generic_move_waimstrafl_l MMoves[78] +#define generic_move_waimstrafr_l MMoves[79] +#define generic_move_wbackaim_l MMoves[80] +#define generic_move_walk_l MMoves[81] +#define generic_move_atkpause1_mrs MMoves[82] +#define generic_move_atkpause2_mrs MMoves[83] +#define generic_move_atkpause1_p MMoves[84] +#define generic_move_atkpause2_p MMoves[85] +#define generic_move_death_lbshotloop MMoves[86] +#define generic_move_death_lbshotdeath MMoves[87] +#define generic_move_cfire_m MMoves[88] +#define generic_move_wturn180_mrs MMoves[89] +#define generic_move_attack_sgun MMoves[90] +#define generic_move_opendoor MMoves[91] +#define generic_move_attack_rif MMoves[92] +#define generic_move_staim_r MMoves[93] +#define generic_move_duck_down_mrs MMoves[94] +#define generic_move_duck_up_mrs MMoves[95] +#define generic_move_raimstrafl_p MMoves[96] +#define generic_move_raimstrafr_p MMoves[97] +#define generic_move_raimstrafl_mrs MMoves[98] +#define generic_move_raimstrafr_mrs MMoves[99] +#define generic_move_raim_mrs MMoves[100] +#define generic_move_ashuffle_ms MMoves[101] +#define generic_move_ashuffle_r MMoves[102] +#define generic_move_alert_p MMoves[103] +#define generic_move_alertlklt_p MMoves[104] +#define generic_move_rollrt_p MMoves[105] +#define generic_move_rolllt_p MMoves[106] +#define generic_move_alerttrnrt_p MMoves[107] +#define generic_move_alert_mrs MMoves[108] +#define generic_move_raimstrafl_l MMoves[109] +#define generic_move_alertlkrt_mrs MMoves[110] +#define generic_move_alerttrnlt_mrs MMoves[111] +#define generic_move_throw_gren MMoves[112] +#define generic_move_deadgroin MMoves[113] +#define generic_move_deadthroat MMoves[114] +#define generic_move_atksweep_mgun MMoves[115] +#define generic_move_idletalk_mrs MMoves[116] +#define generic_move_idletalk_gest1_mrs MMoves[117] +#define generic_move_idletalk_gest2_mrs MMoves[118] +#define generic_move_idletalk_gest3_mrs MMoves[119] +#define generic_move_praim_mrs MMoves[120] +#define generic_move_prfire_mrs MMoves[121] +#define generic_move_death_lfshotloop MMoves[122] +#define generic_move_death_lfshotdeath MMoves[123] +#define generic_move_cower MMoves[124] +#define generic_move_gunshotpain MMoves[125] +#define generic_move_jump_runfwd MMoves[126] +#define RUBBISHWASgeneric_move_limb_jitter MMoves[127] +#define RUBBISHWASgeneric_move_limb_jitter2 MMoves[128] +#define generic_move_rdwnstairs_p MMoves[129] +#define generic_move_rupstairs_p MMoves[130] +#define generic_move_death_cch_sonknees MMoves[131] +#define generic_move_crouch_onknees MMoves[132] +#define generic_move_turnvalve_from MMoves[133] +#define generic_move_turnvalve MMoves[134] +#define generic_move_turnvalve_to MMoves[135] +#define generic_move_kicklow MMoves[136] +#define generic_move_pistolwhip MMoves[137] +#define generic_move_death_sinback_tofront MMoves[138] +#define generic_move_layside_kicked MMoves[139] +#define generic_move_sitbywall MMoves[140] +#define generic_move_death_tumble_toback MMoves[141] +#define generic_move_walk_push_gate MMoves[142] +#define generic_move_kick_door MMoves[143] +#define generic_move_yell_at_you MMoves[144] +#define generic_move_ileanlook_frm MMoves[145] +#define generic_move_ileanlook_mid MMoves[146] +#define generic_move_ileanlook_to MMoves[147] +#define generic_move_jumpdown MMoves[148] +#define generic_move_crouch_cower_mid MMoves[149] +#define generic_move_crouch_cower_mid2 MMoves[150] +#define generic_move_waimstrafl_ms MMoves[151] +#define generic_move_waimstrafl_r MMoves[152] +#define generic_move_waimstrafl_p MMoves[153] +#define generic_move_waimstrafr_ms MMoves[154] +#define generic_move_waimstrafr_r MMoves[155] +#define generic_move_waimstrafr_p MMoves[156] +#define generic_move_waim_p MMoves[157] +#define generic_move_waim_r MMoves[158] +#define generic_move_waim_ms MMoves[159] +#define generic_move_wbackaim_p MMoves[160] +#define generic_move_wbackaim_r MMoves[161] +#define generic_move_wbackaim_ms MMoves[162] +#define generic_move_sunhurtfwd_p MMoves[163] +#define generic_move_sunhurtfwd_mrs MMoves[164] +#define generic_move_sunhurtbk_p MMoves[165] +#define generic_move_sunhurtbk_mrs MMoves[166] +#define generic_move_blindedto MMoves[167] +#define generic_move_blindedloop MMoves[168] +#define generic_move_blindedfrom MMoves[169] +#define generic_move_ishift MMoves[170] +#define generic_move_startled MMoves[171] +#define generic_move_reload_p MMoves[172] +#define generic_move_reload_ms MMoves[173] +#define generic_move_pain_rleg MMoves[174] +#define generic_move_pain_lleg MMoves[175] +#define generic_move_hop_rleg MMoves[176] +#define generic_move_hop_lleg MMoves[177] +#define generic_move_limp_rleg MMoves[178] +#define generic_move_limp_lleg MMoves[179] +#define generic_move_reload_r MMoves[180] +#define generic_move_crouch_cower_dwn MMoves[181] +#define generic_move_rbackaim_mrs MMoves[182] +#define generic_move_rbackaim_p2 MMoves[183] +#define generic_move_pain_rarm MMoves[184] +#define generic_move_pain_larm MMoves[185] +#define generic_move_hurt_rarm MMoves[186] +#define generic_move_hurt_larm MMoves[187] +#define generic_move_dont_shoot MMoves[188] +#define generic_move_fear_wave MMoves[189] +#define generic_move_rdwnstairs_mrs MMoves[190] +#define generic_move_rupstairs_mrs MMoves[191] +#define generic_move_hurt_aim MMoves[192] +#define generic_move_hurt_atk MMoves[193] +#define generic_move_crouch_cower_up MMoves[194] +#define generic_move_reload_p1 MMoves[195] +#define generic_move_death_violent MMoves[196] +#define generic_move_prcowerto MMoves[197] +#define generic_move_prcower MMoves[198] +#define generic_move_death_chestfront MMoves[199] +#define generic_move_death_gut_toside MMoves[200] +#define generic_move_death_pulse_gun MMoves[201] +#define generic_move_cleangun2_mrs MMoves[202] +#define generic_move_monitor_up2 MMoves[203] +#define generic_move_touchnuts MMoves[204] +#define generic_move_smoke_frm MMoves[205] +#define generic_move_smoke MMoves[206] +#define generic_move_smoke_to MMoves[207] +#define generic_move_walk_jog_mrs MMoves[208] +#define generic_move_walk_jog_gundwn_p MMoves[209] +#define generic_move_walk_jog_gunup_p MMoves[210] +#define generic_move_walk_pushcart MMoves[211] +#define generic_move_fautosweep_pm MMoves[212] +#define generic_move_fgangbanger_m MMoves[213] +#define generic_move_fswatstyle_m MMoves[214] +#define generic_move_fviolent_m MMoves[215] +#define generic_move_fviolent_p MMoves[216] +#define generic_move_ninjakick MMoves[217] +#define generic_move_riflebutt MMoves[218] +#define generic_move_death_fallfwd MMoves[219] +#define generic_move_death_stumble_2frnt MMoves[220] +#define generic_move_choke_stand MMoves[221] +#define generic_move_pentium_dance MMoves[222] +#define generic_move_go_prone MMoves[223] +#define generic_move_ladder_down MMoves[224] +#define generic_move_ladder_up MMoves[225] +#define generic_move_roll_to_crouch MMoves[226] +#define generic_move_stumble MMoves[227] +#define generic_move_sit_idle MMoves[228] +#define generic_move_sit_tostand MMoves[229] +#define generic_move_prone_falling MMoves[230] +#define generic_move_prone_falling_land MMoves[231] +#define generic_move_prone_to_stand MMoves[232] +#define generic_move_crouch_run_mrs MMoves[233] +#define generic_move_crouch_run_p MMoves[234] +#define generic_move_layback_scooch MMoves[235] +#define generic_move_layback_die_shoot MMoves[236] +#define generic_move_crouch_launcher_fire MMoves[237] +#define generic_move_crouch_launcher_run_aim MMoves[238] +#define generic_move_lob_grenade_crouch MMoves[239] +#define generic_move_allfours_scramble MMoves[240] +#define generic_move_prone_crawl MMoves[241] +#define generic_move_staimup_mrs MMoves[242] +#define generic_move_staimup_p MMoves[243] +#define generic_move_staimup_l MMoves[244] +#define generic_move_death_onfire MMoves[245] +#define generic_move_slash_kp_script MMoves[246] +#define generic_move_slash_kp MMoves[247] +#define generic_move_choketoknees MMoves[248] +#define generic_move_chokeonkees MMoves[249] +#define generic_move_duck_up_l MMoves[250] +#define generic_move_raimstrafr_l MMoves[251] +#define generic_move_duck_down_l MMoves[252] +#define generic_move_rdwnstairs_l MMoves[253] +#define generic_move_rupstairs_l MMoves[254] +#define generic_move_raim_l MMoves[255] +#define generic_move_rbackaim_l MMoves[256] +#define generic_move_jumpstrup_jump_l MMoves[257] +#define generic_move_waim_l MMoves[258] +#define generic_move_reload_l MMoves[259] +#define generic_move_ashuffle_l MMoves[260] +#define generic_move_staimdn_l MMoves[261] +#define generic_move_staim_l MMoves[262] +#define generic_move_attack_l MMoves[263] +#define generic_move_chokekneesdeath MMoves[264] +#define generic_move_electrocute_loop MMoves[265] +#define generic_move_offladder_up MMoves[266] +#define generic_move_pound_door MMoves[267] +#define generic_move_jumpstrup_jump MMoves[268] +#define generic_move_caim_l MMoves[269] +#define generic_move_crouch_rbk_mrs MMoves[270] +#define generic_move_crouch_rbk_p MMoves[271] +#define generic_move_bust_glass MMoves[272] +#define generic_move_flip_table MMoves[273] +#define generic_move_push_buttons MMoves[274] +#define generic_move_push_crate MMoves[275] +#define generic_move_signal_alarm MMoves[276] +#define generic_move_typing MMoves[277] +#define generic_move_wall2walk_mrs MMoves[278] +#define generic_move_wall2walk_pk MMoves[279] +#define generic_move_wallidle_mrs MMoves[280] +#define generic_move_wallidle_pk MMoves[281] +#define generic_move_walllook_lt_mrs MMoves[282] +#define generic_move_walllook_lt_pk MMoves[283] +#define generic_move_walllook_rt_mrs MMoves[284] +#define generic_move_walllook_rt_pk MMoves[285] +#define generic_move_wrenchh_frm MMoves[286] +#define generic_move_wrenchh_n MMoves[287] +#define generic_move_wrenchh_to MMoves[288] +#define generic_move_wrenchv_frm MMoves[289] +#define generic_move_wrenchv_n MMoves[290] +#define generic_move_wrenchv_to MMoves[291] +#define generic_move_come_here MMoves[292] +#define generic_move_piss MMoves[293] +#define generic_move_athreat_dwn MMoves[294] +#define generic_move_athreat_fwd MMoves[295] +#define generic_move_athreatyel_dwn MMoves[296] +#define generic_move_athreatyel_fwd MMoves[297] +#define generic_move_examine_wall MMoves[298] +#define generic_move_backflip MMoves[299] +#define generic_move_rageshoot MMoves[300] +#define generic_move_sabremock MMoves[301] +#define generic_move_runtostop MMoves[302] +#define generic_move_talkboth MMoves[303] +#define generic_move_gentalk MMoves[304] +#define generic_move_headnod MMoves[305] +#define generic_move_headshake MMoves[306] +#define generic_move_jumprail MMoves[307] +#define generic_move_walktostop MMoves[308] +#define generic_move_spin180_lt MMoves[309] +#define generic_move_spin180_rt MMoves[310] +#define generic_move_idletorun MMoves[311] +#define generic_move_leanrail MMoves[312] +#define generic_move_talkright MMoves[313] +#define generic_move_climbdown MMoves[314] +#define generic_move_climbmid MMoves[315] +#define generic_move_climbup MMoves[316] +#define generic_move_dropgrenade MMoves[317] +#define generic_move_falldeath MMoves[318] +#define generic_move_fallimpact MMoves[319] +#define generic_move_fromshadow MMoves[320] +#define generic_move_fromshadow2 MMoves[321] +#define generic_move_handtalk MMoves[322] +#define generic_move_handtalk2 MMoves[323] +#define generic_move_handtalk3 MMoves[324] +#define generic_move_handtalk4 MMoves[325] +#define generic_move_handtalk5 MMoves[326] +#define generic_move_headsettalk MMoves[327] +#define generic_move_headsettalk2 MMoves[328] +#define generic_move_headsettalk3 MMoves[329] +#define generic_move_salute_begin MMoves[330] +#define generic_move_saluting MMoves[331] +#define generic_move_salute_end MMoves[332] +#define generic_move_talkleft MMoves[333] +#define generic_move_talklookleft MMoves[334] +#define generic_move_talklookleft2 MMoves[335] +#define generic_move_talklookleft3 MMoves[336] +#define generic_move_talklookright MMoves[337] +#define generic_move_talklookright2 MMoves[338] +#define generic_move_talklookright3 MMoves[339] +#define generic_move_idletorun2 MMoves[340] +#define generic_move_turnleft90 MMoves[341] +#define generic_move_turnright90 MMoves[342] +#define generic_move_idlegunup MMoves[343] +#define generic_move_runonfire MMoves[344] +#define generic_move_onfiretodeath MMoves[345] +#define generic_move_runtostop2 MMoves[346] +#define generic_move_dropcrouch MMoves[347] +#define generic_move_grenaderun MMoves[348] +#define generic_move_femalewalk MMoves[349] +#define generic_move_walkcarry MMoves[350] +#define generic_move_walktalk MMoves[351] +#define generic_move_a4scramble MMoves[352] +#define generic_move_crouchnodleft MMoves[353] +#define generic_move_crouchnodright MMoves[354] +#define generic_move_crouchtalklt MMoves[355] +#define generic_move_crouchtalkrt MMoves[356] +#define generic_move_crouchready MMoves[357] +#define generic_move_chokeshoot MMoves[358] +#define generic_move_playerleanlt_to_a MMoves[359] +#define generic_move_playerleanlt_to_l MMoves[360] +#define generic_move_playerleanlt_mid_a MMoves[361] +#define generic_move_playerleanlt_mid_l MMoves[362] +#define generic_move_playerleanlt_frm_a MMoves[363] +#define generic_move_playerleanlt_frm_l MMoves[364] +#define generic_move_playerleanrt_to_a MMoves[365] +#define generic_move_playerleanrt_to_l MMoves[366] +#define generic_move_playerleanrt_mid_a MMoves[367] +#define generic_move_playerleanrt_mid_l MMoves[368] +#define generic_move_playerleanrt_frm_a MMoves[369] +#define generic_move_playerleanrt_frm_l MMoves[370] +#define generic_move_playerleanclt_to_a MMoves[371] +#define generic_move_playerleanclt_to_l MMoves[372] +#define generic_move_playerleanclt_mid_a MMoves[373] +#define generic_move_playerleanclt_mid_l MMoves[374] +#define generic_move_playerleanclt_frm_a MMoves[375] +#define generic_move_playerleanclt_frm_l MMoves[376] +#define generic_move_playerleancrt_to_a MMoves[377] +#define generic_move_playerleancrt_to_l MMoves[378] +#define generic_move_playerleancrt_mid_a MMoves[379] +#define generic_move_playerleancrt_mid_l MMoves[380] +#define generic_move_playerleancrt_frm_a MMoves[381] +#define generic_move_playerleancrt_frm_l MMoves[382] +#define generic_move_tostandfromtalk MMoves[383] +#define generic_move_totalkfromstand MMoves[384] +#define generic_move_butchswipe MMoves[385] +#define generic_move_playerstrunswipe MMoves[386] +#define generic_move_playercrunswipe MMoves[387] +#define generic_move_runbeginjump MMoves[388] +#define generic_move_threatenshoot MMoves[389] +#define generic_move_staimdn_p MMoves[390] +#define generic_move_staimdn_mrs MMoves[391] +#define generic_move_cockshotgun MMoves[397] // 392 was just a copy of 397 +#define generic_move_climbupoffladder MMoves[393] +#define generic_move_dekkerstandfromcrouch MMoves[394] +#define generic_move_ninjaidle MMoves[395] +#define generic_move_handspringforward MMoves[396] +#define generic_move_scock_s MMoves[397] +#define generic_move_scock_r MMoves[398] +#define generic_move_ccock_s MMoves[399] +#define generic_move_armorblown MMoves[400] +#define generic_move_upfromback MMoves[401] +#define generic_move_crouch_launcher_runbk_aim MMoves[402] +#define generic_move_crouch_knife_run_aim MMoves[403] +#define generic_move_crouch_knife_runbk_aim MMoves[404] +#define generic_move_gangsalute MMoves[405] +#define generic_move_walkbackwards MMoves[406] +#define generic_move_sabredeath MMoves[407] +#define generic_move_stealthwalk MMoves[408] +#define generic_move_jumpthrowstars MMoves[409] +#define generic_move_proneidle MMoves[410] +#define generic_move_yell MMoves[411] +#define generic_move_alertlookright_mrs MMoves[412] +#define generic_move_pushbuttonscene75 MMoves[413] +#define generic_move_coolerrun MMoves[414] +#define generic_move_talkpose MMoves[415] +#define generic_move_firerapidsweep MMoves[416] +#define generic_move_alertturnleft MMoves[417] +#define generic_move_surprise90left MMoves[418] +#define generic_move_autosweepup MMoves[419] +#define generic_move_wallidle MMoves[420] +#define generic_move_wallidletalk MMoves[421] +#define generic_move_idletoaim MMoves[422] +#define generic_move_wallfear MMoves[423] +#define generic_move_salute_begin_any MMoves[424] +#define generic_move_saluting_any MMoves[425] +#define generic_move_salute_end_any MMoves[426] +#define generic_move_salutations MMoves[427] +#define generic_move_climintoshaft MMoves[428] +#define generic_move_crouchedwalk MMoves[429] +#define generic_move_walktocrouch MMoves[430] +#define generic_move_crouchtalkdown MMoves[431] +#define generic_move_talkup MMoves[432] +#define generic_move_crouchtalkposedown MMoves[433] +#define generic_move_standtalkup MMoves[434] +#define generic_move_crouchheadnod MMoves[435] +#define generic_move_crouchtowalk MMoves[436] +#define generic_move_walkfast MMoves[437] +#define generic_move_erageidle MMoves[438] +#define generic_move_talkpose_rt MMoves[439] +#define generic_move_microwave_death MMoves[440] +#define generic_move_look_at_book MMoves[441] +#define generic_move_scan_book MMoves[442] +#define generic_move_headsetfrom MMoves[443] +#define generic_move_headsetlooping MMoves[444] +#define generic_move_walkshotgun MMoves[445] +#define generic_move_dekkeraim MMoves[446] +#define generic_move_hawkknees MMoves[447] +#define generic_move_dekkeraimtalk MMoves[448] +#define generic_move_dekkerfirelook MMoves[449] +#define generic_move_hawkdeath MMoves[450] +#define generic_move_hawkkneeltalk MMoves[451] +#define generic_move_hawkcrouch MMoves[452] +#define generic_move_headsetto MMoves[453] +#define generic_move_slideonback MMoves[454] +#define generic_move_gunuplook MMoves[455] +#define generic_move_firerapid MMoves[456] +#define generic_move_dekkeraimlook MMoves[457] +#define generic_move_playersignal_go MMoves[458] +#define generic_move_playersignal_stop MMoves[459] +#define generic_move_playersignal_taunt MMoves[460] +#define generic_move_johnwhirlright MMoves[461] +#define generic_move_sweepupfrom MMoves[462] +#define generic_move_sweepupto MMoves[463] +#define generic_move_takecover MMoves[464] +#define generic_move_throwstar MMoves[465] +#define generic_move_pain_larm_unhurt MMoves[466] +#define generic_move_pain_rarm_unhurt MMoves[467] +#define generic_move_pain_lleg_unhurt MMoves[468] +#define generic_move_pain_rleg_unhurt MMoves[469] +#define generic_move_jumpthrowstars_bk MMoves[470] +#define generic_move_sabrebluff MMoves[471] +#define generic_move_sabreautosweep MMoves[472] +#define generic_move_throwknife MMoves[473] +#define generic_move_throwitem_player MMoves[474] +#define generic_move_caim_p_auto MMoves[475] +#define generic_move_staim_p_auto MMoves[476] +#define generic_move_handspringbackward MMoves[477] +#define generic_move_falloutwindow MMoves[478] +#define generic_move_crouchdwnpistol MMoves[479] +#define generic_move_rollgrenade MMoves[480] +#define generic_move_crouchdwnpistol1h MMoves[481] +#define generic_move_walkfirefwd MMoves[482] +#define generic_move_crouchfirefwd MMoves[483] +#define generic_move_pushover MMoves[484] +#define generic_move_reload_run_bk_p MMoves[485] +#define generic_move_reload_run_fwd_p MMoves[486] +#define generic_move_reload_run_lt_p MMoves[487] +#define generic_move_reload_run_rt_p MMoves[488] +#define generic_move_reload_run_bk_l MMoves[489] +#define generic_move_reload_run_fwd_l MMoves[490] +#define generic_move_reload_run_lt_l MMoves[491] +#define generic_move_reload_run_rt_l MMoves[492] +#define generic_move_reload_run_bk_ms MMoves[493] +#define generic_move_reload_run_fwd_ms MMoves[494] +#define generic_move_reload_run_lt_ms MMoves[495] +#define generic_move_reload_run_rt_ms MMoves[496] +#define generic_move_reload_run_bk_r MMoves[497] +#define generic_move_reload_run_fwd_r MMoves[498] +#define generic_move_reload_run_lt_r MMoves[499] +#define generic_move_reload_run_rt_r MMoves[500] +#define generic_move_reload_walk_bk_p MMoves[501] +#define generic_move_reload_walk_fwd_p MMoves[502] +#define generic_move_reload_walk_lt_p MMoves[503] +#define generic_move_reload_walk_rt_p MMoves[504] +#define generic_move_reload_walk_bk_l MMoves[505] +#define generic_move_reload_walk_fwd_l MMoves[506] +#define generic_move_reload_walk_lt_l MMoves[507] +#define generic_move_reload_walk_rt_l MMoves[508] +#define generic_move_reload_walk_bk_ms MMoves[509] +#define generic_move_reload_walk_fwd_ms MMoves[510] +#define generic_move_reload_walk_lt_ms MMoves[511] +#define generic_move_reload_walk_rt_ms MMoves[512] +#define generic_move_reload_walk_bk_r MMoves[513] +#define generic_move_reload_walk_fwd_r MMoves[514] +#define generic_move_reload_walk_lt_r MMoves[515] +#define generic_move_reload_walk_rt_r MMoves[516] +#define generic_move_reload_c_p MMoves[517] +#define generic_move_reload_c_l MMoves[518] +#define generic_move_reload_c_ms MMoves[519] +#define generic_move_reload_c_r MMoves[520] +#define generic_move_reload_crun_bk_p MMoves[521] +#define generic_move_reload_crun_fwd_p MMoves[522] +#define generic_move_reload_crun_bk_l MMoves[523] +#define generic_move_reload_crun_fwd_l MMoves[524] +#define generic_move_reload_crun_bk_ms MMoves[525] +#define generic_move_reload_crun_fwd_ms MMoves[526] +#define generic_move_reload_crun_bk_r MMoves[527] +#define generic_move_reload_crun_fwd_r MMoves[528] +#define generic_move_merchant_all MMoves[529] +#define generic_move_merchant_one MMoves[530] +#define generic_move_merchant_idle MMoves[531] +#define generic_move_merchant_wave_rt MMoves[532] +#define generic_move_merchant_talk MMoves[533] +#define generic_move_merchant_wave_lt MMoves[534] +#define generic_move_begging MMoves[535] +#define generic_move_crouchandcower MMoves[536] +#define generic_move_fakedeath_lbshotdeath MMoves[537] +#define generic_move_fakedeath_lfshotdeath MMoves[538] + + +#define generic_dog_move_bark MDogMoves[0] // bark +#define generic_dog_move_pant MDogMoves[1] // pant +#define generic_dog_move_run MDogMoves[2] // run +#define generic_dog_move_deathside MDogMoves[3] // death +#define generic_dog_move_walk MDogMoves[4] // walk +#define generic_dog_move_walkleft MDogMoves[5] // walk left +#define generic_dog_move_attack MDogMoves[6] // attack +#define generic_dog_move_sniff MDogMoves[7] // sniff +#define generic_dog_move_attack2 MDogMoves[8] // same as normal attack but starts several frames in +#define generic_dog_move_deathrun MDogMoves[9] // running death +#define generic_dog_move_sit MDogMoves[10] // just sittin' there +#define generic_dog_move_standup MDogMoves[11] // transition from sitting to standing (play it backwards) +#define generic_dog_move_sitdown MDogMoves[12] // transition from standing to sitting (just [11] forwards) +#define generic_dog_move_walk_from_sniff MDogMoves[13] // transition from sniff to walk +#define generic_dog_move_sniff_from_walk MDogMoves[14] // transition from walk to sniff +#define generic_dog_move_walk_from_walkl MDogMoves[15] // transition from walk (looking left) to walk (looking straight) +#define generic_dog_move_walkl MDogMoves[16] // walk (looking left) +#define generic_dog_move_walkl_from_walk MDogMoves[17] // transition from walk (looking straight) to walk (looking left) +#define generic_dog_move_walkl_walkr MDogMoves[18] // walk (looking left and right) +#define generic_dog_move_walk_from_walkr MDogMoves[19] // transition from walk (looking right) to walk (looking straight) +#define generic_dog_move_walkr MDogMoves[20] // walk (looking right) +#define generic_dog_move_walkr_from_walk MDogMoves[21] // transition from walk (looking straight) to walk (looking right) +#define generic_dog_move_death_lbshotdeath MDogMoves[22] // end of looping, shot-when-dead animation +#define generic_dog_move_death_lbshotloop MDogMoves[23] // looping, shot-when-dead animation +#define generic_dog_move_death_lbshotloop2 MDogMoves[24] // looping, shot-when-dead animation +#define generic_dog_move_death_back MDogMoves[25] // blown backward death + + +#define generic_cow_move_idle MCowMoves[0] +#define generic_cow_move_walk MCowMoves[1] +#define generic_cow_move_die_right MCowMoves[2] +#define generic_cow_move_moo MCowMoves[3] +#define generic_cow_move_looking MCowMoves[4] +#define generic_cow_move_pain MCowMoves[5] + \ No newline at end of file diff --git a/Source/Game/gamecpp/ai_decisions.cpp b/Source/Game/gamecpp/ai_decisions.cpp new file mode 100644 index 0000000..c53ffe5 --- /dev/null +++ b/Source/Game/gamecpp/ai_decisions.cpp @@ -0,0 +1,6536 @@ +#include "g_local.h" +#include "ai_private.h" +#include "ds.h" +#include "ai_pathfinding.h" + +#define PATH_FAILURE_ACQUIRE_DELAY 1.0//time i'll wait after i hit a bad path face until i look for path again +#define PATH_FAILURE_REFAIL_DELAY 1.0//time i'll wait after i hit a bad path face until i consider re-initiating badpath procedures + +#define PATH_DECISION_LOSETARGETTIME .5//time it'll take me after losing track of target to give up on attack +#define POINTCOMBAT_DECISION_LOSETARGETTIME 15.0//time it'll take me after losing track of target to abondon combat point + + +#if _DEBUG +extern char *decName; +#endif + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Brush-Using Helper Functions--currently assuming doors, but should be fleshed out for elevators, etc. +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void Use_DoorTrigger(edict_t *self, edict_t *other, edict_t *activator); +void button_use (edict_t *self, edict_t *other, edict_t *activator); +void plDoorUse(edict_t *self, edict_t *other, edict_t *activator); +void door_secret_use (edict_t *self, edict_t *other, edict_t *activator); +void useable_use (edict_t *self,edict_t *other,edict_t *activator); +void Use_Multi(edict_t *self, edict_t *other, edict_t *activator); + +qboolean IsUseableBrush(edict_t *what) +{ + if (!what) + { + return false; + } + if (what->plUse == Use_DoorTrigger || what->plUse == button_use || what->plUse == plDoorUse || + what->plUse == door_secret_use || what->plUse == useable_use || what->plUse == Use_Multi) + { + return true; + } + return false; +} + +//icky!!!!!!!!!! this is defined elsewhere! +#define STATE_TOP 0 +#define STATE_BOTTOM 1 +#define STATE_UP 2 +#define STATE_DOWN 3 + +#define DOOR_NOMONSTER 0x0008 + +qboolean NotBadDoor(edict_t *what, float when, edict_t *by_whom) +{ + if(!what) + { + return true; + } + if (!IsUseableBrush(what)) + { + return true; + } + if(!what->plUse) + { + return true; + } + if(!(what->spawnflags & DOOR_NOMONSTER)) + { + return true; + } + + return false; +} + +qboolean IsBrushUseableNow(edict_t *what, float when, edict_t *by_whom) +{ + if (!IsUseableBrush(what)) + { + return false; + } + //don't use a door that's in motion, or already open. + if (what->plUse == plDoorUse && what->moveinfo.state != STATE_BOTTOM) + { + return false; + } + if (what->plUse == plDoorUse && (what->spawnflags & DOOR_NOMONSTER)) + { + return false; //no good + } + if (what->last_move_time + 5.0 < level.time) + { + return true; + } + return false; +} + +//returns whether or not the useInfo fields were set successfully +qboolean GetUseableBrushInfo(vec3_t normal, edict_t *what, brushUseInfo_t &useInfo, edict_t *by_whom) +{ + vec3_t forward; + + if (normal) + { + VectorCopy(normal, forward); + VectorInverse(forward); + } + else + { + AngleVectors(by_whom->s.angles, forward, NULL, NULL); + } + + VectorCopy(by_whom->s.origin, useInfo.usePos); + VectorCopy(forward, useInfo.useDir); + useInfo.useType=USETYPE_MISC; + useInfo.useEnt = what; + return true; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +decision_c *decision_c::NewClassForCode(int code) +{ + switch (code) + { + case BASE_DECISION: + return new base_decision(); + case PURSUE_DECISION: + return new pursue_decision(); + case POINTCOMBAT_DECISION: + return new pointcombat_decision(); + case SEARCH_DECISION: + return new search_decision(); + case DODGE_DECISION: + return new dodge_decision(); + case RETREAT_DECISION: + return new retreat_decision(); + case PATHIDLE_DECISION: + return new pathidle_decision(); + case PATHCOMBAT_DECISION: + return new pathcombat_decision(); + case SCRIPTED_DECISION: + return new scripted_decision(); + case DEKKER1_DECISION: + return new dekker1_decision(); + case DEKKER2_DECISION: + return new dekker2_decision(); + case DEKKER3_DECISION: + return new dekker3_decision(); + case DEKKER4_DECISION: + return new dekker4_decision(); + case DECISION: + gi.dprintf("ERROR: only allowed to use leaves of the decision class tree\n"); + break; + default: + gi.dprintf("ERROR: invalid decision class code: %d\n", code); + break; + } + return new decision_c(); +} + +decision_c::decision_c(decision_c *orig) +{ + last_dilution_time = orig->last_dilution_time; + priority = orig->priority; + priority_base = orig->priority_base; + validity = orig->validity; + timeout_time = orig->timeout_time; + allow_timeout = orig->allow_timeout; + lastClearTime = orig->lastClearTime; + isClear = orig->isClear; +} + +void decision_c::Evaluate(decision_c *orig) +{ + last_dilution_time = orig->last_dilution_time; + priority = orig->priority; + priority_base = orig->priority_base; + validity = orig->validity; + timeout_time = orig->timeout_time; + allow_timeout = orig->allow_timeout; + lastClearTime = orig->lastClearTime; + isClear = orig->isClear; +} + +decision_c::decision_c(int priority_root, float timeout, edict_t* ScriptOwner) +{ + priority = 0; + priority_base = priority_root; + validity = 0.5; + last_dilution_time = level.time; + + //nathan addedness + lastClearTime = level.time; + isClear = false; + + //disallow decisions timing out in 0.1 secs or less--plugging in values less than 0.1 makes decision last forever + if (timeout >= 0.1) + { + timeout_time = timeout + level.time; + allow_timeout = true; + } + else + { + timeout_time = level.time + 999999999; + allow_timeout = false; + } +} + +qboolean decision_c::IsAdversary(edict_t &monster, edict_t *otherGuy) +{ + return (!OnSameTeam(&monster, otherGuy)); +} + +action_c *decision_c::AddActionForSequence(ai_c &which_ai, edict_t &monster, mmove_t *move, vec3_t dest, vec3_t face, edict_t *target, action_c *owneraction, bool shouldKill, int NullTarget, float timeoutTime) +{ + float lastingTime=timeoutTime; + action_c *newaction=NULL; + if (!move)//no move--forget it + { + return NULL; + } + switch(move->suggested_action) + { + default: + case ACTCODE_STAND: + //moves with the fullanim flag on them get long actions, so they can complete their anim without interruption + if (move->actionFlags&ACTFLAG_FULLANIM) + { + if (lastingTime<=0.01) + { + lastingTime = 4.0f; + } + newaction=which_ai.DefaultAction(this, owneraction, move, dest, face, NULL, lastingTime, true); + } + else + { + //for moves that have the optattack flag, use as attack if a target is passed in; otherwise, use as move + if (move->actionFlags&ACTFLAG_OPTATTACK&&target) + { + if (lastingTime<=0.01) + { + lastingTime = 0.25f; + } + newaction=which_ai.AttackAction(this, owneraction, move, NULL, dest, face, lastingTime, false); + break; + } + newaction=which_ai.DefaultAction(this, owneraction, move, dest, face); + } + break; + case ACTCODE_ATTACK: + if (target && (target->health > 0)) + { + if (lastingTime<=0.01) + { + lastingTime = 0.25f; + } + newaction=which_ai.AttackAction(this, owneraction, move, target, dest, face, lastingTime, true, shouldKill, NullTarget); + } + else + { + if (lastingTime<=0.01) + { + lastingTime = 0.25f; + } + newaction=which_ai.AttackAction(this, owneraction, move, NULL, dest, face, lastingTime, true, shouldKill, NullTarget); + } + break; + case ACTCODE_MOVE: + if (move->actionFlags&ACTFLAG_FULLANIM) + { + if (lastingTime<=0.01) + { + lastingTime = 0.2f; + } + newaction=which_ai.WalkAction(this, owneraction, move, dest, face, lastingTime, true); + } + else + { + //for moves that have the optattack flag, use as attack if a target is passed in; otherwise, use as move + if (move->actionFlags&ACTFLAG_OPTATTACK&&target) + { + if (lastingTime<=0.01) + { + lastingTime = 0.25f; + } + newaction=which_ai.AttackAction(this, owneraction, move, NULL, dest, face, lastingTime, true); + break; + } + if (lastingTime<=0.01) + { + lastingTime = 0.5f; + } + newaction=which_ai.WalkAction(this, owneraction, move, dest, face, lastingTime); + } + break; + case ACTCODE_JUMP: + if (lastingTime<=0.01) + { + lastingTime = 1.5f; + } + newaction=which_ai.JumpAction(this, owneraction, move, dest, face, lastingTime); + break; + case ACTCODE_FALL: + if (lastingTime<=0.01) + { + lastingTime = 0.4f; + } + newaction=which_ai.FallAction(this, owneraction, move, move, dest, face, lastingTime); + break; + case ACTCODE_PAIN: + if (lastingTime<=0.01) + { + lastingTime = 4.0f; + } + newaction=which_ai.DefaultAction(this, owneraction, move, dest, face, NULL, lastingTime, true); + break; + case ACTCODE_DEATH: + lastingTime = 9999.0f; + newaction=which_ai.DeathAction(this, owneraction, move, monster, NULL, NULL, lastingTime, vec3_origin); + break; + case ACTCODE_SCRIPTRELEASE: + newaction=which_ai.EndScriptAction(this); + break; + } + if (newaction) + { +/* if (shouldKill && (move->suggested_action == ACTCODE_ATTACK)) + { + ((attack_action*)newaction)->kill = true; + } +*/ which_ai.NewAction(newaction, &monster); + } + return newaction; +} + +qboolean decision_c::ClearShot(ai_c &which_ai, edict_t &monster, vec3_t goalpos, edict_t *ignore, bbox_preset testbbox, float *orgPos, int *blockingGuy) +{ + trace_t tr; + vec3_t testpos, trashmaxs; + vec3_t targpos; + +// if(lastClearTime > level.time - .2) +// { //good frequency? Bad frequency? I dunno... Nevermind - this can blow me. +// return isClear; +// } + + which_ai.GetBBoxPreset(testbbox, testpos, trashmaxs); + + if(orgPos) + { + testpos[0]=orgPos[0]; + testpos[1]=orgPos[1]; + testpos[2]=orgPos[2]+monster.mins[2]-testpos[2]+MONSTER_SHOOT_HEIGHT;//? Guys often seem to not be able to shoot past each other - this helps... :/ ? + } + else + { + testpos[0]=monster.s.origin[0]; + testpos[1]=monster.s.origin[1]; + testpos[2]=monster.s.origin[2]+monster.mins[2]-testpos[2]+MONSTER_SHOOT_HEIGHT;//? Guys often seem to not be able to shoot past each other - this helps... :/ ? + } + + if(testbbox == BBOX_PRESET_CROUCH) + { + testpos[2] -= 16;//irk + } + + VectorCopy(goalpos, targpos); + targpos[2] += MONSTER_SHOOT_HEIGHT;//same problem for player as for monsters - we need ta do something about this :/ + + if(which_ai.GetBody() && ((which_ai.GetBody()->GetRightHandWeapon(monster)==ATK_ROCKET)|| + (which_ai.GetBody()->GetRightHandWeapon(monster)==ATK_AUTOSHOTGUN))) + { + vec3_t shotMin = {-6,-6,-6}; + vec3_t shotMax = {6,6,6}; + //gi.trace(testpos,shotMin,shotMax,targpos,&monster,CONTENTS_SOLID, &tr); + gi.trace(testpos,shotMin,shotMax,targpos,&monster,MASK_SHOT, &tr); + } + else + { + //gi.trace(testpos,NULL,NULL,targpos,&monster,CONTENTS_SOLID, &tr); + gi.trace(testpos,NULL,NULL,targpos,&monster,MASK_SHOT, &tr); + } + + lastClearTime = level.time; + + if ((tr.fraction>0.95 && !tr.startsolid && !tr.allsolid)||tr.ent==ignore) + //if (tr.ent==ignore) + { //why was the second test here? I am confused =( + //now see if it hit any of tha folks +/* vec3_t dif; + VectorSubtract(targpos, testpos, dif); + float len = VectorLength(dif); + CRadiusContent rad(testpos, len, 1, 0, 1); + for(int i = 0; i < rad.getNumFound(); i++) + { //if this passes too close to another guy, 'tis no good + if(rad.foundEdict(i) != ignore && rad.foundEdict(i) != &monster) + { + if(pointLineIntersect(testpos, targpos, rad.foundEdict(i)->s.origin, 16)) + { + isClear = false; + return false; + } + } + }*/ + if(blockingGuy) + { + *blockingGuy = 0; + } + + isClear = true; + return true; + } + + if(blockingGuy) + { + *blockingGuy = tr.ent - g_edicts; + } + + + isClear = false; + return false; +} + +mmove_t *decision_c::GetSequenceForActionCode(ai_c &which_ai, edict_t &monster, action_code the_code, vec3_t dest, vec3_t face, edict_t *target, mmove_t *preferred_move, int reject_actionflags) +{ + switch (the_code) + { + default: + gi.dprintf("Invalid action code: %d!\n",the_code); + case ACTCODE_STAND: + return GetSequenceForStand(which_ai, monster, dest, face, preferred_move, reject_actionflags); + case ACTCODE_MOVE: + return GetSequenceForMovement(which_ai, monster, dest, face, preferred_move, reject_actionflags); + case ACTCODE_ATTACK: + return GetSequenceForAttack(which_ai, monster, dest, face, target, preferred_move, reject_actionflags); + + //eek! temporary! fixme soon! + case ACTCODE_JUMP: + return GetSequenceForStand(which_ai, monster, dest, face, preferred_move, reject_actionflags); + case ACTCODE_PAIN: + return GetSequenceForStand(which_ai, monster, dest, face, preferred_move, reject_actionflags); + case ACTCODE_DEATH: + return GetSequenceForStand(which_ai, monster, dest, face, preferred_move, reject_actionflags); + case ACTCODE_FALL: + return GetSequenceForStand(which_ai, monster, dest, face, preferred_move, reject_actionflags); + case ACTCODE_SCRIPTRELEASE: + return ScriptReleaseMove; + } +} + +mmove_t *decision_c::GetSequenceForStand(ai_c &which_ai, edict_t &monster, vec3_t dest, vec3_t face, mmove_t *preferred_move, int reject_actionflags) +{ + if (which_ai.GetBody()) + { + if (preferred_move) + { + return which_ai.GetBody()->GetSequenceForStand(monster, dest, face, ACTSUB_NORMAL, preferred_move->bbox, preferred_move, reject_actionflags); + } + else + { + return which_ai.GetBody()->GetSequenceForStand(monster, dest, face, ACTSUB_NORMAL, BBOX_PRESET_NUMBER, NULL, reject_actionflags); + } + } + return NULL; +} + +float decision_c::GetGroupPosition(ai_c &which_ai, edict_t &monster, vec3_t relativeTo) +{ + return 0; +} + +qboolean decision_c::AtGroupFront(ai_c &which_ai, edict_t &monster, vec3_t dest, vec3_t face) +{ + if (!which_ai.GetMove()) + { + return false; + } + + //check to see if guy is inside crouching aim cone + float aimCone = which_ai.GetAimConeDegrees(monster, BBOX_PRESET_CROUCH); + float tempAng = anglemod(which_ai.ideal_angles[YAW]-monster.s.angles[YAW]); + + //i'm outside the aim cone...don't even! + if (tempAng > aimCone && tempAng < 360.0-aimCone) + { + return false; + } + + if(which_ai.getTarget()) + { + vec3_t dif; + +// VectorSubtract(monster.s.origin, which_ai.getTarget()->s.origin, dif); + + vec3_t targ_pos; + which_ai.getTargetPos(targ_pos); + VectorSubtract(monster.s.origin, targ_pos, dif); + + if(VectorLengthSquared(dif) < (64*64)) + { // if my target is too close to me, I don't want to be ducked - I want to back up + return false; + } + } + + if (rand()&63) + { + return (which_ai.GetMove()->bbox==BBOX_PRESET_CROUCH); + } + else + { + return (which_ai.GetMove()->bbox!=BBOX_PRESET_CROUCH); + } +} + +mmove_t *decision_c::GetSequenceForAttack(ai_c &which_ai, edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, mmove_t *preferred_move, int reject_actionflags) +{ + body_c *body = which_ai.GetBody(); + + if (!body) + { + return NULL; + } + + //if((!AtGroupFront(which_ai, monster, dest, face)||!ClearShot(which_ai, monster, face, target, BBOX_PRESET_CROUCH))||(monster.flags & FL_IAMTHEBOSS)) + { + return body->GetSequenceForAttack(monster, dest, face, target, ACTSUB_NORMAL, BBOX_PRESET_STAND, preferred_move, reject_actionflags); + } + //return body->GetSequenceForAttack(monster, dest, face, target, ACTSUB_NORMAL, BBOX_PRESET_CROUCH, preferred_move, reject_actionflags); +} + +mmove_t *decision_c::GetSequenceForJump(ai_c &which_ai, edict_t &monster, vec3_t dest, vec3_t face, mmove_t *preferred_move, int reject_actionflags) +{ + if (which_ai.GetBody()) + { + return which_ai.GetBody()->GetSequenceForJump(monster, dest, face, ACTSUB_NORMAL, BBOX_PRESET_CROUCH, preferred_move, reject_actionflags); + } + return NULL; +} + +mmove_t *decision_c::GetSequenceForMovement(ai_c &which_ai, edict_t &monster, vec3_t dest, vec3_t face, mmove_t *preferred_move, int reject_actionflags) +{ + if (which_ai.GetBody()) + { + return which_ai.GetBody()->GetSequenceForMovement(monster, dest, face, monster.s.origin, monster.s.angles, ACTSUB_NORMAL, BBOX_PRESET_STAND, preferred_move, reject_actionflags); + } + return NULL; +} + + +mmove_t *decision_c::GetSequenceForDodge(ai_c &which_ai, edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, mmove_t *preferred_move, int leftSide, int reject_actionflags) +{ + body_c *body = which_ai.GetBody(); + + if (!body) + { + return NULL; + } + + return body->GetSequenceForDodge(monster, dest, face, target, ACTSUB_NORMAL, BBOX_PRESET_STAND, preferred_move, leftSide, reject_actionflags); +} + + +qboolean decision_c::IsTimedOut(void) +{ + if (allow_timeout && timeout_time < level.time) + { + return true; + } + else + { + return false; + } +} + +qboolean decision_c::Consider(ai_c &which_ai, edict_t &monster) +{ + priority = 1; + +#ifdef _DEBUG + decName = "decision"; +#endif + + return IsTimedOut(); +} + + +void decision_c::Perform(ai_c &which_ai, edict_t &monster) +{ + vec3_t facedir; + vec3_t facepos; + + AngleVectors(monster.s.angles,facedir,NULL,NULL); + VectorAdd(monster.s.origin, facedir, facepos); + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster,facepos,facepos), facepos, facepos); +} + +void decision_c::UpdateValidity(void) +{//edge toward neutral + float dilution_interval; + + //for larger time intervals, edge further toward neutral + dilution_interval = level.time - last_dilution_time; + + //only accept time intervals between 0 & 1 + //(1 sec should be long enough for max interval--if it's exceeded, won't matter too much) + if (dilution_interval < 0) + { + dilution_interval = 0; + } + if (dilution_interval > 1) + { + dilution_interval = 1; + } + + //weight previous validity tween .9 (for 1 sec interval) and 1.0 (for 0 sec interval), + //with neutralizing weighted the rest (from 0.0 to 0.1) + dilution_interval *= 0.1; + validity = validity*(1-dilution_interval)+0.5*dilution_interval; + last_dilution_time = level.time; +} + +/********************************************************************************** + **********************************************************************************/ + +path_decision::path_decision(edict_t *goalent, int priority_root, float timeout, edict_t* ScriptOwner) +:decision_c(priority_root, timeout) +{ + last_jump_time = level.time; + path_fail_time = level.time - PATH_FAILURE_REFAIL_DELAY; + + VectorClear(path_nextpoint.pos); + VectorClear(path_nextpoint.direction); + path_nextpoint.targetEnt = NULL; + path_nextpoint.valid = false; + path_nextpoint.temp_type = 0; + path_nextpoint.time = level.time - 1000.0F; + + path_goalentity = goalent; + path_goal_updatedtime = level.time - 1000.0F; + VectorClear(aimWanderVec); + VectorClear(path_goalpos); + VectorClear(path_fail_dir); + + //nathan added junk + VectorClear(newMoveDir); + lastCheckTime = 0; + lastDuckInvalidateTime = 0; + lastDuckValidTime = 0; + stuckNonIdeal = false; + nonIdealReason = NI_TOOFAR; + blockingEnemy = 0; +} + +qboolean path_decision::Consider(ai_c &which_ai, edict_t &monster) +{ +#ifdef _DEBUG + decName = "pathdecision"; +#endif + + //don't automatically do this? + SetGoalPosition(which_ai, monster); + + //no path, but i do have a goal position + if (GetGoalPosition(which_ai,monster,NULL)&&which_ai.GetBody()&&which_ai.GetBody()->GetBestWeapon(monster)!=ATK_NOTHING) + { + priority = 2.5+floor(validity+0.5); + } + //no goal position + else + { + priority = 1; + } + + UpdateValidity(); + + //if decision can time out, and its time has expired, then let ai get rid of it + return IsTimedOut(); +} + +void path_decision::Perform(ai_c &which_ai, edict_t &monster) +{ + // this is problematic + +/* if((which_ai.GetPriority() != PRIORITY_HIGH)&&(path_goalentity == level.sight_client)) + { // no more than a set number of guys can actively attack the player at once. + // rework this? + return; + }*/ + AddAction(which_ai, monster); +} + + +void path_decision::SetGoalPosition(ai_c &which_ai, edict_t &monster) +{ + vec3_t temp_v; + sensedEntInfo_t sensed_client, sensed_monster; + which_ai.GetSensedClientInfo(smask_all, sensed_client); + which_ai.GetSensedMonsterInfo(smask_all, sensed_monster); + //if i'm already after someone, keep at 'im + if (path_goalentity && (path_goalentity->ai || path_goalentity->client) + && path_goalentity != sensed_client.ent + && path_goalentity != sensed_monster.ent && path_goalentity->inuse + && path_goalentity->health > 0) + { + return; + } + + //give preference to attacking player by default + if (sensed_client.ent && sensed_client.ent->health>0 && + (fabs(path_goal_updatedtime - sensed_client.time)<0.01 || path_goal_updatedtime < sensed_client.time)&& +// (sensed_client.time + 10 > level.time) && + IsAdversary(monster,sensed_client.ent)) + { + path_goalentity = sensed_client.ent; + VectorCopy(sensed_client.pos,path_goalpos); + path_goal_updatedtime = sensed_client.time; + + VectorAdd(sensed_client.ent->mins,sensed_client.ent->maxs,temp_v); + VectorScale(temp_v,0.5,temp_v); + VectorAdd(path_goalpos,temp_v,path_goalpos); + } + else + { + if (sensed_monster.ent && sensed_monster.ent->inuse && + (fabs(path_goal_updatedtime - sensed_monster.time)<0.01 || path_goal_updatedtime < sensed_monster.time)&& +// (sensed_monster.time + 10 > level.time) && + IsAdversary(monster,sensed_monster.ent)) + { + path_goalentity = sensed_monster.ent; + VectorCopy(sensed_monster.pos,path_goalpos); + path_goal_updatedtime = sensed_monster.time; + + VectorAdd(sensed_monster.ent->mins,sensed_monster.ent->maxs,temp_v); + VectorScale(temp_v,0.5,temp_v); + VectorAdd(path_goalpos,temp_v,path_goalpos); + } + } +} + +qboolean path_decision::GetGoalPosition(ai_c &which_ai, edict_t &monster, vec3_t gohere) +{ + //copy ai's enemy_lastseen_pos into gohere vec + if (gohere)//pass in NULL if just want to know whether we have goal position + { + VectorCopy(path_goalpos, gohere); + } + + //check the decision's goalentity for whether i have goal pos, not ai's enemy + if (path_goalentity) + { + //make sure goal entity is still valid + if ((!path_goalentity->client && !path_goalentity->ai) || !path_goalentity->inuse + || path_goalentity->health <= 0 || level.time-path_goal_updatedtime>PATH_DECISION_LOSETARGETTIME) + { + path_goalentity = NULL; + return false; + } + return true; + } + else + { + return false; + } +} + +//depending on type of path point path_nextpoint is, add appropriate action +qboolean path_decision::AddSpecialPathAction(ai_c &which_ai, edict_t &monster) +{ + vec3_t facedir,facevec; + vec3_t facepos; + + //if i don't have a current pathpoint, i'm here by accident--just throw a default action on my stack + if (!path_nextpoint.valid) + { + return false; + } + + VectorSubtract(path_nextpoint.pos, monster.s.origin, facedir); + VectorCopy(facedir,facevec); + VectorNormalize(facedir); + + //next point in path is a temppoint--check its spawnflags to see what kinda point it is + //i'm considering all temp points to have special actions associated withem + //this temp point is already stale + if (level.time - path_nextpoint.time > 1.0) + { + AngleVectors(monster.s.angles,facedir,NULL,NULL); + VectorAdd(monster.s.origin, facedir, facepos); + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,monster.s.origin,facepos), monster.s.origin, facepos); + return true; + } + //jumping path point--assuming path points are close enough together that z difference greater than stepheight requires jump + if (path_nextpoint.temp_type==1) + { + AddActionForSequence(which_ai, monster, GetSequenceForJump(which_ai,monster,path_nextpoint.pos,path_nextpoint.pos), path_nextpoint.pos, path_nextpoint.pos); + return true; + } + //falling path point--assuming path points are close enough together that z difference greater than stepheight requires fall + if (path_nextpoint.temp_type==2) + { + AddActionForSequence(which_ai, monster, &generic_move_jumpdrop, path_nextpoint.pos, path_nextpoint.pos); + return true; + } + //use a brush + if (path_nextpoint.temp_type==3) + { + //make sure i know what brush to use, and it's got a valid use function + if (path_nextpoint.targetEnt && path_nextpoint.targetEnt->plUse) + { + body_c *body = which_ai.GetBody(); + + path_nextpoint.targetEnt->plUse(path_nextpoint.targetEnt, &monster, &monster); + //urk, do an appropriate thing here + VectorScale(path_nextpoint.direction, 20, facepos); + VectorAdd(facepos, monster.s.origin, facepos); + if (body) + { + AddActionForSequence(which_ai, monster, body->GetSequenceForStand(monster, facepos, facepos, ACTSUB_NORMAL, BBOX_PRESET_STAND, &generic_move_opendoor), facepos, facepos); + } + else + { + AddActionForSequence(which_ai, monster, &generic_move_opendoor, facepos, facepos); + } + return true; + } + return false; + } + + //? + return false; + + //normal walking point + VectorScale(facedir,(VectorLength(which_ai.velocity)+10)*0.1,facepos); + VectorAdd(facepos, monster.s.origin, facepos); + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,facepos,facepos), facepos, facepos); + return true; +} + +#define ADJUST_SEARCH_RANGE 100.0 + +void rotMe(vec3_t in, float ang, vec3_t out) +{ + vec3_t temp; + float cosAng = cos(ang*M_PI/180); + float sinAng = sin(ang*M_PI/180); + + temp[0] = in[0] * cosAng + in[1] * sinAng; + temp[1] = - in[0] * sinAng + in[1] * cosAng; + temp[2] = in[2]; + + VectorCopy(temp, out); +} + +void debug_drawbox(edict_t* self,vec3_t vOrigin, vec3_t vMins, vec3_t vMaxs, int nColor); + +float guyCheckForMove(vec3_t start, vec3_t dir, int requestMovement, edict_t *self) +{ + vec3_t testCenter; + + VectorMA(start, 50, dir, testCenter); + + CRadiusContent rad(testCenter, 100, 1, 0);//so we get a rough, decent test spot + + VectorMA(start, 150, dir, testCenter);// the endpoint of my move test + + float distAchieved = 1.0; + + for(int i = 0; i < rad.getNumFound(); i++) + { + if(rad.foundEdict(i) == self) + { //sillyness + continue; + } + + if(pointLineIntersect(start, testCenter, rad.foundEdict(i)->s.origin, 30)) + { + vec3_t dif; + + VectorSubtract(rad.foundEdict(i)->s.origin, start, dif); + + float newDist = VectorLengthSquared(dif) / (150 * 150);//see how good this route is + + vec3_t goPlease; + + VectorCopy(dif, goPlease); + VectorNormalize(goPlease); + if(rad.foundEdict(i)->ai) + { + (rad.foundEdict(i)->ai)->RequestMoveOutOfWay(goPlease); + } + + if((newDist < distAchieved) && (newDist > 0.005))//don't grab myself + { + distAchieved = newDist; + } + } + } + return distAchieved; +} + +float checkVectForMove(vec3_t start, vec3_t dir, vec3_t min, vec3_t max, edict_t *ent, edict_t **hitEnt, int requestMovement) +{ + vec3_t end; + trace_t walktrace; + + VectorMA(start, 60, dir, end); + gi.trace (start, min, max, end, ent, MASK_MONSTERSOLID, &walktrace); + + if(hitEnt) + { + *hitEnt = walktrace.ent; + } + + float frac = guyCheckForMove(start, dir, requestMovement, ent); + +// if(walktrace.fraction < .8) + { + return walktrace.fraction * frac; + } + + return 1.0 * frac; +/* + VectorMA(start, 32, dir, end);//??????? + VectorCopy(end, down); + down[2] -= (24.0+32+8);// furthest a guy can consider + + gi.trace (end, vec3_origin, vec3_origin, down, ent, MASK_MONSTERSOLID, &walktrace); + + if(walktrace.fraction < 1.0) + { // this is what we hope for + return 1.0; + } + + return 0.0;//BAD*/ +} + +//try some different angles to run and see if they're any better +int findBestDir(vec3_t start, vec3_t dir, vec3_t outDir, float speed, edict_t &guy, ai_c &which_ai) +{ //returns whether ANY paths were found. + + float clear[5]; + vec3_t dirs[5]; + float firstDir;//1.0 or -1.0; randomly do left or right first + vec3_t testDir; + vec3_t testMin; + int i; + +// Com_Printf("Doing bump check at %f\n", (float)level.time); + + VectorCopy(guy.mins, testMin); + testMin[2] += 16;//eh? + + int ang = 40; + + //clear out clears, so we can safely abort the clear-checking process + for(i = 0; i < 5; i++) + { + clear[i]=0.0; + } + + //check the direct route first, and abort as soon as we got a totally clear path + clear[0] = checkVectForMove(start, dir, testMin, guy.maxs, &guy, 0, 0); + VectorCopy(dir, dirs[0]); + if (clear[0]<0.99) + { + for(i = 1; i < 5; i++) + { + firstDir = (float)(gi.irand(0,1)*2-1);//1.0 or -1.0 + rotMe(dir, ang*firstDir, testDir); + + clear[i] = checkVectForMove(start, testDir, testMin, guy.maxs, &guy, 0, 0); + VectorCopy(testDir, dirs[i]); + + if (clear[i]>0.99)//abort: we got our dir + break; + + i++;//odd way to deal with a for loop, eh? + + rotMe(dir, ang*firstDir*-1.0, testDir); + + clear[i] = checkVectForMove(start, testDir, testMin, guy.maxs, &guy, 0, 0); + VectorCopy(testDir, dirs[i]); + + if (clear[i]>0.99)//abort: we got our dir + break; + + ang += 40; + //if((i == 2)||(i == 5))clear[i] *= .7;//these are totally perp and less good + } + } + + //priority should be for directions that are similar to the current heading and have not much crowding + int bestVal = -1; + float bestDist = 0.2; + for(i = 0; i < 5; i++) + { + if(clear[i] > bestDist) + { + bestDist = clear[i]; + bestVal = i; + } + } + if(bestVal > -1) + { + VectorCopy(dirs[bestVal], outDir); + return 1; + //FX_MakeElectricArc(start, 60, dirs[bestVal]); + } + else + { //if all else fails, well, yer screwed. Sit still and shoot people... + VectorClear(outDir); + return 0; + } + +} + +void path_decision::RecalcMoveVec(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + vec3_t point; + vec3_t testMin; + + if(!path_nextpoint.valid || (aiPoints.isActive())) + { + VectorCopy(goalPos, point); + } + else + { + VectorCopy(path_nextpoint.pos, point); + } + + VectorSubtract(point, monster.s.origin, newMoveDir); + VectorNormalize(newMoveDir); + + //if my priority is low, just accept the ideal direction and be clumsy. hell, nobody'll see. + if (which_ai.GetPriority()==PRIORITY_LOW) + { + return; + } + + VectorCopy(monster.mins, testMin); + testMin[2] += 16; + + edict_t *hitGuy; + + float clear = checkVectForMove(monster.s.origin, newMoveDir, testMin, monster.maxs, &monster, &hitGuy, 1); + + //if i'm going to hit something that's not a useable brush, adjust my course + if(clear != 1.0 && (!hitGuy || !IsUseableBrush(hitGuy) || + !IsBrushUseableNow(hitGuy, level.time, &monster))) + { + if(!findBestDir(monster.s.origin, newMoveDir, newMoveDir, VectorLength(which_ai.velocity)+10, monster, which_ai)) + { + //stuckNonIdeal = true; + } + } +} + + +void path_decision::GetMovementVector(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + return; +#if 0 + stuckNonIdeal = false; + if(monster.spawnflags & SPAWNFLAG_HOLD_POSITION) + { //fixme - these guys need a bit of room for movement... + VectorClear(moveVec); + stuckNonIdeal = false; + return; + } + + int normalWander = 1; + + vec3_t targ; + vec3_t dif; + VectorSubtract(goalPos, monster.s.origin, dif); + if((GetClassCode() == PURSUE_DECISION)&&( (monster.flags) || + (DotProduct(dif, dif) < which_ai.GetMySkills()->getRangeMin()*which_ai.GetMySkills()->getRangeMin()))) + { // too close! Just go directly away + //if(aiPoints.isActive()) + if(0) + { + aiPoints.getReversePath(monster.s.origin, goalPos, &which_ai.getPathData(), &which_ai, &monster); + VectorCopy(which_ai.getPathData().goPoint, targ); + + Enemy_Printf(&which_ai, "backup:%d\n", GetClassCode()); + + normalWander = 0; + + if(which_ai.getPathData().blocked) + { // can't go where I want to :( + VectorCopy(monster.s.origin, targ); + } + } + else + { + VectorNormalize(dif); + VectorScale(dif, -4.0, dif); + VectorAdd(dif, monster.s.origin, targ); + + normalWander = 0; + } + } + + float *avoidDir; + avoidDir = which_ai.GetMoveOutOfWay(); + int wanderDirSet = 0; + + if(avoidDir[0] || avoidDir[1] || avoidDir[2]) + { + wanderDirSet = 1; + VectorMA(monster.s.origin, 64, avoidDir, targ); + VectorCopy(avoidDir, aimWanderVec); + normalWander = 0; + } + +/* if(which_ai.GetMySkills()->testFlag(AIS_NOWANDER)) + { + normalWander = 0; + }*/ + + if(normalWander) + { + //adjust where i'll wander whilst aiming + //ick, this is more expensive than it should be +/* CRadiusContent rad(monster.s.origin, 100); + vec3_t avoidDir; + if(rad.getNumFound()) + { + VectorSubtract(rad.foundEdict(0)->s.origin, monster.s.origin, avoidDir); + for(int i = 1; i < rad.getNumFound(); i++) + { + vec3_t dif; + + VectorSubtract(rad.foundEdict(i)->s.origin, monster.s.origin, dif); + if(DotProduct(dif, avoidDir) < 0) + {//conflicting, so go nowhere + VectorClear(avoidDir); + break; + } + } + VectorScale(avoidDir, 20, aimWanderVec); + } + else*/ + { + float wanderDist = 20; + vec3_t toGoal; + float distToGoal; + + //get my goal vector, to make sure i don't wander too close/far to goal + VectorSubtract(goalPos, monster.s.origin, toGoal); + toGoal[2]=0; + distToGoal=VectorNormalize(toGoal); + + //no wandering up or down! + aimWanderVec[2]=0; + + float minRange = which_ai.GetMySkills()->getRangeMin(); + float maxRange = which_ai.GetMySkills()->getRangeMax(); + + //keep a cap on the wandering vector + wanderDist=VectorNormalize(aimWanderVec); + if(!wanderDirSet) + { + aimWanderVec[0]+=gi.flrand(-3,3); + aimWanderVec[1]+=gi.flrand(-3,3); + + if (wanderDist>20) + { + wanderDist=20; + } + //too close + //if (distToGoal < 100) + if (distToGoal < minRange) + { + if (distToGoal<1) + { + distToGoal=1; + } + //going wrong way--reverse direction + if (DotProduct(aimWanderVec,toGoal)>0.0) + { + wanderDist*=-0.5; + //from a 2:1 to a 1:100 ratio of totallyAway:cur, decreasing the farther i am to guy + //VectorMA(aimWanderVec, -((101-distToGoal)/100), toGoal, aimWanderVec); + VectorMA(aimWanderVec, -((minRange + 1 - distToGoal)/minRange), toGoal, aimWanderVec); + VectorNormalize(aimWanderVec); + } + else + { + //going away--go faster (but i wanna go more clearly away too) + wanderDist+=1; + VectorInverse(toGoal); + //from a 1:1 to a 1:100 ratio of totallyAway:cur, decreasing the farther i am to guy + //VectorMA(aimWanderVec, ((101-distToGoal)/100), toGoal, aimWanderVec); + VectorMA(aimWanderVec, ((minRange + 1 - distToGoal)/minRange), toGoal, aimWanderVec); + VectorNormalize(aimWanderVec); + } + } + //too far + //if (distToGoal > 300) + if (distToGoal > maxRange) + { + //if (distToGoal>349) + //{ + //distToGoal=349; + //} + if (distToGoal>maxRange + 50) + { + distToGoal=maxRange + 50; + } + //going wrong way--reverse direction + if (DotProduct(aimWanderVec,toGoal)<0.0) + { + wanderDist*=-0.5; + VectorInverse(toGoal); + //from a 1:1 to a 1:50 ratio of cur:totallyAway, decreasing the closer i am to guy + //VectorMA(aimWanderVec, (distToGoal-299)/50, toGoal, aimWanderVec); + VectorMA(aimWanderVec, (distToGoal - maxRange + 1)/50, toGoal, aimWanderVec); + VectorNormalize(aimWanderVec); + } + else + { + //going toward--go faster (but i wanna go more clearly toward too) + wanderDist+=1; + //from a 3:1 to a 1:50 ratio of cur:totallyAway, decreasing the closer i am to guy + //VectorMA(aimWanderVec, (distToGoal-299)/50, toGoal, aimWanderVec); + VectorMA(aimWanderVec, (distToGoal - maxRange + 1)/50, toGoal, aimWanderVec); + VectorNormalize(aimWanderVec); + } + } + } + VectorScale(aimWanderVec,wanderDist,aimWanderVec); + } + + trace_t tr; + + vec3_t spot; + + VectorAdd(monster.s.origin, aimWanderVec, spot); + VectorAdd(spot, aimWanderVec, spot);//test a bit farther to see if we strike anything + + vec3_t testmin, testmax; + VectorAdd(spot, monster.mins, testmin); + VectorAdd(spot, monster.maxs, testmax); + /*if(!aiPoints.inRegion(which_ai.getPathData().curRegion, testmin, testmax)) + { + VectorClear(aimWanderVec); + } + else*/ + { + gi.trace(monster.s.origin, monster.mins, monster.maxs, spot, &monster, MASK_MONSTERSOLID, &tr); + if(tr.fraction < 1.0) + { + VectorClear(aimWanderVec);//guys shouldn't wander into walls + } + } + //if(aiPoints.isActive()) + if(0) + { + aiPoints.getPath(monster.s.origin, goalPos, &which_ai.getPathData(), &which_ai, &monster); + VectorCopy(which_ai.getPathData().goPoint, targ); + + Enemy_Printf(&which_ai, "forward:%d(%d->%d=%d)\n", GetClassCode(), + which_ai.getPathData().curNode, which_ai.getPathData().nextNode, which_ai.getPathData().finalNode); + + if(which_ai.getPathData().blocked) + { // can't go where I want to :( + VectorCopy(monster.s.origin, targ); + } + } + else + { + VectorCopy(goalPos, targ); + } + } + + if(monster.flags & FL_IAMTHEBOSS) + { // the boss isn't interested in normal wandering + VectorClear(aimWanderVec); + } + + RecalcMoveVec(which_ai, monster, targ, moveVec); + lastCheckTime = level.time; + + VectorScale(newMoveDir, VectorLength(which_ai.velocity)+10, moveVec); + + if(!normalWander) + { // one and the same when you really need to back up como este + VectorCopy(moveVec, aimWanderVec); + VectorNormalize(aimWanderVec); + VectorScale(aimWanderVec, 20, aimWanderVec); + } + + VectorClear(avoidDir); +#endif + //if 0'd this whole section here +} + + +qboolean path_decision::IsIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t curPos, vec3_t goalPos, vec3_t moveVec) +{ + vec3_t toGoal; + float distToGoal; + + blockingEnemy = 0; + + vec3_t request = {0,0,0};//uhoh + which_ai.RequestMoveOutOfWay(request); + + if(which_ai.BeingWatched()) + { + int asdf = 9; + } + + if(monster.spawnflags & SPAWNFLAG_HOLD_POSITION) + {//very special case - there guys are always in an ideal position, sort of + nonIdealReason = NI_IDEALPOSITION; + which_ai.RequestMoveOutOfWay(vec3_origin); + return true; + } + + + + body_c *body = which_ai.GetBody(); + + if (body) + { + if(body->TestDamage()) + {//damaged guys are never ever happy - they want to get away + which_ai.getPathData().backingUp = 1; + Enemy_Printf(&which_ai, "NIR - too close\n"); + nonIdealReason = NI_TOOCLOSE; + return false; + } + } + + + if (level.time - path_goal_updatedtime > PATH_DECISION_LOSETARGETTIME) + { + Enemy_Printf(&which_ai, "NIR - out of time\n"); + nonIdealReason = NI_TOOFAR;//? Who cares, I suppose + return false; + } + VectorSubtract(goalPos, curPos, toGoal); + distToGoal=VectorLength(toGoal); + if (distToGoal < 10) + { + which_ai.RequestMoveOutOfWay(vec3_origin); + return true; + } + + if(!which_ai.GetMove()) + { + Enemy_Printf(&which_ai, "NIR - don't have a move\n"); + nonIdealReason = NI_TOOFAR;//This I find confusing + return false; + } + + if((distToGoal >= which_ai.GetMySkills()->getRangeMax()*.75) && (!which_ai.GetMySkills()->testFlag(AIS_WONTADVANCE))) + { + if(which_ai.getPathData().approaching || (distToGoal >= which_ai.GetMySkills()->getRangeMax()*1.2)) + { + which_ai.getPathData().approaching = 1; + Enemy_Printf(&which_ai, "NIR - too far\n"); + nonIdealReason = NI_TOOFAR; + return false; + } + } + else + { + which_ai.getPathData().approaching = 0; + } + + if(stuckNonIdeal) + { + //I hate this ;( + Enemy_Printf(&which_ai, "NIR - stuck nonideal\n"); + nonIdealReason = NI_TOOFAR;//? + return false; + } + + if(distToGoal <= which_ai.GetMySkills()->getRangeMin()*1.2) + { // try to avoid extremely abrupt movements + if(which_ai.getPathData().backingUp || (distToGoal <= which_ai.GetMySkills()->getRangeMin()*.75)) + { + which_ai.getPathData().backingUp = 1; + Enemy_Printf(&which_ai, "NIR - too close\n"); + nonIdealReason = NI_TOOCLOSE; + return false; + } + } + else + { + which_ai.getPathData().backingUp = 0; + } + + if(!which_ai.GetMove() || !ClearShot(which_ai, monster, goalPos, path_goalentity, which_ai.GetMove()->bbox, 0, &blockingEnemy)) + { + Enemy_Printf(&which_ai, "NIR - no clear shot\n"); + nonIdealReason = NI_NOTCLEAR; + return false; + } + + nonIdealReason = NI_IDEALPOSITION; + which_ai.RequestMoveOutOfWay(vec3_origin); + return true; +} + +void BuildVectorForGuys(edict_t *source, vec3_t desiredVect, float radius = 64, int *nearProblems = 0) +{ + CRadiusContent rad(source->s.origin, radius*2, 1, 1); + + for(int i = 0; i < rad.getNumFound(); i++) + { + if(rad.foundEdict(i) == source) + { + continue; + } + + ai_c *otherai = (ai_c *)((ai_public_c *)(rad.foundEdict(i)->ai)); + if(otherai) + { + if(!(*otherai->GetMoveOutOfWay())) + { //this guy is fine - don't move for him + continue; + } + } + + vec3_t dif; + + VectorSubtract(rad.foundEdict(i)->s.origin, source->s.origin, dif); + float distAway = VectorNormalize(dif); + + *nearProblems = 1; + + if(distAway > radius) + { + continue; + } + + if(DotProduct(otherai->GetMoveOutOfWay(), dif) < 0) + { //this guy is going somewhere else - big deal + continue; + } + + float mVal = distAway / radius; + mVal *= mVal; + + + if(DotProduct(dif, desiredVect) > 0) + { + //VectorCopy(dif, desiredVect); + VectorScale(desiredVect, mVal, desiredVect); + VectorMA(desiredVect, 1.0 - mVal, dif, desiredVect); + } + else + { + //VectorScale(dif, -1, desiredVect); + VectorScale(desiredVect, mVal, desiredVect); + VectorMA(desiredVect, -1.0 * (1.0 - mVal), dif, desiredVect); + } + } + desiredVect[2] = 0; + VectorNormalize(desiredVect); +} + +void path_decision::AddActionIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + which_ai.GetMiscFlags() &= ~MISC_FLAG_FIRINGBLIND; + + vec3_t atkPos,wanderPos; + if (path_goalentity->client) + { + VectorScale(path_goalentity->velocity, 0.2, atkPos); + } + else if (path_goalentity->ai) + { + VectorScale(path_goalentity->ai->velocity, 0.2, atkPos); + } + else + { + VectorClear(atkPos); + } + VectorAdd(goalPos, atkPos, atkPos); + VectorCopy(monster.s.origin, wanderPos); +// VectorAdd(monster.s.origin, aimWanderVec, wanderPos); + +// VectorClear(wanderPos);//go nowhere right now! You love this spot! + + vec3_t wanderDir; + VectorClear(wanderDir); + int nearbyUnruly = 0; +// BuildVectorForGuys(&monster, wanderDir, 96, &nearbyUnruly); +// int mustMove = (VectorLengthSquared(wanderDir) > .1); +// VectorMA(monster.s.origin, 32, wanderDir, wanderPos); + +// if(mustMove) +// { +// vec3_t request = {1,0,0};//uhoh +// which_ai.RequestMoveOutOfWay(wanderDir); +// } + int mustMove = 0; + + int attack = 1; + + //no attacking if we're not ready to harm the player + float awakeTimeValue = level.time - which_ai.getFirstTargetTime(); + //if(awakeTimeValue < which_ai.GetMySkills()->getHesitation() && (which_ai.GetStartleability())) + if(awakeTimeValue < which_ai.GetMySkills()->getHesitation() * ((gmonster.GetClosestEnemy() == &monster) ? .5:1)) + { // we are groggy for a bit when we first arise + attack = 0; + } + +/* aiPoints.idealWanderPoint(&which_ai.getPathData(), &which_ai); + if(!which_ai.getPathData().blocked) + { + VectorCopy(which_ai.getPathData().goPoint, wanderPos); + mustMove = 1; + }*/ + + if(attack) + { + //Enemy_Printf(&which_ai, "Ideal attack \n"); + //AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, wanderPos, goalPos, path_goalentity), wanderPos, goalPos, path_goalentity); + + body_c *body = which_ai.GetBody(); + + if (body) + { + //mmove_t *myMove = body->GetSequenceForAttack(monster, dest, face, target, ACTSUB_NORMAL, BBOX_PRESET_STAND, preferred_move, reject_actionflags); + vec3_t fwd; + vec3_t toFace; + //which_ai.GetAimVector(fwd); + //vertical does not matter + AngleVectors(monster.s.angles, fwd, 0, 0); + fwd[2] = 0; + VectorNormalize(fwd); + VectorSubtract(goalPos, monster.s.origin, toFace); + toFace[2] = 0; + VectorNormalize(toFace); + mmove_t *myMove; + + if((!which_ai.GetMySkills()->testFlag(AIS_NODUCK)) && + (DotProduct(toFace, fwd) > .98) && + !mustMove && + !nearbyUnruly && + ((lastDuckInvalidateTime > lastDuckValidTime + 3.0)||(lastDuckInvalidateTime < lastDuckValidTime)) && + ClearShot(which_ai, monster, goalPos, path_goalentity, BBOX_PRESET_CROUCH)) + { + lastDuckValidTime = level.time; + myMove = body->GetSequenceForAttack(monster, wanderPos, goalPos, path_goalentity, ACTSUB_NORMAL, BBOX_PRESET_CROUCH); + } + else if(ClearShot(which_ai, monster, goalPos, path_goalentity, BBOX_PRESET_STAND)) + { + lastDuckInvalidateTime = level.time; + myMove = body->GetSequenceForAttack(monster, wanderPos, goalPos, path_goalentity, ACTSUB_NORMAL, BBOX_PRESET_STAND); + } + else if((DotProduct(toFace, fwd) > .98)&& + ((lastDuckInvalidateTime > lastDuckValidTime + 3.0)||(lastDuckInvalidateTime < lastDuckValidTime))&& + (!which_ai.GetMySkills()->testFlag(AIS_NODUCK))) + { //well, at the very least minimize surface area + lastDuckValidTime = level.time; + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_CROUCH); + } + else + { //can't turn while crouched ;( + lastDuckInvalidateTime = level.time; + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_STAND); + } + + AddActionForSequence(which_ai, monster, myMove, wanderPos, goalPos, path_goalentity); + } + } + else + { + body_c *body = which_ai.GetBody(); + + if (body) + { + Enemy_Printf(&which_ai, "Ideal stand\n"); + AddActionForSequence(which_ai, monster, body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_STAND), goalPos, goalPos); + //AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,wanderPos,goalPos), wanderPos, goalPos); + } + } +} + +void AdjustVectorByGuys(edict_t *source, vec3_t desiredVect, float radius = 96) +{ + CRadiusContent rad(source->s.origin, radius, 1, 1); + + for(int i = 0; i < rad.getNumFound(); i++) + { + if(rad.foundEdict(i) == source) + { + continue; + } + + vec3_t dif; + + VectorSubtract(rad.foundEdict(i)->s.origin, source->s.origin, dif); + float distAway = VectorNormalize(dif); + + if(DotProduct(desiredVect, dif) < 0) + { + continue; + } + + //now do the incorrect rotation + float temp = dif[0]; + dif[0] = dif[1]; + dif[1] = -temp; + + float mVal = distAway / radius; + mVal *= mVal; + + + if(DotProduct(dif, desiredVect) > 0) + { + //VectorCopy(dif, desiredVect); + VectorScale(desiredVect, mVal, desiredVect); + VectorMA(desiredVect, 1.0 - mVal, dif, desiredVect); + } + else + { + //VectorScale(dif, -1, desiredVect); + VectorScale(desiredVect, mVal, desiredVect); + VectorMA(desiredVect, -1.0 * (1.0 - mVal), dif, desiredVect); + } + } + desiredVect[2] = 0; + VectorNormalize(desiredVect); +} + + +void path_decision::AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + vec3_t actionGoal; + float move_dist_sq; + +// move_dist_sq = VectorLengthSquared(moveVec); + move_dist_sq = 26; + + if(which_ai.BeingWatched()) + { + int asdf = 9; + } + + int attack = 1; + + if(nonIdealReason == NI_TOOFAR_SEARCHING) + { + attack = 0; + } + + if(nonIdealReason == NI_TOOFAR && which_ai.GetMySkills()->testFlag(AIS_ATTACKONLYINRANGE)) + { + attack = 0; + } + + //no attacking if we're not ready to harm the player + float awakeTimeValue = level.time - which_ai.getFirstTargetTime(); + //if(awakeTimeValue < which_ai.GetMySkills()->getHesitation() && (which_ai.GetStartleability())) + if(awakeTimeValue < which_ai.GetMySkills()->getHesitation() * ((gmonster.GetClosestEnemy() == &monster) ? .5:1))//the closest guy gets to attack quicker + { // we are groggy for a bit when we first arise + attack = 0; + } + + which_ai.GetMiscFlags() &= ~MISC_FLAG_FIRINGBLIND; + + if(nonIdealReason == NI_DODGING) + { + mmove_t *dodgeMove; + + dodgeMove=GetSequenceForDodge(which_ai, monster, goalPos, goalPos, path_goalentity, 0, gi.irand(0,1)?-1:1); + if(dodgeMove) + { + AddActionForSequence(which_ai, monster, dodgeMove, goalPos, goalPos); + return; + } + else + { + nonIdealReason = NI_DUCKING; + } + } + + if(nonIdealReason == NI_DUCKING) + { + body_c *body = which_ai.GetBody(); + + if (body) + { + mmove_t *myMove; + + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_CROUCH, &generic_move_crouch_cower_mid); + + if(myMove) + { + AddActionForSequence(which_ai, monster, myMove, goalPos, goalPos, path_goalentity); + return; + } + else + { + nonIdealReason = NI_FLEEING; + } + } + else + { + nonIdealReason = NI_FLEEING; + } + } + + int fastStrafe = 0; + if(which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_mrs) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_l) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_p)) + { + fastStrafe = 1; + } + + int fastRetreat = 0; + if(which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_mrs) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_p2) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_l)) + { + fastRetreat = 1; + } + + int proceedForward = 1; + + if((25>move_dist_sq) || + (monster.spawnflags & SPAWNFLAG_HOLD_POSITION) || + ((which_ai.GetPriority() != PRIORITY_HIGH)&&(path_goalentity == level.sight_client))) + { + Enemy_Printf(&which_ai, "Non ideal stuck"); + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster,goalPos,goalPos), goalPos, goalPos); + proceedForward = 0; + } + else if(nonIdealReason == NI_TOOCLOSE) + { + proceedForward = 0; + int backup = 0; + vec3_t toAvoid, toTarg, looker; + if(aiPoints.isActive()) + { + aiPoints.getReversePath(monster.s.origin, goalPos, &which_ai.getPathData(), &which_ai, &monster, which_ai.getTarget()); + + if(which_ai.getPathData().blocked) + { // can't go where I want to :( + backup = 0; + } + else + { + Enemy_Printf(&which_ai, "Via %d->%d = %d\n", which_ai.getPathData().curNode, + which_ai.getPathData().nextNode, which_ai.getPathData().finalNode); + + VectorSubtract(which_ai.getPathData().goPoint, monster.s.origin, toAvoid); + toAvoid[2] = 0; + float toAvoidLen = VectorNormalize(toAvoid); +/* if(VectorLength(toAvoid) < .01) + { + VectorCopy(goalPos, actionGoal); + } + else*/ + { + VectorMA(monster.s.origin, 10, toAvoid, actionGoal); + } + + //if(toAvoidLen < .05) + if(toAvoidLen < 10) + { + backup = 0; + } + else + { + if(which_ai.GetMySkills()->testFlag(AIS_NOATTACKONRETREAT) || + (which_ai.GetMove() && ClearShot(which_ai, monster, toAvoid, path_goalentity, which_ai.GetMove()->bbox, actionGoal))) + { // if we can still shoot once we backup, we like this spot - otherwise no + backup = 1; + } + else + { + backup = 0; + } + } + VectorMA(monster.s.origin, 40, toAvoid, actionGoal); + } + } + else + { + backup = 0; + + } + + if(backup) + { + + VectorSubtract(actionGoal, monster.s.origin, toAvoid); + toAvoid[2] = 0; + VectorNormalize(toAvoid); + + AdjustVectorByGuys(&monster, toAvoid); + + which_ai.RequestMoveOutOfWay(toAvoid); + + VectorSubtract(goalPos, monster.s.origin, toTarg); + toTarg[2] = 0; + float distToTarg = VectorNormalize(toTarg); + + if(DotProduct(toAvoid, toTarg) < -.717) + { //move in a direction opposite of where I want to face + if(!fastRetreat) + { + VectorScale(toAvoid, 4.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + } + + VectorScale(toAvoid, -2440, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else if(DotProduct(toAvoid, toTarg) > .717) + { //move in a direction towards where I face + VectorScale(toAvoid, 2440, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else + { + if(!fastStrafe) + { + VectorScale(toAvoid, 12.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + } + + //set it to the side now - for strafing + toAvoid[2] = toAvoid[1]; + toAvoid[1] = -toAvoid[0]; + toAvoid[0] = toAvoid[2]; + toAvoid[2] = 0; + + if(DotProduct(toAvoid, toTarg) > 0) + { + VectorScale(toAvoid, 2440, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else + { + VectorScale(toAvoid, -2440, looker); + VectorAdd(monster.s.origin, looker, looker); + } + } + + if(aipoints_show->value) + { + paletteRGBA_t col = {250, 250, 250, 250}; + //FX_MakeLine(node[startNode].getPos(), node[nextNode].getPos(), col, 1); + FX_MakeLine(which_ai.getPathData().goPoint, monster.s.origin, col, 1); + FX_MakeRing(which_ai.getPathData().goPoint, 8); + paletteRGBA_t col2 = {0, 0, 0, 250}; + FX_MakeLine(actionGoal, monster.s.origin, col2, 1); + } + + vec3_t testShoot; + + VectorSubtract(goalPos, monster.s.origin, testShoot); + VectorNormalize(testShoot); + VectorMA(monster.s.origin, 64, testShoot, testShoot); + + if(attack && (!which_ai.GetMySkills()->testFlag(AIS_NOATTACKONRETREAT)) && ClearShot(which_ai, monster, testShoot, path_goalentity, which_ai.GetMove()->bbox)) + { + //AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, actionGoal, goalPos, path_goalentity), actionGoal, goalPos, path_goalentity); + AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, actionGoal, looker, path_goalentity), actionGoal, looker, path_goalentity); + } + else + { //just back up a bit - can't shoot from here + //oh dear. gsfMovement is fairly different from gsfAttack... I did not know =/ + if(!fastRetreat) + { + VectorScale(toAvoid, 4.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + } + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,looker), actionGoal, looker); + } + } + else + { + if(attack && ClearShot(which_ai, monster, goalPos, path_goalentity, which_ai.GetMove()->bbox)) + { //can't move, but at least I can shoot! + AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, monster.s.origin, goalPos, path_goalentity), monster.s.origin, goalPos, path_goalentity); + } + else + { //Stand around and do nothing - too close and not clear. Sad. + if(which_ai.GetMySkills()->testFlag(AIS_WONTADVANCE)) + { + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster,goalPos,goalPos), goalPos, goalPos); + } + else + { + proceedForward = 1; + } + } + } + } + + if(blockingEnemy) + { //this is only the case if clearshot is obstructed by another guy + vec3_t dif; + VectorSubtract(goalPos, monster.s.origin, dif); + dif[2] = 0; + float goalDist = VectorNormalize(dif); + + if(goalDist > 1) + { + dif[2] = dif[1]; + dif[1] = dif[0]*-1; + dif[0] = dif[2]; + dif[2] = 0; + + VectorMA(monster.s.origin, 64, dif, dif); + + trace_t tr; + + gi.trace(monster.s.origin, monster.mins, monster.maxs, dif, &monster, MASK_MONSTERSOLID, &tr); + + vec3_t lookSpot; + VectorCopy(goalPos, lookSpot); + + if(nonIdealReason == NI_FLEEING) + { + VectorCopy(dif, lookSpot); + } + + if(tr.fraction > .99 && !tr.allsolid && !tr.startsolid) + { + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,dif,lookSpot), dif, lookSpot); + } + else + { + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster,goalPos,goalPos), goalPos, goalPos); + } + proceedForward = 0; + + if(aipoints_show->value) + { + paletteRGBA_t col = {0, 0, 250, 250}; + //FX_MakeLine(node[startNode].getPos(), node[nextNode].getPos(), col, 1); + FX_MakeLine(dif, monster.s.origin, col, 1); + } + } + } + + if(proceedForward)// if(nonIdealReason == NI_TOOFAR)//make this catchall - why not + { + if(aiPoints.isActive()) + { + aiPoints.getPath(monster.s.origin, goalPos, &which_ai.getPathData(), &which_ai, &monster, 1, which_ai.getTarget()); + +/* vec3_t sep; + float len; + VectorSubtract(which_ai.getPathData().goPoint, monster.s.origin, sep); + len = VectorLength(sep); + + if(nonIdealReason == NI_TOOFAR_SEARCHING && which_ai.getPathData().curNode == which_ai.getPathData().nextNode && len < 48) + { + VectorCopy(monster.s.origin, which_ai.getPathData().goPoint); + }*/ + + Enemy_Printf(&which_ai, "Via %d->%d = %d\n", which_ai.getPathData().curNode, + which_ai.getPathData().nextNode, which_ai.getPathData().finalNode); + + if(which_ai.getPathData().blocked) + { // can't go where I want to :( + if(attack && which_ai.GetMove() && ClearShot(which_ai, monster, goalPos, path_goalentity, which_ai.GetMove()->bbox)) + { + AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, monster.s.origin, goalPos, path_goalentity), monster.s.origin, goalPos, path_goalentity); + } + else + { + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster,goalPos,goalPos), goalPos, goalPos); + } + } + else + { + vec3_t toAvoid, toTarg, looker; + + VectorSubtract(which_ai.getPathData().goPoint, monster.s.origin, toAvoid); + toAvoid[2] = 0; + VectorNormalize(toAvoid); + + VectorScale(toAvoid, 10.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + + VectorSubtract(goalPos, monster.s.origin, toTarg); + toTarg[2] = 0; + float distToTarg = VectorNormalize(toTarg); + + if((nonIdealReason == NI_FLEEING)||(!fastStrafe)||(distToTarg > 448)) + { // good for folks who can't strafe + VectorScale(toAvoid, 500, looker); + VectorAdd(monster.s.origin, looker, looker); + + } + else + { + if(DotProduct(toAvoid, toTarg) < -.717) + { + if(!fastRetreat) + { + VectorScale(toAvoid, 4.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + } + + VectorScale(toAvoid, -2440, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else if(DotProduct(toAvoid, toTarg) > .717) + { + VectorScale(toAvoid, 2440, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else + { + if(!fastStrafe) + { + VectorScale(toAvoid, 12.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + } + + //set it to the side now - for strafing + toAvoid[2] = toAvoid[1]; + toAvoid[1] = -toAvoid[0]; + toAvoid[0] = toAvoid[2]; + toAvoid[2] = 0; + + if(DotProduct(toAvoid, toTarg) > 0) + { + VectorScale(toAvoid, 2440, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else + { + VectorScale(toAvoid, -2440, looker); + VectorAdd(monster.s.origin, looker, looker); + } + } + } + + vec3_t dif; + VectorSubtract(monster.s.origin, actionGoal, dif); + dif[2] = 0; + vec3_t dif2; + VectorSubtract(monster.s.origin, goalPos, dif2); + dif2[2] = 0; + if((VectorLengthSquared(dif) > 2)&&((VectorLengthSquared(dif2) > (50*50))||((nonIdealReason == NI_FLEEING)))&&((!which_ai.GetMySkills()->testFlag(AIS_WONTADVANCE))||(nonIdealReason == NI_FLEEING))) + { + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,looker), actionGoal, looker); + } + else + { + if(nonIdealReason == NI_FLEEING) + { //get down an' cower + body_c *body = which_ai.GetBody(); + + if (body) + { + mmove_t *myMove; + + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_CROUCH, &generic_move_crouch_cower_mid); + + if(!myMove) + { + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_CROUCH, &generic_move_crouch_cower_mid2); + } + + if(myMove) + { + AddActionForSequence(which_ai, monster, myMove, goalPos, goalPos, path_goalentity); + } + } + } + else + { + if(attack && which_ai.GetMove() && ClearShot(which_ai, monster, goalPos, path_goalentity, which_ai.GetMove()->bbox)) + { //can't move, but at least I can shoot! - fixme - some guys shouldn't do this + AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, monster.s.origin, goalPos, path_goalentity), monster.s.origin, goalPos, path_goalentity); + } + else + { + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster,actionGoal,goalPos), actionGoal, goalPos); + } + } + //AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,looker), actionGoal, looker); + } + + if(aipoints_show->value) + { + VectorScale(toAvoid, 40.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + + paletteRGBA_t col = {250, 250, 250, 250}; + paletteRGBA_t col2 = {0, 0, 0, 250}; + //FX_MakeLine(node[startNode].getPos(), node[nextNode].getPos(), col, 1); + FX_MakeLine(which_ai.getPathData().goPoint, monster.s.origin, col, 1); + FX_MakeRing(which_ai.getPathData().goPoint, 4); + FX_MakeLine(actionGoal, monster.s.origin, col2, 1); + } + } + } + else + { + VectorSubtract(goalPos, monster.s.origin, actionGoal); + VectorNormalize(actionGoal); + VectorScale(actionGoal, 10.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,actionGoal), actionGoal, actionGoal); + } + } +} + +void path_decision::AddAction(ai_c &which_ai, edict_t &monster) +{ + vec3_t gohere,moveVec; + qboolean isIdealPos; + body_c *the_body=which_ai.GetBody(); + + //if i'm in midair, shouldn't bother with trying to walk to next point + //this is just here for safety + if (!monster.groundentity && monster.movetype != MOVETYPE_FLY) + { + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster)); + return; + } + + //have a target position, so go there--may have a path here!!! + if (GetGoalPosition(which_ai,monster,gohere)) + { + if (the_body && which_ai.HasTarget() && gmonster.GetWakeSoundTime()GetMove() && the_body->GetMove()->suggested_action != ACTCODE_PAIN) + { +// the_body->VoiceWakeSound(monster, 0.8); + + //eck! this is expensive! +// PlayerNoise(which_ai.getTarget(), monster.s.origin, AI_SENSETYPE_SOUND_WAKEUP, NULL, 500); + } + + //if i'm after a player or enemy monster, get mean! (but make sure they're on a different team than mine) + if (path_goalentity && (path_goalentity->ai || path_goalentity->client) && IsAdversary(monster, path_goalentity)) + { + if(which_ai.GetBody()&&which_ai.GetBody()->GetBestWeapon(monster)==ATK_NOTHING) + { + which_ai.Emote(monster, EMOTION_AFRAID, 5.0);//fixme--this decision is too general to do this here!! + } + else + { + which_ai.Emote(monster, EMOTION_MEAN, 5.0);//fixme--this decision is too general to do this here!! + } + which_ai.SetTargetTime(path_goal_updatedtime, path_goalentity, gohere); + } + GetMovementVector(which_ai, monster, gohere, moveVec); + +// Com_Printf("Go %f %f %f\n", moveVec[0], moveVec[1], moveVec[2]); + + isIdealPos=IsIdealPosition(which_ai, monster, monster.s.origin, gohere, moveVec); + + //if i have a path, go to the next point in it--may want to change this to Inch toward next path point + if (path_nextpoint.valid) + { + //if my path point is for some special action, do it + if (!isIdealPos && AddSpecialPathAction(which_ai, monster)) + { + return; + } + } + + if (isIdealPos) + { + AddActionIdealPosition(which_ai, monster, gohere, moveVec); + } + else + { + AddActionNonIdealPosition(which_ai, monster, gohere, moveVec); + } + } + //no goal position + else + { + decision_c::Perform(which_ai, monster); + } +} + +//careful--used to be able to call this with no goal in mind, now it takes whatever goalpos +//yer plug in seriously +qboolean path_decision::EvaluatePathEndpoint(ai_c &which_ai, edict_t &monster, + ai_pathpoint_t endpoint_candidate, vec3_t goalpos) +{ + //make sure i have a path! + if (!endpoint_candidate.valid) + { + return false; + } + + //simple distance check, weighted heavier in z + if (IsIdealPosition(which_ai, monster, endpoint_candidate.pos, goalpos, vec3_origin)) + { + return true; + } + return false; +} + +static bool made_puffs; + +void path_think(edict_t *who) +{ + FX_MakeSparks(who->s.origin, vec3_up, 2); + who->nextthink=level.time+0.5; +} + +void path_think_2(edict_t *who) +{ + FX_MakeSparks(who->s.origin, vec3_up, 1); + who->nextthink=level.time+0.5; +} + + +qboolean path_decision::NextPointInPath(ai_c &which_ai, edict_t &monster, vec3_t position) +{//this sets path_nextpoint + + //are we traveling a path with another point to spare? if so, grab that + //next point. + if (path_nextpoint.valid && level.time-path_nextpoint.time < 5) + { + qboolean closeEnough = false; + vec3_t dist; + + //consider me--haven't timed out yet + if (level.time - path_nextpoint.time < 1.0) + { + VectorSubtract(position, path_nextpoint.pos, dist); + dist[2]=0; + closeEnough=VectorLengthSquared(dist)<2500; + + //still haven't hit the waypoint, keep goin at it + if (!closeEnough) + { + // gi.dprintf("NextPointInPath: moving to point\n"); + return true; + } + } + + } +// gi.dprintf("NextPointInPath: path dried up\n"); + path_nextpoint.valid = false; + return false; +} + +void path_decision::TempPointCreate(vec3_t position, edict_t &monster) +{ + VectorCopy(position, path_nextpoint.pos); + +// if (ai_pathtest->value) +// { +// gi.dprintf("% creating temp point at time %f\n",monster.classname,level.time); +// } + path_nextpoint.valid = 1; + path_nextpoint.time = level.time; +} + +void path_decision::AvoidPointCreate(vec3_t normal, edict_t &monster) +{ + vec3_t newdir,tempdir,right, curfacing; + vec3_t finalpos; + float yaw, whichway; + + if (path_nextpoint.valid && (level.time - path_nextpoint.time < 1.0)) + { + return; + } + +// gi.dprintf("warning! creating temp point!\n"); + //get the direction i was facing, so i know which side of the normal is more desirable + yaw = monster.s.angles[YAW] * M_PI * 2 / 360;//fixme: don't know this is direction i was moving + + curfacing[0] = cos(yaw); + curfacing[1] = sin(yaw); + curfacing[2] = 0; + + //find a vector parallel to plane normal + //Fixme?--this doesn't work in 3d, but cheap & shouldn't be a problem for walking creatures + //er, could zero out normal's z, then normalize (making sure length n/ 0) + right[0] = normal[1]; + right[1] = normal[0]*-1.0; + right[2] = normal[2]; + + //this random stuff makes it more likely i'll try to go with the grain of whatever i hit + + if ((path_nextpoint.valid)||(level.time-path_fail_timevelocity)+30,newdir); + VectorScale(normal,(VectorLength(monster.ai->velocity)+30)*0.5,tempdir);//back up a bit too! + VectorAdd(monster.s.origin,newdir,newdir); + VectorAdd(tempdir,newdir,finalpos); + + //spawn an edict for tempgoal usage + TempPointCreate(finalpos,monster); + //make sure spawn was successful + path_nextpoint.temp_type=0;//code for ordinary tempgoal +} + +void path_decision::PoliteAvoidPointCreate(vec3_t normal, edict_t &monster) +{ + vec3_t tempdir; + vec3_t finalpos; + + if (path_nextpoint.valid && (level.time - path_nextpoint.time < 1.0)) + { + return; + } + + //go 70 units with the normal + VectorScale(normal,70,tempdir);//back up a bit too! + VectorAdd(monster.s.origin,tempdir,finalpos); + + //spawn an edict for tempgoal usage + TempPointCreate(finalpos,monster); + //make sure spawn was successful + path_nextpoint.temp_type=0;//code for ordinary tempgoal +} + +void path_decision::JumpPointCreate(vec3_t position, edict_t &monster) +{ +// gi.dprintf("warning! creating jump point!\n"); + TempPointCreate(position,monster); + path_nextpoint.temp_type=1;//code for jumpgoal +} + +void path_decision::FallPointCreate(vec3_t position, edict_t &monster) +{ +// gi.dprintf("warning! creating fall point!\n"); + TempPointCreate(position,monster); + path_nextpoint.temp_type=2;//code for fallgoal +} + + +void path_decision::UsePointCreate(brushUseInfo_t &useeInfo, edict_t &monster) +{ +// gi.dprintf("warning! creating fall point!\n"); + TempPointCreate(useeInfo.usePos,monster); + VectorCopy(useeInfo.useDir, path_nextpoint.direction); + path_nextpoint.targetEnt=useeInfo.useEnt; + path_nextpoint.temp_type=3;//code for usegoal +} + +void path_decision::PerformAvoidance(ai_c &which_ai, edict_t &monster) +{ + vec3_t normal, my_facing; + + vec3_t endorg; + vec3_t checkorg; + trace_t walktrace; + float yaw; + bool avoided = false; + + VectorClear(aimWanderVec); + + //i'm in the air--can't really do any avoidance + if (!monster.groundentity && monster.movetype != MOVETYPE_FLY) + { + return; + } + + yaw = monster.s.angles[YAW] * M_PI * 2 / 360;//fixme: don't know this is direction i was moving + + //use my facing direction + endorg[0] = cos(yaw)*25; + endorg[1] = sin(yaw)*25; + endorg[2] = 0; + + // try the move + VectorCopy (monster.s.origin, checkorg); + VectorScale (endorg, 0.04, my_facing); + VectorAdd (checkorg, endorg, endorg); + + //do another trace to get info on which way to go to avoid obstacle + gi.trace (checkorg, monster.mins, monster.maxs, endorg, &monster, MASK_MONSTERSOLID, &walktrace); + + checkorg[2]+=which_ai.GetJumpHeight(); + endorg[2]+=which_ai.GetJumpHeight(); + + + //no jumping or falling here, bub! + + //hmm... if trace was successful, something's screwy--use monster's angles reversed as the normal for a temp point + if (walktrace.fraction == 1) + { + AngleVectors(monster.s.angles,normal,NULL,NULL); + VectorScale(normal,-1.0,normal); + AvoidPointCreate(normal, monster); + } + + //if trace hit architecture or entity unlike monster, do temppoint avoidance for sure + //fixme: check if ent with ai is good guy or bad guy + else if (walktrace.ent == path_goalentity) + { +// NextPointInPath(which_ai, monster, monster.s.origin); + } + else if ((!walktrace.ent) || (!walktrace.ent->ai)) + { + //open doors in the way--fixme--sophisticate this, add special action. + if (walktrace.ent && IsUseableBrush(walktrace.ent)) + { + if (IsBrushUseableNow(walktrace.ent, level.time, &monster)) + { + brushUseInfo_t useInfo; + if (GetUseableBrushInfo(walktrace.plane.normal, walktrace.ent, useInfo, &monster)) + { + UsePointCreate(useInfo, monster); + } + } + //it's useable--do a special avoid here, to not block up doorways etc. + else + { + PoliteAvoidPointCreate(walktrace.plane.normal, monster); + } + } + //not a useable brush--just avoid it + else + { + AvoidPointCreate(walktrace.plane.normal, monster); + } + } + //hit a monster--not sure if it's an ally or not + + else + { + float whichway; + vec3_t other_facing; + + whichway = gi.flrand(0.0F, 2.0F); + whichway = 1.0-whichway; + + //calculate direction other guy is facing + AngleVectors(walktrace.ent->s.angles,other_facing,NULL,NULL); + + //this would skew results more in favor of not turning +// whichway = 1.0-(whichway*whichway*0.5); + + //sometimes yield to higher ranked monsters, never yield to lower ranked guys + //random check that'll usually ignore friendly collision if we're going the same direction + if ((walktrace.ent->ai->GetRank() - monster.ai->GetRank() >= gi.flrand(-20.0F, 0.0F)) + &&(DotProduct (my_facing, other_facing) <= whichway))//facing each other + { + vec3_t edictnorm; + + //instead of using trace norm, calc a more natural-looking norm using the position of the 2 edicts + VectorSubtract(monster.s.origin, walktrace.ent->s.origin, edictnorm); + edictnorm[0]+=gi.flrand(-15.0F, 15.0F); + edictnorm[1]+=gi.flrand(-15.0F, 15.0F); + if (!VectorCompare(edictnorm,vec3_origin)) + { + VectorNormalize(edictnorm); + + AvoidPointCreate(edictnorm, monster); + } + } + //going same way as chum--do nothing? need to stall for time, right? + else + { +// NextPointInPath(which_ai, monster, monster.s.origin); + } + } + +} + + +void path_decision::ActionCompleted(action_c &which_action, ai_c &which_ai, edict_t &monster, float percent_success) +{//go to next node in path, or set up temp goal for avoidance + + if (percent_success > 0.25) + { + NextPointInPath(which_ai, monster, monster.s.origin); + } + //action completed unsuccessfully--set up temp waypoint for avoidance + else + { + PerformAvoidance(which_ai, monster); + } + + if (which_action.Type() == atype_attack)//update validity of attacking here. + { + return; + } + + //based on success of this last action, update how valid this decision is. + UpdateValidity(percent_success); +} + +path_decision::path_decision(path_decision *orig) +: decision_c(orig) +{ + last_jump_time = orig->last_jump_time; + path_fail_time = orig->path_fail_time; + VectorCopy(orig->path_fail_dir, path_fail_dir); + + path_nextpoint = orig->path_nextpoint; + *(int *)&path_nextpoint.targetEnt = GetEdictNum(orig->path_nextpoint.targetEnt); + + *(int *)&path_goalentity = GetEdictNum(orig->path_goalentity); + VectorCopy(orig->path_goalpos, path_goalpos); + path_goal_updatedtime = orig->path_goal_updatedtime; + + VectorCopy(orig->newMoveDir, newMoveDir); + lastCheckTime = orig->lastCheckTime; + lastDuckInvalidateTime = orig->lastDuckInvalidateTime; + lastDuckValidTime = orig->lastDuckValidTime; + + VectorCopy(orig->aimWanderVec, aimWanderVec); + + stuckNonIdeal = orig->stuckNonIdeal; + nonIdealReason = orig->nonIdealReason; + blockingEnemy = orig->blockingEnemy; +} + +void path_decision::Evaluate(path_decision *orig) +{ + last_jump_time = orig->last_jump_time; + path_fail_time = orig->path_fail_time; + VectorCopy(orig->path_fail_dir, path_fail_dir); + + path_nextpoint = orig->path_nextpoint; + path_nextpoint.targetEnt = GetEdictPtr((int)orig->path_nextpoint.targetEnt); + + path_goalentity = GetEdictPtr((int)orig->path_goalentity); + + VectorCopy(orig->path_goalpos, path_goalpos); + path_goal_updatedtime = orig->path_goal_updatedtime; + + VectorCopy(orig->newMoveDir, newMoveDir); + lastCheckTime = orig->lastCheckTime; + lastDuckInvalidateTime = orig->lastDuckInvalidateTime; + lastDuckValidTime = orig->lastDuckValidTime; + + VectorCopy(orig->aimWanderVec, aimWanderVec); + + stuckNonIdeal = orig->stuckNonIdeal; + nonIdealReason = orig->nonIdealReason; + blockingEnemy = orig->blockingEnemy; + + decision_c::Evaluate(orig); +} + +/********************************************************************************** + **********************************************************************************/ + +pathcorner_decision::pathcorner_decision(edict_t *goalent, int priority_root, float timeout, edict_t *ScriptOwner) +: path_decision(goalent, priority_root, timeout, ScriptOwner) +{ + curWaitActionNum = 1; + reactivate_time = 0.0f; + oldTarget = NULL; + firstActionAtWait = true; + curMoveAction = NULL; + isAtCorner = false; +} + +void pathcorner_decision::GetMovementVector(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + float distToGoalPos; + VectorSubtract(goalPos, monster.s.origin, newMoveDir); + distToGoalPos=VectorNormalize(newMoveDir); + if (distToGoalPos>3) + { + VectorScale(newMoveDir, 3, moveVec); + } + else + { + VectorScale(newMoveDir, distToGoalPos, moveVec); + } +} + +mmove_t *GetWaitAction(edict_t *self, int actionNum); +mmove_t *GetMoveAction(edict_t *self); + +void pathcorner_decision::FinishPathPoint(ai_c &which_ai, edict_t &monster) +{ + edict_t *oldCorner=path_goalentity; + curWaitActionNum=1; +// while(path.path->GetPoint(path_nextpoint.point)){} + path_nextpoint.valid = 0; + isAtCorner=false; + if (!path_goalentity) + { + return; + } + if (ai_pathtest->value) + { + gi.dprintf("Finishing pathpoint: time %f\n",level.time); + } + if (ai_pathtest->value) + { + gi.dprintf("%d getting next point: old--%s, looking for %s!\n",monster.s.number,path_goalentity->targetname,path_goalentity->target); + } + mmove_t *tMove=GetMoveAction(path_goalentity); + if (tMove) + { + curMoveAction=tMove; + } + //use the path_corner's pathtarget + if (path_goalentity->pathtarget) + { + char *savetarget; + sensedEntInfo_t my_client; + + savetarget = path_goalentity->target; + path_goalentity->target = path_goalentity->pathtarget; + which_ai.GetSensedClientInfo(smask_all, my_client); + //use any client i know about as activator + if (my_client.ent) + { + G_UseTargets (path_goalentity, my_client.ent); + } + else + { + G_UseTargets (path_goalentity, &monster); + } + path_goalentity->target = savetarget; + } + + if (path_goalentity->target) + { + path_goalentity=G_PickTarget(path_goalentity->target); + } + else + { + path_goalentity = NULL; + } + if (path_goalentity) + { + VectorSubtract(path_goalentity->s.origin, monster.s.origin, path_fail_dir); + VectorNormalize(path_fail_dir); + } + else + { + //now check to see if i should hold my position here. + if (oldCorner && (oldCorner->spawnflags&1) && stricmp(oldCorner->classname, "path_corner")) + { + monster.spawnflags|=SPAWNFLAG_HOLD_POSITION; + monster.flags |= FL_NO_KNOCKBACK; + } + } +} + +void pathcorner_decision::ActionCompleted(action_c &which_action, ai_c &which_ai, edict_t &monster, float percent_success) +{//go to next node in path, or set up temp goal for avoidance + if (which_action.Type() == atype_attack)//update validity of attacking here. + { + return; + } + + //based on success of this last action, update how valid this decision is. + UpdateValidity(percent_success); + + //action completed successfully--go to next waypoint (no matter if i'm not following a path) + if (path_goalentity) + { + if (isAtCorner) + { + if (!path_nextpoint.valid) + { + //check if i have waitactions left, if point has spawnflag 2 on that means i'm finished + body_c *body=which_ai.GetBody(); + mmove_t *newmove=GetWaitAction(path_goalentity, curWaitActionNum); + + //passed the end of the wait action list + if (!newmove) + { + //run thru anims once only + if (path_goalentity->spawnflags&2) + { + reactivate_time = level.time-1; + } + } + + if (reactivate_time <= level.time) + { + FinishPathPoint(which_ai, monster); + } + } + } + else + { + if (percent_success > 0.25) + { + NextPointInPath(which_ai, monster, monster.s.origin); + } + //action completed unsuccessfully--set up temp waypoint for avoidance + else + { + PerformAvoidance(which_ai, monster); + } + } + } +} + +qboolean pathcorner_decision::IsIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t curPos, vec3_t goalPos, vec3_t moveVec) +{ + if(ai_dumb->value) + {//show folks what we are up to + fxRunner.exec("edit/ignore", &monster); + } + + vec3_t toGoal; + float distToGoalSq; + VectorSubtract(goalPos, curPos, toGoal); + distToGoalSq=VectorLengthSquared(toGoal); + //am i closer than 30 from goal position + if( isAtCorner || (distToGoalSq < 2500 && distToGoalSq > 2) ) + { +// trace_t tr; + vec3_t toCur; + //test to see if i can shoot goalpos--should i be able to get this info from sense somehow? + VectorSubtract(curPos, monster.s.origin, toCur); +// if(toCur[0]*toCur[0]+toCur[1]*toCur[1]+toCur[2]*toCur[2] < 100) +// { +// gi.trace(monster.s.origin,NULL,NULL,goalPos,&monster,MASK_SHOT, &tr); +// if (tr.fraction>0.95||tr.ent==path_goalentity) +// { + if (path_goalentity && oldTarget != path_goalentity) + { + if (ai_pathtest->value) + { + gi.dprintf("waiting: time %f\n",level.time); + } + oldTarget=path_goalentity; + if (path_goalentity->wait == -1 || (path_goalentity->spawnflags&2)) + { + reactivate_time=level.time+9999999999; + } + else + { + reactivate_time=level.time+path_goalentity->wait; + } + firstActionAtWait=true; + isAtCorner=true; + + if (path_goalentity->spawnflags&4) + { + which_ai.SetConcentratingOnPlayer(true); + monster.spawnflags|=SPAWNFLAG_HOLD_POSITION; + monster.flags |= FL_NO_KNOCKBACK; + curMoveAction=NULL; + } + } + return true; +// } +// } +// else +// { +// return true; +// } + } + return false; +} + +void pathcorner_decision::AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + vec3_t actionGoal,tGoal; + + VectorCopy(moveVec, actionGoal); + VectorAdd(monster.s.origin,actionGoal,actionGoal); + VectorAdd(moveVec,monster.s.origin,tGoal); + + //if i have an animation in mind, only accept guys with the same actflags + if (curMoveAction) + { + mmove_t *newMove=GetSequenceForMovement(which_ai,monster,tGoal,tGoal,curMoveAction,~(curMoveAction->actionFlags)); + if (newMove != curMoveAction) + { + if (which_ai.GetBody() && which_ai.GetBody()->IsAvailableSequence(monster, curMoveAction)) + { + gi.dprintf("path-traversal: couldn't set %s for %s %s (but it's available!), using %s!\n", + curMoveAction->ghoulSeqName, monster.classname, monster.targetname, newMove->ghoulSeqName); + } + else + { + gi.dprintf("path-traversal: %s not available for %s %s, using %s!\n", + curMoveAction->ghoulSeqName, monster.classname, monster.targetname, newMove->ghoulSeqName); + } + } + AddActionForSequence(which_ai, monster, newMove, actionGoal, actionGoal); + } + //if i don't have some specific animation in mind, don't allow backing up or strafing + else + { + AddActionForSequence(which_ai, monster, + GetSequenceForMovement(which_ai,monster,tGoal,tGoal,curMoveAction,ACTFLAG_BACKUP|ACTFLAG_LEFTSTRAFE|ACTFLAG_RIGHTSTRAFE), + actionGoal, actionGoal); + } +} + +void pathcorner_decision::AddActionIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + body_c *body=which_ai.GetBody(); + mmove_t *newmove=NULL; + vec3_t forward; + sensedEntInfo_t aClient; + + which_ai.GetSensedClientInfo(smask_all, aClient); + if (aClient.ent && !OnSameTeam(aClient.ent, &monster)) + { + which_ai.SetTargetTime(aClient.time, aClient.ent, aClient.pos); + } + + if (path_goalentity) + { + AngleVectors(path_goalentity->s.angles, forward, NULL, NULL); + VectorScale(forward, 10000, forward); + VectorAdd(forward, monster.s.origin, forward); + } + else + { + VectorClear(forward); + } + + if (!body) + { + gi.dprintf("path-traversal: no body!\n"); + which_ai.NewAction(which_ai.DefaultAction(this, NULL, GetSequenceForStand(which_ai,monster,goalPos,forward), goalPos, forward, NULL, 0, true), &monster); + return; + } + + if (!firstActionAtWait && body->HasAnimationHitEOS()) + { + curWaitActionNum++; + } + + newmove=GetWaitAction(path_goalentity, curWaitActionNum); + + //passed the end of the wait action list + if (!newmove) + { + //run thru anims once only + if (path_goalentity->spawnflags&2) + { + newmove=GetWaitAction(path_goalentity, 1); + } + else + { + curWaitActionNum=1; + newmove=GetWaitAction(path_goalentity, curWaitActionNum); + } + } + + mmove_t *newStand=body->GetSequenceForStand(monster,goalPos,forward,ACTSUB_NORMAL,BBOX_PRESET_STAND,newmove); + + forward[2]+=MONSTER_SHOOT_HEIGHT; + + //if i want to be attacking here, try to aim at a client + if (newmove && newmove->suggested_action==ACTCODE_ATTACK) + { + sensedEntInfo_t sensed_client; + which_ai.GetSensedClientInfo(smask_all, sensed_client); + + //only do it if i really saw a client, and s/he/it's really an enemy... + if (sensed_client.ent && IsAdversary(monster, sensed_client.ent)) + { + VectorCopy(sensed_client.pos, forward); + } + } + + if (newmove && newStand != newmove) + { + if (which_ai.GetBody() && which_ai.GetBody()->IsAvailableSequence(monster, newmove)) + { + gi.dprintf("path-traversal: couldn't set %s for %s %s (but it's available!), using %s!\n", + newmove->ghoulSeqName, monster.classname, monster.targetname, newStand->ghoulSeqName); + } + else + { + gi.dprintf("path-traversal: %s not available for %s %s, using %s!\n", + newmove->ghoulSeqName, monster.classname, monster.targetname, newStand->ghoulSeqName); + } + } + + which_ai.NewAction(which_ai.DefaultAction(this, NULL, newStand, goalPos, forward, NULL, 0, true), &monster); + + firstActionAtWait=false; +} + +void pathcorner_decision::SetGoalPosition(ai_c &which_ai, edict_t &monster) +{ + if (path_goalentity && path_goalentity->inuse) + { + if (IsIdealPosition(which_ai, monster, monster.s.origin, path_goalentity->s.origin, vec3_origin)) + { + if (!path_goalentity->target&&reactivate_time <= level.time) + { + FinishPathPoint(which_ai, monster); +// path_goalentity=NULL; + } + else if (path_goalentity->wait <= 0.1 && path_goalentity->wait >= -0.1 && !(path_goalentity->spawnflags&2)) + { + FinishPathPoint(which_ai, monster); + } + } + if (path_goalentity) + { + VectorCopy(path_goalentity->s.origin, path_goalpos); + } + } +} + +qboolean pathcorner_decision::GetGoalPosition(ai_c &which_ai, edict_t &monster, vec3_t gohere) +{ + //copy ai's enemy_lastseen_pos into gohere vec + if (gohere)//pass in NULL if just want to know whether we have goal position + { + VectorCopy(path_goalpos, gohere); + } + + //check the decision's goalentity for whether i have goal pos, not ai's enemy + if (path_goalentity) + { + //make sure goal entity is still valid + if (!path_goalentity->inuse) + { + path_goalentity = NULL; + return false; + } + return true; + } + else + { + return false; + } +} + + +qboolean pathcorner_decision::Consider(ai_c &which_ai, edict_t &monster) +{ +#ifdef _DEBUG + decName = "pathcornerdecision"; +#endif + + //don't automatically do this? + SetGoalPosition(which_ai, monster); + + //have a goal position + if (GetGoalPosition(which_ai,monster,NULL)) + { + priority = 1.1; + } + //no goal position--get rid of me + else + { + priority = 1; + return true; + } + + UpdateValidity(); + + //if decision can time out, and its time has expired, then let ai get rid of it + return (IsTimedOut()||which_ai.HasTarget()); +} + +pathcorner_decision::pathcorner_decision(pathcorner_decision *orig) +: path_decision(orig) +{ + reactivate_time = orig->reactivate_time; + *(int *)&oldTarget = GetEdictNum(orig->oldTarget); + curWaitActionNum = orig->curWaitActionNum; + firstActionAtWait = orig->firstActionAtWait; + isAtCorner = orig->isAtCorner; + *(int *)&curMoveAction = GetMmoveNum(orig->curMoveAction); +} + +void pathcorner_decision::Evaluate(pathcorner_decision *orig) +{ + reactivate_time = orig->reactivate_time; + oldTarget = GetEdictPtr((int)orig->oldTarget); + curWaitActionNum = orig->curWaitActionNum; + firstActionAtWait = orig->firstActionAtWait; + isAtCorner = orig->isAtCorner; + curMoveAction = GetMmovePtr((int)orig->curMoveAction); + + path_decision::Evaluate(orig); +} + +/********************************************************************************** + **********************************************************************************/ + +void pathcombat_decision::FinishPathPoint(ai_c &which_ai, edict_t &monster) +{ + edict_t *oldGoal=path_goalentity; + + pathcorner_decision::FinishPathPoint(which_ai, monster); + + //now check to see if i should hold my position here. + if (oldGoal && (oldGoal->spawnflags&1)) + { + monster.spawnflags|=SPAWNFLAG_HOLD_POSITION; + monster.flags |= FL_NO_KNOCKBACK; + } +} + +void pathcombat_decision::GetMovementVector(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + float distToGoalPos; + VectorSubtract(goalPos, monster.s.origin, newMoveDir); + distToGoalPos=VectorNormalize(newMoveDir); + if (distToGoalPos>VectorLength(which_ai.velocity)+15) + { + VectorScale(newMoveDir, VectorLength(which_ai.velocity)+15, moveVec); + } + else + { + VectorScale(newMoveDir, distToGoalPos, moveVec); + } + if (path_nextpoint.valid && level.time-path_nextpoint.time<1.0) + { + VectorSubtract(path_nextpoint.pos, monster.s.origin, moveVec); + RecalcMoveVec(which_ai, monster, path_nextpoint.pos, moveVec); + } +} + +qboolean pathcombat_decision::Consider(ai_c &which_ai, edict_t &monster) +{ +#ifdef _DEBUG + decName = "pathcombatdecision"; +#endif + + //don't automatically do this? + SetGoalPosition(which_ai, monster); + +// AcquirePath(which_ai, monster); + + //have a goal position + if (GetGoalPosition(which_ai,monster,NULL)) + { + if (which_ai.HasHadTarget()) + { + priority = 5; + } + else + { + priority = 0; + } + } + //no goal position + else + { + priority = 0; + return true; + } + + UpdateValidity(); + + //if decision can time out, and its time has expired, then let ai get rid of it + return IsTimedOut(); +} + +pathcombat_decision::pathcombat_decision(pathcombat_decision *orig) +: pathcorner_decision(orig) +{ +} + +void pathcombat_decision::Evaluate(pathcombat_decision *orig) +{ + pathcorner_decision::Evaluate(orig); +} + +void pathcombat_decision::Read() +{ + char loaded[sizeof(pathcombat_decision)]; + + gi.ReadFromSavegame('AIPD', loaded, sizeof(pathcombat_decision)); + Evaluate((pathcombat_decision *)loaded); +} + +void pathcombat_decision::Write() +{ + pathcombat_decision *savable; + + savable = new pathcombat_decision(this); + gi.AppendToSavegame('AIPD', savable, sizeof(*this)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ +/* +void pointcombat_decision::AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + vec3_t actionGoal,tGoal; + float moveDist; + float moveSpeed=VectorLength(which_ai.velocity)+5; + + //override moveVec, achtung!! ignoring pathfinding stuff!! +// VectorSubtract(goalPos, monster.s.origin, moveVec); + +// if (moveSpeed > 10) +// { +// moveSpeed = 10; +// } +// if (ai_pathtest->value) +// { +// gi.dprintf("nonideal adding action : goalpos %s, path_goalpos %s.\n",vtos(goalPos),vtos(path_goalpos)); +// } + + //override whatever moveVec was set as. +// VectorSubtract(goalPos, monster.s.origin, moveVec); + moveDist = VectorNormalize(moveVec); + //scale my moveVec to be reasonable. +// if (moveSpeed > moveDist) +// { +// moveSpeed = moveDist; +// } + VectorScale(moveVec, moveSpeed, actionGoal); + VectorAdd(monster.s.origin,actionGoal,actionGoal); + VectorAdd(moveVec,monster.s.origin,tGoal); + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,tGoal,tGoal), actionGoal, actionGoal); +// which_ai.NewAction(which_ai.WalkAction(this, NULL, GetSequenceForMovement(which_ai,monster,tGoal,tGoal), actionGoal, actionGoal, 0.2), &monster); +} +*/ +pointcombat_decision::pointcombat_decision(edict_t *goalent, int priority_root, float timeout, edict_t *ScriptOwner) +: path_decision(goalent, priority_root, timeout, ScriptOwner) +{ + current_point = 0; + VectorClear(current_point_pos); + VectorClear(current_point_dest); + current_point_type = 0; + current_point_subtype = 0; + last_point_trans = 0; + last_consider_time = 0; + VectorClear(current_point_dir); +} + +qboolean pointcombat_decision::IsIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t curPos, vec3_t goalPos, vec3_t moveVec) +{ + vec3_t toGoal; + float distToGoalSq; + VectorSubtract(goalPos, curPos, toGoal); + distToGoalSq=VectorLengthSquared(toGoal); + + //am i closer than 50 from combat point + //if(distToGoalSq < 2500 && distToGoalSq > 2) + if(distToGoalSq < 400 && distToGoalSq > 2)//closer than 20 + { + return true; + } + return false; +} + +int pointBetweenSpheres(vec3_t start, float startrad, vec3_t end, float endrad, vec3_t testpoint); + +void pointcombat_decision::GetMovementVector(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + // these are extremely specific - just go straight to it. + + vec3_t targ; + + stuckNonIdeal = false; + + if(aiPoints.isActive()) + { + float rad = aiPoints.getNode(which_ai.getPathData().curNode)->getRadius(); + + if(rad < 40) + { + rad = 40; + } + + // it's only safe to go once I'm between these two points + // otherwise, head to my node first + if(pointBetweenSpheres(aiPoints.getNode(which_ai.getPathData().curNode)->getPos(), rad, + goalPos, 30, monster.s.origin)) + { + VectorCopy(goalPos, targ); + } + else + { + VectorCopy(aiPoints.getNode(which_ai.getPathData().curNode)->getPos(), targ); + } + /*if(aipoints_show->value) + { + paletteRGBA_t col = {250, 0, 0, 250}; + //FX_MakeLine(node[startNode].getPos(), node[nextNode].getPos(), col, 1); + FX_MakeLine(targ, monster.s.origin, col, 1); + FX_MakeRing(targ, 12); + }*/ + } + else + { + VectorCopy(goalPos, targ); + } + + RecalcMoveVec(which_ai, monster, targ, moveVec); + lastCheckTime = level.time; + + VectorScale(newMoveDir, VectorLength(which_ai.velocity)+10, moveVec); +} + + +void pointcombat_decision::AddActionIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + body_c *body = which_ai.GetBody(); +/* + //do specialized attacking for combat point here! + //if (current_point != NO_COMBAT_POINT) + if (which_ai.getPathData().currentPointStyle) + { + //if (current_point_type == EWI_POINT_DUCK) + if (which_ai.getPathData().currentPointStyle == EPS_DUCK) + { +// gi.dprintf("duck!\n"); + AddActionForSequence(which_ai, monster, body->GetSequenceForAttack(monster, path_goalpos, path_goalpos, path_goalentity, ACTSUB_NORMAL, BBOX_PRESET_CROUCH), path_goalpos, path_goalpos, path_goalentity); + return; + } + //else if (current_point_type == EWI_POINT_LEAN) + else if (which_ai.getPathData().currentPointStyle == EPS_LEAN) + { // nathan fixme - which side is buddy leaning on now? + //fixme: use current_point_pos here somehow + if (last_point_trans > level.time - gi.flrand(3.0, 6.0)) + { + vec3_t dif; + VectorScale(current_point_dir, -1, dif); + vectoangles(dif, monster.s.angles);//!!!!!!! + + if(which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_wallidle_pk)) + { + which_ai.NewAction(which_ai.DefaultAction(this, NULL, GetSequenceForStand(which_ai, monster,path_goalpos,path_goalpos, &generic_move_wallidle_pk), path_goalpos, path_goalpos, NULL, 0, true), &monster); + return; + } + if(which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_wallidle_mrs)) + { + which_ai.NewAction(which_ai.DefaultAction(this, NULL, GetSequenceForStand(which_ai, monster,path_goalpos,path_goalpos, &generic_move_wallidle_mrs), path_goalpos, path_goalpos, NULL, 0, true), &monster); + return; + } + + which_ai.NewAction(which_ai.DefaultAction(this, NULL, GetSequenceForStand(which_ai, monster,path_goalpos,path_goalpos), path_goalpos, path_goalpos, NULL, 0, true), &monster); + } + else + { + vec3_t dif; + VectorScale(current_point_dir, -1, dif); + vectoangles(dif, monster.s.angles);//!!!!!!! + last_point_trans = level.time; +// VectorCopy(which_ai.getPathData().combatPoint, monster.s.origin); + if (!(which_ai.getPathData().combatPointLeft)) + { + if (which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_fcornerr_m2)) + { + AddActionForSequence(which_ai, monster, body->GetSequenceForAttack(monster, monster.s.origin, path_goalpos, path_goalentity, ACTSUB_NORMAL, BBOX_PRESET_STAND,&generic_move_fcornerr_m2), path_goalpos, path_goalpos, path_goalentity); + return; + } + if (which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_fcornerr_p)) + { + AddActionForSequence(which_ai, monster, body->GetSequenceForAttack(monster, monster.s.origin, path_goalpos, path_goalentity, ACTSUB_NORMAL, BBOX_PRESET_STAND,&generic_move_fcornerr_p), path_goalpos, path_goalpos, path_goalentity); + return; + } + } + else + { + if (which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_fcornerl_m2)) + { + AddActionForSequence(which_ai, monster, body->GetSequenceForAttack(monster, monster.s.origin, path_goalpos, path_goalentity, ACTSUB_NORMAL, BBOX_PRESET_STAND,&generic_move_fcornerl_m2), path_goalpos, path_goalpos, path_goalentity); + return; + } + if (which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_fcornerl_p)) + { + AddActionForSequence(which_ai, monster, body->GetSequenceForAttack(monster, monster.s.origin, path_goalpos, path_goalentity, ACTSUB_NORMAL, BBOX_PRESET_STAND,&generic_move_fcornerl_p), path_goalpos, path_goalpos, path_goalentity); + return; + } + } + + gi.dprintf("couldn't run corner-peeking animation!\n"); + AddActionForSequence(which_ai, monster, body->GetSequenceForAttack(monster, monster.s.origin, path_goalpos, path_goalentity, ACTSUB_NORMAL, BBOX_PRESET_STAND), path_goalpos, path_goalpos, path_goalentity); + } + return; + } + else if (which_ai.getPathData().currentPointStyle == EPS_COVER) + //else if (current_point_type == EWI_POINT_COVER) + { + if(body->GetMove()->bbox == BBOX_PRESET_CROUCH) + { //what to do when ducking + if(last_point_trans > level.time - gi.flrand(4.0, 6.0)) + { + AddActionForSequence(which_ai, monster, body->GetSequenceForStand(monster, monster.s.origin, path_goalpos, ACTSUB_NORMAL, BBOX_PRESET_CROUCH), path_goalpos, path_goalpos, path_goalentity); + } + else + { + last_point_trans = level.time; + AddActionForSequence(which_ai, monster, body->GetSequenceForAttack(monster, monster.s.origin, path_goalpos, path_goalentity, ACTSUB_NORMAL, BBOX_PRESET_STAND), path_goalpos, path_goalpos, path_goalentity); + } + } + else + { //what to do when standing + if(last_point_trans > level.time - gi.flrand(4.0, 6.0)) + { + AddActionForSequence(which_ai, monster, body->GetSequenceForAttack(monster, monster.s.origin, path_goalpos, path_goalentity, ACTSUB_NORMAL, BBOX_PRESET_STAND), path_goalpos, path_goalpos, path_goalentity); + } + else + { + last_point_trans = level.time; + AddActionForSequence(which_ai, monster, body->GetSequenceForStand(monster, monster.s.origin, path_goalpos, ACTSUB_NORMAL, BBOX_PRESET_CROUCH), path_goalpos, path_goalpos, path_goalentity); + } + + } + + return; + //AddActionForSequence(which_ai, monster, body->GetSequenceForAttack(which_ai, monster, path_goalpos, path_goalpos, path_goalentity, ACTSUB_NORMAL, BBOX_PRESET_CROUCH), path_goalpos, path_goalpos, path_goalentity); + } + } + gi.dprintf("unknown combat point type!\n"); + which_ai.NewAction(which_ai.DefaultAction(this, NULL, GetSequenceForStand(which_ai, monster,goalPos,goalPos), goalPos, goalPos, NULL, 0, true), &monster);*/ +} + +void pointcombat_decision::SetGoalPosition(ai_c &which_ai, edict_t &monster) +{ +/* path_decision::SetGoalPosition(which_ai, monster); + if (path_goalentity && path_goalentity->inuse) + { + which_ai.getPathData().combatPointsAllowed = EPS_DIRECTED; + + //if i don't have lean anims, don't look for a lean point... + if (which_ai.GetBody() && !which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_fcornerl_m2) + &&!which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_fcornerl_p)) + { + which_ai.getPathData().combatPointsAllowed &= ~EPS_LEAN; + } + + aiPoints.getCombatPoint(&which_ai.getPathData(), monster.s.origin, path_goalentity->s.origin, current_point_dir); + }*/ +} + +qboolean pointcombat_decision::GetGoalPosition(ai_c &which_ai, edict_t &monster, vec3_t gohere) +{ + //copy ai's enemy_lastseen_pos into gohere vec + if (gohere)//pass in NULL if just want to know whether we have goal position + { + //VectorCopy(current_point_dest, gohere); +// VectorCopy(which_ai.getPathData().combatPoint, gohere); + } + + //check the decision's goalentity for whether i have goal pos, not ai's enemy + if (path_goalentity) + { + //make sure goal entity is still valid + if ((!path_goalentity->client && !path_goalentity->ai) || !path_goalentity->inuse + || path_goalentity->health <= 0 || level.time-path_goal_updatedtime>POINTCOMBAT_DECISION_LOSETARGETTIME + || (which_ai.GetBody()&&which_ai.GetBody()->GetBestWeapon(monster)==ATK_NOTHING)) + { + path_goalentity = NULL; + return false; + } + //return current_point!=NO_COMBAT_POINT; + return false; +// return which_ai.getPathData().currentPointStyle; + } + else + { + return false; + } +} + + +qboolean pointcombat_decision::Consider(ai_c &which_ai, edict_t &monster) +{ +#ifdef _DEBUG + decName = "pointcombatdecision"; +#endif + +// AcquirePath(which_ai, monster); + + // put these back in if I ever get them working =/ + priority = .1; + return IsTimedOut(); + + if ((which_ai.GetBody())&&(which_ai.GetBody()->IsMovementImpeded())) + { + priority = .1; + } + else if(monster.spawnflags & SPAWNFLAG_HOLD_POSITION) + { // um, these guys can't use this... + priority = .1; + } + else + { + //don't automatically do this? + SetGoalPosition(which_ai, monster); + + if (GetGoalPosition(which_ai,monster,NULL)) + { + priority = 5.0; + } + //no goal position--no priority + else + { + priority = 0.1; + } + } + + UpdateValidity(); + + //if decision can time out, and its time has expired, then let ai get rid of it + return IsTimedOut(); +} + +pointcombat_decision::pointcombat_decision(pointcombat_decision *orig) +: path_decision(orig) +{ + current_point = orig->current_point; + VectorCopy(orig->current_point_pos, current_point_pos); + VectorCopy(orig->current_point_dest, current_point_dest); + current_point_type = orig->current_point_type; + current_point_subtype = orig->current_point_subtype; + last_point_trans = orig->last_point_trans; + last_consider_time = orig->last_consider_time; + VectorCopy(orig->current_point_dir, current_point_dir); +} + +void pointcombat_decision::Evaluate(pointcombat_decision *orig) +{ + current_point = orig->current_point; + VectorCopy(orig->current_point_pos, current_point_pos); + VectorCopy(orig->current_point_dest, current_point_dest); + current_point_type = orig->current_point_type; + current_point_subtype = orig->current_point_subtype; + last_point_trans = orig->last_point_trans; + last_consider_time = orig->last_consider_time; + + path_decision::Evaluate(orig); +} + +void pointcombat_decision::Read() +{ + char loaded[sizeof(pointcombat_decision)]; + + gi.ReadFromSavegame('AIOD', loaded, sizeof(pointcombat_decision)); + Evaluate((pointcombat_decision *)loaded); +} + +void pointcombat_decision::Write() +{ + pointcombat_decision *savable; + + savable = new pointcombat_decision(this); + gi.AppendToSavegame('AIOD', savable, sizeof(*this)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ + +search_decision::search_decision(edict_t *goalent, int priority_root, float timeout) +: path_decision(goalent, priority_root, timeout) +{ + approach_search = true; + pursuit_search = true; + VectorClear(pursuit_dir); + last_fired_time = 0; + VectorClear(firedSpot); + VectorClear(trail1); + VectorClear(trail2); + VectorClear(trail3); +} +void search_decision::ActionCompleted(action_c &which_action, ai_c &which_ai, edict_t &monster, float percent_success) +{ + path_decision::ActionCompleted(which_action, which_ai, monster, percent_success); + + //if i hit something and i'm not going to last seen pos, cancel going in same direction that target was last seen going + if (percent_success < 0.25 && !approach_search) + { + pursuit_search = false; + } +} + +void search_decision::SetGoalPosition(ai_c &which_ai, edict_t &monster) +{ + path_decision::SetGoalPosition(which_ai, monster); + + vec3_t dif; + + VectorSubtract(path_goalpos, trail1, dif); + if(VectorLengthSquared(dif) > (8*8)) + { + VectorCopy(trail2, trail3); + VectorCopy(trail1, trail2); + VectorCopy(path_goalpos, trail1); + } + + //i see my target; make sure i'm set up for approaching + if (level.time-path_goal_updatedtime<0.2) + { + approach_search = true; + pursuit_search = true; + } + //cheating time is now! update which direction my target went since i last saw him for a while + else if (path_goalentity && level.time-path_goal_updatedtime<1.0) + { +// VectorSubtract(path_goalentity->s.origin, path_goalpos, pursuit_dir); +// VectorNormalize(pursuit_dir); + } +} + +qboolean search_decision::GetGoalPosition(ai_c &which_ai, edict_t &monster, vec3_t gohere) +{ +// vec3_t forward; +// trace_t tr; + + //copy ai's enemy_lastseen_pos into gohere vec + if (gohere)//pass in NULL if just want to know whether we have goal position + { + approach_search = false; + if (path_goalentity) + { + which_ai.getTargetPos(gohere); + } + } + + //check the decision's goalentity for whether i have goal pos, not ai's enemy + if (path_goalentity) + { + //make sure goal entity is still valid + if (!path_goalentity->inuse || path_goalentity->health <= 0 || level.time-path_goal_updatedtime>90) + { + path_goalentity = NULL; + validity=0; + return false; + } + validity=0.2; + return true; + } + else + { + validity=0; + return false; + } +} + +qboolean search_decision::IsIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t curPos, vec3_t goalPos, vec3_t moveVec) +{ + return false; +} + +#define CHEAT_SHOOT_TIME 4.0 +#define CHEATING_TIME 10.0 + +void search_decision::AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + if(which_ai.BeingWatched()) + { + int asdf = 9; + } + + blockingEnemy = 0; + + which_ai.setLastNonTargetTime(level.time); + + int shooting = 0; + + if(level.time < last_fired_time + 8.0 || ((path_goal_updatedtime + CHEAT_SHOOT_TIME > level.time && path_goalentity && !which_ai.GetMySkills()->testFlag(AIS_NOSUPPRESS)))) + { + shooting = 1; + vec3_t shot; + int forceShoot = 0; + + if(level.time < last_fired_time + 8.0) + { + VectorCopy(firedSpot, shot); + } + else + { + switch(0) + { + case 0: + if(VectorLengthSquared(trail3)) + { + VectorCopy(trail3, shot); + break; + } + //intentional fall through + case 1: + if(VectorLengthSquared(trail2)) + { + VectorCopy(trail2, shot); + break; + } + //intentional fall through + case 2: + if(VectorLengthSquared(trail1)) + { + VectorCopy(trail1, shot); + break; + } + //intentional fall through + default: + VectorCopy(path_goalpos, shot);//?? + break; + } + + //forceShoot = 1; + } + + body_c *body = which_ai.GetBody(); + + if (body) + { + //mmove_t *myMove = body->GetSequenceForAttack(monster, dest, face, target, ACTSUB_NORMAL, BBOX_PRESET_STAND, preferred_move, reject_actionflags); + vec3_t fwd; + vec3_t toFace; + //which_ai.GetAimVector(fwd); + //vertical does not matter + AngleVectors(monster.s.angles, fwd, 0, 0); + fwd[2] = 0; + VectorNormalize(fwd); + VectorSubtract(shot, monster.s.origin, toFace); + toFace[2] = 0; + VectorNormalize(toFace); + mmove_t *myMove; + + // fxRunner.exec("weapons/world/slugexplode", shot); + + /*if((!which_ai.GetMySkills()->testFlag(AIS_NODUCK)) && + (DotProduct(toFace, fwd) > .98) && + (forceShoot || ClearShot(which_ai, monster, shot, 0, BBOX_PRESET_CROUCH))) + { + myMove = body->GetSequenceForAttack(monster, monster.s.origin, shot, 0, ACTSUB_NORMAL, BBOX_PRESET_CROUCH); + } + else */if(forceShoot || ClearShot(which_ai, monster, shot, 0, BBOX_PRESET_STAND)) + { + myMove = body->GetSequenceForAttack(monster, monster.s.origin, shot, 0, ACTSUB_NORMAL, BBOX_PRESET_STAND); + } + else + { //well, at the very least minimize surface area + shooting = 0; + //myMove = body->GetSequenceForStand(monster,shot,shot,ACTSUB_NORMAL,BBOX_PRESET_CROUCH); + } + + if(shooting) + { + AddActionForSequence(which_ai, monster, myMove, monster.s.origin, shot, path_goalentity); + + which_ai.GetMiscFlags() |= MISC_FLAG_FIRINGBLIND; + } + } + } + + if(!shooting) + { + if(monster.spawnflags & SPAWNFLAG_HOLD_POSITION) + {//very special case - there guys are always in an ideal position, sort of + path_decision::AddActionIdealPosition(which_ai, monster, goalPos, moveVec); + return; + } + + vec3_t checkSpot; + + if((path_goal_updatedtime + CHEATING_TIME > level.time || which_ai.GetMySkills()->testFlag(AIS_CHEATERSEARCH)) && path_goalentity) + { + VectorCopy(path_goalentity->s.origin, checkSpot); + } + else if(level.time < last_fired_time + 20.0) + { + VectorCopy(firedSpot, checkSpot); + } + else + { + VectorCopy(goalPos, checkSpot); + } + + vec3_t distToMe; + VectorSubtract(checkSpot, monster.s.origin, distToMe); + + nonIdealReason = NI_TOOFAR_SEARCHING;; + +// if((VectorLengthSquared(distToMe) < (128*128))|| +// (path_goalentity && gi.inPVS(monster.s.origin, checkSpot))) + if(VectorLengthSquared(distToMe) < (64*64)) + { //if I am very close to my search point or I can see it but not my target, start searching + vec3_t lookSpot; + + //we want our guy to look at each possible spot for 4 seconds, but I don't feel like adding a counter + //the addition of monster will add a bit of randomness if two guys are at the same node (icky, though) + if(aiPoints.getLookSpot(monster.s.origin, lookSpot, ((int)(level.time/4.0)+(int)(&monster)))) + { + body_c *body = which_ai.GetBody(); + + if (body) + { + mmove_t *myMove; + + myMove = body->GetSequenceForStand(monster,monster.s.origin,lookSpot,ACTSUB_NORMAL,BBOX_PRESET_STAND); + + AddActionForSequence(which_ai, monster, myMove, monster.s.origin, lookSpot, path_goalentity); + + which_ai.GetMiscFlags() |= MISC_FLAG_FIRINGBLIND; + return; + } + } + + /*if(aiPoints.search(&which_ai.getPathData(), &which_ai)) + { + VectorCopy(which_ai.getPathData().goPoint, checkSpot); + } + else*/ +/* { + if(VectorLengthSquared(distToMe) < (64*64)) + {//just go where I was going anyway and hang out - this will make me look at my targ though + VectorSubtract(path_goalentity->s.origin, monster.s.origin, checkSpot); + VectorNormalize(checkSpot); + VectorMA(monster.s.origin, 3, checkSpot, checkSpot); + } + else + {//do what I wasss doing anyway + } + }*/ + } + + path_decision::AddActionNonIdealPosition(which_ai, monster, checkSpot, moveVec); + + } +} + + +qboolean search_decision::Consider(ai_c &which_ai, edict_t &monster) +{ + path_decision::Consider(which_ai, monster); + +#ifdef _DEBUG + decName = "searchdecision"; +#endif + return IsTimedOut(); +} + +search_decision::search_decision(search_decision *orig) +: path_decision(orig) +{ + pursuit_search = orig->pursuit_search; + approach_search = orig->approach_search; + VectorCopy(orig->pursuit_dir, pursuit_dir); + last_fired_time = orig->last_fired_time; + VectorCopy(orig->firedSpot, firedSpot); + VectorCopy(orig->trail1, trail1); + VectorCopy(orig->trail2, trail2); + VectorCopy(orig->trail3, trail3); +} + +void search_decision::Evaluate(search_decision *orig) +{ + pursuit_search = orig->pursuit_search; + approach_search = orig->approach_search; + VectorCopy(orig->pursuit_dir, pursuit_dir); + last_fired_time = orig->last_fired_time; + VectorCopy(orig->firedSpot, firedSpot); + VectorCopy(orig->trail1, trail1); + VectorCopy(orig->trail2, trail2); + VectorCopy(orig->trail3, trail3); + + + path_decision::Evaluate(orig); +} + +void search_decision::Read() +{ + char loaded[sizeof(search_decision)]; + + gi.ReadFromSavegame('AISD', loaded, sizeof(search_decision)); + Evaluate((search_decision *)loaded); +} + +void search_decision::Write() +{ + search_decision *savable; + + savable = new search_decision(this); + gi.AppendToSavegame('AISD', savable, sizeof(*this)); + delete savable; +} + +void search_decision::SetInfoForDodge(vec3_t start, vec3_t end) +{ + last_fired_time = level.time; + VectorCopy(start, firedSpot); +} + +/********************************************************************************** + **********************************************************************************/ +retreat_decision::retreat_decision(int priority_root,float timeout) +:path_decision(NULL,priority_root,timeout) +{ + //start with validity at 0--as i lose health, validity rises; priority weighted very heavily by validity + validity = 0; + prev_health = 0; + haveFleeDest = false; + fearIndex = 0; + spookStyle = SPOOK_NOT; + spookTime = 0; + VectorClear(spookCenter); +} + +qboolean retreat_decision::IsAdversary(edict_t &monster, edict_t *otherGuy) +{ + if (monster.ai && monster.ai->GetAbusedByTeam())//when you've been abused, everyone's an enemy. . + { + return true; + } + return (!OnSameTeam(&monster, otherGuy)); +} + +#define SUCCESSFUL_RUN_LEN 1000*1000 +qboolean retreat_decision::IsIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t curPos, vec3_t goalPos, vec3_t moveVec) +{ + vec3_t distFromAttacker; + + blockingEnemy = 0; + + which_ai.Emote(monster, EMOTION_AFRAID, 5.0);//fixme--this decision is too general to do this here!! + + //hey, the important thing is not disappearing in front of the player, don't really care about path_goalentity; right? --sfs + if(level.sight_client) + { + VectorSubtract(level.sight_client->s.origin, monster.s.origin, distFromAttacker); + + if(VectorLengthSquared(distFromAttacker) > SUCCESSFUL_RUN_LEN) + { + haveFleeDest = true; + return true; + } + } + + if(fearIndex > .7) + { + return true; + } + + if((spookStyle == SPOOK_EXPLOSIVE || spookStyle == SPOOK_EXPLOSIVE2)) + { + nonIdealReason = NI_TOOCLOSE;//just wander off + } +/* if((which_ai.GetMySkills()->getExplosive() == ESEX_DUCK) && (spookStyle == SPOOK_EXPLOSIVE || spookStyle == SPOOK_EXPLOSIVE2)) + { + nonIdealReason = NI_DUCKING; + } + else if((which_ai.GetMySkills()->getExplosive() == ESEX_DODGE) && spookStyle == SPOOK_EXPLOSIVE) + { + nonIdealReason = NI_DODGING; + }*/ + else + { + nonIdealReason = NI_FLEEING; + } + return false; +} + +void retreat_decision::AddActionIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + if(fearIndex > .7) + { + body_c *body = which_ai.GetBody(); + + if (body) + { + mmove_t *myMove; + + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_CROUCH, &generic_move_crouch_cower_mid); + + if(!myMove) + { + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_CROUCH, &generic_move_crouch_cower_mid2); + } + + if(myMove) + { + AddActionForSequence(which_ai, monster, myMove, goalPos, goalPos, path_goalentity); + } + } + } + else + { + //if i'm doin ok, stand & shoot + // gi.dprintf("validity: %f, goal %s, current %s\n",validity,vtos(goalPos),vtos(monster.s.origin)); + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster,monster.s.origin,goalPos), goalPos, goalPos, path_goalentity); + //consider removing myself here? + if(haveFleeDest) + { + which_ai.SetAttentionLevel(ATTENTION_ESCAPED);//this is my cue that I have gotten the hell out of dodge, as it were + } + } +} + +#define DEATH_SPOOK_TIME 4.0 +#define EXPLODE_TIME 2.0 + +qboolean retreat_decision::Consider(ai_c &which_ai, edict_t &monster) +{ +// vec3_t gohere; + +#ifdef _DEBUG + decName = "retreatdecision"; +#endif + + if(which_ai.GetPriority() != PRIORITY_HIGH) + { + fearIndex = 0; + return false;//if we're not so important anymore, disregard our previous fleeing + } + + //update where i'm going--goal position is opposite of where i'll be going + SetGoalPosition(which_ai, monster); + + if (!prev_health||level.time-path_goal_updatedtime>90) + { + prev_health = monster.health; + validity = 0; + priority = 1; + fearIndex = 0; + return false; + } + + //if i'm marked to hold position, don't bother with any of this + if (monster.spawnflags & SPAWNFLAG_HOLD_POSITION) + { + validity = 0.0; + } + + sensedEntInfo_t sensed_client, sensed_monster; + which_ai.GetSensedClientInfo(smask_all, sensed_client); + which_ai.GetSensedMonsterInfo(smask_all, sensed_monster); + + //fixme - readd later +/* if(spookStyle == SPOOK_DEAD_FRIEND && level.time - spookTime < DEATH_SPOOK_TIME && gi.irand(0,1) && (!(monster.spawnflags & SPAWNFLAG_HOLD_POSITION))) + {//my friend died, so I react + validity=1.0f; + priority = 4.9;//? + } + else*/ if((spookStyle == SPOOK_EXPLOSIVE || spookStyle == SPOOK_EXPLOSIVE2) && level.time - spookTime < EXPLODE_TIME && (!(monster.spawnflags & SPAWNFLAG_HOLD_POSITION))) + {//I am afraid of explosives + validity=1.0f; + priority = 4.9; + } + else + { + validity = 1.0f; + priority = 4.9; + if ((which_ai.HasHadTarget())&& + (which_ai.GetBody() && which_ai.GetBody()->GetRightHandWeapon(monster)==ATK_NOTHING))//do I have someone to run away from? + { + validity=1.0f; + priority = 4.9;//? + } + else + { + priority = 1.0; + } + } + + fearIndex -= .003; + if(fearIndex < 0) + { + fearIndex = 0; + } + + //lowest possible priority should be lower than path_decision's lowest --sfs + //priority = 1.9+(floor(8*validity+0.5) * (which_ai.GetMySkills()->getCowardice()+0.5)); + + //if decision can time out, and its time has expired, then let ai get rid of it + return IsTimedOut(); +} + +void retreat_decision::AddFear(float amount, vec3_t center) +{ + if(amount >= spookStyle) + { + spookTime = level.time; + spookStyle = amount; + VectorCopy(center, spookCenter); + } +} + +void retreat_decision::SetInfoForDodge(vec3_t start, vec3_t end) +{ // getting shot at is frightening... + if(fearIndex < 1.0) + { + fearIndex += .4; + if(fearIndex >= 1.0) + { + fearIndex = 1.0; + } + } +} + +qboolean retreat_decision::GetGoalPosition(ai_c &which_ai, edict_t &monster, vec3_t gohere) +{ + //copy ai's enemy_lastseen_pos into gohere vec + int spooked = 0; + vec3_t avoid; + +/* if(level.time - spookTime < EXPLODE_TIME && (spookStyle == SPOOK_EXPLOSIVE || spookStyle == SPOOK_EXPLOSIVE2)) + { + spooked = 1; + VectorCopy(spookCenter, avoid); + } + else + {*/ + VectorCopy(path_goalpos, avoid); +// } + + if(level.time - spookTime < EXPLODE_TIME && (spookStyle == SPOOK_EXPLOSIVE || spookStyle == SPOOK_EXPLOSIVE2)) + { + VectorCopy(avoid, gohere); + } + else + { + if (gohere)//pass in NULL if just want to know whether we have goal position + { + haveFleeDest = true; + if(OnSameTeam(level.sight_client, &monster)) + { + if (spooked || !aiPoints.getNearestFleePoint(&which_ai.getPathData(), gohere, which_ai.GetTeam(monster))) + { + aiPoints.getReversePath(monster.s.origin, avoid, &which_ai.getPathData(), &which_ai, &monster, which_ai.getTarget()); + VectorCopy(which_ai.getPathData().goPoint, gohere); + + if(which_ai.getPathData().blocked) + { // can't go where I want to :( + VectorCopy(monster.s.origin, gohere); + haveFleeDest = false; + } + } + } + else + { // monsters just run where they can + aiPoints.getReversePath(monster.s.origin, avoid, &which_ai.getPathData(), &which_ai, &monster, which_ai.getTarget()); + VectorCopy(which_ai.getPathData().goPoint, gohere); + + if(which_ai.getPathData().blocked) + { // can't go where I want to :( + VectorCopy(monster.s.origin, gohere); + haveFleeDest = false; + } + + } + } + } + + //check the decision's goalentity for whether i have goal pos, not ai's enemy + if (path_goalentity) + { + //make sure goal entity is still valid + if (!path_goalentity->inuse || path_goalentity->health <= 0 || level.time-path_goal_updatedtime>90) + { + path_goalentity = NULL; +// return false; + return true; + } + return true; + } + else + { +// return false; + return true; + } +} + +retreat_decision::retreat_decision(retreat_decision *orig) +: path_decision(orig) +{ + prev_health = orig->prev_health; + haveFleeDest = orig->haveFleeDest; + fearIndex = orig->fearIndex; + spookStyle = orig->spookStyle; + spookTime = orig->spookTime; + VectorCopy(orig->spookCenter, spookCenter); +} + +void retreat_decision::Evaluate(retreat_decision *orig) +{ + prev_health = orig->prev_health; + haveFleeDest = orig->haveFleeDest; + fearIndex = orig->fearIndex; + spookStyle = orig->spookStyle; + spookTime = orig->spookTime; + VectorCopy(orig->spookCenter, spookCenter); + + path_decision::Evaluate(orig); +} + +void retreat_decision::Read() +{ + char loaded[sizeof(retreat_decision)]; + + gi.ReadFromSavegame('AIRD', loaded, sizeof(retreat_decision)); + Evaluate((retreat_decision *)loaded); +} + +void retreat_decision::Write() +{ + retreat_decision *savable; + + savable = new retreat_decision(this); + gi.AppendToSavegame('AIRD', savable, sizeof(*this)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ + +dodge_decision::dodge_decision(int priority_root, float timeout) +: path_decision(NULL, priority_root, timeout) +{ + //start with validity at 0--as i lose health, validity rises; priority weighted very heavily by validity + validity = 0; + prev_health = 0; + last_dodge_time = level.time; + last_shotat_time = level.time; + dodgeSide = 0; + + VectorClear(shotStart); + VectorClear(shotEnd); +} + +#define ROLL_DIST 64 + +qboolean dodge_decision::Consider(ai_c &which_ai, edict_t &monster) +{ +// vec3_t gohere; + + body_c *the_body=which_ai.GetBody(); + +#ifdef _DEBUG + decName = "dodgedecision"; +#endif + + if (which_ai.GetBody()) + { + if (which_ai.GetBody()->IsMovementImpeded()) + { + priority = .1; + return IsTimedOut(); + } + } + + if(monster.spawnflags & SPAWNFLAG_HOLD_POSITION) + { + priority = .1; + return IsTimedOut(); + } + + if(!which_ai.getTarget()) + { + priority = .1; + return IsTimedOut(); + } + + SetGoalPosition(which_ai, monster); + + if(level.time < last_dodge_time + 3.0) + { + priority = .1; + } + else if(last_shotat_time < level.time - .3) + { + priority = .1; + } + else if(path_goal_updatedtime + .2 < level.time) + { + priority = .1; + } + else if(gi.flrand(0, 1) > which_ai.GetMySkills()->getDodge() * game.playerSkills.getDodge()) + { // this allows us to specify how much a particular guy will roll + if (the_body && the_body->GetMove() && the_body->GetMove()->suggested_action != ACTCODE_PAIN) + { +// the_body->VoiceSound("duck", monster, 0); + } + priority = .1; + last_shotat_time = 0;//so we don't get delayed dodging + } + else + { + vec3_t angs; + vec3_t fwd, right, up; + vec3_t shotDir; + + if (the_body && the_body->GetMove() && the_body->GetMove()->suggested_action != ACTCODE_PAIN) + { +// the_body->VoiceSound("duck", monster, 0); + } + + which_ai.GetAimAngles(angs); + AngleVectors(angs, fwd, right, up); + + VectorSubtract(monster.s.origin, shotStart, shotDir); + VectorNormalize(shotDir); + + if(DotProduct(shotDir, fwd) > -.707) + { // cosine of 45 degrees + priority = .1; + } + else + { + vec3_t sideDir; + + VectorSubtract(shotEnd, shotStart, sideDir); + float temp = sideDir[1]; + sideDir[1] = sideDir[0]; + sideDir[0] = -temp; + + vec3_t myDir; + VectorSubtract(monster.s.origin, shotStart, myDir); + + if(DotProduct(sideDir, myDir) > 0) + { + dodgeSide = -1; + } + else + { + dodgeSide = 1; + } + + vec3_t rollEnd; + + VectorMA(monster.s.origin, dodgeSide * -ROLL_DIST, right, rollEnd); + + trace_t tr; + vec3_t min = {-16, -16, -16}; + vec3_t max = {16, 16, 16}; + + gi.trace(monster.s.origin, min, max, rollEnd, &monster, MASK_SOLID, &tr); + + if(tr.fraction < 1.0) + { + dodgeSide = 0; + + VectorMA(monster.s.origin, ROLL_DIST, fwd, rollEnd); + gi.trace(monster.s.origin, min, max, rollEnd, &monster, MASK_SOLID, &tr); + + if(tr.fraction < 1.0) + { + dodgeSide = 666;//mark this for below + } + } + + if(dodgeSide != 666)//hehe + { + priority = 4; + } + else + { + priority = .1; + last_shotat_time = 0;//so we don't get delayed dodging + } + } + } + + //if decision can time out, and its time has expired, then let ai get rid of it + return IsTimedOut(); +} + + +void dodge_decision::AddAction(ai_c &which_ai, edict_t &monster) +{//go exactly opposite of where my normal pursue would take me + last_dodge_time = level.time; + + //ick? will this screw guys up? dunno my path_goalpos here... + + if (path_goalentity && (path_goalentity->ai || path_goalentity->client) && IsAdversary(monster, path_goalentity)) + { + which_ai.SetTargetTime(path_goal_updatedtime, path_goalentity, path_goalpos); + } + + if (path_nextpoint.valid) + { + if(AddSpecialPathAction(which_ai, monster)) + { + return; + } + } + else + { + //fixme: this has been changed to allow jumps, but goalpos should be adjusted in that case as well + vec3_t dodgeGoal; + mmove_t *dodgeMove; + + if(path_goalentity) + { + VectorCopy(path_goalentity->s.origin, dodgeGoal); + } + else + { + VectorCopy(monster.s.origin, dodgeGoal); + } + dodgeMove=GetSequenceForDodge(which_ai, monster, dodgeGoal, dodgeGoal, path_goalentity, 0, dodgeSide); + if (dodgeMove && dodgeMove->actionFlags&ACTFLAG_BACKUP) + { + which_ai.GetAimVector(dodgeGoal); + VectorInverse(dodgeGoal); + VectorScale(dodgeGoal,200.0f,dodgeGoal); + VectorAdd(dodgeGoal,monster.s.origin,dodgeGoal); + } + AddActionForSequence(which_ai, monster, dodgeMove, dodgeGoal, dodgeGoal); + } + + last_dodge_time = level.time; +} + +void dodge_decision::ActionCompleted(action_c &which_action, ai_c &which_ai, edict_t &monster, float percent_success) +{//go to next node in path, or set up temp goal for avoidance +// edict_t *oldtarget = path_nextpoint; + + if (which_action.Type() == atype_attack)//update validity of attacking here. + { + return; + } + + //based on success of this last action, update how valid this decision is. + UpdateValidity(percent_success); + + //action completed successfully--go to next waypoint (no matter if i'm not following a path) + if (percent_success > 0.25) + { + NextPointInPath(which_ai, monster, monster.s.origin); + } + //action completed unsuccessfully--don't bother setting up avoidance points + else + { + NextPointInPath(which_ai, monster, monster.s.origin); +// PerformAvoidance(which_ai, monster); + } +} + +dodge_decision::dodge_decision(dodge_decision *orig) +: path_decision(orig) +{ + validity = orig->validity; + prev_health = orig->prev_health; + last_dodge_time = orig->last_dodge_time; + last_shotat_time = orig->last_shotat_time; + dodgeSide = 0; + + VectorCopy(orig->shotStart, shotStart); + VectorCopy(orig->shotEnd, shotEnd); +} + +void dodge_decision::Evaluate(dodge_decision *orig) +{ + validity = orig->validity; + prev_health = orig->prev_health; + last_dodge_time = orig->last_dodge_time; + last_shotat_time = orig->last_shotat_time; + dodgeSide = 0; + + VectorCopy(orig->shotStart, shotStart); + VectorCopy(orig->shotEnd, shotEnd); + + path_decision::Evaluate(orig); +} + +void dodge_decision::Read() +{ + char loaded[sizeof(dodge_decision)]; + + gi.ReadFromSavegame('AIDD', loaded, sizeof(dodge_decision)); + Evaluate((dodge_decision *)loaded); +} + +void dodge_decision::Write() +{ + dodge_decision *savable; + + savable = new dodge_decision(this); + gi.AppendToSavegame('AIDD', savable, sizeof(*this)); + delete savable; +} + +void dodge_decision::SetInfoForDodge(vec3_t start, vec3_t end) +{ + last_shotat_time = level.time; + + VectorCopy(start, shotStart); + VectorCopy(end, shotEnd); +} + +/********************************************************************************** + **********************************************************************************/ +scripted_decision::scripted_decision(edict_t *goalent, int priority_root, float timeout, edict_t* ScriptOwner) +:path_decision(goalent,priority_root,timeout) +{ + scriptDone=false; + ScriptEnt=ScriptOwner; + self=NULL; + ignorePreferred =false; + orderStartTime=level.time; + lastMove = NULL; + VectorClear(oldPosition); + VectorCopy(vec3_up, actDestDir); + VectorClear(actDest); +} + + +bool scripted_decision::MatchScriptEnt(edict_t* Entity) +{ + if (Entity == ScriptEnt) + { + return true; + } + return false; +} + +void scripted_decision::ActionCompleted(action_c &which_action, ai_c &which_ai, edict_t &monster, float percent_success) +{ + // if there is a variable to be signaled, signal it! +// if (which_action.GetSignalEvent()) +// { +// which_action.SetSignalEventState(true); // signal it! +// } + path_decision::ActionCompleted(which_action, which_ai, monster, percent_success); + self = &monster; + + list::iterator curOrder = orders.begin(); + + if (curOrder==orders.end()) + { + return; + } + + qboolean isCloseEnoughToDest=false; + + + // kef -- trying desperately to clean up these boolean checks to the point where + //a rational individual can actually debug them + + bool bKillOrder = (*curOrder)->kill, + bTimedOut = (level.time >= (*curOrder)->holdTime+orderStartTime), + bShootAttack = which_action.GetClassCode()==SHOOT_ATTACK_ACTION, + bRunningMeleeAttack = which_action.GetClassCode()==RUNNING_MELEE_ATTACK_ACTION, + bPreferredMove = !!(*curOrder)->preferredMove, + bActCodeFall = (*curOrder)->actionType==ACTCODE_FALL, + bActCodeJump = (*curOrder)->actionType==ACTCODE_JUMP, + bActCodeMove = (*curOrder)->actionType==ACTCODE_MOVE, + bFullAnim = bPreferredMove ? !!((*curOrder)->preferredMove->actionFlags & ACTFLAG_FULLANIM) : false, + bAnimFinished = which_ai.GetBody() ? !!which_ai.GetBody()->IsAnimationFinished() : false, + bAnimateHold = !!((*curOrder)->flags & ANIMATE_HOLD); + + + if ((*curOrder)->actionType==ACTCODE_MOVE) + { + vec3_t distToDest; + float closeEnough = 121.0; + + if (ignorePreferred)//been encountering problems... + { + closeEnough=monster.mins[0]*monster.mins[0]+monster.mins[1]*monster.mins[1]; + } + + VectorSubtract(actDest, monster.s.origin, distToDest); + distToDest[2]=0; + if (VectorLengthSquared(distToDest)SignalEvent) + { + (*curOrder)->SignalEvent->SetEventState(true); + } + ignorePreferred = false; + orderStartTime = level.time; + lastMove = (*curOrder)->preferredMove; + delete (*curOrder); + orders.erase(curOrder); + VectorCopy(actDest, oldPosition); + curOrder=orders.begin(); + + if (curOrder != orders.end()&&(*curOrder)->Emotion) + { + which_ai.Emote(monster, (emotion_index) (*curOrder)->Emotion, (*curOrder)->holdTime, true); + delete (*curOrder); + orders.erase(curOrder); + curOrder=orders.begin(); + } + + if (curOrder != orders.end()) + { + if ((*curOrder)->absoluteDest) + { + VectorCopy((*curOrder)->destVec, actDest); + } + else + { + VectorAdd((*curOrder)->destVec, monster.s.origin, actDest); + } + actDest[2]=monster.s.origin[2]; + VectorSubtract(actDest, monster.s.origin, actDestDir); + VectorNormalize(actDestDir); +// gi.dprintf("new actdest: %4.3f %4.3f %4.3f; my pos: %4.3f %4.3f %4.3f\n",actDest[0],actDest[1],actDest[2],monster.s.origin[0],monster.s.origin[1],monster.s.origin[2]); + } + } + //hey, something's wrong! remember that i hit stuff... + else if (percent_success < 0.5) + { + ignorePreferred = true; + } +} + +void scripted_decision::Perform(ai_c &which_ai, edict_t &monster) +{ + + if (orders.size()>0) + { + list::iterator tcurOrder = orders.begin(); + if (tcurOrder != orders.end()&&(*tcurOrder)->Emotion) + { + which_ai.Emote(monster, (emotion_index) (*tcurOrder)->Emotion, (*tcurOrder)->holdTime, true); + delete (*tcurOrder); + orders.erase(tcurOrder); + tcurOrder=orders.begin(); + } + } + + if(ai_dumb->value) + { + fxRunner.exec("scripted", &monster); + } + + if (orders.size()<=0) + { + if(ai_dumb->value) + { + fxRunner.exec("confusion", &monster); + } + +// gi.dprintf("Script decision has run out of instructions--standing like an idiot!\n"); + + mmove_t *idiotMove = &generic_move_stand; + + //i just finished up a move that's good for idling in... + if (lastMove && lastMove->bodyPosition == BODYPOS_IDLE && lastMove->actionFlags & ACTFLAG_LOOPANIM) + { + idiotMove = lastMove; + } + //i'm in the dark here--i'll just stand around and breathe... + else + { + if (which_ai.GetBody()) + { + // 1/3/00 kef -- using a different anim when idling inbetween talking stints + if (which_ai.GetBody()->GetMove() && + (which_ai.GetBody()->GetMove()->bodyPosition == BODYPOS_TALKING)) + { // I was talking, so let's go to std_ietalkpose_n_a_n + idiotMove = &generic_move_talkpose; + } + else + { + switch (which_ai.GetBody()->GetRightHandWeapon(monster)) + { + case ATK_ROCKET: + idiotMove = &generic_move_staim_l; + break; + case ATK_ASSAULTRIFLE: + case ATK_SNIPER: + case ATK_AUTOSHOTGUN: + case ATK_MACHINEGUN: + case ATK_SHOTGUN: + case ATK_MICROWAVE: + case ATK_MICROWAVE_ALT: + case ATK_FLAMEGUN: + case ATK_DEKKER: + idiotMove = &generic_move_stand_mrs; + break; + default: + break; + } + } + } + } + + mmove_t *realIdiotMove = GetSequenceForStand(which_ai, monster, vec3_origin, vec3_origin, idiotMove/*NULL*/, 0); + + if (idiotMove && realIdiotMove && idiotMove!=realIdiotMove) + { + gi.dprintf("Botched idiocy! Couldn't set %s, using %s", idiotMove->ghoulSeqName, realIdiotMove->ghoulSeqName); + } + + AddActionForSequence(which_ai, monster, realIdiotMove, + vec3_origin, vec3_origin, NULL, NULL); + return; + } + list::iterator curOrder = orders.begin(); + mmove_t *prefMove; + + //if i just finished doing a specific stand action with no hold value, consider it finished + if (((*curOrder)->preferredMove && (*curOrder)->actionType==ACTCODE_STAND) && !((*curOrder)->flags & ANIMATE_HOLD) && + which_ai.GetBody() && ((*curOrder)->preferredMove==which_ai.GetBody()->GetMove())&& + (which_ai.GetBody()->IsAnimationFinished())) + { + if ((*curOrder)->SignalEvent) + { + (*curOrder)->SignalEvent->SetEventState(true); + } + ignorePreferred = false; + orderStartTime = level.time; + lastMove = (*curOrder)->preferredMove; + delete (*curOrder); + orders.erase(curOrder); + VectorCopy(actDest, oldPosition); + curOrder=orders.begin(); + + if (curOrder != orders.end()&&(*curOrder)->Emotion) + { + which_ai.Emote(monster, (emotion_index) (*curOrder)->Emotion, (*curOrder)->holdTime, true); + delete (*curOrder); + orders.erase(curOrder); + curOrder=orders.begin(); + } + + if (curOrder == orders.end()) + { + path_decision::Perform(which_ai, monster); + return; + } + if ((*curOrder)->absoluteDest) + { + VectorCopy((*curOrder)->destVec, actDest); + } + else + { + VectorAdd((*curOrder)->destVec, monster.s.origin, actDest); + } + actDest[2]=monster.s.origin[2]; + VectorSubtract(actDest, monster.s.origin, actDestDir); + VectorNormalize(actDestDir); +// gi.dprintf("new actdest: %4.3f %4.3f %4.3f; my pos: %4.3f %4.3f %4.3f\n",actDest[0],actDest[1],actDest[2],monster.s.origin[0],monster.s.origin[1],monster.s.origin[2]); + } + + if (VectorCompare(oldPosition,vec3_origin)) + { + VectorCopy(monster.s.origin, oldPosition); + + if ((*curOrder)->absoluteDest) + { + VectorCopy((*curOrder)->destVec, actDest); + } + else + { + VectorAdd((*curOrder)->destVec, monster.s.origin, actDest); + } + actDest[2]=monster.s.origin[2]; + VectorSubtract(actDest, monster.s.origin, actDestDir); + VectorNormalize(actDestDir); +// gi.dprintf("new actdest: %4.3f %4.3f %4.3f; my pos: %4.3f %4.3f %4.3f\n",actDest[0],actDest[1],actDest[2],monster.s.origin[0],monster.s.origin[1],monster.s.origin[2]); + } + +// if (ignorePreferred) +// { +// prefMove = NULL; +// } +// else +// { + prefMove = (*curOrder)->preferredMove; +// } + + vec3_t actFace; + + if (VectorCompare((*curOrder)->turnVec, vec3_origin)) + { + VectorClear(actFace); + } + else + { + VectorScale((*curOrder)->turnVec, 1000.0, actFace); + VectorAdd(actFace, monster.s.origin, actFace); + } + + if ((!(*curOrder)->absoluteDest)&&VectorCompare((*curOrder)->destVec,vec3_origin)) + { + VectorCopy(monster.s.origin, actDest); + + VectorCopy(vec3_up, actDestDir); + } + + //if my order has a target entity, set im to be dest and face + edict_t *orderTarget = (*curOrder)->target; + bool bTargetIsANotNull = orderTarget?( (orderTarget->classname && (0 == strcmp(orderTarget->classname, "info_notnull"))) ):false; + // don't bother checking the health if it's an info_notnull. just use it. + if ( orderTarget && orderTarget->inuse && + ((orderTarget->health>0) || bTargetIsANotNull) ) + { + VectorCopy(orderTarget->s.origin, actDest); + VectorCopy(orderTarget->s.origin, actFace); + + VectorSubtract(actDest, monster.s.origin, actDestDir); + VectorNormalize(actDestDir); + } + + vec3_t shortDest; + + VectorSubtract(actDest, monster.s.origin, shortDest); + if (VectorLengthSquared(shortDest)>0) + { + float distToGo=VectorNormalize(shortDest); + //don't break up the motion for jumping actions + if ((distToGo > (*curOrder)->speed*0.2)&&(*curOrder)->actionType!=ACTCODE_JUMP&&(*curOrder)->actionType!=ACTCODE_FALL) + { + distToGo=(*curOrder)->speed*0.2; + } + VectorScale(shortDest, distToGo, shortDest); + } + VectorAdd(shortDest, monster.s.origin, shortDest); + + mmove_t *newMove=GetSequenceForActionCode(which_ai, monster, (*curOrder)->actionType, shortDest, actFace, NULL, prefMove); + + if (prefMove && newMove && newMove != prefMove) + { + if (which_ai.GetBody() && which_ai.GetBody()->IsAvailableSequence(monster, prefMove)) + { + gi.dprintf("script anim: couldn't set %s (but it's available!), using %s!\n", prefMove->ghoulSeqName, newMove->ghoulSeqName); + } + else + { + gi.dprintf("script anim: %s not available for %s, using %s!\n", prefMove->ghoulSeqName, monster.classname, newMove->ghoulSeqName); + } + } + + float actionHoldTime=0.0; + if ((*curOrder)->flags & ANIMATE_HOLD) + { + actionHoldTime=(*curOrder)->holdTime; + } + + //hey! do these still need to be different? COULD add target elsewise... + if ((*curOrder)->kill || (*curOrder)->NullTarget) + { + AddActionForSequence(which_ai, monster, newMove, + shortDest, actFace, (*curOrder)->target, NULL, (*curOrder)->kill, (*curOrder)->NullTarget, actionHoldTime); + } + else + { + AddActionForSequence(which_ai, monster, newMove, + shortDest, actFace, NULL, NULL, false, (*curOrder)->NullTarget, actionHoldTime); + } +} + +void scripted_decision::AddOrder(ai_c &which_ai, edict_t &monster, scriptOrder_c &this_order) +{ + if (orders.size()==0) + { + //if it's an emotion animate command, just do it (only if we're at the top of the orders list currently) + if (this_order.Emotion) + { + which_ai.Emote(monster, (emotion_index) this_order.Emotion, this_order.holdTime, true); + return; + } + + ignorePreferred =false; + orderStartTime=level.time; + VectorClear(oldPosition); + VectorCopy(vec3_up, actDestDir); + VectorClear(actDest); + } + + scriptOrder_c *newOrder = new scriptOrder_c(); + newOrder->absoluteDest=this_order.absoluteDest; + newOrder->actionType=this_order.actionType; + VectorCopy(this_order.destVec,newOrder->destVec); + newOrder->holdTime=this_order.holdTime; + newOrder->preferredMove=this_order.preferredMove; + VectorCopy(this_order.turnVec,newOrder->turnVec); + newOrder->flags=this_order.flags; + newOrder->SignalEvent=this_order.SignalEvent; + newOrder->speed=this_order.speed; + newOrder->target=this_order.target; + newOrder->kill=this_order.kill; + newOrder->NullTarget = this_order.NullTarget; + newOrder->Emotion = this_order.Emotion; + + orders.insert(orders.end(),newOrder); +} + + +scripted_decision::~scripted_decision(void) +{ + list::iterator curOrder = orders.begin(); + path_decision::~path_decision(); + while(curOrder!=orders.end()) + { + delete (*curOrder); + orders.erase(curOrder++); + } +} + +scripted_decision::scripted_decision(scripted_decision *orig) +: path_decision(orig) +{ + scriptDone = orig->scriptDone; + *(int *)&self = GetEdictNum(orig->self); + ignorePreferred = orig->ignorePreferred; + orderStartTime = orig->orderStartTime; + VectorCopy(orig->oldPosition, oldPosition); + VectorCopy(orig->actDest, actDest); + VectorCopy(orig->actDestDir, actDestDir); + *(int *)&lastMove = GetMmoveNum(orig->lastMove); + *(int *)&ScriptEnt = GetEdictNum(orig->ScriptEnt); +} + +void scripted_decision::Evaluate(scripted_decision *orig) +{ + scriptDone = orig->scriptDone; + self = GetEdictPtr((int)orig->self); + ignorePreferred = orig->ignorePreferred; + orderStartTime = orig->orderStartTime; + VectorCopy(orig->oldPosition, oldPosition); + VectorCopy(orig->actDest, actDest); + VectorCopy(orig->actDestDir, actDestDir); + lastMove = GetMmovePtr((int)orig->lastMove); + ScriptEnt = GetEdictPtr((int)orig->ScriptEnt); + + path_decision::Evaluate(orig); +} + +void scripted_decision::Read() +{ + char loaded[sizeof(scripted_decision)]; + int i; + scriptOrder_c *temp; + int count; + + gi.ReadFromSavegame('AISD', loaded, SCRIPTED_DECISION_END); + Evaluate((scripted_decision *)loaded); + + gi.ReadFromSavegame('AION', &count, sizeof(count)); + if(count) + { + for(i = 0; i < count; i++) + { + temp = new scriptOrder_c(); + temp->Read(); + orders.push_back(temp); + } + } +} + +void scripted_decision::Write() +{ + scripted_decision *savable; + int count; + list::iterator it; + + savable = new scripted_decision(this); + gi.AppendToSavegame('AISD', savable, SCRIPTED_DECISION_END); + delete savable; + + count = orders.size(); + gi.AppendToSavegame('AION', &count, sizeof(count)); + if(count) + { + for(it = orders.begin(); it != orders.end(); it++) + { + (*it)->Write(); + } + } +} + +// -------------------------------------------------------------- + +scriptOrder_c::scriptOrder_c(void) +{ +} + +scriptOrder_c::scriptOrder_c(scriptOrder_c *orig) +{ + *(int *)&preferredMove = GetMmoveNum(orig->preferredMove); + holdTime = orig->holdTime; + VectorCopy(orig->turnVec, turnVec); + VectorCopy(orig->destVec, destVec); + absoluteDest = orig->absoluteDest; + kill = orig->kill; + actionType = orig->actionType; + flags = orig->flags; + *(int *)&SignalEvent = GetEventNum(orig->SignalEvent); + speed = orig->speed; + *(int *)&target = GetEdictNum(orig->target); + NullTarget = orig->NullTarget; + Emotion = orig->Emotion; +} + +void scriptOrder_c::Evaluate(scriptOrder_c *orig) +{ + preferredMove = GetMmovePtr((int)orig->preferredMove); + holdTime = orig->holdTime; + VectorCopy(orig->turnVec, turnVec); + VectorCopy(orig->destVec, destVec); + absoluteDest = orig->absoluteDest; + kill = orig->kill; + actionType = orig->actionType; + flags = orig->flags; + SignalEvent = GetEventPtr((int)orig->SignalEvent); + speed = orig->speed; + target = GetEdictPtr((int)orig->target); + NullTarget = orig->NullTarget; + Emotion = orig->Emotion; +} + +void scriptOrder_c::Read() +{ + char loaded[sizeof(scriptOrder_c)]; + + gi.ReadFromSavegame('SDSO', loaded, sizeof(scriptOrder_c)); + Evaluate((scriptOrder_c *)loaded); +} + +void scriptOrder_c::Write() +{ + scriptOrder_c *savable; + + savable = new scriptOrder_c(this); + gi.AppendToSavegame('SDSO', savable, sizeof(*this)); + delete savable; +} + +// -------------------------------------------------------------- + +base_decision::base_decision(base_decision *orig) +: decision_c(orig) +{ +} + +void base_decision::Evaluate(base_decision *orig) +{ + decision_c::Evaluate(orig); +} + +void base_decision::Read() +{ + char loaded[sizeof(base_decision)]; + + gi.ReadFromSavegame('AIBD', loaded, sizeof(base_decision)); + Evaluate((base_decision *)loaded); +} + +void base_decision::Write() +{ + base_decision *savable; + + savable = new base_decision(this); + gi.AppendToSavegame('AIBD', savable, sizeof(*this)); + delete savable; +} + +// -------------------------------------------------------------- + +pursue_decision::pursue_decision(pursue_decision *orig) +: path_decision(orig) +{ +} + +void pursue_decision::Evaluate(pursue_decision *orig) +{ + path_decision::Evaluate(orig); +} + +void pursue_decision::Read() +{ + char loaded[sizeof(pursue_decision)]; + + gi.ReadFromSavegame('AIPD', loaded, sizeof(pursue_decision)); + Evaluate((pursue_decision *)loaded); +} + +void pursue_decision::Write() +{ + pursue_decision *savable; + + savable = new pursue_decision(this); + gi.AppendToSavegame('AIPD', savable, sizeof(*this)); + delete savable; +} + +// -------------------------------------------------------------- + +dekker1_decision::dekker1_decision(dekker1_decision *orig) +: path_decision(orig) +{ +} + +void dekker1_decision::Evaluate(dekker1_decision *orig) +{ + path_decision::Evaluate(orig); +} + +void dekker1_decision::Read() +{ + char loaded[sizeof(dekker1_decision)]; + + gi.ReadFromSavegame('AIPD', loaded, sizeof(dekker1_decision)); + Evaluate((dekker1_decision *)loaded); +} + +void dekker1_decision::Write() +{ + dekker1_decision *savable; + + savable = new dekker1_decision(this); + gi.AppendToSavegame('AIPD', savable, sizeof(*this)); + delete savable; +} + +qboolean dekker1_decision::Consider(ai_c &which_ai, edict_t &monster) +{ + path_decision::Consider(which_ai, monster); + return (monster.healths.origin, monster.s.origin, toPlayer); + if (VectorNormalize(toPlayer)<70) + { +// gi.dprintf("Welcome to my home page!!!!!!!!I hurt you!\n"); + T_Damage(level.sight_client, &monster, &monster, toPlayer, level.sight_client->s.origin, monster.s.origin, 5, 0, DT_WATERZAP, MOD_MPG, 0.5, 0.5); + } + } + fxRunner.exec("environ/dekarmor1", &monster);//MWAHAHA! I SUCK! --sfs + +// monster.ghoulInst->SetSpeed(gsOne); + path_decision::AddAction(which_ai, monster); +} + +void dekker1_decision::AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + AddDekkerActionNonIdealPosition(which_ai, monster, goalPos, moveVec, 3.0); +} + +void dekker1_decision::AddDekkerActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec, float speed) +{ + vec3_t actionGoal; + float move_dist_sq; + +// move_dist_sq = VectorLengthSquared(moveVec); + move_dist_sq = 26; + + if(which_ai.BeingWatched()) + { + int asdf = 9; + } + + int attack = 1; + + if(nonIdealReason == NI_TOOFAR_SEARCHING) + { + attack = 0; + } + + //no attacking if we're not ready to harm the player + float awakeTimeValue = level.time - which_ai.getFirstTargetTime(); + //if(awakeTimeValue < which_ai.GetMySkills()->getHesitation() && (which_ai.GetStartleability())) + if(awakeTimeValue < which_ai.GetMySkills()->getHesitation() * ((gmonster.GetClosestEnemy() == &monster) ? .5:1))//the closest guy gets to attack quicker + { // we are groggy for a bit when we first arise + attack = 0; + } + + which_ai.GetMiscFlags() &= ~MISC_FLAG_FIRINGBLIND; + + if(nonIdealReason == NI_DODGING) + { + mmove_t *dodgeMove; + + dodgeMove=GetSequenceForDodge(which_ai, monster, goalPos, goalPos, path_goalentity, 0, gi.irand(0,1)?-1:1); + if(dodgeMove) + { + AddActionForSequence(which_ai, monster, dodgeMove, goalPos, goalPos); + return; + } + else + { + nonIdealReason = NI_DUCKING; + } + } + + if(nonIdealReason == NI_DUCKING) + { + body_c *body = which_ai.GetBody(); + + if (body) + { + mmove_t *myMove; + + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_CROUCH, &generic_move_crouch_cower_mid); + + if(myMove) + { + AddActionForSequence(which_ai, monster, myMove, goalPos, goalPos, path_goalentity); + return; + } + else + { + nonIdealReason = NI_FLEEING; + } + } + else + { + nonIdealReason = NI_FLEEING; + } + } + + int fastStrafe = 0; + if(which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_mrs) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_l) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_p)) + { + fastStrafe = 1; + } + + int fastRetreat = 0; + if(which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_mrs) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_p2) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_l)) + { + fastRetreat = 1; + } + + int proceedForward = 1; + + if((25>move_dist_sq) || + (monster.spawnflags & SPAWNFLAG_HOLD_POSITION) || + ((which_ai.GetPriority() != PRIORITY_HIGH)&&(path_goalentity == level.sight_client))) + { + Enemy_Printf(&which_ai, "Non ideal stuck"); + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster,goalPos,goalPos), goalPos, goalPos); + proceedForward = 0; + } + else if(nonIdealReason == NI_TOOCLOSE) + { + proceedForward = 0; + int backup = 0; + vec3_t toAvoid, toTarg, looker; + if(aiPoints.isActive()) + { + aiPoints.getReversePath(monster.s.origin, goalPos, &which_ai.getPathData(), &which_ai, &monster, which_ai.getTarget()); + + if(which_ai.getPathData().blocked) + { // can't go where I want to :( + backup = 0; + } + else + { + Enemy_Printf(&which_ai, "Via %d->%d = %d\n", which_ai.getPathData().curNode, + which_ai.getPathData().nextNode, which_ai.getPathData().finalNode); + + VectorSubtract(which_ai.getPathData().goPoint, monster.s.origin, toAvoid); + toAvoid[2] = 0; + float toAvoidLen = VectorNormalize(toAvoid); +/* if(VectorLength(toAvoid) < .01) + { + VectorCopy(goalPos, actionGoal); + } + else*/ + { + VectorMA(monster.s.origin, speed, toAvoid, actionGoal); + } + + //if(toAvoidLen < .05) + if(toAvoidLen < 10) + { + backup = 0; + } + else + { + if(which_ai.GetMySkills()->testFlag(AIS_NOATTACKONRETREAT) || + (which_ai.GetMove() && ClearShot(which_ai, monster, toAvoid, path_goalentity, which_ai.GetMove()->bbox, actionGoal))) + { // if we can still shoot once we backup, we like this spot - otherwise no + backup = 1; + } + else + { + backup = 0; + } + } + VectorMA(monster.s.origin, speed, toAvoid, actionGoal); + } + } + else + { + backup = 0; + + } + + if(backup) + { + + VectorSubtract(actionGoal, monster.s.origin, toAvoid); + toAvoid[2] = 0; + VectorNormalize(toAvoid); + + AdjustVectorByGuys(&monster, toAvoid); + + which_ai.RequestMoveOutOfWay(toAvoid); + + VectorSubtract(goalPos, monster.s.origin, toTarg); + toTarg[2] = 0; + float distToTarg = VectorNormalize(toTarg); + + if(DotProduct(toAvoid, toTarg) < -.717) + { //move in a direction opposite of where I want to face + if(!fastRetreat) + { + VectorScale(toAvoid, 4.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + } + + VectorScale(toAvoid, -speed, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else if(DotProduct(toAvoid, toTarg) > .717) + { //move in a direction towards where I face + VectorScale(toAvoid, speed, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else + { + if(!fastStrafe) + { + VectorScale(toAvoid, 12.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + } + + //set it to the side now - for strafing + toAvoid[2] = toAvoid[1]; + toAvoid[1] = -toAvoid[0]; + toAvoid[0] = toAvoid[2]; + toAvoid[2] = 0; + + if(DotProduct(toAvoid, toTarg) > 0) + { + VectorScale(toAvoid, speed, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else + { + VectorScale(toAvoid, -speed, looker); + VectorAdd(monster.s.origin, looker, looker); + } + } + + if(aipoints_show->value) + { + paletteRGBA_t col = {250, 250, 250, 250}; + //FX_MakeLine(node[startNode].getPos(), node[nextNode].getPos(), col, 1); + FX_MakeLine(which_ai.getPathData().goPoint, monster.s.origin, col, 1); + FX_MakeRing(which_ai.getPathData().goPoint, 8); + paletteRGBA_t col2 = {0, 0, 0, 250}; + FX_MakeLine(actionGoal, monster.s.origin, col2, 1); + } + + vec3_t testShoot; + + VectorSubtract(goalPos, monster.s.origin, testShoot); + VectorNormalize(testShoot); + VectorMA(monster.s.origin, 64, testShoot, testShoot); + + if(attack && (!which_ai.GetMySkills()->testFlag(AIS_NOATTACKONRETREAT)) && ClearShot(which_ai, monster, testShoot, path_goalentity, which_ai.GetMove()->bbox)) + { + //AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, actionGoal, goalPos, path_goalentity), actionGoal, goalPos, path_goalentity); + AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, actionGoal, looker, path_goalentity), actionGoal, looker, path_goalentity); + } + else + { //just back up a bit - can't shoot from here + //oh dear. gsfMovement is fairly different from gsfAttack... I did not know =/ + if(!fastRetreat) + { + VectorScale(toAvoid, 4.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + } + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,looker), actionGoal, looker); + } + } + else + { + if(attack && ClearShot(which_ai, monster, goalPos, path_goalentity, which_ai.GetMove()->bbox)) + { //can't move, but at least I can shoot! + AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, monster.s.origin, goalPos, path_goalentity), monster.s.origin, goalPos, path_goalentity); + } + else + { //Stand around and do nothing - too close and not clear. Sad. + if(which_ai.GetMySkills()->testFlag(AIS_WONTADVANCE)) + { + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster,goalPos,goalPos), goalPos, goalPos); + } + else + { + proceedForward = 1; + } + } + } + } + + if(blockingEnemy) + { //this is only the case if clearshot is obstructed by another guy + vec3_t dif; + VectorSubtract(goalPos, monster.s.origin, dif); + dif[2] = 0; + float goalDist = VectorNormalize(dif); + + if(goalDist > 1) + { + dif[2] = dif[1]; + dif[1] = dif[0]*-1; + dif[0] = dif[2]; + dif[2] = 0; + + VectorMA(monster.s.origin, 64, dif, dif); + + trace_t tr; + + gi.trace(monster.s.origin, monster.mins, monster.maxs, dif, &monster, MASK_MONSTERSOLID, &tr); + + vec3_t lookSpot; + VectorCopy(goalPos, lookSpot); + + if(nonIdealReason == NI_FLEEING) + { + VectorCopy(dif, lookSpot); + } + + if(tr.fraction > .99 && !tr.allsolid && !tr.startsolid) + { + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,dif,lookSpot), dif, lookSpot); + } + else + { + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster,goalPos,goalPos), goalPos, goalPos); + } + proceedForward = 0; + + if(aipoints_show->value) + { + paletteRGBA_t col = {0, 0, 250, 250}; + //FX_MakeLine(node[startNode].getPos(), node[nextNode].getPos(), col, 1); + FX_MakeLine(dif, monster.s.origin, col, 1); + } + } + } + + if(proceedForward)// if(nonIdealReason == NI_TOOFAR)//make this catchall - why not + { + if(aiPoints.isActive()) + { + aiPoints.getPath(monster.s.origin, goalPos, &which_ai.getPathData(), &which_ai, &monster, 1, which_ai.getTarget()); + +/* vec3_t sep; + float len; + VectorSubtract(which_ai.getPathData().goPoint, monster.s.origin, sep); + len = VectorLength(sep); + + if(nonIdealReason == NI_TOOFAR_SEARCHING && which_ai.getPathData().curNode == which_ai.getPathData().nextNode && len < 48) + { + VectorCopy(monster.s.origin, which_ai.getPathData().goPoint); + }*/ + + Enemy_Printf(&which_ai, "Via %d->%d = %d\n", which_ai.getPathData().curNode, + which_ai.getPathData().nextNode, which_ai.getPathData().finalNode); + + if(which_ai.getPathData().blocked) + { // can't go where I want to :( + if(attack && which_ai.GetMove() && ClearShot(which_ai, monster, goalPos, path_goalentity, which_ai.GetMove()->bbox)) + { + AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, monster.s.origin, goalPos, path_goalentity), monster.s.origin, goalPos, path_goalentity); + } + else + { + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster,goalPos,goalPos), goalPos, goalPos); + } + } + else + { + vec3_t toAvoid, toTarg, looker; + + VectorSubtract(which_ai.getPathData().goPoint, monster.s.origin, toAvoid); + toAvoid[2] = 0; + VectorNormalize(toAvoid); + + VectorScale(toAvoid, speed, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + + VectorSubtract(goalPos, monster.s.origin, toTarg); + toTarg[2] = 0; + float distToTarg = VectorNormalize(toTarg); + + if((nonIdealReason == NI_FLEEING)||(!fastStrafe)||(distToTarg > 448)) + { // good for folks who can't strafe + VectorScale(toAvoid, 40, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else + { + if(DotProduct(toAvoid, toTarg) < -.717) + { + if(!fastRetreat) + { + VectorScale(toAvoid, 4.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + } + + VectorScale(toAvoid, -speed, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else if(DotProduct(toAvoid, toTarg) > .717) + { + VectorScale(toAvoid, speed, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else + { + if(!fastStrafe) + { + VectorScale(toAvoid, 12.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + } + + //set it to the side now - for strafing + toAvoid[2] = toAvoid[1]; + toAvoid[1] = -toAvoid[0]; + toAvoid[0] = toAvoid[2]; + toAvoid[2] = 0; + + if(DotProduct(toAvoid, toTarg) > 0) + { + VectorScale(toAvoid, speed, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else + { + VectorScale(toAvoid, -speed, looker); + VectorAdd(monster.s.origin, looker, looker); + } + +// VectorScale(toAvoid, speed, looker); +// VectorAdd(monster.s.origin, looker, looker); + } + } + + vec3_t dif; + VectorSubtract(monster.s.origin, actionGoal, dif); + dif[2] = 0; + vec3_t dif2; + VectorSubtract(monster.s.origin, goalPos, dif2); + dif2[2] = 0; + if((VectorLengthSquared(dif) > 2)&&((VectorLengthSquared(dif2) > (50*50))||((nonIdealReason == NI_FLEEING)))&&((!which_ai.GetMySkills()->testFlag(AIS_WONTADVANCE))||(nonIdealReason == NI_FLEEING))) + { + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,looker), actionGoal, looker); + } + else + { + if(nonIdealReason == NI_FLEEING) + { //get down an' cower + body_c *body = which_ai.GetBody(); + + if (body) + { + mmove_t *myMove; + + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_CROUCH, &generic_move_crouch_cower_mid); + + if(!myMove) + { + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_CROUCH, &generic_move_crouch_cower_mid2); + } + + if(myMove) + { + AddActionForSequence(which_ai, monster, myMove, goalPos, goalPos, path_goalentity); + } + } + } + else + { + if(attack && ClearShot(which_ai, monster, goalPos, path_goalentity, which_ai.GetMove()->bbox)) + { //can't move, but at least I can shoot! - fixme - some guys shouldn't do this + AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, monster.s.origin, goalPos, path_goalentity), monster.s.origin, goalPos, path_goalentity); + } + else + { + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster,actionGoal,goalPos), actionGoal, goalPos); + } + } + //AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,looker), actionGoal, looker); + } + + if(aipoints_show->value) + { + VectorScale(toAvoid, 40.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + + paletteRGBA_t col = {250, 250, 250, 250}; + paletteRGBA_t col2 = {0, 0, 0, 250}; + //FX_MakeLine(node[startNode].getPos(), node[nextNode].getPos(), col, 1); + FX_MakeLine(which_ai.getPathData().goPoint, monster.s.origin, col, 1); + FX_MakeRing(which_ai.getPathData().goPoint, 4); + FX_MakeLine(actionGoal, monster.s.origin, col2, 1); + } + } + } + else + { + VectorSubtract(goalPos, monster.s.origin, actionGoal); + VectorNormalize(actionGoal); + VectorScale(actionGoal, speed, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,actionGoal), actionGoal, actionGoal); + } + } +} + + +// -------------------------------------------------------------- + +dekker2_decision::dekker2_decision(dekker2_decision *orig) +: dekker1_decision(orig) +{ +} + +void dekker2_decision::Evaluate(dekker2_decision *orig) +{ + dekker1_decision::Evaluate(orig); +} + +void dekker2_decision::Read() +{ + char loaded[sizeof(dekker2_decision)]; + + gi.ReadFromSavegame('AIPD', loaded, sizeof(dekker2_decision)); + Evaluate((dekker2_decision *)loaded); +} + +void dekker2_decision::Write() +{ + dekker2_decision *savable; + + savable = new dekker2_decision(this); + gi.AppendToSavegame('AIPD', savable, sizeof(*this)); + delete savable; +} + +qboolean dekker2_decision::Consider(ai_c &which_ai, edict_t &monster) +{ + dekker1_decision::Consider(which_ai, monster); + return (monster.health<((float)(monster.max_health))*0.75); +} + +void dekker2_decision::AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + AddDekkerActionNonIdealPosition(which_ai, monster, goalPos, moveVec, 100.0); +} + +void dekker2_decision::AddAction(ai_c &which_ai, edict_t &monster) +{ + vec3_t toPlayer; + if (level.sight_client) + { + VectorSubtract(level.sight_client->s.origin, monster.s.origin, toPlayer); + if (VectorNormalize(toPlayer)<70) + { +// gi.dprintf("Welcome to my home page!!!!!!!!I hurt you!\n"); + T_Damage(level.sight_client, &monster, &monster, toPlayer, level.sight_client->s.origin, monster.s.origin, 5, 0, DT_WATERZAP, MOD_MPG, 0.5, 0.5); + } + } + fxRunner.exec("environ/dekarmor1", &monster);//MWAHAHA! I SUCK! --sfs + + monster.ghoulInst->SetSpeed(gs4Over8); + dekker1_decision::AddAction(which_ai, monster); +} + +// -------------------------------------------------------------- + +dekker3_decision::dekker3_decision(dekker3_decision *orig) +: path_decision(orig) +{ + reachedDest=orig->reachedDest; +} + +void dekker3_decision::AddAction(ai_c &which_ai, edict_t &monster) +{ + vec3_t toPlayer; + if (level.sight_client) + { + VectorSubtract(level.sight_client->s.origin, monster.s.origin, toPlayer); + if (VectorNormalize(toPlayer)<70) + { +// gi.dprintf("Welcome to my home page!!!!!!!!I hurt you!\n"); + T_Damage(level.sight_client, &monster, &monster, toPlayer, level.sight_client->s.origin, monster.s.origin, 5, 0, DT_WATERZAP, MOD_MPG, 0.5, 0.5); + } + } + fxRunner.exec("environ/dekarmor1", &monster);//MWAHAHA! I SUCK! --sfs + + monster.ghoulInst->SetSpeed(gsOne); + path_decision::AddAction(which_ai, monster); +} + +void dekker3_decision::Evaluate(dekker3_decision *orig) +{ + reachedDest=orig->reachedDest; + path_decision::Evaluate(orig); +} + +void dekker3_decision::Read() +{ + char loaded[sizeof(dekker3_decision)]; + + gi.ReadFromSavegame('AIPD', loaded, sizeof(dekker3_decision)); + Evaluate((dekker3_decision *)loaded); +} + +void dekker3_decision::Write() +{ + dekker3_decision *savable; + + savable = new dekker3_decision(this); + gi.AppendToSavegame('AIPD', savable, sizeof(*this)); + delete savable; +} + +qboolean dekker3_decision::Consider(ai_c &which_ai, edict_t &monster) +{ + path_decision::Consider(which_ai, monster); + + return reachedDest; +} + +qboolean dekker3_decision::GetGoalPosition(ai_c &which_ai, edict_t &monster, vec3_t gohere) +{ + //copy ai's enemy_lastseen_pos into gohere vec + if (gohere)//pass in NULL if just want to know whether we have goal position + { + VectorCopy(path_goalpos, gohere); + } + + if (!reachedDest) + { + edict_t *curPt = G_Find (NULL, FOFS(classname), "func_Dekker_console"); + + if (curPt) + { + if (gohere) + { + VectorCopy(curPt->s.origin, gohere); + } + } + else + { + return false;//there's no dekker-die position on this map--no fair! + } + } + + //check the decision's goalentity for whether i have goal pos, not ai's enemy + if (path_goalentity) + { + //make sure goal entity is still valid + if ((!path_goalentity->client && !path_goalentity->ai) || !path_goalentity->inuse + || path_goalentity->health <= 0 || level.time-path_goal_updatedtime>PATH_DECISION_LOSETARGETTIME) + { + path_goalentity = NULL; + return false; + } + return true; + } + else + { + return false; + } +} + +qboolean dekker3_decision::IsIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t curPos, vec3_t goalPos, vec3_t moveVec) +{ + + if(!reachedDest) + {//very special case - there guys are always in an ideal position, sort of + edict_t *curPt = G_Find (NULL, FOFS(classname), "func_Dekker_console"); + + if (curPt)//got a die point, keep running toward it until i'm really really close + { + vec3_t toGoal; + float distToGoalSq; + + VectorSubtract(curPt->s.origin, monster.s.origin, toGoal); + toGoal[2]=0;//ignore vertical diff + distToGoalSq=VectorLengthSquared(toGoal); + if (distToGoalSq > 8100) + { + nonIdealReason = NI_TOOFAR;//too far, keep runnin + return false; + } + } + reachedDest=true;//passed the far-away-from-die-point test--i'm either close enough, or it doesn't exist. + edict_t *curGun; + + //set up the enthralling dekker-types-something boss stage +// curGun = G_PickTarget ("consolepoint"); +// if (curGun && !strcmp(curGun->classname, "point_combat")) +// { +// monster.ai->NewDecision(new pathcombat_decision(curGun), &monster); +// monster.ai->SetStartleability(false); +// } + + if (curGun = G_Find (NULL, FOFS(targetname), "dekkergun1")) + { + curGun->use(curGun, &monster, &monster); + } + if (curGun = G_Find (NULL, FOFS(targetname), "dekkergun2")) + { + curGun->use(curGun, &monster, &monster); + } + if (curGun = G_Find (NULL, FOFS(targetname), "dekkergun3")) + { + curGun->use(curGun, &monster, &monster); + } +// if (curGun = G_Find (NULL, FOFS(targetname), "dekkerclip")) +// { +// curGun->use(curGun, &monster, &monster); +// } + } + +// return path_decision::IsIdealPosition(which_ai, monster, curPos, goalPos, moveVec); + return false; +} + +void dekker3_decision::AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + vec3_t actionGoal; + float move_dist_sq; + +// move_dist_sq = VectorLengthSquared(moveVec); + move_dist_sq = 26; + + if(which_ai.BeingWatched()) + { + int asdf = 9; + } + + int attack = 1; + + if(nonIdealReason == NI_TOOFAR_SEARCHING) + { + attack = 0; + } + + //no attacking if we're not ready to harm the player + float awakeTimeValue = level.time - which_ai.getFirstTargetTime(); + if(awakeTimeValue < which_ai.GetMySkills()->getHesitation() * ((gmonster.GetClosestEnemy() == &monster) ? .5:1))//the closest guy gets to attack quicker + { // we are groggy for a bit when we first arise + attack = 0; + } + + which_ai.GetMiscFlags() &= ~MISC_FLAG_FIRINGBLIND; + + if(nonIdealReason == NI_DODGING) + { + mmove_t *dodgeMove; + + dodgeMove=GetSequenceForDodge(which_ai, monster, goalPos, goalPos, path_goalentity, 0, gi.irand(0,1)?-1:1); + if(dodgeMove) + { + AddActionForSequence(which_ai, monster, dodgeMove, goalPos, goalPos); + return; + } + else + { + nonIdealReason = NI_DUCKING; + } + } + + if(nonIdealReason == NI_DUCKING) + { + body_c *body = which_ai.GetBody(); + + if (body) + { + mmove_t *myMove; + + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_CROUCH, &generic_move_crouch_cower_mid); + + if(myMove) + { + AddActionForSequence(which_ai, monster, myMove, goalPos, goalPos, path_goalentity); + return; + } + else + { + nonIdealReason = NI_FLEEING; + } + } + else + { + nonIdealReason = NI_FLEEING; + } + } + + int fastStrafe = 0; + if(which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_mrs) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_l) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_p)) + { + fastStrafe = 1; + } + + int fastRetreat = 0; + if(which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_mrs) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_p2) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_l)) + { + fastRetreat = 1; + } + + int proceedForward = 1; + + + if(aiPoints.isActive()) + { + bool doPath=true; + aiPoints.getPath(monster.s.origin, goalPos, &which_ai.getPathData(), &which_ai, &monster, 1, which_ai.getTarget()); + + + Enemy_Printf(&which_ai, "Via %d->%d = %d\n", which_ai.getPathData().curNode, + which_ai.getPathData().nextNode, which_ai.getPathData().finalNode); + + if(which_ai.getPathData().blocked) + { // can't go where I want to :( +// if(attack && which_ai.GetMove() && ClearShot(which_ai, monster, goalPos, path_goalentity, which_ai.GetMove()->bbox)) +// { +// AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, monster.s.origin, goalPos, path_goalentity), monster.s.origin, goalPos, path_goalentity); +// doPath=false; +// } + } + if (doPath) + { + vec3_t toAvoid, toTarg, looker; + + VectorSubtract(which_ai.getPathData().goPoint, monster.s.origin, toAvoid); + toAvoid[2] = 0; + VectorNormalize(toAvoid); + + VectorScale(toAvoid, 100.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + + VectorSubtract(goalPos, monster.s.origin, toTarg); + toTarg[2] = 0; + float distToTarg = VectorNormalize(toTarg); + + if((nonIdealReason == NI_FLEEING)||(!fastStrafe)||(distToTarg > 448)) + { // good for folks who can't strafe + VectorScale(toAvoid, 40, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else + { + VectorScale(toAvoid, 2440, looker); + VectorAdd(monster.s.origin, looker, looker); + } + + vec3_t dif; + VectorSubtract(monster.s.origin, actionGoal, dif); + dif[2] = 0; + vec3_t dif2; + VectorSubtract(monster.s.origin, goalPos, dif2); + dif2[2] = 0; + if((VectorLengthSquared(dif) > 2)&&((VectorLengthSquared(dif2) > (50*50))||((nonIdealReason == NI_FLEEING)))&&((!which_ai.GetMySkills()->testFlag(AIS_WONTADVANCE))||(nonIdealReason == NI_FLEEING))) + { + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,looker), actionGoal, looker); + } + else + { + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,looker), actionGoal, looker); + } + + if(aipoints_show->value) + { + VectorScale(toAvoid, 40.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + + paletteRGBA_t col = {250, 250, 250, 250}; + paletteRGBA_t col2 = {0, 0, 0, 250}; + FX_MakeLine(which_ai.getPathData().goPoint, monster.s.origin, col, 1); + FX_MakeRing(which_ai.getPathData().goPoint, 4); + FX_MakeLine(actionGoal, monster.s.origin, col2, 1); + } + } + } + else + { + VectorSubtract(goalPos, monster.s.origin, actionGoal); + VectorNormalize(actionGoal); + VectorScale(actionGoal, 100.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,actionGoal), actionGoal, actionGoal); + } +} + + +// -------------------------------------------------------------- + +dekker4_decision::dekker4_decision(dekker4_decision *orig) +: path_decision(orig) +{ + reachedDest=orig->reachedDest; +} + +void dekker4_decision::AddAction(ai_c &which_ai, edict_t &monster) +{ + vec3_t toPlayer; + if (level.sight_client) + { + VectorSubtract(level.sight_client->s.origin, monster.s.origin, toPlayer); + if (VectorNormalize(toPlayer)<70) + { +// gi.dprintf("Welcome to my home page!!!!!!!!I hurt you!\n"); + T_Damage(level.sight_client, &monster, &monster, toPlayer, level.sight_client->s.origin, monster.s.origin, 5, 0, DT_WATERZAP, MOD_MPG, 0.5, 0.5); + } + } + fxRunner.exec("environ/dekarmor1", &monster);//MWAHAHA! I SUCK! --sfs + + monster.ghoulInst->SetSpeed(gsOne); + path_decision::AddAction(which_ai, monster); +} + +void dekker4_decision::Evaluate(dekker4_decision *orig) +{ + reachedDest=orig->reachedDest; + path_decision::Evaluate(orig); +} + +void dekker4_decision::Read() +{ + char loaded[sizeof(dekker3_decision)]; + + gi.ReadFromSavegame('AIPD', loaded, sizeof(dekker3_decision)); + Evaluate((dekker4_decision *)loaded); +} + +void dekker4_decision::Write() +{ + dekker4_decision *savable; + + savable = new dekker4_decision(this); + gi.AppendToSavegame('AIPD', savable, sizeof(*this)); + delete savable; +} + +qboolean dekker4_decision::Consider(ai_c &which_ai, edict_t &monster) +{ + path_decision::Consider(which_ai, monster); + + return false; +} + +qboolean dekker4_decision::GetGoalPosition(ai_c &which_ai, edict_t &monster, vec3_t gohere) +{ + //copy ai's enemy_lastseen_pos into gohere vec + if (gohere)//pass in NULL if just want to know whether we have goal position + { + VectorCopy(path_goalpos, gohere); + } + + if (!reachedDest) + { + edict_t *curPt = G_Find (NULL, FOFS(classname), "func_Dekker_diehere"); + + if (curPt) + { + if (gohere) + { + VectorCopy(curPt->s.origin, gohere); + } + } + else + { + return false;//there's no dekker-die position on this map--no fair! + } + } + + //check the decision's goalentity for whether i have goal pos, not ai's enemy + if (path_goalentity) + { + //make sure goal entity is still valid + if ((!path_goalentity->client && !path_goalentity->ai) || !path_goalentity->inuse + || path_goalentity->health <= 0 || level.time-path_goal_updatedtime>PATH_DECISION_LOSETARGETTIME) + { + path_goalentity = NULL; + return false; + } + return true; + } + else + { + return false; + } +} + +qboolean dekker4_decision::IsIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t curPos, vec3_t goalPos, vec3_t moveVec) +{ + + if(!reachedDest) + {//very special case - there guys are always in an ideal position, sort of + edict_t *curPt = G_Find (NULL, FOFS(classname), "func_Dekker_diehere"); + + if (curPt)//got a die point, keep running toward it until i'm really really close + { + vec3_t toGoal; + float distToGoalSq; + + VectorSubtract(curPt->s.origin, monster.s.origin, toGoal); + toGoal[2]=0;//ignore vertical diff + distToGoalSq=VectorLengthSquared(toGoal); + if (distToGoalSq > 4900) + { + nonIdealReason = NI_TOOFAR;//too far, keep runnin + return false; + } + } + reachedDest=true;//passed the far-away-from-die-point test--i'm either close enough, or it doesn't exist. + monster.spawnflags |= SPAWNFLAG_HOLD_POSITION; +// edict_t *curGun; +// if (curGun = G_Find (NULL, FOFS(targetname), "dekkergun1")) +// { +// curGun->use(curGun, &monster, &monster); +// } +// if (curGun = G_Find (NULL, FOFS(targetname), "dekkergun2")) +// { +// curGun->use(curGun, &monster, &monster); +// } +// if (curGun = G_Find (NULL, FOFS(targetname), "dekkergun3")) +// { +// curGun->use(curGun, &monster, &monster); +// } +// if (curGun = G_Find (NULL, FOFS(targetname), "dekkerclip")) +// { +// curGun->use(curGun, &monster, &monster); +// } + } + + return path_decision::IsIdealPosition(which_ai, monster, curPos, goalPos, moveVec); + +} + +void dekker4_decision::AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + vec3_t actionGoal; + float move_dist_sq; + +// move_dist_sq = VectorLengthSquared(moveVec); + move_dist_sq = 26; + + if(which_ai.BeingWatched()) + { + int asdf = 9; + } + + int attack = 1; + + if(nonIdealReason == NI_TOOFAR_SEARCHING) + { + attack = 0; + } + + //no attacking if we're not ready to harm the player + float awakeTimeValue = level.time - which_ai.getFirstTargetTime(); + if(awakeTimeValue < which_ai.GetMySkills()->getHesitation() * ((gmonster.GetClosestEnemy() == &monster) ? .5:1))//the closest guy gets to attack quicker + { // we are groggy for a bit when we first arise + attack = 0; + } + + which_ai.GetMiscFlags() &= ~MISC_FLAG_FIRINGBLIND; + + if(nonIdealReason == NI_DODGING) + { + mmove_t *dodgeMove; + + dodgeMove=GetSequenceForDodge(which_ai, monster, goalPos, goalPos, path_goalentity, 0, gi.irand(0,1)?-1:1); + if(dodgeMove) + { + AddActionForSequence(which_ai, monster, dodgeMove, goalPos, goalPos); + return; + } + else + { + nonIdealReason = NI_DUCKING; + } + } + + if(nonIdealReason == NI_DUCKING) + { + body_c *body = which_ai.GetBody(); + + if (body) + { + mmove_t *myMove; + + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_CROUCH, &generic_move_crouch_cower_mid); + + if(myMove) + { + AddActionForSequence(which_ai, monster, myMove, goalPos, goalPos, path_goalentity); + return; + } + else + { + nonIdealReason = NI_FLEEING; + } + } + else + { + nonIdealReason = NI_FLEEING; + } + } + + int fastStrafe = 0; + if(which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_mrs) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_l) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_p)) + { + fastStrafe = 1; + } + + int fastRetreat = 0; + if(which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_mrs) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_p2) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_l)) + { + fastRetreat = 1; + } + + int proceedForward = 1; + + + if(aiPoints.isActive()) + { + bool doPath=true; + aiPoints.getPath(monster.s.origin, goalPos, &which_ai.getPathData(), &which_ai, &monster, 1, which_ai.getTarget()); + + + Enemy_Printf(&which_ai, "Via %d->%d = %d\n", which_ai.getPathData().curNode, + which_ai.getPathData().nextNode, which_ai.getPathData().finalNode); + + if(which_ai.getPathData().blocked) + { // can't go where I want to :( +// if(attack && which_ai.GetMove() && ClearShot(which_ai, monster, goalPos, path_goalentity, which_ai.GetMove()->bbox)) +// { +// AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, monster.s.origin, goalPos, path_goalentity), monster.s.origin, goalPos, path_goalentity); +// doPath=false; +// } + } + if (doPath) + { + vec3_t toAvoid, toTarg, looker; + + VectorSubtract(which_ai.getPathData().goPoint, monster.s.origin, toAvoid); + toAvoid[2] = 0; + VectorNormalize(toAvoid); + + VectorScale(toAvoid, 100.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + + VectorSubtract(goalPos, monster.s.origin, toTarg); + toTarg[2] = 0; + float distToTarg = VectorNormalize(toTarg); + + if((nonIdealReason == NI_FLEEING)||(!fastStrafe)||(distToTarg > 448)) + { // good for folks who can't strafe + VectorScale(toAvoid, 40, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else + { + VectorScale(toAvoid, 2440, looker); + VectorAdd(monster.s.origin, looker, looker); + } + + vec3_t dif; + VectorSubtract(monster.s.origin, actionGoal, dif); + dif[2] = 0; + vec3_t dif2; + VectorSubtract(monster.s.origin, goalPos, dif2); + dif2[2] = 0; + if((VectorLengthSquared(dif) > 2)&&((VectorLengthSquared(dif2) > (50*50))||((nonIdealReason == NI_FLEEING)))&&((!which_ai.GetMySkills()->testFlag(AIS_WONTADVANCE))||(nonIdealReason == NI_FLEEING))) + { + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,looker), actionGoal, looker); + } + else + { + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,looker), actionGoal, looker); + } + + if(aipoints_show->value) + { + VectorScale(toAvoid, 40.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + + paletteRGBA_t col = {250, 250, 250, 250}; + paletteRGBA_t col2 = {0, 0, 0, 250}; + FX_MakeLine(which_ai.getPathData().goPoint, monster.s.origin, col, 1); + FX_MakeRing(which_ai.getPathData().goPoint, 4); + FX_MakeLine(actionGoal, monster.s.origin, col2, 1); + } + } + } + else + { + VectorSubtract(goalPos, monster.s.origin, actionGoal); + VectorNormalize(actionGoal); + VectorScale(actionGoal, 100.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,actionGoal), actionGoal, actionGoal); + } +} + +/* +void dekker4_decision::AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec) +{ + vec3_t actionGoal; + float move_dist_sq; + +// move_dist_sq = VectorLengthSquared(moveVec); + move_dist_sq = 26; + + if(which_ai.BeingWatched()) + { + int asdf = 9; + } + + int attack = 1; + + if(nonIdealReason == NI_TOOFAR_SEARCHING) + { + attack = 0; + } + + //no attacking if we're not ready to harm the player + float awakeTimeValue = level.time - which_ai.getFirstTargetTime(); + //if(awakeTimeValue < which_ai.GetMySkills()->getHesitation() && (which_ai.GetStartleability())) + if(awakeTimeValue < which_ai.GetMySkills()->getHesitation() * ((gmonster.GetClosestEnemy() == &monster) ? .5:1))//the closest guy gets to attack quicker + { // we are groggy for a bit when we first arise + attack = 0; + } + + which_ai.GetMiscFlags() &= ~MISC_FLAG_FIRINGBLIND; + + if(nonIdealReason == NI_DODGING) + { + mmove_t *dodgeMove; + + dodgeMove=GetSequenceForDodge(which_ai, monster, goalPos, goalPos, path_goalentity, 0, gi.irand(0,1)?-1:1); + if(dodgeMove) + { + AddActionForSequence(which_ai, monster, dodgeMove, goalPos, goalPos); + return; + } + else + { + nonIdealReason = NI_DUCKING; + } + } + + if(nonIdealReason == NI_DUCKING) + { + body_c *body = which_ai.GetBody(); + + if (body) + { + mmove_t *myMove; + + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_CROUCH, &generic_move_crouch_cower_mid); + + if(myMove) + { + AddActionForSequence(which_ai, monster, myMove, goalPos, goalPos, path_goalentity); + return; + } + else + { + nonIdealReason = NI_FLEEING; + } + } + else + { + nonIdealReason = NI_FLEEING; + } + } + + int fastStrafe = 0; + if(which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_mrs) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_l) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_raimstrafr_p)) + { + fastStrafe = 1; + } + + int fastRetreat = 0; + if(which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_mrs) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_p2) || + which_ai.GetBody()->IsAvailableSequence(monster, &generic_move_rbackaim_l)) + { + fastRetreat = 1; + } + + int proceedForward = 1; + +// if(proceedForward)// if(nonIdealReason == NI_TOOFAR)//make this catchall - why not +// { + if(aiPoints.isActive()) + { + aiPoints.getPath(monster.s.origin, goalPos, &which_ai.getPathData(), &which_ai, &monster, 1, which_ai.getTarget()); + + + Enemy_Printf(&which_ai, "Via %d->%d = %d\n", which_ai.getPathData().curNode, + which_ai.getPathData().nextNode, which_ai.getPathData().finalNode); + + if(which_ai.getPathData().blocked) + { // can't go where I want to :( + if(attack && which_ai.GetMove() && ClearShot(which_ai, monster, goalPos, path_goalentity, which_ai.GetMove()->bbox)) + { + AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, monster.s.origin, goalPos, path_goalentity), monster.s.origin, goalPos, path_goalentity); + } + else + { + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster,goalPos,goalPos), goalPos, goalPos); + } + } + else + { + vec3_t toAvoid, toTarg, looker; + + VectorSubtract(which_ai.getPathData().goPoint, monster.s.origin, toAvoid); + toAvoid[2] = 0; + VectorNormalize(toAvoid); + + VectorScale(toAvoid, 100.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + + VectorSubtract(goalPos, monster.s.origin, toTarg); + toTarg[2] = 0; + float distToTarg = VectorNormalize(toTarg); + + if((nonIdealReason == NI_FLEEING)||(!fastStrafe)||(distToTarg > 448)) + { // good for folks who can't strafe + VectorScale(toAvoid, 40, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else + { + + if(DotProduct(toAvoid, toTarg) > .717) + { + VectorScale(toAvoid, 2440, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else + { + if(!fastStrafe) + { + VectorScale(toAvoid, 12.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + } + + //set it to the side now - for strafing + toAvoid[2] = toAvoid[1]; + toAvoid[1] = -toAvoid[0]; + toAvoid[0] = toAvoid[2]; + toAvoid[2] = 0; + + if(DotProduct(toAvoid, toTarg) > 0) + { + VectorScale(toAvoid, 2440, looker); + VectorAdd(monster.s.origin, looker, looker); + } + else + { + VectorScale(toAvoid, -2440, looker); + VectorAdd(monster.s.origin, looker, looker); + } + } + } + + vec3_t dif; + VectorSubtract(monster.s.origin, actionGoal, dif); + dif[2] = 0; + vec3_t dif2; + VectorSubtract(monster.s.origin, goalPos, dif2); + dif2[2] = 0; + if((VectorLengthSquared(dif) > 2)&&((VectorLengthSquared(dif2) > (50*50))||((nonIdealReason == NI_FLEEING)))&&((!which_ai.GetMySkills()->testFlag(AIS_WONTADVANCE))||(nonIdealReason == NI_FLEEING))) + { + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,looker), actionGoal, looker); + } + else + { + if(nonIdealReason == NI_FLEEING) + { //get down an' cower + body_c *body = which_ai.GetBody(); + + if (body) + { + mmove_t *myMove; + + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_CROUCH, &generic_move_crouch_cower_mid); + + if(!myMove) + { + myMove = body->GetSequenceForStand(monster,goalPos,goalPos,ACTSUB_NORMAL,BBOX_PRESET_CROUCH, &generic_move_crouch_cower_mid2); + } + + if(myMove) + { + AddActionForSequence(which_ai, monster, myMove, goalPos, goalPos, path_goalentity); + } + } + } + else + { + if(attack && ClearShot(which_ai, monster, goalPos, path_goalentity, which_ai.GetMove()->bbox)) + { //can't move, but at least I can shoot! - fixme - some guys shouldn't do this + AddActionForSequence(which_ai, monster, GetSequenceForAttack(which_ai, monster, monster.s.origin, goalPos, path_goalentity), monster.s.origin, goalPos, path_goalentity); + } + else + { + AddActionForSequence(which_ai, monster, GetSequenceForStand(which_ai,monster,actionGoal,goalPos), actionGoal, goalPos); + } + } + //AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,looker), actionGoal, looker); + } + + if(aipoints_show->value) + { + VectorScale(toAvoid, 40.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + + paletteRGBA_t col = {250, 250, 250, 250}; + paletteRGBA_t col2 = {0, 0, 0, 250}; + //FX_MakeLine(node[startNode].getPos(), node[nextNode].getPos(), col, 1); + FX_MakeLine(which_ai.getPathData().goPoint, monster.s.origin, col, 1); + FX_MakeRing(which_ai.getPathData().goPoint, 4); + FX_MakeLine(actionGoal, monster.s.origin, col2, 1); + } + } + } + else + { + VectorSubtract(goalPos, monster.s.origin, actionGoal); + VectorNormalize(actionGoal); + VectorScale(actionGoal, 100.0, actionGoal); + VectorAdd(monster.s.origin, actionGoal, actionGoal); + AddActionForSequence(which_ai, monster, GetSequenceForMovement(which_ai,monster,actionGoal,actionGoal), actionGoal, actionGoal); + } +// } +} +*/ + +// -------------------------------------------------------------- + +pathidle_decision::pathidle_decision(pathidle_decision *orig) +: pathcorner_decision(orig) +{ +} + +void pathidle_decision::Evaluate(pathidle_decision *orig) +{ + pathcorner_decision::Evaluate(orig); +} + +void pathidle_decision::Read() +{ + char loaded[sizeof(pathidle_decision)]; + + gi.ReadFromSavegame('AIHD', loaded, sizeof(pathidle_decision)); + Evaluate((pathidle_decision *)loaded); +} + +void pathidle_decision::Write() +{ + pathidle_decision *savable; + + savable = new pathidle_decision(this); + gi.AppendToSavegame('AIHD', savable, sizeof(*this)); + delete savable; +} + +// end diff --git a/Source/Game/gamecpp/ai_decisions.h b/Source/Game/gamecpp/ai_decisions.h new file mode 100644 index 0000000..695aa09 --- /dev/null +++ b/Source/Game/gamecpp/ai_decisions.h @@ -0,0 +1,663 @@ + +typedef enum +{ + DECISION, + BASE_DECISION, + PURSUE_DECISION, + POINTCOMBAT_DECISION, + SEARCH_DECISION, + DODGE_DECISION, + RETREAT_DECISION, + PATHIDLE_DECISION, + PATHCOMBAT_DECISION, + SCRIPTED_DECISION, + ORDER_DECISION, + DEKKER1_DECISION, + DEKKER2_DECISION, + DEKKER3_DECISION, + DEKKER4_DECISION, +}; + + +#define LEADERFLAG_RECRUIT 0x00000001//leader will look for a new group to lead if he doesn't have one +#define LEADERFLAG_PHYSICAL 0x00000002//leader physically leads--formations assume leader as front member + +#define ORDER_PRIORITY_ROOT 25 +#define SCRIPTED_PRIORITY_ROOT 25//fixme: script decision shouldn't be worrying about adding its own actions at all usually--should just worry about recovering from actions that didn't work????? + +typedef enum +{ + NONE = 0, + ATTACK, + MOVE, + FOLLOW, + WAIT, +} goal_e; + +typedef enum +{ + NI_IDEALPOSITION, + NI_TOOFAR, + NI_TOOCLOSE, + NI_NOTCLEAR, + NI_FLEEING, + NI_DUCKING, //used in certain fleeing cases + NI_DODGING, //used in certain fleeing cases + NI_TOOFAR_SEARCHING, //this one won't attack +} nonIdealSituation; + +/********************************************************************************** + **********************************************************************************/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////// +/////// base decision branch +/////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +class decision_c +{ +private: +protected: + float last_dilution_time; + //priority is a combination of whether immediate conditions + //are favorable for this decision, and whether this decision has a track record for working + int priority; + int priority_base; + + //validity keeps track of how successful this decision has been in the past; + //considering monsters won't last too long, this will be weighted pretty heavily toward + //most recent result, and will slowly edge into neutral territory; + //range is 0 to 1 + float validity; + + float timeout_time; + qboolean allow_timeout; + + qboolean ClearShot(ai_c &which_ai, edict_t &monster, vec3_t goalpos, edict_t *ignore, bbox_preset testbbox, float *orgPos = 0, int *blockingGuy = 0); + float lastClearTime; + qboolean isClear; + + //errr, not so sure i dig this. --ss + float GetGroupPosition(ai_c &which_ai, edict_t &monster, vec3_t relativeTo); + virtual qboolean AtGroupFront(ai_c &which_ai, edict_t &monster, vec3_t dest, vec3_t face); + + virtual void UpdateValidity(float adjustValue){validity = validity*0.75+adjustValue*0.25;}//weight heavily toward new value + virtual void UpdateValidity(void); + + virtual qboolean IsAdversary(edict_t &monster, edict_t *otherGuy); + + qboolean IsTimedOut(void); +public: + + virtual mmove_t *GetSequenceForMovement(ai_c &which_ai, edict_t &monster, vec3_t dest, vec3_t face, mmove_t *preferred_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForStand(ai_c &which_ai, edict_t &monster, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, mmove_t *preferred_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForJump(ai_c &which_ai, edict_t &monster, vec3_t dest, vec3_t face, mmove_t *preferred_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForAttack(ai_c &which_ai, edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, mmove_t *preferred_move=NULL, int reject_actionflags=0); + virtual mmove_t *GetSequenceForDodge(ai_c &which_ai, edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, mmove_t *preferred_move=NULL, int leftSide = 0, int reject_actionflags=0); + + //will return one of the above, depending on the code passed in. + virtual mmove_t *GetSequenceForActionCode(ai_c &which_ai, edict_t &monster, action_code the_code, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, edict_t *target=NULL, mmove_t *preferred_move=NULL, int reject_actionflags=0); + + virtual action_c *AddActionForSequence(ai_c &which_ai, edict_t &monster, mmove_t *move, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, edict_t *target=NULL, action_c *owneraction=NULL, bool shouldKill = false, int NullTarget = 0, float timeoutTime = 0.0f); + virtual action_c *ForceNextActionForSequence(ai_c &which_ai, edict_t &monster, mmove_t *move, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, edict_t *target=NULL, action_c *owneraction=NULL){return NULL;}; + + decision_c(int priority_root = 0, float timeout = 0, edict_t* ScriptOwner = NULL); + virtual ~decision_c(void) {} + + + //ScriptEnt is the entity containing a script for use with scripting + int Priority(void) { return priority+priority_base; } + + virtual qboolean Consider(ai_c &which_ai, edict_t &monster); + virtual void Perform(ai_c &which_ai, edict_t &monster); + virtual void ActionCompleted(action_c &which_action, ai_c &which_ai, edict_t &monster, float percent_success) {} + virtual void FinishScript(){return;}; + + + virtual qboolean SafeToRemove(edict_t &monster){return true;} + + //HEY!!! THIS BETTER BE FALSE UNLESS YOU'RE A SCRIPTED DECISION!!!!! + virtual bool MatchScriptEnt(edict_t* Entity){return false;} + + virtual void SetGoalType(goal_e theGoal){}; + virtual void SetGoalTarget(edict_t *theTarget){}; + virtual void SetGoalLocation(vec3_t theLocation){}; + virtual void SetGoalTime(float theTime){}; + + virtual goal_e GetGoalType(){return NONE;}; + virtual edict_t* GetGoalTarget(){return NULL;}; + virtual void GetGoalLocattion(vec3_t theLocation){}; + virtual float GetGoalTime(){return 0;}; + virtual void UsePathfinding(ai_c &which_ai, edict_t &monster){}; + virtual void SetInfoForDodge(vec3_t start, vec3_t end){} + virtual void SetInfoForReply(vec3_t start, vec3_t end){} + virtual void AddFear(float amount, vec3_t center){} + + + decision_c(decision_c *orig); + void Evaluate(decision_c *orig); + virtual void Write() { assert(0); } + virtual void Read() { assert(0); } + + virtual int GetClassCode(void){return DECISION;}//this should be different for everybody in this class family +static decision_c *NewClassForCode(int code); +}; + +/********************************************************************************** + **********************************************************************************/ + +class base_decision : public decision_c +{ +public: + base_decision(int priority_root = 0, float timeout = 0, edict_t* ScriptOwner = NULL) + :decision_c(priority_root, timeout, ScriptOwner){} + + base_decision(base_decision *orig); + void Evaluate(base_decision *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return BASE_DECISION; } +}; + +/********************************************************************************** + **********************************************************************************/ + +typedef enum +{ + //these are just examples... + USETYPE_PUSH,//push a door open + USETYPE_FLIP,//flip a switch + USETYPE_MISC//well? do something, at least... +} useType_t; + +typedef struct +{ + vec3_t usePos; + vec3_t useDir; + useType_t useType; + edict_t *useEnt; +} brushUseInfo_t; + +typedef struct +{ + vec3_t pos;//get this value from the raw point info + vec3_t direction;//ick, this is currently only used by temp use-points + edict_t *targetEnt;//ick, this is currently only used by temp use-points + bool valid; + unsigned temp_type; + float time; +} ai_pathpoint_t; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////// +/////// path decision branch +/////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//also fixme: to change waypoints so they don't have to be ents, temp point stuff has to be changed (all pretty centralized in anticipation) +class path_decision : public decision_c +{ +private: +protected: + float last_jump_time; + float path_fail_time; + vec3_t path_fail_dir; + ai_pathpoint_t path_nextpoint;//the waypoint i'm currently moving toward + + edict_t *path_goalentity;//the entity i'm trying to reach--a player, generally + vec3_t path_goalpos;//the place i'm trying to reach--a player's origin, generally + float path_goal_updatedtime; + + vec3_t newMoveDir; + float lastCheckTime; + + nonIdealSituation nonIdealReason; + int blockingEnemy; + float lastDuckInvalidateTime; + float lastDuckValidTime; + + vec3_t aimWanderVec;//whilst i'm aiming, i think i'll take a little stroll... + + qboolean stuckNonIdeal;//enemy isn't close enough to be in range, but he has no movement options, so try to shoot anyway (you know, what the hell) + //HOWEVER - you should probably have crap accuracy because you're so far away, yeah? I say YEAH! + + virtual void RecalcMoveVec(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + + virtual void SetGoalPosition(ai_c &which_ai, edict_t &monster); + virtual qboolean GetGoalPosition(ai_c &which_ai, edict_t &monster, vec3_t goal); + virtual qboolean NextPointInPath(ai_c &which_ai, edict_t &monster, vec3_t position);//this sets path_nextpoint (and path_endpoint if path finished), checks path_nextpoint + qboolean EvaluatePathEndpoint(ai_c &which_ai, edict_t &monster, ai_pathpoint_t endpoint_candidate, vec3_t goalpos);//sets nothing, uses nothing other than inputs + //returns false if path is not valid, + //true if path is valid (or if path will be ignored) + + //fixme: when pathfinding in, should totally focus on ent avoidance + void TempPointCreate(vec3_t position, edict_t &monster); + void AvoidPointCreate(vec3_t normal, edict_t &monster); + void PoliteAvoidPointCreate(vec3_t normal, edict_t &monster); + void UsePointCreate(brushUseInfo_t &useeInfo, edict_t &monster); + void JumpPointCreate(vec3_t position, edict_t &monster);//subclass of temppoints made specifically for jumping over things + void FallPointCreate(vec3_t position, edict_t &monster);//subclass of temppoints made specifically for intentional falling + void PerformAvoidance(ai_c &which_ai, edict_t &monster); + + //use this to adjust movement for groups, and check pathfinding (?) to make sure direction is valid--moveVec comes in uninit'ed + virtual void GetMovementVector(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + + virtual qboolean IsIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t curPos, vec3_t goalPos, vec3_t moveVec); + virtual void AddActionIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + virtual void AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + virtual void AddAction(ai_c &which_ai, edict_t &monster); + virtual qboolean AddSpecialPathAction(ai_c &which_ai, edict_t &monster);//called from AddAction--depending on the type of path point path_nextpoint is, add appropriate action +public: + path_decision(edict_t *goalent = NULL, int priority_root = 0, float timeout = 0, edict_t* ScriptOwner = NULL); + virtual ~path_decision(void){} + + virtual qboolean Consider(ai_c &which_ai, edict_t &monster); + + virtual void Perform(ai_c &which_ai, edict_t &monster); + virtual void ActionCompleted(action_c &which_action, ai_c &which_ai, edict_t &monster, float percent_success); + virtual void FinishScript(){return;}; + + path_decision(path_decision *orig); + virtual void Evaluate(path_decision *orig); +}; + +///////////////////////////////////////////////////////////////////////////////////////////// +//pursue decision +///////////////////////////////////////////////////////////////////////////////////////////// + +class pursue_decision : public path_decision +{ +public: + pursue_decision(edict_t *goalent = NULL, int priority_root = 0, float timeout = 0, edict_t* ScriptOwner = NULL) + :path_decision(goalent, priority_root, timeout, ScriptOwner){} + + pursue_decision(pursue_decision *orig); + void Evaluate(pursue_decision *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return PURSUE_DECISION; } +}; + +///////////////////////////////////////////////////////////////////////////////////////////// +//dekker1 decision +///////////////////////////////////////////////////////////////////////////////////////////// + +class dekker1_decision : public path_decision +{ +protected: + virtual void AddAction(ai_c &which_ai, edict_t &monster); + virtual void AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + virtual void AddDekkerActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec, float speed); +public: + dekker1_decision(edict_t *goalent = NULL, int priority_root = 10, float timeout = 0, edict_t* ScriptOwner = NULL) + :path_decision(goalent, priority_root, timeout, ScriptOwner){} + + dekker1_decision(dekker1_decision *orig); + void Evaluate(dekker1_decision *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return DEKKER1_DECISION; } + virtual qboolean Consider(ai_c &which_ai, edict_t &monster); +}; + +///////////////////////////////////////////////////////////////////////////////////////////// +//dekker1 decision +///////////////////////////////////////////////////////////////////////////////////////////// + +class dekker2_decision : public dekker1_decision +{ +protected: +// virtual void GetMovementVector(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + //ARGHHH!--this was supposed to be a simple override to adjust dekker's speed for the various stages, and now it's a huge bloated mess. + virtual void AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + virtual void AddAction(ai_c &which_ai, edict_t &monster); +public: + dekker2_decision(edict_t *goalent = NULL, int priority_root = 8, float timeout = 0, edict_t* ScriptOwner = NULL) + :dekker1_decision(goalent, priority_root, timeout, ScriptOwner){} + + dekker2_decision(dekker2_decision *orig); + void Evaluate(dekker2_decision *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return DEKKER2_DECISION; } + virtual qboolean Consider(ai_c &which_ai, edict_t &monster); +}; + +///////////////////////////////////////////////////////////////////////////////////////////// +//dekker3 decision +///////////////////////////////////////////////////////////////////////////////////////////// + + +class dekker3_decision : public path_decision +{ +protected: + qboolean reachedDest; + + virtual void AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + virtual qboolean IsIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t curPos, vec3_t goalPos, vec3_t moveVec); + virtual qboolean GetGoalPosition(ai_c &which_ai, edict_t &monster, vec3_t goal); + virtual void AddAction(ai_c &which_ai, edict_t &monster); +public: + dekker3_decision(edict_t *goalent = NULL, int priority_root = 5, float timeout = 0, edict_t* ScriptOwner = NULL) + :path_decision(goalent, priority_root, timeout, ScriptOwner){reachedDest=false;} + + dekker3_decision(dekker3_decision *orig); + void Evaluate(dekker3_decision *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return DEKKER3_DECISION; } + virtual qboolean Consider(ai_c &which_ai, edict_t &monster); +}; + +///////////////////////////////////////////////////////////////////////////////////////////// +//dekker4 decision +///////////////////////////////////////////////////////////////////////////////////////////// + + +class dekker4_decision : public path_decision +{ +protected: + qboolean reachedDest; + + virtual void AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + virtual qboolean IsIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t curPos, vec3_t goalPos, vec3_t moveVec); + virtual qboolean GetGoalPosition(ai_c &which_ai, edict_t &monster, vec3_t goal); + virtual void AddAction(ai_c &which_ai, edict_t &monster); +public: + dekker4_decision(edict_t *goalent = NULL, int priority_root = 2, float timeout = 0, edict_t* ScriptOwner = NULL) + :path_decision(goalent, priority_root, timeout, ScriptOwner){reachedDest=false;} + + dekker4_decision(dekker4_decision *orig); + void Evaluate(dekker4_decision *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return DEKKER4_DECISION; } + virtual qboolean Consider(ai_c &which_ai, edict_t &monster); +}; + +///////////////////////////////////////////////////////////////////////////////////////////// +//path decision refitted to use combat points +///////////////////////////////////////////////////////////////////////////////////////////// + +class pointcombat_decision : public path_decision +{ +protected: + int current_point; + vec3_t current_point_pos; + vec3_t current_point_dest; + int current_point_type; + int current_point_subtype; + vec3_t current_point_dir; + int last_point_trans;//time of the last transition for points that oscillate + int last_consider_time;//some guys don't think to do this all that often + + virtual void SetGoalPosition(ai_c &which_ai, edict_t &monster); + virtual qboolean GetGoalPosition(ai_c &which_ai, edict_t &monster, vec3_t goal); + + virtual qboolean IsIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t curPos, vec3_t goalPos, vec3_t moveVec); +// virtual void AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + virtual void AddActionIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); +public: + pointcombat_decision(edict_t *goalent = NULL, int priority_root = 0, float timeout = 0, edict_t* ScriptOwner = NULL); +// virtual ~pointcombat_decision(void){path_decision::~path_decision();} + + virtual qboolean Consider(ai_c &which_ai, edict_t &monster); + void GetMovementVector(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + + pointcombat_decision(pointcombat_decision *orig); + void Evaluate(pointcombat_decision *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return POINTCOMBAT_DECISION; } +}; + +/********************************************************************************** + **********************************************************************************/ + +//approach takes precedence over pursuit, pursuit takes precedence over wandering +//approach==go to where target last was, stop when i get there +//pursuit==go the direction that target was last seen going, stop when i hit something +class search_decision : public path_decision +{ +protected: + qboolean pursuit_search, approach_search; + vec3_t pursuit_dir; + float last_fired_time; + vec3_t firedSpot; + vec3_t trail1, trail2, trail3; + virtual void SetGoalPosition(ai_c &which_ai, edict_t &monster); + virtual qboolean GetGoalPosition(ai_c &which_ai, edict_t &monster, vec3_t goal); + virtual void AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + virtual qboolean IsIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t curPos, vec3_t goalPos, vec3_t moveVec); +public: + search_decision(edict_t *goalent = NULL, int priority_root = 0, float timeout = 0); + virtual ~search_decision(void){} + + virtual void ActionCompleted(action_c &which_action, ai_c &which_ai, edict_t &monster, float percent_success); + + search_decision(search_decision *orig); + void Evaluate(search_decision *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return SEARCH_DECISION; } + + virtual qboolean Consider(ai_c &which_ai, edict_t &monster); + virtual void SetInfoForDodge(vec3_t start, vec3_t end); + virtual void SetInfoForReply(vec3_t start, vec3_t end){SetInfoForDodge(start, end);} +}; + +/********************************************************************************** + **********************************************************************************/ +//this is a path_decision that should look for cover & hop around sideways +class dodge_decision : public path_decision +{ +private: + int prev_health; +protected: + float last_dodge_time; + float last_shotat_time; + int dodgeSide; + vec3_t shotStart;//need this info to determine which way to dodge + vec3_t shotEnd;//need this info to determine which way to dodge + virtual void AddAction(ai_c &which_ai, edict_t &monster); +public: + dodge_decision(int priority_root = 0, float timeout = 0); + virtual ~dodge_decision(void){} + + virtual qboolean Consider(ai_c &which_ai, edict_t &monster); + virtual void ActionCompleted(action_c &which_action, ai_c &which_ai, edict_t &monster, float percent_success); + + dodge_decision(dodge_decision *orig); + void Evaluate(dodge_decision *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return DODGE_DECISION; } + virtual void SetInfoForDodge(vec3_t start, vec3_t end); +}; + + +/********************************************************************************** + **********************************************************************************/ +//this is a path_decision that should look for a path Away from target +class retreat_decision : public path_decision +{ +private: + int prev_health; + float fearIndex; + bool haveFleeDest; + + int spookStyle; + int spookTime; + vec3_t spookCenter; + +protected: + virtual qboolean GetGoalPosition(ai_c &which_ai, edict_t &monster, vec3_t goal); + virtual qboolean IsIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t curPos, vec3_t goalPos, vec3_t moveVec); + virtual void AddActionIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + virtual qboolean IsAdversary(edict_t &monster, edict_t *otherGuy); +public: + retreat_decision(int priority_root = 0, float timeout = 0); + virtual ~retreat_decision(void){} + + virtual qboolean Consider(ai_c &which_ai, edict_t &monster); + virtual void AddFear(float amount, vec3_t center); + virtual void SetInfoForDodge(vec3_t start, vec3_t end); + + + retreat_decision(retreat_decision *orig); + void Evaluate(retreat_decision *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return RETREAT_DECISION; } +}; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////// +/////// pathcorner-traversing decision branch +/////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////////////////////// +//path decision refitted to follow path_corner trail--gets rid of itself if path_corner trail ends. +///////////////////////////////////////////////////////////////////////////////////////////// +class pathcorner_decision : public path_decision +{ +protected: + float reactivate_time; + edict_t *oldTarget; + int curWaitActionNum; + qboolean firstActionAtWait; + qboolean isAtCorner; + mmove_t *curMoveAction;//store off the moveAction for path_corners when i pass them + + virtual void SetGoalPosition(ai_c &which_ai, edict_t &monster); + virtual qboolean GetGoalPosition(ai_c &which_ai, edict_t &monster, vec3_t goal); + + virtual void GetMovementVector(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + + virtual qboolean IsIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t curPos, vec3_t goalPos, vec3_t moveVec); + virtual void AddActionNonIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + virtual void AddActionIdealPosition(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + virtual void FinishPathPoint(ai_c &which_ai, edict_t &monster); +public: + pathcorner_decision(edict_t *goalent=NULL, int priority_root=0, float timeout=0, edict_t* ScriptOwner=NULL); + virtual ~pathcorner_decision(void){path_decision::~path_decision();} + + virtual void ActionCompleted(action_c &which_action, ai_c &which_ai, edict_t &monster, float percent_success); + + virtual qboolean Consider(ai_c &which_ai, edict_t &monster); + + pathcorner_decision(pathcorner_decision *orig); + virtual void Evaluate(pathcorner_decision *orig); +}; + +class pathidle_decision : public pathcorner_decision +{ +public: + pathidle_decision(edict_t *goalent=NULL, int priority_root=0, float timeout=0, edict_t* ScriptOwner=NULL) + :pathcorner_decision(goalent, priority_root, timeout, ScriptOwner){} + + pathidle_decision(pathidle_decision *orig); + void Evaluate(pathidle_decision *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return PATHIDLE_DECISION; } +}; + +///////////////////////////////////////////////////////////////////////////////////////////// +//path_corner decision refitted to follow point_combat trail--gets rid of itself if point_combat trail ends. +///////////////////////////////////////////////////////////////////////////////////////////// + +class pathcombat_decision : public pathcorner_decision +{ +protected: + virtual void GetMovementVector(ai_c &which_ai, edict_t &monster, vec3_t goalPos, vec3_t moveVec); + virtual void FinishPathPoint(ai_c &which_ai, edict_t &monster); +public: + virtual qboolean Consider(ai_c &which_ai, edict_t &monster); + pathcombat_decision(edict_t *goalent=NULL, int priority_root=0, float timeout=0, edict_t* ScriptOwner=NULL):pathcorner_decision(goalent,priority_root,timeout,ScriptOwner){} + + pathcombat_decision(pathcombat_decision *orig); + void Evaluate(pathcombat_decision *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return PATHCOMBAT_DECISION; } +}; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/////// +/////// scripted/queued order decision branch +/////// +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +/********************************************************************************** + **********************************************************************************/ +//this is a path_decision that doesn't necessarily use any path stuff +//although, it Could use the path stuff to attack a civilian, run to an elevator, etc. + +class scriptOrder_c +{ +public: + mmove_t *preferredMove;//NULL if no preference... + float holdTime;//time to hold (for idles, static stuff) + vec3_t turnVec; + vec3_t destVec; + qboolean absoluteDest;//whether the destination is absolute or relative. + bool kill;//whether an attack order should be an automatic kill + action_code actionType;//what do i want to be doing here? + int flags; + Event *SignalEvent; + float speed; + edict_t *target; + int NullTarget; // targeted null in a script + int Emotion; + + scriptOrder_c(void); + scriptOrder_c(scriptOrder_c *orig); + void Evaluate(scriptOrder_c *orig); + void Write(void); + void Read(void); +}; + +class scripted_decision : public path_decision +{ +private: +protected: + qboolean scriptDone; + edict_t *self; + qboolean ignorePreferred; + float orderStartTime; + vec3_t oldPosition;//where i should be at the start of current order + vec3_t actDest; + vec3_t actDestDir;//for more reliable testing of whether i've gotten close enough to destination--this is the vector to actDest when I start out; + //when the vector to the actDest is closer to the inverse of this than to this, i've passed my destination + mmove_t *lastMove; + + edict_t *ScriptEnt; +#define SCRIPTED_DECISION_END (offsetof(scripted_decision, ScriptEnt) + sizeof(ScriptEnt)) + + list orders; +// virtual void AddAction(ai_c &which_ai, edict_t &monster); +public: + scripted_decision(edict_t *goalent = NULL, int priority_root = SCRIPTED_PRIORITY_ROOT, float timeout = 0, edict_t* ScriptOwner = NULL); + virtual ~scripted_decision(void); + + virtual void Perform(ai_c &which_ai, edict_t &monster); + virtual void FinishScript(){scriptDone = true;}; + virtual qboolean Consider(ai_c &which_ai, edict_t &monster){priority=15; return scriptDone;}; + virtual bool MatchScriptEnt(edict_t* Entity); + + virtual void AddOrder(ai_c &which_ai, edict_t &monster, scriptOrder_c &this_order); + + virtual void ActionCompleted(action_c &which_action, ai_c &which_ai, edict_t &monster, float percent_success); + + scripted_decision(scripted_decision *orig); + void Evaluate(scripted_decision *orig); + virtual void Read(); + virtual void Write(); + virtual int GetClassCode(void) { return SCRIPTED_DECISION; } +}; + +// end \ No newline at end of file diff --git a/Source/Game/gamecpp/ai_path_pre.cpp b/Source/Game/gamecpp/ai_path_pre.cpp new file mode 100644 index 0000000..2b59705 --- /dev/null +++ b/Source/Game/gamecpp/ai_path_pre.cpp @@ -0,0 +1,3287 @@ +#include "g_local.h" +#include "ai_pathfinding.h" + +#include + +void SetGenericEffectInfo(edict_t *ent); + +//////////////////////////////////////////////////////////////////////////////////////////////// +// +// Globals +// +//////////////////////////////////////////////////////////////////////////////////////////////// + +//omg - this is the ugliest use of a global I've ever seen today!!! +//I'm not kidding, either. This is BAD +CAIListData *aiList = 0; +CAIPaths aiPoints; + +int failedConnects; +int degenNodes; + +int loadVersion; +int showboxes = 1; + +//////////////////////////////////////////////////////////////////////////////////////////////// +// +// Misc functions +// +//////////////////////////////////////////////////////////////////////////////////////////////// + +float readFloat(byte **in) +{ + float rVal = *(float *)*in; + *in+=4; + + return rVal; +} + +void readVect(byte **in, vec3_t v) +{ + v[0] = readFloat(in); + v[1] = readFloat(in); + v[2] = readFloat(in); +} + +int readInt(byte **in) +{ + int rVal = *(int *)*in; + *in+=4; + return rVal; +} + +short readShort(byte **in) +{ + short rVal = *(short *)*in; + *in+=2; + return rVal; +} + +byte readByte(byte **in) +{ + byte rVal = *(byte *)*in; + *in+=1; + return rVal; +} + +signed char readChar(byte **in) +{ + signed char rVal = *(signed char *)*in; + *in+=1; + return rVal; +} + + +#define FLOOR_DIST_CHECK 256 + +void getFloorPoint(vec3_t spot, vec3_t floorPoint) +{ + vec3_t testmin = {-13, -13, 0};//zcheck? + vec3_t testmax = { 13, 13, 24}; + + trace_t tr; + + VectorCopy(spot, floorPoint); + floorPoint[2] -= FLOOR_DIST_CHECK; + gi.trace(spot, testmin, testmax, floorPoint, NULL, MASK_SOLID, &tr); + VectorCopy(tr.endpos, floorPoint); +} + +//is this okay? I dunno... + +#define DIVISION_DIST 4 // how far down to check +#define DIST_ABOVE_TO_CHECK 32 +#define MAX_PATH_HEIGHT_DIFF 16 // ? will this cause step height concerns? + +int isPathLevel(vec3_t start, vec3_t end, float maxHeightMod, vec3_t stop) +{ + // basically, what we're doing here is making certain that there are no seriously huge gaps in the path + // if there are,this is no good + + vec3_t floorStart, floorEnd; + vec3_t curCheck, curAdd, curCheckDown; + vec3_t prevCheckDown; + + getFloorPoint(start, floorStart); + getFloorPoint(end, floorEnd); + + int numToAdd; + + VectorSubtract(floorEnd, floorStart, curAdd); + numToAdd = VectorLength(curAdd)/DIVISION_DIST; + VectorNormalize(curAdd); + VectorScale(curAdd, DIVISION_DIST, curAdd); + VectorCopy(floorStart, prevCheckDown); + VectorAdd(floorStart, curAdd, curCheck); + curCheck[2] += DIST_ABOVE_TO_CHECK;//don't want this guy to start in the floor - that's a big issue right now ;/ + + //Com_Printf("Checking for level path\n"); + + for(int i = 1; i < numToAdd; i++) + { // check for huge jumps + getFloorPoint(curCheck, curCheckDown); + + if(fabs(curCheckDown[2] - prevCheckDown[2]) > MAX_PATH_HEIGHT_DIFF * maxHeightMod) + { + if(stop) + { + VectorCopy(curCheck, stop); + } + return 0; + } + + VectorAdd(curCheck, curAdd, curCheck); + VectorCopy(curCheckDown, prevCheckDown);//crap - I forgot this ;( + } + + if(stop) + { + VectorCopy(curCheck, end); + } + + return 1; +} + +void killportals (void) +{ + edict_t *t = NULL; + + while ((t = G_Find (t, FOFS(classname), "func_areaportal"))) + { + gi.SetAreaPortalState (t->style, 1); + } +} + +void elimEnts(void) +{ + edict_t *ed; + + killportals(); + + for(ed = &g_edicts[0]; ed < &g_edicts[MAX_EDICTS]; ed++) + { + if(!ed->inuse) + { + continue; + } + + if(ed->ai) + { // this is positively unsafe, but I really don't care + G_FreeEdict(ed); + continue; + } + else if(!strncmp(ed->classname, "func", 4)) + { + // this won't work on all of them... ? + //if((strcmp(ed->classname, "func_wall"))&&(strcmp(ed->classname, "func_breakable_brush"))) + { + G_FreeEdict(ed); + continue; + } + } + else if(!strncmp(ed->classname, "trigger", 6)) + { + G_FreeEdict(ed); + continue; + } + else if(!strncmp(ed->classname, "spawner", 7)) + { + G_FreeEdict(ed); + continue; + } + } +} + +edict_t *makeNodeEnt(vec3_t spot, int id, int style, int ignore = 0) +{ + edict_t *ed; + + ed = G_Spawn(); + VectorCopy(spot, ed->s.origin); + + ed->movetype = MOVETYPE_NOCLIP; + ed->solid = SOLID_NOT; + ed->classname = "nodedrawer"; + + SetGenericEffectInfo(ed); + + ed->nextthink = 0; + + // I feel like I'm overlooking something here :/ + int counter = style; + int count2 = 1; + + while(counter > 1) + { + count2++; + counter>>=1;//?? + } + + switch(count2) + { + case 1: + //normal point + fxRunner.execContinualEffect("edit/editpoint", ed); + break; + case 3: + fxRunner.execContinualEffect("edit/editflee", ed); + break; + case 14: + fxRunner.execContinualEffect("edit/editpoint", ed); + break; + case 15: + fxRunner.execContinualEffect("edit/editpoint", ed); + break; + case 16: + fxRunner.execContinualEffect("edit/editfleegood", ed); + break; + case 17: + fxRunner.execContinualEffect("edit/editfleebad", ed); + break; + default: + fxRunner.execContinualEffect("edit/editpoint", ed); + break; + } + + if(ignore) + { + fxRunner.execContinualEffect("edit/ignore", ed); + } + + return ed; + +} + +void drawMonkeyThink(edict_t *ed) +{ + ed->nextthink = level.time + .1; + aiList->graphicData(level.time); +} + +void StartNodeDrawMonkey(void) +{ + edict_t *ed = G_Spawn(); + + ed->think = drawMonkeyThink; + ed->nextthink = level.time + .1; +} + +void regionTraceThink(edict_t *ed) +{ + if(level.sight_client) + { + aiList->ensureRegion(level.sight_client); + } + ed->nextthink = level.time + .1; +} + +void initRegionTrace(void) +{ + edict_t *ed = G_Spawn(); + + ed->think = regionTraceThink; + ed->nextthink = level.time + .1; +} + +int walkingTrace(vec3_t start, vec3_t min, vec3_t max, vec3_t end, edict_t *ignore, int mask) +{ + float curFloorHeight; + trace_t tr; + vec3_t fwd, down; + + VectorCopy(start, down); + down[2] -= 1024; + + gi.trace(start, min, max, down, ignore, mask, &tr); + if(tr.startsolid || tr.allsolid) + { + return 0; + } + + curFloorHeight = tr.endpos[2]; + + VectorSubtract(end, start, fwd); + fwd[2] = 0; + float len = VectorNormalize(fwd); + vec3_t curPos, curCheck; + + VectorCopy(start, curPos); + curPos[2] = curFloorHeight - min[2]; + + float distMoved = 0; + + while(distMoved < len) + { + VectorMA(curPos, 4.0, fwd, curCheck); + + gi.trace(curPos, min, max, curCheck, ignore, mask, &tr); + + if(tr.fraction < .99 || tr.startsolid || tr.allsolid) + { //uh oh - hit something. See if the path is clear a bit above this - otherwise bad path + float totalAdded = 0; + + while(totalAdded < 20) + { + curPos[2] += 4; + curCheck[2] += 4; + + gi.trace(curPos, min, max, curCheck, ignore, mask, &tr); + + if(tr.fraction > .99 && !tr.startsolid && !tr.allsolid) + { + break; + } + + totalAdded += 4; + } + if(totalAdded >= 20) + { //welp, couldn't make that connection + return 0; + } + } + else + { + vec3_t downVect; + + VectorCopy(curCheck, downVect); + downVect[2] -= 40; + + gi.trace(curCheck, min, max, downVect, ignore, mask, &tr); + + if(tr.fraction > .5) + { + return 0;//too big of a drop off + } + } + + VectorCopy(curCheck, curPos); + distMoved += 4; + } + + return 1; +} + + + + + + + + + + + +//////////////////////////////////////////////////////////////////////////////////////////////// +// +// CAIRegion +// +//////////////////////////////////////////////////////////////////////////////////////////////// + +void CAIRegion::save(FILE *fp) +{ + fwrite(&id, sizeof(id), 1, fp); + fwrite(min, sizeof(min), 1, fp); + fwrite(max, sizeof(max), 1, fp); + fwrite(&targNode, sizeof(targNode), 1, fp); + assert(targNode < 400); +} + +void CAIRegion::saveExport(FILE *fp) +{ + fwrite(&id, sizeof(id), 1, fp); + fwrite(min, sizeof(min), 1, fp); + fwrite(max, sizeof(max), 1, fp); + fwrite(&targNode, sizeof(targNode), 1, fp); + fwrite(&blockSide, sizeof(blockSide), 1, fp); + assert(targNode < 400); +} + + +void CAIRegion::load(FILE **fp) +{ + fread(&id, sizeof(id), 1, *fp); + fread(min, sizeof(min), 1, *fp); + fread(max, sizeof(max), 1, *fp); + fread(&targNode, sizeof(targNode), 1, *fp); + if(targNode > 400) + { + targNode = -1; + } +} + +#include "windows.h" + +void CAIRegion::load(unsigned char **data) +{ + id = readInt(data); + for(int i = 0; i < 3; i++)min[i] = readFloat(data); + for(i = 0; i < 3; i++)max[i] = readFloat(data); + targNode = readInt(data); + blockSide = readInt(data); + + assert(targNode < 400); + if(targNode < 1) + { + OutputDebugString("No node for this region!!!\n"); + } +} + + + + + + + + +void CAIFloorSquare::save(FILE *fp) +{ + for(int i = 0; i < 3; i++) + { + fwrite(&min[i], sizeof(float), 1, fp); + } + fwrite(&partial, sizeof(partial), 1, fp); +} + +void CAIFloorSquare::load(FILE **fp) +{ + for(int i = 0; i < 3; i++) + { + fread(&min[i], sizeof(float), 1, *fp); + } + fread(&partial, sizeof(partial), 1, *fp); +} + +void CAIFloorSquare::clearNear(void) +{ + for(int i = 0; i < NUM_NEAR_NODES; i++) + { + nearNodes[i] = -1; + nearNodeDist[i] = 512*512; + } +} + +int CAIFloorSquare::setFirstFreeNode(int val) +{ + int i = 0; + while(nearNodes[i] != -1 && nearNodes[i] != val) + { + i++; + } + + if(i < NUM_NEAR_NODES) + { + nearNodes[i] = val; + return i; + } + else + { + return -1; + } +} + +int CAIFloorSquare::hasNodes(void) +{ + if(nearNodes[0] == -1) + { + return 0; + } + return 1; +} + +void CAIFloorSquare::saveExport(FILE **fp) +{ + for(int i = 0; i < 3; i++) + { + fwrite(&min[i], sizeof(float), 1, *fp); + //signed char val = min[i] / 48; + //fwrite(&val, 1, 1, *fp); + } + fwrite(&partial, sizeof(partial), 1, *fp); + fwrite(&id, sizeof(id), 1, *fp); + for(i = 0; i < NUM_NEAR_NODES; i++) + { + fwrite(&nearNodes[i], sizeof(nearNodes[0]), 1, *fp); + } + fwrite(&yMinus, sizeof(yMinus), 1, *fp); + fwrite(&xPlus, sizeof(xPlus), 1, *fp); + fwrite(&yPlus, sizeof(yPlus), 1, *fp); + fwrite(&xMinus, sizeof(xMinus), 1, *fp); + fwrite(&topZ, sizeof(topZ), 1, *fp); +} + + +void CAIFloorDataEdit::save(FILE *fp) +{ + fwrite(®ionsInUse, sizeof(regionsInUse), 1, fp); + for(int i = 0; i < regionsInUse; i++) + { + floorSpaces[i].save(fp); + } +} + +void CAIFloorDataEdit::load(FILE **fp) +{ + fread(®ionsInUse, sizeof(regionsInUse), 1, *fp); + for(int i = 0; i < regionsInUse; i++) + { + floorSpaces[i].load(fp); + } +} + +void CAIFloorDataEdit::ensureRegion(vec3_t spot) +{ + vec3_t spot2; + int partial; + for(int j = -3; j < 4; j++) + { + for(int k = -3; k < 4; k++) + { + int drawColor = 0; + + if(j == 0 && k == 0) + { + int asdf = 9; + } + + VectorCopy(spot, spot2); + spot2[0] += 48 * j; + spot2[1] += 48 * k; + + trace_t tr; + + gi.trace(spot, vec3_origin, vec3_origin, spot2, 0, MASK_SOLID, &tr); + + if(fabs(spot2[0] - tr.endpos[0]) > 48) + { + continue; + } + if(fabs(spot2[1] - tr.endpos[1]) > 48) + { + continue; + } + + VectorCopy(tr.endpos, spot2); + + vec3_t pmin, pmax; + + for(int i = 0; i < 2; i++) + { + pmin[i] = ((((int)spot2[i])+4096) / 48)*48 - 4096; + pmax[i] = pmin[i] + 48; + } + vec3_t testend; + VectorCopy(spot2, testend); + testend[2] -= 256; + + gi.trace(spot2, vec3_origin,vec3_origin, testend, 0, MASK_SOLID, &tr); + pmin[2] = tr.endpos[2]; + pmax[2] = pmin[2] + 16; + + int found = 0; + for(i = 0; i < regionsInUse; i++) + { + vec3_t dif; + VectorSubtract(floorSpaces[i].getMin(), pmin, dif); + if(fabs(dif[2]) > 32) + { + continue;//rules are different for this + } + dif[2] = 0; + if(VectorLength(dif) < 3) + { + found = 1; + partial = floorSpaces[i].getPartial(); + //Com_Printf("Found %d squares\n", regionsInUse); + break; + } + } + if(!found) + { + pmax[2] = pmin[2] + 64;//? enemy height? + + vec3_t testmin, testmax; + VectorCopy(pmin, testmin); + testmin[0] += 8; + testmin[1] += 8; + testmin[2] += 16; + VectorCopy(pmax, testmax); + testmax[0] -= 8; + testmax[1] -= 8; + + gi.trace(vec3_origin, testmin, testmax, vec3_origin, 0, MASK_SOLID, &tr); + + partial = 0; + if(tr.fraction < 1.0 || tr.startsolid || tr.allsolid) + { + partial = 1; + } + + //check for floor gaps + vec3_t center; + VectorCopy(testmin, center); + center[0] += 16; + center[1] += 16; + for(int j = 0; j < 4; j++) + { + vec3_t testTop; + trace_t tr; + + VectorCopy(center, testTop); + + testTop[0] += 16 * ((j>1)?-1:1); + testTop[1] += 16 * ((j&1)?-1:1); + + vec3_t testBottom; + + VectorCopy(testTop, testBottom); + testBottom[2] -= (25+16);//we start out 16 above floor, 24 is max step height - one more is no good + + gi.trace(testTop, vec3_origin, vec3_origin, testBottom, 0, MASK_SOLID, &tr); + if(tr.fraction > .99 && !tr.startsolid && !tr.allsolid) + { // uh oh + partial |= PARTIAL_FLOORGAP; + break; + } + + } + + + if(regionsInUse < 15999)//ick + { + CAIRegion newSpace; + VectorCopy(pmin, floorSpaces[regionsInUse].getMin()); + floorSpaces[regionsInUse].setPartial(partial); + regionsInUse++; + Com_Printf("%d regions in use now\n", regionsInUse); + } + else + { + Com_Printf("Out of regions!!! Huge problem!\n"); + } + } + + if(showboxes) + { + if((((int)(level.time*10)+i)%5)==0) + { //only draw these twice a second + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_TESTBOX); + gi.WritePosition(pmin); + gi.WritePosition(pmax); + if(partial & PARTIAL_FLOORGAP) + { + gi.WriteByte(0); + gi.WriteByte(255); + gi.WriteByte(0); + } + else if(partial & PARTIAL_FLOOR) + { + gi.WriteByte(255); + gi.WriteByte(0); + gi.WriteByte(0); + } + else + { + gi.WriteByte(0); + gi.WriteByte(0); + gi.WriteByte(255); + } + gi.multicast(level.sight_client->s.origin, MULTICAST_PHS); + } + } + } + } +} + +int floorSpaceSort (void const *a, void const *b) +{ + CAIFloorSquare anum, bnum; + + anum = *(CAIFloorSquare *)a; + bnum = *(CAIFloorSquare *)b; + + if(anum.getMin()[0] < bnum.getMin()[0]) + { + return -1; + } + else if(anum.getMin()[0] > bnum.getMin()[0]) + { + return 1; + } + else + { + if(anum.getMin()[1] < bnum.getMin()[1]) + { + return -1; + } + else if(anum.getMin()[1] > bnum.getMin()[1]) + { + return 1; + } + else + { + if(anum.getMin()[2] < bnum.getMin()[2]) + { + return -1; + } + else if(anum.getMin()[2] > bnum.getMin()[2]) + { + return 1; + } + } + } + + return 0; +} + + + +void CAIFloorDataEdit::saveExport(FILE **fp) +{ + qsort(floorSpaces, regionsInUse, sizeof(floorSpaces[0]), floorSpaceSort); + + int numX; + int *numY; + int **numZ; + + numX = 1; + + for(int i = 1; i < regionsInUse; i++) + { + if(floorSpaces[i].getMin()[0] != floorSpaces[i - 1].getMin()[0]) + { + numX++; + } + } + numY = new int[numX]; + numZ = new int*[numX]; + + int countY = 1; + int curX = 0; + for(i = 1; i < regionsInUse; i++) + { + if(floorSpaces[i].getMin()[0] != floorSpaces[i - 1].getMin()[0]) + { + numY[curX] = countY; + numZ[curX] = new int[countY]; + countY = 1; + curX++; + } + else if(floorSpaces[i].getMin()[1] != floorSpaces[i - 1].getMin()[1]) + { + countY++; + } + } + if(curX == numX - 1) + { //catch the last bit + numY[curX] = countY; + numZ[curX] = new int[countY]; + countY = 1; + curX++; + } + assert(curX == numX); + + curX = 0; + int curY = 0; + int countZ = 1; + int pending; + for(i = 1; i < regionsInUse; i++) + { + pending = 0; + if(floorSpaces[i].getMin()[0] != floorSpaces[i - 1].getMin()[0]) + { + numZ[curX][curY] = countZ; + countZ = 1; + + curX++; + curY = 0; + countZ = 1; + } + else if(floorSpaces[i].getMin()[1] != floorSpaces[i - 1].getMin()[1]) + { + numZ[curX][curY] = countZ; + countZ = 1; + curY++; + } + else + { + countZ++;//no choice but to be so + pending = 1; + } + } + //fill in the last straggler + numZ[numX-1][numY[numX-1]-1] = countZ; + //assert(curX == numX); + + int curFloor = 0; + + fwrite(®ionsInUse, sizeof(regionsInUse), 1, *fp); + fwrite(&numX, sizeof(numX), 1, *fp); + for(i = 0; i < numX; i++) + { + fwrite(&(floorSpaces[curFloor].getMin()[0]), sizeof(float), 1, *fp); + fwrite(&numY[i], sizeof(float), 1, *fp); + for(int j = 0; j < numY[i]; j++) + { + fwrite(&(floorSpaces[curFloor].getMin()[1]), sizeof(float), 1, *fp); + fwrite(&numZ[i][j], sizeof(float), 1, *fp); + for(int k = 0; k < numZ[i][j]; k++) + { + floorSpaces[curFloor].saveExport(fp); + curFloor++; + } + } + } + assert(curFloor == regionsInUse); + + delete[] numY; + delete[] numZ; +} + +int CAIFloorDataEdit::getFloorForSpot(vec3_t spot) +{ + float bestHeight = -9999; + int bestFloor = -1; + + for(int i = 0; i < regionsInUse; i++) + { + if(floorSpaces[i].getMin()[0] > spot[0]) + { + continue; + } + if(floorSpaces[i].getMin()[1] > spot[1]) + { + continue; + } + if(floorSpaces[i].getMin()[0] + 48 < spot[0]) + { + continue; + } + if(floorSpaces[i].getMin()[1] + 48 < spot[1]) + { + continue; + } + if(floorSpaces[i].getMin()[2] > spot[2]) + { + continue; + } + if(floorSpaces[i].getMin()[2] < bestHeight) + { + continue; + } + + bestFloor = i; + bestHeight = floorSpaces[i].getMin()[2]; + } + return bestFloor; +} + +void CAIFloorDataEdit::AddNodesViaLine(vec3_t start, vec3_t end, int id1, int id2) +{ + int curFloor = getFloorForSpot(start); + int endFloor = getFloorForSpot(end); + int differsOnlyByZ = 0; + + if(curFloor == -1) + { + return; + } + + vec3_t startPos, startSide; + + VectorCopy(start, startPos); + + vec3_t difOuter; + VectorSubtract(end, startPos, difOuter); + + startSide[1] = difOuter[0]; + startSide[0] = -difOuter[1]; + startSide[2] = 0; + + if(endFloor == -1) + { + return; + } + + do + { + int nextLeft, nextRight; + + vec3_t center; + VectorCopy(floorSpaces[curFloor].getMin(), center); + center[0] += 24; + center[1] += 24; + + vec3_t dist; + int addedNode = floorSpaces[curFloor].setFirstFreeNode(id1); + if(addedNode != -1) + { + VectorSubtract(start, center, dist); + floorSpaces[curFloor].setNearDist(addedNode, VectorLength(dist)); + } + + addedNode = floorSpaces[curFloor].setFirstFreeNode(id2); + if(addedNode != -1) + { + VectorSubtract(end, center, dist); + floorSpaces[curFloor].setNearDist(addedNode, VectorLength(dist)); + } + + if(fabs(floorSpaces[curFloor].getMin()[0] - floorSpaces[endFloor].getMin()[0]) < 5) + {//we're already in the proper x plane - just move in y + if(floorSpaces[curFloor].getMin()[1] > floorSpaces[endFloor].getMin()[1]) + { + curFloor = floorSpaces[curFloor].getYMinus(); + } + else + { + curFloor = floorSpaces[curFloor].getYPlus(); + } + } + else if(fabs(floorSpaces[curFloor].getMin()[1] - floorSpaces[endFloor].getMin()[1]) < 5) + {//we're already in the proper x plane - just move in y + if(floorSpaces[curFloor].getMin()[0] > floorSpaces[endFloor].getMin()[0]) + { + curFloor = floorSpaces[curFloor].getXMinus(); + } + else + { + curFloor = floorSpaces[curFloor].getXPlus(); + } + } + else + { + if(difOuter[0] > 0 && difOuter[1] > 0) + { + nextLeft = floorSpaces[curFloor].getYPlus(); + nextRight = floorSpaces[curFloor].getXPlus(); + } + else if(difOuter[0] < 0 && difOuter[1] > 0) + { + nextLeft = floorSpaces[curFloor].getXMinus(); + nextRight = floorSpaces[curFloor].getYPlus(); + } + else if(difOuter[0] > 0 && difOuter[1] < 0) + { + nextLeft = floorSpaces[curFloor].getXPlus(); + nextRight = floorSpaces[curFloor].getYMinus(); + } + else if(difOuter[0] < 0 && difOuter[1] < 0) + { + nextLeft = floorSpaces[curFloor].getYMinus(); + nextRight = floorSpaces[curFloor].getXMinus(); + } + + vec3_t dif; + VectorSubtract(center, startPos, dif); + if(DotProduct(startSide, dif) > 0) + { + curFloor = nextRight; + } + else + { + curFloor = nextLeft; + } + } + + if(curFloor > -1) + { + if(fabs(floorSpaces[curFloor].getMin()[0] - floorSpaces[endFloor].getMin()[0]) < 5 && + fabs(floorSpaces[curFloor].getMin()[1] - floorSpaces[endFloor].getMin()[1]) < 5) + { + differsOnlyByZ = 1; + } + } + + }while(curFloor > -1 && curFloor != endFloor && !differsOnlyByZ); +} + +int CAIFloorDataEdit::clearLineForFloor(int startID, int endFloor, int traceStyle) +{ + int curFloor = startID; + int differsOnlyByZ = 0; + + if(endFloor == -1) + { + return 0; + } + + vec3_t startPos, startSide; + + VectorCopy(floorSpaces[startID].getMin(), startPos); + + vec3_t difOuter; + VectorSubtract(floorSpaces[endFloor].getMin(), startPos, difOuter); + + startPos[0] += 24; + startPos[1] += 24; + //startPos[2] = 0;//???? WHat the HEll + + startSide[1] = difOuter[0]; + startSide[0] = -difOuter[1]; + startSide[2] = 0; + + do + { + int nextLeft, nextRight; + + if(fabs(floorSpaces[curFloor].getMin()[0] - floorSpaces[endFloor].getMin()[0]) < 5) + {//we're already in the proper x plane - just move in y + if(floorSpaces[curFloor].getMin()[1] > floorSpaces[endFloor].getMin()[1]) + { + curFloor = floorSpaces[curFloor].getYMinus(); + } + else + { + curFloor = floorSpaces[curFloor].getYPlus(); + } + } + else if(fabs(floorSpaces[curFloor].getMin()[1] - floorSpaces[endFloor].getMin()[1]) < 5) + {//we're already in the proper x plane - just move in y + if(floorSpaces[curFloor].getMin()[0] > floorSpaces[endFloor].getMin()[0]) + { + curFloor = floorSpaces[curFloor].getXMinus(); + } + else + { + curFloor = floorSpaces[curFloor].getXPlus(); + } + } + else + { + if(difOuter[0] > 0 && difOuter[1] > 0) + { + nextLeft = floorSpaces[curFloor].getYPlus(); + nextRight = floorSpaces[curFloor].getXPlus(); + } + else if(difOuter[0] < 0 && difOuter[1] > 0) + { + nextLeft = floorSpaces[curFloor].getXMinus(); + nextRight = floorSpaces[curFloor].getYPlus(); + } + else if(difOuter[0] > 0 && difOuter[1] < 0) + { + nextLeft = floorSpaces[curFloor].getXPlus(); + nextRight = floorSpaces[curFloor].getYMinus(); + } + else if(difOuter[0] < 0 && difOuter[1] < 0) + { + nextLeft = floorSpaces[curFloor].getYMinus(); + nextRight = floorSpaces[curFloor].getXMinus(); + } + + vec3_t center, dif; + VectorCopy(floorSpaces[curFloor].getMin(), center); + center[0] += 24; + center[1] += 24; + VectorSubtract(center, startPos, dif); + + dif[2] = 0; + + assert(nextRight > -2); + assert(nextLeft > -2); + + if(DotProduct(startSide, dif) > 0) + { + curFloor = nextRight; + } + else + { + curFloor = nextLeft; + } + } + + //er + if(curFloor != -1) + { + if(fabs(floorSpaces[curFloor].getMin()[0] - floorSpaces[endFloor].getMin()[0]) < 5 && + fabs(floorSpaces[curFloor].getMin()[1] - floorSpaces[endFloor].getMin()[1]) < 5) + { + differsOnlyByZ = 1; + } + + if(floorSpaces[curFloor].getPartial()) + { + differsOnlyByZ = 1; + } + } + + }while(curFloor > -1 && curFloor != endFloor && !differsOnlyByZ); + + if(curFloor == endFloor) + { + if(traceStyle == 0) + { + return 1; + } + vec3_t endPos; + + startPos[2] += 16; + + VectorCopy(floorSpaces[endFloor].getMin(), endPos); + endPos[0] += 24; + endPos[1] += 24; + endPos[2] += 16; + + trace_t tr; + + vec3_t min = {-16, -16, -16}; + vec3_t max = {16, 16, 16}; + + if(traceStyle == 2) + { + gi.trace(startPos, min, max, endPos, 0, MASK_MONSTERSOLID, &tr); + } + else + { + gi.trace(startPos, vec3_origin, vec3_origin, endPos, 0, MASK_MONSTERSOLID, &tr); + } + + if(tr.fraction > .99 && !tr.startsolid && !tr.allsolid) + { + return 1; + } + else + { + return 0; + } + } + return 0; +} + +void CAIFloorDataEdit::prepareForExport(void) +{ + qsort(floorSpaces, regionsInUse, sizeof(floorSpaces[0]), floorSpaceSort); + + for(int i = 0; i < regionsInUse; i++) + { + floorSpaces[i].setId(i); + floorSpaces[i].setYMinus(-1); + floorSpaces[i].setYPlus(-1); + floorSpaces[i].setXMinus(-1); + floorSpaces[i].setXPlus(-1); + } + + for(i = 0; i < regionsInUse; i++) + { + for(int j = i + 1; j < regionsInUse; j++) + { //this could be much faster, as always + + float *one, *two; + + one = floorSpaces[i].getMin(); + two = floorSpaces[j].getMin(); + + if(fabs(one[2] - two[2]) > 32) + { + continue; + } + + if(fabs(one[0] - two[0]) < 1) + {//share same xcoord + if(fabs(one[1] - two[1]) < 50) + { + //fixme - trace right here to make certain that there really and truly is adjacency + + if(one[1] > two[1]) + { + //assert(floorSpaces[i].getYMinus() == -1); + //assert(floorSpaces[j].getYPlus() == -1); + floorSpaces[i].setYMinus(floorSpaces[j].getId()); + floorSpaces[j].setYPlus(floorSpaces[i].getId()); + } + else + { + //assert(floorSpaces[i].getYPlus() == -1); + //assert(floorSpaces[j].getYMinus() == -1); + floorSpaces[i].setYPlus(floorSpaces[j].getId()); + floorSpaces[j].setYMinus(floorSpaces[i].getId()); + } + } + } + + if(fabs(one[1] - two[1]) < 1) + {//share same xcoord + if(fabs(one[0] - two[0]) < 50) + { + //fixme - trace right here to make certain that there really and truly is adjacency + + if(one[0] > two[0]) + { + //assert(floorSpaces[i].getXMinus() == -1); + //assert(floorSpaces[j].getXPlus() == -1); + floorSpaces[i].setXMinus(floorSpaces[j].getId()); + floorSpaces[j].setXPlus(floorSpaces[i].getId()); + } + else + { + //assert(floorSpaces[i].getXPlus() == -1); + //assert(floorSpaces[j].getXMinus() == -1); + floorSpaces[i].setXPlus(floorSpaces[j].getId()); + floorSpaces[j].setXMinus(floorSpaces[i].getId()); + } + } + } + + + } + } + + OutputDebugString("Calculating node partial status and height\n"); + for(i = 0; i < regionsInUse; i++) + { + vec3_t max; + VectorCopy(floorSpaces[i].getMin(), max); + max[0] += 48; + max[1] += 48; + max[2] += 64;//? enemy height? + + vec3_t testmin, testmax; + VectorCopy(floorSpaces[i].getMin(), testmin); + testmin[0] += 8; + testmin[1] += 8; + testmin[2] += 16; + VectorCopy(max, testmax); + testmax[0] -= 8; + testmax[1] -= 8; + + trace_t tr; + gi.trace(vec3_origin, testmin, testmax, vec3_origin, 0, MASK_SOLID, &tr); + + if(tr.fraction < 1.0 || tr.startsolid || tr.allsolid) + { + floorSpaces[i].setPartial(PARTIAL_FLOOR); + } + else + { + floorSpaces[i].setPartial(0); + } + + //check for floor gaps + vec3_t center; + VectorCopy(floorSpaces[i].getMin(), center); + center[0] += 24; + center[1] += 24; + for(int j = 0; j < 4; j++) + { + vec3_t testTop; + + VectorCopy(center, testTop); + + testTop[0] += 16 * (j>1)?-1:1; + testTop[1] += 16 * (j&1)?-1:1; + + vec3_t testBottom; + + VectorCopy(testTop, testBottom); + testBottom[2] -= (25+16);//we start 16 above, 24 is step height + + gi.trace(testTop, vec3_origin, vec3_origin, testBottom, 0, MASK_SOLID, &tr); + if(tr.fraction > .99 && !tr.startsolid && !tr.allsolid) + { // uh oh + floorSpaces[i].setPartialFlag(PARTIAL_FLOORGAP); + break; + } + + } + + vec3_t minV = {-24, -24, 0}; + vec3_t maxV = {24, 24, 1}; + vec3_t testPoint; + vec3_t testTop; + + VectorCopy(floorSpaces[i].getMin(), testPoint); + testPoint[0] += 24; + testPoint[1] += 24; + testPoint[2] += 24; + VectorCopy(testPoint, testTop); + testTop[2] += 2048; + + gi.trace(testPoint, minV, maxV, testTop, 0, MASK_SOLID, &tr); + + if(tr.startsolid || tr.allsolid) + { + floorSpaces[i].setTopZ(floorSpaces[i].getMin()[2]); + } + else + { + floorSpaces[i].setTopZ(tr.endpos[2]); + } + } + + for(i = 0; i < regionsInUse; i++) + { + floorSpaces[i].clearNear(); + } + + //now find out who owns each node + for(i = 0; i < regionsInUse; i++) + { + floorSpaces[i].setNode(-1); + } + + for(i = 1; i < aiList->getNumElems(); i++) + { + aiList->getNode(i)->setMyFloor(getFloorForSpot(aiList->getNode(i)->getPos())); + } + + OutputDebugString("Connecting floors to nodes\n"); + for(i = 0; i < regionsInUse; i++) + { + if(!(i%100)) + { + OutputDebugString(va("Connected %d floors\n", i)); + } + int traceStyle = 2; + do + { + for(int j = 1; j < aiList->getNumElems(); j++) + { + if(clearLineForFloor(i, aiList->getNode(j)->getMyFloor(), traceStyle)) + { + vec3_t dist; + int addedNode = floorSpaces[i].setFirstFreeNode(j); + if(addedNode != -1) + { + VectorSubtract(floorSpaces[i].getMin(), aiList->getNode(j)->getPos(), dist); + floorSpaces[i].setNearDist(addedNode, VectorLength(dist)); + } + } + } + traceStyle--;//get progressively more lax with the criteria for nearness + }while(floorSpaces[i].getNearNode(0) == -1 && traceStyle > -1); + + for(int j = 1; j < NUM_NEAR_NODES; j++) + { + //make certain that the first one is the best one + if(floorSpaces[i].getNearNode(j) != -1) + { + if(floorSpaces[i].getNearDist(j) < floorSpaces[i].getNearDist(0)) + { + float tempDist = floorSpaces[i].getNearDist(j); + short tempNode = floorSpaces[i].getNearNode(j); + floorSpaces[i].setNearDist(j, floorSpaces[i].getNearDist(0)); + floorSpaces[i].setNearNode(j, floorSpaces[i].getNearNode(0)); + floorSpaces[i].setNearDist(0, tempDist); + floorSpaces[i].setNearNode(0, tempNode); + } + } + } + } + + vec3_t minSize = {-16, -16, 0}; + vec3_t maxSize = {16, 16, 24}; + + OutputDebugString("Adding floor-node connections from node-node connections\n"); + for(i = 0; i < aiList->getNumElems(); i++) + { + CAINode *node = aiList->getNode(i); + + if(node) + { + for(int j = 1; j <= node->getNumLinks(); j++) + { + CAIConnect *connect = node->getLinkNum(j); + + if(connect) + { + CAINode *otherNode = aiList->getNode(connect->getLinkId()); + + if(otherNode) + { //run the length of the path here, adding both nodes to all grid squares under them + vec3_t one, two; + VectorCopy(node->getPos(), one); + VectorCopy(otherNode->getPos(), two); + AddNodesViaLine(one, two, node->getId(), otherNode->getId()); + one[0] -= 16; + two[0] -= 16; + one[1] -= 16; + two[1] -= 16; + AddNodesViaLine(one, two, node->getId(), otherNode->getId()); + one[0] += 32; + two[0] += 32; + AddNodesViaLine(one, two, node->getId(), otherNode->getId()); + one[1] += 32; + two[1] += 32; + AddNodesViaLine(one, two, node->getId(), otherNode->getId()); + one[0] -= 32; + two[0] -= 32; + AddNodesViaLine(one, two, node->getId(), otherNode->getId()); + } + } + } + } + } + + OutputDebugString("Ensuring neighbors have nodes\n"); + int recheck = 0; + do + { + OutputDebugString("Neighbor pass\n"); + recheck = 0; + + for(i = 0; i < regionsInUse; i++) + { + CAIFloorSquare *curSquare; + + curSquare = &floorSpaces[i]; + + if(!curSquare->hasNodes()) + { + continue; + } + + if(curSquare->getXPlus() > -1 && (!floorSpaces[curSquare->getXPlus()].hasNodes())) + { + floorSpaces[curSquare->getXPlus()].setFirstFreeNode(curSquare->getNearNode(0)); + recheck = 1; + } + if(curSquare->getXMinus() > -1 && (!floorSpaces[curSquare->getXMinus()].hasNodes())) + { + floorSpaces[curSquare->getXMinus()].setFirstFreeNode(curSquare->getNearNode(0)); + recheck = 1; + } + if(curSquare->getYPlus() > -1 && (!floorSpaces[curSquare->getYPlus()].hasNodes())) + { + floorSpaces[curSquare->getYPlus()].setFirstFreeNode(curSquare->getNearNode(0)); + recheck = 1; + } + if(curSquare->getYMinus() > -1 && (!floorSpaces[curSquare->getYMinus()].hasNodes())) + { + floorSpaces[curSquare->getYMinus()].setFirstFreeNode(curSquare->getNearNode(0)); + recheck = 1; + } + } + }while(recheck); + + for(i = 0; i < regionsInUse; i++) + { + CAIFloorSquare *floor = &floorSpaces[i]; + + if(!floor->getPartial()) + { + continue; + } + + if(floor->getYMinus() != -1) + { + CAIFloorSquare *otherfloor = &floorSpaces[floor->getYMinus()]; + + if(otherfloor->getPartial()) + {//see if their boundary is okay + vec3_t min, max; + + VectorCopy(floor->getMin(), min); + VectorCopy(min, max); + min[0] += 8; + min[1] += 8; + max[0] += 48 - 8; + max[1] += 48 - 8; + + //now the specific bit + min[1] -= 24; + max[1] -= 24; + + trace_t tr; + gi.trace(vec3_origin, min, max, vec3_origin, 0, MASK_SOLID, &tr); + + if(tr.fraction < 1.0 || tr.startsolid || tr.allsolid) + { + } + else + { + floor->setPartialFlag(PARTIAL_YMINUS); + otherfloor->setPartialFlag(PARTIAL_YPLUS); + } + + + } + } + + if(floor->getYPlus() != -1) + { + CAIFloorSquare *otherfloor = &floorSpaces[floor->getYPlus()]; + + if(otherfloor->getPartial()) + {//see if their boundary is okay + vec3_t min, max; + + VectorCopy(floor->getMin(), min); + VectorCopy(min, max); + min[0] += 8; + min[1] += 8; + max[0] += 48 - 8; + max[1] += 48 - 8; + + //now the specific bit + min[1] += 24; + max[1] += 24; + + trace_t tr; + gi.trace(vec3_origin, min, max, vec3_origin, 0, MASK_SOLID, &tr); + + if(tr.fraction < 1.0 || tr.startsolid || tr.allsolid) + { + } + else + { + floor->setPartialFlag(PARTIAL_YPLUS); + otherfloor->setPartialFlag(PARTIAL_YMINUS); + } + + + } + } + + if(floor->getXMinus() != -1) + { + CAIFloorSquare *otherfloor = &floorSpaces[floor->getXMinus()]; + + if(otherfloor->getPartial()) + {//see if their boundary is okay + vec3_t min, max; + + VectorCopy(floor->getMin(), min); + VectorCopy(min, max); + min[0] += 8; + min[1] += 8; + max[0] += 48 - 8; + max[1] += 48 - 8; + + //now the specific bit + min[0] -= 24; + max[0] -= 24; + + trace_t tr; + gi.trace(vec3_origin, min, max, vec3_origin, 0, MASK_SOLID, &tr); + + if(tr.fraction < 1.0 || tr.startsolid || tr.allsolid) + { + } + else + { + floor->setPartialFlag(PARTIAL_XMINUS); + otherfloor->setPartialFlag(PARTIAL_XPLUS); + } + + + } + } + + if(floor->getXPlus() != -1) + { + CAIFloorSquare *otherfloor = &floorSpaces[floor->getXPlus()]; + + if(otherfloor->getPartial()) + {//see if their boundary is okay + vec3_t min, max; + + VectorCopy(floor->getMin(), min); + VectorCopy(min, max); + min[0] += 8; + min[1] += 8; + max[0] += 48 - 8; + max[1] += 48 - 8; + + //now the specific bit + min[0] += 24; + max[0] += 24; + + trace_t tr; + gi.trace(vec3_origin, min, max, vec3_origin, 0, MASK_SOLID, &tr); + + if(tr.fraction < 1.0 || tr.startsolid || tr.allsolid) + { + } + else + { + floor->setPartialFlag(PARTIAL_XPLUS); + otherfloor->setPartialFlag(PARTIAL_XMINUS); + } + } + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// +// CAIConnect +// +//////////////////////////////////////////////////////////////////////////////////////////////// + +void CAIConnect::save(FILE **fp) +{ + fwrite(&linkId, sizeof(linkId), 1, *fp); + fwrite(&dist, sizeof(dist), 1, *fp); + fwrite(&type, sizeof(type), 1, *fp); +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// +// CAINode +// +//////////////////////////////////////////////////////////////////////////////////////////////// + +void CAINode::clearLinks(void) +{ + list::iterator it; + + for(it = links.begin(); it != links.end(); it++) + { + (*it).setValid(1); + } +} + +void CAINode::addLink(int newLink, int isCombatPoint, connectType cType) +{ + list::iterator it; + list &addList = (isCombatPoint) ? combatPoints:links; + + for(it = addList.begin(); it != addList.end(); it++) + { + if((*it).getLinkId() == newLink) + { //already in the list - no need to add + return; + } + } + + CAINode *nextNode = (isCombatPoint) ? aiList->getCombatNode(newLink):aiList->getNode(newLink); + assert(nextNode); + vec3_t distV; + VectorSubtract(pos, nextNode->pos, distV); + float d = VectorLength(distV); + + CAIConnect newConnect(newLink, d, 0, cType); + + addList.insert(it, newConnect); +} + +void CAINode::destroyLink(int deadId) +{ + list::iterator it; + + for(it = links.begin(); it != links.end(); it++) + { + if((*it).getLinkId() == deadId) + { + if((*it).getType() != LINK_NORMAL) + { // don't destroy special link types EVER. + return; + } + links.erase(it); + return; + } + } +} + +void CAINode::save(FILE *fp) +{ // if this gets changed, AI_NODE_VERSION needs to be adjusted + int oldOutdatedVar = 0; + + fwrite(pos, sizeof(pos), 1, fp); + fwrite(&radius, sizeof(radius), 1, fp); + fwrite(&pointType, sizeof(pointType), 1, fp); + fwrite(&oldOutdatedVar, sizeof(oldOutdatedVar), 1, fp); + + fwrite(&ignoreForSpawning, sizeof(ignoreForSpawning), 1, fp); + +} + +void CAINode::load(FILE **fp) +{ // if this gets changed, AI_NODE_VERSION needs to be adjusted + + int oldOutdatedVar; + + fread(pos, sizeof(pos), 1, *fp); + fread(&radius, sizeof(radius), 1, *fp); + fread(&pointType, sizeof(pointType), 1, *fp); + fread(&oldOutdatedVar, sizeof(oldOutdatedVar), 1, *fp); + + if(loadVersion < 9) + { //sigh - here we go again + ignoreForSpawning = 0; + } + else + { + fread(&ignoreForSpawning, sizeof(ignoreForSpawning), 1, *fp); + } +} + +void CAINode::savePaths(FILE **fp) +{ + int numLinks; + list::iterator it; + + fwrite(&pointType, sizeof(pointType), 1, *fp); + fwrite(&id, sizeof(id), 1, *fp); + fwrite(pos, sizeof(pos), 1, *fp); + + if(!(pointType & EPS_LINKMAIN)) + { // only main link nodes have any of this... + return; + } + + numLinks = links.size(); + fwrite(&numLinks, sizeof(numLinks), 1, *fp); + + for(it = links.begin(); it != links.end(); it++) + { + (*it).save(fp); + } + fwrite(paths, sizeof(paths[0]) * aiList->getNumElems(), 1, *fp); + fwrite(pathRanks, sizeof(pathRanks[0]) * aiList->getNumElems(), 1, *fp); + + numLinks = combatPoints.size(); + fwrite(&numLinks, sizeof(numLinks), 1, *fp); + for(it = combatPoints.begin(); it != combatPoints.end(); it++) + { + (*it).save(fp); + } + + fwrite(&radius, sizeof(radius), 1, *fp); + fwrite(&flee1, sizeof(flee1), 1, *fp); + fwrite(&flee2, sizeof(flee2), 1, *fp); + + fwrite(&ignoreForSpawning, sizeof(ignoreForSpawning), 1, *fp); + + fwrite(&minHeight, sizeof(minHeight), 1, *fp); + fwrite(&maxHeight, sizeof(maxHeight), 1, *fp); +} + +void CAINode::drawConnections(void) +{ + list::iterator curDraw; + + if(pointType & EPS_LINKMAIN) + { + for(curDraw = links.begin(); curDraw != links.end(); curDraw++) + { + CAINode *other = aiList->getNode((*curDraw).getLinkId()); + paletteRGBA_t col = {250, 0, 0, 250}; + + if(!(*curDraw).getLinkId()) + { // node one is crap + continue; + } + if(!other) + { //yeah + continue; + } + + if(other) + { + FX_MakeLine(pos, other->pos, col, 6, MULTICAST_PVS); + } + } + + for(curDraw = combatPoints.begin(); curDraw != combatPoints.end(); curDraw++) + { + CAINode *other = aiList->getCombatNode((*curDraw).getLinkId()); + paletteRGBA_t col = {0, 250, 0, 250}; + + if(!(*curDraw).getLinkId()) + { // node one is crap + continue; + } + if(!other) + { //yeah + continue; + } + + if(other) + { + FX_MakeLine(pos, other->pos, col, 6, MULTICAST_PVS); + } + } + } +} + +void CAINode::initPathData(int num) +{ // yeah. Prolly should dealloc this somewhere, but I'm lazy + paths = new byte[num]; + pathRanks = new short[num]; + memset(paths, 0, sizeof(byte) * num); + memset(pathRanks, 0, sizeof(short) * num); + +} + +int CAINode::isConnectedTo(int linkId) +{ + int val = 1; + list::iterator it; + + for(it = links.begin(); it != links.end(); it++) + { + if((*it).getLinkId() == linkId) + { //wow! connected! + return val; + } + val++; + } + return 0; +} + +void CAINode::calcPath(void) +{ + // I think this implementation is a little off - the last check is probably not quite right :/ + + int curRank = 0; + + // init everything + for(int i = 0; i < aiList->getNumElems(); i++) + { + paths[i] = 0; + pathRanks[i] = 16000; + } + + if(links.size() == 0) + { // can't get here, because hey, I can't get ANYWHERE + for(int i = 0; i < aiList->getNumElems(); i++) + { + paths[i] = 0; + pathRanks[i] = 16000;//fixme - if we have more than 16000 nodes, this won't work + } + flee1 = 0; + flee2 = 0; + degenNodes++; + return; + } + + if(pointType & EPS_FLEE) + { //um, if I'm a flee point, I just run to myself, yeah? + flee1 = id; + flee2 = id; + } + else + { // as we come across flee nodes, since we're guaranteed that we get points in near to far order, + // we should just grab the first two... + flee1 = 0; + flee2 = 0; + } + + int numAdded = 1; + + checked = 1;//duh + + list pathList; + list::iterator it; + + list::iterator test; + + //going to me should be via route me + paths[id] = 0; + pathRanks[id] = curRank; + + curRank++; + + //initialize the path list from the first entries - but still check 'em + for(it = links.begin(); it != links.end(); it++) + { + CAINode *nextNode = aiList->getNode((*it).getLinkId()); + assert(nextNode); + nextNode->checked = 1; + + CAIConnect edge((*it).getLinkId(), (*it).getDist(), (*it).getLinkId()); + + pathList.insert(pathList.end(), edge); + + numAdded++; + } + + float minDist; + + // this is a poorly controlled loop :/ + do + { + // init everything for the next iteration + minDist = 999999; + test = pathList.end(); + + // search through the list to find the path that has traveled the least distance + for(it = pathList.begin(); it != pathList.end(); it++) + { + if((*it).getValid() == 0) + { + continue; + } + if((*it).getDist() < minDist) + { // found a shorter one! Woo hoo! This will cover adjacent nodes, I think + test = it; + minDist = (*test).getDist(); + } + } + + if(test == pathList.end()) + { // looks like there's no more connections - this is a problem... ugly way to handle exiting :/ + break; + } + + (*test).setValid(0); + + if(aiList->getNode((*test).getLinkId())->getPointType() & EPS_FLEE) + { // well, that should do it, I believe + if(!flee1) + { + flee1 = (*test).getLinkId(); + } + else if(!flee2) + { + flee2 = (*test).getLinkId(); + } + } + else if(aiList->getNode((*test).getLinkId())->getPointType() & EPS_FLEEFRIENDLY) + { + if(!flee1) + { + flee1 = (*test).getLinkId(); + } + } + else if(aiList->getNode((*test).getLinkId())->getPointType() & EPS_FLEEENEMY) + { + if(!flee2) + { + flee2 = (*test).getLinkId(); + } + } + + //check this node out and figure out what its head is... + CAINode *testNode = aiList->getNode((*test).getLinkId()); + assert(testNode); + + paths[testNode->getId()] = isConnectedTo((*test).getFirst()); + pathRanks[testNode->getId()] = curRank; + curRank++; + + assert(paths[testNode->getId()] <= links.size()); + + for(it = testNode->links.begin(); it != testNode->links.end(); it++) + { + // add all the nodes connected to this node + + CAINode *otherNode = aiList->getNode((*it).getLinkId()); + assert(otherNode); + + if(otherNode->checked) + { //this was already snagged by a shorter path + continue; + } + + float newDist = (*test).getDist() + (*it).getDist(); + CAIConnect edge((*it).getLinkId(), newDist, (*test).getFirst()); + + pathList.insert(pathList.end(), edge); + + numAdded++; + + otherNode->checked = 1; + } + + pathList.erase(test); + }while(1 == 1); + + pathList.clear(); +} + +void CAINode::calcRadius(void) +{ + float curAng; + vec3_t traceEnd; + float minDist = 1.0; + vec3_t curDir; + + for(curAng = 0; curAng < M_PI * 2.0; curAng += (M_PI * .1))//20 steps + { + curDir[0] = cos(curAng); + curDir[1] = sin(curAng); + curDir[2] = 0;//this does seem to ignore elevation largely, but oh well... + + VectorScale(curDir, 1024, traceEnd);//perty far + VectorAdd(traceEnd, pos, traceEnd); + + trace_t tr; + + float oldFrac; + + gi.trace(pos, 0, 0, traceEnd, 0, CONTENTS_SOLID, &tr); + + oldFrac = tr.fraction; + + for(float curCheck = oldFrac * 1024; curCheck > 0; curCheck -= 32) + { + vec3_t curTest; + vec3_t down; + + VectorMA(pos, curCheck, curDir, curTest); + VectorCopy(curTest, down); + down[2] -= (32+24);//ick + + gi.trace(curTest, 0, 0, down, 0, CONTENTS_SOLID, &tr); + + if(tr.fraction == 1.0) + { + oldFrac = curCheck/1024.0; + } + } + + if(oldFrac < minDist) + { + minDist = oldFrac; + } + } + + radius = minDist * 1024; +} + +#define VISIBLE_INCREMENT 64 +#define MAX_VIS_DIST 1024 + +float CAINode::getPathDist(int destNode) +{ + if(destNode == id) + { + return 0;//done + } + + if(paths[destNode] == 0) + { + return -1; + } + + CAINode *other = aiList->getNode(paths[destNode]); + + vec3_t myDist; + + VectorSubtract(other->pos, pos, myDist); + + float further = other->getPathDist(destNode); + + if(further == -1) + { // ran into a problem!!! + return -1; + } + else + { + return VectorLength(myDist) + further; + } +} +void CAINode::destroyLinks(void) +{ + links.clear(); + combatPoints.clear(); +} + +CAIConnect *CAINode::getLinkNum(int num) +{ + list::iterator it; + + int counter = 1; + + for(it = links.begin(); it != links.end(); it++) + { + if(counter == num) + { + return &(*it); + } + counter++; + } + + return 0; +} + +int CAINode::getPathToPoint(int p) +{ + assert(paths); + int linkNum = paths[p]; + + if(linkNum == 0) + { + return 0; + } + + CAIConnect *myConnect = getLinkNum(linkNum); + + if(myConnect) + { + return myConnect->getLinkId(); + } + + return 0; +} +void CAINode::display(void) +{ + list::iterator it; + + for(it = connectedNodes.begin(); it != connectedNodes.end(); it++) + { + fxRunner.exec("canthear", aiList->getNode(*it)->getPos()); + + paletteRGBA_t col = {0, 250, 125, 250}; + } + + list::iterator it2; + + int i = 0; + for(it2 = links.begin(); it2 != links.end(); it2++) + { + paletteRGBA_t col = {250, 0, 0, 250}; + FX_MakeLine(pos, aiList->getNode((*it2).getLinkId())->getPos(), col, 4, MULTICAST_PVS); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// +// CAIListData +// +//////////////////////////////////////////////////////////////////////////////////////////////// + +CAINode *CAIListData::getNode(int num) +{ + return &nodes[num]; +} + +CAINode *CAIListData::getCombatNode(int num) +{ + return &combatPoints[num]; +} + +void CAIListData::validateNodeLinks(void) +{ + vector::iterator first; + vector::iterator second; + + + int selfreference = 0; + int onewaylinks = 0; + int loopingPaths = 0; + float numChecks = 0; + float pathChecks = 0; + + for(first = nodes.begin(); first != nodes.end(); first++) + { + if(first == nodes.begin()) + { // this one is insignficant + first++; + } + for(second = first; second != nodes.end(); second++) + { + if(first == second) + { + continue; + } + + int id1 = (*first).getId(); + int id2 = (*second).getId(); + + int path1 = (*first).getPathToPoint(id2); + int path2 = (*second).getPathToPoint(id1); + + if(!path1 || !path2) + { + failedConnects++; + + if(!path1 && !path2) + { // well, enough of that + continue; + } + else + { + onewaylinks++; + } + } + + for(int i = 0; i < nodes.size(); i++) + { + if((i == id1) || (i == id2)) + { // meaningless tests... + continue; + } + + int test1 = (*first).getPathToPoint(i); + int test2 = (*second).getPathToPoint(i); + + if((test1 == id2) && (test2 == id1)) + { // circular - fukd + selfreference++; + } + } + + // see if we can get from one to two... + if(id1) + { + numChecks++; + clearChecks(); + + int curNode = id1; + while((curNode != id2) && curNode) + { + //map::iterator check = nodes.find(curNode); + vector::iterator check = &nodes[curNode]; + if(check != nodes.end()) + { + if(!(*check).getChecked()) + { + pathChecks++; + curNode = (*check).getPathToPoint(id2); + (*check).setChecked(1); + } + else + { // we've looped. Damn it. + curNode = 0; + } + } + else + { //huh? Crap. + curNode = 0; + } + } + + if(!curNode) + { + loopingPaths++; + } + } + + // also see if we can get from two to one + if(id2) + { + numChecks++; + clearChecks(); + + int curNode = id2; + while((curNode != id1) && curNode) + { + vector::iterator check = &nodes[curNode]; + if(check != nodes.end()) + { + if(!(*check).getChecked()) + { + pathChecks++; + curNode = (*check).getPathToPoint(id1); + (*check).setChecked(1); + } + else + { // we've looped. Damn it. + curNode = 0; + } + } + else + { //huh? Crap. + curNode = 0; + } + } + + if(!curNode) + { + loopingPaths++; + } + } + + } + } + Com_Printf("%d nodes pointing towards each other (out of %d connections)\n", selfreference, nodes.size() * nodes.size() * nodes.size()); + Com_Printf("%d nodes link up in only one direction\n", onewaylinks); + Com_Printf("%d Nodes were unable to find each other!\n", failedConnects); + Com_Printf("%d Nodes that are completely unconnected\n", degenNodes); + Com_Printf("%d Invalid looping paths\n", loopingPaths); + Com_Printf("%f Average Nodes from point to point\n", pathChecks/numChecks); + Com_Printf("%d Regions\n", regions.size()); +} + +void CAIListData::graphicData(float val) +{ + int curDraw = ((int)(val*10))%30; + + while(curDraw < nodes.size()) + { + nodes[curDraw].drawConnections(); + + curDraw += 30; + } + + curDraw = ((int)(val*10))%30; + + while(curDraw < combatPoints.size()) + { + combatPoints[curDraw].drawConnections(); + + curDraw += 30; + } + +} + +void CAIListData::addPoint(edict_t *ent, char *cmd, int type, float *altCenter) +{ + CAINode newPoint; + + if(nodes.size() == 0) + { //the initial node must be empty for this to work + newPoint.set(vec3_origin, 0); + newPoint.setPointType(EPS_NORMAL); + nodes.push_back(newPoint); + StartNodeDrawMonkey(); + } + + vec3_t spot; + + if(altCenter) + { + VectorCopy(altCenter, spot); + } + else + { + VectorCopy(ent->s.origin, spot); + } + + newPoint.set(spot, 0); + newPoint.setPointType(type); + + newPoint.setMarker(makeNodeEnt(spot, 0, type)); + + if(type & EPS_LINKMAIN) + { + nodes.push_back(newPoint); + } + else + { + combatPoints.push_back(newPoint); + } +} + +void CAIListData::connect(CAINode &one, CAINode &two, connectType newType) +{ + one.addLink(two.getId(), 0, newType); + two.addLink(one.getId(), 0, newType); +} + +void CAIListData::eliminateRedundantConnections(void) +{ + vector::iterator out1; + vector::iterator out2; + vector::iterator in1; + + for(out1 = nodes.begin(); out1 != nodes.end(); out1++) + { + for(out2 = nodes.begin(); out2 != nodes.end(); out2++) + { + if(out1 == out2) + { + continue; + } + + if(!(*out1).isConnectedTo((*out2).getId())) + { + continue; + } + + for(in1 = nodes.begin(); in1 != nodes.end(); in1++) + { + if(in1 == out2) + { + continue; + } + if(!(*out1).isConnectedTo((*in1).getId())) + { + continue; + } + + vec3_t dir1, dir2; + float len1, len2; + + //ignore z's for this check - fixme? + + VectorSubtract((*out1).getPos(), (*in1).getPos(), dir1); + dir1[2] = 0; + len1 = VectorNormalize(dir1); + VectorSubtract((*out2).getPos(), (*in1).getPos(), dir2); + dir2[2] = 0; + len2 = VectorNormalize(dir2); + + if(DotProduct(dir1, dir2) < -NODE_COLINEAR) + { //in is between out1 and out2 + (*out1).destroyLink((*out2).getId()); + (*out2).destroyLink((*out1).getId()); + + } + else if(DotProduct(dir1, dir2) > NODE_COLINEAR) + { + if(len1 > len2) + { // out2 is between out1 and in1 + (*out1).destroyLink((*in1).getId()); + (*in1).destroyLink((*out1).getId()); + } + else + { // out1 is between out2 and in1 + (*out2).destroyLink((*in1).getId()); + (*in1).destroyLink((*out2).getId()); + } + } + + } + } + } +} + + +void CAIListData::connectNode(CAINode &start, int combat) +{ + vector::iterator end; + vector::iterator testStart; + vector::iterator testEnd; + + vec3_t testmin = {-16, -16, 0};//zcheck? + vec3_t testmax = { 16, 16, 24}; + + vec3_t combatmin = {-2, -2, -2};//zcheck? + vec3_t combatmax = { 2, 2, 2}; + + int ignoreFloorTest; + float maxHeightMod; + int stairs; + int ladders; + int jump; + + if(start.getPos()[0] > 9000) + { // no links for you! This guy is dead and useless + return; + } + + if(combat) + { + testStart = combatPoints.begin(); + testEnd = combatPoints.end(); + } + else + { + testStart = nodes.begin(); + testEnd = nodes.end(); + } + + if(!(start.getPointType() & EPS_LINKMAIN)) + { // these are linked to - they don't possess links themselves + return; + } + + for(end = testStart; end != testEnd; end++) + { + if((!combat)&&(start.getId() == (*end).getId())) + { //ignore the silly case + continue; + } + + if((*end).getPos()[0] > 9000) + { // no links for you! This guy is dead and useless + continue; + } + + + ignoreFloorTest = 0; + maxHeightMod = 1.0; + stairs = 0; + ladders = 0; + jump = 0; + + vec3_t distV; + VectorSubtract(start.getPos(), (*end).getPos(), distV); + + if(combat) + { + if(VectorLength(distV) > MAX_COMBATPOINT_DIST) + { + continue; + } + } + else + { + if(VectorLength(distV) > MAX_LINK_DIST) + { + continue; + } + } + + vec3_t testV; + VectorCopy(distV, testV); + VectorNormalize(testV); + //we need to test the z component of the testV to make certain that these vectors don't have too steep a slope + + vec3_t st, e; + VectorCopy(start.getPos(), st); + VectorCopy((*end).getPos(), e); + + if(fabs(testV[2]) > MAX_PATH_SLOPE) + { + continue; + } + + trace_t tr; + + if(combat) + { + gi.trace(st, combatmin, combatmax, e, NULL, MASK_SOLID, &tr); + } + else + { + gi.trace(st, testmin, testmax, e, NULL, CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_DEADMONSTER|CONTENTS_SHOT|CONTENTS_WINDOW, &tr); + } + + if(tr.fraction < .99) + { + continue; + } + if(tr.startsolid) + { + continue; + } + + if((!ignoreFloorTest)&&(!isPathLevel((*end).getPos(), start.getPos(), maxHeightMod, 0))) + { + continue; + } + + // clear path... + + if(stairs) + { + //signs on these? + start.addLink((*end).getId(), 0, (start.getPos() > (*end).getPos()) ? LINK_STAIR_DOWN:LINK_STAIR_UP); + (*end).addLink(start.getId(), 0, (start.getPos() < (*end).getPos()) ? LINK_STAIR_DOWN:LINK_STAIR_UP); + } + else if(ladders) + { + start.addLink((*end).getId(), 0, (start.getPos() > (*end).getPos()) ? LINK_LADDER_DOWN:LINK_LADDER_UP); + (*end).addLink(start.getId(), 0, (start.getPos() < (*end).getPos()) ? LINK_LADDER_DOWN:LINK_LADDER_UP); + } + else if(jump) + { + start.addLink((*end).getId(), 0, LINK_JUMP); + } + else + { + start.addLink((*end).getId(), combat, LINK_NORMAL); + if(!combat) + { // combat nodes don't get links - they are sad and friendless. + (*end).addLink(start.getId(), 0, LINK_NORMAL); + } + } + } +} + +void CAIListData::buildPathConnections(void) +{ + int i; + + failedConnects = 0; + degenNodes = 0; + + for(i = 0; i < nodes.size(); i++) + { + nodes[i].destroyLinks(); + connectNode(nodes[i]); + + // also connect its combat points + connectNode(nodes[i], 1); + } + + eliminateRedundantConnections(); + + for(i = 0; i < nodes.size(); i++) + { + nodes[i].initPathData(nodes.size()); + clearChecks(); + nodes[i].calcPath(); + } +} + +int CAIListData::getNearestNode(vec3_t spot, float *distVal) +{ + int pos = 0; + float minDist = 9999999; + + if(nodes.size() <= 1) + { //don't destroy the dummy guy + return 0; + } + + for(int i = 1; i < nodes.size(); i++) + { + vec3_t test; + + VectorSubtract(nodes[i].getPos(), spot, test); + float dist = VectorLength(test); + if(dist < minDist) + { + minDist = dist; + pos = i; + } + } + + if(distVal) + { + *distVal = minDist; + } + return pos; +} + +int CAIListData::getNearestCombatPoint(vec3_t spot, float *distVal) +{ + int pos = 0; + float minDist = 9999999; + + if(combatPoints.size() <= 1) + { //don't destroy the dummy guy + return 0; + } + + for(int i = 0; i < combatPoints.size(); i++) + { + vec3_t test; + + VectorSubtract(combatPoints[i].getPos(), spot, test); + float dist = VectorLength(test); + if(dist < minDist) + { + minDist = dist; + pos = i; + } + } + + if(distVal) + { + *distVal = minDist; + } + return pos; +} + +void CAINode::removeBadLink(int deadId) +{ + list::iterator it; + + for(it = links.begin(); it != links.end(); it++) + { + if((*it).getLinkId() == deadId) + { + links.erase(it); + return; + } + } +} + +void CAINode::removeBadCombatPoint(int deadId) +{ + list::iterator it; + + for(it = combatPoints.begin(); it != combatPoints.end(); it++) + { + if((*it).getLinkId() == deadId) + { + combatPoints.erase(it); + return; + } + } +} + + +void CAIListData::deleteNode(vec3_t spot) +{ + int delNode, delCP; + float nearNode = 0; + float nearCP = 0; + + delNode = getNearestNode(spot, &nearNode); + delCP = getNearestCombatPoint(spot, &nearCP); + + if(nearCP <= 0) + { + nearCP = 1024; + } + if(nearNode <= 0) + { + nearNode = 1024; + } + + if(nearCP < nearNode) + { + if(nearCP > 128) + { + return; + } + + G_FreeEdict(combatPoints[delCP].getMarker()); + + for(int i = 0; i < nodes.size(); i++) + { + nodes[i].removeBadCombatPoint(delCP); + } + + vector::iterator it; + + it = &combatPoints[delCP]; + combatPoints.erase(it); + + Com_Printf("Combat Point deleted\n"); + } + else + { + if(nearNode > 128) + { + return; + } + + G_FreeEdict(nodes[delNode].getMarker()); + + for(int i = 0; i < nodes.size(); i++) + { + nodes[i].removeBadLink(delNode); + } + + + vector::iterator it; + + it = &nodes[delNode]; + nodes.erase(it); + + Com_Printf("Point deleted\n"); + } +} + +void CAIListData::toggleIgnoreNode(vec3_t spot) +{ + int moveNode; + float nearNode = 0; + + moveNode = getNearestNode(spot, &nearNode); + + if(nearNode <= 0) + { + return; + } + + if(nearNode > 128) + { + return; + } + + int newState = nodes[moveNode].toggleIgnore(); + edict_t *ed = nodes[moveNode].getMarker(); + + if(ed) + { + if(newState) + { + fxRunner.execContinualEffect("edit/ignore", ed); + } + else + { + fxRunner.stopContinualEffect("edit/ignore", ed); + } + } + + + + Com_Printf("Status on node toggled\n"); +} + +void CAIListData::numberLists(void) +{ + int i; + int sz = nodes.size(); + + for(i = 0; i < sz; i++) + { + nodes[i].setId(i);//hold over from before + } + + sz = combatPoints.size(); + + for(i = 0; i < sz; i++) + { + combatPoints[i].setId(i); + } +} + +void CAIListData::movePoint(vec3_t spot) +{ + int moveNode; + int moveCP; + float nearNode = 0; + float nearCP = 0; + + moveNode = getNearestNode(spot, &nearNode); + moveCP = getNearestCombatPoint(spot, &nearCP); + + if((nearCP <= 0)&&(nearNode <= 0)) + { + return; + } + + if((nearCP > 0)&&(nearCP < nearNode)) + { + if(nearCP > 128) + { + return; + } + + combatPoints[moveCP].setPos(spot); + edict_t *ed = combatPoints[moveCP].getMarker(); + VectorCopy(spot, ed->s.origin); + } + else + { + if(nearNode > 128) + { + return; + } + + nodes[moveNode].setPos(spot); + edict_t *ed = nodes[moveNode].getMarker(); + VectorCopy(spot, ed->s.origin); + } + + Com_Printf("Point moved\n"); +} + +void CAIListData::checkEnvironments(void) +{ + int i; + int sz = nodes.size(); + + // already connected with paths at this point + + // do environmental stuff for path nodes + for(i = 0; i < sz; i++) + { + nodes[i].calcRadius(); + } + + sz = combatPoints.size(); + + // do the same for combat points + for(i = 0; i < sz; i++) + { + combatPoints[i].calcRadius(); + } +} + +extern cvar_t *ai_editdir; + +void CAIListData::saveExport(void) +{ + vector::iterator it; + + FILE *navFile; + char name[MAX_OSPATH]; + + //ew! + //Com_sprintf (name, sizeof(name), "f:/sof/base/maps/%s.nvb", level.mapname); + Com_sprintf (name, sizeof(name), "%s/base/maps/%s.nvb", ai_editdir->string, level.mapname); + + navFile = fopen (name, "wb"); + if (!navFile) + { + Com_Printf ("ERROR: couldn't open %s.\n", name); + return; + } + + int version = AI_EXPORT_VERSION; + + fwrite(&version, sizeof(version), 1, navFile); + + int i = nodes.size(); + + fwrite(&i, sizeof(i), 1, navFile); + for(it = nodes.begin(); it != nodes.end(); it++) + { + (*it).savePaths(&navFile); + } + + i = combatPoints.size(); + + fwrite(&i, sizeof(i), 1, navFile); + for(it = combatPoints.begin(); it != combatPoints.end(); it++) + { + (*it).savePaths(&navFile); + } + + floorData.saveExport(&navFile); + + fclose(navFile); +} + +void CAIListData::save(void) +{ + FILE *navFile; + char name[MAX_OSPATH]; + + //ew! + //Com_sprintf (name, sizeof(name), "f:/sof/base/maps/%s.nav", level.mapname); + Com_sprintf (name, sizeof(name), "%s/base/maps/%s.nav", ai_editdir->string, level.mapname); + + navFile = fopen (name, "wb"); + if (!navFile) + { + Com_Printf ("ERROR: couldn't open %s.\n", name); + return; + } + + loadVersion = AI_NODE_VERSION_CUR; + + fwrite(&loadVersion, sizeof(loadVersion), 1, navFile); + + int i = nodes.size(); + + //fixme - if deleting is added in, the gaps are GOING to have to be taken care of. + + fwrite(&i, sizeof(i), 1, navFile); + for(int j = 0; j < i; j++) + { + nodes[j].save(navFile); + } + + Com_Printf("Adding %d nodes\n", nodes.size()); + + i = combatPoints.size(); + + //fixme - if deleting is added in, the gaps are GOING to have to be taken care of. + + fwrite(&i, sizeof(i), 1, navFile); + for(j = 0; j < i; j++) + { + combatPoints[j].save(navFile); + } + + floorData.save(navFile); + + fclose(navFile); +} + + +void CAIListData::load(void) +{ + FILE *navFile; + char name[MAX_OSPATH]; + + //ew! + Com_sprintf (name, sizeof(name), "%s/base/maps/%s.nav", ai_editdir->string, level.mapname); + + navFile = fopen (name, "rb"); + if (!navFile) + { + Com_Printf ("ERROR: couldn't open %s.\n", name); + return; + } + + fread(&loadVersion, sizeof(loadVersion), 1, navFile); + if(loadVersion < AI_NODE_VERSION) + { + Com_Printf ("ERROR: wrong version for NavFile - was %d, expected %d.\n", loadVersion, AI_NODE_VERSION_CUR); + return; + } + + int numNodes; + + fread(&numNodes, sizeof(numNodes), 1, navFile); + + nodes.clear(); + regions.clear(); + + StartNodeDrawMonkey(); + initRegionTrace(); + + for(int i = 0; i < numNodes; i++) + { + CAINode newPoint; + + newPoint.load(&navFile); + + newPoint.setMarker(makeNodeEnt(newPoint.getPos(), 0, newPoint.getPointType(), newPoint.getIgnore())); + + nodes.push_back(newPoint); + } + + fread(&numNodes, sizeof(numNodes), 1, navFile); + + for(i = 0; i < numNodes; i++) + { + CAINode newPoint; + + newPoint.load(&navFile); + + newPoint.setMarker(makeNodeEnt(newPoint.getPos(), 0, newPoint.getPointType())); + + //combatPoints.push_back(newPoint); + + } + + if(loadVersion == 10) + { //load in the regions as well + fread(&numNodes, sizeof(numNodes), 1, navFile); + + for(i = 0; i < numNodes; i++) + { + CAIRegion newRegion; + + newRegion.load(&navFile); + + regions.push_back(newRegion); + } + } + + if(loadVersion >= 11) + { + floorData.load(&navFile); + } + else + { + floorData.clear(); + } + + fclose(navFile); +} + +void CAIListData::clearChecks(void) +{ + vector::iterator it; + + for(it = nodes.begin(); it != nodes.end(); it++) + { + (*it).setChecked(0); + (*it).clearLinks(); + } +} + +int canUseOperation(int *lastTime, char *operation, char *successMsg) +{ + if(*lastTime < level.time - 1) + { + *lastTime = level.time; + Com_Printf("Press key again to %s\n", operation); + return 0; + } + else + { + Com_Printf(successMsg); + return 1; + } +} + +int CAIListData::usesCmd(edict_t *ent, char *cmd) +{ + static int lastSaveTime = 0; + static int lastExportTime = 0; + static int lastLoadTime = 0; + static int lastDestroyTime = 0; + + if(!game.playerSkills.canCheat()) + { // harder difficulty levels won't let you cheat + return 0; + } + + if (dm->isDM() && !sv_cheats->value) + { + return 0; + } + + //findVolume(ent->s.origin); + + + if (stricmp(cmd, "setpoint") == 0) + { + addPoint(ent, cmd, EPS_NORMAL); + + Com_Printf("Nav point added\n"); + } + else if (stricmp(cmd, "savepoints") == 0) + { + if(canUseOperation(&lastSaveTime, "save", "Nav points saved off\n")) + { + save(); + } + } + else if (stricmp(cmd, "loadpoint") == 0) + { + if(canUseOperation(&lastLoadTime, "load", "Nav points loaded\n")) + { + load(); + } + } + else if (stricmp(cmd, "exportpoint") == 0) + { + if(canUseOperation(&lastExportTime, "export", "Nav points exported\n")) + { + exportPaths(); + } + } + else if (stricmp(cmd, "pointhelp") == 0) + { + Com_Printf("a = add point m = move point d = delete \n"); + Com_Printf("s = save l = load e = export (Hit these twice to use)\n"); + Com_Printf("1 = flee point 2 = lean point 3 = duck point 4 = cover point\n"); + Com_Printf("5 = friend flee 6 = foe flee z = destroyents i = togglespawning\n"); + } + else if (stricmp(cmd, "destroyents") == 0) + { + if(canUseOperation(&lastDestroyTime, "destroy entities", "Entities destroyed\n")) + { + elimEnts(); + } + } + else if (stricmp(cmd, "deletepoint") == 0) + { + deleteNode(ent->s.origin); + } + else if (stricmp(cmd, "movepoint") == 0) + { + movePoint(ent->s.origin); + } + else if(stricmp(cmd, "setflee") == 0) + { + addPoint(ent, cmd, EPS_FLEE); + + Com_Printf("Flee point added\n"); + } + else if(stricmp(cmd, "setfleefriendly") == 0) + { + addPoint(ent, cmd, EPS_FLEEFRIENDLY); + + Com_Printf("Friendly-only flee point added\n"); + } + else if(stricmp(cmd, "setfleeenemy") == 0) + { + addPoint(ent, cmd, EPS_FLEEENEMY); + + Com_Printf("Enemy-only flee point added\n"); + } + else if(stricmp(cmd, "toggleignore") == 0) + { + toggleIgnoreNode(ent->s.origin); + } + else if(stricmp(cmd, "startregions") == 0) + { + initRegionTrace(); + } + else if(stricmp(cmd, "toggleboxes") == 0) + { + showboxes = !showboxes; + } + else if(stricmp(cmd, "cleargrid") == 0) + { + floorData.clear(); + } + + else + { + return 0; + } + + return 1; + +} + +void CAIListData::exportPaths(void) +{ + elimEnts(); + + vec3_t farAway = {9999, 9999, 9999}; + nodes[0].setPos(farAway);//? + + + OutputDebugString("Clearing nodes from walls\n"); + clearNodesFromWall(); + numberLists(); + OutputDebugString("Building connections\n"); + buildPathConnections(); + OutputDebugString("Validating links\n"); + validateNodeLinks(); + OutputDebugString("Checking environment\n"); + checkEnvironments(); + + OutputDebugString("Preparing floor data\n"); + floorData.prepareForExport(); + + saveExport(); +} + +void CAIListData::clearNodesFromWall(void) +{ + vec3_t minSize = {-24, -24, -24}; + vec3_t maxSize = {24, 24, 24}; + + for(int i = 0; i < nodes.size(); i++) + { + vec3_t nodeMin, nodeMax; + + VectorCopy(nodes[i].getPos(), nodeMin); + VectorCopy(nodes[i].getPos(), nodeMax); + + VectorAdd(nodeMin, minSize, nodeMin); + VectorAdd(nodeMax, maxSize, nodeMax); + + trace_t tr; + + gi.trace(vec3_origin, nodeMin, nodeMax, vec3_origin, 0, MASK_SOLID, &tr); + + if(!tr.startsolid && !tr.allsolid && tr.fraction > .98) + { + continue; + } + + int foundClear = 0; + for(int j = 0; j < 8 && !foundClear; j++) + { + switch(j) + { + case 0: + nodeMin[0] -= 8; + nodeMax[0] -= 8; + break; + case 1: + nodeMin[0] += 16; + nodeMax[0] += 16; + break; + case 2: + nodeMin[0] -= 8; + nodeMax[0] -= 8; + nodeMin[1] -= 8; + nodeMax[1] -= 8; + break; + case 3: + nodeMin[1] += 16; + nodeMax[1] += 16; + break; + case 4: + nodeMin[1] -= 8; + nodeMax[1] -= 8; + nodeMin[0] -= 16; + nodeMax[0] -= 16; + break; + case 5: + nodeMin[0] += 32; + nodeMax[0] += 32; + break; + case 6: + nodeMin[0] -= 16; + nodeMax[0] -= 16; + nodeMin[1] -= 16; + nodeMax[1] -= 16; + break; + case 7: + nodeMin[1] += 32; + nodeMax[1] += 32; + break; + } + gi.trace(vec3_origin, nodeMin, nodeMax, vec3_origin, 0, MASK_SOLID, &tr); + if(!tr.startsolid && !tr.allsolid && tr.fraction > .98) + { + VectorSubtract(nodeMin, minSize, nodes[i].getPos()); + foundClear = 1; + continue; + } + } + //assert(foundClear); + + } +} + +void CAIListData::ensureRegion(edict_t *ent) +{ + floorData.ensureRegion(level.sight_client->s.origin); +} \ No newline at end of file diff --git a/Source/Game/gamecpp/ai_path_pre.h b/Source/Game/gamecpp/ai_path_pre.h new file mode 100644 index 0000000..1607c23 --- /dev/null +++ b/Source/Game/gamecpp/ai_path_pre.h @@ -0,0 +1,282 @@ +#ifndef __AI_PATH_PRE_H +#define __AI_PATH_PRE_H + +#include "q_shared.h" +#include "g_local.h" +#include "fields.h" +#include "ai.h" + +#define AI_NODE_VERSION 8 +#define AI_NODE_VERSION_CUR 11 +#define AI_EXPORT_VERSION 40 + +#define MAX_LINK_DIST 512 +#define MAX_COMBATPOINT_DIST 384 +#define MIN_NODE_DIST 96 +#define NODE_COLINEAR .97 // this should be 14 degrees or so... + +#define MAX_PATH_SLOPE .5 // sin of 30 degrees + +#define COS_25 .9063 +#define SIN_25 .4226 + +#define COS_45 .70711 + +#define NUM_NEAR_NODES 12 + +#define NODEDISTSCALE 25.0 + +#define EPS_NORMAL 0x00000001 +#define EPS_FLEE 0x00000004 +#define EPS_FLEEFRIENDLY 0x00008000 +#define EPS_FLEEENEMY 0x00010000 +#define EPS_ANYPOINT 0xFFFFFFFF + +#define EPS_LINKMAIN (EPS_NORMAL|EPS_FLEE|EPS_FLEEFRIENDLY|EPS_FLEEENEMY) + +#define EPS_FLEEGROUP (EPS_FLEE|EPS_FLEEENEMY|EPS_FLEEFRIENDLY) + +// if a floor is only partial, record if any of it's edges are clear if it's adjacent to another partial +#define PARTIAL_FLOOR 0x1 +#define PARTIAL_YMINUS 0x2 +#define PARTIAL_XPLUS 0x4 +#define PARTIAL_YPLUS 0x8 +#define PARTIAL_XMINUS 0x10 +#define PARTIAL_FLOORGAP 0x20 //these are very very very very bad + + +class CAIRegion +{ +private: + int id; + vec3_t min; + vec3_t max; + int targNode; + int blockSide; + +public: + CAIRegion(void){targNode = -1; blockSide = 0;} + void save(FILE *fp); + void load(FILE **fp); + void load(unsigned char **data); + void saveExport(FILE *fp); +}; + +class CAIFloorSquare +{ +private: + vec3_t min; + + float topZ;//this being the only possible changing thing + short id; + short yMinus; + short xPlus; + short yPlus; + short xMinus; + byte partial; + short nearNodes[NUM_NEAR_NODES]; + float nearNodeDist[NUM_NEAR_NODES]; +public: + CAIFloorSquare(void) + {id = -1; xPlus = -1; xMinus = -1; yPlus = -1; yMinus = -1; topZ = 0;} + float *getMin(void){return min;} + void setPartial(int val){partial = val;} + int getPartial(void){return partial;} + void save(FILE *fp); + void load(FILE **fp); + void saveExport(FILE **fp); + + void setId(short newVal){id = newVal;} + short getId(void){return id;} + void setYMinus(short newVal){yMinus = newVal;} + short getYMinus(void){return yMinus;} + void setXPlus(short newVal){xPlus = newVal;} + short getXPlus(void){return xPlus;} + void setYPlus(short newVal){yPlus = newVal;} + short getYPlus(void){return yPlus;} + void setXMinus(short newVal){xMinus = newVal;} + short getXMinus(void){return xMinus;} + + void setTopZ(float newVal){topZ = newVal;} + float getTopZ(void){return topZ;} + + void clearNear(void); + void setNearNode(int i, int val){nearNodes[i] = val;} + int getNearNode(int i){return nearNodes[i];} + void setNearDist(int i, float dist){nearNodeDist[i] = dist;} + float getNearDist(int i){return nearNodeDist[i];} + int setFirstFreeNode(int val); + int hasNodes(void); + + short getNode(void){return nearNodes[0];} + void setNode(short val){nearNodes[0] = val;} + + void setPartialFlag(int val){partial |= val;} + int getPartialFlag(int val){return partial & val;} + +}; + +class CAIFloorDataEdit +{ +private: + int regionsInUse; + CAIFloorSquare floorSpaces[16000];//erm +public: + CAIFloorDataEdit(void){regionsInUse = 0;} + void ensureRegion(vec3_t spot); + void save(FILE *fp); + void load(FILE **fp); + void clear(void){regionsInUse = 0;} + void saveExport(FILE **fp); + void prepareForExport(void); + void AddNodesViaLine(vec3_t start, vec3_t end, int id1, int id2); + int getFloorForSpot(vec3_t spot); + int clearLineForFloor(int startID, int endID, int traceStyle); +}; + + + +class CAIConnect +{ +protected: + int linkId; + float dist; + int first; + int valid; + connectType type; + +public: + CAIConnect(int newId, float curDist, int initNode, connectType ctype = LINK_NORMAL){linkId = newId; dist = curDist; first = initNode; valid = 1; type = ctype;} + CAIConnect(void){linkId = 0; dist = 0; first = 0;valid = 1; type = LINK_NORMAL;} + void setId(int newVal){linkId = newVal;} + int getLinkId(void){return linkId;} + void setDist(float val){dist = val;} + float getDist(void){return dist;} + int getFirst(void){return first;} + void setFirst(int val){first = val;} + int getValid(void){return valid;} + void setValid(int newVal){valid = newVal;} + connectType getType(void){return type;} + void save(FILE **fp); +}; + +class CAINode +{ +protected: + list links;//ids of everything connected to this... + list combatPoints; + + vec3_t pos; + int id; + byte *paths; + short *pathRanks;//lower is better + int checked; + float radius; + int pointType; + vec3_t dest; + edict_t *myMarker; + int flee1; + int flee2; + int ignoreForSpawning; + float minHeight; + float maxHeight; + + list connectedNodes; + vec3_t min; + vec3_t max; + + int myFloor; +public: + CAINode(vec3_t spot, int newId) {set(spot, newId); paths = 0; radius = 0; pointType = EPS_NORMAL; + VectorClear(dest);ignoreForSpawning = 0; minHeight = 0; maxHeight = 0; pathRanks = 0;} + CAINode(void){id = 0; VectorClear(pos); paths = 0; VectorClear(dest); pointType = EPS_NORMAL; + ignoreForSpawning = 0; minHeight = 0; maxHeight = 0; pathRanks = 0;} + + void addLink(int newLink, int isCombatPoint = 0, connectType cType = LINK_NORMAL); + void save(FILE *fp); + void load(FILE **fp); + void savePaths(FILE **fp); + void setOrg(vec3_t newOrg){VectorCopy(newOrg, pos);} + void drawConnections(void); + float *getPos(void){return pos;} + void setChecked(int val){checked = val;} + int getChecked(void){return checked;} + void initPathData(int num); + void calcPath(void); + int getId(void){return id;} + void set(vec3_t spot, int newId){VectorCopy(spot, pos); id = newId;} + int isConnectedTo(int linkId); + void destroyLink(int deadId); + void setId(int newId){id = newId;} + void calcRadius(void); + void setPointType(int newVal){pointType = newVal;} + int getPointType(void){return pointType;} + int getPathToPoint(int p); + void clearLinks(void); + float *getDest(void){if(pointType == EPS_NORMAL)return 0; return dest;} + void setPos(vec3_t newPos){VectorCopy(newPos, pos);} + void setMarker(edict_t *ed){myMarker = ed;} + edict_t *getMarker(void){return myMarker;} + float getPathDist(int destNode); + void removeBadLink(int deadId); + void removeBadCombatPoint(int deadId); + void destroyLinks(void); + CAIConnect *getLinkNum(int num); + int toggleIgnore(void){return (ignoreForSpawning = !ignoreForSpawning);} + + int getNumLinks(void){return links.size();} + int getNumCombatPoints(void){return combatPoints.size();} + + void display(void); + void setMyFloor(int val){myFloor = val;} + int getMyFloor(void){return myFloor;} + + int getIgnore(void){return ignoreForSpawning;} +}; + +class CAIListData +{ +protected: + vector nodes; + CAIFloorDataEdit floorData; + + vector combatPoints;//obsolete + vector regions;//obsolete +public: + CAIListData(void){} + CAINode *getNode(int num); + CAINode *getCombatNode(int num); + void addPoint(edict_t *ent, char *cmd, int type, float *altCenter = 0); + void save(void); + void connect(CAINode &one, CAINode &two, connectType newType); + void load(void); + void exportPaths(void); + void clearChecks(void); + int getNumElems(void){return nodes.size();} + void eliminateRedundantConnections(void); + void buildPathConnections(void); + void saveExport(void); + void add(edict_t *ent); + int usesCmd(edict_t *ent, char *cmd); + void connectNode(CAINode &start, int combat = 0); + void validateNodeLinks(void); + int getNearestNode(vec3_t spot, float *distVal = 0); + int getNearestCombatPoint(vec3_t spot, float *distVal = 0); + void deleteNode(vec3_t spot); + void toggleIgnoreNode(vec3_t spot); + void movePoint(vec3_t spot); + void graphicData(float val); + void numberLists(void); + void checkEnvironments(void); + void ensureRegion(edict_t *ent); + void clearNodesFromWall(void); +}; + +extern CAIListData *aiList; + + + + + + +#endif //__ENEMY_PRE_H \ No newline at end of file diff --git a/Source/Game/gamecpp/ai_pathfinding.cpp b/Source/Game/gamecpp/ai_pathfinding.cpp new file mode 100644 index 0000000..c9c4318 --- /dev/null +++ b/Source/Game/gamecpp/ai_pathfinding.cpp @@ -0,0 +1,1925 @@ +#include "ai_pathfinding.h" + +//////////////////////////////////////////////////////////////////////////////////////////////// +// +// Misc functions +// +//////////////////////////////////////////////////////////////////////////////////////////////// + +float readFloat(byte **in); +void readVect(byte **in, vec3_t v); +int readInt(byte **in); +short readShort(byte **in); +byte readByte(byte **in); +signed char readChar(byte **in); + +qboolean IsUseableBrush(edict_t *what); +qboolean IsBrushUseableNow(edict_t *what, float when, edict_t *by_whom); +qboolean NotBadDoor(edict_t *what, float when, edict_t *by_whom); + + +// this is a bit of a misnomer - it's actually a section of a cone... + +// NOTE - fixme - optimize this. it's probably safe to store off both the dir and the cone side dir.... +// that will reduce this operation from 4 vectornormalizes down to 1... also the conestart + +int pointBetweenSpheres(vec3_t start, float startrad, vec3_t end, float endrad, vec3_t testpoint) +{ + vec3_t dir; + float len; + vec3_t intest; + + VectorSubtract(end, start, dir); + + //test against the first plane + VectorSubtract(testpoint, start, intest); + if(DotProduct(intest, dir) < 0) + { + return 0; + } + + //test against the second plane + VectorSubtract(end, testpoint, intest); + if(DotProduct(intest, dir) < 0) + { + return 0; + } + + + //now test against the edges of the cone itself + + len = VectorNormalize(dir); + + vec3_t coneStart; + + VectorMA(start, -(startrad * len)/(endrad - startrad), dir, coneStart); + + vec3_t sideDir; + vec3_t testDir; + vec3_t coneSideDir; + vec3_t coneSide; + + PerpendicularVector(sideDir, dir); + + //find the direction from the conestart to the testpoint + VectorSubtract(testpoint, coneStart, testDir); + VectorNormalize(testDir); + + //find the direction from the conestart to an arbitrary coneedge + VectorMA(end, endrad, sideDir, coneSide); + VectorSubtract(coneSide, coneStart, coneSideDir); + VectorNormalize(coneSideDir); + + if(endrad < startrad) + { + VectorScale(dir, -1, dir); + } + + if(DotProduct(testDir, dir) < DotProduct(coneSideDir, dir)) + { + return 0; + } + + return 1; +} + + + + + +//////////////////////////////////////////////////////////////////////////////////////////////// +// +// CAIFloor related stuff +// +//////////////////////////////////////////////////////////////////////////////////////////////// + +vec3_t posTestVal; + +void CAIFloor::load(byte **inData) +{ + readVect(inData, min); +/* min[0] = (readChar(inData)*48); + min[1] = (readChar(inData)*48); + min[2] = (readChar(inData)*48);*/ + partial = readByte(inData); + id = readShort(inData); + for(int i = 0; i < NUM_NEAR_NODES; i++) + { + nearNodes[i] = readShort(inData); + } + for(i = 0; i < 4; i++) + { + adjFloors[i] = readShort(inData); + } + topZ = readFloat(inData); +} + +int CAIFloor::getBestClearFloor(int recurse, CAIFloorSystem &system, int sideFrom) +{ + if(!system.floorIsOccupied(id, -1, -1, -1, -1)) + { + if(!gi.inPVS(min, level.sight_client->s.origin)) + { + return id; + } + } + + if(!recurse) + { + return -1; + } + + //note - this is overkill, but if we really needed to flood properly, the below approach isn't correct: + // it doesn't handle cases where missing floors leave gaps on i - 1 + for(int i = 0; i < 4; i++) + { + if(sideFrom != -1 && sideFrom != i && sideFrom != ((i+1)&3)) + { + continue; + } + if(adjFloors[i] == -1) + { + continue; + } + + CAIFloor *testFloor = system.getFloorForNumber(adjFloors[i]); + if(!testFloor) + { + continue; + } + + int bestId = testFloor->getBestClearFloor(recurse - 1, system, i); + + if(bestId) + { + return bestId; + } + } + + return -1; +} + + + + + +void CAIFloorYRow::load(byte **inData) +{ + yValue = readFloat(inData); + numFloors = readInt(inData); + assert(numFloors > 0 && numFloors < 30); + + //floors = new CAIFloor[numFloors]; + floors = aiPoints.getFloors()->acquireFloorSpace(numFloors);//Cool! This is so much better! + + for(int i = 0; i < numFloors; i++) + { + floors[i].load(inData); + } +} + +CAIFloor *CAIFloorYRow::getFloorForPosition(vec3_t position) +{ + int curCheck = numFloors-1; + + while(curCheck > -1) + { + if(position[2] > floors[curCheck].getZValue()) + { + posTestVal[2] = floors[curCheck].getZValue(); + return &floors[curCheck]; + } + curCheck--; + } + + return 0; +} + + +void CAIFloorXRow::load(byte **inData) +{ + xValue = readFloat(inData); + numYRows = readInt(inData); + + assert(numYRows > -1 && numYRows < 300); + + yRows = new CAIFloorYRow[numYRows]; + + for(int i = 0; i < numYRows; i++) + { + yRows[i].load(inData); + } +} + +CAIFloor *CAIFloorXRow::getFloorForPosition(vec3_t position) +{ + int curCheck = numYRows>>1; + int curCheckAdd = 1; + int tempFloors = numYRows; + + while(tempFloors) + { + tempFloors>>=1; + curCheckAdd<<=1; + } + curCheckAdd>>=2;//? + + for(;;) + { + if(position[1] < yRows[curCheck].getYValue()) + { + curCheck -= curCheckAdd; + if(curCheck < 0)curCheck = 0; + } + else if (position[1] > yRows[curCheck].getYValue() + 48) + { + curCheck += curCheckAdd; + if(curCheck >= numYRows)curCheck = numYRows - 1; + } + else + { + posTestVal[1] = yRows[curCheck].getYValue(); + return yRows[curCheck].getFloorForPosition(position); + } + if(curCheckAdd == 0) + { + return 0; + } + curCheckAdd>>=1; + } + return 0; +} + +void CAIFloorXRow::clear(void) +{ + delete[] yRows; + yRows = 0; +} + + +void CAIFloorSystem::load(byte **inData) +{ + clear(); + + numFloors = readInt(inData); + numXRows = readInt(inData); + assert(numXRows > -1 && numXRows < 500); + + floors = new CAIFloor[numFloors]; + xRows = new CAIFloorXRow[numXRows]; + + for(int i = 0; i < numXRows; i++) + { + xRows[i].load(inData); + } + assert(floorsUsed == numFloors); + + occupArray = (numFloors)/16 + 1;//each entry is two bits, and there are 4 bytes per int + floorOccupation = new int[occupArray]; + memset(floorOccupation, 0, sizeof(int) * occupArray); +} + +void CAIFloorSystem::clear() +{ + for(int i = 0; i < numXRows; i++) + { + xRows[i].clear(); + } + // I should probably learn properly about destructors =) + delete[] xRows; + numXRows = 0; + delete[] floors; + delete[] floorOccupation; + floorOccupation = 0; + occupArray = 0; + floors = 0; + xRows = 0; + numFloors = 0; + floorsUsed = 0; +} + +CAIFloor *CAIFloorSystem::getFloorForPosition(vec3_t position) +{ + int curCheck = numXRows>>1; + int curCheckAdd = 1; + int tempFloors = numXRows; + + while(tempFloors) + { + tempFloors>>=1; + curCheckAdd<<=1; + } + curCheckAdd>>=2;//? + + if(!xRows) + { + return 0; + } + + if(!position) + { + return 0; + } + + for(;;) + { + if(curCheck < 0) + { + curCheck = 0; + } + if(curCheck >= numXRows) + { + curCheck = numXRows - 1; + } + if(position[0] < xRows[curCheck].getXValue()) + { + curCheck -= curCheckAdd; + if(curCheck < 0)curCheck = 0; + } + else if (position[0] > xRows[curCheck].getXValue() + 48) + { + curCheck += curCheckAdd; + if(curCheck >= numXRows)curCheck = numXRows - 1; + } + else + { + posTestVal[0] = xRows[curCheck].getXValue(); + return xRows[curCheck].getFloorForPosition(position); + } + if(curCheckAdd == 0) + { + return 0; + } + curCheckAdd>>=1; + } + + return 0; +} + +int CAIFloorSystem::floorIsOccupied(int val, int c1, int c2, int c3, int c4) +{ + int ix; + int pos; + + ix = val>>4; + pos = (val - (ix<<4))<<1; + + int curState = (floorOccupation[ix]>>pos)&3; + + if(curState == FLOORSLOT_EMPTY) + { + return 0; + } + else if(curState == FLOORSLOT_DOUBLE) + { + return 1; + } + else if(val == c1 || val == c2 || val == c3 || val == c4) + { + return 0; + } + else + { + return 1; + } +} + +void CAIFloorSystem::addOccupiedFloor(int val) +{ + int ix; + int pos; + + if(val < 0) + { + return; + } + + assert(val < occupArray*16); + + ix = val>>4; + pos = (val - (ix<<4))<<1; + + int curState = (floorOccupation[ix]>>pos)&3; + + if(curState == FLOORSLOT_EMPTY) + { + floorOccupation[ix] &= ~(curState<getID()); +} + +void CAIFloorSystem::clearOccupiedFloors(void) +{ + memset(floorOccupation, 0, sizeof(int) * occupArray); +} + +int CAIFloorSystem::getNearestFreePosition(vec3_t start, vec3_t spot) +{ + CAIFloor *floor = getFloorForPosition(start); + if(!floor) + { + return 0; + } + + int floorID = floor->getBestClearFloor(2, *this, -1); + + if(floorID == -1) + { + return 0; + } + + VectorCopy(floors[floorID].getMin(), spot); + return 1; +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// +// CAIPathLink +// +//////////////////////////////////////////////////////////////////////////////////////////////// + +void CAIPathLink::load(byte **inData) +{ + linkId = readInt(inData); + dist = readFloat(inData); + type = (connectType)readInt(inData); + + assert(type >= LINK_NORMAL); + assert(type <= LINK_JUMP); + assert(dist >= 0.0f); + assert(dist < 9000);//this should catch any possible distance in our game, anyway + assert(linkId > -1); + assert(linkId < 4096);//way high range - should catch screwed up stuff +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// +// CAIPathNode +// +//////////////////////////////////////////////////////////////////////////////////////////////// + +int CAIPathNode::pathLinksInRange(int numNodes) +{ + for(int i = 0; i < numNodes; i++) + { + if(path[i] == 0) + { + continue;//these are okay + } + if(link[path[i]-1].getLinkId() > numNodes) + { + return 0; + } + } + return 1; +} + +int CAIPathNode::pathInRange(void) +{ + for(int i = 0; i < sizeof(path); i++) + { + if(path[i] > numLinks) + { + return 0; + } + } + return 1; +} + +#include "windows.h" + +void CAIPathNode::load(byte **inData, int numNodes) +{ + pointType = readInt(inData); + + assert(pointType <= EPS_FLEEENEMY); + + id = readInt(inData); + + assert(id > -1); + assert(id < 512); + + readVect(inData, pos); + pos[2] += 14;//strange, huh. Monster origin is a fair bit higher than node origin... + + if(!(pointType & EPS_LINKMAIN)) + { // these point types don't need any extra info + return; + } + + + + numLinks = readInt(inData); + + link = new CAIPathLink[numLinks]; + path = new byte[numNodes]; + + for(int i = 0; i < numLinks; i++) + { + link[i].load(inData); + } + + memcpy(path, *inData, numNodes); + *inData += numNodes; + + pathRanks = new short[numNodes]; + memcpy(pathRanks, *inData, numNodes * sizeof(short)); + *inData += numNodes * sizeof(short); + +// assert(pathInRange()); +// assert(pathLinksInRange(numNodes)); + + numCombatLinks = readInt(inData); + + combatLinks = new CAIPathLink[numCombatLinks]; + + for(i = 0; i < numCombatLinks; i++) + { + combatLinks[i].load(inData); + } + + radius = readFloat(inData); + flee1 = readInt(inData); + flee2 = readInt(inData); + + ignoreForSpawning = readInt(inData); + + minHeight = readFloat(inData); + maxHeight = readFloat(inData); +} + +void CAIPathNode::clean(void) +{ + delete[] link; + delete[] path; + delete[] pathRanks; + delete[] combatLinks; +} + +CAIPathLink *CAIPathNode::getLinkWithId(int val) +{ + for(int i = 0; i< numLinks; i++) + { + if(link[i].getLinkId() == val) + { + return &link[i]; + } + } + return 0; +} + +int CAIPathNode::getDest(int finalNode) +{ + if(!path || (path < 0)) + { + Com_Printf("Error! Problem with path!\n"); + return finalNode; + } + //return path[finalNode]; + //compensate for an off by one error from above + + if(id == finalNode) + { + return finalNode; + } + if(path[finalNode] == 0) + { + // there's no way to get here - why the hell wasn't I checking against this + // this is uberpathetic + //return finalNode;//just force myself towards target 'cause I'm dumb + return 0; + } + + int val = link[path[finalNode]-1].getLinkId(); + assert(val >= 0); + return val; +} + +int CAIPathNode::isValidCombatPoint(vec3_t blockDir) +{ + // better check the guard direction too + return 1; +} + +#define MIN_SEARCH_RAD 300 + +int CAIPathNode::getSpawnNode(float key, vec3_t spot, int allowBehind, vec3_t fwd) +{ + checkKey = key; + + //if(( (((!(level.clearedNodes[id]))&&(!allowBehind)) || (level.clearedNodes[id]&&allowBehind)) + if(( (((!(level.clearedNodes[id]))&&(!allowBehind)) || (allowBehind)) + ||(game.playerSkills.getSpawnValue() > 3))&&(!ignoreForSpawning)) + { + vec3_t dif; + VectorSubtract(pos, level.sight_client->s.origin, dif); + + float dist = VectorNormalize(dif); + + if(!gi.inPVS(pos, level.sight_client->s.origin)|| + ((dist > 400)&&(DotProduct(fwd, dif) < .5)))//leaves a 120 degree wedge in the front - should be safe + {//just in case + if(dist < 600) + { + CRadiusContent rad(pos, 100, 1, 1); + if(!rad.getNumFound()) + //if(aiPoints.getFloors()->getNearestFreePosition(pos, spot)) + { + VectorCopy(pos, spot); + return 1; + } + } + } + } + + // this random value will help us end up with different points sometimes + int offset = gi.irand(0, 1293); + + for(int i = 0; i < numLinks; i++) + { + if(aiPoints.getNode(link[(i+offset)%numLinks].getLinkId())->checkKey == key)continue; + if(aiPoints.getNode(link[(i+offset)%numLinks].getLinkId())->getSpawnNode(key, spot, allowBehind, fwd)) + { + return 1; + } + } + return 0;//if we got here, this is a dead end of sorts +} + +void CAIPathNode::markClearedNodes(float key) +{ + if(!level.clearedNodes[id]) + { + if(gi.inPVS(pos, level.sight_client->s.origin)) + { + level.clearedNodes[id] = 1; + } + } + + checkKey = key; + + if(!level.clearedNodes[id]) + { + return;//once we hit a node that is not clear, we are quite done + } + + for(int i = 0; i < numLinks; i++) + { + if(aiPoints.getNode(link[i].getLinkId())->checkKey == key)continue; + aiPoints.getNode(link[i].getLinkId())->markClearedNodes(key); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +// +// CAIPaths +// +//////////////////////////////////////////////////////////////////////////////////////////////// + +void CAIPaths::load(void) +{ + byte *setInfo; + byte *curPos; + int fileLen; + char version; + int i; + + char name[MAX_OSPATH]; + + clean(); + + Com_sprintf (name, sizeof(name), "maps/%s.nvb", level.mapname); + + + fileLen = gi.FS_LoadFile (name, (void **)&setInfo); + if (fileLen == -1) + { + numNodes = 0; + numCombatNodes = 0; + //Com_Printf("WARNING: This map doesn't appear to have navigation data - it is likely that the enemies will behave poorly\n"); + return; + } + + curPos = setInfo; + + version = readInt(&curPos); + if(version != AI_EXPORT_VERSION) + { + numNodes = 0; + numCombatNodes = 0; + Com_Printf ("Invalid version (%d) for Info Point File (Should be %d) - please re-export the path data\n", version, AI_EXPORT_VERSION); + gi.FS_FreeFile(setInfo); + return; + } + + + numNodes = readInt(&curPos); + node = new CAIPathNode[numNodes]; + for(i = 0; i < numNodes; i++) + { + node[i].load(&curPos, numNodes); + } + + numCombatNodes = readInt(&curPos); + assert(numCombatNodes < 1000);//uhoh + combatNode = new CAIPathNode[numCombatNodes]; + for(i = 0; i < numCombatNodes; i++) + { + combatNode[i].load(&curPos, numCombatNodes); + } + + floors.load(&curPos); + + assert((curPos - setInfo) == fileLen);//if not, we're loading too much - BAD BAD BAD + + + gi.FS_FreeFile(setInfo); +} + +void CAIPaths::clean(void) +{ + for(int i = 0; i < numNodes; i++) + { + node[i].clean(); + } + for(i = 0; i < numCombatNodes; i++) + { + combatNode[i].clean(); + } + delete[] node; + delete[] combatNode; + + node = 0; + combatNode = 0; + numNodes = 0; + + floors.clear(); +} + +void CAIPaths::setupClientPathInfo(int *nodeVal, int *region) +{ // this guy comes up a lot, you know? + if((ai_nonodes->value)||(!numNodes)) + { + return; + } + + floors.clearOccupiedFloors(); + + CAIFloor *floor = floors.getFloorForPosition(level.sight_client->s.origin); + +// FX_MakeRing(level.sight_client->s.origin, gi.irand(3,5)); + + if(floor) + { + *region = floor->getID(); + *nodeVal = floor->getNode(); + if(*nodeVal < 1) + { + *nodeVal = 0; + } + if(*nodeVal >= numNodes) + { + *nodeVal = 0; + } + } + + clientNode = *nodeVal; + + //fixme - use the adj stuff for this to be quite a bit faster + vec3_t spot; + VectorCopy(level.sight_client->s.origin, spot); + spot[0] -= 16; + spot[1] -= 16; + CAIFloor *floor2 = floors.getFloorForPosition(spot); + if(floor2) + { + clientCorners[0] = floor2->getID(); + floors.addOccupiedFloor(floor2); + } + + spot[0] += 32; + floor2 = floors.getFloorForPosition(spot); + if(floor2) + { + clientCorners[1] = floor2->getID(); + floors.addOccupiedFloor(floor2); + } + + spot[1] += 32; + floor2 = floors.getFloorForPosition(spot); + if(floor2) + { + clientCorners[2] = floor2->getID(); + floors.addOccupiedFloor(floor2); + } + + spot[0] -= 32; + floor2 = floors.getFloorForPosition(spot); + if(floor2) + { + clientCorners[3] = floor2->getID(); + floors.addOccupiedFloor(floor2); + } + + if(nodeVal > 0) + { + node[*nodeVal].markClearedNodes(searchKey++); + } +} + +ai_public_c *lazy; + +int CAIPaths::getNode(vec3_t pos, int prev, int prevDest) +{ + CAIFloor *floor = floors.getFloorForPosition(pos); + int retVal; + if(floor) + { + retVal = floor->getNode(); + if(retVal < 1) + { + retVal = 0; + } + } + else + { + retVal = 0; + } + return retVal; +} + +void CAIPaths::linkEnemyIntoPath(vec3_t pos, nodeData_t *data) +{ + if((ai_nonodes->value)||(!numNodes)) + { + return; + } + + vec3_t testpos; + + VectorCopy(pos, testpos); + testpos[2] += 16; + + CAIFloor *floor = floors.getFloorForPosition(testpos); + + if(floor) + { + data->curRegion = floor->getID(); + } + else + {//uhoh + data->curRegion = -1; + } + VectorCopy(testpos, data->curSpot); + floors.addOccupiedFloor(data->curRegion); + + vec3_t spot; + VectorCopy(testpos, spot); + + if(data->curRegion == -1) + { + vec3_t spot; + VectorCopy(testpos, spot); + spot[0] -= 16; + spot[1] -= 16; + floor = floors.getFloorForPosition(spot); + if(floor) + { + data->curRegion = floor->getID(); + } + } + if(data->curRegion == -1) + { + spot[0] += 32; + floor = floors.getFloorForPosition(spot); + if(floor) + { + data->curRegion = floor->getID(); + } + } + if(data->curRegion == -1) + { + spot[1] += 32; + floor = floors.getFloorForPosition(spot); + if(floor) + { + data->curRegion = floor->getID(); + } + } + if(data->curRegion == -1) + { + spot[0] -= 32; + floor = floors.getFloorForPosition(spot); + if(floor) + { + data->curRegion = floor->getID(); + } + } + if(data->curRegion == -1) + { + data->curNode = 0; + } + else + { + floor = floors.getFloorForNumber(data->curRegion); + if(floor) + { + int oldNode = data->curNode; + data->curNode = floor->getNode(); + if(oldNode != data->curNode) + { + data->lastNode3 = data->lastNode2; + data->lastNode2 = data->lastNode; + data->lastNode = oldNode; + } + } + else + { + data->curRegion = -1; + data->curNode = 0; + } + } + data->corner1 = data->corner2 = data->corner3 = data->corner4 = data->curRegion; +} + +qboolean IsUseableBrush(edict_t *what); +qboolean IsBrushUseableNow(edict_t *what, float when, edict_t *by_whom); + +int CAIPaths::clearLineForFloor(int startID, vec3_t end, nodeData_t *data, int approach) +{ + int curFloor = startID; + int endFloorNum; + int differsOnlyByZ = 0; + int clearedPartial = 1;//this lets us know if we're on clear squares yet + int lastFailed = 0; + + CAIFloor *endFloor = floors.getFloorForPosition(end); + + if(endFloor) + { + endFloorNum = endFloor->getID(); + } + else + { + endFloorNum = -1; + } + + if(startID == endFloorNum) + { + return !(floors.floorIsOccupied(curFloor, data->corner1, data->corner2, data->corner3, data->corner4)); + } + + vec3_t startPos, startSide; + + VectorCopy(floors.getFloorForNumber(startID)->getMin(), startPos); + startPos[2] = 0; + + vec3_t difOuter; + VectorSubtract(end, startPos, difOuter); + + startSide[1] = difOuter[0]; + startSide[0] = -difOuter[1]; + startSide[2] = 0; + + CAIFloor *floor = floors.getFloorForNumber(curFloor); + if(floor) + { + clearedPartial = !(floor->getPartial()); + } + + if(endFloorNum == -1) + { + return 0; + } + + if(aipoints_show->value) + { + paletteRGBA_t col = {250, 250, 0, 250}; + FX_MakeLine(floors.getFloorForNumber(startID)->getMin(), floors.getFloorForNumber(endFloorNum)->getMin(), col, 1); + FX_MakeRing(floors.getFloorForNumber(startID)->getMin(), 3); + FX_MakeRing(floors.getFloorForNumber(endFloorNum)->getMin(), 3); + } + + do + { + int nextLeft, nextRight; + + CAIFloor *floor = floors.getFloorForNumber(curFloor); + +/* vec3_t show; + VectorCopy(floor->getMin(), show); + show[0] += 24; + show[1] += 24; + show[2] += 8; + FX_MakeRing(show, 6);*/ + + if(fabs(floor->getMin()[0] - endFloor->getMin()[0]) < 5) + {//we're already in the proper x plane - just move in y + if(floor->getMin()[1] > endFloor->getMin()[1]) + { + curFloor = floor->getAdj(FLOOR_YMINUS); + } + else + { + curFloor = floor->getAdj(FLOOR_YPLUS); + } + } + else if(fabs(floor->getMin()[1] - endFloor->getMin()[1]) < 5) + {//we're already in the proper x plane - just move in y + if(floor->getMin()[0] > endFloor->getMin()[0]) + { + curFloor = floor->getAdj(FLOOR_XMINUS); + } + else + { + curFloor = floor->getAdj(FLOOR_XPLUS); + } + } + else + { + if(difOuter[0] >= 0 && difOuter[1] >= 0) + { + nextLeft = floor->getAdj(FLOOR_YPLUS); + nextRight = floor->getAdj(FLOOR_XPLUS); + } + else if(difOuter[0] <= 0 && difOuter[1] >= 0) + { + nextLeft = floor->getAdj(FLOOR_XMINUS); + nextRight = floor->getAdj(FLOOR_YPLUS); + } + else if(difOuter[0] >= 0 && difOuter[1] <= 0) + { + nextLeft = floor->getAdj(FLOOR_XPLUS); + nextRight = floor->getAdj(FLOOR_YMINUS); + } + else if(difOuter[0] <= 0 && difOuter[1] <= 0) + { + nextLeft = floor->getAdj(FLOOR_YMINUS); + nextRight = floor->getAdj(FLOOR_XMINUS); + } + else + { + return 0;//it really shouldn't ever get here, though + } + + vec3_t dif; + VectorSubtract(floor->getMin(), startPos, dif); + if(DotProduct(startSide, dif) > 0 && nextRight != -1) + { + if(nextRight != -1 && !lastFailed) + { + curFloor = nextRight; + lastFailed = 0; + } + else + { + lastFailed = 1; + } + } + else + { + if(nextLeft != -1 && !lastFailed) + { + lastFailed = 0; + curFloor = nextLeft; + } + else + { + lastFailed = 1; + curFloor = nextRight; + } + } + } + + if(fabs(floor->getMin()[0] - endFloor->getMin()[0]) < 5 && + fabs(floor->getMin()[1] - endFloor->getMin()[1]) < 5) + { + differsOnlyByZ = 1; + } + + //er + if(curFloor != -1 && curFloor != startID) + { + CAIFloor *floor2 = floors.getFloorForNumber(curFloor); + if(floor2 && (floor2->getPartial()&PARTIAL_FLOORGAP)) + { + if(clearedPartial) + { //we reject these once we're on clear ground + differsOnlyByZ = 1; + } + } + else + { + clearedPartial = 1; + } + } + +/* if(floors.floorIsOccupied(curFloor, data->corner1, data->corner2, data->corner3, data->corner4)) + { + if(!approach && (curFloor == clientCorners[0] || curFloor == clientCorners[1] || + curFloor == clientCorners[2] || curFloor == clientCorners[3])) + { //when retreating, we do not want to go through the player - that would be bad + differsOnlyByZ = 1; + } + //differsOnlyByZ = 1; + }*/ + + }while(curFloor > -1 && curFloor != endFloorNum && !differsOnlyByZ); + + if(curFloor == endFloorNum) + { + return 1; + } + return 0; +} + + +int CAIPaths::getClearPath(int startRegion, int endNode, int approach, nodeData_t *data, vec3_t start, edict_t *ent) +{ + CAIFloor *floor = floors.getFloorForNumber(startRegion); + + int limit; + int travelNode; + int foundNode = -1; + + travelNode = -1; + + if(endNode == -1) + { + return -1; + } + + if(approach) + { + limit = -1; + } + else + { + limit = 15000; + } + + do + { + for(int i = 0; i < NUM_NEAR_NODES; i++) + { + int testNode = floor->getNearNode(i); + if(testNode == -1) + { + break;//okay, all done + } + if(travelNode == -1) + { + travelNode = floor->getNearNode(i); + continue; + } + if( ((node[endNode].getRank(testNode) < node[endNode].getRank(travelNode) || + node[endNode].getRank(travelNode) <= limit) + && approach + && node[endNode].getRank(testNode) > limit) + + || + + ((node[endNode].getRank(testNode) > node[endNode].getRank(travelNode) || + node[endNode].getRank(travelNode) >= limit) + && !approach + && node[endNode].getRank(testNode) < limit)) + { + travelNode = testNode; + } + } + + //always check out the last next as well, just in case + if(data->nextNode > 0 && + (travelNode < 1 || + (node[endNode].getRank(data->nextNode) > node[endNode].getRank(travelNode) && !approach) || + (node[endNode].getRank(data->nextNode) < node[endNode].getRank(travelNode) && approach))) + { + travelNode = data->nextNode; + } + + if (travelNode!=-1) + { + assert(travelNode>=0); + assert(travelNode= limit) || + (approach && node[endNode].getRank(travelNode) <= limit)) + { + travelNode = -1; + } + else if(clearLineForFloor(startRegion, node[travelNode].getPos(), data, approach)) + { + trace_t tr; + + vec3_t tempMin, tempMax; + VectorCopy(ent->mins, tempMin); + VectorCopy(ent->maxs, tempMax); + tempMin[2] += 20; + tempMax[2] -= 10; + + vec3_t t; + VectorSubtract(node[travelNode].getPos(), start, t); + VectorNormalize(t); + VectorMA(start, 64, t, t); + + gi.trace(start, tempMin, tempMax, t, ent, MASK_MONSTERSOLID, &tr); + + //bad doors ruin it for everyone. No good. + if(NotBadDoor(tr.ent, level.time, ent)) + { + foundNode = travelNode; + } + else + { + limit = node[endNode].getRank(travelNode);//eh? + travelNode = -1; + } + } + else + { + limit = node[endNode].getRank(travelNode); + travelNode = 0; + foundNode = 0; + //stop, ya bastard. If we could remember this were a bad door, tihs would be something + // else entirely + } + } + + }while(travelNode != -1 && foundNode == -1); + + return travelNode; +} + +int CAIPaths::getFloorPath(int startRegion, int nextNode, nodeData_t *data, int recurse, int ignoreRegion, float *distFound, int sourceStart) +{ + CAIFloor *floor = floors.getFloorForNumber(startRegion); + + if(startRegion == -1) + { + return startRegion; + } + + if(!floor) + { + return startRegion; + } + + vec3_t dif; + int regToGoTo = startRegion; + + int altRegions[4]; + int numAltRegions = 0; + + VectorSubtract(node[nextNode].getPos(), floor->getMin(), dif); + float bestDist = VectorLengthSquared(dif) * (floor->getPartial() ? 1:.5); + + for(int i = 0; i < 4; i++) + { + if(floor->getAdj(i) == -1 || floor->getAdj(i) == ignoreRegion || floor->getAdj(i) == sourceStart) + { + continue; + } + + CAIFloor *other = floors.getFloorForNumber(floor->getAdj(i)); + + if(!other) + { + continue; + } + + vec3_t test; + VectorCopy(other->getMin(), test); + test[0] += 24; + test[1] += 24; + + VectorSubtract(node[nextNode].getPos(), test, dif); + float vls = VectorLengthSquared(dif) * (other->getPartial() ? 1:.5); + + if(vls >= bestDist) + { + altRegions[numAltRegions] = other->getID(); + numAltRegions++; + continue; + } + + for(int j = 0; j < NUM_NEAR_NODES; j++) + { + if(other->getNearNode(j) == nextNode || other->getNearNode(j) == -1) + { + break;//all this crap should prevent some oscillation + } + } + if(!(other->getPartial()&PARTIAL_FLOORGAP) && j < NUM_NEAR_NODES && other->getNearNode(j) != -1 + && !floors.floorIsOccupied(floor->getAdj(i), data->corner1, data->corner2, data->corner3, data->corner4)) + { + bestDist = vls; + regToGoTo = other->getID(); + } + } + + //warning - recursion could go haywire here + //if(recurse && selectedFloor != -1) + if(regToGoTo == startRegion && numAltRegions && recurse) + {//if only one floor was closer than my current one, and it is blocked, we need to try the ones to my side + + for(int i = 0; i < numAltRegions; i++) + { + float testDist; + int side = getFloorPath(altRegions[i], nextNode, data, recurse - 1, startRegion, &testDist, sourceStart); + + if(side != altRegions[i] && side != startRegion && (testDist < bestDist)) + { + regToGoTo = side; + //break; + } + } + } + + if(distFound) + { + *distFound = bestDist; + } + return regToGoTo; +} + +#define MIN_CIRCLE_TIME 3 + +int CAIPaths::clearForDirection(int startRegion, int endNode, nodeData_t *data, vec3_t endSpot) +{ + CAIFloor *floor; + + if(startRegion < 1) + { + return 0; + } + + floor = floors.getFloorForNumber(startRegion); + + + vec3_t dif; + VectorSubtract(endSpot, floor->getMin(), dif); + float bestDist = VectorLengthSquared(dif); + + int pathValid = 0; + + for(int i = 0; i < 4; i++) + { + if(floor->getAdj(i) == -1) + { //fixme - not right + continue; + } + + CAIFloor *other = floors.getFloorForNumber(floor->getAdj(i)); + + if(!other) + { + continue; + } + + VectorSubtract(endSpot, other->getMin(), dif); + float vls = VectorLengthSquared(dif); + + if(vls >= bestDist) + { + continue; + } + + int j; + if(endNode != -1) + { + for(j = 0; j < NUM_NEAR_NODES; j++) + { + if(other->getNearNode(j) == endNode || other->getNearNode(j) == -1) + { + break;//all this crap should prevent some oscillation + } + } + } + + if(((endNode == -1|| j < NUM_NEAR_NODES && other->getNearNode(j) != -1)) && + !(other->getPartial()&PARTIAL_FLOORGAP) && + //!(other->getPartial()&PARTIAL_FLOOR) && + !floors.floorIsOccupied(floor->getAdj(i), data->corner1, data->corner2, data->corner3, data->corner4)) + { + pathValid = 1; + } + } + return pathValid; +} + +void CAIPaths::getPath(vec3_t start, vec3_t end, nodeData_t *data, ai_public_c *who, edict_t *ent, int approach, edict_t *targ) +{ + if((ai_nonodes->value)||(!numNodes)||(!data->curNode)) + { + data->blocked = 1; + VectorCopy(start, data->goPoint);//igh + return; + } + + if(who->BeingWatched()) + { + int asdf = 9; + } + + CAIFloor *endFloor = floors.getFloorForPosition(end); + if(!endFloor) + { + return; + } + + data->finalNode = endFloor->getNode(); + data->blocked = 0; + + if(data->finalNode == -1) + { + data->nextNode = 0; + VectorCopy(start, data->goPoint); + data->blocked = 1; + return; + } + + + int travelNode = getClearPath(data->curRegion, data->finalNode, approach, data, start, ent); + + CAIFloor *floor = floors.getFloorForNumber(data->curRegion); + + if(travelNode < 1) + { + travelNode = 0;//just to be safe + } + + data->nextNode = travelNode; + + if(node[travelNode].getDest(data->finalNode) < 1) + { //oh dear + data->nextNode = 0; + } + + if(aipoints_show->value && data->nextNode) + { + paletteRGBA_t col = {250, 0, 0, 250}; + FX_MakeLine(start, node[data->nextNode].getPos(), col, 1); + FX_MakeRing(node[data->nextNode].getPos(), 6); + } + + + if(!data->nextNode || data->nextNode == -1) + { + data->nextNode = 0; + VectorCopy(start, data->goPoint); + data->blocked = 1; + } + else if((endFloor && endFloor->getID() == data->curRegion)&&(approach)) + { // we're already within 48 of our ultimate goal - yikes... only if approaching, of course ! + VectorCopy(end, data->goPoint); + } + else + { + vec3_t testMin; + vec3_t testMax; + + VectorCopy(ent->mins, testMin); + //testMin[0] += 4; + //testMin[1] += 4; + testMin[2] += 20;//stepheightish + VectorCopy(ent->maxs, testMax); + //testMax[2] -= 10;//er? + //testMax[0] -= 4; + //testMax[1] -= 4; + + if(!floor) + { + VectorCopy(start, data->goPoint); + data->blocked = 1; + } + else + { + int regToGoTo = data->curRegion; + int pathCheck = 1; + + if(clearForDirection(data->curRegion, -1, data, end)) + { + VectorCopy(end, data->goPoint); + trace_t tr; + + vec3_t dif2; + VectorSubtract(end, start, dif2); +/* if(VectorNormalize(dif2) > 32) + { + VectorMA(start, 32.0, dif2, data->goPoint); + } + else + {*/ + VectorCopy(end, data->goPoint); +// } + + gi.trace(start, testMin, testMax, data->goPoint, ent, MASK_MONSTERSOLID, &tr); + if((tr.fraction > .99 && !tr.startsolid && !tr.allsolid) || (approach && tr.ent == level.sight_client) || + (tr.ent && IsUseableBrush(tr.ent) && IsBrushUseableNow(tr.ent, level.time, ent))) + { + //VectorMA(start, 32, dif2, data->goPoint); + VectorCopy(end, data->goPoint); + Enemy_Printf(who, "Go to dest - 'tis clear\n"); + pathCheck = 0; + int asdf = 9; + } + } + + if(pathCheck && clearForDirection(data->curRegion, data->nextNode, data, node[data->nextNode].getPos())) + { + VectorCopy(node[data->nextNode].getPos(), data->goPoint); + trace_t tr; + + vec3_t dif2; + VectorSubtract(node[data->nextNode].getPos(), start, dif2); + VectorNormalize(dif2); + VectorScale(dif2, 64.0, dif2); + VectorAdd(dif2, start, dif2); + VectorCopy(dif2, data->goPoint); + +/* if(VectorNormalize(dif2) > 32) + { + VectorScale(dif2, 32.0, dif2); + VectorAdd(dif2, start, dif2); + VectorCopy(dif2, data->goPoint); + } + else + { + VectorCopy(node[data->nextNode].getPos(), data->goPoint); + }*/ + + // we are testing 64 instead of 32 now, but it only has to be halfway successful. Mainly to avoid evil doors + gi.trace(start, testMin, testMax, data->goPoint, ent, MASK_MONSTERSOLID, &tr); + if(((tr.fraction > .5 && !tr.startsolid && !tr.allsolid) || (approach && tr.ent == level.sight_client) || + (tr.ent && IsUseableBrush(tr.ent) && IsBrushUseableNow(tr.ent, level.time, ent)))) + { + //Com_Printf("Clear in direction, straight line\n"); + Enemy_Printf(who, "Clear in direction, so use that\n"); + pathCheck = 0; + int asdf = 9; + VectorSubtract(node[data->nextNode].getPos(), start, dif2); + VectorNormalize(dif2); + VectorScale(dif2, 32.0, dif2); + VectorAdd(dif2, start, dif2); + VectorCopy(dif2, data->goPoint); + + } + } + + if(pathCheck) + { + regToGoTo = getFloorPath(data->curRegion, data->nextNode, data, 3, -1, 0, data->curRegion); + + CAIFloor *goodFloor = floors.getFloorForNumber(regToGoTo); + + if(regToGoTo != data->curRegion) + { + CAIFloor *goodFloor = floors.getFloorForNumber(regToGoTo); + if(goodFloor) + { + VectorCopy(goodFloor->getMin(), data->goPoint); + data->goPoint[0] += 24; + data->goPoint[1] += 24; + data->goPoint[2] += 24; + Enemy_Printf(who, "Procede to node %d from region %d to region %d\n", data->nextNode, (int)floor->getID(), (int)goodFloor->getID()); + } + } + else + { // probably have excessively tight quarters then =/ + VectorCopy(node[data->nextNode].getPos(), data->goPoint); + //VectorCopy(start, data->goPoint); + } + } + + trace_t tr; + + gi.trace(start, testMin, testMax, data->goPoint, ent, MASK_MONSTERSOLID, &tr); + + if(((tr.fraction > .99 || tr.ent == targ) && !tr.startsolid && !tr.allsolid) || + (approach && tr.ent == level.sight_client) || + (tr.ent && IsUseableBrush(tr.ent) && IsBrushUseableNow(tr.ent, level.time, ent))) + { + if(pathCheck && regToGoTo != data->curRegion) + { + floors.addOccupiedFloor(regToGoTo); + } + + int asdf = 9; + } + else + { + Enemy_Printf(who, "Trying for side\n"); +// VectorCopy(start, data->goPoint); + + vec3_t sideDir; + sideDir[1] = tr.plane.normal[0]; + sideDir[0] = -tr.plane.normal[1]; + sideDir[2] = 0; + + vec3_t goalDif, toAvoid; + VectorSubtract(data->goPoint, start, goalDif); + + int skip = 0; + if(DotProduct(sideDir, goalDif) > .717) + { + VectorCopy(sideDir, toAvoid); + } + else if(DotProduct(sideDir, goalDif) < -.717) + { + VectorScale(sideDir, -1.0, toAvoid); + } + else + { + skip = 1; + } + + if(!skip) + { + VectorNormalize(toAvoid);//irk + VectorMA(toAvoid, .2, tr.plane.normal, toAvoid); + VectorNormalize(toAvoid); + + vec3_t testSpot; + VectorMA(start, 20, toAvoid, testSpot);//? + gi.trace(start, testMin, testMax, testSpot, ent, MASK_MONSTERSOLID, &tr); + + if((tr.fraction > .99 && !tr.startsolid && !tr.allsolid) || (approach && tr.ent == level.sight_client) || + (tr.ent && IsUseableBrush(tr.ent) && IsBrushUseableNow(tr.ent, level.time, ent))) + { + CAIFloor * myFloor = floors.getFloorForPosition(testSpot); + if(myFloor) + { + floors.addOccupiedFloor(myFloor->getID()); + } + VectorCopy(testSpot, data->goPoint); + } + else + {//stuck + VectorCopy(start, data->goPoint); + } + } + else + { + data->nextNode = 0; + VectorCopy(start, data->goPoint); + data->blocked = 1; + } + } + + } + } + + if(aipoints_show->value) + { + paletteRGBA_t col = {0, 250, 0, 250}; + FX_MakeLine(start, data->goPoint, col, 1); + } + + VectorCopy(start, data->curSpot); + + vec3_t dif; + VectorSubtract(data->goPoint, data->curSpot, dif); + if(VectorLengthSquared(dif) < .1) + { + data->lastDirSetTime = level.time; + VectorCopy(dif, data->lastDir); + } + else + { + VectorNormalize(dif); + if((DotProduct(dif, data->lastDir) < -.717)&&(level.time - data->lastDirSetTime < MIN_CIRCLE_TIME)) + { //are we being encouranged to backtrack??? - this is a 90 degree wedge behind the guy + VectorCopy(data->curSpot, data->goPoint); + data->blocked = 1; + } + else + { + data->lastDirSetTime = level.time; + VectorCopy(dif, data->lastDir); + } + } +} + +void CAIPaths::getReversePath(vec3_t start, vec3_t end, nodeData_t *data, ai_public_c *who, edict_t *ent, edict_t *targ) +{ + getPath(start, end, data, who, ent, 0, targ); +} + + +#define MAX_COMBAT_POINT_RANGE 768 +#define MIN_COMBAT_POINT_RANGE 128 + +void CAIPaths::getCombatPoint(nodeData_t *data, vec3_t start, vec3_t end, vec3_t dir) +{ +} + +int CAIPaths::getNearestFleePoint(nodeData_t *data, vec3_t outSpot, int team) +{ + int fleeNode; + + if((ai_nonodes->value)||(data->curNode==-1)||(data->curNode == 0)) + { + return 0; + } + + if(!team) + { // team 0 is the good guys, as it were + fleeNode = node[data->curNode].getFleePoint(1); + } + else + { + fleeNode = node[data->curNode].getFleePoint(2); + if(!fleeNode) + { // default back =/ + fleeNode = node[data->curNode].getFleePoint(1); + } + } + + if(!fleeNode) + { + VectorCopy(data->curSpot, outSpot); + return 0; + } + + VectorCopy(node[fleeNode].getPos(), outSpot); + return 1; +} + +#define MIN_BEHIND_DIST 400 + +void CAIPaths::idealWanderPoint(nodeData_t *data, ai_public_c *who) +{ + CAIFloor *floor; + + floor = floors.getFloorForPosition(data->curSpot); + + if(!floor) + { + data->blocked = 1; + return; + } + + for(int i = 0; i < 4; i++) + { + if(floor->getAdj(i) == -1) + { + continue; + } + + CAIFloor *other = floors.getFloorForNumber(floor->getAdj(i)); + + if(!other) + { + continue; + } + + if(floors.floorIsOccupied(floor->getAdj(i), data->corner1, data->corner2, data->corner3, data->corner4)) + {//someone near me - see if I can make space + int oppositeFloor = floor->getAdj((i+2)&3); + if(oppositeFloor != -1) + { + CAIFloor *opFloor = floors.getFloorForNumber(oppositeFloor); + + if(opFloor) + { + if(!opFloor->getPartial()) + { + if(!floors.floorIsOccupied(oppositeFloor, data->corner1, data->corner2, data->corner3, data->corner4)) + { + data->blocked = 0; + VectorCopy(opFloor->getMin(), data->goPoint); + floors.addOccupiedFloor(oppositeFloor); + } + } + } + } + } + } +} + +int CAIPaths::getSpawnPosition(vec3_t outSpot, int allowBehind) +{ + if((ai_nonodes->value)||(!numNodes)||(clientNode < 1)||(!level.sight_client)) + { + return 0; + } + + vec3_t fwd; + AngleVectors(level.sight_client->s.angles, fwd, 0, 0); + + if(node[clientNode].getSpawnNode(searchKey++, outSpot, allowBehind, fwd)) + { + return 1; + } + return 0; +} + +int CAIPaths::search(nodeData_t *data, ai_public_c *who) +{ + if((ai_nonodes->value)||(!numNodes)||(clientNode < 1)||(!level.sight_client)) + { + return 0; + } + + int nodeToSee = 0; + + for(int i = 0; i < node[data->curNode].getNumLinks(); i++) + { + int checkNode = node[data->curNode].getLink(i); + + if(checkNode == data->lastNode) + { + continue; + } + + if(checkNode == data->lastNode2) + { + continue; + } + if(checkNode == data->lastNode3) + { + continue; + } + + if(node[checkNode].getNumLinks() == 1) + { //dead end + continue; + } + +/* if(node[checkNode].getNumLinks() == 2) + { + if((node[checkNode].getLink(0) == data->lastNode && node[checkNode].getLink(1) == data->curNode)|| + (node[checkNode].getLink(1) == data->lastNode && node[checkNode].getLink(0) == data->curNode)) + { + continue; + } + }*/ + + if(nodeToSee) + { // two possible paths - just hang around 'cause we sadly don't know where to go right now + return 0; + } + + nodeToSee = checkNode; + } + + if(nodeToSee) + { + VectorCopy(node[nodeToSee].getPos(), data->goPoint); + return 1; + } + return 0; +} + +int CAIPaths::getLookSpot(vec3_t source, vec3_t outSpot, int key) +{ + int myNode = getNode(source, 0); + + if(!myNode) + { + return 0; + } + + CAIPathNode *checkNode = &node[myNode]; + + if(!checkNode) + { + return 0; + } + + if(checkNode->getNumLinks() <= 0) + { + return 0; + } + + int lookNode = checkNode->getLink(key % checkNode->getNumLinks()); + + if(!lookNode) + { + return 0; + } + + checkNode = &node[lookNode]; + + if(!checkNode) + { + return 0; + } + + VectorCopy(checkNode->getPos(), outSpot); + + return 1; +} \ No newline at end of file diff --git a/Source/Game/gamecpp/ai_pathfinding.h b/Source/Game/gamecpp/ai_pathfinding.h new file mode 100644 index 0000000..64384ec --- /dev/null +++ b/Source/Game/gamecpp/ai_pathfinding.h @@ -0,0 +1,226 @@ +#ifndef __AI_PATH_H +#define __AI_PATH_H + +#include "ai_path_pre.h" + +enum +{ + FLOOR_YMINUS, + FLOOR_XPLUS, + FLOOR_YPLUS, + FLOOR_XMINUS, +}; + +enum +{ + FLOORSLOT_EMPTY = 0, + FLOORSLOT_SINGLE, + FLOORSLOT_DOUBLE +}; + +class CAIFloorSystem; + +class CAIFloor +{ +private: + vec3_t min; + int partial; + int id; + short nearNodes[NUM_NEAR_NODES]; + float topZ; + short adjFloors[4]; +public: + int getID(void){return id;} + int getNode(void){return nearNodes[0];} + int getPartial(void){return partial;} + void load(byte **inData); + float getZValue(void){return min[2];} + float *getMin(void){return min;} + short getAdj(int side){return adjFloors[side];} + short getNearNode(int val){return nearNodes[val];} + + void setTopZ(float newVal){topZ = newVal;} + float getTopZ(void){return topZ;} + + int getBestClearFloor(int recurse, CAIFloorSystem &system, int sideFrom); +}; + +class CAIFloorYRow +{ +private: + int numFloors; + CAIFloor *floors; + float yValue; +public: + CAIFloorYRow(void){numFloors = 0; floors = 0; yValue = 0;} + void clear(void){delete[] floors; floors = 0; numFloors = 0;} + CAIFloor *getFloorForPosition(vec3_t position); + float getYValue(void){return yValue;} + void load(byte **inData); +}; + +class CAIFloorXRow +{ +private: + int numYRows; + CAIFloorYRow *yRows; + float xValue; +public: + CAIFloorXRow(void){numYRows = 0; yRows = 0; xValue = 0;} + CAIFloor *getFloorForPosition(vec3_t position); + float getXValue(void){return xValue;} + void load(byte **inData); + void clear(void); +}; + +//quicker implementation? +#define MAX_USED_FLOORS 64 + +class CAIFloorSystem +{ +private: + int numFloors; + CAIFloor *floors; + int numXRows; + CAIFloorXRow *xRows; + + int floorsUsed; + + int occupArray; + int *floorOccupation; + +public: + CAIFloorSystem(void){numXRows = 0; xRows = 0; numFloors = 0; floors = 0; occupArray = 0; floorOccupation = 0;} + void clear(void); + CAIFloor *getFloorForPosition(vec3_t position); + void load(byte **inData); + CAIFloor *acquireFloorSpace(int numSlots) + {floorsUsed += numSlots; assert(floorsUsed <= numFloors); return &floors[floorsUsed - numSlots];} + CAIFloor *getFloorForNumber(int num){assert(num < numFloors);return &floors[num];} + void clearOccupiedFloors(void); + void addOccupiedFloor(int val); + void addOccupiedFloor(CAIFloor *val); + int floorIsOccupied(int val, int c1, int c2, int c3, int c4); + int getNearestFreePosition(vec3_t start, vec3_t spot); +}; + +class CAIPathLink +{ +protected: + int linkId; + float dist; + connectType type; + +public: + void load(byte **inData); + int getLinkId(void){return linkId;} + connectType getType(void){return type;} + float getDist(void){return dist;} +}; + +class CAIPathNode +{ +protected: + int id; + vec3_t pos; + int numLinks; + CAIPathLink *link; + int numCombatLinks; + CAIPathLink *combatLinks; + byte *path; + short *pathRanks; + float radius; + int pointType; + int flee1; // this is a friendly flee point... enemy will use only if flee2 is not set + int flee2; // enemy flee point + + float checkKey;//used for the searches + + float lastOccupyTime; + int occupiedBy; + + int ignoreForSpawning; + float minHeight; + float maxHeight; + +public: + CAIPathNode(void){link = 0; path = 0; combatLinks = 0; numLinks = 0; numCombatLinks = 0; checkKey = 0; + lastOccupyTime = 0; occupiedBy = 0; pathRanks = 0;} + + void load(byte **inData, int numNodes); + void clean(void); + int getDest(int finalNode); + int getRank(int node){if(node == -1)return 15999; return pathRanks[node];} + void getPos(vec3_t output){VectorCopy(pos, output);} + float *getPos(){return pos;} + float getRadius(void){return radius;} + int getNumLinks(void){return numLinks;} + int getLink(int val){assert(val > -1); assert(val < numLinks); return link[val].getLinkId();} + + int getNumCombatPoints(void){return numCombatLinks;} + int getCombatPoints(int val){assert(val > -1); assert(val < numCombatLinks); return combatLinks[val].getLinkId();} + + CAIPathLink *getLinkWithId(int val); + int getType(void){return pointType;} + + void setCheckKey(float val){checkKey = val;} + float getCheckKey(void){return checkKey;} + + int getFleePoint(int id){if(id == 1)return flee1; if(id == 2)return flee2; return 0;} + + int isValidCombatPoint(vec3_t blockDir); + + int pathInRange(void); + int pathLinksInRange(int numNodes); + int getSpawnNode(float key, vec3_t spot, int allowBehind, vec3_t fwd); + void markClearedNodes(float key); +}; + +class CAIPaths +{ +protected: + int numNodes; + CAIPathNode *node; + int numCombatNodes; + CAIPathNode *combatNode; + int clientNode; + int clientCorners[4]; + int searchKey; + + CAIFloorSystem floors; + + int getClearPath(int startRegion, int endNode, int approach, nodeData_t *data, vec3_t start, edict_t *ent); + int clearLineForFloor(int startID, vec3_t end, nodeData_t *data, int approach); + int getFloorPath(int startRegion, int nextNode, nodeData_t *data, int recurse = 3, int ignoreRegion = -1, float *distFound = 0, int sourceStart = -1); + int clearForDirection(int startRegion, int endNode, nodeData_t *data, vec3_t endSpot); + +public: + CAIPaths(void){node = 0; numNodes = 0; combatNode = 0; numCombatNodes = 0;} + void load(void); + void clean(void); + void getPath(vec3_t start, vec3_t end, nodeData_t *data, ai_public_c *who = 0, edict_t *ent = 0, int approach = 1, edict_t *targ = 0); + void getReversePath(vec3_t start, vec3_t end, nodeData_t *data, ai_public_c *who = 0, edict_t *ent = 0, edict_t *targ = 0); + int isActive(void){return (numNodes > 0);} + + // returns the distance or 0 if invalid + int getNearestFleePoint(nodeData_t *data, vec3_t outSpot, int team); + void getCombatPoint(nodeData_t *data, vec3_t start, vec3_t end, vec3_t dir); + + int getNode(vec3_t pos, int prev, int prevDest = 0); + void linkEnemyIntoPath(vec3_t pos, nodeData_t *data); + + CAIPathNode *getNode(int val){return &node[val];} + void setupClientPathInfo(int *node, int *region); + + int getSpawnPosition(vec3_t outSpot, int allowBehind); + CAIFloorSystem *getFloors(void){return &floors;} + + void idealWanderPoint(nodeData_t *data, ai_public_c *who = 0); + int search(nodeData_t *data, ai_public_c *who = 0); + + int getLookSpot(vec3_t source, vec3_t outSpot, int key); +}; + +extern CAIPaths aiPoints; + +#endif \ No newline at end of file diff --git a/Source/Game/gamecpp/ai_private.h b/Source/Game/gamecpp/ai_private.h new file mode 100644 index 0000000..bfadbdc --- /dev/null +++ b/Source/Game/gamecpp/ai_private.h @@ -0,0 +1,50 @@ + +//ai_private.h + +//ai include file for ai code only + +#ifndef _AI_PRIVATE_H_ +#define _AI_PRIVATE_H_ + +#define jump_movemask 1 +#define fall_movemask 2 +#define step_movemask 4 + +extern sensedEntInfo_t NULL_sensedEntInfo; + +#include "actionids.h" +#include "ai.h" +#include "ai_senses.h"//needed for spawning sounds +#include "ai_actions.h" +#include "ai_body.h" +#include "ai_bodyhuman.h" +#include "ai_bodydekker.h" +#include "ai_bodydog.h" +#include "ai_bodycow.h" +#include "ai_bodynoghoul.h" +#include "m_heliactions.h" +#include "m_snowcatactions.h" +#include "m_tankactions.h" +//#include "enemy_info.h" +#include "ai_decisions.h" + +#define BLOWN_PART_FADE 1.0F +#define BODY_PART_MAXLIFE 30.0f + + +//animation frame flags +#define FRAMEFLAG_FOOTSTEP 0x00000001 +#define FRAMEFLAG_ATTACK 0x00000002 +#define FRAMEFLAG_SPEAK 0x00000004 +#define FRAMEFLAG_BREATHE 0x00000008//steamy breath in winter +#define FRAMEFLAG_DROPINVENTORY 0x00000010 +#define FRAMEFLAG_HOLDFRAME 0x00000020 +#define FRAMEFLAG_JUMP 0x00000040 +#define FRAMEFLAG_OOZE 0x00000080 +#define FRAMEFLAG_LAND 0x00000100 +#define FRAMEFLAG_MELEE 0x00000200//for the dog's melee attack +#define FRAMEFLAG_THROW 0x00000400//more properly left hand attack but I believe that's always a throw + +#define MONSTER_SHOOT_HEIGHT 20 + +#endif //_AI_PRIVATE_H_ \ No newline at end of file diff --git a/Source/Game/gamecpp/ai_public.h b/Source/Game/gamecpp/ai_public.h new file mode 100644 index 0000000..a5ac3ff --- /dev/null +++ b/Source/Game/gamecpp/ai_public.h @@ -0,0 +1,335 @@ + +//ai_public + +//ai include file for everyone's enjoyment + + +// noise types for PlayerNoise +typedef enum +{ + AI_SENSETYPE_UNKNOWN, + + AI_SENSETYPE_SOUND_SELF, + AI_SENSETYPE_SOUND_WEAPON, + AI_SENSETYPE_SOUND_IMPACT, + AI_SENSETYPE_SOUND_WHIZ, + AI_SENSETYPE_SOUND_MAGICAL, + AI_SENSETYPE_SOUND_INVESTIGATE, + AI_SENSETYPE_SOUND_WAKEUP, + + AI_SENSETYPE_SIGHT_CLEAR, + AI_SENSETYPE_SIGHT_OBSTRUCTED, + + AI_SENSETYPE_MAGIC +} ai_sensetype_e; + +#include "g_monster.h" + + +//ai class codes: +typedef enum +{ +AI_PUBLIC, +AI_BASE, +AI_GENERIC, +AI_GENERIC_NPC, +AI_GENERIC_ENEMY_NPC, +AI_GENERIC_DOG, +AI_GENERIC_COW, +AI_GENERIC_MERC, + +/*AI_GENERIC_MERC_GRUNT, +AI_GENERIC_MERC_DEMO, +AI_GENERIC_MERC_SNIPER, +AI_GENERIC_MERC_MEDIC, +AI_GENERIC_MERC_HEAVY, +AI_GENERIC_MERC_TECH, +*/ +AI_HELI, +AI_TANK, +AI_SNOWCAT, + +AI_DOG_HUSKY, +AI_DOG_ROTTWEILER, +AI_BLOWNPART, +AI_PLAYERCORPSE, + +AI_ECTO_SKINLEADER, +AI_ECTO_STOCKBROKER, +AI_ECTO_DCTOURIST, +AI_ECTO_NYCBUM, +AI_ECTO_COLPRISONER1, +AI_ECTO_COLPRISONER2, +AI_ECTO_IRAQCITIZEN, +AI_ECTO_UGNCOMMANDER, +AI_ECTO_SERBOFFICER, +AI_ECTO_KOSREFUGEE, +AI_ECTO_IRAQOFFICER, +AI_ECTO_FACTORY, +AI_ECTO_CHEMIST, +AI_ECTO_SIBSUIT, +AI_ECTO_SIBSCIENCE, +AI_ECTO_PUNK2, + +AI_MESO_JOHN, +AI_MESO_JOHN_SNOW, +AI_MESO_JOHN_DESERT, +AI_MESO_HAWK, +AI_MESO_HURTHAWK, +AI_MESO_SAM, +AI_MESO_IRAQWORKER, +AI_MESO_NYCPUNK, +AI_MESO_AMU, +AI_MESO_RAIDERBOSS, +AI_MESO_RAIDERBOSS2, +AI_MESO_IRAQSOLDIER1, +AI_MESO_IRAQSOLDIER2, +AI_MESO_IRAQSOLDIER2B, +AI_MESO_IRAQREPGUARD, +AI_MESO_IRAQREPGUARDB, +AI_MESO_IRAQPOLICE, +AI_MESO_IRAQCOMMANDER, +AI_MESO_IRAQBRUTEA, +AI_MESO_IRAQBRUTEB, +AI_MESO_IRAQBODYGUARD, +AI_MESO_IRAQROCKET, +AI_MESO_IRAQSADDAM, +AI_MESO_IRAQMAN2, +AI_MESO_UGNSNIPER, +AI_MESO_UGNSOLDIER1, +AI_MESO_UGNSOLDIER1B, +AI_MESO_UGNSOLDIER2, +AI_MESO_UGNSOLDIER3, +AI_MESO_NYCSWATGUY, +AI_MESO_NYCSWATLEADER, +AI_MESO_RAIDER1, +AI_MESO_RAIDER2A, +AI_MESO_RAIDER2B, +AI_MESO_RAIDERBRUTE, +AI_MESO_RAIDERROCKET, +AI_MESO_SIBTROOPER2, +AI_MESO_SIBCLEANSUIT, +AI_MESO_SERBGRUNT1, +AI_MESO_SERBGRUNT2, +AI_MESO_SERBGRUNT3, +AI_MESO_SERBSNIPER1A, +AI_MESO_SERBSNIPER1B, +AI_MESO_SERBCOMTROOP, +AI_MESO_SERBBRUTE1A, +AI_MESO_SERBBRUTE1B, +AI_MESO_SERBMECHANIC, +AI_MESO_KOSREBEL, +AI_MESO_KOSKLAGUY, +AI_MESO_SKINHEAD1, +AI_MESO_SKINHEAD2A, +AI_MESO_SKINHEAD2B, +AI_MESO_SKINHEADBOSS, +AI_MESO_MALEPOLITICIAN, +AI_MESO_TOKMALEHOSTAGE, +AI_MESO_TOKHENCH1, +AI_MESO_TOKHENCH2, +AI_MESO_TOKKILLER, +AI_MESO_TOKNINJA, +AI_MESO_TOKBRUTE, +AI_MESO_JAPANSUIT, +AI_MESO_UGNBRUTE, +AI_MESO_UGNROCKET, +AI_MESO_SIBTROOPER1A, +AI_MESO_SIBTROOPER1B, +AI_MESO_SIBGUARD, +AI_MESO_SIBGUARD3, +AI_MESO_SIBGUARD4, +AI_MESO_SIBMECH, + +AI_FEMALE_SKINCHICK, +AI_FEMALE_NYWOMAN, +AI_FEMALE_SIBGUARD, +AI_FEMALE_SIBSCIENCE, +AI_FEMALE_IRQWOMAN1, +AI_FEMALE_IRQWOMAN2, +AI_FEMALE_TOKWOMAN1, +AI_FEMALE_TOKWOMAN2, +AI_FEMALE_TOKASSASSIN, +AI_FEMALE_RAIDER, +AI_FEMALE_TAYLOR, +} AI_CLASS_CODES; + + +#define alarm_mask 1 +#define sight_mask 2 +#define sound_mask 4 + +#define smask_all 0xffffffff + + +#define TEAM_PUNKS 2 +#define TEAM_SKINHEADS 3 +#define TEAM_INNOCENTS 4 + +typedef enum +{ + atype_default, + atype_walk, + atype_pain, + atype_death, + atype_attack, + atype_jump, + atype_fall, + atype_surrender, + atype_capture, + atype_deatharmor +} actiontype_e; + +typedef struct +{ + edict_t *ent;//who + vec3_t pos;//where was it, last time i saw/heard it? + float time;//when did i last see/hear it? + ai_sensetype_e senseType;//what sort of sense event was it? +} sensedEntInfo_t; + +typedef struct +{ + float max_turn; + float min_turn; +} turninfo_s; + +typedef enum +{ + smute_recov_none, + smute_recov_instant, + smute_recov_linear, + smute_recov_exp +} smute_recovery; + +#define smute_degree_severe 20.0 //sense is operating at 5%, which is severe, ok? +#define smute_degree_total 100.0 //sense is operating at 1%, which is close enough to totally muted, ok? + +//possible emotions--sorted by priority. +typedef enum +{ + EMOTION_NORMAL=1, + EMOTION_AFRAID, + EMOTION_MEAN, + EMOTION_PAIN, + EMOTION_DEAD, + EMOTION_TALK, + EMOTION_MEANTALK, + EMOTION_FEARTALK, +} emotion_index; + +typedef enum +{ + ATTENTION_DISTRACTED, // ignore all but the most blatant stimulus + ATTENTION_IDLE, // normal + ATTENTION_ALERT, // EXTREMELY alert - wide field of view, very sensitive to sound + ATTENTION_ESCAPED, // ER!!! Um, this doesn't actually make any sense whatsoever... but I need a spot for this =( +}attention_index; + +typedef enum +{ + PRIORITY_HIGH, + PRIORITY_LOW, +}priority_index; + +class ai_public_c +{ +protected: + virtual void AddBody(edict_t *monster){} + ai_public_c(edict_t *monster, char *subname){} + ai_public_c(edict_t *monster){} +public: + + //leaving these vecs public for now...:( + vec3_t velocity; + vec3_t ideal_angles; + + ai_public_c(void){} + virtual ~ai_public_c(void){} + + virtual qboolean IsFirstFrameTime(void){return false;} + virtual void FirstFrame(edict_t *monster){} + + //adjust this to return something moderately compatible with player team types + virtual int GetTeam(edict_t &monster){return 1;} + virtual int IsInnocent() { return 0; } + + virtual const char* GetInterpFile(char *theclass, char *subclass){return NULL;} + virtual const char* GetObjectSkin(char *theclass, char *subclass){return NULL;} + + virtual qboolean SafeToRemove(edict_t &monster){return true;} + + virtual void Emote(edict_t &monster, emotion_index new_emotion, float emotion_duration, qboolean scripted_emoting=false){} + virtual emotion_index GetMood(edict_t &monster){return EMOTION_NORMAL;} + + virtual void SetPriority(priority_index newp){} + + virtual void NewSense(sense_c *new_sense, edict_t *monster){} + virtual void NewAction(action_c *new_action, edict_t *monster, qboolean activatenow){} + virtual void NewDecision(decision_c *new_decision, edict_t *monster){} + virtual void Think(edict_t &monster){} + virtual qboolean Damage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb){return false;} + + virtual qboolean IsActive(void){return true;} + virtual void Activate(edict_t &monster){} + + virtual void SetTargetTime(float now, edict_t *target, vec3_t position){} + virtual void setFirstTargetTime(float newTime){} + + virtual void SetStartleability(qboolean newVal){} + + virtual void SetHostage(qboolean bHostage) {} + + virtual void UseMonster(edict_t *user){} + virtual void TouchMonster(edict_t *user){} + + virtual void SetAbusedByTeam(qboolean newa){} + virtual qboolean GetAbusedByTeam(void){return false;} + + virtual void MuteSenses(unsigned mask, float degree, smute_recovery recovery_code, float recovery_time){} + virtual void RegisterSenseEvent(unsigned mask, vec3_t event_origin, float event_time, edict_t *event_edict, ai_sensetype_e event_code){} + virtual void GetLookVector(vec3_t myaim){VectorCopy(vec3_up,myaim);} + virtual attention_index GetAttention(edict_t &monster){return ATTENTION_IDLE;} + + virtual qboolean HasHadTarget(void){return 0;} + + virtual int GetRank(void){return 0;} + virtual void SetRank(int newrank){} + + virtual void RegisterShotForDodge(vec3_t start, vec3_t end, edict_t *shooter){} + virtual void RegisterShotForReply(vec3_t start, vec3_t end, edict_t *shooter){} + virtual void Spook(float amount, vec3_t center){} + + virtual void Escape(edict_t &monster){}//not so pleased about exposing this + + // Get a default action + virtual action_c *DefaultAction(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination = vec3_origin, vec3_t facing = vec3_origin, edict_t *target = NULL, float timeout= 0/*999999999999*/, qboolean fullAnimation = false){return NULL;}//for standing + virtual action_c *WalkAction(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false){return NULL;} + virtual action_c *PainAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *other, float kick, int damage, float timeout=999999999999, qboolean fullAnimation = false){return NULL;} + virtual action_c *DeathAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point){return NULL;} + virtual action_c *AttackAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t attackPos, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false){return NULL;} + virtual action_c *JumpAction(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false){return NULL;} + virtual action_c *FallAction(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false){return NULL;} + virtual action_c *SurrenderAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *surrenderTo, vec3_t attackerPos, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false){return NULL;} + virtual action_c *CaptureAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t attackPos, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false){return NULL;} + virtual action_c *EndScriptAction(decision_c *od){return NULL;}; + + virtual void WatchMe(void){} + virtual qboolean BeingWatched(void){return false;} + virtual void RequestMoveOutOfWay(vec3_t moveDir){}; + + virtual void UpdatePathPosition(edict_t *myEnt){} + virtual int getMyNode(void){return 0;} + + virtual scripted_decision *FindScriptedDecision(edict_t* ScriptEntity){return NULL;} + virtual void CancelScripting(edict_t* ScriptEntity){} + + + ai_public_c(ai_public_c *orig); + virtual void Evaluate(ai_public_c *orig); + virtual void Read() { assert(0); } + virtual void Write() { assert(0); } +static ai_public_c *NewClassForCode(int code); +static ai_public_c *NewClassForCode(int code, edict_t *monster); + virtual int GetClassCode(void){ return AI_PUBLIC; } +}; diff --git a/Source/Game/gamecpp/ai_senses.cpp b/Source/Game/gamecpp/ai_senses.cpp new file mode 100644 index 0000000..b86c63b --- /dev/null +++ b/Source/Game/gamecpp/ai_senses.cpp @@ -0,0 +1,835 @@ +#include "g_local.h" +#include "ai_private.h" + +sense_c aSenseC; +sound_sense aSoundSenseC; +sight_sense aSightSenseC; +alarm_sense aAlarmSenseC; + +sense_c *sense_c::NewClassForCode(int code) +{ + switch (code) + { + default: + gi.dprintf("ERROR: invalid sense class code: %d\n",code); + case SENSE: + return new sense_c; + case ALARM_SENSE: + return new alarm_sense; + case SIGHT_SENSE: + return new sight_sense; + case NORMALSIGHT_SENSE: + return new normalsight_sense; + case SOUND_SENSE: + return new sound_sense; + case OMNISCIENCE_SENSE: + return new omniscience_sense; + case MAGICSIGHT_SENSE: + return new magicsight_sense; + } +} + +sense_c::sense_c(vec3_t new_origin, float new_time) +{ + VectorCopy(new_origin, origin); + time = new_time; + mute_starttime = level.time-1; + mute_endtime = level.time-1; + mute_degree = 0; + mute_recovercode = smute_recov_instant; + + sensed_client.time = - 10000.0; + sensed_client.ent = NULL; + sensed_client.senseType = AI_SENSETYPE_UNKNOWN; + + sensed_monster.time = - 10000.0; + sensed_monster.ent = NULL; + sensed_monster.senseType = AI_SENSETYPE_UNKNOWN; +} + +sense_c::sense_c(void) +{ + VectorClear(origin); + + time = level.time; + mute_starttime = level.time-1; + mute_endtime = level.time-1; + mute_degree = 0; + mute_recovercode = smute_recov_instant; + + sensed_client.time = - 10000.0; + VectorClear(sensed_client.pos); + sensed_client.ent = NULL; + sensed_client.senseType = AI_SENSETYPE_UNKNOWN; + + sensed_monster.time = - 10000.0; + VectorClear(sensed_monster.pos); + sensed_monster.ent = NULL; + sensed_monster.senseType = AI_SENSETYPE_UNKNOWN; +} + +float sense_c::CurrentMutedLevel(void) +{ + float timeVal; + + //if the muting has timed out, then forget it + if ((mute_recovercode != smute_recov_none) && (mute_endtime <= level.time || mute_starttime >= level.time)) + { + return 0; + } + + switch(mute_recovercode) + { + default: + gi.dprintf("unknown sense muting recovery code: %d!\n", mute_recovercode); + case smute_recov_none: + return mute_degree; + case smute_recov_instant: + return mute_degree; + case smute_recov_linear: + return mute_degree*(mute_endtime-level.time)/(mute_endtime-mute_starttime); + case smute_recov_exp: + timeVal=(mute_endtime-level.time)/(mute_endtime-mute_starttime); + return mute_degree*timeVal*timeVal; + } +} + +int sense_c::Range(edict_t *monster, edict_t *other) +{ + vec3_t to_other; + float dist_sq,mutetemp; + + VectorSubtract(other->s.origin, monster->s.origin, to_other); + dist_sq = VectorLengthSquared(to_other); + mutetemp = (1+CurrentMutedLevel()); + mutetemp *= mutetemp; + dist_sq *= mutetemp; + + return gmonster.Range(monster,other,dist_sq); +} + +int sense_c::Range(edict_t *monster, vec3_t where) +{ + vec3_t to_other; + float dist_sq,mutetemp; + + VectorSubtract(where, monster->s.origin, to_other); + dist_sq = VectorLengthSquared(to_other); + mutetemp = (1+CurrentMutedLevel()); + mutetemp *= mutetemp; + dist_sq *= mutetemp; + + return gmonster.Range(monster,monster,dist_sq); +} + +void sense_c::UpdateSensedClient(unsigned mask, sensedEntInfo_t &best_ent) +{ + if (!MaskOK(mask)) + { + return; + } + if (best_ent.time > sensed_client.time) + { + return; + } + best_ent.ent = sensed_client.ent; + VectorCopy(sensed_client.pos, best_ent.pos); + best_ent.time = sensed_client.time; + best_ent.senseType = sensed_client.senseType; +} + +void sense_c::UpdateSensedMonster(unsigned mask, sensedEntInfo_t &best_ent) +{ + if (!MaskOK(mask)) + { + return; + } + if (best_ent.time > sensed_monster.time) + { + return; + } + best_ent.ent = sensed_monster.ent; + VectorCopy(sensed_monster.pos, best_ent.pos); + best_ent.time = sensed_monster.time; + best_ent.senseType = sensed_monster.senseType; +} + +sense_c::sense_c(sense_c *orig) +{ + VectorCopy(orig->origin, origin); + + time = orig->time; + sensed_monster = orig->sensed_monster; + sensed_client = orig->sensed_client; + + mute_recovercode = orig->mute_recovercode; + mute_starttime = orig->mute_starttime; + mute_endtime = orig->mute_endtime; + mute_degree = orig->mute_degree; + + *(int *)&sensed_monster.ent = GetEdictNum(orig->sensed_monster.ent); + *(int *)&sensed_client.ent = GetEdictNum(orig->sensed_client.ent); +} + +void sense_c::Evaluate(sense_c *orig) +{ + VectorCopy(orig->origin, origin); + + time = orig->time; + sensed_monster = orig->sensed_monster; + sensed_client = orig->sensed_client; + + mute_recovercode = orig->mute_recovercode; + mute_starttime = orig->mute_starttime; + mute_endtime = orig->mute_endtime; + mute_degree = orig->mute_degree; + + sensed_monster.ent = GetEdictPtr((int)sensed_monster.ent); + sensed_client.ent = GetEdictPtr((int)sensed_client.ent); +} + +/********************************************************************************** + **********************************************************************************/ + +alarm_sense::alarm_sense(vec3_t new_origin, float new_time, float new_radius) +:sense_c(new_origin, new_time) +{ + radius = new_radius; +} + +qboolean alarm_sense::Evaluate(unsigned mask, ai_c &owner_ai, edict_t &monster) +{ + if (!(mask & alarm_mask)) + { + return false; + } + return true; +} + +alarm_sense::alarm_sense(alarm_sense *orig) +: sense_c(orig) +{ + radius = orig->radius; +} + +void alarm_sense::Evaluate(alarm_sense *orig) +{ + radius = orig->radius; + + sense_c::Evaluate(orig); +} + +void alarm_sense::Read() +{ + char loaded[sizeof(alarm_sense)]; + + gi.ReadFromSavegame('AIAS', loaded, sizeof(alarm_sense)); + Evaluate((alarm_sense *)loaded); +} + +void alarm_sense::Write() +{ + alarm_sense *savable; + + savable = new alarm_sense(this); + gi.AppendToSavegame('AIAS', savable, sizeof(*savable)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ + +//general fixme for sense evaluation: need a solid set of criteria for when to +//replace the enemy in monster's ai, and when to just leave what's there. +//whether this should be in senses or ai or what remains to be seen. + +//visibility is poor, but to simulate monsters anticipating player movement, allow position update-- +//but no new sighting, and no updating of sight time +void sight_sense::PoorVisibilityUpdate(ai_c &owner_ai, edict_t *monster, edict_t *sight_ent, float leeway_time) +{ + //do for both clients and monsters + if (sensed_client.ent == sight_ent && level.time - sensed_client.time < leeway_time) + { + VectorCopy(sight_ent->s.origin, sensed_client.pos); + sensed_client.senseType = AI_SENSETYPE_SIGHT_OBSTRUCTED; + } + else if (sensed_monster.ent == sight_ent && level.time - sensed_monster.time < leeway_time) + { + VectorCopy(sight_ent->s.origin, sensed_monster.pos); + sensed_monster.senseType = AI_SENSETYPE_SIGHT_OBSTRUCTED; + } +} + +void sight_sense::Look(ai_c &owner_ai, edict_t *monster, edict_t *sight_ent) +{ + edict_t *client=sight_ent; + int r; + + if (!client) + return; // no clients to get mad at + + // if the entity went away, forget it + if (!client->inuse) + return; + + //i see myself??? this is a thing that makes no sense. + if (client == monster) + { + return; + } + + if (client->client) + { + if (client->flags & FL_NOTARGET || (OnSameTeam(monster,client) && !owner_ai.GetAbusedByTeam()))// i don't play with cheaters. + return; + } + else if (!client->ai) + { + return; + } + + if((client->spawnflags & SPAWNFLAG_HOSTAGE)&&(monster->flags & FL_SPAWNED_IN)) + { // spawned guys have no interest in hostages - just in nosy players + return; + } + + if((!strcmp(client->classname, "m_x_mmerc"))) + { // people don't target Hawk - they're too afraid of him. + return; + } + + r = Range (monster, client); + + if (r == RANGE_FAR) + return; + +// this is where we would check invisibility + + if (r != RANGE_MELEE)//if e's close enuff for melee, i just Know where e is, ok? + { + // is client in an spot too dark to be seen? + //no technical reason for commenting this, but test levels aren't generally lit well--gets in way + //addendum--monsters don't have their light level set validly, i don't think--gotten from client + + //fixme: need to do something similar for monsters +/* + if (client->client && client->light_level <= 5) + { + PoorVisibilityUpdate(owner_ai, monster, client, 6.0); + return; + } +*/ + + //take care of stealth biz + if (client->svflags & SVF_ISHIDING) + { + PoorVisibilityUpdate(owner_ai, monster, client, 4.0); + return; + } + + if (!gmonster.Infront (monster, client)) + { + PoorVisibilityUpdate(owner_ai, monster, client, 4.0); + return; + } + } + + //took this out of non-melee checks--can't allow superclose range bypass visibility check, have guys shootin through walls + if (!gmonster.Visible (monster, client)) + { + PoorVisibilityUpdate(owner_ai, monster, client, 0.25); + return; + } + + //update appropriate slot for monster + if (client->client) + { + sensed_client.ent = client; + sensed_client.time = level.time; + VectorCopy(client->s.origin, sensed_client.pos); + sensed_client.senseType = AI_SENSETYPE_SIGHT_CLEAR; + } + else + { + sensed_monster.ent = client; + sensed_monster.time = level.time; + VectorCopy(client->s.origin, sensed_monster.pos); + sensed_monster.senseType = AI_SENSETYPE_SIGHT_CLEAR; + } +} + +qboolean sight_sense::Evaluate(unsigned mask, ai_c &owner_ai, edict_t &monster) +{ + if (!(mask & sight_mask)) + { + return false; + } + + Look(owner_ai,&monster,level.sight_client); // level will continually update who we can be mad at + Look(owner_ai,&monster,level.sight_monster); // level will continually update who we can be mad at + + return false; +} + +void sight_sense::Mute(unsigned mask, float degree, smute_recovery recovery_code, float recovery_time) +{ + if (!(mask & sight_mask)) + { + return; + } + mute_starttime=level.time; + mute_endtime=level.time+recovery_time; + mute_degree=degree; + mute_recovercode=recovery_code; +} + +sight_sense::sight_sense(sight_sense *orig) +: sense_c(orig) +{ +} + +void sight_sense::Evaluate(sight_sense *orig) +{ + sense_c::Evaluate(orig); +} + +void sight_sense::Read() +{ + char loaded[sizeof(sight_sense)]; + + gi.ReadFromSavegame('AISS', loaded, sizeof(sight_sense)); + Evaluate((sight_sense *)loaded); +} + +void sight_sense::Write() +{ + sight_sense *savable; + + savable = new sight_sense(this); + gi.AppendToSavegame('AISS', savable, sizeof(*savable)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ + +normalsight_sense::normalsight_sense(normalsight_sense *orig) +: sight_sense(orig) +{ +} + +void normalsight_sense::Evaluate(normalsight_sense *orig) +{ + sight_sense::Evaluate(orig); +} + +void normalsight_sense::Write() +{ + normalsight_sense *savable; + + savable = new normalsight_sense(this); + gi.AppendToSavegame('AINS', savable, sizeof(*this)); + delete savable; +} + +void normalsight_sense::Read() +{ + char loaded[sizeof(normalsight_sense)]; + + gi.ReadFromSavegame('AINS', loaded, sizeof(normalsight_sense)); + Evaluate((normalsight_sense *)loaded); +} + +/********************************************************************************** + **********************************************************************************/ + +void sound_sense::RegisterEvent(vec3_t event_origin, float event_time, edict_t *event_edict, ai_sensetype_e event_code) +{ + if (numsounds >= MAX_AISOUNDS) + { + return; + } + + VectorCopy(event_origin, sounds[numsounds].heardLocation); + VectorCopy(event_edict->s.origin, sounds[numsounds].origin); + sounds[numsounds].ent = event_edict; + sounds[numsounds].code = event_code; + sounds[numsounds].time = event_time; + + numsounds++; +} + +void sound_sense::Mute(unsigned mask, float degree, smute_recovery recovery_code, float recovery_time) +{ + if (!(mask & sound_mask)) + { + return; + } + mute_starttime=level.time+0.3; + mute_endtime=level.time+recovery_time+0.3; + mute_degree=degree; + mute_recovercode=recovery_code; +} + +qboolean sound_sense::Evaluate(unsigned mask, ai_c &owner_ai, edict_t &monster) +{ + int r,i; + + //these fellas were here to test more realistic reactions, but i ended up focusing more on Getting a reaction, thus they're commented out but they should be fine + vec3_t toHeardLocation; + float toHeardLocationDistSq; + + if (!(mask & sound_mask)) + { + return false; + } + + for (i=0;iflags & FL_NOTARGET) + { + continue; + } + + //always hear magical sounds... + if (sounds[i].code == AI_SENSETYPE_SOUND_MAGICAL) + { + if (sounds[i].ent->client) + { + sensed_client.time = level.time; + VectorCopy(sounds[i].origin, sensed_client.pos); + sensed_client.ent = sounds[i].ent; + sensed_client.senseType = sounds[i].code; + } + else + { + sensed_monster.time = level.time; + VectorCopy(sounds[i].origin, sensed_monster.pos); + sensed_monster.ent = sounds[i].ent; + sensed_monster.senseType = sounds[i].code; + } + continue; + } + + r = Range (&monster, sounds[i].heardLocation); + + //din't hear it + if (r==RANGE_FAR) + { + continue; + } + + //wretch! clean me up! fixme! cleaner i say! + //update appropriate info depending on whether sound is coming from player or monster + if (sounds[i].ent) + { + VectorSubtract(sounds[i].heardLocation, monster.s.origin, toHeardLocation); + toHeardLocationDistSq=VectorLengthSquared(toHeardLocation); + + //if it's a wake-up that's really close, it was probably me--ignore it + if (sounds[i].code==AI_SENSETYPE_SOUND_WAKEUP && toHeardLocationDistSq < 400) + { + continue; + } + + if (sounds[i].ent->client) + { + //fixme: if i don't have an enemy, should update position, but differently + if (!sensed_client.ent || level.time - sensed_client.time > 10.0 || sensed_client.ent == sounds[i].ent) + { + if (sounds[i].code == AI_SENSETYPE_SOUND_SELF || sounds[i].code == AI_SENSETYPE_SOUND_WEAPON) + { + sensed_client.time = level.time-5.0; +// if (toHeardLocationDistSq<40000) +// { + VectorCopy(sounds[i].origin, sensed_client.pos); +// } +// else +// { +// VectorCopy(sounds[i].heardLocation, sensed_client.pos); +// } + sensed_client.ent = sounds[i].ent; + sensed_client.senseType = sounds[i].code; + } + else if (!sensed_client.ent || level.time - sensed_client.time > 20.0)//weapon impact or whiz + { + sensed_client.time = level.time-10.0; +// if (toHeardLocationDistSq<40000) +// { + VectorCopy(sounds[i].origin, sensed_client.pos); +// } +// else +// { +// VectorCopy(sounds[i].heardLocation, sensed_client.pos); +// } + sensed_client.ent = sounds[i].ent; + sensed_client.senseType = sounds[i].code; + } + } + } + else + { + //fixme: if i don't have an enemy, should update position, but differently + if (!sensed_monster.ent || level.time - sensed_monster.time > 10.0) + { + if (sounds[i].code == AI_SENSETYPE_SOUND_SELF || sounds[i].code == AI_SENSETYPE_SOUND_WEAPON) + { + sensed_monster.time = level.time-5.0; +// if (toHeardLocationDistSq<40000) +// { + VectorCopy(sounds[i].origin, sensed_monster.pos); +// } +// else +// { +// VectorCopy(sounds[i].heardLocation, sensed_monster.pos); +// } + sensed_monster.ent = sounds[i].ent; + sensed_client.senseType = sounds[i].code; + } + else if (!sensed_monster.ent || level.time - sensed_monster.time > 20.0)//weapon impact or whiz + { + sensed_monster.time = level.time-10.0; +// if (toHeardLocationDistSq<40000) +// { + VectorCopy(sounds[i].origin, sensed_monster.pos); +// } +// else +// { +// VectorCopy(sounds[i].heardLocation, sensed_monster.pos); +// } + sensed_monster.ent = sounds[i].ent; + sensed_monster.senseType = sounds[i].code; + } + } + } + } + } + + numsounds=0; + return false; +} + +sound_sense::sound_sense(sound_sense *orig) +: sense_c(orig) +{ + int i; + + numsounds = orig->numsounds; + for(i = 0; i < numsounds; i++) + { + sounds[i] = orig->sounds[i]; + *(int *)&sounds[i].ent = GetEdictNum(orig->sounds[i].ent); + } + for( ; i < MAX_AISOUNDS; i++) + { + VectorClear(sounds[i].heardLocation); + VectorClear(sounds[i].origin); + sounds[i].ent = NULL; + sounds[i].code = AI_SENSETYPE_UNKNOWN; + sounds[i].time = 0.0F; + } +} + +void sound_sense::Evaluate(sound_sense *orig) +{ + int i; + + numsounds = orig->numsounds; + for(i = 0; i < numsounds; i++) + { + sounds[i] = orig->sounds[i]; + sounds[i].ent = GetEdictPtr((int)sounds[i].ent); + } + sense_c::Evaluate(orig); +} + +void sound_sense::Read() +{ + char loaded[sizeof(sound_sense)]; + + gi.ReadFromSavegame('AISO', loaded, sizeof(sound_sense)); + Evaluate((sound_sense *)loaded); +} + +void sound_sense::Write() +{ + sound_sense *savable; + + savable = new sound_sense(this); + gi.AppendToSavegame('AISO', savable, sizeof(*savable)); + delete savable; +} + +///////////////////////////////////////////////////////////////////////////////// + + +void omniscience_sense::Look(ai_c &owner_ai, edict_t *monster, edict_t *sight_ent) +{ + edict_t *client=sight_ent; + + if (!client) + return; // no clients to get mad at + + // if the entity went away, forget it + if (!client->inuse) + return; + + //i see myself??? this is a thing that makes no sense. + if (client == monster) + { + return; + } + + if (client->client) + { + if (client->flags & FL_NOTARGET || (OnSameTeam(monster,client) && !owner_ai.GetAbusedByTeam()))// i don't play with cheaters. + return; + } + else if (!client->ai) + { + return; + } + + //no checks--i see all + + //update appropriate slot for monster + if (client->client) + { + + sensed_client.ent = client; + sensed_client.time = level.time; + VectorCopy(client->s.origin, sensed_client.pos); + sensed_client.senseType = AI_SENSETYPE_MAGIC; + } + else + { + sensed_monster.ent = client; + sensed_monster.time = level.time; + VectorCopy(client->s.origin, sensed_monster.pos); + sensed_monster.senseType = AI_SENSETYPE_MAGIC; + } +} + +omniscience_sense::omniscience_sense(omniscience_sense *orig) +: sight_sense(orig) +{ +} + +void omniscience_sense::Evaluate(omniscience_sense *orig) +{ + sight_sense::Evaluate(orig); +} + +void omniscience_sense::Read() +{ + char loaded[sizeof(omniscience_sense)]; + + gi.ReadFromSavegame('AINS', loaded, sizeof(omniscience_sense)); + Evaluate((omniscience_sense *)loaded); +} + +void omniscience_sense::Write() +{ + omniscience_sense *savable; + + savable = new omniscience_sense(this); + gi.AppendToSavegame('AINS', savable, sizeof(*this)); + delete savable; +} + +void omniscience_sense::Mute(unsigned mask, float degree, smute_recovery recovery_code, float recovery_time) +{ + return; +} + +///////////////////////////////////////////////////////////////////////////////// + +//geh. this could prolly be smooshed into regular sight, but this is the quick way to get it working for blind guys +void magicsight_sense::Look(ai_c &owner_ai, edict_t *monster, edict_t *sight_ent) +{ + edict_t *client=sight_ent; + + if (!client) + return; // no clients to get mad at + + // if the entity went away, forget it + if (!client->inuse) + return; + + //i see myself??? this is a thing that makes no sense. + if (client == monster) + { + return; + } + + if (client->client) + { + if (client->flags & FL_NOTARGET || (OnSameTeam(monster,client) && !owner_ai.GetAbusedByTeam()))// i don't play with cheaters. + return; + } + else// if (!client->ai)//no magically seeing other monsters! + { + return; + } + + //simple dist check--i see all + vec3_t to_seen; + float toSeenDistSq; + VectorSubtract(client->s.origin, monster->s.origin, to_seen); + toSeenDistSq=VectorLengthSquared(to_seen); + if (toSeenDistSq>distSq) + { + return; + } + + //update appropriate slot for monster + if (client->client) + { + sensed_client.ent = client; + sensed_client.time = level.time; + VectorCopy(client->s.origin, sensed_client.pos); + } + else + { + sensed_monster.ent = client; + sensed_monster.time = level.time; + VectorCopy(client->s.origin, sensed_monster.pos); + } +} + +magicsight_sense::magicsight_sense(magicsight_sense *orig) +: sight_sense(orig) +{ + distSq = orig->distSq; +} + +void magicsight_sense::Evaluate(magicsight_sense *orig) +{ + distSq = orig->distSq; + + sight_sense::Evaluate(orig); +} + +void magicsight_sense::Read() +{ + char loaded[sizeof(magicsight_sense)]; + + gi.ReadFromSavegame('AINS', loaded, sizeof(loaded)); + Evaluate((magicsight_sense *)loaded); +} + +void magicsight_sense::Write() +{ + magicsight_sense *savable; + + savable = new magicsight_sense(this); + gi.AppendToSavegame('AINS', savable, sizeof(*this)); + delete savable; +} + +void magicsight_sense::Mute(unsigned mask, float degree, smute_recovery recovery_code, float recovery_time) +{ + return; +} + +//end \ No newline at end of file diff --git a/Source/Game/gamecpp/ai_senses.h b/Source/Game/gamecpp/ai_senses.h new file mode 100644 index 0000000..01d2cb3 --- /dev/null +++ b/Source/Game/gamecpp/ai_senses.h @@ -0,0 +1,190 @@ +#ifndef _AI_SENSES_H +#define _AI_SENSES_H + +typedef struct +{ + vec3_t heardLocation; + vec3_t origin; + edict_t *ent; + ai_sensetype_e code; + float time; +} aiSoundInfo; + +//keep a static list of 10 sounds--that should be plenty, and can overwrite less important sounds if a superimportant one comes in +#define MAX_AISOUNDS 10 + +///////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////// +#define SENSE 0 +#define ALARM_SENSE 1 +#define SIGHT_SENSE 2 +#define NORMALSIGHT_SENSE 3 +#define SOUND_SENSE 4 +#define OMNISCIENCE_SENSE 5 +#define MAGICSIGHT_SENSE 6 + +class sense_c +{ +protected: + vec3_t origin; + float time; + + sensedEntInfo_t sensed_monster; + sensedEntInfo_t sensed_client; + + smute_recovery mute_recovercode; + float mute_starttime; + float mute_endtime; + float mute_degree; + + virtual int Range(edict_t *monster, edict_t *other); + virtual int Range(edict_t *monster, vec3_t where); + virtual bool MaskOK(unsigned mask){return true;} + virtual void RegisterEvent(vec3_t event_origin, float event_time, edict_t *event_edict, ai_sensetype_e event_code){} + virtual float CurrentMutedLevel(void); + +public: + sense_c(vec3_t new_origin, float new_time); + sense_c(void); + virtual ~sense_c(void) {} + + virtual void UpdateSensedClient(unsigned mask, sensedEntInfo_t &best_ent); + virtual void UpdateSensedMonster(unsigned mask, sensedEntInfo_t &best_ent); + + virtual void ChangeClientSenseType(ai_sensetype_e newType){sensed_client.senseType=newType;} + virtual void ChangeMonsterSenseType(ai_sensetype_e newType){sensed_monster.senseType=newType;} + + virtual float GetMutedLevel(unsigned mask){if (MaskOK(mask))return CurrentMutedLevel();return 0;}//mwahahahaha! read THIS, muhfuh! + virtual void Mute(unsigned mask, float degree, smute_recovery recovery_code, float recovery_time){} + virtual void RegisterSenseEvent(unsigned mask, vec3_t event_origin, float event_time, edict_t *event_edict, ai_sensetype_e event_code) + {if (MaskOK(mask))RegisterEvent(event_origin,event_time,event_edict,event_code);} + + virtual qboolean Evaluate(unsigned mask, ai_c &owner_ai, edict_t &monster) {return true;}//returns whether this + //sense is resolved or not + virtual qboolean SafeToRemove(edict_t &monster){return true;} + + static sense_c *NewClassForCode(int code); + + sense_c(sense_c *orig); + void Evaluate(sense_c *orig); + virtual void Write() { assert(0); } + virtual void Read() { assert(0); } + virtual int GetClassCode(void) {return SENSE; } +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// sound sense +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////// + +class sound_sense : public sense_c +{ +private: + aiSoundInfo sounds[MAX_AISOUNDS]; + int numsounds; +protected: + virtual bool MaskOK(unsigned mask){return (1 && (mask&sound_mask));} + virtual void RegisterEvent(vec3_t event_origin, float event_time, edict_t *event_edict, ai_sensetype_e event_code); +public: + sound_sense(void):sense_c(){numsounds=0;} + virtual ~sound_sense(void){} + + virtual void Mute(unsigned mask, float degree, smute_recovery recovery_code, float recovery_time); + + virtual qboolean Evaluate(unsigned mask, ai_c &owner_ai, edict_t &monster); + + sound_sense(sound_sense *orig); + void Evaluate(sound_sense *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return SOUND_SENSE; } +}; + +class alarm_sense : public sense_c +{ +protected: + float radius; + virtual bool MaskOK(unsigned mask){return (1 && (mask&alarm_mask));} + +public: + alarm_sense(vec3_t new_origin, float new_time, float new_radius); + alarm_sense(void):sense_c(){} + virtual ~alarm_sense(void){} + + virtual qboolean Evaluate(unsigned mask, ai_c &owner_ai, edict_t &monster); + + alarm_sense(alarm_sense *orig); + void Evaluate(alarm_sense *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return ALARM_SENSE; } +}; + +class sight_sense : public sense_c +{ +protected: + virtual bool MaskOK(unsigned mask){return (1 && (mask&sight_mask));} +public: + sight_sense(void):sense_c(){} + + virtual ~sight_sense(void){} + virtual void Mute(unsigned mask, float degree, smute_recovery recovery_code, float recovery_time); + + void PoorVisibilityUpdate(ai_c &owner_ai, edict_t *monster, edict_t *sight_ent, float leeway_time); + virtual void Look(ai_c &owner_ai, edict_t *monster, edict_t *sight_ent); + virtual qboolean Evaluate(unsigned mask, ai_c &owner_ai, edict_t &monster); + + sight_sense(sight_sense *orig); + void Evaluate(sight_sense *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return SIGHT_SENSE; } +}; + +class normalsight_sense : public sight_sense +{ +public: + normalsight_sense(void):sight_sense() {} + + normalsight_sense(normalsight_sense *orig); + void Evaluate(normalsight_sense *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return NORMALSIGHT_SENSE; } +}; + +//a testing class only +class omniscience_sense : public sight_sense +{ +protected: +public: + omniscience_sense(void):sight_sense() {} + virtual void Look(ai_c &owner_ai, edict_t *monster, edict_t *sight_ent); + + omniscience_sense(omniscience_sense *orig); + void Evaluate(omniscience_sense *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return OMNISCIENCE_SENSE; } + virtual void Mute(unsigned mask, float degree, smute_recovery recovery_code, float recovery_time); +}; + +class magicsight_sense : public sight_sense +{ +protected: + float distSq; +public: + magicsight_sense(void):sight_sense() {distSq=0;} + magicsight_sense(float newDist):sight_sense() {distSq=newDist*newDist;} + virtual void Look(ai_c &owner_ai, edict_t *monster, edict_t *sight_ent); + + magicsight_sense(magicsight_sense *orig); + void Evaluate(magicsight_sense *orig); + virtual void Write(); + virtual void Read(); + virtual int GetClassCode(void) { return MAGICSIGHT_SENSE; } + virtual void Mute(unsigned mask, float degree, smute_recovery recovery_code, float recovery_time); +}; + +#endif \ No newline at end of file diff --git a/Source/Game/gamecpp/ai_spawner.h b/Source/Game/gamecpp/ai_spawner.h new file mode 100644 index 0000000..169a592 --- /dev/null +++ b/Source/Game/gamecpp/ai_spawner.h @@ -0,0 +1,3 @@ + +void SP_spawn_monster (edict_t *self); +void SP_spawn_monster_group (edict_t *self); diff --git a/Source/Game/gamecpp/callback.h b/Source/Game/gamecpp/callback.h new file mode 100644 index 0000000..0125b24 --- /dev/null +++ b/Source/Game/gamecpp/callback.h @@ -0,0 +1,210 @@ +// ------------------------------------------------------------------------ +// +// All callback definitions that need to be enumerated for the savegame +// must be in here +// +// ------------------------------------------------------------------------ + +#pragma once + +// Helicopter callbacks + +class MainRotor2Callback :public IGhoulCallBack +{ +public: + bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +class MainHeliCallback2 :public IGhoulCallBack +{ +public: + bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +// Tank callbacks +class TankTreadCallback :public IGhoulCallBack +{ +public: + bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +// Snowcat callbacks +class SnowcatTreadCallback :public IGhoulCallBack +{ +public: + bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + + +// pickup callbacks +class PickupRespawnCallback :public IGhoulCallBack +{ +public: + bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + + + +// ??? + +class TestSeqEndCallback :public IGhoulCallBack +{ +public: + bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +// In gamecpp object callbacks + +class SideOBeefCallback :public IGhoulCallBack +{ +public: + bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +class valveCallback :public IGhoulCallBack +{ +public: + bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +class GuttedCowCallback :public IGhoulCallBack +{ +public: + bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +class BannerCallback :public IGhoulCallBack +{ +public: + bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +class HanginLightCallback :public IGhoulCallBack +{ +public: + bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +// ummm... ok, so this probably is a crappy place to put this. My apologies, Steve... +class gutCallback :public IGhoulCallBack +{ +public: + bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +// Body callbacks + +class FollowGenericPivot :public IGhoulCallBack +{ +public: + virtual bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +class FootRightCallback :public IGhoulCallBack +{ +private: + float last_vert_speed; +public: + virtual bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +class FootLeftCallback :public IGhoulCallBack +{ +private: + float last_vert_speed; +public: + virtual bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +class GroundCallback :public IGhoulCallBack +{ +private: + float last_vert_speed; +public: + virtual bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +class MouthCallback :public IGhoulCallBack +{ +private: + float last_vert_speed; +public: + virtual bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + + +//sets pos1 to the position of the bolt, rotated correctly to the world, but still assuming ent origin to be 0,0,0 (will deal with that later, when pos1 is used) +class SetVectorCallback :public IGhoulCallBack +{ +private: + float last_vert_speed; +public: + virtual bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +class MonsterSeqEndCallback :public IGhoulCallBack +{ +public: + virtual bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +class MonsterSeqBeginCallback :public IGhoulCallBack +{ +public: + virtual bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + +class InAirCallBack:public IGhoulCallBack +{ +public: + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +class JumpCallBack:public IGhoulCallBack +{ +public: + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +class ThudCallBack:public IGhoulCallBack +{ +public: + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +class KneeCallBack:public IGhoulCallBack +{ +public: + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +class FireCallBack:public IGhoulCallBack +{ +public: + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +class MonsterSoundCallBack:public IGhoulCallBack +{ +public: + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +class ThrowCallBack:public IGhoulCallBack +{ +public: + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +class DropWeaponCallBack:public IGhoulCallBack +{ +public: + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +class LimbEOSCallback:public IGhoulCallBack +{ +public: + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; +// end \ No newline at end of file diff --git a/Source/Game/gamecpp/dm.cpp b/Source/Game/gamecpp/dm.cpp new file mode 100644 index 0000000..58b5e7c --- /dev/null +++ b/Source/Game/gamecpp/dm.cpp @@ -0,0 +1,1301 @@ +// ***************************************************************************** +// dm.cpp +// ***************************************************************************** + +#include "g_local.h" +#include "dm_private.h" +#include "w_weapons.h" +#include "../strings/dm_generic.h" +#include "ai_private.h" // so we know what a bodyhuman_c is +#include "..\qcommon\configstring.h" + +gamemode_ic *dm = NULL; + +dmnone_c nodm; +dmstandard_c standard; +dmassassin_c assassin; +dmarsenal_c arsenal; +dmctf_c ctf; +dmreal_c real; + +gamerules_c *gamerules[] = +{ + &nodm, + &standard, + &assassin, + &arsenal, + &ctf, + &real +}; + +extern void W_InitInv(edict_t &ent); +extern void sendRestartPrediction(edict_t *ent); + +/* +================= +countPlayers + +Returns the number of players in the current game. +================= +*/ + +int countPlayers(void) +{ + int i; + edict_t *e2; + int num = 0; + + for(i = 1; i <= game.maxclients; i++) + { + e2 = &g_edicts[i]; + + if (!e2->inuse) + continue; + + if (!e2->client) + continue; + + if (e2->client->pers.spectator) + continue; + + num++; + } + + return(num); +} + +/* +================= +IsFemale +================= +*/ + +qboolean IsFemale(edict_t *ent) +{ + if(!ent->client || !ent->client->body) + return false; + + if (ent->client->body->GetClassCode()==BODY_FEMALE) + { + return (true); + } + + return(false); +} + +/* +============== +setPlayernameColor +============== +*/ + +void setPlayernameColor(edict_t &ent,edict_t &other,byte color) +{ + if(!ent.client) + return; + + if(other.inuse) + ent.client->playernameColors[other.s.number-1]=color; +} + +/* +================= +InitDeathmatchSystem +================= +*/ + +void InitDeathmatchSystem(void) +{ + if(!dm) + { + dm = new gamemode_c; + } + +#ifndef _DEMO_ + dm->setDMMode(((deathmatch->value>=DM_NONE)&&(deathmatch->value<=DM_REAL))?deathmatch->value:0); +#else + dm->setDMMode(((deathmatch->value>=DM_NONE)&&(deathmatch->value<=DM_STANDARD))?deathmatch->value:0); +#endif + + gi.SP_Register("dm_generic"); + + // Generic DM specific precaching and stuff. + + if(dm->isDM()) + { + // Precache generic DM effects. + +// gi.effectindex("environ/invuln"); + gi.effectindex("environ/irespawn"); + gi.effectindex("environ/prespawn"); + + // Precache generic DM sounds. + + gi.soundindex("dm/armorpu.wav"); + gi.soundindex("dm/irespawn.wav"); + gi.soundindex("dm/frag.wav"); + gi.soundindex("dm/selffrag.wav"); + gi.soundindex("dm/healthpu.wav"); + gi.soundindex("dm/prespawn.wav"); + } + + // Clear the CTF team color config strings, used to tell clients what blue + // and red team names are. + + gi.configstring(CS_CTF_BLUE_TEAM, ""); + gi.configstring(CS_CTF_RED_TEAM, ""); + + dm->preLevelInit(); + +} + +/* +================= +DeleteDeathmatchSystem +================= +*/ + +void DeleteDeathmatchSystem(void) +{ + if(dm) + { + delete dm; + + dm=0; + } +} + +/* +================== +respawnUntouchedItem +================== + + This item was dropped at some point and hasn't been touched in a while. Move it + to its designer-specified spawn point. +*/ + +void respawnUntouchedItem(edict_t* ent) +{ + dm->respawnUntouchedItem(ent); +} + + +/* +=============== +ClearEffects +=============== +*/ + + +void ClearEffects (edict_t *ent) +{ + // This also makes the item solid. + + fxRunner.clearContinualEffects(ent); +} + + +/* +=============== +DoRespawn +=============== +*/ + +void DoRespawn (edict_t *ent) +{ + ent->flags &= ~FL_RESPAWN; + ent->svflags &= ~SVF_NOCLIENT; + ent->solid = SOLID_NOT; + ent->touch_debounce_time = 0.0; + + gi.linkentity(ent); + + // Send a respawning effect. + fxRunner.exec("environ/irespawn", ent->s.origin); + + // 1/4/00 kef -- play a "fade in" anim. at the end of that anim, switch back to non-fade anim. + PickupInst *pickupInst = thePickupList.GetPickupInstFromEdict(ent); + + if (pickupInst) + { + pickupInst->FadeIn(); + } + + // Respawn sound. FIXME: Make part of FX? Not sure about PHS issues here tho'? + gi.sound(ent, CHAN_ITEM, gi.soundindex("dm/irespawn.wav"), .6, ATTN_NORM, 0); + + ent->think = ClearEffects; + ent->nextthink = level.time + ITEM_RESPAWN_FADEIN; +} + + +/* +================ +itemDropToFloor + +Adjust the Z component of an ent's origin of so that it lies on the floor. +================ +*/ + +void itemDropToFloor (edict_t *ent) +{ + trace_t tr; + vec3_t vec,dest; + + VectorSet(vec,0.0,0.0,-128.0); + + VectorAdd (ent->s.origin, vec, dest); + + gi.trace (ent->s.origin, ent->mins, ent->maxs, dest, ent, MASK_SOLID, &tr); + + if (tr.startsolid) + { + gi.dprintf ("itemDropToFloor: %s startsolid at %s\n", ent->classname, vtos(ent->s.origin)); + + G_FreeEdict (ent); + + return; + } + + VectorCopy (tr.endpos, ent->s.origin); + + ent->nextthink = level.time + FRAMETIME; + ent->think = DoRespawn; +} + +/* +=============== +gamerules_c::setRespawn +=============== +*/ + +void gamerules_c::setRespawn (edict_t *ent, float delay) +{ + float adjusted_delay; + int clients; + ent->flags |= FL_RESPAWN; + ent->svflags |= SVF_NOCLIENT; + ent->solid = SOLID_NOT; + + if (deathmatch->value) + { + clients=(float)level.num_clients; + if (clients<2.0) + clients=2.0; + adjusted_delay = delay * sqrt(2.0/clients); // Spawn more frequently when more players. + // Lemme see here: sqrt(2/2) = sqrt(1) = 1 + // sqrt(2/8) = sqrt(1/4) = 1/2 + // sqrt(2/32) = sqrt(1/16) = 1/4 + } + else + { + adjusted_delay = delay; + } + + ent->nextthink = level.time + adjusted_delay; + ent->think = DoRespawn; + + gi.linkentity (ent); +} + +/* +================== +gamerules_c::openLogFile +================== +*/ + +void gamerules_c::openLogFile(void) +{ + if(log_file_name->string[0]) + { + char name[MAX_QPATH]; + + // Try to open the log-file. + // do we need a counter value? + Com_sprintf (name, sizeof(name), "%s", log_file_name->string); + if (log_file_counter->value) + { + char exten[10]; + + // copy the extension somewhere + strcpy(exten, COM_FileExtension(name)); + // remove the extension from the file name + COM_StripExtension(name, name); + // add in number + Com_sprintf (name, sizeof(name), "%s%d.", name, (int)log_file_counter->value); + gi.cvar_setvalue("log_file_counter", log_file_counter->value +1.0); + // re-add extension + strcat(name, exten); + + } + Com_Printf ("Dumping end game log to %s\n", name); + + gi.FS_CreatePath (name); + // decide what we need to do, append or overwrite + if (!stricmp(log_file_mode->string, "o")) + { + filePtr = fopen (name, "w"); + } + else + { + filePtr = fopen (name, "a"); + } + + // If we managed to open the log-file, write out the game details, else + // print an error message. + + if(filePtr) + { + int hours,secs,mins; + cvar_t *host_name; + + secs = level.time; + hours = secs / (60*60); + secs -= hours * (60*60); + mins = secs / 60; + secs -= mins * 60; + host_name = gi.cvar("hostname", "", 0); + + fprintf (filePtr, "%s\n", log_file_header->string); + fprintf (filePtr, "%sMap Name : %s\n", log_file_line_header->string, level.mapname); + fprintf (filePtr, "%sHost Name : %s\n", log_file_line_header->string, host_name->string); + fprintf (filePtr, "%sGame type : %s\n", log_file_line_header->string, getGameName()); + fprintf (filePtr, "%sGame Duration : %02i:%02i:%02i\n%s\n", log_file_line_header->string, hours, mins, secs, log_file_line_header->string); + } + else + { + Com_Printf("ERROR: couldn't open game log-file.\n"); + } + } +} + +/* +================== +gamerules_c::closeLogFile +================== +*/ + +void gamerules_c::closeLogFile(void) +{ + if(filePtr) + { + fprintf(filePtr,"%s\n",log_file_footer->string); + fclose(filePtr); + } +} + +/* +================== +gamerules_c::clientConnect +================== +*/ + +void gamerules_c::clientConnect(edict_t &ent) +{ + + // I see my own playername in TC_BLACK. + + setPlayernameColor(ent,ent,0); + + // I see all other players' playernames in TC_BLACK. + + edict_t *other; + int i; + + for(i=1;i<=game.maxclients;i++) + { + other=&g_edicts[i]; + + if(!other->inuse) + continue; + + if(!other->client) + continue; + + if(other!=&ent) + setPlayernameColor(ent,(edict_t &)*other,0); + } + + // All other players see my playername in TC_BLACK. + + for(i=1;i<=game.maxclients;i++) + { + other=&g_edicts[i]; + + if(!other->inuse) + continue; + + if(!other->client) + continue; + + if(other!=&ent) + setPlayernameColor((edict_t &)*other,ent,0); + } +} + +/* +================== +gamerules_c::clientSetDroppedItemThink +================== +*/ + +static void droppedItemThink(edict_t *ent) +{ +// fxRunner.exec("environ/teleport7", ent->s.origin); + G_FreeEdict(ent); + return; +} + +void gamerules_c::clientSetDroppedItemThink(edict_t *ent) +{ + ent->think=droppedItemThink; + ent->nextthink=level.time+20.0F; +} + +/* +================== +gamerules_c::clientDropItem +================== +*/ + +void gamerules_c::clientDropItem(edict_t *ent,int type,int ammoCount) +{ + if (!ent->ghoulInst) + { + return; + } + + Pickup *pickup = NULL; + + if (pickup = thePickupList.GetPickupFromType(PU_INV, type)) + { + edict_t *dropped; + Matrix4 ZoneMatrix; + Vect3 zonePos; + vec3_t handPos, + dir; + + // Whatever weapon player is holding, throw one off. + + dropped=G_Spawn(); + dropped->spawnflags|=DROPPED_ITEM; + I_Spawn(dropped,pickup); + + dropped->enemy=ent; + dropped->touch_debounce_time=level.time+2.0; + + ent->ghoulInst-> + GetBoltMatrix(level.time, + ZoneMatrix, + ent->ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l"), + IGhoulInst::MatrixType::Entity); + + ZoneMatrix.GetRow(3,zonePos); + + handPos[0]=zonePos[0]; + handPos[1]=zonePos[1]; + handPos[2]=zonePos[2]; + + VectorAdd(ent->s.origin,handPos,dropped->s.origin); + AngleVectors(ent->client->ps.viewangles,dir,NULL, NULL); + dir[2] = 0; + VectorNormalize(dir); + VectorMA(dropped->s.origin, 20.0, dir, dropped->s.origin); + VectorScale(dir,250.0,dropped->velocity); + dropped->velocity[2]+=150.0; + dropped->health = ammoCount; + + clientSetDroppedItemThink(dropped); + + } +} + +/* +================== +gamerules_c::clientSetDroppedWeaponThink +================== +*/ + +static void droppedWeaponThink(edict_t *ent) +{ +// fxRunner.exec("environ/teleport7", ent->s.origin); + G_FreeEdict(ent); + return; +} + +void gamerules_c::clientSetDroppedWeaponThink(edict_t *ent) +{ + ent->think=droppedWeaponThink; + ent->nextthink=level.time+20.0F; +} + +/* +================== +gamerules_c::clientDieWeaponHandler +================== +*/ + +void gamerules_c::clientDieWeaponHandler(edict_t *ent) +{ + sharedEdict_t sh; + + sh.inv=(inven_c *)ent->client->inv; + sh.edict=ent; + sh.inv->setOwner(&sh); + sh.inv->rulesSetDropWeapons(-1); + sh.inv->handlePlayerDeath(); + + if(IGhoulInst *gun=ent->client->ps.gun) + gun->SetAllPartsOnOff(false); +} + +/* +================== +gamerules_c::clientDropWeapon +================== +*/ + +void gamerules_c::clientDropWeapon(edict_t *ent,int type, int clipSize) +{ + if (!ent->ghoulInst) + { + return; + } + + Pickup *pickup = NULL; + + if (pickup = thePickupList.GetPickupFromType(PU_WEAPON, type)) + { + edict_t *dropped; + Matrix4 ZoneMatrix; + Vect3 zonePos; + vec3_t handPos, + dir; + + // Whatever weapon player is holding, throw one off. + + dropped=G_Spawn(); + dropped->spawnflags|=DROPPED_ITEM; + I_Spawn(dropped,pickup); + + dropped->enemy=ent; + dropped->touch_debounce_time=level.time+2.0; + + ent->ghoulInst-> + GetBoltMatrix(level.time, + ZoneMatrix, + ent->ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r"), + IGhoulInst::MatrixType::Entity); + + ZoneMatrix.GetRow(3,zonePos); + + handPos[0]=zonePos[0]; + handPos[1]=zonePos[1]; + handPos[2]=zonePos[2]; + + VectorAdd(ent->s.origin,handPos,dropped->s.origin); + AngleVectors(ent->client->ps.viewangles,dir,NULL, NULL); + dir[2] = 0; + VectorNormalize(dir); + + + // 2/3/00 dk -- We need to see if we can spawn the weapon at a point in front of the player. + // If we can't, just spawn it as close as we can. Without this test, a player with his face against the wall may end + // up dropping it on the other side of that wall. + vec3_t spawnPoint; + trace_t trace; + + + VectorMA(dropped->s.origin, 20.0, dir, spawnPoint); + dropped->owner = ent; // don't want player to interfere with trace + gi.trace(dropped->s.origin, dropped->mins, dropped->maxs, spawnPoint, dropped, MASK_SOLID, &trace); + if (trace.fraction < 1) + { + if (trace.startsolid) // ugh, we're probably in a corner trying to drop a weapon that won't fit. + // well, try behind us a bit + { + vec3_t backPoint; + + VectorMA(dropped->s.origin, -10, dir, backPoint); + gi.trace(backPoint, dropped->mins, dropped->maxs, dropped->s.origin, dropped, MASK_SOLID, &trace); + VectorMA(backPoint, 10.0 * trace.fraction, dir, dropped->s.origin); + } + else + { + VectorMA(dropped->s.origin, 20.0 * trace.fraction, dir, dropped->s.origin); + } + } + else + { + VectorCopy(spawnPoint, dropped->s.origin); + } + dropped->owner = NULL; + + + VectorScale(dir,250.0,dropped->velocity); + dropped->velocity[2]+=150.0; + dropped->health = clipSize; + + clientSetDroppedWeaponThink(dropped); + + if(ent->health>0) + { + const char *weapon = gi.SP_GetStringText(pickup->GetDroppedStringIndex()); + gi.SP_Print(ent,DM_GENERIC_TEXT_DROPPED_WEAPON,weapon); + } + } +} + +/* +================== +gamerules_c::clientHandlePredn +================== +*/ + +void gamerules_c::clientHandlePredn(edict_t &ent) +{ + // Start with a zero init'd inventory and issue a (reliable) instruction to + // restart the player's client-side inventory system. + + W_InitInv(ent); + sendRestartPrediction(&ent); +} + +/* +================== +gamerules_c::clientObituary +================== +*/ + +void gamerules_c::clientObituary(edict_t *self, edict_t *inflictor, edict_t *attacker) +{ + int mod, + message; + + mod = meansOfDeath & ~MOD_FRIENDLY_FIRE; + message = -1; + + switch (mod) + { + case MOD_WATER: + message = DM_GENERIC_TEXT_OBT_MOD_WATER; + break; + + case MOD_SLIME: + message = DM_GENERIC_TEXT_OBT_MOD_SLIME; + break; + + case MOD_CRUSH: + message = DM_GENERIC_TEXT_OBT_MOD_CRUSH; + break; + + case MOD_FALLING: + message = DM_GENERIC_TEXT_OBT_MOD_FALLING; + break; + + case MOD_SUICIDE: + message = DM_GENERIC_TEXT_OBT_MOD_SUICIDE; + break; + + case MOD_EXPLOSIVE: + message = DM_GENERIC_TEXT_OBT_MOD_EXPLOSIVE; + break; + + case MOD_FIRE: + message = DM_GENERIC_TEXT_OBT_MOD_FIRE; + break; + + case MOD_LAVA: + message = DM_GENERIC_TEXT_OBT_MOD_LAVA; + break; + + case MOD_EXIT: + message = DM_GENERIC_TEXT_OBT_MOD_EXIT; + break; + + case MOD_BARBWIRE: + message = DM_GENERIC_TEXT_OBT_MOD_BARBWIRE; + break; + + case MOD_DOGBITE: + message = DM_GENERIC_TEXT_OBT_MOD_DOGBITE; + break; + } + + if(attacker == self) + { + switch (mod) + { + case MOD_PHOS_GRENADE: + message = DM_GENERIC_TEXT_OBT_MOD_PHOS_GRENADE; + break; + + case MOD_ROCKET_SPLASH: + if (IsFemale(self)) + message = DM_GENERIC_TEXT_OBT_MOD_ROCKET_SPLASH_F; + else + message = DM_GENERIC_TEXT_OBT_MOD_ROCKET_SPLASH_M; + break; + + case MOD_C4: + if (IsFemale(self)) + message = DM_GENERIC_TEXT_OBT_MOD_C4_F; + else + message = DM_GENERIC_TEXT_OBT_MOD_C4_M; + break; + + case MOD_CLAYMORE: + message = DM_GENERIC_TEXT_OBT_MOD_CLAYMORE; + break; + + case MOD_NEURAL_GRENADE: + if (IsFemale(self)) + message = DM_GENERIC_TEXT_OBT_MOD_NEURAL_GRENADE_F; + else + message = DM_GENERIC_TEXT_OBT_MOD_NEURAL_GRENADE_M; + break; + + case MOD_GRENADE: + if (IsFemale(self)) + message = DM_GENERIC_TEXT_OBT_MOD_GRENADE_F; + else + message = DM_GENERIC_TEXT_OBT_MOD_GRENADE_M; + break; + + default: + if (IsFemale(self)) + message = DM_GENERIC_TEXT_OBT_F; + else + message = DM_GENERIC_TEXT_OBT_M; + break; + } + } + + if(message>-1) + { + gi.SP_Print_Obit(0,message,self->s.number); + + if (dedicated->value) + { + char consoleMsg[MAX_OSPATH]; + + gi.SP_SPrint(consoleMsg, MAX_OSPATH, message, self->s.number); + gi.Sys_ConsoleOutput (consoleMsg); + } + + self->enemy = NULL; + + return; + } + + self->enemy = attacker; + + if(attacker && attacker->client) + { + switch (mod) + { + case MOD_KNIFE_SLASH: + message = DM_GENERIC_TEXT_OBT_MOD_KNIFE_SLASH; + break; + + case MOD_KNIFE_THROWN: + message = DM_GENERIC_TEXT_OBT_MOD_KNIFE_THROWN; + break; + + case MOD_PISTOL1: + message = DM_GENERIC_TEXT_OBT_MOD_PISTOL1; + break; + + case MOD_PISTOL2: + message = DM_GENERIC_TEXT_OBT_MOD_PISTOL2; + break; + + case MOD_MPISTOL: + message = DM_GENERIC_TEXT_OBT_MOD_MPISTOL; + break; + + case MOD_ASSAULTRIFLE: + message = DM_GENERIC_TEXT_OBT_MOD_ASSAULTRIFLE; + break; + + case MOD_SNIPERRIFLE: + message = DM_GENERIC_TEXT_OBT_MOD_SNIPERRIFLE; + break; + + case MOD_AUTOSHOTGUN: + message = DM_GENERIC_TEXT_OBT_MOD_AUTOSHOTGUN; + break; + + case MOD_SHOTGUN: + message = DM_GENERIC_TEXT_OBT_MOD_SHOTGUN; + break; + + case MOD_MACHINEGUN: + message = DM_GENERIC_TEXT_OBT_MOD_MACHINEGUN; + break; + + case MOD_PHOS_GRENADE: + message = DM_GENERIC_TEXT_OBT_MOD_PHOS_GRENADE_2; + break; + + case MOD_ROCKET: + message = DM_GENERIC_TEXT_OBT_MOD_ROCKET; + break; + + case MOD_ROCKET_SPLASH: + message = DM_GENERIC_TEXT_OBT_MOD_ROCKET_SPLASH; + break; + + case MOD_MPG: + message = DM_GENERIC_TEXT_OBT_MOD_MPG; + break; + + case MOD_FLAMEGUN: + message = DM_GENERIC_TEXT_OBT_MOD_FLAMEGUN; + break; + + case MOD_FLAMEGUN_NAPALM: + message = DM_GENERIC_TEXT_OBT_MOD_FLAMEGUN_NAPALM; + break; + + case MOD_C4: + message = DM_GENERIC_TEXT_OBT_MOD_C4; + break; + + case MOD_CLAYMORE: + message = DM_GENERIC_TEXT_OBT_MOD_CLAYMORE_2; + break; + + case MOD_NEURAL_GRENADE: + message = DM_GENERIC_TEXT_OBT_MOD_NEURAL_GRENADE; + break; + + case MOD_TELEFRAG: + message = DM_GENERIC_TEXT_OBT_MOD_TELEFRAG; + break; + + case MOD_GRENADE: + message = DM_GENERIC_TEXT_OBT_MOD_GRENADE_2; + break; + + case MOD_CONC_GRENADE: + message = DM_GENERIC_TEXT_OBT_MOD_CONC_GRENADE; + break; + } + + if(message>-1) + { + gi.SP_Print_Obit(0,message,self->s.number,attacker->s.number); + if (dedicated->value) + { + char consoleMsg[MAX_OSPATH]; + gi.SP_SPrint(consoleMsg, MAX_OSPATH, message, self->s.number, attacker->s.number); + gi.Sys_ConsoleOutput (consoleMsg); + } + return; + } + } + + gi.SP_Print_Obit(0,DM_GENERIC_TEXT_OBT_DIED,self->s.number); + + if (dedicated->value) + { + char consoleMsg[MAX_OSPATH]; + + if (message>-1) + { + gi.SP_SPrint(consoleMsg, MAX_OSPATH, message, self->s.number); + gi.Sys_ConsoleOutput (consoleMsg); + } + else + { + gi.SP_SPrint(consoleMsg, MAX_OSPATH, DM_GENERIC_TEXT_OBT_DIED, self->s.number); + gi.Sys_ConsoleOutput (consoleMsg); + } + } + +} + +/* +================== +gamerules_c::clientScoreboardMessage +================== +*/ + +int TeamCompare(void const *a, void const *b) +{ + struct TeamInfo_s *A, *B; + + A = (struct TeamInfo_s *)a; + B = (struct TeamInfo_s *)b; + + return (A->score < B->score); +} + +void gamerules_c::clientScoreboardMessage (edict_t *ent, edict_t *killer, qboolean log_file) +{ + int i,j,k; + int sorted[MAX_CLIENTS]; + int sortedscores[MAX_CLIENTS]; + struct TeamInfo_s teams[MAX_CLIENTS]; + int score,total,total_teams, real_total; + int x,y,top; + gclient_t *cl; + edict_t *cl_ent; + + total=total_teams = 0; + + // Is logging to a log-file enabled? + + if(log_file) + openLogFile(); + + // Sort all the clients by score from highest to lowest. + + for(i=0;iinuse) + continue; + + // Spectators get added separately if there's any room left. + + if(cl_ent->client->resp.spectator) + continue; + + score=game.clients[i].resp.score; + + for(j=0;jsortedscores[j]) + { + break; + } + } + + for(k=total;k>j;k--) + { + sorted[k]=sorted[k-1]; + sortedscores[k]=sortedscores[k-1]; + } + + sorted[j]=i; + sortedscores[j]=score; + total++; + + if(!dm->dmRule_TEAMPLAY()) + continue; + + if(!strcmp(Info_ValueForKey(cl_ent->client->pers.userinfo, "skin"),Info_ValueForKey (cl_ent->client->pers.userinfo, "teamname"))) + { + // Ensure those clients with no team affiliation (i.e. skin == teamname) + // don't produce a team aggregate score. + + continue; + } + + for(j=0;jclient->pers.userinfo, "teamname"); + total_teams++; + } + } + + qsort((void *)teams, total_teams, sizeof(TeamInfo_s), TeamCompare); + + real_total=total; + if(total>12) + { + total=12; + } + if (total_teams > 6) + { + total_teams = 6; + } + + // Clear the client's layout. + + top=32; + gi.SP_Print(ent,DM_GENERIC_LAYOUT_RESET); + + // Handle team aggregate scores if teamplay is on. + + if (dm->dmRule_TEAMPLAY()) + { + top = -64; + y = top; + + for(i=0;i=3)?160:0; + + if(i==3) + { + y = top; + } + + gi.SP_Print(ent,DM_GENERIC_LAYOUT_SCOREBOARD_TEAM, + (short)x,(short)y, + teams[i].rep, + (short)teams[i].score); + + // Write the scores to the open log-file if we have one. + + if(filePtr) + { + fprintf(filePtr,"%sTeam %s\n",log_file_line_header->string,teams[i].teamname); + fprintf(filePtr,"%sScore %i\n",log_file_line_header->string,teams[i].score); + } + + y+=32; + } + + if(filePtr) + { + fprintf(filePtr,"\n"); + } + + if (total_teams >= 3) + { + top=64; + } + else + { + top = 32; + } + } + + + y = top; + + // Send the scores for all active players to the client's layout. + + for(i=0;i=6)?160:0; + + if(i==6) + y=top; + + gi.SP_Print(ent,DM_GENERIC_LAYOUT_SCOREBAORD_CLIENT, + (short)x,(short)y, + sorted[i], + (short)cl->resp.score, + (unsigned short)cl->ping, + (unsigned short)((level.framenum-cl->resp.enterframe)/600)); + + y+=32; + } + + // Send the scores for all spectators to the client's layout - if there's + // any room left on the scoreboard. + + j=0; + + while((jinuse)||(!cl_ent->client->resp.spectator)) + { + j++; + continue; + } + + x=(i>=6)?160:0; + + if(i==6) + y=top; + + gi.SP_Print(ent,DM_GENERIC_LAYOUT_SCOREBAORD_SPECTATOR, + (short)x,(short)y, + j, + (unsigned short)cl->ping, + (unsigned short)((level.framenum-cl->resp.enterframe)/600)); + + y+=32; + i++; + j++; + } + + // Write the scores to the open log-file if we have one. + + if(filePtr) + { + // Active players. + + for(i=0;istring,cl_ent->client->pers.netname); + fprintf(filePtr,"%sScore %i\n",log_file_line_header->string,cl->resp.score); + fprintf(filePtr,"%sPing %i\n",log_file_line_header->string,cl->ping); + fprintf(filePtr,"%sTime %i\n%s\n",log_file_line_header->string,(level.framenum-cl->resp.enterframe)/600,log_file_line_header->string); + } + + // Spectators. + + for(i=0;iinuse)||(!cl_ent->client->resp.spectator)) + continue; + + fprintf(filePtr,"%sClient %s\n",log_file_line_header->string,cl_ent->client->pers.netname); + fprintf(filePtr,"%s %s\n",log_file_line_header->string,"spectator"); + fprintf(filePtr,"%sPing %i\n",log_file_line_header->string,cl->ping); + fprintf(filePtr,"%sTime %i\n%s\n",log_file_line_header->string,(level.framenum-cl->resp.enterframe)/600,log_file_line_header->string); + } + } + + // Close the open log file if we have one. + + closeLogFile(); +} + + +/* +================== +gamerules_c::clientCalculateWaver +================== +*/ + +float gamerules_c::clientCalculateWaver(edict_t &ent, int atkID) +{ + bodyhuman_c *body = NULL; + float waverAmount = 0, speed = 0; + + // check for arm damage. + if (body = (bodyhuman_c*)ent.client->body) + { // IsAimImpeded returns -1 if left arm, 1 if right arm. for now, though, I think + //all we care about is the fact that we took an arm hit + if (body->IsAimImpeded()) + { + waverAmount += 3; // totally guessing here. additionally, shouldn't be hardcoded. + } + } + + // check speed + speed = DotProduct(ent.velocity, ent.velocity); + speed *= 3.0 / 80000.0;//max possible miss fire is 30 degrees + waverAmount += speed; + + // check for Sniper rifle, add waver based on zoom + if((atkID == ATK_SNIPER)/* || (atkID == ATK_SNIPER_ALT)*/) + { +// This waver based on a desired maximum waver of 4.5 when not zoomed (fov == 95), +// then a linearly decreasing slope from 2 at minimum zoom (fov == 60), +// to no waver when maximally zoomed (fov == 6). Thus: +// (CurrentFOV - FOV@MaxZoom) * MaxWaver (CurrentFOV - 6) * 2 +// waver = --------------------------------------- = -------------------------- +// (FOV@MinZoom - FOV@MaxZoom) (60 - 6) + + if(ent.client->ps.fov > 60) + { + waverAmount = 4.5; + } + else + { + waverAmount = 0;//((ent.client->ps.fov - 6) * .037); + } + } + + return waverAmount; +} + +/* +==================== +gamerules_c::clientGetMovescale +==================== +*/ + +float gamerules_c::clientGetMovescale(edict_t *ent) +{ + return(g_movescale->value-(g_movescale->value*ent->client->moveScale)); +} + +/* +==================== +gamerules_c::IsUnprotectedGoreZone +==================== +*/ + +bool gamerules_c::IsUnprotectedGoreZone(gz_code zone) +{ + if ((zone == GZ_SHLDR_RIGHT_FRONT) || (zone == GZ_SHLDR_RIGHT_BACK) || (zone == GZ_SHLDR_LEFT_FRONT) || + (zone == GZ_SHLDR_LEFT_BACK) || (zone == GZ_CHEST_FRONT) || (zone == GZ_CHEST_BACK) || + (zone == GZ_GUT_FRONT_EXTRA) || (zone == GZ_GUT_BACK_EXTRA)) + { + return false; + } + return true; +} + +/* +==================== +gamerules_c::IsLimbZone +==================== +*/ + +bool gamerules_c::IsLimbZone(gz_code zone) +{ + if ((zone == GZ_ARM_UPPER_RIGHT) || (zone == GZ_ARM_UPPER_LEFT) || (zone == GZ_ARM_LOWER_RIGHT) || + (zone == GZ_ARM_LOWER_LEFT) || (zone == GZ_LEG_UPPER_RIGHT_FRONT) || (zone == GZ_LEG_UPPER_RIGHT_BACK) || + (zone == GZ_LEG_UPPER_LEFT_FRONT) || (zone == GZ_LEG_UPPER_LEFT_BACK) || (zone == GZ_LEG_LOWER_RIGHT) || + (zone == GZ_LEG_LOWER_LEFT) || (zone == GZ_FOOT_RIGHT) || (zone == GZ_FOOT_LEFT)) + { + return true; + } + return false; +} + +/* +==================== +gamerules_c::IsShootableWeapon +==================== +*/ + +bool gamerules_c::IsShootableWeapon(char *weaponname) +{ + if(!strcmp(weaponname, "w_pistol1") || !strcmp(weaponname, "w_knife")) + { + return false; + } + return true; +} + +/* +================== +gamemode_c::setDMMode +================== +*/ + +void gamemode_c::setDMMode(int newtype) +{ + gametype = newtype; + rules = gamerules[newtype]; + gi.configstring(CS_SHOWNAMES,rules->arePlayerNamesOn()?"1":"0"); + gi.configstring(CS_SHOWTEAMS,rules->arePlayerTeamsOn()?"1":"0"); + + rules->registerPlayerIcons(); +} \ No newline at end of file diff --git a/Source/Game/gamecpp/dm.h b/Source/Game/gamecpp/dm.h new file mode 100644 index 0000000..635a1db --- /dev/null +++ b/Source/Game/gamecpp/dm.h @@ -0,0 +1,134 @@ +// ***************************************************************************** +// dm.h +// ---- +// Deathmatch stuff visisble to the rest of the game.dll. +// ***************************************************************************** + +#define ITEM_RESPAWN_FADEIN 0.8F + +typedef enum { + NOTEAM, + TEAM1, + TEAM2 +} team_t; + + +struct TeamInfo_s +{ + int rep; + int score; + char *teamname; + int flags; + int team; +}; + + +void ClearEffects (edict_t *ent); + +/* +============ +player_dmInfo_ic +============ +*/ + +class player_dmInfo_ic +{ +public: +}; + +/* +============ +games_t +============ +*/ + +typedef enum +{ + DM_NONE, + DM_STANDARD, + DM_ASSASSIN, + DM_ARSENAL, + DM_CTF, + DM_REAL, +}games_t; + +/* +============ +gamemode_ic +============ +*/ + +// 12/28/99 kef -- declared in CWeaponInfo.h, class Pickup replaces itemSpawnInfo_t. and there was much rejoicing. +class Pickup; + +typedef int gz_code; + + +class gamemode_ic +{ +public: + virtual void setDMMode(int newtype)=0; + virtual int isDM(void)=0; + virtual void preLevelInit(void)=0; + virtual void levelInit(void)=0; + virtual char *getGameName(void)=0; + virtual int checkItemSpawn(edict_t *ent,Pickup **pickup)=0; + virtual int checkItemAfterSpawn(edict_t *ent,Pickup *pickup)=0; + virtual void checkEvents(void)=0; + virtual void respawnUntouchedItem(edict_t *ent)=0; + virtual void setRespawn(edict_t *ent, float delay)=0; + virtual int getMaxEncumbrance(void)=0; + virtual void AssignTeam(edict_t *ent, char *userinfo) = 0; + virtual void ClearFlagCount(void)=0; + virtual void FlagCaptured(team_t team)=0; + virtual bool CaptureLimitHit(int limit)=0; + + virtual int dmRule_NO_HEALTH(void)=0; + virtual int dmRule_NO_ITEMS(void)=0; + virtual int dmRule_WEAPONS_STAY(void)=0; + virtual int dmRule_NO_FALLING(void)=0; + virtual int dmRule_REALISTIC_DAMAGE(void)=0; + virtual int dmRule_SAME_LEVEL(void)=0; + virtual int dmRule_NOWEAPRELOAD(void)=0; + virtual int dmRule_TEAMPLAY(void)=0; + virtual int dmRule_NO_FRIENDLY_FIRE(void)=0; + virtual int dmRule_FORCE_RESPAWN(void)=0; + virtual int dmRule_NO_ARMOR(void)=0; + virtual int dmRule_INFINITE_AMMO(void)=0; + virtual int dmRule_SPINNINGPICKUPS(void)=0; + virtual int dmRule_FORCEJOIN(void)=0; + virtual int dmRule_ARMOR_PROTECT(void)=0; + virtual int dmRule_BULLET_WPNS_ONLY(void)=0; + + virtual int arePlayerNamesOn(void)=0; + virtual int arePlayerTeamsOn(void)=0; + virtual int allowAutoWeaponSwitch(void)=0; + + virtual float clientCalculateWaver(edict_t &ent, int atkID)=0; + virtual void clientConnect(edict_t &ent)=0; + virtual void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer)=0; + virtual void clientDieWeaponHandler(edict_t *ent)=0; + virtual void clientPreDisconnect(edict_t &ent)=0; + virtual void clientDisconnect(edict_t &ent)=0; + virtual void clientDropItem(edict_t *ent,int type,int ammoCount)=0; + virtual void clientDropWeapon(edict_t *ent,int type, int clipSize)=0; + virtual float clientGetMovescale(edict_t *ent)=0; + virtual void clientEndFrame(edict_t *ent)=0; + virtual void clientHandlePredn(edict_t &ent)=0; + virtual void clientHelpMessage(edict_t *ent)=0; + virtual void clientObituary(edict_t *self, edict_t *inflictor, edict_t *attacker)=0; + virtual void clientRespawn(edict_t &ent)=0; + virtual void clientScoreboardMessage(edict_t *ent, edict_t *killer, qboolean log_file)=0; + virtual void clientStealthAndFatigueMeter(edict_t *ent)=0; + + virtual bool IsUnprotectedGoreZone(gz_code zone)=0; + virtual bool IsLimbZone(gz_code zone)=0; + virtual void HitByAttacker(edict_t *body, edict_t *attacker)=0; + virtual bool IsShootableWeapon(char *weaponname)=0; +}; + +extern class gamemode_ic *dm; + +void InitDeathmatchSystem(void); +void DeleteDeathmatchSystem(void); +void respawnUntouchedItem(edict_t* ent); diff --git a/Source/Game/gamecpp/dm_arsenal.cpp b/Source/Game/gamecpp/dm_arsenal.cpp new file mode 100644 index 0000000..66e0ac4 --- /dev/null +++ b/Source/Game/gamecpp/dm_arsenal.cpp @@ -0,0 +1,519 @@ +// ***************************************************************************** +// dm_arsenal.cpp +// ***************************************************************************** + +#include "g_local.h" +#include "dm_private.h" +#include "w_weapons.h" +#include "../strings/dm_arsenal.h" + +const int DF_ARSENAL_NO_HEALTH = (1<<0); +const int DF_ARSENAL_NO_ITEMS = (1<<1); +const int DF_ARSENAL_NO_FALLING = (1<<3); +const int DF_ARSENAL_REALISTIC_DAMAGE = (1<<4); +const int DF_ARSENAL_SAME_LEVEL = (1<<5); +const int DF_ARSENAL_FORCE_RESPAWN = (1<<9); +const int DF_ARSENAL_NO_ARMOR = (1<<10); + +void sendRestartPrediction(edict_t *ent); + +/* +================= +getPlayerDMInfo +================= +*/ + +static player_dmarsenalInfo_c *getPlayerDMInfo(const edict_t *ent) +{ + return((player_dmarsenalInfo_c *)ent->client->dmInfo); +} + +/* +================== +SendStatusInfo +================== +*/ + +static void SendStatusInfo(edict_t *ent) +{ + if(level.intermissiontime) + return; + + if(ent->client->pers.spectator) + return; + + gi.SP_Print(ent,DM_ARSENAL_LAYOUT_STATUS,ent->client->inv->countWeapons()); +} + +/* +================== +SendStatusInfo2 +================== +*/ + +static void SendStatusInfo2(edict_t *ent) +{ + if(level.intermissiontime) + return; + + if(ent->client->pers.spectator) + return; + + ent->client->showinventory=false; + ent->client->showscores=false; + ent->client->showhelp_time=level.time+5.0; + SendStatusInfo(ent); + gi.unicast(ent,true); +} + +/* +================== +dmarsenal_c::checkEvents +================== +*/ + +void dmarsenal_c::checkEvents(void) +{ + if(resetGame==-1) + { + resetGame=0; + + int i; + edict_t *e2; + + // Reset the weapons for everyone as a new round is about to start. + + setWeapons(); + + for (i = 1; i <= game.maxclients; i++) + { + e2 = &g_edicts[i]; + + if (!e2->inuse) + continue; + + if (!e2->client) + continue; + + assert(e2->client->inv); + + sharedEdict_t sh; + sh.inv = (inven_c *)e2->client->inv; + sh.edict = e2; + sh.inv->setOwner(&sh); + e2->client->inv->deactivateCurrentWeapon(); + e2->client->inv->deactivateInventory(); + + giveClientWeapons(*e2,true); + + SendStatusInfo2(e2); + } + } +} + +/* +================== +dmarsenal_c::setWeapons +================== +*/ + +void dmarsenal_c::setWeapons(void) +{ + int count, + bit, + tot, + max; + + count=0; + tot=0; + max=SFW_NUM_WEAPONS-3; + + while(1) + { + if((bit=gi.flrand(1,max+1))>max) + bit=max; + + tot|=1<<(bit-1); + + count=0; + + for(int i=1;i<=max;i++) + { + if(tot&(1<<(i-1))) + { + weaponForSlot[count]=i; + count++; + } + } + + if(count>=ARSENAL_MAXWEAPONS) + break; + } + + firstToOneHit=0; + resetGame=0; +} + +/* +================== +dmarsenal_c::giveClientWeapons +================== +*/ + +void dmarsenal_c::giveClientWeapons(edict_t &ent,qboolean newInv) +{ + if(newInv) + { + W_InitInv(ent); + sendRestartPrediction(&ent); + } + + sharedEdict_t sh; + + sh.inv = (inven_c *)ent.client->inv; + sh.edict = &ent; + sh.inv->setOwner(&sh); + + sh.inv->clearInv(true); + + sh.inv->rulesSetWeaponsUseAmmo(0); + sh.inv->rulesSetDropWeapons(0); + sh.inv->rulesSetWeaponsReload(0); + sh.inv->rulesSetBestWeaponMode("unsafe"); + sh.inv->rulesSetFreelySelectWeapon(0); + + if(newInv) + { + for(int i = 0; i < ARSENAL_MAXWEAPONS; i++) + sh.inv->addWeaponType(weaponForSlot[i],0); + + // Save off weapons and inventory counts. + + sh.inv->buildInvString(getPlayerDMInfo((const edict_t *)&ent)->invString(),true,false,false,false); + } + else + { + // Reconstitute saved inventory. + + int weaponsAvailable; + sh.inv->extractInvFromString(&weaponsAvailable,getPlayerDMInfo((const edict_t *)&ent)->invString()); + } + + sh.inv->addWeaponType(SFW_THROWHAND); + + sh.inv->selectBestWeapon(); +} + +/* +================== +dmarsenal_c::levelInit +================== +*/ + +void dmarsenal_c::levelInit(void) +{ + gi.SP_Register("dm_arsenal"); + + // Precache sounds. + + gi.soundindex("dm/arsenal/bigwinner.wav"); + gi.soundindex("dm/arsenal/lastweapon.wav"); + + // Make certain all the weapons needed during the game are precached, + // because it's possible for all the weapon types to be used during + // a game. + + for(int i=SFW_KNIFE;i<=SFW_THROWHAND;i++) + { + // View weapons. + + AddWeaponTypeForPrecache(i); + + // Bolt-ons / pickups. Eugh... but necessary to precache. + + if(Pickup *p=thePickupList.GetPickupFromType(PU_WEAPON,i)) + { + edict_t *ent=G_Spawn(); + I_Spawn(ent,p); + G_FreeEdict(ent); + } + } + + // Determine the available weapons at the start of the game. + + setWeapons(); +} + +/* +================== +dmarsenal_c::checkItemSpawn +================== +*/ + +int dmarsenal_c::checkItemSpawn(edict_t *ent,Pickup **pickup) +{ + if ((*pickup)->GetPickupListIndex() == OBJ_CTF_FLAG) + { + G_FreeEdict (ent); + return(0); + } + + if(dmRule_NO_HEALTH()) + { + if ((*pickup)->GetType() == PU_HEALTH) + { + G_FreeEdict (ent); + return(0); + } + } + + if(dmRule_NO_ITEMS()) + { + if ((*pickup)->GetType() == PU_INV) + { + G_FreeEdict (ent); + return(0); + } + } + + if(dmRule_NO_ARMOR()) + { + if ((*pickup)->GetType() == PU_ARMOR) + { + G_FreeEdict (ent); + return(0); + } + } + + if ((*pickup)->GetType() == PU_AMMO) + { + G_FreeEdict (ent); + return(0); + } + + if ((*pickup)->GetType() == PU_WEAPON) + { + G_FreeEdict (ent); + return(0); + } + + return(-1); +} + +/* +================== +dmarsenal_c::dmRule_xxx +================== +*/ + +int dmarsenal_c::dmRule_NO_HEALTH(void) +{ + return((int)dmflags->value&DF_ARSENAL_NO_HEALTH); +} + +int dmarsenal_c::dmRule_NO_ITEMS(void) +{ + return((int)dmflags->value&DF_ARSENAL_NO_ITEMS); +} + +int dmarsenal_c::dmRule_NO_FALLING(void) +{ + return((int)dmflags->value&DF_ARSENAL_NO_FALLING); +} + +int dmarsenal_c::dmRule_REALISTIC_DAMAGE(void) +{ + return((int)dmflags->value&DF_ARSENAL_REALISTIC_DAMAGE); +} + +int dmarsenal_c::dmRule_SAME_LEVEL(void) +{ + return((int)dmflags->value&DF_ARSENAL_SAME_LEVEL); +} + +int dmarsenal_c::dmRule_FORCE_RESPAWN(void) +{ + return((int)dmflags->value&DF_ARSENAL_FORCE_RESPAWN); +} + +int dmarsenal_c::dmRule_NO_ARMOR(void) +{ + return((int)dmflags->value&DF_ARSENAL_NO_ARMOR); +} + +/* +================== +dmarsenal_c::initPlayerDMInfo +================== +*/ + +void dmarsenal_c::initPlayerDMInfo(edict_t &ent) +{ + if(!ent.client->dmInfo) + ent.client->dmInfo = new player_dmarsenalInfo_c; +} + +/* +================== +dmarsenal_c::clientConnect +================== +*/ + +void dmarsenal_c::clientConnect(edict_t &ent) +{ + gamerules_c::clientConnect(ent); + giveClientWeapons(ent,true); +} + +/* +================== +dmarsenal_c::clientDie +================== +*/ + +void dmarsenal_c::clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer) +{ + if(ent.client->pers.spectator) + return; + + // Save off weapons and inventory counts. + + sharedEdict_t sh; + + sh.inv = (inven_c *)ent.client->inv; + sh.edict = &ent; + sh.inv->setOwner(&sh); + + sh.inv->buildInvString(getPlayerDMInfo((const edict_t *)&ent)->invString(),true,false,false,false); + + // Lose a frag? + + if((!killer.client)||(&killer==&ent)) + { + // I was killed by non player or killed myself. + + if (&killer==&ent) + { + // the killer is me + ent.client->resp.score -= sv_suicidepenalty->value; + } + else + { + ent.client->resp.score--; + } + return; + } + else + { + // I was killed by another player. + + int weaponsCount; + + // Award my killer a frag. + + killer.client->resp.score+=1; + + // Telefragging, hand grenades and c4 don't count towards the big winner bonus. + + if((meansOfDeath!=MOD_TELEFRAG)&&(meansOfDeath!=MOD_GRENADE)&&(meansOfDeath!=MOD_C4)) + { + // My killer used their current weapon to kill me, so they should drop + // it and take out the next one. + + killer.client->inv->removeCurrentWeapon(); + + // When counting the number of weapons, we need to subtract -1 because + // the inventory system takes a while to actually drop the weapon. In + // other words, we can't just set the current weapon slot to empty in + // removeCurrentWeapon()... and then count the weapons - that screws + // the whole weapon changing thing up. So I guess this is not the worst + // or the best hack, but re-writing the weapons code to avoid the above + // scenario just isn't worth it at this late stage. + + weaponsCount=killer.client->inv->countWeapons()-1; + + // Check to see how many weapons my killer has left... + + if(weaponsCount==0) + { + // My killer used all his weapons up so award them a frag plus the big winner bonus. + + killer.client->resp.score+=10; + gi.positioned_sound(vec3_origin,g_edicts,CHAN_BODY,gi.soundindex("dm/arsenal/bigwinner.wav"),0.6,ATTN_NONE,0); + gi.SP_Print(0,DM_ARSENAL_TEXT_BIG_WINNER,killer.s.number); + + // Time to reset game! + + resetGame=-1; + } + else if((!firstToOneHit)&&(weaponsCount==1)) + { + // Somehas become the first player to have just one weapon left to + // use, so annouce this to everyone. + + firstToOneHit=1; + gi.positioned_sound(vec3_origin,g_edicts,CHAN_BODY,gi.soundindex("dm/arsenal/lastweapon.wav"),0.6,ATTN_NONE,0); + gi.SP_Print(0,DM_ARSENAL_TEXT_LAST_WEAPON,killer.s.number); + } + } + } +} + +/* +================== +dmarsenal_c::clientDieWeaponHandler +================== +*/ + +void dmarsenal_c::clientDieWeaponHandler(edict_t *ent) +{ + sharedEdict_t sh; + + sh.inv=(inven_c *)ent->client->inv; + sh.edict=ent; + sh.inv->setOwner(&sh); + sh.inv->rulesSetDropWeapons(0); + sh.inv->handlePlayerDeath(); + + if(IGhoulInst *gun=ent->client->ps.gun) + gun->SetAllPartsOnOff(false); +} + +/* +================== +dmarsenal_c::clientHelpMessage +================== +*/ + +void dmarsenal_c::clientHelpMessage(edict_t *ent) +{ + // Display my status info. + + SendStatusInfo2(ent); +} + +/* +================== +dmarsenal_c::clientRespawn +================== +*/ + +void dmarsenal_c::clientRespawn(edict_t &ent) +{ + giveClientWeapons(ent,ent.client->pers.spectator); + + // Send status update. + + SendStatusInfo2(&ent); +} + +/* +================== +dmarsenal_c::clientScoreboardMessage +================== +*/ + +void dmarsenal_c::clientScoreboardMessage (edict_t *ent, edict_t *killer, qboolean log_file) +{ + gamerules_c::clientScoreboardMessage(ent,killer,log_file); +} \ No newline at end of file diff --git a/Source/Game/gamecpp/dm_assassin.cpp b/Source/Game/gamecpp/dm_assassin.cpp new file mode 100644 index 0000000..1ecb457 --- /dev/null +++ b/Source/Game/gamecpp/dm_assassin.cpp @@ -0,0 +1,709 @@ +// ***************************************************************************** +// dm_assassin.cpp +// ***************************************************************************** + +#include "g_local.h" +#include "dm_private.h" +#include "w_weapons.h" +#include "../strings/dm_assassin.h" +#include "..\qcommon\configstring.h" + +const int DF_ASSASSIN_NO_HEALTH = (1<<0); +const int DF_ASSASSIN_NO_ITEMS = (1<<1); +const int DF_ASSASSIN_WEAPONS_STAY = (1<<2); +const int DF_ASSASSIN_NO_FALLING = (1<<3); +const int DF_ASSASSIN_REALISTIC_DAMAGE = (1<<4); +const int DF_ASSASSIN_SAME_LEVEL = (1<<5); +const int DF_ASSASSIN_NOWEAPRELOAD = (1<<6); +const int DF_ASSASSIN_FORCE_RESPAWN = (1<<9); +const int DF_ASSASSIN_NO_ARMOR = (1<<10); +const int DF_ASSASSIN_INFINITE_AMMO = (1<<11); +const int DF_ASSASSIN_SPINNINGPICKUPS = (1<<12); +const int DF_ASSASSIN_BULLET_WPNS_ONLY = (1<<13); + +extern PickupList thePickupList; + +/* +================= +getPlayerDMInfo +================= +*/ + +static player_dmassassinInfo_c *getPlayerDMInfo(const edict_t *ent) +{ + return((player_dmassassinInfo_c *)ent->client->dmInfo); +} + +/* +================= +decideColor + +Decide what color source uses to draw other's name. +================= +*/ + +void decideColor(const edict_t *source,const edict_t *other) +{ + if((!source)||(!other)) + return; + + if(source->client->pers.spectator) + { + // We're Spectating so we don't see any icons. + + setPlayernameColor((edict_t &)*source,(edict_t &)*other,TC_BLACK); + return; + } + + if(getPlayerDMInfo(source)->getTarget()!=other) + { + // Source is not targetting other... + + if(getPlayerDMInfo(other)->getTarget()!=source) + { + // ...and other isn't targetting source, so source sees other in BRIGHT_GREEN. + + setPlayernameColor((edict_t &)*source,(edict_t &)*other,TC_BRIGHT_GREEN); + } + else + { + // ...and other is targetting source, so source sees other in BRIGHT_YELLOW. + + setPlayernameColor((edict_t &)*source,(edict_t &)*other,TC_BRIGHT_YELLOW); + } + } + else + { + // Source is targetting other, so source sees other in BRIGHT_RED. + + setPlayernameColor((edict_t &)*source,(edict_t &)*other,TC_BRIGHT_RED); + } +} + +/* +================== +SendStatusInfo +================== +*/ + +static void SendStatusInfo(edict_t *ent,qboolean showEnemyTargeters) +{ + if(level.intermissiontime) + return; + + if(ent->client->pers.spectator) + return; + + const edict_t *target; + + target=getPlayerDMInfo(ent)->getTarget(); + + if(target) + gi.SP_Print(ent,DM_ASSASSIN_LAYOUT_TARGET,target->s.number); + else + gi.SP_Print(ent,DM_ASSASSIN_LAYOUT_NO_TARGET); + + const edict_t *e2; + int count; + + count=0; + + for(int i=1;i<=game.maxclients;i++) + { + e2 = &g_edicts[i]; + + if (!e2->inuse) + continue; + + if (!e2->client) + continue; + + if (getPlayerDMInfo(e2)->getTarget() != ent) + continue; + + count++; + } + + gi.SP_Print(ent,DM_ASSASSIN_LAYOUT_NUM_ENEMIES,count); +} + +/* +================== +SendStatusInfo2 +================== +*/ + +static void SendStatusInfo2(edict_t *ent) +{ + if(level.intermissiontime) + return; + + if(ent->client->pers.spectator) + return; + + ent->client->showinventory=false; + ent->client->showscores=false; + ent->client->showhelp_time=level.time+5.0; + SendStatusInfo(ent,false); + gi.unicast(ent,true); +} + +/* +================== +dmassassin_c::getRandomPlayer +================== +*/ + +const edict_t *dmassassin_c::getRandomPlayer(edict_t &source) +{ + const edict_t *newTarget=NULL; + + // Find new target. + + if(countPlayers()>=2) + { + int begin=(rand()%game.maxclients)+1; + + do + { + newTarget=&g_edicts[begin]; + + begin++; + if (begin > game.maxclients) + { + begin = 1; + } + }while((!newTarget->inuse)||(newTarget->client->pers.spectator)||(!newTarget->client)||(newTarget == &source)); + } + + assert(newTarget!=&source); + + return(newTarget); +} + +/* +================== +dmassassin_c::levelInit +================== +*/ + +void dmassassin_c::levelInit(void) +{ + gi.SP_Register("dm_assassin"); + + // Precache sounds. + + gi.soundindex("dm/assassin/killtarget.wav"); + gi.soundindex("dm/assassin/badkill.wav"); + + // Make certain all the weapons given to clients at respawn are precached. + + // View weapons. + + AddWeaponTypeForPrecache(SFW_KNIFE); + AddWeaponTypeForPrecache(SFW_PISTOL1); + AddWeaponTypeForPrecache(SFW_HURTHAND); + AddWeaponTypeForPrecache(SFW_THROWHAND); + + // Bolt-ons / pickups. Eugh... but necessary to precache. Knife doesn't + // need to be precached for some reason - it's always there.. hmmm. + + edict_t *ent=G_Spawn(); + //I_Spawn(ent,thePickupList.GetPickupFromType(PU_WEAPON,SFW_KNIFE)); + I_Spawn(ent,thePickupList.GetPickupFromType(PU_WEAPON,SFW_PISTOL1)); + G_FreeEdict(ent); + + // Ensure that player info always shows up, even in darkness. + + gi.configstring(CS_SHOWINFOINDARK,"1"); +} + +/* +================== +dmassassin_c::checkItemSpawn +================== +*/ + +int dmassassin_c::checkItemSpawn(edict_t *ent,Pickup **pickup) +{ + if ((*pickup)->GetPickupListIndex() == OBJ_CTF_FLAG) + { + G_FreeEdict (ent); + return(0); + } + + if(dmRule_NO_HEALTH()) + { + if ((*pickup)->GetType() == PU_HEALTH) + { + G_FreeEdict (ent); + return(0); + } + } + + if(dmRule_NO_ITEMS()) + { + if ((*pickup)->GetType() == PU_INV) + { + G_FreeEdict (ent); + return(0); + } + } + + if(dmRule_NO_ARMOR()) + { + if ((*pickup)->GetType() == PU_ARMOR) + { + G_FreeEdict (ent); + return(0); + } + } + + if(dmRule_INFINITE_AMMO()) + { + if ((*pickup)->GetType() == PU_AMMO) + { + G_FreeEdict (ent); + return(0); + } + } + + if(dmRule_BULLET_WPNS_ONLY()) + { + if ( ((*pickup)->GetType() == PU_WEAPON) && (!(*pickup)->IsBulletWpn()) || + ((*pickup)->GetType() == PU_AMMO) && (!(*pickup)->IsBulletAmmo()) ) + { + G_FreeEdict (ent); + return(0); + } + } + + return(-1); +} + +/* +================== +dmassassin_c::dmRule_xxx +================== +*/ + +int dmassassin_c::dmRule_NO_HEALTH(void) +{ + return((int)dmflags->value&DF_ASSASSIN_NO_HEALTH); +} + +int dmassassin_c::dmRule_NO_ITEMS(void) +{ + return((int)dmflags->value&DF_ASSASSIN_NO_ITEMS); +} + +int dmassassin_c::dmRule_WEAPONS_STAY(void) +{ + return((int)dmflags->value&DF_ASSASSIN_WEAPONS_STAY); +} + +int dmassassin_c::dmRule_NO_FALLING(void) +{ + return((int)dmflags->value&DF_ASSASSIN_NO_FALLING); +} + +int dmassassin_c::dmRule_REALISTIC_DAMAGE(void) +{ + return((int)dmflags->value&DF_ASSASSIN_REALISTIC_DAMAGE); +} + +int dmassassin_c::dmRule_SAME_LEVEL(void) +{ + return((int)dmflags->value&DF_ASSASSIN_SAME_LEVEL); +} + +int dmassassin_c::dmRule_NOWEAPRELOAD(void) +{ + return((int)dmflags->value&DF_ASSASSIN_NOWEAPRELOAD); +} + +int dmassassin_c::dmRule_FORCE_RESPAWN(void) +{ + return((int)dmflags->value&DF_ASSASSIN_FORCE_RESPAWN); +} + +int dmassassin_c::dmRule_NO_ARMOR(void) +{ + return((int)dmflags->value&DF_ASSASSIN_NO_ARMOR); +} + +int dmassassin_c::dmRule_INFINITE_AMMO(void) +{ + return((int)dmflags->value&DF_ASSASSIN_INFINITE_AMMO); +} + +int dmassassin_c::dmRule_SPINNINGPICKUPS(void) +{ + return((int)dmflags->value&DF_ASSASSIN_SPINNINGPICKUPS); +} + +int dmassassin_c::dmRule_BULLET_WPNS_ONLY(void) +{ + return((int)dmflags->value&DF_ASSASSIN_BULLET_WPNS_ONLY); +} + +/* +================== +dmassassin_c::initPlayerDMInfo +================== +*/ + +void dmassassin_c::initPlayerDMInfo(edict_t &ent) +{ + if(!ent.client->dmInfo) + ent.client->dmInfo = new player_dmassassinInfo_c; +} + +/* +================== +dmassassin_c::registerPlayerIcons +================== +*/ + +void dmassassin_c::registerPlayerIcons(void) +{ + char *iconNames[]= + { + "", + "noshoot", + "targetyou", + "destarget", + "**" + }; + + int i; + char **icon; + + for(icon=iconNames,i=0;strcmp(*icon,"**");icon++,i++) + gi.configstring(CS_PLAYERICONS+i,*icon); +} + +/* +================== +dmassassin_c::clientConnectAux +================== +*/ + +void dmassassin_c::clientConnectAux(edict_t &ent) +{ + int i; + const edict_t *ent2; + + // Ensure my target is cleared out. + + getPlayerDMInfo(&ent)->setTarget(NULL); + + // Initially, I see all other players' playernames in GREEN. + + for(i=1;i<=game.maxclients;i++) + { + ent2=&g_edicts[i]; + + if(!ent2->inuse) + continue; + + if (!ent2->client) + continue; + + decideColor(&ent,ent2); + } + + if(ent.client->pers.spectator) + return; + + // Select a target whom I will try to assassinate. + + getPlayerDMInfo(&ent)->setTarget(getRandomPlayer(ent)); + decideColor(&ent,getPlayerDMInfo(&ent)->getTarget()); + + // When a I join a game, we should also look around to see if there are any + // other players (i.e. besides myself) WITHOUT targets. E.g. when the 2nd + // player joins a game, the 1st player to have joined will be without a + // target to assassinate. So set the 1st player up with a target. We need to + // do a full check of all clients because of the order in which clients can + // connect and occupy edict/client slots. Kinda nasty really, but necessary. + + for(i=1; i<=game.maxclients; i++) + { + ent2 = &g_edicts[i]; + + if (!ent2->inuse) + continue; + + if (!ent2->client) + continue; + + // Don't check myself - I already have a target. + + if (ent2==&ent) + continue; + + // What color does other player see my name? + + decideColor(ent2,&ent); + + // Does other player have a target (see note above)? If so skip to + // next player. + + if (getPlayerDMInfo(ent2)->getTarget()) + continue; + + // Ok, other player is without a target, so select a someone whom they + // will try to assissinate... + + getPlayerDMInfo(ent2)->setTarget(getRandomPlayer((edict_t &)*ent2)); + decideColor(ent2,getPlayerDMInfo(ent2)->getTarget()); + + // ...and let them know their new target's name. + + SendStatusInfo2((edict_t *)ent2); + } +} + +/* +================== +dmassassin_c::clientConnect +================== +*/ + +void dmassassin_c::clientConnect(edict_t &ent) +{ + clientConnectAux(ent); +} + +/* +================== +dmassassin_c::clientDie +================== +*/ + +void dmassassin_c::clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer) +{ + if(ent.client->pers.spectator) + return; + + // Lose a frag? + + if((!killer.client)||(&killer==&ent)) + { + // I was killed by non player or killed myself. + + ent.client->resp.score--; + + return; + } + + // Save my last target and my killer's last target. + + const edict_t *myOldTarget,*killersOldTarget; + + myOldTarget=getPlayerDMInfo(&ent)->getTarget(); + killersOldTarget=getPlayerDMInfo(&killer)->getTarget(); + + // What happens next depends on who killed who... + + if(killersOldTarget==&ent) + { + // My killer killed their designated target (me). + + killer.client->resp.score+=4; + + // Confirmation of successful kill. + + gi.sound(&killer,CHAN_VOICE,gi.soundindex("dm/assassin/killtarget.wav"),1.0,ATTN_STATIC,0,SND_LOCALIZE_CLIENT); + } + else if(myOldTarget!=&killer) + { + // My killer killed an 'innocent bystander' (me). + + killer.client->resp.score--; + + // Uh-oh... made a bad kill... let them know it too! + + gi.sound(&killer,CHAN_VOICE,gi.soundindex("dm/assassin/badkill.wav"),1.0,ATTN_STATIC,0,SND_LOCALIZE_CLIENT); + gi.SP_Print(&killer,DM_ASSASSIN_TEXT_LOST_FRAG); + } + else + { + // My killer is my designated target, thus was acting in self defence. + + killer.client->resp.score++; + + // Confirmation of a self defense kill. + + gi.sound(&killer,CHAN_VOICE,gi.soundindex("dm/frag.wav"),1.0,ATTN_STATIC,0,SND_LOCALIZE_CLIENT); + return; + } + + // Set up new targets for killed and killer. + + getPlayerDMInfo(&ent)->setDeferedTarget(&killer); + + if(myOldTarget!=&killer) + getPlayerDMInfo(&killer)->setDeferedTarget(myOldTarget); + else + getPlayerDMInfo(&killer)->setDeferedTarget(getRandomPlayer(killer)); +} + +/* +================== +dmassassin_c::clientDisconnectAux +================== +*/ + +void dmassassin_c::clientDisconnectAux(edict_t &ent) +{ + int i; + edict_t *e2; + + // Select new targets for any players who were targeting me. + + for (i = 1; i <= game.maxclients; i++) + { + e2 = &g_edicts[i]; + + if (!e2->inuse) + continue; + + if (!e2->client) + continue; + + // Was this player targeting me? + + if (getPlayerDMInfo(e2)->getTarget() == &ent) + { + // Yes, so select a new target whom they will try to assissinate... + + getPlayerDMInfo(e2)->setDeferedTarget(getRandomPlayer(*e2)); + } + } +} + +/* +================== +dmassassin_c::clientDisconnect +================== +*/ + +void dmassassin_c::clientDisconnect(edict_t &ent) +{ + clientDisconnectAux(ent); + + // Close the log file if we have one open. + + closeLogFile(); +} + +/* +================== +dmassassin_c::clientEndFrame +================== +*/ + +void dmassassin_c::clientEndFrame(edict_t *ent) +{ + if(getPlayerDMInfo(ent)->getDeferedTarget()!=getPlayerDMInfo(ent)->getTarget()) + { + const edict_t *entOldTarget; + + entOldTarget=getPlayerDMInfo(ent)->getTarget(); + + getPlayerDMInfo(ent)->setTarget(getPlayerDMInfo(ent)->getDeferedTarget()); + + decideColor(ent,entOldTarget); + decideColor(ent,getPlayerDMInfo(ent)->getTarget()); + decideColor(entOldTarget,ent); + decideColor(getPlayerDMInfo(ent)->getTarget(),ent); + + SendStatusInfo2(ent); + } +} + +/* +================== +dmassassin_c::clientHelpMessage +================== +*/ + +void dmassassin_c::clientHelpMessage(edict_t *ent) +{ + // Display my status info. + + SendStatusInfo(ent,false); +} + +/* +================== +dmassassin_c::clientRespawn +================== +*/ + +void dmassassin_c::clientRespawn(edict_t &ent) +{ + if(ent.client->pers.spectator) + { + // We respawned as a spectator so we need to handle anyone who was + // targetting me. Also, clear my target out. + + clientDisconnectAux(ent); + getPlayerDMInfo(&ent)->setTarget(NULL); + + return; + } + else if(ent.client->pers.spectator != ent.client->resp.spectator) + { + // Respawned as normal player but I was previously a spectator, so I + // need a target to assassinate. Maybe someone needs a target too. + + clientConnectAux(ent); + } + + sharedEdict_t sh; + + sh.inv = (inven_c *)ent.client->inv; + sh.edict = &ent; + sh.inv->setOwner(&sh); + + sh.inv->clearInv(true); + + sh.inv->rulesSetWeaponsUseAmmo(dm->dmRule_INFINITE_AMMO()?0:-1); + sh.inv->rulesSetWeaponsReload(dm->dmRule_NOWEAPRELOAD()?0:-1); + sh.inv->rulesSetBestWeaponMode(Info_ValueForKey(ent.client->pers.userinfo,"bestweap")); + sh.inv->rulesSetDropWeapons(!dm->dmRule_WEAPONS_STAY()); + sh.inv->rulesSetNonDroppableWeaponTypes(1<dmRule_REALISTIC_DAMAGE()) + sh.inv->rulesSetNonDroppableWeaponTypes(1<addWeaponType(SFW_KNIFE); + sh.inv->addWeaponType(SFW_PISTOL1); + sh.inv->addWeaponType(SFW_HURTHAND); + sh.inv->addWeaponType(SFW_THROWHAND); + + if(!dm->dmRule_INFINITE_AMMO()) + { + sh.inv->addAmmoType(AMMO_KNIFE,6); + sh.inv->addAmmoType(AMMO_9MM,150); + } + + sh.inv->selectWeapon(SFW_PISTOL1); + + // If I have a target to assassinate, let me know who it is. + + SendStatusInfo2(&ent); +} + +/* +================== +dmassassin_c::clientScoreboardMessage +================== +*/ + +void dmassassin_c::clientScoreboardMessage (edict_t *ent, edict_t *killer, qboolean log_file) +{ + gamerules_c::clientScoreboardMessage(ent,killer,log_file); +} diff --git a/Source/Game/gamecpp/dm_ctf.cpp b/Source/Game/gamecpp/dm_ctf.cpp new file mode 100644 index 0000000..26da9f8 --- /dev/null +++ b/Source/Game/gamecpp/dm_ctf.cpp @@ -0,0 +1,1588 @@ +// ***************************************************************************** +// dm_ctf.cpp +// ***************************************************************************** + +#include "g_local.h" +#include "dm_private.h" +#include "w_weapons.h" +#include "dm_ctf.h" +#include "p_body.h" +#include "../strings/dm_generic.h" +#include "..\qcommon\configstring.h" + +const int DF_CTF_NO_HEALTH = (1<<0); +const int DF_CTF_NO_ITEMS = (1<<1); +const int DF_CTF_WEAPONS_STAY = (1<<2); +const int DF_CTF_NO_FALLING = (1<<3); +const int DF_CTF_REALISTIC_DAMAGE = (1<<4); +const int DF_CTF_SAME_LEVEL = (1<<5); +const int DF_CTF_NOWEAPRELOAD = (1<<6); +const int DF_CTF_NO_FRIENDLY_FIRE = (1<<8); +const int DF_CTF_FORCE_RESPAWN = (1<<9); +const int DF_CTF_NO_ARMOR = (1<<10); +const int DF_CTF_INFINITE_AMMO = (1<<11); +const int DF_CTF_SPINNINGPICKUPS = (1<<12); +const int DF_CTF_BULLET_WPNS_ONLY = (1<<13); +const int DF_CTF_FORCEJOIN = (1<<14); + +void hurt_touch(edict_t *self, edict_t *other, cplane_t *plane, struct mtexinfo_s *surf); +int TeamCompare(void const *a, void const *b); + +/* +================== +dmctf_c::FlagCaptured +================== +*/ + +void dmctf_c::FlagCaptured(team_t team) +{ + if (team == TEAM1) + blue_collected++; + else + red_collected++; +} + +/* +================== +dmctf_c::ClearFlagCount +================== +*/ + +void dmctf_c::ClearFlagCount(void) +{ + blue_collected = red_collected = 0; + // clear out anyone with a flag next to them on the score board. + gi.configstring(CS_CTF_BLUE_STAT, "d"); + gi.configstring(CS_CTF_RED_STAT, "d"); + // Reset the ctf_loops_count. + gi.cvar_setvalue("ctf_loops_count", 0.0); + gi.cvar_setvalue("ctf_flag_captured", 0.0); +} + +/* +================== +dmctf_c::HitByAttacker +================== +*/ +void dmctf_c::HitByAttacker(edict_t *body, edict_t *attacker) +{ + // if the attacker isn't a player, exit + if (!attacker->client) + return; + + // are we a flag carrier? If so, set the time inside of my attacker, so if he is killed soon, the player that kills HIM gets a bonus for protecting me + if (body->ctf_flags) + { + attacker->ctf_hurt_carrier = level.time; + } +} + +/* +================== +CountSkinsInFile + +given a pointer to a GPL file, count the number of skins for any given team name +================== +*/ +int CountSkinsInFile(char *teamname, char *buffer) +{ + // Loop through and validate skin names - see if they are attached to this team we are checking against + TeamInfoC team; + char *s; + int count = 0; + + s=buffer; + + while(s) + { + char shortname[100]; + char defModName[100]; + + strcpy(shortname,COM_Parse(&s)); + + if(strlen(shortname)) + { + // we have a skin name, go load it in and see what team its on + Com_sprintf(defModName, sizeof(defModName), "%s.gpm", shortname); + IPlayerModelInfoC *aPlayer=gi.NewPlayerModelInfo(defModName); + // if we are on the team name provided, inc the counter + aPlayer->GetTeamInfo(team); + if (!(stricmp(teamname, team.name))) + { + count++; + } + delete aPlayer; + } + } + return count; +} + +/* +================== +dmctf_c::NumOfSkins +================== +*/ +int dmctf_c::NumOfSkins(char *teamname) +{ + int i,length ; + char *buffer; + char custom_filename[MAX_QPATH]; + + // load in the ctf GPL file, that contains all the skins allowed for CTF + if((length=gi.FS_LoadFile("ghoul/pmodels/ctf.gpl",(void **)&buffer))==-1) + { + gi.error("*************************\nCould not open ctf.gpl\n*************************\n"); + return 0; + } + + i = CountSkinsInFile(teamname, buffer); + + // Clean up... + + gi.FS_FreeFile(buffer); + + // if we have a secondary GPL file... + if (sv_altpmodlistfile->string[0]) + { + Com_sprintf(custom_filename, sizeof(custom_filename),"%s.gpl", sv_altpmodlistfile->string); + // now look through the secondary skin file + if((length=gi.FS_LoadFile(custom_filename,(void **)&buffer))==-1) + { + return i; + } + + i += CountSkinsInFile(teamname, buffer); + + // Clean up... + + gi.FS_FreeFile(buffer); + } + + return i; +} + +/* +================== +dmctf_c::levelInit +================== +*/ + +#define MAX_DEFINED_TEAMS 6 +void dmctf_c::levelInit(void) +{ + // Precache string package. + char *teamnames[MAX_DEFINED_TEAMS] = + { + "The Order", + "MeatWagon", + "Ministry of Sin", + "Red Guard", + "The December Brigade", + "The Order" + }; + + gi.SP_Register("dm_ctf"); + + // Precache flags. + + game_ghoul.FindObject("items/ctf_flag", "flag_hold_idle"); + game_ghoul.FindObject("items/ctf_flag", "flag_run"); + + // Precache sounds. + + gi.soundindex("dm/ctf/flaggrab.wav"); + gi.soundindex("dm/ctf/flagret.wav"); + gi.soundindex("dm/ctf/flagbase.wav"); + gi.soundindex("dm/ctf/triumphant.wav"); + gi.soundindex("player/flaglp.wav"); + + // Make certain all the weapons given to clients at respawn are precached. + + // View weapons. + + AddWeaponTypeForPrecache(SFW_KNIFE); + AddWeaponTypeForPrecache(SFW_PISTOL1); + AddWeaponTypeForPrecache(SFW_HURTHAND); + AddWeaponTypeForPrecache(SFW_THROWHAND); + + // Bolt-ons / pickups. Eugh... but necessary to precache. Knife doesn't + // need to be precached for some reason - it's always there.. hmmm. + + edict_t *ent=G_Spawn(); + + I_Spawn(ent,thePickupList.GetPickupFromType(PU_WEAPON,SFW_PISTOL1)); + + G_FreeEdict(ent); + + // are the two teams the same ? + if (!stricmp(ctf_team_blue->string, ctf_team_red->string)) + { + // look for which one the red team is + for (int i=0; istring, teamnames[i])) + { + // this should never happen since the first and last teamname are the same entry, but you can never be too careful + if (i+1 != MAX_DEFINED_TEAMS) + { + gi.cvar_set("ctf_team_red", teamnames[i+1]); + Com_Printf("CTF Teams are the same - Resetting Team Red to %s\n", ctf_team_red->string); + break; + } + } + } + // we didn't find it in the list - all we can do here is pick a random team and hope it's not the same as blue + if (i == MAX_DEFINED_TEAMS) + { + gi.cvar_set("ctf_team_red", teamnames[gi.irand(0,MAX_DEFINED_TEAMS-1)]); + Com_Printf("CTF Teams are the same - Resetting Team Red to %s\n", ctf_team_red->string); + } + } + + // Set the number of blue or red skin.gpm files there are. We have to do this + // here, since we don't want to keep doing this everytime someone joins the + // game, yet we require the num of blue and red skin files to randomise people + // later. + num_blue_skins = NumOfSkins(ctf_team_blue->string); + num_red_skins = NumOfSkins(ctf_team_red->string); + + // Set the right team names for the client to be able to set the colors right + // on the team icons. + gi.configstring(CS_CTF_BLUE_TEAM, ctf_team_blue->string); + gi.configstring(CS_CTF_RED_TEAM, ctf_team_red->string); +} + +/* +================== +dmctf_c::checkItemSpawn +================== +*/ + +int dmctf_c::checkItemSpawn(edict_t *ent,Pickup **pickup) +{ + + if(dmRule_NO_HEALTH()) + { + if ((*pickup)->GetType() == PU_HEALTH) + { + G_FreeEdict (ent); + return(0); + } + } + + if(dmRule_NO_ITEMS()) + { + if ((*pickup)->GetType() == PU_INV) + { + G_FreeEdict (ent); + return(0); + } + } + + if(dmRule_NO_ARMOR()) + { + if ((*pickup)->GetType() == PU_ARMOR) + { + G_FreeEdict (ent); + return(0); + } + } + + if(dmRule_INFINITE_AMMO()) + { + if ((*pickup)->GetType() == PU_AMMO) + { + G_FreeEdict (ent); + return(0); + } + } + + if(dmRule_BULLET_WPNS_ONLY()) + { + if ( ((*pickup)->GetType() == PU_WEAPON) && (!(*pickup)->IsBulletWpn()) || + ((*pickup)->GetType() == PU_AMMO) && (!(*pickup)->IsBulletAmmo()) ) + { + G_FreeEdict (ent); + return(0); + } + } + + return(-1); +} + + +/* +================== +dmctf_c::dmRule_xxx +================== +*/ + +int dmctf_c::dmRule_NO_HEALTH(void) +{ + return((int)dmflags->value&DF_CTF_NO_HEALTH); +} + +int dmctf_c::dmRule_NO_ITEMS(void) +{ + return((int)dmflags->value&DF_CTF_NO_ITEMS); +} + +int dmctf_c::dmRule_WEAPONS_STAY(void) +{ + return((int)dmflags->value&DF_CTF_WEAPONS_STAY); +} + +int dmctf_c::dmRule_NO_FALLING(void) +{ + return((int)dmflags->value&DF_CTF_NO_FALLING); +} + +int dmctf_c::dmRule_REALISTIC_DAMAGE(void) +{ + return((int)dmflags->value&DF_CTF_REALISTIC_DAMAGE); +} + +int dmctf_c::dmRule_SAME_LEVEL(void) +{ + return((int)dmflags->value&DF_CTF_SAME_LEVEL); +} + +int dmctf_c::dmRule_NOWEAPRELOAD(void) +{ + return((int)dmflags->value&DF_CTF_NOWEAPRELOAD); +} + +int dmctf_c::dmRule_NO_FRIENDLY_FIRE(void) +{ + return((int)dmflags->value&DF_CTF_NO_FRIENDLY_FIRE); +} + +int dmctf_c::dmRule_FORCE_RESPAWN(void) +{ + return((int)dmflags->value&DF_CTF_FORCE_RESPAWN); +} + +int dmctf_c::dmRule_NO_ARMOR(void) +{ + return((int)dmflags->value&DF_CTF_NO_ARMOR); +} + +int dmctf_c::dmRule_INFINITE_AMMO(void) +{ + return((int)dmflags->value&DF_CTF_INFINITE_AMMO); +} + +int dmctf_c::dmRule_SPINNINGPICKUPS(void) +{ + return((int)dmflags->value&DF_CTF_SPINNINGPICKUPS); +} + +int dmctf_c::dmRule_BULLET_WPNS_ONLY(void) +{ + return((int)dmflags->value&DF_CTF_BULLET_WPNS_ONLY); +} + +int dmctf_c::dmRule_FORCEJOIN(void) +{ + return((int)dmflags->value&DF_CTF_FORCEJOIN); +} + +/* +================== +CheckFlagFloor +================== +*/ +void CheckFlagFloor(edict_t *ent) +{ + vec3_t point; + int cont, num, i; + edict_t *touch[MAX_EDICTS], *hit; + + ent->nextthink = level.time + 1.0; + + // is it time to reset this flag? + if (ent->timestamp < level.time) + { + reset_flag(ent, NULL); + gi.sound(ent,CHAN_NO_PHS_ADD,gi.soundindex("dm/ctf/flagret.wav"),1.0,ATTN_NONE,0,SND_LOCALIZE_GLOBAL); + if (ent->ctf_flags == TEAM1) + { + gi.SP_Print(NULL, DM_CTF_RESPAWN_FLAG_BLUE); + } + else + { + gi.SP_Print(NULL, DM_CTF_RESPAWN_FLAG_RED); + } + // remove the current edict entirely, ghoul model and all + G_FreeEdict(ent); + return; + } + + VectorCopy(ent->s.origin, point); + // bring us up juuuuust a tad + point[2] += 1.0; + cont = gi.pointcontents(point); + + VectorAdd(ent->mins, ent->s.origin, ent->absmin); + VectorAdd(ent->maxs, ent->s.origin, ent->absmax); + + num = gi.BoxEdicts (ent->absmin, ent->absmax, touch + , MAX_EDICTS, AREA_TRIGGERS); + + for (i=0 ; iinuse) + continue; + if (!hit->touch) + continue; + if (hit->touch == hurt_touch) + cont = CONTENTS_LAVA; + } + + // if we are sitting over a pain or kill brush, reset us home. + if (cont & (CONTENTS_LAVA|CONTENTS_SLIME) ) + { + reset_flag(ent, NULL); + gi.sound(ent,CHAN_NO_PHS_ADD,gi.soundindex("dm/ctf/flagret.wav"),1.0,ATTN_NONE,0,SND_LOCALIZE_GLOBAL); + + if (ent->ctf_flags == TEAM1) + { + gi.SP_Print(NULL, DM_CTF_INACCESSIBLE_BLUE); + } + else + { + gi.SP_Print(NULL, DM_CTF_INACCESSIBLE_RED); + } + // remove the current edict entirely, ghoul model and all + G_FreeEdict(ent); + } +} + +/* +================== +dmctf_c::ClientDropItem +================== +*/ +void dmctf_c::clientDropItem(edict_t *ent,int type,int ammoCount) +{ + Pickup *pickup = NULL; + + if (pickup = thePickupList.GetPickupFromType(PU_INV, type)) + { + edict_t *dropped; + Matrix4 ZoneMatrix; + Vect3 zonePos; + vec3_t handPos, + dir; + + // Whatever weapon player is holding, throw one off. + + dropped=G_Spawn(); + dropped->spawnflags|=DROPPED_ITEM; + + // before we spawn anything, set the count on the dropped entity so its a CTF flag if need be + if (pickup->GetPickupListIndex() == OBJ_CTF_FLAG) + { + dropped->count = ent->ctf_flags; + assert(dropped->count); + } + + I_Spawn(dropped,pickup); + + // by this point - ctf_flags should have been set, so we can clear the count field. Only the flag spawn point has a value in the Count field + if (pickup->GetPickupListIndex() == OBJ_CTF_FLAG) + { + dropped->count = 0; + } + + dropped->enemy=ent; + dropped->touch_debounce_time=level.time+2.0; + dropped->touch_debounce_owner = ent; + + if (ent->ghoulInst) + { + ent->ghoulInst-> + GetBoltMatrix(level.time, + ZoneMatrix, + ent->ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l"), + IGhoulInst::MatrixType::Entity); + + ZoneMatrix.GetRow(3,zonePos); + + handPos[0]=zonePos[0]; + handPos[1]=zonePos[1]; + handPos[2]=zonePos[2]; + + VectorAdd(ent->s.origin,handPos,dropped->s.origin); + AngleVectors(ent->client->ps.viewangles,dir,NULL, NULL); + dir[2] = 0; + VectorNormalize(dir); + VectorMA(dropped->s.origin, 20.0, dir, dropped->s.origin); + VectorScale(dir,250.0,dropped->velocity); + } + else + { + + AngleVectors(ent->client->ps.viewangles,dir,NULL,NULL); + dir[2] = 0; + VectorNormalize(dir); + VectorCopy(ent->s.origin, dropped->s.origin); + dropped->s.origin[2] += 40.0; + VectorMA(dropped->s.origin, 20.0, dir, dropped->s.origin); + VectorScale(dir,250.0,dropped->velocity); + } + dropped->velocity[2]+=150.0; + dropped->health = ammoCount; + + if (pickup->GetPickupListIndex() == OBJ_CTF_FLAG) + { + // indicate to all clients the state of the flags + if (ent->ctf_flags == TEAM1) + { + gi.configstring(CS_CTF_BLUE_STAT, "d"); + } + else + { + gi.configstring(CS_CTF_RED_STAT, "d"); + } + + // first, rename the class on the dropped flag so its not the same as the spawned flag entity + dropped->classname = "ctf dropped flag"; + // give us a think function that watched what we sit on, and re-sets the flag if it lands on something hurtful + dropped->nextthink = level.time + 1.0; + dropped->think = CheckFlagFloor; + dropped->timestamp = level.time + CTF_RESPAWN_TIMEOUT; + + // remove flag from player + ent->ctf_flags = 0; + // delete the ghoul object on the players hip so we lose the flag there. + if (ent->ghoulInst) + PB_RemoveFlag(ent); + // if we have the flag klaxon sound going, turn it off + if (ent->s.sound == gi.soundindex("player/flaglp.wav")) + { + ent->s.sound = 0; + } + } + else + { + clientSetDroppedItemThink(dropped); + } + } +} + +/* +================== +dmctf_c::AssignTeam +================== +*/ +void dmctf_c::FindSkin(char *teamname, int skinnum) +{ + int i,length ; + char *buffer,*s; + TeamInfoC team; + char custom_filename[MAX_QPATH]; + + // load in the ctf GPL file, that contains all the skins allowed for CTF + if((length=gi.FS_LoadFile("ghoul/pmodels/ctf.gpl",(void **)&buffer))==-1) + { + gi.error("*************************\nCould not open ctf.gpl\n*************************\n"); + return ; + } + + i = 0; + s=buffer; + + // Loop through and validate skin names. + while(s) + { + char defModName[100]; + + strcpy(NewSkin,COM_Parse(&s)); + + if(strlen(NewSkin)) + { + // we have a skin name, go load it in and see what team its on + Com_sprintf(defModName, sizeof(defModName), "%s.gpm", NewSkin); + IPlayerModelInfoC *aPlayer=gi.NewPlayerModelInfo(defModName); + // if we are on the team name provided, inc the counter + aPlayer->GetTeamInfo(team); + delete aPlayer; + if (!(stricmp(teamname, team.name))) + { + // is this the file we are looking for? + if (i == skinnum) + { + gi.FS_FreeFile(buffer); + return ; + } + i++; + } + } + } + // Clean up... + + gi.FS_FreeFile(buffer); + + // load in the custom GPL file, that contains all the skins allowed for CTF + // if we have a secondary GPL file... + if (sv_altpmodlistfile->string[0]) + { + Com_sprintf(custom_filename, sizeof(custom_filename),"%s.gpl", sv_altpmodlistfile->string); + if((length=gi.FS_LoadFile(custom_filename,(void **)&buffer))==-1) + { + return ; + } + + s=buffer; + + // Loop through and validate skin names. + while(s) + { + char defModName[100]; + + strcpy(NewSkin,COM_Parse(&s)); + + if(strlen(NewSkin)) + { + // we have a skin name, go load it in and see what team its on + Com_sprintf(defModName, sizeof(defModName), "%s.gpm", NewSkin); + IPlayerModelInfoC *aPlayer=gi.NewPlayerModelInfo(defModName); + // if we are on the team name provided, inc the counter + aPlayer->GetTeamInfo(team); + delete aPlayer; + if (!(stricmp(teamname, team.name))) + { + // is this the file we are looking for? + if (i == skinnum) + { + gi.FS_FreeFile(buffer); + return ; + } + i++; + } + } + } + // Clean up... + + gi.FS_FreeFile(buffer); + } + gi.error("FORCEJOIN: Looking for skin that doesn't exit. - teamname %s - skin number %d\n", teamname, skinnum ); +} + + +/* +================== +dmctf_c::AssignTeam +================== +*/ +team_t dmctf_c::CompareSkin(char *skinname, char* teamname) +{ + int length ; + char *buffer,*s; + TeamInfoC team; + char custom_filename[MAX_QPATH]; + + // if we haven't even selected the right team, dump out immediately + if ((stricmp(ctf_team_blue->string, teamname)) && (stricmp(ctf_team_red->string, teamname))) + { + return NOTEAM; + } + + // load in the ctf GPL file, that contains all the skins allowed for CTF + if((length=gi.FS_LoadFile("ghoul/pmodels/ctf.gpl",(void **)&buffer))==-1) + { + gi.error("*************************\nCould not open ctf.gpl\n*************************\n"); + return NOTEAM; + } + + s=buffer; + + while(s) + { + char defModName[100]; + + strcpy(NewSkin,COM_Parse(&s)); + if(strlen(NewSkin)) + { + if (!(stricmp(NewSkin, skinname))) + { + // we have a skin name, go load it in and see what team its on + Com_sprintf(defModName, sizeof(defModName), "%s.gpm", NewSkin); + IPlayerModelInfoC *aPlayer=gi.NewPlayerModelInfo(defModName); + // if we are on the team name provided, then we found both team and skin + aPlayer->GetTeamInfo(team); + delete aPlayer; + if (!(stricmp(teamname, team.name))) + { + // Clean up... + if (!(stricmp(team.name, ctf_team_blue->string))) + { + gi.FS_FreeFile(buffer); + return TEAM1; + } + else + { + gi.FS_FreeFile(buffer); + return TEAM2; + } + } + } + } + } + + // Clean up... + gi.FS_FreeFile(buffer); + + // load in the custom GPL file, that contains all the skins allowed for CTF + // if we have a secondary GPL file... + if (sv_altpmodlistfile->string[0]) + { + Com_sprintf(custom_filename, sizeof(custom_filename),"%s.gpl", sv_altpmodlistfile->string); + if((length=gi.FS_LoadFile(custom_filename,(void **)&buffer))==-1) + { + return NOTEAM; + } + + s=buffer; + + while(s) + { + char defModName[100]; + + strcpy(NewSkin,COM_Parse(&s)); + if(strlen(NewSkin)) + { + if (!(stricmp(NewSkin, skinname))) + { + // we have a skin name, go load it in and see what team its on + Com_sprintf(defModName, sizeof(defModName), "%s.gpm", NewSkin); + IPlayerModelInfoC *aPlayer=gi.NewPlayerModelInfo(defModName); + // if we are on the team name provided, then we found both team and skin + aPlayer->GetTeamInfo(team); + delete aPlayer; + if (!(stricmp(teamname, team.name))) + { + // Clean up... + if (!(stricmp(team.name, ctf_team_blue->string))) + { + gi.FS_FreeFile(buffer); + return TEAM1; + } + else + { + gi.FS_FreeFile(buffer); + return TEAM2; + } + } + } + } + } + // Clean up... + gi.FS_FreeFile(buffer); + } + + return NOTEAM; +} + +/* +================== +dmctf_c::AssignTeam +================== +*/ +void dmctf_c::AssignTeam(edict_t *who, char *userinfo) +{ + edict_t *player; + int i; + int team1count = 0, team2count = 0; + int playernum; + bool killed_him = false; + + char skin[1000],teamname[1000]; + char newskin[1000],newteamname[1000]; + + // what we want to become + Com_sprintf(teamname,sizeof(teamname),"%s", Info_ValueForKey(userinfo,"teamname")); + // sanity checking + if (strlen(teamname) > 128) + gi.dprintf("CTF AssignTeam: teamname exceeded 128 - thought you'd like to know\n"); + Com_sprintf(skin,sizeof(skin),"%s", Info_ValueForKey(userinfo,"skin")); + // sanity checking + if (strlen(skin) > 128) + gi.dprintf("CTF AssignTeam: skin exceeded 128 - thought you'd like to know\n"); + + // what we are currently + PB_GetActualSkinName(who,newskin); + // sanity checking + if (strlen(newskin) > 128) + gi.dprintf("CTF AssignTeam: newskin exceeded 128 - thought you'd like to know\n"); + + PB_GetActualTeamName(who,newteamname); + // sanity checking + if (strlen(newteamname) > 128) + gi.dprintf("CTF AssignTeam: newteamname exceeded 128 - thought you'd like to know\n"); + + + // if we already have the skin we wanted, plus we have a team, just dip out, we don't need to do anything. + if((!stricmp(newskin,skin)) && (!stricmp(newteamname, teamname)) && who->client->resp.team) + return; + + // only do this if the FORCEJOIN flag is NOT set. + if (!dmRule_FORCEJOIN()) + { + team_t new_team; + + // decide if the skin selection is appropriate + new_team = CompareSkin(Info_ValueForKey(userinfo,"skin"), Info_ValueForKey(userinfo,"teamname")); + + // if this is not the first time through then we are already playing so in case we change teams, we'd better gib the player + if (who->client->resp.team && (who->client->resp.team != new_team) && (who->client->pers.connected) && (who->inuse)) + { + gi.dprintf("Start AssignTeamKillPlayer %s\n", who->client->pers.netname); + gi.dprintf(" new_team: %d\n", new_team); + gi.dprintf(" old_team: %d\n", who->client->resp.team); + gi.dprintf(" teamname: %s\n", teamname); + gi.dprintf(" skin: %s\n", skin); + + who->flags &= ~FL_GODMODE; + who->health = 0; + meansOfDeath = MOD_SUICIDE; + player_die (who, who, who, 100000, vec3_origin); + // Don't even bother waiting for death frames before respawning. + who->deadflag = DEAD_DEAD; + // since we are changing teams, zero his score + who->client->resp.score = 0; + killed_him = true; + gi.dprintf("End AssignTeamKillPlayer\n"); + } + + if (new_team) + { + gi.dprintf("Start AssignTeamCreatePlayer %s\n", who->client->pers.netname); + gi.dprintf(" new_team: %d\n", new_team); + gi.dprintf(" teamname: %s\n", teamname); + gi.dprintf(" skin: %s\n", skin); + + who->client->resp.team = new_team; + // has to be done + PB_InitBody(*who,userinfo); + // just to be sure, lets force those new skins to old ones + playernum = who-g_edicts-1; + gi.configstring(CS_PLAYERSKINS+playernum,va("%s\\%s\\%s",who->client->pers.netname,teamname,skin)); + gi.dprintf("End AssignTeamCreatePlayer\n"); + return; + } + // other wise fall through, put up a message and do the random team assign + gi.SP_Print(who, DM_CTF_BAD_SKIN); + + } + // ok - we are playing a FORCEJOIN game. If we are already have a team, dump us out. We shouldn't be messing with skins if we've already joined a FORCE JOIN game + else + if (who->client->resp.team) + { + // tell player he can't change his skin + gi.SP_Print(who, DM_CTF_NO_CHANGE); + + // reset skin if its changed + if(stricmp(newskin,skin)) + { + skin[0]='*'; + skin[1]=0; + strcat(skin+1,newskin); //FIXME: + Info_SetValueForKey(userinfo,"skin",newskin); + } + + // reset team if its changed + if(stricmp(newteamname,teamname)) + { + teamname[0]='*'; + teamname[1]=0; + strcat(teamname+1,newteamname); //FIXME: + Info_SetValueForKey(userinfo,"teamname",newteamname); + } + + // just to be sure, lets force those new skins to old ones + playernum = who-g_edicts-1; + gi.configstring(CS_PLAYERSKINS+playernum,va("%s\\%s\\%s",who->client->pers.netname,teamname,skin)); + + return; + } + + // count how many are on each team + for (i = 1; i <= (int)maxclients->value; i++) + { + player = &g_edicts[i]; + + if (player == who) + continue; + + switch (player->client->resp.team) + { + case TEAM1: + team1count++; + break; + case TEAM2: + team2count++; + } + } + + // assign a team to this player + if (team1count < team2count) + who->client->resp.team = TEAM1; + else + if (team2count < team1count) + who->client->resp.team = TEAM2; + else + if (gi.irand(0,1)) + who->client->resp.team = TEAM1; + else + who->client->resp.team = TEAM2; + + // ok -now a team has been assigned, lets assign a skin + if (who->client->resp.team == TEAM1) + { + teamname[0]='*'; + teamname[1]=0; + strcat(teamname+1,ctf_team_blue->string); + Info_SetValueForKey(userinfo,"teamname",ctf_team_blue->string); + FindSkin(ctf_team_blue->string, gi.irand(0,num_blue_skins-1)); + skin[0]='*'; + skin[1]=0; + strcat(skin+1,NewSkin); + Info_SetValueForKey(userinfo,"skin",NewSkin); + gi.SP_Print(who, DM_CTF_ASSIGN_BLUE, ctf_team_blue->string,NewSkin); + } + else + { + teamname[0]='*'; + teamname[1]=0; + strcat(teamname+1,ctf_team_red->string); + Info_SetValueForKey(userinfo,"teamname",ctf_team_red->string); + FindSkin(ctf_team_red->string, gi.irand(0,num_red_skins-1)); + skin[0]='*'; + skin[1]=0; + strcat(skin+1,NewSkin); + Info_SetValueForKey(userinfo,"skin",NewSkin); + gi.SP_Print(who, DM_CTF_ASSIGN_RED, ctf_team_red->string,NewSkin); + } + + playernum = who-g_edicts-1; + gi.configstring(CS_PLAYERSKINS+playernum,va("%s\\%s\\%s",who->client->pers.netname,teamname,skin)); + PB_InitBody(*who,userinfo); + +} + +/* +================== +dmctf_c::FindFlagEdict +================== +*/ + +edict_t *dmctf_c::FindFlagEdict(int team) +{ + edict_t *other; + int i; + + // firstly, look through all the players to see if anyone has it + for(i=1;i<=globals.max_edicts;i++) + { + other=&g_edicts[i]; + + if(!other->inuse) + continue; + + // found it? + if (other->ctf_flags == team) + return other; + } + // ok, couldn't find it - Uh oh. + assert(0); + + return NULL; +} + + +/* +================== +dmctf_c::clientDie +================== +*/ + +void dmctf_c::clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer) +{ + // record this value, since we are about to lose it if when we drop the flag + int ctf_flags = ent.ctf_flags; + int ent_team = ent.client->resp.team; + + // drop the flag if we have it + if(ent.client->inv->hasItemType(SFE_CTFFLAG)) + { + clientDropItem(&ent, SFE_CTFFLAG, 0); + // reset our flag count to 0 again + ent.client->inv->removeSpecificItem(SFE_CTFFLAG); + } + + // Lose a frag? + if((!killer.client)||(&killer==&ent)) + { + // I was killed by non player or killed myself. + + if (&killer==&ent) + { + // the killer is me + ent.client->resp.score -= sv_suicidepenalty->value; + } + else + { + ent.client->resp.score--; + } + + return; + } + + // Must've been killed by another player. + + if(meansOfDeath & MOD_FRIENDLY_FIRE) + { + killer.client->resp.score--; + // was I the flag carrier? if so, knock off 20 points for killing me + if (ctf_flags) + { + killer.client->resp.score -= 19; + } + } + else + { + edict_t *flag = NULL; + + killer.client->resp.score++; + // if we just hurt his flag carrier, give him another bonus + if ((level.time - ent.ctf_hurt_carrier) < CTF_TIME_OUT) + { + if (ent_team == 2) + { + gi.SP_Print(NULL, DM_CTF_FRAG_HURT_CARRIER_BLUE , killer.s.number, ent.s.number, CTF_CARRIER_DANGER_PROTECT_BONUS); + } + else + { + gi.SP_Print(NULL, DM_CTF_FRAG_HURT_CARRIER_RED , killer.s.number, ent.s.number, CTF_CARRIER_DANGER_PROTECT_BONUS); + } + killer.client->resp.score += CTF_CARRIER_DANGER_PROTECT_BONUS; + } + // ok, if we held the killers team flag, give the other guy more points. + if (ctf_flags & killer.client->resp.team) + { + if (ctf_flags == 2) + { + gi.SP_Print(NULL, DM_CTF_FRAG_CARRIER_BLUE , killer.s.number, CTF_FRAG_CARRIER_BONUS); + } + else + { + gi.SP_Print(NULL, DM_CTF_FRAG_CARRIER_RED , killer.s.number, CTF_FRAG_CARRIER_BONUS); + } + killer.client->resp.score += CTF_FRAG_CARRIER_BONUS; + } + else + { + // find the flag edict + flag = FindFlagEdict(killer.client->resp.team); + // just in case + if (flag) + { + vec3_t sub_vec; + float distance; + + // figure out the vector length between you and the flag + VectorSubtract(ent.s.origin, flag->s.origin, sub_vec); + distance = VectorLength(sub_vec); + // if we are close enough, give us the bonus + if (distance <= CTF_FLAG_DEFENSE_RADIUS) + { + if (killer.client->resp.team == 1) + { + gi.SP_Print(NULL, DM_CTF_PROTECT_FLAG_BLUE , killer.s.number, CTF_FLAG_DEFENSE_BONUS); + } + else + { + gi.SP_Print(NULL, DM_CTF_PROTECT_FLAG_RED , killer.s.number, CTF_FLAG_DEFENSE_BONUS); + } + killer.client->resp.score += CTF_FLAG_DEFENSE_BONUS; + } + } + } + } +} + +/* +================== +dmctf_c::clientDisconnect +================== +*/ + +void dmctf_c::clientDisconnect(edict_t &ent) +{ + ent.client->resp.team = NOTEAM; + // drop the flag if we have it + // if its a flag slot, and we have a flag there, drop it + if(ent.client->inv->hasItemType(SFE_CTFFLAG)) + clientDropItem(&ent, SFE_CTFFLAG, 0); + // close the log file if we have one open + closeLogFile(); + +} + +/* +================== +dmctf_c::clientRespawn +================== +*/ + +void dmctf_c::clientRespawn(edict_t &ent) +{ + sharedEdict_t sh; + + sh.inv = (inven_c *)ent.client->inv; + sh.edict = &ent; + sh.inv->setOwner(&sh); + + sh.inv->clearInv(true); + + sh.inv->rulesSetWeaponsUseAmmo(dm->dmRule_INFINITE_AMMO()?0:-1); + sh.inv->rulesSetWeaponsReload(dm->dmRule_NOWEAPRELOAD()?0:-1); + sh.inv->rulesSetBestWeaponMode(Info_ValueForKey(ent.client->pers.userinfo,"bestweap")); + sh.inv->rulesSetDropWeapons(!dm->dmRule_WEAPONS_STAY()); + sh.inv->rulesSetNonDroppableWeaponTypes(1<dmRule_REALISTIC_DAMAGE()) + sh.inv->rulesSetNonDroppableWeaponTypes(1<addWeaponType(SFW_KNIFE); + sh.inv->addWeaponType(SFW_PISTOL1); + sh.inv->addWeaponType(SFW_HURTHAND); + sh.inv->addWeaponType(SFW_THROWHAND); + + if(!dm->dmRule_INFINITE_AMMO()) + { + sh.inv->addAmmoType(AMMO_KNIFE,6); + sh.inv->addAmmoType(AMMO_9MM,150); + } + + sh.inv->selectWeapon(SFW_PISTOL1); +} + + +/* +================== +dmctf_c::clientScoreboardMessage +================== +*/ +#define BOARD_X_OFFSET 180 +void dmctf_c::clientScoreboardMessage(edict_t *ent, edict_t *killer, qboolean log_file) +{ + int i,j,k; + int sorted[2][MAX_CLIENTS]; + int sortedscores[2][MAX_CLIENTS]; + struct TeamInfo_s teams[MAX_CLIENTS]; + int score,total[2],total_teams, real_total[2], team; + int x,y,top,z; + gclient_t *cl; + edict_t *cl_ent; + + total[0] = total[1] =total_teams = 0; + teams[0].teamname = teams[1].teamname = 0; + memset(sortedscores, 0, sizeof(sortedscores)); + + // Is logging to a log-file enabled? + + if(log_file) + openLogFile(); + + // Sort all the clients by score from highest to lowest. + + for(i=0;iinuse) + continue; + + // Spectators get added separately if there's any room left. + + if(cl_ent->client->resp.spectator) + continue; + + // get our score and team + score = game.clients[i].resp.score; + team = game.clients[i].resp.team -1; + + // figure out where we are in this teams list + for(j=0;j sortedscores[team][j]) + { + break; + } + } + + // shuffle us a hole to put the new score in + for(k=total[team];k>j;k--) + { + sorted[team][k]=sorted[team][k-1]; + sortedscores[team][k]=sortedscores[team][k-1]; + } + + // insert the score + sorted[team][j]=i; + sortedscores[team][j]=score; + total[team]++; + + for(j=0;jclient->pers.userinfo, "teamname"); + if (!stricmp(teams[total_teams].teamname, ctf_team_blue->string)) + { + teams[total_teams].flags = blue_collected; + teams[total_teams].team = TEAM1; + } + else + { + teams[total_teams].flags = red_collected; + teams[total_teams].team = TEAM2; + } + total_teams++; + } + } + + real_total[0]=total[0]; + real_total[1]=total[1]; + + if(total[0]>12) + { + total[0]=12; + } + if(total[1]>12) + { + total[1]=12; + } + + // Clear the client's layout. + + top=32; + gi.SP_Print(ent,DM_GENERIC_LAYOUT_RESET); + + // Handle team aggregate scores. + + top = -64; + + for(i=0;istring,teams[z].teamname); + fprintf(filePtr,"%sScore %i\n",log_file_line_header->string,teams[z].score); + fprintf(filePtr,"%sFlag Captures %i\n\n",log_file_line_header->string,teams[z].flags); + } + } + + top = 0; + + y = top; + + // Send the scores for all active players to the client's layout. + + for(i=0;iresp.team -1) * BOARD_X_OFFSET; + + gi.SP_Print(ent,DM_GENERIC_LAYOUT_CTF_CLIENT, + (short)x,(short)y, + sorted[z][i], + (short)cl->resp.score, + (unsigned short)cl->ping, + (unsigned short)((level.framenum-cl->resp.enterframe)/600), + (short)cl_ent->ctf_flags); + + y+=32; + } + + // Write the scores to the open log-file if we have one. + + if(filePtr) + { + for(i=0;istring,cl_ent->client->pers.netname); + fprintf(filePtr,"%sScore %i\n",log_file_line_header->string,cl->resp.score); + fprintf(filePtr,"%sPing %i\n",log_file_line_header->string,cl->ping); + fprintf(filePtr,"%sTime %i\n%s\n",log_file_line_header->string,(level.framenum-cl->resp.enterframe)/600,log_file_line_header->string); + } + } + } + + // Send the scores for all spectators to the client's layout - if there's + // any room left on the scoreboard. + + i=(total[0]>total[1])?total[0]:total[1]; + + if(i<12) + { + y=top=i*32; + i=0; + j=0; + + while((jinuse)||(!cl_ent->client->resp.spectator)) + { + j++; + continue; + } + + x=(i>=3)?BOARD_X_OFFSET:0; + + if(i==3) + y=top; + + gi.SP_Print(ent,DM_GENERIC_LAYOUT_SCOREBAORD_SPECTATOR, + (short)x,(short)y, + j, + (unsigned short)cl->ping, + (unsigned short)((level.framenum-cl->resp.enterframe)/600)); + + y+=32; + i++; + j++; + } + } + + // Write the spectators to the open log-file if we have one. + + if(filePtr) + { + for(i=0;iinuse)||(!cl_ent->client->resp.spectator)) + continue; + + fprintf(filePtr,"%sClient %s\n",log_file_line_header->string,cl_ent->client->pers.netname); + fprintf(filePtr,"%s %s\n",log_file_line_header->string,"spectator"); + fprintf(filePtr,"%sPing %i\n",log_file_line_header->string,cl->ping); + fprintf(filePtr,"%sTime %i\n%s\n",log_file_line_header->string,(level.framenum-cl->resp.enterframe)/600,log_file_line_header->string); + } + } + + // Close the open log file if we have one. + + closeLogFile(); + +} + +/*================ + CaptureLimitHit +================*/ + +bool dmctf_c::CaptureLimitHit(int limit) +{ + if (!limit) + { + return false; + } + if (blue_collected >= limit) + { + return true; + } + if (red_collected >= limit) + { + return true; + } + return false; +} + + +// NOT PART OF THE RULES CLASS - was in g_misc.c but for the sake of consistency, I'm adding it here. + +//================================================================================= + +void find_flag(char *flag_class_type, team_t team) +{ + edict_t *flag = NULL; + int i; + Pickup *pickup = thePickupList.GetPickupFromSpawnName("ctf"); + + // firstly, look through all the players to see if anyone has it + for(i=1;i<=globals.max_edicts;i++) + { + flag=&g_edicts[i]; + + if(!flag->inuse) + continue; + + // found it? + if (flag->ctf_flags == team && stricmp(flag_class_type, flag->classname)) + break; + + } + if (i== globals.max_edicts+1) + return; + + // ok, did we find a dropped flag? + if (!stricmp(flag->classname, "ctf dropped flag")) + { + reset_flag(flag, NULL); + G_FreeEdict(flag); + } + // what about a flag attached to a player? + else + { + reset_flag(flag, flag); + // remove flag from player + flag->ctf_flags = 0; + // delete the ghoul object on the players hip so we lose the flag there. + if (flag->ghoulInst) + PB_RemoveFlag(flag); + // if we have the flag klaxon sound going, turn it off + if (flag->s.sound == gi.soundindex("player/flaglp.wav")) + { + flag->s.sound = 0; + } + // reset our flag count to 0 again + flag->client->inv->removeSpecificItem(SFE_CTFFLAG); + } +} + +void ctf_base_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if (!other->client) + return; + // determine if we have a flag, and if we do, compare it to the base we standing on - if they aren't the same, we are done + if (!(other->ctf_flags) || (other->ctf_flags == self->count)) + { + // nope + return; + } + if (!(ctf_flag_captured->value)) + { + edict_t *home = NULL; + char *flagname; + + // first thing we have to do is determine if our flag is still on the spawn spot + if (self->count == TEAM1) + { + flagname="ctf_flag_blue"; + } + else + { + flagname="ctf_flag_red"; + } + // find our flag spawn point + home = G_Find (home, FOFS(classname), flagname); + if (home) + { + // if we don't have a flag there, just return + if (!home->ctf_flags) + { + return; + } + } + + gi.sound(other,CHAN_NO_PHS_ADD,gi.soundindex("dm/ctf/flagbase.wav"),1.0,ATTN_NONE,0,SND_LOCALIZE_GLOBAL); + dm->FlagCaptured(other->client->resp.team); + + // give us a big old bonus. + if (other->ctf_flags == 1) + { + gi.SP_Print(NULL, DM_CTF_END_GAME_BONUS_BLUE, other->s.number, CTF_CAPTURE_BONUS); + } + else + { + gi.SP_Print(NULL, DM_CTF_END_GAME_BONUS_RED, other->s.number, CTF_CAPTURE_BONUS); + } + other->client->resp.score += CTF_CAPTURE_BONUS; + + // now, decide if we should just reset the flag, or if this map is over + gi.cprintf(NULL, PRINT_HIGH,"Loops count %.2f, count %.2f\n",ctf_loops_count->value+1 ,ctf_loops->value); + if (ctf_loops->value && dm->CaptureLimitHit(ctf_loops->value)) //0 is a value too. + { + // otherwise this game is over. + gi.cvar_setvalue("ctf_flag_captured", 1.0); + // remove any center screen messages we should. + gi.Con_ClearNotify (); + } + // ok, we aren't over yet + else + { + + gi.cvar_setvalue("ctf_loops_count", ctf_loops_count->value+ 1.0); + // now reset both flags + // find the blue flag + find_flag("ctf_flag_blue", TEAM1); + // find the red flag + find_flag("ctf_flag_red", TEAM2); + } + } +} + + +/*QUAKED misc_ctf_base (1 0 0) (-32 -32 -24) (32 32 -16) +Stepping onto this base in possesion of the correct flag will end the current CTF game. +count = team base. 1 = team 1, 2 = team 2 +*/ +void SP_misc_ctf_base (edict_t *ent) +{ + // only give us these if we are playing deathmatch, and its a CTF game + if (dm->isDM() && deathmatch->value == DM_CTF) + { + ent->touch = ctf_base_touch; + ent->solid = SOLID_TRIGGER; + VectorSet (ent->mins, -32, -32, -24); + VectorSet (ent->maxs, 32, 32, -16); + gi.linkentity (ent); + } + else + { + G_FreeEdict (ent); + } +} + + diff --git a/Source/Game/gamecpp/dm_ctf.h b/Source/Game/gamecpp/dm_ctf.h new file mode 100644 index 0000000..ac26514 --- /dev/null +++ b/Source/Game/gamecpp/dm_ctf.h @@ -0,0 +1,56 @@ +// ***************************************************************************** +// dm_ctf.h +// ------------ +// Deathmatch stuff that's for the private use of dm_ctf.cpp. +// ***************************************************************************** + +#define CTF_VERSION 0.00 +#define CTF_VSTRING2(x) #x +#define CTF_VSTRING(x) CTF_VSTRING2(x) +#define CTF_STRING_VERSION CTF_VSTRING(CTF_VERSION) + +#define CTF_TEAM1_SKIN "ctf_r" +#define CTF_TEAM2_SKIN "ctf_b" + +#define CTF_CAPTURE_BONUS 15 // what you get for capture +#define CTF_TEAM_BONUS 10 // what your team gets for capture +#define CTF_RECOVERY_BONUS 2 // what you get for recovery +#define CTF_FLAG_BONUS 1 // what you get for picking up enemy flag +#define CTF_FRAG_CARRIER_BONUS 3 // what you get for fragging enemy flag carrier + +#define CTF_CARRIER_DANGER_PROTECT_BONUS 2 // bonus for fraggin someone who has recently hurt your flag carrier +#define CTF_FLAG_DEFENSE_BONUS 1 // bonus for fraggin someone while either you or your target are near your flag or flag carrier + +#define CTF_FLAG_DEFENSE_RADIUS 400.0 // area considered 'close' to flag or flag carrier + +#define CTF_TIME_OUT 7.0 // in seconds +#define CTF_RESPAWN_TIMEOUT 150.0 // in seconds - time when dropped flag will return to base + +#define PACKAGE_DM_CTF 0x0a + +enum +{ + DM_CTF_CAPTURE_FLAG_RED = 0x0a00, + DM_CTF_RECOVER_FLAG_RED = 0x0a01, + DM_CTF_FRAG_CARRIER_RED = 0x0a02, + DM_CTF_FRAG_HURT_CARRIER_RED = 0x0a03, + DM_CTF_PROTECT_FLAG_RED = 0x0a04, + DM_CTF_END_GAME_BONUS_RED = 0x0a05, + DM_CTF_END_GAME_TEAM_BONUS = 0x0a06, + DM_CTF_INACCESSIBLE_RED = 0x0a07, + DM_CTF_ASSIGN_RED = 0x0a08, + DM_CTF_BAD_SKIN = 0x0a09, + DM_CTF_NO_CHANGE = 0x0a0a, + DM_CTF_RESPAWN_FLAG_RED = 0x0a0b, + DM_CTF_LAYOUT_SCOREBOARD_TEAM = 0x0a0c, + DM_CTF_END_GAME = 0x0a0d, + DM_CTF_CAPTURE_FLAG_BLUE = 0x0a0e, + DM_CTF_RECOVER_FLAG_BLUE = 0x0a0f, + DM_CTF_FRAG_CARRIER_BLUE = 0x0a10, + DM_CTF_FRAG_HURT_CARRIER_BLUE = 0x0a11, + DM_CTF_PROTECT_FLAG_BLUE = 0x0a12, + DM_CTF_END_GAME_BONUS_BLUE = 0x0a13, + DM_CTF_INACCESSIBLE_BLUE = 0x0a14, + DM_CTF_RESPAWN_FLAG_BLUE = 0x0a15, + DM_CTF_ASSIGN_BLUE = 0x0a16, +}; diff --git a/Source/Game/gamecpp/dm_none.cpp b/Source/Game/gamecpp/dm_none.cpp new file mode 100644 index 0000000..9d74a63 --- /dev/null +++ b/Source/Game/gamecpp/dm_none.cpp @@ -0,0 +1,560 @@ +// ***************************************************************************** +// dm_none.cpp +// ***************************************************************************** + +#include "g_local.h" +#include "dm_private.h" +#include "w_weapons.h" +#include "../strings/dm_generic.h" +#include "p_body.h" +#include "q_sh_interface.h" + +extern void sendRestartPrediction(edict_t *ent); + +/* +================== +dmnone_c::getMaxEncumbrance +================== +*/ + +int dmnone_c::getMaxEncumbrance(void) +{ + return(game.playerSkills.getPlayerMaxEncumbrance()); +} + +/* +================== +dmnone_c::clientDropItem +================== +*/ + +void dmnone_c::clientDropItem(edict_t *ent,int type,int ammoCount) +{ + Pickup *pickup = NULL; + + if (pickup = thePickupList.GetPickupFromType(PU_INV, type)) + { + edict_t *dropped; + vec3_t dir; + + // Whatever weapon player is holding, throw one off. + + dropped=G_Spawn(); + dropped->spawnflags|=DROPPED_ITEM; + I_Spawn(dropped,pickup); + + dropped->enemy=ent; + dropped->touch_debounce_time=level.time+2.0; + + AngleVectors(ent->client->ps.viewangles,dir,NULL,NULL); + dir[2] = 0; + VectorNormalize(dir); + VectorScale(dir,250.0,dropped->velocity); + VectorMA(ent->s.origin, 20.0, dir, dropped->s.origin); + dropped->velocity[2]+=150.0; + dropped->health = ammoCount; + + } +} + +/* +================== +dmnone_c::clientDropWeapon +================== +*/ + +void dmnone_c::clientDropWeapon(edict_t *ent,int type, int clipSize) +{ + Pickup *pickup = NULL; + + if (pickup = thePickupList.GetPickupFromType(PU_WEAPON, type)) + { + edict_t *dropped; + vec3_t dir; + + // Whatever weapon player is holding, throw one off. + + dropped=G_Spawn(); + dropped->spawnflags|=DROPPED_ITEM; + I_Spawn(dropped,pickup); + + dropped->enemy=ent; + dropped->touch_debounce_time=level.time+2.0; + + VectorCopy(ent->s.origin,dropped->s.origin); + AngleVectors(ent->client->ps.viewangles,dir,NULL,NULL); + dir[2] = 0; + VectorNormalize(dir); + + + // 2/3/00 dk -- We need to see if we can spawn the weapon at a point in front of the player. + // If we can't, just spawn it as close as we can. Without this test, a player with his face against the wall may end + // up dropping it on the other side of that wall. + vec3_t spawnPoint; + trace_t trace; + + + VectorMA(dropped->s.origin, 20.0, dir, spawnPoint); + dropped->owner = ent; // don't want player to interfere with trace + gi.trace(dropped->s.origin, dropped->mins, dropped->maxs, spawnPoint, dropped, MASK_SOLID, &trace); + if (trace.fraction < 1) + { + if (trace.startsolid) // ugh, we're probably in a corner trying to drop a weapon that won't fit. + // well, try behind us a bit + { + vec3_t backPoint; + + VectorMA(dropped->s.origin, -10, dir, backPoint); + gi.trace(backPoint, dropped->mins, dropped->maxs, dropped->s.origin, dropped, MASK_SOLID, &trace); + VectorMA(backPoint, 10.0 * trace.fraction, dir, dropped->s.origin); + } + else + { + VectorMA(dropped->s.origin, 20.0 * trace.fraction, dir, dropped->s.origin); + } + } + else + { + VectorCopy(spawnPoint, dropped->s.origin); + } + dropped->owner = NULL; + + + VectorScale(dir,250.0,dropped->velocity); + dropped->velocity[2]+=150.0; + dropped->health = clipSize; + + const char *weapon = gi.SP_GetStringText(pickup->GetDroppedStringIndex()); + gi.SP_Print(ent,DM_GENERIC_TEXT_DROPPED_WEAPON,weapon); + } +} + +/* +================== +lazy +================== +*/ + +void lazy(sharedEdict_t &sh, int a) +{ + sh.inv->addWeaponType(a); + AddWeaponTypeForPrecache(a); +} + +/* +================== +DefaultWeapons +================== +*/ + +void DefaultWeapons(edict_t *ent) +{ + sharedEdict_t sh; + + sh.inv=(inven_c *)ent->client->inv; + + if(!sh.inv) + { + gi.dprintf("hey! no inventory!\n"); + return; + } + + sh.edict=ent; + sh.inv->setOwner(&sh); + sh.inv->deactivateCurrentWeapon(); + sh.inv->deactivateInventory(); + + W_InitInv(*ent); + sh.inv = (inven_c *)ent->client->inv; + sh.edict = ent; + sh.inv->setOwner(&sh); + + sendRestartPrediction(ent); + sh.inv->clearInv(true); + + sh.inv->rulesSetWeaponsUseAmmo(-1); + sh.inv->rulesSetBestWeaponMode(Info_ValueForKey(ent->client->pers.userinfo,"bestweap")); + + sh.inv->addAmmoType(AMMO_9MM, 128); + sh.inv->addAmmoType(AMMO_KNIFE, 6); + sh.inv->addAmmoType(AMMO_556, 120); + sh.inv->addAmmoType(AMMO_44, 36); + sh.inv->addAmmoType(AMMO_SLUG, 40); + sh.inv->addAmmoType(AMMO_SHELLS, 32); + sh.inv->addAmmoType(AMMO_ROCKET, 8); + sh.inv->addAmmoType(AMMO_FTHROWER, 30); + sh.inv->addAmmoType(AMMO_MWAVE, 60); + + if(!(strncmp(level.mapname, "tsr", 3))) + { + lazy(sh, SFW_KNIFE); + lazy(sh, SFW_PISTOL1); + lazy(sh, SFW_SHOTGUN); + + sh.inv->addItem(SFE_FLASHPACK, 5); + sh.inv->addItem(SFE_C4, 2); + } + else if(!(strncmp(level.mapname, "trn", 3))) + { + sh.inv->addItem(SFE_FLASHPACK, 5); + sh.inv->addItem(SFE_C4, 2); + + lazy(sh, SFW_KNIFE); + lazy(sh, SFW_PISTOL1); + lazy(sh, SFW_SHOTGUN); + } + else if(!(strncmp(level.mapname, "kos", 3))) + { + sh.inv->addItem(SFE_FLASHPACK, 10); + sh.inv->addItem(SFE_C4, 5); + + lazy(sh, SFW_KNIFE); + lazy(sh, SFW_PISTOL1); + lazy(sh, SFW_SHOTGUN); + lazy(sh, SFW_ASSAULTRIFLE); + } + else if(!(strncmp(level.mapname, "sib", 3))) + { + sh.inv->addItem(SFE_FLASHPACK, 10); + sh.inv->addItem(SFE_C4, 5); + + lazy(sh, SFW_KNIFE); + lazy(sh, SFW_PISTOL1); + lazy(sh, SFW_SNIPER); + lazy(sh, SFW_MACHINEPISTOL); + lazy(sh, SFW_ASSAULTRIFLE); + } + else if(!(strncmp(level.mapname, "irq", 3))) + { + if(level.mapname[4] == 'a') + { + sh.inv->addItem(SFE_FLASHPACK, 10); + sh.inv->addItem(SFE_C4, 5); + + lazy(sh, SFW_KNIFE); + lazy(sh, SFW_PISTOL1); + lazy(sh, SFW_SNIPER); + lazy(sh, SFW_MACHINEPISTOL); + } + else if(level.mapname[4] == 'b') + { + sh.inv->addItem(SFE_FLASHPACK, 10); + sh.inv->addItem(SFE_C4, 5); +// sh.inv->addItem(SFE_NEURAL_GRENADE, 3); + sh.inv->addItem(SFE_GRENADE, 5); + + lazy(sh, SFW_KNIFE); + lazy(sh, SFW_PISTOL1); + lazy(sh, SFW_MACHINEGUN); + lazy(sh, SFW_ROCKET); + } + } + else if(!(strncmp(level.mapname, "nyc", 3))) + { + sh.inv->addItem(SFE_FLASHPACK, 10); + sh.inv->addItem(SFE_C4, 5); + sh.inv->addItem(SFE_GRENADE, 5); + + lazy(sh, SFW_KNIFE); + lazy(sh, SFW_PISTOL1); + lazy(sh, SFW_SHOTGUN); + lazy(sh, SFW_ASSAULTRIFLE); + } + else if(!(strncmp(level.mapname, "sud", 3))) + { + sh.inv->addItem(SFE_FLASHPACK, 10); + sh.inv->addItem(SFE_C4, 5); + sh.inv->addItem(SFE_GRENADE, 5); + + lazy(sh, SFW_KNIFE); + lazy(sh, SFW_PISTOL1); + lazy(sh, SFW_PISTOL2); + lazy(sh, SFW_SNIPER); + + } + else if(!(strncmp(level.mapname, "jpn", 3))) + { + sh.inv->addItem(SFE_FLASHPACK, 10); + sh.inv->addItem(SFE_C4, 5); + sh.inv->addItem(SFE_GRENADE, 5); + + lazy(sh, SFW_KNIFE); + lazy(sh, SFW_PISTOL1); + lazy(sh, SFW_MACHINEPISTOL); + lazy(sh, SFW_ASSAULTRIFLE); + } + else if(!(strncmp(level.mapname, "ger", 3))) + { + sh.inv->addItem(SFE_FLASHPACK, 10); + sh.inv->addItem(SFE_C4, 5); +// sh.inv->addItem(SFE_NEURAL_GRENADE, 3); + sh.inv->addItem(SFE_GRENADE, 5); + + lazy(sh, SFW_KNIFE); + lazy(sh, SFW_PISTOL1); + lazy(sh, SFW_ROCKET); + lazy(sh, SFW_MACHINEGUN); + } + else + { + sh.inv->addItem(SFE_FLASHPACK, 5); + sh.inv->addItem(SFE_C4, 2); + + lazy(sh, SFW_KNIFE); + lazy(sh, SFW_PISTOL1); + lazy(sh, SFW_SHOTGUN); + } + + lazy(sh,SFW_HURTHAND); + lazy(sh,SFW_THROWHAND); + + sh.inv->stockWeapons(); + + pe->PrecacheViewWeaponModels(level.weaponsAvailable); + + sh.inv->selectWeapon(SFW_PISTOL1); + + PB_AddArmor(ent,1000); +} + +/* +================== +HandleSkillSettings + +Kinda mis-named. Actually inits all the level stats. +================== +*/ + +void HandleSkillSettings(void) +{ + level.guysKilled = 0; + level.friendliesKilled = 0; + + level.throatShots = 0; + level.nutShots = 0; + level.headShots = 0; + level.gibs = 0; + + level.savesUsed = 0; + level.cashEarned = 0; + level.skillRating = 0; + level.startTime = level.time; + + level.savesLeft = game.playerSkills.getNumberOfSaves(); +} + +/* +================== +specialInventory +================== +*/ + +qboolean specialInventory(edict_t &ent) +{ + // See SP_worldspawn... we may be setting the player's inventory depending + // on which level we're playing. + + edict_t *entWorldSpawn=&g_edicts[0]; + baseObjInfo_c *objInfo=entWorldSpawn->objInfo; + objFlipInfo_c *flipInfo=NULL; + + if(objInfo && (flipInfo = (objFlipInfo_c*)objInfo->GetInfo(OIT_FLIP))) + { + if (flipInfo->radius == -1) + { + // This is a "no weapons" level -- set via st.noweapons. + + if(!(strncmp(level.mapname, "tut1", 4))) + { + AddWeaponTypeForPrecache(SFW_SNIPER); + AddWeaponTypeForPrecache(SFW_PISTOL2); + + pe->PrecacheViewWeaponModels(level.weaponsAvailable); + } + + return(true); + } + else if (flipInfo->radius == -2) + { + // Basic inventory -- set via st.setweapons. + + sharedEdict_t sh; + + sh.inv=(inven_c *)ent.client->inv; + sh.edict=&ent; + sh.inv->setOwner(&sh); + sh.inv->deactivateCurrentWeapon(); + sh.inv->deactivateInventory(); + + sendRestartPrediction(&ent); + + sh.inv->clearInv(true); + + sh.inv->rulesSetWeaponsUseAmmo(-1); + sh.inv->rulesSetBestWeaponMode(Info_ValueForKey(ent.client->pers.userinfo,"bestweap")); + sh.inv->rulesSetNonDroppableWeaponTypes(1<addAmmoType(AMMO_KNIFE,6); + sh.inv->addAmmoType(AMMO_9MM,128); + sh.inv->addAmmoType(AMMO_SHELLS,32); + + sh.inv->addItem(SFE_C4,2); + sh.inv->addItem(SFE_FLASHPACK,5); + + pe->PrecacheViewWeaponModels(level.weaponsAvailable); + + sh.inv->selectBestWeapon(); + + PB_AddArmor(sh.edict, 100); + + return(true); + } + } + + return(false); +} + +/* +================== +dmnone_c::clientRespawn +================== +*/ + +void dmnone_c::clientRespawn(edict_t &ent) +{ + ent.health=100; + HandleSkillSettings(); + + // Set up player's inventory. + + if(specialInventory(ent)) + { + // Special case inventory setup for certain levels, e.g. tsr1, trn1, + // where player doesn't get a chance to go to the weapon load-out + // screen before-hand. + + return; + } + + sharedEdict_t sh; + + sh.inv=(inven_c *)ent.client->inv; + sh.edict=&ent; + sh.inv->setOwner(&sh); + sh.inv->deactivateCurrentWeapon(); + sh.inv->deactivateInventory(); + + sendRestartPrediction(&ent); + + sh.inv->clearInv(true); + + sh.inv->rulesSetWeaponsUseAmmo(-1); + sh.inv->rulesSetBestWeaponMode(Info_ValueForKey(ent.client->pers.userinfo,"bestweap")); + sh.inv->rulesSetNonDroppableWeaponTypes(1<extractInvFromMenu(&level.weaponsAvailable, &ent.health); + + // On easier difficulties, the player starts with full health no matter what + + if(game.playerSkills.fullHealthEachLevel()) + { + ent.health = 100; + } + + // Make certain all the weapons needed in the level with me are cached. + + pe->PrecacheViewWeaponModels(level.weaponsAvailable); + + // Select a weapon... + + if(((ent.client->pers.curWeaponType==-1)||(!ent.client->pers.curWeaponType))|| + (!sh.inv->hasWeaponType(ent.client->pers.curWeaponType))) + { + // ...the best weapon we have if we don't have a weapon from the prev. + // level. + + sh.inv->selectBestWeapon(); + } + else + { + // ...the weapon we were using from the last level. + sh.inv->selectWeapon(ent.client->pers.curWeaponType); + } +} + +/* +================== +dmnone_c::clientStealthAndFatigueMeter +================== +*/ + +void dmnone_c::clientStealthAndFatigueMeter(edict_t *ent) +{ + ent->client->ps.stats[STAT_FLAGS] |= STAT_FLAG_SHOW_STEALTH; + ent->client->ps.stats[STAT_STEALTH] = level.playerLoudness*100; +} + +/* +================== +dmnone_c::clientGetMovescale +================== +*/ + +float dmnone_c::clientGetMovescale(edict_t *ent) +{ + if(game.playerSkills.getSpawnValue() == 4) + { + // This game mode goes really damn fast! + + return 1.0; + } + else + { + return REALISTIC_MOVESCALE; + } +} + +/* +================== +dmnone_c::clientCalculateWaver +================== +*/ + +float dmnone_c::clientCalculateWaver(edict_t &ent, int atkID) +{ + float waverAmount = 0; + + // check for Sniper rifle, add waver based on zoom + if((atkID == ATK_SNIPER)/* || (atkID == ATK_SNIPER_ALT)*/) + { +// This waver based on a desired maximum waver of 4.5 when not zoomed (fov == 95), +// then a linearly decreasing slope from 2 at minimum zoom (fov == 60), +// to no waver when maximally zoomed (fov == 6). Thus: +// (CurrentFOV - FOV@MaxZoom) * MaxWaver (CurrentFOV - 6) * 2 +// waver = --------------------------------------- = -------------------------- +// (FOV@MinZoom - FOV@MaxZoom) (60 - 6) + + if(ent.client->ps.fov > 60) + { + waverAmount = 4.5; + } + else + { + waverAmount = 0;//((ent.client->ps.fov - 6) * .037); + } + } + + return waverAmount; +} \ No newline at end of file diff --git a/Source/Game/gamecpp/dm_private.h b/Source/Game/gamecpp/dm_private.h new file mode 100644 index 0000000..37c1f71 --- /dev/null +++ b/Source/Game/gamecpp/dm_private.h @@ -0,0 +1,531 @@ +// ***************************************************************************** +// dm_private.h +// ------------ +// Deathmatch stuff that's for the private use of dm.cpp and dm_????.cpp. +// ***************************************************************************** + + + +// Player icon enumerations. + +enum +{ + TC_BLACK, + TC_BRIGHT_GREEN, + TC_BRIGHT_YELLOW, + TC_BRIGHT_RED, +}; + +const float REALISTIC_MOVESCALE = 0.5625; + +extern int countPlayers(void); +extern qboolean IsFemale(edict_t *ent); +extern void setPlayernameColor(edict_t &ent,edict_t &other,byte color); + +// 12/28/99 kef -- declared in CWeaponInfo.h, class Pickup replaces itemSpawnInfo_t. and there was much rejoicing. +class Pickup; + +/* +============ +player_dmInfo_c +============ +*/ + +class player_dmInfo_c:public player_dmInfo_ic +{ +public: +}; + +/* +============ +player_dmassassinInfo_c +============ +*/ + +class player_dmassassinInfo_c:public player_dmInfo_c +{ +private: + edict_t const *assassinTarget; + edict_t const *deferedAssassinTarget; + +public: + + player_dmassassinInfo_c(){assassinTarget=deferedAssassinTarget=NULL;} + + edict_t const *getTarget(void){return((assassinTarget)?(assassinTarget):NULL);} + void setTarget(edict_t const *Targ){assassinTarget = deferedAssassinTarget = Targ;} + edict_t const *getDeferedTarget(void){return((deferedAssassinTarget)?(deferedAssassinTarget):NULL);} + void setDeferedTarget(edict_t const *deferedTarg){deferedAssassinTarget = deferedTarg;} +}; + +/* +============ +player_dmarsenalInfo_c +============ +*/ + +class player_dmarsenalInfo_c:public player_dmInfo_c +{ +private: + + char inventory[1024]; + +public: + + player_dmarsenalInfo_c(){memset(inventory,0,sizeof(inventory));} + + char *invString(void){return(inventory);} +}; + +/* +============ +player_dmrealInfo_c +============ +*/ + +class player_dmrealInfo_c:public player_dmInfo_c +{ +private: + +protected: + + int fatigue; + qboolean i_am_fatigued; + +public: + + player_dmrealInfo_c(){fatigue=0;i_am_fatigued=false;} + + int getFatigueVal(void){return (fatigue);} + void setFatigueVal(int newFatigue){fatigue=newFatigue;} + qboolean getFatigued(void){return (i_am_fatigued);} + void setFatigued(qboolean fatigued){i_am_fatigued=fatigued;} +}; + +/* +============ +gamerules_c +============ +*/ + +class gamerules_c +{ +protected: + + FILE *filePtr; + + virtual void clientSetDroppedItemThink(edict_t *ent); + virtual void clientSetDroppedWeaponThink(edict_t *ent); + +public: + + virtual int isDM(void){return(1);} + virtual void preLevelInit(void){} + virtual void levelInit(void){} + virtual char *getGameName(void){return("");} + virtual int checkItemSpawn(edict_t *ent,Pickup **pickup){return(0);} + virtual int checkItemAfterSpawn(edict_t *ent,Pickup *pickup){return(0);} + virtual void checkEvents(void){}; + virtual void respawnUntouchedItem(edict_t *ent) {} + virtual void setRespawn(edict_t *ent, float delay); + virtual int getMaxEncumbrance(void){return 0;} + virtual void AssignTeam(edict_t *ent, char *userinfo){}; + virtual void ClearFlagCount(void){}; + virtual void FlagCaptured(team_t team){}; + virtual bool CaptureLimitHit(int limit){return false;}; + + virtual void openLogFile(void); + virtual void closeLogFile(void); + + virtual int dmRule_NO_HEALTH(void){return(0);} + virtual int dmRule_NO_ITEMS(void){return(0);} + virtual int dmRule_WEAPONS_STAY(void){return(0);} + virtual int dmRule_NO_FALLING(void){return(0);} + virtual int dmRule_REALISTIC_DAMAGE(void){return(0);} + virtual int dmRule_SAME_LEVEL(void){return(0);} + virtual int dmRule_NOWEAPRELOAD(void){return(0);} + virtual int dmRule_TEAMPLAY(void){return(0);}; + virtual int dmRule_NO_FRIENDLY_FIRE(void){return(0);} + virtual int dmRule_FORCE_RESPAWN(void){return(0);} + virtual int dmRule_NO_ARMOR(void){return(0);} + virtual int dmRule_INFINITE_AMMO(void){return(0);} + virtual int dmRule_SPINNINGPICKUPS(void){return(0);} + virtual int dmRule_FORCEJOIN(void){return(0);} + virtual int dmRule_ARMOR_PROTECT(void){return(0);} + virtual int dmRule_BULLET_WPNS_ONLY(void){return(0);} + + virtual int arePlayerNamesOn(void){return(0);} + virtual int arePlayerTeamsOn(void){return(0);} + virtual int allowAutoWeaponSwitch(void){return(1);} + + virtual void initPlayerDMInfo(edict_t &ent){}; + virtual void registerPlayerIcons(void){}; + + virtual float clientCalculateWaver(edict_t &ent, int atkID); + virtual void clientConnect(edict_t &ent); + virtual void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer){}; + virtual void clientDieWeaponHandler(edict_t *ent); + virtual void clientPreDisconnect(edict_t &ent){}; + virtual void clientDisconnect(edict_t &ent){closeLogFile();}; + virtual void clientDropItem(edict_t *ent,int type,int ammoCount); + virtual void clientDropWeapon(edict_t *ent,int type, int clipSize); + virtual float clientGetMovescale(edict_t *ent); + virtual void clientEndFrame(edict_t *ent){}; + virtual void clientHandlePredn(edict_t &ent); + virtual void clientHelpMessage(edict_t *ent){}; + virtual void clientObituary(edict_t *self, edict_t *inflictor, edict_t *attacker); + virtual void clientRespawn(edict_t &ent){}; + virtual void clientScoreboardMessage(edict_t *ent, edict_t *killer, qboolean log_file); + virtual void clientStealthAndFatigueMeter(edict_t *ent){}; + + virtual bool IsUnprotectedGoreZone(gz_code zone); + virtual bool IsLimbZone(gz_code zone); + + virtual void HitByAttacker(edict_t *body, edict_t *attacker){}; + virtual bool IsShootableWeapon(char *weaponname); + +}; + +/* +============ +dmnone_c +============ +*/ + +class dmnone_c:public gamerules_c +{ +public: + + int isDM(void){return 0;} + void levelInit(void){gi.SP_Register("singleplr");} + char *getGameName(void){return("single player");} + int checkItemSpawn(edict_t *ent,Pickup **pickup){return(-1);} + int getMaxEncumbrance(void); + + void openLogFile(void){}; + void closeLogFile(void){}; + + void clientConnect(edict_t &ent){}; + void clientDropItem(edict_t *ent,int type,int ammoCount); + void clientDropWeapon(edict_t *ent,int type, int clipSize); + float clientGetMovescale(edict_t *ent); + void clientObituary(edict_t *self, edict_t *inflictor, edict_t *attacker){}; + void clientRespawn(edict_t &ent); + void clientScoreboardMessage(edict_t *ent, edict_t *killer, qboolean log_file){}; + void clientStealthAndFatigueMeter(edict_t *ent); + float clientCalculateWaver(edict_t &ent, int atkID); +}; + +/* +============ +dmstandard_c +============ +*/ + +class dmstandard_c:public gamerules_c +{ +public: + + void levelInit(void); + char *getGameName(void); + int checkItemSpawn(edict_t *ent,Pickup **pickup); + + int dmRule_NO_HEALTH(void); + int dmRule_NO_ITEMS(void); + int dmRule_WEAPONS_STAY(void); + int dmRule_NO_FALLING(void); + int dmRule_REALISTIC_DAMAGE(void); + int dmRule_SAME_LEVEL(void); + int dmRule_NOWEAPRELOAD(void); + int dmRule_TEAMPLAY(void); + int dmRule_NO_FRIENDLY_FIRE(void); + int dmRule_FORCE_RESPAWN(void); + int dmRule_NO_ARMOR(void); + int dmRule_INFINITE_AMMO(void); + int dmRule_SPINNINGPICKUPS(void); + int dmRule_BULLET_WPNS_ONLY(void); + + int arePlayerTeamsOn(void){return(dmRule_TEAMPLAY()?-1:0);} + + void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer); + void clientRespawn(edict_t &ent); + float clientCalculateWaver(edict_t &ent, int atkID); +}; + +/* +============ +dmassassin_c +============ +*/ + +class dmassassin_c:public gamerules_c +{ + const edict_t *getRandomPlayer(edict_t &ent); + void clientConnectAux(edict_t &ent); + void clientDisconnectAux(edict_t &ent); + +public: + + void levelInit(void); + char *getGameName(void){return("assassin DM");} + int checkItemSpawn(edict_t *ent,Pickup **pickup); + + int dmRule_NO_HEALTH(void); + int dmRule_NO_ITEMS(void); + int dmRule_WEAPONS_STAY(void); + int dmRule_NO_FALLING(void); + int dmRule_REALISTIC_DAMAGE(void); + int dmRule_SAME_LEVEL(void); + int dmRule_NOWEAPRELOAD(void); + int dmRule_FORCE_RESPAWN(void); + int dmRule_NO_ARMOR(void); + int dmRule_INFINITE_AMMO(void); + int dmRule_SPINNINGPICKUPS(void); + int dmRule_BULLET_WPNS_ONLY(void); + + int arePlayerNamesOn(void){return 1;} + + void initPlayerDMInfo(edict_t &ent); + void registerPlayerIcons(void); + + void clientConnect(edict_t &ent); + void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer); + void clientDisconnect(edict_t &ent); + void clientEndFrame(edict_t *ent); + void clientHelpMessage(edict_t *ent); + void clientRespawn(edict_t &ent); + void clientScoreboardMessage(edict_t *ent, edict_t *killer, qboolean log_file); +}; + +/* +============ +dmarsenal_c +============ +*/ + +class dmarsenal_c:public gamerules_c +{ + #define ARSENAL_MAXWEAPONS 6 + + int weaponForSlot[ARSENAL_MAXWEAPONS]; + int firstToOneHit; + int resetGame; + + void setWeapons(void); + void giveClientWeapons(edict_t &ent,qboolean newInv); + +public: + + void levelInit(void); + char *getGameName(void){return("arsenal DM");} + int checkItemSpawn(edict_t *ent,Pickup **pickup); + void checkEvents(void); + + int dmRule_NO_HEALTH(void); + int dmRule_NO_ITEMS(void); + int dmRule_NO_FALLING(void); + int dmRule_REALISTIC_DAMAGE(void); + int dmRule_SAME_LEVEL(void); + int dmRule_NOWEAPRELOAD(void) { return(1); } + int dmRule_FORCE_RESPAWN(void); + int dmRule_NO_ARMOR(void); + int dmRule_INFINITE_AMMO(void) { return(1); } + + void initPlayerDMInfo(edict_t &ent); + + void clientConnect(edict_t &ent); + void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer); + void clientDieWeaponHandler(edict_t *ent); + void clientDropItem(edict_t *ent,int type,int ammoCount){}; + void clientDropWeapon(edict_t *ent,int type, int clipSize){}; + void clientHelpMessage(edict_t *ent); + void clientRespawn(edict_t &ent); + void clientScoreboardMessage(edict_t *ent, edict_t *killer, qboolean log_file); +}; + +/* +============ +dmreal_c +============ +*/ + +class dmreal_c:public gamerules_c +{ + const edict_t *getRandomPlayer(edict_t &ent); + +private: + float m_maxUntouchedTime; + float m_itemRetryTime; + multimap m_spawnPoints; + +protected: + void clientSetDroppedWeaponThink(edict_t *ent); + +public: + virtual ~dmreal_c(); + + void preLevelInit(void); + void levelInit(void); + char *getGameName(void){return("real DM");} + int checkItemSpawn(edict_t *ent,Pickup **pickup); + int checkItemAfterSpawn(edict_t *ent,Pickup *pickup); + void respawnUntouchedItem(edict_t *ent); + void setRespawn(edict_t *ent, float delay); + int getMaxEncumbrance(void){return dmRule_REALISTIC_DAMAGE()?4:3;} + + int dmRule_REALISTIC_DAMAGE(void){return 1;} + int dmRule_SAME_LEVEL(void); + int dmRule_TEAMPLAY(void); + int dmRule_FORCE_RESPAWN(void); + int dmRule_SPINNINGPICKUPS(void); + int dmRule_BULLET_WPNS_ONLY(void); + + int allowAutoWeaponSwitch(void){return(0);} + + void initPlayerDMInfo(edict_t &ent); + + float clientCalculateWaver(edict_t &ent, int atkID); + void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer); + float clientGetMovescale(edict_t *ent); + void clientRespawn(edict_t &ent); + void clientStealthAndFatigueMeter(edict_t *ent); + void clientPreDisconnect(edict_t &ent); + void clientDisconnect(edict_t &ent); + + int arePlayerTeamsOn(void){return(dmRule_TEAMPLAY()?-1:0);} + + +}; + +/* +============ +dmctf_c +============ +*/ + +class dmctf_c:public gamerules_c +{ +private: + edict_t *FindFlagEdict(int team); + int num_blue_skins; + int num_red_skins; + team_t CompareSkin(char *skinname, char* teamname); + int NumOfSkins(char *teamname); + void FindSkin(char *teamname, int skinnum); + char NewSkin[100]; + int blue_collected; + int red_collected; + +public: + + char *getGameName(void){return("CTF DM");} + int checkItemSpawn(edict_t *ent,Pickup **pickup); + void levelInit(void); + void AssignTeam(edict_t *ent, char *userinfo); + void FlagCaptured(team_t team); + void ClearFlagCount(void); + bool CaptureLimitHit(int limit); + + + int dmRule_NO_HEALTH(void); + int dmRule_NO_ITEMS(void); + int dmRule_WEAPONS_STAY(void); + int dmRule_NO_FALLING(void); + int dmRule_REALISTIC_DAMAGE(void); + int dmRule_SAME_LEVEL(void); + int dmRule_NOWEAPRELOAD(void); + int dmRule_TEAMPLAY(void){return (1);}; + int dmRule_NO_FRIENDLY_FIRE(void); + int dmRule_FORCE_RESPAWN(void); + int dmRule_NO_ARMOR(void); + int dmRule_INFINITE_AMMO(void); + int dmRule_SPINNINGPICKUPS(void); + int dmRule_BULLET_WPNS_ONLY(void); + int dmRule_FORCEJOIN(void); + + int arePlayerTeamsOn(void){return(1);} + + void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer); + void clientRespawn(edict_t &ent); + void clientScoreboardMessage(edict_t *ent, edict_t *killer, qboolean log_file); + void clientDropItem(edict_t *ent,int type,int ammoCount); + void clientDisconnect(edict_t &ent); + void HitByAttacker(edict_t *body, edict_t *attacker); +}; + +/* +============ +gamemode_c +============ +*/ + +class gamemode_c:public gamemode_ic +{ +private: + + int gametype; + gamerules_c *rules; + +public: + + void setDMMode(int newtype); + int isDM(void){return rules->isDM();} + void preLevelInit(void){rules->preLevelInit();} + void levelInit(void){rules->levelInit();} + char *getGameName(void){return(rules->getGameName());} + int checkItemSpawn(edict_t *ent,Pickup **pickup){return(rules->checkItemSpawn(ent,pickup));} + int checkItemAfterSpawn(edict_t *ent,Pickup *pickup){return(rules->checkItemAfterSpawn(ent,pickup));} + void checkEvents(void){rules->checkEvents();} + void respawnUntouchedItem(edict_t *ent) {rules->respawnUntouchedItem(ent);} + void setRespawn(edict_t *ent, float delay) {rules->setRespawn(ent, delay);} + int getMaxEncumbrance(void){return (rules->getMaxEncumbrance());} + void AssignTeam(edict_t *ent, char* userinfo){rules->AssignTeam(ent, userinfo);} + void ClearFlagCount(void){rules->ClearFlagCount();}; + void FlagCaptured(team_t team){rules->FlagCaptured(team);}; + bool CaptureLimitHit(int limit){return(rules->CaptureLimitHit(limit));}; + + + int dmRule_NO_HEALTH(void){return (rules->dmRule_NO_HEALTH());} + int dmRule_NO_ITEMS(void){return (rules->dmRule_NO_ITEMS());} + int dmRule_WEAPONS_STAY(void){return (rules->dmRule_WEAPONS_STAY());} + int dmRule_NO_FALLING(void){return (rules->dmRule_NO_FALLING());} + int dmRule_REALISTIC_DAMAGE(void){return (rules->dmRule_REALISTIC_DAMAGE());} + int dmRule_SAME_LEVEL(void){return (rules->dmRule_SAME_LEVEL());} + int dmRule_NOWEAPRELOAD(void){return (rules->dmRule_NOWEAPRELOAD());} + int dmRule_TEAMPLAY(void){return (rules->dmRule_TEAMPLAY());} + int dmRule_NO_FRIENDLY_FIRE(void){return (rules->dmRule_NO_FRIENDLY_FIRE());} + int dmRule_FORCE_RESPAWN(void){return (rules->dmRule_FORCE_RESPAWN());} + int dmRule_NO_ARMOR(void){return (rules->dmRule_NO_ARMOR());} + int dmRule_INFINITE_AMMO(void){return (rules->dmRule_INFINITE_AMMO());} + int dmRule_SPINNINGPICKUPS(void){return (rules->dmRule_SPINNINGPICKUPS());} + int dmRule_FORCEJOIN(void){return (rules->dmRule_FORCEJOIN());} + int dmRule_ARMOR_PROTECT(void){return (rules->dmRule_ARMOR_PROTECT());} + int dmRule_BULLET_WPNS_ONLY(void){return (rules->dmRule_BULLET_WPNS_ONLY());} + + int arePlayerNamesOn(void){return (rules->arePlayerNamesOn());} + int arePlayerTeamsOn(void){return (rules->arePlayerTeamsOn());} + int allowAutoWeaponSwitch(void){return (rules->allowAutoWeaponSwitch());} + + float clientCalculateWaver(edict_t &ent, int atkID) { return rules->clientCalculateWaver(ent, atkID);} + void clientConnect(edict_t &ent){rules->initPlayerDMInfo(ent);rules->clientConnect(ent);} + void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer){rules->clientDie(ent, inflictor, killer);} + void clientDieWeaponHandler(edict_t *ent){rules->clientDieWeaponHandler(ent);} + void clientPreDisconnect(edict_t &ent){rules->clientPreDisconnect(ent);} + void clientDisconnect(edict_t &ent){rules->clientDisconnect(ent);} + void clientDropItem(edict_t *ent,int type,int ammoCount){rules->clientDropItem(ent,type,ammoCount);} + void clientDropWeapon(edict_t *ent,int type, int clipSize){rules->clientDropWeapon(ent,type, clipSize);} + void clientEndFrame(edict_t *ent){rules->clientEndFrame(ent);} + float clientGetMovescale(edict_t *ent) { return rules->clientGetMovescale(ent);} + void clientHandlePredn(edict_t &ent){rules->clientHandlePredn(ent);} + void clientHelpMessage(edict_t *ent){rules->clientHelpMessage(ent);} + void clientObituary(edict_t *self, edict_t *inflictor, edict_t *attacker){rules->clientObituary(self,inflictor,attacker);} + void clientRespawn(edict_t &ent){rules->clientRespawn(ent);} + void clientScoreboardMessage(edict_t *ent, edict_t *killer, qboolean log_file){rules->clientScoreboardMessage(ent,killer,log_file);} + void clientStealthAndFatigueMeter(edict_t *ent){rules->clientStealthAndFatigueMeter(ent);} + + bool IsUnprotectedGoreZone(gz_code zone) { return rules->IsUnprotectedGoreZone(zone); } + bool IsLimbZone(gz_code zone) { return rules->IsLimbZone(zone); } + void HitByAttacker(edict_t *body, edict_t *attacker){rules->HitByAttacker(body, attacker);} + bool IsShootableWeapon(char *weaponname){return rules->IsShootableWeapon(weaponname);} + +}; \ No newline at end of file diff --git a/Source/Game/gamecpp/dm_real.cpp b/Source/Game/gamecpp/dm_real.cpp new file mode 100644 index 0000000..c0e7498 --- /dev/null +++ b/Source/Game/gamecpp/dm_real.cpp @@ -0,0 +1,643 @@ +// ***************************************************************************** +// dm_real.cpp +// ***************************************************************************** + +#include "g_local.h" +#include "dm_private.h" +#include "w_weapons.h" +#include "ai_private.h" // so we know what a bodyhuman_c is +#include "q_sh_interface.h" + +const int DF_REAL_SAME_LEVEL = (1<<5); +const int DF_REAL_TEAMPLAY = (1<<7); +const int DF_REAL_FORCE_RESPAWN = (1<<9); +const int DF_REAL_SPINNINGPICKUPS = (1<<12); +const int DF_REAL_BULLET_WPNS_ONLY = (1<<13); + +/* +================= +getPlayerDMInfo +================= +*/ + +static player_dmrealInfo_c *getPlayerDMInfo(const edict_t *ent) +{ + return((player_dmrealInfo_c *)ent->client->dmInfo); +} + +/* +================== +IsRespawningItem +================== +*/ + +int IsRespawningItem(edict_t *ent) +{ // we want to know if ent is an item that should respawn once picked up. stuff + //that falls into this category would be ammo and...uh...ammo. + Pickup *pickup = NULL; + int i = 0; + + if (pickup = thePickupList.GetPickupFromEdict(ent)) + { + if ( (pickup->GetType() == PU_AMMO) || + (pickup->GetType() == PU_ARMOR) || + (pickup->GetType() == PU_INV)) + { + return true; + } + else + { + return false; + } + } + return false; +} + +/* +================== +isSpawnPointFree +================== + + is there room at this spawn point for me? if there's another item there, this + spot ain't free. if there's either nothing or a player there, go ahead and bamf. +*/ + +bool isSpawnPointFree(edict_t *ent, vec3_t& searchAt) +{ + edict_t *found = NULL; + float radius = 128; // should be safe + vec3_t absMinsItem, absMaxsItem, absMinsFound, absMaxsFound; + + CRadiusContent rad(searchAt, radius, RADAREA_SOLIDSANDTRIGGERS); + VectorAdd(searchAt, ent->mins, absMinsItem); + VectorAdd(searchAt, ent->maxs, absMaxsItem); + + for(int i = 0; i < rad.getNumFound(); i++) + { + found = rad.foundEdict(i); + VectorAdd(found->s.origin, found->mins, absMinsFound); + VectorAdd(found->s.origin, found->maxs, absMaxsFound); + + // does the bbox of found intersect with the bbox of ent? + + // x dimension + if ( (absMinsFound[0] < absMaxsItem[0]) && (absMaxsFound[0] > absMinsItem[0]) && + (absMinsFound[1] < absMaxsItem[1]) && (absMaxsFound[1] > absMinsItem[1]) && + (absMinsFound[2] < absMaxsItem[2]) && (absMaxsFound[2] > absMinsItem[2]) ) + { + return false; + } + } + + + + + return true; +} + + +/* +================== +itemReappear +================== +*/ + +void itemReappear(edict_t *ent) +{ + ent->svflags &= ~SVF_NOCLIENT; + ent->solid = SOLID_TRIGGER; + ent->touch_debounce_time = 0.0; + + gi.linkentity(ent); + + // Send a respawning effect. + fxRunner.exec("environ/irespawn", ent->s.origin); + + // 1/4/00 kef -- play a "fade in" anim. at the end of that anim, switch back to non-fade anim. + PickupInst *pickupInst = thePickupList.GetPickupInstFromEdict(ent); + + if (pickupInst) + { + pickupInst->FadeIn(); + } + + // Respawn sound. FIXME: Make part of FX? Not sure about PHS issues here tho'? + gi.sound(ent, CHAN_ITEM, gi.soundindex("dm/irespawn.wav"), .6, ATTN_NORM, 0); + + ent->think = ClearEffects; + ent->nextthink = level.time + ITEM_RESPAWN_FADEIN; +} + + +/* +================== +moveItemToSpawnPoint +================== +*/ + +void moveItemToSpawnPoint(edict_t *ent, vec3_t& dest) +{ + ent->svflags |= SVF_NOCLIENT; + ent->solid = SOLID_NOT; + + // Send a respawning effect. + fxRunner.exec("environ/irespawn", ent->s.origin); + + // actually move the thing + VectorCopy(dest, ent->s.origin); + ent->think = itemReappear; + ent->nextthink = level.time + .1; +} + + +/* +================== +dmreal_c::~dmreal_c +================== +*/ + +dmreal_c::~dmreal_c() +{ + m_spawnPoints.clear(); +} + +/* +================== +dmreal_c::preLevelInit +================== +*/ + +void dmreal_c::preLevelInit(void) +{ + m_spawnPoints.clear(); +} + +/* +================== +dmreal_c::levelInit +================== +*/ + +void dmreal_c::levelInit(void) +{ + // gi.SP_Register("dm_real"); + + // Precache sounds. + + // Make certain all the weapons given to clients at respawn are precached. + + // View weapons. + + AddWeaponTypeForPrecache(SFW_KNIFE); + AddWeaponTypeForPrecache(SFW_PISTOL1); + AddWeaponTypeForPrecache(SFW_HURTHAND); + AddWeaponTypeForPrecache(SFW_THROWHAND); + + // Bolt-ons / pickups. Eugh... but necessary to precache. Knife doesn't + // need to be precached for some reason - it's always there.. hmmm. + + edict_t *ent=G_Spawn(); + + //I_Spawn(ent,thePickupList.GetPickupFromType(PU_WEAPON,SFW_KNIFE)); + I_Spawn(ent,thePickupList.GetPickupFromType(PU_WEAPON,SFW_PISTOL1)); + + G_FreeEdict(ent); + + // This is the amount of time that may pass without a player picking up a + // weapon before said weapon will return to its designer-placed spawn point. + // (in seconds...like you didn't know.) + m_maxUntouchedTime = 30.0; + m_itemRetryTime = 10.0; +} + + +/* +================== +dmreal_c::checkItemSpawn +================== +*/ + +int dmreal_c::checkItemSpawn(edict_t *ent,Pickup **pickup) +{ + + if ((*pickup)->GetPickupListIndex() == OBJ_CTF_FLAG) + { + G_FreeEdict (ent); + return(0); + } + + if(dmRule_NO_ARMOR()) + { + if ((*pickup)->GetType() == PU_ARMOR) + { + G_FreeEdict(ent); + return(0); + } + } + + if(dmRule_BULLET_WPNS_ONLY()) + { + if ( ((*pickup)->GetType() == PU_WEAPON) && (!(*pickup)->IsBulletWpn()) || + ((*pickup)->GetType() == PU_AMMO) && (!(*pickup)->IsBulletAmmo()) ) + { + G_FreeEdict(ent); + return(0); + } + } + + if((*pickup)->GetType() == PU_HEALTH) + { + switch ((*pickup)->GetSpawnParm()) + { + case SFH_LARGE_HEALTH: // big healths become MedKits + { + (*pickup) = thePickupList.GetPickupFromSpawnName("item_equip_medkit"); + } + break; + case SFH_SMALL_HEALTH: // no small healths + G_FreeEdict(ent); + return (0); + break; + default: // other health type (a Medkit, maybe?), spawn it "just in case" + break; + } + } + + + // need to keep track of the spawnpoints for weapons and items + m_spawnPoints.insert(pair((*pickup)->GetPickupListIndex(), ent->s.origin)); + + return(-1); +} + +/* +================== +dmreal_c::clientSetDroppedWeaponThink +================== +*/ + +void dmreal_c::clientSetDroppedWeaponThink(edict_t *ent) +{ +} + +/* +================== +dmreal_c::checkItemAfterSpawn +================== + + Perform a separate check _after_ we call I_Spawn on this item. + In dm_real any dropped weapon needs to return to its designer-placed spawn point after a + predetermined nobody-has-picked-me-up time. To accomplish this, we'll give all dropped items + a think and nextthink right here. +*/ +int dmreal_c::checkItemAfterSpawn(edict_t *ent, Pickup *pickup) +{ + if ( !IsRespawningItem(ent) && (ent->spawnflags & DROPPED_ITEM) ) + { // if this is one of the default weapons (knife or small pistol) treat it like + //vanilla dm does...make it go away if it remains untouched for too long + if ( (pickup->GetPickupListIndex() == OBJ_AMMO_KNIFE) || + (pickup->GetPickupListIndex() == OBJ_AMMO_PISTOL) ) + { + gamerules_c::clientSetDroppedWeaponThink(ent); + } + else + { + // set the nextthink to whatever the nobody-has-picked-me-up-time happens to be. + ent->think = ::respawnUntouchedItem; + ent->nextthink = level.time + m_maxUntouchedTime; + } + } + return 1; +} + +/* +================== +dmreal_c::respawnUntouchedItem +================== + + This item was dropped at some point and hasn't been touched in a while. Move it + to its designer-specified spawn point. +*/ + +void dmreal_c::respawnUntouchedItem(edict_t *ent) +{ + multimap::iterator isp; // isp. heh heh. + int idOfEnt = -1; + Pickup *pickup = NULL; + + if (pickup = thePickupList.GetPickupFromEdict(ent)) + { + idOfEnt = pickup->GetPickupListIndex(); + } + if (-1 == idOfEnt) + { + //bad. + return; + } + for(isp = m_spawnPoints.begin(); isp != m_spawnPoints.end(); isp++) + { // if we find this item's type in isp.first, make sure isp.second is + //unoccupied and try moving the item there. if isp.second is occupied, + //continue through the map and try to find another isp.first with an + //unoccupied isp.second. if there are none available, try again in the + //near future. + if ((*isp).first == idOfEnt) + { + if (isSpawnPointFree(ent, *(vec3_t*)&((*isp).second)) ) + { + // reload the item as well (set its health to -2 so that when it's picked up, we know to reload it...) + ent->health = CLIP_SHOULD_BE_FILLED; + moveItemToSpawnPoint(ent, *(vec3_t*)&((*isp).second) ); + return; + } + } + } + ent->nextthink = level.time + m_itemRetryTime; +} + +/* +================== +dmreal_c::setRespawn +================== +*/ + +void dmreal_c::setRespawn(edict_t *ent, float delay) +{ // in vanilla deathmatch this fn is called when a pickup (specifically a non-dropped item) + //of some sort is touched. when a weapon is picked up in dmreal, though, we don't want it + //to respawn...we want it to go away. + if (!IsRespawningItem(ent)) + { + G_FreeEdict(ent); + } + else + { + gamerules_c::setRespawn(ent, delay); + } +} + +/* +================== +dmreal_c::dmRule_xxx +================== +*/ + +int dmreal_c::dmRule_SAME_LEVEL(void) +{ + return((int)dmflags->value&DF_REAL_SAME_LEVEL); +} + +int dmreal_c::dmRule_TEAMPLAY(void) +{ + return((int)dmflags->value&DF_REAL_TEAMPLAY); +} + +int dmreal_c::dmRule_FORCE_RESPAWN(void) +{ + return((int)dmflags->value&DF_REAL_FORCE_RESPAWN); +} + +int dmreal_c::dmRule_SPINNINGPICKUPS(void) +{ + return((int)dmflags->value&DF_REAL_SPINNINGPICKUPS); +} + +int dmreal_c::dmRule_BULLET_WPNS_ONLY(void) +{ + return((int)dmflags->value&DF_REAL_BULLET_WPNS_ONLY); +} + +/* +================== +dmreal_c::initPlayerDMInfo +================== +*/ + +void dmreal_c::initPlayerDMInfo(edict_t &ent) +{ + if(!ent.client->dmInfo) + ent.client->dmInfo = new player_dmrealInfo_c; +} + +/* +================== +dmreal_c::clientCalculateWaver +================== +*/ + +float dmreal_c::clientCalculateWaver(edict_t &ent, int atkID) +{ + bodyhuman_c *body = NULL; + float waverAmount = 0, speed = 0; + + // check for arm damage. + if (body = (bodyhuman_c*)ent.client->body) + { // IsAimImpeded returns -1 if left arm, 1 if right arm. for now, though, I think + //all we care about is the fact that we took an arm hit + if (body->IsAimImpeded()) + { + waverAmount += 3; // totally guessing here. additionally, shouldn't be hardcoded. + } + } + // check speed + speed = DotProduct(ent.velocity, ent.velocity); + speed *= 3.0 * REALISTIC_MOVESCALE / 80000.0;//max possible miss fire is 30 degrees + waverAmount += speed; + + // check for Sniper rifle, add waver based on zoom + if((atkID == ATK_SNIPER)/* || (atkID == ATK_SNIPER_ALT)*/) + { +// This waver based on a desired maximum waver of 4.5 when not zoomed (fov == 95), +// then a linearly decreasing slope from 2 at minimum zoom (fov == 60), +// to no waver when maximally zoomed (fov == 6). Thus: +// (CurrentFOV - FOV@MaxZoom) * MaxWaver (CurrentFOV - 6) * 2 +// waver = --------------------------------------- = -------------------------- +// (FOV@MinZoom - FOV@MaxZoom) (60 - 6) + + if(ent.client->ps.fov > 60) + { + waverAmount = 4.5; + } + else + { + waverAmount = 0;//((ent.client->ps.fov - 6) * .037); + } + } + + return waverAmount; +} + +/* +================== +dmreal_c::clientDie +================== +*/ + +void dmreal_c::clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer) +{ + // Lose a frag? + + if((!killer.client)||(&killer==&ent)) + { + // I was killed by non player or killed myself. + + if (&killer==&ent) + { + // the killer is me + ent.client->resp.score -= sv_suicidepenalty->value; + } + else + { + ent.client->resp.score--; + } + + return; + } + + // Must've been killed by another player. + + if(meansOfDeath & MOD_FRIENDLY_FIRE) + killer.client->resp.score--; + else + killer.client->resp.score++; +} + +/* +================== +dmreal_c::clientGetMovescale +================== +*/ + +float dmreal_c::clientGetMovescale(edict_t *ent) +{ + // Base move minus any reduction for being crippled. + + return(REALISTIC_MOVESCALE-(REALISTIC_MOVESCALE*ent->client->moveScale)); +} + +/* +================== +dmreal_c::clientRespawn +================== +*/ + +void dmreal_c::clientRespawn(edict_t &ent) +{ + sharedEdict_t sh; + + sh.inv = (inven_c *)ent.client->inv; + sh.edict = &ent; + sh.inv->setOwner(&sh); + + sh.inv->clearInv(true); + + sh.inv->rulesSetWeaponsUseAmmo(-1); + sh.inv->rulesSetDropWeapons(-1); + sh.inv->rulesSetNonDroppableWeaponTypes((1<rulesSetWeaponsReload(-1); + sh.inv->rulesSetWeaponReloadAutomatic(0); + sh.inv->rulesSetBestWeaponMode(Info_ValueForKey(ent.client->pers.userinfo,"bestweap")); + sh.inv->rulesSetDropInvenOnDeath(-1); + sh.inv->rulesSetSelectWithNoAmmo(-1); + sh.inv->rulesSetReloadEmptiesWeapon(-1); + + sh.inv->addWeaponType(SFW_KNIFE); + sh.inv->addWeaponType(SFW_PISTOL1); + sh.inv->addWeaponType(SFW_HURTHAND); + sh.inv->addWeaponType(SFW_THROWHAND); + + sh.inv->addAmmoType(AMMO_KNIFE,6); + sh.inv->addAmmoType(AMMO_9MM,72); + + sh.inv->selectWeapon(SFW_PISTOL1); + + getPlayerDMInfo(&ent)->setFatigueVal(0); + getPlayerDMInfo(&ent)->setFatigued(false); +} + +/* +================== +dmreal_c::clientStealthAndFatigueMeter +================== +*/ + +void dmreal_c::clientStealthAndFatigueMeter(edict_t *ent) +{ + + if(ent->client->pers.spectator) + { + getPlayerDMInfo(ent)->setFatigueVal(0); + getPlayerDMInfo(ent)->setFatigued(false); + + ent->client->ps.stats[STAT_FLAGS]&=~STAT_FLAG_SHOW_STEALTH; + ent->client->ps.stats[STAT_STEALTH]=0; + } + else + { + int running=((ent->client->buttons&BUTTON_RUN)&&(ent->velocity[0]||ent->velocity[1]))?-1:0; + + if(running) + { + getPlayerDMInfo(ent)->setFatigueVal(getPlayerDMInfo(ent)->getFatigueVal()+2); + + if(getPlayerDMInfo(ent)->getFatigueVal()>=255) + { + getPlayerDMInfo(ent)->setFatigueVal(255); + getPlayerDMInfo(ent)->setFatigued(true); + } + } + else + { + int fat=getPlayerDMInfo(ent)->getFatigueVal(); + + if(fat) + { + getPlayerDMInfo(ent)->setFatigueVal(fat-3); + + if(getPlayerDMInfo(ent)->getFatigueVal()<255) + { + getPlayerDMInfo(ent)->setFatigued(false); + if(getPlayerDMInfo(ent)->getFatigueVal()<=0) + { + getPlayerDMInfo(ent)->setFatigueVal(0); + } + } + } + } + + ent->client->ps.stats[STAT_FLAGS]|=STAT_FLAG_SHOW_STEALTH; + ent->client->ps.stats[STAT_STEALTH]=((float)getPlayerDMInfo(ent)->getFatigueVal()/255.0)*100; + } + + if(getPlayerDMInfo(ent)->getFatigued()) + ent->client->ps.pmove.pm_flags|=PMF_FATIGUED; + else + ent->client->ps.pmove.pm_flags&=~PMF_FATIGUED; +} + +/* +================== +dmreal_c::clientPreDisconnect +================== +*/ + +void dmreal_c::clientPreDisconnect(edict_t &ent) +{ + sharedEdict_t sh; + + sh.inv=(inven_c *)ent.client->inv; + sh.edict=&ent; + sh.inv->setOwner(&sh); + sh.inv->dropAllWeapons(); +} + +/* +================== +dmreal_c::clientDisconnect +================== +*/ + +void dmreal_c::clientDisconnect(edict_t &ent) +{ + // close the log file if we have one open + closeLogFile(); +} + diff --git a/Source/Game/gamecpp/dm_standard.cpp b/Source/Game/gamecpp/dm_standard.cpp new file mode 100644 index 0000000..9087b15 --- /dev/null +++ b/Source/Game/gamecpp/dm_standard.cpp @@ -0,0 +1,312 @@ +// ***************************************************************************** +// dm_standard.cpp +// ***************************************************************************** + +#include "g_local.h" +#include "dm_private.h" +#include "w_weapons.h" + +const int DF_STANDARD_NO_HEALTH = (1<<0); +const int DF_STANDARD_NO_ITEMS = (1<<1); +const int DF_STANDARD_WEAPONS_STAY = (1<<2); +const int DF_STANDARD_NO_FALLING = (1<<3); +const int DF_STANDARD_REALISTIC_DAMAGE = (1<<4); +const int DF_STANDARD_SAME_LEVEL = (1<<5); +const int DF_STANDARD_NOWEAPRELOAD = (1<<6); +const int DF_STANDARD_TEAMPLAY = (1<<7); +const int DF_STANDARD_NO_FRIENDLY_FIRE = (1<<8); +const int DF_STANDARD_FORCE_RESPAWN = (1<<9); +const int DF_STANDARD_NO_ARMOR = (1<<10); +const int DF_STANDARD_INFINITE_AMMO = (1<<11); +const int DF_STANDARD_SPINNINGPICKUPS = (1<<12); +const int DF_STANDARD_BULLET_WPNS_ONLY = (1<<13); + +/* +================== +dmstandard_c::getGameName +================== +*/ + +char *dmstandard_c::getGameName(void) +{ + if(dmRule_TEAMPLAY()) + return("TeamPlay DM"); + + return("standard DM"); +} + +/* +================== +dmstandard_c::levelInit +================== +*/ + +void dmstandard_c::levelInit(void) +{ + // Make certain all the weapons given to clients at respawn are precached. + + // View weapons. + + AddWeaponTypeForPrecache(SFW_KNIFE); + AddWeaponTypeForPrecache(SFW_PISTOL1); + AddWeaponTypeForPrecache(SFW_HURTHAND); + AddWeaponTypeForPrecache(SFW_THROWHAND); + + // Bolt-ons / pickups. Eugh... but necessary to precache. Knife doesn't + // need to be precached for some reason - it's always there.. hmmm. + + edict_t *ent=G_Spawn(); + + //I_Spawn(ent,thePickupList.GetPickupFromType(PU_WEAPON,SFW_KNIFE)); + I_Spawn(ent,thePickupList.GetPickupFromType(PU_WEAPON,SFW_PISTOL1)); + + G_FreeEdict(ent); +} + +/* +================== +dmstandard_c::checkItemSpawn +================== +*/ + +int dmstandard_c::checkItemSpawn(edict_t *ent,Pickup **pickup) +{ + + if ((*pickup)->GetPickupListIndex() == OBJ_CTF_FLAG) + { + G_FreeEdict (ent); + return(0); + } + + if(dmRule_NO_HEALTH()) + { + if ((*pickup)->GetType() == PU_HEALTH) + { + G_FreeEdict (ent); + return(0); + } + } + + if(dmRule_NO_ITEMS()) + { + if ((*pickup)->GetType() == PU_INV) + { + G_FreeEdict (ent); + return(0); + } + } + + if(dmRule_NO_ARMOR()) + { + if ((*pickup)->GetType() == PU_ARMOR) + { + G_FreeEdict (ent); + return(0); + } + } + + if(dmRule_INFINITE_AMMO()) + { + if ((*pickup)->GetType() == PU_AMMO) + { + G_FreeEdict (ent); + return(0); + } + } + + if(dmRule_BULLET_WPNS_ONLY()) + { + if ( ((*pickup)->GetType() == PU_WEAPON) && (!(*pickup)->IsBulletWpn()) || + ((*pickup)->GetType() == PU_AMMO) && (!(*pickup)->IsBulletAmmo()) ) + { + G_FreeEdict (ent); + return(0); + } + } + + return(-1); +} + +/* +================== +dmstandard_c::dmRule_xxx +================== +*/ + +int dmstandard_c::dmRule_NO_HEALTH(void) +{ + return((int)dmflags->value&DF_STANDARD_NO_HEALTH); +} + +int dmstandard_c::dmRule_NO_ITEMS(void) +{ + return((int)dmflags->value&DF_STANDARD_NO_ITEMS); +} + +int dmstandard_c::dmRule_WEAPONS_STAY(void) +{ + return((int)dmflags->value&DF_STANDARD_WEAPONS_STAY); +} + +int dmstandard_c::dmRule_NO_FALLING(void) +{ + return((int)dmflags->value&DF_STANDARD_NO_FALLING); +} + +int dmstandard_c::dmRule_REALISTIC_DAMAGE(void) +{ + return((int)dmflags->value&DF_STANDARD_REALISTIC_DAMAGE); +} + +int dmstandard_c::dmRule_SAME_LEVEL(void) +{ + return((int)dmflags->value&DF_STANDARD_SAME_LEVEL); +} + +int dmstandard_c::dmRule_NOWEAPRELOAD(void) +{ + return((int)dmflags->value&DF_STANDARD_NOWEAPRELOAD); +} + +int dmstandard_c::dmRule_TEAMPLAY(void) +{ + return((int)dmflags->value&DF_STANDARD_TEAMPLAY); +} + +int dmstandard_c::dmRule_NO_FRIENDLY_FIRE(void) +{ + return((int)dmflags->value&DF_STANDARD_NO_FRIENDLY_FIRE); +} + +int dmstandard_c::dmRule_FORCE_RESPAWN(void) +{ + return((int)dmflags->value&DF_STANDARD_FORCE_RESPAWN); +} + +int dmstandard_c::dmRule_NO_ARMOR(void) +{ + return((int)dmflags->value&DF_STANDARD_NO_ARMOR); +} + +int dmstandard_c::dmRule_INFINITE_AMMO(void) +{ + return((int)dmflags->value&DF_STANDARD_INFINITE_AMMO); +} + +int dmstandard_c::dmRule_SPINNINGPICKUPS(void) +{ + return((int)dmflags->value&DF_STANDARD_SPINNINGPICKUPS); +} + +int dmstandard_c::dmRule_BULLET_WPNS_ONLY(void) +{ + return((int)dmflags->value&DF_STANDARD_BULLET_WPNS_ONLY); +} + +/* +================== +dmstandard_c::clientCalculateWaver +================== +*/ + +float dmstandard_c::clientCalculateWaver(edict_t &ent, int atkID) +{ + float waverAmount = 0; + + // check for Sniper rifle, add waver based on zoom + if((atkID == ATK_SNIPER)/* || (atkID == ATK_SNIPER_ALT)*/) + { +// This waver based on a desired maximum waver of 4.5 when not zoomed (fov == 95), +// then a linearly decreasing slope from 2 at minimum zoom (fov == 60), +// to no waver when maximally zoomed (fov == 6). Thus: +// (CurrentFOV - FOV@MaxZoom) * MaxWaver (CurrentFOV - 6) * 2 +// waver = --------------------------------------- = -------------------------- +// (FOV@MinZoom - FOV@MaxZoom) (60 - 6) + + if(ent.client->ps.fov > 60) + { + waverAmount = 4.5; + } + else + { + waverAmount = 0;//((ent.client->ps.fov - 6) * .037); + } + } + + return waverAmount; +} + + +/* +================== +dmstandard_c::clientDie +================== +*/ + +void dmstandard_c::clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer) +{ + // Lose a frag? + + if((!killer.client)||(&killer==&ent)) + { + // I was killed by non player or killed myself. + + + if (&killer==&ent) + { + // the killer is me + ent.client->resp.score -= sv_suicidepenalty->value; + } + else + { + ent.client->resp.score--; + } + + return; + } + + // Must've been killed by another player. + + if(meansOfDeath & MOD_FRIENDLY_FIRE) + killer.client->resp.score--; + else + killer.client->resp.score++; +} + +/* +================== +dmstandard_c::clientRespawn +================== +*/ + +void dmstandard_c::clientRespawn(edict_t &ent) +{ + sharedEdict_t sh; + + sh.inv = (inven_c *)ent.client->inv; + sh.edict = &ent; + sh.inv->setOwner(&sh); + + sh.inv->clearInv(true); + + sh.inv->rulesSetWeaponsUseAmmo(dm->dmRule_INFINITE_AMMO()?0:-1); + sh.inv->rulesSetWeaponsReload(dm->dmRule_NOWEAPRELOAD()?0:-1); + sh.inv->rulesSetBestWeaponMode(Info_ValueForKey(ent.client->pers.userinfo,"bestweap")); + sh.inv->rulesSetDropWeapons(!dm->dmRule_WEAPONS_STAY()); + sh.inv->rulesSetNonDroppableWeaponTypes(1<dmRule_REALISTIC_DAMAGE()) + sh.inv->rulesSetNonDroppableWeaponTypes(1<addWeaponType(SFW_KNIFE); + sh.inv->addWeaponType(SFW_PISTOL1); + sh.inv->addWeaponType(SFW_HURTHAND); + sh.inv->addWeaponType(SFW_THROWHAND); + + if(!dm->dmRule_INFINITE_AMMO()) + { + sh.inv->addAmmoType(AMMO_KNIFE,6); + sh.inv->addAmmoType(AMMO_9MM,150); + } + + sh.inv->selectWeapon(SFW_PISTOL1); +} \ No newline at end of file diff --git a/Source/Game/gamecpp/ds.cpp b/Source/Game/gamecpp/ds.cpp new file mode 100644 index 0000000..b9bd869 --- /dev/null +++ b/Source/Game/gamecpp/ds.cpp @@ -0,0 +1,7679 @@ +#include "g_local.h" +#define WIN32_LEAN_AND_MEAN +#define VC_EXTRALEAN +#include +#include "ds.h" +#include "w_weapons.h" + +#define SCRIPT_SAVE_VERSION 3 +#define ROFF_VERSION 1 // ver # for the (R)otation (O)bject (F)ile (F)ormat for script command "moverotate" +#define ROFF_EOS_MARKER 10000 +vec3_t v3ROFF_EOS_Marker = {ROFF_EOS_MARKER, ROFF_EOS_MARKER, ROFF_EOS_MARKER}; + +list GlobalVariables; +list Scripts; +map ROFFs; + +// used to indicate the first call to CScript::Think() _after_ the player decided +//to skip the cinematic +bool bClearCinematicSounds = true; + +// marks the start time of a cinematic (more or less) +float s_cinematicStartTime = 0; + +// hmmm, clean up duplicates... +#define UNKNOWN 0 +#define RUN 1 +#define JUMP 2 +#define DEATH 5 +#define DEATHTHROWN 6 +#define DUCK_DN 7 +#define DUCK_MID 8 +#define DUCK_UP 9 +#define DUCK_SHOOT 10 +#define IDLE 11 +#define IDLESTRETCH 12 +#define IDLELOOK 13 +#define SHOOT 14 +#define WALK 15 +#define GUN_IDLE 17 +#define AFRAIDRUN 19 + +#define STD_ICLEANGUN_N_A_N 20 +#define STD_ILOOKING_N_A_A 21 +#define STD_IMONITORUP_N_A_N 22 +#define STD_ITALK_N_A_N 23 +#define STD_ITALKGEST1_N_A_N 24 +#define STD_ITALKGEST2_N_A_N 25 +#define STD_ITALKGEST3_N_A_N 26 +#define STD_IWIPEBROW_N_A_N 27 +#define STD_ILOOKING_N_MRS_2 29 + +#define STD_XALARMPUSH_N_A_N 30 +#define STD_ISTAND_N_MRS_2 31 +#define STD_ITALK_N_MRS_2 32 +#define STD_ITURNVALVE_FRM_N_N 33 +#define STD_ITURNVALVE_N_N_N 34 +#define STD_ITURNVALVE_TO_N_N 35 +#define STD_JDROP_N_A_A 36 +#define STD_MKICKLOW_N_A_A 37 +#define STD_MPISTOLWHIP_N_P_N 38 +#define STD_SINBACK_2FRNT_N_N 39 + +#define STD_XYELLPOINT_FWD_A_N 40 +#define STD_XYELLWAVE_BK_A_N 41 +#define STD_FATTITUDE_N_P_A 42 +#define LS_XGETKICKED_N_N_N 43 +#define SI_XBYWALL_N_N_N 44 +#define STD_SSTUMBLE_2BK_P_N 45 +#define STD_WPUSH_N_N_N 46 +#define STD_XAFRAIDSHAKE_N_N_N 47 +#define STD_XKICKDOOR_N_A_A 48 +#define STD_XYELLATYOU_N_A_A 49 + +#define STD_WCARRY1_N_N_N 50 +#define STD_WNORMAL_N_PK_A 51 +#define STD_WPATROL_N_MRS_2 52 +#define STD_WBCKSIGNAL_N_N_N 53 +#define STD_ILEANLOOK_FRM_PK_N 54 +#define STD_ILEANLOOK_MID_PK_N 55 +#define STD_ILEANLOOK_TO_PK_N 56 +#define STD_JDOWN_N_A_A 57 +#define STD_F_FWD_P_2 58 +#define STD_F_FWD_S_2 59 + +#define STD_R_N_MRS_2 60 +#define STD_R_N_PK_N 61 +#define STD_RGUNUP_N_P_2 62 +#define STD_XDONTSHOOT_N_A_N 63 +#define STD_XFEARWAVE_N_N_N 64 +#define STD_FCORNERPEAK_LT_P_A 65 +#define STD_FCORNERPEAK_RT_P_A 66 +#define STD_IALERT_N_P_N 67 +#define STD_ICLEANGUN2_N_MRS_2 68 +#define STD_IMONITORUP2_N_A_N 69 + +#define STD_JDIVE2PRONE_N_A_N 70 +#define STD_RAFRAID_N_N_N 71 // duplicate of AFRAIDRUN +#define STD_SBLOWN_2BK_N_N 72 +#define STD_XBOOMCROUCH_N_A_N 73 +#define STD_XTUMBLE_2FRNT_N_N 74 +#define STD_JRUN_FWD_A_A 75 +#define STD_ISMOKE_FRM_A_N 76 +#define STD_ISMOKE_N_A_N 77 +#define STD_ISMOKE_TO_A_N 78 +#define STD_ITOUCHNUTS_N_A_N 79 + +#define CCH_XCROUCH_UP_MRS_2 80 +#define CCH_XCROUCH_UP_PK_A 81 +#define CCH_A_FWD_P_2 82 +#define CCH_A_FWD_R_2 83 +#define CCH_SONKNEES_2FRNT_N_N 84 +#define CCH_XONKNEES_N_N_N 85 +#define CCH_XCCHCOWER_MID_A_A 86 +#define CCH_XCCHCOWER_MID2_A_A 87 +#define PRN_XCOVERHEAD_N_A_A 88 +#define STD_SVIOLENT_N_N_N 89 + +#define LB_PGENERICDIE_N_N_N 90 +#define STD_WATTITUDE_N_PK_A 91 +#define STD_WJOG_N_MRS_2 92 +#define STD_WJOGGUNDWN_N_P_2 93 +#define STD_WJOGGUNUP_N_P_A 94 +#define STD_WPUSHCART_N_N_N 95 +#define STD_FAUTOSWEEP_N_PM_A 96 +#define STD_FGANGBANGER_N_M_2 97 +#define STD_FSWATSTYLE_FWD_M_2 98 + +#define SCRIPT_RELEASE 99 + +#define STD_FVIOLENT_DWN_M_2 100 +#define STD_FVIOLENT_DWN_P_N 101 +#define STD_JUPTO_N_A_A 102 +#define STD_MNINJAKICK_N_A_B 103 +#define STD_MRIFLEBUTT_N_MRS_2 104 +#define STD_R_DWNST_MRS_2 105 +#define STD_RAIMSTRAF_LT_MRS_2 106 +#define STD_RAIMSTRAF_LT_P_CBN 107 +#define STD_RAIMSTRAF_RT_MRS_2 108 +#define STD_RAIMSTRAF_RT_P_CBN 109 + +#define STD_RBACKAIM_N_MRS_2 110 +#define STD_RBACKAIM_N_P_2 111 +#define STD_SFALLFWD_2FRNT_N_N 112 +#define STD_SSTUMBLE_2FRNT_N_N 113 +#define STD_XCCHCOWER_DWN_A_A 114 +#define STD_XCHOKE_N_N_N 115 +#define STD_XDANCE_N_N_N 116 +#define STD_XGOPRONE_N_A_A 117 +#define STD_XLADDER_DWN_A_A 118 +#define STD_XLADDER_UP_A_A 119 + +#define STD_XROLL_LT_A_A 120 +#define STD_XROLL_RT_A_A 121 +#define STD_XROLLTOCCH_FWD_A_A 122 +#define STD_XSTARTLED_N_A_A 123 +#define STD_XSTUMBLE_N_A_A 124 +#define SI_ISIT_N_A_A 125 +#define SI_XALERTSTAND_UP_A_A 126 +#define PRN_C_N_A_2 127 +#define PRN_XCOVERHEAD_TO_A_A 128 +#define PRN_XFALLING_N_N_N 129 + +#define PRN_XFALLLAND_N_N_N 130 +#define PRN_XTOSTAND_N_A_A 131 +#define CCH_RAIM_FWD_MRS_2 132 +#define CCH_RAIM_FWD_P_2 133 +#define CCH_XCCHCOWER2_MID_A_A 134 +#define LB_PCRAWL_BCK_A_N 135 // missspellled. this is actually #define LB_PCRAWL_BK_A_N +#define LB_XLEANUPSHOOT_N_P_N 136 +#define CCH_A_FWD_MS_2 137 +#define CCH_F_FWD_L_2 138 +#define CCH_RAIM_N_L_2 139 + +#define CCH_TLOBGRENADE_N_A_N 140 +#define STD_ECHOKEKNEES_TO_N_N 141 +#define CCH_ECHOKEKNEES_N_N_N 142 +#define CCH_ECHOKEDEATH_N_N_N 143 +#define STD_SELECTROCUTE_N_N_N 144 +#define STD_EOFFLADDER_UP_A_N 145 +#define STD_EPOUNDDOOR_N_A_N 146 +#define STD_F_FWD_R_2 147 + +#define STD_EBUSTGLASS_N_MRS_2 148 +#define STD_ECOMEHERE_N_A_N 149 + +#define STD_EFALLDEATH_N_N_N 150 +#define STD_EFALLIMPACT_N_N_N 151 +#define STD_EFLIPTABLE_N_A_N 152 +#define STD_EPUSHBUTTONS_N_N_N 153 +#define STD_EPUSHCRATE_N_N_N 154 +#define STD_ESIGNALALARM_N_A_N 155 +#define STD_ETYPING_N_N_N 156 +#define STD_EWALL2WALK_N_MRS_2 157 +#define STD_EWALL2WALK_N_PK_N 158 +#define STD_EWALLIDLE_N_MRS_2 159 + +#define STD_EWALLIDLE_N_PK_N 160 +#define STD_EWALLLOOK_LT_MRS_2 161 +#define STD_EWALLLOOK_LT_PK_N 162 +#define STD_EWALLLOOK_RT_MRS_2 163 +#define STD_EWALLLOOK_RT_PK_N 164 +#define STD_EWRENCHH_FRM_N_N 165 +#define STD_EWRENCHH_N_N_N 166 +#define STD_EWRENCHH_TO_N_N 167 +#define STD_EWRENCHV_FRM_N_N 168 +#define STD_EWRENCHV_N_N_N 169 + +#define STD_EWRENCHV_TO_N_N 170 +#define STD_ASHUFFLE_N_P_2 171 +#define STD_ASHUFFLE_N_P_A 172 +#define STD_ASHUFFLE_N_MS_2 173 +#define STD_ASHUFFLE_N_R_2 174 +#define STD_ASHUFFLE_N_L_2 175 +#define STD_IPISS_N_A_A 176 + +#define STD_ATHREAT_DWN_P_N 177 +#define STD_ATHREAT_FWD_P_N 178 +#define STD_ATHREATYEL_DWN_P_N 179 + +#define STD_ATHREATYEL_FWD_P_N 180 +#define STD_EEXAMINEWALL_N_A_N 181 + +#define STD_ERAGESHOOT_N_P_N 182 +#define STD_ESABREMOCK_N_A_N 183 +#define STD_RTOSTOP_N_PK_N 184 +#define STD_ETALKBOTH_N_A_N 185 +#define STD_ETALK_N_A_N 186 +#define STD_EHEADNOD_N_A_N 187 +#define STD_EHEADSHAKE_N_A_N 188 +#define STD_EJUMPRAIL_N_A_N 189 + +#define STD_WTOSTOP_N_PK_A 190 +#define STD_ESPIN180_LT_A_N 191 +#define STD_ESPIN180_RT_A_N 192 +#define STD_ETORUN_N_P_N 193 +#define STD_ILEAN_N_P_N 194 +#define STD_WBACKAIM_N_MS_2 195 +#define STD_ETALKRIGHT_N_A_N 196 + +#define STD_ECLIMBLEDG_DWN_A_N 197 +#define STD_ECLIMBLEDG_MID_A_N 198 +#define STD_ECLIMBLEDGE_UP_A_N 199 + +#define STD_EDROPGRENADE_N_A_N 200 +#define STD_EFRMSHADOW_N_MRS_2 201 +#define STD_EFRMSHADOW_N_P_N 202 +#define STD_EHANDTALK_FRM_P_N 203 +#define STD_EHANDTALK_N_P_N 204 + +#define STD_EHANDTALK_TO_MRS_N 205 +#define STD_EHANDTALK_TO_P_N 206 +#define STD_EHANDTALK_FRM_MRS_N 207 +#define STD_EHEADSET_FRM_P_N 208 +#define STD_EHEADSET_MID_P_N 209 + +#define STD_EHEADSET_TO_P_N 210 +#define STD_ESALUTE_FRM_MRS_N 211 +#define STD_ESALUTE_N_MRS_N 212 +#define STD_ESALUTE_TO_MRS_N 213 +#define STD_ETALKLEFT_N_A_N 214 + +#define STD_ETALKLKLT_FRM_A_N 215 +#define STD_ETALKLKLT_MID_A_N 216 +#define STD_ETALKLKLT_TO_A_N 217 +#define STD_ETALKLKRT_FRM_A_N 218 +#define STD_ETALKLKRT_MID_A_N 219 + +#define STD_ETALKLKRT_TO_A_N 220 +#define STD_ETORUN_N_MRS_2 221 +#define STD_ETURN90_LT_A_N 222 +#define STD_ETURN90_RT_A_N 223 +#define STD_IGUNUP_N_A_N 224 + +#define STD_RONFIRE_N_N_N 225 +#define STD_RONFIRETODTH_N_N_N 226 +#define STD_RTOSTOP_N_MRS_2 227 +#define STD_SSHOULDER_LT_N_N 228 +#define STD_SUNHURT_BK_PK_N 229 + +#define STD_EDROPCROUCH_N_A_A 230 +#define STD_TRUN_N_A_N 231 +#define STD_W_N_PN_N 232 +#define STD_WCARRY2_N_N_N 233 +#define STD_WTALK_LT_MRS_2 234 + +#define A4_ASCRAMBLE_N_A_N 235 +#define CCH_ENODLEFT_N_A_A 236 +#define CCH_ENODRIGHT_N_A_A 237 +#define CCH_ESCANTALK_LT_A_A 238 +#define CCH_ESCANTALK_RT_A_A 239 + +#define CCH_IREADY_N_A_A 240 +#define STD_FAUTOSWEEP_N_M_2 241 +#define STD_L_N_MS_2 242 +#define STD_ISTAND_N_A_N 243 +#define STD_ECHOKESHOOT_N_A_N 244 + +#define STD_SONFIRE_2BK_N_N 245 +#define STD_ETALK_FRM_A_N 246 +#define STD_ETALK_TO_A_N 247 +#define STD_JDROP_TO_A_N 248 +#define STD_ATHREATSHT_DWN_P_N 249 + +#define LB_PHOLDLEG_LT_N_N 250 +#define STD_XCOCK_N_S_2 251 +#define STD_STOKNEES_2BK_N_N 252 +#define STD_SGUT_2SIDE_N_N 253 +#define STD_XLADDERFRM_UP_A_A 254 + +#define STD_SGUNFROMHAND_N_N_N 255 +#define CCH_ETOSTAND_N_A_N 256 +#define STD_ININJA_N_P_N 257 +#define STD_XHANDSPRING_FWD_A_N 258 +#define STD_EGANGSALUTE_N_A_N 259 + +#define STD_WBACKWARDS_N_A_N 260 +#define STD_SSABREDEATH_BK_N_N 261 +#define STD_WSTEALTH_N_PK_N 262 +#define STD_JTHROWSTAR_FWD_A_N 263 +#define PRN_A_N_A_2 264 + +#define STD_EYELL_N_A_N 265 +#define STD_IALERTLK_RT_MRS_2 266 +#define STD_EPUSHBUTTONH_N_A_N 267 +#define STD_IALERT_N_MRS_2 268 +#define STD_RDYNAMIC_N_A_N 269 + +#define STD_WAIM_FWD_P_2 270 +#define STD_A_FWD_P_2 271 +#define STD_IETALKPOSE_N_A_N 272 +#define STD_FRAPIDSWEEP_LT_P_2 273 +#define STD_IALERTTRN_LT_P_N 274 + +#define STD_ESUPRISE90_LT_A_N 275 +#define STD_FAUTOSWEEP_UP_M_2 276 +#define STD_XATKPAUSE1_N_MRS_2 277 +#define LB_PCRAWL_BK_P_N 278 //mmoves[235] +#define SI_EWALLIDLE_N_A_N 279 + +#define SI_EWALLTALK_N_A_N 280 +#define STD_ETOAIM_N_P_2 281 +#define STD_A_UP_P_2 282 //mmoves[243] +#define SI_EWALLFEAR_N_A_N 283 +#define STD_ESALUTE_TO_A_N 284 + +#define STD_ESALUTE_N_A_N 285 +#define STD_ESALUTE_FRM_A_N 286 +#define STD_ESALUTATIONS_N_A_N 287 +#define STD_ECLIMBSHAFT_N_A_N 288 +#define STD_XATKPAUSE2_N_PK_N 289 //mmoves[85] + +#define CCH_W_N_A_N 290 +#define CCH_EWALK2CCH_N_A_N 291 +#define CCH_ETALK_DWN_P_N 292 +#define STD_ITALKPOSE_UP_A_N 293 +#define CCH_ITALKPOSE_DWN_A_N 294 + +#define STD_ETALK_UP_A_N 295 +#define CCH_EHEADNOD_N_A_N 296 +#define CCH_ECCH2WALK_N_A_N 297 +#define STD_XATKPAUSE1_N_PK_N 298 //mmoves[84] +#define STD_WFAST_N_A_N 299 + +#define STD_ERAGEIDLE_N_P_N 300 +#define CCH_XCCHCOWER_UP_A_A 301 +#define STD_IETALKPOSE_RT_A_N 302 +#define STD_EBOOKLOOK_N_A_N 303 +#define STD_EBOOKSCAN_N_A_N 304 + +#define STD_XOPENDOOR_N_A_N 305 +#define STD_XCROUCH_DWN_PK_A 306 +#define CCH_EHEADSET_FRM_A_N 307 +#define CCH_EHEADSET_MID_A_N 308 +#define STD_SHEAD_2FRNT_N_N 309 + +#define STD_W_N_MRS_2 310 +#define STD_EDKRAIM_N_A_N 311 +#define CCH_EHAWKKNEES_N_N_N 312 +#define STD_EDKRAIMTALK_N_A_N 313 +#define STD_EDKRFIRELK_RT_A_N 314 + +#define CCH_EHAWKDEATH_N_N_N 315 +#define CCH_EHAWKKNEETLK_N_N_N 316 +#define CCH_EHAWKCROUCH_N_A_N 317 +#define CCH_EHEADSET_TO_A_N 318 +#define LB_ESLIDE_N_PK_N 319 + +#define STD_A_FWD_P_CB 320 +#define STD_IGUNUPLOOK_N_A_N 321 +#define STD_FRAPID_N_P_2 322 +#define STD_EDKRAIMLK_FWD_A_N 323 +#define STD_EWHIRL_RT_A_N 324 + +#define STD_FSWEEPUP_FRM_A_A 325 +#define STD_FSWEEPUP_TO_A_A 326 +#define STD_XTAKECOVER_N_A_N 327 +#define STD_ESABREBLUFF_N_A_A 328 +#define STD_EAUTOSWEEP_N_PM_A 329 + +#define CCH_F_FWD_S_2 330 +#define STD_F_FWD_P_CB 331 +#define STD_SOUTWINDOW_N_A_N 332 +#define STD_XCROUCH_DWN_MRS_2 333 +#define STD_XCROUCH_DWN_P_2 334 + +#define STD_TGRENADE_N_A_N 335 +#define STD_TUNDER_N_A_N 336 +#define CCH_XCROUCH_UP_L_2 337 +#define STD_XCROUCH_DWN_L_2 338 +#define STD_XCROUCH_DWN_P_A 339 + +#define STD_RAIM_N_MRS_2 340 +#define STD_WFIRE_FWD_MS_2 341 +#define CCH_AFIRE_FWD_MS_2 342 +#define STD_F_FWD_M_2 343 +#define CCH_F_FWD_M_2 344 + +#define STD_EPUSHOVER_N_PK_A 345 +#define STD_EMERCHALL_N_A_A 346 +#define STD_EMERCHONE_N_A_A 347 +#define STD_IEMERCHANT_N_A_A 348 +#define STD_EMERCHWAVE_RT_A_A 349 + +#define STD_EMERCHTALK_N_A_A 350 +#define STD_EMERCHWAVE_LT_A_A 351 +#define STD_EBEG_N_A_A 352 +#define STD_ICLEANGUN2_N_PK_N 353 +#define CCH_XCCHCOWER_N_A_N 354 + + +#define HELI_TAKEOFF 1 +#define HELI_LAND 2 +#define HELI_REPAIR 3 +#define HELI_REARM 4 +#define HELI_GOTO_COORDS 5 +#define HELI_GOTOREL_ENTITY 6 +#define HELI_GOTOREL_ENT_X 7 +#define HELI_GOTOREL_ENT_Y 8 +#define HELI_GOTOREL_ENT_Z 9 +#define HELI_MOVEREL 10 +#define HELI_PAUSE 11 +#define HELI_FACE_RELENT 12 +#define HELI_FACE_ABSCOORDS 13 +#define HELI_FACE_ABSDIR 14 +#define HELI_FACE_RELCOORDS 15 +#define HELI_PILOT_FACERELENT 16 +#define HELI_PILOT_FACERELCOORDS 17 +#define HELI_PILOT_FACEABSCOORDS 18 +#define HELI_GUNNER_FACERELENT 19 +#define HELI_GUNNER_FACERELCOORDS 20 +#define HELI_GUNNER_FACEABSCOORDS 21 +#define HELI_STRAFE_RT 22 +#define HELI_STRAFE_LT 23 +#define HELI_ROCKETS_ENABLE 24 +#define HELI_ROCKETS_DISABLE 25 +#define HELI_CHAINGUN_ENABLE 26 +#define HELI_CHAINGUN_DISABLE 27 +#define HELI_FIREAT_RELENT 28 +#define HELI_FIREAT_ABSCOORDS 29 +#define HELI_FIREAT_RELCOORDS 30 +#define HELI_AUTOFIRE_ON 31 +#define HELI_AUTOFIRE_OFF 32 +#define HELI_HOVER_PASSIVE 33 +#define HELI_HOVER_AGGRESSIVE 34 +#define HELI_SET_WORLDMINS 35 +#define HELI_SET_WORLDMAXS 36 +#define HELI_SET_MAXHEALTH 37 +#define HELI_SET_HEALTH 38 +#define HELI_SET_DEATHDEST 39 +#define HELI_SET_TRACEDIMS 40 +#define HELI_AI 41 +#define HELI_WAYPOINT 42 +#define HELI_VOLUME 43 +#define HELI_VOLUMEMINS 44 +#define HELI_VOLUMEMAXS 45 +#define HELI_DEBUG 46 +#define HELI_CHANGE_SKIN 47 +#define HELI_CHANGE_BODY 48 +#define HELI_OUT_OF_CONTROL 49 + + +#define TANK_GOTOCOORDS 1 +#define TANK_FIRECANNONATCOORDS 2 +#define TANK_MACHGUNAUTO 3 +#define TANK_DIE 4 +#define TANK_AIMTURRET 5 + +#include "ai_private.h" +#include "m_heliai.h" +#include "m_tankai.h" + +extern void Use_Multi(edict_t *self, edict_t *other, edict_t *activator); +extern void c_swapplayer(edict_t *Self,edict_t *Cinematic); +extern void remove_non_cinematic_entites(edict_t *owner); +extern void reinstate_non_cinematic_entites(edict_t *owner); +extern cvar_t *Cvar_Set (char *var_name, char *value); + + +// kef -- begin/end cinematic mode +void CinematicFreeze(bool bEnable) +{ + if (bEnable) + { + // kef -- mid-air thrown knives can telefrag cinematic actors, so remove the knives + edict_t *curEnt = NULL; + for (int i = 1; i < globals.num_edicts; i++) + { + curEnt = &g_edicts[i]; + if (curEnt && (curEnt->owner == &g_edicts[1])) + { // if this is a knife thrown by the player, remove it + if (curEnt->health == 31337) + { // it's a thrown knife all right + G_FreeEdict(curEnt); + } + } + } + // make sure this cvar-setting stuff happens _after_ setting the client's remotecameratype + if (g_edicts[1].client) + { + // we just started a cinematic. adjust the proper cvar. + if (!game.cinematicfreeze) + { + game.cinematicfreeze = 1; + + // need to make sure these commands don't stay...uh...commanded during the script + gi.AddCommandString ("-attack\n"); + gi.AddCommandString ("-altattack\n"); + gi.AddCommandString ("-weaponExtra1\n"); + gi.AddCommandString ("-weaponExtra2\n"); + gi.AddCommandString ("-use\n"); + + if(g_edicts[1].client->inv) + { + sharedEdict_t sh; + + sh.inv = (inven_c *)g_edicts[1].client->inv; + sh.edict = &g_edicts[1]; + sh.inv->setOwner(&sh); + + g_edicts[1].client->inv->deactivateCurrentWeapon(); + } + } + } + } + else + { + if (sv_jumpcinematic->value == 2) // Jump sent from client + { + gi.cvar_set("sv_jumpcinematic","0"); + // if we cleared the sound buffer on the client because we skipped a cinematic, + //reset the proper cvar + gi.cvar_set("s_disable", "0"); + } + game.cinematicfreeze = 0; + + // note the fact that we'll need to clear sounds the next time we + //skip a cinematic + bClearCinematicSounds = true; + + +/* kef -- I'm not sure about this 'cinematic entities' stuff + + reinstate_non_cinematic_entites(NULL); +*/ + // undo the stuff from ai_c::think() + int i = 0; + + for (i = 0; i < globals.num_edicts; i++) + { + if (g_edicts[i].ai) + { + if (255 == g_edicts[i].count) + { // this guy was used by the cinematic that just ended. de-flag him. + g_edicts[i].count = 0; + } + else if (g_edicts[i].flags & FL_CINEMATIC_CULL) + { // if he's got ai and we didn't use him in the cinematic, reset the stuff + //we mucked with in ai_c::think() + g_edicts[i].nextthink = level.time - g_edicts[i].nextthink; + g_edicts[i].solid = SOLID_BBOX; + g_edicts[i].flags &= ~FL_CINEMATIC_CULL; + if (g_edicts[i].ghoulInst) + { + g_edicts[i].ghoulInst->SetOnOff(true, level.time); + } + } + } + } + } +} + +//========================================================================== + +typedef struct RestoreList_s +{ + int ID; + void *(*alloc_func)(void *); +} RestoreList_t; + +void *RF_IntVar(void *Data) +{ + return new IntVar((CScript *)Data); +} + +void *RF_FloatVar(void *Data) +{ + return new FloatVar((CScript *)Data); +} + +void *RF_VectorVar(void *Data) +{ + return new VectorVar((CScript *)Data); +} + +void *RF_EntityVar(void *Data) +{ + return new EntityVar((CScript *)Data); +} + +void *RF_StringVar(void *Data) +{ + return new StringVar((CScript *)Data); +} + +void *RF_VariableVar(void *Data) +{ + return new VariableVar((CScript *)Data); +} + +void *RF_FieldVariableVar(void *Data) +{ + return new FieldVariableVar((CScript *)Data); +} + +void *RF_Signaler(void *Data) +{ + return new Signaler((CScript *)Data); +} + +void *RF_MoveDoneEvent(void *Data) +{ + return new MoveDoneEvent((CScript *)Data); +} + +void *RF_RotateDoneEvent(void *Data) +{ + return new RotateDoneEvent((CScript *)Data); +} + +void *RF_MoveRotateEvent(void *Data) +{ + return new MoveRotateEvent((CScript *)Data); +} + +void *RF_AnimateDoneEvent(void *Data) +{ + return new AnimateDoneEvent((CScript *)Data); +} + +void *RF_HelicopterDoneEvent(void *Data) +{ + return new HelicopterDoneEvent((CScript *)Data); +} + +void *RF_TankDoneEvent(void *Data) +{ + return new TankDoneEvent((CScript *)Data); +} + +void *RF_ExecuteEvent(void *Data) +{ + return new ExecuteEvent((CScript *)Data); +} + +void *RF_WaitEvent(void *Data) +{ + return new WaitEvent((CScript *)Data); +} + +void *RF_Script(void *Data) +{ + return new CScript(); +} + +void *RF_FieldDef(void *Data) +{ + return new FieldDef((CScript *)Data, true); +} + +#define RLID_INTVAR 1 +#define RLID_FLOATVAR 2 +#define RLID_VECTORVAR 3 +#define RLID_ENTITYVAR 4 +#define RLID_STRINGVAR 5 +#define RLID_VARIABLEVAR 6 +#define RLID_FIELDVARIABLEVAR 7 +#define RLID_SIGNALER 8 +#define RLID_MOVEDONEEVENT 9 +#define RLID_ROTATEDONEEVENT 10 +#define RLID_EXECUTEEVENT 11 +#define RLID_WAITEVENT 12 +#define RLID_SCRIPT 13 +#define RLID_FIELDDEF 14 +#define RLID_MOVEROTATEEVENT 15 +#define RLID_ANIMATEDONEEVENT 16 +#define RLID_HELICOPTERDONEEVENT 17 +#define RLID_TANKDONEEVENT 18 + +RestoreList_t ScriptRL[] = +{ + { RLID_INTVAR, RF_IntVar }, + { RLID_FLOATVAR, RF_FloatVar }, + { RLID_VECTORVAR, RF_VectorVar }, + { RLID_ENTITYVAR, RF_EntityVar }, + { RLID_STRINGVAR, RF_StringVar }, + { RLID_VARIABLEVAR, RF_VariableVar }, + { RLID_FIELDVARIABLEVAR, RF_FieldVariableVar }, + { RLID_SIGNALER, RF_Signaler }, + { RLID_MOVEDONEEVENT, RF_MoveDoneEvent }, + { RLID_ROTATEDONEEVENT, RF_RotateDoneEvent }, + { RLID_EXECUTEEVENT, RF_ExecuteEvent }, + { RLID_WAITEVENT, RF_WaitEvent }, + { RLID_SCRIPT, RF_Script }, + { RLID_FIELDDEF, RF_FieldDef }, + { RLID_MOVEROTATEEVENT, RF_MoveRotateEvent }, + { RLID_ANIMATEDONEEVENT, RF_AnimateDoneEvent }, + { RLID_HELICOPTERDONEEVENT, RF_HelicopterDoneEvent }, + { RLID_TANKDONEEVENT, RF_TankDoneEvent }, + + { 0, NULL }, +}; + +void *RestoreObject(RestoreList_t *RestoreList, void *Data) +{ + int ID; + RestoreList_t *pos; + + gi.ReadFromSavegame('SCID', &ID, sizeof(ID)); + + for(pos = RestoreList; pos->alloc_func; pos++) + { + if (pos->ID == ID) + { + return pos->alloc_func(Data); + } + } + gi.dprintf("Warning: Unable to RestoreObject\n"); + return NULL; +} + +//========================================================================== + +void ProcessScripts(void) +{ + list::iterator is; + + if (Scripts.size()) + { + for (is=Scripts.begin();is != Scripts.end();is++) + { + (*is)->Think(); + } + } +} + +void ShutdownScripts() +{ + list::iterator is; + list::iterator iv; + map::iterator ir; + int i; + edict_t *ent; + + while(Scripts.size()) + { + is=Scripts.begin(); + delete (*is); + + Scripts.erase(is); + } + + for(i = 0, ent = g_edicts; i < globals.num_edicts; i++, ent++) + { + ent->Script = NULL; + } + + while(GlobalVariables.size()) + { + iv = GlobalVariables.begin(); + delete (*iv); + + GlobalVariables.erase(iv); + } + + while(ROFFs.size()) + { + ir = ROFFs.begin(); + if ((*ir).second) + gi.FS_FreeFile((*ir).second); + ROFFs.erase(ir); + } +} + +// Save out global variables which are used thruout the level +// but not across levels + +void SaveGlobals(void) +{ + list::iterator it; + int count; + + count = GlobalVariables.size(); + gi.AppendToSavegame('SGNM', &count, sizeof(count)); + + for(it = GlobalVariables.begin(); it != GlobalVariables.end(); it++) + { + (*it)->Write(NULL); + } +} + +void LoadGlobals(void) +{ + int count, i; + Variable *temp; + + gi.ReadFromSavegame('SGNM', &count, sizeof(count)); + + for(i = 0; i < count; i++) + { + temp = (Variable *)RestoreObject(ScriptRL, NULL); + GlobalVariables.push_back(temp); + } +} + +// Script loading and saving + +void SaveLocals(void) +{ + int ver, size; + list::iterator is; + + ver = SCRIPT_SAVE_VERSION; + gi.AppendToSavegame('SCVR', &ver, sizeof(ver)); + + size = Scripts.size(); + gi.AppendToSavegame('SCSZ', &size, sizeof(size)); + + for(is = Scripts.begin(); is != Scripts.end(); is++) + { + (*is)->Write(); + } +} + +void LoadLocals(void) +{ + int ver, size, i; + edict_t *ent; + + gi.ReadFromSavegame('SCVR', (void *)&ver, sizeof(ver)); + if (ver != SCRIPT_SAVE_VERSION) + { + gi.error("LoadScripts(): Expecting version %d, found version %d", SCRIPT_SAVE_VERSION, ver); + } + + for(i = 0, ent = g_edicts; i < globals.num_edicts; i++, ent++) + { + ent->Script = NULL; + } + + gi.ReadFromSavegame('SCSZ', (void *)&size, sizeof(size)); + for(i = 0; i < size; i ++) + { + Scripts.push_back((CScript *)RestoreObject(ScriptRL, NULL)); + } +} + +void script_use(edict_t *ent, edict_t *other, edict_t *activator) +{ + // kef -- used to pass in the trigger that fired the script_runner. I have determined that: + //a) the trigger does not appear to get used and, even if it does, it gets freed soon after anyway + //b) I need to be able to tell, say, a door where its script_runner is so it opens properly + // + //In light of these discoveries I'm replacing 'other' with the script_runner. lemme know if this is dumb. +// ent->Script->AddEvent(new ExecuteEvent(level.time, other, activator) ); + ent->Script->AddEvent(new ExecuteEvent(level.time, ent, activator) ); +} + + +/*QUAKED script_runner (.5 .5 .5) (-8 -8 -8) (8 8 8) WILL_KILL_USER +set Script to the name of the script to run when triggered +use parm1 through parm16 to send parameters to the script + +--------SPAWNFLAGS---------- +WILL_KILL_USER: if used from a monster's killtarget, the monster won't kill itself and must be killed from the script +*/ +void SP_script_runner (edict_t *ent) +{ + char temp[MAX_PATH]; + int i; + + sprintf(temp,"ds/%s.os",st.script); + ent->Script = new CScript(temp, ent); + Scripts.push_back(ent->Script); + + for(i=0;iScript->SetParameter(st.parms[i]); + } + else + { + break; + } + } + + ent->movetype = MOVETYPE_NONE; + ent->solid = SOLID_NOT; + ent->svflags |= SVF_NOCLIENT; + ent->use = script_use; + +// gi.setmodel (ent, ent->model); +// gi.linkentity (ent); +} + +/*QUAKE script_parms (.5 .5 .5) ? +target the script_runner object +use parm1 through parm16 to send parameters to the script +*/ +void SP_parms (edict_t *ent) +{ +} + +//========================================================================== + +Variable *FindGlobal(char *Name) +{ + list::iterator iv; + + if (GlobalVariables.size()) + { + for (iv=GlobalVariables.begin();iv != GlobalVariables.end();iv++) + { + if (strcmp(Name, (*iv)->GetName()) == 0) + { + return *iv; + } + } + } + + return NULL; +} + +bool NewGlobal(Variable *Which) +{ + Variable *Check; + + Check = FindGlobal(Which->GetName()); + if (Check) + { // already exists + return false; + } + + GlobalVariables.push_back(Which); + + return true; +} + +//========================================================================== + +void *FindROFF(char *FileName) +{ + char temp[MAX_PATH]; + char sTemp[MAX_QPATH]; + map::iterator ir; + void *data; + int iFileSize; + + strcpy(temp, FileName); + ir = ROFFs.find(string(temp)); + + if (ir == ROFFs.end()) + { + sprintf(sTemp,"ds/roff/%s",FileName); + iFileSize = gi.FS_LoadFile(sTemp, &data); + + if (iFileSize <= 0) + { + Com_Printf("***********************************************\n"); + Com_Printf("Could not open .ROF file '%s'\n",FileName); + Com_Printf("***********************************************\n"); + + return NULL; + } + + ROFFs[string(temp)] = data; + } + else + { + data = (*ir).second; + } + + return data; +} + +void RemoveROFF(char *FileName) +{ + char temp[MAX_PATH]; + map::iterator ir; + + strcpy(temp, FileName); + ir = ROFFs.find(string(temp)); + + if (ir != ROFFs.end()) + { + if ((*ir).second) + gi.FS_FreeFile((*ir).second); + ROFFs.erase(ir); + } +} + +//========================================================================== + +Variable::Variable(char *NewName, VariableT NewType) +{ + strncpy(Name,NewName, VAR_LENGTH); + Type = NewType; + idx = -1; +} + +void Variable::GetIndex(CScript *Script) +{ + idx = -1; + if (Script) + { + idx = Script->LookupVarIndex(this); + } +} + +void Variable::SetIndex(CScript *Script) +{ + if (Script && idx != -1) + { + Script->SetVarIndex(idx, this); + } +} + +void Variable::Evaluate(CScript *Script, Variable *orig) +{ + strncpy(Name, orig->Name, VAR_LENGTH); + Type = orig->Type; + idx = orig->idx; + + SetIndex(Script); +} + +void Variable::Debug(CScript *Script) +{ + Script->DebugLine(" Name: %s\n",Name); +} + +//========================================================================== + +IntVar::IntVar(char *Name, int InitValue) +:Variable(Name, TypeINT) +{ + Value = InitValue; +} + +void IntVar::Evaluate(CScript *Script, IntVar *orig) +{ + Value = orig->Value; + + Variable::Evaluate(Script, orig); +} + +IntVar::IntVar(CScript *Script) +{ + char loaded[sizeof(IntVar)]; + + gi.ReadFromSavegame('SINT', loaded, sizeof(IntVar)); + Evaluate(Script, (IntVar *)loaded); +} + +void IntVar::Write(CScript *Script) +{ + int index = RLID_INTVAR; + + gi.AppendToSavegame('SCID', &index, sizeof(index)); + + GetIndex(Script); + gi.AppendToSavegame('SINT', this, sizeof(*this)); +} + +void IntVar::ReadValue(CScript *Script) +{ + Value = Script->ReadInt(); +} + +void IntVar::Debug(CScript *Script) +{ + Variable::Debug(Script); + + Script->DebugLine(" Integer Value: %d\n",Value); +} + +void IntVar::Signal(edict_t *Which) +{ + Value++; +} + +void IntVar::ClearSignal(void) +{ + Value = 0; +} + +Variable *IntVar::operator +(Variable *VI) +{ + return new IntVar("",Value + VI->GetIntValue()); +} + +Variable *IntVar::operator -(Variable *VI) +{ + return new IntVar("",Value - VI->GetIntValue()); +} + +Variable *IntVar::operator *(Variable *VI) +{ + return new IntVar("",Value * VI->GetIntValue()); +} + +Variable *IntVar::operator /(Variable *VI) +{ + return new IntVar("",Value / VI->GetIntValue()); +} + +void IntVar::operator =(Variable *VI) +{ + Value = VI->GetIntValue(); +} + +//========================================================================== + +FloatVar::FloatVar(char *Name, float InitValue) +:Variable(Name, TypeFLOAT) +{ + Value = InitValue; +} + +void FloatVar::Evaluate(CScript *Script, FloatVar *orig) +{ + Value = orig->Value; + + Variable::Evaluate(Script, orig); +} + +FloatVar::FloatVar(CScript *Script) +{ + char loaded[sizeof(FloatVar)]; + + gi.ReadFromSavegame('SFLT', loaded, sizeof(FloatVar)); + Evaluate(Script, (FloatVar *)loaded); +} + +void FloatVar::Write(CScript *Script) +{ + int index = RLID_FLOATVAR; + + gi.AppendToSavegame('SCID', &index, sizeof(index)); + + GetIndex(Script); + gi.AppendToSavegame('SFLT', this, sizeof(*this)); +} + +void FloatVar::ReadValue(CScript *Script) +{ + Value = Script->ReadFloat(); +} + +void FloatVar::Debug(CScript *Script) +{ + Variable::Debug(Script); + + Script->DebugLine(" Float Value: %0.f\n",Value); +} + +Variable *FloatVar::operator +(Variable *VI) +{ + return new FloatVar("",Value + VI->GetFloatValue()); +} + +Variable *FloatVar::operator -(Variable *VI) +{ + return new FloatVar("",Value - VI->GetFloatValue()); +} + +Variable *FloatVar::operator *(Variable *VI) +{ + return new FloatVar("",Value * VI->GetFloatValue()); +} + +Variable *FloatVar::operator /(Variable *VI) +{ + return new FloatVar("",Value / VI->GetFloatValue()); +} + +void FloatVar::operator =(Variable *VI) +{ + Value = VI->GetFloatValue(); +} + +//========================================================================== + +VectorVar::VectorVar(char *Name, float InitValueX, float InitValueY, float InitValueZ) +:Variable(Name, TypeVECTOR) +{ + Value[0] = InitValueX; + Value[1] = InitValueY; + Value[2] = InitValueZ; +} + +VectorVar::VectorVar(vec3_t NewValue) +:Variable("", TypeVECTOR) +{ + VectorCopy(NewValue, Value); +} + +void VectorVar::Evaluate(CScript *Script, VectorVar *orig) +{ + VectorCopy(orig->Value, Value); + + Variable::Evaluate(Script, orig); +} + +VectorVar::VectorVar(CScript *Script) +{ + char loaded[sizeof(VectorVar)]; + + gi.ReadFromSavegame('SVEC', loaded, sizeof(VectorVar)); + Evaluate(Script, (VectorVar *)loaded); +} + +void VectorVar::Write(CScript *Script) +{ + int index = RLID_VECTORVAR; + + gi.AppendToSavegame('SCID', &index, sizeof(index)); + + GetIndex(Script); + gi.AppendToSavegame('SVEC', this, sizeof(*this)); +} + +void VectorVar::GetVectorValue(vec3_t &VecValue) +{ + VecValue[0] = Value[0]; + VecValue[1] = Value[1]; + VecValue[2] = Value[2]; +} + +void VectorVar::ReadValue(CScript *Script) +{ + Value[0] = Script->ReadFloat(); + Value[1] = Script->ReadFloat(); + Value[2] = Script->ReadFloat(); +} + +void VectorVar::Debug(CScript *Script) +{ + Variable::Debug(Script); + + Script->DebugLine(" Vector Value: [%0.f, %0.f, %0.f]\n",Value[0],Value[1],Value[2]); +} + +Variable *VectorVar::operator +(Variable *VI) +{ + vec3_t V2, NewV; + + if (VI->GetType() == TypeINT || VI->GetType() == TypeFLOAT) + { + V2[0] = V2[1] = V2[2] = VI->GetFloatValue(); + } + else + { + VI->GetVectorValue(V2); + } + + NewV[0] = Value[0] + V2[0]; + NewV[1] = Value[1] + V2[1]; + NewV[2] = Value[2] + V2[2]; + + return new VectorVar("", NewV[0], NewV[1], NewV[2]); +} + +Variable *VectorVar::operator -(Variable *VI) +{ + vec3_t V2, NewV; + + if (VI->GetType() == TypeINT || VI->GetType() == TypeFLOAT) + { + V2[0] = V2[1] = V2[2] = VI->GetFloatValue(); + } + else + { + VI->GetVectorValue(V2); + } + + NewV[0] = Value[0] - V2[0]; + NewV[1] = Value[1] - V2[1]; + NewV[2] = Value[2] - V2[2]; + + return new VectorVar("", NewV[0], NewV[1], NewV[2]); +} + +Variable *VectorVar::operator *(Variable *VI) +{ + vec3_t V2, NewV; + + if (VI->GetType() == TypeINT || VI->GetType() == TypeFLOAT) + { + V2[0] = V2[1] = V2[2] = VI->GetFloatValue(); + } + else + { + VI->GetVectorValue(V2); + } + + NewV[0] = Value[0] * V2[0]; + NewV[1] = Value[1] * V2[1]; + NewV[2] = Value[2] * V2[2]; + + return new VectorVar("", NewV[0], NewV[1], NewV[2]); +} + +Variable *VectorVar::operator /(Variable *VI) +{ + vec3_t V2, NewV; + + if (VI->GetType() == TypeINT || VI->GetType() == TypeFLOAT) + { + V2[0] = V2[1] = V2[2] = VI->GetFloatValue(); + } + else + { + VI->GetVectorValue(V2); + } + + NewV[0] = Value[0] / V2[0]; + NewV[1] = Value[1] / V2[1]; + NewV[2] = Value[2] / V2[2]; + + return new VectorVar("", NewV[0], NewV[1], NewV[2]); +} + +void VectorVar::operator =(Variable *VI) +{ + VI->GetVectorValue(Value); +} + +bool VectorVar::operator ==(Variable *VI) +{ + vec3_t vec; + + if (VI->GetType() == TypeINT || VI->GetType() == TypeFLOAT) + { + return VectorLength(Value) == VI->GetFloatValue(); + } + else if (VI->GetType() == TypeVECTOR) + { + VI->GetVectorValue(vec); + + return (VectorCompare(Value, vec) == 1); // VC6 gives a warning about converting int to bool + } + + return false; +} + +bool VectorVar::operator !=(Variable *VI) +{ + vec3_t vec; + + if (VI->GetType() == TypeINT || VI->GetType() == TypeFLOAT) + { + return VectorLength(Value) != VI->GetFloatValue(); + } + else if (VI->GetType() == TypeVECTOR) + { + VI->GetVectorValue(vec); + + return !VectorCompare(Value, vec); + } + + return false; +} + +bool VectorVar::operator <(Variable *VI) +{ + vec3_t vec; + float compare; + + if (VI->GetType() == TypeINT || VI->GetType() == TypeFLOAT) + { + compare = VI->GetFloatValue(); + } + else if (VI->GetType() == TypeVECTOR) + { + VI->GetVectorValue(vec); + compare = VectorLength(vec); + } + else + { + return false; + } + + return VectorLength(Value) < compare; +} + +bool VectorVar::operator <=(Variable *VI) +{ + vec3_t vec; + float compare; + + if (VI->GetType() == TypeINT || VI->GetType() == TypeFLOAT) + { + compare = VI->GetFloatValue(); + } + else if (VI->GetType() == TypeVECTOR) + { + VI->GetVectorValue(vec); + compare = VectorLength(vec); + } + else + { + return false; + } + + return VectorLength(Value) <= compare; +} + +bool VectorVar::operator >(Variable *VI) +{ + vec3_t vec; + float compare; + + if (VI->GetType() == TypeINT || VI->GetType() == TypeFLOAT) + { + compare = VI->GetFloatValue(); + } + else if (VI->GetType() == TypeVECTOR) + { + VI->GetVectorValue(vec); + compare = VectorLength(vec); + } + else + { + return false; + } + + return VectorLength(Value) > compare; +} + +bool VectorVar::operator >=(Variable *VI) +{ + vec3_t vec; + float compare; + + if (VI->GetType() == TypeINT || VI->GetType() == TypeFLOAT) + { + compare = VI->GetFloatValue(); + } + else if (VI->GetType() == TypeVECTOR) + { + VI->GetVectorValue(vec); + compare = VectorLength(vec); + } + else + { + return false; + } + + return VectorLength(Value) >= compare; +} + +//========================================================================== + +EntityVar::EntityVar(char *Name, int InitValue) +:Variable(Name, TypeENTITY) +{ + if (InitValue == -1) + { + Value = NULL; + } + else + { + Value = &g_edicts[InitValue]; + } +} + +EntityVar::EntityVar(edict_t *Which) +:Variable("", TypeENTITY) +{ + Value = Which; +} + +void EntityVar::Evaluate(CScript *Script, EntityVar *orig) +{ + Value = GetEdictPtr((int)orig->Value); + + Variable::Evaluate(Script, orig); +} + +EntityVar::EntityVar(CScript *Script) +{ + char loaded[sizeof(EntityVar)]; + + gi.ReadFromSavegame('SENT', loaded, sizeof(EntityVar)); + Evaluate(Script, (EntityVar *)loaded); +} + +void EntityVar::Write(CScript *Script) +{ + int index = RLID_ENTITYVAR; + + gi.AppendToSavegame('SCID', &index, sizeof(index)); + + GetIndex(Script); + + *(int *)&Value = GetEdictNum(Value); + gi.AppendToSavegame('SENT', this, sizeof(*this)); + Value = GetEdictPtr((int)Value); +} + +void EntityVar::ReadValue(CScript *Script) +{ + int Index; + + Index = Script->ReadInt(); + if (Index == -1) + { + Value = NULL; + } + else + { + Value = &g_edicts[Index]; + } +} + +void EntityVar::Debug(CScript *Script) +{ + Variable::Debug(Script); + + Script->DebugLine(" Entity Value: %d\n",GetIntValue()); +} + +int EntityVar::GetIntValue(void) +{ + if (Value) + { + return Value - g_edicts; + } + + return -1; +} + +void EntityVar::operator =(Variable *VI) +{ + Value = VI->GetEdictValue(); +} + +bool EntityVar::operator ==(Variable *VI) +{ + if (VI->GetType() == TypeINT) + { + return GetIntValue() == VI->GetIntValue(); + } + else if (VI->GetType() == TypeENTITY) + { + return GetEdictValue() == VI->GetEdictValue(); + } + + return false; +} + +bool EntityVar::operator !=(Variable *VI) +{ + if (VI->GetType() == TypeINT) + { + return GetIntValue() != VI->GetIntValue(); + } + else if (VI->GetType() == TypeENTITY) + { + return GetEdictValue() != VI->GetEdictValue(); + } + + return false; +} + +//========================================================================== + +StringVar::StringVar(char *Name, char *InitValue) +:Variable(Name, TypeSTRING) +{ + strncpy(Value, InitValue, VAR_LENGTH); +} + +void StringVar::Evaluate(CScript *Script, StringVar *orig) +{ + strncpy(Value, orig->Value, VAR_LENGTH); + + Variable::Evaluate(Script, orig); +} + +StringVar::StringVar(CScript *Script) +{ + char loaded[sizeof(StringVar)]; + + gi.ReadFromSavegame('SSTR', loaded, sizeof(StringVar)); + Evaluate(Script, (StringVar *)loaded); +} + +void StringVar::Write(CScript *Script) +{ + int index = RLID_STRINGVAR; + + gi.AppendToSavegame('SCID', &index, sizeof(index)); + + GetIndex(Script); + gi.AppendToSavegame('SSTR', this, sizeof(*this)); +} + +void StringVar::ReadValue(CScript *Script) +{ + strncpy(Value, Script->ReadString(), VAR_LENGTH); +} + +//========================================================================== + +VariableVar::VariableVar(char *Name) +:Variable(Name, TypeUNKNOWN) +{ + Value = NULL; +} + +void VariableVar::Evaluate(CScript *Script, VariableVar *orig) +{ + Value = Script->LookupVar((int)orig->Value); + + Variable::Evaluate(Script, orig); +} + +VariableVar::VariableVar(CScript *Script) +{ + char loaded[sizeof(VariableVar)]; + + gi.ReadFromSavegame('SVVR', loaded, sizeof(VariableVar)); + Evaluate(Script, (VariableVar *)loaded); +} + +void VariableVar::Write(CScript *Script) +{ + int index = RLID_VARIABLEVAR; + + gi.AppendToSavegame('SCID', &index, sizeof(index)); + + GetIndex(Script); + *(int *)&Value = Script->LookupVarIndex(Value); + gi.AppendToSavegame('SVVR', this, sizeof(*this)); + Value = Script->LookupVar((int)Value); +} + +void VariableVar::ReadValue(CScript *Script) +{ + int Index; + + Index = Script->ReadInt(); + + Value = Script->LookupVar(Index); + + if (Value) + { + Type = Value->GetType(); + } +} + +void VariableVar::Debug(CScript *Script) +{ + Value->Debug(Script); +} + +//========================================================================== + +FieldVariableVar::FieldVariableVar(char *Name) +:Variable(Name, TypeUNKNOWN) +{ + Value = NULL; + Field = NULL; +} + +void FieldVariableVar::Evaluate(CScript *Script, FieldVariableVar *orig) +{ + Value = Script->LookupVar((int)orig->Value); + Field = Script->LookupField((int)orig->Field); + + Variable::Evaluate(Script, orig); +} + +FieldVariableVar::FieldVariableVar(CScript *Script) +{ + char loaded[sizeof(FieldVariableVar)]; + + gi.ReadFromSavegame('SFVV', loaded, sizeof(FieldVariableVar)); + Evaluate(Script, (FieldVariableVar *)loaded); +} + +void FieldVariableVar::Write(CScript *Script) +{ + int index = RLID_FIELDVARIABLEVAR; + + gi.AppendToSavegame('SCID', &index, sizeof(index)); + + GetIndex(Script); + *(int *)&Value = Script->LookupVarIndex(Value); + *(int *)&Field = Script->LookupFieldIndex(Field); + gi.AppendToSavegame('SFVV', this, sizeof(*this)); + Value = Script->LookupVar((int)Value); + Field = Script->LookupField((int)Field); +} + +void FieldVariableVar::ReadValue(CScript *Script) +{ + int Index; + + Index = Script->ReadInt(); + Value = Script->LookupVar(Index); + + Index = Script->ReadInt(); + Field = Script->LookupField(Index); +} + +void FieldVariableVar::Debug(CScript *Script) +{ + Value->Debug(Script); +} + +int FieldVariableVar::GetIntValue(void) +{ + return Field->GetIntValue(Value); +} + +float FieldVariableVar::GetFloatValue(void) +{ + return Field->GetFloatValue(Value); +} + +void FieldVariableVar::GetVectorValue(vec3_t &VecValue) +{ + Field->GetVectorValue(Value, VecValue); +} + +edict_t *FieldVariableVar::GetEdictValue(void) +{ + return Field->GetEdictValue(Value); +} + +char *FieldVariableVar::GetStringValue(void) +{ + return Field->GetStringValue(Value); +} + +Variable *FieldVariableVar::operator +(Variable *VI) +{ + Variable *Result, *Val; + + Val = Field->GetValue(Value); + + Result = (*Val) + VI; + + delete Val; + + return Result; +} + +Variable *FieldVariableVar::operator -(Variable *VI) +{ + Variable *Result, *Val; + + Val = Field->GetValue(Value); + + Result = (*Val) - VI; + + delete Val; + + return Result; +} + +Variable *FieldVariableVar::operator *(Variable *VI) +{ + Variable *Result, *Val; + + Val = Field->GetValue(Value); + + Result = (*Val) * VI; + + delete Val; + + return Result; +} + +Variable *FieldVariableVar::operator /(Variable *VI) +{ + Variable *Result, *Val; + + Val = Field->GetValue(Value); + + Result = (*Val) / VI; + + delete Val; + + return Result; +} + +void FieldVariableVar::operator =(Variable *VI) +{ + Field->SetValue(Value, VI); +} + +bool FieldVariableVar::operator ==(Variable *VI) +{ + Variable *Val; + bool Result; + + Val = Field->GetValue(Value); + + Result = (*Val) == VI; + + delete Val; + + return Result; +} + +bool FieldVariableVar::operator !=(Variable *VI) +{ + Variable *Val; + bool Result; + + Val = Field->GetValue(Value); + + Result = (*Val) != VI; + + delete Val; + + return Result; +} + +bool FieldVariableVar::operator <(Variable *VI) +{ + Variable *Val; + bool Result; + + Val = Field->GetValue(Value); + + Result = (*Val) < VI; + + delete Val; + + return Result; +} + +bool FieldVariableVar::operator <=(Variable *VI) +{ + Variable *Val; + bool Result; + + Val = Field->GetValue(Value); + + Result = (*Val) <= VI; + + delete Val; + + return Result; +} + +bool FieldVariableVar::operator >(Variable *VI) +{ + Variable *Val; + bool Result; + + Val = Field->GetValue(Value); + + Result = (*Val) > VI; + + delete Val; + + return Result; +} + +bool FieldVariableVar::operator >=(Variable *VI) +{ + Variable *Val; + bool Result; + + Val = Field->GetValue(Value); + + Result = (*Val) >= VI; + + delete Val; + + return Result; +} + +//========================================================================== + +Signaler::Signaler(edict_t *NewEdict, Variable *NewVar, SignalT NewSignalType) +{ + Edict = NewEdict; + Var = NewVar; + SignalType = NewSignalType; +} + +void Signaler::Evaluate(CScript *Script, Signaler *orig) +{ + Edict = GetEdictPtr((int)orig->Edict); + Var = orig->Var; + SignalType = orig->SignalType; + + if(Var) + { + Var = (Variable *)RestoreObject(ScriptRL, Script); + } +} + +Signaler::Signaler(CScript *Script) +{ + char loaded[sizeof(Signaler)]; + + gi.ReadFromSavegame('SSIG', loaded, sizeof(Signaler)); + Evaluate(Script, (Signaler *)loaded); +} + +Signaler::~Signaler(void) +{ + if (Var) + { + delete Var; + } +} + +void Signaler::Write(CScript *Script) +{ + int index = RLID_SIGNALER; + Variable *tempvar; + + // Write out type Id + gi.AppendToSavegame('SCID', &index, sizeof(index)); + + *(int *)&Edict = GetEdictNum(Edict); + tempvar = Var; + Var = (Variable *)!!Var; + gi.AppendToSavegame('SSIG', this, sizeof(*this)); + Edict = GetEdictPtr((int)Edict); + Var = tempvar; + + if(Var) + { + Var->Write(Script); + } +} + +bool Signaler::Test(edict_t *Which, SignalT WhichType) +{ + if (WhichType != SignalType) + { + return false; + } + + if (Edict != Which) + { + return false; + } + + Var->Signal(Which); + + return true; +} + +bool Signaler::operator ==(Signaler *SI) +{ + if (Var == SI->GetVar()) + { + return true; + } + + return false; +} + +void script_signaler(edict_t *which, SignalT SignalType) +{ + list::iterator is; + + if (Scripts.size()) + { + for (is = Scripts.begin(); is != Scripts.end(); is++) + { + (*is)->CheckSignalers(which, SignalType); + } + } +} + +void move_signaler(edict_t *which) +{ + script_signaler(which, SIGNAL_MOVE); +} + +void rotate_signaler(edict_t *which) +{ + script_signaler(which, SIGNAL_ROTATE); +} + +void animate_signaler(edict_t *which) +{ + script_signaler(which, SIGNAL_ANIMATE); +} + +void moverotate_signaler(edict_t *which) +{ + script_signaler(which, SIGNAL_MOVEROTATE); +} + +void helicopter_signaler(edict_t *which) +{ + script_signaler(which, SIGNAL_HELI); +} + +void tank_signaler(edict_t *which) +{ + script_signaler(which, SIGNAL_TANK); +} + +//========================================================================== + +// Fields are just yucky now - once H2 finals, I'm going to change them completely + +#define SPEC_X -1 +#define SPEC_Y -2 +#define SPEC_Z -3 +#define SPEC_DELTA_ANGLES -4 +#define SPEC_P_ORIGIN -5 + +static field_t script_fields[] = +{ + { "x", SPEC_X, F_FLOAT }, + { "y", SPEC_Y, F_FLOAT }, + { "z", SPEC_Z, F_FLOAT }, + { "origin", FOFS(s.origin), F_VECTOR }, + { "origin_x", FOFS(s.origin[0]), F_FLOAT }, + { "origin_y", FOFS(s.origin[1]), F_FLOAT }, + { "origin_z", FOFS(s.origin[2]), F_FLOAT }, + { "movetype", FOFS(movetype), F_INT }, + { "start_origin", FOFS(moveinfo.start_origin), F_VECTOR }, + { "distance", FOFS(moveinfo.distance), F_FLOAT }, + { "owner", FOFS(owner), F_EDICT }, + { "wait", FOFS(wait), F_FLOAT }, + { "velocity", FOFS(velocity), F_VECTOR }, + { "angle_velocity", FOFS(avelocity), F_VECTOR }, + { "team_chain", FOFS(teamchain), F_EDICT }, + { "yaw_speed", FOFS(yaw_speed), F_FLOAT }, + { "modelindex", FOFS(s.modelindex), F_INT }, + { "count", FOFS(count), F_INT }, + { "solid", FOFS(solid), F_INT }, + { "angles", FOFS(s.angles), F_VECTOR }, + { "start_angles", FOFS(moveinfo.start_angles), F_VECTOR }, + { "state", FOFS(moveinfo.state), F_INT }, + { "health", FOFS(health), F_INT }, + { "loopsound", FOFS(s.sound), F_INT }, + { NULL, 0, F_INT } +}; + +FieldDef::FieldDef(CScript *Script) +{ + field_t *Field; + bool Found; + + strncpy(Name, Script->ReadString(), VAR_LENGTH); + Type = (VariableT)Script->ReadByte(); + + FieldType = F_IGNORE; + Offset = -1; + + Found = false; + for (Field = script_fields; Field->name; Field++) + { + if (strcmp(Name, Field->name) == 0) + { + Offset = Field->ofs; + FieldType = Field->type; + Found = true; + + break; + } + } + + if (!Found) + { +#ifdef _DEVEL + Com_Printf("Unknown field '%s'\n",Name); +#endif //_DEVEL + } +} + +void FieldDef::Evaluate(CScript *Script, FieldDef *orig) +{ + bool Found; + field_t *Field; + + strncpy(Name, orig->Name, VAR_LENGTH); + Type = orig->Type; + Offset = orig->Offset; + FieldType = orig->FieldType; + idx = orig->idx; + + if (Script && (idx != -1)) + { + Script->SetFieldIndex(idx, this); + } + + FieldType = F_IGNORE; + Offset = -1; + + Found = false; + for (Field = script_fields; Field->name; Field++) + { + if (strcmp(Name, Field->name) == 0) + { + Offset = Field->ofs; + FieldType = Field->type; + Found = true; + break; + } + } + + if (!Found) + { +#ifdef _DEVEL + Com_Printf("Unknown field '%s'\n",Name); +#endif //_DEVEL + } +} + +FieldDef::FieldDef(CScript *Script, bool loading) +{ + char loaded[sizeof(FieldDef)]; + + gi.ReadFromSavegame('SFDF', loaded, sizeof(FieldDef)); + Evaluate(Script, (FieldDef *)loaded); +} + +void FieldDef::Write(CScript *Script) +{ + int index = RLID_FIELDDEF; + + // Write out type Id + gi.AppendToSavegame('SCID', &index, sizeof(index)); + + idx = -1; + if (Script) + { + idx = Script->LookupFieldIndex(this); + } + gi.AppendToSavegame('SFDF', this, sizeof(*this)); +} + +byte *FieldDef::GetOffset(Variable *Var) +{ + edict_t *ent; + byte *b, *Dest; + + Dest = NULL; + + switch(Offset) + { + case SPEC_X: + break; + case SPEC_Y: + break; + case SPEC_Z: + break; + case SPEC_DELTA_ANGLES: + ent = Var->GetEdictValue(); + if (ent && ent->client) + { + Dest = (byte *)&ent->client->ps.pmove.delta_angles; + } + break; + default: + ent = Var->GetEdictValue(); + if (ent) + { + b = (byte *)ent; + Dest = b+Offset; + } + break; + } + + return Dest; +} + +Variable *FieldDef::GetValue(Variable *Var) +{ + vec3_t vec; + + switch(FieldType) + { + case F_INT: + return new IntVar("", GetIntValue(Var) ); + break; + + case F_FLOAT: + return new FloatVar("", GetFloatValue(Var) ); + break; + + case F_EDICT: + return new EntityVar(GetEdictValue(Var)); + break; + + case F_VECTOR: + GetVectorValue(Var, vec); + return new VectorVar(vec); + break; + } + + return NULL; +} + +int FieldDef::GetIntValue(Variable *Var) +{ + byte *Dest; + vec3_t data; + + Dest = GetOffset(Var); + + if (FieldType != F_INT || !Dest) + { + switch(Offset) + { + case SPEC_X: + Var->GetVectorValue(data); + return (int)data[0]; + break; + case SPEC_Y: + Var->GetVectorValue(data); + return (int)data[1]; + break; + case SPEC_Z: + Var->GetVectorValue(data); + return (int)data[2]; + break; + } + + return 0.0; + } + + return *(int *)(Dest); +} + +float FieldDef::GetFloatValue(Variable *Var) +{ + byte *Dest; + vec3_t data; + + Dest = GetOffset(Var); + + if (FieldType != F_FLOAT || !Dest) + { + switch(Offset) + { + case SPEC_X: + Var->GetVectorValue(data); + return data[0]; + break; + case SPEC_Y: + Var->GetVectorValue(data); + return data[1]; + break; + case SPEC_Z: + Var->GetVectorValue(data); + return data[2]; + break; + } + + return 0.0; + } + + return *(float *)(Dest); +} + +void FieldDef::GetVectorValue(Variable *Var, vec3_t &VecValue) +{ + byte *Dest; + + Dest = GetOffset(Var); + + if (FieldType != F_VECTOR || !Dest) + { + VectorClear(VecValue); + return; + } + + VectorCopy(*(vec3_t *)(Dest), VecValue); +} + +edict_t *FieldDef::GetEdictValue(Variable *Var) +{ + byte *Dest; + + Dest = GetOffset(Var); + + if (FieldType != F_EDICT || !Dest) + { + return NULL; + } + + return *(edict_t **)(Dest); +} + +char *FieldDef::GetStringValue(Variable *Var) +{ + return ""; +} + +void FieldDef::SetValue(Variable *Var, Variable *Value) +{ + byte *Dest; + vec3_t data; + VectorVar *new_var; + + Dest = GetOffset(Var); + if (Dest == NULL) + { + switch(Offset) + { + case SPEC_X: + Var->GetVectorValue(data); + data[0] = Value->GetFloatValue(); + new_var = new VectorVar(data); + *Var = new_var; + delete new_var; + break; + case SPEC_Y: + Var->GetVectorValue(data); + data[1] = Value->GetFloatValue(); + new_var = new VectorVar(data); + *Var = new_var; + delete new_var; + break; + case SPEC_Z: + Var->GetVectorValue(data); + data[2] = Value->GetFloatValue(); + new_var = new VectorVar(data); + *Var = new_var; + delete new_var; + break; + } + + return; + } + + switch(FieldType) + { + case F_INT: + *(int *)(Dest) = Value->GetIntValue(); + break; + case F_FLOAT: + *(float *)(Dest) = Value->GetFloatValue(); + break; + case F_EDICT: + *(edict_t **)(Dest) = Value->GetEdictValue(); + break; + case F_VECTOR: + Value->GetVectorValue(*(vec3_t *)(Dest)); + break; + } +} + +//========================================================================== + +Event::Event(float NewTime, EventT NewType) +{ + Time = floor((NewTime + 0.05) * 10) / 10; // avoids stupid math rounding errors + Type = NewType; +} + +void Event::Evaluate(CScript *Script, Event *orig) +{ + Time = orig->Time; + Type = orig->Type; + Priority = orig->Priority; +} + +bool Event::Process(CScript *Script) +{ + return FALSE; +} + +//========================================================================== + +MoveRotateEvent::MoveRotateEvent(float NewTime, edict_t *NewEnt, vec3_t v3RelOrigin, vec3_t v3RelAngles) +:Event(NewTime, EVENT_MOVEROTATE) +{ + Ent = NewEnt; + + Priority = 10; + + VectorCopy(v3RelOrigin, v3RelativeOrigin); + VectorCopy(v3RelAngles, v3RelativeAngles); +} + +void MoveRotateEvent::Evaluate(CScript *Script, MoveRotateEvent *orig) +{ + Ent = GetEdictPtr((int)orig->Ent); + VectorCopy(orig->v3RelativeOrigin, v3RelativeOrigin); + VectorCopy(orig->v3RelativeAngles, v3RelativeAngles); + + Event::Evaluate(Script, orig); +} + +MoveRotateEvent::MoveRotateEvent(CScript *Script) +{ + char loaded[sizeof(MoveRotateEvent)]; + + gi.ReadFromSavegame('SMRE', loaded, sizeof(MoveRotateEvent)); + Evaluate(Script, (MoveRotateEvent *)loaded); +} + +void MoveRotateEvent::Write(CScript *Script) +{ + int index = RLID_MOVEROTATEEVENT; + + // Write out type Id + gi.AppendToSavegame('SCID', &index, sizeof(index)); + // Write out data + *(int *)&Ent = GetEdictNum(Ent); + gi.AppendToSavegame('SMRE', this, sizeof(*this)); + Ent = GetEdictPtr((int)Ent); +} + +bool MoveRotateEvent::Process(CScript *Script) +{ + if (level.time < Time) + { + return FALSE; + } + + // special code, because "moverotate" command pushes a whole bunch of commands on the stack, I'll do the signalling + // by checking for specially-pushed values. Checking if the relative rotations are 10000 (ROFF_EOS_MARKER) should be ok. + // + if (VectorCompare(v3RelativeOrigin, v3ROFF_EOS_Marker)) + { + // end-of-sequence... + // + moverotate_signaler(Ent); + } + else + { + // normal data... + // + Vec3AddAssign(v3RelativeOrigin, Ent->s.origin); + Vec3AddAssign(v3RelativeAngles, Ent->s.angles); + } + gi.linkentity(Ent); + + return TRUE; +} +//========================================================================== + +AnimateDoneEvent::AnimateDoneEvent(edict_t *myEnt) +:Event(0, EVENT_ANIMATE_DONE) +{ + Done = false; + Ent = myEnt; + + Priority = 10; +} + +void AnimateDoneEvent::Evaluate(CScript *Script, AnimateDoneEvent *orig) +{ + Done = orig->Done; + Ent = GetEdictPtr((int)orig->Ent); + + Event::Evaluate(Script, orig); +} + +AnimateDoneEvent::AnimateDoneEvent(CScript *Script) +{ + char loaded[sizeof(AnimateDoneEvent)]; + + gi.ReadFromSavegame('SADE', loaded, sizeof(AnimateDoneEvent)); + Evaluate(Script, (AnimateDoneEvent *)loaded); +} + +void AnimateDoneEvent::Write(CScript *Script) +{ + int index = RLID_ANIMATEDONEEVENT; + + // Write out type Id + gi.AppendToSavegame('SCID', &index, sizeof(index)); + // Write out data + *(int *)&Ent = GetEdictNum(Ent); + gi.AppendToSavegame('SADE', this, sizeof(*this)); + Ent = GetEdictPtr((int)Ent); +} + +bool AnimateDoneEvent::Process(CScript *Script) +{ + if (Done) + { + animate_signaler(Ent); + return TRUE; + } + + return FALSE; +} + +//========================================================================== + +MoveDoneEvent::MoveDoneEvent(float NewTime, edict_t *NewEnt) +:Event(NewTime, EVENT_MOVE_DONE) +{ + Ent = NewEnt; + + Priority = 10; +} + +void MoveDoneEvent::Evaluate(CScript *Script, MoveDoneEvent *orig) +{ + Ent = GetEdictPtr((int)orig->Ent); + + Event::Evaluate(Script, orig); +} + +MoveDoneEvent::MoveDoneEvent(CScript *Script) +{ + char loaded[sizeof(MoveDoneEvent)]; + + gi.ReadFromSavegame('SMDE', loaded, sizeof(MoveDoneEvent)); + Evaluate(Script, (MoveDoneEvent *)loaded); +} + +void MoveDoneEvent::Write(CScript *Script) +{ + int index = RLID_MOVEDONEEVENT; + + // Write out type Id + gi.AppendToSavegame('SCID', &index, sizeof(index)); + // Write out data + *(int *)&Ent = GetEdictNum(Ent); + gi.AppendToSavegame('SMDE', this, sizeof(*this)); + Ent = GetEdictPtr((int)Ent); +} + +bool MoveDoneEvent::Process(CScript *Script) +{ + if (level.time < Time) + { + return FALSE; + } + + Script->Move_Done(Ent); + move_signaler(Ent); + + return TRUE; +} + +//========================================================================== + +RotateDoneEvent::RotateDoneEvent(float NewTime, edict_t *NewEnt) +:Event(NewTime, EVENT_ROTATE_DONE) +{ + Ent = NewEnt; + + Priority = 10; +} + +void RotateDoneEvent::Evaluate(CScript *Script, RotateDoneEvent *orig) +{ + Ent = GetEdictPtr((int)orig->Ent); + + Event::Evaluate(Script, orig); +} + +RotateDoneEvent::RotateDoneEvent(CScript *Script) +{ + char loaded[sizeof(RotateDoneEvent)]; + + gi.ReadFromSavegame('SRDE', loaded, sizeof(RotateDoneEvent)); + Evaluate(Script, (RotateDoneEvent *)loaded); +} + +void RotateDoneEvent::Write(CScript *Script) +{ + int index = RLID_ROTATEDONEEVENT; + + // Write out type Id + gi.AppendToSavegame('SCID', &index, sizeof(index)); + // Write out data + *(int *)&Ent = GetEdictNum(Ent); + gi.AppendToSavegame('SRDE', this, sizeof(*this)); + Ent = GetEdictPtr((int)Ent); +} + +bool RotateDoneEvent::Process(CScript *Script) +{ + if (level.time < Time) + { + return FALSE; + } + + Script->Rotate_Done(Ent); + rotate_signaler(Ent); + + return TRUE; +} + +//========================================================================== + +HelicopterDoneEvent::HelicopterDoneEvent(float NewTime, edict_t *NewEnt, int actionID) +:Event(NewTime, EVENT_HELICOPTER_DONE) +{ + Ent = NewEnt; + m_ID = actionID; + + Priority = 10; +} + +void HelicopterDoneEvent::Evaluate(CScript *Script, HelicopterDoneEvent *orig) +{ + Ent = GetEdictPtr((int)orig->Ent); + m_ID = orig->m_ID; + Priority = orig->Priority; + + Event::Evaluate(Script, orig); +} + +HelicopterDoneEvent::HelicopterDoneEvent(CScript *Script) +{ + char loaded[sizeof(HelicopterDoneEvent)]; + + gi.ReadFromSavegame('SHDE', &loaded, sizeof(HelicopterDoneEvent)); + Evaluate(Script, (HelicopterDoneEvent *)loaded); +} + +void HelicopterDoneEvent::Write(CScript *Script) +{ + int index = RLID_HELICOPTERDONEEVENT; + + // Write out type Id + gi.AppendToSavegame('SCID', &index, sizeof(index)); + // Write out data + *(int *)&Ent = GetEdictNum(Ent); + gi.AppendToSavegame('SHDE', this, sizeof(*this)); + Ent = GetEdictPtr((int)Ent); +} + +bool HelicopterDoneEvent::Process(CScript *Script) +{ + ai_public_c* ai = Ent->ai; + int nID = -1, nLastID = -1; + + if (ai) + { + // if nID comes back 0, there is no current action + nID = ((generic_ghoul_heli_ai*)ai)->GetCurrentActionID(); + // if nLastID comes back 0, the ai has not yet called an action's think fn + nLastID = ((generic_ghoul_heli_ai*)ai)->GetLastThinkingActionID(); + + if (0 == nID) + { // no current action. that might mean we just finished one, though. + if (0 == nLastID) + { // haven't thought about one yet. + return FALSE; + } + else + { // we just finished an action. if it wasn't this action, return FALSE + if (nLastID != m_ID) + { + return FALSE; + } + else + { // fall through cuz we just finished this action + } + } + } + else + { // currently thinking about an action and it hasn't finished yet + return FALSE; + } + } + + Script->Helicopter_Done(Ent); + helicopter_signaler(Ent); + + return TRUE; +} + +//========================================================================== + +TankDoneEvent::TankDoneEvent(float NewTime, edict_t *NewEnt, int actionID) +:Event(NewTime, EVENT_TANK_DONE) +{ + Ent = NewEnt; + m_ID = actionID; + + Priority = 10; +} + +void TankDoneEvent::Evaluate(CScript *Script, TankDoneEvent *orig) +{ + Ent = GetEdictPtr((int)orig->Ent); + m_ID = orig->m_ID; + Priority = orig->Priority; + + Event::Evaluate(Script, orig); +} + +TankDoneEvent::TankDoneEvent(CScript *Script) +{ + char loaded[sizeof(TankDoneEvent)]; + + gi.ReadFromSavegame('STDE', loaded, sizeof(TankDoneEvent)); + Evaluate(Script, (TankDoneEvent *)loaded); +} + +void TankDoneEvent::Write(CScript *Script) +{ + int index = RLID_TANKDONEEVENT; + + // Write out type Id + gi.AppendToSavegame('SCID', &index, sizeof(index)); + // Write out data + *(int *)&Ent = GetEdictNum(Ent); + gi.AppendToSavegame('STDE', this, sizeof(*this)); + Ent = GetEdictPtr((int)Ent); +} + +bool TankDoneEvent::Process(CScript *Script) +{ + ai_public_c* ai = Ent->ai; + int nID = -1, nLastID = -1; + + if (ai) + { + // if nID comes back 0, there is no current action + nID = ((generic_ghoul_tank_ai*)ai)->GetCurrentActionID(); + // if nLastID comes back 0, the ai has not yet called an action's think fn + nLastID = ((generic_ghoul_tank_ai*)ai)->GetLastThinkingActionID(); + + if (0 == nID) + { // no current action. that might mean we just finished one, though. + if (0 == nLastID) + { // haven't thought about one yet. + return FALSE; + } + else + { // we just finished an action. if it wasn't this action, return FALSE + if (nLastID != m_ID) + { + return FALSE; + } + else + { // fall through cuz we just finished this action + } + } + } + else + { // currently thinking about an action and it hasn't finished yet + return FALSE; + } + } + + Script->Tank_Done(Ent); + tank_signaler(Ent); + + return TRUE; +} + +//========================================================================== + +ExecuteEvent::ExecuteEvent(float NewTime, edict_t *NewOther, edict_t *NewActivator) +:Event(NewTime, EVENT_SCRIPT_EXECUTE) +{ + Other = NewOther; + Activator = NewActivator; + + Priority = 0; +} + +void ExecuteEvent::Evaluate(CScript *Script, ExecuteEvent *orig) +{ + Other = GetEdictPtr((int)orig->Other); + Activator = GetEdictPtr((int)orig->Activator); + Priority = orig->Priority; + + Event::Evaluate(Script, orig); +} + +ExecuteEvent::ExecuteEvent(CScript *Script) +{ + char loaded[sizeof(ExecuteEvent)]; + + gi.ReadFromSavegame('SEEX', loaded, sizeof(ExecuteEvent)); + Evaluate(Script, (ExecuteEvent *)loaded); +} + +void ExecuteEvent::Write(CScript *Script) +{ + int index = RLID_EXECUTEEVENT; + + // Write out type Id + gi.AppendToSavegame('SCID', &index, sizeof(index)); + // Write out data + *(int *)&Other = GetEdictNum(Other); + *(int *)&Activator = GetEdictNum(Activator); + gi.AppendToSavegame('SEEX', this, sizeof(*this)); + Other = GetEdictPtr((int)Other); + Activator = GetEdictPtr((int)Activator); +} + +bool ExecuteEvent::Process(CScript *Script) +{ + if (level.time < Time) + { + return FALSE; + } + + if (Script->CheckWait()) + { + Script->Execute(Other,Activator); + } + + return TRUE; +} + +//========================================================================== + +WaitEvent::WaitEvent(float NewTime) +:Event(NewTime, EVENT_SCRIPT_WAIT) +{ + Priority = 0; +} + +void WaitEvent::Evaluate(CScript *Script, WaitEvent *orig) +{ + Priority = orig->Priority; + + Event::Evaluate(Script, orig); +} + +WaitEvent::WaitEvent(CScript *Script) +{ + char loaded[sizeof(WaitEvent)]; + + gi.ReadFromSavegame('SWEV', loaded, sizeof(WaitEvent)); + Evaluate(Script, (WaitEvent *)loaded); +} + +void WaitEvent::Write(CScript *Script) +{ + int index = RLID_WAITEVENT; + + // Write out type Id + gi.AppendToSavegame('SCID', &index, sizeof(index)); + // Write out data + gi.AppendToSavegame('SWEV', this, sizeof(*this)); +} + +bool WaitEvent::Process(CScript *Script) +{ + if (level.time < Time) + { + return FALSE; + } + + Script->ClearTimeWait(); + + if (Script->CheckWait()) + { + Script->Execute(NULL,NULL); + } + + return TRUE; +} + +//========================================================================== + +CScript::CScript(char *ScriptName, edict_t *new_owner) +{ + Clear(true); + + owner = new_owner; + strncpy(Name, ScriptName, MAX_PATH); + + LoadFile(); +} + +void CScript::Write(void) +{ + int index = RLID_SCRIPT; + int size; + saveglobal_t sg; + list::iterator iv; + list::iterator is; + list::iterator isv; + list::iterator iev; + list::iterator ic; + int *temp; + int i; + savescript_t ss; + + // Save out script ID + gi.AppendToSavegame('SCID', &index, sizeof(index)); + + // Save out name + gi.AppendToSavegame('SNAM', Name, sizeof(Name)); + + // Save out regular script data + ss.ScriptCondition = ScriptCondition; + ss.ConditionInfo = ConditionInfo; + ss.Length = Length; + ss.Position = Position; + ss.DebugFlags = DebugFlags; + ss.owner = GetEdictNum(owner); + ss.other = GetEdictNum(other); + ss.activator = GetEdictNum(activator); + + gi.AppendToSavegame('SCRP', &ss, sizeof(ss)); + + // Save out field array + size = 0; + for(i = 0, size = 0; i < MAX_INDEX; i++) + { + if (Fields[i]) + { + size++; + } + } + gi.AppendToSavegame('SFNM', &size, sizeof(size)); + + for(i = 0; i < MAX_INDEX; i++) + { + if (Fields[i]) + { + Fields[i]->Write(this); + } + } + + // Saving out global variables referenced in this script + size = 0; + for (iv = GlobalVariables.begin(); iv != GlobalVariables.end(); iv++) + { + if (LookupVarIndex(*iv) != -1) + { + size++; + } + } + gi.AppendToSavegame('SGNM', &size, sizeof(size)); + + for (iv = GlobalVariables.begin(); iv != GlobalVariables.end(); iv++) + { + index = LookupVarIndex(*iv); + if (index != -1) + { + sg.index = index; + strcpy(sg.name, (*iv)->GetName()); + + gi.AppendToSavegame('SGLB', &sg, sizeof(sg)); + } + } + + // Save out local variables + size = LocalVariables.size(); + gi.AppendToSavegame('SLNM', &size, sizeof(size)); + + for (iv = LocalVariables.begin(); iv != LocalVariables.end(); iv++) + { + (*iv)->Write(this); + } + + // Save out parameters + size = ParameterVariables.size(); + gi.AppendToSavegame('SPNM', &size, sizeof(size)); + + for (iv = ParameterVariables.begin(); iv != ParameterVariables.end(); iv++) + { + (*iv)->Write(this); + } + + // Save out stack + size = Stack.size(); + gi.AppendToSavegame('SSNM', &size, sizeof(size)); + + for (iv = Stack.begin(); iv != Stack.end(); iv++) + { + (*iv)->Write(this); + } + + // Save out waiting + size = Waiting.size(); + gi.AppendToSavegame('SWNM', &size, sizeof(size)); + + for (iv = Waiting.begin(); iv != Waiting.end(); iv++) + { + (*iv)->Write(this); + } + + // Save out signalers + size = Signalers.size(); + gi.AppendToSavegame('SINM', &size, sizeof(size)); + + for (is = Signalers.begin(); is != Signalers.end(); is++) + { + (*is)->Write(this); + } + + // Save out parameters + size = ParameterValues.size(); + gi.AppendToSavegame('SVNM', &size, sizeof(size)); + + for (isv = ParameterValues.begin(); isv != ParameterValues.end(); isv++) + { + (*isv)->Write(this); + } + + // Save out events + size = Events.size(); + gi.AppendToSavegame('SENM', &size, sizeof(size)); + + for (iev = Events.begin(); iev != Events.end(); iev++) + { + (*iev)->Write(this); + } + + // Save out conditions + size = OnConditions.size(); + gi.AppendToSavegame('SCNM', &size, sizeof(size)); + + temp = new int [size]; + for(ic = OnConditions.begin(), i = 0; ic != OnConditions.end(); ic++, i++) + { + temp[i] = *ic; + } + gi.AppendToSavegame('SCND', temp, sizeof(int) * size); + delete [] temp; +} + +CScript::CScript(void) +{ + int size; + int i; + int *temp; + savescript_t ss; + saveglobal_t sg; + + Clear(true); + + // Read in name and load in script + gi.ReadFromSavegame('SNAM', Name, sizeof(Name)); + LoadFile(); + + // Read in regular scritp data + gi.ReadFromSavegame('SCRP', &ss, sizeof(ss)); + + ScriptCondition = ss.ScriptCondition; + ConditionInfo = ss.ConditionInfo; + Length = ss.Length; + Position = ss.Position; + DebugFlags = ss.DebugFlags; + owner = GetEdictPtr(ss.owner); + other = GetEdictPtr(ss.other); + activator = GetEdictPtr(ss.activator); + + // fields - they'll put themselves in + gi.ReadFromSavegame('SFNM', &size, sizeof(size)); + for(i = 0; i < size; i++) + { + RestoreObject(ScriptRL, this); + } + + // Read in any used global vars + gi.ReadFromSavegame('SGNM', &size, sizeof(size)); + for (i = 0; i < size; i++) + { + gi.ReadFromSavegame('SGLB', &sg, sizeof(sg)); + VarIndex[sg.index] = FindGlobal(sg.name); + } + + // Read in local variables + gi.ReadFromSavegame('SLNM', &size, sizeof(size)); + for(i = 0; i < size; i++) + { + LocalVariables.push_back((Variable *)RestoreObject(ScriptRL, this)); + } + + // Read in parameters + gi.ReadFromSavegame('SPNM', &size, sizeof(size)); + for(i = 0; i < size; i++) + { + ParameterVariables.push_back((Variable *)RestoreObject(ScriptRL, this)); + } + + // Read in stack + gi.ReadFromSavegame('SSNM', &size, sizeof(size)); + for(i = 0; i < size; i++) + { + Stack.push_back((Variable *)RestoreObject(ScriptRL, this)); + } + + // Read in waiting + gi.ReadFromSavegame('SWNM', &size, sizeof(size)); + for(i = 0; i < size; i++) + { + Waiting.push_back((Variable *)RestoreObject(ScriptRL, this)); + } + + // Read in signalers + gi.ReadFromSavegame('SINM', &size, sizeof(size)); + for(i = 0; i < size; i++) + { + Signalers.push_back((Signaler *)RestoreObject(ScriptRL, this)); + } + + // Read in parameters + gi.ReadFromSavegame('SVNM', &size, sizeof(size)); + for(i = 0; i < size; i++) + { + ParameterValues.push_back((StringVar *)RestoreObject(ScriptRL, this)); + } + + // Read in events + gi.ReadFromSavegame('SENM', &size, sizeof(size)); + for(i = 0; i < size; i++) + { + Events.push_back((Event *)RestoreObject(ScriptRL, this)); + } + + // Read in conditions + gi.ReadFromSavegame('SCNM', &size, sizeof(size)); + temp = new int [size]; + gi.ReadFromSavegame('SCND', temp, sizeof(int) * size); + + for(i = 0; i < size; i++) + { + OnConditions.push_back(temp[i]); + } + delete [] temp; + + // Patch in script to owner + owner->Script = this; +} + +CScript::~CScript(void) +{ + Free(true); +} + +void CScript::LoadFile(void) +{ + int Version; + + Length = gi.FS_LoadFile(Name, (void **)&Data); + if (Length == -1) + { + Com_Printf(P_RED "***********************************************\n"); + Com_Printf(P_RED "Could not open script %s\n", Name); + Com_Printf(P_RED "***********************************************\n"); + } + else + { + Version = ReadInt(); + + if (Version != SCRIPT_VERSION) + { + Com_Printf(P_RED "***********************************************\n"); + Com_Printf(P_RED "Bad script version for %s: found %d, expecting %d\n", Name, Version, SCRIPT_VERSION); + Com_Printf(P_RED "***********************************************\n"); + } + else + { + ScriptCondition = COND_READY; + } + } +} + +void CScript::Free(bool DoData) +{ + int i; + list::iterator iv; + list::iterator is; + list::iterator isv; + list::iterator iev; + + if (Data && DoData) + { + gi.FS_FreeFile(Data); + Data = NULL; + } + + while(LocalVariables.size()) + { + iv=LocalVariables.begin(); + delete (*iv); + + LocalVariables.erase(iv); + } + + while(ParameterVariables.size()) + { + iv=ParameterVariables.begin(); + delete (*iv); + + ParameterVariables.erase(iv); + } + + while(Stack.size()) + { + iv=Stack.begin(); + delete (*iv); + + Stack.erase(iv); + } + + while(Waiting.size()) + { + iv=Waiting.begin(); + delete (*iv); + + Waiting.erase(iv); + } + + while(Signalers.size()) + { + is=Signalers.begin(); + delete (*is); + + Signalers.erase(is); + } + + while(ParameterValues.size()) + { + isv=ParameterValues.begin(); + delete (*isv); + + ParameterValues.erase(isv); + } + + while(Events.size()) + { + iev=Events.begin(); + delete (*iev); + + Events.erase(iev); + } + + OnConditions.clear(); + + for(i=0;i::iterator it; + + for(it = Events.begin(), idx = 0; it != Events.end(); it++, idx++) + { + if((*it) == ev) + { + return(idx); + } + } + return(-1); +} + +Event *CScript::GetEventPtr(int ev) +{ + list::iterator it; + int i; + + if(ev >= Events.size()) + { + return(NULL); + } + it = Events.begin(); + for(i = 0; i < ev; i++) + { + it++; + } + return((*it)); +} + +int CScript::LookupVarIndex(Variable *Var) +{ + int i; + + for(i=0;i= MAX_INDEX) + { + Error("Index out of range: %d > %d",Index,MAX_INDEX); + } + + VarIndex[Index] = RetVal; + + return RetVal; +} + +void CScript::PushStack(Variable *VI) +{ + if (!VI) + { + Error("Illegal push"); + } + + Stack.push_back(VI); +} + +Variable *CScript::PopStack(void) +{ + Variable *Value; + list::iterator iv; + + if (Stack.size()) + { + iv = --Stack.end(); + Value = *iv; + Stack.pop_back(); + + return Value; + } + + return NULL; +} + +void CScript::HandleGlobal(bool Assignment) +{ + Variable *Var; + int Index; + + Var = ReadDeclaration(Index); + + if (Assignment) + { + Var->ReadValue(this); + } + + if (!NewGlobal(Var)) + { + VarIndex[Index] = FindGlobal(Var->GetName()); + + delete Var; + } +} + +void CScript::HandleLocal(bool Assignment) +{ + Variable *Var; + int Index; + + Var = ReadDeclaration(Index); + + if (Assignment) + { + Var->ReadValue(this); + } + + NewLocal(Var); +} + +void CScript::HandleParameter(bool Assignment) +{ + Variable *Var; + int Index; + + Var = ReadDeclaration(Index); + + if (Assignment) + { + Var->ReadValue(this); + } + + NewParameter(Var); +} + +void CScript::HandleField(void) +{ + int Index; + FieldDef *NewField; + + NewField = new FieldDef(this); + + Index = ReadInt(); + if (Index < 0 || Index >= MAX_INDEX) + { + Error("Index for field out of range: %d > %d\n",Index,MAX_INDEX); + } + + Fields[Index] = NewField; +} + +void CScript::HandleGoto(void) +{ + Position = ReadInt(); +} + +Variable *CScript::HandleSpawn(void) +{ + int Count; + edict_t *ent; + Variable *Name; + Variable *Value; + field_t *f; + const char *NameValue; + byte *b; + + ent = G_Spawn(); + + for(Count = ReadByte(); Count; Count--) + { + Name = PopStack(); + Value = PopStack(); + if (!Name || !Value) + { + Error("Invalid stack for HandleSpawn()"); + } + + NameValue = Name->GetStringValue(); + + for (f=fields ; f->name ; f++) + { + if (!stricmp(f->name, (char *)NameValue) ) + { + if (f->flags & FFL_SPAWNTEMP) + { + b = (byte *)&st; + } + else + { + b = (byte *)ent; + } + + switch (f->type) + { + case F_STRING: + *(char **)(b+f->ofs) = ED_NewString (Value->GetStringValue()); + break; + case F_VECTOR: + Value->GetVectorValue(*(vec3_t *)(b+f->ofs)); + break; + case F_INT: + *(int *)(b+f->ofs) = Value->GetIntValue(); + break; + case F_FLOAT: + *(float *)(b+f->ofs) = Value->GetFloatValue(); + break; + case F_ANGLEHACK: + ((float *)(b+f->ofs))[0] = 0; + ((float *)(b+f->ofs))[1] = Value->GetFloatValue(); + ((float *)(b+f->ofs))[2] = 0; + break; + case F_IGNORE: + break; + + } + break; + } + } + delete Name; + delete Value; + } + + ED_CallSpawn(ent); + + return new EntityVar(ent); +} + +Variable *CScript::HandleBuiltinFunction(void) +{ + int Index; + edict_t *Search; + Variable *V1, *V2; + Variable *Var; + + Index = ReadByte(); + switch(Index) + { + case FUNC_FIND_ENTITY_WITH_TARGET: + V1 = PopStack(); + Search = G_Find(NULL, FOFS(targetname), V1->GetStringValue()); + Var = new EntityVar(Search); + + // kef + if (game.cinematicfreeze && Search && Search->ai) + { // flag these jokers as being used by a cinematic + Search->count = 255; + } + delete V1; + break; + + case FUNC_SIN: + V1 = PopStack(); + Var = new FloatVar( "", sin( V1->GetFloatValue() * DEGTORAD )); + + delete V1; + break; + + case FUNC_COS: + V1 = PopStack(); + Var = new FloatVar("", cos( V1->GetFloatValue() * DEGTORAD )); + + delete V1; + break; + + case FUNC_RANDOM: + V1 = PopStack(); + V2 = PopStack(); + Var = new FloatVar("", (float)gi.irand(V1->GetIntValue(), V2->GetIntValue()) ); + + delete V1; + delete V2; + break; + + case FUNC_FIND_ENTITY_WITH_SCRIPT: + V1 = PopStack(); + Search = G_Find(NULL, FOFS(scripttarget), V1->GetStringValue()); + Var = new EntityVar(Search); + + // kef + if (game.cinematicfreeze && Search && Search->ai) + { // flag these jokers as being used by a cinematic + Search->count = 255; + } + delete V1; + break; + + case FUNC_FIND_PLAYER: + Search = G_Find (NULL, FOFS(classname), "player"); + Var = new EntityVar(Search); + break; + + case FUNC_SPAWN: + Var = HandleSpawn(); + break; + + case FUNC_GET_OTHER: + Var = new EntityVar(other); + break; + + case FUNC_GET_ACTIVATOR: + Var = new EntityVar(activator); + break; + + case FUNC_GET_PLAYER: + V1 = PopStack(); + Var = new EntityVar(g_edicts+V1->GetIntValue() + 1); + + delete V1; + + break; + } + + return Var; +} + +void CScript::HandlePush(void) +{ + int Type; + Variable *Var; + + Type = ReadByte(); + switch(Type) + { + case PUSH_CONST_INT: + Var = new IntVar(); + Var->ReadValue(this); + break; + case PUSH_CONST_FLOAT: + Var = new FloatVar(); + Var->ReadValue(this); + break; + case PUSH_CONST_VECTOR: + Var = new VectorVar(); + Var->ReadValue(this); + break; + case PUSH_CONST_ENTITY: + Var = new EntityVar(); + Var->ReadValue(this); + break; + case PUSH_CONST_STRING: + Var = new StringVar(); + Var->ReadValue(this); + break; + case PUSH_VAR: + Var = new VariableVar(); + ((VariableVar *)Var)->ReadValue(this); + break; + case PUSH_VAR_WITH_FIELD: + Var = new FieldVariableVar(); + ((VariableVar *)Var)->ReadValue(this); + break; + case PUSH_FUNCTION: + Var = HandleBuiltinFunction(); + break; + } + + PushStack(Var); +} + +void CScript::HandlePop(void) +{ + Variable *V; + + V = PopStack(); + if (V) + { + delete V; + } +} + +void CScript::HandleAssignment(void) +{ + Variable *Value, *Assignee; + + Assignee = PopStack(); + Value = PopStack(); + if (Value == NULL || Assignee == NULL) + { + Error("Invalid stack for Add"); + } + + (*Assignee) = Value; + + delete Assignee; + delete Value; +} + +void CScript::HandleAdd(void) +{ + Variable *V1, *V2; + + V1 = PopStack(); + V2 = PopStack(); + if (V1 == NULL || V2 == NULL) + { + Error("Invalid stack for Add"); + } + + PushStack((*V1) + V2); + + delete V1; + delete V2; +} + +void CScript::HandleSubtract(void) +{ + Variable *V1, *V2; + + V1 = PopStack(); + V2 = PopStack(); + if (V1 == NULL || V2 == NULL) + { + Error("Invalid stack for Subtract"); + } + + PushStack((*V1) - V2); + + delete V1; + delete V2; +} + +void CScript::HandleMultiply(void) +{ + Variable *V1, *V2; + + V1 = PopStack(); + V2 = PopStack(); + if (V1 == NULL || V2 == NULL) + { + Error("Invalid stack for Multiply"); + } + + PushStack((*V1) * V2); + + delete V1; + delete V2; +} + +void CScript::HandleDivide(void) +{ + Variable *V1, *V2; + + V1 = PopStack(); + V2 = PopStack(); + if (V1 == NULL || V2 == NULL) + { + Error("Invalid stack for Divide"); + } + + PushStack((*V1) / V2); + + delete V1; + delete V2; +} + +void CScript::HandleDebug(void) +{ + list::iterator iv; + int Flags; + + Flags = ReadByte(); + + if (Flags) + { + if (Flags & DEBUG_ENABLE) + { + Flags &= ~DEBUG_ENABLE; + DebugFlags |= Flags; + } + else + { + DebugFlags &= ~Flags; + } + } + else + { + StartDebug(); + + if (ParameterVariables.size()) + { + DebugLine(" Parameters:\n"); + for (iv=ParameterVariables.begin();iv != ParameterVariables.end();iv++) + { + (*iv)->Debug(this); + } + } + + if (GlobalVariables.size()) + { + DebugLine(" Global Variables:\n"); + for (iv=GlobalVariables.begin();iv != GlobalVariables.end();iv++) + { + (*iv)->Debug(this); + } + } + + if (LocalVariables.size()) + { + DebugLine(" Local Variables:\n"); + for (iv=LocalVariables.begin();iv != LocalVariables.end();iv++) + { + (*iv)->Debug(this); + } + } + EndDebug(); + } +} + +void CScript::HandleDebugStatement(void) +{ + DebugLine("%s\n",ReadString()); +} + +void CScript::HandleAddAssignment(void) +{ + Variable *Value, *Assignee, *temp; + + Assignee = PopStack(); + Value = PopStack(); + if (Value == NULL || Assignee == NULL) + { + Error("Invalid stack for AddAssignment"); + } + + temp = (*Assignee) + Value; + (*Assignee) = temp; + delete temp; + + delete Assignee; + delete Value; +} + +void CScript::HandleSubtractAssignment(void) +{ + Variable *Value, *Assignee, *temp; + + Assignee = PopStack(); + Value = PopStack(); + if (Value == NULL || Assignee == NULL) + { + Error("Invalid stack for SubtractAssignment"); + } + + temp = (*Assignee) - Value; + (*Assignee) = temp; + delete temp; + + delete Assignee; + delete Value; +} + +void CScript::HandleMultiplyAssignment(void) +{ + Variable *Value, *Assignee, *temp; + + Assignee = PopStack(); + Value = PopStack(); + if (Value == NULL || Assignee == NULL) + { + Error("Invalid stack for MultiplyAssignment"); + } + + temp = (*Assignee) * Value; + (*Assignee) = temp; + delete temp; + + delete Assignee; + delete Value; +} + +void CScript::HandleDivideAssignment(void) +{ + Variable *Value, *Assignee, *temp; + + Assignee = PopStack(); + Value = PopStack(); + if (Value == NULL || Assignee == NULL) + { + Error("Invalid stack for DivideAssignment"); + } + + temp = (*Assignee) / Value; + (*Assignee) = temp; + delete temp; + + delete Assignee; + delete Value; +} + +bool CScript::HandleWait(bool ForAll) +{ + int count; + Variable *VI; + + count = ReadByte(); + if (count & WAIT_CLEAR) + { + ConditionInfo = WAIT_CLEAR; + } + else + { + ConditionInfo = 0; + } + + count &= ~WAIT_CLEAR; + + for(;count;count--) + { + VI = PopStack(); + if (!VI) + { + Error("Invalid stack for HandleWait"); + } + + Waiting.push_back(VI); + } + + if (ForAll) + { + ScriptCondition = COND_WAIT_ALL; + } + else + { + ScriptCondition = COND_WAIT_ANY; + } + + if (CheckWait()) + { + FinishWait(NULL,false); + + return false; + } + + return true; +} + +bool CScript::HandleTimeWait(void) +{ + Variable *V; + float NextTime; + + V = PopStack(); + if (!V) + { + Error("Invalid stack for Time Wait"); + } + + NextTime = level.time + V->GetFloatValue(); + delete V; + + if (NextTime <= level.time) + { + return false; + } + + AddEvent(new WaitEvent(NextTime) ); + + ScriptCondition = COND_WAIT_TIME; + + return true; +} + +bool CScript::HandleIf(bool Reverse) +{ + int Condition; + int Location; + Variable *V1, *V2; + bool Result; + + Condition = ReadByte(); + Location = ReadInt(); + + V2 = PopStack(); + V1 = PopStack(); + + if (V1 == NULL || V2 == NULL) + { + Error("Invalid stack for If"); + } + + Result = false; + + switch(Condition) + { + case COND_EQUAL: + if ((*V1) == V2) + { + Result = true; + } + break; + case COND_LESS_THAN: + if ((*V1) < V2) + { + Result = true; + } + break; + case COND_LESS_THAN_EQUAL: + if ((*V1) <= V2) + { + Result = true; + } + break; + case COND_GREATER_THAN: + if ((*V1) > V2) + { + Result = true; + } + break; + case COND_GREATER_THAN_EQUAL: + if ((*V1) >= V2) + { + Result = true; + } + break; + case COND_NOT_EQUAL: + if ((*V1) != V2) + { + Result = true; + } + break; + } + + if (Result == Reverse) + { + Position = Location; + } + + delete V1; + delete V2; + + return (Result == Reverse); +} + +void CScript::HandleOn(void) +{ + OnConditions.push_back(Position-1); + + // First Push + if (ReadByte() != CODE_PUSH) + { + Error("Expecting PUSH for on statement"); + } + HandlePush(); + delete PopStack(); + + // Second Push + if (ReadByte() != CODE_PUSH) + { + Error("Expecting PUSH for on statement"); + } + HandlePush(); + delete PopStack(); + + ReadByte(); // Condition + ReadInt(); // Jump Location +} + +bool CScript::ProcessOn(int NewPosition) +{ + SavePosition = Position; + + Position = NewPosition; + + if (ReadByte() != CODE_ON) + { + Error("Invalid opcode when handling on statement"); + } + + if (ReadByte() != CODE_PUSH) + { + Error("Expecting PUSH for on statement"); + } + HandlePush(); + + // Second Push + if (ReadByte() != CODE_PUSH) + { + Error("Expecting PUSH for on statement"); + } + HandlePush(); + + if (!HandleIf(true)) + { + Position = SavePosition; + return false; + } + + ClearEvents = true; + SaveScriptCondition = ScriptCondition; + ScriptCondition = COND_READY; + + Execute(NULL, NULL); + + return true; +} + +void CScript::HandleResume(void) +{ + if (!ClearEvents) + { + Error("Resume command executed outside of ON branch"); + } + + ClearEvents = false; + + Position = SavePosition; + ScriptCondition = SaveScriptCondition; +} + +void CScript::HandlePrint(void) +{ + int Flags; + Variable *Text, *Entity, *Level; + char *TextValue; + int TextIndex; + int LevelValue; + edict_t *ent; + + Entity = Level = NULL; + LevelValue = PRINT_HIGH; + ent = NULL; + + Flags = ReadByte(); + + Text = PopStack(); + if (!Text) + { + Error("Invalid stack for Print"); + } + if (Text->GetType() == TypeSTRING) + { + TextValue = Text->GetStringValue(); + } + else + { + TextValue = ""; + TextIndex = Text->GetIntValue(); + } + + if (Flags & PRINT_LEVEL) + { + Level = PopStack(); + if (!Level) + { + Error("Invalid stack for Print"); + } + LevelValue = Level->GetIntValue(); + } + + if (Flags & PRINT_ENTITY) + { + Entity = PopStack(); + if (!Entity) + { + Error("Invalid stack for Print"); + } + ent = Entity->GetEdictValue(); + } + + if (!sv_jumpcinematic->value || !game.cinematicfreeze) + { + + if (Text->GetType() == TypeSTRING) + { + if (ent) + { + gi.cprintf(ent, LevelValue, TextValue); + } + else + { + gi.bprintf(LevelValue, TextValue); + } + } + else + { + gi.SP_Print(ent, TextIndex); + } + } + + + delete Text; + if (Entity) + { + delete Entity; + } + if (Level) + { + delete Level; + } +} + +void CScript::HandlePlaySound(void) +{ + int Flags; + Variable *SoundName, *Entity, *Volume, *Attenuation, *Channel, *TimeDelay; + char *SoundValue; + float VolumeValue, AttenuationValue, TimeDelayValue; + int ChannelValue; + edict_t *ent; + + + Entity = Volume = Attenuation = Channel = TimeDelay = NULL; + ent = NULL; + VolumeValue = 1.0; + AttenuationValue = ATTN_NORM; + + ChannelValue = CHAN_VOICE; + + TimeDelayValue = 0.0; + + Flags = ReadByte(); + + SoundName = PopStack(); + if (!SoundName) + { + Error("Invalid stack for PlaySound"); + } + SoundValue = SoundName->GetStringValue(); + + if (Flags & PLAY_SOUND_TIMEDELAY) + { + TimeDelay = PopStack(); + if (!TimeDelay) + { + Error("Invalid stack for PlaySound"); + } + TimeDelayValue = TimeDelay->GetFloatValue(); + } + + if (Flags & PLAY_SOUND_CHANNEL) + { + Channel = PopStack(); + if (!Channel) + { + Error("Invalid stack for PlaySound"); + } + ChannelValue = Channel->GetIntValue(); + } + + if (Flags & PLAY_SOUND_ATTENUATION) + { + Attenuation = PopStack(); + if (!Attenuation) + { + Error("Invalid stack for PlaySound"); + } + AttenuationValue = Attenuation->GetFloatValue(); + } + + if (Flags & PLAY_SOUND_VOLUME) + { + Volume = PopStack(); + if (!Volume) + { + Error("Invalid stack for PlaySound"); + } + VolumeValue = Volume->GetFloatValue(); + } + + if (Flags & PLAY_SOUND_ENTITY) + { + Entity = PopStack(); + if (!Entity) + { + Error("Invalid stack for PlaySound"); + } + ent = Entity->GetEdictValue(); + } + + if (!sv_jumpcinematic->value || !game.cinematicfreeze) + { + gi.sound(ent, ChannelValue, gi.soundindex(SoundValue), VolumeValue, AttenuationValue, TimeDelayValue); + } + + delete SoundName; + if (Entity) + { + delete Entity; + } + if (Volume) + { + delete Volume; + } + if (Attenuation) + { + delete Attenuation; + } + if (Channel) + { + delete Channel; + } + if (TimeDelay) + { + delete TimeDelay; + } +} + +void CScript::HandleUnloadSound(void) +{ + Variable *SoundName; + char *SoundValue; + + SoundName = PopStack(); + if (!SoundName) + { + Error("Invalid stack for HandleUnloadSound"); + } + SoundValue = SoundName->GetStringValue(); + + gi.unload_sound(SoundValue); + + delete SoundName; +} + +void CScript::HandleUnloadROFF(void) +{ + Variable *ROFFName; + char *ROFFValue; + + ROFFName = PopStack(); + if (!ROFFName) + { + Error("Invalid stack for HandleUnloadROFF"); + } + ROFFValue = ROFFName->GetStringValue(); + + RemoveROFF(ROFFValue); + + delete ROFFName; +} + +void CScript::HandleFeature(bool Enable) +{ + int FeatureType; + + FeatureType = ReadByte(); + + switch(FeatureType) + { + case FEATURE_TRIGGER: + HandleTrigger(Enable); + break; + + case FEATURE_AMBIENT_SOUNDS: + break; + + case FEATURE_CINEMATICS: + CinematicFreeze(Enable); + break; + + case FEATURE_PLAGUE_SKINS: + break; + } +} + +void CScript::HandleCacheSound(void) +{ + Variable *SoundName; + char *SoundValue; + + SoundName = PopStack(); + if (!SoundName) + { + Error("Invalid stack for HandleChacheSound"); + } + SoundValue = SoundName->GetStringValue(); + + + if (!sv_jumpcinematic->value || !game.cinematicfreeze) + { + gi.soundindex(SoundValue); + } + + delete SoundName; +} + +void CScript::HandleCacheStringPackage(void) +{ + Variable *SPName; + char *SPValue; + + SPName = PopStack(); + if (!SPName) + { + Error("Invalid stack for HandleCacheStringPackage"); + } + SPValue = SPName->GetStringValue(); + + gi.SP_Register(SPValue); + + delete SPName; +} + +void CScript::HandleCacheROFF(void) +{ + Variable *SPName; + char *SPValue; + + SPName = PopStack(); + if (!SPName) + { + Error("Invalid stack for HandleCacheROFF"); + } + SPValue = SPName->GetStringValue(); + + FindROFF(SPValue); + + delete SPName; +} + + +void CScript::HandleMove(void) +{ + int Flags; + Variable *Signaler, *Rate, *Duration, *Amount, *Entity; + edict_t *ent; + vec3_t Vec,Dest,Diff; + vec_t Length; + + Signaler = Rate = Duration = NULL; + + Flags = ReadByte(); + + if (Flags & MOVE_SIGNALER) + { + Signaler = PopStack(); + } + + if (Flags & MOVE_RATE) + { + Rate = PopStack(); + } + + if (Flags & MOVE_DURATION) + { + Duration = PopStack(); + } + + Amount = PopStack(); + Entity = PopStack(); + + Amount->GetVectorValue(Vec); + + ent = Entity->GetEdictValue(); + if (ent) + { + if (!Rate && !Duration) + { + if (!(Flags & MOVE_ABSOLUTE)) + { + VectorAdd(ent->s.origin, Vec, ent->s.origin); + } + else + { + VectorCopy(Vec, ent->s.origin); + } + if (ent->chain) + { + VectorAdd(ent->chain->s.origin, Vec, ent->chain->s.origin); + } + } + else + { + if (!(Flags & MOVE_ABSOLUTE)) + { + VectorAdd(ent->s.origin, Vec, Dest); + } + else + { + VectorCopy(Vec, Dest); + } + + VectorSubtract(ent->s.origin, Dest, Diff); + Length = VectorLength(Diff); + + if (Rate && Duration) + { + ent->moveinfo.decel = ent->moveinfo.accel = ent->moveinfo.speed = Rate->GetFloatValue(); + Length = Rate->GetFloatValue() * Duration->GetFloatValue(); + VectorNormalize(Diff); + VectorMA(ent->s.origin, Length, Diff, Dest); + } + else if (Rate) + { + ent->moveinfo.decel = ent->moveinfo.accel = ent->moveinfo.speed = Rate->GetFloatValue(); + } + else + { + ent->moveinfo.decel = ent->moveinfo.accel = ent->moveinfo.speed = Length / Duration->GetFloatValue(); + } + + if (DebugFlags & DEBUG_MOVE) + { + StartDebug(); + DebugLine(" Moving Entity %d\n",Entity->GetIntValue()); + DebugLine(" From (%7.3f, %7.3f, %7.3f)\n",ent->s.origin[0],ent->s.origin[1],ent->s.origin[2]); + DebugLine(" To (%7.3f, %7.3f, %7.3f)\n",Dest[0], Dest[1], Dest[2]); + EndDebug(); + } + + if (Signaler) + { + AddSignaler(ent, Signaler, SIGNAL_MOVE); + Signaler=0; + } + + Move(ent, Dest); + } + } + + delete Amount; + delete Entity; +// Signaling routine will handle this.... +// not if AddSignaler isn't called :) + if (Signaler) + { + delete Signaler; + } + if (Rate) + { + delete Rate; + } + if (Duration) + { + delete Duration; + } +} + +void CScript::HandleRotate(void) +{ + int Flags; + Variable *Signaler, *Rate, *Duration, *Amount, *Entity; + edict_t *ent; + vec3_t Vec,Dest,Diff; + vec_t Length; + + Signaler = Rate = Duration = NULL; + + Flags = ReadByte(); + + if (Flags & ROTATE_SIGNALER) + { + Signaler = PopStack(); + } + + if (Flags & ROTATE_RATE) + { + Rate = PopStack(); + } + + if (Flags & ROTATE_DURATION) + { + Duration = PopStack(); + } + + Amount = PopStack(); + Entity = PopStack(); + + Amount->GetVectorValue(Vec); + + ent = Entity->GetEdictValue(); + if (ent) + { + if (!Rate && !Duration) + { + VectorAdd(ent->s.angles, Vec, ent->s.angles); + if (ent->chain) + { + VectorAdd(ent->chain->s.angles, Vec, ent->chain->s.angles); + } + } + else + { + if (!(Flags & MOVE_ABSOLUTE)) + { + VectorAdd(ent->s.angles, Vec, Dest); + } + else + { + VectorCopy(Vec, Dest); + } + + VectorSubtract(ent->s.angles, Dest, Diff); + Length = VectorLength(Diff); + + if (Rate && Duration) + { + ent->moveinfo.speed = Rate->GetFloatValue(); + Length = Rate->GetFloatValue() * Duration->GetFloatValue(); + VectorNormalize(Diff); + VectorMA(ent->s.angles, Length, Diff, Dest); + } + else if (Rate) + { + ent->moveinfo.speed = Rate->GetFloatValue(); + } + else + { + ent->moveinfo.speed = Length / Duration->GetFloatValue(); + } + + VectorCopy(Dest, ent->moveinfo.start_angles); + VectorCopy(Dest, ent->moveinfo.end_angles); + + if (DebugFlags & DEBUG_ROTATE) + { + StartDebug(); + DebugLine(" Rotating Entity %d\n",Entity->GetIntValue()); + DebugLine(" From (%7.3f, %7.3f, %7.3f)\n",ent->s.angles[0],ent->s.angles[1],ent->s.angles[2]); + DebugLine(" To (%7.3f, %7.3f, %7.3f)\n",ent->moveinfo.end_angles[0], ent->moveinfo.end_angles[1], ent->moveinfo.end_angles[2]); + EndDebug(); + } + + if (Signaler) + { + AddSignaler(ent, Signaler, SIGNAL_ROTATE); + Signaler=0; + } + Rotate(ent); + } + } + + delete Amount; + delete Entity; +// Signaling routine will handle this + if (Signaler) + { + delete Signaler; + } + if (Rate) + { + delete Rate; + } + if (Duration) + { + delete Duration; + } +} + +void CScript::HandleMoveRotate(void) +{ + int Flags; + Variable *Signaler, *FileName, *Entity; + edict_t *ent; + + Signaler = NULL; + + Flags = ReadByte(); + + if (Flags & MOVEROTATE_SIGNALER) + { + Signaler = PopStack(); + } + + FileName = PopStack(); + Entity = PopStack(); + + ent = Entity->GetEdictValue(); + if (ent) + { + byte *pbROFData; + + pbROFData = (byte *)FindROFF(FileName->GetStringValue()); + if (pbROFData) + { + // check file header... (struct declared here because nowhere else in program ever sees the format) + // + typedef struct + { + char sHeader[4]; // "ROFF" (Rotation, Origin File Format) + long lVersion; + float fCount; // personally I'd have thought this should be an int, but I vos only follovink orderz + // cuz originally the plugin was only capable of writing out floats + // + // Followed by main body data... + // + // for each fCount:- + // + // Float, float, float: relative origin change + // Float, float, float: relative rotation change + // + } ROFHDR, *LPROFHDR; + + LPROFHDR lpROFHdr = (LPROFHDR) pbROFData; + + // (If code size is ever an issue I could always combine these checks into one and just say "bad file %s"...) + // + if (strncmp(lpROFHdr->sHeader,"ROFF",4)!=0) + { + Com_Printf("***********************************************\n"); + Com_Printf("Bad header in .ROF file '%s'\n",FileName->GetStringValue()); + Com_Printf("***********************************************\n"); + } + else + { + if (lpROFHdr->lVersion != ROFF_VERSION) + { + Com_Printf("***********************************************\n"); + Com_Printf("Bad version (%d) in .ROF file '%s'\n",lpROFHdr->lVersion,FileName->GetStringValue()); + Com_Printf("***********************************************\n"); + } + else + { + if (lpROFHdr->fCount <= 0) + { + Com_Printf("***********************************************\n"); + Com_Printf("Bad count %f in .ROF file '%s'\n",lpROFHdr->fCount,FileName->GetStringValue()); + Com_Printf("***********************************************\n"); + } + else + {// file valid... + + // note that since I read the whole file in at once and stack up a big queue of these, then I + // need to keep a running copy of where the ent's origin and angles would be, and add the relative + // changes to those, rather than to its current ones... + // + vec3_t v3OriginAtThisPoint, + v3RotationAtThisPoint; + + VectorCopy(ent->s.origin,v3OriginAtThisPoint); + VectorCopy(ent->s.angles,v3RotationAtThisPoint); + + if (Signaler) + { + AddSignaler(ent, Signaler, SIGNAL_MOVEROTATE); + } + + vec3_t *v3ROFData = (vec3_t *) &lpROFHdr[1]; + for (int i=0; i<(int)(lpROFHdr->fCount); i++, v3ROFData+=2) + { + // Float, float, float: relative origin change + // Float, float, float: relative rotation change + // + AddEvent(new MoveRotateEvent(level.time + (i * FRAMETIME), ent, v3ROFData[0], v3ROFData[1])); + + // debug lines broken into 2 places just to make the variable printing more convenient... + // + if (DebugFlags & DEBUG_MOVEROTATE) + { + StartDebug(); + DebugLine(" MoveRotating Entity %d\n",Entity->GetIntValue()); + DebugLine(" Origin (%7.3f, %7.3f, %7.3f)\n",v3ROFData[0][0],v3ROFData[0][1],v3ROFData[0][2]); + DebugLine(" Rotation (%7.3f, %7.3f, %7.3f)\n",v3ROFData[1][0],v3ROFData[1][1],v3ROFData[1][2]); + DebugLine(" -- -- --\n"); + DebugLine(" Origin Start (%7.3f, %7.3f, %7.3f)\n",v3OriginAtThisPoint[0],v3OriginAtThisPoint[1],v3OriginAtThisPoint[2]); + DebugLine(" Rotation Start (%7.3f, %7.3f, %7.3f)\n",v3RotationAtThisPoint[0],v3RotationAtThisPoint[1],v3RotationAtThisPoint[2]); + DebugLine(" -- -- --\n"); + + Vec3AddAssign(v3ROFData[0],v3OriginAtThisPoint); + Vec3AddAssign(v3ROFData[1],v3RotationAtThisPoint); + + DebugLine(" Origin Stop (%7.3f, %7.3f, %7.3f)\n",v3OriginAtThisPoint[0],v3OriginAtThisPoint[1],v3OriginAtThisPoint[2]); + DebugLine(" Rotation Stop (%7.3f, %7.3f, %7.3f)\n",v3RotationAtThisPoint[0],v3RotationAtThisPoint[1],v3RotationAtThisPoint[2]); + EndDebug(); + } + }// for (int i=0; i<(int)(lpROFHdr->fCount); i++) + + if (Signaler) + { + // add a fake MoveRotate event with special values if we're doing signalling to indicate EOS... + // + AddEvent(new MoveRotateEvent(level.time + (i * FRAMETIME), ent, v3ROFF_EOS_Marker, v3ROFF_EOS_Marker)); + Signaler=0; + } + }// file valid + }// version ok + }// header ok + }// file opened ok + }// if (ent) + + delete FileName; + delete Entity; + delete Signaler; // 100% ok if Signaler=NULL + +}// void CScript::HandleMoveRotate(void) + +void CScript::HandleUse(void) +{ + Variable *Entity; + edict_t *use_ent; + + Entity = PopStack(); + + use_ent = Entity->GetEdictValue(); + if (use_ent && use_ent->use && use_ent->inuse) + { + use_ent->use(use_ent,other,activator); + if (use_ent->ai) + { + use_ent->ai->SetStartleability(false); + } + } + + delete Entity; +} + +void CScript::HandleTrigger(bool Enable) +{ + Variable *Entity; + edict_t *trigger_ent; + + Entity = PopStack(); + + trigger_ent = Entity->GetEdictValue(); + if (trigger_ent) + { + if (Enable) + { + trigger_ent->solid = SOLID_TRIGGER; + trigger_ent->use = Use_Multi; + gi.linkentity (trigger_ent); + } + else + { + trigger_ent->solid = SOLID_NOT; + trigger_ent->use = NULL; + } + } + + delete Entity; +} + +void CScript::HandleRemove (void) +{ + Variable *Remove; + edict_t *RemoveEnt; + + Remove = NULL; + + Remove = PopStack(); + RemoveEnt = Remove->GetEdictValue (); + if (RemoveEnt) + { + G_FreeEdict(RemoveEnt); + } + if (Remove) + { + delete Remove; + } +} + +void CScript::HandleHelicopter(void) +{ + int Flags; + Variable *FloatArg, *Vector, *Target, *Command, *Heli, *Signaler; + float theFloat; + vec3_t vPos; + edict_t *theTarget = NULL; + int actionID = -1; + + + FloatArg = Vector = Target = Command = Heli = Signaler = NULL; + Flags = ReadByte(); + + if (Flags & HELICOPTER_SIGNALER) + { + Signaler = PopStack(); + } + + if (Flags & HELICOPTER_FLOAT) + { + FloatArg = PopStack(); + theFloat = FloatArg->GetFloatValue(); + } + + if (Flags & HELICOPTER_VECT) + { + Vector = PopStack(); + Vector->GetVectorValue(vPos); + } + + if (Flags & HELICOPTER_TARG) + { + Target = PopStack(); + theTarget = Target->GetEdictValue(); + } + + Command = PopStack(); + + Heli = PopStack(); + + ai_public_c* ai = NULL; + scripted_decision* DecisionPointer; + edict_t* ent = NULL; + + if (Heli && (ent = Heli->GetEdictValue())) + { + if (ai = ent->ai) + { + if (!(DecisionPointer = ((ai_c*)(ai))->FindScriptedDecision(ent))) + { + ai->NewDecision(DecisionPointer = new scripted_decision(NULL,SCRIPTED_PRIORITY_ROOT,0,ent),ent); + } + + if (Signaler) + { + AddSignaler(ent, Signaler, SIGNAL_HELI); + Signaler=0; + } + + switch(Command->GetIntValue()) + {// many of these will be combined into less-clunky stuff a bit later + // Also, much of this will eventually have to be routed through BODY, as sequences will + // vary from model to model + case HELI_CHANGE_BODY: + case HELI_CHANGE_SKIN: + { + // need to pass the edict_t* of the heli into MoveAction(), so we pass in ent instead of theTarget + ((ai_c*)ai)->NewAction( ((generic_ghoul_heli_ai*)ai)->MoveAction(DecisionPointer, + NULL, (ai_c*)ai, &MMoves[15], Command->GetIntValue(), + vPos, ent, theFloat),ent, true); + actionID = ((generic_ghoul_heli_ai*)ai)->GetMostRecentlyAddedActionID(); + break; + } + case HELI_TAKEOFF: + case HELI_LAND: + case HELI_GOTO_COORDS:// v3HSE_Coords + case HELI_GOTOREL_ENTITY:// v3HSE_Coords HSE_Entity + case HELI_GOTOREL_ENT_X:// HSE_Entity fHSE_Arg + case HELI_GOTOREL_ENT_Y:// HSE_Entity fHSE_Arg + case HELI_GOTOREL_ENT_Z:// HSE_Entity fHSE_Arg + case HELI_MOVEREL:// v3HSE_Coords + case HELI_STRAFE_RT:// fHSE_Arg + case HELI_STRAFE_LT:// fHSE_Arg + case HELI_HOVER_PASSIVE: // fHSE_Arg + case HELI_HOVER_AGGRESSIVE:// fHSE_Arg + case HELI_SET_DEATHDEST:// v3HSE_Coords + case HELI_SET_WORLDMINS: + case HELI_SET_WORLDMAXS: + case HELI_REPAIR: + case HELI_REARM: + case HELI_SET_TRACEDIMS: + case HELI_SET_HEALTH: + case HELI_SET_MAXHEALTH: + case HELI_AI: // fHSE_Arg + case HELI_WAYPOINT: // vector + case HELI_VOLUME: // vector + case HELI_VOLUMEMINS: // vector + case HELI_VOLUMEMAXS: // vector + case HELI_OUT_OF_CONTROL: + { + ((ai_c*)ai)->NewAction( ((generic_ghoul_heli_ai*)ai)->MoveAction(DecisionPointer, + NULL, (ai_c*)ai, &MMoves[15], Command->GetIntValue(), + vPos, theTarget, theFloat),ent, true); + actionID = ((generic_ghoul_heli_ai*)ai)->GetMostRecentlyAddedActionID(); + } + break; + case HELI_DEBUG: + { + ent->spawnflags |= DEBUG_WAYPOINTS; + break; + } + case HELI_FACE_RELENT:// v3HSE_Coords HSE_Entity + case HELI_FACE_ABSCOORDS:// v3HSE_Coords + case HELI_FACE_ABSDIR:// v3HSE_Coords + case HELI_FACE_RELCOORDS:// v3HSE_Coords + case HELI_PILOT_FACERELENT:// v3HSE_Coords HSE_Entity + case HELI_PILOT_FACERELCOORDS:// v3HSE_Coords + case HELI_PILOT_FACEABSCOORDS:// v3HSE_Coords + case HELI_GUNNER_FACERELENT:// v3HSE_Coords HSE_Entity + case HELI_GUNNER_FACERELCOORDS://v3HSE_Coords + case HELI_GUNNER_FACEABSCOORDS://v3HSE_Coords + { + ((ai_c*)ai)->NewAction( ((generic_ghoul_heli_ai*)ai)->FaceAction(DecisionPointer, + NULL, (ai_c*)ai, &MMoves[15], Command->GetIntValue(), + vPos, theTarget, theFloat),ent, true); + actionID = ((generic_ghoul_heli_ai*)ai)->GetMostRecentlyAddedActionID(); + } + break; + case HELI_ROCKETS_ENABLE:// + case HELI_ROCKETS_DISABLE:// + case HELI_CHAINGUN_ENABLE:// + case HELI_CHAINGUN_DISABLE:// + case HELI_FIREAT_RELENT:// v3HSE_Coords HSE_Entity fHSE_Arg + case HELI_FIREAT_ABSCOORDS:// v3HSE_Coords fHSE_Arg + case HELI_FIREAT_RELCOORDS:// v3HSE_Coords fHSE_Arg + case HELI_AUTOFIRE_ON:// + case HELI_AUTOFIRE_OFF:// + { + ((ai_c*)ai)->NewAction( ((generic_ghoul_heli_ai*)ai)->AttackAction(DecisionPointer, + NULL, (ai_c*)ai, &MMoves[15], Command->GetIntValue(), + vPos, theTarget, theFloat),ent,true); + actionID = ((generic_ghoul_heli_ai*)ai)->GetMostRecentlyAddedActionID(); + } + break; + default: + break; + } + Helicopter(ent, actionID); + } + } + delete (Heli); + delete (Command); + if (Target) + { + delete Target; + } + if (Vector) + { + delete Vector; + } + if (FloatArg) + { + delete FloatArg; + } + delete Signaler; // 100% ok if Signaler=NULL +} + +void CScript::HandleTank(void) +{ + int Flags; + Variable *FloatArg, *Vector, *Target, *Command, *TanK, *Signaler; + float theFloat; + vec3_t vPos; + edict_t *theTarget = NULL; + int actionID = -1; + + + FloatArg = Vector = Target = Command = TanK = Signaler = NULL; + Flags = ReadByte(); + + if (Flags & TANK_SIGNALER) + { + Signaler = PopStack(); + } + + if (Flags & TANK_FLOAT) + { + FloatArg = PopStack(); + theFloat = FloatArg->GetFloatValue(); + } + + if (Flags & TANK_VECT) + { + Vector = PopStack(); + Vector->GetVectorValue(vPos); + } + + if (Flags & TANK_TARG) + { + Target = PopStack(); + theTarget = Target->GetEdictValue(); + } + + Command = PopStack(); + + TanK = PopStack(); + + ai_public_c* ai = NULL; + scripted_decision* DecisionPointer; + edict_t* ent = NULL; + + if (TanK && (ent = TanK->GetEdictValue())) + { + if (ai = ent->ai) + { + if (!(DecisionPointer = ((ai_c*)(ai))->FindScriptedDecision(ent))) + { + ai->NewDecision(DecisionPointer = new scripted_decision(NULL,SCRIPTED_PRIORITY_ROOT,0,ent),ent); + } + + if (Signaler) + { + AddSignaler(ent, Signaler, SIGNAL_TANK); + Signaler=0; + } + + switch(Command->GetIntValue()) + { + // have all commands generate the same type of action (for simplicity's sake) + case TANK_GOTOCOORDS: + case TANK_FIRECANNONATCOORDS: + case TANK_MACHGUNAUTO: + case TANK_DIE: + case TANK_AIMTURRET: + { + ((ai_c*)ai)->NewAction( ((generic_ghoul_tank_ai*)ai)->TankAction(DecisionPointer, + NULL, (ai_c*)ai, &MMoves[15], Command->GetIntValue(), + vPos, theTarget, theFloat),ent, true); + actionID = ((generic_ghoul_tank_ai*)ai)->GetMostRecentlyAddedActionID(); + } + break; + default: + break; + } + Tank(ent, actionID); + } + } + delete (TanK); + delete (Command); + if (Target) + { + delete Target; + } + if (Vector) + { + delete Vector; + } + if (FloatArg) + { + delete FloatArg; + } + delete Signaler; // 100% ok if Signaler=NULL +} + +void CScript::HandleAnimate(void) +{ + int Flags; + Variable *Signaler, *Moving, *Turning, *Repeat, *Action, *Entity, *Source, *Holding, *Target, *NullTarget, *Emotion; + edict_t *ent, *SourceEnt, *TargetEnt; + float HoldingVal; + vec3_t MovingVal; + vec3_t TurningVal; + int RepeatVal = 1, NullTargetVal = 0; + int ActionVal; + int EmotionVal=0; + bool Absolute = false; + bool Kill = false; + void (*SignalerRoutine)(edict_t*); + + SignalerRoutine = NULL; + Signaler = Moving = Turning = Repeat = Action = Entity = Source = Holding = Target = NullTarget = Emotion = NULL; + SourceEnt = TargetEnt = NULL; + VectorClear(MovingVal); + VectorClear(TurningVal); + RepeatVal = 1; + + Flags = ReadInt(); + + if (Flags & ANIMATE_EMOTION) + { + Emotion = PopStack(); + EmotionVal = Emotion->GetIntValue(); + } + + if (Flags & ANIMATE_NULLTARGET) + { + NullTarget = PopStack(); + NullTargetVal = NullTarget->GetIntValue(); + } + + if (Flags & ANIMATE_TARGET) + { + Target = PopStack(); + TargetEnt = Target->GetEdictValue(); + } + + if (Flags & ANIMATE_SOURCE) + { + Source = PopStack(); + SourceEnt = Source->GetEdictValue(); + } + + if (Flags & ANIMATE_SIGNALER) + { + Signaler = PopStack(); + } + + if (Flags & ANIMATE_MOVING) + { + Moving = PopStack(); + Moving->GetVectorValue(MovingVal); + } + + if (Flags & ANIMATE_TURNING) + { + Turning = PopStack(); + Turning->GetVectorValue(TurningVal); + } + + if (Flags & ANIMATE_REPEAT) + { + Repeat = PopStack(); + RepeatVal = Repeat->GetIntValue(); + } + + if (Flags & ANIMATE_MOVING_ABS) + { + Absolute = true; + } + + if (Flags & ANIMATE_KILL) + { + Kill = true; + } + + if (Flags & ANIMATE_HOLD) + { + Holding = PopStack(); + HoldingVal = Holding->GetFloatValue(); + } + + Action = PopStack(); + ActionVal = Action->GetIntValue(); + + Entity = PopStack(); + ent = Entity->GetEdictValue(); + + if (ent) + { + ai_c* ai; + body_c* body; + scripted_decision* DecisionPointer; + action_code ActCode=ACTCODE_STAND; + float SpeedVal=0.0; + mmove_t *SequencePtr=NULL; +// vec3_t OldPosition, Destination; + + //set a default holding value + if (!(Flags & ANIMATE_HOLD)) + { + if (EmotionVal) + { + HoldingVal=9999.9; + } + else + { + HoldingVal=50.0; + } + } + +// VectorClear(OldPosition); + ai = (ai_c*)((ai_public_c*) ent->ai); + + //eek--no ai, abort + if (!ai) + { + Com_Printf("entity %s had no ai--aborting HandleAnimate!\n",ent->targetname); + return; + } + + body = ai->GetBody(); + if (!(DecisionPointer = ai->FindScriptedDecision(ent))) + { + ai->NewDecision(DecisionPointer = new scripted_decision(NULL,SCRIPTED_PRIORITY_ROOT,0,ent),ent); + } + + if (!EmotionVal) + { + switch(ActionVal) + {// many of these will be combined into less-clunky stuff a bit later + // Also, much of this will eventually have to be routed through BODY, as sequences will + // vary from model to model + case UNKNOWN: + break; + case RUN: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + break; + case JUMP: + ActCode=ACTCODE_JUMP; + SpeedVal=10.0; + break; + + case DEATH: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[5]; + break; + case DEATHTHROWN: + ActCode=ACTCODE_DEATH; + SpeedVal=150.0; + SequencePtr=&MMoves[18]; + break; + case DUCK_DN: + SequencePtr=&MMoves[12]; + break; + case DUCK_MID: + SequencePtr=&MMoves[13]; + break; + case DUCK_UP: + SequencePtr=&MMoves[15]; + break; + case DUCK_SHOOT: + break; + case IDLE: + break; + case IDLESTRETCH: + break; + case IDLELOOK: + break; + case SHOOT: + // SHOOT should support an entity target or an (x,y,z) target + // ai->NewAction(ai->AttackAction(DecisionPointer, NULL, &MMoves[], + break; + case WALK: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + break; + case AFRAIDRUN: + case GUN_IDLE: + break; + + case A4_ASCRAMBLE_N_A_N: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[352]; + break; + case CCH_A_FWD_MS_2: + SequencePtr=&MMoves[61]; + break; + case CCH_A_FWD_P_2: + SequencePtr=&MMoves[20]; + break; + case CCH_A_FWD_R_2: + SequencePtr=&MMoves[62]; + break; + case CCH_AFIRE_FWD_MS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[483]; + break; + case CCH_ECCH2WALK_N_A_N: + SequencePtr=&MMoves[436]; + break; + case CCH_ECHOKEKNEES_N_N_N: + SequencePtr=&MMoves[249]; + break; + case CCH_ECHOKEDEATH_N_N_N: + SequencePtr=&MMoves[264]; + break; + case CCH_EHAWKCROUCH_N_A_N: + SequencePtr=&MMoves[264]; + break; + case CCH_EHAWKDEATH_N_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[450]; + break; + case CCH_EHAWKKNEES_N_N_N: + SequencePtr=&MMoves[447]; + break; + case CCH_EHAWKKNEETLK_N_N_N: + SequencePtr=&MMoves[451]; + break; + case CCH_EHEADNOD_N_A_N: + SequencePtr=&MMoves[435]; + break; + case CCH_EHEADSET_FRM_A_N: + SequencePtr=&MMoves[443]; + break; + case CCH_EHEADSET_MID_A_N: + SequencePtr=&MMoves[444]; + break; + case CCH_EHEADSET_TO_A_N: + SequencePtr=&MMoves[453]; + break; + case CCH_ENODLEFT_N_A_A: + SequencePtr=&MMoves[353]; + break; + case CCH_ENODRIGHT_N_A_A: + SequencePtr=&MMoves[354]; + break; + case CCH_ESCANTALK_LT_A_A: + SequencePtr=&MMoves[355]; + break; + case CCH_ESCANTALK_RT_A_A: + SequencePtr=&MMoves[356]; + break; + case CCH_ETALK_DWN_P_N: + SequencePtr=&MMoves[431]; + break; + case CCH_ETOSTAND_N_A_N: + SequencePtr=&MMoves[394]; + break; + case CCH_EWALK2CCH_N_A_N: + SequencePtr=&MMoves[430]; + break; + case CCH_F_FWD_L_2: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[237]; + break; + case CCH_F_FWD_M_2: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[88]; + break; + case CCH_F_FWD_S_2: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[59]; + break; + case CCH_IREADY_N_A_A: + SequencePtr=&MMoves[357]; + break; + case CCH_ITALKPOSE_DWN_A_N: + SequencePtr=&MMoves[433]; + break; + case CCH_RAIM_FWD_MRS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[233]; + break; + case CCH_RAIM_FWD_P_2: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[234]; + break; + case CCH_RAIM_N_L_2: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[238]; + break; + case CCH_TLOBGRENADE_N_A_N: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[239]; + break; + case CCH_W_N_A_N: + ActCode=ACTCODE_MOVE; + SpeedVal=50.0; + SequencePtr=&MMoves[429]; + break; + case CCH_XCCHCOWER_MID_A_A: + SequencePtr=&MMoves[149]; + break; + case CCH_XCCHCOWER2_MID_A_A: + case CCH_XCCHCOWER_MID2_A_A: + SequencePtr=&MMoves[150]; + break; + case CCH_XCCHCOWER_N_A_N: + SequencePtr=&MMoves[536]; + break; + case CCH_XCCHCOWER_UP_A_A: + SequencePtr=&MMoves[194]; + break; + case CCH_XCROUCH_UP_L_2: + SequencePtr=&MMoves[250]; + break; + case CCH_XCROUCH_UP_MRS_2: + SequencePtr=&MMoves[95]; + break; + case CCH_XCROUCH_UP_PK_A: + SequencePtr=&MMoves[15]; + break; + case LB_ESLIDE_N_PK_N: + SequencePtr=&MMoves[454]; + break; + case LB_PCRAWL_BK_P_N: + ActCode=ACTCODE_MOVE; + SpeedVal= 5.0; + SequencePtr=&MMoves[235]; + break; + case LB_PHOLDLEG_LT_N_N: + ActCode = ACTCODE_DEATH; + SequencePtr=&MMoves[33]; + break; + case LB_XLEANUPSHOOT_N_P_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[236]; + break; + case LS_XGETKICKED_N_N_N: + ActCode=ACTCODE_PAIN; + SequencePtr=&MMoves[139]; + break; + + case PRN_A_N_A_2: + SequencePtr=&MMoves[410]; + break; + case PRN_C_N_A_2: + SequencePtr=&MMoves[241]; + break; + case PRN_XCOVERHEAD_TO_A_A: + SequencePtr=&MMoves[197]; + break; + case PRN_XFALLING_N_N_N: + ActCode=ACTCODE_FALL; + SequencePtr=&MMoves[230]; + break; + case PRN_XFALLLAND_N_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[231]; + break; + case PRN_XTOSTAND_N_A_A: + SequencePtr=&MMoves[232]; + break; + case SI_EWALLFEAR_N_A_N: + SequencePtr=&MMoves[423]; + break; + case SI_EWALLIDLE_N_A_N: + SequencePtr=&MMoves[420]; + break; + case SI_EWALLTALK_N_A_N: + SequencePtr=&MMoves[421]; + break; + case SI_ISIT_N_A_A: + SequencePtr=&MMoves[228]; + break; + case SI_XALERTSTAND_UP_A_A: + SequencePtr=&MMoves[229]; + break; + case SI_XBYWALL_N_N_N: + SequencePtr=&MMoves[140]; + break; + case STD_A_FWD_P_2: + SequencePtr=&MMoves[21]; + break; + case STD_A_FWD_P_CB: + SequencePtr=&MMoves[22]; + break; + case STD_A_UP_P_2: + SequencePtr=&MMoves[243]; + break; + case STD_ATHREAT_DWN_P_N: + SequencePtr=&MMoves[294]; + break; + case STD_ATHREAT_FWD_P_N: + SequencePtr=&MMoves[295]; + break; + case STD_ATHREATSHT_DWN_P_N: + ActCode=ACTCODE_ATTACK; + SequencePtr = &MMoves[389]; + break; + case STD_ATHREATYEL_DWN_P_N: + SequencePtr=&MMoves[296]; + break; + case STD_ATHREATYEL_FWD_P_N: + SequencePtr=&MMoves[297]; + break; + case STD_EAUTOSWEEP_N_PM_A: + ActCode=ACTCODE_ATTACK; + SequencePtr = &MMoves[472]; + break; + case STD_EBEG_N_A_A: + SequencePtr=&MMoves[535]; + break; + case STD_EBOOKLOOK_N_A_N: + SequencePtr=&MMoves[441]; + break; + case STD_EBOOKSCAN_N_A_N: + SequencePtr=&MMoves[442]; + break; + case STD_EBUSTGLASS_N_MRS_2: + SequencePtr=&MMoves[272]; + break; + case STD_ECHOKEKNEES_TO_N_N: + SequencePtr=&MMoves[248]; + break; + case STD_ECHOKESHOOT_N_A_N: + ActCode = ACTCODE_ATTACK; + SequencePtr=&MMoves[358]; + break; + case STD_ECLIMBLEDG_DWN_A_N: + SequencePtr=&MMoves[314]; + break; + case STD_ECLIMBLEDG_MID_A_N: + SequencePtr=&MMoves[315]; + break; + case STD_ECLIMBLEDGE_UP_A_N: + SequencePtr=&MMoves[316]; + break; + case STD_ECLIMBSHAFT_N_A_N: + SequencePtr=&MMoves[428]; + break; + case STD_ECOMEHERE_N_A_N: + SequencePtr=&MMoves[292]; + break; + case STD_EDKRAIM_N_A_N: + SequencePtr=&MMoves[446]; + break; + case STD_EDKRAIMLK_FWD_A_N: + SequencePtr=&MMoves[457]; + break; + case STD_EDKRAIMTALK_N_A_N: + SequencePtr=&MMoves[448]; + break; + case STD_EDKRFIRELK_RT_A_N: + SequencePtr=&MMoves[449]; + break; + case STD_EDROPCROUCH_N_A_A: + SequencePtr=&MMoves[347]; + break; + case STD_EDROPGRENADE_N_A_N: + SequencePtr=&MMoves[317]; + break; + case STD_EEXAMINEWALL_N_A_N: + SequencePtr=&MMoves[298]; + break; + case STD_EFALLDEATH_N_N_N: + SequencePtr=&MMoves[318]; + break; + case STD_EFALLIMPACT_N_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[319]; + break; + case STD_EFLIPTABLE_N_A_N: + SequencePtr=&MMoves[273]; + break; + case STD_EFRMSHADOW_N_MRS_2: + SequencePtr=&MMoves[320]; + break; + case STD_EFRMSHADOW_N_P_N: + SequencePtr=&MMoves[321]; + break; + case STD_EGANGSALUTE_N_A_N: + SequencePtr=&MMoves[405]; + break; + case STD_EHANDTALK_FRM_P_N: + SequencePtr=&MMoves[322]; + break; + case STD_EHANDTALK_N_P_N: + SequencePtr=&MMoves[323]; + break; + case STD_EHANDTALK_TO_MRS_N: + SequencePtr=&MMoves[324]; + break; + case STD_EHANDTALK_TO_P_N: + SequencePtr=&MMoves[325]; + break; + case STD_EHANDTALK_FRM_MRS_N: + SequencePtr=&MMoves[326]; + break; + case STD_EHEADNOD_N_A_N: + SequencePtr=&MMoves[305]; + break; + case STD_EHEADSET_FRM_P_N: + SequencePtr=&MMoves[327]; + break; + case STD_EHEADSET_MID_P_N: + SequencePtr=&MMoves[328]; + break; + case STD_EHEADSET_TO_P_N: + SequencePtr=&MMoves[329]; + break; + case STD_EHEADSHAKE_N_A_N: + SequencePtr=&MMoves[306]; + break; + case STD_EJUMPRAIL_N_A_N: + ActCode=ACTCODE_JUMP; + SequencePtr=&MMoves[307]; + break; + case STD_EMERCHALL_N_A_A: + SequencePtr=&MMoves[529]; + break; + case STD_EMERCHONE_N_A_A: + SequencePtr=&MMoves[530]; + break; + case STD_EMERCHTALK_N_A_A: + SequencePtr=&MMoves[533]; + break; + case STD_EMERCHWAVE_LT_A_A: + SequencePtr=&MMoves[534]; + break; + case STD_EMERCHWAVE_RT_A_A: + SequencePtr=&MMoves[532]; + break; + case STD_EOFFLADDER_UP_A_N: + SequencePtr=&MMoves[266]; + break; + case STD_EPOUNDDOOR_N_A_N: + SequencePtr=&MMoves[267]; + break; + case STD_EPUSHBUTTONH_N_A_N: + SequencePtr=&MMoves[413]; + break; + case STD_EPUSHBUTTONS_N_N_N: + SequencePtr=&MMoves[274]; + break; + case STD_EPUSHCRATE_N_N_N: + ActCode=ACTCODE_MOVE; + SequencePtr=&MMoves[275]; + break; + case STD_EPUSHOVER_N_PK_A: + SequencePtr=&MMoves[484]; + break; + case STD_ERAGESHOOT_N_P_N: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[300]; + break; + case STD_ERAGEIDLE_N_P_N: + SequencePtr=&MMoves[438]; + break; + case STD_ESABREBLUFF_N_A_A: + SequencePtr=&MMoves[471]; + break; + case STD_ESABREMOCK_N_A_N: + SequencePtr=&MMoves[301]; + break; + case STD_ESALUTATIONS_N_A_N: + SequencePtr=&MMoves[427]; + break; + case STD_ESALUTE_FRM_A_N: + SequencePtr=&MMoves[426]; + break; + case STD_ESALUTE_FRM_MRS_N: + SequencePtr=&MMoves[330]; + break; + case STD_ESALUTE_N_A_N: + SequencePtr=&MMoves[425]; + break; + case STD_ESALUTE_N_MRS_N: + SequencePtr=&MMoves[331]; + break; + case STD_ESALUTE_TO_A_N: + SequencePtr=&MMoves[424]; + break; + case STD_ESALUTE_TO_MRS_N: + SequencePtr=&MMoves[332]; + break; + case STD_ESIGNALALARM_N_A_N: + SequencePtr=&MMoves[276]; + break; + case STD_ESPIN180_LT_A_N: + SequencePtr=&MMoves[309]; + break; + case STD_ESPIN180_RT_A_N: + SequencePtr=&MMoves[310]; + break; + case STD_ESUPRISE90_LT_A_N: + SequencePtr=&MMoves[418]; + break; + case STD_ETALK_FRM_A_N: + SequencePtr=&MMoves[383]; + break; + case STD_ETALK_N_A_N: + SequencePtr=&MMoves[304]; + break; + case STD_ETALK_TO_A_N: + SequencePtr=&MMoves[384]; + break; + case STD_ETALK_UP_A_N: + SequencePtr=&MMoves[434]; + break; + case STD_ETALKBOTH_N_A_N: + SequencePtr=&MMoves[303]; + break; + case STD_ETALKLEFT_N_A_N: + SequencePtr=&MMoves[333]; + break; + case STD_ETALKLKLT_FRM_A_N: + SequencePtr=&MMoves[334]; + break; + case STD_ETALKLKLT_MID_A_N: + SequencePtr=&MMoves[335]; + break; + case STD_ETALKLKLT_TO_A_N: + SequencePtr=&MMoves[336]; + break; + case STD_ETALKLKRT_FRM_A_N: + SequencePtr=&MMoves[337]; + break; + case STD_ETALKLKRT_MID_A_N: + SequencePtr=&MMoves[338]; + break; + case STD_ETALKLKRT_TO_A_N: + SequencePtr=&MMoves[339]; + break; + case STD_ETALKRIGHT_N_A_N: + SequencePtr=&MMoves[313]; + break; + case STD_ETOAIM_N_P_2: + SequencePtr=&MMoves[422]; + break; + case STD_ETORUN_N_MRS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[340]; + break; + case STD_ETORUN_N_P_N: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[311]; + break; + case STD_ETURN90_LT_A_N: + SequencePtr=&MMoves[341]; + break; + case STD_ETURN90_RT_A_N: + SequencePtr=&MMoves[342]; + break; + case STD_ETYPING_N_N_N: + SequencePtr=&MMoves[277]; + break; + case STD_EWALL2WALK_N_MRS_2: + ActCode=ACTCODE_MOVE; + SequencePtr=&MMoves[278]; + break; + case STD_EWALL2WALK_N_PK_N: + ActCode=ACTCODE_MOVE; + SequencePtr=&MMoves[279]; + break; + case STD_EWALLIDLE_N_MRS_2: + SequencePtr=&MMoves[280]; + break; + case STD_EWALLIDLE_N_PK_N: + SequencePtr=&MMoves[281]; + break; + case STD_EWALLLOOK_LT_MRS_2: + SequencePtr=&MMoves[282]; + break; + case STD_EWALLLOOK_LT_PK_N: + SequencePtr=&MMoves[283]; + break; + case STD_EWALLLOOK_RT_MRS_2: + SequencePtr=&MMoves[284]; + break; + case STD_EWALLLOOK_RT_PK_N: + SequencePtr=&MMoves[285]; + break; + case STD_EWHIRL_RT_A_N: + SequencePtr=&MMoves[461]; + break; + case STD_EWRENCHH_FRM_N_N: + SequencePtr=&MMoves[286]; + break; + case STD_EWRENCHH_N_N_N: + SequencePtr=&MMoves[287]; + break; + case STD_EWRENCHH_TO_N_N: + SequencePtr=&MMoves[288]; + break; + case STD_EWRENCHV_FRM_N_N: + SequencePtr=&MMoves[289]; + break; + case STD_EWRENCHV_N_N_N: + SequencePtr=&MMoves[290]; + break; + case STD_EWRENCHV_TO_N_N: + SequencePtr=&MMoves[291]; + break; + case STD_EYELL_N_A_N: + SequencePtr=&MMoves[411]; + break; + case STD_F_FWD_M_2: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[37]; + break; + case STD_FATTITUDE_N_P_A: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[7]; + break; + case STD_FAUTOSWEEP_N_M_2: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[115]; + break; + case STD_FAUTOSWEEP_UP_M_2: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[419]; + break; + case STD_F_FWD_P_2: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[26]; + break; + case STD_F_FWD_P_CB: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[23]; + break; + case STD_F_FWD_R_2: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[92]; + break; + case STD_F_FWD_S_2: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[90]; + break; + case STD_FAUTOSWEEP_N_PM_A: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[212]; + break; + case STD_FGANGBANGER_N_M_2: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[213]; + break; + case STD_FRAPID_N_P_2: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[456]; + break; + case STD_FRAPIDSWEEP_LT_P_2: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[416]; + break; + case STD_FSWATSTYLE_FWD_M_2: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[214]; + break; + case STD_FSWEEPUP_FRM_A_A: + ActCode=ACTCODE_STAND; + SequencePtr=&MMoves[462]; + break; + case STD_FSWEEPUP_TO_A_A: + ActCode=ACTCODE_STAND; + SequencePtr=&MMoves[463]; + break; + case STD_FVIOLENT_DWN_M_2: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[215]; + break; + case STD_FVIOLENT_DWN_P_N: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[216]; + break; + case STD_IALERT_N_MRS_2: + SequencePtr=&MMoves[108]; + break; + case STD_IALERT_N_P_N: + SequencePtr=&MMoves[103]; + break; + case STD_IALERTLK_RT_MRS_2: + SequencePtr=&MMoves[412]; + break; + case STD_IALERTTRN_LT_P_N: + SequencePtr=&MMoves[417]; + break; + case STD_ICLEANGUN_N_A_N: + SequencePtr=&MMoves[43]; + break; + case STD_ICLEANGUN2_N_MRS_2: + SequencePtr=&MMoves[202]; + break; + case STD_ICLEANGUN2_N_PK_N: + SequencePtr=&MMoves[43]; + break; + case STD_IEMERCHANT_N_A_A: + SequencePtr=&MMoves[531]; + break; + case STD_IETALKPOSE_N_A_N: + SequencePtr=&MMoves[415]; + break; + case STD_IETALKPOSE_RT_A_N: + SequencePtr=&MMoves[439]; + break; + case STD_IGUNUP_N_A_N: + SequencePtr=&MMoves[343]; + break; + case STD_IGUNUPLOOK_N_A_N: + SequencePtr=&MMoves[455]; + break; + case STD_ILEAN_N_P_N: + SequencePtr=&MMoves[312]; + break; + case STD_ILOOKING_N_A_A: + SequencePtr=&MMoves[16]; + break; + case STD_IMONITORUP_N_A_N: + SequencePtr=&MMoves[44]; + break; + case STD_IMONITORUP2_N_A_N: + SequencePtr=&MMoves[203]; + break; + case STD_ININJA_N_P_N: + SequencePtr=&MMoves[395]; + break; + case STD_IPISS_N_A_A: + SequencePtr=&MMoves[293]; + break; + case STD_ISMOKE_FRM_A_N: + SequencePtr=&MMoves[205]; + break; + case STD_ISMOKE_N_A_N: + SequencePtr=&MMoves[206]; + break; + case STD_ISMOKE_TO_A_N: + SequencePtr=&MMoves[207]; + break; + case STD_ITOUCHNUTS_N_A_N: + SequencePtr=&MMoves[204]; + break; + case STD_ITALK_N_A_N: + SequencePtr=&MMoves[45]; + break; + case STD_ITALK_N_MRS_2: + SequencePtr=&MMoves[116]; + break; + case STD_ITALKGEST1_N_A_N: + SequencePtr=&MMoves[46]; + break; + case STD_ITALKGEST2_N_A_N: + SequencePtr=&MMoves[47]; + break; + case STD_ITALKGEST3_N_A_N: + SequencePtr=&MMoves[48]; + break; + case STD_ITALKPOSE_UP_A_N: + SequencePtr=&MMoves[432]; + break; + case STD_IWIPEBROW_N_A_N: + SequencePtr=&MMoves[49]; + break; + case STD_ISTAND_N_A_N: + SequencePtr=&MMoves[0]; + break; + case STD_ISTAND_N_MRS_2: + SequencePtr=&MMoves[39]; + break; + case STD_ILOOKING_N_MRS_2: + SequencePtr=&MMoves[40]; + break; + case STD_ILEANLOOK_FRM_PK_N: + SequencePtr=&MMoves[145]; + break; + case STD_ILEANLOOK_MID_PK_N: + SequencePtr=&MMoves[146]; + break; + case STD_ILEANLOOK_TO_PK_N: + SequencePtr=&MMoves[147]; + break; + case STD_ITURNVALVE_FRM_N_N: + SequencePtr=&MMoves[133]; + break; + case STD_ITURNVALVE_N_N_N: + SequencePtr=&MMoves[134]; + break; + case STD_ITURNVALVE_TO_N_N: + SequencePtr=&MMoves[135]; + break; + case STD_JDIVE2PRONE_N_A_N: + ActCode=ACTCODE_JUMP; + SequencePtr=&MMoves[53]; + break; + case STD_JDOWN_N_A_A: + ActCode=ACTCODE_JUMP; + SequencePtr=&MMoves[148]; + break; + case STD_JDROP_N_A_A: + ActCode=ACTCODE_FALL; + SequencePtr=&MMoves[9]; + break; + case STD_JDROP_TO_A_N: + ActCode=ACTCODE_JUMP; + SpeedVal=150.0; + SequencePtr=&MMoves[388]; + break; + case STD_JRUN_FWD_A_A: + ActCode=ACTCODE_JUMP; + SpeedVal=150.0; + SequencePtr=&MMoves[126]; + break; + case STD_JTHROWSTAR_FWD_A_N: + ActCode=ACTCODE_JUMP; + SpeedVal=150.0; + SequencePtr=&MMoves[409]; + break; + case STD_JUPTO_N_A_A: + ActCode=ACTCODE_JUMP; + SpeedVal=150.0; + SequencePtr=&MMoves[6]; + break; + case STD_L_N_MS_2: + SequencePtr=&MMoves[173]; + break; + case STD_MKICKLOW_N_A_A: + SequencePtr=&MMoves[136]; + break; + case STD_MNINJAKICK_N_A_B: + SequencePtr=&MMoves[217]; + break; + case STD_MPISTOLWHIP_N_P_N: + SequencePtr=&MMoves[137]; + break; + case STD_MRIFLEBUTT_N_MRS_2: + SequencePtr=&MMoves[218]; + break; + case STD_R_DWNST_MRS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[190]; + break; + case STD_R_N_MRS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[58]; + break; + case STD_R_N_PK_N: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[2]; + break; + case STD_RAFRAID_N_N_N: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[19]; + break; + case STD_RAIM_N_MRS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[100]; + break; + case STD_RAIMSTRAF_LT_MRS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[98]; + break; + case STD_RAIMSTRAF_LT_P_CBN: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[96]; + break; + case STD_RAIMSTRAF_RT_MRS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[99]; + break; + case STD_RAIMSTRAF_RT_P_CBN: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[97]; + break; + case STD_RBACKAIM_N_MRS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[182]; + break; + case STD_RBACKAIM_N_P_2: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[132]; + break; + case STD_RDYNAMIC_N_A_N: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[414]; + break; + case STD_RGUNUP_N_P_2: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[4]; + break; + case STD_RONFIRE_N_N_N: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[344]; + break; + case STD_RONFIRETODTH_N_N_N: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[345]; + break; + case STD_RTOSTOP_N_MRS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[346]; + break; + case STD_RTOSTOP_N_PK_N: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[302]; + break; + case STD_SBLOWN_2BK_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[18]; + break; + case STD_SELECTROCUTE_N_N_N: + SequencePtr=&MMoves[265]; + break; + case STD_SFALLFWD_2FRNT_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[219]; + break; + case STD_SGUNFROMHAND_N_N_N: + ActCode = ACTCODE_PAIN; + SequencePtr = &MMoves[125]; + break; + case STD_SGUT_2SIDE_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[200]; + break; + case STD_SHEAD_2FRNT_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[25]; + break; + case STD_SONFIRE_2BK_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[245]; + break; + case STD_SOUTWINDOW_N_A_N: + ActCode=ACTCODE_FALL; + SequencePtr=&MMoves[478]; + break; + case STD_SSABREDEATH_BK_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[407]; + break; + case STD_SSHOULDER_LT_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[30]; + break; + case STD_SSTUMBLE_2BK_P_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[141]; + break; + case STD_SSTUMBLE_2FRNT_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[220]; + break; + case STD_STOKNEES_2BK_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[5]; + break; + case STD_SUNHURT_BK_PK_N: + SequencePtr=&MMoves[165]; + break; + case STD_SVIOLENT_N_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[196]; + break; + case STD_TGRENADE_N_A_N: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[474]; + break; + case STD_TRUN_N_A_N: + ActCode=ACTCODE_MOVE; + SpeedVal=150.0; + SequencePtr=&MMoves[348]; + break; + case STD_TUNDER_N_A_N: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[480]; + break; + case STD_W_N_MRS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[445]; + break; + case STD_W_N_PN_N: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[349]; + break; + case STD_WAIM_FWD_P_2: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[157]; + break; + case STD_WATTITUDE_N_PK_A: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[8]; + break; + case STD_WBACKAIM_N_MS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[162]; + break; + case STD_WBACKWARDS_N_A_N: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[406]; + break; + case STD_WBCKSIGNAL_N_N_N: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[67]; + break; + case STD_WCARRY1_N_N_N: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[56]; + break; + case STD_WCARRY2_N_N_N: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[350]; + break; + case STD_WFAST_N_A_N: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[437]; + break; + case STD_WFIRE_FWD_MS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[482]; + break; + case STD_WJOG_N_MRS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[208]; + break; + case STD_WJOGGUNDWN_N_P_2: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[209]; + break; + case STD_WJOGGUNUP_N_P_A: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[210]; + break; + case STD_WNORMAL_N_PK_A: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[1]; + break; + case STD_WPATROL_N_MRS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[57]; + break; + case STD_WPUSHCART_N_N_N: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[211]; + break; + case STD_WSTEALTH_N_PK_N: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[408]; + break; + case STD_WTALK_LT_MRS_2: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[351]; + break; + case STD_WTOSTOP_N_PK_A: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[308]; + break; + case STD_XAFRAIDSHAKE_N_N_N: + SequencePtr=&MMoves[124]; + break; + case STD_XALARMPUSH_N_A_N: + SequencePtr=&MMoves[50]; + break; + case STD_XATKPAUSE1_N_MRS_2: + SequencePtr=&MMoves[82]; + break; + case STD_XATKPAUSE1_N_PK_N: + SequencePtr=&MMoves[84]; + break; + case STD_XATKPAUSE2_N_PK_N: + SequencePtr=&MMoves[85]; + break; + case STD_XBOOMCROUCH_N_A_N: + SequencePtr=&MMoves[54]; + break; + case STD_XCCHCOWER_DWN_A_A: + SequencePtr=&MMoves[181]; + break; + case STD_XCHOKE_N_N_N: + SequencePtr=&MMoves[221]; + break; + case STD_XCOCK_N_S_2: + SequencePtr=&MMoves[397]; + break; + case STD_XCROUCH_DWN_L_2: + SequencePtr=&MMoves[252]; + break; + case STD_XCROUCH_DWN_MRS_2: + SequencePtr=&MMoves[94]; + break; + case STD_XCROUCH_DWN_P_2: + SequencePtr=&MMoves[479]; + break; + case STD_XCROUCH_DWN_P_A: + SequencePtr=&MMoves[481]; + break; + case STD_XCROUCH_DWN_PK_A: + SequencePtr=&MMoves[12]; + break; + case STD_XDANCE_N_N_N: + SequencePtr=&MMoves[222]; + break; + case STD_XDONTSHOOT_N_A_N: + SequencePtr=&MMoves[188]; + break; + case STD_XFEARWAVE_N_N_N: + SequencePtr=&MMoves[189]; + break; + case STD_XGOPRONE_N_A_A: + SequencePtr=&MMoves[223]; + break; + case STD_XHANDSPRING_FWD_A_N: + ActCode=ACTCODE_MOVE; + SpeedVal=100.0; + SequencePtr=&MMoves[396]; + break; + case STD_XKICKDOOR_N_A_A: + SequencePtr=&MMoves[143]; + break; + case STD_XLADDER_DWN_A_A: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[224]; + break; + case STD_XLADDER_UP_A_A: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[225]; + break; + case STD_XLADDERFRM_UP_A_A: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[393]; + break; + case STD_XOPENDOOR_N_A_N: + SequencePtr=&MMoves[91]; + break; + case STD_XROLL_LT_A_A: + SequencePtr=&MMoves[106]; + break; + case STD_XROLL_RT_A_A: + SequencePtr=&MMoves[105]; + break; + case STD_XROLLTOCCH_FWD_A_A: + SequencePtr=&MMoves[226]; + break; + case STD_XSTARTLED_N_A_A: + SequencePtr=&MMoves[171]; + break; + case STD_XSTUMBLE_N_A_A: + SequencePtr=&MMoves[227]; + break; + case STD_XTAKECOVER_N_A_N: + ActCode=ACTCODE_MOVE; + SpeedVal=10.0; + SequencePtr=&MMoves[464]; + break; + case STD_XYELLATYOU_N_A_A: + SequencePtr=&MMoves[144]; + break; + case STD_XYELLPOINT_FWD_A_N: + SequencePtr=&MMoves[51]; + break; + case STD_XYELLWAVE_BK_A_N: + SequencePtr=&MMoves[52]; + break; + case STD_XTUMBLE_2FRNT_N_N: + SequencePtr=&MMoves[55]; + break; + case PRN_XCOVERHEAD_N_A_A: + SequencePtr=&MMoves[198]; + break; + case LB_PGENERICDIE_N_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[77]; + break; + case CCH_SONKNEES_2FRNT_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[131]; + break; + case CCH_XONKNEES_N_N_N: + SequencePtr=&MMoves[132]; + break; + case STD_SINBACK_2FRNT_N_N: + ActCode=ACTCODE_DEATH; + SequencePtr=&MMoves[138]; + break; + case STD_WPUSH_N_N_N: + ActCode=ACTCODE_MOVE; + SequencePtr=&MMoves[142]; + break; + case STD_FCORNERPEAK_LT_P_A: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[65]; + break; + case STD_FCORNERPEAK_RT_P_A: + ActCode=ACTCODE_ATTACK; + SequencePtr=&MMoves[66]; + break; + case STD_ASHUFFLE_N_P_2: + SequencePtr=&MMoves[35]; + break; + case STD_ASHUFFLE_N_P_A: + SequencePtr=&MMoves[36]; + break; + case STD_ASHUFFLE_N_MS_2: + SequencePtr=&MMoves[101]; + break; + case STD_ASHUFFLE_N_R_2: + SequencePtr=&MMoves[102]; + break; + case STD_ASHUFFLE_N_L_2: + SequencePtr=&MMoves[260]; + break; + + + case SCRIPT_RELEASE: + ActCode=ACTCODE_SCRIPTRELEASE;//AHA! this isn't really an action, just an alert to the script decision that it can finish. + /* + if (ent->deadflag != DEAD_DEAD) // hmm, don't like this, but I can't check for a NULL + // decision pointer, and I'm not sure how best to check for a VALID one... err.... + { + ai->NewAction(ai->EndScriptAction(DecisionPointer), ent, true); + } + */ + break; + default: + break; + } + } + + Event *NewEvent=NULL; + + + if (Signaler) + { + AddSignaler(ent, Signaler, SIGNAL_ANIMATE); + /* + + action_c *LastAction = ((ai_c*)(ai))->GetLastAction(); + + LastAction->AttachSignalEvent(AddEvent(new AnimateDoneEvent(ent))); + */ + NewEvent = AddEvent(new AnimateDoneEvent(ent)); + Signaler=0; + } + + for (int count = 0; countGetEdictValue(); + delete Entity; + + if (ent) + { + ai = (ai_c*)((ai_public_c*) ent->ai); + + if (!ai) + { + Com_Printf("entity %s had no ai--aborting HandleResetAI!\n",ent->targetname); + return; + } + + ai->CancelScripting(ent); + } +} + + +void RestartMusic(edict_t *ent); +void StartMusic(edict_t *ent, byte songID); + +void CScript::HandlePlaySong() +{ + Variable *SongID = PopStack(); + + int song = SongID->GetIntValue(); + + if(song < 0) + { + RestartMusic(level.sight_client); + } + else + { + StartMusic(level.sight_client, song); + } + + delete SongID; +} + +void CScript::HandleSetCvar() +{ + Variable *val; + Variable *cvarName; + + val = PopStack(); + if (!val) + { + Error("Invalid stack for HandleSetCvar()"); + } + + cvarName = PopStack(); + if (!cvarName) + { + Error("Invalid stack for HandleSetCvar()"); + } + + if (val->GetType() == TypeSTRING) + { + gi.cvar_set(cvarName->GetStringValue(), val->GetStringValue()); + } + else + { + gi.cvar_setvalue(cvarName->GetStringValue(), val->GetFloatValue()); + } + + delete val; + delete cvarName; +} + +void CScript::HandleConsoleCommand() +{ + Variable *Command; + + + Command = PopStack(); + if (!Command) + { + Error("Invalid stack for HandleConsoleCommand()"); + } + + gi.AddCommandString(Command->GetStringValue()); + gi.AddCommandString("\n"); + + delete Command; +} + +void CScript::CallAnimation(action_code actCode, int Flags, ai_public_c* ai, + scripted_decision *DecisionPointer, vec3_t MovingVal, + vec3_t TurningVal, bool Absolute, edict_t *ent, + float speed, float HoldingVal, Event *EventPtr, + edict_t* TargetEnt, bool ShouldKill, int NullTarget, + int Emotion, mmove_t *preferredAnim) +{ + if (!DecisionPointer || !ai || !DecisionPointer) + { + return; + } + scriptOrder_c newOrder; + newOrder.absoluteDest=Absolute; + newOrder.actionType=actCode; + VectorCopy(MovingVal,newOrder.destVec); + VectorCopy(TurningVal,newOrder.turnVec); + newOrder.flags=Flags; + newOrder.holdTime=HoldingVal; + newOrder.preferredMove=preferredAnim; + newOrder.SignalEvent=EventPtr; + newOrder.speed=speed; + newOrder.target = TargetEnt; + newOrder.kill = ShouldKill; + newOrder.NullTarget = NullTarget; + newOrder.Emotion = Emotion; + + DecisionPointer->AddOrder(*(ai_c*)ai, *TargetEnt, newOrder); + + //eek! make sure i'm activated! + + ai->Activate(*ent); + ai->SetStartleability(false); +} + +/* +void CScript::CallMovementAnimation(int Flags, ai_public_c* ai, + scripted_decision *DecisionPointer, vec3_t MovingVal, + vec3_t TurningVal, bool Absolute, edict_t *ent, + float speed, mmove_t *preferredAnim) +{ + if (!DecisionPointer) + { + return; + } + scriptOrder_t newOrder; + newOrder.absoluteDest=Absolute; + newOrder.actionType=ACTCODE_MOVE; + VectorCopy(MovingVal,newOrder.destVec); + VectorCopy(TurningVal,newOrder.turnVec); + newOrder.flags=Flags; + newOrder.holdTime=10.0;//10 sec timeout ok? this is arbitrary... + newOrder.preferredMove=preferredAnim; + + DecisionPointer->AddOrder(newOrder); +} +*/ +//yick. fixme; this is better, more flexible than what was here, but the angle stuff is bollocks! +//i'll rework it soon to queue up goals in the script decision. +void CScript::CallMovementAnimation(int Flags, ai_public_c* ai, + scripted_decision *DecisionPointer, vec3_t MovingVal, + vec3_t TurningVal, bool Absolute, edict_t *ent, + float speed, int AnimationNumber) +{ + vec3_t Destination, FaceDestination, OldPosition, AnimDestination, TempDestination, AnimAngles; + mmove_t *newanim; + body_c *body=((ai_c*)(ai))->GetBody(); + + VectorClear(OldPosition); + + if (!((ai_c*)(ai))->GetLastActionDestination(OldPosition)) + { + VectorCopy(ent->s.origin, OldPosition); + } + + if (Flags & ANIMATE_TURNING) + { + VectorCopy(OldPosition, Destination); + VectorCopy(TurningVal, FaceDestination); + } + else if (Flags & ANIMATE_MOVING) + { + if (Absolute) + { + VectorCopy(MovingVal, Destination); + } + else + { + VectorAdd(OldPosition, MovingVal, Destination); + } + VectorCopy(Destination, FaceDestination); + } + + + if (VectorCompare(Destination,vec3_origin)) + { + VectorCopy(OldPosition, AnimDestination); + } + else + { + VectorSubtract(Destination, OldPosition, AnimDestination); + if (VectorCompare(AnimDestination, vec3_origin)) + { + VectorCopy(OldPosition, AnimDestination); + } + else + { + VectorNormalize(AnimDestination); + VectorScale(AnimDestination, speed, AnimDestination); + VectorAdd(AnimDestination, OldPosition, AnimDestination); + } + } + + if (VectorCompare(FaceDestination,vec3_origin)) + { + VectorCopy(ent->s.angles, AnimAngles); + } + else + { + VectorSubtract(FaceDestination, OldPosition, TempDestination); + if (VectorCompare(TempDestination, vec3_origin)) + { + VectorCopy(ent->s.angles, AnimAngles); + } + else + { + VectorNormalize(TempDestination); + vectoangles(TempDestination, AnimAngles); + } + } + + if (AnimationNumber<0) + { + newanim=body->GetSequenceForMovement(*ent, AnimDestination, FaceDestination, OldPosition, AnimAngles, ACTSUB_NORMAL, BBOX_PRESET_STAND); + } + else + { + newanim=body->GetSequenceForMovement(*ent, AnimDestination, FaceDestination, OldPosition, AnimAngles, ACTSUB_NORMAL, BBOX_PRESET_STAND, &MMoves[AnimationNumber]); + } + + ai->NewAction(ai->WalkAction(DecisionPointer, NULL, newanim, Destination, FaceDestination), ent, true); + + +// if (Flags & ANIMATE_TURNING) +// { +// ai->NewAction(ai->WalkAction(DecisionPointer, NULL, &MMoves[AnimationNumber], OldPosition, TurningVal), ent, true); +// } +// else if (Flags & ANIMATE_MOVING) +// { +// if (Absolute) +// { +// VectorCopy(MovingVal, Destination); +// } +// else +// { +// VectorAdd(OldPosition, MovingVal, Destination); +// } +// ai->NewAction(ai->WalkAction(DecisionPointer, NULL, &MMoves[AnimationNumber], Destination, Destination), ent, true); +// } + + + return; +} + +void CScript::HandleCopyPlayerAttributes(void) +{ + Variable *Player, *Destination; + edict_t *PlayerEnt, *DestinationEnt; + + Destination = PopStack(); + if (!Destination) + { + Error("Invalid stack for HandleCopyPlayerAttributes()"); + } + DestinationEnt = Destination->GetEdictValue(); + + Player = PopStack(); + if (!Player) + { + Error("Invalid stack for HandleCopyPlayerAttributes()"); + } + PlayerEnt = Player->GetEdictValue(); + + delete Player; + delete Destination; +} + +void CScript::HandleSetViewAngles(void) +{ + Variable *Player, *Angles; + edict_t *PlayerEnt; + vec3_t vec; + + Angles = PopStack(); + if (!Angles) + { + Error("Invalid stack for HandleSetViewAngles()"); + } + Angles->GetVectorValue(vec); + + Player = PopStack(); + if (!Player) + { + Error("Invalid stack for HandleSetViewAngles()"); + } + PlayerEnt = Player->GetEdictValue(); + + PlayerEnt->client->ps.pmove.delta_angles[0]=ANGLE2SHORT(-PlayerEnt->client->resp.cmd_angles[0]); + PlayerEnt->client->ps.pmove.delta_angles[1]=ANGLE2SHORT(vec[1]-PlayerEnt->client->resp.cmd_angles[1]); + PlayerEnt->client->ps.pmove.delta_angles[2]=ANGLE2SHORT(-PlayerEnt->client->resp.cmd_angles[2]); + + gi.linkentity(PlayerEnt); + + delete Player; + delete Angles; +} + +void CScript::HandleSetCacheSize(void) +{ + Variable *CacheSize; + + CacheSize = PopStack(); + if (!CacheSize) + { + Error("Invalid stack for HandleSetCacheSize()"); + } + + delete CacheSize; +} + +void CScript::Move_Done(edict_t *ent) +{ + VectorClear (ent->velocity); + + VectorCopy(ent->moveinfo.end_origin, ent->s.origin); +// this would be a proper fix, but too late in the project to change as it might break things - rjr +// gi.linkentity(ent); +} + +void CScript::Move(edict_t *ent, vec3_t Dest) +{ + float frames; + + VectorCopy(Dest, ent->moveinfo.end_origin); + + VectorSubtract (ent->moveinfo.end_origin, ent->s.origin, ent->moveinfo.dir); + ent->moveinfo.remaining_distance = VectorNormalize (ent->moveinfo.dir); + if (ent->moveinfo.remaining_distance <= 0) + { + frames = 0; + } + else + { + frames = floor((ent->moveinfo.remaining_distance / ent->moveinfo.speed) / FRAMETIME) + 1; + } + + VectorScale (ent->moveinfo.dir, ent->moveinfo.remaining_distance/frames/FRAMETIME, ent->velocity); + + AddEvent(new MoveDoneEvent(level.time + (frames * FRAMETIME), ent)); +} + +void CScript::Rotate_Done (edict_t *ent) +{ + VectorClear (ent->avelocity); +} + +void CScript::Rotate(edict_t *ent) +{ + float distance; + vec3_t destdelta; + float frames; + + VectorSubtract (ent->moveinfo.start_angles, ent->s.angles, destdelta); + + distance = VectorNormalize (destdelta); + if (ent->moveinfo.speed <= 0) + { + frames = 0; + VectorClear (ent->avelocity); + } + else + { + frames = floor((distance / ent->moveinfo.speed) / FRAMETIME) + 1; + VectorScale (destdelta, distance/frames/FRAMETIME, ent->avelocity); + } + + AddEvent(new RotateDoneEvent(level.time + (frames * FRAMETIME), ent)); +} + +void CScript::Helicopter_Done (edict_t *ent) +{ + // kef -- not sure if we need anything in here +} + +void CScript::Helicopter(edict_t *ent, int actionID) +{ + // kef -- anything else in here? + float frames = 10000; // I hope I don't have to come up with a real number here + + AddEvent(new HelicopterDoneEvent(level.time + (frames * FRAMETIME), ent, actionID)); +} + +void CScript::Tank_Done (edict_t *ent) +{ + // kef -- not sure if we need anything in here +} + +void CScript::Tank(edict_t *ent, int actionID) +{ + // kef -- anything else in here? + float frames = 10000; // I hope I don't have to come up with a real number here + + AddEvent(new TankDoneEvent(level.time + (frames * FRAMETIME), ent, actionID)); +} + +Event* CScript::AddEvent(Event *Which) +{ + list::iterator ie; + float time; + + if (ClearEvents) + { // we must be in an ON condition, not going to be resumed, to clear out all the old events + while(Events.size()) + { + ie=Events.begin(); + delete (*ie); + + Events.erase(ie); + } + + ClearEvents = false; + } + + if (Events.size()) + { + time = Which->GetTime(); + for (ie=Events.begin();ie != Events.end();ie++) + { + if ( (*ie)->GetTime() > time) + { + break; + } + } + Events.insert(ie, Which); + } + else + { + Events.push_back(Which); + } + +#ifdef _DEBUG + float testtime; + + time = 0; + for (ie=Events.begin();ie != Events.end();ie++) + { + testtime = (*ie)->GetTime(); + if (testtime < time) + { + DebugBreak(); + } + } +#endif + return Which; +} + +void CScript::ProcessEvents(void) +{ + list::iterator ie, next; + + ie = Events.begin(); // dk + + while(Events.size()) + { +// ie = Events.Begin(); // dk + + if ((*ie)->Process(this)) + { + delete (*ie); + Events.erase(ie); + ie = Events.begin(); // dk + } + else + { + ie++; // dk + if (ie == Events.end()) // dk + { // dk + break; + } // dk + } + } +} + +void CScript::ClearTimeWait(void) +{ + if (ScriptCondition == COND_WAIT_TIME) + { + ScriptCondition = COND_READY; + } +} + +void CScript::AddSignaler(edict_t *Edict, Variable *Var, SignalT SignalType) +{ + list::iterator is; + Signaler *NewSig; + + NewSig = new Signaler(Edict, Var, SignalType); + + // Note that this check does not need to be in there - signalers are very flexible, but if used + // incorrectly, they can result in weird behavior - this check prevents more than one command using + // the same signal varaible prior to a wait command + for (is=Signalers.begin();is != Signalers.end();is++) + { + if (*(*is) == NewSig) + { + Error("Renner Error #1: Variable '%s' is being used for multiple signals", Var->GetName() ); + } + } + + Signalers.push_back(NewSig); +} + +void CScript::CheckSignalers(edict_t *Which, SignalT SignalType) +{ + list::iterator is, next; + bool DoCheckWait = false; + + if (Signalers.size()) + { + for (is=Signalers.begin();is != Signalers.end();is = next) + { + next = is; + next++; + if ((*is)->Test(Which, SignalType)) + { + delete (*is); + Signalers.erase(is); + + DoCheckWait = true; + } + } + } + + if (DoCheckWait && (ScriptCondition == COND_WAIT_ANY || ScriptCondition == COND_WAIT_ALL)) + { + if (CheckWait()) + { + FinishWait(Which, true); + } + } +} + +bool CScript::CheckWait(void) +{ + list::iterator iv; + int count, needed; + + if (ScriptCondition == COND_WAIT_ALL) + { + needed = Waiting.size(); + } + else if (ScriptCondition == COND_WAIT_ANY) + { + needed = 1; + } + else if (ScriptCondition == COND_WAIT_TIME) + { + return false; + } + else if (ScriptCondition == COND_READY) + { + return true; + } + else + { + return false; + } + + count = 0; + if (Waiting.size()) + { + for (iv=Waiting.begin();iv != Waiting.end();iv++) + { + if ( (*iv)->GetIntValue()) + { + count++; + } + } + } + + if (count == needed) + { + ScriptCondition = COND_READY; + + return true; + } + + return false; +} + +void CScript::FinishWait(edict_t *Which, bool NoExecute) +{ + list::iterator iv; + + if (Waiting.size()) + { + for (iv=Waiting.begin();iv != Waiting.end();iv++) + { + if (ConditionInfo == WAIT_CLEAR) + { + (*iv)->ClearSignal(); + } + + delete *iv; + } + } + Waiting.erase(Waiting.begin(), Waiting.end() ); + + if (NoExecute) + { + Execute(Which, NULL); + } +} + +void CScript::Error (char *error, ...) +{ + va_list argptr; + char text[1024]; + + va_start (argptr, error); + vsprintf (text, error, argptr); + va_end (argptr); + + gi.error(text); +} + +void CScript::StartDebug(void) +{ + DebugLine("-------------------------------\n"); + DebugLine("Script: %s\n",Name); + DebugLine(" DEBUG at %d\n",Position); +} + +void CScript::EndDebug(void) +{ + DebugLine("-------------------------------\n"); +} + +void CScript::DebugLine (char *debugtext, ...) +{ + va_list argptr; + char text[1024]; + + va_start (argptr, debugtext); + vsprintf (text, debugtext, argptr); + va_end (argptr); + + Com_Printf(P_PURPLE "%s",text); + +#ifdef _DEBUG + OutputDebugString(text); +#endif +} + +void CScript::Think(void) +{ + int i = 0, null_snd = 0; + list::iterator it; + + if (sv_jumpcinematic->value == 2) + { // skipping this cinematic...kill any sounds played during the cinematic + if (bClearCinematicSounds) + { + bClearCinematicSounds = false; + gi.AddCommandString ("stopsound\n"); + } + } + + for(it=OnConditions.begin(); it != OnConditions.end(); it++) + { + if (ProcessOn((*it))) + { + OnConditions.erase(it); + break; + } + } + + ProcessEvents(); +} + +ScriptConditionT CScript::Execute(edict_t *new_other, edict_t *new_activator) +{ + bool Done; + int InstructionCount; + + if (ScriptCondition != COND_READY) + { + return ScriptCondition; + } + + if (DebugFlags & DEBUG_TIME) + { + StartDebug(); + DebugLine(" Current Time: %10.1f\n",level.time); + EndDebug(); + } + + if (new_other) + { + other = new_other; + } + if (new_activator) + { + activator = new_activator; + } + + InstructionCount = 0; + Done = false; + while (!Done) + { + InstructionCount++; + if (InstructionCount > INSTRUCTION_MAX) + { + Error("Runaway loop for script OR more than 1000 instructions"); + } + + switch(ReadByte()) + { + case CODE_NEW_GLOBAL: + HandleGlobal(false); + break; + case CODE_NEW_GLOBAL_PLUS_ASSIGNMENT: + HandleGlobal(true); + break; + case CODE_NEW_LOCAL: + HandleLocal(false); + break; + case CODE_NEW_LOCAL_PLUS_ASSIGNMENT: + HandleLocal(true); + break; + case CODE_NEW_PARAMETER: + HandleParameter(false); + break; + case CODE_NEW_PARAMETER_PLUS_DEFAULT: + HandleParameter(true); + break; + case CODE_FIELD: + HandleField(); + break; + case CODE_ASSIGNMENT: + HandleAssignment(); + break; + case CODE_ADD: + HandleAdd(); + break; + case CODE_SUBTRACT: + HandleSubtract(); + break; + case CODE_MULTIPLY: + HandleMultiply(); + break; + case CODE_DIVIDE: + HandleDivide(); + break; + case CODE_ADD_ASSIGNMENT: + HandleAddAssignment(); + break; + case CODE_SUBTRACT_ASSIGNMENT: + HandleSubtractAssignment(); + break; + case CODE_MULTIPLY_ASSIGNMENT: + HandleMultiplyAssignment(); + break; + case CODE_DIVIDE_ASSIGNMENT: + HandleDivideAssignment(); + break; + case CODE_GOTO: + HandleGoto(); + break; + case CODE_PUSH: + HandlePush(); + break; + case CODE_POP: + HandlePop(); + break; + case CODE_IF: + HandleIf(); + break; + case CODE_ON: + HandleOn(); + break; + case CODE_RESUME: + HandleResume(); + Done = true; + break; + case CODE_EXIT: + ScriptCondition = COND_COMPLETED; + Done = true; + break; + case CODE_SUSPEND: + //ScriptCondition = COND_SUSPENDED; + Done = true; + break; + case CODE_DEBUG: + HandleDebug(); + break; + case CODE_WAIT_SECONDS: + Done = HandleTimeWait(); + break; + case CODE_WAIT_ALL: + Done = HandleWait(true); + break; + case CODE_WAIT_ANY: + Done = HandleWait(false); + break; + case CODE_MOVE: + HandleMove(); + break; + case CODE_ROTATE: + HandleRotate(); + break; + case CODE_USE: + { + byte oldFreeze = game.cinematicfreeze; + bool bPlayerIsAlive = (g_edicts[1].health > 0); + if (oldFreeze && !bPlayerIsAlive) + { // I don't know how we got a script started with the player dead, but end it now. + //ScriptCondition = COND_COMPLETED; + CinematicFreeze(false); + Done = true; + break; + } + HandleUse(); + if (oldFreeze != game.cinematicfreeze) + { + // mark the start time of this cinematic + s_cinematicStartTime = level.time; + if (!bPlayerIsAlive) + { + // we just started a cinematic and the player's pushing up daisies. end the script. + //ScriptCondition = COND_COMPLETED; + CinematicFreeze(false); + Done = true; + } + } + break; + } + case CODE_COPY_PLAYER_ATTRIBUTES: + HandleCopyPlayerAttributes(); + break; + case CODE_SET_VIEW_ANGLES: + HandleSetViewAngles(); + break; + case CODE_SET_CACHE_SIZE: + HandleSetCacheSize(); + break; + case CODE_ANIMATE: + HandleAnimate(); + break; + case CODE_RESET_AI: + HandleResetAI(); + break; + case CODE_PRINT: + HandlePrint(); + break; + case CODE_PLAY_SOUND: + HandlePlaySound(); + break; + case CODE_UNLOAD_SOUND: + HandleUnloadSound(); + break; + case CODE_UNLOAD_ROFF: + HandleUnloadROFF(); + break; + case CODE_ENABLE: + HandleFeature(true); + break; + case CODE_DISABLE: + HandleFeature(false); + break; + case CODE_DEBUG_STATEMENT: + HandleDebugStatement(); + break; + case CODE_CACHE_SOUND: + HandleCacheSound(); + break; + case CODE_CACHE_STRING_PACKAGE: + HandleCacheStringPackage(); + break; + case CODE_CACHE_ROFF: + HandleCacheROFF(); + break; + case CODE_REMOVE: + HandleRemove(); + break; + case CODE_HELICOPTER: + HandleHelicopter(); + break; + case CODE_PLAYSONG: + HandlePlaySong(); + break; + case CODE_SETCVAR: + HandleSetCvar(); + break; + case CODE_CONSOLE_COMMAND: + HandleConsoleCommand(); + break; + case CODE_MOVEROTATE: + HandleMoveRotate(); + break; + case CODE_TANK: + HandleTank(); + break; + default: + Done = true; + break; + } + + if (Position >= Length) + { + Done = true; + ScriptCondition = COND_COMPLETED; + } + } + return ScriptCondition; +} + +Variable *CScript::FindLocal(char *Name) +{ + list::iterator iv; + + if (LocalVariables.size()) + { + for (iv=LocalVariables.begin();iv != LocalVariables.end();iv++) + { + if (strcmp(Name, (*iv)->GetName()) == 0) + { + return *iv; + } + } + } + + return NULL; +} + +bool CScript::NewLocal(Variable *Which) +{ + Variable *Check; + + Check = FindLocal(Which->GetName()); + if (Check) + { // already exists + return false; + } + + LocalVariables.push_back(Which); + + return true; +} + +Variable *CScript::FindParameter(char *Name) +{ + list::iterator iv; + + if (ParameterVariables.size()) + { + for (iv=ParameterVariables.begin();iv != ParameterVariables.end();iv++) + { + if (strcmp(Name, (*iv)->GetName()) == 0) + { + return *iv; + } + } + } + + return NULL; +} + +bool CScript::NewParameter(Variable *Which) +{ + Variable *Check; + StringVar *ParmValue; + edict_t *Search; + Variable *temp; + vec3_t vec; + + Check = FindParameter(Which->GetName()); + if (Check) + { // already exists + return false; + } + + ParameterVariables.push_back(Which); + + if (!ParameterValues.size()) + { + Error("Missing Parameter"); + } + + ParmValue = *ParameterValues.begin(); + ParameterValues.erase(ParameterValues.begin()); + + switch(Which->GetType()) + { + case TypeENTITY: + Search = G_Find(NULL, FOFS(targetname), ParmValue->GetStringValue()); + temp = new EntityVar(Search); + break; + + case TypeINT: + temp = new IntVar("parm",atol(ParmValue->GetStringValue())); + break; + + case TypeFLOAT: + temp = new FloatVar("parm",atof(ParmValue->GetStringValue())); + break; + + case TypeVECTOR: + sscanf (ParmValue->GetStringValue(), "%f %f %f", &vec[0], &vec[1], &vec[2]); + temp = new VectorVar("parm",vec[0],vec[1],vec[2]); + break; + + default: + delete ParmValue; + return false; + break; + } + + (*Which) = temp; + + delete temp; + delete ParmValue; + + return true; +} + +//========================================================================== + diff --git a/Source/Game/gamecpp/ds.h b/Source/Game/gamecpp/ds.h new file mode 100644 index 0000000..e9cf6f6 --- /dev/null +++ b/Source/Game/gamecpp/ds.h @@ -0,0 +1,702 @@ +#ifndef __DS +#define __DS + +#include "pcode.h" +#include "list.h" +#include "fields.h" + +class CScript; + +enum ScriptConditionT +{ + COND_READY, + COND_COMPLETED, + COND_SUSPENDED, + COND_WAIT_ALL, + COND_WAIT_ANY, + COND_WAIT_TIME, +}; + +#define MAX_INDEX 100 + +#define INSTRUCTION_MAX 1000 + +//========================================================================== + +typedef struct +{ + int index; + char name[VAR_LENGTH]; +} saveglobal_t; + +class Variable +{ +protected: + char Name[VAR_LENGTH]; + VariableT Type; + int idx; +public: + Variable(char *NewName = "", VariableT NewType = TypeUNKNOWN); + Variable(CScript *Script) {} + virtual ~Variable() {} + void SetIndex(CScript *Script); + void GetIndex(CScript *Script); + char *GetName(void) { return Name; } + VariableT GetType(void) { return Type; } + virtual int GetIntValue(void) { return 0; } + virtual float GetFloatValue(void) { return 0.0; } + virtual void GetVectorValue(vec3_t &VecValue) { VecValue[0] = VecValue[1] = VecValue[2] = 0.0; } + virtual edict_t *GetEdictValue(void) { return NULL; } + virtual char *GetStringValue(void) { return ""; } + virtual void ReadValue(CScript *Script) {} + virtual void Debug(CScript *Script); + virtual void Signal(edict_t *Which) { } + virtual void ClearSignal(void) { } + + virtual void Evaluate(CScript *Script, Variable *orig); + virtual void Read(CScript *Script) { assert(0); } + virtual void Write(CScript *Script) { assert(0); } + + virtual Variable *operator +(Variable *VI) { return NULL; } + virtual Variable *operator -(Variable *VI) { return NULL; } + virtual Variable *operator *(Variable *VI) { return NULL; } + virtual Variable *operator /(Variable *VI) { return NULL; } + virtual void operator =(Variable *VI) { } + virtual bool operator ==(Variable *VI) { return false; } + virtual bool operator !=(Variable *VI) { return false; } + virtual bool operator <(Variable *VI) { return false; } + virtual bool operator <=(Variable *VI) { return false; } + virtual bool operator >(Variable *VI) { return false; } + virtual bool operator >=(Variable *VI) { return false; } +}; + +//========================================================================== + +class IntVar : public Variable +{ +protected: + int Value; + +public: + IntVar(char *Name = "", int InitValue = 0); + virtual int GetIntValue(void) { return Value; } + virtual float GetFloatValue(void) { return (float)Value; } + virtual void ReadValue(CScript *Script); + virtual void Debug(CScript *Script); + virtual void Signal(edict_t *Which); + virtual void ClearSignal(void); + + virtual void Evaluate(CScript *Script, IntVar *orig); + IntVar(CScript *Script); + virtual void Write(CScript *Script); + + virtual Variable *operator +(Variable *VI); + virtual Variable *operator -(Variable *VI); + virtual Variable *operator *(Variable *VI); + virtual Variable *operator /(Variable *VI); + virtual void operator =(Variable *VI); + + virtual bool operator ==(Variable *VI) { return Value == VI->GetIntValue(); } + virtual bool operator !=(Variable *VI) { return Value != VI->GetIntValue(); } + virtual bool operator <(Variable *VI) { return Value < VI->GetIntValue(); } + virtual bool operator <=(Variable *VI) { return Value <= VI->GetIntValue(); } + virtual bool operator >(Variable *VI) { return Value > VI->GetIntValue(); } + virtual bool operator >=(Variable *VI) { return Value >= VI->GetIntValue(); } +}; + +//========================================================================== + +class FloatVar : public Variable +{ +protected: + float Value; + +public: + FloatVar(char *Name = "", float InitValue = 0.0); + virtual int GetIntValue(void) { return (int)Value; } + virtual float GetFloatValue(void) { return Value; } + virtual void ReadValue(CScript *Script); + virtual void Debug(CScript *Script); + + virtual void Evaluate(CScript *Script, FloatVar *orig); + FloatVar(CScript *Script); + virtual void Write(CScript *Script); + + virtual Variable *operator +(Variable *VI); + virtual Variable *operator -(Variable *VI); + virtual Variable *operator *(Variable *VI); + virtual Variable *operator /(Variable *VI); + virtual void operator =(Variable *VI); + + virtual bool operator ==(Variable *VI) { return Value == VI->GetFloatValue(); } + virtual bool operator !=(Variable *VI) { return Value != VI->GetFloatValue(); } + virtual bool operator <(Variable *VI) { return Value < VI->GetFloatValue(); } + virtual bool operator <=(Variable *VI) { return Value <= VI->GetFloatValue(); } + virtual bool operator >(Variable *VI) { return Value > VI->GetFloatValue(); } + virtual bool operator >=(Variable *VI) { return Value >= VI->GetFloatValue(); } +}; + +//========================================================================== + +class VectorVar : public Variable +{ +protected: + vec3_t Value; + +public: + VectorVar(char *Name = "", float InitValueX = 0.0, float InitValueY = 0.0, float InitValueZ = 0.0); + VectorVar(vec3_t NewValue); + virtual void GetVectorValue(vec3_t &VecValue); + virtual void ReadValue(CScript *Script); + virtual void Debug(CScript *Script); + + virtual void Evaluate(CScript *Script, VectorVar *orig); + VectorVar(CScript *Script); + virtual void Write(CScript *Script); + + virtual Variable *operator +(Variable *VI); + virtual Variable *operator -(Variable *VI); + virtual Variable *operator *(Variable *VI); + virtual Variable *operator /(Variable *VI); + virtual void operator =(Variable *VI); + virtual bool operator ==(Variable *VI); + virtual bool operator !=(Variable *VI); + virtual bool operator <(Variable *VI); + virtual bool operator <=(Variable *VI); + virtual bool operator >(Variable *VI); + virtual bool operator >=(Variable *VI); +}; + +//========================================================================== + +class EntityVar : public Variable +{ +protected: + edict_t *Value; + +public: + EntityVar(char *Name = "", int InitValue = 0); + EntityVar(edict_t *Which); + virtual int GetIntValue(void); + virtual edict_t *GetEdictValue(void) { return Value; } + virtual void ReadValue(CScript *Script); + virtual void Debug(CScript *Script); + + virtual void Evaluate(CScript *Script, EntityVar *orig); + EntityVar(CScript *Script); + virtual void Write(CScript *Script); + + virtual void operator =(Variable *VI); + virtual bool operator ==(Variable *VI); + virtual bool operator !=(Variable *VI); +}; + +//========================================================================== + +class StringVar : public Variable +{ +protected: + char Value[VAR_LENGTH]; + +public: + StringVar(char *Name = "", char *InitValue = ""); + virtual char *GetStringValue(void) { return Value; } + virtual void ReadValue(CScript *Script); + + virtual void Evaluate(CScript *Script, StringVar *orig); + StringVar(CScript *Script); + virtual void Write(CScript *Script); +}; + +//========================================================================== + +class VariableVar : public Variable +{ +protected: + Variable *Value; + +public: + VariableVar(char *Name = ""); + virtual int GetIntValue(void) { return Value->GetIntValue(); } + virtual float GetFloatValue(void) { return Value->GetFloatValue(); } + virtual void GetVectorValue(vec3_t &VecValue) { Value->GetVectorValue(VecValue); } + virtual edict_t *GetEdictValue(void) { return Value->GetEdictValue(); } + virtual char *GetStringValue(void) { return Value->GetStringValue(); } + virtual void ReadValue(CScript *Script); + virtual void Debug(CScript *Script); + virtual void Signal(edict_t *Which) { Value->Signal(Which); } + virtual void ClearSignal(void) { Value->ClearSignal(); } + + virtual void Evaluate(CScript *Script, VariableVar *orig); + VariableVar(CScript *Script); + virtual void Write(CScript *Script); + + virtual Variable *operator +(Variable *VI) { return (*Value) + VI; } + virtual Variable *operator -(Variable *VI) { return (*Value) - VI; } + virtual Variable *operator *(Variable *VI) { return (*Value) * VI; } + virtual Variable *operator /(Variable *VI) { return (*Value) / VI; } + virtual void operator =(Variable *VI) { (*Value) = VI; } + + virtual bool operator ==(Variable *VI) { return (*Value) == VI; } + virtual bool operator !=(Variable *VI) { return (*Value) != VI; } + virtual bool operator <(Variable *VI) { return (*Value) < VI; } + virtual bool operator <=(Variable *VI) { return (*Value) <= VI; } + virtual bool operator >(Variable *VI) { return (*Value) > VI; } + virtual bool operator >=(Variable *VI) { return (*Value) >= VI; } +}; + +//========================================================================== + +class FieldDef; + +class FieldVariableVar : public Variable +{ +protected: + Variable *Value; + FieldDef *Field; +public: + FieldVariableVar(char *Name = ""); + virtual int GetIntValue(void); + virtual float GetFloatValue(void); + virtual void GetVectorValue(vec3_t &VecValue); + virtual edict_t *GetEdictValue(void); + virtual char *GetStringValue(void); + virtual void ReadValue(CScript *Script); + virtual void Debug(CScript *Script); + virtual void Signal(edict_t *Which) { Value->Signal(Which); } + virtual void ClearSignal(void) { Value->ClearSignal(); } + + virtual void Evaluate(CScript *Script, FieldVariableVar *orig); + FieldVariableVar(CScript *Script); + virtual void Write(CScript *Script); + + virtual Variable *operator +(Variable *VI); + virtual Variable *operator -(Variable *VI); + virtual Variable *operator *(Variable *VI); + virtual Variable *operator /(Variable *VI); + virtual void operator =(Variable *VI); + + virtual bool operator ==(Variable *VI); + virtual bool operator !=(Variable *VI); + virtual bool operator <(Variable *VI); + virtual bool operator <=(Variable *VI); + virtual bool operator >(Variable *VI); + virtual bool operator >=(Variable *VI); +}; + +//========================================================================== + +enum SignalT +{ + SIGNAL_MOVE, + SIGNAL_ROTATE, + SIGNAL_ANIMATE, + SIGNAL_MOVEROTATE, + SIGNAL_HELI, + SIGNAL_TANK +}; + +class Signaler +{ +private: + edict_t *Edict; + Variable *Var; + SignalT SignalType; + +public: + Signaler() {} + Signaler(edict_t *NewEdict, Variable *NewVar, SignalT NewSignalType); + ~Signaler(void); + bool Test(edict_t *Which, SignalT WhichType); + edict_t *GetEdict(void) { return Edict; } + Variable *GetVar(void) { return Var; } + SignalT GetType(void) { return SignalType; } + bool operator ==(Signaler *SI); + + virtual void Evaluate(CScript *Script, Signaler *orig); + Signaler(CScript *Script); + virtual void Write(CScript *Script); +}; + +//========================================================================== + +class FieldDef +{ +private: + char Name[VAR_LENGTH]; + VariableT Type; + int Offset; + fieldtype_t FieldType; + int idx; + +public: + FieldDef() {} + FieldDef(CScript *Script); + byte *GetOffset(Variable *Var); + Variable *GetValue(Variable *Var); + int GetIntValue(Variable *Var); + float GetFloatValue(Variable *Var); + void GetVectorValue(Variable *Var, vec3_t &VecValue); + edict_t *GetEdictValue(Variable *Var); + char *GetStringValue(Variable *Var); + void SetValue(Variable *Var, Variable *Value); + + virtual void Evaluate(CScript *Script, FieldDef *orig); + FieldDef(CScript *Script, bool loading); + virtual void Write(CScript *Script); +}; + +//========================================================================== + +enum EventT +{ + EVENT_MOVE_DONE, + EVENT_ROTATE_DONE, + EVENT_SCRIPT_WAIT, + EVENT_SCRIPT_EXECUTE, + EVENT_MOVEROTATE, + EVENT_ANIMATE_DONE, + EVENT_HELICOPTER_DONE, + EVENT_TANK_DONE +}; + +class Event +{ +protected: + float Time; + EventT Type; + int Priority; + +public: + Event() {} + Event(float NewTime, EventT NewType); + virtual ~Event() {} + float GetTime(void) { return Time; } + EventT GetType(void) { return Type; } + int GetPriority(void) { return Priority; } + virtual bool Process(CScript *Script); + virtual void SetEventState(qboolean done){}; + + virtual void Evaluate(CScript *Script, Event *orig); + Event(CScript *Script) { assert(0); } + virtual void Write(CScript *Script) { assert(0); } +}; +//========================================================================== + +class AnimateDoneEvent : public Event +{ +private: + + qboolean Done; + edict_t *Ent; + +public: + AnimateDoneEvent() {} + AnimateDoneEvent(edict_t *ent); + virtual bool Process(CScript *Script); + virtual void SetEventState(qboolean done){Done = done;}; + + virtual void Evaluate(CScript *Script, AnimateDoneEvent *orig); + AnimateDoneEvent(CScript *Script); + virtual void Write(CScript *Script); +}; + +//========================================================================== + +class MoveDoneEvent : public Event +{ +private: + edict_t *Ent; + +public: + MoveDoneEvent() {} + MoveDoneEvent(float NewTime, edict_t *NewEnt); + virtual bool Process(CScript *Script); + + virtual void Evaluate(CScript *Script, MoveDoneEvent *orig); + MoveDoneEvent(CScript *Script); + virtual void Write(CScript *Script); +}; + +//========================================================================== + +class RotateDoneEvent : public Event +{ +private: + edict_t *Ent; + +public: + RotateDoneEvent() {} + RotateDoneEvent(float NewTime, edict_t *NewEnt); + virtual bool Process(CScript *Script); + + virtual void Evaluate(CScript *Script, RotateDoneEvent *orig); + RotateDoneEvent(CScript *Script); + virtual void Write(CScript *Script); +}; + +//========================================================================== + +class HelicopterDoneEvent : public Event +{ +private: + edict_t *Ent; + int m_ID; + +public: + HelicopterDoneEvent() {} + HelicopterDoneEvent(float NewTime, edict_t *NewEnt, int actionID); + virtual bool Process(CScript *Script); + + virtual void Evaluate(CScript *Script, HelicopterDoneEvent *orig); + HelicopterDoneEvent(CScript *Script); + virtual void Write(CScript *Script); +}; + +//========================================================================== + +class TankDoneEvent : public Event +{ +private: + edict_t *Ent; + int m_ID; + +public: + TankDoneEvent() {} + TankDoneEvent(float NewTime, edict_t *NewEnt, int actionID); + virtual bool Process(CScript *Script); + + virtual void Evaluate(CScript *Script, TankDoneEvent *orig); + TankDoneEvent(CScript *Script); + virtual void Write(CScript *Script); +}; + +//========================================================================== + +class MoveRotateEvent : public Event +{ +private: + edict_t *Ent; + vec3_t v3RelativeOrigin, v3RelativeAngles; + +public: + MoveRotateEvent() {} + MoveRotateEvent(float NewTime, edict_t *NewEnt, vec3_t v3RelOrigin, vec3_t v3RelAngles); + virtual bool Process(CScript *Script); + + virtual void Evaluate(CScript *Script, MoveRotateEvent *orig); + MoveRotateEvent(CScript *Script); + virtual void Write(CScript *Script); +}; + + +//========================================================================== + +class ExecuteEvent : public Event +{ +private: + edict_t *Other; + edict_t *Activator; + +public: + ExecuteEvent() {} + ExecuteEvent(float NewTime, edict_t *NewOther = NULL, edict_t *NewActivator = NULL); + virtual bool Process(CScript *Script); + + virtual void Evaluate(CScript *Script, ExecuteEvent *orig); + ExecuteEvent(CScript *Script); + virtual void Write(CScript *Script); +}; + +//========================================================================== + +class WaitEvent : public Event +{ +public: + WaitEvent() {} + WaitEvent(float NewTime); + virtual bool Process(CScript *Script); + + virtual void Evaluate(CScript *Script, WaitEvent *orig); + WaitEvent(CScript *Script); + virtual void Write(CScript *Script); +}; + +//========================================================================== + +typedef struct +{ + ScriptConditionT ScriptCondition; + int ConditionInfo; + int Length; + int Position; + int DebugFlags; + int owner; + int other; + int activator; +} savescript_t; + +class CScript +{ +private: + // Saved out separately + char Name[MAX_PATH]; + + unsigned char *Data; + ScriptConditionT ScriptCondition; + int ConditionInfo; + int Length; + int Position; + edict_t *owner; + edict_t *other; + edict_t *activator; + int DebugFlags; + + // Fields below here are not saved out, but reconstituted + list LocalVariables; + list ParameterVariables; + list Stack; + list Signalers; + list Waiting; + list ParameterValues; + list Events; + list OnConditions; + Variable *VarIndex[MAX_INDEX]; + FieldDef *Fields[MAX_INDEX]; + +// Not needed for save + bool ClearEvents; + int SavePosition; + ScriptConditionT SaveScriptCondition; + +public: + CScript(char *ScriptName, edict_t *new_owner); + CScript(void); + ~CScript(void); + + void LoadFile(void); + void Free(bool DoData); + void Clear(bool DoData); + void Write(void); + int GetEventNum(Event *ev); + Event *GetEventPtr(int ev); + + Variable *LookupVar(int Index) { return VarIndex[Index]; } + int LookupVarIndex(Variable *Var); + void SetVarIndex(int Index, Variable *Var) { VarIndex[Index] = Var; } + FieldDef *LookupField(int Index) { return Fields[Index]; } + int LookupFieldIndex(FieldDef *Field); + void SetFieldIndex(int Index, FieldDef *Field) { Fields[Index] = Field; } + void SetParameter(char *Value); + + unsigned char ReadByte(void); + int ReadInt(void); + float ReadFloat(void); + char *ReadString(void); + Variable *ReadDeclaration(int &Index); + + void PushStack(Variable *VI); + Variable *PopStack(void); + + void HandleGlobal(bool Assignment); + void HandleLocal(bool Assignment); + void HandleParameter(bool Assignment); + void HandleField(void); + void HandleGoto(void); + Variable *HandleSpawn(void); + Variable *HandleBuiltinFunction(void); + void HandlePush(void); + void HandlePop(void); + void HandleAssignment(void); + void HandleAdd(void); + void HandleSubtract(void); + void HandleMultiply(void); + void HandleDivide(void); + void HandleDebug(void); + void HandleDebugStatement(void); + void HandleAddAssignment(void); + void HandleSubtractAssignment(void); + void HandleMultiplyAssignment(void); + void HandleDivideAssignment(void); + bool HandleWait(bool ForAll); + bool HandleTimeWait(void); + bool HandleIf(bool Reverse = false); + void HandleOn(void); + bool ProcessOn(int NewPosition); + void HandleResume(void); + + void HandlePrint(void); + void HandlePlaySound(void); + void HandleUnloadSound(void); + void HandleUnloadROFF(void); + void HandleFeature(bool Enable); + void HandleCacheSound(void); + void HandleCacheStringPackage(void); + void HandleCacheROFF(void); + + void HandleMove(void); + void HandleRotate(void); + void HandleUse(void); + void HandleTrigger(bool Enable); + void HandleAnimate(void); + void HandleResetAI(void); + void HandlePlaySong(void); + void HandleSetCvar(void); + void HandleConsoleCommand(void); + void HandleRemove(void); + void HandleHelicopter(void); + void HandleTank(void); + void HandleMoveRotate(void); + void HandleCopyPlayerAttributes(void); + void HandleSetViewAngles(void); + void HandleSetCacheSize(void); + + void Move_Done(edict_t *ent); + void Move(edict_t *ent, vec3_t Dest); + void Rotate_Done(edict_t *ent); + void Rotate(edict_t *ent); + void Helicopter_Done(edict_t *ent); + void Helicopter(edict_t *ent, int actionID); + void Tank_Done(edict_t *ent); + void Tank(edict_t *ent, int actionID); + + Event *AddEvent(Event *Which); + void ProcessEvents(void); + void ClearTimeWait(void); + + void AddSignaler(edict_t *Edict, Variable *Var, SignalT SignalType); + void CheckSignalers(edict_t *Which, SignalT SignalType); + bool CheckWait(void); + void FinishWait(edict_t *Which, bool NoExecute); + void Error (char *error, ...); + void StartDebug(void); + void EndDebug(void); + void DebugLine (char *debugtext, ...); + + void Think(void); + ScriptConditionT Execute(edict_t *new_other, edict_t *new_activator); + + Variable *FindLocal(char *Name); + bool NewLocal(Variable *Which); + Variable *FindParameter(char *Name); + bool NewParameter(Variable *Which); + + void CallMovementAnimation(int Flags, ai_public_c* ai, + scripted_decision *DecisionPointer, vec3_t MovingVal, + vec3_t TurningVal, bool Absolute, edict_t *ent, + float speed, int AnimationNumber = -1); + + void CallAnimation(action_code actCode, int Flags, ai_public_c* ai, + scripted_decision *DecisionPointer, vec3_t MovingVal, + vec3_t TurningVal, bool Absolute, edict_t *ent, + float speed, float HoldingVal, Event *EventPtr, + edict_t *TargetEnt, bool ShouldKill, int NullTarget, + int Emotion, mmove_t *preferredAnim=NULL); +}; + +//========================================================================== + +extern list GlobalVariables; +extern list Scripts; + +#endif diff --git a/Source/Game/gamecpp/fx_effects.cpp b/Source/Game/gamecpp/fx_effects.cpp new file mode 100644 index 0000000..01e7e78 --- /dev/null +++ b/Source/Game/gamecpp/fx_effects.cpp @@ -0,0 +1,196 @@ + +#include "g_local.h" + +void GetOffsetFromEnt(edict_t *ent, vec3_t offset, vec3_t ang, vec3_t sourceNormal, vec3_t sourceHit) +{ + vec3_t sourcePos, sourceAng; + float cosVal, sinVal; + + VectorSubtract(sourceHit, ent->s.origin, offset); + + // y z x + // roll yaw pitch + + VectorCopy(offset, sourcePos);//need to store it if before modification + VectorCopy(sourceNormal, ang); + VectorCopy(ang, sourceAng);//need to store it if before modification + + cosVal = cos(M_PI/180.0 * ent->s.angles[YAW]); + sinVal = sin(M_PI/180.0 * ent->s.angles[YAW]); + + offset[0] = cosVal*sourcePos[0] + sinVal*sourcePos[1]; + offset[1] = -cosVal*sourcePos[1] + sinVal*sourcePos[0]; + + ang[0] = cosVal*sourceAng[0] + sinVal*sourceAng[1]; + ang[1] = cosVal*sourceAng[1] - sinVal*sourceAng[0]; +} + +void FXMSG_WriteRelativePos(edict_t *ent, vec3_t endpos, vec3_t normal, mtexinfo_t *surf) +{ + vec3_t spot; + + if(ent == world) + { + if(normal == NULL) + { + gi.WriteByte(RI_WORLD_NOSURF); + gi.WritePosition(endpos); + } + else + { + gi.WriteByte(RI_WORLD); + gi.WritePosition(endpos); + WriteDirExp(normal); + } + } + else if(ent->solid == SOLID_BSP) + { + vec3_t hitLoc, hitAng; + + GetOffsetFromEnt(ent, hitLoc, hitAng, normal, endpos); + + gi.WriteByte(RI_BMODEL); + gi.WritePosition(hitLoc); + WriteDirExp(hitAng); + gi.WriteShort(ent - g_edicts); + if(ent->s.renderindex != 0) + { + if(ent->surfaceType) + { + gi.WriteByte(ent->surfaceType); + } + else + { + gi.WriteByte(surf->flags>>24); + } + } + else + { + gi.WriteByte(surf->flags>>24); + } + } + else + { + VectorSubtract(endpos, ent->s.origin, spot); + //VectorSubtract(ent->s.origin, endpos, spot); + spot[2] = 0; + + gi.WriteByte(RI_ENT); + gi.WritePosition(endpos); + WriteDirExp(spot); + if((ent->ai)||(ent->client)) + { + gi.WriteByte(SURF_BLOOD); //fixme: this looks like it could be problematic! bleeding vehicles, etc? + } + else + { + gi.WriteByte(ent->surfaceType); + } + } +} + +void FXMSG_WriteRelativePosTR(trace_t &tr) +{ + FXMSG_WriteRelativePos(tr.ent, tr.endpos, tr.plane.normal, tr.surface); +} + +void FXMSG_WriteRelativePos_Dir(vec3_t pos, vec3_t dir, edict_t *ignore) +{ + trace_t tr; + vec3_t start, end; + + VectorMA(pos, 5, dir, start); + VectorMA(pos, -35, dir, end); + + gi.trace (start, vec3_origin, vec3_origin, end, ignore, MASK_SOLID, &tr); + + if(tr.fraction < .99) + { + FXMSG_WriteRelativePosTR(tr); + } + else + { + FXMSG_WriteRelativePos(world, pos, NULL, NULL); + } +} + +void FXMSG_WriteRelativePos_TestGround(vec3_t pos, edict_t *ignore) +{ + vec3_t dir = {0, 0, 1}; + + FXMSG_WriteRelativePos_Dir(pos, dir, ignore); +} + + +//------------------------------------------------------------------------- +// +// General Stuff +// +//------------------------------------------------------------------------- + +void FX_Init(void) +{ + return; +} + +//------------------------------------------------------------------------- +// +// Event Stuff +// +//------------------------------------------------------------------------- + +void FX_SetEvent_Data(edict_t *ent, int eventType,int data) +{ // make this more complex to handle the possibility of multiple events? + assert(eventType < EV_NUM); + + if(ent->s.event) + { + if(ent->s.event2) + { + ent->s.event2 |= 0x80; + ent->s.event3 = eventType; + ent->s.data3 = data; + } + else + { + ent->s.event |= 0x80; + ent->s.event2 = eventType; + ent->s.data2 = data; + } + } + else + { + ent->s.event = eventType; + ent->s.data = data; + } +} + +void FX_SetEvent(edict_t *ent, int eventType) +{ // make this more complex to handle the possibility of multiple events? + assert(eventType < EV_NUM); + + if(ent->s.event) + { + if(ent->s.event2) + { + ent->s.event2 |= 0x80; + ent->s.event3 = eventType; + } + else + { + ent->s.event |= 0x80; + ent->s.event2 = eventType; + } + } + else + { + ent->s.event = eventType; + } +} + + +void FX_ClearEvent(edict_t *ent) +{ + ent->s.event = 0; +} + diff --git a/Source/Game/gamecpp/fx_effects.h b/Source/Game/gamecpp/fx_effects.h new file mode 100644 index 0000000..9c2231d --- /dev/null +++ b/Source/Game/gamecpp/fx_effects.h @@ -0,0 +1,179 @@ +#ifndef __FXEFFECTS_H_ +#define __FXEFFECTS_H_ + +#include "..\ghoul\ighoul.h" +#include "q_shared.h" +#include "q_sh_fx.h" +#include "game.h" + +extern game_import_t gi; + +// For use on FX_MakeDecalBelow +typedef enum +{ + FXDECAL_BLOODPOOL = 0, + FXDECAL_SCORCHMARK, + FXDECAL_OOZE, + FXDECAL_PIPELEFT, + FXDECAL_PUDDLE, + FXDECAL_WHITESCORCH, + FXDECAL_SINKPIPE, + FXDECAL_MAX, +}; + +void WriteDirExp(vec3_t val); + +void FX_Init(void); + +void FX_SetEvent_Data(edict_t *ent, int eventType, int data); +void FX_SetEvent(edict_t *ent, int eventType); +void FX_ClearEvent(edict_t *ent); + + +void FXMSG_WriteRelativePos(edict_t *ent, vec3_t endpos, vec3_t normal, struct mtexinfo_s *surf); +void FXMSG_WriteRelativePosTR(trace_t &tr); +void FXMSG_WriteRelativePos_Dir(vec3_t pos, vec3_t dir, edict_t *ignore); +void FXMSG_WriteRelativePos_TestGround(vec3_t pos, edict_t *ignore); + +void FX_MakeBarrelExplode(vec3_t pos, edict_t *source); +void FX_MakeBloodSpray(vec3_t pos, vec3_t splatDir, int vel, int amount, edict_t *source); +void FX_MakeDecalBelow(vec3_t pos, int type, unsigned int lLifeTime); +void FX_MakeSparks(vec3_t pos, vec3_t dir, int type); +void FX_MakeGumballs(vec3_t pos, vec3_t dir, int type); +void FX_MakeGlob(vec3_t pos, short color, int size); +void FX_MakeExtinguisherExplode(edict_t *ent, vec3_t dirVel);//, trace_t tr); +void FX_MakeDustPuff(vec3_t pos); +void FX_MakeElectricArc(vec3_t pos, int len, vec3_t dir); +void FX_MakeBulletWhiz(edict_t *ent, vec3_t offset, vec3_t dir, int power, int len); +void FX_MakeWallDamage(trace_t &tr, vec3_t dir, int size, int markType,int debris); +void FX_MakeSkyLightning(void); +void FX_MakeRocketExplosion(edict_t *ent, vec3_t point, int size, vec3_t normal, struct mtexinfo_s *surf); +void FX_MakeGrenadeExplosion(edict_t *ent, vec3_t point, int size); +void FX_ThrowDebris(vec3_t origin,vec3_t norm, byte numchunks, byte scale, byte skin,byte x_max,byte y_max,byte z_max, byte surfType); +void FX_ThrowGlass(vec3_t origin, byte numchunks); +void FX_C4Explosion(edict_t *ent); +void FX_Flashpack(vec3_t pos); +void FX_NeuralPulse(vec3_t pos); +void FX_MakeAutoGunMuzzleFlash(edict_t *self); +void FX_StrikeWall(vec3_t spot, byte wallType); +void FX_BubbleTrail(vec3_t start, vec3_t end); +void FX_SmokeBurst(vec3_t pos, float size); +void FX_MakeLine(vec3_t start, vec3_t end, paletteRGBA_t color, int lifetime = 1, int mcastType = MULTICAST_ALL); +void FX_WallSparks(vec3_t pos, vec3_t dir, float size); +void FX_Bleed(edict_t *ent, GhoulID boltID, int amount); +void FX_BloodCloud(edict_t *ent, GhoulID boltID, int amount); +void FX_HeadExplosion(edict_t *ent, GhoulID boltID); +void FX_BloodJet(edict_t *ent, vec3_t spot, vec3_t jetDir); +void FX_HeliGun(edict_t *ent, IGhoulInst *heli, IGhoulInst *muzzle, GhoulID heliToMuzzleBolt, GhoulID muzEnd); +void FX_WhiteBurn(edict_t *ent); +void FX_EnemyShot(edict_t *ent, IGhoulInst *gun, byte weapID); +void FX_WhiteBlast(vec3_t org); +void FX_MinimiTrail(edict_t *ent); +void FX_Explosion(vec3_t pos, byte size); +void FX_VehicleExplosion(vec3_t pos, byte size); +void FX_SmokePuff(vec3_t pos,byte red,byte green,byte blue,byte alpha); +void FX_LittleExplosion(vec3_t pos, byte size, byte bSound); +void FX_MediumExplosion(vec3_t pos, byte size, byte bSound); +void FX_LargeExplosion(vec3_t pos, byte size, byte bSound); +void FX_MakeRing(vec3_t pos, short size); +void FX_PaperCloud(vec3_t vPos, byte nCount/*0 generates random num of papers*/); +void FX_SodaCans(vec3_t vPos, vec3_t vDir, byte nSpeed, byte nCount/*0 generates random num of cans*/); +void FX_MakeCoins(vec3_t pos, vec3_t dir, int type); +void FX_FloorSpace(edict_t *ent); +void FX_DropDustBits(vec3_t spot, int amount); +void FX_MakeRicochet(vec3_t vPos); +void FX_PhoneHit(vec3_t vPos); +void FX_TrashcanHit(vec3_t vPos); +void FX_HandleDMShotEffects(vec3_t start, vec3_t dir, vec3_t end, edict_t *shooter, int tracerfx, IGhoulInst *gun, int muzzlefx); +void FX_HandleDMShotHitEffects(vec3_t start, vec3_t dir, vec3_t end, edict_t *shooter, int tracerfx, IGhoulInst *gun, int muzzlefx); +void FX_HandleDMShotBigHitEffects(vec3_t start, vec3_t dir, vec3_t end, edict_t *shooter, int tracerfx, IGhoulInst *gun, int muzzlefx); +void FX_HandleDMMuzzleFlash(vec3_t start, vec3_t dir, edict_t *shooter, IGhoulInst *gun, int muzzlefx); + +void FXA_SetRotate(edict_t *targ, vec3_t angVel, IGhoulInst *bolton, IGhoulInst *bolt2 = 0, IGhoulInst *bolt3 = 0, IGhoulInst *bolt4 = 0); +eft_rotate_t *FXA_GetRotate(edict_t *targ); +void FXA_RemoveRotate(edict_t *targ); + +void FXA_SetFadeOut(edict_t *targ, float duration); +void FXA_SetFadeIn(edict_t *targ, float duration); +int FXA_CheckFade(edict_t *targ); // Returns false if the object should be removed. + + + +class CFXSender +{ +private: + int sendFlags; + int flags; + + short scale; + byte numElements; + vec3_t pos2; + vec3_t dir; + vec3_t min; + vec3_t max; + short lifeTime; + byte radius; + + void clear(void); + void sendData(vec3_t source, multicast_t castType, edict_t *ignoreClient); + int findEffectID(int effectID, edict_t *ent, GhoulID bolt = 0); + int findEffectID(char *name, edict_t *ent, GhoulID bolt = 0) + {findEffectID(gi.effectindex(name), ent, bolt);} + +public: + CFXSender(void){flags = 0;} + // data transmission + void setScale(float val){assert(val > -256); assert(val < 256); scale = val * 128; flags |= EFF_SCALE;} + void setNumElements(float val){assert(val >= 0);assert(val < 256); numElements = val; flags |= EFF_NUMELEMS;} + void setPos2(vec3_t in){VectorCopy(in, pos2); flags |= EFF_POS2;} + void setDir(vec3_t in){VectorCopy(in, dir); flags |= EFF_DIR;} + void setMin(vec3_t in){VectorCopy(in, min); flags |= EFF_MIN;} + void setMax(vec3_t in){VectorCopy(in, max); flags |= EFF_MAX;} + void setLifetime(float val){assert(val > -256); assert(val < 256); lifeTime = val * 128; flags |= EFF_LIFETIME;} + void setRadius(float val){assert(val >= 0); assert(val < 256); radius = val; flags |= EFF_RADIUS;} + void setPos2AsWallEndPoint(void){sendFlags |= EFAT_POSTOWALL;} + + // burst effects + void exec(int effectID, vec3_t pos, multicast_t castType = MULTICAST_PHS, edict_t *ignoreClient = 0); + void exec(int effectID, edict_t *ent, multicast_t castType = MULTICAST_PHS, edict_t *ignoreClient = 0); + void exec(int effectID, edict_t *ent, GhoulID bolt, multicast_t castType = MULTICAST_PHS, int usesAltAxis = 0, edict_t *ignoreClient = 0); + void execWithInst(int effectID, edict_t *ent, IGhoulInst *inst, GhoulID bolt, multicast_t castType = MULTICAST_PHS, int usesAltAxis = 0, edict_t *ignoreClient = 0); + void execFromRandomBolt(int effectID, edict_t *ent, multicast_t castType = MULTICAST_PHS, int usesAltAxis = 0, edict_t *ignoreClient = 0); + + void exec(char *name, vec3_t pos, multicast_t castType = MULTICAST_PHS, edict_t *ignoreClient = 0) + {exec(gi.effectindex(name), pos, castType, ignoreClient);} + void exec(char *name, edict_t *ent, multicast_t castType = MULTICAST_PHS, edict_t *ignoreClient = 0) + {exec(gi.effectindex(name), ent, castType, ignoreClient);} + void exec(char *name, edict_t *ent, GhoulID bolt, multicast_t castType = MULTICAST_PHS, int usesAltAxis = 0, edict_t *ignoreClient = 0) + {exec(gi.effectindex(name), ent, bolt, castType, usesAltAxis, ignoreClient);} + void execWithInst(char *name, edict_t *ent, IGhoulInst *inst, GhoulID bolt, multicast_t castType = MULTICAST_PHS, int usesAltAxis = 0, edict_t *ignoreClient = 0) + {execWithInst(gi.effectindex(name), ent, inst, bolt, castType, usesAltAxis, ignoreClient);} + void execFromRandomBolt(char *name, edict_t *ent, multicast_t castType = MULTICAST_PHS, int usesAltAxis = 0, edict_t *ignoreClient = 0) + {execFromRandomBolt(gi.effectindex(name), ent, castType, usesAltAxis, ignoreClient);} + // continual stuff + void execContinualEffect(int effectID, edict_t *ent, GhoulID bolt = 0, float size = 0); + void execContinualEffectFromRandomBolt(int effectID, edict_t *ent, float size = 0); + void stopContinualEffect(int effectID, edict_t *ent, GhoulID bolt = 0); + void editContinualEffect(int effectID, edict_t *ent, GhoulID bolt = 0, float newSize = 0); + void clearContinualEffects(edict_t *ent); + float getEffectSizeVal(int effectID, edict_t *ent, GhoulID bolt = 0); + int hasEffect(int effectID, edict_t *ent, GhoulID bolt = 0); + + void execContinualEffect(char *name, edict_t *ent, GhoulID bolt = 0, float size = 0) + {execContinualEffect(gi.effectindex(name), ent, bolt, size);} + void execContinualEffectFromRandomBolt(char *name, edict_t *ent, float size = 0) + {execContinualEffectFromRandomBolt(gi.effectindex(name), ent, size);} + void stopContinualEffect(char *name, edict_t *ent, GhoulID bolt = 0) + {stopContinualEffect(gi.effectindex(name), ent, bolt);} + void editContinualEffect(char *name, edict_t *ent, GhoulID bolt = 0, float newSize = 0) + {editContinualEffect(gi.effectindex(name), ent, bolt, newSize);} + float getEffectSizeVal(char *name, edict_t *ent, GhoulID bolt = 0) + {return getEffectSizeVal(gi.effectindex(name), ent, bolt);} + int hasEffect(char *name, edict_t *ent, GhoulID bolt = 0) + {return hasEffect(gi.effectindex(name), ent, bolt);} + +}; + +extern CFXSender fxRunner; + +#endif \ No newline at end of file diff --git a/Source/Game/gamecpp/fx_tempents.cpp b/Source/Game/gamecpp/fx_tempents.cpp new file mode 100644 index 0000000..e93fb89 --- /dev/null +++ b/Source/Game/gamecpp/fx_tempents.cpp @@ -0,0 +1,1421 @@ +#include "g_local.h" +#include "..\qcommon\ef_flags.h" + +bool lock_blood; + +void WriteDirExp(vec3_t val) +{ + VectorScale(val, 1000, val); + gi.WritePosition(val); + VectorScale(val, .001, val); +} + +int wallEffectFlag[SURF_NUM] = +{ + +0, // SURF_DEFAULT = 0, +0, // SURF_METAL_ALSO, +0, // SURF_SAND_YELLOW, +0, // SURF_SAND_WHITE, +0, // SURF_SAND_LBROWN, + +0, // SURF_SAND_DBROWN, +0, // SURF_GRAVEL_GREY, +0, // SURF_GRAVEL_DBROWN, +0, // SURF_GRAVEL_LBROWN, +0, // SURF_SNOW, + +0, // SURF_LIQUID_BLUE, +0, // SURF_LIQUID_GREEN, +0, // SURF_LIQUID_ORANGE, +0, // SURF_LIQUID_BROWN, +0, // SURF_WOOD_LBROWN, + +0, // SURF_WOOD_DBROWN, +0, // SURF_WOOD_LGREY, +0, // SURF_STONE_LGREY, +0, // SURF_STONE_DGREY, +0, // SURF_STONE_LBROWN, + +0, // SURF_STONE_DBROWN, +0, // SURF_STONE_WHITE, +0, // SURF_STONE_GREEN, +0, // SURF_STONE_RED, +0, // SURF_STONE_BLACK, + +0, // SURF_GRASS_GREEN, +0, // SURF_GRASS_BROWN, +0, // SURF_LIQUID_RED, +0, // SURF_METAL, +0, // SURF_METAL_WATERJET, + +0, // SURF_METAL_OILSPURT, +0, // SURF_METAL_CHEMSPURT, +1, // SURF_METAL_COMPUTERS, +0, // SURF_SNOW_LBROWN, +0, // SURF_SNOW_GREY, + +0, // SURF_BLOOD, +0, // SURF_LIQUID_BLACK, +1, // SURF_GLASS, +1, // SURF_GLASS_COMPUTER, +1, // SURF_SODAMACHINE, + +1, // SURF_PAPERWALL, +1, // SURF_NEWSPAPER_DAMAGE, +0, // SURF_METAL_STEAM +}; + +//------------------------------------------------------------------------- +// +// TempEnt Stuff +// +//------------------------------------------------------------------------- + +void FX_MakeBloodSpray(vec3_t pos, vec3_t splatDir, int vel, int amount, edict_t *source) +{ + trace_t tr; + vec3_t end; + + if(lock_blood) + { + return; + } + + if(!amount)return; + + VectorMA(pos, 128, splatDir, end); + + gi.trace (pos, NULL, NULL, end, source, MASK_SOLID, &tr); + if((tr.fraction > .99)||(tr.ent)&&(tr.ent->solid != SOLID_BSP)) + { + return;//fixme: tell client to do the spray & sound, but no splat + } + + gi.WriteByte (svc_temp_entity); + gi.WriteByte (TE_BLOODSPRAY); + FXMSG_WriteRelativePosTR(tr); + gi.multicast (pos, MULTICAST_PHS); +} + +void FX_MakeDecalBelow(vec3_t pos, int type, unsigned int lLifeTime) +{ + if (type == FXDECAL_BLOODPOOL) + { + if(lock_blood) + { + return; + } + else + { + fxRunner.exec("gore/bloodpool", pos); + return; + } + } + + + if (0 == lLifeTime) + { + lLifeTime = 10000; + } + + gi.WriteByte (svc_temp_entity); + switch(type) + { + case FXDECAL_BLOODPOOL: + gi.WriteByte (TE_BLOODPOOL); + break; + case FXDECAL_SCORCHMARK: + gi.WriteByte (TE_SCORCHMARK); + break; + case FXDECAL_OOZE: + gi.WriteByte (TE_OOZE); + break; + case FXDECAL_PIPELEFT: + gi.WriteByte (TE_PIPELEFT); + break; + case FXDECAL_PUDDLE: + gi.WriteByte (TE_PUDDLE); + break; + } + gi.WritePosition (pos); + gi.WriteLong (lLifeTime); + gi.multicast (pos, MULTICAST_PHS); +} + +void FX_MakeSparks(vec3_t pos, vec3_t dir, int type) +{ + gi.WriteByte (svc_temp_entity); + switch(type) + { + case 0: + gi.WriteByte (TE_ORANGE_SPARKS); + break; + case 1: + gi.WriteByte (TE_BLUE_SPARKS); + break; + case 2: + gi.WriteByte (TE_BARREL_SPARKS); + break; + } + gi.WritePosition (pos); + gi.WriteDir(dir); + gi.multicast (pos, MULTICAST_PHS); +} + +void FX_MakeGumballs(vec3_t pos, vec3_t dir, int type) +{ + gi.WriteByte (svc_temp_entity); + gi.WriteByte(TE_GUMBALLS); + gi.WritePosition (pos); + gi.WriteDir(dir); + gi.multicast (pos, MULTICAST_PHS); +} + +void FX_MakeCoins(vec3_t pos, vec3_t dir, int type) +{ + gi.WriteByte (svc_temp_entity); + gi.WriteByte(TE_COINS); + gi.WritePosition (pos); + gi.WriteDir(dir); + gi.multicast (pos, MULTICAST_PHS); +} + +void FX_MakeDustPuff(vec3_t pos) +{ + gi.WriteByte (svc_temp_entity); + gi.WriteByte (TE_DUST_PUFF); + gi.WritePosition (pos); + gi.multicast (pos, MULTICAST_PHS); +} + +void FX_MakeElectricArc(vec3_t pos, int len, vec3_t dir) +{ + gi.WriteByte (svc_temp_entity); + gi.WriteByte (TE_ELECTRIC_ARC); + gi.WritePosition (pos); + gi.WriteByte (len);// could compress a bit (maybe x2 or x4) + gi.WriteDir (dir); + gi.multicast (pos, MULTICAST_PHS); +} + +void FX_MakeBulletWhiz(edict_t *ent, vec3_t offset, vec3_t dir, int power, int len) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_WHIZBULLET); + gi.WriteByte(VectorNormalize(offset));// send length + VectorScale(offset, 1000, offset); + VectorScale(dir, 1000, dir); + gi.WritePosition(offset); // send direction + gi.WritePosition(dir); // direction of travel for the shot... + VectorScale(offset, 1.0/1000.0, offset); + VectorScale(dir, 1.0/1000.0, dir); + gi.WriteByte(100); + gi.WriteByte(220); + gi.unicast(ent, false); + +} + +void FX_MakeRicochet(vec3_t vPos) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_RICOCHET); + gi.WritePosition(vPos); // send position + gi.multicast(vPos, MULTICAST_PHS); +} + +// So certain wall effects aren't generated in huge amount at the same time. Like when +// the shot gun is used. +float walldamagetime = -999999.0; + + +void FX_MakeWallDamage(trace_t &tr, vec3_t dir, int size, int markType,int debris) +{ + bool tSwap; + byte walldamagesurface; + + if(tr.surface != NULL) + { + if(tr.surface->flags & SURF_SKY) + { + return; + } + } + + // kef -- enabling the following #if will output to c:\user\sof.log every texture + //you shoot along with its associated surfaceType +#if 0 +// m->wallType = tr.surface->textureinfo->surfaceType; + char buf[512]; + byte surfaceType = tr.surface->flags >> 24; + switch(surfaceType) + { + case SURF_DEFAULT: + sprintf(buf, "SURF_DEFAULT"); + break; + case SURF_METAL: + sprintf(buf, "SURF_METAL"); + break; + case SURF_SAND_YELLOW: + sprintf(buf, "SURF_SAND_YELLOW"); + break; + case SURF_SAND_WHITE: + sprintf(buf, "SURF_SAND_WHITE"); + break; + case SURF_SAND_LBROWN: + sprintf(buf, "SURF_SAND_LBROWN"); + break; + case SURF_SAND_DBROWN: + sprintf(buf, "SURF_SAND_DBROWN"); + break; + + case SURF_GRAVEL_GREY: + sprintf(buf, "SURF_GRAVEL_GREY"); + break; + case SURF_GRAVEL_DBROWN: + sprintf(buf, "SURF_GRAVEL_DBROWN"); + break; + case SURF_GRAVEL_LBROWN: + sprintf(buf, "SURF_GRAVEL_LBROWN"); + break; + + case SURF_SNOW: + sprintf(buf, "SURF_SNOW"); + break; + + case SURF_LIQUID_BLUE: + sprintf(buf, "SURF_LIQUID_BLUE"); + break; + case SURF_LIQUID_GREEN: + sprintf(buf, "SURF_LIQUID_GREEN"); + break; + case SURF_LIQUID_ORANGE: + sprintf(buf, "SURF_LIQUID_ORANGE"); + break; + case SURF_LIQUID_BROWN: + sprintf(buf, "SURF_LIQUID_BROWN"); + break; + + case SURF_WOOD_LBROWN: + sprintf(buf, "SURF_WOOD_LBROWN"); + break; + case SURF_WOOD_DBROWN: + sprintf(buf, "SURF_WOOD_DBROWN"); + break; + case SURF_WOOD_LGREY: + sprintf(buf, "SURF_WOOD_LGREY"); + break; + + case SURF_STONE_LGREY: // chunks.tga + sprintf(buf, "SURF_STONE_LGREY"); + break; + case SURF_STONE_DGREY: // chunksdrkclgry.tga + sprintf(buf, "SURF_STONE_DGREY"); + break; + case SURF_STONE_LBROWN: // chunksbrwn.tga + sprintf(buf, "SURF_STONE_LBROWN"); + break; + case SURF_STONE_DBROWN: // chunksbrwn.tga + sprintf(buf, "SURF_STONE_DBROWN"); + break; + case SURF_STONE_WHITE: // chunkswht.tga + sprintf(buf, "SURF_STONE_WHITE"); + break; + case SURF_STONE_GREEN: // chunkgreen.tga + sprintf(buf, "SURF_STONE_GREEN"); + break; + case SURF_STONE_RED: // chunkred.tga + sprintf(buf, "SURF_STONE_RED"); + break; + case SURF_STONE_BLACK: // chunkblk.tga + sprintf(buf, "SURF_STONE_BLACK"); + break; + + case SURF_GRASS_GREEN: + sprintf(buf, "SURF_GRASS_GREEN"); + break; + case SURF_GRASS_BROWN: + sprintf(buf, "SURF_GRASS_BROWN"); + break; + + case SURF_LIQUID_RED: + sprintf(buf, "SURF_LIQUID_RED"); + break; + + case SURF_METAL_STEAM: + sprintf(buf, "SURF_METAL_STEAM"); + break; + case SURF_METAL_WATERJET: + sprintf(buf, "SURF_METAL_WATERJET"); + break; + case SURF_METAL_OILSPURT: + sprintf(buf, "SURF_METAL_OILSPURT"); + break; + case SURF_METAL_CHEMSPURT: + sprintf(buf, "SURF_METAL_CHEMSPURT"); + break; + case SURF_METAL_COMPUTERS: + sprintf(buf, "SURF_METAL_COMPUTERS"); + break; + + case SURF_SNOW_LBROWN: + sprintf(buf, "SURF_SNOW_LBROWN"); + break; + case SURF_SNOW_GREY: + sprintf(buf, "SURF_SNOW_GREY"); + break; + case SURF_BLOOD: + sprintf(buf, "SURF_BLOOD"); + break; + case SURF_LIQUID_BLACK: + sprintf(buf, "SURF_LIQUID_BLACK"); + break; + case SURF_GLASS: + sprintf(buf, "SURF_GLASS"); + break; + case SURF_GLASS_COMPUTER: + sprintf(buf, "SURF_GLASS_COMPUTER"); + break; + case SURF_SODAMACHINE: + sprintf(buf, "SURF_SODAMACHINE"); + break; + case SURF_PAPERWALL: + sprintf(buf, "SURF_PAPERWALL"); + break; + case SURF_NEWSPAPER_DAMAGE: + sprintf(buf, "SURF_NEWSPAPER_DAMAGE"); + break; + } + + Com_Printf("___ %s %s\n", tr.surface->textureinfo->name, + buf); +#endif + + //WOOP WOOP! this test is based upon the test inside of FXMSG_WriteRelativePosTR to determine + // whether blood should be thrown. I think it's a bad test, but I'm paralleling (good verb) the + // test for now. + if ((tr.ent) && ((tr.ent->ai)||(tr.ent->client)) && (lock_blood)) + { + return; + } + + // So certain wall effects aren't generated in huge amount at the same time. Like when + // the shot gun is used. + walldamagesurface = tr.surface->flags >> 24; + + if (walldamagesurface >= 0) + { + if (wallEffectFlag[walldamagesurface]) + { + if (walldamagetime>level.time) + return; + + if (walldamagetime= level.time) + { + return; + } + } + + debrissurfType = surfType; + debrisTime = level.time; + + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_DEBRIS); + gi.WritePosition(origin); + gi.WriteDir(norm); + gi.WriteByte(numchunks); + gi.WriteByte(scale); + gi.WriteByte(skin); + gi.WriteByte(x_max); + gi.WriteByte(y_max); + gi.WriteByte(z_max); + gi.WriteByte(surfType); + gi.multicast(origin, MULTICAST_PHS); +} + +void FX_C4Explosion(edict_t *ent) +{ + vec3_t dir; + vec3_t pos; + + AngleVectors(ent->s.angles, dir, NULL, NULL); + + VectorMA(ent->s.origin, 2.0, dir, pos); + + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_C4EXPLODE); + FXMSG_WriteRelativePos_Dir(pos, dir, ent); +// FXMSG_WriteRelativePos_Dir(ent->s.origin, dir, ent); + gi.multicast(ent->s.origin, MULTICAST_PHS); +} + +void FX_Flashpack(vec3_t pos) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_FLASHPACK); + gi.WritePosition(pos); + gi.multicast(pos, MULTICAST_PHS); +} + +void FX_NeuralPulse(vec3_t pos) +{ + vec3_t spot; + + VectorCopy(pos, spot); + spot[2] += 16; + + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_NEURALPULSE); + gi.WritePosition(spot); + gi.multicast(spot, MULTICAST_PHS); +} + +void FX_MakeAutoGunMuzzleFlash(edict_t *self) +{ +#if 0 + vec3_t pos; + VectorCopy(self->s.origin, pos); + + // write uuid of left muzzle and right muzzle + gi.WriteShort(myInst->MyUUID()); + gi.WriteShort(myInst->MyUUID()); + int angle; + //do adjustments here + + angle = NormalizeAngle(self->s.angles[1]+self->s.angle_diff); + pos[0] += 30 * cos(angle*DEGTORAD); + pos[1] += 30 * sin(angle*DEGTORAD); + pos[2] += 3; + + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_AUTOGUNMUZZLEFLASH); + gi.WritePosition(pos); + gi.WriteByte((byte)(angle/2)); + + gi.multicast(pos, MULTICAST_PHS); +#endif +} + +void FX_StrikeWall(vec3_t spot, byte wallType) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_WALLSTRIKE); + gi.WritePosition(spot); + gi.WriteByte(wallType); + gi.multicast(spot, MULTICAST_PHS); +} + +void FX_BubbleTrail(vec3_t start, vec3_t end) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_UNDERWATER_BULLET); + gi.WritePosition(start); + gi.WritePosition(end); + gi.multicast(start, MULTICAST_PHS); +} + +void FX_SmokeBurst(vec3_t pos, float size) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_SMOKE_BURST); + gi.WritePosition(pos); + gi.WriteByte(size); + gi.multicast(pos, MULTICAST_PHS); +} + +void FX_MakeLine(vec3_t start, vec3_t end, paletteRGBA_t color, int lifetime, int mcastType) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_TEST_LINE); + gi.WritePosition(start); + gi.WritePosition(end); + gi.WriteLong(color.c); + gi.WriteLong(lifetime); + gi.multicast(start, (multicast_t)mcastType); +} + +void FX_WallSparks(vec3_t pos, vec3_t dir, float size) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_WALLSPARKS); + gi.WritePosition(pos); + gi.WriteDir(dir); + gi.WriteByte(size); + gi.multicast(pos, MULTICAST_PHS); +} + +void FX_Bleed(edict_t *ent, GhoulID boltID, int amount) +{ + if (boltID==0) + return; // We don't want blood on a random bolt, that looks extraordinarily stupid. + + if(lock_blood) + { + fxRunner.exec("gore/noblood", ent, boltID); + } + else + { + fxRunner.exec("gore/stumpblood", ent, boltID); + } +} + +void FX_BloodCloud(edict_t *ent, GhoulID boltID, int amount) +{ + if (boltID==0) + return; // We don't want blood on a random bolt, that looks extraordinarily stupid. + + if (amount > 50) + { + if(lock_blood) + { + fxRunner.exec("gore/noblood", ent, boltID); + } + else + { + fxRunner.exec("gore/bloodcloud", ent, boltID); + } + } + else + { + if(lock_blood) + { + fxRunner.exec("gore/noblood_s", ent, boltID); + } + else + { + fxRunner.exec("gore/bloodcloud_s", ent, boltID); + } + } +} + +void FX_HeadExplosion(edict_t *ent, GhoulID boltID) +{ + if(lock_blood) + { + return; + } + + fxRunner.exec("gore/headcloud", ent, boltID); +} + +void FX_BloodJet(edict_t *ent, vec3_t spot, vec3_t jetDir) +{ + if(lock_blood) + { + return; + } + + fxRunner.setDir(jetDir); + fxRunner.exec("environ/gb_exitw", spot); +} + +void FX_HeliGun(edict_t *ent, IGhoulInst *heli, IGhoulInst *muzzle, GhoulID heliToMuzzleBolt, GhoulID muzEnd) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_HELIGUN); + gi.WriteShort(heli->MyUUID()); + gi.WriteShort(muzzle->MyUUID()); + gi.WriteShort(heliToMuzzleBolt); + gi.WriteShort(muzEnd); + gi.WriteShort(ent - g_edicts); + gi.multicast(ent->s.origin, MULTICAST_PHS); +} + +void FX_WhiteBurn(edict_t *ent) +{ + IGhoulInst *myInst = ent->ghoulInst; + + if(!myInst)return;//hmm... + + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_WHITEBURN); + gi.WriteShort(myInst->MyUUID()); + gi.WriteShort(ent - g_edicts); + gi.multicast(ent->s.origin, MULTICAST_PHS); +} + +void FX_WhiteBlast(vec3_t org) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_WHITEBLAST); + gi.WritePosition(org); + gi.multicast(org, MULTICAST_PHS); +} + +void FX_MinimiTrail(edict_t *ent) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_MINIMISMOKE); + gi.WriteShort(ent - g_edicts); + gi.multicast(ent->s.origin, MULTICAST_PHS); +} + +void FX_Explosion(vec3_t pos, byte size) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_EXPLOSION); + gi.WritePosition(pos); + gi.WriteByte(size); + gi.multicast(pos, MULTICAST_PHS); +} + +void FX_VehicleExplosion(vec3_t pos, byte size) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_VEHICLEEXPLOSION); + gi.WritePosition(pos); + gi.WriteByte(size); + gi.multicast(pos, MULTICAST_PHS); +} + +void FX_SmokePuff(vec3_t pos,byte red,byte green,byte blue,byte alpha) +{ + gi.WriteByte (svc_temp_entity); + gi.WriteByte (TE_SMOKE_PUFF); + gi.WritePosition (pos); + gi.WriteByte (red); + gi.WriteByte (green); + gi.WriteByte (blue); + gi.WriteByte (alpha); + + gi.multicast (pos, MULTICAST_PHS); +} + +void FX_LittleExplosion(vec3_t pos, byte size, byte bSound) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_LITTLEEXPLOSION); + gi.WritePosition(pos); + gi.WriteByte(size); + gi.WriteByte(bSound); + gi.multicast(pos, MULTICAST_PHS); +} + +void FX_MediumExplosion(vec3_t pos, byte size, byte bSound) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_MEDIUMEXPLOSION); + gi.WritePosition(pos); + gi.WriteByte(size); + gi.WriteByte(bSound); + gi.multicast(pos, MULTICAST_PHS); +} + +void FX_LargeExplosion(vec3_t pos, byte size, byte bSound) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_LARGEEXPLOSION); + gi.WritePosition(pos); + gi.WriteByte(size); + gi.WriteByte(bSound); + gi.multicast(pos, MULTICAST_PHS); +} + +void FX_MakeRing(vec3_t pos, short size) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_MAKERING); + gi.WritePosition(pos); + gi.WriteShort(size); + gi.multicast(pos, MULTICAST_PVS); +} + +void FX_PaperCloud(vec3_t vPos, byte nCount/*0 generates random num of papers*/) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_PAPERCLOUD); + gi.WritePosition(vPos); + gi.WriteShort(nCount); + gi.multicast(vPos, MULTICAST_PHS); +} + +void FX_SodaCans(vec3_t vPos, vec3_t vDir, byte nSpeed, byte nCount/*0 generates random num of cans*/) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_SODACANS); + gi.WritePosition(vPos); + gi.WritePosition(vDir); + gi.WriteShort(nSpeed); + gi.WriteShort(nCount); + gi.multicast(vPos, MULTICAST_PHS); +} + +void FX_FloorSpace(edict_t *ent) +{ + vec3_t spot; + + VectorCopy(ent->s.origin, spot); + spot[2] -= 256; + + trace_t tr; + + gi.trace(ent->s.origin, vec3_origin, vec3_origin, spot, ent, MASK_SOLID, &tr); + + VectorCopy(tr.endpos, spot); + spot[2] += 1.0; + + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_FLOORSPACE); + gi.WritePosition(spot); + gi.multicast(spot, MULTICAST_PVS); +} + +void FX_DropDustBits(vec3_t spot, int amount) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_DUSTBITS); + gi.WritePosition(spot); + gi.WriteShort(amount); + gi.multicast(spot, MULTICAST_PVS); +} + +void FX_PhoneHit(vec3_t vPos) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_PHONEHIT); + gi.WritePosition(vPos); // send position + gi.multicast(vPos, MULTICAST_PHS); +} + +void FX_TrashcanHit(vec3_t vPos) +{ + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_TRASHCANHIT); + gi.WritePosition(vPos); // send position + gi.multicast(vPos, MULTICAST_PHS); +} + +// Do not hit a surface +void FX_HandleDMShotEffects(vec3_t start, vec3_t dir, vec3_t end, edict_t *shooter, int tracerfx, IGhoulInst *gun, int muzzlefx) +{ + if(!shooter->client) + { + return; + } + + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_DMSHOT); + + gi.WriteByte(muzzlefx); + gi.WriteByte(tracerfx); + + gi.WriteByte(shooter - g_edicts); + gi.WritePosition(start); + gi.WritePosition(end); + + gi.multicast(start, MULTICAST_PHS); +} + +// Hit a surface with a normal effect. +void FX_HandleDMShotHitEffects(vec3_t start, vec3_t dir, vec3_t end, edict_t *shooter, int tracerfx, IGhoulInst *gun, int muzzlefx) +{ + if(!shooter->client) + { + return; + } + vec3_t bigDir; + + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_DMSHOTHIT); + + gi.WriteByte(muzzlefx); + gi.WriteByte(tracerfx); + + gi.WriteByte(shooter - g_edicts); + gi.WritePosition(start); + + VectorScale(dir, 2048, bigDir); + gi.WritePosition(bigDir);//maybe send as 2byte? + + gi.multicast(start, MULTICAST_PHS); +} + +void FX_HandleDMShotBigHitEffects(vec3_t start, vec3_t dir, vec3_t end, edict_t *shooter, int tracerfx, IGhoulInst *gun, int muzzlefx) +{ + if(!shooter->client) + { + return; + } + vec3_t bigDir; + + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_DMSHOTBIGHIT); + + gi.WriteByte(muzzlefx); + gi.WriteByte(tracerfx); + + gi.WriteByte(shooter - g_edicts); + gi.WritePosition(start); + + VectorScale(dir, 2048, bigDir); + gi.WritePosition(bigDir);//maybe send as 2byte? + + gi.multicast(start, MULTICAST_PHS); +} + +void FX_HandleDMMuzzleFlash(vec3_t start, vec3_t dir, edict_t *shooter, IGhoulInst *gun, int muzzlefx) +{ + if(!shooter->client) + { + return; + } + vec3_t bigDir; + + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_DMMUZZLEFLASH); + + gi.WriteByte(muzzlefx); + + gi.WriteByte(shooter - g_edicts); + gi.WritePosition(start); + + VectorScale(dir, 2048, bigDir); + gi.WritePosition(bigDir);//maybe send as 2byte? + + gi.multicast(start, MULTICAST_PHS); +} + + + +//----------------------------------------------------------------------------------------- + +// angvel is stored 1 bit for sign, 6 bits for whole part, and 9 bits for decimal + +int AngvelInRotateRange(vec3_t angVel) +{ + for(int i = 0; i < 3; i++) + { + if(fabs(angVel[i]) > 31) + { + return 0; + } + } + + return 1; +} + +void FXA_SetRotate(edict_t *targ, vec3_t angVel, IGhoulInst *bolton, IGhoulInst *bolt2, IGhoulInst *bolt3, IGhoulInst *bolt4) +{ + // if this assertion fails, you have given an angular velocity that is too big - 31 is the max value positive or negative... + // if this comes up (and I hope it doesn't) we can change it - but this keeps it cheaper + assert(AngvelInRotateRange(angVel)); + + // kef -- terribly important that the effectData is all cleared out aside from the bolt data we wish to save + memset(targ->s.effectData, 0, sizeof(aEffectInfo_t) * NUM_EFFECTS); + + targ->s.effects |= EF_ROTATE; + eft_rotate_t *rot = (eft_rotate_t *)targ->s.effectData; + + rot->buffer = 999;//? + rot->xRot = angVel[0] * 512; + rot->yRot = angVel[1] * 512; + rot->zRot = angVel[2] * 512; + if (bolton) + { + rot->boltonID = bolton->MyUUID(); + } + else + { + rot->boltonID = 0; + } + if (bolt2) + { + rot->boltonID2 = bolt2->MyUUID(); + } + else + { + rot->boltonID2 = 0; + } + if (bolt3) + { + rot->boltonID3 = bolt3->MyUUID(); + } + else + { + rot->boltonID3 = 0; + } + if (bolt4) + { + rot->boltonID4 = bolt4->MyUUID(); + } + else + { + rot->boltonID4 = 0; + } +} + + +eft_rotate_t *FXA_GetRotate(edict_t *targ) +{ + if(!(targ->s.effects & EF_ROTATE)) + { + return 0; + } + + return (eft_rotate_t *)targ->s.effectData; +} + +void FXA_RemoveRotate(edict_t *targ) +{ + targ->s.effects &= ~EF_ROTATE; + + memset(targ->s.effectData, 0, sizeof(aEffectInfo_t) * NUM_EFFECTS); +} + + +// Sets the entity flags so that the item fades out over a certain amount of time. +void FXA_SetFadeOut(edict_t *targ, float duration) +{ + eft_fade_t *fade = (eft_fade_t *)(targ->s.effectData); + + // First, check if we are already fading in or out. + + // Nah, let it look bad if there already is a fade. It is more solid that way. +#if 0 + if (targ->s.effects & EF_FADE) + { + // Is it fading out already? (dur>0) + if (fade->duration > 0) + { // Is last fade long since past? + if (((float)(fade->startTime + fade->duration)/1000.0) > level.time) + { // Still fading last fade, don't do anything + return; + } + } + + // Overwrite effect if fading in. (dur < 0) + } +#endif + + // Get rid of all continual effects. Why? Well, we will be invalidating the data. + fxRunner.clearContinualEffects(targ); + targ->s.effects &= ~EF_INVIS_PULSE; + targ->s.effects |= EF_FADE; + + fade->startTime = (int)(level.time * 1000.0); // Convert current time to ms. + fade->duration = (int)(duration * 1000.0); // Convert duration to ms. +} + + + +void FXA_SetFadeIn(edict_t *targ, float duration) +{ + eft_fade_s *fade; + + fade = (eft_fade_t *)(targ->s.effectData); + + // First, check if we are already fading in or out. + + // Nah, let it look bad if there already is a fade. It is more solid that way. +#if 0 + if (targ->s.effects & EF_FADE) + { + // Is it fading in already? (dur<0) + if (fade->duration < 0) + { // Is last fade long since past? + if (((float)(fade->startTime - fade->duration)/1000.0) > level.time) + { // Still fading last fade, don't do anything + return; + } + } + + // Overwrite effect if fading out. (dur > 0) + } +#endif + + // Get rid of all continual effects. Why? Well, we will be invalidating the data. + fxRunner.clearContinualEffects(targ); + targ->s.effects &= ~EF_INVIS_PULSE; + targ->s.effects |= EF_FADE; + + fade->startTime = (int)(level.time * 1000.0); // Convert current time to ms. + fade->duration = -(int)(duration * 1000.0); // Convert duration to ms. Negative indicates fade in. +} + + + +// Returns true if the object should be removed. +// Removes the effects flag if completely fading in. +int FXA_CheckFade(edict_t *targ) +{ + if (!(targ->s.effects & EF_FADE)) + return false; // Keep object, no fade. + + eft_fade_s *fade = (eft_fade_t *)(targ->s.effectData); + + // Is it fading out? + if (fade->duration > 0) + { + if ((float)(fade->startTime + fade->duration)/1000.0 <= level.time) + { // Done fading. + // Turn off fade variables + targ->s.effects &= ~EF_FADE; + fade->duration = 0; + fade->startTime = 0; + + // Tint to fully transparent until removed + if (targ->ghoulInst) + { + targ->ghoulInst->SetTintOnAll(1.0,1.0,1.0,0.0); + } + + return true; // Kill object + } + } + else + { // It must be fading in... + if ((float)(fade->startTime + fade->duration)/1000.0 <= level.time) + { // Done fading. + // Turn off fade variables + targ->s.effects &= ~EF_FADE; + fade->duration = 0; + fade->startTime = 0; + + // Tint to fully opaque + if (targ->ghoulInst) + { + targ->ghoulInst->SetTintOnAll(1.0,1.0,1.0,1.0); + } + + // Make sure the client entity is opaque. + FX_SetEvent(targ, EV_TINTCLEAR); + } + } + + return false; +} + + + + + + + + +#define SCALESHIFT 0x10 + +CFXSender fxRunner; + +int CFXSender::findEffectID(int effectID, edict_t *ent, GhoulID bolt) +{ + int test = effectID; + + for(int i = 0; i < NUM_EFFECTS; i++) + { + if(ent->s.effectData[i].effectId == test) + { + if(bolt) + { + if(bolt == ent->s.effectData[i].bolt) + { + return i; + } + } + else + { + return i; + } + } + } + return -1; +} + +void CFXSender::clear(void) +{ + flags = 0; +} + +void CFXSender::sendData(vec3_t source, multicast_t castType, edict_t *ignoreClient) +{ + if(flags) + { + gi.WriteByte(flags); + + if(flags & EFF_SCALE) + { + gi.WriteShort(scale); + } + if(flags & EFF_NUMELEMS) + { + gi.WriteByte(numElements); + } + if(flags & EFF_POS2) + { + gi.WritePosition(pos2); + } + if(flags & EFF_DIR) + { //dir is not enough + vec3_t bigDir; + VectorScale(dir, 2048, bigDir); + gi.WritePosition(bigDir); + } + if(flags & EFF_MIN) + { + gi.WritePosition(min); + } + if(flags & EFF_MAX) + { + gi.WritePosition(max); + } + if(flags & EFF_LIFETIME) + { + gi.WriteShort(lifeTime); + } + if(flags & EFF_RADIUS) + { + gi.WriteByte(radius); + } + + clear(); + } + + sendFlags = 0; + + if(ignoreClient) + { + assert(ignoreClient - g_edicts > 0); + assert(ignoreClient - g_edicts < MAX_EDICTS);//um, yeah! + gi.multicastignore(source, castType, ignoreClient-g_edicts); + } + else + { + gi.multicast(source, castType); + } +} + +void CFXSender::exec(int effectID, vec3_t pos, multicast_t castType, edict_t *ignoreClient) +{ + if(!effectID) + { + return; + } + + int id = effectID; + + gi.WriteByte(svc_effect); + gi.WriteByte(id); + + sendFlags |= EFAT_POS; + if(flags)sendFlags |= EFAT_HASFLAGS; + + gi.WriteByte(sendFlags); + gi.WritePosition(pos); + + sendData(pos, castType, ignoreClient); +} + +void CFXSender::exec(int effectID, edict_t *ent, multicast_t castType, edict_t *ignoreClient) +{ + if(!effectID) + { + return; + } + + int id = effectID; + + gi.WriteByte(svc_effect); + gi.WriteByte(id); + + sendFlags |= EFAT_ENT; + if(flags)sendFlags |= EFAT_HASFLAGS; + + gi.WriteByte(sendFlags); + gi.WriteShort(ent - g_edicts); + + sendData(ent->s.origin, castType, ignoreClient); +} + +void CFXSender::exec(int effectID, edict_t *ent, GhoulID bolt, multicast_t castType, int usesAltAxis, edict_t *ignoreClient) +{ + if(!effectID) + { + return; + } + + int id = effectID; + + gi.WriteByte(svc_effect); + gi.WriteByte(id); + + sendFlags |= EFAT_BOLT; + if(flags)sendFlags |= EFAT_HASFLAGS; + + if(usesAltAxis) + { // seems quite a few folks use this, sadly + sendFlags |= EFAT_ALTAXIS; + } + + gi.WriteByte(sendFlags); + gi.WriteShort(ent - g_edicts); + gi.WriteShort(bolt); + + // if this assert gets hit, please contact me (Nathan) + assert(ent->ghoulInst && ent->ghoulInst->GetGhoulObject() && bolt <= ent->ghoulInst->GetGhoulObject()->NumParts()); + + sendData(ent->s.origin, castType, ignoreClient); +} + +void CFXSender::execWithInst(int effectID, edict_t *ent, IGhoulInst *inst, GhoulID bolt, multicast_t castType, int usesAltAxis, edict_t *ignoreClient) +{ + if(!effectID) + { + return; + } + + int id = effectID; + + gi.WriteByte(svc_effect); + gi.WriteByte(id); + + sendFlags |= EFAT_BOLT|EFAT_BOLTANDINST; + if(flags)sendFlags |= EFAT_HASFLAGS; + + if(usesAltAxis) + { // seems quite a few folks use this, sadly + sendFlags |= EFAT_ALTAXIS; + } + + gi.WriteByte(sendFlags); + gi.WriteShort(ent - g_edicts); + gi.WriteShort(inst->MyUUID()); + gi.WriteShort(bolt); + + // if this assert gets hit, please contact me (Nathan) + assert(inst && inst->GetGhoulObject() && bolt <= inst->GetGhoulObject()->NumParts()); + + sendData(ent->s.origin, castType, ignoreClient); +} + +void CFXSender::execFromRandomBolt(int effectID, edict_t *ent, multicast_t castType, int usesAltAxis, edict_t *ignoreClient) +{ + exec(effectID, ent, 0, castType, usesAltAxis, ignoreClient); +} + +void CFXSender::execContinualEffect(int effectID, edict_t *ent, GhoulID bolt, float size) +{ + assert(!(ent->s.effects & EF_ROTATE)); + // if this assert gets hit, please contact me (Nathan) + assert((!bolt) || (ent->ghoulInst && ent->ghoulInst->GetGhoulObject() && bolt <= ent->ghoulInst->GetGhoulObject()->NumParts())); + for(int i = 0; i < NUM_EFFECTS; i++) + { + if(ent->s.effectData[i].effectId == 0) + { + ent->s.effectData[i].effectId = effectID; + ent->s.effectData[i].bolt = bolt; + ent->s.effectData[i].size = (float)size * SCALESHIFT;//hmmm... about .05 precision + return; + } + } +} + +void CFXSender::execContinualEffectFromRandomBolt(int effectID, edict_t *ent, float size) +{ + execContinualEffect(effectID, ent, 0, size); +} + +void CFXSender::stopContinualEffect(int effectID, edict_t *ent, GhoulID bolt) +{ + int effectNum = findEffectID(effectID, ent, bolt); + + if(effectNum != -1) + { + ent->s.effectData[effectNum].effectId = 0; + } +} + +void CFXSender::editContinualEffect(int effectID, edict_t *ent, GhoulID bolt, float newSize) +{ + int effectNum = findEffectID(effectID, ent, bolt); + + if(effectNum != -1) + { + ent->s.effectData[effectNum].size = (float)newSize * SCALESHIFT; + } +} + +void CFXSender::clearContinualEffects(edict_t *ent) +{ + memset(ent->s.effectData, 0, sizeof(ent->s.effectData)); + + // Clear EF_FLAGs that have data associated with them as well. + ent->s.effects &= ~(EF_ROTATE | EF_FADE); + + // Also, make sure that the entity is fully opaque. + if (ent->ghoulInst) + ent->ghoulInst->SetTint(1.0,1.0,1.0,1.0); + + // Make sure the client entity is opaque. + FX_SetEvent(ent, EV_TINTCLEAR); +} + +float CFXSender::getEffectSizeVal(int effectID, edict_t *ent, GhoulID bolt) +{ + int effectNum = findEffectID(effectID, ent, bolt); + + if(effectNum != -1) + { + return ent->s.effectData[effectNum].size / SCALESHIFT; + } + return 0; +} + +int CFXSender::hasEffect(int effectID, edict_t *ent, GhoulID bolt) +{ + int effectNum = findEffectID(effectID, ent, bolt); + + if(effectNum != -1) + { + return 1; + } + else + { + return 0; + } +} \ No newline at end of file diff --git a/Source/Game/gamecpp/g_bosnia.cpp b/Source/Game/gamecpp/g_bosnia.cpp new file mode 100644 index 0000000..138b219 --- /dev/null +++ b/Source/Game/gamecpp/g_bosnia.cpp @@ -0,0 +1,1170 @@ +/****************************************************** + * Objects for Bosnia level * + ******************************************************/ + +#include "g_local.h" +#include "g_obj.h" + +#define SEARCHLIGHT_CIRCLE 4 +#define SEARCHLIGHT_RANDOM 8 + +#define TRUCK_TRIGGERED 4 +#define TRUCK_WHEELS_ONLY 16 + +#define TRUCK_BRAKE_FACTOR 3 + +#define HLTH_BOSNIA_ANTI_JACK 500 +#define HLTH_BOSNIA_FLAG_WALL 100 +#define HLTH_BOSNIA_LANDMINE 1 +#define HLTH_BOSNIA_RUBBLE1 1000 +#define HLTH_BOSNIA_RUBBLE2 1000 +#define HLTH_BOSNIA_SRCHBEAM 1000 +#define HLTH_BOSNIA_SRCHLIGHT 1000 +#define HLTH_BOSNIA_TANK_JACK 500 +#define HLTH_BOSNIA_TRUCK_CHUNKS 500 +#define HLTH_BOSNIA_TRUCK_OLD 1000 + +void breakable_brush_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + +// misc_bosnia.. +void SP_misc_bosnia_antipersonnel_jack (edict_t *ent); +void SP_misc_bosnia_flag_wall (edict_t *ent); +void SP_misc_bosnia_landmine (edict_t *ent); +void SP_misc_bosnia_searchbeam (edict_t *ent); +void SP_misc_bosnia_searchlight (edict_t *ent); +void SP_misc_bosnia_rubble1 (edict_t *ent); +void SP_misc_bosnia_rubble2 (edict_t *ent); +void SP_misc_bosnia_tank_jack (edict_t *ent); +void SP_misc_bosnia_truck_chunks (edict_t *ent); +void SP_misc_bosnia_truck_old (edict_t *ent); + +spawn_t bosniaSpawns[] = +{ + // misc_bosnia... + {"misc_bosnia_antipersonnel_jack", SP_misc_bosnia_antipersonnel_jack}, + {"misc_bosnia_flag_wall", SP_misc_bosnia_flag_wall}, + {"misc_bosnia_landmine", SP_misc_bosnia_landmine}, + {"misc_bosnia_searchbeam", SP_misc_bosnia_searchbeam}, + {"misc_bosnia_searchlight", SP_misc_bosnia_searchlight}, + {"misc_bosnia_rubble1", SP_misc_bosnia_rubble1}, + {"misc_bosnia_rubble2", SP_misc_bosnia_rubble2}, + {"misc_bosnia_tank_jack", SP_misc_bosnia_tank_jack}, + {"misc_bosnia_truck_chunks", SP_misc_bosnia_truck_chunks}, + {"misc_bosnia_truck_old", SP_misc_bosnia_truck_old}, + + {NULL, NULL}, +}; + +typedef enum +{ + OBJ_ANTIPERSONNEL_JACK = 0, + OBJ_FLAG_WALL, + OBJ_LANDMINE, + OBJ_RUBBLE1, + OBJ_RUBBLE2, + OBJ_SEARCHBEAMBASE, + OBJ_SEARCHBEAM, + OBJ_SEARCHLIGHT, + OBJ_SEARCHLIGHT2, + OBJ_SEARCHLIGHT3, + OBJ_TANK_JACK, + OBJ_TRUCK_CHUNKS, + OBJ_TRUCK_OLD, + OBJ_TRUCK_OLD_WHEEL, + MAX_OBJS +}; + +modelSpawnData_t bosniaModelData[MD_BOSNIA_SIZE] = +{ +// dir file surfaceType material health solid material file cnt scale +"objects/bosnia/antipersonnel_jack","jack", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_BOSNIA_ANTI_JACK, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_ANITPERSONEL_JACK +"objects/bosnia/flag_wall", "flag_wall", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_BOSNIA_ANTI_JACK, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_FLAG_WALL +"objects/bosnia/landmine", "landmine", SURF_METAL, MAT_ROCK_BROWN, HLTH_BOSNIA_LANDMINE, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_LANDMINE +"objects/bosnia/rubble1", "rubble1", SURF_STONE_LGREY, MAT_ROCK_LGREY, HLTH_BOSNIA_RUBBLE1, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_RUBBLE1 +"objects/bosnia/rubble2", "rubble2", SURF_DEFAULT, MAT_ROCK_DGREY, HLTH_BOSNIA_RUBBLE2, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_RUBBLE2 +"objects/bosnia/searchbeam", "null", SURF_DEFAULT, MAT_DEFAULT, HLTH_BOSNIA_SRCHBEAM, SOLID_NOT, NULL, 0, 0.0, NULL, // OBJ_SRCHBEAMBASE +"objects/bosnia/searchbeam", "beam", SURF_DEFAULT, MAT_DEFAULT, HLTH_BOSNIA_SRCHBEAM, SOLID_NOT, NULL, 0, 0.0, NULL, // OBJ_SRCHBEAM +"objects/bosnia/searchlight", "base", SURF_METAL, MAT_METAL_DGREY, HLTH_BOSNIA_SRCHLIGHT, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_SEARCHLIGHT +"objects/bosnia/searchlight", "arm", SURF_METAL, MAT_METAL_DGREY, HLTH_BOSNIA_SRCHLIGHT, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_SEARCHLIGHT2 +"objects/bosnia/searchlight", "lamp", SURF_METAL, MAT_METAL_DGREY, HLTH_BOSNIA_SRCHLIGHT, SOLID_BBOX, "glass", 0, 0.0, NULL, // OBJ_SEARCHLIGHT3 +"objects/bosnia/tank_jack", "jack", SURF_METAL, MAT_METAL_DGREY, HLTH_BOSNIA_TANK_JACK, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_TANK_JACK +"objects/bosnia/truck_chunks", "chunks", SURF_METAL, MAT_METAL_DGREY, HLTH_BOSNIA_TRUCK_CHUNKS, SOLID_BBOX, "chunks", 0, 0.0, NULL, // OBJ_TRUCK_CHUNKS +"objects/bosnia/truck_old", "truck", SURF_METAL, MAT_METAL_DGREY, HLTH_BOSNIA_TRUCK_OLD, SOLID_BBOX, "truck", 0, 0.0, NULL, // OBJ_TRUCK_OLD +"objects/bosnia/truck_old", "tire", SURF_METAL, MAT_METAL_DGREY, HLTH_BOSNIA_TRUCK_OLD, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_TRUCK_OLD_WHEEL +}; + + + +void apjack_touch (edict_t *ent, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + float otherbottom, jacktop; + +// origin lies 13 units above it's bottom and 13 below it's top + otherbottom = other->s.origin[2] + other->mins[2]; + jacktop = ent->s.origin[2] + ent->maxs[2]; + if ((otherbottom - jacktop) > -2) //FIXME? right now this is pretty arbitrary + { + vec3_t backoff, hurtpoint; + + VectorCopy(other->s.origin, hurtpoint); + hurtpoint[2] += other->mins[2]; + VectorSubtract(other->s.origin, ent->s.origin, backoff); + T_Damage(other, ent, ent, backoff, hurtpoint, ent->s.origin, 1, 3, DT_EXPLODE, MOD_EXPLOSIVE); + } + +} + +/*QUAKED misc_bosnia_antipersonnel_jack (1 .5 0) (-15 -17 -10) (15 13 16) INVULNERABLE NOPUSH x x x x FLUFF +Tri-pod shaped anti-personnel pointy things. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- hurts player when touching it +*/ +void SP_misc_bosnia_antipersonnel_jack (edict_t *ent) +{ + ent->touch = apjack_touch; + + VectorSet (ent->mins, -15, -17, -10); + VectorSet (ent->maxs, 15, 13, 16); + + SimpleModelInit2(ent,&bosniaModelData[OBJ_ANTIPERSONNEL_JACK],NULL,NULL); +} + + +/*QUAKED misc_bosnia_flag_wall (1 .5 0) (-45 -18 -25) (-39 42 77) INVULNERABLE NOPUSH x x x x FLUFF +An animated banner hanging from a wall mounted arm. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_bosnia_flag_wall (edict_t *ent) +{ + VectorSet (ent->mins, -45, -18, -25); + VectorSet (ent->maxs, -39, 42, 77); + + SimpleModelInit2(ent,&bosniaModelData[OBJ_FLAG_WALL],NULL,NULL); +} + + +void landmine_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + Obj_explode(self,&self->s.origin,1,1); + FX_MakeDecalBelow(self->s.origin, FXDECAL_SCORCHMARK, 0); // pipe + BecomeDebris (self,inflictor,attacker,damage,point); +} + + +void landmine_touch(edict_t *ent, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + landmine_die(ent,other,other,999,ent->s.angles); +} + +void landmine_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + landmine_die(ent,other,other,999,wherehit); +} + +/*QUAKED misc_bosnia_landmine (1 .5 0) (-13 -13 -2) (13 13 2) INVULNERABLE NOPUSH x x x x FLUFF +A landmine surrounded by dirt +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- blows up when touched +*/ +void SP_misc_bosnia_landmine (edict_t *ent) +{ + VectorSet (ent->mins, -13, -13, -2); + VectorSet (ent->maxs, 13, 13, 2); + + SimpleModelInit2(ent,&bosniaModelData[OBJ_LANDMINE],NULL,NULL); + + ent->touch = landmine_touch; + ent->die = landmine_die; + + gi.effectindex("environ/onfireburst"); +} + +/*QUAKED misc_bosnia_rubble1 (1 .5 0) (-13 -10 -5) (13 10 5) INVULNERABLE NOPUSH x x x x FLUFF +Some broken bricks +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_bosnia_rubble1 (edict_t *ent) +{ + VectorSet (ent->mins, -13, -10, -5); + VectorSet (ent->maxs, 13, 10, 5); + + SimpleModelInit2(ent,&bosniaModelData[OBJ_RUBBLE1],NULL,NULL); +} + + +/*QUAKED misc_bosnia_rubble2 (1 .5 0) (-31 -30 -9) (45 22 36) INVULNERABLE NOPUSH x x x x FLUFF +Big twisted pipes +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_bosnia_rubble2 (edict_t *ent) +{ + VectorSet (ent->mins, -31, -30, -9); + VectorSet (ent->maxs, 45, 22, 36); + + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&bosniaModelData[OBJ_RUBBLE2],NULL,NULL); + +} + +void searchlight_pain2 (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t holdorigin; + + VectorCopy(ent->s.origin,holdorigin); + holdorigin[2] += 80; + FX_LittleExplosion(holdorigin, 100, 0); + +} + +void searchlight_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t holdorigin; + + IGhoulObj* lightObj = NULL; + IGhoulInst* lampInst = NULL; + + // need the ghoulInst of the lamp + if ( !(lampInst = SimpleModelGetBolt(ent, 2)) ) + { + return; + } + + // only break when our health is below 85% of maximum + if (ent->health > (int)(ent->max_health*.85)) + { + return; + } + + lightObj = lampInst->GetGhoulObject(); + if (NULL == lightObj) + { + return; + } + + GhoulID matID = lightObj->FindMaterial("glass"); + GhoulID skinID = 0; + + skinID = lightObj->FindSkin(matID, "bkglass"); + + if (!matID && !skinID) + return; + + lampInst->SetFrameOverride(matID, skinID); + SimpleModelRemoveObject2(lampInst,"_BEAM"); + SimpleModelRemoveObject2(lampInst,"WORLD_OMNI"); + + VectorCopy(ent->s.origin,holdorigin); + holdorigin[2] += 80; + FX_LittleExplosion(holdorigin, 100, 0); + + ent->pain = searchlight_pain2; + +// IGhoulInst* boltInst = NULL; +// GhoulID boltID = 0; + +// boltInst = SimpleModelGetBolt(ent, 1); +// boltID = boltInst->GetGhoulObject()->FindPart("DUMMY01"); +// fxRunner.execContinualEffect("environ/tv_smoke", ent,ent->ghoulInst,boltID); + + fxRunner.execContinualEffect("environ/tv_smoke", ent); +} + + + + +void searchbeam_think(edict_t* ent) +{ + IGhoulInst* boltInst = NULL; + GhoulID boltID = 0; + boltonOrientation_c boltonInfo; + Matrix4 matRot, matOld, matNew; + IGhoulInst* lampInst = NULL; + + if ( !(lampInst = SimpleModelGetBolt(ent, 2)) ) + { + return; + } + + // ent->pos1 is the current orientation of the lamp + //ent->pos2 is our next desired orientation + if ((boltInst = SimpleModelGetBolt(ent, 1)) && + boltInst->GetGhoulObject()) + { + boltID = boltInst->GetGhoulObject()->FindPart("DUMMY01"); + + // this would have the searchlight moving randomly within its range of motion + if (1.0f == ent->bouyancy) + { + // get new dest + VectorSet(ent->pos2, gi.flrand(-100, 100), gi.flrand(-100, 100), gi.flrand(200, 300)); + VectorAdd(ent->pos2, ent->s.origin, ent->pos2); + ent->bouyancy = 0; + } + + // turn the arm to face the target (only pivots horizontally) + boltonInfo.root = ent; + boltonInfo.boltonInst = boltInst; + boltonInfo.boltonID = boltID; + boltonInfo.parentInst = ent->ghoulInst; + VectorCopy(ent->pos2, boltonInfo.vTarget); + boltonInfo.fMinPitch = -4000; + boltonInfo.fMaxPitch = 4000; + boltonInfo.fMinYaw = -4000; + boltonInfo.fMaxYaw = 4000; + boltonInfo.fMaxTurnSpeed = 0.03; + boltonInfo.bUsePitch = false; + boltonInfo.bUseYaw = true; + boltonInfo.bToRoot = true; + boltonInfo.OrientBolton(); + + // turn the lamp to face the target (only pivots vertically) + + boltInst = lampInst; + if (boltInst->GetGhoulObject() && boltInst->GetParent() && + boltInst->GetParent()->GetGhoulObject()) + { + boltonInfo.boltonInst = boltInst; + boltonInfo.boltonID = boltInst->GetGhoulObject()->FindPart("DUMMY01"); + boltonInfo.parentInst = boltInst->GetParent(); + boltonInfo.parentID = boltInst->GetParent()->GetGhoulObject()->FindPart("DUMMY02"); + VectorCopy(ent->pos2, boltonInfo.vTarget); + boltonInfo.fMinPitch = -M_PI; + boltonInfo.fMaxPitch = M_PI; + boltonInfo.fMinYaw = -4000; + boltonInfo.fMaxYaw = 4000; + boltonInfo.fMaxTurnSpeed = 0.03; + boltonInfo.bUsePitch = true; + boltonInfo.bUseYaw = false; + boltonInfo.bToRoot = true; + boltonInfo.OrientBolton(); + } + + ent->bouyancy += 0.02f; + if (ent->bouyancy > 1.0f) + { + ent->bouyancy = 1.0f; + } + } + + ent->nextthink = level.time + FRAMETIME; +} + +/*QUAKED misc_bosnia_searchbeam (1 .5 0) (-8 -8 -8) (8 8 8) INVULNERABLE NOPUSH x x x x FLUFF +A searchlight beam to be placed in the distance so it can scan the skies. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_bosnia_searchbeam (edict_t *ent) +{ + ggBinstC *cBolteeBolted=NULL; + + // Bbox is small because the model is so damn big. + VectorSet (ent->mins, -8, -8, -8); + VectorSet (ent->maxs, 8, 8, 8); + + ent->spawnflags |= SF_NOPUSH; + + // Need something to bolt the beam to + SimpleModelInit2(ent,&bosniaModelData[OBJ_SEARCHBEAM],NULL,NULL); + +// cBolteeBolted = SimpleModelAddBolt(ent,bosniaModelData[OBJ_SEARCHBEAMBASE],"DUMMY01", +// bosniaModelData[OBJ_SEARCHBEAM],"DUMMY01",NULL); + + SimpleModelSetSequence2(ent->ghoulInst,"beam",SMSEQ_LOOP); +// cBolteeBolted = SimpleModelAddBolt(ent,bosniaModelData[OBJ_SEARCHBEAMBASE],"DUMMY01", +// bosniaModelData[OBJ_SEARCHBEAMBASE],"DUMMY01",NULL); +/* + if (cBolteeBolted) + { + cBolteeBolted = ComplexModelAddBolt(cBolteeBolted, + bosniaModelData[OBJ_SEARCHBEAMBASE], "DUMMY02", + bosniaModelData[OBJ_SEARCHBEAM], "DUMMY01", NULL); + } +*/ + ent->think = searchbeam_think; + ent->nextthink = level.time + FRAMETIME; + +} + +void searchlight_think(edict_t* ent) +{ + IGhoulInst* boltInst = NULL; + GhoulID boltID = 0; + boltonOrientation_c boltonInfo; + Matrix4 matRot, matOld, matNew; + IGhoulInst* lampInst = NULL; + + // need the ghoulInst of the lamp + if ( !(lampInst = SimpleModelGetBolt(ent, 2)) ) + { + return; + } + + // should probably be a spawnflag for static vs. random motion + if (true) + { + // ent->pos1 is the current orientation of the lamp + //ent->pos2 is our next desired orientation + if ((boltInst = SimpleModelGetBolt(ent, 1)) && + boltInst->GetGhoulObject()) + { + boltID = boltInst->GetGhoulObject()->FindPart("DUMMY01"); + + // this would have the searchlight moving randomly within its range of motion + if (ent->spawnflags & SEARCHLIGHT_RANDOM) + { + if (1.0f == ent->bouyancy) + { + // get new dest + VectorSet(ent->pos2, gi.flrand(-100, 100), gi.flrand(-100, 100), gi.flrand(-100, 0)); + VectorAdd(ent->pos2, ent->s.origin, ent->pos2); + ent->bouyancy = 0; + } + // turn the arm to face the target (only pivots horizontally) + boltonInfo.root = ent; + boltonInfo.boltonInst = boltInst; + boltonInfo.boltonID = boltID; + boltonInfo.parentInst = ent->ghoulInst; + VectorCopy(ent->pos2, boltonInfo.vTarget); + boltonInfo.fMinPitch = -4000; + boltonInfo.fMaxPitch = 4000; + boltonInfo.fMinYaw = -4000; + boltonInfo.fMaxYaw = 4000; + boltonInfo.fMaxTurnSpeed = 0.03; + boltonInfo.bUsePitch = false; + boltonInfo.bUseYaw = true; + boltonInfo.bToRoot = true; + boltonInfo.OrientBolton(); + + // turn the lamp to face the target (only pivots vertically) + boltInst = lampInst; + if (boltInst->GetGhoulObject() && boltInst->GetParent() && + boltInst->GetParent()->GetGhoulObject()) + { + boltonInfo.boltonInst = boltInst; + boltonInfo.boltonID = boltInst->GetGhoulObject()->FindPart("DUMMY02"); + boltonInfo.parentInst = boltInst->GetParent(); + boltonInfo.parentID = boltInst->GetParent()->GetGhoulObject()->FindPart("DUMMY01"); + VectorCopy(ent->pos2, boltonInfo.vTarget); + boltonInfo.fMinPitch = -M_PI; + boltonInfo.fMaxPitch = M_PI; + boltonInfo.fMinYaw = -4000; + boltonInfo.fMaxYaw = 4000; + boltonInfo.fMaxTurnSpeed = 0.03; + boltonInfo.bUsePitch = true; + boltonInfo.bUseYaw = false; + boltonInfo.bToRoot = true; + boltonInfo.OrientBolton(); + } + ent->bouyancy += 0.02f; + if (ent->bouyancy > 1.0f) + { + ent->bouyancy = 1.0f; + } + } + else if (ent->spawnflags & SEARCHLIGHT_CIRCLE) + { + // scott sez, "have it rotate in a circle" + if (boltInst = SimpleModelGetBolt(ent, 1)) + { + boltInst->GetXForm(matOld); + matRot.Rotate(2, 0.03f); + matNew.Concat(matOld, matRot); + boltInst->SetXForm(matNew); + } + } + } + + ent->nextthink = level.time + FRAMETIME; + } + else + { + // targeting something specific + ent->nextthink = level.time + FRAMETIME; + } +} + +/*QUAKED misc_bosnia_searchlight (1 .5 0) (-40 -40 -8) (40 40 100) INVULNERABLE NOPUSH CIRCLE RANDOM x x FLUFF +A searchlight which scans the sky. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't ever be pushed +CIRCLE - moves in circle +RANDOM - move randomly +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_bosnia_searchlight (edict_t *ent) +{ + // base (root object) + ggObjC *cBase = NULL; + // arm + ggObjC *cArm = NULL, + *cLamp = NULL; + GhoulID cBaseSeq=0, + cLampSeq=0, + cArmSeq=0; + // bolt located on the base (aka "bolter") + GhoulID cBolterBolt=0; + // bolt located on the bolted-on item (aka "boltee") + GhoulID cBolteeBolt=0; + ggOinstC *t=NULL; + ggBinstC *cBolteeBolted=NULL; + IGhoulInst *lampInst = NULL; + GhoulID tempMaterial = 0; + Matrix4 matOld; + + VectorSet (ent->mins, -40, -40, -8); + VectorSet (ent->maxs, 40, 40, 100); + SimpleModelInit2(ent,&bosniaModelData[OBJ_SEARCHLIGHT],NULL,NULL); + ent->max_health = ent->health; + ent->touch = NULL; + cBolteeBolted = SimpleModelAddBolt(ent,bosniaModelData[OBJ_SEARCHLIGHT],"DUMMY01", + bosniaModelData[OBJ_SEARCHLIGHT2],"DUMMY01",NULL); + + gi.effectindex("environ/tv_smoke"); + if (cBolteeBolted) + { + if ((ent->spawnflags & SEARCHLIGHT_CIRCLE) || (ent->spawnflags & SEARCHLIGHT_RANDOM)) + { // play a looping sequence + SimpleModelSetSequence2(cBolteeBolted->GetInstPtr(), "arm", SMSEQ_LOOP); + } + cBolteeBolted = ComplexModelAddBolt(cBolteeBolted, + bosniaModelData[OBJ_SEARCHLIGHT2], "DUMMY02", + bosniaModelData[OBJ_SEARCHLIGHT3], "DUMMY02", NULL); + } + + ent->pain = searchlight_pain; + +#if 0 // kef -- 10/12/99 server-side rotation is a net-hassle, evidently. we'll just animate the bolts. + + if ((ent->spawnflags & SEARCHLIGHT_CIRCLE) || (ent->spawnflags & SEARCHLIGHT_RANDOM)) + { + ent->think = searchlight_think; + ent->nextthink = level.time + FRAMETIME; + } + + // NOTE: using edict_t::pos1 to store current target of the beam and pos2 for next target + //use bouyancy to store random orientation info + ent->bouyancy = 1.0f; + VectorClear(ent->pos1); + VectorClear(ent->pos2); + // scott sez, "have it rotate in a circle" + if (lampInst) + { + lampInst->GetXForm(matOld); + matOld.Rotate(1, M_PI*0.25f); + lampInst->SetXForm(matOld); + } +#endif +} + +void tank_jack_touch (edict_t *ent, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + float fVelSquared = other->client->ps.pmove.velocity[0]*other->client->ps.pmove.velocity[0] + + other->client->ps.pmove.velocity[1]*other->client->ps.pmove.velocity[1] + + other->client->ps.pmove.velocity[2]*other->client->ps.pmove.velocity[2]; + if (other && other->client && (fVelSquared > 250000) ) + { + vec3_t backoff, hurtpoint; + + VectorCopy(other->s.origin, hurtpoint); + hurtpoint[2] += other->mins[2]; + VectorSubtract(other->s.origin, ent->s.origin, backoff); + T_Damage(other, ent, ent, backoff, hurtpoint, ent->s.origin, 1, 3, DT_EXPLODE, MOD_EXPLOSIVE); + } +} + +/*QUAKED misc_bosnia_tank_jack (1 .5 0) (-28 -28 -19) (28 28 23) INVULNERABLE NOPUSH x x x x FLUFF +A tank jack +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_bosnia_tank_jack (edict_t *ent) +{ + VectorSet (ent->mins, -28, -28, -21); + VectorSet (ent->maxs, 28, 28, 21); + + SimpleModelInit2(ent,&bosniaModelData[OBJ_TANK_JACK],NULL,NULL); + ent->touch = tank_jack_touch; // sounds like a country/western dance +} + +/*QUAKED misc_bosnia_truck_chunks (1 .5 0) (-15 -18 -27) (15 18 27) INVULNERABLE NOPUSH x x x x FLUFF +WWII-style covered transport truck chunks +------ KEYS ------ +Skin - skin type +0 - green +1 - red +2 - tan +Style - which chunk to display +0 - grill +1 -door +2 - panel +3 - tire +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_bosnia_truck_chunks (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins,-15, -18, -27); + VectorSet (ent->maxs, 15, 18, 27); + + switch (ent->s.skinnum) + { + case 1: + skinname = "chunks_red"; + break; + case 2: + skinname = "chunks_tan"; + break; + default: + skinname = "chunks"; + break; + } + + SimpleModelInit2(ent,&bosniaModelData[OBJ_TRUCK_CHUNKS],skinname,NULL); + + switch (ent->style) + { + case 1: + SimpleModelSetObject(ent,"_DOOR"); + break; + case 2: + SimpleModelSetObject(ent,"_PANEL"); + break; + case 3: + SimpleModelSetObject(ent,"_TIRE"); + break; + default: + SimpleModelSetObject(ent,"_GRILL"); + break; + } +} + +void truck_old_totally_explode (edict_t *self) +{ + edict_t *part; + char *skinname; + int i; + vec3_t debrisNorm; + + fxRunner.exec("weapons/world/airexplode", self->s.origin); + FX_C4Explosion(self); + + BlindingLight(self->s.origin, self->health*10, 0.9, 0.5); + ShakeCameras (self->s.origin, 100, 300, DEFAULT_JITTER_DELTA); + + VectorClear(debrisNorm); + FX_ThrowDebris(self->s.origin,debrisNorm, 8,DEBRIS_LRG, self->material, 0,0,0, 0); + + switch (self->s.skinnum) + { + case 1: + skinname = "chunks_red"; + break; + case 2: + skinname = "chunks_tan"; + break; + default: + skinname = "chunks"; + break; + } + for (i=0;i<4;++i) + { + part = G_Spawn(); + VectorSet (part->mins, -10, -11, -5); + VectorSet (part->maxs, 10, 11, 6); + + SimpleModelInit2(part,&bosniaModelData[OBJ_TRUCK_CHUNKS],skinname,NULL); + + VectorCopy(self->s.origin, part->s.origin); + part->s.origin[2] += 25; + VectorCopy(self->s.angles, part->s.angles); + part->velocity[2] = 400; + part->velocity[1] = gi.irand(-200,200); + part->velocity[0] = gi.irand(-200,200); + + part->avelocity[1] = gi.irand(-50,50); + + switch (i) + { + case 1: + part->s.origin[0] += 20; + part->s.origin[1] += 20; + SimpleModelSetObject(part,"_DOOR"); + break; + case 2: + part->s.origin[0] += 20; + part->s.origin[1] -= 20; + SimpleModelSetObject(part,"_PANEL"); + break; + case 3: + part->s.origin[0] += 5; + part->s.origin[1] -= 5; + SimpleModelSetObject(part,"_GRILL"); + break; + case 4: + part->s.origin[0] += 35; + part->s.origin[1] -= 35; + SimpleModelSetObject(part,"_TIRE"); + break; + default: + part->s.origin[0] += 35; + part->s.origin[1] -= 35; + SimpleModelSetObject(part,"_TIRE"); + + } + } + + + G_FreeEdict(self); // Remove original truck + +} + +void truck_old_think (edict_t *self) +{ + if (self->s.angles[2] > 90) + { + self->avelocity[2] = 0; + self->think = truck_old_totally_explode; + self->nextthink = level.time + 1; + } + else + { + self->think = truck_old_think; + self->nextthink = level.time + .1; + } +} + +void truck_old_explode (edict_t *self, edict_t *other, edict_t *activator) +{ + T_RadiusDamage (self, self, 100, self, 100, 0); + + gmonster.RadiusDeafen(self, 200, 200); + + fxRunner.exec("weapons/world/airexplode", self->s.origin); + FX_C4Explosion(self); + + self->movetype = MOVETYPE_DAN; // Can be pushed around + + self->velocity[2] = 400; + self->avelocity[2] = 110; + + self->think = truck_old_think; + self->nextthink = level.time + .1; +} + + + + + +void bed_stop (edict_t *self) +{ + GrabStuffOnTop (self); + VectorClear(self->velocity); + self->movetype = MOVETYPE_NONE; + self->s.sound = 0; + self->nextthink = -1; +} + +void bed_deccel (edict_t *self) +{ + + float distanceLeft; + float thisDist; + float curSpeed; + vec3_t newVel; + float xDiff, yDiff; + + GrabStuffOnTop (self); + xDiff = self->s.origin[0] - self->volume; + yDiff = self->s.origin[1] - self->attenuation; + distanceLeft = sqrt(xDiff*xDiff + yDiff*yDiff); + + curSpeed = sqrt(self->velocity[0]*self->velocity[0] + self->velocity[1]*self->velocity[1]); + thisDist = curSpeed * .1; + + if (curSpeed < 5) + { + newVel[0] = self->velocity[0] * (distanceLeft/thisDist); + newVel[1] = self->velocity[1] * (distanceLeft/thisDist); + newVel[2] = 0; + VectorCopy(newVel, self->velocity); + self->think = bed_stop; + self->nextthink = level.time + .1; + return; + } + + newVel[0] = self->velocity[0] * (distanceLeft/((TRUCK_BRAKE_FACTOR+1)*thisDist)); + newVel[1] = self->velocity[1] * (distanceLeft/((TRUCK_BRAKE_FACTOR+1)*thisDist)); + newVel[2] = 0; + VectorCopy(newVel, self->velocity); + self->nextthink = level.time + .1; +} + +qboolean bedEndofLineCheck (edict_t *self) +{ + float distanceLeft; + float thisDist; + float curSpeed; + float xDiff, yDiff; + + xDiff = self->s.origin[0] - self->volume; + yDiff = self->s.origin[1] - self->attenuation; + distanceLeft = sqrt(xDiff*xDiff + yDiff*yDiff); + + curSpeed = sqrt(self->velocity[0]*self->velocity[0] + self->velocity[1]*self->velocity[1]); + thisDist = curSpeed * .1; + + if (VectorCompare(vec3_origin, self->velocity)) + { + return true; + } + +// if (self->spawnflags & TRAIN_DECCELERATE) + { + if (distanceLeft < (TRUCK_BRAKE_FACTOR*thisDist)) + { + vec3_t newVel; + + //adjust velocity then stop + newVel[0] = self->velocity[0] * (distanceLeft/((TRUCK_BRAKE_FACTOR+1)*thisDist)); + newVel[1] = self->velocity[1] * (distanceLeft/((TRUCK_BRAKE_FACTOR+1)*thisDist)); + newVel[2] = 0; + VectorCopy(newVel, self->velocity); + self->think = bed_deccel; + self->nextthink = level.time + .1; + return false; + } + else + { + return true; + } + } + +} + +void bed_WheelSpin (edict_t *self) +{ + + ggBinstC *wheel1,*wheel2,*wheel3,*wheel4; + vec3_t angVel = {0,0,0}; + eft_rotate_t *rotInfo = NULL; + + int tire_circ; + float speed,turns,radians; + + + tire_circ = (30 * M_PI); + speed = VectorLength (self->velocity); + turns = speed / tire_circ; + radians = DEGTORAD * turns; + radians = M_PI * turns; + + wheel1 = SimpleModelFindBolt(self, bosniaModelData[OBJ_TRUCK_OLD_WHEEL],"DUMMY01"); + wheel2 = SimpleModelFindBolt(self, bosniaModelData[OBJ_TRUCK_OLD_WHEEL],"DUMMY02"); + wheel3 = SimpleModelFindBolt(self, bosniaModelData[OBJ_TRUCK_OLD_WHEEL],"DUMMY03"); + wheel4 = SimpleModelFindBolt(self, bosniaModelData[OBJ_TRUCK_OLD_WHEEL],"DUMMY04"); + + if (wheel1) + { + if (rotInfo = FXA_GetRotate(self)) + { + // adding to an existing rotation + rotInfo->xRot = radians*512;//512 accounts for the shift induced by FXA_SetRotate() + } + else + { + // need to create a rotating effect + angVel[PITCH] = radians; + + FXA_SetRotate(self, angVel, wheel1->GetInstPtr()); + FXA_SetRotate(self, angVel, wheel2->GetInstPtr()); + FXA_SetRotate(self, angVel, wheel3->GetInstPtr()); + FXA_SetRotate(self, angVel, wheel4->GetInstPtr()); + } + } +} + +void bed_linecheck (edict_t *self) +{ + + GrabStuffOnTop (self); + bedEndofLineCheck(self); + self->nextthink = level.time + .1; + bed_WheelSpin (self); +} + +void bed_accel (edict_t *self) +{ + int chance; + + GrabStuffOnTop (self); + if ((double)(self->velocity[0]*self->velocity[0] + self->velocity[1]*self->velocity[1]) < (self->speed*self->speed)) //speed is max speed + { + self->velocity[1] += (-1 * self->accel * sin(self->s.angles[1] * DEGTORAD)); + self->velocity[0] += (self->accel * cos(self->s.angles[1] * DEGTORAD)); + self->nextthink = level.time + .1; + } + else + { + self->think = bed_linecheck; + self->nextthink = level.time + .1; + } + + chance = gi.irand(0,5); + bedEndofLineCheck(self); + bed_WheelSpin (self); +} + +void bed_go (edict_t *self, edict_t *other, edict_t *activator) +{ + // beds with facing 0 are "pointing" east (pos x) + self->movetype = MOVETYPE_DAN; + GrabStuffOnTop (self); + self->velocity[1] = -1 * self->accel * sin(self->s.angles[1] * DEGTORAD); + self->velocity[0] = self->accel * cos(self->s.angles[1] * DEGTORAD); + self->friction = 0; + self->gravity = 0; + self->nextthink = level.time + .1; + self->think = bed_accel; + self->use = NULL; + self->plUse = NULL; + +// self->s.sound = gi.soundindex("Ambient/Locs/Subway/Train/Move.wav"); + + bedEndofLineCheck(self); +} + +void bedwheels_stop (edict_t *self) +{ + FXA_RemoveRotate(self); +} + +void bedwheels_roll (edict_t *self) +{ + ggBinstC *wheel1,*wheel2,*wheel3,*wheel4; + vec3_t angVel = {0,0,0}; + eft_rotate_t *rotInfo = NULL; + + int tire_circ; + float speed,turns,radians; + + + tire_circ = (30 * M_PI); + speed = self->speed; + turns = speed / tire_circ; + radians = DEGTORAD * turns; + radians = M_PI * turns; + + wheel1 = SimpleModelFindBolt(self, bosniaModelData[OBJ_TRUCK_OLD_WHEEL],"DUMMY01"); + wheel2 = SimpleModelFindBolt(self, bosniaModelData[OBJ_TRUCK_OLD_WHEEL],"DUMMY02"); + wheel3 = SimpleModelFindBolt(self, bosniaModelData[OBJ_TRUCK_OLD_WHEEL],"DUMMY03"); + wheel4 = SimpleModelFindBolt(self, bosniaModelData[OBJ_TRUCK_OLD_WHEEL],"DUMMY04"); + + if (wheel1) + { + if (rotInfo = FXA_GetRotate(self)) + { + // adding to an existing rotation + rotInfo->xRot = radians*512;//512 accounts for the shift induced by FXA_SetRotate() + } + else + { + // need to create a rotating effect + angVel[PITCH] = radians; + FXA_SetRotate(self, angVel, + wheel1->GetInstPtr(),wheel2->GetInstPtr(), + wheel3->GetInstPtr(),wheel4->GetInstPtr()); + } + } +} + +void bedwheels_use (edict_t *self, edict_t *other, edict_t *activator) +{ + + if (!self->count) + { + self->count = 1; // Let 'em know we're moving + bedwheels_roll(self); + } + else + { + self->count = 0; // Let 'em know we're not moving + bedwheels_stop(self); + } +} + +void truck_touch (edict_t *ent, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + // the normal of impact seems to originate from 'other' + vec3_t vOtherDir, vel, normal; + + if ( (NULL == plane) || (NULL == plane->normal) ) + { + return; + } + VectorSubtract(ent->s.origin, other->s.origin, vOtherDir); + VectorCopy(plane->normal, normal); + VectorNormalize(normal); + VectorNormalize(vOtherDir); + // ignoring z-values. I hope the truck only moves horizontally... + vOtherDir[2] = 0; + if (DotProduct(vOtherDir, normal) > .9) + { // 'other' is in our path. bump him. + VectorScale(ent->velocity, 15, vel); + VectorAdd(other->velocity, vel, other->velocity); + other->velocity[2] += 25; // up a little + // do some damage, too. heh. + if (other->health > 10) + { + other->health -= 5; + } + } +} + +void bosnia_truck_remove(edict_t *self) +{ + IGhoulObj *obj = NULL; + GhoulID idEngine = 0; + float xattenuation = ATTN_NORM, xvolume = 1.0; + + if (self->ghoulInst && (obj = self->ghoulInst->GetGhoulObject())) + { + if (idEngine = obj->FindPart("ENGINE")) + { + fxRunner.stopContinualEffect("environ/normalsmoke", self, idEngine); + } + } +} + +void bosnia_truck_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + IGhoulObj *obj = NULL; + GhoulID idEngine = 0; + float xattenuation = ATTN_NORM, xvolume = 1.0; + + if (self->ghoulInst && (obj = self->ghoulInst->GetGhoulObject())) + { + if (idEngine = obj->FindPart("ENGINE")) + { + fxRunner.execContinualEffect("environ/normalsmoke", self, idEngine); + gi.positioned_sound (self->s.origin, g_edicts, 0, gi.soundindex("impact/explosion/med.wav"), xvolume, xattenuation, 0); + self->think = bosnia_truck_remove; + self->nextthink = level.time + 5; + self->die = NULL; + } + } +} + + +/*QUAKED misc_bosnia_truck_old (1 .5 0) (-96 -39 -45) (96 39 45) INVULNERABLE NOPUSH TRIGGERED LIGHTS WHEELS_ONLY x FLUFF +WWII-style covered transport truck +------ KEYS ------ +Skin - type of truck +0 - green WWII skin +1 - red Iraq skin +2 - rusted ACME truck +Distance - distance the truck will move when triggered +Speed - max speed (default 200) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +WHEELS_ONLY - wheels turn when used, stop turning when used again. +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_bosnia_truck_old (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -96, -39, -45); + VectorSet (ent->maxs, 96, 39, 45); + + ent->spawnflags |= SF_NOPUSH; + + switch (ent->s.skinnum) + { + case 1: + skinname = "truck2"; + break; + case 2: + skinname = "truck3"; + break; + default : + skinname = "truck"; + break; + } + + gi.effectindex("environ/normalsmoke"); + gi.soundindex("impact/explosion/med.wav"); + + SimpleModelInit2(ent,&bosniaModelData[OBJ_TRUCK_OLD],skinname,NULL); + + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY01", + bosniaModelData[OBJ_TRUCK_OLD_WHEEL],"DUMMY01",NULL); + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY02", + bosniaModelData[OBJ_TRUCK_OLD_WHEEL],"DUMMY01",NULL); + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY03", + bosniaModelData[OBJ_TRUCK_OLD_WHEEL],"DUMMY01",NULL); + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY04", + bosniaModelData[OBJ_TRUCK_OLD_WHEEL],"DUMMY01",NULL); + +// ent->use = truck_old_explode; + + if (ent->spawnflags & TRUCK_WHEELS_ONLY) + { + ent->count = 0; // Let 'em know we're not moving + ent->use = bedwheels_use; + ent->touch = truck_touch; + + if (!ent->speed) + { + ent->speed = 200; + } + } + if (ent->spawnflags & TRUCK_TRIGGERED) + { + ent->use = bed_go; + ent->s.origin[2] += 1; // hack to avoid the sliding into floor brushes problem +// ent->touch = bed_smush; mcnutt said he won't need this + ent->elasticity = -1; + ent->flags |= FL_NO_KNOCKBACK; + + if (!ent->speed) + { + ent->speed = 200; + } + + ent->accel = 30; + + // using volume and attenuation for storage of finishing position + ent->volume = ent->s.origin[0] + st.distance * cos(ent->s.angles[1] * DEGTORAD); + ent->attenuation = ent->s.origin[1] + st.distance * sin(ent->s.angles[1] * DEGTORAD); + } + ent->die = bosnia_truck_die; +} \ No newline at end of file diff --git a/Source/Game/gamecpp/g_castle.cpp b/Source/Game/gamecpp/g_castle.cpp new file mode 100644 index 0000000..b6f2bdb --- /dev/null +++ b/Source/Game/gamecpp/g_castle.cpp @@ -0,0 +1,813 @@ +/****************************************************** + * Objects for Castle levels * + ******************************************************/ + +#include "g_local.h" +#include "g_obj.h" + +#define HLTH_CASTLE_ARMOR 500 +#define HLTH_CASTLE_BUST 1000 +#define HLTH_CASTLE_CANNON 1000 +#define HLTH_CASTLE_CHAIR 500 +#define HLTH_CASTLE_CHAIR_BIG 500 +#define HLTH_CASTLE_GLOBE 1000 +#define HLTH_CASTLE_HEDGE 500 +#define HLTH_CASTLE_TREE 1000 + + +// misc_castle.. +void SP_misc_castle_armor (edict_t *ent); +void SP_misc_castle_bust (edict_t *ent); +void SP_misc_castle_cannon (edict_t *ent); +void SP_misc_castle_chair (edict_t *ent); +void SP_misc_castle_chair_big (edict_t *ent); +void SP_misc_castle_globe (edict_t *ent); +void SP_misc_castle_hedge (edict_t *ent); +void SP_misc_castle_tree (edict_t *ent); + +spawn_t castleSpawns[] = +{ + // misc_castle... + {"misc_castle_armor", SP_misc_castle_armor}, + {"misc_castle_bust", SP_misc_castle_bust}, + {"misc_castle_cannon", SP_misc_castle_cannon}, + {"misc_castle_chair", SP_misc_castle_chair}, + {"misc_castle_chair_big", SP_misc_castle_chair_big}, + {"misc_castle_globe", SP_misc_castle_globe}, + {"misc_castle_hedge", SP_misc_castle_hedge}, + {"misc_castle_tree", SP_misc_castle_tree}, + + {NULL, NULL}, +}; + +typedef enum +{ + OBJ_ARMORSUIT = 0, + OBJ_BUST, + OBJ_CANNON, + OBJ_CHAIR, + OBJ_CHAIR_LEG_FRONT, + OBJ_CHAIR_LEG_BACK, + OBJ_CHAIR_SEATBACK, + OBJ_CHAIR_BIG, + OBJ_CHAIR_BIG_LEG, + OBJ_CHAIR_BIG_ARM, + OBJ_CHAIR_BIG_SEATBACK, + OBJ_GLOBE, + OBJ_GLOBE_BASE, + OBJ_HEDGE, + OBJ_TREE, + MAX_OBJS +}; + +modelSpawnData_t castleModelData[MD_CASTLE_SIZE] = +{ +// dir file surfaceType material health solid material file cnt scale +"objects/castle/armor", "armor", SURF_METAL, MAT_METAL_DGREY, HLTH_CASTLE_ARMOR, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_ARMORSUIT +"objects/castle/bust", "bust", SURF_STONE_DGREY, MAT_ROCK_DGREY, HLTH_CASTLE_BUST, SOLID_BBOX, "bust", 0, DEBRIS_SM, NULL, // OBJ_BUST +"objects/castle/cannon", "cannon", SURF_METAL, MAT_METAL_DGREY, HLTH_CASTLE_CANNON, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_CANNON +"objects/castle/chair", "seat01", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_CASTLE_CHAIR, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_CHAIR +"objects/castle/chair", "leg01", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_CASTLE_CHAIR, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_CHAIR_LEG_FRONT +"objects/castle/chair", "leg02", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_CASTLE_CHAIR, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_CHAIR_LEG_BACK +"objects/castle/chair", "back", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_CASTLE_CHAIR, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_CHAIR_SEATBACK +"objects/castle/chair_big", "seat01", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_CASTLE_CHAIR_BIG, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_CHAIR_BIG +"objects/castle/chair_big", "leg01", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_CASTLE_CHAIR_BIG, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_CHAIR_BIG_LEG +"objects/castle/chair_big", "arm01", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_CASTLE_CHAIR_BIG, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_CHAIR_BIG_ARM +"objects/castle/chair_big", "back01", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_CASTLE_CHAIR_BIG, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_CHAIR_BIG_SEATBACK +"objects/castle/globe", "globe", SURF_DEFAULT, MAT_WALL_GREY, HLTH_CASTLE_GLOBE, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_GLOBE +"objects/castle/globe", "base", SURF_DEFAULT, MAT_WALL_GREY, HLTH_CASTLE_GLOBE, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_GLOBE_BASE +"objects/castle/hedge", "hedge", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_CASTLE_HEDGE, SOLID_BBOX, NULL, 25, DEBRIS_SM, NULL, // OBJ_HEDGE +"objects/castle/tree", "tree", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_CASTLE_TREE, SOLID_BBOX, NULL, 35, DEBRIS_MED, NULL, // OBJ_TREE +}; + + +//------------------------------------------------------------- +// For objects that break apart +//------------------------------------------------------------- + +void chair2_legs_partpain (edict_t *self,int partLost, vec3_t boltPos); +//void chair_arm_partpain (edict_t *self,int partLost, vec3_t boltPos); +void chair_back_partpain (edict_t *self,int partLost, vec3_t boltPos); + +// Castle Parts Data enum +typedef enum +{ + CPD_CHAIR = 0, + CPD_CHAIR_BIG, + CPD_MAX, +}; + +// Castle Parts Data for each object +objBreak_t castleObjBreak [CPD_MAX] = +{ +// # of parts objParts ptr + 5, NULL, // CPD_CHAIR + 5, NULL, // CPD_CHAIR_BIG +}; + + +// Castle Parts Data for each part of each object +// WARNING: when updating this be sure to update castleObjBreak if more parts are added +objParts_t castleObjBoltPartsData[10] = +{ + // CPD_CHAIR // as you face the chair... + "DUMMY01", 1, chair2_legs_partpain, // Leg1 -- left front + "DUMMY02", 2, chair2_legs_partpain, // Leg2 -- right front + "DUMMY03", 3, chair2_legs_partpain, // Leg3 -- left rear + "DUMMY04", 4, chair2_legs_partpain, // Leg4 -- right rear + "DUMMY05", 5, NULL/*chair_back_partpain*/, // back of the chair + + // CPD_CHAIR_BIG + "DUMMY01", 1, chair2_legs_partpain, // Leg1 -- left + "DUMMY02", 2, chair2_legs_partpain, // Leg2 -- right + "DUMMY03", 3, NULL/*chair_arm_partpain*/, // Arm1 -- left + "DUMMY04", 4, NULL/*chair_arm_partpain*/, // Arm2 -- right + "DUMMY05", 5, chair_back_partpain, // back of the chair +}; + +/*QUAKED misc_castle_armor (1 .5 0) (-4 -11 -38) (11 17 50) INVULNERABLE NOPUSH x x x x FLUFF +A suit of armor +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_castle_armor (edict_t *ent) +{ + VectorSet (ent->mins, -4, -11, -38); + VectorSet (ent->maxs, 11, 17, 50); + + SimpleModelInit2(ent,&castleModelData[OBJ_ARMORSUIT],NULL,NULL); + +} + + +/*QUAKED misc_castle_bust (1 .5 0) (-4 -6 -1) (4 3 13) INVULNERABLE NOPUSH x x x x FLUFF +A bust of a person +------ KEYS ------ +skin - +0 - guy bust +1 - girl bust +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_castle_bust (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins,-4,-6, -1); + VectorSet (ent->maxs, 4, 3, 13); + + switch (ent->s.skinnum) + { + case 1: + skinname = "bust2"; + break; + default : + skinname = "bust"; + break; + } + + SimpleModelInit2(ent,&castleModelData[OBJ_BUST],skinname,NULL); + +} + + +/*QUAKED misc_castle_cannon (1 .5 0) (-27 -11 -13) (55 11 20) INVULNERABLE NOPUSH x x x x FLUFF +A cannon on wheels +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_castle_cannon (edict_t *ent) +{ + VectorSet (ent->mins,-27,-11, -13); + VectorSet (ent->maxs, 55, 11, 20); + + SimpleModelInit2(ent,&castleModelData[OBJ_CANNON],NULL,NULL); + +} + +void chair2_legs_flat(edict_t *self) +{ + VectorCopy(self->moveinfo.start_angles,self->s.angles); + VectorSet (self->mins, -10, -9,-2); + VectorSet (self->maxs, 10, 9, 18); + gi.linkentity(self); +} + +// roll front +void chair2_legs_roll1(edict_t *self) +{ + vec3_t fwd, right, up, vEnd = {0,0,0}; + float checkDist = 20.0f; + trace_t trace; + + AngleVectors(self->s.angles,fwd,right,up); + + VectorMA(self->s.origin, checkDist, fwd, vEnd); + gi.trace (self->s.origin, NULL, NULL, vEnd, self, self->clipmask, &trace); + // check to see if we're blocked before we roll + if (trace.fraction < 1.0f) + { + // we're blocked so move back a little + VectorMA(self->s.origin, -trace.fraction*checkDist, fwd, self->s.origin); + } + self->s.angles[PITCH] += 40; + VectorSet (self->mins, -10, -9,-6); + VectorSet (self->maxs, 10, 9, 18); + gi.linkentity(self); +} + +// roll right +void chair2_legs_roll2(edict_t *self) +{ + vec3_t fwd, right, vEnd = {0,0,0}; + float checkDist = -30.0f; + trace_t trace; + bool bTwoLegs = false; + + bTwoLegs = (strcmp(self->classname, "misc_castle_chair_big") == 0); + AngleVectors(self->s.angles,fwd,right,NULL); + + VectorMA(self->s.origin, checkDist, right, vEnd); + gi.trace (self->s.origin, NULL, NULL, vEnd, self, self->clipmask, &trace); + // check to see if we're blocked before we roll + if (trace.fraction < 1.0f) + { + // we're blocked so move back a little + VectorMA(self->s.origin, -trace.fraction*checkDist, fwd, self->s.origin); + } + self->s.angles[ROLL] -= bTwoLegs?40:40; + VectorSet (self->mins, -10, -9,bTwoLegs?-8.7:-6); + VectorSet (self->maxs, 10, 9, 18); + gi.linkentity(self); +} + +// roll left +void chair2_legs_roll3(edict_t *self) +{ + vec3_t fwd, right, vEnd = {0,0,0}; + float checkDist = 30.0f; + trace_t trace; + bool bTwoLegs = false; + + bTwoLegs = (strcmp(self->classname, "misc_castle_chair_big") == 0); + AngleVectors(self->s.angles,fwd,right,NULL); + + VectorMA(self->s.origin, checkDist, right, vEnd); + gi.trace (self->s.origin, NULL, NULL, vEnd, self, self->clipmask, &trace); + // check to see if we're blocked before we roll + if (trace.fraction < 1.0f) + { + // we're blocked so move back a little + VectorMA(self->s.origin, -trace.fraction*checkDist, fwd, self->s.origin); + } + self->s.angles[ROLL] += bTwoLegs?40:40; + VectorSet (self->mins, -10, -9,bTwoLegs?-8.7:-6); + VectorSet (self->maxs, 10, 9, 18); + gi.linkentity(self); +} + +// roll back +void chair2_legs_roll4(edict_t *self) +{ + vec3_t fwd, right, vEnd = {0,0,0}; + float checkDist = -30.0f; + trace_t trace; + + AngleVectors(self->s.angles,fwd,right,NULL); + + VectorMA(self->s.origin, checkDist, fwd, vEnd); + gi.trace (self->s.origin, NULL, NULL, vEnd, self, self->clipmask, &trace); + // check to see if we're blocked before we roll + if (trace.fraction < 1.0f) + { + // we're blocked so move forward a little + VectorMA(self->s.origin, -trace.fraction*checkDist, fwd, self->s.origin); + } + self->s.angles[PITCH] -= 37; + VectorSet (self->mins, -10, -9,-5.5); + VectorSet (self->maxs, 10, 9, 18); + gi.linkentity(self); +} + +void chair2_legs_partpain (edict_t *self,int partLost, vec3_t boltPos) +{ + bool bTwoLegs = false, B1, B2, B3, B4; + boltInstInfo_c *boltInfo = NULL; + + if (!self->objInfo || !(boltInfo = (boltInstInfo_c*)self->objInfo->GetInfo(OIT_BOLTINST)) ) + { + return; + } + B1 = boltInfo->IsOn(1); + B2 = boltInfo->IsOn(2); + B3 = boltInfo->IsOn(3); + B4 = boltInfo->IsOn(4); + + bTwoLegs = (strcmp(self->classname, "misc_castle_chair_big") == 0); + + if (!B1 && !B2 && !B3 && !B4) + { + chair2_legs_flat(self); + return; + } + + // These are given as you face the chair + // bolt1 - left front leg + // bolt2 - right front leg + // bolt3 - right back leg + // bolt4 - left back leg + + // chair2_legs_roll1 - roll forward + // chair2_legs_roll2 - roll right + // chair2_legs_roll3 - roll left + // chair2_legs_roll4 - roll back + + switch (partLost) + { + case 1: // left front leg + if (bTwoLegs) + { + if (B2) + { + // missing the left legs + chair2_legs_roll3(self); + } + else + { + // missing all legs + chair2_legs_flat(self); + } + } + else + { + if (!B2 && !B3) + { + // missing three legs + Obj_partkill (self,4,true); // Remove leg + chair2_legs_flat(self); + } + else if (!B3 && !B4) + { + // missing three legs + Obj_partkill (self,2,true); // Remove leg + chair2_legs_flat(self); + } + else if (!B4 && !B2) + { + // missing three legs + Obj_partkill (self,3,true); // Remove leg + chair2_legs_flat(self); + } + else if (!B2) + { + // missing two legs + chair2_legs_roll1(self); + } + else if (!B3) + { + // missing two legs + chair2_legs_roll3(self); + } + else if (!B4) + { + // missing two legs + Obj_partkill (self,2,true); // Remove leg + Obj_partkill (self,3,true); // Remove leg + chair2_legs_flat(self); + } + } + break; + case 2: // right front leg + if (bTwoLegs) + { + if (B1) + { + // missing the right legs + chair2_legs_roll2(self); + } + else + { + // missing all legs + chair2_legs_flat(self); + } + } + else + { + if (!B1 && !B3) + { + // missing three legs + Obj_partkill (self,4,true); // Remove leg + chair2_legs_flat(self); + } + else if (!B3 && !B4) + { + // missing three legs + Obj_partkill (self,1,true); // Remove leg + chair2_legs_flat(self); + } + else if (!B4 && !B1) + { + // missing three legs + Obj_partkill (self,3,true); // Remove leg + chair2_legs_flat(self); + } + else if (!B1) + { + // missing two legs + chair2_legs_roll1(self); + } + else if (!B4) + { + // missing two legs + chair2_legs_roll2(self); + } + else if (!B3) + { + // missing two legs + Obj_partkill (self,1,true); // Remove leg + Obj_partkill (self,4,true); // Remove leg + chair2_legs_flat(self); + } + } + break; + case 3: // right back leg + if (bTwoLegs) + { + // how'd you get here with only two legs? + } + else + { + if (!B1 && !B2) + { + // missing three legs + Obj_partkill (self,4,true); // Remove leg + chair2_legs_flat(self); + } + else if (!B2 && !B4) + { + // missing three legs + Obj_partkill (self,1,true); // Remove leg + chair2_legs_flat(self); + } + else if (!B4 && !B1) + { + // missing three legs + Obj_partkill (self,2,true); // Remove leg + chair2_legs_flat(self); + } + else if (!B1) + { + // missing two legs + chair2_legs_roll3(self); + } + else if (!B4) + { + // missing two legs + chair2_legs_roll4(self); + } + else if (!B2) + { + // missing two legs + Obj_partkill (self,1,true); // Remove leg + Obj_partkill (self,4,true); // Remove leg + chair2_legs_flat(self); + } + } + break; + case 4: // left back leg + if (bTwoLegs) + { + // how'd you get here with only two legs? + } + else + { + if (!B1 && !B2) + { + // missing three legs + Obj_partkill (self,3,true); // Remove leg + chair2_legs_flat(self); + } + else if (!B2 && !B3) + { + // missing three legs + Obj_partkill (self,1,true); // Remove leg + chair2_legs_flat(self); + } + else if (!B3 && !B1) + { + // missing three legs + Obj_partkill (self,2,true); // Remove leg + chair2_legs_flat(self); + } + else if (!B2) + { + // missing two legs + chair2_legs_roll2(self); + } + else if (!B3) + { + // missing two legs + chair2_legs_roll4(self); + } + else if (!B1) + { + // missing two legs + Obj_partkill (self,2,true); // Remove leg + Obj_partkill (self,3,true); // Remove leg + chair2_legs_flat(self); + } + } + break; + default : + break; + } +} + + +/*QUAKED misc_castle_chair (1 .5 0) (-17 -14 -15) (11 13 38) INVULNERABLE NOPUSH x x x x FLUFF +A chair with a high back +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls apart when shot +*/ +void SP_misc_castle_chair (edict_t *ent) +{ + ggBinstC *bInstC = NULL; + IGhoulInst *boltInst = NULL; + IGhoulInst *boltInst2 = NULL; + + VectorSet (ent->mins,-17, -14, -15); + VectorSet (ent->maxs, 11, 13, 38); + + Obj_partbreaksetup (CPD_CHAIR,&castleModelData[OBJ_CHAIR], + castleObjBoltPartsData, castleObjBreak); + + SimpleModelInit2(ent,&castleModelData[OBJ_CHAIR],NULL,NULL); + + // These are given as you face the chair + // bolt1 - left front leg + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY01", + castleModelData[OBJ_CHAIR_LEG_FRONT],"DUMMY01",NULL); + // bolt2 - right front leg + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY02", + castleModelData[OBJ_CHAIR_LEG_FRONT],"DUMMY01",NULL); + // bolt3 - left back leg + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY03", + castleModelData[OBJ_CHAIR_LEG_BACK],"DUMMY01",NULL); + // bolt4 - right back leg + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY04", + castleModelData[OBJ_CHAIR_LEG_BACK],"DUMMY01",NULL); + // bolt5 - back + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY05", + castleModelData[OBJ_CHAIR_SEATBACK],"DUMMY05",NULL); + ent->pain = Obj_partpain; + + // gonna need these if the chair ever has all of its legs shot off + VectorCopy(ent->s.angles,ent->moveinfo.start_angles); +} + +void chair_back_partpain (edict_t *self,int partLost, vec3_t boltPos) +{ + // if the back is shot off of a big chair, blow the arms off, too + ggOinstC* myInstance = NULL; + ggObjC *MyGhoulObj = NULL; + vec3_t armPos; + bool bTwoLegs = false, B3, B4; + boltInstInfo_c *boltInfo = NULL; + vec3_t debrisNorm; + + if (!self->objInfo || !(boltInfo = (boltInstInfo_c*)self->objInfo->GetInfo(OIT_BOLTINST)) ) + { + return; + } + B3 = boltInfo->IsOn(3); + B4 = boltInfo->IsOn(4); + + // first, deal with the back of the chair + GetGhoulPosDir(self->s.origin, self->s.angles, self->ghoulInst, + NULL, "DUMMY05", armPos, NULL, NULL, NULL); + VectorClear(debrisNorm); + FX_ThrowDebris(armPos,debrisNorm, 5, DEBRIS_SM, self->material, 0,0,0, self->surfaceType); + FX_SmokePuff(armPos,120,120,120,200); + + // now deal with the arms + if (!B3 && !B4) + { + return; + } + if (self->ghoulInst && self->ghoulInst->GetGhoulObject()) + { + if (MyGhoulObj=game_ghoul.FindObject(self->ghoulInst->GetGhoulObject())) + { + if (myInstance = MyGhoulObj->FindOInst(self->ghoulInst)) + { + // Throw debris and make it go away + + // yes, I'm hardcoding dummy names rather than going through 27 levels of + //indirection to get to the array that holds the names. I mean, just look at this... + // + // boltPartData = self->objSpawnData->objBreakData->boltPartData; + // + //ridiculous. absolutely ridiculous. like I'm gonna mess with that. + GetGhoulPosDir(self->s.origin, self->s.angles, self->ghoulInst, + NULL, "DUMMY03", armPos, NULL, NULL, NULL); + FX_ThrowDebris(armPos,debrisNorm, 5, DEBRIS_SM, self->material, 0,0,0, self->surfaceType); + FX_SmokePuff(armPos,120,120,120,200); + GetGhoulPosDir(self->s.origin, self->s.angles, self->ghoulInst, + NULL, "DUMMY04", armPos, NULL, NULL, NULL); + FX_ThrowDebris(armPos,debrisNorm, 5, DEBRIS_SM, self->material, 0,0,0, self->surfaceType); + FX_SmokePuff(armPos,120,120,120,200); + + RecursiveTurnOff(SimpleModelGetBolt(self, 3)); + RecursiveTurnOff(SimpleModelGetBolt(self, 4)); + } + } + } +} + +/*QUAKED misc_castle_chair_big (1 .5 0) (-18 -15 -18) (12 15 39) INVULNERABLE NOPUSH x x x x FLUFF +A big high back chair and arms +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls apart when shot +*/ +void SP_misc_castle_chair_big (edict_t *ent) +{ + ggBinstC *bInstC = NULL; + IGhoulInst *boltInst = NULL; + IGhoulInst *boltInst2 = NULL; + + VectorSet (ent->mins,-17, -14, -17); + VectorSet (ent->maxs, 12, 14, 38); + + Obj_partbreaksetup (CPD_CHAIR_BIG,&castleModelData[OBJ_CHAIR_BIG], + castleObjBoltPartsData, castleObjBreak); + + // heh. simple model. heh heh. + SimpleModelInit2(ent,&castleModelData[OBJ_CHAIR_BIG],NULL,NULL); + + // These are given as you face the chair + // bolt1 - left legs + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY01", + castleModelData[OBJ_CHAIR_BIG_LEG],"DUMMY01",NULL); + // bolt2 - right legs + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY02", + castleModelData[OBJ_CHAIR_BIG_LEG],"DUMMY01",NULL); + // bolt3 - left arm + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY03", + castleModelData[OBJ_CHAIR_BIG_ARM],"DUMMY03",NULL); + // bolt4 - right arm + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY04", + castleModelData[OBJ_CHAIR_BIG_ARM],"DUMMY03",NULL); + // bolt5 - back + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY05", + castleModelData[OBJ_CHAIR_BIG_SEATBACK],"DUMMY05",NULL); + ent->pain = Obj_partpain; + + // gonna need these if the chair ever has all of its legs shot off + VectorCopy(ent->s.angles,ent->moveinfo.start_angles); +} + +void globe_spin (edict_t *self) +{ + eft_rotate_t *rotInfo = NULL; + + if (rotInfo = FXA_GetRotate(self)) + { + rotInfo->yRot *= 0.75f; // Add friction + if (abs(rotInfo->yRot) < (0.3f * 512))//512 accounts for the shift induced by FXA_SetRotate() + { + // stop rotating + FXA_RemoveRotate(self); + self->think = NULL; + } + else + { + self->nextthink = level.time + 0.5f; + } + } +} + +void globe_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + ggBinstC *globe; + vec3_t towherehit, cross, pathdir, up, angVel = {0,0,0}; + eft_rotate_t *rotInfo = NULL; + float fMult = 0.1f * damage; + + globe = SimpleModelFindBolt(self, castleModelData[OBJ_GLOBE],"DUMMY01"); + + if (globe) + { + // only spin globe portion + VectorSet(up, 0, 0, 1); + VectorSubtract(other->s.origin, self->s.origin, pathdir); + VectorNormalize(pathdir); + VectorSubtract(wherehit,self->s.origin, towherehit); + CrossProduct(pathdir, towherehit, cross); + if (DotProduct(cross, up) < 0) + { + if (rotInfo = FXA_GetRotate(self)) + { + // adding to an existing rotation + rotInfo->yRot += fMult*512;//512 accounts for the shift induced by FXA_SetRotate() + } + else + { + // need to create a rotating effect + angVel[YAW] = (fMult<30)?fMult:30; + FXA_SetRotate(self, angVel, globe->GetInstPtr()); + } + } + else if (DotProduct(cross, up) > 0) + { + if (rotInfo = FXA_GetRotate(self)) + { + // adding to an existing rotation + rotInfo->yRot += (-fMult)*512;//512 accounts for the shift induced by FXA_SetRotate() + } + else + { + // need to create a rotating effect + angVel[YAW] = (fMult<30)?-fMult:-30; + FXA_SetRotate(self, angVel, globe->GetInstPtr()); + } + } + + self->think = globe_spin; + // need to think pretty often cuz that's where we'll slow down the chair's rotation to simulate friction + self->nextthink = level.time + 0.5f; + } +} + + +/*QUAKED misc_castle_globe (1 .5 0) (-7 -9 -26) (15 9 12) INVULNERABLE NOPUSH x x x x FLUFF +A globe of the earth. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- spins when hit +*/ +void SP_misc_castle_globe (edict_t *ent) +{ + VectorSet (ent->mins, -7,-9, -26); + VectorSet (ent->maxs, 15, 9, 12); + + SimpleModelInit2(ent,&castleModelData[OBJ_GLOBE_BASE],NULL,NULL); + + SimpleModelAddBolt(ent,castleModelData[OBJ_GLOBE_BASE],"DUMMY01", + castleModelData[OBJ_GLOBE],"DUMMY01",NULL); + + ent->pain = globe_pain; +} + +/*QUAKED misc_castle_hedge (1 .5 0) (-10 -14 -12) (9 11 11) INVULNERABLE NOPUSH x x x x FLUFF +A hedge +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_castle_hedge (edict_t *ent) +{ + VectorSet (ent->mins, -10,-14, -12); + VectorSet (ent->maxs, 9, 11, 11); + + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&castleModelData[OBJ_HEDGE],NULL,NULL); + +} + +/*QUAKED misc_castle_tree (1 .5 0) (-24 -21 -11) (24 21 74) INVULNERABLE NOPUSH x x x x FLUFF +A pine tree +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_castle_tree (edict_t *ent) +{ + VectorSet (ent->mins, -24,-21, -11); + VectorSet (ent->maxs, 24, 21, 74); + + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&castleModelData[OBJ_TREE],NULL,NULL); + +} + diff --git a/Source/Game/gamecpp/g_chase.cpp b/Source/Game/gamecpp/g_chase.cpp new file mode 100644 index 0000000..c2456e8 --- /dev/null +++ b/Source/Game/gamecpp/g_chase.cpp @@ -0,0 +1,164 @@ +#include "g_local.h" +#include "../strings/dm_generic.h" + +void UpdateChaseCam(edict_t *ent) +{ + edict_t *targ; + vec3_t forward,right,up, + o,ownerv,goal; + vec3_t angles; + vec3_t min={-1,-1,-1},max={1,1,1}; + trace_t trace; + + // Has our chase target gone? + + if(!ent->client->chase_target->inuse||ent->client->chase_target->client->resp.spectator) + { + edict_t *old = ent->client->chase_target; + + ChaseNext(ent); + + if (ent->client->chase_target == old) + { + ent->client->chase_target = NULL; + ent->client->ps.pmove.pm_flags &= ~PMF_NO_PREDICTION; + + return; + } + } + + targ=ent->client->chase_target; + + // Base viewing angles. + + VectorCopy(targ->client->v_angle,angles); + + if(angles[PITCH] > 56) + angles[PITCH] = 56; + else if(angles[PITCH] < -56) + angles[PITCH] = -56; + + // Get focal point. + + AngleVectors(angles,forward,right,up); + VectorScale(up,targ->viewheight+16,ownerv); + VectorAdd(targ->s.origin,ownerv,ownerv); + gi.trace(targ->s.origin,min,max,ownerv,targ,MASK_SOLID,&trace); + VectorCopy(trace.endpos,ownerv); + + // Get camera point. + + VectorNormalize(forward); + VectorMA(ownerv,-35,forward,o); + + if (!targ->groundentity) + o[2] += 16; + + gi.trace(ownerv, min, max, o, targ, MASK_SOLID, &trace); + VectorCopy(trace.endpos, goal); + + // Set camera origin and angles. + + VectorCopy(goal, ent->s.origin); + + for (int i=0 ; i<3 ; i++) + ent->client->ps.pmove.delta_angles[i] = ANGLE2SHORT(angles[i] - ent->client->resp.cmd_angles[i]); + + if (targ->deadflag) + { + ent->client->ps.pmove.pm_type = PM_DEAD; + + ent->client->ps.viewangles[ROLL] = 40; + ent->client->ps.viewangles[PITCH] = -15; + ent->client->ps.viewangles[YAW] = targ->client->killer_yaw; + } + else + { + ent->client->ps.pmove.pm_type = PM_SPECTATOR_FREEZE; + + VectorCopy(angles, ent->client->ps.viewangles); + VectorCopy(angles, ent->client->v_angle); + } + + // Other misc. crap. and then re-link us. + + ent->client->ps.spectatorId=targ->s.number; + ent->viewheight=0; + ent->client->ps.pmove.pm_flags |= PMF_NO_PREDICTION; + gi.linkentity(ent); +} + +void ChaseNext(edict_t *ent) +{ + int i; + edict_t *e; + + if (!ent->client->chase_target) + return; + + i = ent->client->chase_target - g_edicts; + do { + i++; + if (i > (int)maxclients->value) + i = 1; + e = g_edicts + i; + if (!e->inuse) + continue; + if (!e->client->resp.spectator) + break; + } while (e != ent->client->chase_target); + + ent->client->chase_target = e; + ent->client->update_chase = true; +} + +void ChasePrev(edict_t *ent) +{ + int i; + edict_t *e; + + if (!ent->client->chase_target) + return; + + i = ent->client->chase_target - g_edicts; + + do + { + i--; + + if (i < 1) + i = (int)maxclients->value; + + e = g_edicts + i; + + if (!e->inuse) + continue; + + if (!e->client->resp.spectator) + break; + } while (e != ent->client->chase_target); + + ent->client->chase_target = e; + ent->client->update_chase = true; +} + +void GetChaseTarget(edict_t *ent) +{ + int i; + edict_t *other; + + for (i = 1; i <= (int)maxclients->value; i++) + { + other = g_edicts + i; + + if (other->inuse && !other->client->resp.spectator) + { + ent->client->chase_target = other; + ent->client->update_chase = true; + UpdateChaseCam(ent); + return; + } + } + + gi.SP_Print(ent,DM_GENERIC_TEXT_NO_MORE_CHASE); +} diff --git a/Source/Game/gamecpp/g_cmds.cpp b/Source/Game/gamecpp/g_cmds.cpp new file mode 100644 index 0000000..e08c055 --- /dev/null +++ b/Source/Game/gamecpp/g_cmds.cpp @@ -0,0 +1,1394 @@ +#include "g_local.h" +#include "q_sh_interface.h" +#include "w_weapons.h" +#include "w_types.h" +#include "ai_path_pre.h" +#include "p_body.h" +#include "..\strings\general.h" + +extern void ED_CallSpawn (edict_t *ent); +extern void sendRestartPrediction(edict_t *ent); + +static int weaponsUseAmmo, + dropWeapons, + nonDroppableWeaponTypes, + weaponsReload, + weaponReloadAutomatic, + reloadEmptiesWeapon, + dropInvenOnDeath, + selectWithNoAmmo, + hasCTFFlag; + +void saveInvenRules(inven_c *inven) +{ + weaponsUseAmmo=inven->rulesDoWeaponsUseAmmo(); + dropWeapons=inven->rulesCanDropWeapons(); + nonDroppableWeaponTypes=inven->rulesGetNonDroppableWeaponTypes(); + weaponsReload=inven->rulesDoWeaponsReload(); + weaponReloadAutomatic=inven->rulesIsWeaponReloadAutomatic(); + reloadEmptiesWeapon=inven->rulesDoReloadEmptiesWeapon(); + dropInvenOnDeath=inven->rulesCanDropInvenOnDeath(); + selectWithNoAmmo=inven->rulesCanSelectWithNoAmmo(); + hasCTFFlag=inven->hasItemType(SFE_CTFFLAG); +} + +void restoreInvenRules(inven_c *inven) +{ + inven->rulesSetWeaponsUseAmmo(weaponsUseAmmo); + inven->rulesSetDropWeapons(dropWeapons); + inven->rulesSetNonDroppableWeaponTypes(nonDroppableWeaponTypes); + inven->rulesSetWeaponsReload(weaponsReload); + inven->rulesSetWeaponReloadAutomatic(weaponReloadAutomatic); + inven->rulesSetReloadEmptiesWeapon(reloadEmptiesWeapon); + inven->rulesSetDropInvenOnDeath(dropInvenOnDeath); + inven->rulesSetSelectWithNoAmmo(selectWithNoAmmo); + if(hasCTFFlag) + inven->addItem(SFE_CTFFLAG,1); +} + +// Flood protection + +qboolean CheckFlood(edict_t *ent) +{ + int i; + + if (flood_msgs->value) + { + if (level.time < ent->client->flood_locktill) + { + gi.SP_Print(ent, GENERAL_TEXT_SHUT_UP , (short)(ent->client->flood_locktill - level.time)); + return true; + } + i = ent->client->flood_whenhead - flood_msgs->value + 1; + if (i < 0) + { + i = (sizeof(ent->client->flood_when) / sizeof(ent->client->flood_when[0])) + i; + } + if (ent->client->flood_when[i] && (level.time - ent->client->flood_when[i] < flood_persecond->value)) + { + ent->client->flood_locktill = level.time + flood_waitdelay->value; + gi.SP_Print(ent, GENERAL_TEXT_SHUT_UP , (short)flood_waitdelay->value); + return true; + } + ent->client->flood_whenhead = (ent->client->flood_whenhead + 1) % (sizeof(ent->client->flood_when) / sizeof(ent->client->flood_when[0])); + ent->client->flood_when[ent->client->flood_whenhead] = level.time; + } + return false; +} + + +char *ClientTeam (edict_t *ent) +{ + static char value[512]; + + value[0] = 0; + + if (!ent->client) + return value; + + switch (ent->client->resp.team) + { + case TEAM1: + return("blue"); + break; + + case TEAM2: + return("red"); + break; + + default: + strcpy(value, Info_ValueForKey (ent->client->pers.userinfo, "teamname")); + return(value); + break; + } + +} + +bool IsInnocent(edict_t *ent) +{ + ai_c *ai1 = ( ent?(ai_c *)((ai_public_c *)ent->ai):NULL ); + + if (ai1) + { + return !!ai1->IsInnocent(); + } + return true; +} + +qboolean OnSameTeam (edict_t *ent1, edict_t *ent2) +{ + char ent1Team[512]; + char ent2Team[512]; + + qboolean playerIsGood=true; + + ai_c *ai1 = ( ent1?(ai_c *)((ai_public_c *)ent1->ai):NULL ); + ai_c *ai2 = ( ent2?(ai_c *)((ai_public_c *)ent2->ai):NULL ); + + if (!ent1 || !ent2) + { + return(false); + } + + if (ai1 != NULL) + { + if (ai1->AmIAsGoodAsDead()) + { + return false; + } + } + if (ai2 != NULL) + { + if (ai2->AmIAsGoodAsDead()) + { + return false; + } + } + + // Before checking between players, check monsters' loyalties. + + if (ent1->ai) + { + if (ent2->ai) + { + return (ent1->ai->GetTeam(*ent1)==ent2->ai->GetTeam(*ent2)); + } + else//is ent1 (a monster) on same team as a player? + { + // Count team 0 as the good guys. + + if (ent2->client&&deathmatch->value) + { + playerIsGood=!strcmp(Info_ValueForKey (ent2->client->pers.userinfo, "teamname"),"mullins"); + } + + if ((ent1->ai->GetTeam(*ent1)&&playerIsGood) || !ent2->client || /*ent1->ai->GetAbusedByTeam() ||*/ !playerIsGood) + { + return(false); + } + else + { + return(true); + } + } + } + else + { + if (ent2->ai)//is ent1 (a monster) on same team as a player? + { + // Count team 0 as the good guys. + + if (ent1->client&&deathmatch->value) + { + playerIsGood=!strcmp(Info_ValueForKey (ent1->client->pers.userinfo, "teamname"),"mullins"); + } + + if ((ent2->ai->GetTeam(*ent2)&&playerIsGood) || /*ent2->ai->GetAbusedByTeam() ||*/ !playerIsGood) + { + return(false); + } + else + { + return(true); + } + } + } + + if(!dm->dmRule_TEAMPLAY()) + return(false); + + strcpy (ent1Team, ClientTeam (ent1)); + strcpy (ent2Team, ClientTeam (ent2)); + + if (strcmp(ent1Team, ent2Team) == 0) + return(true); + + return(false); +} + +//================================================================================= + +/* +================== +Cmd_God_f + +Sets client to godmode + +argv(0) god +================== +*/ + +void Cmd_God_f (edict_t *ent) +{ + char *msg; + + if(!game.playerSkills.canCheat()) + { // harder difficulty levels won't let you cheat + gi.cprintf (ent, PRINT_HIGH, "Cheats not available.\n"); + return; + } + + ent->flags ^= FL_GODMODE; + if (!(ent->flags & FL_GODMODE) ) + msg = "godmode OFF\n"; + else + msg = "godmode ON\n"; + + gi.cprintf (ent, PRINT_HIGH, msg); +} + +void Cmd_Playlevel_f(edict_t *ent) +{ +#ifndef _DEMO_ + + if(!game.playerSkills.canCheat()) + { // harder difficulty levels won't let you cheat + gi.cprintf (ent, PRINT_HIGH, "Cheats not available.\n"); + return; + } + + sharedEdict_t sh; + + sh.inv = (inven_c *)ent->client->inv; + + if (!sh.inv) + { + gi.dprintf("hey! no inventory!\n"); + return; + } + + sh.edict = ent; + sh.inv->setOwner(&sh); + sh.inv->deactivateCurrentWeapon(); + sh.inv->deactivateInventory(); + + saveInvenRules(sh.inv); + + W_InitInv(*ent); + sh.inv = (inven_c *)ent->client->inv; + sh.edict = ent; + sh.inv->setOwner(&sh); + sendRestartPrediction(ent); + + restoreInvenRules(sh.inv); + sh.inv->rulesSetBestWeaponMode(Info_ValueForKey(ent->client->pers.userinfo,"bestweap")); + + sh.inv->clearInv(false); + + sh.inv->addWeaponType(SFW_KNIFE); + sh.inv->addWeaponType(SFW_PISTOL1); + sh.inv->addWeaponType(SFW_HURTHAND); + sh.inv->addWeaponType(SFW_THROWHAND); + + AddWeaponTypeForPrecache(SFW_KNIFE); + AddWeaponTypeForPrecache(SFW_PISTOL1); + AddWeaponTypeForPrecache(SFW_HURTHAND); + AddWeaponTypeForPrecache(SFW_THROWHAND); + + if(!dm->dmRule_INFINITE_AMMO()) + { + sh.inv->addAmmoType(AMMO_9MM, 150); + sh.inv->addAmmoType(AMMO_KNIFE, 6); + } + sh.inv->addItem(SFE_C4, 2); + + sh.inv->stockWeapons(); + + pe->PrecacheViewWeaponModels(level.weaponsAvailable); + + sh.inv->selectWeapon(SFW_PISTOL1); + + // Remove any amror player may have... should be a better way really. + + PB_AddArmor(ent,ent->client->inv->getArmorCount()*-1); + + // Clear invulnerability. + + ent->flags &= ~FL_GODMODE; + gi.cvar_setvalue("nodamage", 0); + +#endif //_DEMO_ +} + +void DefaultWeapons(edict_t *ent); + +void Cmd_DefaultWeapons(edict_t *ent) +{ + if (dm->isDM()) + return; + +#ifdef _FINAL_ // kef -- need this cheat for testing 'challenging' skill level + if(!game.playerSkills.canCheat()) + { // harder difficulty levels won't let you cheat + gi.cprintf (ent, PRINT_HIGH, "Cheats not available.\n"); + return; + } +#endif + + DefaultWeapons(ent); +} + +void Cmd_WeaponTest(edict_t *ent) +{ +#ifndef _DEMO_ + + if(!game.playerSkills.canCheat()) + { // harder difficulty levels won't let you cheat + gi.cprintf (ent, PRINT_HIGH, "Cheats not available.\n"); + return; + } + + sharedEdict_t sh; + + sh.inv = (inven_c *)ent->client->inv; + + if (!sh.inv) + { + gi.dprintf("hey! no inventory!\n"); + return; + } + + sh.edict = ent; + sh.inv->setOwner(&sh); + sh.inv->deactivateCurrentWeapon(); + sh.inv->deactivateInventory(); + + saveInvenRules(sh.inv); + + W_InitInv(*ent); + sh.inv = (inven_c *)ent->client->inv; + sh.edict = ent; + sh.inv->setOwner(&sh); + sendRestartPrediction(ent); + + restoreInvenRules(sh.inv); + sh.inv->rulesSetBestWeaponMode(Info_ValueForKey(ent->client->pers.userinfo,"bestweap")); + + sh.inv->clearInv(false); + + sh.inv->addWeaponType(SFW_KNIFE); + sh.inv->addWeaponType(SFW_PISTOL1); + sh.inv->addWeaponType(SFW_PISTOL2); + sh.inv->addWeaponType(SFW_SHOTGUN); + sh.inv->addWeaponType(SFW_SNIPER); + sh.inv->addWeaponType(SFW_ASSAULTRIFLE); + sh.inv->addWeaponType(SFW_HURTHAND); + sh.inv->addWeaponType(SFW_THROWHAND); + + AddWeaponTypeForPrecache(SFW_KNIFE); + AddWeaponTypeForPrecache(SFW_PISTOL1); + AddWeaponTypeForPrecache(SFW_PISTOL2); + AddWeaponTypeForPrecache(SFW_SHOTGUN); + AddWeaponTypeForPrecache(SFW_SNIPER); + AddWeaponTypeForPrecache(SFW_ASSAULTRIFLE); + AddWeaponTypeForPrecache(SFW_HURTHAND); + AddWeaponTypeForPrecache(SFW_THROWHAND); + + if(!dm->dmRule_INFINITE_AMMO()) + { + sh.inv->addAmmoType(AMMO_9MM, 2000); + sh.inv->addAmmoType(AMMO_KNIFE, 6); + sh.inv->addAmmoType(AMMO_556, 2000); + sh.inv->addAmmoType(AMMO_44, 2000); + sh.inv->addAmmoType(AMMO_SLUG, 2000); + sh.inv->addAmmoType(AMMO_SHELLS, 2000); + sh.inv->addAmmoType(AMMO_ROCKET, 2000); + sh.inv->addAmmoType(AMMO_FTHROWER, 2000); + sh.inv->addAmmoType(AMMO_MWAVE, 2000); + } + + sh.inv->addItem(SFE_GRENADE, 100); + sh.inv->addItem(SFE_LIGHT_GOGGLES, 100); + sh.inv->addItem(SFE_FLASHPACK, 100); + sh.inv->addItem(SFE_C4, 100); + + sh.inv->stockWeapons(); + + pe->PrecacheViewWeaponModels(level.weaponsAvailable); + + sh.inv->selectWeapon(SFW_PISTOL1); +#endif //_DEMO_ +} + +void Cmd_AltWeaponTest(edict_t *ent) +{ +#ifndef _DEMO_ + + if(!game.playerSkills.canCheat()) + { // harder difficulty levels won't let you cheat + gi.cprintf (ent, PRINT_HIGH, "Cheats not available.\n"); + return; + } + + sharedEdict_t sh; + + sh.inv = (inven_c *)ent->client->inv; + + if (!sh.inv) + { + gi.dprintf("hey! no inventory!\n"); + return; + } + + sh.edict = ent; + sh.inv->setOwner(&sh); + sh.inv->deactivateCurrentWeapon(); + sh.inv->deactivateInventory(); + + saveInvenRules(sh.inv); + + W_InitInv(*ent); + sh.inv = (inven_c *)ent->client->inv; + sh.edict = ent; + sh.inv->setOwner(&sh); + sendRestartPrediction(ent); + + restoreInvenRules(sh.inv); + sh.inv->rulesSetBestWeaponMode(Info_ValueForKey(ent->client->pers.userinfo,"bestweap")); + + sh.inv->clearInv(false); + + sh.inv->addWeaponType(SFW_KNIFE); + sh.inv->addWeaponType(SFW_AUTOSHOTGUN); + sh.inv->addWeaponType(SFW_ROCKET); + sh.inv->addWeaponType(SFW_FLAMEGUN); + sh.inv->addWeaponType(SFW_MICROWAVEPULSE); + sh.inv->addWeaponType(SFW_MACHINEPISTOL); + sh.inv->addWeaponType(SFW_MACHINEGUN); + sh.inv->addWeaponType(SFW_HURTHAND); + sh.inv->addWeaponType(SFW_THROWHAND); + + AddWeaponTypeForPrecache(SFW_KNIFE); + AddWeaponTypeForPrecache(SFW_AUTOSHOTGUN); + AddWeaponTypeForPrecache(SFW_ROCKET); + AddWeaponTypeForPrecache(SFW_FLAMEGUN); + AddWeaponTypeForPrecache(SFW_MICROWAVEPULSE); + AddWeaponTypeForPrecache(SFW_MACHINEPISTOL); + AddWeaponTypeForPrecache(SFW_MACHINEGUN); + AddWeaponTypeForPrecache(SFW_HURTHAND); + AddWeaponTypeForPrecache(SFW_THROWHAND); + + if(!dm->dmRule_INFINITE_AMMO()) + { + sh.inv->addAmmoType(AMMO_9MM, 2000); + sh.inv->addAmmoType(AMMO_KNIFE, 6); + sh.inv->addAmmoType(AMMO_556, 2000); + sh.inv->addAmmoType(AMMO_44, 2000); + sh.inv->addAmmoType(AMMO_SLUG, 2000); + sh.inv->addAmmoType(AMMO_SHELLS, 2000); + sh.inv->addAmmoType(AMMO_ROCKET, 2000); + sh.inv->addAmmoType(AMMO_FTHROWER, 2000); + sh.inv->addAmmoType(AMMO_MWAVE, 2000); + } + + sh.inv->addItem(SFE_GRENADE, 100); + sh.inv->addItem(SFE_LIGHT_GOGGLES, 100); + sh.inv->addItem(SFE_FLASHPACK, 100); + sh.inv->addItem(SFE_C4, 100); + + sh.inv->stockWeapons(); + + pe->PrecacheViewWeaponModels(level.weaponsAvailable); + + sh.inv->selectWeapon(SFW_AUTOSHOTGUN); +#endif //_DEMO_ +} + +void Cmd_GiveSniperTutorial(edict_t *ent) +{ +#ifdef _OEM_ + return; +#endif + + if (dm->isDM()) + return; + + sharedEdict_t sh; + + sh.inv = (inven_c *)ent->client->inv; + + if (!sh.inv) + { + gi.dprintf("hey! no inventory!\n"); + return; + } + + sh.edict = ent; + sh.inv->setOwner(&sh); + sh.inv->deactivateCurrentWeapon(); + sh.inv->deactivateInventory(); + + W_InitInv(*ent); + sh.inv = (inven_c *)ent->client->inv; + sh.edict = ent; + sh.inv->setOwner(&sh); + + sendRestartPrediction(ent); + sh.inv->clearInv(true); + + sh.inv->rulesSetWeaponsUseAmmo(-1); + sh.inv->rulesSetWeaponsReload(-1); + sh.inv->rulesSetDropWeapons(0); + sh.inv->rulesSetBestWeaponMode(Info_ValueForKey(ent->client->pers.userinfo,"bestweap")); + + sh.inv->addWeaponType(SFW_SNIPER); + + AddWeaponTypeForPrecache(SFW_SNIPER); + + sh.inv->addAmmoType(AMMO_556, 200); + + sh.inv->stockWeapons(); + + pe->PrecacheViewWeaponModels(level.weaponsAvailable); + + sh.inv->takeOutWeapon(SFW_SNIPER); +} + +void Cmd_GiveMoreTutorial(edict_t *ent) +{ +#ifdef _OEM_ + return; +#endif + + if (dm->isDM()) + return; + + sharedEdict_t sh; + + sh.inv = (inven_c *)ent->client->inv; + + if (!sh.inv) + { + gi.dprintf("hey! no inventory!\n"); + return; + } + + sh.edict = ent; + sh.inv->setOwner(&sh); + sh.inv->deactivateCurrentWeapon(); + sh.inv->deactivateInventory(); + + W_InitInv(*ent); + sh.inv = (inven_c *)ent->client->inv; + sh.edict = ent; + sh.inv->setOwner(&sh); + + sendRestartPrediction(ent); + sh.inv->clearInv(true); + + sh.inv->rulesSetWeaponsUseAmmo(-1); + sh.inv->rulesSetWeaponsReload(-1); + sh.inv->rulesSetDropWeapons(0); + sh.inv->rulesSetBestWeaponMode(Info_ValueForKey(ent->client->pers.userinfo,"bestweap")); + + sh.inv->addWeaponType(SFW_PISTOL2); + + AddWeaponTypeForPrecache(SFW_PISTOL2); + + sh.inv->addAmmoType(AMMO_44, 90); + + sh.inv->stockWeapons(); + + pe->PrecacheViewWeaponModels(level.weaponsAvailable); + + sh.inv->takeOutWeapon(SFW_PISTOL2); +} + +// if a trigger_objectives was activated in this level and we have since checked our objectives screen, this +//command will turn off the "check your objectives" message +void Cmd_TurnOffMissionMsg(edict_t *ent) +{ + if (dm->isDM()) + return; + + level.missionStatus = MISSION_NONE; +} + +// 1/17/99 kef -- this really _should_ be a member of the level_locals_t struct, but adding it would require +//everyone to rebuild the project cuz it'd touch g_local.h +float s_levelStatusBegin = 0; + +void Cmd_TurnOnMissionMsg(edict_t *ent) +{ + if (dm->isDM()) + return; + + level.missionStatus = MISSION_OBJECTIVES; + s_levelStatusBegin = level.time; +} + +// spew all pickups to the console +void Cmd_ListPickups(edict_t *ent) +{ + if(!game.playerSkills.canCheat()) + { // harder difficulty levels won't let you cheat + gi.cprintf (ent, PRINT_HIGH, "Cheats not available.\n"); + return; + } + + thePickupList.DumpList(); +} + +/* +================== +Cmd_Notarget_f + +Sets client to notarget + +argv(0) notarget +================== +*/ + +// because I need this variable for actual game reasons, this silly variable is introduced +int notargglobalcheck = 0; + +void Cmd_Notarget_f (edict_t *ent) +{ + char *msg; + + if(!game.playerSkills.canCheat()) + { // harder difficulty levels won't let you cheat + gi.cprintf (ent, PRINT_HIGH, "Cheats not available.\n"); + return; + } + + ent->flags ^= FL_NOTARGET; + if (!(ent->flags & FL_NOTARGET) ) + { + notargglobalcheck = 0; + msg = "notarget OFF\n"; + } + else + { + notargglobalcheck = 1; + msg = "notarget ON\n"; + } + + gi.cprintf (ent, PRINT_HIGH, msg); +} + + +/* +================== +Cmd_Noclip_f + +argv(0) noclip +================== +*/ +void Cmd_Noclip_f (edict_t *ent) +{ + char *msg; + + if(!game.playerSkills.canCheat()) + { // harder difficulty levels won't let you cheat + gi.cprintf (ent, PRINT_HIGH, "Cheats not available.\n"); + return; + } + + if (ent->movetype == MOVETYPE_NOCLIP) + { + ent->movetype = MOVETYPE_WALK; + msg = "noclip OFF\n"; + } + else + { + ent->movetype = MOVETYPE_NOCLIP; + msg = "noclip ON\n"; + } + + gi.cprintf (ent, PRINT_HIGH, msg); +} + + +/* +================= +Cmd_Kill_f +================= +*/ + +void Cmd_Kill_f (edict_t *ent) +{ + // Can't suicide too soon or while still invulnerable after respawning. + + if(ent->client->flood_nextkill > level.time) + { + gi.SP_Print(ent, GENERAL_TEXT_NOKILL , (short)(ent->client->flood_nextkill - level.time) + 1); + return; + } + + if((level.time - ent->client->respawn_time) < 5) + return; + + if(ent->client->respawn_invuln_time>=level.time) + return; + + // Ensure we can be harmed and set up our means of death and then kill us. + + ent->flags &= ~FL_GODMODE; + ent->health = 0; + meansOfDeath = MOD_SUICIDE; + player_die (ent, ent, ent, 100000, vec3_origin); + + // Don't even bother waiting for death frames before respawning. + + ent->deadflag = DEAD_DEAD; + respawn (ent); + // Set up the next valid suicide time. + ent->client->flood_nextkill = level.time + flood_killdelay->value; +} + +/* +================= +Cmd_KillMonsters_f +================= +*/ + +extern edict_t *last_monster_used; + +void Cmd_KillMonsters_f (edict_t *ent) +{ + if(!game.playerSkills.canCheat()) + { // harder difficulty levels won't let you cheat + gi.cprintf (ent, PRINT_HIGH, "Cheats not available.\n"); + return; + } + + int num = 0; + edict_t *curTest = g_edicts; + + for (curTest = g_edicts; curTest < &g_edicts[globals.num_edicts] ; curTest++) + { + if(!curTest->inuse) + continue; + + if ((curTest->ai)&&(curTest->health >= 0)&&last_monster_used!=curTest) + { + // Do magical damage. + + T_Damage(curTest,ent,ent,vec3_origin,curTest->s.origin,ent->s.origin,100000,0,DAMAGE_NO_PROTECTION,MOD_SUICIDE); + num++; + } + } + + gi.dprintf("killed %d monsters\n",num); +} + +/* +================= +Cmd_PutAway_f +================= +*/ +void Cmd_PutAway_f (edict_t *ent) +{ + ent->client->showscores = false; + ent->client->showhelp = false; + ent->client->showinventory = false; +} + +/* +=================== +Cmd_SpawnEntity_f + +Spawn an entity. +=================== +*/ + +extern char *ED_NewString (char *string); + +void Cmd_SpawnEntity_f(edict_t *ent) +{ + if(!game.playerSkills.canCheat()) + { // harder difficulty levels won't let you cheat + gi.cprintf (ent, PRINT_HIGH, "Cheats not available.\n"); + return; + } + + edict_t *newent; + vec3_t forward,up; + + gi.cprintf(ent, PRINT_HIGH, "Spawning : %s\n", gi.argv(1)); + + newent = G_Spawn(); + newent->classname = ED_NewString(gi.argv(1)); + AngleVectors(ent->s.angles, forward, NULL, up); + VectorScale(forward, 100, forward); + VectorScale(up, 50, up); + VectorAdd(ent->s.origin, forward, newent->s.origin); + VectorAdd(newent->s.origin, up, newent->s.origin); + newent->s.angles[YAW]=ent->s.angles[YAW]; + ED_CallSpawn(newent); +} + +void Cmd_Go(edict_t *ent) +{ + if(!game.playerSkills.canCheat()) + { // harder difficulty levels won't let you cheat + gi.cprintf (ent, PRINT_HIGH, "Cheats not available.\n"); + return; + } + + vec3_t v; + + v[0] = atof(gi.argv(1)); + v[1] = atof(gi.argv(2)); + v[2] = atof(gi.argv(3)); + + VectorCopy(v, level.sight_client->s.origin); +} + +int PlayerSort (void const *a, void const *b) +{ + int anum, bnum; + + anum = *(int *)a; + bnum = *(int *)b; + + anum = g_edicts[anum].client->ps.stats[STAT_FRAGS]; + bnum = g_edicts[bnum].client->ps.stats[STAT_FRAGS]; + + if (anum < bnum) + return -1; + if (anum > bnum) + return 1; + return 0; +} + +/* +================= +Cmd_Players_f +================= +*/ +void Cmd_Players_f (edict_t *ent) +{ + int i; + int count; + char small[64]; + char large[1280]; + int index[256]; + edict_t *e; + + count = 0; + for (i = 1 ; i < (int)maxclients->value ; i++) + { + e = &g_edicts[i]; + if (e->inuse && e->client->pers.connected) + { + index[count] = i; + count++; + } + } + + // sort by frags + qsort (index, count, sizeof(index[0]), PlayerSort); + + // print information + large[0] = 0; + + for (i = 0 ; i < count ; i++) + { + Com_sprintf (small, sizeof(small), "%3i %s %s\n", + g_edicts[index[i]].client->ps.stats[STAT_FRAGS], + g_edicts[index[i]].client->pers.netname, + Info_ValueForKey (g_edicts[index[i]].client->pers.userinfo, "ip")); + if (strlen (small) + strlen(large) > sizeof(large) - 100 ) + { // can't print all of them in one packet + strcat (large, "...\n"); + break; + } + strcat (large, small); + } + + gi.cprintf (ent, PRINT_HIGH, "%s\n%i players\n", large, count); +} + +/* +================= +Cmd_Wave_f +================= +*/ +void Cmd_Wave_f (edict_t *ent) +{ + int i; + + i = atoi (gi.argv(1)); + + // Can't wave when ducked. + if (ent->client->ps.pmove.pm_flags & PMF_DUCKED) + return; + + if (ent->client->anim_priority > ANIM_WAVE) + return; + + PB_PlaySequenceForGesture(ent, i); + // FIXME: ok, do waving here. +} + +/* +================== +Cmd_TeamView_f +================== +*/ +void Cmd_TeamView_f(edict_t *ent) +{ + char *p; + int teamMember; + + if (gi.argc () < 2) + return; + + p = gi.args(); + + if (*p == '"') + { + p++; + p[strlen(p)-1] = 0; + } + + teamMember=atoi(p); + ent->client->MercCameraNumber=teamMember; + + if(teamMember==0) + { + // Selected self again so switch to 1st person camera view. + + ent->client->CameraIs3rdPerson=false; + ent->client->ps.remote_type = REMOTE_TYPE_FPS; + } + else + { + // Selected one of your team-members so say we want to switch to 3rd person camera view. + + ent->client->CameraIs3rdPerson=true; + ent->client->ps.remote_type = REMOTE_TYPE_TPS; + } +} + +/* +================== +Cmd_Say_f +================== +*/ +#define CHAT_LIMIT 150 + +void Cmd_Say_f (edict_t *ent, qboolean team, qboolean arg0) +{ + int j; + edict_t *other; + char *p; + char text[2048]; + char text2[2048]; + int color; + + if (gi.argc () < 2 && !arg0) + return; + + if(!dm->dmRule_TEAMPLAY()) + team = false; + + // delimit the string if we are normal play talking, so we don't send the name with it + Com_sprintf (text2, sizeof(text), "%s: ", ent->client->pers.netname); + text[0] = 0; + + if (arg0) + { + strcat (text, gi.argv(0)); + strcat (text, " "); + strcat (text, gi.args()); + + strcat (text2, gi.argv(0)); + strcat (text2, " "); + strcat (text2, gi.args()); + } + else + { + p = gi.args(); + + if (*p == '"') + { + p++; + p[strlen(p)-1] = 0; + } + strcat(text, p); + + strcat(text2, p); + + } + + // don't let text be too long for malicious reasons + if ((strlen(text) > CHAT_LIMIT) || (strlen(text2) > CHAT_LIMIT)) + gi.cprintf(ent, PRINT_HIGH, "Chat string too long - truncated to 150 chars\n"); + + if (strlen(text) > CHAT_LIMIT) + text[CHAT_LIMIT] = 0; + + if (strlen(text2) > CHAT_LIMIT) + text2[CHAT_LIMIT] = 0; + + + strcat(text, "\n"); + strcat(text2, "\n"); + + if (CheckFlood(ent)) + return; + + if (dedicated->value) + gi.cprintf(NULL, PRINT_CHAT, "%s", text2); + + for (j = 1; j <= game.maxclients; j++) + { + color = 0; + other = &g_edicts[j]; + if (!other->inuse) + continue; + if (!other->client) + continue; + if (team) + { + color = 1; + if (!OnSameTeam(ent, other)) + continue; + } + + gi.clprintf(other,ent, color, "%s", text); + } +} + + +/* +================== +Cmd_PlayerList_f + +Connect time, ping, score, name etc. +================== +*/ + +void Cmd_PlayerList_f(edict_t *ent) +{ + int i; + char st[80], + text[1400]; + edict_t *e2; + + *text = 0; + + for(i=0, e2=g_edicts+1; i<(int)maxclients->value; i++, e2++) + { + if(!e2->inuse) + continue; + + sprintf(st,"%02d:%02d %4d %3d %s%s\n", + (level.framenum - e2->client->resp.enterframe) / 600, + ((level.framenum - e2->client->resp.enterframe) % 600)/10, + e2->client->ping, + e2->client->resp.score, + e2->client->pers.netname, + e2->client->resp.spectator ? " (spectator)" : ""); + + if (strlen(text) + strlen(st) > sizeof(text) - 50) + { + sprintf(text+strlen(text), "And more...\n"); + //FIXME: +// gi.cprintf(ent, PRINT_HIGH, "%s", text); + return; + } + + strcat(text, st); + } + + //FIXME: +// gi.cprintf(ent, PRINT_HIGH, "%s", text); +} + +/* +================== +Cmd_EntList +================== +*/ + +typedef struct entList_s +{ + int count; + char buffer[256]; +}entList_t; + +void Cmd_EntList(edict_t *ent2) +{ + if(!game.playerSkills.canCheat()) + { // harder difficulty levels won't let you cheat + gi.cprintf (ent2, PRINT_HIGH, "Cheats not available.\n"); + return; + } + + list groups; + list::iterator curCheck; + + entList_t newList; + + edict_t *ent = &g_edicts[0]; + for (int i=0 ; iinuse)continue; + + strcpy(newList.buffer, ent->classname); + newList.count = 1; + + int found = 0; + + if(groups.size()) + { + + for(curCheck = groups.begin(); (curCheck != groups.end())&&(!found); curCheck++) + { + if(!strcmp((*curCheck).buffer, newList.buffer)) + { + (*curCheck).count++; + found = 1; + } + else if(strcmp((*curCheck).buffer, newList.buffer) > 0) + { //insert in proper alphabetical order + groups.insert(curCheck, newList); + found = 1; + } + } + } + else + { + curCheck = groups.end(); + groups.insert(curCheck, newList); + } + } + + if(groups.size()) + { + int funcs = 0; + int monsters = 0; + int total = 0; + + Com_Printf("Size Type\n"); + Com_Printf("---- --------------------------------------------------\n"); + for(curCheck = groups.begin(); curCheck != groups.end(); curCheck++) + { + Com_Printf("%4.d %s\n", (*curCheck).count, (*curCheck).buffer); + total += (*curCheck).count; + if(!strncmp((*curCheck).buffer, "func", 4))funcs += (*curCheck).count; + if(!strncmp((*curCheck).buffer, "monster", 7))monsters += (*curCheck).count; + } + Com_Printf("---- --------------------------------------------------\n"); + Com_Printf("%.4d Monsters\n", monsters); + Com_Printf("%.4d Funcs\n", funcs); + Com_Printf("%.4d Total\n", total); + } + groups.clear(); + +} + +void G_GetGameStats(void); + +void Cmd_UpdateInvenFinal(edict_t *ent) +{ + if(!dm->isDM()) + { // let the server know what kind of goodies we're coming out of here with - yeah! + + level.cashEarned += gi.cvar_variablevalue("stat_moneyadd"); + gi.cvar_setvalue("stat_moneyadd", 0.0f); + + //this should set everything up properly so we can retrieve these next level + G_GetGameStats(); + + sharedEdict_t sh; + + sh.inv = (inven_c *)g_edicts[1].client->inv; + + if (sh.inv) + { + sh.edict = &g_edicts[1]; + sh.inv->setOwner(&sh); + sh.inv->buildInvForMenu(1, ent->health); + } + + //also add in our stats + game.guysKilled += level.guysKilled; + game.friendliesKilled += level.friendliesKilled; + + game.throatShots += level.throatShots; + game.nutShots += level.nutShots; + game.headShots += level.headShots; + game.gibs += level.gibs; + + game.savesUsed += level.savesUsed; + game.cashEarned += level.cashEarned; + game.playedTime += level.time - level.startTime; + + level.guysKilled = 0; + level.friendliesKilled = 0; + + level.throatShots = 0; + level.nutShots = 0; + level.headShots = 0; + level.gibs = 0; + + level.savesUsed = 0; + level.cashEarned = 0; + level.time = 0; + level.startTime = 0; + } +} + +/* +================= +ClientCommand +================= +*/ + +void ClientCommand (edict_t *ent) +{ + char *cmd; + + if (!ent->client) + { + // Not fully in game yet. + + return; + } + + cmd = gi.argv(0); + + if (stricmp (cmd, "players") == 0) + { + Cmd_Players_f (ent); + return; + } + + if (stricmp (cmd, "say") == 0) + { + Cmd_Say_f (ent, false, false); + return; + } + + if (stricmp (cmd, "say_team") == 0) + { + Cmd_Say_f (ent, true, false); + return; + } + + if (stricmp (cmd, "score") == 0) + { + Cmd_Score_f (ent); + return; + } + + if (stricmp (cmd, "help") == 0) + { + Cmd_Help_f (ent); + return; + } + + if (level.intermissiontime) + return; + + if (ent->client->ps.cinematicfreeze) + return; + + if(!ent->client->resp.spectator) + if(ent->client->inv && ent->client->inv->addCommand(cmd)) + return; + + if(!aiList && ((!stricmp(cmd, "loadpoint"))||(!stricmp(cmd, "destroyents")))) + { + aiList = new CAIListData;//er, where does this get killed? + } + + if(aiList && aiList->usesCmd(ent, cmd)) + return; + + if (stricmp (cmd, "playlevel") == 0) + { + Cmd_Playlevel_f(ent); + return; + } + + if (stricmp (cmd, "elbow") == 0) +// if (stricmp (cmd, "weapontest") == 0) + { + Cmd_WeaponTest(ent); + return; + } + + if (stricmp (cmd, "bigelbow") == 0) +// if (stricmp (cmd, "altweapontest") == 0) + { + Cmd_AltWeaponTest(ent); + return; + } + + if (stricmp (cmd, "defaultweapons") == 0) + { + Cmd_DefaultWeapons(ent); + return; + } + + if (stricmp (cmd, "updateinvfinal") == 0) + { + Cmd_UpdateInvenFinal(ent); + return; + } + + if(stricmp (cmd, "go") == 0) + { + Cmd_Go(ent); + return; + } + + if (stricmp (cmd, "heretic") == 0) +// if (stricmp (cmd, "god") == 0) + Cmd_God_f (ent); + else if (stricmp (cmd, "ninja") == 0) +// else if (stricmp (cmd, "notarget") == 0) + Cmd_Notarget_f (ent); + else if (stricmp (cmd, "phantom") == 0) +// else if (stricmp (cmd, "noclip") == 0) + Cmd_Noclip_f (ent); + else if (stricmp (cmd, "kill") == 0) + Cmd_Kill_f (ent); + else if (stricmp (cmd, "killallmonsters") == 0) + Cmd_KillMonsters_f (ent); + else if (stricmp (cmd, "putaway") == 0) + Cmd_PutAway_f (ent); + else if (stricmp (cmd, "wave") == 0) + Cmd_Wave_f (ent); + else if (stricmp (cmd, "gimme") == 0) +// else if (stricmp (cmd, "spawn") == 0) + Cmd_SpawnEntity_f (ent); + else if (stricmp (cmd, "teamview") == 0) + Cmd_TeamView_f (ent); + else if (stricmp (cmd, "playerlist") == 0) + Cmd_PlayerList_f(ent); + else if (stricmp (cmd, "entlist") == 0) + Cmd_EntList(ent); + else if (stricmp (cmd, "givesnipertutorial") == 0) + { + Cmd_GiveSniperTutorial(ent); + } + else if (stricmp (cmd, "givemoretutorial") == 0) + { + Cmd_GiveMoreTutorial(ent); + } + else if (stricmp (cmd, "turnoffmissionmsg") == 0) + { + Cmd_TurnOffMissionMsg(ent); + } + else if (stricmp (cmd, "turnonmissionmsg") == 0) + { + Cmd_TurnOnMissionMsg(ent); + } + else if (stricmp (cmd, "listpickups") == 0) + { + Cmd_ListPickups(ent); + } + else + { + // Anything that doesn't match a command will be a chat. + + Cmd_Say_f (ent, false, true); + } +} diff --git a/Source/Game/gamecpp/g_combat.cpp b/Source/Game/gamecpp/g_combat.cpp new file mode 100644 index 0000000..95aadb7 --- /dev/null +++ b/Source/Game/gamecpp/g_combat.cpp @@ -0,0 +1,772 @@ +// g_combat.c + +#include "g_local.h" +#include "q_sh_interface.h" +#include "p_body.h" + +typedef struct +{ + char *name; +} damageBoltName_t; + +damageBoltName_t damageBoltList[] = +{ +"ABOLT_SHOULDER_R", +"ABOLT_SHOULDER_L", +"GBOLT_GUT_F", +"GBOLT_GROIN", +"GBOLT_CAP_RCALF_RTHIGH", +"GBOLT_CAP_LCALF_LTHIGH", +"GBOLT_CAP_RFOREARM_RBICEP", +"GBOLT_CAP_LFOREARM_LBICEP", +"WBOLT_HAND_R", +"WBOLT_HAND_L", +}; + +typedef enum +{ + BOLT_SHOULDER_R = 0, + BOLT_SHOULDER_L, + BOLT_GUT, + BOLT_GROIN, + BOLT_CAP_RCALF_RTHIGH, + BOLT_CAP_LCALF_LTHIGH, + BOLT_CAP_FOREARM_RBICEPT, + BOLT_CAP_FOREARM_LBICEPT, + BOLT_HAND_R, + BOLT_HAND_L, + MAX_BOLTS +}; + +/* +============ +CanDamage + +Returns true if the inflictor can directly damage the target. Used for explosions +and melee attacks. +============ +*/ + +qboolean CanDamage (edict_t *targ, edict_t *inflictor) +{ + vec3_t dest; + trace_t trace; + + // bmodels need special checking because their origin is (0,0,0). + + if (targ->solid == SOLID_BSP) + { + VectorAdd (targ->absmin, targ->absmax, dest); + VectorScale (dest, 0.5, dest); + gi.trace (inflictor->s.origin, vec3_origin, vec3_origin, dest, inflictor, MASK_OPAQUE, &trace); + if (trace.fraction == 1.0) + return true; + if (trace.ent == targ) + return true; + return false; + } + + gi.trace (inflictor->s.origin, vec3_origin, vec3_origin, targ->s.origin, inflictor, MASK_OPAQUE, &trace); + if (trace.fraction == 1.0) + return true; + + VectorCopy (targ->s.origin, dest); + dest[0] += 15.0; + dest[1] += 15.0; + gi.trace (inflictor->s.origin, vec3_origin, vec3_origin, dest, inflictor, MASK_OPAQUE, &trace); + if (trace.fraction == 1.0) + return true; + + VectorCopy (targ->s.origin, dest); + dest[0] += 15.0; + dest[1] -= 15.0; + gi.trace (inflictor->s.origin, vec3_origin, vec3_origin, dest, inflictor, MASK_OPAQUE, &trace); + if (trace.fraction == 1.0) + return true; + + VectorCopy (targ->s.origin, dest); + dest[0] -= 15.0; + dest[1] += 15.0; + gi.trace (inflictor->s.origin, vec3_origin, vec3_origin, dest, inflictor, MASK_OPAQUE, &trace); + if (trace.fraction == 1.0) + return true; + + VectorCopy (targ->s.origin, dest); + dest[0] -= 15.0; + dest[1] -= 15.0; + gi.trace (inflictor->s.origin, vec3_origin, vec3_origin, dest, inflictor, MASK_OPAQUE, &trace); + if (trace.fraction == 1.0) + return true; + + return false; +} + +/* +============ +Killed--should NEVER be called for creatures--handled by their ai +============ +*/ + +void Killed (edict_t *targ, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + if (targ->health < -999) + targ->health = -999; + + targ->enemy = attacker; + + //this drops the weapon a player's holding + if (targ->client) + { + PB_Killed(targ); + } + + // DOTHIS - add dollar value to player's dollarValue. should we do it directly or + + + // FIXME - is there something missing here? The IF code is the same as the fallthrough code + + if (targ->movetype == MOVETYPE_PUSH || targ->movetype == MOVETYPE_STOP || targ->movetype == MOVETYPE_NONE) + { + // Doors, triggers, etc.. + + if (targ->die) + targ->die (targ, inflictor, attacker, damage, point); + return; + } + + if (targ->die) + targ->die (targ, inflictor, attacker, damage, point); +} + +qboolean CheckTeamDamage (edict_t *targ, edict_t *attacker) +{ + //FIXME make the next line real and uncomment this block + // if ((ability to damage a teammate == OFF) && (targ's team == attacker's team)) + return(false); +} + + +void DamageKnockBack(edict_t *targ, int dflags, int knockback, vec3_t dir) +{ + if (targ->flags & FL_NO_KNOCKBACK) + return; + + if (dflags & DAMAGE_NO_KNOCKBACK) + return; + + if (!knockback) + return; + + if ((targ->movetype != MOVETYPE_NONE) && (targ->movetype != MOVETYPE_BOUNCE) && + (targ->movetype != MOVETYPE_PUSH) && (targ->movetype != MOVETYPE_STOP)) + { + float mass; + vec3_t kvel, dir2; + + if (targ->mass < 50) + mass = 50; + else + mass = targ->mass; + + VectorCopy(dir, dir2); // Since we're messing with the dir, don't screw up the one we're passing by reference. + if (dflags & DAMAGE_ALL_KNOCKBACK) + { + dir2[2] *= 0.1; // The flying up in the air thing is a bit much. Tone down the vertical push significantly. + } + else + { + dir2[2] *= 0.25; + } + VectorNormalize(dir2); + VectorScale (dir2, 250.0 * (float)knockback / mass, kvel); + VectorAdd (targ->velocity, kvel, targ->velocity); + } +} + + +void ClientDamageKnockBack(edict_t *player, edict_t *attacker, int dflags, float knockback, vec3_t dir) +{ + if (player->flags & FL_NO_KNOCKBACK) + return; + + if (dflags & DAMAGE_NO_KNOCKBACK) + return; + + if (!knockback) + return; + + vec3_t v; + float kbtime; + + // If this is a player, then we might have to force things a bit, mainly for the concussion grenade. + if (dflags & DAMAGE_ALL_KNOCKBACK || attacker==NULL) + { // Turn off his friction for a second. + vec3_t dir2; + + VectorCopy(dir, dir2); + dir2[2] *= 0.10; // The flying up in the air thing is a bit much. + VectorNormalize(dir2); + + VectorScale (dir2, 1000.0 * (float)knockback / player->mass, v); + VectorAdd (player->velocity, v, player->velocity); + + // Safeguard to prevent rocket jumping. + if (player->velocity[2] > 200) + player->velocity[2] = 200; + + kbtime = knockback / player->mass; + player->client->friction_time = level.time + 0.5 + kbtime*0.75; + } + else + { + VectorSubtract(attacker->s.origin, player->client->damage_from, v); + VectorNormalize(v); + VectorScale (v, 250.0 * (float)knockback / player->mass, v); + v[2] *= 0.25; // The flying up in the air thing is a bit much. + VectorSubtract(player->velocity, v, player->velocity); + VectorSubtract(player->intend_velocity, v, player->intend_velocity); + } +} + +/* +============ +T_Damage + +targ entity that is being damaged, e.g. monster. +inflictor entity that is causing the damage, e.g. rocket. +attacker entity that caused the inflictor to damage, e.g. player. +dir direction of the attack. +point point at which the damage is being inflicted. +damage amount of damage being inflicted. +knockback force to be applied against targ as a result of the damage. +dflags these flags are used to control how T_Damage works. +mod the means of death (should the target of the damage happen to die). +============ +*/ + +#define MAX_BODY_DAMAGE 10 + +void T_Damage (edict_t *targ, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb) +{ + gclient_t *client; + int take; +// int bodydmg; + Matrix4 ZoneMatrix; + vec3_t vec_to_other; + float dirToFace,holdDir; + vec3_t myfacing; + int armorStop = 0; + bool bInCameraMode = (g_edicts[1].client && (REMOTE_TYPE_CAMERA == g_edicts[1].client->RemoteCameraType) ); + +// vec3_t boltPos[MAX_BOLTS]; +// int i; + + if ( (targ->takedamage == DAMAGE_NO) || + ((targ->takedamage == DAMAGE_YES_BUT_NOT_IN_CAMERA) && bInCameraMode) ) + { + // kef -- DAMAGE_YES_BUT_NOT_IN_CAMERA is here so that you can't destroy a breakable brush + //while viewing through a camera + return; + } +// if(!dm->canDamage(edict_t *targ, edict_t *inflictor, edict_t *attacker)) +// return; + + // Adjust damage so monsters don't hurt players too much, but let 'em hurt + // each other plenty. + + if (attacker && attacker->ai && targ->client) + { + if(nodamage->value==1) + { + damage = 1+(1.0/game.playerSkills.getPlayerDamageMod()); + } + else + { + damage = (int)((float)damage*0.5); + } + } + + // Extra meaning to nodamage to let monsters last longer against each other. + // If attacker is monster, and target is either monster or human, reduce damage. + + if (nodamage->value==2&&((attacker && attacker->ai) && (targ->client || targ->ai))) + { + damage = 0; + } + + if (targ->ai) + { + // kef -- I'm sorry to have to do this, but Sabre needs to be invincible if his count isn't 100 + // dpk -- woo hoo, Dekker too! + bool bSabre = targ->classname && (0 == strcmp("m_x_mskinboss", targ->classname)); + bool bDekker = targ->classname && ((0 == strcmp("m_x_mraiderboss1", targ->classname))); + + if ((!bSabre && !bDekker) || (targ->count == 100)) + { + int prehealth = targ->health; + + targ->ai->Damage(*targ,inflictor,attacker,dir,point,origin,damage,knockback,dflags,mod, penetrate, absorb); + } + return; + } + + if(targ->flags & FL_LEAN_PLAYER) + { + if(!(targ = targ->owner)) + return; + } + + // ACHTUNG!!!! Assuming everything that gets past here is not a monster + // (they should ALL have ais)!!! + + // Friendly fire avoidance... if enabled you can't hurt teammates (but you + // can hurt yourself). Knockback still occurs. + + if ((targ != attacker) && dm->isDM() && dm->dmRule_TEAMPLAY()) + { + if (OnSameTeam (targ, attacker)) + { + if(dm->dmRule_NO_FRIENDLY_FIRE()) + { + // No actual damage or damage effects like blood... we only want + // the knockback effect. + + damage = 0; + dflags|=DAMAGE_NO_TEAMDAMAGE; + } + else + mod |= MOD_FRIENDLY_FIRE; + } + } + + meansOfDeath = mod; + + client = targ->client; + + // 12/30/99 kef -- it seemed wholly unreasonable to be checking the skill level of the game in deathmatch + if(client && !dm->isDM()) + { + int newDmg = (int)((float)damage * (float)game.playerSkills.getPlayerDamageMod()); + + if ((damage > 0) && (newDmg < 1)) + { + damage = 1; + } + else + { + damage = newDmg; + } + } + + VectorNormalize(dir); + + // Player knockback will be handled when player damage is handled in P_DamageFeedback(), + // so just deal with knockback for non-player entities. + + if (!client) + { + DamageKnockBack(targ, dflags, knockback, dir); + } + + // Check for godmode... + + if ( (targ->flags & FL_GODMODE) && !(dflags & DAMAGE_NO_PROTECTION) ) + { + // ...and we are in godmode, so set the damage to zero. + + take = 0; + } + else if (client) + { + // Teamplay and temporary invulnerability (on respawn) can prevent damage + // being applied, but DAMAGE_NO_PROTECTION (e.g. as in telefragging, will + // always inflict damage). + + if(((!(dflags&DAMAGE_NO_TEAMDAMAGE)||(!OnSameTeam(targ,attacker))) && (client->respawn_invuln_time 0) + { + client->damage_blood += take; + client->damage_knockback += knockback; + + // Spray some blood. + + vec3_t newDir; + + VectorScale(dir, -1.0, newDir); + if (mod != MOD_FIRE) + { + FX_MakeBloodSpray(point, dir, 200, (!(rand()%6)) ? 1:0, targ); + } + + // Add knockback effect. + + VectorCopy (point, client->damage_from); + ClientDamageKnockBack(targ,attacker,dflags,knockback,dir); + } + else if (!(targ->flags & FL_GODMODE)) + { // If no damage taken, still knock back. + client->damage_knockback += knockback; + + // Add knockback effect. + + VectorCopy (point, client->damage_from); + ClientDamageKnockBack(targ,attacker,dflags,knockback,dir); + } + + + client->damage_armor += armorStop; + } + + // Actually do the damage. + + if (take) + { + targ->health -= take; + + // clever stuff for force feedback + if (client) + { + if (mod & (MOD_KNIFE_SLASH|MOD_KNIFE_THROWN)) + { + fxRunner.exec("lighthit",targ); + } + else + if (mod & (MOD_PISTOL1|MOD_PISTOL2|MOD_MPISTOL|MOD_ASSAULTRIFLE|MOD_SNIPERRIFLE|MOD_AUTOSHOTGUN|MOD_SHOTGUN|MOD_MACHINEGUN|MOD_MPG|MOD_FLAMEGUN)) + { + fxRunner.exec("gotshot",targ); + } + else + if ((mod & (MOD_C4|MOD_EXPLOSIVE|MOD_ROCKET|MOD_ROCKET_SPLASH|MOD_PHOS_GRENADE|MOD_GRENADE|MOD_CONC_GRENADE)) + && (take > 5)) + { + // try mixing effects + fxRunner.exec("exphit",targ); + fxRunner.exec("land",targ); + } + } + + if (targ->health <= 0) + { + if (client) + targ->flags |= FL_NO_KNOCKBACK; + + if(targ->respawnFunc) + { + InitiateRespawn(targ); + } + + Killed (targ, inflictor, attacker, take, point); + + return; + } + } + + if(!client) + { + if (targ->pain) + targ->pain (targ, attacker, knockback, take, point); + } + + // Add to the damage inflicted on a player this frame. The total will be + // turned into screen blends and view angle kicks at the end of the frame. + + + // FIXME: some T_Damage calls get 0,0,0 passed to them as damage location... + // should address this!!! + + // Hit damage location. + + if (client) + { + vec3_t bodyloc; + + if (!point[0] && !point[1] && !point[2]) + { + Com_Printf("Error: T_Damage - NULL location passed\n"); + return; + } + + // Something from all over? + + if ((dflags & DT_WATER) || (dflags & DT_FIRE) || (dflags & DT_FALL)) + { + if (dflags & DT_FALL) + client->ps.damageDir = CLDAM_B_BRACKET; + else + client->ps.damageDir = CLDAM_ALL_BRACKET; + + // All damaged. +// client->ps.damageLoc = CLDAM_HEAD | CLDAM_L_ARM | CLDAM_L_LEG | CLDAM_R_ARM | CLDAM_R_LEG | CLDAM_TORSO; + } + else + { + VectorSubtract(point, targ->s.origin, bodyloc); + +/* for (i=0;ighoulInst->GetBoltMatrix(level.time,ZoneMatrix,targ->ghoulInst->GetGhoulObject()->FindPart(damageBoltList[i].name),IGhoulInst::MatrixType::Entity); + ZoneMatrix.GetRow(3,*(Vect3*)boltPos[i]); + } + + // This needs to be expanded to look at all bolts. + if (point[2] > boltPos[BOLT_SHOULDER_R][2]) // Head shot + { + client->ps.damageLoc = CLDAM_HEAD; + } + else + client->ps.damageLoc = CLDAM_TORSO; +*/ + if (attacker) + { + VectorSubtract(attacker->s.origin,targ->s.origin,vec_to_other); + vectoangles(vec_to_other,myfacing); + dirToFace = anglemod(myfacing[YAW]); + holdDir = dirToFace - targ->s.angles[YAW]; + holdDir = anglemod(holdDir); + + if ((holdDir < 30) || (holdDir > 340)) + { + // In front. + + client->ps.damageDir = CLDAM_ALL_BRACKET; + } + else if ((holdDir > 150) && (holdDir < 210)) + { + // Behind you. + + client->ps.damageDir = CLDAM_ALL_BRACKET; + } + else if (holdDir < 180) + { + // To left. + + client->ps.damageDir = CLDAM_L_BRACKET; + } + else + { + // To right. + + client->ps.damageDir = CLDAM_R_BRACKET; + } + + // I'm assuming this is the best place to put this - I want to do this DMrule if we have just been hit + // but not killed by someone else. + if (dm->isDM()) + dm->HitByAttacker(targ, attacker); + + } + + VectorSubtract(point, targ->s.origin, bodyloc); + } + } + + if (client) + { + if((take > 10) || (targ->health < 25)) + SetActionMusic(*targ); + } +} + +/* +============ +T_RadiusDamage + +T_RadiusDamage does (damage) points of damage at inflictor_origin distance and falls off +linearly until (radius) distance from this point. +============ +*/ +int hackGlobalGibCalls; + +void T_RadiusDamage (edict_t *inflictor, edict_t *attacker, float damage, edict_t *ignore, float radius, int mod, int dflags) +{ + float points; + edict_t *ent = NULL; + vec3_t v; + vec3_t dir; + vec3_t inflictor_origin; + vec3_t hitOrg; + float len; + trace_t tr; + +// This computes a pseudo origin for bmodels, such as func_breakable_brush, which +// don't have an origin. + FindCorrectOrigin(inflictor, inflictor_origin); + +// look for targets within (radius) from inflictor_origin + + CRadiusContent rad(inflictor_origin, radius); + + hackGlobalGibCalls = 0; + + for(int i = 0; i < rad.getNumFound(); i++) + { + ent = rad.foundEdict(i); + + if (ent == ignore)continue; + if (!ent->takedamage || ent->gibbed)continue; + if(ent == world)continue; + if(ent->svflags & SVF_BUDDY)continue;//these are only affected by direct damage + + FindCorrectOrigin(ent, hitOrg); + + VectorSubtract (inflictor_origin, hitOrg, v); + + len = VectorLength(v); + + if(len > radius)continue; + + // This is a strange thing, but basically if you're already on fire, you shouldn't get burned by other guys. + if (mod == MOD_FIRE && ent->burntime > level.time) + continue; + + points = damage * (1.0 - (len / radius)); + if (CanDamage (ent, inflictor)) + { + gi.trace (inflictor_origin, NULL, NULL, hitOrg, inflictor, CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_DEADMONSTER, &tr); + VectorSubtract (tr.endpos , inflictor_origin, dir); + if (dflags & DAMAGE_ALL_KNOCKBACK) + { + T_Damage (ent, inflictor, attacker, dir, tr.endpos, inflictor_origin, (int)points*0.05, (int)points, DAMAGE_RADIUS|dflags, mod); + } + else + { + T_Damage (ent, inflictor, attacker, dir, tr.endpos, inflictor_origin, (int)points, (int)points, DAMAGE_RADIUS|dflags, mod); + } + } + + } +} + +/* +============ +T_RadiusDamage2 + +T_RadiusDamage2 does (maxdamage) points of damage to anything that overlaps the (damagepoint), +scaled down to (mindamage) at (damageradius) distance from the center. +============ +*/ +#define MAX_TARGET_RADIUS 16 +void T_RadiusDamage2 (edict_t *inflictor, edict_t *attacker, vec3_t damagepoint, float maxdamage, float mindamage, + float damageradius, edict_t *ignore, int mod, int dflags) +{ + float points; + edict_t *ent = NULL; + vec3_t v; + vec3_t dir; + vec3_t hitOrg; + float len; + trace_t tr; + + CRadiusContent rad(damagepoint, damageradius); + + hackGlobalGibCalls = 0; + + for(int i = 0; i < rad.getNumFound(); i++) + { + ent = rad.foundEdict(i); + + if (ent == ignore)continue; + if (!ent->takedamage || ent->gibbed)continue; + if(ent == world)continue; + if(ent->svflags & SVF_BUDDY)continue;//these are only affected by direct damage + + FindCorrectOrigin(ent, hitOrg); + + VectorSubtract (damagepoint, hitOrg, v); + + len = VectorLength(v); + + points = mindamage + (maxdamage-mindamage) * (1.0 - (len / damageradius)); + + if (CanDamage (ent, inflictor)) + { + gi.trace (damagepoint, NULL, NULL, hitOrg, inflictor, CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_DEADMONSTER, &tr); + VectorSubtract (tr.endpos , damagepoint, dir); + if (dflags & DAMAGE_ALL_KNOCKBACK) + { + T_Damage (ent, inflictor, attacker, dir, tr.endpos, damagepoint, (int)points*0.05, (int)points, DAMAGE_RADIUS|dflags, mod); + } + else + { + T_Damage (ent, inflictor, attacker, dir, tr.endpos, damagepoint, (int)points, (int)points, DAMAGE_RADIUS|dflags, mod); + } + } + } +} + +/* +============ +T_ConeDamage + +Range should be the minimum allowed dotproduct - it defines the cone... +============ +*/ + +void T_ConeDamage(edict_t *inflictor, edict_t *attacker, float damage, edict_t *ignore, float radius, int mod, vec3_t coneDir, float range) +{ + float points; + edict_t *ent = NULL; + vec3_t v; + vec3_t inflictOrg, hitOrg; + vec3_t dir; + float len; + float dotVal; + + FindCorrectOrigin(inflictor, inflictOrg); + +// look for targets within (radius) from inflictor_origin + CRadiusContent rad(inflictOrg, radius); + + for(int i = 0; i < rad.getNumFound(); i++) + { + ent = rad.foundEdict(i); + + if (ent == ignore)continue; + if (!ent->takedamage)continue; + if (ent == world)continue; + + FindCorrectOrigin(ent, hitOrg); + VectorSubtract (hitOrg, inflictOrg, v); + len = VectorNormalize(v); + + if(len > radius)continue; + + VectorCopy(coneDir, dir); + VectorNormalize(dir); + dotVal = DotProduct(v, dir); + + if(dotVal < range)continue; + + points = damage * (1.0 - (len / radius));//position in cone should dictate damage too... + points *= (dotVal - range)/(1.0 - range); + if (CanDamage (ent, inflictor)) + { + VectorSubtract (ent->s.origin, inflictOrg, dir); + T_Damage (ent, inflictor, attacker, dir, inflictOrg, inflictOrg, (int)points, (int)points, DAMAGE_RADIUS, mod); + } + } +} \ No newline at end of file diff --git a/Source/Game/gamecpp/g_econ.cpp b/Source/Game/gamecpp/g_econ.cpp new file mode 100644 index 0000000..eecc0d0 --- /dev/null +++ b/Source/Game/gamecpp/g_econ.cpp @@ -0,0 +1,963 @@ +#include "g_local.h" +#include "Module.h" +#include "Tokenizer.h" + +// **** STUFF FOR TOKENIZER **** + +extern keywordArray_t Keywords[]; +extern keywordArray_t Symbols[]; + +enum +{ + // Keywords + TK_MONSTERS = TK_USERDEF, + TK_MONSTER, + TK_LOCATION, + TK_NAME, + TK_CLASS, + TK_ENEMY_GRUNT, + TK_ENEMY_LEADER, + TK_ENEMY_ANIMAL, + TK_ENEMY_BOSS, + TK_NPC, + TK_NPC_ANIMAL, + TK_SPECIAL, + + // SYMBOLS + TK_LBRACE, + TK_RBRACE, + TK_UNDERSCORE, +}; + +keywordArray_t Keywords[] = +{ + "monsters", TK_MONSTERS, + "monster", TK_MONSTER, + "location", TK_LOCATION, + "name", TK_NAME, + "class", TK_CLASS, + "ENEMY_GRUNT", TK_ENEMY_GRUNT, + "ENEMY_LEADER", TK_ENEMY_LEADER, + "ENEMY_ANIMAL", TK_ENEMY_ANIMAL, + "ENEMY_BOSS", TK_ENEMY_BOSS, + "NPC", TK_NPC, + "NPC_ANIMAL", TK_NPC_ANIMAL, + "SPECIAL", TK_SPECIAL, + + NULL, TK_EOF, +}; + +keywordArray_t Symbols[] = +{ + "{", TK_LBRACE, + "}", TK_RBRACE, + "_", TK_UNDERSCORE, + NULL, TK_EOF, +}; + + +// **** END OF TOKENIZER STUFF **** + +// ====== CMonsterStats Functions ==================== + +CMonsterStats::CMonsterStats(edict_t *Monster, int KilledValue, int SurvivalValue, monsterclass myClass) +{ + if (!Monster) + { + delete this; + return; + } + + m_KilledValue = KilledValue; + m_SurvivalValue = SurvivalValue; + m_MonsterClass = myClass; + m_MonsterID = Monster->s.number; +} + +void CMonsterStats::Delete () +{ + delete this; + return; +} + +bool CMonsterStats::MatchMonsterID(edict_t *ent) +{ + if (m_MonsterID == ent->s.number ) + { + return true; + } + return false; +} + +// ====== CPlayerStats Functions ===================== + +void CPlayerStats::Init(long CashInBank, long CashOnHand) +{ + m_CashToBeAwarded = 0; + m_CashInBank = CashInBank; + m_CashOnHand = CashOnHand; +} + +// ============== CNonPlayer functions =========================== + +CNonPlayer::CNonPlayer(void) +{ + m_MonsterName = NULL; + m_KilledValue = 0; + m_SurvivalValue = 0; + m_MonsterClass = ENEMY_GRUNT; +} + +CNonPlayer::CNonPlayer(const char* name) +{ + m_MonsterName = (char*)malloc(strlen(name) + 1); + strcpy(m_MonsterName, name); + m_KilledValue = 0; + m_SurvivalValue = 0; + m_MonsterClass = ENEMY_GRUNT; +} + +void CNonPlayer::Delete() +{ + free(m_MonsterName); + m_MonsterName = NULL; + + delete this; +} + +bool CNonPlayer::ParseNonPlayerData(CTokenizer* Tokenizer) +{ + CToken* Token; + +// Put these lines in once we have different missions <--- now difficulty levels +/* if (game.GameStats->MissionNumber) + { + for(int count = 0; count < ((game.GameStats->MissionNumber)*2); count++) + { + Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_INT) + { + Tokenizer->Error("Warning: Strange Values found while scanning for killed value"); + } + } + } +*/ + Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_INT) + { + Tokenizer->Error("Killed value not found after monster name"); + Tokenizer->PutBackToken(Token); + return false; + } + m_KilledValue = Token->GetIntValue(); + Token->Delete(); + Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_INT) + { + Tokenizer->Error("Survival value not found after Killed Value"); + Tokenizer->PutBackToken(Token); + return false; + } + m_SurvivalValue = Token->GetIntValue(); + Token->Delete(); + Token = Tokenizer->GetToken(); + while (Token->GetType() != TK_CLASS) + { + if (Token->GetType() != TK_INT) + { + Tokenizer->Error("Unable to find monster class!"); + Tokenizer->PutBackToken (Token); + return false; + } + Token->Delete(); + Token = Tokenizer->GetToken(); + } + Token->Delete(); + Token = Tokenizer->GetToken(); + switch (Token->GetType()) + { + case TK_ENEMY_GRUNT: + m_MonsterClass = ENEMY_GRUNT; + break; + case TK_ENEMY_LEADER: + m_MonsterClass = ENEMY_LEADER; + break; + case TK_ENEMY_ANIMAL: + m_MonsterClass = ENEMY_ANIMAL; + break; + case TK_ENEMY_BOSS: + m_MonsterClass = ENEMY_BOSS; + break; + case TK_NPC: + m_MonsterClass = NPC; + break; + case TK_NPC_ANIMAL: + m_MonsterClass = NPC_ANIMAL; + break; + case TK_SPECIAL: + m_MonsterClass = SPECIAL; + break; + default: + Tokenizer->Error("Invalid monster class found!"); + Tokenizer->PutBackToken (Token); + return false; + } + Token->Delete (); + return true; //Yay! +} + +// ============== CLocation functions ============================ + +CLocation::CLocation(void) +{ + m_LocationName = NULL; +} + +CLocation::CLocation(const char* name) +{ + m_LocationName = (char*)malloc(strlen(name) + 1); + strcpy(m_LocationName,name); +} + +void CLocation::Delete() +{ + free(m_LocationName); + m_LocationName = NULL; + + List::Iter NPIter; + + for (NPIter = m_NonPlayerList.Begin(); NPIter!=m_NonPlayerList.End(); NPIter++) + { + (*NPIter)->Delete(); + } + + delete this; +} + +bool CLocation::RegisterNonPlayers(CTokenizer* Tokenizer) +{ + CToken* Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_LBRACE) + { + Tokenizer->Error("Left Brace Expected After location Name"); + Tokenizer->PutBackToken(Token); + return false; + } + Token->Delete(); + Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_NAME) + { + Tokenizer->Error ("'name' expected after left brace following location"); + Tokenizer->PutBackToken(Token); + return false; + } + while (Token->GetType() == TK_NAME) + { + Token->Delete(); + Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_STRING) + { + Tokenizer->PutBackToken(Token); + Tokenizer->Error ("No monster name found after keyword 'name'"); + if (m_NonPlayerList.Begin() != m_NonPlayerList.End()) + { + return true; // some locations were successful, so we should keep them + } + return false; // no successful locations yet, kill 'em all! + } + LPCTSTR name = Token->GetStringValue(); + CNonPlayer* NonPlayer = new CNonPlayer(name); + Token->Delete(); + + bool success = NonPlayer->ParseNonPlayerData(Tokenizer); + if (success) + { + m_NonPlayerList.PushBack(NonPlayer); + } + else + { + NonPlayer->Delete(); + } + Token = Tokenizer->GetToken(); + } + if (Token->GetType() != TK_RBRACE) + { + Tokenizer->Error("No closing brace found after name lists!"); + Tokenizer->PutBackToken(Token); + return true; // keep what we've got + } + Token->Delete(); + return true; +} + +int CLocation::GetDefaultKilledValue(CTokenizer* Tokenizer) +{ + CToken *Token; + List::Iter NPIter; + int killedValue = DEFAULT_KILLED_VALUE; + + Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_UNDERSCORE) + { + Tokenizer->Error("Underscore expected after location!"); + Token->Delete(); + return killedValue; + } + Token->Delete(); + Token = Tokenizer->GetToken((UINT)0, TKF_NOUNDERSCOREINIDENTIFIER); + for (NPIter = m_NonPlayerList.Begin(); NPIter!=m_NonPlayerList.End(); NPIter++) + { + if (!(stricmp((*NPIter)->GetMonsterName(), Token->GetStringValue()))) + { + killedValue = (*NPIter)->GetKilledValue(); + Token->Delete(); + return killedValue; + } + } + Tokenizer->Error("Economy.dat does not contain a monster entity name!"); + Token->Delete(); + return killedValue; +} + +int CLocation::GetDefaultSurvivalValue(CTokenizer* Tokenizer) +{ + CToken *Token = 0; + List::Iter NPIter; + int SurvivalValue = DEFAULT_SURVIVAL_VALUE; + + Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_UNDERSCORE) + { + Tokenizer->Error("Underscore expected after location!"); + Token->Delete(); + return SurvivalValue; + } + Token->Delete(); + Token = Tokenizer->GetToken((UINT)0, TKF_NOUNDERSCOREINIDENTIFIER); + for (NPIter = m_NonPlayerList.Begin(); NPIter!=m_NonPlayerList.End(); NPIter++) + { + if (!(stricmp((*NPIter)->GetMonsterName(), Token->GetStringValue()))) + { + SurvivalValue = (*NPIter)->GetSurvivalValue(); + Token->Delete(); + return SurvivalValue; + } + } + Tokenizer->Error("Economy.dat does not contain a monster entity name!"); + Token->Delete(); + return SurvivalValue; +} + +monsterclass CLocation::GetDefaultMonsterClass(CTokenizer* Tokenizer) +{ + CToken *Token = 0; + List::Iter NPIter; + monsterclass MonsterClass = DEFAULT_MONSTER_CLASS; + + Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_UNDERSCORE) + { + Tokenizer->Error("Underscore expected after location!"); + Token->Delete(); + return MonsterClass; + } + Token->Delete(); + Token = Tokenizer->GetToken((UINT)0, TKF_NOUNDERSCOREINIDENTIFIER); + for (NPIter = m_NonPlayerList.Begin(); NPIter!=m_NonPlayerList.End(); NPIter++) + { + if (!(stricmp((*NPIter)->GetMonsterName(), Token->GetStringValue()))) + { + MonsterClass = (*NPIter)->GetMonsterClass(); + Token->Delete(); + return MonsterClass; + } + } + Tokenizer->Error("Economy.dat does not contain a monster entity name!"); + Token->Delete(); + return MonsterClass; +} + +// ============== CMonsterList functions ========================= + +CMonsterList::CMonsterList() +{ +// m_LocationList = NULL; +} + +void CMonsterList::Delete() +{ + List::Iter LocIter; + + for (LocIter = m_LocationList.Begin(); LocIter!=m_LocationList.End(); LocIter++) + { + (*LocIter)->Delete(); + } + + delete this; +} + +bool CMonsterList::RegisterLocations (CTokenizer* Tokenizer) +{ + CToken* Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_LBRACE) + { + Tokenizer->Error("Left Brace Expected After 'monsters' keyword"); + Tokenizer->PutBackToken(Token); + return false; + } + else + { + Token->Delete(); + Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_LOCATION) + { + Tokenizer->Error ("'location' expected after left brace"); + Tokenizer->PutBackToken(Token); + return false; + } + else + { + while (Token->GetType() == TK_LOCATION) + { + Token->Delete(); + Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_STRING) + { + Tokenizer->PutBackToken(Token); + Tokenizer->Error ("No name found after keyword 'location'"); + if (m_LocationList.Begin() != m_LocationList.End()) + { + return true; // some locations were successful, so we should keep them + } + return false; // no successful locations yet, kill 'em all! + } + else + { + LPCTSTR name = Token->GetStringValue(); + CLocation* Location = new CLocation(name); + bool success = Location->RegisterNonPlayers(Tokenizer); + if (success) + { + m_LocationList.PushBack(Location); + } + else + { + Location->Delete(); + } + } + Token->Delete(); + Token = Tokenizer->GetToken(); + } + } + if (Token->GetType() != TK_RBRACE) + { + Tokenizer->Error("No closing brace found after location lists!"); + Tokenizer->PutBackToken(Token); + return true; // keep what we've got + } + + } + Token->Delete(); + return true; +} + +int CMonsterList::GetDefaultKilledValue(CTokenizer* Tokenizer) +{ + CToken *Token; + List::Iter LocIter; + int killedValue = DEFAULT_KILLED_VALUE; + + Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_UNDERSCORE) + { + Tokenizer->Error("Underscore expected after monster!"); + Token->Delete(); + return killedValue; + } + Token->Delete(); + Token = Tokenizer->GetToken(); + for (LocIter = m_LocationList.Begin(); LocIter!=m_LocationList.End(); LocIter++) + { + if (!(stricmp((*LocIter)->GetLocationName(), Token->GetStringValue()))) + { + killedValue = (*LocIter)->GetDefaultKilledValue(Tokenizer); + Token->Delete(); + return killedValue; + } + } + Tokenizer->Error("Economy.dat does not contain a location specified in a monster name!"); + Token->Delete(); + return killedValue; +} + +int CMonsterList::GetDefaultSurvivalValue(CTokenizer* Tokenizer) +{ + CToken *Token; + List::Iter LocIter; + int SurvivalValue = DEFAULT_SURVIVAL_VALUE; + + Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_UNDERSCORE) + { + Tokenizer->Error("Underscore expected after monster!"); + Token->Delete(); + return SurvivalValue; + } + Token->Delete(); + Token = Tokenizer->GetToken(); + for (LocIter = m_LocationList.Begin(); LocIter!=m_LocationList.End(); LocIter++) + { + if (!(stricmp((*LocIter)->GetLocationName(), Token->GetStringValue()))) + { + SurvivalValue = (*LocIter)->GetDefaultSurvivalValue(Tokenizer); + Token->Delete(); + return SurvivalValue; + } + } + Tokenizer->Error("Economy.dat does not contain a location specified in a monster name!"); + Token->Delete(); + return SurvivalValue; +} + +monsterclass CMonsterList::GetDefaultMonsterClass(CTokenizer* Tokenizer) +{ + CToken *Token; + List::Iter LocIter; + monsterclass MonsterClass = DEFAULT_MONSTER_CLASS; + + Token = Tokenizer->GetToken(); + if (Token->GetType() != TK_UNDERSCORE) + { + Tokenizer->Error("Underscore expected after monster!"); + Token->Delete(); + return MonsterClass; + } + Token->Delete(); + Token = Tokenizer->GetToken(); + for (LocIter = m_LocationList.Begin(); LocIter!=m_LocationList.End(); LocIter++) + { + if (!(stricmp((*LocIter)->GetLocationName(), Token->GetStringValue()))) + { + MonsterClass = (*LocIter)->GetDefaultMonsterClass(Tokenizer); + Token->Delete(); + return MonsterClass; + } + } + Tokenizer->Error("Economy.dat does not contain a location specified in a monster name!"); + Token->Delete(); + return MonsterClass; +} +// ============== CEconomyRegistry functions ===================== + +void CEconomyRegistry::RegisterMonsters(CTokenizer* Tokenizer) +{ + CToken* Token; + Tokenizer->ScanUntilToken(TK_MONSTERS); + Token = Tokenizer->GetToken(); + if (Token->GetType() == TK_EOF) + { + Tokenizer->Error("No Monsters to Register for Economy!"); + } + else + { + m_MonsterList = new CMonsterList(); + bool success = m_MonsterList->RegisterLocations(Tokenizer); + if (!success) + { + m_MonsterList->Delete(); + } + } + Token->Delete(); +} + +int CEconomyRegistry::GetDefaultKilledValue(edict_t *ent) +{ + int killedValue = DEFAULT_KILLED_VALUE; + + CTokenizer* Tokenizer = CTokenizer::Create(TKF_NOUNDERSCOREINIDENTIFIER); + + Tokenizer->SetKeywords(Keywords); + Tokenizer->SetSymbols(Symbols); + Tokenizer->AddParseStream((unsigned char *)ent->classname, strlen(ent->classname)); + + CToken* Token = Tokenizer->GetToken(); + switch(Token->GetType()) + { + case TK_MONSTER: + killedValue = m_MonsterList->GetDefaultKilledValue(Tokenizer); + break; + default: + Tokenizer->Error("Invalid entity category in economy.dat!"); + break; + } + Token->Delete(); + Tokenizer->Delete(); + return killedValue; +} + +int CEconomyRegistry::GetDefaultSurvivalValue(edict_t *ent) +{ + int SurvivalValue = DEFAULT_SURVIVAL_VALUE; + + CTokenizer* Tokenizer = CTokenizer::Create(TKF_NOUNDERSCOREINIDENTIFIER); + + Tokenizer->SetKeywords(Keywords); + Tokenizer->SetSymbols(Symbols); + Tokenizer->AddParseStream((unsigned char *)ent->classname, strlen(ent->classname)); + + CToken* Token = Tokenizer->GetToken(); + switch(Token->GetType()) + { + case TK_MONSTER: + SurvivalValue = m_MonsterList->GetDefaultSurvivalValue(Tokenizer); + break; + default: + Tokenizer->Error("Invalid entity category in economy.dat!"); + break; + } + Token->Delete(); + Tokenizer->Delete(); + return SurvivalValue; +} + +monsterclass CEconomyRegistry::GetDefaultMonsterClass(edict_t *ent) +{ + monsterclass MonsterClass = DEFAULT_MONSTER_CLASS; + + CTokenizer* Tokenizer = CTokenizer::Create(TKF_NOUNDERSCOREINIDENTIFIER); + + Tokenizer->SetKeywords(Keywords); + Tokenizer->SetSymbols(Symbols); + Tokenizer->AddParseStream((unsigned char *)ent->classname, strlen(ent->classname)); + + CToken* Token = Tokenizer->GetToken(); + switch(Token->GetType()) + { + case TK_MONSTER: + MonsterClass = m_MonsterList->GetDefaultMonsterClass(Tokenizer); + break; + default: + Tokenizer->Error("Invalid entity category in economy.dat!"); + break; + } + Token->Delete(); + Tokenizer->Delete(); + return MonsterClass; +} + +CEconomyRegistry::CEconomyRegistry() +{ +// do parsing of economy.dat here + byte* econInfo; + UINT flags = 0x00; + int flength; + + + flength = gi.FS_LoadFile ("economy.dat", (void**)&econInfo); + + CTokenizer* Tokenizer = CTokenizer::Create(); + + if (flength <= 0) + { + Tokenizer->Error("Error trying to open file economy.dat in base directory!"); + Tokenizer->Delete(); + return; + } + + Tokenizer->SetKeywords(Keywords); + Tokenizer->SetSymbols(Symbols); + Tokenizer->AddParseStream(econInfo, flength); + + m_MonsterList = NULL; + RegisterMonsters(Tokenizer); +// RegisterObjects, etc... + + Tokenizer->Delete(); + + gi.FS_FreeFile(econInfo); +} + +void CEconomyRegistry::Delete() +{ + if (m_MonsterList) + { + m_MonsterList->Delete(); + m_MonsterList = NULL; + } + + delete this; +} + +// ============== CGameStats functions =========================== + +CGameStats::CGameStats() +{ + m_EconomyRegistry = new CEconomyRegistry(); +} + +void CGameStats::Delete () +{ + if (m_EconomyRegistry) + { + m_EconomyRegistry->Delete(); + m_EconomyRegistry = NULL; + } + + List::Iter MSIter; + + for (MSIter = m_MonsterStats.Begin(); MSIter!=m_MonsterStats.End(); MSIter++) + { + (*MSIter)->Delete(); + } + + m_MonsterStats.Erase(m_MonsterStats.Begin(),m_MonsterStats.End()); + + delete this; +} + +int CGameStats::GetDefaultKilledValue(edict_t *ent) +{ + int KilledValue = m_EconomyRegistry->GetDefaultKilledValue(ent); + return KilledValue; +} + +int CGameStats::GetDefaultSurvivalValue(edict_t *ent) +{ + int SurvivalValue = m_EconomyRegistry->GetDefaultSurvivalValue(ent); + return SurvivalValue; +} + +monsterclass CGameStats::GetDefaultMonsterClass(edict_t *ent) +{ + monsterclass MonsterClass = m_EconomyRegistry->GetDefaultMonsterClass(ent); + return MonsterClass; +} + +void CGameStats::AddMonsterToStatsList (edict_t *ent, float killedValue, float survivalValue) +{ + + if (killedValue == 12345678) + { + killedValue = GetDefaultKilledValue(ent); + } + + if (survivalValue == 12345678) + { + survivalValue = GetDefaultSurvivalValue(ent); + } + + monsterclass myClass = GetDefaultMonsterClass(ent); + + + CMonsterStats *NewMonsterStats = new CMonsterStats(ent, killedValue, survivalValue, myClass); + + m_MonsterStats.PushBack(NewMonsterStats); + +} + +CMonsterStats* CGameStats::GetMonsterStats(edict_t *ent) +{ + List::Iter MSIter; + + for(MSIter = m_MonsterStats.Begin(); MSIter != m_MonsterStats.End(); MSIter++) + { + if ((*MSIter)->MatchMonsterID(ent)) + { + return (*MSIter); + } + } + return NULL; +} + +bool CGameStats::CanBuy(edict_t *ent) +{ +// if the ent is a client, he can buy. + + //sorry to butt into this code, but this test was returning some monsters as able to buy...--ss +// return ((ent-g_edicts-1g_edicts)); + return (ent->client != NULL); +} + +void CGameStats::BuyModeImpulse(edict_t *ent, int impulse) +{ + if (!CanBuy(ent)) + { + return; + } + CPlayerStats *PlayerStats = GetPlayerStats(ent); + if (!PlayerStats->GetBuyModeOnOff()) + { + return; + } + switch(impulse) + { + case 133: + ExitBuyMode(ent); + break; + case 134: + if(PlayerStats->GetCashInBank() < 1) + { + gi.centerprintf(ent,"not enough cash!\n"); + return; + } + PlayerStats->AdjustCashInBank(-1); // -1 is hardcoded price... hacked in for now - FIXME + //everyone better have a client at this point... + ent->client->inv->addWeaponType(SFW_AUTOSHOTGUN, 1); + break; + case 135: + if(PlayerStats->GetCashInBank() < 10) + { + gi.centerprintf(ent,"not enough cash!\n"); + return; + } + PlayerStats->AdjustCashInBank(-10); + ent->client->inv->addWeaponType(SFW_MACHINEGUN, 1); + break; + case 136: + if(PlayerStats->GetCashInBank() < 6000) + { + gi.centerprintf(ent,"not enough cash!\n"); + return; + } + break; + case 164: + if(PlayerStats->GetCashInBank() < 10) + { + gi.centerprintf(ent,"not enough cash!\n"); + return; + } + PlayerStats->AdjustCashInBank(-10); + ent->client->inv->addAmmoType(AMMO_9MM, 100); + break; + case 165: + if(PlayerStats->GetCashInBank() < 100) + { + gi.centerprintf(ent,"not enough cash!\n"); + return; + } + PlayerStats->AdjustCashInBank(-100); +// ent->client->inv->addAmmoType(AMMO_GRENADE, 20); + break; + case 166: + if(PlayerStats->GetCashInBank() < 500) + { + gi.centerprintf(ent,"not enough cash!\n"); + return; + } + PlayerStats->AdjustCashInBank(-500); + ent->client->inv->addAmmoType(AMMO_ROCKET, 20); + break; + case 194: + if(PlayerStats->GetCashInBank() < 30) + { + gi.centerprintf(ent,"not enough cash!\n"); + return; + } + PlayerStats->AdjustCashInBank(-30); + ent->client->inv->addItem(SFE_FLASHPACK, 3); + break; + case 195: + if(PlayerStats->GetCashInBank() < 40) + { + gi.centerprintf(ent,"not enough cash!\n"); + return; + } + PlayerStats->AdjustCashInBank(-40); + ent->client->inv->addItem(SFE_C4, 3); + break; + case 196: + if(PlayerStats->GetCashInBank() < 40) + { + gi.centerprintf(ent,"not enough cash!\n"); + return; + } + PlayerStats->AdjustCashInBank(-40); + ent->client->inv->addItem(SFE_NEURAL_GRENADE, 3); + break; + case 197: + if(PlayerStats->GetCashInBank() < 40) + { + gi.centerprintf(ent,"not enough cash!\n"); + return; + } + break; + case 198: + if(PlayerStats->GetCashInBank() < 40) + { + gi.centerprintf(ent,"not enough cash!\n"); + return; + } + PlayerStats->AdjustCashInBank(-40); + ent->client->inv->addItem(SFE_LIGHT_GOGGLES, 1); + break; + case 199: + if(PlayerStats->GetCashInBank() < 40) + { + gi.centerprintf(ent,"not enough cash!\n"); + return; + } + PlayerStats->AdjustCashInBank(-40); + ent->client->inv->addArmor(100); + break; + } +} + +void CGameStats::EnterBuyMode(edict_t *ent) +{ + CPlayerStats *PlayerStats; + + if (!CanBuy(ent)) + { + return; + } + + PlayerStats = GetPlayerStats(ent); + PlayerStats->SetBuyModeOnOff (true); + + + gi.WriteByte(svc_equip); + gi.WriteByte(1);//equip code + gi.WriteByte(3);//how many weapons to offer for sale + gi.WriteString("jackhammer");//weap name + gi.WriteLong(1);//weap price + gi.WriteString("minimi");//weap name + gi.WriteLong(10);//weap price + gi.WriteString("m305a1");//weap name + gi.WriteLong(6000);//weap price + gi.WriteByte(3);//dif't ammo types for sale + gi.WriteString("9mm");//weap name + gi.WriteLong(10);//weap price + gi.WriteString("grenades");//weap name + gi.WriteLong(100);//weap price + gi.WriteString("rockets");//weap name + gi.WriteLong(500);//weap price + gi.WriteByte(6);//dif't items for sale + gi.WriteString("flashpacks");//weap name + gi.WriteLong(30);//weap price + gi.WriteString("c4 explosive");//weap name + gi.WriteLong(40);//weap price + gi.WriteString("neural grenades");//weap name + gi.WriteLong(40);//weap price + gi.WriteString("robot grenades");//weap name + gi.WriteLong(40);//weap price + gi.WriteString("light goggles");//weap name + gi.WriteLong(200);//weap price + gi.WriteString("armor");//weap name + gi.WriteLong(40);//weap price + gi.unicast (ent, true); +} + +void CGameStats::ExitBuyMode(edict_t *ent) +{ + if (!CanBuy(ent)) + { + return; + } + + CPlayerStats *PlayerStats = GetPlayerStats(ent); + + PlayerStats->SetBuyModeOnOff(false); + gi.WriteByte(svc_equip); + gi.WriteByte(0); + gi.unicast (ent, true); +} diff --git a/Source/Game/gamecpp/g_econ.h b/Source/Game/gamecpp/g_econ.h new file mode 100644 index 0000000..6952f87 --- /dev/null +++ b/Source/Game/gamecpp/g_econ.h @@ -0,0 +1,170 @@ +#define DEFAULT_KILLED_VALUE 100 +#define DEFAULT_SURVIVAL_VALUE 0 +#define DEFAULT_MONSTER_CLASS ENEMY_GRUNT + +typedef enum +{ + ENEMY_GRUNT, // these should be set for statistical record keeping + ENEMY_LEADER, + ENEMY_ANIMAL, + ENEMY_BOSS, + NPC, + NPC_ANIMAL, + SPECIAL, +} monsterclass; + +class CTokenizer; + +class CMonsterStats +{ + +private: + int m_MonsterID; + int m_KilledValue; + int m_SurvivalValue; + monsterclass m_MonsterClass; + +public: + CMonsterStats(edict_t* Monster = NULL, int KilledValue = DEFAULT_KILLED_VALUE, int SurvivalValue = DEFAULT_SURVIVAL_VALUE, monsterclass myClass = ENEMY_GRUNT); + void Delete(); + + int GetKilledValue(){return m_KilledValue;}; + void SetKilledValue(int amount){m_KilledValue = amount;}; + + int GetSurvivalValue(){return m_SurvivalValue;}; + void SetSurvivalValue(int amount){m_SurvivalValue = amount;}; + + monsterclass GetMonsterClass(){return m_MonsterClass;}; + void SetMonsterClass(monsterclass myClass){m_MonsterClass = myClass;}; + + bool MatchMonsterID(edict_t *ent); +}; + + +#define PLAYER_STARTING_CASH_IN_BANK 10000 +#define PLAYER_STARTING_CASH_IN_HAND 0 + +class CPlayerStats +{ +private: + long m_CashToBeAwarded; + long m_CashOnHand; + long m_CashInBank; + bool m_Buymode; + +public: + void Init(long CashInBank = PLAYER_STARTING_CASH_IN_BANK, long CashOnHand = PLAYER_STARTING_CASH_IN_HAND); + + void SetBuyModeOnOff(bool On){m_Buymode = On;} + bool GetBuyModeOnOff(void){return m_Buymode;} + + long GetCashToBeAwarded(){return m_CashToBeAwarded;}; + void SetCashToBeAwarded(long amount){m_CashToBeAwarded = amount;}; + void AdjustCashToBeAwarded(long amount){m_CashToBeAwarded += amount;}; + + long GetCashOnHand(){return m_CashOnHand;}; + void SetCashOnHand(long amount){m_CashOnHand = amount;}; + void AdjustCashOnHand(long amount){m_CashOnHand += amount;}; + + long GetCashInBank(){return m_CashInBank;}; + void SetCashInBank(long amount){m_CashInBank = amount;}; + void AdjustCashInBank(long amount){m_CashInBank += amount;}; +}; + +class CNonPlayer +{ +private: + char* m_MonsterName; + int m_KilledValue; + int m_SurvivalValue; + monsterclass m_MonsterClass; + +public: + CNonPlayer(void); + CNonPlayer(const char* name); + void Delete(); + bool ParseNonPlayerData(CTokenizer* Tokenizer); + char* GetMonsterName(){return m_MonsterName;}; + int GetKilledValue(){return m_KilledValue;}; + int GetSurvivalValue(){return m_SurvivalValue;}; + monsterclass GetMonsterClass(){return m_MonsterClass;}; +}; + + +class CLocation +{ +private: + List m_NonPlayerList; + char* m_LocationName; + +public: + CLocation(void); + CLocation(const char* name); + void Delete(); + bool RegisterNonPlayers(CTokenizer* Tokenizer); + int GetDefaultKilledValue(CTokenizer* Tokenizer); + int GetDefaultSurvivalValue(CTokenizer* Tokenizer); + monsterclass GetDefaultMonsterClass(CTokenizer* Tokenizer); + char* GetLocationName(){return m_LocationName;}; +}; + +class CMonsterList +{ +private: + List m_LocationList; + + +public: + CMonsterList(); + void Delete(); + bool RegisterLocations(CTokenizer* Tokenizer); + int GetDefaultKilledValue(CTokenizer* Tokenizer); + int GetDefaultSurvivalValue(CTokenizer* Tokenizer); + monsterclass GetDefaultMonsterClass(CTokenizer* Tokenizer); + +}; + +class CEconomyRegistry +{ +private: + CMonsterList* m_MonsterList; +// CObjectList * m_ObjectList; +// etc.... Should probably change these to templates once I understand them... + +void RegisterMonsters(CTokenizer* Tokenizer); + +public: + CEconomyRegistry(void); + void Delete(); + + CMonsterList* GetMonsterList(void){return m_MonsterList;}; + int GetDefaultKilledValue(edict_t* ent); + int GetDefaultSurvivalValue(edict_t* ent); + monsterclass GetDefaultMonsterClass(edict_t* ent); +}; + +// make sure this thing is deallocated when the game is quit +class CGameStats +{ +private: + List m_MonsterStats; + CEconomyRegistry* m_EconomyRegistry; + + void FragmentEntClassname(edict_t* ent, char* ClassName); + +public: + CGameStats(void); + void Delete(); + int GetDefaultKilledValue(edict_t *ent); + int GetDefaultSurvivalValue(edict_t *ent); + monsterclass GetDefaultMonsterClass(edict_t *ent); + CMonsterStats* GetMonsterStats(edict_t *ent); + void AddEconomyRegistry(void); + void AddMonsterToStatsList(edict_t *ent, float killedValue = 12345678, float survivalValue = 12345678); + void BuyModeImpulse(edict_t *ent, int impulse);//currently, this will call exitbuymode with the right impuls + void EnterBuyMode(edict_t *ent); + void ExitBuyMode(edict_t *ent); + bool CanBuy(edict_t *ent); +}; + +CPlayerStats *GetPlayerStats(edict_t *ent); diff --git a/Source/Game/gamecpp/g_environ.cpp b/Source/Game/gamecpp/g_environ.cpp new file mode 100644 index 0000000..ccd9d4a --- /dev/null +++ b/Source/Game/gamecpp/g_environ.cpp @@ -0,0 +1,1439 @@ +#include "g_local.h" +#include "fields.h" +#include "ai_private.h" // so we know what a bodyhuman_c is + +#define DEFAULT(a, b) ((a) ? (a):(b)) + +#define FIRE_SILENT 2 + +#define CHUNKS_TRIGGER_SPAWN (1<<0) + + +void SetGenericEffectInfo(edict_t *ent) +{ // get some good defaults here... + ent->movetype = MOVETYPE_NONE; + if(ent->solid != SOLID_TRIGGER) + { + ent->solid = SOLID_NOT; + } + ent->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID; + VectorSet (ent->mins, -5, -5, -7);//? + VectorSet (ent->maxs, 5, 5, 12); + ent->s.modelindex = 0; + BboxRotate(ent); + gi.linkentity (ent); +} + +void SetGenericEffectInfoVBBox(edict_t *ent) +{ + SetGenericEffectInfo(ent); + + gi.setmodel (ent, ent->model); + ent->s.modelindex = 0; + + ent->s.origin[0] = (ent->absmax[0] + ent->absmin[0])*.5; + ent->s.origin[1] = (ent->absmax[1] + ent->absmin[1])*.5; + ent->s.origin[2] = (ent->absmax[2] + ent->absmin[2])*.5; +} + +void SetGenericEffectInfoVBBoxTop(edict_t *ent) +{ + SetGenericEffectInfo(ent); + + gi.setmodel (ent, ent->model); + ent->s.modelindex = 0; + + ent->s.origin[0] = (ent->absmax[0] + ent->absmin[0])*.5; + ent->s.origin[1] = (ent->absmax[1] + ent->absmin[1])*.5; + ent->s.origin[2] = ent->absmax[2]; +} + + +//---------------------------------------------------------------------------------------------------- + +/*QUAKED environ_snow (0 1 0) (-64 -64 0) (64 64 96) START_OFF +*/ + +void SP_environ_snow (edict_t *ent) +{ + SetGenericEffectInfo(ent); + fxRunner.execContinualEffect("environ/snowchute", ent); +} + +/*QUAKED environ_player_snow (0 1 0) (-12 -12 -12) (12 12 12) +"count" whether this should turn the snow on or off +*/ + +void SnowUse(edict_t *ent, edict_t *other, edict_t *activator) +{ + if(ent->count) + { + fxRunner.execContinualEffect("environ/playersnow", activator); + } + else + { + fxRunner.stopContinualEffect("environ/playersnow", activator); + } +} + +void SP_environ_player_snow(edict_t *ent) +{ + SetGenericEffectInfo(ent); + ent->use = SnowUse; +} + +//---------------------------------------------------------------------------------------------------- + +/*QUAKED environ_steamgen (0 1 0) (-12 -12 -12) (12 12 12) START_OFF +"height" size of the puffs - (default is 35) +"wait" time in seconds the steam should blow... set to zero for constant steam...(default is 0) +"delay" time in seconds the steam should stop... set to zero for steam to go once +"dmg" amount of damage the steam generator does to folks per second of exposure(def is 0) + +Be certain to set the "angles" key or you will die + +*/ + +#define START_OFF 1 + +void SteamUse(edict_t *ent, edict_t *other, edict_t *activator) +{ + if(fxRunner.hasEffect("environ/normalsteam", ent)) + { + fxRunner.stopContinualEffect("environ/normalsteam", ent); + ent->air_finished = 0; + } + else + { + fxRunner.execContinualEffect("environ/normalsteam", ent, 0, ent->health/35); + ent->air_finished = level.time + ent->wait; + } + ent->nextthink = level.time + .1; +} + +void SteamThink2(edict_t *ent) +{ + if(fxRunner.hasEffect("environ/normalsteam", ent)) + { + fxRunner.stopContinualEffect("environ/normalsteam", ent); + if(ent->delay) + { + ent->air_finished = level.time + ent->delay; + } + else + { + ent->air_finished = 0; + } + } + else + { + fxRunner.execContinualEffect("environ/normalsteam", ent, 0, ent->health/35); + ent->air_finished = level.time + ent->wait; + } +} + +void SteamThink(edict_t *ent) +{ + if(fxRunner.hasEffect("environ/normalsteam", ent)) + { + if(ent->dmg) + { // do the damage here in a cone of some size... bleah + T_ConeDamage(ent, ent, ent->dmg, ent, 96 * ent->health / 35.0, 0, ent->movedir, .7);//radius isn't gonna always be right... + } + } + + // air_finished is used as a seperate think function timer... + if(ent->air_finished) + { + if(ent->air_finished < level.time) + { + SteamThink2(ent); + } + } + ent->nextthink = level.time + .1; +} + +void SP_environ_steamgen (edict_t *ent) +{ + SetGenericEffectInfo(ent); + + ent->health = st.height; + + if (ent->health == 0) + { + ent->health=35; + } + + if(!(ent->spawnflags & START_OFF)) + { + fxRunner.execContinualEffect("environ/normalsteam", ent, 0, ent->health/35); + } + + AngleVectors(ent->s.angles, ent->movedir, 0, 0); + + ent->use = SteamUse; + + ent->think = SteamThink; + ent->nextthink = level.time + .1; + + if(ent->wait) + { + ent->air_finished = level.time + ent->wait; + } + else + { + ent->air_finished = 0; + } + + if(ent->spawnflags & START_OFF) + { + ent->air_finished = 0; + } +} + +//---------------------------------------------------------------------------------------------------- + +/*QUAKED environ_smokegen (0 1 0) (-12 -12 -12) (12 12 12) START_OFF +"height" size of the puffs - 60 is medium sized... +*/ + +void smoke_gen_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + if(fxRunner.hasEffect("environ/normalsmoke", ent)) + { + fxRunner.stopContinualEffect("environ/normalsmoke", ent); + } + else + { + fxRunner.execContinualEffect("environ/normalsmoke", ent, 0, (60.0 / ent->health)); + } +} + +void SP_environ_smokegen (edict_t *ent) +{ + SetGenericEffectInfo(ent); + ent->health = st.height; + + if(!(ent->spawnflags & START_OFF)) + { + fxRunner.execContinualEffect("environ/normalsmoke", ent, 0, (60.0 / ent->health)); + } + + ent->use = smoke_gen_use; +} + +//---------------------------------------------------------------------------------------------------- + + +#define ONE_SHOT 2 + +/*QUAKED environ_sparkgen (0 1 0) (-12 -12 -12) (12 12 12) START_OFF ONE_SHOT +delay - frequency of sparks shooting out in seconds +wait - randomness to how often the sparks shoot out in seconds(should be less than delay) +lip - color of sparks... 0 = yellow, 1 = blue +use angles to determine what direction you want the little folks to go +*/ + +void spark_gen_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + ent->nextthink = level.time + ent->delay + (gi.flrand(0.0F, 1.0F)*(ent->wait)) - (ent->wait/2); +} + +void spark_gen_think(edict_t *ent) +{ + vec3_t dir; + + AngleVectors(ent->s.angles, dir, NULL, NULL); + + FX_MakeSparks(ent->s.origin, dir, ent->dmg); + if(ent->spawnflags & ONE_SHOT) + { + ent->nextthink = 0; + } + else + { + ent->nextthink = level.time + ent->delay + (gi.flrand(0.0F, 1.0F)*(ent->wait)) - (ent->wait/2); + } +} + +void SP_environ_sparkgen (edict_t *ent) +{ + SetGenericEffectInfo(ent); + + ent->think = spark_gen_think; + ent->dmg = st.lip; + + if((!(ent->spawnflags & START_OFF))&&(!(ent->spawnflags & ONE_SHOT))) + { + ent->nextthink = level.time + ent->delay + (gi.flrand(0.0F, 1.0F)*(ent->wait)) - (ent->wait/2); + } + else + { + ent->nextthink = 0; + } + ent->use = spark_gen_use; +} + +//---------------------------------------------------------------------------------------------------- + +/*QUAKED environ_waterglobgen (0 1 0) ? START_OFF +Drips from a 30 by 30 region around the origin of the entity +*/ + +void SP_environ_waterdripper (edict_t *ent) +{ + SetGenericEffectInfoVBBoxTop(ent); + fxRunner.execContinualEffect("environ/waterdrip", ent); +} + +//---------------------------------------------------------------------------------------------------- + +/*QUAKED environ_raingen (0 1 0) ? START_OFF +"count" - amount of rain(100 is default) +"wait" - length of the rain pieces(90 is default) +"delay" - speed that the rain falls at(90 is default) +"lip" - light level(200 is default) +*/ + +void raingen_use(edict_t *ent, edict_t *other, edict_t *activator) +{ +} + +void SP_environ_raingen (edict_t *ent) +{ + SetGenericEffectInfoVBBox(ent); +} + +/*QUAKED environ_rain_worldtrigger (0 1 0) (-12 -12 -12) (12 12 12) +"count" - amount of rain(100 is default) +"wait" - length of the rain pieces(90 is default) +*/ + +void rainTrigger_use(edict_t *ent, edict_t *other, edict_t *activator) +{ + edict_t *search; + + search = NULL; + while ((search = G_Find (search, FOFS(classname), "environ_raingen"))) + { + } +} + +void SP_environ_rain_worldtrigger(edict_t *ent) +{ + SetGenericEffectInfo(ent); + ent->use = rainTrigger_use; +} + +/*QUAKED environ_cloudtrigger (0 1 0) (-12 -12 -12) (12 12 12) +"wait" - density of clouds (default = .1) +"count" speed of the clouds (default 10) +*/ + +void cloudTriggerUse(edict_t *ent, edict_t *other, edict_t *activator) +{ +} + +void SP_environ_cloudtrigger(edict_t *ent) +{ + SetGenericEffectInfo(ent); + ent->wait = DEFAULT(ent->wait, .1); + ent->count = DEFAULT(ent->count, 10); + ent->use = rainTrigger_use; +} + +//---------------------------------------------------------------------------------------------------- + +/*QUAKED environ_windgen (0 1 0) (-12 -12 -12) (12 12 12) START_OFF +not in yet, chump +*/ + +//---------------------------------------------------------------------------------------------------- + +/*QUAKED environ_bloodrain (0 1 0) (-4 -4 -4) (4 4 4) +Rains from a 30 by 30 region. Put the bloodrain entity +at the x-y center of the region you +want the blood to rain on. Put it at the height you +want the rain to start at. +*/ + +void SP_environ_bloodrain (edict_t *ent) +{ + SetGenericEffectInfo(ent); + fxRunner.execContinualEffect("environ/bloodrain", ent); +} + +//---------------------------------------------------------------------------------------------------- + +/*QUAKED environ_linefountain (1 0 1) (-8 -8 -8) (8 8 8) START_OFF +count - power of the fountain (between 0 and 635) +Be certain to set the "angles" key or you will die +*/ +/* +This function is designed to send a simulated particle through the world, +subject to the input physics. It then returns the floor level. This will +(up to 255, obviously), representing the time before the test particle smacks something. + +Since velocities are expressed in units/second, they are scaled by .01. +*/ + +extern short TestforFloor (vec3_t origin, vec3_t vel, vec3_t accel, edict_t* ignore) +{ + vec3_t startpoint, midpoint,endpoint; + edict_t* obstacle = NULL; + trace_t tr1, tr2; + int floor; + int accelcount; + + VectorCopy(origin, startpoint); + VectorScale(vel, .005, vel); + VectorScale(accel, .2, accel); + accelcount = 0; + while (obstacle == NULL) + { + accelcount++; + if (accelcount >= 20) //each pass through this loop simulates .01 seconds + //accelcount should be adjusted to simulate how often acceleration + //is going to be applied. For normal physics, this is every .1 seconds, + //so accelcount would be 10. + { + VectorAdd(vel, accel, vel); + accelcount = 0; + } + VectorAdd(startpoint, vel, midpoint); + VectorAdd(midpoint, vel, endpoint); + gi.trace (startpoint, NULL, NULL, midpoint, ignore, MASK_SOLID | MASK_WATER, &tr1); + gi.trace (midpoint, NULL, NULL, endpoint, ignore, MASK_SOLID| MASK_WATER, &tr2); + if (tr1.fraction<1) + { + obstacle = tr1.ent; + floor = tr1.endpos[2]; + } + else if (tr2.fraction<1)//to avoid round-off problems + { + obstacle = tr2.ent; + floor = tr2.endpos[2]; + } + VectorCopy(endpoint, startpoint); + } + return floor; +} + +void linefountainUse(edict_t *ent, edict_t *other, edict_t *activator) +{ + if(fxRunner.hasEffect("environ/stream", ent)) + { + fxRunner.stopContinualEffect("environ/stream", ent); + } + else + { + fxRunner.execContinualEffect("environ/stream", ent, 0, ent->count/50); + } +} + +void SP_environ_linefountain (edict_t *ent) +{ + SetGenericEffectInfo(ent); + ent->use = linefountainUse; + + if(!(ent->spawnflags & START_OFF)) + { + fxRunner.execContinualEffect("environ/stream", ent, 0, ent->count/50); + } + else + { + gi.effectindex("environ/stream"); + } +} + +//---------------------------------------------------------------------------------------------------- + +/*QUAKED environ_splashfountain (0 1 0) (-8 -8 -8) (8 8 8) +Nope, doesn't work yet, so don't use it ;( +*/ +void SP_environ_splashfountain (edict_t *ent) +{ + vec3_t vel; + + AngleVectors(ent->s.angles, vel, NULL, NULL); + VectorScale(vel, ent->count, vel); + + SetGenericEffectInfo(ent); +} + +/*QUAKED environ_lightning (0 1 0) (-8 -8 -8) (8 8 8) START_OFF +random = how often the lightning should strike, roughly, in seconds... - default 10... + +triggering this will turn it off and on +*/ + +void LighteningGenUse(edict_t *ent, edict_t *other, edict_t *activator) +{ + if(ent->nextthink != 0) + { + ent->nextthink = 0; + } + else + { + ent->nextthink = level.time + gi.flrand(ent->random * .5, ent->random * 1.5); + } +} + +void LightningGenThink(edict_t *ent) +{ + FX_MakeSkyLightning(); + ent->nextthink = level.time + gi.flrand(ent->random * .5, ent->random * 1.5); +} + +void SP_environ_lightning(edict_t *ent) +{ + SetGenericEffectInfo(ent); + ent->think = LightningGenThink; + ent->use = LighteningGenUse; + ent->nextthink = 0; + ent->random = DEFAULT(ent->random, 10); + if(ent->spawnflags & START_OFF)return; + ent->nextthink = level.time + gi.flrand(ent->random * .5, ent->random * 1.5); +} + +/*QUAKED environ_emergency_lights (0 1 0) (-8 -8 -8) (8 8 8) +*/ + +void EmergencyLightStutter(edict_t *ent); + +void EmergencyLightReturn(edict_t *ent) +{ + ent->think = EmergencyLightStutter; + ent->nextthink = level.time + gi.flrand(2.0, 10.0); + SetSkyColor((float)ent->health *.01, 0, 0); +} + +void EmergencyLightStutter(edict_t *ent) +{ + ent->nextthink = level.time + .1; + ent->think = EmergencyLightReturn; + SetSkyColor((float)ent->health * gi.flrand(.001, .005), 0, 0); +} + +void EmergencyLightRedGlow(edict_t *ent) +{ + ent->health += 10; + ent->nextthink = level.time + .1; + SetSkyColor((float)ent->health *.01, 0, 0); + if(ent->health > 70) + { + ent->think = EmergencyLightStutter; + ent->nextthink = level.time + gi.flrand(2.0, 10.0); + } +} + +void EmergencyLightFade(edict_t *ent) +{ + ent->health -= 10; + ent->nextthink = level.time + .1; + SetSkyColor((float)ent->health *.01, (float)ent->health *.01, (float)ent->health *.01); + if(ent->health < 10) + { + ent->think = EmergencyLightRedGlow; + } +} + +void emergency_lights_use(edict_t *ent, edict_t *other, edict_t *activator) +{ + ent->think = EmergencyLightFade; + ent->nextthink = level.time + .1; +} + +void SP_environ_emergency_lights(edict_t *ent) +{ + SetGenericEffectInfo(ent); + ent->think = NULL; + ent->health = 100; + SetSkyColor(1.0, 1.0, 1.0); + ent->use = emergency_lights_use; +} + +/*QUAKED environ_skyfade (0 1 0) (-8 -8 -8) (8 8 8) START_OFF +"color" initial color of the sky in red green blue format, from 0.0 to 2.0, with 1.0 being normal (like "1.0 1.0 1.0" for white) +"endpoint" like color, but this is the ending color +"delay" time in seconds for the fade to take +*/ + +void skyfadeThink(edict_t *ent) +{ + float ratio, invRatio; + vec3_t fromc, toc; + + if(level.time > ent->health + ent->delay) + { + G_FreeEdict(ent); + return; + } + + ratio = (level.time - ent->health)/(ent->delay); + invRatio = 1.0 - ratio; + + VectorScale(ent->intend_avelocity, ratio, toc); + VectorScale(ent->intend_velocity, 1.0 - ratio, fromc); + + SetSkyColor(fromc[0] + toc[0], fromc[1] + toc[1], fromc[2] + toc[2]); + + ent->nextthink = level.time + ent->delay/100.0; +} + +void skyfadeUse(edict_t *ent, edict_t *other, edict_t *activator) +{ + ent->health = level.time; + ent->think = skyfadeThink; + ent->nextthink = level.time + ent->delay/100.0; +} + +void SP_environ_skyfade(edict_t *ent) +{ +// intend_velocity; -> used as start color +// intend_avelocity; -> used as final color + SetGenericEffectInfo(ent); + VectorCopy(st.color, ent->intend_velocity); + VectorCopy(st.endpoint, ent->intend_avelocity); + + if(ent->spawnflags & START_OFF) + { + ent->think = NULL; + ent->nextthink = 0; + } + else + { + ent->health = level.time; + ent->think = skyfadeThink; + ent->nextthink = level.time + ent->delay/100.0; + } +} + +/*QUAKED environ_explosion (0 1 0) (-8 -8 -8) (8 8 8) NO_BLIND NO_DAMAGE +"health" size of the explosion (default 150) +*/ + +#define NO_BLIND 1 + +void explodeUse(edict_t *ent, edict_t *other, edict_t *activator) +{ + vec3_t pos; + + VectorCopy(ent->s.origin, pos); + pos[2] += 10; + + if(!(ent->spawnflags & 2)) + { // flag 2 is the no damage flag - this is more for cinematic stuff.. + T_RadiusDamage (ent, ent, ent->health*2, ent, ent->health, 0, DT_MANGLE); + RadiusBurn(ent, ent->health*2); + } + gmonster.RadiusDeafen(ent, ent->health*2, ent->health*2); + + fxRunner.exec("weapons/world/airexplodemute", ent->s.origin); + // play a good explosion sound + float xattenuation = ATTN_NORM, xvolume = 1.0; + switch(gi.irand(1, 3)) + { + case 1: + gi.positioned_sound (ent->s.origin, g_edicts, 0, gi.soundindex("impact/explosion/exp1.wav"), xvolume, xattenuation, 0); + break; + case 2: + gi.positioned_sound (ent->s.origin, g_edicts, 0, gi.soundindex("impact/explosion/exp2.wav"), xvolume, xattenuation, 0); + break; + case 3: + gi.positioned_sound (ent->s.origin, g_edicts, 0, gi.soundindex("impact/explosion/exp3.wav"), xvolume, xattenuation, 0); + break; + } + FX_C4Explosion(ent); + + if(!(ent->spawnflags & NO_BLIND)) + { + BlindingLight(pos, ent->health*10, 0.9, 0.5); + } + + ShakeCameras (ent->s.origin, ent->health, ent->health*2, 100); +} + +void SP_environ_explosion(edict_t *ent) +{ + SetGenericEffectInfo(ent); + ent->use = explodeUse; + ent->health = DEFAULT(ent->health, 150); + + // cache sound CLSFX_EXPLODE + entSoundsToCache[CLSFX_EXPLODE] = 1; + // cache debris CLGHL_EXPLODEBIG, CLGHL_EXPLODESML + entDebrisToCache[CLGHL_EXPLODEBIG] = DEBRIS_YES; + entDebrisToCache[CLGHL_EXPLODESML] = DEBRIS_YES; + + // precache possible explosion sounds + gi.soundindex("impact/explosion/exp1.wav"); + gi.soundindex("impact/explosion/exp2.wav"); + gi.soundindex("impact/explosion/exp3.wav"); + gi.effectindex("weapons/world/airexplodemute"); +} + +/*QUAKED environ_smoke_burst (0 1 0) (-8 -8 -8) (8 8 8) +"health" size of the smoke burst (default 50) +*/ + +void smokeBurstUse(edict_t *ent, edict_t *other, edict_t *activator) +{ + FX_SmokeBurst(ent->s.origin, ent->health); +} + +void SP_environ_smoke_burst(edict_t *ent) +{ + SetGenericEffectInfo(ent); + ent->use = smokeBurstUse; + ent->health = DEFAULT(ent->health, 50); +} + +/*QUAKED environ_fire (0 1 0) (-8 -8 -8) (8 8 8) START_OFF SILENT +a fire +-------KEYS-------- +health - size of the fire burst (default is 12) +count - lifetime of the fire in 100th's of a second (default is 64) +delay - life of actual fire in seconds from being triggered (default is 0, which means don't turn off) +----SPAWNFLAGS--- +START_OFF - starts off +SILENT - makes no noise (use this on fires that will always be far away from player) +*/ + +char *getFireEffect(int size) +{ + if(size < 4) + { + return "environ/firesmall2"; + } + else if(size < 8) + { + return "gbfire"; + } + else if(size < 14) + { + return "gbfire"; + } + else if(size < 20) + { + return "gbfire"; + } + else if(size < 30) + { + return "environ/firelarge2"; + } + else + { + return "environ/firelarge3"; + } +} + + +void fire_use(edict_t *ent, edict_t *other, edict_t *activator) +{ + if(ent->wait) + { + fxRunner.stopContinualEffect(getFireEffect(ent->health), ent); + ent->s.sound = 0; + ent->wait = 0; + } + else + { + if (!(ent->spawnflags & FIRE_SILENT)) + { + if (ent->health > 20) + ent->s.sound = gi.soundindex("Ambient/Gen/FireFX/FireBig.wav"); + else if (ent->health > 10) + ent->s.sound = gi.soundindex("Ambient/Gen/FireFX/FireMed.wav"); + else + ent->s.sound = gi.soundindex("Ambient/Gen/FireFX/FireSmall.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + fxRunner.execContinualEffect(getFireEffect(ent->health), ent); + ent->max_health = level.time; + ent->wait = 1; + } +} + +void FireThink(edict_t *ent) +{ + if((ent->delay)&&(level.time - ent->max_health < ent->delay)) + { + } + + ent->nextthink = level.time + .1; +} + +void environ_fire_touch (edict_t *ent, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t up = {0,0,1}; + vec3_t point; + +// if ((other->s.origin[2] + other->mins[2]) > ent->s.origin[2]) + { + VectorSet(point, other->s.origin[0], other->s.origin[1], other->absmin[2]); + T_Damage(other, ent, ent, up, point, point, 1, 0, DT_FIRE|DAMAGE_NO_ARMOR, MOD_FIRE); + } + return; +} + + +void SP_environ_fire(edict_t *ent) +{ + SetGenericEffectInfo(ent); + + ent->delay = DEFAULT(ent->delay, 0); + ent->health = DEFAULT(ent->health, 12); + ent->count = DEFAULT(ent->count, 64); + + ent->use = fire_use; + + if (ent->spawnflags & START_OFF) + { + gi.effectindex(getFireEffect(ent->health)); + ent->wait = 0; + } + else + { + fxRunner.execContinualEffect(getFireEffect(ent->health), ent); + ent->wait = 1; + if (!(ent->spawnflags & FIRE_SILENT)) + { + if (ent->health > 20) + ent->s.sound = gi.soundindex("Ambient/Gen/FireFX/FireBig.wav"); + else if (ent->health > 10) + ent->s.sound = gi.soundindex("Ambient/Gen/FireFX/FireMed.wav"); + else + ent->s.sound = gi.soundindex("Ambient/Gen/FireFX/FireSmall.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + } + + if(ent->delay) + { + ent->think = FireThink; + ent->nextthink = level.time + .1; + } + ent->max_health = level.time;//this is gross. + + gi.soundindex("Ambient/Gen/FireFX/FireBig.wav"); + gi.soundindex("Ambient/Gen/FireFX/FireMed.wav"); + gi.soundindex("Ambient/Gen/FireFX/FireSmall.wav"); + gi.effectindex("environ/firesmall2"); + gi.effectindex("gbfire"); + gi.effectindex("environ/firelarge2"); + gi.effectindex("environ/firelarge3"); +} + +/*QUAKED environ_linetrap (0 1 0) (-8 -8 -8) (8 8 8) SINGLE_TRIGGER START_OFF DAMAGE +A red laser beam trip wire. Runs from point origin till it hits something. +------ SPAWNFLAGS ------ +SINGLE_TRIGGER - goes away after tripped once +START_OFF - line won't turn on until triggered +DAMAGE - do damage +------ KEYS ------ +"angles" - Direction of the beam from where it starts... +dmg - amount of damage done by beam (default 2) +*/ + +#define SINGLE_TRIGGER 1 +#define LINETRAP_STARTOFF 2 +#define LINETRAP_DAMAGE 4 + +void lineTrapUse(edict_t *ent, edict_t *other, edict_t *activator) +{ + if(ent->nextthink) + { + ent->nextthink = 0; + } + else + { + ent->nextthink = level.time + .1; + } +} + + +void linetrapThink(edict_t *ent) +{ + trace_t tr; + + gi.trace (ent->s.origin, NULL, NULL, ent->pos1, ent, MASK_PLAYERSOLID, &tr); + if(tr.fraction < 1.0) + { + if(tr.ent != world) + { + G_UseTargets (ent, tr.ent); + if(ent->spawnflags & SINGLE_TRIGGER) + { + ent->nextthink = 0; + ent->think = 0; + } + } + } + + if (ent->spawnflags & LINETRAP_DAMAGE) + { + if (tr.ent->client) + { + T_Damage (tr.ent, ent, ent, vec3_origin, tr.ent->s.origin, tr.ent->s.origin, ent->dmg, ent->dmg, 0, MOD_TRIGGER_HURT); + } + } + + + if (ent->think) + { + fxRunner.setPos2(ent->pos1); + fxRunner.exec("environ/tripbeam", ent->s.origin); + ent->nextthink = level.time + .1; + } +} + +void SP_environ_linetrap(edict_t *ent) +{ + SetGenericEffectInfo(ent); + + vec3_t end; + vec3_t dir; + trace_t tr; + + AngleVectors(ent->s.angles, dir, NULL, NULL); + VectorMA(ent->s.origin, 2000, dir, end); + + gi.trace (ent->s.origin, NULL, NULL, end, ent, MASK_PLAYERSOLID, &tr); + + if(tr.fraction > .99)return; + VectorCopy(tr.endpos, ent->pos1); + + if(ent->spawnflags & LINETRAP_STARTOFF) + { + ent->nextthink = 0; + } + else + { + ent->nextthink = level.time + .1; + } + + if (ent->spawnflags & LINETRAP_DAMAGE) + { + if (!ent->dmg) + { + ent->dmg = 2; + } + } + + ent->think = linetrapThink; + ent->use = lineTrapUse; +} + +/*QUAKED environ_inferno (0 1 0) ? START_OFF +"count" intensity(default 100) +"delay" windspeed (default 0) + +"angles" is the direction of the wind +*/ + +void infernoUse(edict_t *ent, edict_t *other, edict_t *activator) +{ +} + +void infernoThink(edict_t *ent) +{ + ent->nextthink = level.time + .3; + + RadiusBurn(ent, ent->health); +} + +void infernoTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ //stolen from triggerhurt::touch +} + +void SP_environ_inferno (edict_t *ent) +{ +// eft_rain_t *rain; + + ent->solid = SOLID_TRIGGER; + SetGenericEffectInfoVBBox(ent); + +// ent->movetype = MOVETYPE_NONE; +// gi.setmodel (ent, ent->model); + + ent->health = 100;//kef -- totally guessing + + // need a sound or something? + +// ent->think = infernoThink; +// ent->nextthink = level.time + .3; + + ent->use = infernoUse; + ent->classname = "environ_inferno"; + + ent->touch = infernoTouch; + gi.effectindex("environ/onfireburst"); +} + + +/*QUAKED environ_invisible_attack (0 1 0) (-8 -8 -8) (8 8 8) START_OFF NO_DAMAGE +"count" is the attack type (I'll have a list somewhere for you guys to get the right attack - or just ask me)(default is 3, which is the glock) +"delay" is how long between shots in seconds (default is .2) +"random" how much the shots should waver, in degrees (default is 5) +"angles" is the direction of the attack +"wait" of -1 will pop the head off of "target" + +trigger this to turn it on and off +*/ + +int evilHackForInvisAttack = 0;//make weapons do no damage if field is set. Sigh. + +// only used when you want an invis_attack to shoot some poor slob in the head +void invis_attack_headshot(edict_t *ent) +{ + vec3_t TargetPoint; + Matrix4 EntityToWorld; + Matrix4 BoltToEntity; + Matrix4 BoltToWorld; + GhoulID Bolt = NULL_GhoulID; + vec3_t fpos, forward; + float vel = 500.0; + edict_t *myTarget = NULL; + + VectorCopy(ent->s.origin, fpos); + if (ent->target && (myTarget = G_PickTarget(ent->target))) + { + VectorCopy(myTarget->s.origin, TargetPoint); + Bolt = myTarget->ghoulInst->GetGhoulObject()->FindPart("sbolt_mouth"); + if (Bolt) + { + // get the transformation from entity space to world space + EntToWorldMatrix(myTarget->s.origin, myTarget->s.angles, EntityToWorld); + // get the transformation from bolt space to entity space + myTarget->ghoulInst->GetBoltMatrix(level.time,BoltToEntity,Bolt,IGhoulInst::MatrixType::Entity); + // multiply to get transform from bolt space to world space + BoltToWorld.Concat(BoltToEntity, EntityToWorld); + // 3rd row of BoltToWorld is the world coordinates of the bolt + BoltToWorld.GetRow(3,*(Vect3 *)TargetPoint); + VectorSubtract(TargetPoint, fpos, forward); // firing vector will be targetted point (defaults to origin) + + ai_c *target_ai=(ai_c*)((ai_public_c*)myTarget->ai); + bodyorganic_c* targetbody = NULL; + if (target_ai) + { + if ( targetbody = ((bodyorganic_c*)target_ai->GetBody()) ) + { + targetbody->NextShotsGonnaKillMe(NEXTSHOT_EXPLODE_MY_NUG); + weapons.attack((attacks_e)ent->count, ent, ent->s.origin, forward, 0, &vel); + } + } + } + } + G_FreeEdict(ent); +} + +void invis_attack_use(edict_t *ent, edict_t *other, edict_t *activator) +{ + // if wait == -1 then fire this attack once to ventilate the cranium of our target + if (-1 == ent->wait) + { + ent->nextthink = 0; + ent->think = NULL; + invis_attack_headshot(ent); + } + else + { + if(ent->health) + { + ent->health = 0; + ent->nextthink = 0; + } + else + { + ent->health = 1; + ent->nextthink = level.time + ent->delay; + } + } +} + +void invis_attack_think(edict_t *ent) +{ + vec3_t dir; + vec3_t tempAng; + + float vel = 500.0; + + if (-1 == ent->wait) + { + ent->nextthink = 0; + ent->think = NULL; + invis_attack_headshot(ent); + return; + } + + ent->nextthink = level.time + ent->delay; + + VectorCopy(ent->s.angles, tempAng); + for(int i = 0; i < 3; i++)tempAng[i] += gi.flrand(-ent->random, ent->random); + + if(ent->spawnflags & 2) + {//no damage + evilHackForInvisAttack = 1; + } + + AngleVectors(tempAng, dir, 0, 0); + weapons.attack((attacks_e)ent->count, ent, ent->s.origin, dir, 0, &vel); + + if(ent->spawnflags & 2) + { + evilHackForInvisAttack = 0; + } +} + +void SP_environ_invisible_attack(edict_t *ent) +{ + SetGenericEffectInfo(ent); + + ent->delay = DEFAULT(ent->delay, .2); + ent->count = DEFAULT(ent->count, 3); + ent->random = DEFAULT(ent->random, 5); + ent->think = invis_attack_think; + ent->use = invis_attack_use;//er - this is good to have + if(ent->spawnflags & START_OFF) + { + ent->health = 0; + ent->nextthink = 0; + } + else + { + ent->health = 1; //used as a flag as to whether the thingy is active or not + ent->nextthink = level.time + ent->delay; + } +} + +/*QUAKED environ_trainarm_spawn (0 1 0) (-8 -8 -8) (8 8 8) +*/ + +#define MASK_PROJ CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_DEADMONSTER|CONTENTS_SHOT + +void debug_drawbox(edict_t* self,vec3_t vOrigin, vec3_t vMins, vec3_t vMaxs, int nColor); + +void trainarm_think(edict_t *ent) +{ // you want hardcoded? you can't handle the hardcoded! + ent->nextthink = level.time + .1; + + if(ent->s.origin[0] < -4000) + { + G_FreeEdict(ent); + return; + } + + vec3_t searchPos; + + VectorCopy(ent->s.origin, searchPos); + searchPos[1] += 128; + searchPos[2] += 240;//this is getting more hardcoded by the minute. Wow. + + vec3_t tmin = {-512, -64, 0}; + vec3_t tmax = {512, 64, 64}; + + trace_t tr; + + gi.trace(searchPos, tmin, tmax, searchPos, NULL, MASK_SHOT, &tr);//what mask should be used here? + + if(tr.ent != world) + { + //do obscene amounts of damage + T_Damage (tr.ent, ent, ent, vec3_up, tr.ent->s.origin, tr.ent->s.origin, 999, 100, 0, MOD_CRUSH); + } +} + +void trainarm_spawn(edict_t *ent, edict_t *other, edict_t *activator) +{ + edict_t *newEnt; + + newEnt = G_Spawn(); + newEnt->movetype = MOVETYPE_PUSH; + newEnt->solid = SOLID_BBOX; + VectorCopy(ent->s.origin, newEnt->s.origin); + newEnt->velocity[0] = -3500; + VectorSet (newEnt->mins, -4, -2, -4); + VectorSet (newEnt->maxs, 3, 2, 4); + newEnt->health = 100; + newEnt->think = trainarm_think; + newEnt->nextthink = level.time + .1; + + newEnt->s.origin[2] += 1; + + game_ghoul.SetSimpleGhoulModel(newEnt, "objects/uganda/train_arm", "arm"); + + IGhoulInst *inst; + + inst = newEnt->ghoulInst; + + Matrix4 orig, sc, rot, trans, temp; + sc.Scale(1.5); + rot.Rotate(0, 0, 3*M_PI/2); + trans.Translate(0, 128, 176); + temp.Concat(sc, rot); + orig.Concat(temp, trans); + inst->SetXForm(orig); +} + +void SP_environ_trainarm_spawn(edict_t *ent) +{ + SetGenericEffectInfo(ent); + + ent->use = trainarm_spawn; +} + +/*QUAKED environ_dustsource (0 1 0) (-8 -8 -8) (8 8 8) MAKEASBITS +"delay" frequency at which the dust should fall - set to -1 to make trigger only. Default is 10 +"health" size of the dust puffs to poop out... - default is 5 +*/ + +void dustsource_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + vec3_t down = {0, 0, -1}; + trace_t tr; + vec3_t testEnd; + + if(ent->spawnflags & 1) + { + VectorCopy(ent->s.origin, testEnd); + testEnd[2] += 512; + gi.trace(ent->s.origin, vec3_origin, vec3_origin, testEnd, ent, MASK_SOLID, &tr); + + FX_MakeWallDamage(tr, down, ent->health, WMRK_BULLETHOLE,true); + } + else + { + FX_DropDustBits(ent->s.origin, ent->health); + } +} + +void dustsource_think (edict_t *ent) +{ + ent->use(ent, 0, 0); + ent->nextthink = level.time + gi.flrand(ent->delay * .8, ent->delay * 1.2); +} + +void SP_environ_dustsource(edict_t *ent) +{ + SetGenericEffectInfo(ent); + + ent->think = dustsource_think; + ent->delay = DEFAULT(ent->delay, 10); + ent->health = DEFAULT(ent->health, 5); + ent->use = dustsource_use; + + if(ent->health == -1) + { + ent->nextthink = 0; + } + else + { + ent->nextthink = level.time + gi.flrand(ent->delay * .8, ent->delay * 1.2); + } +} + +/*QUAKED environ_effect (0 1 0) (-8 -8 -8) (8 8 8) +"soundName" name of the effect to execute +look for more parameters here in the future +*/ + +void effect_use(edict_t *ent, edict_t *other, edict_t *activator) +{ + vec3_t dir; + + AngleVectors(ent->s.angles, dir, 0, 0); + fxRunner.setDir(dir); + fxRunner.exec(ent->soundName, ent->s.origin); +} + +void SP_environ_effect (edict_t *ent) +{ + SetGenericEffectInfo(ent); + + gi.effectindex(ent->soundName); + + ent->use = effect_use; + + if(ent->soundName && strstr(ent->soundName, "gore") && lock_blood) + { // no gore effect for you + G_FreeEdict(ent); + } +} + +/*QUAKED environ_effect_continual (0 1 0) (-8 -8 -8) (8 8 8) START_OFF +"soundName" name of the effect to execute +use to trigger this on and off +*/ + +void effect_continual_use(edict_t *ent, edict_t *other, edict_t *activator) +{ + if(fxRunner.hasEffect(ent->soundName, ent)) + { + fxRunner.stopContinualEffect(ent->soundName, ent); + } + else + { + fxRunner.execContinualEffect(ent->soundName, ent); + } +} + +void SP_environ_effect_continual (edict_t *ent) +{ + SetGenericEffectInfo(ent); + + if(!(ent->spawnflags & 1)) + { + fxRunner.execContinualEffect(ent->soundName, ent); + } + else + { + gi.effectindex(ent->soundName); + } + + ent->use = effect_continual_use; +} + +void chunk_spewer_think(edict_t *self) +{ + vec3_t fwd; + int numchunks = self->count; + int scale = DEBRIS_SM; + + if (self->count == -1000) + { + G_FreeEdict(self); + return; + } + + AngleVectors(self->s.angles, fwd, NULL, NULL); + if (numchunks < 0) + { // spew random number of chunks + numchunks = gi.irand(3,7); + } + FX_ThrowDebris(self->s.origin, fwd, numchunks, scale, MAT_ROCK_FLESH, 0, 0, 0, SURF_BLOOD); + + if (self->count > 0) + { // wait a little bit then remove this entity + self->count = -1000; + self->nextthink = level.time + 3; + return; + } + else + { // wait -(self->count) seconds and then spew again + self->nextthink = level.time + -(self->count) + gi.flrand(-.2, .2); + } +} + +void chunk_spewer_use(edict_t *self, edict_t *other, edict_t *activator) +{ + // don't let player use this + if (other && other->client) + { + return; + } + + chunk_spewer_think(self); +} + +/*QUAKED environ_chunk_spewer (0 1 0) (-4 -4 -4) (4 4 4) TRIGGER_SPAWN +uses an info_notnull as a target, like a func_remote_camera. +----------------KEY---------------- +count -- number of chunks to spew when this spewer is used. if negative, number of seconds between spewing chunks. +*/ + +void SP_environ_chunk_spewer(edict_t *ent) +{ + vec3_t Forward; + + ent->targetEnt = NULL; + + if(!ent->target) + { + gi.dprintf("Object 'environ_chunk_spewer' without a target.\n"); + + G_FreeEdict(ent); + + return; + } + + if(!ent->count) + { + gi.dprintf("Object 'environ_chunk_spewer' has zero chunks.\n"); + + G_FreeEdict(ent); + + return; + } + + ent->movetype = MOVETYPE_NONE; + ent->solid=SOLID_NOT; + VectorSet(ent->mins,-4,-4,-4); + VectorSet(ent->maxs,4,4,4); + +// ******************************************************************************************** +// Find my target entity and then orient myself to look at it. +// ******************************************************************************************** + ent->targetEnt=G_Find(NULL,FOFS(targetname),ent->target); + + if (ent->targetEnt) + { + VectorSubtract(ent->targetEnt->s.origin,ent->s.origin,Forward); + VectorNormalize(Forward); + vectoangles(Forward,ent->s.angles); + } + + if (ent->count > 0) + { // when this spewer is used, spew ent->count chunks and then go away + //(we're kinda automatically TRIGGER_SPAWNED) + ent->use = chunk_spewer_use; + ent->nextthink = -1; + } + else + { // once this is used (if TRIGGER_SPAWNED) spew random number of chunks every -(ent->count) seconds + if ( !(ent->spawnflags & CHUNKS_TRIGGER_SPAWN) ) + { // not trigger spawned so we don't need a use function + ent->nextthink = level.time + FRAMETIME; + } + else + { + ent->use = chunk_spewer_use; + ent->nextthink = -1; + } + } + ent->think = chunk_spewer_think; +} + +void SP_environ_soundgen (edict_t *ent); + +spawn_t environSpawns[] = +{ + {"environ_bloodrain", SP_environ_bloodrain}, + {"environ_emergency_lights", SP_environ_emergency_lights}, + {"environ_explosion", SP_environ_explosion}, + {"environ_fire", SP_environ_fire}, + {"environ_lightning", SP_environ_lightning}, + {"environ_linefountain", SP_environ_linefountain}, + {"environ_raingen", SP_environ_raingen}, + {"environ_skyfade", SP_environ_skyfade}, + {"environ_smokegen", SP_environ_smokegen}, + {"environ_smoke_burst", SP_environ_smoke_burst}, + {"environ_snow", SP_environ_snow}, + {"environ_soundgen", SP_environ_soundgen}, + {"environ_sparkgen", SP_environ_sparkgen}, + {"environ_splashfountain", SP_environ_splashfountain}, + {"environ_steamgen", SP_environ_steamgen}, + {"environ_waterglobgen", SP_environ_waterdripper}, + {"environ_rain_worldtrigger", SP_environ_rain_worldtrigger}, + {"environ_cloudtrigger", SP_environ_cloudtrigger}, + {"environ_linetrap", SP_environ_linetrap}, + {"environ_inferno", SP_environ_inferno}, + {"environ_invisible_attack", SP_environ_invisible_attack}, + {"environ_trainarm_spawn", SP_environ_trainarm_spawn}, + {"environ_dustsource", SP_environ_dustsource}, + {"environ_effect", SP_environ_effect}, + {"environ_effect_continual", SP_environ_effect_continual}, + {"environ_player_snow", SP_environ_player_snow}, + {"environ_chunk_spewer", SP_environ_chunk_spewer}, + {NULL, NULL} +}; diff --git a/Source/Game/gamecpp/g_func.cpp b/Source/Game/gamecpp/g_func.cpp new file mode 100644 index 0000000..10a055d --- /dev/null +++ b/Source/Game/gamecpp/g_func.cpp @@ -0,0 +1,3946 @@ +#include "g_local.h" +#include "ai_private.h" +#include "w_weapons.h" +#include "..\qcommon\ef_flags.h" + +// func_... +void SP_func_ambientSet (edict_t *ent); +void SP_func_areaportal (edict_t *ent); +void SP_func_breakable_brush (edict_t *ent); +void SP_func_trigger_brush (edict_t *ent); +void SP_func_button (edict_t *ent); +void SP_func_clock (edict_t *ent); +void SP_func_conveyor (edict_t *self); +void SP_func_door (edict_t *ent); +void SP_func_door_secret (edict_t *ent); +void SP_func_door_rotating (edict_t *ent); +void SP_func_door_rotating_smart (edict_t *ent); +void SP_func_killbox (edict_t *ent); +void SP_func_pushkillbox (edict_t *ent); +void SP_func_object (edict_t *self); +void SP_func_plat (edict_t *ent); +void SP_func_rotating (edict_t *ent); +void SP_func_timer (edict_t *self); +void SP_func_train (edict_t *ent); +void SP_func_wall (edict_t *self); +void SP_func_water (edict_t *ent); +void SP_info_null (edict_t *self); +void SP_func_alarm(edict_t *self); +void SP_func_score (edict_t *ent); +void SP_func_camerashake(edict_t *self); +void SP_func_ignite(edict_t *self); +void SP_func_musicControl(edict_t *self); +void SP_func_fade(edict_t* self); +void SP_func_Dekker_diehere(edict_t* self); +void SP_func_Dekker_console(edict_t* self); +void SP_func_Dekker_jumphere(edict_t* self); +void SP_func_Dekker_split(edict_t* self); +void SP_func_door_portcullis (edict_t *ent); +void SP_func_hide_the_players_gun (edict_t *ent); +void SP_func_snipercam_zoom(edict_t *ent); +void SP_func_mission_status(edict_t *ent); +void SP_func_player_health(edict_t *ent); +void SP_func_player_armor(edict_t *ent); +void SP_func_player_item(edict_t *ent); + +spawn_t funcSpawns[] = +{ + {"func_ambientset", SP_func_ambientSet}, + {"func_areaportal", SP_func_areaportal}, + {"func_breakable_brush", SP_func_breakable_brush}, + {"func_trigger_brush", SP_func_trigger_brush}, + {"func_button", SP_func_button}, + {"func_clock", SP_func_clock}, + {"func_conveyor", SP_func_conveyor}, + {"func_door", SP_func_door}, + {"func_door_rotating", SP_func_door_rotating}, + {"func_door_rotating_smart", SP_func_door_rotating_smart}, + {"func_door_secret", SP_func_door_secret}, + {"func_group", SP_info_null}, + {"func_killbox", SP_func_killbox}, + {"func_musicControl", SP_func_musicControl}, + {"func_pushkillbox", SP_func_pushkillbox}, + {"func_object", SP_func_object}, + {"func_plat", SP_func_plat}, + {"func_rotating", SP_func_rotating}, + {"func_timer", SP_func_timer}, + {"func_train", SP_func_train}, + {"func_wall", SP_func_wall}, + {"func_water", SP_func_water}, + {"func_alarm", SP_func_alarm}, + {"func_score", SP_func_score}, + {"func_camerashake", SP_func_camerashake}, + {"func_ignite", SP_func_ignite}, + {"func_fade", SP_func_fade}, + {"func_Dekker_diehere", SP_func_Dekker_diehere}, + {"func_Dekker_console", SP_func_Dekker_console}, + {"func_Dekker_jumphere", SP_func_Dekker_jumphere}, + {"func_Dekker_split", SP_func_Dekker_split}, + {"func_door_portcullis", SP_func_door_portcullis}, + {"func_hide_the_players_gun", SP_func_hide_the_players_gun}, + {"func_snipercam_zoom", SP_func_snipercam_zoom}, + {"func_mission_status", SP_func_mission_status}, + {"func_player_health", SP_func_player_health}, + {"func_player_armor", SP_func_player_armor}, + {"func_player_item", SP_func_player_item}, + {NULL, NULL}, +}; + +#define CAMERA_ACTIVATOR_ONLY 1 +#define CAMERA_GODMODE 2 +#define CAMERA_NODELETE 4 +#define CAMERA_LWANIMATE 8 +#define CAMERA_CAMERA_MODEL 16 + + +void door_use (edict_t *self, edict_t *other, edict_t *activator); +void portcullis_use (edict_t *self, edict_t *other, edict_t *activator); + +/* +========================================================= + + PLATS + + movement options: + + linear + smooth start, hard stop + smooth start, smooth stop + + start + end + acceleration + speed + deceleration + begin sound + end sound + target fired when reaching end + wait at end + + object characteristics that use move segments + --------------------------------------------- + movetype_push, or movetype_stop + action when touched + action when blocked + action when used + disabled? + auto trigger spawning + + +========================================================= +*/ + +#define PLAT_LOW_TRIGGER 1 + +#define STATE_TOP 0 +#define STATE_BOTTOM 1 +#define STATE_UP 2 +#define STATE_DOWN 3 + +#define DOOR_START_OPEN 0x0001 +#define DOOR_REVERSE 0x0002 +#define DOOR_CRUSHER 0x0004 +#define DOOR_NOMONSTER 0x0008 +#define DOOR_LOCKED 0x0010 +#define DOOR_TOGGLE 0x0020 +#define DOOR_X_AXIS 0x0040 +#define DOOR_Y_AXIS 0x0080 +/* +#define x 0x0100 +#define x 0x0200 +#define x 0x0400 +#define x 0x0800 +#define x 0x1000 +*/ +#define DOOR_USE_TARGET 0x2000 +#define DOOR_IGNOREHACK 0x4000 // rotating doors only +#define DOOR_DUALTARGET 0x8000 + +// +// Support routines for movement (changes in origin using velocity) +// + +void Move_Done (edict_t *ent) +{ + VectorClear (ent->velocity); + if (ent->moveinfo.endfunc) + { + ent->moveinfo.endfunc (ent); + } +} + +void Move_Final (edict_t *ent) +{ + if (ent->moveinfo.remaining_distance == 0) + { + Move_Done (ent); + return; + } + + VectorScale (ent->moveinfo.dir, ent->moveinfo.remaining_distance / FRAMETIME, ent->velocity); + + if (strcmp(ent->classname, "func_door_portcullis") == 0) + { + ent->moveinfo.thinkfunc = Move_Done; + } + else + { + ent->think = Move_Done; + } + ent->nextthink = level.time + FRAMETIME; +} + +void Move_Begin (edict_t *ent) +{ + float frames; + + if ((ent->moveinfo.speed * FRAMETIME) >= ent->moveinfo.remaining_distance) + { + Move_Final (ent); + return; + } + VectorScale (ent->moveinfo.dir, ent->moveinfo.speed, ent->velocity); + frames = floor((ent->moveinfo.remaining_distance / ent->moveinfo.speed) / FRAMETIME); + ent->moveinfo.remaining_distance -= frames * ent->moveinfo.speed * FRAMETIME; + if (strcmp(ent->classname, "func_door_portcullis") == 0) + { // need to indicate that, normally, this door wouldn't think 'til it's done moving + ent->moveinfo.wait = level.time + (frames * FRAMETIME); + ent->moveinfo.thinkfunc = Move_Done; + } + else + { + ent->nextthink = level.time + (frames * FRAMETIME); + ent->think = Move_Final; + } +} + +void Think_AccelMove (edict_t *ent); + +void Move_Calc (edict_t *ent, vec3_t dest, void(*func)(edict_t*)) +{ + VectorClear (ent->velocity); + VectorSubtract (dest, ent->s.origin, ent->moveinfo.dir); + ent->moveinfo.remaining_distance = VectorNormalize (ent->moveinfo.dir); + ent->moveinfo.endfunc = func; + + if (ent->moveinfo.speed == ent->moveinfo.accel && ent->moveinfo.speed == ent->moveinfo.decel) + { + if (level.current_entity == ((ent->flags & FL_TEAMSLAVE) ? ent->teammaster : ent)) + { + Move_Begin (ent); + } + else + { + ent->nextthink = level.time + FRAMETIME; + if (strcmp(ent->classname, "func_door_portcullis") == 0) + { + ent->moveinfo.thinkfunc = Move_Done; + } + else + { + ent->think = Move_Begin; + } + } + } + else + { + // accelerative + ent->moveinfo.current_speed = 0; + ent->think = Think_AccelMove; + ent->nextthink = level.time + FRAMETIME; + } +} + + +// +// Support routines for angular movement (changes in angle using avelocity) +// + +void AngleMove_Done (edict_t *ent) +{ + VectorClear (ent->avelocity); + if (ent->moveinfo.endfunc) + { + ent->moveinfo.endfunc (ent); + } +} + +void AngleMove_Final (edict_t *ent) +{ + vec3_t move; + + if (ent->moveinfo.state == STATE_UP) + VectorSubtract (ent->moveinfo.end_angles, ent->s.angles, move); + else + VectorSubtract (ent->moveinfo.start_angles, ent->s.angles, move); + + if (VectorCompare (move, vec3_origin)) + { + AngleMove_Done (ent); + return; + } + + VectorScale (move, 1.0/FRAMETIME, ent->avelocity); + + ent->think = AngleMove_Done; + ent->nextthink = level.time + FRAMETIME; +} + +void AngleMove_Begin (edict_t *ent) +{ + vec3_t destdelta; + float len; + float traveltime; + float frames; + + // set destdelta to the vector needed to move + if (ent->moveinfo.state == STATE_UP) + VectorSubtract (ent->moveinfo.end_angles, ent->s.angles, destdelta); + else + VectorSubtract (ent->moveinfo.start_angles, ent->s.angles, destdelta); + + // calculate length of vector + len = VectorLength (destdelta); + + // divide by speed to get time to reach dest + traveltime = len / ent->moveinfo.speed; + + if (traveltime < FRAMETIME) + { + AngleMove_Final (ent); + return; + } + + frames = floor(traveltime / FRAMETIME); + + // scale the destdelta vector by the time spent traveling to get velocity + VectorScale (destdelta, 1.0 / traveltime, ent->avelocity); + + // set nextthink to trigger a think when dest is reached + ent->nextthink = level.time + frames * FRAMETIME; + ent->think = AngleMove_Final; +} + +void AngleMove_Calc (edict_t *ent, void(*func)(edict_t*)) +{ + VectorClear (ent->avelocity); + ent->moveinfo.endfunc = func; + if (level.current_entity == ((ent->flags & FL_TEAMSLAVE) ? ent->teammaster : ent)) + { + AngleMove_Begin (ent); + } + else + { + ent->nextthink = level.time + FRAMETIME; + ent->think = AngleMove_Begin; + } +} + + +/* +============== +Think_AccelMove + +The team has completed a frame of movement, so +change the speed for the next frame +============== +*/ +#define AccelerationDistance(target, rate) (target * ((target / rate) + 1) / 2) + +void plat_CalcAcceleratedMove(moveinfo_t *moveinfo) +{ + float accel_dist; + float decel_dist; + + moveinfo->move_speed = moveinfo->speed; + + if (moveinfo->remaining_distance < moveinfo->accel) + { + moveinfo->current_speed = moveinfo->remaining_distance; + return; + } + + accel_dist = AccelerationDistance (moveinfo->speed, moveinfo->accel); + decel_dist = AccelerationDistance (moveinfo->speed, moveinfo->decel); + + if ((moveinfo->remaining_distance - accel_dist - decel_dist) < 0) + { + float f; + + f = (moveinfo->accel + moveinfo->decel) / (moveinfo->accel * moveinfo->decel); + moveinfo->move_speed = (-2 + sqrt(4 - 4 * f * (-2 * moveinfo->remaining_distance))) / (2 * f); + decel_dist = AccelerationDistance (moveinfo->move_speed, moveinfo->decel); + } + + moveinfo->decel_distance = decel_dist; +}; + +void plat_Accelerate (moveinfo_t *moveinfo) +{ + // are we decelerating? + if (moveinfo->remaining_distance <= moveinfo->decel_distance) + { + if (moveinfo->remaining_distance < moveinfo->decel_distance) + { + if (moveinfo->next_speed) + { + moveinfo->current_speed = moveinfo->next_speed; + moveinfo->next_speed = 0; + return; + } + if (moveinfo->current_speed > moveinfo->decel) + moveinfo->current_speed -= moveinfo->decel; + } + return; + } + + // are we at full speed and need to start decelerating during this move? + if (moveinfo->current_speed == moveinfo->move_speed) + if ((moveinfo->remaining_distance - moveinfo->current_speed) < moveinfo->decel_distance) + { + float p1_distance; + float p2_distance; + float distance; + + p1_distance = moveinfo->remaining_distance - moveinfo->decel_distance; + p2_distance = moveinfo->move_speed * (1.0 - (p1_distance / moveinfo->move_speed)); + distance = p1_distance + p2_distance; + moveinfo->current_speed = moveinfo->move_speed; + moveinfo->next_speed = moveinfo->move_speed - moveinfo->decel * (p2_distance / distance); + return; + } + + // are we accelerating? + if (moveinfo->current_speed < moveinfo->speed) + { + float old_speed; + float p1_distance; + float p1_speed; + float p2_distance; + float distance; + + old_speed = moveinfo->current_speed; + + // figure simple acceleration up to move_speed + moveinfo->current_speed += moveinfo->accel; + if (moveinfo->current_speed > moveinfo->speed) + moveinfo->current_speed = moveinfo->speed; + + // are we accelerating throughout this entire move? + if ((moveinfo->remaining_distance - moveinfo->current_speed) >= moveinfo->decel_distance) + return; + + // during this move we will accelrate from current_speed to move_speed + // and cross over the decel_distance; figure the average speed for the + // entire move + p1_distance = moveinfo->remaining_distance - moveinfo->decel_distance; + p1_speed = (old_speed + moveinfo->move_speed) / 2.0; + p2_distance = moveinfo->move_speed * (1.0 - (p1_distance / p1_speed)); + distance = p1_distance + p2_distance; + moveinfo->current_speed = (p1_speed * (p1_distance / distance)) + (moveinfo->move_speed * (p2_distance / distance)); + moveinfo->next_speed = moveinfo->move_speed - moveinfo->decel * (p2_distance / distance); + return; + } + + // we are at constant velocity (move_speed) + return; +}; + +void Think_AccelMove (edict_t *ent) +{ + ent->moveinfo.remaining_distance -= ent->moveinfo.current_speed; + + if (ent->moveinfo.current_speed == 0) // starting or blocked + plat_CalcAcceleratedMove(&ent->moveinfo); + + plat_Accelerate (&ent->moveinfo); + + // will the entire move complete on next frame? + if (ent->moveinfo.remaining_distance <= ent->moveinfo.current_speed) + { + Move_Final (ent); + return; + } + + VectorScale (ent->moveinfo.dir, ent->moveinfo.current_speed*10, ent->velocity); + ent->nextthink = level.time + FRAMETIME; + ent->think = Think_AccelMove; +} + + +void plat_go_down (edict_t *ent); + +void plat_hit_top (edict_t *ent) +{ + if (!(ent->flags & FL_TEAMSLAVE)) + { + + if (ent->moveinfo.sound_end != -1) + gi.sound (ent, CHAN_NO_PHS_ADD+CHAN_VOICE, ent->moveinfo.sound_end, 1,ATTN_NORM, 0); + ent->s.sound = 0; + } + ent->moveinfo.state = STATE_TOP; + + ent->think = plat_go_down; + ent->nextthink = level.time + 3; +} + +void plat_hit_bottom (edict_t *ent) +{ + if (!(ent->flags & FL_TEAMSLAVE)) + { + if (ent->moveinfo.sound_end != -1) + gi.sound (ent, CHAN_NO_PHS_ADD+CHAN_VOICE, ent->moveinfo.sound_end, 1, ATTN_NORM, 0); + ent->s.sound = 0; + } + ent->moveinfo.state = STATE_BOTTOM; +} + +void plat_go_down (edict_t *ent) +{ + if (!(ent->flags & FL_TEAMSLAVE)) + { + if (ent->moveinfo.sound_start != -1) + gi.sound (ent, CHAN_NO_PHS_ADD+CHAN_VOICE, ent->moveinfo.sound_start, 1, ATTN_NORM, 0); + if(ent->moveinfo.sound_middle != -1) + { + ent->s.sound = ent->moveinfo.sound_middle; + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + } + ent->moveinfo.state = STATE_DOWN; + Move_Calc (ent, ent->moveinfo.end_origin, plat_hit_bottom); +} + +void plat_go_up (edict_t *ent) +{ + if (!(ent->flags & FL_TEAMSLAVE)) + { + if (ent->moveinfo.sound_start != -1) + gi.sound (ent, CHAN_NO_PHS_ADD+CHAN_VOICE, ent->moveinfo.sound_start, 1, ATTN_NORM, 0); + if(ent->moveinfo.sound_middle != -1) + { + ent->s.sound = ent->moveinfo.sound_middle; + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + } + ent->moveinfo.state = STATE_UP; + Move_Calc (ent, ent->moveinfo.start_origin, plat_hit_top); +} + +void plat_blocked (edict_t *self, edict_t *other) +{ + if (!(other->svflags & SVF_MONSTER) && (!other->client) ) + { + // give it a chance to go away on it's own terms (like gibs) + T_Damage (other, self, self, vec3_origin, other->s.origin, other->s.origin, 100000, 1, 0, MOD_CRUSH); + // if it's still there, nuke it + if (other) + BecomeExplosion1 (other); + return; + } + + T_Damage (other, self, self, vec3_origin, other->s.origin, other->s.origin, self->dmg, 1, 0, MOD_CRUSH); + + if (self->moveinfo.state == STATE_UP) + plat_go_down (self); + else if (self->moveinfo.state == STATE_DOWN) + plat_go_up (self); +} + + +void Use_Plat (edict_t *ent, edict_t *other, edict_t *activator) +{ + if (ent->think) + return; // already down + plat_go_down (ent); +} + + +void Touch_Plat_Center (edict_t *ent, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if (!other->client) + return; + + if (other->health <= 0) + return; + + ent = ent->enemy; // now point at the plat, not the trigger + if (ent->moveinfo.state == STATE_BOTTOM) + plat_go_up (ent); + else if (ent->moveinfo.state == STATE_TOP) + ent->nextthink = level.time + 1; // the player is still on the plat, so delay going down +} + +void plat_spawn_inside_trigger (edict_t *ent) +{ + edict_t *trigger; + vec3_t tmin, tmax; + +// +// middle trigger +// + trigger = G_Spawn(); + trigger->touch = Touch_Plat_Center; + trigger->movetype = MOVETYPE_NONE; + trigger->solid = SOLID_TRIGGER; + trigger->enemy = ent; + + tmin[0] = ent->mins[0] + 25; + tmin[1] = ent->mins[1] + 25; + tmin[2] = ent->mins[2]; + + tmax[0] = ent->maxs[0] - 25; + tmax[1] = ent->maxs[1] - 25; + tmax[2] = ent->maxs[2] + 8; + + tmin[2] = tmax[2] - (ent->pos1[2] - ent->pos2[2] + st.lip); + + if (ent->spawnflags & PLAT_LOW_TRIGGER) + tmax[2] = tmin[2] + 8; + + if (tmax[0] - tmin[0] <= 0) + { + tmin[0] = (ent->mins[0] + ent->maxs[0]) *0.5; + tmax[0] = tmin[0] + 1; + } + if (tmax[1] - tmin[1] <= 0) + { + tmin[1] = (ent->mins[1] + ent->maxs[1]) *0.5; + tmax[1] = tmin[1] + 1; + } + + VectorCopy (tmin, trigger->mins); + VectorCopy (tmax, trigger->maxs); + + gi.linkentity (trigger); +} + +void platInit(edict_t *ent) +{ + ent->moveinfo.sound_start = SND_getBModelSoundIndex(ent->soundName, 0); + ent->moveinfo.sound_middle = SND_getBModelSoundIndex(ent->soundName, 1); + ent->moveinfo.sound_end = SND_getBModelSoundIndex(ent->soundName, 2); + + ent->think = NULL; +} + +/*QUAKED func_plat (0 .5 .8) ? PLAT_LOW_TRIGGER +speed default 150 + +Plats are always drawn in the extended position, so they will light correctly. + +If the plat is the target of another trigger or button, it will start out disabled in the extended position until it is trigger, when it will lower and become a normal plat. + +"speed" overrides default 200. +"accel" overrides default 500 +"lip" overrides default 8 pixel lip + +If the "height" key is set, that will determine the amount the plat moves, instead of being implicitly determoveinfoned by the model's height. + +SoundName - Name of the sound type of the plat + +Set "sounds" to one of the following: +1) base fast +2) chain slow +*/ +void SP_func_plat (edict_t *ent) +{ + VectorClear (ent->s.angles); + ent->solid = SOLID_BSP; + ent->movetype = MOVETYPE_PUSH; + + gi.setmodel (ent, ent->model); + + ent->blocked = plat_blocked; + + if (!ent->speed) + ent->speed = 20; + else + ent->speed *= 0.1; + + if (!ent->accel) + ent->accel = 5; + else + ent->accel *= 0.1; + + if (!ent->decel) + ent->decel = 5; + else + ent->decel *= 0.1; + + if (!ent->dmg) + ent->dmg = 2; + + if (!st.lip) + st.lip = 8; + + // pos1 is the top position, pos2 is the bottom + VectorCopy (ent->s.origin, ent->pos1); + VectorCopy (ent->s.origin, ent->pos2); + if (st.height) + ent->pos2[2] -= st.height; + else + ent->pos2[2] -= (ent->maxs[2] - ent->mins[2]) - st.lip; + + ent->use = Use_Plat; + + plat_spawn_inside_trigger (ent); // the "start moving" trigger + + if (ent->targetname) + { + ent->moveinfo.state = STATE_UP; + } + else + { + VectorCopy (ent->pos2, ent->s.origin); + gi.linkentity (ent); + ent->moveinfo.state = STATE_BOTTOM; + } + + ent->moveinfo.speed = ent->speed; + ent->moveinfo.accel = ent->accel; + ent->moveinfo.decel = ent->decel; + ent->moveinfo.wait = ent->wait; + VectorCopy (ent->pos1, ent->moveinfo.start_origin); + VectorCopy (ent->s.angles, ent->moveinfo.start_angles); + VectorCopy (ent->pos2, ent->moveinfo.end_origin); + VectorCopy (ent->s.angles, ent->moveinfo.end_angles); + + //this will probably break at first, I believe + + ent->think = platInit; + ent->nextthink = level.time + .1; +} + +//==================================================================== + +/*QUAKED func_rotating (0 .5 .8) ? START_ON REVERSE X_AXIS Y_AXIS TOUCH_PAIN STOP ANIMATED ANIMATED_FAST +You need to have an origin brush as part of this entity. The center of that brush will be +the point around which it is rotated. It will rotate around the Z axis by default. You can +check either the X_AXIS or Y_AXIS box to change that. + +"speed" determines how fast it moves; default value is 100. +"dmg" damage to inflict when blocked (2 default) +"soundname" this will determine the sound that is played while the object rotates + +REVERSE will cause the it to rotate in the opposite direction. +STOP mean it will stop moving instead of pushing entities +*/ + +void rotating_blocked (edict_t *self, edict_t *other) +{ + T_Damage (other, self, self, vec3_origin, other->s.origin, other->s.origin, self->dmg, 1, 0, MOD_CRUSH); +} + +void rotating_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if (self->avelocity[0] || self->avelocity[1] || self->avelocity[2]) + T_Damage (other, self, self, vec3_origin, other->s.origin, other->s.origin, self->dmg, 1, 0, MOD_CRUSH); +} + +void rotating_use (edict_t *self, edict_t *other, edict_t *activator) +{ + if (!VectorCompare (self->avelocity, vec3_origin)) + { + self->s.sound = 0; + VectorClear (self->avelocity); + self->touch = NULL; + } + else + { + if(self->moveinfo.sound_middle != -1) + { + self->s.sound = self->moveinfo.sound_middle; + self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + VectorScale (self->movedir, self->speed, self->avelocity); + if (self->spawnflags & 16) + self->touch = rotating_touch; + } +} + +void rotateInit(edict_t *ent) +{ + ent->moveinfo.sound_middle = SND_getBModelSoundIndex(ent->soundName, 0); + ent->think = NULL; +} + +void SP_func_rotating (edict_t *ent) +{ + ent->solid = SOLID_BSP; + if (ent->spawnflags & 32) + ent->movetype = MOVETYPE_STOP; + else + ent->movetype = MOVETYPE_PUSH; + + // set the axis of rotation + VectorClear(ent->movedir); + if (ent->spawnflags & 4) + ent->movedir[2] = 1.0; + else if (ent->spawnflags & 8) + ent->movedir[0] = 1.0; + else // Z_AXIS + ent->movedir[1] = 1.0; + + // check for reverse rotation + if (ent->spawnflags & 2) + VectorNegate (ent->movedir, ent->movedir); + + if (!ent->speed) + ent->speed = 100; + if (!ent->dmg) + ent->dmg = 2; + + ent->use = rotating_use; + if (ent->dmg) + ent->blocked = rotating_blocked; + + if (ent->spawnflags & 1) + ent->use (ent, NULL, NULL); + + if (ent->spawnflags & 64) + ent->s.effects |= EF_ANIM_ALL; + if (ent->spawnflags & 128) + ent->s.effects |= EF_ANIM_ALLFAST; + + gi.setmodel (ent, ent->model); + gi.linkentity (ent); + + ent->think = rotateInit; + ent->nextthink = level.time + .1; +} + +/* +====================================================================== + +BUTTONS + +====================================================================== +*/ + +/*QUAKED func_button (0 .5 .8) ? AUTOUSE NOTQUAD +When a button is touched, it moves some distance in the direction of it's angle, triggers all of it's targets, waits some time, then returns to it's original position where it can be triggered again. +Buttons cannot be used by player if they have a targetname. + +AUTOUSE - Not implemented +QUAD - Use frames 0-1 when up, 2-3 when down + +"angle" determines the opening direction +"target" all entities with a matching targetname will be used +"speed" override the default 40 speed +"wait" override the default 1 second wait (-1 = never return) +"lip" override the default 4 pixel lip remaining at end of move +"health" if set, the button must be killed instead of touched +"soundname" sounds to be used for this button... +"sp_message" is for a string package ID (numerical) +*/ + +#define NOTQUAD 2 + +void button_done (edict_t *self) +{ + self->moveinfo.state = STATE_BOTTOM; + self->s.effects &= ~EF_ANIM23; + self->s.effects |= EF_ANIM01; +} + +void button_return (edict_t *self) +{ + self->moveinfo.state = STATE_DOWN; + + Move_Calc (self, self->moveinfo.start_origin, button_done); + + self->s.frame = 0; + + if (self->health) + self->takedamage = DAMAGE_YES; +} + +void button_wait (edict_t *self) +{ + self->moveinfo.state = STATE_TOP; + self->s.effects &= ~EF_ANIM01; + self->s.effects |= EF_ANIM23; + + G_UseTargets (self, self->activator); + self->s.frame = 1; + if (self->moveinfo.wait >= 0) + { + self->nextthink = level.time + self->moveinfo.wait; + self->think = button_return; + } +} + +bool button_fire (edict_t *self) +{ + if (self->moveinfo.state == STATE_UP || self->moveinfo.state == STATE_TOP) + return false; + + self->moveinfo.state = STATE_UP; + if ((self->moveinfo.sound_start != -1) && !(self->flags & FL_TEAMSLAVE)) + gi.sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self->moveinfo.sound_start, 1, ATTN_NORM, 0); + Move_Calc (self, self->moveinfo.end_origin, button_wait); + return true; +} + +void button_use (edict_t *self, edict_t *other, edict_t *activator) +{ + if (!self->soundName) + { + gi.sound(self, CHAN_VOICE, gi.soundindex("Ambient/Buttons/HiTech/Elevator1.wav"), .6, ATTN_NORM, 0); + } + self->activator = activator; + if (button_fire (self)) + { + // want to be able to assign an sp_message to a button + if (self->sp_message) + { + gi.SP_Print(other, self->sp_message); + gi.sound (other, CHAN_AUTO, gi.soundindex ("Misc/Talk.wav"), 1, ATTN_NORM, 0);//FIXME + } + } + self->last_move_time = level.time; +} + +void button_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if (!other->client) + return; + + if (other->health <= 0) + return; + + self->activator = other; + button_fire (self); +} + +void button_killed (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + self->activator = attacker; + self->health = self->max_health; + self->takedamage = DAMAGE_NO; + button_fire (self); +} + +void buttonInit(edict_t *ent) +{ + ent->moveinfo.sound_start = SND_getBModelSoundIndex(ent->soundName, 0); + ent->think = NULL; +} + +void SP_func_button (edict_t *ent) +{ + vec3_t abs_movedir; + float dist; + + gi.soundindex("Ambient/Buttons/HiTech/Elevator1.wav"); + + G_SetMovedir (ent->s.angles, ent->movedir); + ent->movetype = MOVETYPE_STOP; + ent->solid = SOLID_BSP; + gi.setmodel (ent, ent->model); + + if (!ent->speed) + ent->speed = 40; + if (!ent->accel) + ent->accel = ent->speed; + if (!ent->decel) + ent->decel = ent->speed; + + if (!ent->wait) + ent->wait = 3; + if (!st.lip) + st.lip = 4; + + VectorCopy (ent->s.origin, ent->pos1); + abs_movedir[0] = fabs(ent->movedir[0]); + abs_movedir[1] = fabs(ent->movedir[1]); + abs_movedir[2] = fabs(ent->movedir[2]); + dist = abs_movedir[0] * ent->size[0] + abs_movedir[1] * ent->size[1] + abs_movedir[2] * ent->size[2] - st.lip; + VectorMA (ent->pos1, dist, ent->movedir, ent->pos2); + + ent->use = button_use; + + if (!ent->targetname) + { + ent->plUse = button_use; + ent->last_move_time = level.time - 10.0;//safe for monsters to use me... + } + + ent->s.effects |= EF_ANIM01; + + if (ent->spawnflags & NOTQUAD) + { + ent->s.effects |= EF_NOTQUAD; + } + + if (ent->health) + { + ent->max_health = ent->health; + ent->die = button_killed; + ent->takedamage = DAMAGE_YES; + } + else if (! ent->targetname && (ent->spawnflags & 1)) + ent->touch = button_touch; + + ent->moveinfo.state = STATE_BOTTOM; + + ent->moveinfo.speed = ent->speed; + ent->moveinfo.accel = ent->accel; + ent->moveinfo.decel = ent->decel; + ent->moveinfo.wait = ent->wait; + VectorCopy (ent->pos1, ent->moveinfo.start_origin); + VectorCopy (ent->s.angles, ent->moveinfo.start_angles); + VectorCopy (ent->pos2, ent->moveinfo.end_origin); + VectorCopy (ent->s.angles, ent->moveinfo.end_angles); + + gi.linkentity (ent); + + ent->think = buttonInit; + ent->nextthink = level.time + .1; + +} + +/*QUAKED func_water (0 .5 .8) ? START_OPEN +func_water is a moveable water brush. It must be targeted to operate. Use a non-water texture at your own risk. + +START_OPEN causes the water to move to its destination when spawned and operate in reverse. + +"angle" determines the opening direction (up or down only) +"speed" movement speed (25 default) +"wait" wait before returning (-1 default, -1 = TOGGLE) +"lip" lip remaining at end of move (0 default) +"soundName" (yes, these need to be changed) - this has got to be fixed later... +0) no sound +1) water +2) lava +*/ + +void SP_func_water (edict_t *self) +{ + vec3_t abs_movedir; + + G_SetMovedir (self->s.angles, self->movedir); + self->movetype = MOVETYPE_PUSH; + self->solid = SOLID_BSP; + gi.setmodel (self, self->model); + + switch (self->sounds) + { + default: + break; + + case 1: // water + self->moveinfo.sound_start = gi.soundindex ("world/mov_watr.wav"); + self->moveinfo.sound_end = gi.soundindex ("world/stp_watr.wav"); + break; + + case 2: // lava + self->moveinfo.sound_start = gi.soundindex ("world/mov_watr.wav"); + self->moveinfo.sound_end = gi.soundindex ("world/stp_watr.wav"); + break; + } + + // calculate second position + VectorCopy (self->s.origin, self->pos1); + abs_movedir[0] = fabs(self->movedir[0]); + abs_movedir[1] = fabs(self->movedir[1]); + abs_movedir[2] = fabs(self->movedir[2]); + self->moveinfo.distance = abs_movedir[0] * self->size[0] + abs_movedir[1] * self->size[1] + abs_movedir[2] * self->size[2] - st.lip; + VectorMA (self->pos1, self->moveinfo.distance, self->movedir, self->pos2); + + // if it starts open, switch the positions + if (self->spawnflags & DOOR_START_OPEN) + { + VectorCopy (self->pos2, self->s.origin); + VectorCopy (self->pos1, self->pos2); + VectorCopy (self->s.origin, self->pos1); + } + + VectorCopy (self->pos1, self->moveinfo.start_origin); + VectorCopy (self->s.angles, self->moveinfo.start_angles); + VectorCopy (self->pos2, self->moveinfo.end_origin); + VectorCopy (self->s.angles, self->moveinfo.end_angles); + + self->moveinfo.state = STATE_BOTTOM; + + if (!self->speed) + self->speed = 25; + self->moveinfo.accel = self->moveinfo.decel = self->moveinfo.speed = self->speed; + + if (!self->wait) + self->wait = -1; + self->moveinfo.wait = self->wait; + + self->use = door_use; + + if (self->wait == -1) + self->spawnflags |= DOOR_TOGGLE; + + self->classname = "func_door"; + + gi.linkentity (self); +} + + +#define TRAIN_START_ON 1 +#define TRAIN_TOGGLE 2 +#define TRAIN_BLOCK_STOPS 4 + +/*QUAKED func_train (0 .5 .8) ? START_ON TOGGLE BLOCK_STOPS +Trains are moving platforms that players can ride. +The targets origin specifies the min point of the train at each corner. +The train spawns at the first target it is pointing at. +If the train is the target of a button or trigger, it will not begin moving until activated. +speed default 100 +dmg default 2 +"soundname" sound for the train + +*/ +void train_next (edict_t *self); + +void train_blocked (edict_t *self, edict_t *other) +{ + if (!(other->svflags & SVF_MONSTER) && (!other->client) ) + { + // give it a chance to go away on it's own terms (like gibs) + T_Damage (other, self, self, vec3_origin, other->s.origin, other->s.origin, 100000, 1, DAMAGE_NO_KNOCKBACK|DT_MANGLE, MOD_CRUSH); + // if it's still there, nuke it + if (other) + BecomeExplosion1 (other); + return; + } + + if (level.time < self->touch_debounce_time) + return; + + if (!self->dmg) + return; + self->touch_debounce_time = level.time + 0.5; + T_Damage (other, self, self, vec3_origin, other->s.origin, other->s.origin, self->dmg, 1, DAMAGE_NO_KNOCKBACK|DT_MANGLE, MOD_CRUSH); +} + +void train_wait (edict_t *self) +{ + if (self->target_ent->pathtarget) + { + char *savetarget; + edict_t *ent; + + ent = self->target_ent; + savetarget = ent->target; + ent->target = ent->pathtarget; + G_UseTargets (ent, self->activator); + ent->target = savetarget; + + // make sure we didn't get killed by a killtarget + if (!self->inuse) + return; + } + + if (self->moveinfo.wait) + { + if (self->moveinfo.wait > 0) + { + self->nextthink = level.time + self->moveinfo.wait; + self->think = train_next; + } + else if (self->spawnflags & TRAIN_TOGGLE) // && wait < 0 + { + train_next (self); + self->spawnflags &= ~TRAIN_START_ON; + VectorClear (self->velocity); + self->nextthink = 0; + } + + if (!(self->flags & FL_TEAMSLAVE)) + { + if (self->moveinfo.sound_end != -1) + gi.sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self->moveinfo.sound_end, 1, ATTN_NORM, 0); + self->s.sound = 0; + } + } + else + { + train_next (self); + } + +} + +void train_next (edict_t *self) +{ + edict_t *ent; + vec3_t dest; + qboolean first; + + first = true; +again: + if (!self->target) + { +// gi.dprintf ("train_next: no next target\n"); + return; + } + + ent = G_PickTarget (self->target); + if (!ent) + { + gi.dprintf ("train_next: bad target %s\n", self->target); + return; + } + + self->target = ent->target; + + // check for a teleport path_corner + if (ent->spawnflags & 1) + { + if (!first) + { + gi.dprintf ("connected teleport path_corners, see %s at %s\n", ent->classname, vtos(ent->s.origin)); + return; + } + first = false; + VectorSubtract (ent->s.origin, self->mins, self->s.origin); + gi.linkentity (self); + goto again; + } + + self->moveinfo.wait = ent->wait; + self->target_ent = ent; + + if (!(self->flags & FL_TEAMSLAVE)) + { + if (self->moveinfo.sound_start != -1) + gi.sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self->moveinfo.sound_start, 1, ATTN_NORM, 0); + if (self->moveinfo.sound_middle != -1) + { + self->s.sound = self->moveinfo.sound_middle; + self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + } + + VectorSubtract (ent->s.origin, self->mins, dest); + self->moveinfo.state = STATE_TOP; + VectorCopy (self->s.origin, self->moveinfo.start_origin); + VectorCopy (dest, self->moveinfo.end_origin); + Move_Calc (self, dest, train_wait); + self->spawnflags |= TRAIN_START_ON; +} + +void train_resume (edict_t *self) +{ + edict_t *ent; + vec3_t dest; + + ent = self->target_ent; + + VectorSubtract (ent->s.origin, self->mins, dest); + self->moveinfo.state = STATE_TOP; + VectorCopy (self->s.origin, self->moveinfo.start_origin); + VectorCopy (dest, self->moveinfo.end_origin); + Move_Calc (self, dest, train_wait); + self->spawnflags |= TRAIN_START_ON; +} + +void func_train_find (edict_t *self) +{ + edict_t *ent; + + self->moveinfo.sound_start = SND_getBModelSoundIndex(self->soundName, 0); + self->moveinfo.sound_middle = SND_getBModelSoundIndex(self->soundName, 1); + self->moveinfo.sound_end = SND_getBModelSoundIndex(self->soundName, 2); + + if (!self->target) + { + gi.dprintf ("train_find: no target\n"); + return; + } + ent = G_PickTarget (self->target); + if (!ent) + { + gi.dprintf ("train_find: target %s not found\n", self->target); + return; + } + self->target = ent->target; + + VectorSubtract (ent->s.origin, self->mins, self->s.origin); + gi.linkentity (self); + + // if not triggered, start immediately + if (!self->targetname) + self->spawnflags |= TRAIN_START_ON; + + if (self->spawnflags & TRAIN_START_ON) + { + self->nextthink = level.time + FRAMETIME; + self->think = train_next; + self->activator = self; + } +} + +void train_use (edict_t *self, edict_t *other, edict_t *activator) +{ + self->activator = activator; + + if (self->spawnflags & TRAIN_START_ON) + { + if (!(self->spawnflags & TRAIN_TOGGLE)) + return; + self->spawnflags &= ~TRAIN_START_ON; + VectorClear (self->velocity); + self->nextthink = 0; + } + else + { + if (self->target_ent) + train_resume(self); + else + train_next(self); + } +} + +void SP_func_train (edict_t *self) +{ + self->movetype = MOVETYPE_PUSH; + + VectorClear (self->s.angles); + self->blocked = train_blocked; + if (self->spawnflags & TRAIN_BLOCK_STOPS) + self->dmg = 0; + else + { + if (!self->dmg) + self->dmg = 100; + } + self->solid = SOLID_BSP; + gi.setmodel (self, self->model); + + if (!self->speed) + self->speed = 100; + + self->moveinfo.speed = self->speed; + self->moveinfo.accel = self->moveinfo.decel = self->moveinfo.speed; + + self->use = train_use; + self->gravity = 0; + self->friction = 0; + self->airresistance = 0; + gi.linkentity (self); + + if (self->target) + { + // start trains on the second frame, to make sure their targets have had + // a chance to spawn + self->nextthink = level.time + FRAMETIME; + self->think = func_train_find; + } + else + { + gi.dprintf ("func_train without a target at %s\n", vtos(self->absmin)); + } +} + + +/*QUAKED trigger_elevator (0.3 0.1 0.6) (-8 -8 -8) (8 8 8) +*/ +void trigger_elevator_use (edict_t *self, edict_t *other, edict_t *activator) +{ + edict_t *target; + + if (self->movetarget->nextthink) + { +// gi.dprintf("elevator busy\n"); + return; + } + + if (!other->pathtarget) + { + gi.dprintf("elevator used with no pathtarget\n"); + return; + } + + target = G_PickTarget (other->pathtarget); + if (!target) + { + gi.dprintf("elevator used with bad pathtarget: %s\n", other->pathtarget); + return; + } + + self->movetarget->target_ent = target; + train_resume (self->movetarget); +} + +void trigger_elevator_init (edict_t *self) +{ + if (!self->target) + { + gi.dprintf("trigger_elevator has no target\n"); + return; + } + self->movetarget = G_PickTarget (self->target); + if (!self->movetarget) + { + gi.dprintf("trigger_elevator unable to find target %s\n", self->target); + return; + } + if (strcmp(self->movetarget->classname, "func_train") != 0) + { + gi.dprintf("trigger_elevator target %s is not a train\n", self->target); + return; + } + + self->use = trigger_elevator_use; + self->svflags = SVF_NOCLIENT; + +} + +void SP_trigger_elevator (edict_t *self) +{ + self->think = trigger_elevator_init; + self->nextthink = level.time + FRAMETIME; +} + + +/*QUAKED func_timer (0.3 0.1 0.6) (-8 -8 -8) (8 8 8) START_ON +"wait" base time between triggering all targets, default is 1 +"random" wait variance, default is 0 + +so, the basic time between firing is a random time between +(wait - random) and (wait + random) + +"delay" delay before first firing when turned on, default is 0 + +"pausetime" additional delay used only the very first time + and only if spawned with START_ON + +These can used but not touched. +*/ +void func_timer_think (edict_t *self) +{ + G_UseTargets (self, self->activator); + self->nextthink = level.time + self->wait + gi.flrand(-self->random, self->random); +} + +void func_timer_use (edict_t *self, edict_t *other, edict_t *activator) +{ + self->activator = activator; + + // if on, turn it off + if (self->nextthink) + { + self->nextthink = 0; + return; + } + + // turn it on + if (self->delay) + self->nextthink = level.time + self->delay; + else + func_timer_think (self); +} + +void SP_func_timer (edict_t *self) +{ + if (!self->wait) + self->wait = 1.0; + + self->use = func_timer_use; + self->think = func_timer_think; + + if (self->random >= self->wait) + { + self->random = self->wait - FRAMETIME; + gi.dprintf("func_timer at %s has random >= wait\n", vtos(self->s.origin)); + } + + if (self->spawnflags & 1) + { + self->nextthink = level.time + 1.0 + st.pausetime + self->delay + self->wait + gi.flrand(-self->random, self->random); + self->activator = self; + } + + self->svflags = SVF_NOCLIENT; +} + + +/*QUAKED func_conveyor (0 .5 .8) ? START_ON TOGGLE +Conveyors are stationary brushes that move what's on them. +The brush should be have a surface with at least one current content enabled. +speed default 100 +*/ + +void func_conveyor_use (edict_t *self, edict_t *other, edict_t *activator) +{ + if (self->spawnflags & 1) + { + self->speed = 0; + self->spawnflags &= ~1; + } + else + { + self->speed = self->count; + self->spawnflags |= 1; + } + + if (!(self->spawnflags & 2)) + self->count = 0; +} + +void SP_func_conveyor (edict_t *self) +{ + if (!self->speed) + self->speed = 100; + + if (!(self->spawnflags & 1)) + { + self->count = self->speed; + self->speed = 0; + } + + self->use = func_conveyor_use; + + gi.setmodel (self, self->model); + self->solid = SOLID_BSP; + gi.linkentity (self); +} + + + +/*QUAKED func_killbox (1 0 0) ? +Kills everything inside when fired, irrespective of protection. +*/ +void use_killbox (edict_t *self, edict_t *other, edict_t *activator) +{ + KillBox (self); +} + +void SP_func_killbox (edict_t *ent) +{ + gi.setmodel (ent, ent->model); + ent->use = use_killbox; + ent->svflags = SVF_NOCLIENT; +} + +/*QUAKED func_pushkillbox (1 0 0) ? + +volume - speed things are shot out at +count - angle they're shot out at + +*/ + +void touch_pushkillbox (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + + vec3_t feet; + vec3_t up = {0,0,1}; + + VectorCopy(other->s.origin, feet); + feet[2] += other->mins[2]; + + T_Damage(other, self, self, up, feet, feet, 100000, 0, 0, MOD_CRUSH); + + if (other->client) + { + other->movetype = MOVETYPE_DAN; + } + else + { + ai_public_c* aipub = other->ai; + ai_c * ai; + ai = (ai_c*)aipub; // sigh, is this really necessary? + + if (ai) + { + if(ai->GetBody()) + { + ai->GetBody()->SetTrainDeath(true); + } + } + other->movetype = MOVETYPE_NOCLIP; + } + other->velocity[0] = self->volume * cos(DEGTORAD * self->count); + other->velocity[1] = self->volume * sin(DEGTORAD * self->count); + other->velocity[2] = 0; + other->elasticity = -1; +// other->friction = 0; +// other->gravity = 0; + gi.linkentity(other); + +} + +void SP_func_pushkillbox (edict_t *self) +{ + gi.setmodel (self, self->model); + self->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID|MASK_DEADSOLID; + self->touch = touch_pushkillbox; + self->solid = SOLID_BSP; + self->movetype = MOVETYPE_NONE; + self->svflags |= SVF_NOCLIENT; + gi.linkentity(self); +} + +/* +====================================================================== + +DOORS + + spawn a trigger surrounding the entire team unless it is + already targeted by another + +====================================================================== +*/ + +/*QUAKED func_door (0 .5 .8) ? START_OPEN x CRUSHER NOMONSTER LOCKED TOGGLE ANIMATED_FAST AUTOOPEN USE_TARGET x DUAL_TARGET +TOGGLE wait in both the start and end states for a trigger event. +START_OPEN the door to moves to its destination when spawned, and operate in reverse. It is used to temporarily or permanently close off an area when triggered (not useful for touch or takedamage doors). +NOMONSTER monsters will not trigger this door +LOCKED - door won't open until used by a non-player entity +USE_TARGET - door can be used by player even if it has a targetname +DUAL_TARGET - door fires target on both open AND closed, instead of just open + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"sp_message" is for a string package ID (numerical) +"angle" determines the opening direction +"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door. +"health" if set, door must be shot open +"speed" movement speed (100 default) +"wait" wait before returning (3 default, -1 = never return) +"lip" lip remaining at end of move (8 default) +"dmg" damage to inflict when blocked (2 default) +"soundName" - name of the sound type for the door +*/ + +qboolean smart_door_side_check (edict_t *self, edict_t *activator) +{ + vec3_t doorpoints[3], inplane[2], normal, toplayer; + + if (!activator) + { + return false; + } + +// make a plane containing the origins of the origin brush, the door, and a point +// which is the sum of movedir (slightly rearranged (x, z, y)) and one of the others + VectorCopy(self->s.origin, doorpoints[0]); // origin brush origin + VectorAdd(self->s.origin, self->mins, doorpoints[1]); + VectorMA(doorpoints[1], .5, self->size, doorpoints[1]); // door center + doorpoints[2][0] = self->s.origin[0] + self->movedir[2]; + doorpoints[2][1] = self->s.origin[1] + self->movedir[0]; + doorpoints[2][2] = self->s.origin[2] + self->movedir[1]; // third point + VectorSubtract(doorpoints[1],doorpoints[0],inplane[0]); + VectorSubtract(doorpoints[2],doorpoints[0],inplane[1]); + CrossProduct(inplane[0], inplane[1], normal); + VectorSubtract(activator->s.origin, doorpoints[1], toplayer); + if ( DotProduct(normal, toplayer) < 0 ) + { + return true; + } + return false; +} + + +void door_use_areaportals (edict_t *self) +{ + edict_t *t = NULL; + + if (!self->target) + return; + + while ((t = G_Find (t, FOFS(targetname), self->target))) + { + if (stricmp(t->classname, "func_areaportal") == 0) + { + t->count ^= 1; // toggle state + gi.SetAreaPortalState (t->style, t->count); + } + } +} + +void door_go_down (edict_t *self); + +void door_hit_top (edict_t *self) +{ + if (!(self->flags & FL_TEAMSLAVE)) + { + if (self->moveinfo.sound_end != -1) + gi.sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self->moveinfo.sound_end, 1, ATTN_NORM, 0); + self->s.sound = 0; + } + self->moveinfo.state = STATE_TOP; + if (self->spawnflags & DOOR_START_OPEN) + { + if (self->DoorIsOpen) + { + door_use_areaportals (self); + self->DoorIsOpen = false; + } + else + { + self->DoorIsOpen = true; + } + } + else + { + self->DoorIsOpen = true; + } + if (self->spawnflags & DOOR_TOGGLE) + return; + if (self->moveinfo.wait >= 0) + { + if(!(self->flags & FL_TEAMSLAVE)) + { //this might be dangerous... + if (strcmp(self->classname, "func_door_portcullis") == 0) + { + self->moveinfo.thinkfunc = Move_Done; + } + else + { + self->think = door_go_down; + } + self->nextthink = level.time + self->moveinfo.wait; + } + } +} + +void door_hit_bottom (edict_t *self) +{ + if (!(self->flags & FL_TEAMSLAVE)) + { + if (self->moveinfo.sound_end != -1) + gi.sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self->moveinfo.sound_end, 1, ATTN_NORM, 0); + self->s.sound = 0; + } + self->moveinfo.state = STATE_BOTTOM; + if (!(self->spawnflags & DOOR_START_OPEN)) + { + + if (self->DoorIsOpen) + { + door_use_areaportals (self); + self->DoorIsOpen = false; + } + else + { + self->DoorIsOpen = true; + } + } + else + { + self->DoorIsOpen = true; + } +} + +void door_go_down_logic(edict_t *self) +{ + if (self->max_health) + { + self->takedamage = DAMAGE_YES; + self->health = self->max_health; + } + + self->moveinfo.state = STATE_DOWN; + if ( (strcmp(self->classname, "func_door") == 0) || (strcmp(self->classname, "func_door_portcullis") == 0) ) + Move_Calc (self, self->moveinfo.start_origin, door_hit_bottom); + else if (strcmp(self->classname, "func_door_rotating_smart") == 0) + { + AngleMove_Calc (self, door_hit_bottom); + VectorMakePos(self->moveinfo.end_angles, self->moveinfo.end_angles); + } + else if (strcmp(self->classname, "func_door_rotating") == 0) + AngleMove_Calc (self, door_hit_bottom); + + if (self->spawnflags & DOOR_START_OPEN) + { + if (!self->DoorIsOpen) + { + door_use_areaportals (self); + } + } +} + +#define DOOR_FIND_RAD 96 + +void door_go_down (edict_t *self) +{ + //I think I'm getting into slightly dangerous territory here - but the current doors are so damn annoying, I kind of have to... + + edict_t *search = 0; + int close = 1; + edict_t *source; + + // only go down if none of your components are blocked... + // this is totally arbitrary... hope it works okay... + for(source = self; source; source = source->teamchain) + { + CRadiusContent rad(source->s.origin, DOOR_FIND_RAD); + + for(int i = 0; i < rad.getNumFound(); i++) + { + search = rad.foundEdict(i); + + if(search->client || search->ai) + { + if(search->health > 0) + { + close = 0; + } + } + } + if(!close) + { + self->nextthink = level.time + 1.0; + return; + } + } + + if (self->moveinfo.sound_start != -1) + gi.sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self->moveinfo.sound_start, 1, ATTN_NORM, 0); + if(self->moveinfo.sound_middle != -1) + { + self->s.sound = self->moveinfo.sound_middle; + self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + + if (self->spawnflags & DOOR_DUALTARGET) + { + G_UseTargets (self, self); + } + + // slave doors should not call this. only masters. + if (self->teammaster && (self->teammaster != self)) + { + return; + } + for(source = self; source; source = source->teamchain) + { + door_go_down_logic(source); + } +} + +void door_go_up (edict_t *self, edict_t *activator) +{ + if (self->moveinfo.state == STATE_UP) + return; // already going up + + if (self->moveinfo.state == STATE_TOP) + { // reset top wait time + if (self->moveinfo.wait >= 0) + self->nextthink = level.time + self->moveinfo.wait; + return; + } + + if (!(self->flags & FL_TEAMSLAVE)) + { + if (self->moveinfo.sound_start != -1) + gi.sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self->moveinfo.sound_start, 1, ATTN_NORM, 0); + if (self->moveinfo.sound_middle != -1) + { + self->s.sound = self->moveinfo.sound_middle; + self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + } + self->moveinfo.state = STATE_UP; + if ( (strcmp(self->classname, "func_door") == 0) || (strcmp(self->classname, "func_door_portcullis") == 0) ) + { + Move_Calc (self, self->moveinfo.end_origin, door_hit_top); + } + else if (strcmp(self->classname, "func_door_rotating_smart") == 0) + { + if (smart_door_side_check(self, activator)) + { + VectorNegate(self->moveinfo.end_angles, self->moveinfo.end_angles); + } + AngleMove_Calc (self, door_hit_top); + } + else if (strcmp(self->classname, "func_door_rotating") == 0) + { + AngleMove_Calc (self, door_hit_top); + } + G_UseTargets (self, activator); + if (!(self->spawnflags & DOOR_START_OPEN)) + { + if (!self->DoorIsOpen) + { + door_use_areaportals (self); + } + } +} + +void door_use (edict_t *self, edict_t *other, edict_t *activator) +{ + edict_t *ent; + + // A non-player used it, so unlock door + if ((self->health != -667)&&(self->spawnflags & DOOR_LOCKED)) + { + self->spawnflags &= ~DOOR_LOCKED; + // if this door is chained to another, unlock both of them + if (self->teamchain) + { + door_use(self->teamchain, other, activator); + } + return; // That's all we want to do + } + + if (self->spawnflags & DOOR_LOCKED) // It's locked, silly. + return; + + if (self->flags & FL_TEAMSLAVE) + { + door_use(self->teammaster, other, activator); + return; + } + + if (!(self->spawnflags & DOOR_USE_TARGET)) // This lets player use a door that's got a targetname + { + if((self->targetname)&&(self->health == -667)) + { + return;//prevents team chain doors from being used... + } + } + + + if (self->spawnflags & DOOR_TOGGLE) + { + if (self->moveinfo.state == STATE_UP || self->moveinfo.state == STATE_TOP) + { + // trigger all paired doors + for (ent = self ; ent ; ent = ent->teamchain) + { + ent->message = NULL; + ent->sp_message = 0; + ent->touch = NULL; + door_go_down (ent); + } + return; + } + } + + // trigger all paired doors + for (ent = self ; ent ; ent = ent->teamchain) + { + ent->message = NULL; + ent->sp_message = NULL; + ent->touch = NULL; + + // kef -- when a door is used by a script, the 'other' will be the script_runner. when + //the door is used by a player, the 'other' will be the player. in either case, we want + //to use 'other'. HOWEVER, if the door is activated by a trigger, the trigger's origin + //is, well, the origin, so in that case we want to use the activator. + // + //BOTTOM LINE: only use 'other' when it's a script_runner. + // +// door_go_up (ent, activator); + if (strcmp(other->classname, "script_runner") == 0) + { + door_go_up (ent, other); + } + else + { + door_go_up (ent, activator); + } + } +} + +void plDoorUse(edict_t *self, edict_t *other, edict_t *activator) +{ + int oldHealth; + + oldHealth = self->health; + self->health = -667; + // check for nomonster here + if ((self->spawnflags & DOOR_NOMONSTER) && (other->svflags & SVF_MONSTER)) + return; + door_use(self, other, activator); + self->last_move_time = level.time; + self->health = oldHealth; +} + +void Touch_DoorTrigger (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + int oldHealth; + + oldHealth = self->owner->health; + + if (other->health <= 0) + return; + + if (!(other->svflags & SVF_MONSTER) && (!other->client)) + return; + + if ((self->owner->spawnflags & DOOR_NOMONSTER) && (other->svflags & SVF_MONSTER)) + return; + + if (level.time < self->touch_debounce_time) + return; + + // if a player is touching this door trigger, let door_use know by setting the door's + //health to some nutty value. additionally, we don't want any ai guys unlocking this + //door early by bumping into the trigger. + if (other && (other->client || other->ai)) + { + self->owner->health = -667; + } + + self->touch_debounce_time = level.time + 1.0; + door_use (self->owner, other, other); + self->owner->health = oldHealth; +} + +void Use_DoorTrigger(edict_t *self, edict_t *other, edict_t *activator) +{ + if (other->health <= 0) + return; + + if (!(other->svflags & SVF_MONSTER) && (!other->client)) + return; + + if ((self->owner->spawnflags & DOOR_NOMONSTER) && (other->svflags & SVF_MONSTER)) + return; + + if (level.time < self->touch_debounce_time) + return; + + if(self->owner->targetname) + { + return;//needs to be triggered remotely... + } + + self->touch_debounce_time = level.time + 1.0; + door_use (self->owner, other, other); + self->last_move_time = level.time; +} + +void Think_CalcMoveSpeed (edict_t *self) +{ + edict_t *ent; + float min; + float time; + float newspeed; + float ratio; + float dist; + + self->moveinfo.sound_start = SND_getBModelSoundIndex(self->soundName, 0); + self->moveinfo.sound_middle = SND_getBModelSoundIndex(self->soundName, 1); + self->moveinfo.sound_end = SND_getBModelSoundIndex(self->soundName, 2); + + if (self->flags & FL_TEAMSLAVE) + return; // only the team master does this + + // find the smallest distance any member of the team will be moving + min = fabs(self->moveinfo.distance); + for (ent = self->teamchain; ent; ent = ent->teamchain) + { + dist = fabs(ent->moveinfo.distance); + if (dist < min) + min = dist; + } + + time = min / self->moveinfo.speed; + + // adjust speeds so they will all complete at the same time + for (ent = self; ent; ent = ent->teamchain) + { + newspeed = fabs(ent->moveinfo.distance) / time; + ratio = newspeed / ent->moveinfo.speed; + if (ent->moveinfo.accel == ent->moveinfo.speed) + ent->moveinfo.accel = newspeed; + else + ent->moveinfo.accel *= ratio; + if (ent->moveinfo.decel == ent->moveinfo.speed) + ent->moveinfo.decel = newspeed; + else + ent->moveinfo.decel *= ratio; + ent->moveinfo.speed = newspeed; + } +} + +void Think_SpawnDoorTrigger (edict_t *ent) +{ + edict_t *other; + vec3_t mins, maxs; + + ent->moveinfo.sound_start = SND_getBModelSoundIndex(ent->soundName, 0); + ent->moveinfo.sound_middle = SND_getBModelSoundIndex(ent->soundName, 1); + ent->moveinfo.sound_end = SND_getBModelSoundIndex(ent->soundName, 2); + + if (ent->flags & FL_TEAMSLAVE) + return; // only the team leader spawns a trigger + + VectorCopy (ent->absmin, mins); + VectorCopy (ent->absmax, maxs); + + for (other = ent->teamchain ; other ; other=other->teamchain) + { + AddPointToBounds (other->absmin, mins, maxs); + AddPointToBounds (other->absmax, mins, maxs); + } + + // expand + mins[0] -= 60; + mins[1] -= 60; + maxs[0] += 60; + maxs[1] += 60; + + other = G_Spawn (); + VectorCopy (mins, other->mins); + VectorCopy (maxs, other->maxs); + other->owner = ent; + other->solid = SOLID_TRIGGER; + other->movetype = MOVETYPE_NONE; + other->touch = Touch_DoorTrigger; + other->use = Use_DoorTrigger; + other->plUse = Use_DoorTrigger; + ent->last_move_time = level.time - 10.0;//safe for monsters to use me... + gi.linkentity (other); + + if (ent->spawnflags & DOOR_START_OPEN) + door_use_areaportals (ent); + + Think_CalcMoveSpeed (ent); +} + +void portcullis_think(edict_t* ent) +{ // we want the portcullis to remain closed at all times unless it has recently been + //used by a trigger_keep_using, in which case it's allowed to keep opening. as soon + //as it stops being used, it starts closing. + + // save this door's state. if it changes by the end of this fn, we may want + //to use our target + int nOldState = ent->moveinfo.state; + edict_t *ourTarget = NULL; + + if ((level.time - ent->last_move_time) > (2*FRAMETIME)) + { // hasn't been used recently. start closing. + ent->count = 0; + } + if (ent->count) + { // opening -- use ent->speed + ent->moveinfo.accel = ent->moveinfo.decel = ent->moveinfo.speed = ent->speed; + if ((ent->moveinfo.state == STATE_UP) || + (ent->moveinfo.state == STATE_TOP)) + { // keep going with current thinking + if (ent->moveinfo.thinkfunc) + { + if (ent->moveinfo.wait < level.time) + { + ent->moveinfo.thinkfunc(ent); + if (ent->moveinfo.wait > 0) + { + ent->moveinfo.wait = 0; + } + } + } + else + { + door_go_up(ent, ent); + } + } + else + { // we just got used by a trigger, so start moving up + ent->moveinfo.thinkfunc = NULL; + door_go_up(ent, ent); + } + } + else + { // closing -- use ent->volume + ent->moveinfo.accel = ent->moveinfo.decel = ent->moveinfo.speed = ent->volume; + if (ent->moveinfo.state == STATE_DOWN) + { // keep going with current thinking + if (ent->moveinfo.thinkfunc) + { + if (ent->moveinfo.wait < level.time) + { + ent->moveinfo.thinkfunc(ent); + if (ent->moveinfo.wait > 0) + { + ent->moveinfo.wait = 0; + } + } + } + else + { + door_go_down(ent); + } + } + else if (ent->moveinfo.state == STATE_BOTTOM) + { // don't do anything. we're closed. + } + else + { // we just stopped being used by a trigger, so start moving down + ent->moveinfo.thinkfunc = NULL; + door_go_down(ent); + } + } + + // if the door just started going up, fire our target. + //if it just started going down, fire our target. + + // 11/2/99 kef -- changed this to "use" our target every frame, cuz our target is + //designed to be a misc_iraq_valve with the PORTCULLIS flag, an object which can + //figure out what to do based on the door's state. + if (true || (ent->moveinfo.state == STATE_UP) && (ent->moveinfo.state != nOldState) ) + { // started going up + if (ent->target) + { + while ((ourTarget = G_Find (ourTarget, FOFS(targetname), ent->target))) + { + ourTarget->use(ourTarget, ent, ent); + } + } + } + else if ( (ent->moveinfo.state == STATE_DOWN) && (ent->moveinfo.state != nOldState) ) + { // started going down + if (ent->target) + { + while ((ourTarget = G_Find (ourTarget, FOFS(targetname), ent->target))) + { + ourTarget->use(ourTarget, ent, ent); + } + } + } + ent->nextthink = level.time + FRAMETIME; +} + +void door_blocked (edict_t *self, edict_t *other) +{ + vec3_t toTarget; + edict_t *ent; + + if(other->s.solid == SOLID_CORPSE) + { + other->s.solid = SOLID_NOT; + } + + if (!(other->svflags & SVF_MONSTER) && (!other->client) ) + { + // give it a chance to go away on it's own terms (like gibs) + T_Damage (other, self, self, vec3_origin, other->s.origin, other->s.origin, 100000, 1, 0, MOD_CRUSH); + // if it's still there, nuke it + if (other) + BecomeExplosion1 (other); + return; + } + +// T_Damage (other, self, self, vec3_origin, other->s.origin, other->s.origin, self->dmg, 1, 0, MOD_CRUSH); + + if (self->spawnflags & DOOR_CRUSHER) + { // if there's a monster blocking the door, gib it + if (other->ai) + { // calculating the direction of damage (sigh)... + // + // if the door moves horizontally, use [-movedir[1], movedir[0], 0] for a damage dir. if it + //moves vertically, you're out of luck + vec3_t vDamageDir = {-self->movedir[1], self->movedir[0], 0}; + vec3_t vDamageOrigin; + + VectorMA(other->s.origin, -100, vDamageDir, vDamageOrigin); + VectorMA(other->s.origin, 50, vDamageDir, other->s.origin); + T_Damage (other, self, self, vDamageDir, other->s.origin, vDamageOrigin, 1000/*dmg*/, 100/*knockback*/, + DT_MANGLE, MOD_CRUSH); + } + return; + } + + // ok, if the thing being hit by the door is ai, give it some knockback + if (other->ai) + { + VectorSubtract(other->s.origin, self->s.origin, toTarget); + toTarget[2] = 10; + T_Damage (other, self, self, toTarget, other->s.origin, self->s.origin, 1/*dmg*/, 100/*knockback*/, + 0, MOD_CRUSH); + return; + } + +// if a door has a negative wait, it would never come back if blocked, +// so let it just squash the object to death real fast + if (self->moveinfo.wait >= 0) + { + if (self->moveinfo.state == STATE_DOWN) + { + for (ent = self->teammaster ; ent ; ent = ent->teamchain) + door_go_up (ent, other); +// door_go_up (ent, ent->activator); + } + else + { + for (ent = self->teammaster ; ent ; ent = ent->teamchain) + door_go_down (ent); + } + } + self->nextthink = level.time + .1; +} + +void door_killed (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + edict_t *ent; + + for (ent = self->teammaster ; ent ; ent = ent->teamchain) + { + ent->health = ent->max_health; + ent->takedamage = DAMAGE_NO; + } + door_use (self->teammaster, attacker, attacker); +} + +void door_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + + if (!other->client) // eh? + return; + + if (level.time < self->touch_debounce_time) + return; + self->touch_debounce_time = level.time + 5.0; + + if (self->sp_message) + { + gi.SP_Print(other, self->sp_message); + gi.sound (other, CHAN_AUTO, gi.soundindex ("Misc/Talk.wav"), 1, ATTN_NORM, 0);//FIXME + } + else + { + gi.centerprintf (other, "%s", self->message); + gi.sound (other, CHAN_AUTO, gi.soundindex ("Misc/Talk.wav"), 1, ATTN_NORM, 0);//FIXME + } +} + +void door_spawn_areaportal_think (edict_t *ent) +{ + bool bAutoOpen = (ent->classname && (0 == strcmp("func_door", ent->classname)) && (ent->spawnflags & 128)); + bool bPortcullis = ent->classname && (0 == strcmp("func_door_portcullis", ent->classname)); + + if (ent->spawnflags & DOOR_START_OPEN) + { + door_use_areaportals (ent); + } + + // I know this looks a little silly and redundant, but I don't want to spend the time + //figuring out the proper logical representation of these conditions. basically, I want + //doors marked as auto-open to open automatically, no matter what. is that so much to ask? + if (bAutoOpen) + { + ent->think = Think_SpawnDoorTrigger; + } + else if (bPortcullis) + { // needs to go back to its own think function + ent->think = portcullis_think; + } + else + { // such a mess. such, such a mess. +// if (ent->health || ent->targetname || (!bAutoOpen)) + ent->think = Think_CalcMoveSpeed; +// else +// ent->think = Think_SpawnDoorTrigger; + } + + ent->nextthink = level.time + FRAMETIME; + +} +void SP_func_door (edict_t *ent) +{ + vec3_t abs_movedir; + + G_SetMovedir (ent->s.angles, ent->movedir); + ent->movetype = MOVETYPE_PUSH; + ent->solid = SOLID_BSP; + gi.setmodel (ent, ent->model); + + ent->blocked = door_blocked; + ent->use = door_use; + + if ((!ent->targetname) || (ent->spawnflags & DOOR_USE_TARGET)) + { + ent->plUse = plDoorUse; + ent->last_move_time = level.time - 10.0;//safe for monsters to use me... + } + + if (!ent->speed) + ent->speed = 100; + if (dm->isDM()) + ent->speed *= 2; + + if (!ent->accel) + ent->accel = ent->speed; + if (!ent->decel) + ent->decel = ent->speed; + + if (!ent->wait) + ent->wait = 3; + if (!st.lip) + st.lip = 8; + if (!ent->dmg) + ent->dmg = 2; + + // calculate second position + VectorCopy (ent->s.origin, ent->pos1); + abs_movedir[0] = fabs(ent->movedir[0]); + abs_movedir[1] = fabs(ent->movedir[1]); + abs_movedir[2] = fabs(ent->movedir[2]); + ent->moveinfo.distance = abs_movedir[0] * ent->size[0] + abs_movedir[1] * ent->size[1] + abs_movedir[2] * ent->size[2] - st.lip; + VectorMA (ent->pos1, ent->moveinfo.distance, ent->movedir, ent->pos2); + + // if it starts open, switch the positions + ent->DoorIsOpen = false; + if (ent->spawnflags & DOOR_START_OPEN) + { + VectorCopy (ent->pos2, ent->s.origin); + VectorCopy (ent->pos1, ent->pos2); + VectorCopy (ent->s.origin, ent->pos1); + ent->DoorIsOpen = true; + } + + ent->moveinfo.state = STATE_BOTTOM; + + if (ent->health) + { + ent->takedamage = DAMAGE_YES; + ent->die = door_killed; + ent->max_health = ent->health; + } + else if (ent->targetname && (ent->message || ent->sp_message)) + { + gi.soundindex ("misc/talk.wav"); + ent->touch = door_touch; + } + + ent->moveinfo.speed = ent->speed; + ent->moveinfo.accel = ent->accel; + ent->moveinfo.decel = ent->decel; + ent->moveinfo.wait = ent->wait; + VectorCopy (ent->pos1, ent->moveinfo.start_origin); + VectorCopy (ent->s.angles, ent->moveinfo.start_angles); + VectorCopy (ent->pos2, ent->moveinfo.end_origin); + VectorCopy (ent->s.angles, ent->moveinfo.end_angles); + +// if (ent->spawnflags & 16) +// ent->s.effects |= EF_ANIM_ALL; +// if (ent->spawnflags & 64) +// ent->s.effects |= EF_ANIM_ALLFAST; + + // to simplify logic elsewhere, make non-teamed doors into a team of one + if (!ent->team) + ent->teammaster = ent; + + gi.linkentity (ent); + + ent->think = door_spawn_areaportal_think; + ent->nextthink = level.time + FRAMETIME; + +} + + +/*QUAKED func_door_rotating (0 .5 .8) ? START_OPEN REVERSE CRUSHER NOMONSTER LOCKED TOGGLE X_AXIS Y_AXIS USE_TARGET IGNORE_HACK +TOGGLE causes the door to wait in both the start and end states for a trigger event. + +START_OPEN the door to moves to its destination when spawned, and operate in reverse. It is used to temporarily or permanently close off an area when triggered (not useful for touch or takedamage doors). +NOMONSTER monsters will not trigger this door +LOCKED - door won't open until used by a non-player entity +USE_TARGET - door can be used by player even if it has a targetname +IGNORE_HACK - use this flag if the door's origin is not at the edge (hope you're happy, Zuk) + +You need to have an origin brush as part of this entity. The center of that brush will be +the point around which it is rotated. It will rotate around the Z axis by default. You can +check either the X_AXIS or Y_AXIS box to change that. + +"distance" is how many degrees the door will be rotated. +"speed" determines how fast the door moves; default value is 100. + +REVERSE will cause the door to rotate in the opposite direction. + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"sp_message" is for a string package ID (numerical) +"angle" determines the opening direction +"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door. +"health" if set, door must be shot open +"speed" movement speed (100 default) +"wait" wait before returning (3 default, -1 = never return) +"dmg" damage to inflict when blocked (2 default) +"soundName" - sound type for the door +*/ + +void SP_func_door_rotating (edict_t *ent) +{ + VectorClear (ent->s.angles); + + // set the axis of rotation + VectorClear(ent->movedir); + if (ent->spawnflags & DOOR_X_AXIS) + { + ent->movedir[2] = 1.0; + if (!(ent->spawnflags & DOOR_IGNOREHACK)) + { + ent->svflags |= SVF_DOORHACK_X; + } + } + else if (ent->spawnflags & DOOR_Y_AXIS) + { + ent->movedir[0] = 1.0; + if (!(ent->spawnflags & DOOR_IGNOREHACK)) + { + ent->svflags |= SVF_DOORHACK_Y; + } + } + else // Z_AXIS + { + ent->movedir[1] = 1.0; + if (!(ent->spawnflags & DOOR_IGNOREHACK)) + { + ent->svflags |= SVF_DOORHACK_Z; + } + } + + // check for reverse rotation + if (ent->spawnflags & DOOR_REVERSE) + VectorNegate (ent->movedir, ent->movedir); + + if (!st.distance) + { +// gi.dprintf("%s at %s with no distance set\n", ent->classname, vtos(ent->s.origin)); + st.distance = 90; + } + + VectorCopy (ent->s.angles, ent->pos1); + VectorMA (ent->s.angles, st.distance, ent->movedir, ent->pos2); + ent->moveinfo.distance = st.distance; + + ent->movetype = MOVETYPE_PUSH; + ent->solid = SOLID_BSP; + gi.setmodel (ent, ent->model); + + ent->blocked = door_blocked; + ent->use = door_use; + if ((!ent->targetname) || (ent->spawnflags & DOOR_USE_TARGET)) + { + ent->plUse = plDoorUse; + ent->last_move_time = level.time - 10.0;//safe for monsters to use me... + } + + if (!ent->speed) + ent->speed = 100; + if (!ent->accel) + ent->accel = ent->speed; + if (!ent->decel) + ent->decel = ent->speed; + + if (!ent->wait) + ent->wait = 3; + if (!ent->dmg) + ent->dmg = 2; + + // if it starts open, switch the positions + if (ent->spawnflags & DOOR_START_OPEN) + { + VectorCopy (ent->pos2, ent->s.angles); + VectorCopy (ent->pos1, ent->pos2); + VectorCopy (ent->s.angles, ent->pos1); + VectorNegate (ent->movedir, ent->movedir); + } + + if (ent->health) + { + ent->takedamage = DAMAGE_YES; + ent->die = door_killed; + ent->max_health = ent->health; + } + + if (ent->targetname && (ent->message || ent->sp_message)) + { + gi.soundindex ("misc/talk.wav"); + ent->touch = door_touch; + } + + ent->moveinfo.state = STATE_BOTTOM; + ent->moveinfo.speed = ent->speed; + ent->moveinfo.accel = ent->accel; + ent->moveinfo.decel = ent->decel; + ent->moveinfo.wait = ent->wait; + VectorCopy (ent->s.origin, ent->moveinfo.start_origin); + VectorCopy (ent->pos1, ent->moveinfo.start_angles); + VectorCopy (ent->s.origin, ent->moveinfo.end_origin); + VectorCopy (ent->pos2, ent->moveinfo.end_angles); + +// if (ent->spawnflags & 16) +// ent->s.effects |= EF_ANIM_ALL; + + // to simplify logic elsewhere, make non-teamed doors into a team of one + if (!ent->team) + ent->teammaster = ent; + + gi.linkentity (ent); + + ent->think = door_spawn_areaportal_think; + ent->nextthink = level.time + FRAMETIME; +} + +/*QUAKED func_door_rotating_smart (0 .5 .8) ? START_OPEN REVERSE CRUSHER NOMONSTER LOCKED TOGGLE X_AXIS Y_AXIS USE_TARGET IGNORE_HACK + +TOGGLE causes the door to wait in both the start and end states for a trigger event. + +START_OPEN the door to moves to its destination when spawned, and operate in reverse. It is used to temporarily or permanently close off an area when triggered (not useful for touch or takedamage doors). +NOMONSTER monsters will not trigger this door +LOCKED - door won't open until used by a non-player entity +USE_TARGET - door can be used by player even if it has a targetname +IGNORE_HACK - use this flag if the door's origin is not at the edge (hope you're happy, Zuk) + +You need to have an origin brush as part of this entity. The center of that brush will be +the point around which it is rotated. It will rotate around the Z axis by default. You can +check either the X_AXIS or Y_AXIS box to change that. + +"distance" is how many degrees the door will be rotated. +"speed" determines how fast the door moves; default value is 100. + +The door will open in the direction opposite that of its activator. + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"sp_message" is for a string package ID (numerical) +"angle" determines the opening direction +"targetname" if set, no touch field will be spawned and a remote button or trigger field activates the door. +"health" if set, door must be shot open +"speed" movement speed (100 default) +"wait" wait before returning (3 default, -1 = never return) +"dmg" damage to inflict when blocked (2 default) +"soundName" - Sound type for the door +*/ + +void SP_func_door_rotating_smart (edict_t *ent) +{ + VectorClear (ent->s.angles); + + ent->classname = "func_door_rotating_smart"; + + // set the axis of rotation + VectorClear(ent->movedir); + if (ent->spawnflags & DOOR_X_AXIS) + { + ent->movedir[2] = 1.0; + if (!(ent->spawnflags & DOOR_IGNOREHACK)) + { + ent->svflags |= SVF_DOORHACK_X; + } + } + else if (ent->spawnflags & DOOR_Y_AXIS) + { + ent->movedir[0] = 1.0; + if (!(ent->spawnflags & DOOR_IGNOREHACK)) + { + ent->svflags |= SVF_DOORHACK_Y; + } + } + else // Z_AXIS + { + ent->movedir[1] = 1.0; + if (!(ent->spawnflags & DOOR_IGNOREHACK)) + { + ent->svflags |= SVF_DOORHACK_Z; + } + } + + // check for reverse rotation +// if (ent->spawnflags & DOOR_REVERSE) +// VectorNegate (ent->movedir, ent->movedir); + + if (!st.distance) + { +// gi.dprintf("%s at %s with no distance set\n", ent->classname, vtos(ent->s.origin)); + st.distance = 90; + } + + VectorCopy (ent->s.angles, ent->pos1); + VectorMA (ent->s.angles, st.distance, ent->movedir, ent->pos2); + ent->moveinfo.distance = st.distance; + + ent->movetype = MOVETYPE_PUSH; + ent->solid = SOLID_BSP; + gi.setmodel (ent, ent->model); + + ent->blocked = door_blocked; + ent->use = door_use; + + if ((!ent->targetname) || (ent->spawnflags & DOOR_USE_TARGET)) + { + ent->plUse = plDoorUse; + ent->last_move_time = level.time - 10.0;//safe for monsters to use me... + } + + if (!ent->speed) + ent->speed = 100; + if (!ent->accel) + ent->accel = ent->speed; + if (!ent->decel) + ent->decel = ent->speed; + + if (!ent->wait) + ent->wait = 3; + if (!ent->dmg) + ent->dmg = 2; + + // if it starts open, switch the positions + if (ent->spawnflags & DOOR_START_OPEN) + { + VectorCopy (ent->pos2, ent->s.angles); + VectorCopy (ent->pos1, ent->pos2); + VectorCopy (ent->s.angles, ent->pos1); + VectorNegate (ent->movedir, ent->movedir); + } + + if (ent->health) + { + ent->takedamage = DAMAGE_YES; + ent->die = door_killed; + ent->max_health = ent->health; + } + + if (ent->targetname && (ent->message || ent->sp_message)) + { + gi.soundindex ("misc/talk.wav"); + ent->touch = door_touch; + } + + ent->moveinfo.state = STATE_BOTTOM; + ent->moveinfo.speed = ent->speed; + ent->moveinfo.accel = ent->accel; + ent->moveinfo.decel = ent->decel; + ent->moveinfo.wait = ent->wait; + VectorCopy (ent->s.origin, ent->moveinfo.start_origin); + VectorCopy (ent->pos1, ent->moveinfo.start_angles); + VectorCopy (ent->s.origin, ent->moveinfo.end_origin); + VectorCopy (ent->pos2, ent->moveinfo.end_angles); + +// if (ent->spawnflags & 16) +// ent->s.effects |= EF_ANIM_ALL; + + // to simplify logic elsewhere, make non-teamed doors into a team of one + if (!ent->team) + ent->teammaster = ent; + + gi.linkentity (ent); + + ent->think = door_spawn_areaportal_think; + ent->nextthink = level.time + FRAMETIME; +} + +/*QUAKED func_door_secret (0 .5 .8) ? always_shoot 1st_left 1st_down +A secret door. Slide back and then to the side. + +open_once doors never closes +1st_left 1st move is left of arrow +1st_down 1st move is down from arrow +always_shoot door is shootebale even if targeted + +"angle" determines the direction +"dmg" damage to inflic when blocked (default 2) +"wait" how long to hold in the open position (default 5, -1 means hold) +*/ + +#define SECRET_ALWAYS_SHOOT 1 +#define SECRET_1ST_LEFT 2 +#define SECRET_1ST_DOWN 4 + +void door_secret_move1 (edict_t *self); +void door_secret_move2 (edict_t *self); +void door_secret_move3 (edict_t *self); +void door_secret_move4 (edict_t *self); +void door_secret_move5 (edict_t *self); +void door_secret_move6 (edict_t *self); +void door_secret_done (edict_t *self); + +void door_secret_use (edict_t *self, edict_t *other, edict_t *activator) +{ + // make sure we're not already moving + if (!VectorCompare(self->s.origin, vec3_origin)) + return; + + Move_Calc (self, self->pos1, door_secret_move1); + door_use_areaportals (self); +} + +void door_secret_move1 (edict_t *self) +{ + self->nextthink = level.time + 1.0; + self->think = door_secret_move2; +} + +void door_secret_move2 (edict_t *self) +{ + Move_Calc (self, self->pos2, door_secret_move3); +} + +void door_secret_move3 (edict_t *self) +{ + if (self->wait == -1) + return; + self->nextthink = level.time + self->wait; + self->think = door_secret_move4; +} + +void door_secret_move4 (edict_t *self) +{ + Move_Calc (self, self->pos1, door_secret_move5); +} + +void door_secret_move5 (edict_t *self) +{ + self->nextthink = level.time + 1.0; + self->think = door_secret_move6; +} + +void door_secret_move6 (edict_t *self) +{ + Move_Calc (self, vec3_origin, door_secret_done); +} + +void door_secret_done (edict_t *self) +{ + if (!(self->targetname) || (self->spawnflags & SECRET_ALWAYS_SHOOT)) + { + self->health = 0; + self->takedamage = DAMAGE_YES; + } + door_use_areaportals (self); +} + +void door_secret_blocked (edict_t *self, edict_t *other) +{ + if (!(other->svflags & SVF_MONSTER) && (!other->client) ) + { + // give it a chance to go away on it's own terms (like gibs) + T_Damage (other, self, self, vec3_origin, other->s.origin, other->s.origin, 100000, 1, 0, MOD_CRUSH); + // if it's still there, nuke it + if (other) + BecomeExplosion1 (other); + return; + } + + if (level.time < self->touch_debounce_time) + return; + self->touch_debounce_time = level.time + 0.5; + + T_Damage (other, self, self, vec3_origin, other->s.origin, other->s.origin, self->dmg, 1, 0, MOD_CRUSH); +} + +void door_secret_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + self->takedamage = DAMAGE_NO; + door_secret_use (self, attacker, attacker); +} + +void SP_func_door_secret (edict_t *ent) +{ + vec3_t forward, right, up; + float side; + float width; + float length; + +// ent->moveinfo.sound_start = gi.soundindex ("doors/dr1_strt.wav"); +// ent->moveinfo.sound_middle = gi.soundindex ("doors/dr1_mid.wav"); +// ent->moveinfo.sound_end = gi.soundindex ("doors/dr1_end.wav"); + + ent->movetype = MOVETYPE_PUSH; + ent->solid = SOLID_BSP; + gi.setmodel (ent, ent->model); + + ent->blocked = door_secret_blocked; + ent->use = door_secret_use; + ent->plUse = door_secret_use; + ent->last_move_time = level.time - 10.0;//safe for monsters to use me... + + if (!(ent->targetname) || (ent->spawnflags & SECRET_ALWAYS_SHOOT)) + { + ent->health = 0; + ent->takedamage = DAMAGE_YES; + ent->die = door_secret_die; + } + + if (!ent->dmg) + ent->dmg = 2; + + if (!ent->wait) + ent->wait = 5; + + ent->moveinfo.accel = + ent->moveinfo.decel = + ent->moveinfo.speed = 50; + + // calculate positions + AngleVectors (ent->s.angles, forward, right, up); + VectorClear (ent->s.angles); + side = 1.0 - (ent->spawnflags & SECRET_1ST_LEFT); + if (ent->spawnflags & SECRET_1ST_DOWN) + width = fabs(DotProduct(up, ent->size)); + else + width = fabs(DotProduct(right, ent->size)); + length = fabs(DotProduct(forward, ent->size)); + if (ent->spawnflags & SECRET_1ST_DOWN) + VectorMA (ent->s.origin, -1 * width, up, ent->pos1); + else + VectorMA (ent->s.origin, side * width, right, ent->pos1); + VectorMA (ent->pos1, length, forward, ent->pos2); + + if (ent->health) + { + ent->takedamage = DAMAGE_YES; + ent->die = door_killed; + ent->max_health = ent->health; + } + else if (ent->targetname && (ent->message || ent->sp_message)) + { + gi.soundindex ("misc/talk.wav"); + ent->touch = door_touch; + } + + ent->classname = "func_door"; + + gi.linkentity (ent); +} + +/*QUAKED func_remote_camera (0 0.5 0.8) (-4 -4 -4) (4 4 4) ACTIVATOR_ONLY SCRIPTED NO_DELETE LW_ANIMATE + + pathtarget - holds the name of the camera's owner entity (if any). + target - holds the name of the entity to be looked at. + style - changes the player's FOV to assigned value while in camera if defined + volume - defines the cinematic mode: + 0 - normal (standard FPS, player can shoot) + 1 - third person + 2 - letterbox + 4 - monitor (graphic overlay border) + 8 - remote with no special features + 16 - sniper scope + ACTIVATOR_ONLY - only the activating client will see the remote camera view. + SCRIPTED - puts player in godmode while camera is running and makes player non-solid + NO_DELETE - don't delete camera + LW_ANIMATE - camera will animate without a target after its initial spawn, + but it still needs a target for its initial position + This should ONLY be used for one-shot cameras. +*/ +/* programmer note: I am using decel to store the player's old FOV +*/ + +void remove_camera(edict_t *Self) +{ + if(Self->spawnflags&CAMERA_ACTIVATOR_ONLY) + { + // Just for the activator. + if (Self->style) + { + // FIXME see hack note is Use function + Self->activator->client->ps.fov = Self->decel; + } + + Self->activator->client->RemoteCameraLockCount--; + Self->activator->client->ps.remote_id = -1; + Self->activator->client->ps.remote_type = REMOTE_TYPE_FPS; + + if(Self->spawnflags & CAMERA_GODMODE) + { + Self->activator->flags = Self->activator->flags & ~(FL_GODMODE); + // restore client to solid state + Self->activator->solid = SOLID_BBOX; + } + } + else + { + // For all clients. + + int i; + edict_t *cl_ent; + + for(i=0;iinuse) + continue; + if (Self->style) + { + cl_ent->client->ps.fov = Self->decel; + } + + cl_ent->client->RemoteCameraLockCount--; + cl_ent->client->ps.remote_id = -1; + cl_ent->client->ps.remote_type = REMOTE_TYPE_FPS; + if (Self->spawnflags & CAMERA_GODMODE) + { + cl_ent->flags = cl_ent->flags & ~(FL_GODMODE); + // restore client to solid state + cl_ent->solid = SOLID_BBOX; + } + } + } + + Self->count = 0; + + if(!(Self->spawnflags&CAMERA_NODELETE)) + { + G_FreeEdict(Self); + } +} + +void func_remote_camera_think(edict_t *Self) +{ + // Update the position on client(s). + + if(Self->spawnflags&CAMERA_ACTIVATOR_ONLY) + { + // Just for the activator. + + // 1/13/00 kef -- if I'm dead, don't do this. that would be silly. + if (Self->activator->client) + { + if (Self->activator->deadflag == DEAD_DEAD) + { + return; + } + } + + if(Self->activator->client->RemoteCameraNumber==Self->s.number) + { + int i; + + if (Self->spawnflags & CAMERA_CAMERA_MODEL) // Looking through camera model + { + for(i=0;i<3;i++) + { + Self->activator->client->ps.remote_vieworigin[i]=Self->targetEnt->s.origin[i]*8.0; + } + } + else + { + for(i=0;i<3;i++) + { + Self->activator->client->ps.remote_vieworigin[i]=Self->s.origin[i]*8.0; + } + } + } + } + else + { + // For all clients. + int i; + edict_t *cl_ent; + + for(i=0;iinuse) + continue; + + // 1/13/00 kef -- if I'm dead, don't do this. that would be silly. + if (cl_ent->client) + { + if (cl_ent->deadflag == DEAD_DEAD) + { + continue; + } + } + + if(cl_ent->client->RemoteCameraNumber==Self->s.number) + { + int j; + + if (Self->spawnflags & CAMERA_CAMERA_MODEL) // Looking through camera model + { + for(j=0;j<3;j++) + { + cl_ent->client->ps.remote_vieworigin[j]=Self->targetEnt->s.origin[j]*8.0; + } + } + else + { + for(j=0;j<3;j++) + { + cl_ent->client->ps.remote_vieworigin[j]=Self->s.origin[j]*8.0; + } + } + } + } + } +// ******************************************************************************************** +// Find my target entity and then orientate myself to look at it. +// ******************************************************************************************** + + if(Self->targetEnt) + { + // Calculate the angles from myself to my target. + + vec3_t Forward; + + if (!(Self->spawnflags & CAMERA_LWANIMATE)) + { + VectorSubtract(Self->targetEnt->s.origin,Self->s.origin,Forward); + VectorNormalize(Forward); + vectoangles(Forward,Self->s.angles); + } + + + // Update the angles on client(s). + + if(Self->spawnflags&CAMERA_ACTIVATOR_ONLY) + { + // Just for the activator. + + if(Self->activator->client->RemoteCameraNumber==Self->s.number) + { + int i; + + if (Self->spawnflags & CAMERA_CAMERA_MODEL) // Looking through camera model + { + for(i=0;i<3;i++) + { + Self->activator->client->ps.remote_viewangles[i]=Self->targetEnt->s.angles[i]; + } + } + else + { + for(i=0;i<3;i++) + { + Self->activator->client->ps.remote_viewangles[i]=Self->s.angles[i]; + } + } + } + } + else + { + // For all clients. + + int i; + edict_t *cl_ent; + + for(i=0;iinuse) + continue; + + if(cl_ent->client->RemoteCameraNumber==Self->s.number) + { + int j; + + if (Self->spawnflags & CAMERA_CAMERA_MODEL) // Looking through camera model + { + for(j=0;j<3;j++) + { + cl_ent->client->ps.remote_viewangles[j]=Self->targetEnt->s.angles[j]; + } + } + else + { + for(j=0;j<3;j++) + { + cl_ent->client->ps.remote_viewangles[j]=Self->s.angles[j]; + } + } + } + } + } + } + + Self->nextthink = level.time+FRAMETIME; +} + +void Use_remote_camera(edict_t *Self,edict_t *Other,edict_t *Activator) +{ + vec3_t Forward; + + // 1/13/00 kef -- if I'm dead, don't do this. that would be silly. + if (Activator->client) + { + if (Activator->deadflag == DEAD_DEAD) + { + return; + } + } + + + // If I'm already in a remote camera view, then get out of that view, so we can get into the new one! + if(Activator->client) + { + if((Activator->client->ps.remote_id >= 0) && (Activator->client->ps.remote_id != Self->s.number)) + { + edict_t *camera = NULL; + + do + { + camera = G_Find(camera,FOFS(classname),"func_remote_camera"); + if (!camera) + { + Com_Printf("Error in Camera Scripting! Check your 'use' and 'remove' commands!/n"); + break; + } + if (camera->s.number == Activator->client->ps.remote_id) + { + remove_camera(camera); + break; + } + } + while(1); + } + } + + + // If I'm already in THIS remote camera, toggle me off + if(Self->count) + { + // I am a scripted camera, so free myself before returning. + // or I am a camera that is toggled by the player use key + remove_camera(Self); + return; + } + + Self->count=1; // means I'm i use + + // ******************************************************************************************** + // Signal to client(s) that a remote camera view is active, + // ******************************************************************************************** + + if(Self->spawnflags & CAMERA_ACTIVATOR_ONLY) + { + if (!Activator->client) + { + Com_Printf("Error in Camera Scripting! Activator (%s) is not a client!\n", Activator->classname); + return; + } + + // Signal to just the activator (i.e. person who was ultimately responsible for triggering the + // remote camera) that their camera view has changed to a remote camera view.. + if (Self->style) // fov defined for this camera + { + Self->decel = Activator->client->ps.fov; // storage of player's old fov + Activator->client->ps.fov = Self->style; + } + + Self->activator=Activator; + Self->activator->client->RemoteCameraLockCount++; + Self->activator->client->RemoteCameraNumber=Self->s.number; + Self->activator->client->RemoteCameraType=Self->volume; + } + else + { + // Signal to all clients that their camera view has changed to a remote camera view.. + int i; + edict_t *cl_ent; + + Self->activator=Activator; + + for(i=0;iinuse) + continue; + + if (Self->style)// fov defined for this camera + { +// AAAGH! FIXME. This will only store the last player's fov. Other players will get +// the first player's fov after the camera's gone! + Self->decel = cl_ent->client->ps.fov; // storage + cl_ent->client->ps.fov = Self->style; + } + cl_ent->client->RemoteCameraLockCount++; + cl_ent->client->RemoteCameraNumber=Self->s.number; + cl_ent->client->RemoteCameraType=Self->volume; + } + } + +// ******************************************************************************************** +// Attempt to find my owner entity (i.e. what I'm fixed to). If nothing is found, then I am a +// static camera so set up my position here (it will remain unchanged hereafter). +// ******************************************************************************************** + +// set up my position (which might change in scripting hereafter). + + if(Self->spawnflags&CAMERA_ACTIVATOR_ONLY) + { + // Just for the activator. + int i; + + Self->enemy=NULL; + for(i=0;i<3;i++) + { + Self->activator->client->ps.remote_vieworigin[i]=Self->s.origin[i]*8.0; + } + } + else + { + // For all clients. + int i,j; + edict_t *cl_ent; + + Self->enemy=NULL; + for(i=0;iinuse) + { + continue; + } + for(j=0;j<3;j++) + { + cl_ent->client->ps.remote_vieworigin[j]=Self->s.origin[j]*8.0; + } + } + } +// ******************************************************************************************** +// Find my target entity and then orientate myself to look at it. +// ******************************************************************************************** + Self->targetEnt=G_Find(NULL,FOFS(targetname),Self->target); + + if (Self->targetEnt) // If targeting a camera model it will follow the models angles + { + VectorSubtract(Self->targetEnt->s.origin,Self->s.origin,Forward); + VectorNormalize(Forward); + vectoangles(Forward,Self->s.angles); + + if ((strcmp(Self->targetEnt->classname,"misc_generic_security_camera")==0) || + (strcmp(Self->targetEnt->classname,"misc_generic_security_camera2")==0)) + Self->spawnflags |= CAMERA_CAMERA_MODEL; + } + + + // Update the angles on client(s). + if(Self->spawnflags&CAMERA_ACTIVATOR_ONLY) + { + // Just for the activator. + if(Self->activator->client->RemoteCameraNumber==Self->s.number) + { + int i; + + for(i=0;i<3;i++) + { + Self->activator->client->ps.remote_viewangles[i]=Self->s.angles[i]; + } + } + } + else + { + // For all clients. + int i; + edict_t *cl_ent; + + for(i=0;iinuse) + continue; + + if(cl_ent->client->RemoteCameraNumber==Self->s.number) + { + int j; + + for(j=0;j<3;j++) + { + + cl_ent->client->ps.remote_viewangles[j]=Self->s.angles[j]; + } + } + } + } + + if(Self->spawnflags & CAMERA_GODMODE) // set godmode if camera is scripted + { + if (Self->spawnflags & CAMERA_ACTIVATOR_ONLY) + { + Activator->flags |= FL_GODMODE; + // set client to non-solid + Activator->solid = SOLID_NOT; + } + else + { + int i; + edict_t *cl_ent; + + + for(i=0;iinuse) + continue; + cl_ent->flags |= FL_GODMODE; + // Set all clients to non-solid + cl_ent->solid = SOLID_NOT; + } + } + + } +#if 0 // kef -- moved to ds.cpp/CinematicFreeze() + // make sure this cvar-setting stuff happens _after_ setting the client's remotecameratype + if (g_edicts[1].client) + { + // if we just set our camera type to letterbox, that means we just started a cinematic. + //adjust the proper cvar. + if ( (REMOTE_TYPE_LETTERBOX == g_edicts[1].client->RemoteCameraType) && (!game.cinematicfreeze) ) + { + game.cinematicfreeze = 1; + + // need to make sure these commands don't stay...uh...commanded during the script + gi.AddCommandString ("-attack\n"); + gi.AddCommandString ("-altattack\n"); + gi.AddCommandString ("-weaponExtra1\n"); + gi.AddCommandString ("-weaponExtra2\n"); + gi.AddCommandString ("-use\n"); + +/* kef -- 'cinematic entities' thing is weird + remove_non_cinematic_entites(NULL); +*/ + } + } +#endif // kef -- moved to ds.cpp/CinematicFreeze() + + // ******************************************************************************************** + // Setup next think stuff. + // ******************************************************************************************** + + Self->think=func_remote_camera_think; + Self->nextthink=level.time + FRAMETIME; + + +} + +void SP_func_remote_camera(edict_t *Self) +{ + Self->enemy=Self->targetEnt=NULL; + + if(!Self->target) + { + gi.dprintf("Object 'func_remote_camera' without a target.\n"); + + G_FreeEdict(Self); + + return; + } + + Self->movetype = MOVETYPE_NONE; + Self->solid=SOLID_NOT; + VectorSet(Self->mins,-4,-4,-4); + VectorSet(Self->maxs,4,4,4); + Self->count=0; + + Self->use=Use_remote_camera; + + + if (Self->volume == 4) + { + // kef -- need to precache the image that remote_cameras use to frame the view + entDebrisToCache[CLGHL_ENDOFLIST] = DEBRIS_PRECACHE_IMAGE; + } + gi.linkentity(Self); +} + +/*QUAKED func_alarm (0 .5 .8) (-8 -8 -8) (8 8 8) +Alerts everybody on the level that there is an intruder +*/ + +void alarm_use(edict_t *self, edict_t *other, edict_t *activator) +{ + if(!level.alertedStatus) + { + level.alertedStatus = 1; + //maybe do tons of exciting things here? + } +} + +void SP_func_alarm(edict_t *self) +{ + self->movetype = MOVETYPE_NONE; + self->solid=SOLID_NOT; + VectorSet(self->mins,-4,-4,-4); + VectorSet(self->maxs,4,4,4); + + self->use = alarm_use; +} + + +/*QUAKED func_ignite (0 .5 .8) (-8 -8 -8) (8 8 8) +Roast folks +"Health" Radius of igniting +*/ + +void ignite_use(edict_t *self, edict_t *other, edict_t *activator) +{ + RadiusBurn(self, self->health); +} + +void SP_func_ignite(edict_t *self) +{ + self->movetype = MOVETYPE_NONE; + self->solid=SOLID_NOT; + VectorSet(self->mins,-4,-4,-4); + VectorSet(self->maxs,4,4,4); + + self->use = ignite_use; +} + +/*QUAKED func_Dekker_console (1 .4 .4) (-8 -8 -8) (8 8 8) +Where Dekkers will go to turn on autoguns and make cool stuff happen... +*/ +void SP_func_Dekker_console(edict_t* self) +{ + self->movetype = MOVETYPE_NONE; + self->solid=SOLID_NOT; + VectorSet(self->mins,-4,-4,-4); + VectorSet(self->maxs,4,4,4); +} + +/*QUAKED func_Dekker_diehere (1 .4 .4) (-8 -8 -8) (8 8 8) +Where Good Dekkers go when they die... +*/ +void SP_func_Dekker_diehere(edict_t* self) +{ + self->movetype = MOVETYPE_NONE; + self->solid=SOLID_NOT; + VectorSet(self->mins,-4,-4,-4); + VectorSet(self->maxs,4,4,4); +} + +/*QUAKED func_Dekker_jumphere (1 .4 .4) (-8 -8 -8) (8 8 8) +Spot for Dekker to hop up to... +*/ +void SP_func_Dekker_jumphere(edict_t* self) +{ + self->movetype = MOVETYPE_NONE; + self->solid=SOLID_NOT; + VectorSet(self->mins,-4,-4,-4); + VectorSet(self->maxs,4,4,4); +} + +/*QUAKED func_Dekker_split (1 .4 .4) (-8 -8 -8) (8 8 8) +Split Dekker in half... +*/ +extern int hackGlobalSpawnedBitsForThisGuy; +extern int hackGlobalGibCalls; + +void Dekker_split(edict_t *self, edict_t *other, edict_t *activator) +{ + // get Dekker with MPG + edict_t *dekker = G_Find (NULL, FOFS(classname), "m_x_mraiderboss2"); + if (dekker == NULL) // This isn't right!!! Where is everyone? + { + return; + } + else + { + + ai_public_c* aipub = dekker->ai; + ai_c * ai; + ai = (ai_c*)aipub; // sigh, is this really necessary? + + if (ai) + { + bodyhuman_c *dekkerBody = NULL; + if(dekkerBody = (bodyhuman_c *)ai->GetBody()) + { + gz_info *frontHole=NULL; + gz_info *backHole=NULL; + gz_code frontCode = 0; + gz_code backCode = 0; + vec3_t dir = { 1, 0, 0 }; + + dekkerBody->NextShotsGonnaKillMe(NEXTSHOT_KILLS); + + T_Damage(dekker, self, self, dir, dekker->s.origin, dekker->s.origin, 1000, 0, 0, MOD_CRUSH); + + dekkerBody->AssignFrontAndBackGZones(&frontHole, &frontCode, &backHole, &backCode); + hackGlobalSpawnedBitsForThisGuy=0; + hackGlobalGibCalls=0; + dekkerBody->SeverRoutine(*dekker, dir, frontCode, backCode, frontHole, backHole, true); + } + } + } +} + +void SP_func_Dekker_split(edict_t* self) +{ + self->movetype = MOVETYPE_NONE; + self->solid=SOLID_NOT; + VectorSet(self->mins,-4,-4,-4); + VectorSet(self->maxs,4,4,4); + + self->use = Dekker_split; +} + +/*QUAKED func_door_portcullis (0 .5 .8) ? x x CRUSHER +can only be opened by a trigger_keep_using. + +"message" is printed when the door is touched if it is a trigger door and it hasn't been fired yet +"sp_message" is for a string package ID (numerical) +"angle" determines the opening direction +"targetname" needs a name so the trigger_keep_using can open it +"wait" wait before returning (3 default, -1 = never return) +"lip" lip remaining at end of move (8 default) +"dmg" damage to inflict when blocked (2 default) +"soundName" - name of the sound type for the door + +ch-ch-ch-ch-changes... +"speed" UPWARD movement speed (20 default) +"volume" DOWNWARD movement speed (10 default) +*/ + + +void portcullis_use (edict_t *self, edict_t *other, edict_t *activator) +{ + self->last_move_time = level.time; + self->count = 1; +} + + +void SP_func_door_portcullis(edict_t *ent) +{ + vec3_t abs_movedir; + + G_SetMovedir (ent->s.angles, ent->movedir); + ent->movetype = MOVETYPE_PUSH; + ent->solid = SOLID_BSP; + gi.setmodel (ent, ent->model); + + ent->blocked = door_blocked; + ent->use = portcullis_use; + +// player can never use the door directly +// +// if ((!ent->targetname) || (ent->spawnflags & DOOR_USE_TARGET)) +// { +// ent->plUse = plDoorUse; +// ent->last_move_time = level.time - 10.0;//safe for monsters to use me... +// } + + if (!ent->speed) + ent->speed = 20; + if (!ent->volume) + ent->volume = 10; + if (dm->isDM()) + ent->speed *= 2; + + if (!ent->accel) + ent->accel = ent->speed; + if (!ent->decel) + ent->decel = ent->speed; + + if (!st.lip) + st.lip = 8; + if (!ent->dmg) + ent->dmg = 2; + + // calculate second position + VectorCopy (ent->s.origin, ent->pos1); + abs_movedir[0] = fabs(ent->movedir[0]); + abs_movedir[1] = fabs(ent->movedir[1]); + abs_movedir[2] = fabs(ent->movedir[2]); + ent->moveinfo.distance = abs_movedir[0] * ent->size[0] + abs_movedir[1] * ent->size[1] + abs_movedir[2] * ent->size[2] - st.lip; + VectorMA (ent->pos1, ent->moveinfo.distance, ent->movedir, ent->pos2); + + // if it starts open, switch the positions + ent->DoorIsOpen = false; + if (ent->spawnflags & DOOR_START_OPEN) + { + VectorCopy (ent->pos2, ent->s.origin); + VectorCopy (ent->pos1, ent->pos2); + VectorCopy (ent->s.origin, ent->pos1); + ent->DoorIsOpen = true; + } + + ent->count = 0; // indicates we're not currently being used by a trigger_keep_using + ent->wait = 0; // having a wait would be bad + ent->moveinfo.state = STATE_BOTTOM; + +// if (ent->health) +// { +// ent->takedamage = DAMAGE_YES; +// ent->die = door_killed; +// ent->max_health = ent->health; +// } +// else + if (ent->targetname && (ent->message || ent->sp_message)) + { + gi.soundindex ("misc/talk.wav"); + ent->touch = door_touch; + } + + ent->moveinfo.speed = ent->speed; + ent->moveinfo.accel = ent->accel; + ent->moveinfo.decel = ent->decel; + ent->moveinfo.wait = ent->wait; + VectorCopy (ent->pos1, ent->moveinfo.start_origin); + VectorCopy (ent->s.angles, ent->moveinfo.start_angles); + VectorCopy (ent->pos2, ent->moveinfo.end_origin); + VectorCopy (ent->s.angles, ent->moveinfo.end_angles); + +// if (ent->spawnflags & 16) +// ent->s.effects |= EF_ANIM_ALL; +// if (ent->spawnflags & 64) +// ent->s.effects |= EF_ANIM_ALLFAST; + + // to simplify logic elsewhere, make non-teamed doors into a team of one + if (!ent->team) + ent->teammaster = ent; + + gi.linkentity (ent); + + ent->think = door_spawn_areaportal_think; + ent->nextthink = level.time + FRAMETIME; + +} + + +/*QUAKED func_hide_the_players_gun (0 1 0) (-4 -4 -4) (4 4 4) +health -- 1 if you're disguised, 0 if you're not +if you set wait to -1 then use, count will indicate if we're currently disguised, 1 == disguised, 0 == not +*/ + +void f_HtPG_use (edict_t *self, edict_t *other, edict_t *activator) +{//NICE! + if(level.sight_client) + { + if(level.sight_client->client) + { + if(level.sight_client->client->inv) + { + sharedEdict_t sh; + sh.inv = (inven_c *)level.sight_client->client->inv; + sh.edict = level.sight_client; + + sh.inv->setOwner(&sh); + + // kef -- if wait == -1 we're querying for our disguise state, return it via + // count == 0 not disguised + // count == 1 disguised + if (self->wait == -1) + { + self->count = sh.inv->inDisguise()?1:0; + self->wait = 0; + } + else + { + sh.inv->becomeDisguised(); + self->health = sh.inv->inDisguise()?1:0; + } + } + } + } +} + + +void SP_func_hide_the_players_gun(edict_t *ent) +{ + ent->movetype = MOVETYPE_NONE; + ent->solid=SOLID_NOT; + VectorSet(ent->mins,-4,-4,-4); + VectorSet(ent->maxs,4,4,4); + + // kef -- John assures me that the client's inv is set up before edicts upon loading a saved game, so + //we _should_ have a valid concept of disguisedness at this time +// if(level.sight_client && level.sight_client->client && level.sight_client->client->inv) + if (g_edicts[1].client && g_edicts[1].client->inv) + { + sharedEdict_t sh; + sh.inv = (inven_c *)g_edicts[1].client->inv; + sh.edict = &g_edicts[1]; + + sh.inv->setOwner(&sh); + ent->health = sh.inv->inDisguise()?1:0; + } + else + { // just...heh...assume we're not disguised + ent->health = 0; + } + ent->use=f_HtPG_use; + + gi.linkentity(ent); +} + +void use_snipercam_zoom(edict_t *self, edict_t *other, edict_t *activator) +{ + if (self->wait == -1) + { // reset to normal fov. I'm sure I shouldn't hardcode this. + g_edicts[1].client->ps.fov = 95; + if (ei_show->value) + { + Com_Printf("new fov = %d\n", (int)g_edicts[1].client->ps.fov); + } + return; + } + + g_edicts[1].client->ps.fov = self->wait; + + if (g_edicts[1].client->ps.fov < 6) + { + g_edicts[1].client->ps.fov = 6; + } + + if (g_edicts[1].client->ps.fov > 60) + { + g_edicts[1].client->ps.fov = 60; + } + if (ei_show->value) + { + Com_Printf("new fov = %d\n", (int)g_edicts[1].client->ps.fov); + } +} + +/*QUAKED func_snipercam_zoom (0 1 0) (-4 -4 -4) (4 4 4) + + ------------ KEYS ------------ + count desired fov, clamped to [6,60]. -1 resets to normal fov. "use" to update. +*/ + +void SP_func_snipercam_zoom(edict_t *ent) +{ + ent->movetype = MOVETYPE_NONE; + ent->solid=SOLID_NOT; + VectorSet(ent->mins,-4,-4,-4); + VectorSet(ent->maxs,4,4,4); + + ent->use = use_snipercam_zoom; + ent->count = -1; + + gi.linkentity(ent); +} + +void use_mission_status(edict_t *self, edict_t *other, edict_t *activator) +{ + if (0 == strcmp("exitwarning_on", other->targetname)) + { + level.missionStatus = MISSION_EXIT; + return; + } + else if (0 == strcmp("exitwarning_off", other->targetname)) + { + level.missionStatus = MISSION_NONE; + return; + } + level.missionStatus = self->count; +} + +/*QUAKED func_mission_status (0 1 0) (-4 -4 -4) (4 4 4) + + ------------ KEYS ------------ + count actual status of the mission. 0 = nothing yet, 1 = success. "use" to update. + + + ----------- NOTES ------------ + near the end of a level, set up 2 trigger_multiples to target this func_mission_status. + one of the triggers should have a targetname of "exitwarning_on", the other should be + called "exitwarning_off". place "exitwarning_off" a short distance from the exit. place + "exitwarning_on" in between "exitwarning_off" and the exit itself. +*/ + +void SP_func_mission_status(edict_t *ent) +{ + ent->movetype = MOVETYPE_NONE; + ent->solid=SOLID_NOT; + VectorSet(ent->mins,-4,-4,-4); + VectorSet(ent->maxs,4,4,4); + + ent->use = use_mission_status; + + gi.linkentity(ent); +} + +void use_player_health(edict_t *self, edict_t *other, edict_t *activator) +{ + g_edicts[1].health += self->count; + if (g_edicts[1].health > 100) + { + g_edicts[1].health = 100; + } + else if (g_edicts[1].health < 0) + { + g_edicts[1].health = 0; + } +} + +/*QUAKED func_player_health (0 1 0) (-4 -4 -4) (4 4 4) + + ------------ KEYS ------------ + count add this to the player's health when this func_player_health is used +*/ + +void SP_func_player_health(edict_t *ent) +{ + ent->movetype = MOVETYPE_NONE; + ent->solid=SOLID_NOT; + VectorSet(ent->mins,-4,-4,-4); + VectorSet(ent->maxs,4,4,4); + + ent->use = use_player_health; + + gi.linkentity(ent); +} + +void use_player_armor(edict_t *self, edict_t *other, edict_t *activator) +{ + g_edicts[1].client->inv->addArmor(self->count); +} + +/*QUAKED func_player_armor (0 1 0) (-4 -4 -4) (4 4 4) + + ------------ KEYS ------------ + count add this to the player's armor when this func_player_armor is used +*/ + +void SP_func_player_armor(edict_t *ent) +{ + ent->movetype = MOVETYPE_NONE; + ent->solid=SOLID_NOT; + VectorSet(ent->mins,-4,-4,-4); + VectorSet(ent->maxs,4,4,4); + + ent->use = use_player_armor; + + gi.linkentity(ent); +} + +void use_player_item(edict_t *self, edict_t *other, edict_t *activator) +{ + sharedEdict_t sh; + + sh.inv = (inven_c *)g_edicts[1].client->inv; + + if (!self->count) + { + gi.dprintf("hey! you can't add zero items to the player's inventory!\n"); + return; + } + + if ( (self->health <= 0) || (self->health > 7) ) + { + gi.dprintf("hey! adding an invalid item type to the player's inventory!\n"); + return; + } + + if (!sh.inv) + { + gi.dprintf("hey! no inventory!\n"); + return; + } + + sh.inv->addItem(self->health, self->count); +} + +/*QUAKED func_player_item (0 1 0) (-4 -4 -4) (4 4 4) + + ------------ KEYS ------------ + count number of items to be added to player's inventory when this func_player_item is used + health item to be added to player's inventory when this func_player_item is used + + SFE_FLASHPACK 1 + SFE_C4 2 + SFE_LIGHT_GOGGLES 3 + SFE_MEDKIT 5 + SFE_GRENADE 6 + +*/ + +void SP_func_player_item(edict_t *ent) +{ + ent->movetype = MOVETYPE_NONE; + ent->solid=SOLID_NOT; + VectorSet(ent->mins,-4,-4,-4); + VectorSet(ent->maxs,4,4,4); + + ent->use = use_player_item; + + gi.linkentity(ent); +} + diff --git a/Source/Game/gamecpp/g_generic.cpp b/Source/Game/gamecpp/g_generic.cpp new file mode 100644 index 0000000..41d7b63 --- /dev/null +++ b/Source/Game/gamecpp/g_generic.cpp @@ -0,0 +1,9555 @@ +/****************************************************** + * Generic Objects * + ******************************************************/ + +#include "g_local.h" +#include "g_obj.h" +#include "ai_private.h" // hmmm, is this kosher? +#include "callback.h" +#include "..\qcommon\ef_flags.h" + +extern void debug_drawbox(edict_t* self,vec3_t vOrigin, vec3_t vMins, vec3_t vMaxs, int nColor); + +void drawthink(edict_t *ent) +{ + debug_drawbox(ent, NULL, NULL, NULL, 0xFFFFFFFF); + ent->nextthink = level.time + .1; +} + +// For barrel +#define BARREL_ON_FIRE 4 +#define BARREL_EXPLOSIVE 4 + +// For car_american +#define CAR_AMERICAN_POLICE 0 +#define CAR_AMERICAN_TAXI 1 +#define CAR_AMERICAN_CADILLAC 2 +#define CAR_AMERICAN_MIAMI 3 + +#define CAR_AMERICAN_ON 4 +#define CAR_AMERICAN_SIREN 8 + +// For security camera +#define SECCAM_ROTATE 4 +#define SECCAM_TRIGGERING 8 +#define SECCAM_WALL 16 + +// european car +#define CAR_TRIGGER_SPAWN 4 + +// forklift +#define FORKLIFT_TRIGGER_SPAWN 4 + + +#define SPEAKER_WALL 4 + +#define AUTOGUN_ACTIVE 4 +#define AUTOGUN_ARC_LIMITED 8 +#define AUTOGUN_NO_TRIPOD 16 +#define AUTOGUN_NO_HANGY_THINGY 32 + +#define AUTOGUN_TOGGLEABLE 16 +#define AUTOGUN_TRIGGER_SPAWN 32 + +#define TANK_PROPANE_NODEBRIS 4 + +#define TRAIN_TRIGGERED 1 +#define TRAIN_RESPAWNER 2 +#define TRAIN_START_ACTIVE 4 +#define TRAIN_DECCELERATE 8 +#define TRAIN_DISAPPEAR 16 +#define TRAIN_IDLE 32 + +#define TRAIN_BRAKE_FACTOR 5 + +#define FAN_BIG_START_OFF 4 + +#define SF_NOANIMATE 4 + +#define PLAYER_FLIPPABLE (1<<2) + +// c4 flags +#define C4_START_OFF (1<<2) + +#define SHELF_FALL (M_PI*.05) +#define TOP_FALL (M_PI*.06) + + +// Health of each object +#define HLTH_GEN_ACCESS_CARD 500 +#define HLTH_GEN_BANNER 0 +#define HLTH_GEN_BARBWIRE_COIL 500 +#define HLTH_GEN_BARREL_BURNING 260 +#define HLTH_GEN_BARREL_CHEMICAL 260 +#define HLTH_GEN_BARREL_WINE 500 +#define HLTH_GEN_BENCH 250 +#define HLTH_GEN_BLINDS 200 +#define HLTH_GEN_BOLTON 200 +#define HLTH_GEN_BOOKCASE 500 +#define HLTH_GEN_BOOKSHELF 500 +#define HLTH_GEN_BROOM 60 +#define HLTH_GEN_BUNK 500 +#define HLTH_GEN_CAR_AMERICAN 2000 +#define HLTH_GEN_CAR_EUROPEAN 2000 +#define HLTH_GEN_CAR_HONDA 2000 +#define HLTH_GEN_CAR_ROLLS 2000 +#define HLTH_GEN_CAR_SPORTS 2000 +#define HLTH_GEN_CART 400 +#define HLTH_GEN_CASH_REGISTER 1000 +#define HLTH_GEN_CHAIR_LEGS 400 +#define HLTH_GEN_CHAIR_LEGS2 400 +#define HLTH_GEN_CHAIR_OFFICE 600 +#define HLTH_GEN_CHUNKS_BRICK 50 +#define HLTH_GEN_CHUNKS_GLASS 25 +#define HLTH_GEN_CHUNKS_METAL 100 +#define HLTH_GEN_CHUNKS_ROCK 50 +#define HLTH_GEN_CHUNKS_WALL 10 +#define HLTH_GEN_CHUNKS_WOOD 30 +#define HLTH_GEN_COMP_KEYBOARD 100 +#define HLTH_GEN_COMP_MONITOR 250 +#define HLTH_GEN_COMP_MONITOR2 250 +#define HLTH_GEN_CRATE_FISH 500 +#define HLTH_GEN_DESK_PHONE 50 +#define HLTH_GEN_FAN_BIG 500 +#define HLTH_GEN_FAUCET 150 +#define HLTH_GEN_FIRE_EXTINGUISHER 150 +#define HLTH_GEN_FIRE_HYDRANT 500 +#define HLTH_GEN_FISH 150 +#define HLTH_GEN_FISH_DEAD 100 +#define HLTH_GEN_FLAG_POLE 500 +#define HLTH_GEN_FORKLIFT 2000 +#define HLTH_GEN_GARBAGE_BAG 100 +#define HLTH_GEN_GUN_AUTO 2000 +#define HLTH_GEN_GUN_BIG 1//4000 +#define HLTH_GEN_HEAP 200 +#define HLTH_GEN_LIGHT_BEAM 250 +#define HLTH_GEN_LIGHT_FLARE 500 +#define HLTH_GEN_MOTORCYCLE 2000 +#define HLTH_GEN_ORANGE_CONE 500 +#define HLTH_GEN_PALETTE_JACK 1000 +#define HLTH_GEN_PAPER_BLOWING 25 +#define HLTH_GEN_PARKING_METER 500 +#define HLTH_GEN_PHONE_BOOTH 1000 +#define HLTH_GEN_PILLOW 100 +#define HLTH_GEN_PLANT_POTTED 200 +#define HLTH_GEN_PLANT_TALL 200 +#define HLTH_GEN_RADAR_BASE 5000 +#define HLTH_GEN_RADAR_DISH 5000 +#define HLTH_GEN_RADIO 100 +#define HLTH_GEN_SECURITY_CAM 200 +#define HLTH_GEN_SHOVEL 200 +#define HLTH_GEN_SHRUB1 200 +#define HLTH_GEN_SINK 200 +#define HLTH_GEN_SOFA 2000 +#define HLTH_GEN_SOFA_CHAIR 1000 +#define HLTH_GEN_SPEAKER 100 +#define HLTH_GEN_STOPLIGHT 2000 +#define HLTH_GEN_STREETSIGN 500 +#define HLTH_GEN_SWORD 150 +#define HLTH_GEN_SWORD_LARGE 150 +#define HLTH_GEN_TABLE_BACK 50 +#define HLTH_GEN_TABLE_LEG 50 +#define HLTH_GEN_TABLE_ROUND 400 +#define HLTH_GEN_TABLE1 400 +#define HLTH_GEN_TABLE2 1000 +#define HLTH_GEN_TANK1 4000 +#define HLTH_GEN_TANK_GAS 8 +#define HLTH_GEN_TANK_PROPANE 8 +#define HLTH_GEN_TOILET 200 +#define HLTH_GEN_TRAIN 9000 +#define HLTH_GEN_TRASH_ASHTRAY 100 +#define HLTH_GEN_TRASHCAN_BARREL 200 +#define HLTH_GEN_TREE_DEAD 1000 +#define HLTH_GEN_TREE_THIN 500 +#define HLTH_GEN_TRUCKCAB 3000 +#define HLTH_GEN_TV_CEILING 300 +#define HLTH_GEN_TV_WALL 300 +#define HLTH_GEN_URINAL 200 +#define HLTH_GEN_URINAL_CAKE 100 +#define HLTH_GEN_URN 25 +#define HLTH_GEN_WASTE_BASKET 150 +#define HLTH_GEN_WPN_BAT 400 +#define HLTH_GEN_WPN_DESERT_EAGLE 1000 +#define HLTH_GEN_WPN_GLOCK 1000 +#define HLTH_GEN_WPN_INGRAM 1000 +#define HLTH_GEN_WPN_KATANA 1000 +#define HLTH_GEN_WPN_MINIMI 1000 +#define HLTH_GEN_WPN_SIG3000 1000 +#define HLTH_GEN_WPN_SPAS12 1000 +#define HLTH_GEN_WEB_MOSS_ANIM 150 +#define HLTH_GEN_WETFLOOR_SIGN 150 + +// misc_generic... +void SP_misc_generic_access_card (edict_t *ent); +void SP_misc_generic_banner_generic (edict_t *ent); +void SP_misc_generic_barbwire_coil (edict_t *ent); +void SP_misc_generic_barrel_burning (edict_t *ent); +void SP_misc_generic_barrel_chemical (edict_t *ent); +void SP_misc_generic_barrel_wine (edict_t *ent); +void SP_misc_generic_bench (edict_t *ent); +void SP_misc_generic_blinds (edict_t *ent); +void SP_misc_generic_bookshelf (edict_t *ent); +void SP_misc_generic_broom (edict_t *ent); +void SP_misc_generic_bunk (edict_t *ent); +void SP_misc_generic_car_american (edict_t *ent); +void SP_misc_generic_car_european (edict_t *ent); +void SP_misc_generic_car_honda (edict_t *ent); +void SP_misc_generic_car_rolls (edict_t *ent); +void SP_misc_generic_car_sports (edict_t *ent); +void SP_misc_generic_cart (edict_t *ent); +void SP_misc_generic_cash_register (edict_t *ent); +void SP_misc_generic_chair_legs (edict_t *ent); +void SP_misc_generic_chair_legs2 (edict_t *ent); +void SP_misc_generic_chair_office (edict_t *ent); +void SP_misc_generic_chunks_brick (edict_t *ent); +void SP_misc_generic_chunks_glass (edict_t *ent); +void SP_misc_generic_chunks_metal (edict_t *ent); +void SP_misc_generic_chunks_rock (edict_t *ent); +void SP_misc_generic_chunks_wall (edict_t *ent); +void SP_misc_generic_chunks_wood (edict_t *ent); +void SP_misc_generic_comp_keyboard (edict_t *ent); +void SP_misc_generic_comp_monitor (edict_t *ent); +void SP_misc_generic_comp_monitor2 (edict_t *ent); +void SP_misc_generic_crate_fish (edict_t *ent); +void SP_misc_generic_desk_phone (edict_t *ent); +void SP_misc_generic_fan_big (edict_t *ent); +void SP_misc_generic_faucet (edict_t *ent); +void SP_misc_generic_fire_extinguisher (edict_t *ent); +void SP_misc_generic_fire_hydrant (edict_t *ent); +void SP_misc_generic_fish (edict_t *ent); +void SP_misc_generic_fish_dead (edict_t *ent); +void SP_misc_generic_flag_pole (edict_t *ent); +void SP_misc_generic_forklift (edict_t *ent); +void SP_misc_generic_garbage_bag (edict_t *ent); +void SP_misc_generic_gun_auto (edict_t *ent); +void SP_misc_generic_gun_auto2 (edict_t *ent); +void SP_misc_generic_gun_auto3 (edict_t *ent); +void SP_misc_generic_gun_big (edict_t *ent); +void SP_misc_generic_gun_castle (edict_t *ent); +void SP_misc_generic_heap (edict_t *ent); +void SP_misc_generic_orange_cone(edict_t *ent); +void SP_misc_generic_light_beam (edict_t *ent); +void SP_misc_generic_light_flare (edict_t *ent); +void SP_misc_generic_motorcycle (edict_t *ent); +void SP_misc_generic_palette_jack (edict_t *ent); +void SP_misc_generic_paper_blowing (edict_t *ent); +void SP_misc_generic_parking_meter (edict_t *ent); +void SP_misc_generic_phone_booth (edict_t *ent); +void SP_misc_generic_pillow (edict_t *ent); +void SP_misc_generic_plant_potted (edict_t *ent); +void SP_misc_generic_plant_tall (edict_t *ent); +void SP_misc_generic_radar_dish (edict_t *ent); +void SP_misc_generic_radio (edict_t *ent); +void SP_misc_generic_security_camera (edict_t *ent); +void SP_misc_generic_security_camera2 (edict_t *ent); +void SP_misc_generic_shovel (edict_t *ent); +void SP_misc_generic_shrub (edict_t *ent); +void SP_misc_generic_sink (edict_t *ent); +void SP_misc_generic_sofa (edict_t *ent); +void SP_misc_generic_sofa_chair (edict_t *ent); +void SP_misc_generic_speaker (edict_t *ent); +void SP_misc_generic_sprinkler (edict_t *ent); +void SP_misc_generic_stoplight (edict_t *ent); +void SP_misc_generic_street_name_sign (edict_t *ent); +void SP_misc_generic_sword (edict_t *ent); +void SP_misc_generic_sword_large (edict_t *ent); +void SP_misc_generic_table_round (edict_t *ent); +void SP_misc_generic_table1 (edict_t *ent); +void SP_misc_generic_table2 (edict_t *ent); +void SP_misc_generic_tank_gas (edict_t *ent); +void SP_misc_generic_tank_propane (edict_t *ent); +void SP_misc_generic_toilet (edict_t *ent); +void SP_misc_generic_train (edict_t *ent); +void SP_misc_generic_trash_ashtray (edict_t *ent); +void SP_misc_generic_trashcan_barrel (edict_t *ent); +void SP_misc_generic_tree_dead (edict_t *ent); +void SP_misc_generic_tree_thin (edict_t *ent); +void SP_misc_generic_truckcab (edict_t *ent); +void SP_misc_generic_tv_ceiling (edict_t *ent); +void SP_misc_generic_tv_wall (edict_t *ent); +void SP_misc_generic_urinal (edict_t *ent); +void SP_misc_generic_urinal_cake (edict_t *ent); +void SP_misc_generic_urn (edict_t *ent); +void SP_misc_generic_waste_basket_wire (edict_t *ent); +void SP_misc_generic_web_moss_animated (edict_t *ent); +void SP_misc_generic_wet_floor_sign (edict_t *ent); +void SP_misc_generic_wpn_bat(edict_t *ent); +void SP_misc_generic_wpn_desert_eagle(edict_t *ent); +void SP_misc_generic_wpn_glock(edict_t *ent); +void SP_misc_generic_wpn_ingram(edict_t *ent); +void SP_misc_generic_wpn_katana(edict_t *ent); +void SP_misc_generic_wpn_minimi(edict_t *ent); +void SP_misc_generic_wpn_sig3000(edict_t *ent); +void SP_misc_generic_wpn_spas12(edict_t *ent); +void SP_misc_generic_wpn_c4(edict_t *ent); + +void SP_misc_test_gun_auto (edict_t *ent); + + +spawn_t genericSpawns[] = +{ + // misc_generic... + {"misc_generic_access_card", SP_misc_generic_access_card}, + {"misc_generic_banner", SP_misc_generic_banner_generic}, + {"misc_generic_barbwire_coil", SP_misc_generic_barbwire_coil}, + {"misc_generic_barrel_burning", SP_misc_generic_barrel_burning}, + {"misc_generic_barrel_chemical", SP_misc_generic_barrel_chemical}, + {"misc_generic_barrel_wine", SP_misc_generic_barrel_wine}, + {"misc_generic_bench", SP_misc_generic_bench}, + {"misc_generic_blinds", SP_misc_generic_blinds}, + {"misc_generic_bookshelf", SP_misc_generic_bookshelf}, + {"misc_generic_broom", SP_misc_generic_broom}, + {"misc_generic_bunk", SP_misc_generic_bunk}, + {"misc_generic_car_american", SP_misc_generic_car_american}, + {"misc_generic_car_european", SP_misc_generic_car_european}, + {"misc_generic_car_honda", SP_misc_generic_car_honda}, + {"misc_generic_car_rolls", SP_misc_generic_car_rolls}, + {"misc_generic_car_sports", SP_misc_generic_car_sports}, + {"misc_generic_cart", SP_misc_generic_cart}, + {"misc_generic_cash_register", SP_misc_generic_cash_register}, + {"misc_generic_chair_legs", SP_misc_generic_chair_legs}, + {"misc_generic_chair_legs2", SP_misc_generic_chair_legs2}, + {"misc_generic_chair_office", SP_misc_generic_chair_office}, + {"misc_generic_chunks_brick", SP_misc_generic_chunks_brick}, + {"misc_generic_chunks_glass", SP_misc_generic_chunks_glass}, + {"misc_generic_chunks_metal", SP_misc_generic_chunks_metal}, + {"misc_generic_chunks_rock", SP_misc_generic_chunks_rock}, + {"misc_generic_chunks_wall", SP_misc_generic_chunks_wall}, + {"misc_generic_chunks_wood", SP_misc_generic_chunks_wood}, + {"misc_generic_comp_keyboard", SP_misc_generic_comp_keyboard}, + {"misc_generic_comp_monitor", SP_misc_generic_comp_monitor}, + {"misc_generic_comp_monitor2", SP_misc_generic_comp_monitor2}, + {"misc_generic_crate_fish", SP_misc_generic_crate_fish}, + {"misc_generic_desk_phone", SP_misc_generic_desk_phone}, + {"misc_generic_fan_big", SP_misc_generic_fan_big}, + {"misc_generic_faucet", SP_misc_generic_faucet}, + {"misc_generic_fire_extinguisher", SP_misc_generic_fire_extinguisher}, + {"misc_generic_fire_hydrant", SP_misc_generic_fire_hydrant}, + {"misc_generic_fish", SP_misc_generic_fish}, + {"misc_generic_fish_dead", SP_misc_generic_fish_dead}, + {"misc_generic_flag_pole", SP_misc_generic_flag_pole}, + {"misc_generic_forklift", SP_misc_generic_forklift}, + {"misc_generic_garbage_bag", SP_misc_generic_garbage_bag}, + {"misc_generic_gun_auto", SP_misc_generic_gun_auto}, + {"misc_generic_gun_auto2", SP_misc_generic_gun_auto2}, + {"misc_generic_gun_auto3", SP_misc_generic_gun_auto3}, + {"misc_generic_gun_big", SP_misc_generic_gun_big}, + {"misc_generic_gun_castle", SP_misc_generic_gun_castle}, + {"misc_generic_heap", SP_misc_generic_heap}, + {"misc_generic_orange_cone", SP_misc_generic_orange_cone}, + {"misc_generic_light_beam", SP_misc_generic_light_beam}, + {"misc_generic_light_flare", SP_misc_generic_light_flare}, + {"misc_generic_motorcycle", SP_misc_generic_motorcycle}, + {"misc_generic_palette_jack", SP_misc_generic_palette_jack}, + {"misc_generic_paper_blowing", SP_misc_generic_paper_blowing}, + {"misc_generic_parking_meter", SP_misc_generic_parking_meter}, + {"misc_generic_phone_booth", SP_misc_generic_phone_booth}, + {"misc_generic_pillow", SP_misc_generic_pillow}, + {"misc_generic_plant_potted", SP_misc_generic_plant_potted}, + {"misc_generic_plant_tall", SP_misc_generic_plant_tall}, + {"misc_generic_radar_dish", SP_misc_generic_radar_dish}, + {"misc_generic_radio", SP_misc_generic_radio}, + {"misc_generic_security_camera", SP_misc_generic_security_camera}, + {"misc_generic_security_camera2", SP_misc_generic_security_camera2}, + {"misc_generic_shovel", SP_misc_generic_shovel}, + {"misc_generic_shrub", SP_misc_generic_shrub}, + {"misc_generic_sink", SP_misc_generic_sink}, + {"misc_generic_sofa", SP_misc_generic_sofa}, + {"misc_generic_sofa_chair", SP_misc_generic_sofa_chair}, + {"misc_generic_speaker", SP_misc_generic_speaker}, + {"misc_generic_sprinkler", SP_misc_generic_sprinkler}, + {"misc_generic_stoplight", SP_misc_generic_stoplight}, + {"misc_generic_street_name_sign", SP_misc_generic_street_name_sign}, + {"misc_generic_sword", SP_misc_generic_sword}, + {"misc_generic_sword_large", SP_misc_generic_sword_large}, + {"misc_generic_table_round", SP_misc_generic_table_round}, + {"misc_generic_table1", SP_misc_generic_table1}, + {"misc_generic_table2", SP_misc_generic_table2}, + {"misc_generic_tank_gas", SP_misc_generic_tank_gas}, + {"misc_generic_tank_propane", SP_misc_generic_tank_propane}, + {"misc_generic_train", SP_misc_generic_train}, + {"misc_generic_trash_ashtray", SP_misc_generic_trash_ashtray}, + {"misc_generic_trashcan_barrel", SP_misc_generic_trashcan_barrel}, + {"misc_generic_tree_dead", SP_misc_generic_tree_dead}, + {"misc_generic_tree_thin", SP_misc_generic_tree_thin}, + {"misc_generic_toilet", SP_misc_generic_toilet}, + {"misc_generic_truckcab", SP_misc_generic_truckcab}, + {"misc_generic_tv_ceiling", SP_misc_generic_tv_ceiling}, + {"misc_generic_tv_wall", SP_misc_generic_tv_wall}, + {"misc_generic_urinal", SP_misc_generic_urinal}, + {"misc_generic_urinal_cake", SP_misc_generic_urinal_cake}, + {"misc_generic_urn", SP_misc_generic_urn}, + {"misc_generic_waste_basket_wire", SP_misc_generic_waste_basket_wire}, + {"misc_generic_wpn_bat", SP_misc_generic_wpn_bat}, + {"misc_generic_wpn_desert_eagle", SP_misc_generic_wpn_desert_eagle}, + {"misc_generic_wpn_glock", SP_misc_generic_wpn_glock}, + {"misc_generic_wpn_ingram", SP_misc_generic_wpn_ingram}, + {"misc_generic_wpn_katana", SP_misc_generic_wpn_katana}, + {"misc_generic_wpn_minimi", SP_misc_generic_wpn_minimi}, + {"misc_generic_wpn_sig3000", SP_misc_generic_wpn_sig3000}, + {"misc_generic_wpn_spas12", SP_misc_generic_wpn_spas12}, + {"misc_generic_wpn_c4", SP_misc_generic_wpn_c4}, + {"misc_generic_web_moss_animated", SP_misc_generic_web_moss_animated}, + {"misc_generic_wet_floor_sign", SP_misc_generic_wet_floor_sign}, + + {"misc_test_gun_auto", SP_misc_test_gun_auto}, + + {NULL, NULL}, +}; + +typedef enum +{ + OBJ_ACCESS_CARD = 0, + OBJ_BANNER, + OBJ_BARBWIRE_COIL, + OBJ_BARREL_BURNING, + OBJ_BARREL_CHEMICAL, + OBJ_BARREL_WINE, + OBJ_BENCH_BOTTOM, + OBJ_BENCH_TOP, + OBJ_BLINDS, + OBJ_BOOKCASE, + OBJ_BOOKSHELF, + OBJ_BOOKSHELF_BROKE, + OBJ_BROOM, + OBJ_BUNK, + OBJ_BUNKBED, + OBJ_BUNKSIDE2, + OBJ_CAR_AMERICAN, + OBJ_CAR_EUROPEAN, + OBJ_CAR_HONDA, + OBJ_CAR_ROLLS, + OBJ_CAR_SPORTS, + OBJ_CART, + OBJ_CASH_REGISTER, + OBJ_CHAIR_LEGS, + OBJ_CHAIR_LEGS_LEGS, + OBJ_CHAIR_LEGS2, + OBJ_CHAIR_OFFICE_SEAT, + OBJ_CHAIR_OFFICE_BASE, + OBJ_CHUNKS_BRICK, + OBJ_CHUNKS_GLASS, + OBJ_CHUNKS_METAL, + OBJ_CHUNKS_ROCK, + OBJ_CHUNKS_WALL, + OBJ_CHUNKS_WOOD, + OBJ_COMP_KEYBOARD, + OBJ_COMP_MONITOR, + OBJ_COMP_MONITOR2, + OBJ_COMP_MONITOR2_TOWER, + OBJ_CRATE_FISH, + OBJ_DESK_PHONE, + OBJ_FAN_BIG, + OBJ_FAUCET, + OBJ_FIRE_EXTINGUISHER, + OBJ_FIRE_HYDRANT, + OBJ_FISH, + OBJ_FISH_DEAD, + OBJ_FLAG_POLE, + OBJ_FORKLIFT, + OBJ_GARBAGE_BAG, + OBJ_GUN_AUTO, + OBJ_GUN_AUTO_BASE, + OBJ_GUN_AUTO_ARM, + OBJ_NULL, + OBJ_GUN_BIG_BASE, + OBJ_GUN_BIG_GUN_LEFT, + OBJ_GUN_BIG_GUN_RIGHT, + OBJ_GUN_BIG_SHIELD, + OBJ_HEAP, + OBJ_LIGHT_BEAM, + OBJ_LIGHT_FLARE, + OBJ_MOTORCYCLE, + OBJ_ORANGE_CONE, + OBJ_PALETTE_JACK, + OBJ_PAPER_BLOWING, + OBJ_PARKING_METER, + OBJ_PHONE_BOOTH, + OBJ_PILLOW, + OBJ_PLANT_POTTED, + OBJ_PLANT_TALL, + OBJ_RADAR_BASE, + OBJ_RADAR_DISH, + OBJ_RADIO, + OBJ_SECURITY_CAM_CAMERA, + OBJ_SECURITY_CAM_POLE, + OBJ_SHOVEL, + OBJ_SHRUB1, + OBJ_SINK, + OBJ_SOFA, + OBJ_SOFA_CHAIR, + OBJ_SPEAKER, + OBJ_STOPLIGHT, + OBJ_STREETSIGN, + OBJ_SWORD, + OBJ_SWORD_LARGE, + OBJ_TABLE_ROUND, + OBJ_TABLE1, + OBJ_TABLE1_BACK, + OBJ_TABLE1_LEG, + OBJ_TABLE2, + OBJ_TABLE2_SIDE1, + OBJ_TABLE2_SIDE2, + OBJ_TABLE2_SIDE3, + OBJ_TABLE2_TOP2, + OBJ_TANK1, + OBJ_TANK_GAS, + OBJ_TANK_PROPANE, + OBJ_TOILET, + OBJ_TRAIN, + OBJ_TRASH_ASHTRAY, + OBJ_TRASHCAN_BARREL, + OBJ_TREE_DEAD, + OBJ_TREE_THIN, + OBJ_TRUCKCAB, + OBJ_TV_CEILING, + OBJ_TV_CEILING_SUPPORT, + OBJ_TV_WALL, + OBJ_URINAL, + OBJ_URINAL_CAKE, + OBJ_URN, + OBJ_WASTE_BASKET, + OBJ_WEB_MOSS_ANIM, + OBJ_WETFLOOR_SIGN, + OBJ_WPN_BAT, + OBJ_WPN_DESERT_EAGLE, + OBJ_WPN_GLOCK, + OBJ_WPN_INGRAM, + OBJ_WPN_KATANA, + OBJ_WPN_MINIMI, + OBJ_WPN_SIG3000, + OBJ_WPN_SPAS12, + OBJ_WPN_C4, + MAX_OBJS +}; + + + +modelSpawnData_t genericModelData[MD_GENERIC_SIZE] = +{ +// dir file surfaceType material health solid material file cnt scale +"objects/generic/access_card", "card", SURF_DEFAULT, MAT_DEFAULT, HLTH_GEN_ACCESS_CARD, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_ACCESS_CARD +"objects/generic/banner_generic", "banner", SURF_DEFAULT, MAT_DEFAULT, HLTH_GEN_BANNER, SOLID_BBOX, "banner", 0, DEBRIS_SM, NULL, // OBJ_BANNER +"objects/generic/barbwire_coil", "barbwire", SURF_METAL, MAT_DEFAULT, HLTH_GEN_BARBWIRE_COIL, SOLID_BBOX, NULL, 15, DEBRIS_SM, NULL, // OBJ_BARBWIRE_COIL +"objects/generic/barrel_burning", "barrel", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_BARREL_BURNING, SOLID_BBOX, NULL, 0, DEBRIS_MED, NULL, // OBJ_BARREL_BURNING +"objects/generic/barrel_chemical", "barrel", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_BARREL_CHEMICAL, SOLID_BBOX, "barrel", 0, DEBRIS_MED, NULL, // OBJ_BARREL_CHEMICAL +"objects/generic/barrel_wine", "barrel", SURF_WOOD_LBROWN, MAT_WOOD_LBROWN, HLTH_GEN_BARREL_WINE, SOLID_BBOX, NULL, 0, DEBRIS_MED, NULL, // OBJ_BARREL_WINE +"objects/generic/bench", "bottom", SURF_WOOD_LBROWN, MAT_WOOD_LBROWN, HLTH_GEN_BENCH, SOLID_BBOX, "bench", 10, DEBRIS_MED, NULL, // OBJ_BENCH_BOTTOM +"objects/generic/bench", "top", SURF_WOOD_LBROWN, MAT_WOOD_LBROWN, HLTH_GEN_BENCH, SOLID_BBOX, "bench", 10, DEBRIS_MED, NULL, // OBJ_BENCH_TOP +"objects/generic/blinds", "blinds", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_BLINDS, SOLID_BBOX, "blinds", 0, DEBRIS_MED, NULL, // OBJ_BLINDS +"objects/generic/bookcase", "case", SURF_WOOD_LBROWN, MAT_WOOD_LBROWN, HLTH_GEN_BOOKCASE, SOLID_BBOX, "case", 0, DEBRIS_LRG, NULL, // OBJ_BOOKCASE +"objects/generic/bookshelf", "shelf", SURF_WOOD_LBROWN, MAT_WOOD_LBROWN, HLTH_GEN_BOOKSHELF, SOLID_BBOX, "shelf", 0, DEBRIS_SM, NULL, // OBJ_BOOKSHELF +"objects/generic/bookshelf", "middle", SURF_WOOD_LBROWN, MAT_WOOD_LBROWN, HLTH_GEN_BOOKSHELF, SOLID_BBOX, "shelf", 0, DEBRIS_SM, NULL, // OBJ_BOOKSHELF_BROKE +"objects/generic/broom", "broom", SURF_WOOD_LBROWN, MAT_WOOD_LBROWN, HLTH_GEN_BROOM, SOLID_BBOX, "broom", 0, DEBRIS_SM, NULL, // OBJ_BROOM +"objects/generic/bunk", "side2", SURF_METAL, MAT_METAL_LGREY, HLTH_GEN_BUNK, SOLID_BBOX, "bunk", 0, DEBRIS_MED, NULL, // OBJ_BUNK +"objects/generic/bunk", "bed", SURF_METAL, MAT_METAL_LGREY, HLTH_GEN_BOLTON, SOLID_NOT, "bunk", 0, DEBRIS_MED, NULL, // OBJ_BUNKBED +"objects/generic/bunk", "side1", SURF_METAL, MAT_METAL_LGREY, HLTH_GEN_BOLTON, SOLID_NOT, "bunk", 0, DEBRIS_MED, NULL, // OBJ_BUNKSIDE2 +"objects/generic/car_american", "car", SURF_METAL, MAT_METAL_LGREY, HLTH_GEN_CAR_AMERICAN, SOLID_BBOX, "car", 0, DEBRIS_SM, NULL, // OBJ_CAR_AMERICAN +"objects/generic/car_european", "car", SURF_METAL, MAT_METAL_LGREY, HLTH_GEN_CAR_EUROPEAN, SOLID_BBOX, "car", 0, DEBRIS_SM, NULL, // OBJ_CAR_EUROPEAN +"objects/generic/car_honda", "car", SURF_METAL, MAT_METAL_LGREY, HLTH_GEN_CAR_HONDA, SOLID_BBOX, "car", 0, DEBRIS_SM, NULL, // OBJ_CAR_HONDA +"objects/generic/car_rolls", "car", SURF_METAL, MAT_METAL_LGREY, HLTH_GEN_CAR_ROLLS, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_CAR_ROLLS +"objects/generic/car_sports", "car", SURF_METAL, MAT_METAL_LGREY, HLTH_GEN_CAR_SPORTS, SOLID_BBOX, "car", 0, DEBRIS_SM, NULL, // OBJ_CAR_SPORTS +"objects/generic/cart", "cart", SURF_METAL, MAT_METAL_LGREY, HLTH_GEN_CASH_REGISTER, SOLID_BBOX, "cart", 0, DEBRIS_SM, NULL, // OBJ_CART +"objects/generic/cash_register", "register", SURF_METAL, MAT_METAL_LGREY, HLTH_GEN_BUNK, SOLID_BBOX, "register", 0, DEBRIS_SM, NULL, // OBJ_CASH_REGISTER +"objects/generic/chair_legs", "chair", SURF_METAL, MAT_METAL_LGREY, HLTH_GEN_CHAIR_LEGS, SOLID_BBOX, "legs", 0, DEBRIS_SM, NULL, // OBJ_CHAIR_LEGS +"objects/generic/chair_legs", "legs", SURF_METAL, MAT_METAL_LGREY, HLTH_GEN_CHAIR_LEGS, SOLID_BBOX, "legs", 0, DEBRIS_SM, NULL, // OBJ_CHAIR_LEGS_LEGS +"objects/generic/chair_legs2", "legs2", SURF_METAL, MAT_METAL_LGREY, HLTH_GEN_CHAIR_LEGS2, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_CHAIR_LEGS2 +"objects/generic/chair_office", "top", SURF_METAL, MAT_METAL_SHINY, HLTH_GEN_CHAIR_OFFICE, SOLID_BBOX, "office", 0, DEBRIS_SM, NULL, // OBJ_CHAIR_OFFICE_SEAT +"objects/generic/chair_office", "base", SURF_METAL, MAT_METAL_SHINY, HLTH_GEN_CHAIR_OFFICE, SOLID_BBOX, "office", 0, DEBRIS_SM, NULL, // OBJ_CHAIR_OFFICE_BASE +"objects/generic/chunks_brick", "brick", SURF_STONE_DBROWN, MAT_BRICK_DBROWN, HLTH_GEN_CHUNKS_BRICK, SOLID_BBOX, "brick", 0, DEBRIS_SM, NULL, // OBJ_CHUNKS_BRICK +"objects/generic/chunks_glass", "glass", SURF_GLASS, MAT_GLASS, HLTH_GEN_CHUNKS_GLASS, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_CHUNKS_GLASS +"objects/generic/chunks_metal", "metal", SURF_METAL, MAT_METAL_LGREY, HLTH_GEN_CHUNKS_METAL, SOLID_BBOX, "metal", 0, DEBRIS_SM, NULL, // OBJ_CHUNKS_METAL +"objects/generic/chunks_rock", "rock", SURF_STONE_DBROWN, MAT_ROCK_DBROWN, HLTH_GEN_CHUNKS_ROCK, SOLID_BBOX, "rock", 0, DEBRIS_SM, NULL, // OBJ_CHUNKS_ROCK +"objects/generic/chunks_wall", "wall", SURF_STONE_DBROWN, MAT_ROCK_DBROWN, HLTH_GEN_CHUNKS_WALL, SOLID_BBOX, "wall", 0, DEBRIS_SM, NULL, // OBJ_CHUNKS_WALL +"objects/generic/chunks_wood", "wood", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_GEN_CHUNKS_WOOD, SOLID_BBOX, "wood", 0, DEBRIS_SM, NULL, // OBJ_CHUNKS_WOOD +"objects/generic/comp_keyboard", "keyboard", SURF_METAL, MAT_WALL_GREY, HLTH_GEN_COMP_KEYBOARD, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_COMP_KEYBOARD +"objects/generic/comp_monitor", "monitor", SURF_GLASS_COMPUTER,MAT_WALL_GREY, HLTH_GEN_COMP_MONITOR, SOLID_BBOX, "monitor", 0, DEBRIS_SM, NULL, // OBJ_COMP_MONITOR +"objects/generic/comp_monitor2", "monitor2", SURF_GLASS_COMPUTER,MAT_WALL_GREY, HLTH_GEN_COMP_MONITOR2, SOLID_BBOX, "monitor2", 0, DEBRIS_SM, NULL, // OBJ_COMP_MONITOR2 +"objects/generic/comp_monitor2", "tower", SURF_GLASS_COMPUTER,MAT_WALL_GREY, HLTH_GEN_COMP_MONITOR2, SOLID_BBOX, "monitor2", 0, DEBRIS_SM, NULL, // OBJ_COMP_MONITOR2_TOWER +"objects/generic/crate_fish", "crate", SURF_WOOD_LBROWN, MAT_WOOD_LBROWN, HLTH_GEN_CRATE_FISH, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_CRATE_FISH +"objects/generic/desk_phone", "phone", SURF_METAL, MAT_WALL_GREY, HLTH_GEN_DESK_PHONE, SOLID_BBOX, "phone", 0, DEBRIS_SM, NULL, // OBJ_DESK_PHONE +"objects/generic/fan", "fan", SURF_METAL, MAT_METAL_SHINY, HLTH_GEN_FAN_BIG, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_FAN_BIG +"objects/generic/faucet", "faucet", SURF_METAL, MAT_METAL_SHINY, HLTH_GEN_FAUCET, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_FAUCET +"objects/generic/fire_extinguisher","exting", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_FIRE_EXTINGUISHER, SOLID_BBOX, "exting", 0, DEBRIS_SM, NULL, // OBJ_FIRE_EXTINGUISHER +"objects/generic/fire_hydrant", "hydrant", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_FIRE_HYDRANT, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_FIRE_HYDRANT +"objects/generic/fish", "fish", SURF_BLOOD, MAT_ROCK_FLESH, HLTH_GEN_FISH, SOLID_BBOX, "fish", 0, DEBRIS_SM, NULL, // OBJ_FISH +"objects/generic/fish", "fish", SURF_BLOOD, MAT_ROCK_FLESH, HLTH_GEN_FISH, SOLID_BBOX, "fish", 0, DEBRIS_SM, NULL, // OBJ_FISH_DEAD +"objects/generic/flag_pole", "flag_pole", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_FLAG_POLE, SOLID_BBOX, "flag_pole", 0, DEBRIS_SM, NULL, // OBJ_FLAG_POLE +"objects/generic/forklift", "forklift", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_FORKLIFT, SOLID_BBOX, "forklift", 0, DEBRIS_SM, NULL, // OBJ_FORKLIFT +"objects/generic/garbage_bag", "bag", SURF_DEFAULT, MAT_WALL_GREY, HLTH_GEN_GARBAGE_BAG, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_GARBAGE_BAG +"objects/generic/gun_auto", "gun", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_GUN_AUTO, SOLID_BBOX, "gun", 0, DEBRIS_SM, NULL, // OBJ_GUN_AUTO +"objects/generic/gun_auto", "base", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_GUN_AUTO, SOLID_BBOX, "gun", 0, DEBRIS_SM, NULL, // OBJ_GUN_AUTO_BASE +"objects/generic/gun_auto", "arm", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_GUN_AUTO, SOLID_BBOX, "gun", 0, DEBRIS_SM, NULL, // OBJ_GUN_AUTO_ARM +"objects/generic/gun_auto", "null", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_GUN_AUTO, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_NULL +"objects/generic/gun_big", "base", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_GUN_BIG, SOLID_BBOX, "gun", 0, DEBRIS_MED, NULL, // OBJ_GUN_BIG_BASE +"objects/generic/gun_big", "gunleft", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_GUN_BIG, SOLID_BBOX, "gun", 0, DEBRIS_MED, NULL, // OBJ_GUN_BIG_GUN_LEFT +"objects/generic/gun_big", "gunright", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_GUN_BIG, SOLID_BBOX, "gun", 0, DEBRIS_MED, NULL, // OBJ_GUN_BIG_GUN_RIGHT +"objects/generic/gun_big", "shield", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_GUN_BIG, SOLID_BBOX, "gun", 0, DEBRIS_MED, NULL, // OBJ_GUN_BIG_SHIELD +"objects/generic/heap_generic", "heap", SURF_DEFAULT, MAT_DEFAULT, HLTH_GEN_HEAP, SOLID_BBOX, "heap", 0, DEBRIS_SM, NULL, // OBJ_HEAP +"objects/generic/beam", "beam", SURF_NONE, MAT_NONE, HLTH_GEN_LIGHT_BEAM, SOLID_NOT, NULL, 0, DEBRIS_SM, NULL, // OBJ_LIGHT_BEAM +"objects/light/flare", "flare", SURF_NONE, MAT_NONE, HLTH_GEN_LIGHT_FLARE, SOLID_NOT, NULL, 0, DEBRIS_SM, NULL, // OBJ_LIGHT_FLARE +"objects/generic/motorcycle", "motorcycle", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_MOTORCYCLE, SOLID_BBOX, "motorcycle", 0, DEBRIS_SM, NULL, // OBJ_MOTORCYCLE +"objects/generic/orange_cone", "orangecone", SURF_STONE_WHITE, MAT_WALL_WHITE, HLTH_GEN_ORANGE_CONE, SOLID_BBOX, "orangecone", 5, DEBRIS_MED, NULL, // OBJ_ORANGE_CONE +"objects/generic/palette_jack", "pallette_jack", SURF_METAL, MAT_METAL_SHINY, HLTH_GEN_PALETTE_JACK, SOLID_BBOX, NULL, 15, DEBRIS_SM, NULL, // OBJ_PALETTE_JACK +"objects/generic/paper_blowing", "paper", SURF_DEFAULT, MAT_DEFAULT, HLTH_GEN_PAPER_BLOWING, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_PAPER_BLOWING +"objects/generic/parking_meter", "parking_meter", SURF_METAL, MAT_METAL_SHINY, HLTH_GEN_PARKING_METER, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_PARKING_METER +"objects/generic/phone_booth", "phone_booth", SURF_METAL, MAT_METAL_SHINY, HLTH_GEN_PHONE_BOOTH, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_PHONE_BOOTH +"objects/generic/pillow", "pillow", SURF_STONE_WHITE, MAT_WALL_WHITE, HLTH_GEN_PILLOW, SOLID_BBOX, "pillow", 4, DEBRIS_SM, NULL, // OBJ_PILLOW +"objects/generic/plant_potted", "plant", SURF_DEFAULT, MAT_METAL_SHINY, HLTH_GEN_PLANT_POTTED, SOLID_BBOX, "plant", 0, DEBRIS_SM, NULL, // OBJ_PLANT_POTTED +"objects/generic/plant_tall", "plant", SURF_DEFAULT, MAT_DEFAULT, HLTH_GEN_PLANT_TALL, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_PLANT_TALL +"objects/generic/radar", "radar_base", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_RADAR_BASE, SOLID_BBOX, "radar_base", 0, DEBRIS_SM, NULL, // OBJ_RADAR_BASE +"objects/generic/radar", "radar_dish", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_RADAR_DISH, SOLID_BBOX, "radar_dish", 0, DEBRIS_SM, NULL, // OBJ_RADAR_DISH +"objects/generic/radio", "radio", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_RADIO, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_RADIO +"objects/generic/security_camera/test", "camera", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_SECURITY_CAM, SOLID_BBOX, "camera", 10, DEBRIS_SM, NULL, // OBJ_SECURITY_CAM_CAMERA +"objects/generic/security_camera/test", "arm", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_SECURITY_CAM, SOLID_BBOX, "camera", 10, DEBRIS_SM, NULL, // OBJ_SECURITY_CAM_POLE +"objects/generic/shovel", "shovel", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_SHOVEL, SOLID_BBOX, "shovel", 0, DEBRIS_SM, NULL, // OBJ_SHOVEL +"objects/generic/shrub1", "shrub", SURF_DEFAULT, MAT_DEFAULT, HLTH_GEN_SHRUB1, SOLID_BBOX, "shrub", 0, DEBRIS_SM, NULL, // OBJ_SHRUB1 +"objects/generic/sink", "sink", SURF_STONE_LGREY, MAT_ROCK_LGREY, HLTH_GEN_SINK, SOLID_BBOX, "sink", 0, DEBRIS_SM, NULL, // OBJ_SINK +"objects/generic/sofa", "sofa", SURF_DEFAULT, MAT_DEFAULT, HLTH_GEN_SOFA, SOLID_BBOX, "sofa", 0, DEBRIS_SM, NULL, // OBJ_SOFA +"objects/generic/sofa_chair", "chair", SURF_DEFAULT, MAT_DEFAULT, HLTH_GEN_SOFA_CHAIR, SOLID_BBOX, "chair", 0, DEBRIS_SM, NULL, // OBJ_SOFA_CHAIR +"objects/generic/speaker", "speaker", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_SPEAKER, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_SPEAKER +"objects/generic/stoplight", "stoplight", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_STOPLIGHT, SOLID_BBOX, "stoplight", 0, DEBRIS_SM, NULL, // OBJ_STOPLIGHT +"objects/generic/street_name_sign", "sign", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_STREETSIGN, SOLID_BBOX, "sign", 0, DEBRIS_SM, NULL, // OBJ_STREETSIGN +"objects/generic/sword", "sword", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_SWORD, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_SWORD +"objects/generic/sword", "sword", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_SWORD, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_SWORD_LARGE +"objects/generic/table_round", "table", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TABLE_ROUND, SOLID_BBOX, "table", 0, DEBRIS_SM, NULL, // OBJ_TABLE_ROUND +"objects/generic/table1", "top", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TABLE1, SOLID_BBOX, "table1", 0, DEBRIS_SM, NULL, // OBJ_TABLE1 +"objects/generic/table1", "back", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TABLE_ROUND, SOLID_BBOX, "table1", 0, DEBRIS_SM, NULL, // OBJ_TABLE1_BACK +"objects/generic/table1", "leg", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TABLE_ROUND, SOLID_BBOX, "table1", 0, DEBRIS_SM, NULL, // OBJ_TABLE1_LEG +"objects/generic/table2", "top01", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TABLE2, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_TABLE2 +"objects/generic/table2", "side01", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TABLE2, SOLID_NOT, NULL, 0, DEBRIS_SM, NULL, // OBJ_TABLE2_SIDE1 +"objects/generic/table2", "side02", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TABLE2, SOLID_NOT, NULL, 0, DEBRIS_SM, NULL, // OBJ_TABLE2_SIDE2 +"objects/generic/table2", "side03", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TABLE2, SOLID_NOT, NULL, 0, DEBRIS_SM, NULL, // OBJ_TABLE2_SIDE3 +"objects/generic/table2", "top02", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TABLE2, SOLID_NOT, NULL, 0, DEBRIS_SM, NULL, // OBJ_TABLE2_TOP2 +"objects/generic/tank1", "tank", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TANK1, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_TANK1 +"objects/generic/tank_gas", "gas", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TANK_GAS, SOLID_BBOX, NULL, 0, DEBRIS_LRG, NULL, // OBJ_TANK_GAS +"objects/generic/tank_propane", "propane", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TANK_PROPANE, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_TANK_PROPANE +"objects/generic/toilet", "toilet", SURF_STONE_WHITE, MAT_WALL_WHITE, HLTH_GEN_TOILET, SOLID_BBOX, "toilet", 0, DEBRIS_MED, NULL, // OBJ_TOILET +"objects/generic/train_generic", "train", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TRAIN, SOLID_BBOX, "train", 0, DEBRIS_SM, NULL, // OBJ_TRAIN +"objects/generic/trash_ashtray", "ashtray", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TRASH_ASHTRAY, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_TRASH_ASHTRAY +"objects/generic/trashcan_barrel", "trashcan", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TRASHCAN_BARREL, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_TRASHCAN_BARREL +"objects/generic/tree_dead", "tree", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_GEN_TREE_DEAD, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_TREE_DEAD +"objects/generic/tree_thin", "tree", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_GEN_TREE_THIN, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_TREE_THIN +"objects/generic/truckcab", "truckcab", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TRUCKCAB, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_TRUCKCAB +"objects/generic/tv_ceiling", "tv", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TV_CEILING, SOLID_BBOX, "face", 10, DEBRIS_SM, NULL, // OBJ_TV_CEILING +"objects/generic/tv_ceiling", "supports", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TV_CEILING, SOLID_BBOX, NULL, 10, DEBRIS_SM, NULL, // OBJ_TV_CEILING_SUPPORT +"objects/generic/tv_wall", "tv_wall", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_TV_WALL, SOLID_BBOX, "tv_wall", 10, DEBRIS_SM, NULL, // OBJ_TV_WALL +"objects/generic/urinal", "urinal", SURF_STONE_WHITE, MAT_WALL_WHITE, HLTH_GEN_URINAL, SOLID_BBOX, "urinal", 0, DEBRIS_SM, NULL, // OBJ_URINAL +"objects/generic/urinal_cake", "urinal_cake", SURF_STONE_WHITE, MAT_ROCK_LGREY, HLTH_GEN_URINAL_CAKE, SOLID_BBOX, NULL, 0, DEBRIS_TINY,NULL, // OBJ_URINAL_CAKE +"objects/generic/urn", "urn", SURF_GLASS, MAT_WALL_DARKBROWN, HLTH_GEN_URN, SOLID_BBOX, NULL, 20, DEBRIS_SM, NULL, // OBJ_URN +"objects/generic/waste_basket", "waste_basket", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_WASTE_BASKET, SOLID_BBOX, "waste_basket", 0, DEBRIS_SM, NULL, // OBJ_WASTE_BASKET +"objects/generic/web_moss_animated","web_moss", SURF_DEFAULT, MAT_DEFAULT, HLTH_GEN_WEB_MOSS_ANIM, SOLID_NOT, "web_moss", 0, DEBRIS_SM, NULL, // OBJ_WEB_MOSS_ANIM +"objects/generic/wet_floor_sign", "sign", SURF_DEFAULT, MAT_DEFAULT, HLTH_GEN_WETFLOOR_SIGN, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_WETFLOOR_SIGN +"Enemy/Bolt", "w_bat", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_GEN_WPN_BAT, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_WPN_BAT +"Enemy/Bolt", "w_desert_eagle", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_WPN_DESERT_EAGLE, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_WPN_DESERT_EAGLE +"Enemy/Bolt", "w_pistol1", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_WPN_GLOCK, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_WPN_GLOCK +"Enemy/Bolt", "w_machinepistol", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_WPN_INGRAM, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_WPN_INGRAM +"Enemy/Bolt", "w_katana", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_WPN_INGRAM, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_WPN_KATANA +"Enemy/Bolt", "w_machinegun", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_WPN_MINIMI, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_WPN_MINIMI +"Enemy/Bolt", "w_sniperrifle", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_WPN_SIG3000, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_WPN_SIG3000 +"Enemy/Bolt", "w_shotgun", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_WPN_SPAS12, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_WPN_SPAS12 +"Items/Projectiles", "c4", SURF_METAL, MAT_METAL_DGREY, HLTH_GEN_WPN_SPAS12, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // OBJ_WPN_C4 + +}; + +// multipliers to keep bigger objects from being flipped as far as smaller objects by Obj_painflip +#define FLIPMULT_TRASH_ASHTRAY 0.03f +#define FLIPMULT_COMP_KEYBOARD 0.8f +#define FLIPMULT_DESK_PHONE 0.9f +#define FLIPMULT_WASTE_BASKET 0.2f + +// multipliers to keep heavier objects from rolling as far as smaller objects via Obj_painroll +#define ROLLMULT_TRASH_ASHTRAY 0.3f +#define ROLLMULT_WASTE_BASKET 0.6f + +short TestforFloor (vec3_t origin, vec3_t vel, vec3_t accel, edict_t* ignore); + +void tv_damaged_think (edict_t *ent); +void tv_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void tv_die (edict_t *ent, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + + +//------------------------------------------------------------- +// For objects that break apart +//------------------------------------------------------------- +void benchtop_pain (edict_t *self,int partLost, vec3_t boltPos); +void bunk_partpain (edict_t *self,int partLost, vec3_t boltPos); +void table1_legpain (edict_t *self,int partLost, vec3_t boltPos); +void table2_legpain (edict_t *self,int partLost, vec3_t boltPos); +void chair_legs_partpain (edict_t *self,int partLost, vec3_t boltPos); +void bookcase_partpain (edict_t *self,int partLost, vec3_t boltPos); + +// Breaking Parts Data enum +typedef enum +{ + BPD_TABLE1 = 0, + BPD_TABLE2, + BPD_BENCH, + BPD_BUNK, + BPD_CHAIR_LEGS, + BPD_BOOKCASE, + BPD_MAX +}; + +// Breaking Parts Data for each object +objBreak_t genericObjBreak [BPD_MAX] = +{ +// # of parts objParts ptr + 5, NULL, // BPD_TABLE1 + 4, NULL, // BPD_TABLE2 + 1, NULL, // BPD_BENCH + 4, NULL, // BPD_BUNK + 4, NULL, // BPD_CHAIR_LEGS + 3, NULL, // BPD_BOOKCASE +}; + + +// Breaking Parts Data for each part of each object +// WARNING: when updating this be sure to update genericObjBreak if more parts are added +objParts_t genericObjBoltPartsData[21] = +{ + // BPD_TABLE1 + "DUMMY01", 1, table1_legpain, // Leg1 + "DUMMY02", 2, table1_legpain, // Leg2 + "DUMMY03", 3, table1_legpain, // Leg3 + "DUMMY04", 4, table1_legpain, // Leg4 + "DUMMY05", 5, table1_legpain, // Front + + // BPD_TABLE2 + "DUMMY08", 1, table2_legpain, // Short side panel on short length of table + "DUMMY09", 2, table2_legpain, // Long side panel + "DUMMY10", 3, table2_legpain, // Medium side panel + "DUMMY07", 4, table2_legpain, // Short side panel on long length of table +// "DUMMY12", 5, table2_legpain, // This is hidden - we don't want it shot off + + + // BPD_BENCH + "DUMMY02", 1, NULL, // top of the bench + + // BPD_BUNK + "DUMMY05", 1, bunk_partpain, // Side + "DUMMY01", 2, bunk_partpain, // Top Bunk + "DUMMY03", 3, bunk_partpain, // Bottom Bunk + "DUMMY03", 4, bunk_partpain, // Other side + + // BPD_CHAIR_LEGS + "DUMMY01", 1, chair_legs_partpain, // + "DUMMY02", 2, chair_legs_partpain, // + "DUMMY03", 3, chair_legs_partpain, // + "DUMMY04", 4, chair_legs_partpain, // + + // BPD_BOOKCASE + "DUMMY01", 1, bookcase_partpain, // shelf + "DUMMY02", 2, bookcase_partpain, // shelf + "DUMMY03", 3, bookcase_partpain, // shelf +}; + + +/*QUAKED misc_generic_access_card (1 .5 0) (-2.95 -3.71 -1.18) (5.99 3.71 1.18) INVULNERABLE NOPUSH x x x x FLUFF +An access card +------ SPAWNFLAGS ------ +INVULNERABLE - N/A, can't be damaged. +NOPUSH - N/A, can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_access_card (edict_t *ent) +{ + VectorSet (ent->mins, -2, -3,-1); + VectorSet (ent->maxs, 5, 3, 1); + + SimpleModelInit2(ent,&genericModelData[OBJ_ACCESS_CARD],NULL,NULL); + + ent->spawnflags |= SF_INVULNERABLE; + ent->spawnflags |= SF_NOPUSH; +} + +void banner_animate (edict_t *ent) +{ + if (ent->spawnflags & SF_NOANIMATE) // No animating + { + ent->ghoulInst->Pause(level.time); + } + else + { + ent->s.sound = gi.soundindex("Ambient/Models/Banner/BanFlap.wav");// Make a flapping sound + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + + SimpleModelSetSequence(ent,genericModelData[OBJ_BANNER].file,SMSEQ_LOOP); + } +} + +BannerCallback theBannerCallback; + +bool BannerCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + edict_t* self = (edict_t*)ent; + + banner_animate(self); + + return true; +} + +void banner_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + GhoulID tempNote=0; + ggObjC *cLight; + + if (!ent->ghoulInst) + { + return; + } + + SimpleModelSetSequence(ent,"pain",SMSEQ_HOLD); + + // register a callback for the end of the pain sequence + cLight = game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + tempNote=cLight->GetMyObject()->FindNoteToken("EOS"); + + if (tempNote && ent->ghoulInst) + { + ent->ghoulInst->AddNoteCallBack(&theBannerCallback,tempNote); + } +} + + +/*QUAKED misc_generic_banner (1 .5 0) (-4.2 -50.12 -125.3) (4.01 51 126) INVULNERABLE NOPUSH NOANIMATE x x x FLUFF +2 story tall wall banner that waves in the wind +------ KEYS ------ +Skin - +0 - symbol of "Ugandan organization" +1 - Iraq flag +2 - Saddam +3 - Siberia +------ SPAWNFLAGS ------ +INVULNERABLE - N/A, can't be damaged. +NOPUSH - N/A, can't be pushed +NOANIMATE - won't flutter +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_banner_generic (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -4, -51, -70);//126 + VectorSet (ent->maxs, 4, 51, 70);//126 + + // It has a pain anim so it has to be vulnerable. But's going to take a long time to kill + ent->health = 999999; + if (ent->spawnflags & SF_INVULNERABLE) + { + ent->spawnflags &= ~SF_INVULNERABLE; + } + +// ent->spawnflags |= SF_INVULNERABLE; + ent->spawnflags |= SF_NOPUSH; + + switch (ent->s.skinnum) + { + case 1: + skinname = "banner2"; + break; + case 2: // Saddam -- potentially objectionable + if (lock_textures) + { // replace objectionable textures + skinname = "banner5"; + } + else + { + skinname = "banner3"; + } + break; + case 3: + skinname = "banner4"; + break; + default : + skinname = "banner1"; + break; + } + + ent->pain = banner_pain; + + SimpleModelInit2(ent,&genericModelData[OBJ_BANNER],skinname,NULL); + + if (ent->spawnflags & SF_NOANIMATE) + ent->ghoulInst->Pause(level.time); + else + { + ent->think = banner_animate; + ent->nextthink = level.time + ((rand() % 5) * .1) ; + } + + gi.soundindex("Ambient/Models/Banner/BanFlap.wav"); // precache sound +} + + +void barbwire_touch (edict_t *ent, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t backoff; + + VectorSubtract(other->s.origin, ent->s.origin, backoff); + T_Damage(other, ent, ent, backoff, other->s.origin, other->s.origin, 1, 1, DT_MELEE, MOD_BARBWIRE); +} + +/*QUAKED misc_generic_barbwire_coil (1 .5 0) (-15 -59 -17) (15 59 17) VULNERABLE NOPUSH x x x x FLUFF +Roll of barbed-wire. Belongs atop a fence. +------ KEYS ------ +message - text printed when killed +------ SPAWNFLAGS ------ +VULNERABLE - can be damaged. +NOPUSH - N/A, can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +Hurts player when touched, causes player to jerk back. +*/ +void SP_misc_generic_barbwire_coil (edict_t *ent) +{ + + VectorSet (ent->mins, -15, -59, -17); + VectorSet (ent->maxs, 15, 59, 17); + + // Backwards about invincibility + if (ent->spawnflags & SF_INVULNERABLE) + { + ent->spawnflags &= ~SF_INVULNERABLE; + } + else + { + ent->spawnflags |= SF_INVULNERABLE; + } + + ent->spawnflags |= SF_NOPUSH; // Won't ever move + + ent->touch = barbwire_touch; + + SimpleModelInit2(ent,&genericModelData[OBJ_BARBWIRE_COIL],NULL,NULL); +} + + +void barrel_fire_touch (edict_t *ent, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t up = {0,0,1}; + vec3_t point; + + +// if (abs(other->absmin[2] - ent->absmax[2]) < 5) + if ((other->s.origin[2] + other->mins[2]) > ent->s.origin[2]) + { + VectorSet(point, other->s.origin[0], other->s.origin[1], other->absmin[2]); + T_Damage(other, ent, ent, up, point, point, 1, 0, DT_FIRE|DAMAGE_NO_ARMOR, MOD_FIRE); + } + return; +} + +/*QUAKED misc_generic_barrel_burning (1 .5 0) (-10 -10 -12) (10 10 19) VULNERABLE NOPUSH ON_FIRE x x x FLUFF +Open barrel. +------ SPAWNFLAGS ------ +VULNERABLE - can be damaged. +NOPUSH - won't move +ON_FIRE: Puts fire on top. +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +Will burn the player if it is ON_FIRE and the player stands on it. +*/ +void SP_misc_generic_barrel_burning (edict_t *ent) +{ + GhoulID boltID; + + VectorSet (ent->mins, -11, -10, -15); + VectorSet (ent->maxs, 11, 10, 15); + + // Backwards about invincibility + if (ent->spawnflags & SF_INVULNERABLE) + { + ent->spawnflags &= ~SF_INVULNERABLE; + } + else + { + ent->spawnflags |= SF_INVULNERABLE; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_BARREL_BURNING],NULL,NULL); + + if (ent->spawnflags & BARREL_ON_FIRE) + { + boltID = ent->ghoulInst->GetGhoulObject()->FindPart("DUMMY01"); + fxRunner.execContinualEffect("environ/firesmall1", ent,boltID); + + ent->s.sound = gi.soundindex("Ambient/Gen/FireFX/FireSmall.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + + ent->touch = barrel_fire_touch; + } +} + + +/******************************************************************************/ +// Barrel Chemical Code +/******************************************************************************/ +void barrel_chemical_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + self->die = NULL; + + if (self->spawnflags & BARREL_EXPLOSIVE) + { + FX_MakeBarrelExplode(self->s.origin, self); + + fxRunner.exec("weapons/world/airexplode", self->s.origin); + FX_C4Explosion(self); + + T_RadiusDamage (self, self, 350, self, 128, 0); + gmonster.RadiusDeafen(self, 150, 200); + ShakeCameras (self->s.origin, 700, 1000, DEFAULT_JITTER_DELTA); + IncreaseSpawnIntensity(.5); + } + + BecomeDebris (self,inflictor,attacker,damage,point); + +} + +void barrel_chemical_fall (edict_t *self) +{ + if (self->health <= 0) + { + return; + } + + if ((self->s.angles[0] >= 90) || (self->s.angles[0] <= -90) || + (self->s.angles[2] >= 90) || (self->s.angles[2] <= -90)) + { + if (self->s.angles[0] >= 90) + { + self->s.angles[0] = 90; + } + if (self->s.angles[0] <= -90) + { + self->s.angles[0] = -90; + } + if (self->s.angles[2] >= 90) + { + self->s.angles[2] = 90; + } + if (self->s.angles[2] <= -90) + { + self->s.angles[2] = -90; + } + VectorClear(self->avelocity); + if (self->health < 25) + { + self->nextthink = level.time + .3; + } + else + { + // finished falling. need to change the bbox + if (!(self->spawnflags & BARREL_EXPLOSIVE) && (abs(self->velocity[0]) < 50) && + (abs(self->velocity[1])<50) && (abs(self->velocity[2])<50)) + { + FX_MakeDecalBelow(self->s.origin,FXDECAL_OOZE, 0); // ooze + } + self->nextthink = 0; + self->mins[2] += 6; + self->gravity = 1; + self->movetype = MOVETYPE_STEP; + self->pain = NULL; + gi.linkentity(self); + } + return; + } + self->avelocity[0] *= 1.6; + self->avelocity[2] *= 1.6; + self->nextthink = level.time + .1; +} + +void barrel_chemical_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t falldir; + vec3_t prelimavel; + float angle; + + VectorSubtract(self->s.origin, other->s.origin, falldir); + VectorNormalize(falldir); + angle = 360 - self->s.angle_diff; + angle = NormalizeAngle(angle); + angle *= DEGTORAD; + prelimavel[0] = falldir[0] * -70; + prelimavel[2] = falldir[1] * 70; + self->avelocity[0] = -1*(prelimavel[0] * cos(angle) + prelimavel[2] * sin(angle)); + self->avelocity[2] = -1*(prelimavel[2] * cos(angle) + prelimavel[0] * -1 * sin(angle)); + VectorScale(falldir, damage*4, self->velocity); + self->velocity[2] = 150; + self->think = barrel_chemical_fall; + self->nextthink = level.time + .1; + self->elasticity = .7; +} + +void barrel_chemical_use (edict_t *self, edict_t *other, edict_t *activator) +{ + barrel_chemical_die (self, self, other, self->health, vec3_origin); +} + +/*QUAKED misc_generic_barrel_chemical (1 .5 0) (-9 -9 -15) (10 8 15) INVULNERABLE NOPUSH EXPLOSIVE DEKKER x x FLUFF +Chemical barrel. +------ KEYS ------ +message - text printed when killed +skin - +0 - normal barrel +1 - snowy barrel (Siberia) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +EXPLOSIVE: Will explode when it dies. +DEKKER - special barrel for Dekker to play with +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- Tips over when shot and leaks. +- Explosive barrels are given a red skin, others are brown. +*/ +void SP_misc_generic_barrel_chemical (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -9, -9, -15); + VectorSet (ent->maxs, 10, 8, 15); + + ent->pain = barrel_chemical_pain; + ent->die = barrel_chemical_die; + ent->use = barrel_chemical_use; + + if (ent->spawnflags & BARREL_EXPLOSIVE) + { + skinname = "barrel2"; + if (0 == ent->health) + { + ent->health = 1; + } + } + else + { + switch (ent->s.skinnum) + { + case 1: + skinname = "barrel3"; + break; + default : + skinname = "barrel"; + break; + } + } + + + SimpleModelInit2(ent,&genericModelData[OBJ_BARREL_CHEMICAL],skinname,NULL); + + // cache sound CLSFX_EXPLODE + entSoundsToCache[CLSFX_EXPLODE] = 1; + // cache debris CLGHL_EXPLODEBIG, CLGHL_EXPLODESML + entDebrisToCache[CLGHL_EXPLODEBIG] = DEBRIS_YES; + entDebrisToCache[CLGHL_EXPLODESML] = DEBRIS_YES; + + gi.soundindex("Ambient/Gen/FireFX/FireSmall.wav"); // precache sound +} + +/*QUAKED misc_generic_barrel_wine (1 .5 0) (-15 -10 -10) (15 10 10) INVULNERABLE NOPUSH x x x x FLUFF +A barrel of wine laying on it's side +------ KEYS ------ +message - text printed when killed +------ SPAWNFLAGS ------ +INVULNERABLE - can be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_barrel_wine (edict_t *ent) +{ + + VectorSet (ent->mins, -15, -10, -10); + VectorSet (ent->maxs, 15, 10, 10); + + SimpleModelInit2(ent,&genericModelData[OBJ_BARREL_WINE],NULL,NULL); +} + + +// called when the top is shot off of the bench +void benchtop_pain(edict_t *self, int nPartLost, vec3_t boltPos) +{ + //HLTH_GEN_BENCH +} + +// pain fn for the actual bench entity +void benchbottom_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + //HLTH_GEN_BENCH + trace_t trace; + vec3_t fwd, right, up, vEnd, vToWhereHit; + IGhoulInst* topInst = NULL; + Matrix4 matTop, matRot, matNew; + + AngleVectors(self->s.angles,fwd,right,up); + VectorSubtract(wherehit, self->s.origin, vToWhereHit); + + // was it shot from the front? + if (DotProduct(fwd, vToWhereHit) > 0) + { + // if the bench is still upright, try to knock it over + if (DotProduct(up, vec3_up) > 0.9f) + { + VectorMA(self->s.origin, -100.0f, fwd, vEnd); + gi.trace (self->s.origin, NULL, NULL, vEnd, self, self->clipmask, &trace); + if (trace.fraction < 1.0f) + { + } + else + { + // nothing stopping us from falling backward + vec3_t vTemp; + self->s.angles[PITCH] = -90; + VectorScale(fwd, -20.0f, vTemp); + VectorAdd(self->s.origin, vTemp, self->s.origin); + vTemp[2] -= 6; + // modify bbox so that absmin and absmax remain the same + VectorSubtract(self->mins, vTemp, self->mins); + VectorSubtract(self->maxs, vTemp, self->maxs); + + // knock off the top part (if it's still there) + if (topInst = SimpleModelGetBolt(self, 1)) + { + topInst->GetXForm(matTop); + matTop.Rotate(1, -3.1416f*0.125f); + topInst->SetXForm(matTop); + } + } + } + } + else + { + // it was hit from behind. try to knock it forward + if (DotProduct(up, vec3_up) > 0.9f) + { + VectorMA(self->s.origin, 100.0f, fwd, vEnd); + gi.trace (self->s.origin, NULL, NULL, vEnd, self, self->clipmask, &trace); + if (trace.fraction < 1.0f) + { + } + else + { + // nothing stopping us from falling forward + vec3_t vTemp; + VectorScale(fwd, 20.0f, vTemp); + vTemp[2] -= 7.0f; + self->s.angles[PITCH] = 70; + VectorAdd(self->s.origin, vTemp, self->s.origin); + // modify bbox so that absmin and absmax remain the same + VectorSubtract(self->mins, vTemp, self->mins); + VectorSubtract(self->maxs, vTemp, self->maxs); + + // knock off the top part (if it's still there) + if (topInst = SimpleModelGetBolt(self, 1)) + { + VectorSet(vEnd, -1.5f, -2.0f, 0); + topInst->GetXForm(matTop); + matTop.Translate(*(Vect3*)&vEnd); + matRot.Rotate(2, 3.141f*0.33f); + matNew.Concat(matTop, matRot); + topInst->SetXForm(matNew); + } + } + } + } + + Obj_partpain(self, other, kick, damage, wherehit); +} + +/*QUAKED misc_generic_bench (1 .5 0) (-11 -30 -18) (11 30 18) INVULNERABLE NOPUSH x x x x FLUFF +A highbacked wooden bench. +------ KEYS ------ +message - text printed when killed +skin - +0 - NYC bench (brown wood) +1 - Trainyard bench (beat up, faded) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls apart when shot +*/ +void SP_misc_generic_bench (edict_t *ent) +{ + char *skinname; + + // Set up object to break apart when shot + Obj_partbreaksetup (BPD_BENCH,&genericModelData[OBJ_BENCH_BOTTOM], + genericObjBoltPartsData,genericObjBreak); + + VectorSet (ent->mins, -10, -30,-17); + VectorSet (ent->maxs, 10, 30, 17); + + + switch (ent->s.skinnum) + { + case 1: + skinname = "bench2"; + break; + default : + skinname = "bench"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_BENCH_BOTTOM],skinname,NULL); + + gi.linkentity (ent); + + SimpleModelAddBolt(ent,genericModelData[OBJ_BENCH_BOTTOM],"DUMMY02", + genericModelData[OBJ_BENCH_TOP],"DUMMY01",skinname); + + ent->pain = benchbottom_pain; + VectorCopy(ent->s.angles,ent->moveinfo.start_angles); +} + + +void blinds_stoppain (edict_t *ent) +{ + ent->ghoulInst->Pause(level.time); +} + +void blind_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + ent->ghoulInst->Resume(level.time); + ent->think = blinds_stoppain; + ent->nextthink = level.time + (5 * FRAMETIME); + + SetSkin(ent,genericModelData[OBJ_BLINDS].dir,genericModelData[OBJ_BLINDS].file, + genericModelData[OBJ_BLINDS].materialfile,"blindsdmg", 0); + +} + +/*QUAK-ED misc_generic_blinds (1 .5 0) (-9 -55 -65) (9 55 65) VULNERABLE NOPUSH ANIMATE x x x FLUFF +A big set of grey window blinds +------ SPAWNFLAGS ------ +VULNERABLE - can be hurt +NOPUSH - can't be pushed +ANIMATE - blinds flap in the breeze +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- shakes when shot +*/ +void SP_misc_generic_blinds (edict_t *ent) +{ + + VectorSet (ent->mins, -1, -55, -65); + VectorSet (ent->maxs, 0, 55, 65); + + // Backwards about invincibility + if (ent->spawnflags & SF_INVULNERABLE) + { + ent->spawnflags &= ~SF_INVULNERABLE; + } + else + { + ent->spawnflags |= SF_INVULNERABLE; + } + + ent->spawnflags |= SF_NOPUSH; // Won't ever move + + ent->pain = blind_pain; + + SimpleModelInit2(ent,&genericModelData[OBJ_BLINDS],NULL,NULL); + + SetSkin(ent,genericModelData[OBJ_BLINDS].dir, + genericModelData[OBJ_BLINDS].file, + genericModelData[OBJ_BLINDS].materialfile,"blinds", 0); + +// SimpleModelScale(ent,0.6f); + + if (ent->spawnflags & SF_NOANIMATE) + ent->ghoulInst->Pause(level.time); + +// else // Make a flapping sound +// ent->s.sound = gi.soundindex("Ambient/Models/Banner/BanFlap.wav"); +} + + +void bookcase_partpain (edict_t *self,int partLost, vec3_t boltPos) +{ +} + +// Boltee is the thing being added on +// Bolter is the thing it is being added to +/*QUAKED misc_generic_bookshelf (1 .5 0) (-40 -16 0) (40 16 64) INVULNERABLE NOPUSH x x x x FLUFF +A bookshelf +--------SPAWNFLAGS---------- +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_bookshelf (edict_t *ent) +{ + char *skinname; + + // Set up object to break apart when shot + Obj_partbreaksetup (BPD_BOOKCASE,&genericModelData[OBJ_BOOKCASE], + genericObjBoltPartsData,genericObjBreak); + + switch (ent->s.skinnum) + { + case 1: + skinname = "middle"; + break; + default : + skinname = "case"; + break; + } + + + VectorSet (ent->mins, -40, -16,-0); + VectorSet (ent->maxs, 40, 16, 64); + + SimpleModelInit2(ent,&genericModelData[OBJ_BOOKCASE],skinname,NULL); + gi.linkentity (ent); + + SimpleModelAddBolt(ent,genericModelData[OBJ_BOOKCASE],"DUMMY01", + genericModelData[OBJ_BOOKSHELF],"DUMMY01",NULL); + SimpleModelAddBolt(ent,genericModelData[OBJ_BOOKCASE],"DUMMY02", + genericModelData[OBJ_BOOKSHELF],"DUMMY04",NULL); + SimpleModelAddBolt(ent,genericModelData[OBJ_BOOKCASE],"DUMMY03", + genericModelData[OBJ_BOOKSHELF],"DUMMY01",NULL); + + ent->pain = Obj_partpain; + VectorCopy(ent->s.angles,ent->moveinfo.start_angles); +} + +void broom_fall (edict_t *self) +{ + if (self->health <= 0) + { + return; + } + + if ((self->s.angles[0] >= 90) || (self->s.angles[0] <= -90) || + (self->s.angles[2] >= 90) || (self->s.angles[2] <= -90)) + { + if (self->s.angles[0] >= 90) + { + self->s.angles[0] = 90; + } + if (self->s.angles[0] <= -90) + { + self->s.angles[0] = -90; + } + if (self->s.angles[2] >= 90) + { + self->s.angles[2] = 90; + } + if (self->s.angles[2] <= -90) + { + self->s.angles[2] = -90; + } + VectorClear(self->avelocity); + if (self->health < 25) + { + self->nextthink = level.time + .3; + } + else + { + self->nextthink = 0; + } + return; + } + self->avelocity[0] *= 1.6; + self->avelocity[2] *= 1.6; + self->nextthink = level.time + .1; +} + + +void broom_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + +} + +/*QUAKED misc_generic_broom (1 .5 0) (-3 -17 -26) (3 17 26) INVULNERABLE NOPUSH x x x x FLUFF +An upright push-broom +------ KEYS ------ +skin - +0 - old beat up broom +1 - new broom +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_broom (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -2, -16,-25); + VectorSet (ent->maxs, 2, 16, 25); + + switch (ent->s.skinnum) + { + case 1: + skinname = "broom2"; + break; + default : + skinname = "broom"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_BROOM],skinname,NULL); + + ent->pain = broom_pain; + +} + +void bunk_layflat(edict_t *self) +{ + self->s.angles[PITCH] = self->moveinfo.start_angles[PITCH]; + self->s.angles[PITCH] -= 90; + VectorSet (self->mins, -40, -20,35); + VectorSet (self->maxs, 40, 20, 40); + self->solid = SOLID_BBOX; + gi.linkentity (self); +} + +void bunk_layflat2(edict_t *self) +{ + self->s.angles[PITCH] = self->moveinfo.start_angles[PITCH]; + self->s.angles[PITCH] += 90; + VectorSet (self->mins, -40, -20,35); + VectorSet (self->maxs, 40, 20, 40); + self->solid = SOLID_BBOX; + gi.linkentity (self); +} + +void bunk_roll1(edict_t *self) +{ + self->s.angles[PITCH] -= 6; + VectorSet (self->mins, -40, -20,-24); + VectorSet (self->maxs, 40, 20, 29); + gi.linkentity (self); +} + +void bunk_roll2(edict_t *self) +{ + self->s.angles[PITCH] -= 30; + VectorSet (self->mins, -40, -20,-10); + VectorSet (self->maxs, 40, 20, 29); + gi.linkentity (self); +} + +void bunk_roll3(edict_t *self) +{ + self->s.angles[PITCH] += 6; + VectorSet (self->mins, -40, -20,-24); + VectorSet (self->maxs, 40, 20, 29); + gi.linkentity (self); +} + +void bunk_roll4(edict_t *self) +{ + self->s.angles[PITCH] += 30; + VectorSet (self->mins, -40, -20,-10); + VectorSet (self->maxs, 40, 20, 29); + gi.linkentity (self); +} + +#define BUNK_FALL (M_PI*.11) +#define BUNKSIDE_FALL (M_PI*.3) + +void bunk_sidestogether(edict_t *self) +{ + Matrix4 matOld; + IGhoulInst* ShelfInst; + IGhoulInst *BunkBoltInst; + Matrix4 mat1,mat2; + vec3_t boltPos; + vec3_t right,fwd; + + BunkBoltInst = SimpleModelGetBolt(self, 1); + + if (BunkBoltInst) + { + GetGhoulPosDir(self->s.origin, self->s.angles, BunkBoltInst, + NULL, "DUMMY04", boltPos, NULL, NULL, NULL); + } + + AngleVectors(self->s.angles,fwd,right,NULL); + VectorMA(boltPos,-5,right,boltPos); + VectorMA(boltPos,80,fwd,boltPos); + + ShelfInst = BunkBoltInst; + ShelfInst->GetXForm(matOld); + mat1=mat2=matOld; + mat2.Rotate(2,BUNKSIDE_FALL); + matOld.Concat(mat1, mat2); + ShelfInst->SetXForm(matOld); + + // Turn other side + GetGhoulPosDir(self->s.origin, self->s.angles, BunkBoltInst, + NULL, "DUMMY03", boltPos, NULL, NULL, NULL); + BunkBoltInst = SimpleModelGetBolt(self, 4); + + AngleVectors(self->s.angles,fwd,right,NULL); + VectorMA(boltPos,-5,right,boltPos); + VectorMA(boltPos,80,fwd,boltPos); + + ShelfInst = BunkBoltInst; + ShelfInst->GetXForm(matOld); + mat1=mat2=matOld; + mat2.Rotate(2,-BUNKSIDE_FALL); + matOld.Concat(mat1, mat2); + ShelfInst->SetXForm(matOld); + +} + +// called when a part is shot off of the bunkbed +void bunk_partpain (edict_t *self,int partLost, vec3_t boltPos) +{ + Matrix4 matOld; + IGhoulInst* ShelfInst; + IGhoulInst *BunkBoltInst; + Matrix4 mat1,mat2; + bool B1, B2, B3, B4; +// ggOinstC *myInstance; +// ggObjC *MyGhoulObj; + boltInstInfo_c *boltInfo = NULL; + vec3_t debrisNorm; + + if (!self->objInfo || !(boltInfo = (boltInstInfo_c*)self->objInfo->GetInfo(OIT_BOLTINST)) ) + { + return; + } + B1 = boltInfo->IsOn(1); + B2 = boltInfo->IsOn(2); + B3 = boltInfo->IsOn(3); + B4 = boltInfo->IsOn(4); + + + // Bolt1 - Other side of bed + // Bolt2 - Top bunk + // Bolt3 - Bottom bunk + // Bolt4 - Other side of bed + + switch (partLost) + { + case(1): // Side of bed + + // Has other side, and both beds + // Make bed lean to side and top bunk angle down + if ((B2) && (B3) && (B4)) + { + bunk_roll1(self); + + BunkBoltInst = SimpleModelGetBolt(self, 2); + + // FIXME: have we been passed this boltPos? + GetGhoulPosDir(self->s.origin, self->s.angles, BunkBoltInst, + NULL, "DUMMY01", boltPos, NULL, NULL, NULL); + + ShelfInst = BunkBoltInst; + ShelfInst->GetXForm(matOld); + mat1=mat2=matOld; + mat2.Rotate(2,-BUNK_FALL); + matOld.Concat(mat1, mat2); + ShelfInst->SetXForm(matOld); + + } + // Has other side and top bunk only + // Make bed lean to side + else if ((B2) && (!B3) && (B4)) + { + bunk_roll2(self); + } + // Other side gone, has top and bottom bunk + // Make top bunk go away and drop bottom bunk to floor + else if ((B2) && (B3) && (!B4)) + { + Obj_partkill (self,2,true); + + self->s.angles[PITCH] = self->moveinfo.start_angles[PITCH]; + + VectorSet (self->mins, -40, -20,-20); + VectorSet (self->maxs, 40, 20, 5); + gi.linkentity (self); + + } + // Other side gone, bottom bunk gone, has top bunk + // Make top bunk go away and drop bottom bunk to floor + else if ((B2) && (!B3) && (!B4)) + { + self->s.angles[PITCH] = self->moveinfo.start_angles[PITCH]; + + VectorSet (self->mins, -40, -20,15); + VectorSet (self->maxs, 40, 20,25); + gi.linkentity (self); + + } + // Both bunks are gone, one side there + else if ((!B1) && (!B2) && (!B3) && (B4)) + { + + // Turn other side + BunkBoltInst = SimpleModelGetBolt(self,4); + + GetGhoulPosDir(self->s.origin, self->s.angles, BunkBoltInst, + NULL, "DUMMY03", boltPos, NULL, NULL, NULL); + + + ShelfInst = BunkBoltInst; + ShelfInst->GetXForm(matOld); + mat1=mat2=matOld; + mat2.Rotate(2,BUNKSIDE_FALL); + matOld.Concat(mat1, mat2); + ShelfInst->SetXForm(matOld); + + bunk_layflat(self); + } + else if ((!B1) && (!B2) && (B3) && (B4)) + { + bunk_roll1(self); + } + else if ((!B1) && (!B2) && (B3) && (!B4)) + { + self->s.angles[PITCH] = self->moveinfo.start_angles[PITCH]; + + VectorSet (self->mins, -40, -20,-20); + VectorSet (self->maxs, 40, 20, 5); + gi.linkentity (self); + } + + break; + case(2): // Top bunk + // Both bunks are gone, both sides are there + if ((!B2) && (!B3) && (B1) && (B4)) + { + bunk_sidestogether(self); + } + // Both bunks are gone, one side there + else if ((!B1) && (!B2) && (!B3) && (B4)) + { + bunk_layflat(self); + } + // Both bunks are gone, other side there + else if ((B1) && (!B2) && (!B3) && (!B4)) + { + bunk_layflat2(self); + } + + + break; + + case(3): // Bottom bunk + // Both bunks are gone, one side there + if ((!B1) && (!B2) && (!B3) && (B4)) + { + bunk_layflat(self); + } + // Both bunks are gone, other side there + if ((B1) && (!B2) && (!B3) && (!B4)) + { + bunk_layflat2(self); + } + // Both bunks are gone, both sides are there + else if ((!B2) && (!B3) && (B1) && (B4)) + { + bunk_sidestogether(self); + } + + break; + case(4): // Other side + // Both bunks there and other side there + if ((B1) && (B2) && (B3) && (!B4)) + { + Obj_partkill (self,2,true); // Remove top bunk + + bunk_roll3(self); + + } + // Both bunks are gone, one side there + else if ((B1) && (!B2) && (!B3) && (!B4)) + { + // Turn other side + BunkBoltInst = SimpleModelGetBolt(self,1); + + GetGhoulPosDir(self->s.origin, self->s.angles, BunkBoltInst, + NULL, "DUMMY03", boltPos, NULL, NULL, NULL); + + ShelfInst = BunkBoltInst; + ShelfInst->GetXForm(matOld); + mat1=mat2=matOld; + mat2.Rotate(2,-BUNKSIDE_FALL); + matOld.Concat(mat1, mat2); + ShelfInst->SetXForm(matOld); + + bunk_layflat2(self); + } + // Bottom bunk gone, top bunk there, one side there + else if ((B1) && (B2) && (!B3) && (!B4)) + { + bunk_roll4(self); + } + // Top bunk gone, bottom bunk there, one side there + else if ((B1) && (!B2) && (B3) && (!B4)) + { + bunk_roll3(self); + } + else if ((!B1) && (!B2) && (B3) && (!B4)) + { + self->s.angles[PITCH] = self->moveinfo.start_angles[PITCH]; + + VectorSet (self->mins, -40, -20,-20); + VectorSet (self->maxs, 40, 20, 5); + gi.linkentity (self); + } + break; + default: + break; + } + + VectorClear(debrisNorm); + // Throw debris and make it go away + FX_ThrowDebris(boltPos,debrisNorm, 5, DEBRIS_SM, self->material, 0,0,0, self->surfaceType); + FX_SmokePuff(boltPos,120,120,120,200); +} + + +/*QUAKED misc_generic_bunk (1 .5 0) (-41 -21 -30) (41 21 30) INVULNERABLE NOPUSH x x x x FLUFF +Bunk bed +------ KEYS ------ +Skin - +0 - hi-tech bunk +1 - iraq bunk +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls apart when shot +*/ +void SP_misc_generic_bunk (edict_t *ent) +{ + char *skinname; + IGhoulInst* BunkInst; + Matrix4 matOld,mat2,mat1; + ggBinstC *bInstC = NULL; + IGhoulInst *boltInst = NULL; + IGhoulInst *boltInst2 = NULL; + + + Obj_partbreaksetup (BPD_BUNK,&genericModelData[OBJ_BUNK], + genericObjBoltPartsData,genericObjBreak); + + VectorSet (ent->mins, -40, -20,-29); + VectorSet (ent->maxs, 40, 20, 29); + + switch (ent->s.skinnum) + { + case 1: + skinname = "bunk2"; + break; + default : + skinname = "bunk"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_BUNK],skinname,NULL); + + // Bolt1 - Other side of bed + SimpleModelAddBolt(ent,genericModelData[OBJ_BUNK],"DUMMY05", + genericModelData[OBJ_BUNKSIDE2],"DUMMY05",NULL); + // Bolt2 - Top bunk + SimpleModelAddBolt(ent,genericModelData[OBJ_BUNK],"DUMMY01", + genericModelData[OBJ_BUNKBED],"DUMMY02",NULL); + // Bolt3 - Bottom bunk + SimpleModelAddBolt(ent,genericModelData[OBJ_BUNK],"DUMMY03", + genericModelData[OBJ_BUNKBED],"DUMMY02",NULL); + // Bolt4 - Other side of bed + SimpleModelAddBolt(ent,genericModelData[OBJ_BUNK],"DUMMY03", + genericModelData[OBJ_BUNKSIDE2],"DUMMY05",NULL); + + SimpleModelRemoveObject(ent,"SIDE02"); + + // Rotating side panel + if (BunkInst = SimpleModelGetBolt(ent, 4)) + { + BunkInst->GetXForm(matOld); + mat1=mat2=matOld; + mat2.Rotate(0,-M_PI*1); + matOld.Concat(mat1, mat2); + BunkInst->SetXForm(matOld); + } + ent->pain = Obj_partpain; + VectorCopy(ent->s.angles,ent->moveinfo.start_angles); + +} + +void car_big_explode (edict_t *self) +{ + vec3_t debrisNorm; + VectorClear(debrisNorm); + + fxRunner.exec("weapons/world/airexplode", self->s.origin); + FX_C4Explosion(self); + + BlindingLight(self->s.origin, self->health*10, 0.9, 0.5); + ShakeCameras (self->s.origin, 100, 300, DEFAULT_JITTER_DELTA); + + FX_ThrowDebris(self->s.origin,debrisNorm, 8,DEBRIS_SM, self->material, 0,0,0, 0); +} + +void car_flip_think (edict_t *self) +{ + if ((self->velocity[2] < 5) && (self->velocity[2] > -5)) + { + self->s.angles[2] += self->count; + + if (self->s.angles[2] > 185) + { + self->count = -2; + } + else if (self->s.angles[2] < 170) + { + self->count = 2; + } + } + + if (level.time > self->pain_debounce_time) + { + car_big_explode(self); + } + else + { + self->nextthink = level.time + .1; + } +} + +void car_explode_think (edict_t *self) +{ + if (self->s.angles[2] > 172) + { + self->avelocity[2] = 0; + self->think = car_flip_think; + self->nextthink = level.time + .1; + self->count = 2; + self->pain_debounce_time = level.time + 2; + } + else + { + self->think = car_explode_think; + self->nextthink = level.time + .1; + } +} + +void car_explode (edict_t *self, edict_t *other, edict_t *activator) +{ + T_RadiusDamage (self, self, 100, self, 100, 0); + + gmonster.RadiusDeafen(self, 200, 200); + + fxRunner.exec("weapons/world/airexplode", self->s.origin); + FX_C4Explosion(self); + + self->movetype = MOVETYPE_DAN; // Can be pushed around + + self->velocity[2] = 500; + self->avelocity[2] = 180; + + self->think = car_explode_think; + self->nextthink = level.time + .1; +} + +#define AMERICANCAR_TIREDRIVERFRONT 1 +#define AMERICANCAR_TIREDRIVERBACK 2 +#define AMERICANCAR_TIREPSNGRFRONT 4 +#define AMERICANCAR_TIREPSNGRBACK 8 + +void car_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + ent = ent; +} +//void car_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +//{ +// float fDot; +// vec3_t up, facing,towherehit,pathdir,cross; + + +// AngleVectors(ent->s.angles,NULL,right,NULL); + +// VectorSubtract(wherehit,ent->s.origin,facing); +// VectorNormalize(facing); + +// AngleVectors(ent->s.angles, right, NULL, NULL); +// fDot = DotProduct(right, facing); + + +// VectorSet(up, 0, 0, 1); +// VectorSubtract(other->s.origin, ent->s.origin, pathdir); +// VectorNormalize(pathdir); +// VectorSubtract(wherehit,ent->s.origin, towherehit); +// CrossProduct(pathdir, towherehit, cross); +// fDot = DotProduct(cross, up); + + +// fDot = fDot; + + // Is other within range?????? +// if ((fDot < 0.88) && (fDot > 0.80)) +// { + // front passenger tire +// ent->s.angles[ROLL] += 5; +// ent->s.angles[PITCH] += 3; +// VectorSet (ent->mins, -69, -30,-22); +// } + + // front driver tire +/* ent->s.angles[ROLL] -= 5; + ent->s.angles[PITCH] += 3; + VectorSet (ent->mins, -69, -30,-22); +*/ + + // back driver tire +/* ent->s.angles[ROLL] -= 5; + ent->s.angles[PITCH] -= 3; + VectorSet (ent->mins, -69, -30,-22); +*/ + + // back passenger tire +/* ent->s.angles[ROLL] += 5; + ent->s.angles[PITCH] -= 3; + VectorSet (ent->mins, -69, -30,-22); +*/ + + +// gi.linkentity (ent); + + // fuck + +//} + + + +/*QUAKED misc_generic_car_american (1 .5 0) (-95 -112 -29) (95 113 53) INVULNERABLE NOPUSH CAR_ON SIREN x x FLUFF +Police car, Taxi or Cadillac. +------ KEYS ------ +Skin - +0 - police car +1 - taxi +2 - black cadillac +3 - miami police +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - N/A can't be pushed +CAR_ON - car lights will be on +SIREN - police car lights will be flashing +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_car_american (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -69, -30,-25); + VectorSet (ent->maxs, 69, 30, 25); + + ent->spawnflags |= SF_NOPUSH; // Won't ever move + + switch (ent->s.skinnum) + { + case 3: + skinname = "car4"; + break; + case 2: + skinname = "car3"; + break; + case 1: + skinname = "car2"; + break; + default : + skinname = "car1"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_CAR_AMERICAN],skinname,NULL); + + VectorSet (ent->mins, -69, -30,-25); + VectorSet (ent->maxs, 69, 30, 25); + + gi.linkentity (ent); + + if ((ent->s.skinnum==CAR_AMERICAN_POLICE) || (ent->s.skinnum==CAR_AMERICAN_MIAMI)) + { + SimpleModelRemoveObject(ent,"_TAXILIGHT01"); + SimpleModelRemoveObject(ent,"TAXI_OMNI01"); + SimpleModelRemoveObject(ent,"TAXI_OMNI02"); + + SimpleModelSetSequence(ent,"off",SMSEQ_HOLD); + } + else + { +// SimpleModelRemoveObject(ent,"LIGHT_SIRENS01"); +// SimpleModelRemoveObject(ent,"LIGHT_SIRENS02"); + SimpleModelRemoveObject(ent,"MIDDLE_SECTION"); + SimpleModelRemoveObject(ent,"REDSIREN"); + SimpleModelRemoveObject(ent,"BLUESIREN"); + + SimpleModelRemoveObject(ent,"REDCONE"); + SimpleModelRemoveObject(ent,"BLUECONE"); + + SimpleModelRemoveObject(ent,"WORLD_1"); + SimpleModelRemoveObject(ent,"WORLD_2"); + + SimpleModelSetSequence(ent,"off",SMSEQ_HOLD); + + if (ent->s.skinnum==CAR_AMERICAN_CADILLAC) + { + SimpleModelRemoveObject(ent,"_TAXILIGHT01"); + SimpleModelRemoveObject(ent,"TAXI_OMNI01"); + SimpleModelRemoveObject(ent,"TAXI_OMNI02"); + } + } + + if (ent->spawnflags & CAR_AMERICAN_ON) + { + SimpleModelSetSequence(ent,"on",SMSEQ_HOLD); + } + + if (ent->spawnflags & CAR_AMERICAN_SIREN) + { + ent->s.sound = gi.soundindex("Ambient/Models/Alarm/Police.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_NORMATTN; + + SimpleModelSetSequence(ent,"car",SMSEQ_LOOP); + } + +// ent->pain = car_pain; + ent->count = 0; // Poor little count gets used to flag which tires have been shot out +} + +void car_european_use(edict_t *self, edict_t *other, edict_t *activator) +{ + self->solid = SOLID_BBOX; + // he should be visible + if (self->ghoulInst) + { + self->ghoulInst->SetOnOff(true, level.time); + } +} + +/*QUAKED misc_generic_car_european (1 .5 0) (-70 -31 -26) (70 31 26) INVULNERABLE NOPUSH TRIGGER_SPAWN x x x FLUFF +1980's Ford escort-like European egg-mobile car. +------ KEYS ------ +Skin - +0 - clean and tan +1 - dirty/rusty and red +2 - shot full o' holes, missing hood +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - N/A can't be pushed +TRIGGER_SPAWN - use it and it shows up +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_car_european (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -91, -33,-28); + VectorSet (ent->maxs, 91, 33, 30); + + ent->spawnflags |= SF_NOPUSH; // Won't ever move + + switch (ent->s.skinnum) + { + case 1: + skinname = "car2"; + break; + case 2: + skinname = "car3"; + break; + default : + skinname = "car"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_CAR_EUROPEAN],skinname,NULL); + if (ent->spawnflags & CAR_TRIGGER_SPAWN) + { + ent->solid = SOLID_NOT; + // he shouldn't even be visible + if (ent->ghoulInst) + { + ent->ghoulInst->SetOnOff(false, level.time); + } + ent->use = car_european_use; + } +} + +/*QUAKED misc_generic_car_honda (1 .5 0) (-56 -25 -24) (56 25 31) INVULNERABLE NOPUSH x x x x FLUFF +Tiny Japanese police car +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_car_honda (edict_t *ent) +{ + VectorSet (ent->mins, -55, -25,-23); + VectorSet (ent->maxs, 55, 25, 30); + + ent->spawnflags |= SF_NOPUSH; // Won't ever move + + SimpleModelInit2(ent,&genericModelData[OBJ_CAR_HONDA],NULL,NULL); + +} + +void generic_car_rolls_pain2(edict_t *self) +{ + IGhoulObj *obj = self->ghoulInst->GetGhoulObject(); + GhoulID hood = NULL_GhoulID; + + if (obj) + { + hood = obj->FindPart("dummy01"); + fxRunner.stopContinualEffect("environ/helismoke", self, hood); + } +} + +void generic_car_rolls_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + IGhoulObj *obj = self->ghoulInst->GetGhoulObject(); + GhoulID hood = NULL_GhoulID; + + if (NULL == obj) + { + return; + } + if (!self->count) + SimpleModelSetSequence(self,"car",SMSEQ_HOLD); + + self->pain = NULL; + + Obj_explode(self,&self->s.origin,0,0); + + if (self->s.sound) + { + self->s.sound = NULL; + gi.sound (self, CHAN_BODY, gi.soundindex ("Ambient/Models/Alarm/CarDisarm.wav"), .8, ATTN_NORM, 0); + } + + self->touch = NULL; + + hood = obj->FindPart("dummy01"); + + fxRunner.execContinualEffect("environ/helismoke", self, hood, 0); + + self->think = generic_car_rolls_pain2; + self->nextthink = level.time + 5; + +} + + +void car_rolls_use (edict_t *self, edict_t *other, edict_t *activator) +{ + SimpleModelSetSequence(self,"car",SMSEQ_HOLD); + self->count = 1; +} + +void car_rolls_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if (other->client) + { + self->s.sound = gi.soundindex("Ambient/Models/Alarm/CarAlarm.wav"); + self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + self->touch = NULL; + } +} + + +/*QUAKED misc_generic_car_rolls (1 .5 0) (-85 -30 -25) (85 30 47) INVULNERABLE NOPUSH x x x x FLUFF +A luxury car. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- car alarm goes off when touched +- hood pops open when shot +*/ +void SP_misc_generic_car_rolls (edict_t *ent) +{ + VectorSet (ent->mins, -84, -29,-24); + VectorSet (ent->maxs, 84, 29, 46); + + ent->spawnflags |= SF_NOPUSH; // Won't ever move + ent->pain = generic_car_rolls_pain; + ent->use = car_rolls_use; // Use for trigger_uses + ent->plUse = car_rolls_use; // Use for when player pushes 'use' key + ent->touch = car_rolls_touch; + + SimpleModelInit2(ent,&genericModelData[OBJ_CAR_ROLLS],NULL,NULL); + + ent->ghoulInst->Pause(level.time); + + ent->count = 0; + + // cache sound CLSFX_EXPLODE + entSoundsToCache[CLSFX_EXPLODE] = 1; + + gi.soundindex ("Ambient/Models/Alarm/CarDisarm.wav"); // precache sound + gi.soundindex("Ambient/Models/Alarm/CarAlarm.wav"); // precache sound + gi.effectindex("environ/helismoke"); +} + +/*QUAKED misc_generic_car_sports (1 .5 0) (-83 -36 -20) (83 36 20) INVULNERABLE NOPUSH x x x x FLUFF +a Lamborghini sports car. +------ KEYS ------ +Skin - +0 - shiny red +1 - shiny yellow +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_car_sports (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -82, -35,-19); + VectorSet (ent->maxs, 82, 35, 19); + + switch (ent->s.skinnum) + { + case 1: + skinname = "car2"; + break; + default : + skinname = "car"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_CAR_SPORTS],skinname,NULL); +} + +/*QUAKED misc_generic_cart (1 .5 0) (-11 -21 -12) (11 21 12) INVULNERABLE NOPUSH x x x x FLUFF +A wheeled cart. Can put stuff on both shelves. +------ KEYS ------ +skin - +0 - Clean, metal +1 - Dirty, bloody (ugn2) +2 - wood (iraq) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ + +void SP_misc_generic_cart (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -10, -20,-11); + VectorSet (ent->maxs, 10, 20, 11); + ent->mass = 25; + + switch (ent->s.skinnum) + { + case 1: + skinname = "cart2"; + break; + case 2: + skinname = "cartwood"; + ent->surfaceType = SURF_WOOD_LBROWN; + ent->material = MAT_WOOD_LBROWN; + break; + default: + skinname = "cart"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_CART],skinname,NULL); + +} + +void cash_register_paindone(edict_t *self) +{ + fxRunner.stopContinualEffect("environ/normalsmoke", self); +} + +void cash_register_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t spray1, spray2,fwd,up; + + VectorSet(spray1, (rand()%21) - 10, (rand()%21) - 10, 0); + VectorSet(spray2, (rand()%21) - 10, (rand()%21) - 10, 0); + + FX_MakeSparks(self->s.origin, spray1, 2); + FX_MakeSparks(self->s.origin, spray2, 2); + + AngleVectors(self->s.angles,fwd,NULL,up); + + if (self->s.skinnum==0) + { + SetSkin(self,genericModelData[OBJ_CASH_REGISTER].dir,genericModelData[OBJ_CASH_REGISTER].file, + genericModelData[OBJ_CASH_REGISTER].materialfile,"registerd", 0); + } + self->pain = NULL; + + fxRunner.execContinualEffect("environ/normalsmoke", self); + + self->think = cash_register_paindone; + self->nextthink = level.time + 2; + +} + +/*QUAKED misc_generic_cash_register (1 .5 0) (-9 -9 -10) (9 9 10) INVULNERABLE NOPUSH x x x x FLUFF +A cash register. +------ KEYS ------ +skin : +0 - normal clean register +1 - damaged +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- has damage skin when shot +*/ +void SP_misc_generic_cash_register (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -8, -8,-9); + VectorSet (ent->maxs, 8, 8, 9); + + ent->pain = cash_register_pain; + + switch (ent->s.skinnum) + { + case 1: + skinname = "registerd"; + break; + default: + skinname = "register"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_CASH_REGISTER],NULL,NULL); + + SetSkin(ent,genericModelData[OBJ_CASH_REGISTER].dir, + genericModelData[OBJ_CASH_REGISTER].file, + genericModelData[OBJ_CASH_REGISTER].materialfile,skinname, 0); + gi.effectindex("environ/normalsmoke"); +} + +void chair_legs_flat(edict_t *self) +{ + VectorCopy(self->moveinfo.start_angles,self->s.angles); + VectorSet (self->mins, -10, -9,-0); + VectorSet (self->maxs, 10, 9, 18); + gi.linkentity(self); +} + +void chair_legs_roll1(edict_t *self) +{ + self->s.angles[PITCH] += 40; + VectorSet (self->mins, -10, -9,-6); + VectorSet (self->maxs, 10, 9, 18); + gi.linkentity(self); +} + +void chair_legs_roll2(edict_t *self) +{ + self->s.angles[ROLL] -= 40; + VectorSet (self->mins, -10, -9,-6); + VectorSet (self->maxs, 10, 9, 18); + gi.linkentity(self); +} + +void chair_legs_roll3(edict_t *self) +{ + self->s.angles[ROLL] += 40; + VectorSet (self->mins, -10, -9,-6); + VectorSet (self->maxs, 10, 9, 18); + gi.linkentity(self); +} + +void chair_legs_roll4(edict_t *self) +{ + self->s.angles[PITCH] -= 40; + VectorSet (self->mins, -10, -9,-6); + VectorSet (self->maxs, 10, 9, 18); + gi.linkentity(self); +} + +void chair_legs_partpain (edict_t *self,int partLost, vec3_t boltPos) +{ + bool B1, B2, B3, B4; + boltInstInfo_c *boltInfo = NULL; + vec3_t debrisNorm; + + if (!self->objInfo || !(boltInfo = (boltInstInfo_c*)self->objInfo->GetInfo(OIT_BOLTINST)) ) + { + return; + } + B1 = boltInfo->IsOn(1); + B2 = boltInfo->IsOn(2); + B3 = boltInfo->IsOn(3); + B4 = boltInfo->IsOn(4); + + if ((!B1) && (!B2) && (!B3) && (!B4)) + { + chair_legs_flat(self); + return; + } + + // These are given as you face the chair + // bolt1 - left front leg + // bolt2 - right front leg + // bolt3 - right back leg + // bolt4 - left back leg + + switch (partLost) + { + case 1: // left front leg + if ((!B2) && (B3) && (B4)) + { + chair_legs_roll1(self); + } + else if ((B2) && (B3) && (!B4)) + { + chair_legs_roll3(self); + } + else if ((B2) && (!B3) && (B4)) + { + Obj_partkill (self,2,true); // Remove legs + Obj_partkill (self,4,true); // Remove legs + chair_legs_flat(self); + } + // Throw debris + VectorClear(debrisNorm); + FX_ThrowDebris(self->s.origin,debrisNorm, 7, DEBRIS_SM, self->material,0,0,0, self->surfaceType); + + break; + case 2: // right front leg + if ((!B1) && (B3) && (B4)) + { + chair_legs_roll1(self); + } + else if ((B1) && (!B3) && (B4)) + { + chair_legs_roll2(self); + } + else if ((B1) && (B3) && (!B4)) + { + Obj_partkill (self,1,true); // Remove legs + Obj_partkill (self,3,true); // Remove legs + chair_legs_flat(self); + } + // Throw debris + VectorClear(debrisNorm); + FX_ThrowDebris(self->s.origin,debrisNorm, 7, DEBRIS_SM, self->material,0,0,0, self->surfaceType); + break; + case 3: // right back leg + if ((!B2) && (B1) && (B4)) + { + chair_legs_roll2(self); + } + else if ((B2) && (B1) && (!B4)) + { + chair_legs_roll4(self); + } + else if ((!B1) && (B2) && (B4)) + { + Obj_partkill (self,2,true); // Remove legs + Obj_partkill (self,4,true); // Remove legs + chair_legs_flat(self); + } + // Throw debris + VectorClear(debrisNorm); + FX_ThrowDebris(self->s.origin,debrisNorm, 7, DEBRIS_SM, self->material,0,0,0, self->surfaceType); + break; + case 4: // left back leg + if ((!B1) && (B2) && (B3)) + { + chair_legs_roll3(self); + } + else if ((B1) && (B2) && (!B3)) + { + chair_legs_roll4(self); + } + else if ((B1) && (!B2) && (B3)) + { + Obj_partkill (self,1,true); // Remove legs + Obj_partkill (self,4,true); // Remove legs + chair_legs_flat(self); + } + // Throw debris + VectorClear(debrisNorm); + FX_ThrowDebris(self->s.origin,debrisNorm, 7, DEBRIS_SM, self->material,0,0,0, self->surfaceType); + break; + default : + break; + } +} + +/*QUAKED misc_generic_chair_legs (1 .5 0) (-11 -10 -19) (11 10 19) INVULNERABLE NOPUSH x x x x FLUFF +A chair with four legs +------ KEYS------ +skin - +0 - metal +1 - wooden +2 - white plastic +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls apart when shot +*/ +void SP_misc_generic_chair_legs (edict_t *ent) +{ + char *skinname; + ggBinstC *bInstC = NULL; + IGhoulInst *boltInst = NULL; + IGhoulInst *boltInst2 = NULL; + + VectorSet (ent->mins, -10, -9,-12); + VectorSet (ent->maxs, 10, 9, 18); + ent->mass = 50; + + switch (ent->s.skinnum) + { + case 1: + skinname = "legsb"; + ent->surfaceType = SURF_WOOD_LBROWN; + ent->material = MAT_WOOD_LBROWN; + break; + case 2: + skinname = "legsplastic"; + ent->surfaceType = SURF_DEFAULT; + ent->material = MAT_WALL_WHITE; + break; + default: + skinname = "legs"; + ent->surfaceType = SURF_METAL; + ent->material = MAT_METAL_LGREY; + break; + } + + Obj_partbreaksetup (BPD_CHAIR_LEGS,&genericModelData[OBJ_CHAIR_LEGS], + genericObjBoltPartsData,genericObjBreak); + + SimpleModelInit2(ent,&genericModelData[OBJ_CHAIR_LEGS],skinname,NULL); + + // These are given as you face the chair + // bolt1 - left front leg + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY01", + genericModelData[OBJ_CHAIR_LEGS_LEGS],"DUMMY01",skinname); + // bolt2 - right front leg + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY02", + genericModelData[OBJ_CHAIR_LEGS_LEGS],"DUMMY01",skinname); + // bolt3 - right back leg + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY03", + genericModelData[OBJ_CHAIR_LEGS_LEGS],"DUMMY01",skinname); + // bolt4 - left back leg + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY04", + genericModelData[OBJ_CHAIR_LEGS_LEGS],"DUMMY01",skinname); + ent->pain = Obj_partpain; + VectorCopy(ent->s.angles,ent->moveinfo.start_angles); + +} + + +/*QUAKED misc_generic_chair_legs2 (1 .5 0) (-13 -11 -21) (13 11 21) INVULNERABLE NOPUSH x x x x FLUFF +A chair with two long solid legs on the sides. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_chair_legs2 (edict_t *ent) +{ + VectorSet (ent->mins, -12, -10,-20); + VectorSet (ent->maxs, 12, 10, 20); + + SimpleModelInit2(ent,&genericModelData[OBJ_CHAIR_LEGS2],NULL,NULL); +} + + +void chair_squeak (edict_t *self) +{ + int soundrand; + eft_rotate_t *rotInfo = NULL; + + if (rotInfo = FXA_GetRotate(self)) + { + if ( abs(rotInfo->xRot) > 2000) + { + soundrand = gi.irand(0,2); + } + else if ( abs(rotInfo->xRot) > 1000) + { + soundrand = gi.irand(0,6); + } + else + { + soundrand = -1; + } + switch(soundrand) + { + case 0: + case 1: + case 2: + gi.sound (self, CHAN_BODY, gi.soundindex ("Impact/Chair/Squeak1.wav"), .8, ATTN_NORM, 0); + break; + default: + break; + } + // slap some friction on this thing + rotInfo->xRot *= 0.75f; + if (abs(rotInfo->xRot) < (0.3f * 512))//512 accounts for the shift induced by FXA_SetRotate() + { + // stop the madness! + FXA_RemoveRotate(self); + self->think = NULL; + } + else + { + self->nextthink = level.time + 0.5f; + } + } +} + +void chair_spin (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + IGhoulInst *seat = NULL; + vec3_t towherehit, cross, pathdir, up, angVel = {0,0,0}; + eft_rotate_t *rotInfo = NULL; + float fMult = 0.1f * damage; + + if (seat = SimpleModelGetBolt(self, 1)) + { + // only spin the seat portion of the chair + VectorSet(up, 0, 0, 1); + VectorSubtract(other->s.origin, self->s.origin, pathdir); + VectorNormalize(pathdir); + VectorSubtract(wherehit,self->s.origin, towherehit); + CrossProduct(pathdir, towherehit, cross); + if (DotProduct(cross, up) > 0) + { + if (rotInfo = FXA_GetRotate(self)) + { + // adding to an existing rotation + rotInfo->xRot += fMult*512;//512 accounts for the shift induced by FXA_SetRotate() + } + else + { + // need to create a rotating effect + angVel[PITCH] = (fMult<30)?fMult:30; + FXA_SetRotate(self, angVel, seat); + } + } + else if (DotProduct(cross, up) < 0) + { + if (rotInfo = FXA_GetRotate(self)) + { + // adding to an existing rotation + rotInfo->xRot += (-fMult)*512;//512 accounts for the shift induced by FXA_SetRotate() + } + else + { + // need to create a rotating effect + angVel[PITCH] = (fMult<30)?-fMult:-30; + FXA_SetRotate(self, angVel, seat); + } + } + + self->think = chair_squeak; + // need to think pretty often cuz that's where we'll slow down the chair's rotation to simulate friction + self->nextthink = level.time + 0.5f; + } +} + +/*QUAKED misc_generic_chair_office (1 .5 0) (-10 -12 -18) (12 12 23) INVULNERABLE NOPUSH x x x x FLUFF +Office chair on castors. +------ KEYS ------ +skin - +0 - bright metal +1 - dark Tokyo chair +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- Spins and creaks when shot. + */ +void SP_misc_generic_chair_office (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -13, -13, -17.5); + VectorSet (ent->maxs, 13, 13, 24); + + ent->pain = chair_spin; + + switch (ent->s.skinnum) + { + case 1: + skinname = "office2"; + break; + default: + skinname = "office"; + break; + } + + + SimpleModelInit2(ent,&genericModelData[OBJ_CHAIR_OFFICE_BASE],skinname,NULL); + SimpleModelAddBolt(ent,genericModelData[OBJ_CHAIR_OFFICE_BASE],"DUMMY02", + genericModelData[OBJ_CHAIR_OFFICE_SEAT],"DUMMY01",skinname); + + switch (ent->s.skinnum) + { + case 1: + ent->material = MAT_METAL_DGREY; + break; + default: + break; + } + + gi.soundindex ("Impact/Chair/Squeak1.wav"); // precache sound +} + +/*QUAKED misc_generic_chunks_brick (1 .5 0) (-7 -4 -3) (7 4 3) INVULNERABLE NOPUSH x x x x FLUFF +Brick chunks used for debris +------ KEYS ------ +Skin - +0 - red brick (default) +1 - dark grey +2 - dark brown +3 - light brown +4 - light grey + +Style - type of chunk +0 - normal brick (default) +1 - half a brick +2 - 1/4 of brick +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_chunks_brick (edict_t *ent) +{ + char *partname,*skinname; + + VectorSet (ent->mins, -6, -3, -2); + VectorSet (ent->maxs, 6, 3, 2); + + switch (ent->s.skinnum) + { + case 1: + skinname = "grey_dk"; + break; + case 2: + skinname = "brwn_dk"; + break; + case 3: + skinname = "brwn_lt"; + break; + case 4: + skinname = "grey_lt"; + break; + default: + skinname = "red"; + break; + } + + switch (ent->style) + { + case 1: + partname = "CHUNK_2"; + break; + case 2: + partname = "CHUNK_3"; + break; + default: + partname = "CHUNK_1"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_CHUNKS_BRICK],skinname,partname); + +} + +/*QUAKED misc_generic_chunks_glass (1 .5 0) (-8 -7 -0.5) (8 7 0.5) INVULNERABLE x x x x x FLUFF +Glass shards used for debris +------ KEYS ------ +style - type of chunk +0 - small triangular (default) +1 - medium triangular +2 - long thin +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_chunks_glass (edict_t *ent) +{ + char *partname; + + VectorSet (ent->mins, 0, -1, -1); + VectorSet (ent->maxs, 1, 1, 1); + + switch (ent->style) + { + case 1: + partname = "GLASS02"; + break; + case 2: + partname = "GLASS03"; + break; + default: + partname = "GLASS01"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_CHUNKS_GLASS],NULL,partname); +} + +/*QUAKED misc_generic_chunks_metal (1 .5 0) (-5 -2 -1) (5 2 1) INVULNERABLE x x x x x FLUFF +Metal chunks used for debris. +------ KEYS ------ +style - type of chunk +0 - wide and long piece (default) +1 - long thin piece +2 - smaller piece +3 - another small piece +skin - +0 - dark +1 - rusty +2 - shiny +3 - light +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_chunks_metal (edict_t *ent) +{ + char *partname,*skinname; + + VectorSet (ent->mins, -4, -2, -4); + VectorSet (ent->maxs, 4, 2, 4); + + switch (ent->s.skinnum) + { + case 1: + skinname = "rusty"; + break; + case 2: + skinname = "shiny"; + break; + case 3: + skinname = "light"; + break; + default: + skinname = "dark"; + break; + } + + switch (ent->style) + { + case 1: + partname = "METAL2"; + break; + case 2: + partname = "METAL3"; + break; + case 3: + partname = "METAL4"; + break; + default: + partname = "METAL1"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_CHUNKS_METAL],skinname,partname); +} + +/*QUAKED misc_generic_chunks_rock (1 .5 0) (-5 -2 -1) (5 2 1) INVULNERABLE x x x x x FLUFF +Rock chunks used for debris. +------ KEYS ------ +style - type of chunk +0 - big rock (default) +1 - medium rock +2 - small rock +3 - another small rock +skin - +0 - brwn_dk +1 - brwn_lt +2 - grey_dk +3 - grey_lt +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_chunks_rock (edict_t *ent) +{ + char *partname,*skinname; + + VectorSet (ent->mins, 0, -1, -1); + VectorSet (ent->maxs, 1, 1, 1); + + switch (ent->s.skinnum) + { + case 1: + skinname = "brwn_lt"; + break; + case 2: + skinname = "grey_dk"; + break; + case 3: + skinname = "grey_lt"; + break; + default: + skinname = "brwn_dk"; + break; + } + + switch (ent->style) + { + case 1: + partname = "ROCK2"; + break; + case 2: + partname = "ROCK3"; + break; + case 3: + partname = "ROCK4"; + break; + default: + partname = "ROCK1"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_CHUNKS_ROCK],skinname,partname); +} + + +/*QUAKED misc_generic_chunks_wall (1 .5 0) (-5 -6 -10) (5 8 10) INVULNERABLE x x x x x FLUFF +Wall chunks used as debris +------ KEYS ------ +Skin : +0 - black (default) +1 - brown +2 - dark brown +3 - light brown +4 - grey +5 - dark grey +6 - light grey +7 - green +8 - orange cone +9 - red +10 - white +Style - type of chunk +0 - small (default) +1 - thin flat +2 - round chunk +3 - other round chunk +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_chunks_wall (edict_t *ent) +{ + char *skinname,*partname; + + VectorSet (ent->mins, -4, -2, -4); + VectorSet (ent->maxs, 4, 2, 4); + + switch (ent->s.skinnum) + { + case 1: + skinname = "brown"; + ent->surfaceType = SURF_STONE_BLACK; + break; + case 2: + skinname = "lbrown"; + ent->surfaceType = SURF_STONE_LGREY; + break; + case 3: + skinname = "dbrown"; + ent->surfaceType = SURF_STONE_LBROWN; + break; + case 4: + skinname = "grey"; + ent->surfaceType = SURF_STONE_LBROWN; + break; + case 5: + skinname = "dgrey"; + ent->surfaceType = SURF_STONE_LGREY; + break; + case 6: + skinname = "lgrey"; + ent->surfaceType = SURF_STONE_DGREY; + break; + case 7: + skinname = "green"; + ent->surfaceType = SURF_STONE_DGREY; + break; + case 8: + skinname = "orange_cone"; + ent->surfaceType = SURF_STONE_GREEN; + break; + case 9: + skinname = "red"; + ent->surfaceType = SURF_STONE_RED; + break; + case 10: + skinname = "white"; + ent->surfaceType = SURF_SAND_LBROWN; + break; + default: + skinname = "black"; + ent->surfaceType = SURF_STONE_LGREY; + break; + } + + switch (ent->style) + { + case 1: + partname = "_SMALLCHUNK"; + break; + case 2: + partname = "_MEDIUMCHUNK"; + break; + case 3: + partname = "_LARGECHUNK"; + break; + default: + partname = "_LITTLECHUNK"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_CHUNKS_WALL],skinname,partname); + +} + +/*QUAKED misc_generic_chunks_wood (1 .5 0) (-5 -2 -1) (5 2 1) INVULNERABLE x x x x x FLUFF +Wood chunks used for debris +------ KEYS ------ +Style - type of chunk +0 - small piece(default) +1 - medium piece +2 - another small piece +3 - large piece +Skin : +0 - dark brown (default) +1 - dark grey +2 - light brown +3 - light grey +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_chunks_wood (edict_t *ent) +{ + char *partname,*skinname; + + VectorSet (ent->mins, 0, -1, -1); + VectorSet (ent->maxs, 1, 1, 1); + + + switch (ent->s.skinnum) + { + case 1: + skinname = "grey_dk"; + break; + case 2: + skinname = "brwn_lt"; + break; + case 3: + skinname = "grey_lt"; + break; + default: + partname = "brwn_dk"; + break; + } + + switch (ent->style) + { + case 1: + partname = "WOOD2"; + break; + case 2: + partname = "WOOD3"; + break; + case 3: + partname = "WOOD4"; + break; + default: + partname = "WOOD1"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_CHUNKS_WOOD],skinname,partname); +} + +void comp_keyboard_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + Obj_painflip (ent,other,damage*FLIPMULT_COMP_KEYBOARD); +} + +/*QUAKED misc_generic_comp_keyboard (1 .5 0) (-4 -12 -2) (4 12 2) INVULNERABLE NOPUSH x x x x FLUFF +A keyboard to a computer. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_comp_keyboard (edict_t *ent) +{ + VectorSet (ent->mins, -4, -11, -2); + VectorSet (ent->maxs, 4, 11, 2); + + SimpleModelInit2(ent,&genericModelData[OBJ_COMP_KEYBOARD],NULL,NULL); + + ent->pain = comp_keyboard_pain; +} + + +void comp_monitor_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t fwd,up; + vec3_t holdPos; + + SetSkin(ent,genericModelData[OBJ_COMP_MONITOR].dir,genericModelData[OBJ_COMP_MONITOR].file, + genericModelData[OBJ_COMP_MONITOR].materialfile,"damaged", 1); + + AngleVectors(ent->s.angles,fwd,NULL,up); + + VectorMA(ent->s.origin,10,fwd,holdPos); + + // kef -- alot of these fx are also being performed in MakeComputerGlassDamage(), which also + //gets called when a comp_monitor is shot + /* + // Throw some sparks + VectorSet(spray1, (rand()%21) - 10, (rand()%21) - 10, 0); + FX_MakeSparks(holdPos, spray1, 1); + VectorSet(spray1, (rand()%21) - 10, (rand()%21) - 10, 0); + FX_MakeSparks(holdPos, spray1, 1); + VectorSet(spray1, (rand()%41) - 20, (rand()%41) - 20, (irand(5,10))); + FX_MakeSparks(holdPos, spray1, 1); + + // Throw some chunks + FX_ThrowDebris(holdPos, 3,DEBRIS_SM, MAT_METAL_DGREY,0,0,0, SURF_METAL_COMPUTERS); + FX_ThrowDebris(holdPos, 5,DEBRIS_SM, MAT_GLASS,0,0,0, SURF_GLASS_COMPUTER); +*/ + FX_LittleExplosion(holdPos, 100, 0); + + fxRunner.execContinualEffect("environ/normalsmoke", ent); + + gi.sound (ent, CHAN_VOICE, gi.soundindex("Impact/Glassbreak/Monitor.wav"), .6, ATTN_NORM, 0); + + ent->pain = NULL;//tv_pain; + + ent->think = tv_damaged_think; + ent->nextthink = level.time; + + ent->pain_debounce_time = level.time + gi.flrand(6,12); // How long to smoke + ent->s.sound = gi.soundindex("Ambient/Gen/Electric/buzz.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; +} + + +void comp_monitor_die (edict_t *ent, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + vec3_t debrisNorm; + + VectorClear(debrisNorm); + + // Throw some chunks + FX_ThrowDebris(ent->s.origin,debrisNorm, 7, DEBRIS_SM, ent->material,0,0,0, ent->surfaceType); + tv_die(ent, inflictor, attacker, damage, point); +} + +// POSSIBLY: Bring up Activision/Raven Logo when used + +/*QUAKED misc_generic_comp_monitor (1 .5 0) (-9 -12 -12) (9 12 12) INVULNERABLE NOPUSH x x x x FLUFF +A computer and monitor. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- sparks and smokes when shot +*/ +void SP_misc_generic_comp_monitor (edict_t *ent) +{ + VectorSet (ent->mins, -9, -12, -12); + VectorSet (ent->maxs, 9, 12, 12); + + SimpleModelInit2(ent,&genericModelData[OBJ_COMP_MONITOR],NULL,NULL); + + SetSkin(ent,genericModelData[OBJ_COMP_MONITOR].dir, + genericModelData[OBJ_COMP_MONITOR].file, + genericModelData[OBJ_COMP_MONITOR].materialfile,"monitor", 1); + + ent->pain = comp_monitor_pain; + ent->die = comp_monitor_die; + + // cache sound CLSFX_EXP_SMALL + entSoundsToCache[CLSFX_EXP_SMALL] = 1; + + gi.soundindex("Impact/Glassbreak/Monitor.wav"); // precache sound + gi.soundindex("Ambient/Gen/Electric/buzz.wav"); // precache sound + gi.effectindex("environ/normalsmoke"); +} + +// FIXME : effect is positioned right and the damage skin on the monitor isn't appearing +void comp_monitor2_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t fwd,right,up; + vec3_t holdPos; + + SetSkin(ent,genericModelData[OBJ_COMP_MONITOR2].dir,genericModelData[OBJ_COMP_MONITOR2].file, + genericModelData[OBJ_COMP_MONITOR2].materialfile,"monitor2_d", 1); + + AngleVectors(ent->s.angles,fwd,right,up); + + VectorMA(ent->s.origin,14,fwd,holdPos); + + FX_LittleExplosion(holdPos, 100, 0); + + fxRunner.execContinualEffect("environ/normalsmoke", ent); + + gi.sound (ent, CHAN_VOICE, gi.soundindex("Impact/Glassbreak/Monitor.wav"), .6, ATTN_NORM, 0); + + ent->pain = NULL;//tv_pain; + + ent->think = tv_damaged_think; + ent->nextthink = level.time; + + ent->pain_debounce_time = level.time + gi.flrand(6,12); // How long to smoke + ent->s.sound = gi.soundindex("Ambient/Gen/Electric/buzz.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; +} + + +/*QUAKED misc_generic_comp_monitor2 (1 .5 0) (-34 -15 -8) (9 7 15) INVULNERABLE NOPUSH x x x x FLUFF +A high tech computer with a large monitor. +------ KEYS ------ +skin - +0 - clean +1 - damaged +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- sparks and smoke when shot +- switches to damage skin when shot +*/ +void SP_misc_generic_comp_monitor2 (edict_t *ent) +{ + VectorSet (ent->mins, -9, -12, -12); + VectorSet (ent->maxs, 9, 12, 12); + + SimpleModelInit2(ent,&genericModelData[OBJ_COMP_MONITOR2_TOWER],NULL,NULL); + + SimpleModelAddBolt(ent,genericModelData[OBJ_COMP_MONITOR2_TOWER],"DUMMY01", + genericModelData[OBJ_COMP_MONITOR2],"DUMMY01",NULL); + + if (ent->s.skinnum) + { + SetSkin(ent,genericModelData[OBJ_COMP_MONITOR2_TOWER].dir, + genericModelData[OBJ_COMP_MONITOR2_TOWER].file, + genericModelData[OBJ_COMP_MONITOR2_TOWER].materialfile,"monitor2_d", 1); + } + + ent->pain = comp_monitor2_pain; +// ent->die = comp_monitor_die; + + // cache sound CLSFX_EXP_SMALL + entSoundsToCache[CLSFX_EXP_SMALL] = 1; + gi.effectindex("environ/normalsmoke"); + gi.soundindex("Ambient/Gen/Electric/buzz.wav"); +} + + +/*QUAKED misc_generic_crate_fish (1 .5 0) (-10 -8 -1) (11 8 8) INVULNERABLE NOPUSH x x x x FLUFF +A crate for holding fish. Great for the docks. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be hurt +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_crate_fish (edict_t *ent) +{ + VectorSet (ent->mins, -10, -7,-1); + VectorSet (ent->maxs, 10, 7, 8); + + SimpleModelInit2(ent,&genericModelData[OBJ_CRATE_FISH],NULL,NULL); +} + + +void desk_phone_effects (edict_t *ent) +{ + vec3_t up = { 0,0,1}; + qboolean bSmoking = fxRunner.hasEffect("environ/normalsmoke", ent); + + if (ent->pain_debounce_time <= level.time && bSmoking) // Turn off the smoke and sparks? + { + fxRunner.stopContinualEffect("environ/normalsmoke", ent); + ent->think = NULL; + ent->nextthink = 0; + ent->s.sound = 0; + + return; + } + +/* if ((rand() % 20) < 5) + { + FX_MakeSparks(ent->s.origin, up, 2); + } +*/ + ent->think = desk_phone_effects; + ent->nextthink = level.time + .2; +} + +void desk_phone_pain2 (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + FX_PhoneHit(ent->s.origin); + Obj_painflip (ent,other,damage*FLIPMULT_DESK_PHONE); +} + +void desk_phone_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t up; + + Obj_painflip (ent,other,damage*FLIPMULT_DESK_PHONE); + + FX_LittleExplosion(ent->s.origin, 10, 0); + fxRunner.execContinualEffect("environ/normalsmoke", ent); + AngleVectors(ent->s.angles,NULL,NULL,up); + + FX_MakeSparks(ent->s.origin, up, 2); + FX_PhoneHit(ent->s.origin); + + ent->think = desk_phone_effects; + ent->nextthink = level.time + .1; + + ent->pain_debounce_time = level.time + gi.flrand(.5,1.5); + + ent->pain = desk_phone_pain2; +} + +/*QUAKED misc_generic_desk_phone (1 .5 0) (-5 -7 -3) (5 6 3) INVULNERABLE NOPUSH x x x x FLUFF +A desk phone. +--------KEYS------------ +Skin : + 0 - clean (default) + 1 - dirty yucky phone +--------SPAWNFLAGS---------- +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- light flashes +- spins and sparks when shot +*/ +void SP_misc_generic_desk_phone (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -8, -10, -5); + VectorSet (ent->maxs, 8, 10, 5); + + switch (ent->s.skinnum) + { + case 1: + skinname = "phone2"; + break; + default: + skinname = "phone"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_DESK_PHONE],skinname,NULL); + + ent->pain = desk_phone_pain; + + + // cache sound CLSFX_EXP_SMALL, CLSFX_PHONE_HIT + entSoundsToCache[CLSFX_EXP_SMALL] = 1; + entSoundsToCache[CLSFX_PHONE_HIT] = 1; + gi.effectindex("environ/normalsmoke"); +} + +void fan_big_accelerate(edict_t *ent) +{ + vec3_t angVel = {0,0,0}; + + if (ent->count == 2) + { // accelerate + if ((ent->speed - ent->elasticity) < ent->volume) + { // close enough. stop accelerating. + ent->count = 1; + angVel[YAW] = ent->speed; + ent->elasticity = ent->speed; + ent->think = NULL; + } + else + { // keep accelerating. + ent->elasticity += ent->volume; + angVel[YAW] = ent->elasticity; + ent->nextthink = level.time + FRAMETIME; + } + FXA_SetRotate(ent, angVel, ent->ghoulInst); + } + else + { // decelerate + if ((ent->elasticity) < ent->volume) + { // close enough. stop decelerating. + ent->count = 0; + angVel[YAW] = 0; + ent->think = NULL; + ent->elasticity = 0; + } + else + { // keep decelerating. + ent->elasticity -= ent->volume; + angVel[YAW] = ent->elasticity; + ent->nextthink = level.time + FRAMETIME; + } + FXA_SetRotate(ent, angVel, ent->ghoulInst); + } +} + +void fan_big_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + vec3_t angVel = {0,0,0}; + + angVel[YAW] = ent->speed; + + if (ent->count) // Stop moving + { + //angVel[YAW] = 0; + //ent->count = 0; + ent->count = -2; + ent->think = fan_big_accelerate; + ent->nextthink = level.time + FRAMETIME; + FXA_SetRotate(ent, angVel, ent->ghoulInst); + } + else // Rotate, damn you! + { + //angVel[YAW] = ent->speed; + //ent->count = 1; + ent->count = 2; + ent->think = fan_big_accelerate; + ent->nextthink = level.time + FRAMETIME; + } + +} + +/*QUAKED misc_generic_fan_big (1 .5 0) (-64 -40 -63) (63 0 63) INVULNERABLE NOPUSH START_OFF x x x FLUFF +A really, really, big fan +------ KEYS ------ +speed - how fast fan spins (default 1.5) **must be less than 31!!** +volume - how fast fan accelerates or decelerates (default 0.05) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +AUTOMATE - spins +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- When targeted it will turn off or on. +*/ +void SP_misc_generic_fan_big (edict_t *ent) +{ + vec3_t angVel = {0,0,0}; + + VectorSet (ent->mins, -64, -40, -63); + VectorSet (ent->maxs, 63, 0, 63); + + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&genericModelData[OBJ_FAN_BIG],NULL,NULL); + ent->count = 0; + ent->elasticity = 0; + if (!ent->volume) + { + ent->volume = 0.05; + } + ent->use = fan_big_use; + + // set the fan to rotate + if (!(ent->spawnflags & FAN_BIG_START_OFF)) + { +// angVel[YAW] = 1.5f; + if (!ent->speed) + ent->speed = 1.5f; + + angVel[YAW] = ent->speed; + + ent->count = 1; + ent->elasticity = ent->speed; + FXA_SetRotate(ent, angVel, ent->ghoulInst); + } + if (ent->speed > 31) + { // must be capped due to FXA_SetRotate() + ent->speed = 31; + } +} + +/*QUAKED misc_generic_faucet (1 .5 0) (-7 -6 -6) (12 10 6) INVULNERABLE NOPUSH x x x x FLUFF +A sink faucet. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_faucet (edict_t *ent) +{ + VectorSet (ent->mins, -6, -5, -5); + VectorSet (ent->maxs, 11, 9, 5); + + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&genericModelData[OBJ_FAUCET],NULL,NULL); +} + +/******************************************************************************/ +// Fire Extinguisher Code +/******************************************************************************/ +void fire_extinguisher_dying (edict_t *self); +void fire_extinguisher_explode (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void fire_extinguisher_boom (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + +void extinguisher_use (edict_t *self, edict_t *other, edict_t *activator) +{ + vec3_t vel; + + self->health = 100 + (rand()%10); + VectorSubtract(activator->s.origin, self->s.origin, vel); + vel[2] *= .2;// downplay the vertical component + VectorNormalize(vel); + + self->s.sound = gi.soundindex("Impact/Exting/ExtingLeak.wav"); + self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + + self->think = fire_extinguisher_dying; + self->nextthink = level.time + .1; + self->pain = fire_extinguisher_explode; + self->die = fire_extinguisher_boom; +} + +void fire_extinguisher_remove (edict_t *self) +{ + ObjBecomeDebris(self, self, self, 1000, vec3_origin); + G_FreeEdict(self); +} + +void fire_extinguisher_explode (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + T_RadiusDamage (self, other, self->health, self, 60 + (self->health * .5), MOD_EXPLOSIVE); + ShakeCameras (self->s.origin, 60, 900, DEFAULT_JITTER_DELTA); + self->s.sound = 0; + // because the effect attaches to the wall in front of the entity, turn the entity + //backward prior to performing the effect + self->s.angles[YAW] += 180; + anglemod(self->s.angles[YAW]); +// fxRunner.exec("environ/extinguisherdeath", self); + self->think = fire_extinguisher_remove; + self->nextthink = level.time + .1; +} + +void fire_extinguisher_dying (edict_t *self) +{ + self->health--; + self->nextthink = level.time + .1; + + if(self->health < 1) + { + self->think = NULL; + self->nextthink = 0; + self->die = BecomeDebris; + self->takedamage = DAMAGE_YES; + self->pain = NULL; + self->health = 1; + self->s.sound = 0; + } +} + +void fire_extinguisher_boom (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + fire_extinguisher_explode (self, inflictor, 0, damage, point); +} + +void fire_extinguisher_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + SetSkin(self,genericModelData[OBJ_FIRE_EXTINGUISHER].dir, + genericModelData[OBJ_FIRE_EXTINGUISHER].file, + genericModelData[OBJ_FIRE_EXTINGUISHER].materialfile,"damaged", 0); + + self->health = 50; + + self->s.sound = gi.soundindex("Impact/Exting/ExtingLeak.wav"); + self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + + fxRunner.exec("environ/extinguisher1", self); + self->think = fire_extinguisher_dying; + self->nextthink = level.time + .1; + self->pain = fire_extinguisher_explode; + self->die = fire_extinguisher_boom; +} + +/*QUAKED misc_generic_fire_extinguisher (1 .5 0) (-4 -7 -13) (4 7 13) INVULNERABLE NOPUSH x x x x FLUFF +A wall mounted fire extinguisher. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- spews foam when shot +- explodes if shot again +- when 'used' spews foam +*/ +void SP_misc_generic_fire_extinguisher (edict_t *ent) +{ + VectorSet (ent->mins, -2, -6, -12); + VectorSet (ent->maxs, 4, 8, 12); + + ent->spawnflags |= SF_NOPUSH; + + ent->die = fire_extinguisher_die; + ent->use = extinguisher_use; // Use for trigger_uses + ent->plUse = extinguisher_use; // Use for when player pushes 'use' key + + SimpleModelInit2(ent,&genericModelData[OBJ_FIRE_EXTINGUISHER],NULL,NULL); + + SetSkin(ent,genericModelData[OBJ_FIRE_EXTINGUISHER].dir, + genericModelData[OBJ_FIRE_EXTINGUISHER].file, + genericModelData[OBJ_FIRE_EXTINGUISHER].materialfile,"exting", 0); + + gi.soundindex("Impact/Exting/ExtingLeak.wav");// precache sound + gi.effectindex("environ/extinguisher1"); +// gi.effectindex("environ/extinguisherdeath"); +// SetForRespawn(ent, SP_misc_generic_fire_extinguisher, 30.0);// Keep - might be used in death match +} + + +/******************************************************************************/ +// Fire Hydrant Code +/******************************************************************************/ + +void hydrant_pulse (edict_t *self) +{ + self->nextthink = level.time + (gi.irand(1,26) * .1) + .5; + +} + +void hydrant_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + edict_t *hydrant,*water; + vec3_t debrisNorm; + vec3_t up; + + + VectorClear(debrisNorm); + + FX_ThrowDebris(self->s.origin,debrisNorm, 5,DEBRIS_SM, 0, 0,0,0, 0); + + AngleVectors(self->s.angles, 0, 0, up); + + fxRunner.exec("environ/toiletspout", self->s.origin); + + self->think = G_FreeEdict; + self->nextthink = level.time + 1; + + + return; + + + + + water = G_Spawn(); + VectorCopy(self->s.origin,water->s.origin); + water->solid = SOLID_NOT; + water->takedamage = DAMAGE_NO; + water->health = 1; + water->think = hydrant_pulse; + water->nextthink = level.time + gi.flrand (.3F, 3.0F); + gi.linkentity (water); + + water->s.sound = gi.soundindex("Ambient/Gen/WtrFX/SprayBig.wav"); + water->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + + FX_MakeDecalBelow(self->s.origin, FXDECAL_PIPELEFT, 0); // pipe + + // Create a hydrant to throw + hydrant = G_Spawn(); + hydrant->movetype = MOVETYPE_DAN; + hydrant->solid = SOLID_BBOX; + hydrant->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID; + VectorSet (hydrant->mins, -8, -8, -8); + VectorSet (hydrant->maxs, 8, 8, 8); + VectorSet (hydrant->velocity, gi.irand(-51,50), gi.irand(-51,50), gi.irand(450,650)); + + // So it doesn't fall back on top of the water spout + if ((hydrant->velocity[0] > -5) && (hydrant->velocity[0] < 5)) + hydrant->velocity[0] = gi.irand(10,50); + + // So it doesn't fall back on top of the water spout + if ((hydrant->velocity[1] > -5) && (hydrant->velocity[1] < 5)) + hydrant->velocity[1] = gi.irand(10,50); + + VectorSet (hydrant->avelocity, gi.irand(-51,50), gi.irand(-51,50), gi.irand(-51,50)); + + game_ghoul.SetSimpleGhoulModel (hydrant,"objects/generic/fire_hydrant","fire_hydrant"); + + hydrant->takedamage = DAMAGE_YES; + hydrant->surfaceType = SURF_METAL; + hydrant->health = 500; + hydrant->die = BecomeDebris; + VectorCopy(self->s.origin, hydrant->s.origin); + gi.linkentity (hydrant); + + G_FreeEdict (self); // Get rid of the old hydrant + +} + +/*QUAKED misc_generic_fire_hydrant (1 .5 0) (-8 -8 -10) (8 8 14) INVULNERABLE NOPUSH x x x x FLUFF +A red fire hydrant. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- flies into air and a jet of water shoots out of ground when it dies +*/ +void SP_misc_generic_fire_hydrant (edict_t *ent) +{ + VectorSet (ent->mins, -8, -8, -10); + VectorSet (ent->maxs, 8, 8, 14); + + ent->spawnflags |= SF_NOPUSH; + + if (ent->spawnflags & SF_INVULNERABLE) + { + ent->takedamage = DAMAGE_NO; + } + else + { + ent->takedamage = DAMAGE_YES; + ent->die = hydrant_die; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_FIRE_HYDRANT],NULL,NULL); + + gi.soundindex("Ambient/Gen/WtrFX/SprayBig.wav"); // precache sound +} + +void fish_think(edict_t *self) +{ + // fish swims between self->pos1 and self->pos2 + vec3_t vTemp = {0,0,0}, fwd; + + if (self->attenuation) + { + VectorSubtract(self->s.origin, self->pos2, vTemp); + } + else + { + VectorSubtract(self->s.origin, self->pos1, vTemp); + } + // are we near our next patrol point? + if (100 > VectorLengthSquared(vTemp)) + { + self->attenuation = !self->attenuation; + VectorNegate(self->velocity, self->velocity); + AngleVectors(self->s.angles, fwd, NULL, NULL); + VectorNegate(fwd, fwd); + vectoangles(fwd, self->s.angles); + } + gi.linkentity(self); + self->think = fish_think; + self->nextthink = level.time + 0.1f; +} + +void fish_sink(edict_t *self) +{ + // lower his patrol route towards the bottom of the tank + if ( (self->s.origin[2] + self->mins[2]) > (self->volume+3)) + { + self->s.origin[2] -= 1; + } + + + // need some sort of check for tank emptiness + + + gi.linkentity(self); + self->think = fish_sink; + self->nextthink = level.time + 0.1f; +} + +void fish_die(edict_t *self, edict_t *other, edict_t *activator) +{ + // actually a "use" function...gets called when the fishy's tank empties. + + // speed up the swimming (fishy is getting anxious) + VectorScale(self->velocity, 2, self->velocity); + self->think = fish_sink; + self->nextthink = level.time + 0.1f; +} + +/*QUAKED misc_generic_fish (1 .5 0) (-18 -6 -8) (18 6 8) INVULNERABLE NOPUSH x x x x FLUFF +A large aquarium fish. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ KEYS ------ +Skin : +0 - white with red spots (default) +1 - gold +Angles : +- holds the second point in patrol route. If not set, fish don't move. +Volume : +- height of floor of tank +------ SPECIALS ------ +Patrols between its origin and a second point stored in angles. +*/ +void SP_misc_generic_fish (edict_t *ent) +{ + char *skinname; + vec3_t vel; + + VectorSet (ent->mins, -17, -6, -7); + VectorSet (ent->maxs, 17, 6, 7); + + VectorCopy(ent->s.origin, ent->pos1); + VectorCopy(ent->s.angles, ent->pos2); + + if (ent->pos2[0] || ent->pos2[1] || ent->pos2[2]) + { + // use ent->attenuation to mark which patrol point we're aiming for (0 == origin) + VectorSubtract(ent->pos2, ent->pos1, vel); + VectorNormalize(vel); + vectoangles(vel, ent->s.angles); + VectorScale(vel, 20, ent->velocity); + ent->attenuation = 1; + ent->think = fish_think; + ent->use = fish_die; + ent->nextthink = level.time + 0.1f; + } + + switch (ent->s.skinnum) + { + case 1: + skinname = "yellow"; + break; + default: + skinname = "white"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_FISH],skinname,NULL); + SimpleModelSetSequence2(ent->ghoulInst,genericModelData[OBJ_FISH].file,SMSEQ_LOOP); + + ent->flags |= FL_NO_KNOCKBACK; + ent->movetype = MOVETYPE_FLY; // Can be pushed around +} + +/*QUAKED misc_generic_fish_dead (1 .5 0) (-18 -4 -8) (18 3 8) INVULNERABLE NOPUSH x x x x FLUFF +A big dead fish laying on it's side. +------ KEYS ------ +Skin : +0 - white with red spots (default) +1 - gold +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_fish_dead (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -17, -6, -1); + VectorSet (ent->maxs, 17, 6, 7); + + switch (ent->s.skinnum) + { + case 1: + skinname = "yellow"; + break; + default: + skinname = "white"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_FISH_DEAD],skinname,NULL); + + ent->s.angles[ROLL]+= 90; + +} + + +void flag_pole_sequence (edict_t *ent) +{ + ggObjC *simpObj; + GhoulID simpSeq; + ggOinstC *myInstance; + + if (!ent->ghoulInst) + { + return; + } + + simpObj = game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + if (!simpObj) + { + return; + } + + //changed this to false, can't cache new seqs in after instances are created --ss + simpSeq = simpObj->FindSequence(genericModelData[OBJ_FLAG_POLE].file); + + if (!simpSeq) + { + return; + } + + myInstance = simpObj->FindOInst(ent->ghoulInst); + if (!myInstance) + { + return; + } + + // Play sequence + myInstance->PlaySequence(simpSeq, level.time); + +} + + + +/*QUAKED misc_generic_flag_pole (1 .5 0) (-23 -66 -418) (17 39 37) INVULNERABLE NOPUSH x x x x FLUFF +A flag on a tall pole. +------ KEYS ------ +Skin : +0 - ??? (default) +1 - USA +2 - ??? +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_flag_pole (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -4, -65, -417); + VectorSet (ent->maxs, 4, 38, 36); + + ent->spawnflags |= SF_NOPUSH; + + switch (ent->s.skinnum) + { + case 1: + skinname = "flag_pole2"; + break; + case 2: + skinname = "flag_pole3"; + break; + default: + skinname = "flag_pole"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_FLAG_POLE],skinname,NULL); + + ent->ghoulInst->Pause(level.time); + + ent->think = flag_pole_sequence; + ent->nextthink = level.time + ((rand() % 5) * .1); + +} + +void forklift_use(edict_t *self, edict_t *other, edict_t *activator) +{ + self->solid = SOLID_BBOX; + // he should be visible + if (self->ghoulInst) + { + self->ghoulInst->SetOnOff(true, level.time); + } +} + +/*QUAKED misc_generic_forklift (1 .5 0) (-74 -55 -54) (92 5 53) INVULNERABLE NOPUSH TRIGGER_SPAWN x x x FLUFF +A forklift. +------ KEYS ------ +Skin - +0 - blue/grey +1 - yellow +2 - green +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +TRIGGER_SPAWN - use it and it shows up +FLUFF - won't show if gl_pictip is set +*/ + +void SP_misc_generic_forklift (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -73, -54, -53); + VectorSet (ent->maxs, 91, 4, 52); + + switch (ent->s.skinnum) + { + case 1: + skinname = "forklift2"; + break; + case 2: + skinname = "forklift3"; + break; + default: + skinname = "forklift"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_FORKLIFT],skinname,NULL); + + ent->ghoulInst->Pause(level.time); + if (ent->spawnflags & FORKLIFT_TRIGGER_SPAWN) + { + ent->solid = SOLID_NOT; + // he shouldn't even be visible + if (ent->ghoulInst) + { + ent->ghoulInst->SetOnOff(false, level.time); + } + ent->use = forklift_use; + } +} + + +void garbage_bag_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + // create a cloud of papers when this object is hit + FX_PaperCloud(ent->s.origin, 3); + Obj_painroll (ent,other,damage,0); +} + +/*QUAKED misc_generic_garbage_bag (1 .5 0) (-10 -9 -9) (10 10 12) INVULNERABLE NOPUSH x x x x FLUFF +A black plastic bag of garbage. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- rolls around when shot +- spews paper when shot +*/ +// POSSIBLY : have rats be spawned when this dies +void SP_misc_generic_garbage_bag (edict_t *ent) +{ + VectorSet (ent->mins, -9, -10, -9); + VectorSet (ent->maxs, 9, 10, 10); + + ent->pain = garbage_bag_pain; + + ent->die = SpecialBecomeDebris; + SimpleModelInit2(ent,&genericModelData[OBJ_GARBAGE_BAG],NULL,NULL); + + // cache debris CLGHL_PAPER, CLGHL_CAN + entDebrisToCache[CLGHL_PAPER] = DEBRIS_YES; + entDebrisToCache[CLGHL_CAN] = DEBRIS_YES; +} + + + + + +void AnglesFromDir(vec3_t direction, vec3_t angles); +void auto_gun_target (edict_t *self); +// this one's for guns with a tripod base +void auto_gun_target2(edict_t *self); + +qboolean TargetWithinArc(vec3_t targetPos, vec3_t selfPos, float origAngle, float arc) +{ + vec3_t toTarget, baseVector; + float angleBetween; + + VectorSubtract(targetPos, selfPos, toTarget); + toTarget[2] = 0; + VectorNormalize(toTarget); + VectorSet(baseVector, cos(DEGTORAD * origAngle), sin(DEGTORAD * origAngle), 0); + angleBetween = fabs(acos(DotProduct(toTarget, baseVector))) * RADTODEG; +// Com_Printf("Angle between is %f\n", angleBetween); + if (angleBetween > arc){ return false;} + return true; +} + +void auto_gun_target (edict_t *self) +{ + vec3_t targetDir; + edict_t *target = NULL; + trace_t tr; + + self->nextthink = level.time + FRAMETIME; + + CRadiusContent rad(self->s.origin, self->volume); + + for(int i = 0; i < rad.getNumFound(); i++) + { + target = rad.foundEdict(i); + + if(target->client && !(target->flags & FL_NOTARGET)) + // right now, we're only targeting the player. should make this switchable by designers + { + // trace to see if I can see player. + gi.trace (self->s.origin, NULL, NULL, target->s.origin, self, MASK_SHOT| MASK_WATER, &tr); + if ((tr.ent->client) && (tr.ent->health > 0)) + { // can see the player + + // if I couldn't see the player before, play my "I just woke up" sound + if (NULL == self->enemy) + { + gi.sound (self, CHAN_VOICE, gi.soundindex("Enemy/MGun/wake.wav"), .6, ATTN_NORM, 0); + } + self->enemy = target; + self->nextthink = level.time + .1; + self->think = auto_gun_target; + } + else + { + self->enemy = NULL; + return; + } + } + } + if (NULL == self->enemy) + { + return; + } + if (self->enemy->flags & FL_NOTARGET) + { + return; + } + VectorSubtract (self->enemy->s.origin, self->s.origin, targetDir); + + // is target within range? + if (VectorLengthSquared(targetDir) > (self->volume*self->volume)) + { // not in range + self->avelocity[1] = 0; + // perhaps return to original position? + if (self->s.sound == gi.soundindex("Enemy/MGun/trnslow.wav")) + { + self->s.sound = gi.soundindex("Enemy/MGun/trnstop.wav"); + self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + self->nextthink = level.time + .1; + return; + } + // guns now use ghoul rotation stuff + auto_gun_target2(self); + return; +} + +void auto_gun_target2(edict_t *self) +{ + IGhoulInst* gunInst = SimpleModelGetBolt(self, 1), + *baseInst = NULL; + GhoulID gunBolt; + boltonOrientation_c boltonInfo; + vec3_t fwd, vToTarget, barrel1Pos, barrel2Pos, vPos; + trace_t tr; + boltonOrientation_c::retCode_e ret = boltonOrientation_c::retCode_e::ret_TRUE; + + self->nextthink = level.time + FRAMETIME; + + if (gunInst && gunInst->GetGhoulObject()) + { + gunBolt = gunInst->GetGhoulObject()->FindPart("DUMMY01"); + } + if (!gunBolt || !self->enemy) + { + return; + } + + // turn the turret to face the player + // + // the tripod version can pitch as well as yaw. with the hanging version, the entity + //(arm attached to ceiling) yaws while the gun pitchs + if (!gunInst->GetParent() || !gunInst->GetParent()->GetGhoulObject()) + { + return; + } + boltonInfo.root = self; + if (self->spawnflags & AUTOGUN_NO_TRIPOD) + { + // no tripod, yaw the entity + boltonInfo.boltonInst = self->ghoulInst; + boltonInfo.parentInst = NULL; + VectorCopy(self->enemy->s.origin, boltonInfo.vTarget); + boltonInfo.fMinPitch = 0; + boltonInfo.fMaxPitch = 0; + boltonInfo.fMinYaw = -self->elasticity; + boltonInfo.fMaxYaw = self->elasticity; + boltonInfo.fMaxTurnSpeed = self->speed; + boltonInfo.bUsePitch = false; + boltonInfo.bUseYaw = true; + boltonInfo.bToRoot = true; + ret = boltonInfo.OrientEnt(); + // pitch the gun + if (ret == boltonOrientation_c::retCode_e::ret_TRUE) + { + boltonInfo.boltonInst = gunInst; + boltonInfo.boltonID = gunBolt; + boltonInfo.parentInst = gunInst->GetParent(); + boltonInfo.parentID = gunInst->GetParent()->GetGhoulObject()->FindPart("DUMMY02"); + VectorCopy(self->enemy->s.origin, boltonInfo.vTarget); + boltonInfo.fMinPitch = -self->decel; + boltonInfo.fMaxPitch = self->accel; + boltonInfo.fMinYaw = 0; + boltonInfo.fMaxYaw = 0; + boltonInfo.fMaxTurnSpeed = self->speed; + boltonInfo.bUsePitch = true; + boltonInfo.bUseYaw = false; + boltonInfo.bToRoot = true; + ret = boltonInfo.OrientBolton(); + } + } + else + { + // we've got a tripod, so yaw the ent->bolt1 (a null) + baseInst = SimpleModelGetBolt(self, 1); + if (!baseInst || !baseInst->GetGhoulObject()) + { + return; + } + boltonInfo.boltonInst = baseInst; + boltonInfo.boltonID = baseInst->GetGhoulObject()->FindPart("DUMMY01"); + boltonInfo.parentInst = self->ghoulInst; + VectorCopy(self->enemy->s.origin, boltonInfo.vTarget); + boltonInfo.fMinPitch = 0; + boltonInfo.fMaxPitch = 0; + boltonInfo.fMinYaw = -self->elasticity; + boltonInfo.fMaxYaw = self->elasticity; + boltonInfo.fMaxTurnSpeed = self->speed; + boltonInfo.bUsePitch = false; + boltonInfo.bUseYaw = true; + boltonInfo.bToRoot = true; + ret = boltonInfo.OrientBolton(); + // pitch the gun + gunInst = SimpleModelGetBolt(self, 2); + if (NULL == gunInst) + { + return; + } + if (ret == boltonOrientation_c::retCode_e::ret_TRUE) + { + if (gunInst->GetGhoulObject()) + { + gunBolt = gunInst->GetGhoulObject()->FindPart("DUMMY01"); + } + else + { + return; + } + boltonInfo.parentInst = boltonInfo.boltonInst; + boltonInfo.parentID = boltonInfo.boltonID; + boltonInfo.boltonInst = gunInst; + boltonInfo.boltonID = gunBolt; + VectorCopy(self->enemy->s.origin, boltonInfo.vTarget); + boltonInfo.fMinPitch = -self->decel; + boltonInfo.fMaxPitch = self->accel; + boltonInfo.fMinYaw = 0; + boltonInfo.fMaxYaw = 0; + boltonInfo.fMaxTurnSpeed = self->speed; + boltonInfo.bUsePitch = true; + boltonInfo.bUseYaw = false; + boltonInfo.bToRoot = true; + ret = boltonInfo.OrientBolton(); + } + } + + // if we're now pointing at our target, uh, SHOOT IT!!! + VectorSubtract(self->enemy->s.origin, self->s.origin, vToTarget); + GetGhoulPosDir(self->s.origin, self->s.angles, gunInst, gunBolt, "DUMMY01", NULL, NULL, NULL, fwd); + VectorNormalize(vToTarget); // ouch + if (DotProduct(vToTarget, fwd) > 0.9f) + { + bool bBurstFire = false; + // pointing at our target + if (self->s.sound == gi.soundindex("Enemy/MGun/trnslow.wav")) + { + self->s.sound = 0; + gi.sound (self, CHAN_VOICE, gi.soundindex("Enemy/MGun/trnstop.wav"), .6, ATTN_NORM, 0); + } + // fire in tri-burst mode, cuz constant fire is too deadly + baseObjInfo_c *pObjInfo = self->objInfo; + objFlipInfo_c *pFlipInfo = NULL; + // unbelievable hack, using the entity's objFlipInfo_c struct like this... + // + // radius ------------- number of shots in a burst (3) + // startTime ---------- number of seconds between bursts (.5) + // ground ------------- number of bursts between reloads (5) + // initRadiusAng ------ reload time (in seconds) (3) + // + if (pObjInfo && (pFlipInfo = (objFlipInfo_c*)pObjInfo->GetInfo(OIT_FLIP))) + { + if ( (level.time > pFlipInfo->initRadiusAng) && + (level.time > pFlipInfo->startTime) ) + { + // fire a burst + if (pFlipInfo->radius < 3) // 3-shot burst + { + bBurstFire = true; + pFlipInfo->radius++; + } + else + { + // ended our burst + pFlipInfo->radius = 0; + if (pFlipInfo->ground < 5) // 5 bursts before reload + { + pFlipInfo->ground++; + pFlipInfo->startTime = level.time + .5; // .5 seconds between bursts + } + else + { + // begin reload + pFlipInfo->ground = 0; + + // play a "reload" sound here? + + // make sure we can fire our next burst immediately after reload + pFlipInfo->startTime = level.time; + pFlipInfo->initRadiusAng = level.time + 3.0; // 3-second reload time + } + } + } + } + if (!bBurstFire) + { + return; + } + // try tracing to the player's head first (20 units above player's origin) + VectorSet(vPos, self->enemy->s.origin[0], self->enemy->s.origin[1], self->enemy->s.origin[2] + 20); + gi.trace (self->s.origin, NULL, NULL, vPos, self, MASK_SHOT| MASK_WATER, &tr); + if ( !(tr.ent && tr.ent->client) ) + { + // couldn't trace to the player's head, try his origin + gi.trace (self->s.origin, NULL, NULL, self->enemy->s.origin, self, MASK_SHOT| MASK_WATER, &tr); + } + if (tr.ent && tr.ent->client) + { + self->s.sound = 0; + // gotta call this once for each barrel. don't send the gunInst cuz that would generate + //muzzle flashes, which we're doing later on via fxRunner + GetGhoulPosDir(self->s.origin, self->s.angles, gunInst, 0, "_LEFTFLASH", barrel1Pos, NULL, NULL, NULL); + GetGhoulPosDir(self->s.origin, self->s.angles, gunInst, 0, "_FLASHRIGHT", barrel2Pos, NULL, NULL, NULL); + weapons.attack(ATK_AUTOGUN, self, barrel1Pos, fwd); + weapons.attack(ATK_AUTOGUN, self, barrel2Pos, fwd); + + assert(gunInst->GetGhoulObject()); + GhoulID leftBarrel = gunInst->GetGhoulObject()->FindPart("_LEFTFLASH"); + GhoulID rightBarrel = gunInst->GetGhoulObject()->FindPart("_FLASHRIGHT"); + + if(leftBarrel) + { + fxRunner.execWithInst("weapons/othermz/autogun", self, gunInst, leftBarrel, MULTICAST_PHS, 1); + } + if(rightBarrel) + { + fxRunner.execWithInst("weapons/othermz/autogun", self, gunInst, rightBarrel, MULTICAST_PHS, 1); + } + + if (true || 1 == pFlipInfo->radius) + { // this is the first shot of a burst, so play the firing sound + gi.sound(self, CHAN_VOICE, gi.soundindex("Weapons/Autoshot/fire.wav"), .9, ATTN_NORM, 0); + } + } + else + { + self->s.sound = 0; + self->nextthink = level.time + .1; + } + } + else + { + // since we're not shooting, if we turned during this frame play the turning sound + if (ret == boltonOrientation_c::retCode_e::ret_FALSE) + { + self->s.sound = gi.soundindex("Enemy/MGun/trnslow.wav"); + self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + } +} + +void auto_gun_arc (edict_t *self) +{ + vec3_t arcorg; + vec3_t dir; + float facingAngle; + + + facingAngle = NormalizeAngle(self->s.angles[1] + self->s.angle_diff); + + VectorCopy(self->s.origin, arcorg); + arcorg[2] += 6; + + arcorg[1] += gi.irand(-7,6); + + VectorSet(dir, cos(facingAngle*DEGTORAD), sin(facingAngle*DEGTORAD), 0); + FX_MakeElectricArc(arcorg, 40, dir); + self->nextthink = level.time + .1; + self->health--; + if (self->health <= 0) + { + self->nextthink = -1; + } +} + +void auto_gun_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + // kill any existing sound for this entity + self->s.sound = 0; + self->avelocity[1] = 0; + + fxRunner.exec("weapons/world/autogundeath", self); + self->health = gi.irand(5,20); + self->think = auto_gun_arc; + self->nextthink = level.time + .1; + self->die = NULL; + self->takedamage = DAMAGE_NO; + // Biessman wants debris, eh? I'LL GIVE HIM DEBRIS!!! + Obj_explode(self,&self->s.origin,1,1); + ObjBecomeDebris(self,inflictor,attacker,damage,point); +} + +void big_gun_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + // kill any existing sound for this entity + self->s.sound = 0; + self->avelocity[1] = 0; + + fxRunner.exec("weapons/world/autogundeath", self); + self->die = NULL; + self->takedamage = DAMAGE_NO; + // Biessman wants debris, eh? I'LL GIVE HIM DEBRIS!!! + Obj_explode(self,&self->s.origin,1,1); + ObjBecomeDebris(self,inflictor,attacker,damage,point); +} + +void auto_gun_spark(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ +// vec3_t vSparksPos, vSparksNormal; + +// VectorSubtract(self, other, vSparksNormal); +// FX_MakeSparks(*(vec3_t*)&vSparksPos, *(vec3_t*)&vNormal, gi.irand(0,2)); +} + +void spawn_gun_auto(edict_t* ent) +{ + char *skinname; + ggBinstC *bInstC = NULL; + IGhoulInst *boltInst = NULL; + boltInstInfo_c *newBoltInfo = NULL; + float fTemp = 0; + + // Backwards about invincibility + if (ent->spawnflags & SF_INVULNERABLE) + { + ent->spawnflags &= ~SF_INVULNERABLE; + } + else + { + ent->spawnflags |= SF_INVULNERABLE; + } + + // Backwards about pushability + if (ent->spawnflags & SF_NOPUSH) + { + ent->spawnflags &= ~SF_NOPUSH; + } + else + { + ent->spawnflags |= SF_NOPUSH; + } + + switch (ent->s.skinnum) + { + case 1: + skinname = "gun2"; + break; + default: + skinname = "gun"; + break; + } + + ent->s.effects |= EF_NO_BULLET; + ent->flags |= FL_NO_KNOCKBACK; + ent->pain = auto_gun_spark; + // scale the health based on difficulty level + ent->health = 100 + (game.playerSkills.getEnemyValue()); + + if (!ent->speed) + { + ent->speed = 45; + } + // convert from deg/s to radians/frame + ent->speed *= (0.1*DEGTORAD); + if (!ent->volume) + { + ent->volume = 400; + } + if (!ent->wait) + { + ent->wait = 30; + } + ent->die = auto_gun_die; + if (ent->spawnflags & AUTOGUN_ACTIVE) + { + ent->takedamage = DAMAGE_YES; + ent->think = auto_gun_target; + ent->nextthink = level.time + (ent->wait * .1); + } + + ent->elasticity = M_PI; // allow 360 degrees of yaw + if (ent->spawnflags & AUTOGUN_ARC_LIMITED) + { +/* fTemp = anglemod(ent->s.angles[YAW] + st.maxyaw); + if (fTemp > 180) + { + fTemp = -(360 - fTemp); + } + if (fTemp < -180) + { + fTemp = -(-360 - fTemp); + } + ent->elasticity = fTemp * DEGTORAD; // max yaw + fTemp = anglemod(ent->s.angles[YAW] - st.maxyaw); + if (fTemp > 180) + { + fTemp = -(360 - fTemp); + } + if (fTemp < -180) + { + fTemp = -(-360 - fTemp); + } + ent->bouyancy = fTemp * DEGTORAD; // min yaw +*/ + ent->accel = st.maxpitch * DEGTORAD; // above + ent->decel = st.minpitch * DEGTORAD; // below + } + else + { + ent->accel = 0; // allow no pitch above horizontal + ent->decel = 0; // allow no pitch below horizontal + } + + if ( (ent->spawnflags & AUTOGUN_NO_TRIPOD) && !(ent->spawnflags & AUTOGUN_NO_HANGY_THINGY) ) + { + // no tripod, connect the gun to the hanging arm bracket thingy. + SimpleModelInit2(ent,&genericModelData[OBJ_GUN_AUTO_ARM],skinname,NULL); + ent->gravity = 0; + // we want the hanging arm thingy + SimpleModelAddBolt(ent, genericModelData[OBJ_GUN_AUTO_ARM], "DUMMY02", + genericModelData[OBJ_GUN_AUTO], "DUMMY02", skinname); + } + else if (ent->spawnflags & AUTOGUN_NO_TRIPOD) + { + // there is no tripod, but we're going to bolt a + //null to the tripod and then bolt the gun to the null and then turn off the tripod. + //the null will yaw and the gun will pitch. + SimpleModelInit2(ent,&genericModelData[OBJ_GUN_AUTO_BASE],skinname,NULL); + bInstC = SimpleModelAddBolt(ent, genericModelData[OBJ_GUN_AUTO_BASE], "DUMMY01", + genericModelData[OBJ_NULL], "DUMMY01", skinname); + + if (bInstC && (boltInst = bInstC->GetInstPtr())) + { + // the NULL actually has some geometry in it (ghoul made me do it :< ) so turn it off + SimpleModelTurnOnOff(boltInst, false); + ComplexModelAddBolt(bInstC, genericModelData[OBJ_NULL], + "DUMMY01", genericModelData[OBJ_GUN_AUTO], "DUMMY01", skinname); + } + SimpleModelTurnOnOff(ent->ghoulInst, false); + // turn off the "no tripod" flag so it'll fire properly. + // hacky? just a bit. + ent->spawnflags &= ~AUTOGUN_NO_TRIPOD; + } + else + { + // there is a tripod, don't bolt on the arm thingy. instead, we're going to bolt a + //null to the tripod and then bolt the gun to the null. + //the null will yaw and the gun will pitch. + SimpleModelInit2(ent,&genericModelData[OBJ_GUN_AUTO_BASE],skinname,NULL); + bInstC = SimpleModelAddBolt(ent, genericModelData[OBJ_GUN_AUTO_BASE], "DUMMY01", + genericModelData[OBJ_NULL], "DUMMY01", skinname); + + // ugh. ughity ugh ugh. + if (bInstC && (boltInst = bInstC->GetInstPtr())) + { + // the NULL actually has some geometry in it (ghoul made me do it :< ) so turn it off + SimpleModelTurnOnOff(boltInst, false); + ComplexModelAddBolt(bInstC, genericModelData[OBJ_NULL], + "DUMMY01", genericModelData[OBJ_GUN_AUTO], "DUMMY01", skinname); + } + } + + gi.soundindex("Enemy/MGun/trnslow.wav"); // precache sound + gi.soundindex("Enemy/MGun/trnstop.wav"); // precache sound + gi.soundindex("Weapons/Autoshot/fire.wav"); // precache sound + gi.soundindex("Enemy/MGun/wake.wav"); // precache sound + + // precache muzzleflash effect and death effect + gi.effectindex("weapons/othermz/autogun"); + gi.effectindex("weapons/world/autogundeath"); + + // if anyone gets caught near this thing when it explodes + gi.effectindex("environ/onfireburst"); +} + + + +void auto_gun_test_think(edict_t *self) +{ + vec3_t fwd, barrel1Pos; + + AngleVectors(self->s.angles, fwd, NULL, NULL); + + VectorMA(self->s.origin, 27, fwd, barrel1Pos); + + fxRunner.setDir(fwd); + fxRunner.exec("weapons/othermz/autogun", barrel1Pos); + + self->nextthink = level.time + 2.5; +} + + + +// This is Pat's test autogun. +void spawn_test_gun_auto(edict_t* ent) +{ + char *skinname; + ggBinstC *bInstC = NULL; + IGhoulInst *boltInst = NULL; + boltInstInfo_c *newBoltInfo = NULL; + float fTemp = 0; + + skinname = "gun"; + ent->flags |= FL_NO_KNOCKBACK; + ent->pain = auto_gun_spark; + ent->health = 10000; + // convert from deg/s to radians/frame + ent->die = auto_gun_die; + ent->takedamage = DAMAGE_NO; + ent->think = auto_gun_test_think; + ent->nextthink = level.time + 2.5; + + ent->touch = NULL; + + // there is a tripod, don't bolt on the arm thingy. instead, we're going to bolt a + //null to the tripod and then bolt the gun to the null. + //the null will yaw and the gun will pitch. + SimpleModelInit2(ent,&genericModelData[OBJ_GUN_AUTO_BASE],skinname,NULL); + bInstC = SimpleModelAddBolt(ent, genericModelData[OBJ_GUN_AUTO_BASE], "DUMMY01", + genericModelData[OBJ_NULL], "DUMMY01", skinname); + + // ugh. ughity ugh ugh. + if (bInstC && (boltInst = bInstC->GetInstPtr())) + { + // the NULL actually has some geometry in it (ghoul made me do it :< ) so turn it off + SimpleModelTurnOnOff(boltInst, false); + ComplexModelAddBolt(bInstC, genericModelData[OBJ_NULL], + "DUMMY01", genericModelData[OBJ_GUN_AUTO], "DUMMY01", skinname); + } + + // precache muzzleflash effect + gi.effectindex("weapons/othermz/autogun"); +} + + +/*QUAKED misc_generic_gun_auto (1 .5 0) (-28 -21 -34) (21 21 19) VULNERABLE PUSH ACTIVE ARC_LIMITED x x FLUFF +Tri-pod mounted twin machine gun. +------ SPAWNFLAGS ------ +VULNERABLE - can be hurt +PUSH - can be moved +ACTIVE - allow these guns to track and shoot. +ARC_LIMITED - won't rotate outside of given arc +FLUFF - won't show if gl_pictip is set +--------KEYS------------ +Skin - +0 - green (Bosnia) +1 - silver (Siberia) +Speed - angular velocity in degrees per second the gun will track. Default 45. +Volume - the distance the guns will track. Default 400. +Wait - time interval in tenths of seconds that a gun in sleep mode will wait Default 30 +Health - designers can't edit health +maxyaw - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets on either side of its original facing (in degrees, to the left or right) +minpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets below its original facing (in degrees, default is 0) +maxpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets above its original facing (in degrees, default is 0) +------ SPECIALS ------ +- will track and shoot the player +*/ +void SP_misc_generic_gun_auto (edict_t *ent) +{ + ent->spawnflags |= AUTOGUN_NO_HANGY_THINGY; + + VectorSet (ent->mins, -28, -21, -34); + VectorSet (ent->maxs, 21, 21, 19); + + spawn_gun_auto(ent); +} + +/*QUAKED misc_generic_gun_auto2 (1 .5 0) (-28 -18 -8) (21 21 18) VULNERABLE PUSH ACTIVE ARC_LIMITED x x FLUFF +Twin machine gun with a hanging arm thingy, to be attached to the ceiling. +------ SPAWNFLAGS ------ +VULNERABLE - can be hurt +PUSH - can be moved +ACTIVE - allow these guns to track and shoot. +ARC_LIMITED - won't rotate outside of given arc +FLUFF - won't show if gl_pictip is set +--------KEYS------------ +Skin - +0 - green (Bosnia) +1 - silver (Siberia) +Speed - angular velocity in degrees per second the gun will track. Default 45. +Volume - the distance the guns will track. Default 400. +Wait - time interval in tenths of seconds that a gun in sleep mode will wait Default 30 +Health - designers can't edit health +maxyaw - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets on either side of its original facing (in degrees, to the left or right) +minpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets below its original facing (in degrees, default is 0) +maxpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets above its original facing (in degrees, default is 0) +------ SPECIALS ------ +- will track and shoot the player +*/ +void SP_misc_generic_gun_auto2 (edict_t *ent) +{ + ent->spawnflags |= AUTOGUN_NO_TRIPOD; + + VectorSet (ent->mins, -27, -18, -8); + VectorSet (ent->maxs, 21, 21, 18); + spawn_gun_auto(ent); +} + +/*QUAKED misc_generic_gun_auto3 (1 .5 0) (-21 -18 -8) (21 21 8) VULNERABLE PUSH ACTIVE ARC_LIMITED x x FLUFF +Twin machine gun with no tripod and no hanging arm thingy. Presumably this would just sit on a brush. +------ SPAWNFLAGS ------ +VULNERABLE - can be hurt +PUSH - can be moved +ACTIVE - allow these guns to track and shoot. +ARC_LIMITED - won't rotate outside of given arc +FLUFF - won't show if gl_pictip is set +--------KEYS------------ +Skin - +0 - green (Bosnia) +1 - silver (Siberia) +Speed - angular velocity in degrees per second the gun will track. Default 45. +Volume - the distance the guns will track. Default 400. +Wait - time interval in tenths of seconds that a gun in sleep mode will wait Default 30 +Health - designers can't edit health +maxyaw - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets on either side of its original facing (in degrees, to the left or right) +minpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets below its original facing (in degrees, default is 0) +maxpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets above its original facing (in degrees, default is 0) +------ SPECIALS ------ +- will track and shoot the player +*/ +void SP_misc_generic_gun_auto3 (edict_t *ent) +{ + ent->spawnflags |= (AUTOGUN_NO_HANGY_THINGY | AUTOGUN_NO_TRIPOD); + VectorSet (ent->mins, -21, -18, -8); + VectorSet (ent->maxs, 21, 21, 8); + spawn_gun_auto(ent); +} + + + +void SP_misc_test_gun_auto (edict_t *ent) +{ + VectorSet (ent->mins, -28, -21, -34); + VectorSet (ent->maxs, 21, 21, 19); + + spawn_test_gun_auto(ent); +} + + + + +bool gun_big_target2(edict_t *self) +{ + IGhoulInst *shieldInst,*gunInst; + GhoulID shieldBolt; + boltonOrientation_c boltonInfo; + vec3_t fwd, vToTarget, barrelPos; + trace_t tr; + boltonOrientation_c::retCode_e ret = boltonOrientation_c::retCode_e::ret_TRUE; + GhoulID gunBarrel; + bool bRet = false; + objFlipInfo_c *pFlip = NULL; + + shieldInst = SimpleModelGetBolt(self, 1); + + self->nextthink = level.time + FRAMETIME; + + if (shieldInst && shieldInst->GetGhoulObject()) + { + shieldBolt = shieldInst->GetGhoulObject()->FindPart("DUMMY01"); + } + + if (self->objInfo) + { + pFlip = (objFlipInfo_c*)self->objInfo->GetInfo(OIT_FLIP); + } + if (!shieldBolt || !self->enemy) + { + if (pFlip) + { // hack. using flipinfo for storage. + pFlip->ground = 0; + } + return false; + } + + // turn the shield to face the player + // + if (!shieldInst->GetParent() || !shieldInst->GetParent()->GetGhoulObject()) + { + if (pFlip) + { // hack. using flipinfo for storage. + pFlip->ground = 0; + } + return false; + } + boltonInfo.root = self; + + + VectorCopy(self->enemy->s.origin,self->pos2); + self->pos2[2] += 30; + + boltonInfo.root = self; + boltonInfo.boltonInst = shieldInst; + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY01"); + boltonInfo.parentInst = self->ghoulInst; + boltonInfo.parentID = boltonInfo.parentInst->GetGhoulObject()->FindPart("DUMMY01"); + + VectorCopy(self->pos2, boltonInfo.vTarget); + boltonInfo.fMinPitch = -M_PI*0.1; + boltonInfo.fMaxPitch = M_PI*0.25; + boltonInfo.fMinYaw = -4000; + boltonInfo.fMaxYaw = 4000; + boltonInfo.fMaxTurnSpeed = .04; + boltonInfo.bUsePitch = false; + boltonInfo.bUseYaw = true; + boltonInfo.bToRoot = true; + boltonInfo.OrientBolton(); + + + boltonInfo.bUsePitch = true; + boltonInfo.bUseYaw = false; + + // Turn gun to face player + boltonInfo.boltonInst = SimpleModelGetBolt(self, 2); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY02"); + boltonInfo.OrientBolton(); + + // Turn gun to face player + boltonInfo.boltonInst = SimpleModelGetBolt(self, 4); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY03"); + boltonInfo.OrientBolton(); + + boltonInfo.vTarget[2] -= 20; // try to keep top and bottom guns parallel + + // Turn gun to face player + boltonInfo.root = self; + boltonInfo.boltonInst = SimpleModelGetBolt(self, 3); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY02"); + boltonInfo.OrientBolton(); + + // Turn gun to face player + boltonInfo.boltonInst = SimpleModelGetBolt(self, 5); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY03"); + boltonInfo.OrientBolton(); + + + + // if we're now pointing at our target shoot it + VectorSubtract(self->enemy->s.origin, self->s.origin, vToTarget); + GetGhoulPosDir(self->s.origin, self->s.angles, shieldInst, shieldBolt, "DUMMY01", NULL, NULL, NULL, fwd); + VectorNormalize(vToTarget); // ouch + if (DotProduct(vToTarget, fwd) > 0.95f) + { + // pointing at our target + gi.trace (self->s.origin, NULL, NULL, self->enemy->s.origin, self, MASK_SHOT| MASK_WATER, &tr); + if (tr.ent) + { + if (tr.ent->client) + { + self->s.sound = 0; + + if (gunInst = SimpleModelGetBolt(self,2)) + { + //if (pFlip && (pFlip->ground < 1)) + { + //SimpleModelSetSequence2(gunInst, "gunright", SMSEQ_LOOP); + } + GetGhoulPosDir(self->s.origin, self->s.angles,gunInst, 0, "_FLASHTOPRIGHT", barrelPos, NULL, NULL, NULL); + VectorSubtract(self->pos2, barrelPos, vToTarget); + weapons.attack(ATK_AUTOGUN, self, barrelPos, vToTarget, gunInst); + + gunBarrel = gunInst->GetGhoulObject()->FindPart("_FLASHTOPRIGHT"); + if(gunBarrel) + { + fxRunner.execWithInst("weapons/othermz/autogun", self, gunInst, gunBarrel, MULTICAST_PHS, 1); + } + } + if (gunInst = SimpleModelGetBolt(self,3)) + { + //if (pFlip && (pFlip->ground < 1)) + { + //SimpleModelSetSequence2(gunInst, "gunright", SMSEQ_LOOP); + } + GetGhoulPosDir(self->s.origin, self->s.angles,gunInst, 0, "_FLASHTOPRIGHT", barrelPos, NULL, NULL, NULL); + VectorSubtract(self->pos2, barrelPos, vToTarget); + weapons.attack(ATK_AUTOGUN, self, barrelPos, vToTarget, gunInst); + + gunBarrel = gunInst->GetGhoulObject()->FindPart("_FLASHTOPRIGHT"); + if(gunBarrel) + { + fxRunner.execWithInst("weapons/othermz/autogun", self, gunInst, gunBarrel, MULTICAST_PHS, 1); + } + } + if (gunInst = SimpleModelGetBolt(self,4)) + { + //if (pFlip && (pFlip->ground < 1)) + { + //SimpleModelSetSequence2(gunInst, "gunleft", SMSEQ_LOOP); + } + GetGhoulPosDir(self->s.origin, self->s.angles,gunInst, 0, "_FLASHTOPLEFT", barrelPos, NULL, NULL, NULL); + VectorSubtract(self->pos2, barrelPos, vToTarget); + weapons.attack(ATK_AUTOGUN, self, barrelPos, vToTarget, gunInst); + + gunBarrel = gunInst->GetGhoulObject()->FindPart("_FLASHTOPLEFT"); + if(gunBarrel) + { + fxRunner.execWithInst("weapons/othermz/autogun", self, gunInst, gunBarrel, MULTICAST_PHS, 1); + } + } + if (gunInst = SimpleModelGetBolt(self,5)) + { + //if (pFlip && (pFlip->ground < 1)) + { + //SimpleModelSetSequence2(gunInst, "gunleft", SMSEQ_LOOP); + } + GetGhoulPosDir(self->s.origin, self->s.angles,gunInst, 0, "_FLASHTOPLEFT", barrelPos, NULL, NULL, NULL); + VectorSubtract(self->pos2, barrelPos, vToTarget); + weapons.attack(ATK_AUTOGUN, self, barrelPos, fwd, gunInst); + + gunBarrel = gunInst->GetGhoulObject()->FindPart("_FLASHTOPLEFT"); + if(gunBarrel) + { + fxRunner.execWithInst("weapons/othermz/autogun", self, gunInst, gunBarrel, MULTICAST_PHS, 1); + } + } + bRet = true; + } + } + else + { + self->nextthink = level.time + .1; + } + } + if (false && !bRet) + { + // since we're not shooting, if we turned during this frame play the turning sound + if (ret == boltonOrientation_c::retCode_e::ret_FALSE) + { +// self->s.sound = gi.soundindex("Enemy/MGun/trnslow.wav"); +// self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + // freeze our guns' animations + if (gunInst = SimpleModelGetBolt(self,2)) + { + SimpleModelSetSequence2(gunInst, "gunright", SMSEQ_HOLD); + } + if (gunInst = SimpleModelGetBolt(self,3)) + { + SimpleModelSetSequence2(gunInst, "gunright", SMSEQ_HOLD); + } + if (gunInst = SimpleModelGetBolt(self,4)) + { + SimpleModelSetSequence2(gunInst, "gunleft", SMSEQ_HOLD); + } + if (gunInst = SimpleModelGetBolt(self,5)) + { + SimpleModelSetSequence2(gunInst, "gunleft", SMSEQ_HOLD); + } + } +/* if (self->objInfo && (pFlip = (objFlipInfo_c*)self->objInfo->GetInfo(OIT_FLIP))) + { // hack. using flipinfo for storage. + pFlip->ground = bRet?1.0:0.0; + } +*/ return bRet; +} + + +void gun_big_target (edict_t *self) +{ + vec3_t targetDir; + edict_t *target = NULL; + trace_t tr; + + self->nextthink = level.time + FRAMETIME; + + CRadiusContent rad(self->s.origin, self->volume); + + for(int i = 0; i < rad.getNumFound(); i++) + { + target = rad.foundEdict(i); + + if(target->client) + // right now, we're only targeting the player. should make this switchable by designers + { + // trace to see if I can see player. + gi.trace (self->s.origin, NULL, NULL, target->s.origin, self, MASK_SHOT| MASK_WATER, &tr); + if ((tr.ent->client) && (tr.ent->health > 0)) + { + self->enemy = target; + self->nextthink = level.time + .1; + self->think = gun_big_target; + } + else + { + self->enemy = NULL; + return; + } + } + } + if (NULL == self->enemy) + { + return; + } + VectorSubtract (self->enemy->s.origin, self->s.origin, targetDir); + + // is target within range? + if (VectorLengthSquared(targetDir) > (self->volume*self->volume)) + { // not in range + self->avelocity[1] = 0; + // perhaps return to original position? + if (self->s.sound == gi.soundindex("Enemy/MGun/trnslow.wav")) + { + self->s.sound = 0; + self->s.sound = gi.soundindex("Enemy/MGun/trnstop.wav"); + self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + self->nextthink = level.time + .1; + return; + } + + // guns now use ghoul rotation stuff + + // gun_big_target2 will return true if it fired. + if (!gun_big_target2(self)) + { // didn't fire so make sure we aren't looping the firing sequence for the gun barrels + } + return; +} + +bool gun_castle_target2(edict_t *self) +{ + IGhoulInst *shieldInst,*gunInst; + GhoulID shieldBolt; + boltonOrientation_c boltonInfo; + vec3_t fwd, vToTarget, barrelPos; + trace_t tr; + boltonOrientation_c::retCode_e ret = boltonOrientation_c::retCode_e::ret_TRUE; + GhoulID gunBarrel; + bool bRet = false; + objFlipInfo_c *pFlip = NULL; + + shieldInst = SimpleModelGetBolt(self, 1); + + self->nextthink = level.time + FRAMETIME; + + if (shieldInst && shieldInst->GetGhoulObject()) + { + shieldBolt = shieldInst->GetGhoulObject()->FindPart("DUMMY01"); + } + + if (self->objInfo) + { + pFlip = (objFlipInfo_c*)self->objInfo->GetInfo(OIT_FLIP); + } + if (!shieldBolt || !self->enemy) + { + if (pFlip) + { // hack. using flipinfo for storage. + pFlip->ground = 0; + } + return false; + } + + // turn the shield to face the player + // + if (!shieldInst->GetParent() || !shieldInst->GetParent()->GetGhoulObject()) + { + if (pFlip) + { // hack. using flipinfo for storage. + pFlip->ground = 0; + } + return false; + } + boltonInfo.root = self; + + + VectorCopy(self->enemy->s.origin,self->pos2); + self->pos2[2] += 30; + + boltonInfo.root = self; + boltonInfo.boltonInst = shieldInst; + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY01"); + boltonInfo.parentInst = self->ghoulInst; + boltonInfo.parentID = boltonInfo.parentInst->GetGhoulObject()->FindPart("DUMMY01"); + + VectorCopy(self->pos2, boltonInfo.vTarget); + boltonInfo.fMinPitch = -M_PI*0.1; + boltonInfo.fMaxPitch = M_PI*0.25; + boltonInfo.fMinYaw = -self->elasticity; + boltonInfo.fMaxYaw = self->elasticity; + boltonInfo.fMaxTurnSpeed = self->speed; + boltonInfo.bUsePitch = false; + boltonInfo.bUseYaw = true; + boltonInfo.bToRoot = true; + boltonInfo.OrientBolton(); + + + boltonInfo.bUsePitch = true; + boltonInfo.bUseYaw = false; + + // Turn gun to face player + boltonInfo.boltonInst = SimpleModelGetBolt(self, 2); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY02"); + boltonInfo.OrientBolton(); + + // Turn gun to face player + boltonInfo.boltonInst = SimpleModelGetBolt(self, 4); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY03"); + boltonInfo.OrientBolton(); + + boltonInfo.vTarget[2] -= 20; // try to keep top and bottom guns parallel + + // Turn gun to face player + boltonInfo.root = self; + boltonInfo.boltonInst = SimpleModelGetBolt(self, 3); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY02"); + boltonInfo.OrientBolton(); + + // Turn gun to face player + boltonInfo.boltonInst = SimpleModelGetBolt(self, 5); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY03"); + boltonInfo.OrientBolton(); + + + + // if we're now pointing at our target shoot it + VectorSubtract(self->enemy->s.origin, self->s.origin, vToTarget); + vToTarget[2]+=30; + GetGhoulPosDir(self->s.origin, self->s.angles, shieldInst, shieldBolt, "DUMMY01", NULL, NULL, NULL, fwd); + VectorNormalize(vToTarget); // ouch + VectorNormalize(fwd); // ouch ouch + if (DotProduct(vToTarget, fwd) > 0.95f) + { + // pointing at our target + gi.trace (self->s.origin, NULL, NULL, self->enemy->s.origin, self, MASK_SHOT| MASK_WATER, &tr); + if (tr.ent) + { + if (tr.ent->client) + { + self->s.sound = 0; + + if (gunInst = SimpleModelGetBolt(self,2)) + { + //if (pFlip && (pFlip->ground < 1)) + { + //SimpleModelSetSequence2(gunInst, "gunright", SMSEQ_LOOP); + } + GetGhoulPosDir(self->s.origin, self->s.angles,gunInst, 0, "_FLASHTOPRIGHT", barrelPos, NULL, NULL, NULL); + VectorSubtract(self->pos2, barrelPos, vToTarget); + weapons.attack(ATK_AUTOGUN, self, barrelPos, vToTarget, gunInst); + + gunBarrel = gunInst->GetGhoulObject()->FindPart("_FLASHTOPRIGHT"); + if(gunBarrel) + { + fxRunner.execWithInst("weapons/othermz/autogun", self, gunInst, gunBarrel, MULTICAST_PHS, 1); + } + } + if (gunInst = SimpleModelGetBolt(self,3)) + { + //if (pFlip && (pFlip->ground < 1)) + { + //SimpleModelSetSequence2(gunInst, "gunright", SMSEQ_LOOP); + } + GetGhoulPosDir(self->s.origin, self->s.angles,gunInst, 0, "_FLASHTOPRIGHT", barrelPos, NULL, NULL, NULL); + VectorSubtract(self->pos2, barrelPos, vToTarget); + weapons.attack(ATK_AUTOGUN, self, barrelPos, vToTarget, gunInst); + + gunBarrel = gunInst->GetGhoulObject()->FindPart("_FLASHTOPRIGHT"); + if(gunBarrel) + { + fxRunner.execWithInst("weapons/othermz/autogun", self, gunInst, gunBarrel, MULTICAST_PHS, 1); + } + } + if (gunInst = SimpleModelGetBolt(self,4)) + { + //if (pFlip && (pFlip->ground < 1)) + { + //SimpleModelSetSequence2(gunInst, "gunleft", SMSEQ_LOOP); + } + GetGhoulPosDir(self->s.origin, self->s.angles,gunInst, 0, "_FLASHTOPLEFT", barrelPos, NULL, NULL, NULL); + VectorSubtract(self->pos2, barrelPos, vToTarget); + weapons.attack(ATK_AUTOGUN, self, barrelPos, vToTarget, gunInst); + + gunBarrel = gunInst->GetGhoulObject()->FindPart("_FLASHTOPLEFT"); + if(gunBarrel) + { + fxRunner.execWithInst("weapons/othermz/autogun", self, gunInst, gunBarrel, MULTICAST_PHS, 1); + } + } + if (gunInst = SimpleModelGetBolt(self,5)) + { + //if (pFlip && (pFlip->ground < 1)) + { + //SimpleModelSetSequence2(gunInst, "gunleft", SMSEQ_LOOP); + } + GetGhoulPosDir(self->s.origin, self->s.angles,gunInst, 0, "_FLASHTOPLEFT", barrelPos, NULL, NULL, NULL); + VectorSubtract(self->pos2, barrelPos, vToTarget); + weapons.attack(ATK_AUTOGUN, self, barrelPos, fwd, gunInst); + + gunBarrel = gunInst->GetGhoulObject()->FindPart("_FLASHTOPLEFT"); + if(gunBarrel) + { + fxRunner.execWithInst("weapons/othermz/autogun", self, gunInst, gunBarrel, MULTICAST_PHS, 1); + } + } + bRet = true; + } + } + else + { + self->nextthink = level.time + .1; + } + + //eh? this stuff belongs here!!!! + if (gunInst = SimpleModelGetBolt(self,2)) + { + SimpleModelSetSequence2(gunInst, "gunright", SMSEQ_HOLD); + } + if (gunInst = SimpleModelGetBolt(self,3)) + { + SimpleModelSetSequence2(gunInst, "gunright", SMSEQ_HOLD); + } + if (gunInst = SimpleModelGetBolt(self,4)) + { + SimpleModelSetSequence2(gunInst, "gunleft", SMSEQ_HOLD); + } + if (gunInst = SimpleModelGetBolt(self,5)) + { + SimpleModelSetSequence2(gunInst, "gunleft", SMSEQ_HOLD); + } + + } + if (false && !bRet) + { + // since we're not shooting, if we turned during this frame play the turning sound + if (ret == boltonOrientation_c::retCode_e::ret_FALSE) + { +// self->s.sound = gi.soundindex("Enemy/MGun/trnslow.wav"); +// self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + // freeze our guns' animations +/* if (gunInst = SimpleModelGetBolt(self,2)) + { + SimpleModelSetSequence2(gunInst, "gunright", SMSEQ_HOLD); + } + if (gunInst = SimpleModelGetBolt(self,3)) + { + SimpleModelSetSequence2(gunInst, "gunright", SMSEQ_HOLD); + } + if (gunInst = SimpleModelGetBolt(self,4)) + { + SimpleModelSetSequence2(gunInst, "gunleft", SMSEQ_HOLD); + } + if (gunInst = SimpleModelGetBolt(self,5)) + { + SimpleModelSetSequence2(gunInst, "gunleft", SMSEQ_HOLD); + } +*/ + } +/* if (self->objInfo && (pFlip = (objFlipInfo_c*)self->objInfo->GetInfo(OIT_FLIP))) + { // hack. using flipinfo for storage. + pFlip->ground = bRet?1.0:0.0; + } +*/ return bRet; +} + + +void gun_castle_target (edict_t *self) +{ + vec3_t targetDir; + edict_t *target = NULL; + trace_t tr; + + self->nextthink = level.time + FRAMETIME; + + CRadiusContent rad(self->s.origin, self->volume); + + for(int i = 0; i < rad.getNumFound(); i++) + { + target = rad.foundEdict(i); + + if(target->client) + // right now, we're only targeting the player. should make this switchable by designers + { + // trace to see if I can see player. + gi.trace (self->s.origin, NULL, NULL, target->s.origin, self, MASK_SHOT| MASK_WATER, &tr); + if ((tr.ent->client) && (tr.ent->health > 0)) + { + self->enemy = target; + self->nextthink = level.time + .1; + self->think = gun_castle_target; + } + else + { + self->enemy = NULL; + return; + } + } + } + if (NULL == self->enemy) + { + return; + } + VectorSubtract (self->enemy->s.origin, self->s.origin, targetDir); + + // is target within range? + if (VectorLengthSquared(targetDir) > (self->volume*self->volume)) + { // not in range + self->avelocity[1] = 0; + // perhaps return to original position? + if (self->s.sound == gi.soundindex("Enemy/MGun/trnslow.wav")) + { + self->s.sound = 0; + self->s.sound = gi.soundindex("Enemy/MGun/trnstop.wav"); + self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + self->nextthink = level.time + .1; + return; + } + + // guns now use ghoul rotation stuff + + // gun_big_target2 will return true if it fired. + if (!gun_castle_target2(self)) + { // didn't fire so make sure we aren't looping the firing sequence for the gun barrels + } + return; +} + +void gun_castle_getready2(edict_t *self) +{ + IGhoulInst *shieldInst; + GhoulID shieldBolt; + boltonOrientation_c boltonInfo; + boltonOrientation_c::retCode_e ret = boltonOrientation_c::retCode_e::ret_TRUE; + objFlipInfo_c *pFlip = NULL; + + shieldInst = SimpleModelGetBolt(self, 1); + + self->nextthink = level.time + FRAMETIME; + + if (shieldInst && shieldInst->GetGhoulObject()) + { + shieldBolt = shieldInst->GetGhoulObject()->FindPart("DUMMY01"); + } + + if (self->objInfo) + { + pFlip = (objFlipInfo_c*)self->objInfo->GetInfo(OIT_FLIP); + } + if (!shieldBolt || !shieldInst->GetParent() || !shieldInst->GetParent()->GetGhoulObject()) + { + return; + } + boltonInfo.root = self; + + +// VectorCopy(self->enemy->s.origin,self->pos2); +// self->pos2[2] += 30; + +// AngleVectors(self->s.origin, fwd, NULL, NULL); +// VectorScale(fwd, -100, fwd); +// VectorAdd(fwd, self->s.origin, self->pos2); + + boltonInfo.root = self; + boltonInfo.boltonInst = shieldInst; + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY01"); + boltonInfo.parentInst = self->ghoulInst; + boltonInfo.parentID = boltonInfo.parentInst->GetGhoulObject()->FindPart("DUMMY01"); + + VectorCopy(self->pos2, boltonInfo.vTarget); + boltonInfo.fMinPitch = -M_PI*0.1; + boltonInfo.fMaxPitch = M_PI*0.25; + boltonInfo.fMinYaw = -self->elasticity; +// boltonInfo.fMaxYaw = self->elasticity; + boltonInfo.fMaxYaw = 0; + boltonInfo.fMaxTurnSpeed = self->speed*0.1; + boltonInfo.bUsePitch = false; + boltonInfo.bUseYaw = true; + boltonInfo.bToRoot = true; + boltonInfo.OrientBolton(); + + + boltonInfo.bUsePitch = true; + boltonInfo.bUseYaw = false; + + // Turn gun to face player + boltonInfo.boltonInst = SimpleModelGetBolt(self, 2); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY02"); + boltonInfo.OrientBolton(); + + // Turn gun to face player + boltonInfo.boltonInst = SimpleModelGetBolt(self, 4); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY03"); + boltonInfo.OrientBolton(); + + boltonInfo.vTarget[2] -= 20; // try to keep top and bottom guns parallel + + // Turn gun to face player + boltonInfo.root = self; + boltonInfo.boltonInst = SimpleModelGetBolt(self, 3); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY02"); + boltonInfo.OrientBolton(); + + // Turn gun to face player + boltonInfo.boltonInst = SimpleModelGetBolt(self, 5); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY03"); + ret = boltonInfo.OrientBolton(); + + // if we're now pointing at our target shoot it +// VectorSubtract(self->enemy->s.origin, self->s.origin, vToTarget); +// GetGhoulPosDir(self->s.origin, self->s.angles, shieldInst, shieldBolt, "DUMMY01", NULL, NULL, NULL, fwd); +// VectorNormalize(vToTarget); // ouch + + // since we're not shooting, if we turned during this frame play the turning sound + if (ret == boltonOrientation_c::retCode_e::ret_FALSE) + { + self->think = gun_castle_target; +// self->s.sound = gi.soundindex("Enemy/MGun/trnslow.wav"); +// self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } +} + +void gun_castle_getready1(edict_t *self) +{ + IGhoulInst *shieldInst; + GhoulID shieldBolt; + boltonOrientation_c boltonInfo; + vec3_t fwd; + boltonOrientation_c::retCode_e ret = boltonOrientation_c::retCode_e::ret_TRUE; + objFlipInfo_c *pFlip = NULL; + + shieldInst = SimpleModelGetBolt(self, 1); + + self->nextthink = level.time + FRAMETIME; + + if (shieldInst && shieldInst->GetGhoulObject()) + { + shieldBolt = shieldInst->GetGhoulObject()->FindPart("DUMMY01"); + } + + if (self->objInfo) + { + pFlip = (objFlipInfo_c*)self->objInfo->GetInfo(OIT_FLIP); + } + if (!shieldBolt || !shieldInst->GetParent() || !shieldInst->GetParent()->GetGhoulObject()) + { + return; + } + boltonInfo.root = self; + + +// VectorCopy(self->enemy->s.origin,self->pos2); +// self->pos2[2] += 30; + +// AngleVectors(self->s.origin, fwd, NULL, NULL); +// VectorScale(fwd, -100, fwd); +// VectorAdd(fwd, self->s.origin, self->pos2); + + boltonInfo.root = self; + boltonInfo.boltonInst = shieldInst; + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY01"); + boltonInfo.parentInst = self->ghoulInst; + boltonInfo.parentID = boltonInfo.parentInst->GetGhoulObject()->FindPart("DUMMY01"); + + VectorCopy(self->pos2, boltonInfo.vTarget); + boltonInfo.fMinPitch = -M_PI*0.1; + boltonInfo.fMaxPitch = M_PI*0.25; + boltonInfo.fMinYaw = -self->elasticity; +// boltonInfo.fMaxYaw = self->elasticity; + boltonInfo.fMaxYaw = 0; + boltonInfo.fMaxTurnSpeed = self->speed*0.1; + boltonInfo.bUsePitch = false; + boltonInfo.bUseYaw = true; + boltonInfo.bToRoot = true; + boltonInfo.OrientBolton(); + + + boltonInfo.bUsePitch = true; + boltonInfo.bUseYaw = false; + + // Turn gun to face player + boltonInfo.boltonInst = SimpleModelGetBolt(self, 2); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY02"); + boltonInfo.OrientBolton(); + + // Turn gun to face player + boltonInfo.boltonInst = SimpleModelGetBolt(self, 4); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY03"); + boltonInfo.OrientBolton(); + + boltonInfo.vTarget[2] -= 20; // try to keep top and bottom guns parallel + + // Turn gun to face player + boltonInfo.root = self; + boltonInfo.boltonInst = SimpleModelGetBolt(self, 3); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY02"); + boltonInfo.OrientBolton(); + + // Turn gun to face player + boltonInfo.boltonInst = SimpleModelGetBolt(self, 5); + boltonInfo.boltonID = boltonInfo.boltonInst->GetGhoulObject()->FindPart("DUMMY03"); + ret = boltonInfo.OrientBolton(); + + // if we're now pointing at our target shoot it +// VectorSubtract(self->enemy->s.origin, self->s.origin, vToTarget); +// GetGhoulPosDir(self->s.origin, self->s.angles, shieldInst, shieldBolt, "DUMMY01", NULL, NULL, NULL, fwd); +// VectorNormalize(vToTarget); // ouch + + // since we're not shooting, if we turned during this frame play the turning sound + if (ret == boltonOrientation_c::retCode_e::ret_FALSE) + { + GetGhoulPosDir(self->s.origin, self->s.angles, shieldInst, shieldBolt, "DUMMY01", NULL, NULL, NULL, fwd); +// AngleVectors(self->s.angles, fwd, NULL, NULL); + VectorScale(fwd, -100, fwd); + VectorAdd(fwd, self->s.origin, self->pos2); + + self->think = gun_castle_getready2; +// self->s.sound = gi.soundindex("Enemy/MGun/trnslow.wav"); +// self->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } +} + +void gun_castle_makesound (edict_t *self) +{ + self->think = gun_castle_target; + gi.sound(self, CHAN_VOICE, gi.soundindex("Enemy/MGun/Wake2.wav"), 1.0, ATTN_NORM, 0);//fixme - bounce + self->nextthink = level.time + 5.0; +} + +void gun_castle_use(edict_t *self, edict_t *other, edict_t *activator) +{ +// vec3_t fwd; + if (self->think == gun_castle_target) + { + self->think = NULL; + self->nextthink = 0.0; + } + else + { +// self->think = gun_castle_getready1; +// self->think = gun_castle_target; + self->think = gun_castle_makesound; + if (self->wait*0.5 < 5.1) + { + self->nextthink = level.time;// + (self->wait /** .1*/); + } + else + { + self->nextthink = level.time + (self->wait*0.5 /** .1*/ - 5.0); + } + +/* + IGhoulInst *shieldInst; + GhoulID shieldBolt; + shieldInst = SimpleModelGetBolt(self, 1); + + if (shieldInst && shieldInst->GetGhoulObject()) + { + shieldBolt = shieldInst->GetGhoulObject()->FindPart("DUMMY01"); + } + + if (!shieldBolt || !shieldInst->GetParent() || !shieldInst->GetParent()->GetGhoulObject()) + { + return; + } + + GetGhoulPosDir(self->s.origin, self->s.angles, shieldInst, shieldBolt, "DUMMY01", NULL, NULL, NULL, fwd); +// AngleVectors(self->s.angles, fwd, NULL, NULL); + VectorScale(fwd, -100, fwd); + VectorAdd(fwd, self->s.origin, self->pos2); +*/ + } +} + + + +/*QUAKED misc_generic_gun_big (1 .5 0) (-112 -75 -59) (48 76 39) INVULNERABLE NOPUSH ACTIVE ARC_LIMITED x x FLUFF +AWWWWWWW yeah.... Big ass quad machine gun turret +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't ever be pushed +ACTIVE - allow these guns to track and shoot. +ARC_LIMITED - won't rotate outside of given arc +FLUFF - won't show if gl_pictip is set +------ KEYS ------ +Skin - +0 - bosnian +1 - siberian +Speed - angular velocity in degrees per second the gun will track. Default 45. +Volume - the distance the guns will track. Default 400. +Wait - time interval in tenths of seconds that a gun in sleep mode will wait Default 30 +Health - designers can't edit health +maxyaw - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets on either side of its original facing (in degrees, to the left or right) +minpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets below its original facing (in degrees, default is 0) +maxpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets above its original facing (in degrees, default is 0) +*/ + +/*QUAKED misc_generic_gun_castle (1 .5 0) (-56 -37 -29) (24 38 19) INVULNERABLE NOPUSH ACTIVE ARC_LIMITED TOGGLEABLE TRIGGER_SPAWN FLUFF +AWWWWWWW yeah.... Big ass quad machine gun turret +------ SPAWNFLAGS ------ +INVULNERABLE - N/A can't ever be damaged. +NOPUSH - N/A can't ever be pushed +ACTIVE - allow these guns to track and shoot. +ARC_LIMITED - won't rotate outside of given arc +TOGGLEABLE - using through trigger will activate/deactivate +TRIGGER_SPAWN - start inactive +FLUFF - won't show if gl_pictip is set +------ KEYS ------ +Skin - +0 - order +1 - bosnian +2 - siberian +Speed - angular velocity in degrees per second the gun will track. Default 45. +Volume - the distance the guns will track. Default 400. +Wait - time interval in tenths of seconds that a gun in sleep mode will wait Default 15 +Health - designers can't edit health +maxyaw - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets on either side of its original facing (in degrees, to the left or right) +minpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets below its original facing (in degrees, default is 0) +maxpitch - used in conjuction with ARC_LIMITED will define the arc the gun will look for +targets above its original facing (in degrees, default is 0) +*/ + + + +void SP_misc_generic_gun_castle (edict_t *ent) +{ + char *skinname; + ggBinstC *baseBinst = NULL; + Matrix4 inMat1, inMat2, outMat; + + gi.soundindex("Enemy/MGun/Wake2.wav"); + + ent->spawnflags |= SF_INVULNERABLE; + ent->takedamage = DAMAGE_NO; + +// VectorSet (ent->mins, -111, -74, -58); +// VectorSet (ent->maxs, 47, 75, 38); + VectorSet (ent->mins, -56, -37, -29); + VectorSet (ent->maxs, 24, 38, 19); +// ent->s.origin[2]-=37; + + ent->spawnflags |= SF_NOPUSH; + + switch (ent->s.skinnum) + { + case 2: + skinname = "gun2"; + break; + case 1: + skinname = "gun"; + break; + default: + skinname = "gun_dekker"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_GUN_BIG_BASE],skinname,NULL); + + ent->ghoulInst->GetXForm(inMat1); + inMat2.Scale(0.5); + outMat.Concat(inMat1, inMat2); + ent->ghoulInst->SetXForm(outMat); + + baseBinst = SimpleModelAddBolt(ent,genericModelData[OBJ_GUN_BIG_BASE],"DUMMY01", + genericModelData[OBJ_GUN_BIG_SHIELD],"DUMMY01",skinname); + + if (baseBinst) + { + ComplexModelAddBolt(baseBinst, + genericModelData[OBJ_GUN_BIG_SHIELD], "DUMMY02", + genericModelData[OBJ_GUN_BIG_GUN_RIGHT], "DUMMY02", skinname); + ComplexModelAddBolt(baseBinst, + genericModelData[OBJ_GUN_BIG_SHIELD], "DUMMY04", + genericModelData[OBJ_GUN_BIG_GUN_RIGHT], "DUMMY02", skinname); + ComplexModelAddBolt(baseBinst, + genericModelData[OBJ_GUN_BIG_SHIELD], "DUMMY03", + genericModelData[OBJ_GUN_BIG_GUN_LEFT], "DUMMY03", skinname); + ComplexModelAddBolt(baseBinst, + genericModelData[OBJ_GUN_BIG_SHIELD], "DUMMY05", + genericModelData[OBJ_GUN_BIG_GUN_LEFT], "DUMMY03", skinname); + } + + + ent->s.effects |= EF_NO_BULLET; + ent->flags |= FL_NO_KNOCKBACK; +// ent->pain = auto_gun_spark; + ent->health = 200 + (game.playerSkills.getEnemyValue() * 150); + + if (!ent->speed) + { + ent->speed = 45; + } + + + // convert from deg/s to radians/frame + ent->speed *= (0.1*DEGTORAD); + if (!ent->volume) + { + ent->volume = 400; + } + if (!ent->wait) + { + ent->wait = 15; + } + + if (ent->spawnflags & AUTOGUN_ACTIVE) + { + if (!(ent->spawnflags & AUTOGUN_TRIGGER_SPAWN)) + { + ent->think = gun_castle_makesound; + if (ent->wait*0.5 < 5.1) + { + ent->nextthink = level.time;// + (self->wait /** .1*/); + } + else + { + ent->nextthink = level.time + (ent->wait*0.5 /** .1*/ - 5.0); + } + +// ent->think = gun_castle_target; +// ent->nextthink = level.time + (ent->wait /** .1*/); + } + if (ent->spawnflags & AUTOGUN_TOGGLEABLE) + { + ent->use = gun_castle_use; + } + } + ent->die = big_gun_die; + + if (ent->spawnflags & AUTOGUN_ARC_LIMITED) + { + ent->elasticity = st.maxyaw * DEGTORAD; // left/right + ent->accel = st.maxpitch * DEGTORAD; // above + ent->decel = st.minpitch * DEGTORAD; // below + } + else + { + ent->elasticity = M_PI; // allow 360 degrees of yaw + ent->accel = 0; // allow no pitch above horizontal + ent->decel = 0; // allow no pitch below horizontal + } + + gi.soundindex("Enemy/MGun/trnslow.wav"); // precache sound + gi.soundindex("Enemy/MGun/trnstop.wav"); // precache sound + gi.soundindex("Weapons/Autoshot/fire.wav"); // precache sound + gi.soundindex("Enemy/MGun/wake.wav"); // precache sound + + // precache muzzleflash effect and death effect + gi.effectindex("weapons/othermz/autogun"); + gi.effectindex("weapons/world/autogundeath"); + + // if anyone gets caught near this thing when it explodes + gi.effectindex("environ/onfireburst"); +} + +void SP_misc_generic_gun_big (edict_t *ent) +{ + char *skinname; + ggBinstC *baseBinst = NULL; + + VectorSet (ent->mins, -111, -74, -58); + VectorSet (ent->maxs, 47, 75, 38); + + ent->spawnflags |= SF_NOPUSH; + + switch (ent->s.skinnum) + { + case 1: + skinname = "gun2"; + break; + default: + skinname = "gun"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_GUN_BIG_BASE],skinname,NULL); + baseBinst = SimpleModelAddBolt(ent,genericModelData[OBJ_GUN_BIG_BASE],"DUMMY01", + genericModelData[OBJ_GUN_BIG_SHIELD],"DUMMY01",skinname); + + if (baseBinst) + { + ComplexModelAddBolt(baseBinst, + genericModelData[OBJ_GUN_BIG_SHIELD], "DUMMY02", + genericModelData[OBJ_GUN_BIG_GUN_RIGHT], "DUMMY02", skinname); + ComplexModelAddBolt(baseBinst, + genericModelData[OBJ_GUN_BIG_SHIELD], "DUMMY04", + genericModelData[OBJ_GUN_BIG_GUN_RIGHT], "DUMMY02", skinname); + ComplexModelAddBolt(baseBinst, + genericModelData[OBJ_GUN_BIG_SHIELD], "DUMMY03", + genericModelData[OBJ_GUN_BIG_GUN_LEFT], "DUMMY03", skinname); + ComplexModelAddBolt(baseBinst, + genericModelData[OBJ_GUN_BIG_SHIELD], "DUMMY05", + genericModelData[OBJ_GUN_BIG_GUN_LEFT], "DUMMY03", skinname); + } + + + ent->s.effects |= EF_NO_BULLET; + ent->flags |= FL_NO_KNOCKBACK; +// ent->pain = auto_gun_spark; + ent->health = 400 + (game.playerSkills.getEnemyValue() * 200); + + if (!ent->speed) + { + ent->speed = 45; + } + + + // convert from deg/s to radians/frame + ent->speed *= (0.1*DEGTORAD); + if (!ent->volume) + { + ent->volume = 400; + } + if (!ent->wait) + { + ent->wait = 30; + } + + if (ent->spawnflags & AUTOGUN_ACTIVE) + { + ent->takedamage = DAMAGE_YES; + ent->think = gun_big_target; + ent->nextthink = level.time + (ent->wait * .1); + } + ent->die = big_gun_die; + + if (ent->spawnflags & AUTOGUN_ARC_LIMITED) + { + ent->elasticity = st.maxyaw * DEGTORAD; // left/right + ent->accel = st.maxpitch * DEGTORAD; // above + ent->decel = st.minpitch * DEGTORAD; // below + } + else + { + ent->elasticity = M_PI; // allow 360 degrees of yaw + ent->accel = 0; // allow no pitch above horizontal + ent->decel = 0; // allow no pitch below horizontal + } + + // precache muzzleflash effect + gi.effectindex("weapons/othermz/autogun"); +} + + + + + + + +/*QUAKED misc_generic_heap (1 .5 0) (-21 -16 -2) (17 18 3) INVULNERABLE NOPUSH x x x x FLUFF +A heap of paper/guts/poop +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ KEYS ------ +Skin : + 0 - pile of paper. (default) + 1 - pile of guts. + 2 - cow patties... moo... +*/ +void SP_misc_generic_heap (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -20, -15, -1); + VectorSet (ent->maxs, 16, 17, 2); + + switch (ent->s.skinnum) + { + case 1: + skinname = "heap2"; + ent->surfaceType = SURF_LIQUID_RED; + break; + case 2: + skinname = "heap3"; + ent->surfaceType = SURF_LIQUID_BROWN; + break; + default: + skinname = "heap"; + ent->surfaceType = SURF_SAND_WHITE; + break; + } + + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&genericModelData[OBJ_HEAP],skinname,NULL); + +} + +/*QUAKED misc_generic_light_beam (1 .5 0) (-14 -313 -31) (51 142 6) INVULNERABLE NOPUSH x x x x FLUFF +A beam of light like what comes off a car or train headlight. +------ SPAWNFLAGS ------ +INVULNERABLE - N/A, can't ever be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_light_beam (edict_t *ent) +{ + VectorSet (ent->mins, -13, -312, -30); + VectorSet (ent->maxs, 50, 141, 5); + + ent->spawnflags |= SF_INVULNERABLE; + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&genericModelData[OBJ_LIGHT_BEAM],NULL,NULL); + +// SimpleModelRemoveObject(ent,"WORLD_OMNI"); +} + +/*QUAKED misc_generic_light_flare (1 .5 0) (-5 -5 -5) (5 5 5) INVULNERABLE NOPUSH x x x x FLUFF +A halo for lights. +------ SPAWNFLAGS ------ +INVULNERABLE - N/A, can't ever be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_light_flare (edict_t *ent) +{ + VectorSet (ent->mins, -5, -5, -5); + VectorSet (ent->maxs, 5, 5, 5); + + ent->spawnflags |= SF_INVULNERABLE; + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&genericModelData[OBJ_LIGHT_FLARE],NULL,NULL); + +} + +void motorcycle_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + SetSkin(ent,genericModelData[OBJ_MOTORCYCLE].dir,genericModelData[OBJ_MOTORCYCLE].file, + genericModelData[OBJ_MOTORCYCLE].materialfile,"damaged", 0); + +} + +/*QUAKED misc_generic_motorcycle (1 .5 0) (-45 -18 -26) (45 21 24) INVULNERABLE NOPUSH x x x x FLUFF +A red motorcycle. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- shows damage skin when shot +*/ +void SP_misc_generic_motorcycle (edict_t *ent) +{ + VectorSet (ent->mins, -44, -17, -25); + VectorSet (ent->maxs, 44, 20, 23); + + ent->spawnflags |= SF_NOPUSH; + + ent->pain = motorcycle_pain; + + SimpleModelInit2(ent,&genericModelData[OBJ_MOTORCYCLE],NULL,NULL); + + SetSkin(ent,genericModelData[OBJ_MOTORCYCLE].dir, + genericModelData[OBJ_MOTORCYCLE].file, + genericModelData[OBJ_MOTORCYCLE].materialfile,"motorcycle", 0); + +} + +void cone_fall (edict_t *self) +{ + if ((self->s.angles[0] >= 100) || (self->s.angles[0] <= -100) || + (self->s.angles[2] >= 100) || (self->s.angles[2] <= -100)) + { + if (self->s.angles[0] >= 100) + { + self->s.angles[0] = 100; + } + if (self->s.angles[0] <= -100) + { + self->s.angles[0] = -100; + } + if (self->s.angles[2] >= 100) + { + self->s.angles[2] = 100; + } + if (self->s.angles[2] <= -100) + { + self->s.angles[2] = -100; + } + VectorClear(self->avelocity); + self->nextthink = 0; + self->solid = SOLID_BBOX; + VectorSet(self->mins, -7, -7, -7); + VectorSet(self->maxs, 7, 7, 7); + return; + } + self->avelocity[0] *= 1.5; + self->avelocity[2] *= 1.5; + self->health = 1; + self->nextthink = level.time + .1; +} + +void cone_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t falldir; + vec3_t prelimavel; + float angle; + + VectorSubtract(self->s.origin, other->s.origin, falldir); + VectorNormalize(falldir); + angle = 360 - self->s.angle_diff; + angle = NormalizeAngle(angle); + angle *= DEGTORAD; + prelimavel[0] = falldir[0] * -70; + prelimavel[2] = falldir[1] * 70; + self->avelocity[0] = -1 * (prelimavel[0] * cos(angle) + prelimavel[2] * sin(angle)); + self->avelocity[2] = -1 * ( prelimavel[2] * cos(angle) + prelimavel[0] * -1 * sin(angle)); + VectorClear(self->velocity); + self->velocity[2] = 250; + self->think = cone_fall; + self->nextthink = level.time + .1; + self->pain = NULL; + + SetSkin(self,genericModelData[OBJ_ORANGE_CONE].dir,genericModelData[OBJ_ORANGE_CONE].file, + genericModelData[OBJ_ORANGE_CONE].materialfile,"damaged", 0); + +} + +/*QUAKED misc_generic_orange_cone (1 .5 0) (-7 -7 -13) (7 7 13) INVULNERABLE NOPUSH x x x x FLUFF +An orange cone traffic cone. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls over when shot +*/ +void SP_misc_generic_orange_cone(edict_t *ent) +{ + VectorSet (ent->mins, -6, -6, -13); + VectorSet (ent->maxs, 6, 6, 13); + + ent->pain = cone_pain; + + SimpleModelInit2(ent,&genericModelData[OBJ_ORANGE_CONE],NULL,NULL); + + SetSkin(ent,genericModelData[OBJ_ORANGE_CONE].dir, + genericModelData[OBJ_ORANGE_CONE].file, + genericModelData[OBJ_ORANGE_CONE].materialfile,"orangecone", 0); + +} + + +/*QUAKED misc_generic_palette_jack (1 .5 0) (-30 -11 -21) (30 11 21) INVULNERABLE NOPUSH x x x x FLUFF +A palette jack. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_palette_jack (edict_t *ent) +{ + VectorSet (ent->mins, -29, -10, -20); + VectorSet (ent->maxs, 29, 10, 20); + + SimpleModelInit2(ent,&genericModelData[OBJ_PALETTE_JACK],NULL,NULL); +} + +/*QUAKED misc_generic_paper_blowing (1 .5 0) (-3 -3 -0) (3 3 1) INVULNERABLE NOPUSH NOANIMATE x x x FLUFF +A piece of paper fluttering in the breeze. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +NOANIMATE - won't flutter +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_paper_blowing (edict_t *ent) +{ + VectorSet (ent->mins, -8, -8, -2); + VectorSet (ent->maxs, 8, 8, 2); + + SimpleModelInit2(ent,&genericModelData[OBJ_PAPER_BLOWING],NULL,NULL); + +// if (ent->spawnflags & SF_NOANIMATE) +// ent->ghoulInst->Pause(level.time); +} + +/*QUAKED misc_generic_parking_meter (1 .5 0) (-2 -5 -22) (2 5 22) INVULNERABLE NOPUSH x x x x FLUFF +A curbside parking meter +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_parking_meter (edict_t *ent) +{ + + VectorSet (ent->mins, -1, -4, -21); + VectorSet (ent->maxs, 1, 4, 21); + + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&genericModelData[OBJ_PARKING_METER],NULL,NULL); +} + + +void payphone_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ +/* vec3_t forward, vPos; + + if ( (rand() % 10) < 5 ) + { + AngleVectors(self->s.angles, forward, NULL, NULL); + VectorMA(self->s.origin, 10, forward, vPos); + FX_MakeCoins(vPos, forward, 0); + }*/ + FX_PhoneHit(self->s.origin); +} + +/*QUAKED misc_generic_phone_booth (1 .5 0) (-11 -28 -20) (11 28 20) INVULNERABLE NOPUSH x x x x FLUFF +A group of three phone booths +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, won't ever move +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- rings when shot +*/ +void SP_misc_generic_phone_booth (edict_t *ent) +{ + VectorSet (ent->mins, -10, -27, -19); + VectorSet (ent->maxs, 10, 27, 19); + + ent->spawnflags |= SF_NOPUSH; + ent->pain = payphone_pain; + + SimpleModelInit2(ent,&genericModelData[OBJ_PHONE_BOOTH],NULL,NULL); +} + + +/*QUAKED misc_generic_pillow (1 .5 0) (-19 -31 -3) (19 31 3) INVULNERABLE NOPUSH x x x x FLUFF +A large pillow to sit on +------ KEYS ------ +Skin : + 0 - white pillow. (default) + 1 - brown pillow for sitting (sushi bar) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_pillow (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -18, -30, -2); + VectorSet (ent->maxs, 18, 30, 2); + + switch (ent->s.skinnum) + { + case 1: + skinname = "pillow2"; + ent->surfaceType = SURF_LIQUID_RED; + break; + default: + skinname = "pillow"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_PILLOW],skinname,NULL); + +} + + +/*QUAKED misc_generic_plant_potted (1 .5 0) (-34 -43 -19) (24 28 44) INVULNERABLE NOPUSH x x x x FLUFF +A large palm plant in an urn-shaped pot. +------ KEYS ------ +skin - +0 - black vase w/gold band +1 - dark grey vase +2 - gold vase +3 - clay vase +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_plant_potted (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -33, -42, -18); + VectorSet (ent->maxs, 23, 27, 43); + + switch (ent->s.skinnum) + { + case 1: + skinname = "plant2"; + break; + case 2: + skinname = "plant3"; + break; + case 3: + skinname = "plant4"; + break; + default: + skinname = "plant"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_PLANT_POTTED],skinname,NULL); +} + +/*QUAKED misc_generic_plant_tall (1 .5 0) (-14 -13 -21) (14 13 21) INVULNERABLE NOPUSH x x x x FLUFF +A little tree (waist high) in a pot. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_plant_tall (edict_t *ent) +{ + VectorSet (ent->mins, -33, -42, -18); + VectorSet (ent->maxs, 23, 27, 43); + + SimpleModelInit2(ent,&genericModelData[OBJ_PLANT_TALL],NULL,NULL); +} + + +/*QUAKED misc_generic_radar_dish (1 .5 0) (-49 -36 -39) (48 37 50) INVULNERABLE NOPUSH NOANIMATE x x x FLUFF +A radar dish that spins around and around. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +NOANIMATE - won't spin +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_radar_dish (edict_t *ent) +{ + ggBinstC *dish; + vec3_t angVel = {0,0,0}; + + VectorSet (ent->mins, -64, -64, -15); + VectorSet (ent->maxs, 64, 64, 70); + + SimpleModelInit2(ent,&genericModelData[OBJ_RADAR_BASE],NULL,NULL); + + if (!ent->ghoulInst) + { + return; + } + ent->ghoulInst->Pause(level.time); + +// ent->think = radar_dish_sequence; +// ent->nextthink = level.time + ((rand() % 5) * .2); + + + dish = SimpleModelAddBolt(ent,genericModelData[OBJ_RADAR_BASE],"DISH_BOLT", + genericModelData[OBJ_RADAR_DISH],"DISH_BOLT",NULL); +// SetSkin2(dish->GetInstPtr(),genericModelData[OBJ_RADAR_DISH].dir,genericModelData[OBJ_RADAR_DISH].file, +// genericModelData[OBJ_RADAR_DISH].materialfile,"radar_dish"); + + // set the dish to rotate + angVel[YAW] = 1.5f; + if (dish) + { + FXA_SetRotate(ent, angVel, dish->GetInstPtr()); + } + +// top->nextthink = level.time + FRAMETIME*2; +// top->think = radar_dish_spin; +} + +/*QUAKED misc_generic_radio (1 .5 0) (-4 -14 -9) (4 14 9) INVULNERABLE NOPUSH x x x x FLUFF +A boom box. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - won't move +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_radio (edict_t *ent) +{ + VectorSet (ent->mins, -4, -14, -10); + VectorSet (ent->maxs, 4, 14, 9); + + SimpleModelInit2(ent,&genericModelData[OBJ_RADIO],NULL,NULL); +} + + +void security_cam_scan (edict_t *ent) +{ + trace_t trace; + edict_t *player; + + // do a trace to player, if < 1, bail + player = G_Find (NULL, FOFS(classname), "player"); + if (player) + { + ent->owner = player; + gi.trace (ent->s.origin, NULL, NULL, player->s.origin, ent, ent->clipmask, &trace); + ent->owner = NULL; + if (trace.fraction == 1) + { + // determine if it is within the camera's fov, if not, bail + if (WithinFOV(ent, player->s.origin, ent->attenuation)) + { + // if it is, run G_UseTargets + + // Jersey wants a sound here -- replace this with a real one + gi.sound(ent, CHAN_VOICE, gi.soundindex("Ambient/Models/Camera/Alarm.wav"), .6, ATTN_NORM, 0); + G_UseTargets(ent, player); + } + } + } + + if (!(ent->spawnflags & SECCAM_ROTATE)) // Not rotating + { + ent->nextthink = level.time + 1; + } +} + +// Looking back and forth +void security_cam_rotate (edict_t *ent) +{ + ent->s.angles[YAW] += ent->speed; // Move + --ent->style; + + if (ent->style == 0) + { + ent->style = ent->count; + ent->speed *= -1; + } + + if (ent->spawnflags & SECCAM_TRIGGERING) + { + if (ent->touch_debounce_time < level.time) + { + security_cam_scan(ent); + ent->touch_debounce_time = level.time + 1; + } + } + + ent->think = security_cam_rotate; + ent->nextthink = level.time + FRAMETIME; + +} + +void security_cam_init (edict_t *ent) +{ + // Does it rotate????? + if (ent->spawnflags & SECCAM_ROTATE) + { + if (!ent->speed) // Default rotation speed + ent->speed = 5; + + if (!ent->count) // Default rotation max + ent->count = 90; + + ent->count = (ent->count/ent->speed) * 2; // Number of times to turn before reversing + ent->style = ent->count /2; // Because we're starting in the middle + + //gi.sound(ent, CHAN_BODY, gi.soundindex("Ambient/Models/Camera/MoveLP.wav"), .8, ATTN_NORM, 0); + ent->s.sound = gi.soundindex("Ambient/Models/Camera/MoveLP.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + ent->think = security_cam_rotate; + ent->nextthink = level.time + FRAMETIME; + } + + // Trigger something if it spots the player???? + if (ent->spawnflags & SECCAM_TRIGGERING) + { + if (!ent->attenuation) // Default field of view + { + ent->attenuation = 30; + } + + if (!(ent->spawnflags & SECCAM_ROTATE)) // Not rotating + { + ent->think = security_cam_scan; + ent->nextthink = level.time + 1; + } + else + { + ent->touch_debounce_time = level.time + 1; // Search for player once every second + } + + } + + ent->spawnflags |= SF_NOPUSH; +} + +/*QUAKED misc_generic_security_camera (1 .5 0) (-8 -2 -4) (8 2 24) INVULNERABLE NOPUSH ROTATE TRIGGERING x x FLUFF +Ceiling mounted security camera +------ KEYS ------ +count - amount to rotate to one side from current facing (count = 30 means it rotates 60 total) (default 90) +speed - degrees per second to rotate (default 5) +attenuation - the half-fov in degrees (0 to 180), defaults to 30 +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't be pushed +ROTATE - camera will rotate on z axis +TRIGGERING - camera will trigger its target if it spots the player +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_security_camera (edict_t *ent) +{ + IGhoulInst *camInst = NULL; + + VectorSet (ent->mins, -8, -2, -4); + VectorSet (ent->maxs, 8, 2, 24); + + security_cam_init(ent); + + SimpleModelInit2(ent,&genericModelData[OBJ_SECURITY_CAM_POLE],NULL,"camera"); + SimpleModelScale(ent,2.0f); + + SimpleModelAddBolt(ent,genericModelData[OBJ_SECURITY_CAM_POLE],"DUMMY01", + genericModelData[OBJ_SECURITY_CAM_CAMERA],"DUMMY01",NULL); + + if (camInst = SimpleModelGetBolt(ent, 1)) + { + SimpleModelSetSequence2(camInst,genericModelData[OBJ_SECURITY_CAM_CAMERA].file,SMSEQ_LOOP); + } + + //precache sounds + gi.soundindex("Ambient/Models/Camera/Alarm.wav"); + gi.soundindex("Ambient/Models/Camera/MoveLP.wav"); +} + +/*QUAKED misc_generic_security_camera2 (1 .5 0) (-8 -2 -4) (8 2 4) INVULNERABLE NOPUSH ROTATE TRIGGERING x x FLUFF +Rotating security camera without mounting pole +------ KEYS ------ +count - amount to rotate to one side from current facing (count = 30 means it rotates 60 total) (default 90) +speed - degrees per second to rotate (default 5) +attenuation - the half-fov in degrees (0 to 180), defaults to 30 +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't be pushed +ROTATE - camera will rotate on z axis +TRIGGERING - camera will trigger its target if it spots the player +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_security_camera2 (edict_t *ent) +{ + VectorSet (ent->mins, -8, -2, -4); + VectorSet (ent->maxs, 8, 2, 4); + + security_cam_init(ent); + + SimpleModelInit2(ent,&genericModelData[OBJ_SECURITY_CAM_CAMERA],NULL,"camera"); + SimpleModelScale(ent,2.0f); + + SimpleModelSetSequence(ent,genericModelData[OBJ_SECURITY_CAM_CAMERA].file,SMSEQ_LOOP); + + //precache sounds + gi.soundindex("Ambient/Models/Camera/Alarm.wav"); + gi.soundindex("Ambient/Models/Camera/MoveLP.wav"); +} + +/*QUAKED misc_generic_shovel (1 .5 0) (-5 -3 -24) (5 3 24) INVULNERABLE NOPUSH x x x x FLUFF +Shovel, standing on its tip. +------ KEYS ------ +skin - +0 - normal shovel +1 - showy shovel (Siberia) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_shovel (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -5, -3, -24); + VectorSet (ent->maxs, 5, 3, 24); + + ent->spawnflags |= SF_NOPUSH; + + switch (ent->s.skinnum) + { + case 1: + skinname = "shovel2"; + break; + default: + skinname = "shovel"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_SHOVEL],skinname,NULL); + +} + +/*QUAKED misc_generic_shrub (1 .5 0) (-20 -20 -13) (20 20 13) INVULNERABLE NOPUSH x x x x FLUFF +A small leafy shrub. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_shrub (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -20, -20, -13); + VectorSet (ent->maxs, 20, 20, 13); + + ent->spawnflags |= SF_NOPUSH; + + switch (ent->s.skinnum) + { + case 1: + skinname = "shrub2"; + break; + default: + skinname = "shrub"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_SHRUB1],skinname,NULL); +} + + +void sink_spurt (edict_t *self) +{ + + vec3_t fwd, backward; + + AngleVectors(self->s.angles, fwd, 0, 0); + + VectorNegate(fwd, backward); + fxRunner.setDir(backward); + fxRunner.exec("environ/k_waterspout3", self->s.origin); + + self->think = G_FreeEdict; + // here, lifetime is in seconds + //self->nextthink = level.time + lLifeTime; + self->nextthink = level.time + 3; + +} + +void sink_create_water(edict_t *self) +{ + edict_t *water; + vec3_t forward; + + + water = G_Spawn(); + water->think = sink_spurt; + water->nextthink = level.time + .1; + VectorCopy(self->s.origin, water->s.origin); + + VectorCopy(self->s.angles, water->s.angles); +// water->s.angles[1] = self->s.angle_diff; + + AngleVectors(water->s.angles, forward, NULL, NULL); +// VectorMA(water->s.origin, -11, forward, water->s.origin); + + water->s.sound = gi.soundindex("Ambient/Gen/WtrFX/SprayBig.wav"); + water->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + + water->count = 10; + + gi.linkentity (water); +} + +void sink_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t debrisNorm; + + // ObjBecomeDebris() only uses self and attacker + gi.sound(self, CHAN_VOICE, gi.soundindex("Impact/Break/Ceramic.wav"), .6, ATTN_NORM, 0); + VectorClear(debrisNorm); + FX_ThrowDebris(self->s.origin,debrisNorm, 8, DEBRIS_SM, 0, 0,0,0, 0); +// ObjBecomeDebris(self, NULL, other, 0, vec3_origin); + G_FreeEdict(self); // Remove sink +} + +void urinal_create_water(edict_t *self); + + +// drop sink from wall. sink_touch() will take care of debrisifying it +void sink_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + edict_t *sink; + vec3_t vF = {0,0,0}; + + AngleVectors(self->s.angles, vF, NULL, NULL); + +// if (self->health > (HLTH_GEN_SINK / 4)) +// return; + + // Create water to come gushing out of wall + urinal_create_water(self); + + // Create sink to drop to floor + sink = G_Spawn(); + + VectorSet (sink->mins, -10, -11, -5); + VectorSet (sink->maxs, 10, 11, 6); + + SimpleModelInit2(sink,&genericModelData[OBJ_SINK],"damaged",NULL); + + sink->health = HLTH_GEN_SINK; + sink->s.effects |= EF_NO_BULLET; + sink->touch = sink_touch; + sink->material = self->material; + sink->surfaceType = self->surfaceType; + sink->nextthink = 0.0f; + // appears as though the sink needs a bit of a push to fall off of the wall. restroom gravity is evidently weaker than normal gravity. + VectorScale(vF, 10.0f, self->velocity); +// sink->velocity[2] = -40.0f; + VectorCopy(self->s.origin, sink->s.origin); + VectorCopy(self->s.angles, sink->s.angles); +// sink->s.angles[1] = self->s.angle_diff; + VectorMA(sink->s.origin, 5.0f, vF, sink->s.origin); + gi.linkentity (sink); + + G_FreeEdict(self); // Remove original sink + + +} + +// Display damage skin on first hit +void sink_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t debrisNorm; + char *skinname = NULL; + + gi.sound(self, CHAN_VOICE, gi.soundindex("Impact/Break/Ceramic.wav"), .6, ATTN_NORM, 0); + + VectorClear(debrisNorm); + FX_ThrowDebris(self->s.origin, debrisNorm, 5, DEBRIS_SM, 0, 0,0,0, 0); + + switch (self->s.skinnum) + { + case 1: + skinname = "sinkclean2d"; + break; + case 2: + skinname = "damaged"; + break; + default: + skinname = "sinkclean2d"; + break; + } + + SetSkin(self, genericModelData[OBJ_SINK].dir, genericModelData[OBJ_SINK].file, + genericModelData[OBJ_SINK].materialfile, skinname, 0); + self->pain = NULL; +} + +/*QUAKED misc_generic_sink (1 .5 0) (-11 -12 -6) (11 12 7) INVULNERABLE NOPUSH x x x x FLUFF +A wall mounted porcelain sink. +_______KEYS________ +skin - +1 - clean skin +2 - dirty skin + +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A,can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls off wall and spouts water when shot +*/ +void SP_misc_generic_sink (edict_t *ent) +{ + char *skinname = NULL; + + VectorSet (ent->mins, -11, -12, -6); + VectorSet (ent->maxs, 11, 12, 7); + + switch (ent->s.skinnum) + { + case 1: + skinname = "sinkclean"; + break; + case 2: + skinname = "sink"; + break; + default: + skinname = "sinkclean"; + break; + } + + ent->spawnflags |= SF_NOPUSH; + + ent->pain = sink_pain; + ent->die = sink_die; + ent->s.effects |= EF_NO_BULLET; + + SimpleModelInit2(ent,&genericModelData[OBJ_SINK],NULL,NULL); + SetSkin(ent, genericModelData[OBJ_SINK].dir, genericModelData[OBJ_SINK].file, + genericModelData[OBJ_SINK].materialfile, skinname, 0); + + gi.soundindex("Ambient/Gen/WtrFX/SprayBig.wav"); // precache sound + gi.soundindex("Impact/Break/Ceramic.wav"); // precache sound + gi.effectindex("environ/k_waterspout3"); +} + + +void sofa_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t pathdir; + vec3_t up; +// vec3_t towherehit; +// vec3_t cross; + + up[0] = 0; + up[1] = 0; + up[2] = 1; + + self->health = 10000; + VectorSubtract(self->s.origin, other->s.origin, pathdir); + VectorNormalize(pathdir); + VectorMA(self->velocity, damage*2, pathdir, self->velocity); + // since the vel. is influenced by damage, need to remember to tweak this base + // on final weapon damages + self->velocity[2] = 20; +// VectorSubtract(wherehit,self->s.origin, towherehit); +// This next was the old,cool rotating stuff... +// VectorScale(pathdir, -1, pathdir); +/* CrossProduct(pathdir, towherehit, cross); + if (DotProduct(cross, up) > 0) + { + self->avelocity[1] = (rand()%(40*damage)); + } + else if (DotProduct(cross, up) < 0) + { + self->avelocity[1] = (rand()%(40*damage))*-1; + } +*/ + wherehit[0] += ((rand()%21)*.1) - 1; + wherehit[1] += ((rand()%21)*.1) - 1; + wherehit[2] += ((rand()%21)*.1) - 1; + + FX_MakeDustPuff(wherehit); +} + +/*QUAKED misc_generic_sofa (1 .5 0) (-17 -36 -17) (17 36 17) INVULNERABLE NOPUSH x x x x FLUFF +A sofa. +------ KEYS ------ +skin - +0 - dirty green skin +1 - fancy white leather skin +2 - brown cloth with a design +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- emits smoke puffs when shot +*/ +void SP_misc_generic_sofa (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -17, -36, -17); + VectorSet (ent->maxs, 17, 36, 17); + + ent->pain = sofa_pain; + ent->friction = 1.0; + + switch (ent->s.skinnum) + { + case 1: + skinname = "sofa2"; + break; + case 2: + skinname = "sofa3"; + break; + default: + skinname = "sofa"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_SOFA],skinname,NULL); + +} + +/*QUAKED misc_generic_sofa_chair (1 .5 0) (-17 -16 -17) (17 16 17) INVULNERABLE NOPUSH x x x x FLUFF +A padded recliner-type chair +------ KEYS ------ +skin - +0 - brown with buttons +1 - brown cloth with a design +2 - brown with no buttons +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- emits smoke puffs when shot +*/ + +void SP_misc_generic_sofa_chair (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -17, -16, -17); + VectorSet (ent->maxs, 17, 16, 17); + + ent->spawnflags |= SF_NOPUSH; + + switch (ent->s.skinnum) + { + case 1: + skinname = "chair2"; + break; + case 2: + skinname = "chair2a"; + break; + default: + skinname = "chair"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_SOFA_CHAIR],skinname,NULL); + + ent->pain = sofa_pain; + ent->friction = 1.0; +} + + + +void speaker_spark (edict_t *self) +{ + vec3_t dir, holdorigin; + vec3_t forward,right; + + if (self->health == 0) + { + self->nextthink = 0; + } + else + { + dir[0] = 0; + dir[1] = 0; + dir[2] = 1; + self->health--; + + AngleVectors(self->s.angles, forward, right, NULL); + VectorMA(self->s.origin, 14, forward, holdorigin); + VectorMA(holdorigin, 4, right, holdorigin); + + FX_MakeSparks(holdorigin, dir, 0); + T_RadiusDamage (self, self->owner, 20.0, NULL, 10, MOD_EXPLOSIVE); + self->nextthink = level.time + (((rand()%30) * .1) + .1); + } +} + +void speaker_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + vec3_t pathdir; + float sign; + char *dir = "objects/generic/speaker"; + char *file = "speaker"; + IGhoulInst* speakerInst = NULL; + Matrix4 mat1; + vec3_t fwd, right; + + self->movetype = MOVETYPE_DAN; // Can be pushed around + + sign = (rand()&1) ? 1:-1; + VectorSubtract(self->s.origin, inflictor->s.origin, pathdir); + VectorNormalize(pathdir); + VectorMA(self->velocity, damage*5, pathdir, self->velocity); + self->velocity[2] = 0; +// self->avelocity[0] = sign * (100 + (rand()%100) + (damage*15)); + self->avelocity[1] = sign * (100 + (rand()%100) + (damage)); +// self->avelocity[2] = sign * (100 + (rand()%100) + (damage*15)); + self->gravity = 1; + + FX_MakeSparks(self->s.origin, pathdir, 0); + // explosion is really just to get the sound + FX_LittleExplosion(self->s.origin, 10, 1); + + // help it away from the wall + AngleVectors(self->s.angles,fwd,right,NULL); + VectorMA(self->s.origin, 10, fwd, self->s.origin); + + self->think = speaker_spark; + self->health = (rand()%10); + if (self->health < 4) + self->health = 4; + + self->nextthink = level.time; + self->takedamage = DAMAGE_NO; + self->owner = attacker; + + SimpleModelSetSequence(self,"speaker_down",SMSEQ_LOOP); + + if (!(self->spawnflags & SPEAKER_WALL)) + { + // shrink our bbox a bit + self->mins[2] = -5; + } +} + +/*QUAKED misc_generic_speaker (1 .5 0) (-3 -5 -10) (7 5 13) INVULNERABLE NOPUSH WALLMOUNT x x x FLUFF +A speaker hung from ceiling. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A,can't ever be pushed +WALLMOUNT - removes pole +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- sparks and falls when shot +- can remove wallmount using WALLMOUNT spawnflag +*/ +void SP_misc_generic_speaker (edict_t *ent) +{ + VectorSet (ent->mins, -5, -5, -12); + VectorSet (ent->maxs, 5, 5, 12); + + ent->spawnflags |= SF_NOPUSH; + + ent->die = speaker_die; + + SimpleModelInit2(ent,&genericModelData[OBJ_SPEAKER],NULL,NULL); + + if (ent->spawnflags & SPEAKER_WALL) //remove pole + { + SimpleModelRemoveObject(ent,"_ARM01"); + // shrink our bbox a bit + ent->mins[2] = -5; + } + + // cache sound CLSFX_EXP_SMALL + entSoundsToCache[CLSFX_EXP_SMALL] = 1; +} + +// FIXME :this needs an effect on it. +void stoplight_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + SimpleModelSetSequence(self,"stoplight",SMSEQ_HOLD); + SetSkin(self,genericModelData[OBJ_STOPLIGHT].dir,genericModelData[OBJ_STOPLIGHT].file, + genericModelData[OBJ_STOPLIGHT].materialfile,"stoplight_d", 0); + + self->think = NULL; + self->nextthink = NULL; +} + +void stoplight_change(edict_t *ent) +{ + char *seqname; + + ++ent->count; + + if (ent->count == 1) + seqname = "blue"; + else if (ent->count == 2) + seqname = "red"; + else + { + ent->count=0; + seqname = "yellow"; + } + + SimpleModelSetSequence(ent,seqname,SMSEQ_HOLD); + + ent->think = stoplight_change; + ent->nextthink = level.time + 5; +} + +/*QUAKED misc_generic_stoplight (1 .5 0)(-6 -5 -44) (9 4 44) INVULNERABLE NOPUSH x x x x FLUFF +A traffic light red - yellow - green, y'know. +------ KEYS ------ +skin - +0 - clean +1 - damaged +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A,can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- changes to damage skin when shot +*/ +void SP_misc_generic_stoplight (edict_t *ent) +{ + char *seqname; + char *skinname; + + + VectorSet (ent->mins, -6, -5, -44); + VectorSet (ent->maxs, 9, 4, 44); + + ent->spawnflags |= SF_NOPUSH; + + switch (ent->s.skinnum) + { + case 1: + skinname = "stoplight_d"; + break; + default: + skinname = "stoplight"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_STOPLIGHT],NULL,NULL); + + if (ent->s.skinnum) + { + SetSkin(ent,genericModelData[OBJ_STOPLIGHT].dir,genericModelData[OBJ_STOPLIGHT].file, + genericModelData[OBJ_STOPLIGHT].materialfile,"stoplight_d", 0); + } + else + { + ent->count=0; + + seqname = "yellow"; + + SimpleModelSetSequence(ent,seqname,SMSEQ_HOLD); + + ent->pain = stoplight_pain; + ent->think = stoplight_change; + ent->nextthink = level.time + 5; + } +} + + +/*QUAKED misc_generic_street_name_sign (1 .5 0) (-12 -12 -36) (12 12 36) INVULNERABLE NOPUSH x x x x FLUFF +A corner street sign. +------ KEYS ------ +skin - +0 - Russian sign +1 - American sign +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_street_name_sign (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -12, -12, -36); + VectorSet (ent->maxs, 12, 12, 36); + + ent->spawnflags |= SF_NOPUSH; + + switch (ent->s.skinnum) + { + case 1: + skinname = "sign2"; + break; + default: + skinname = "sign"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_STREETSIGN],skinname,NULL); + +} + +/*QUAKED misc_generic_sword (1 .5 0) (-23 -2 -2) (23 2 2) INVULNERABLE NOPUSH x x x x FLUFF +A katana +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_sword (edict_t *ent) +{ + VectorSet (ent->mins, -23, -2, -2); + VectorSet (ent->maxs, 23, 2, 2); + + SimpleModelInit2(ent,&genericModelData[OBJ_SWORD],NULL,NULL); +} + +/*QUAKED misc_generic_sword_large (1 .5 0) (-29 -2 -2) (29 2 2) INVULNERABLE NOPUSH x x x x FLUFF +A large katana +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_sword_large (edict_t *ent) +{ + VectorSet (ent->mins, -29, -2, -2); + VectorSet (ent->maxs, 29, 2, 2); + + SimpleModelInit2(ent,&genericModelData[OBJ_SWORD_LARGE],NULL,NULL); + SimpleModelScale(ent,1.30f); +} + +/*QUAKED misc_generic_table_round (1 .5 0) (-27 -23 -16) (27 23 16) INVULNERABLE NOPUSH x x x x FLUFF +Octagonal table with a support in the middle. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ KEYS ------ +skin - +0 - metal table (default) +1 - wooden table +*/ +void SP_misc_generic_table_round (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -27, -23, -16); + VectorSet (ent->maxs, 27, 23, 16); + + switch (ent->s.skinnum) + { + case 1: + skinname = "table2"; + ent->surfaceType = SURF_WOOD_LBROWN; + ent->material = MAT_WOOD_LBROWN; + break; + default: + skinname = "table"; + ent->surfaceType = SURF_METAL; + ent->material = MAT_METAL_SHINY; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_TABLE_ROUND],skinname,NULL); + + VectorSet (ent->mins, -27, -23, -16); + VectorSet (ent->maxs, 27, 23, 16); + + gi.linkentity (ent); + +} + + +void table1_flat(edict_t *self) +{ + self->s.angles[ROLL] = self->moveinfo.start_angles[ROLL]; + self->s.angles[PITCH] = self->moveinfo.start_angles[PITCH]; + VectorSet (self->mins, -41, -24, 10); + VectorSet (self->maxs, 41, 24, 15); + + self->spawnflags &= ~SF_NOPUSH; + gi.linkentity (self); +} + +void table1_rollright(edict_t *self) +{ + self->s.angles[ROLL] += 30; + + self->s.angles[PITCH] = self->moveinfo.start_angles[PITCH]; + + VectorSet (self->mins, -41, -24, -7); + VectorSet (self->maxs, 41, 24, 16); + + gi.linkentity (self); +} + + +void table1_rollleft(edict_t *self) +{ + self->s.angles[ROLL] -= 30; + + self->s.angles[PITCH] = self->moveinfo.start_angles[PITCH]; + + VectorSet (self->mins, -41, -24, -7); + VectorSet (self->maxs, 41, 24, 16); + + gi.linkentity (self); +} + +void table1_pitchforward(edict_t *self) +{ + if (self->s.angles[ROLL] != self->moveinfo.start_angles[ROLL]) // Already laying on the long edge + return; + + self->s.angles[PITCH] += 20; + + VectorSet (self->mins, -41, -24, -7); + VectorSet (self->maxs, 41, 24, 16); + + gi.linkentity (self); +} + +void table1_pitchbackward(edict_t *self) +{ + if (self->s.angles[ROLL] != self->moveinfo.start_angles[ROLL]) // Already laying on the long edge + return; + + self->s.angles[PITCH] -= 20; + + VectorSet (self->mins, -41, -24, -7); + VectorSet (self->maxs, 41, 24, 16); + + gi.linkentity (self); +} + +// called when a part is shot off of the table +void table1_legpain (edict_t *self,int partLost, vec3_t boltPos) +{ + bool bTwoLegs = false, B1, B2, B3, B4, B5; + boltInstInfo_c *boltInfo = NULL; + vec3_t debrisNorm; + + if (!self->objInfo || !(boltInfo = (boltInstInfo_c*)self->objInfo->GetInfo(OIT_BOLTINST)) ) + { + return; + } + B1 = boltInfo->IsOn(1); + B2 = boltInfo->IsOn(2); + B3 = boltInfo->IsOn(3); + B4 = boltInfo->IsOn(4); + B5 = boltInfo->IsOn(5); + + // All other legs there? + if ((B1) && (B2) && (B3)) + return; + + if ((B1) && (B2) && (B4)) + return; + + if ((B1) && (B3) && (B4)) + return; + + if ((B2) && (B3) && (B4)) + return; + + VectorClear(debrisNorm); + + // Throw debris and make it go away + FX_ThrowDebris(boltPos,debrisNorm, 5, DEBRIS_SM, self->material, 0,0,0, self->surfaceType); + FX_SmokePuff(boltPos,120,120,120,200); + + // All legs and front gone?? + if ((!B1) && (!B2) && (!B3) && (!B4) && (!B5)) + { + table1_flat(self); + return; + } + + + switch (partLost) + { + case(1): + // Both back legs are gone? + if ((!B1) && (!B2)) + { + table1_rollright(self); + } + // Both back legs are gone? + else if ((!B1) && (!B3) && (!B5)) + { + table1_pitchbackward(self); + } + break; + case(2): + // Both back legs are gone? + if ((!B1) && (!B2)) + { + table1_rollright(self); + } + else if ((!B2) && (!B4) && (!B5)) + { + table1_pitchforward(self); + } + break; + case(3): + if ((!B1) && (!B3) && (!B5)) + { + table1_pitchbackward(self); + } + else if ((!B3) && (!B4) && (!B5)) + { + table1_rollleft(self); + } + break; + case(4): + if ((!B2) && (!B4) && (!B5)) + { + table1_pitchforward(self); + } + else if ((!B3) && (!B4) && (!B5)) + { + table1_rollleft(self); + } + break; + case(5): + if ((!B1) && (!B3) && (!B5)) + { + table1_pitchbackward(self); + } + else if ((!B2) && (!B4) && (!B5)) + { + table1_pitchforward(self); + } + else if ((!B3) && (!B4) && (!B5)) + { + table1_rollleft(self); + } + + default: + break; + } +} + +void tabletouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ // the purpose of this fn is to find all of the objects resting on the table + //and store them in a linked list of sorts + objInfo_c *infoPtr = self->objInfo?self->objInfo->GetInfo(OIT_BOLTINST):NULL; + + if (other->client || other->ai) + { // we sure as heck don't want to add the player or an enemy to our list + return; + } + if (NULL == infoPtr) + { // nowhere to store information + return; + } + if (infoPtr->head == self) + { // ooh, I've got an idea. let's _not_ go into an infinite loop. + return; + } + if (other == world) + { // ...and let's talk about how bad it would be to think that the worldspawn + //landed on top of this table... + return; + } + while (infoPtr->head != NULL) + { // if this head _is_ other, we've already added other to our list so exit + if (infoPtr->head == other) + { + return; + } + // find the next node in the list + if (NULL == infoPtr->head->objInfo) + { // next node doesn't have an objInfo + return; + } + infoPtr = infoPtr->head->objInfo->GetInfo(OIT_BOLTINST); + } + // with any luck at all, getting here means we have a valid infoPtr->head which we can + //use like a "next" pointer in a linked list. sheesh. stupid tables. + infoPtr->head = other; +} + +/*QUAKED misc_generic_table1 (1 .5 0) (-41 -24 -18) (41 24 15) INVULNERABLE NOPUSH PLAYER_FLIPPABLE x x x FLUFF +A rectangular table with four legs and a front panel. +------ KEYS ------ +Skin : +0 - dirty wooden table. (default) +1 - high tech metal/white table +2 - dirty wooden table with stuff on it +3 - high tech table with stuff on it +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls apart when shot +*/ +void SP_misc_generic_table1 (edict_t *ent) +{ + char *skinname; + + // Set up object to break apart when shot + Obj_partbreaksetup (BPD_TABLE1,&genericModelData[OBJ_TABLE1], + genericObjBoltPartsData,genericObjBreak); + + switch (ent->s.skinnum) + { + case 1: + skinname = "table1A"; + ent->surfaceType = SURF_METAL; + ent->material = MAT_METAL_SHINY; + break; + case 2: + skinname = "table1B"; + ent->surfaceType = SURF_WOOD_LBROWN; + ent->material = MAT_WOOD_LBROWN; + break; + case 3: + skinname = "table1C"; + ent->surfaceType = SURF_METAL; + ent->material = MAT_METAL_SHINY; + break; + default: + skinname = "table1"; + ent->surfaceType = SURF_WOOD_LBROWN; + ent->material = MAT_WOOD_LBROWN; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_TABLE1],skinname,NULL); + + VectorSet (ent->mins, -41, -24, -18); + VectorSet (ent->maxs, 41, 24, 10); + + gi.linkentity (ent); + + // These are given as you face the front of the desk : + // Bolt1 - back right leg + SimpleModelAddBolt(ent,genericModelData[OBJ_TABLE1],"DUMMY01", + genericModelData[OBJ_TABLE1_LEG],"DUMMY01",skinname); + // Bolt2 - back left leg + SimpleModelAddBolt(ent,genericModelData[OBJ_TABLE1],"DUMMY02", + genericModelData[OBJ_TABLE1_LEG],"DUMMY01",skinname); + // Bolt3 - front left leg + SimpleModelAddBolt(ent,genericModelData[OBJ_TABLE1],"DUMMY03", + genericModelData[OBJ_TABLE1_LEG],"DUMMY01",skinname); + // Bolt4 - front right leg + SimpleModelAddBolt(ent,genericModelData[OBJ_TABLE1],"DUMMY04", + genericModelData[OBJ_TABLE1_LEG],"DUMMY01",skinname); + // Bolt5 - front panel + SimpleModelAddBolt(ent,genericModelData[OBJ_TABLE1],"DUMMY05", + genericModelData[OBJ_TABLE1_BACK],"DUMMY05",skinname); + ent->pain = Obj_partpain; + VectorCopy(ent->s.angles,ent->moveinfo.start_angles); + + // do we want the player to be able to flip this object 90 degrees? + if (ent->spawnflags & PLAYER_FLIPPABLE) + { + ent->plUse = FlipObject; + } + + ent->touch = tabletouch; +} + + +void table2_flat(edict_t *self) +{ + self->s.angles[ROLL] = self->moveinfo.start_angles[ROLL]; + self->s.angles[PITCH] = self->moveinfo.start_angles[PITCH]; + + VectorSet (self->mins, -64, -106, -1); + VectorSet (self->maxs, 47, 32, 4); + + gi.linkentity (self); +} + +void table2_shorttopbreak(edict_t *self) +{ + Matrix4 matOld,mat2,mat1; + IGhoulInst* TopInst; + + if (TopInst = SimpleModelGetBolt(self, 5)) + { + TopInst->GetXForm(matOld); + mat1=mat2=matOld; + mat2.Rotate(1,-TOP_FALL); + matOld.Concat(mat1, mat2); + TopInst->SetXForm(matOld); + } + self->s.angles[0] += 8; +} + +void table2_longtopbreak(edict_t *self) +{ + self->s.angles[ROLL] += 18; +} + +void table2_roll1(edict_t *self) +{ + self->s.angles[PITCH] += 18; +} + +// Long side panels are gone, tip forward +void table2_roll2(edict_t *self) +{ + self->s.angles[PITCH] -= 12; + self->s.angles[ROLL] -= 12; + + VectorSet (self->mins, -64, -106, -16); + VectorSet (self->maxs, 47, 32, 4); + + gi.linkentity (self); + +} + +// called when a part is shot off of the table +void table2_legpain (edict_t *self,int partLost, vec3_t boltPos) +{ + bool bTwoLegs = false, B1, B2, B3, B4; + vec3_t debrisNorm; + boltInstInfo_c *boltInfo = NULL; + + if (!self->objInfo || !(boltInfo = (boltInstInfo_c*)self->objInfo->GetInfo(OIT_BOLTINST)) ) + { + return; + } + B1 = boltInfo->IsOn(1); + B2 = boltInfo->IsOn(2); + B3 = boltInfo->IsOn(3); + B4 = boltInfo->IsOn(4); + + // Bolt1 - Short side panel on short length of table + // Bolt2 - Long side panel + // Bolt3 - Medium side panel + // Bolt4 - Short side panel on long length of table + // Bolt5 - Short table top + + // Throw debris and make it go away + VectorClear(debrisNorm); + FX_ThrowDebris(boltPos,debrisNorm, 5, DEBRIS_SM, self->material, 0,0,0, self->surfaceType); + FX_SmokePuff(boltPos,120,120,120,200); + + // All legs gone?? + if ((!B1) && (!B2) && (!B3) && (!B4)) + { + table2_flat(self); + return; + } + + switch (partLost) + { + case(1): // Bolt1 - Short side panel on short length of table + if ((!B2) && (!B3) && (B4)) + { + table2_roll1(self); + } + else if ((!B3) && (B2) && (B4)) + { + table2_shorttopbreak(self); + } + + break; + case(2): // Bolt2 - Long side panel + if ((B1) && (!B2) && (!B3) && (B4)) + { + table2_roll2(self); + } + + break; + case(3): // Bolt3 - Medium side panel + if ((!B1) && (B2) && (B4)) + { + table2_shorttopbreak(self); + } + else if ((B1) && (!B2) && (!B3) && (B4)) + { + table2_roll2(self); + } + break; + case(4): // Bolt4 - Short side panel on long length of table + if ((!B2) && (B1) && (B3)) + { + table2_longtopbreak(self); + } + break; + default: + break; + } +} + + + +/*QUAKED misc_generic_table2 (1 .5 0) (-64 -106 -30) (47 32 4) INVULNERABLE NOPUSH x x x x FLUFF +An 'L' shaped table with panels on four sides. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls apart when shot +*/ +void SP_misc_generic_table2 (edict_t *ent) +{ + IGhoulInst* PanelInst; + Matrix4 matOld,mat2,mat1; + + // Set up object to break apart when shot + Obj_partbreaksetup (BPD_TABLE2,&genericModelData[OBJ_TABLE2], + genericObjBoltPartsData,genericObjBreak); + + if (!st.scale) + st.scale = .80f; // Scaled down normally + else if (st.scale > .20f) + st.scale -= .20f; + +// VectorSet (ent->mins, -64, -106, -26); +// VectorSet (ent->maxs, 47, 32, 4); + + VectorSet (ent->mins, -56, -98, -26); + VectorSet (ent->maxs, 39, 24, 4); + + SimpleModelInit2(ent,&genericModelData[OBJ_TABLE2],NULL,NULL); + + gi.linkentity (ent); + + // Bolt1 - Short side panel on short length of table + SimpleModelAddBolt(ent,genericModelData[OBJ_TABLE2],"DUMMY08", + genericModelData[OBJ_TABLE2_SIDE1],"DUMMY08",NULL); + // Bolt2 - Long side panel + SimpleModelAddBolt(ent,genericModelData[OBJ_TABLE2],"DUMMY09", + genericModelData[OBJ_TABLE2_SIDE2],"DUMMY09",NULL); + // Bolt3 - Medium side panel + SimpleModelAddBolt(ent,genericModelData[OBJ_TABLE2],"DUMMY10", + genericModelData[OBJ_TABLE2_SIDE3],"DUMMY10",NULL); + // Bolt4 - Short side panel on long length of table + SimpleModelAddBolt(ent,genericModelData[OBJ_TABLE2],"DUMMY07", + genericModelData[OBJ_TABLE2_SIDE1],"DUMMY08",NULL); + // Bolt5 - Short table top + SimpleModelAddBolt(ent,genericModelData[OBJ_TABLE2],"DUMMY12", + genericModelData[OBJ_TABLE2_TOP2],"DUMMY12",NULL); + // Rotating side panel + if (PanelInst = SimpleModelGetBolt(ent, 4)) + { + PanelInst->GetXForm(matOld); + mat1=mat2=matOld; + mat2.Rotate(0,-M_PI*.50); + matOld.Concat(mat1, mat2); + PanelInst->SetXForm(matOld); + } + ent->pain = Obj_partpain; + ent->touch = tabletouch; + +} + + +void tank_gas_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + self->die = NULL; + self->pain = NULL; + Obj_explode(self,&self->s.origin,1,1); + ObjBecomeDebris(self,inflictor,attacker,damage,point); +} + +void tank_gas_use (edict_t *self, edict_t *other, edict_t *activator) +{ + tank_gas_die(self,other,activator,100,self->s.origin); +} + + +/*QUAKED misc_generic_tank_gas (1 .5 0) (-58 -23 -27) (58 23 19) INVULNERABLE NOPUSH x x x x FLUFF +A big natural gas tank. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- when 'used' it blows up, even when invulnerable. +- blows up when shot +*/ +void SP_misc_generic_tank_gas (edict_t *ent) +{ + VectorSet (ent->mins, -58, -23, -27); + VectorSet (ent->maxs, 58, 23, 19); + + SimpleModelInit2(ent,&genericModelData[OBJ_TANK_GAS],NULL,NULL); + + ent->die = tank_gas_die; + ent->use = tank_gas_use; + + // cache sound CLSFX_EXPLODE + entSoundsToCache[CLSFX_EXPLODE] = 1; + + // precache explosion effect + gi.effectindex("weapons/world/airexplode"); + gi.effectindex("environ/onfireburst"); +} + + +void tank_propane_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + self->die = NULL; + self->pain = NULL; + Obj_explode(self,&self->s.origin,1,1); + + if (self->spawnflags && TANK_PROPANE_NODEBRIS) + { + G_FreeEdict(self); + } + else + { + BecomeDebris(self,inflictor,attacker,damage,point); + } +} + +/*QUAKED misc_generic_tank_propane (1 .5 0) (-3 -3 -25) (3 3 25) INVULNERABLE NOPUSH NODEBRIS x x x FLUFF +A tall thin propane tank. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +NODEBRIS - won't produce debris when killed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_tank_propane (edict_t *ent) +{ + VectorSet (ent->mins, -3, -3, -25); + VectorSet (ent->maxs, 3, 3, 25); + + SimpleModelInit2(ent,&genericModelData[OBJ_TANK_PROPANE],NULL,NULL); + + ent->die = tank_propane_die; + + + // cache sound CLSFX_EXPLODE + entSoundsToCache[CLSFX_EXPLODE] = 1; + gi.effectindex("environ/onfireburst"); +} + +void toilet_pulse (edict_t *self) +{ + + if (self->health <= 0) + { + G_FreeEdict(self); + return; + } +} + +void toilet_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + edict_t *water; + vec3_t pos; + + water = G_Spawn(); + water->health = 50; + water->takedamage = DAMAGE_NO; + water->think = G_FreeEdict; + water->nextthink = level.time + 3.0;// estimated length of environ/toiletspout.eft + VectorCopy(self->s.origin, water->s.origin); + + VectorCopy(self->s.angles, water->s.angles); + + water->s.sound = gi.soundindex("Ambient/Gen/WtrFX/SprayBig.wav"); + water->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + + water->count = 10; + + VectorCopy(self->s.origin, pos); + fxRunner.exec("environ/toiletspout", pos); + gi.linkentity (water); + + ObjBecomeDebris(self, NULL, self, 0, vec3_origin); +} + +void toilet_dribble (edict_t *self) +{ + self->nextthink = level.time + .1 * (rand()%5); +} + +void toilet_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t pathdir, offset, vel; + vec3_t accel = {0,0,-800}; + + VectorSubtract(other->s.origin, self->s.origin, pathdir); + VectorNormalize(pathdir); + VectorScale(pathdir, gi.irand(90,111), pathdir); + pathdir[2] += 150; + VectorCopy(pathdir, vel); + pathdir[0] = (pathdir[0]/4) + 128; + pathdir[1] = (pathdir[1]/4) + 128; + pathdir[2] = (pathdir[2]/4) + 128; + + + VectorSubtract(wherehit,self->s.origin, offset); + + SetSkin(self,genericModelData[OBJ_TOILET].dir,genericModelData[OBJ_TOILET].file, + genericModelData[OBJ_TOILET].materialfile,"damaged", 0); + + + self->think = toilet_dribble; + self->nextthink = level.time + .5; + self->health = 1; +} + +/*QUAKED misc_generic_toilet (1 .5 0) (-14 -9 -16) (14 9 16) INVULNERABLE NOPUSH x x x x FLUFF +A toilet +------ KEYS ------ +Skin : + 0 - dirty New York. (default) + 1 - clean Tokyo +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- produces fountain of water when shot. +*/ +void SP_misc_generic_toilet (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -14, -9, -16); + VectorSet (ent->maxs, 14, 9, 16); + + ent->pain = toilet_pain; + ent->die = toilet_die; + + switch (ent->s.skinnum) + { + case 1: + skinname = "toiletclean"; + break; + default: + skinname = "toilet"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_TOILET],NULL,NULL); + SetSkin(ent,genericModelData[OBJ_TOILET].dir,genericModelData[OBJ_TOILET].file, + genericModelData[OBJ_TOILET].materialfile,skinname, 0); + ent->movetype = MOVETYPE_NONE; + + gi.soundindex("Ambient/Gen/WtrFX/SprayBig.wav"); // precache sound + gi.effectindex("environ/toiletspout"); +} + + +/*QUAKED misc_generic_train (1 .5 0) (-54 -164 -60) (55 168 60) TRIGGERED RESPAWNER START_ACTIVE DECCELERATE DISAPPEAR IDLE FLUFF +A train car. +------ KEYS ------ +accel - rate of acceleration (default 100) +skin - +0 - modern graffitti covered subway car +1 - old-fashioned subway +2 - cattle car +3 - box car +style - maximum speed (default 600) +------ SPAWNFLAGS ------ +TRIGGERED - set if train is to respond to a trigger. +RESPAWNER - set if you want the train to disappear when it stops and respawn. +When set, "wait" is the time in seconds that will pass before the train respawns +after disappearing. +START_ACTIVE - set the train is to begin the level moving, as opposed to being triggered. +DECCELERATE will cause the train to slow down instead of instantly stopping +DISAPPEAR - go away when train stops. +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- train moves +*/ + +void train_go (edict_t *self, edict_t *other, edict_t *activator); + +void train_stop (edict_t *self) +{ + GrabStuffOnTop (self); + VectorClear(self->velocity); + self->s.sound = 0; + self->nextthink = -1; + if (self->spawnflags & TRAIN_RESPAWNER) + { + InitiateRespawn(self); + G_FreeEdict(self); + } + + if ((self->spawnflags & TRAIN_DISAPPEAR) && !(self->spawnflags & TRAIN_RESPAWNER)) + { + G_FreeEdict(self); + } +} + +void train_deccel (edict_t *self) +{ + GrabStuffOnTop (self); + + float distanceLeft; + float thisDist; + float xdiff, ydiff; + float curSpeed; + vec3_t newVel; + + xdiff = self->s.origin[0] - self->volume; + ydiff = self->s.origin[1] - self->attenuation; + distanceLeft = sqrt(xdiff*xdiff + ydiff*ydiff ) - 167; // -167 due to removing the box from the trace + + curSpeed = sqrt(self->velocity[0]*self->velocity[0] + self->velocity[1]*self->velocity[1]); + thisDist = curSpeed * .1; + + if (curSpeed < 20) + { + newVel[0] = self->velocity[0] * (distanceLeft/thisDist); + newVel[1] = self->velocity[1] * (distanceLeft/thisDist); + newVel[2] = 0; + VectorCopy(newVel, self->velocity); + self->think = train_stop; + self->nextthink = level.time + .1; + return; + } + + newVel[0] = self->velocity[0] * (distanceLeft/((TRAIN_BRAKE_FACTOR+1)*thisDist)); + newVel[1] = self->velocity[1] * (distanceLeft/((TRAIN_BRAKE_FACTOR+1)*thisDist)); + newVel[2] = 0; + VectorCopy(newVel, self->velocity); + self->nextthink = level.time + .1; +} + +qboolean EndofLineCheck (edict_t *self) +{ + float distanceLeft; + float thisDist; + float xdiff, ydiff; + float curSpeed; + + xdiff = self->s.origin[0] - self->volume; + ydiff = self->s.origin[1] - self->attenuation; + distanceLeft = sqrt(xdiff*xdiff + ydiff*ydiff ) - 167; // -167 due to removing the box from the trace + + curSpeed = sqrt(self->velocity[0]*self->velocity[0] + self->velocity[1]*self->velocity[1]); + thisDist = curSpeed * .1; +// thisDist = curSpeed * .1; + + if (VectorCompare(vec3_origin, self->velocity)) + { + self->think = train_stop; + self->nextthink = level.time + .1; + return true; + } + + + if (self->spawnflags & TRAIN_DECCELERATE) + { + if (distanceLeft < (TRAIN_BRAKE_FACTOR*thisDist)) + { + vec3_t newVel; + + //adjust velocity then stop + newVel[0] = self->velocity[0] * (distanceLeft/((TRAIN_BRAKE_FACTOR+1)*thisDist)); + newVel[1] = self->velocity[1] * (distanceLeft/((TRAIN_BRAKE_FACTOR+1)*thisDist)); + newVel[2] = 0; + VectorCopy(newVel, self->velocity); + self->think = train_deccel; + self->nextthink = level.time + .1; + if (self->s.sound == gi.soundindex("Ambient/Locs/Subway/Train/Move.wav")) + { +// self->s.sound = 0; + // 9/13/99 kef -- Chia doesn't care for this sound +// gi.sound(self, CHAN_VOICE, gi.soundindex("Ambient/Locs/Subway/Train/Brake.wav"), .6, ATTN_NORM, 0); + } + return false; + } + else + { + return true; + } + } + else + { + if (distanceLeft < thisDist) + { + vec3_t newVel; + + //adjust velocity then stop + newVel[0] = self->velocity[0] * (distanceLeft/thisDist); + newVel[1] = self->velocity[1] * (distanceLeft/thisDist); + newVel[2] = 0; + VectorCopy(newVel, self->velocity); + self->think = train_stop; + self->nextthink = level.time + .1; + + if (self->s.sound == gi.soundindex("Ambient/Locs/Subway/Train/Move.wav") && !(self->spawnflags & TRAIN_RESPAWNER) && !(self->spawnflags & TRAIN_DISAPPEAR)) + { + self->s.sound = 0; + // 9/13/99 kef -- Chia doesn't care for this sound +// gi.sound(self, CHAN_VOICE, gi.soundindex("Ambient/Locs/Subway/Train/Brake.wav"), .6, ATTN_NORM, 0); + } + return false; + } + else + { + return true; + } + } +} + +void train_getlength (edict_t *self) +{ +#if 0 // kef -- moved to train_go to avoid problems with early tracing, namely + //if car1 spawns behind car2, car1's trace would hit car2 so car1 would + //never move beyond the initial position of car2 + trace_t trace; + vec3_t start, end, mins, maxs; + + + VectorCopy(self->s.origin,start); + VectorCopy(self->s.origin, end); + VectorSet(mins, -1, -1, -1); + VectorSet(maxs, 1, 1, 1); + end[0] += (-8000 * sin(self->s.angles[1] * DEGTORAD)); // maps are 8192 end to end at most + end[1] += (8000 * cos(self->s.angles[1] * DEGTORAD)); + start[2] += 40; + end[2] += 40; + gi.trace (start, NULL, NULL, end, self, self->clipmask, &trace); +// trace = gi.trace (self->s.origin, self->mins, self->maxs, end, self, self->clipmask); + self->volume = self->s.origin[0] + (-8000 * sin(self->s.angles[1] * DEGTORAD) * trace.fraction); // using for storage + self->attenuation = self->s.origin[1] + (8000 * cos(self->s.angles[1] * DEGTORAD) * trace.fraction); //using for storage +#endif + if (self->spawnflags & TRAIN_START_ACTIVE) + { + train_go(self, self, self); + } +} + + +void train_linecheck (edict_t *self) +{ + vec3_t sparkspot1, sparkdir; + int chance; + + + GrabStuffOnTop (self); + EndofLineCheck(self); + + chance = gi.irand(0,6); + if (!chance) + { + int xsign, ysign; + + + xsign = -1 + (gi.irand(0,1)*2); + ysign = -1 + (gi.irand(0,1)*2); + + VectorCopy(self->s.origin, sparkspot1); + // got these offsets from Bobby in Max + // + // x = 52 + // y = 80 + // z = -55 + VectorSet(sparkspot1, + self->s.origin[0] + (xsign * 52), + self->s.origin[1] + (ysign * 80), + self->s.origin[2] - 55); + FX_MakeSparks(sparkspot1, sparkdir, 0); + } + self->nextthink = level.time + .1; +} + +void train_accel (edict_t *self) +{ + /* potentially useful data: + this acceleration is 1000 units/s^2, which works out to 28.6 m/s^2, or 2.9g's! + uses 35 units/m + (+4 Geek, holy avenger) + */ + + vec3_t sparkspot1, sparkdir; + int chance; + + GrabStuffOnTop (self);//, velChange); + if ((double)(self->velocity[0]*self->velocity[0] + self->velocity[1]*self->velocity[1]) < (self->style*self->style)) + { + self->velocity[0] += (-1 * self->accel * sin(self->s.angles[1] * DEGTORAD)); + self->velocity[1] += (self->accel * cos(self->s.angles[1] * DEGTORAD)); + self->nextthink = level.time + .1; + } + else + { + self->think = train_linecheck; + self->nextthink = level.time + .1; + } + + chance = gi.irand(0,5); + if (!chance) + { + int xsign, ysign; + + + xsign = -1 + (gi.irand(0,2)*2); + ysign = -1 + (gi.irand(0,2)*2); + + VectorCopy(self->s.origin, sparkspot1); + VectorSet(sparkspot1, self->s.origin[0] - xsign * 54*cos(self->s.angles[1] * DEGTORAD) - ysign * 105*sin(self->s.angles[1]* DEGTORAD), + self->s.origin[1] - xsign * 54*sin(self->s.angles[1] * DEGTORAD) + ysign * 105*cos(self->s.angles[1]* DEGTORAD), self->s.origin[2]+15); + FX_MakeSparks(sparkspot1, sparkdir, 0); + } + EndofLineCheck(self); +} + +void train_go (edict_t *self, edict_t *other, edict_t *activator) +{ + int chance; + trace_t trace; + vec3_t start, end, mins, maxs; + + + // kef -- moved trace stuff here from train_getlength() + + // need to trace from the bottom of the train's bbox + VectorCopy(self->s.origin,start); + VectorCopy(self->s.origin, end); + VectorSet(mins, -1, -1, -1); + VectorSet(maxs, 1, 1, 1); + end[0] += (-8000 * sin(self->s.angles[1] * DEGTORAD)); // maps are 8192 end to end at most + end[1] += (8000 * cos(self->s.angles[1] * DEGTORAD)); + start[2] += 40; + end[2] += 40; + gi.trace (start, NULL, NULL, end, self, self->clipmask, &trace); +// trace = gi.trace (self->s.origin, self->mins, self->maxs, end, self, self->clipmask); + self->volume = self->s.origin[0] + (-8000 * sin(self->s.angles[1] * DEGTORAD) * trace.fraction); // using for storage + self->attenuation = self->s.origin[1] + (8000 * cos(self->s.angles[1] * DEGTORAD) * trace.fraction); //using for storage + + + // trains with facing 0 are "pointing" north (pos y) + GrabStuffOnTop (self); + self->velocity[0] = -1 * self->accel * sin(self->s.angles[1] * DEGTORAD); + self->velocity[1] = self->accel * cos(self->s.angles[1] * DEGTORAD); + self->friction = 0; + self->gravity = 0; + self->nextthink = level.time + .1; + self->think = train_accel; + self->use = NULL; + self->plUse = NULL; + + self->s.sound = gi.soundindex("Ambient/Locs/Subway/Train/Move.wav"); +// self->s.sound_data = (255 & ENT_VOL_MASK) | SND_FARATTN; + // 9/13/99 kef -- Chia wanted less attn + self->s.sound_data = (255 & ENT_VOL_MASK) | SND_FARATTN; + + chance = gi.irand(1,3); + if (chance==1) + gi.sound (self, CHAN_BODY, gi.soundindex ("Ambient/Locs/Subway/Train/Horn2.wav"), 1.0, ATTN_NORM, 0); + + EndofLineCheck(self); +} + +void train_smush (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t tempVel; + vec3_t goalFacing, right,holdPos; + float fDot; + + + if ( (other->client == NULL) && (other->takedamage == DAMAGE_NO) && (other != &g_edicts[0]) ) // Can't be hurt + { // yeah? well meet the irresistable force, baby + G_FreeEdict(other); +// Com_Printf("Tossed out other\n"); + return; + } + + if (VectorCompare(self->velocity, vec3_origin)) + { +// Com_Printf("Train not moving\n"); + return; + } + +// train stoppage debugging stuff +// vec3_t foo; +// VectorSubtract(self->s.origin, other->s.origin, foo); +// foo[2] = 0; +// float fLen = VectorLength(foo); + + float fDiff = (self->s.origin[2] + self->maxs[2]) - (other->s.origin[2] + other->mins[2]); + if (fDiff<= 0.0f) // above train + { +// Com_Printf("Above train return fDiff = %f, fLen = %f\n", fDiff, fLen); + return; + } + // Set point at front of train + AngleVectors(self->s.angles,NULL,right,NULL); + VectorMA(self->s.origin,165,right,holdPos); + + VectorSubtract(other->s.origin,holdPos,goalFacing); + VectorNormalize(goalFacing); + + AngleVectors(self->s.angles, right, NULL, NULL); + fDot = DotProduct(right, goalFacing); + + // Is other within range?????? + if ((fDot < .25) && (fDot > -.25)) + { // Bonk + bodyorganic_c* victimBody = NULL; + if (other->ai) + { // don't let the victim drop any boltons. they'll stop the train. + if (victimBody = ((bodyorganic_c*)((ai_c*)((ai_public_c*)other->ai))->GetBody()) ) + { + victimBody->CanDropBoltons(false); + } + } + gi.sound (self, CHAN_VOICE, gi.soundindex ("Ambient/Locs/Subway/Train/Impact.wav"), 1.0, ATTN_NORM, 0); + + T_Damage(other, self, self, tempVel, other->s.origin, other->s.origin, 9000, 1000, DAMAGE_NO_KNOCKBACK|DT_MANGLE, MOD_CRUSH); + } + else + { + Com_Printf("Failed fDot test %f\n", fDot); + } + + + +/* + VectorCopy(self->velocity, tempVel); + VectorNormalize(tempVel); + VectorScale(tempVel, 10, tempVel); + + // define a box of death. + killBox = G_Spawn(); + VectorSet(move, -164*sin(self->s.angles[1] * DEGTORAD), 164*cos(self->s.angles[1] * DEGTORAD) , 60); + VectorAdd(self->s.origin, move, killBox->s.origin); + VectorSet(killBox->mins, -54, 0, -58); + VectorSet(killBox->maxs, 54, 2, 58); + // box needs to be thin enough NOT to include the player(or colliding object) + //when it spawns, otherwise it will ignore that object during the trace... bad + VectorAdd(killBox->s.origin, tempVel, end); + VectorCopy(self->s.angles,killBox->s.angles); + killBox->solid = SOLID_NOT; + killBox->movetype = MOVETYPE_NONE; + killBox->owner = self; + BboxRotate(killBox); + + gi.trace (killBox->s.origin, killBox->mins, killBox->maxs, end, killBox, self->clipmask, &trace); + G_FreeEdict(killBox); + if (trace.fraction >= 1) + { + return; + } + T_Damage(trace.ent, self, self, tempVel, other->s.origin, other->s.origin, 99999, 1000, DAMAGE_NO_KNOCKBACK, 0); + */ +} + +void SP_misc_generic_train (edict_t *ent) +{ + char *skinname; + int holdspawn; + + VectorSet (ent->mins, -54, -164, -60); + VectorSet (ent->maxs, 55, 168, 60); + + switch (ent->s.skinnum) + { + case 1: + skinname = "train2"; + break; + case 2: + skinname = "train3"; + break; + case 3: + skinname = "train4"; + break; + default: + skinname = "train"; + break; + } + + ent->takedamage = DAMAGE_NO; + + holdspawn = ent->spawnflags; + ent->spawnflags = 0; + + if (!(ent->spawnflags & TRAIN_TRIGGERED) && !(ent->spawnflags & TRAIN_START_ACTIVE)) + ent->spawnflags |= SF_NOPUSH; + + if (ent->spawnflags & TRAIN_IDLE) + ent->s.sound = gi.soundindex("Ambient/Locs/Subway/Train/Idle.wav"); + + + SimpleModelInit2(ent,&genericModelData[OBJ_TRAIN],skinname,NULL); + ent->spawnflags = holdspawn; + + SetSkin(ent,genericModelData[OBJ_TRAIN].dir,genericModelData[OBJ_TRAIN].file, + genericModelData[OBJ_TRAIN].materialfile,skinname, 0); + + + switch (ent->s.skinnum) + { + case 1: + SimpleModelSetObject(ent,"TRAIN"); + SimpleModelRemoveObject(ent,"WORLD_OMNI"); + break; + case 2: + SimpleModelSetObject(ent,"TRAIN"); + SimpleModelRemoveObject(ent,"WORLD_OMNI"); + break; + case 3: + SimpleModelSetObject(ent,"TRAIN"); + SimpleModelRemoveObject(ent,"WORLD_OMNI"); + break; + default: + break; + } + + + if (ent->s.skinnum == 0) + { + SimpleModelAddBolt(ent,genericModelData[OBJ_TRAIN],"headlight1", + genericModelData[OBJ_LIGHT_BEAM],"to_headlight",NULL); + + SimpleModelAddBolt(ent,genericModelData[OBJ_TRAIN],"headlight2", + genericModelData[OBJ_LIGHT_BEAM],"to_headlight",NULL); + } + + if ((ent->spawnflags & TRAIN_TRIGGERED) || (ent->spawnflags & TRAIN_START_ACTIVE)) + { + ent->use = train_go; + ent->movetype = MOVETYPE_DAN; + ent->s.origin[2] += 1; // hack to avoid the sliding into floor brushes problem + ent->think = train_getlength; + ent->nextthink = level.time + .1; + ent->touch = train_smush; + ent->elasticity = -1; // trains should plow through anything in their path + ent->flags |= FL_NO_KNOCKBACK; + } + + if (ent->spawnflags & TRAIN_RESPAWNER) + { + ent->s.origin[2] -= 1; // hack to avoid the sliding into floor brushes problem + SetForRespawn(ent, SP_misc_generic_train, ent->wait); + ent->s.origin[2] += 1; // hack to avoid the sliding into floor brushes problem + } + + if (!ent->style) + { + ent->style = 600; + } + if (!ent->accel) + { + ent->accel = 100; + } + + gi.soundindex("Ambient/Locs/Subway/Train/Move.wav"); // precache sound + // 9/13/99 kef -- Chia doesn't care for this sound +// gi.soundindex("Ambient/Locs/Subway/Train/Brake.wav"); // precache sound + gi.soundindex ("Ambient/Locs/Subway/Train/Horn2.wav"); // precache sound + gi.soundindex ("Ambient/Locs/Subway/Train/Impact.wav"); // precache sound +} + +void ashtray_pain2 (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + FX_MakeRicochet(ent->s.origin); + Obj_painroll (ent,other,damage*ROLLMULT_TRASH_ASHTRAY,1); +} + +void ashtray_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + FX_MakeRicochet(ent->s.origin); + Obj_painflip (ent,other,damage*FLIPMULT_TRASH_ASHTRAY); + + Obj_tipover(ent,other,damage); + ent->pain = ashtray_pain2; +} + + +/*QUAKED misc_generic_trash_ashtray (1 .5 0) (-5 -4 -9) (5 4 9) INVULNERABLE NOPUSH x x x x FLUFF +A cylindrical ashtray/trashcan. Like what is placed outside Raven's entrance. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- fall over and roll around when shot +*/ +void SP_misc_generic_trash_ashtray (edict_t *ent) +{ + int i = 0; + + VectorSet (ent->mins, -5, -4, -9); + VectorSet (ent->maxs, 5, 4, 9); + ent->pain = ashtray_pain; + + SimpleModelInit2(ent,&genericModelData[OBJ_TRASH_ASHTRAY],NULL,NULL); + + // cache sound (CLSFX_RICOCHETS...CLSFX_RICOCHETS+NUM_RICOCHETSOUNDS-1) + for (i = 0; i < NUM_RICOCHETSOUNDS; i++) + { + entSoundsToCache[CLSFX_RICOCHETS+i] = 1; + } +} + + + +void trashcan_barrel_fall (edict_t *self) +{ + if ((self->s.angles[0] >= 85) || (self->s.angles[0] <= -85) || + (self->s.angles[2] >= 85) || (self->s.angles[2] <= -85)) + { + if (self->s.angles[0] >= 85) + { + self->s.angles[0] = 85; + } + if (self->s.angles[0] <= -85) + { + self->s.angles[0] = -85; + } + if (self->s.angles[2] >= 85) + { + self->s.angles[2] = 85; + } + if (self->s.angles[2] <= -85) + { + self->s.angles[2] = -85; + } + VectorClear(self->avelocity); + self->nextthink = 0; + return; + } + self->avelocity[0] *= 1.9; + self->avelocity[2] *= 1.9; + self->nextthink = level.time + .1; +} + +void trashcan_barrel_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t falldir; + vec3_t prelimavel; + float angle; + + VectorSubtract(self->s.origin, other->s.origin, falldir); + VectorNormalize(falldir); + angle = 360 - self->s.angle_diff; + while (angle >= 360) + { + angle -= 360; + } + angle *= DEGTORAD; + prelimavel[0] = falldir[0] * -70; + prelimavel[2] = falldir[1] * 70; + self->avelocity[0] = -1*(prelimavel[0] * cos(angle) + prelimavel[2] * sin(angle)); + self->avelocity[2] = -1*(prelimavel[2] * cos(angle) + prelimavel[0] * -1 * sin(angle)); + VectorClear(self->velocity); + self->velocity[2] = 120; + self->think = trashcan_barrel_fall; + self->nextthink = level.time + .1; + self->pain = NULL; +} + +/*QUAKED misc_generic_trashcan_barrel (1 .5 0) (-15 -16 -17) (15 16 22) INVULNERABLE NOPUSH x x x x FLUFF +Round steel trashcan with lid. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls over when shot +- spawns paper when shot +*/ + void SP_misc_generic_trashcan_barrel (edict_t *ent) +{ + + VectorSet (ent->mins, -15, -16, -17); + VectorSet (ent->maxs, 15, 16, 22); + + ent->pain = trashcan_barrel_pain; + + SimpleModelInit2(ent,&genericModelData[OBJ_TRASHCAN_BARREL],NULL,NULL); + ent->die = SpecialBecomeDebris; +} + +/*QUAK-ED misc_generic_tree_dead (1 .5 0) (-43 -43 -41) (40 67 110) INVULNERABLE NOPUSH x x x x FLUFF +Large (slightly taller than player) tree trunk +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_tree_dead (edict_t *ent) +{ + VectorSet (ent->mins, -43, -43, -41); + VectorSet (ent->maxs, 40, 67, 110); + + ent->die = G_Explode; + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&genericModelData[OBJ_TREE_DEAD],NULL,NULL); +} + +/*QUAKED misc_generic_tree_thin (1 .5 0) (-26 -15 -66) (25 16 96) INVULNERABLE NOPUSH x x x x FLUFF +Bare thin tree. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_tree_thin (edict_t *ent) +{ + + VectorSet (ent->mins, -26, -15, -66); + VectorSet (ent->maxs, 25, 16, 96); + + ent->die = G_Explode; + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&genericModelData[OBJ_TREE_THIN],NULL,NULL); +} + + +/*QUAKED misc_generic_truckcab (1 .5 0) (-91 -40 -49) (91 40 49) INVULNERABLE NOPUSH x x x x FLUFF +A cab for a tractor-trailer. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- explodes when shot +*/ +void SP_misc_generic_truckcab (edict_t *ent) +{ + VectorSet (ent->mins, -91, -40, -49); + VectorSet (ent->maxs, 91, 40, 49); + + ent->spawnflags |= SF_NOPUSH; + ent->die = G_Explode; + + SimpleModelInit2(ent,&genericModelData[OBJ_TRUCKCAB],NULL,NULL); +} + +void tv_die (edict_t *ent, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + vec3_t spray1; + eft_rotate_t *rotInfo = NULL; + vec3_t debrisNorm; + + // Throw some sparks + VectorSet(spray1, (rand()%21) - 10, (rand()%21) - 10, 0); + FX_MakeSparks(ent->s.origin, spray1, 1); + VectorSet(spray1, (rand()%21) - 10, (rand()%21) - 10, 0); + FX_MakeSparks(ent->s.origin, spray1, 1); + VectorSet(spray1, (rand()%41) - 20, (rand()%41) - 20, (gi.irand(5,10))); + FX_MakeSparks(ent->s.origin, spray1, 1); + + // Throw some chunks + FX_ThrowDebris(ent->s.origin,debrisNorm, 5,DEBRIS_SM, MAT_GLASS,0,0,0, SURF_GLASS); + + FX_MediumExplosion(ent->s.origin, 50, 1); + + BecomeDebris(ent,inflictor,attacker,damage,point); + +} + +void tv_touch(edict_t *ent, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + // when the tv drops off of the wall and hits something, have it spark and flip over + vec3_t spray1; + Matrix4 mat; + IGhoulInst *inst = NULL; + vec3_t debrisNorm; + + // Throw some sparks + VectorSet(spray1, (rand()%21) - 10, (rand()%21) - 10, 0); + FX_MakeSparks(ent->s.origin, spray1, 1); + + // Throw some chunks + VectorClear(debrisNorm); + FX_ThrowDebris(ent->s.origin,debrisNorm, 3,DEBRIS_SM, MAT_METAL_DGREY,0,0,0, SURF_METAL_COMPUTERS); + FX_ThrowDebris(ent->s.origin,debrisNorm, 5,DEBRIS_SM, MAT_GLASS,0,0,0, SURF_GLASS_COMPUTER); + FX_LittleExplosion(ent->s.origin, 200, 1); + + if (inst = SimpleModelGetBolt(ent, 1)) + { + // rotate to some absolute angle + inst->GetXForm(mat); + mat.Rotate(2, 1.58f); + inst->SetXForm(mat); + } + ent->spawnflags |= SF_NOPUSH; + ent->movetype = MOVETYPE_DAN; + + ent->touch = NULL; +} +void tv_pain2 (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t spray1, spray2; + + VectorSet(spray1, (rand()%21) - 10, (rand()%21) - 10, 0); + VectorSet(spray2, (rand()%21) - 10, (rand()%21) - 10, 0); + + FX_MakeSparks(self->s.origin, spray1, 1); + FX_MakeSparks(self->s.origin, spray2, 1); +} + +void tv_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t spray1, spray2; + vec3_t debrisNorm; + + VectorSet(spray1, (rand()%21) - 10, (rand()%21) - 10, 0); + VectorSet(spray2, (rand()%21) - 10, (rand()%21) - 10, 0); + + FX_MakeSparks(self->s.origin, spray1, 1); + FX_MakeSparks(self->s.origin, spray2, 1); + + if (strcmp(self->classname, "misc_generic_tv_ceiling") == 0 && + self->bouyancy) // just using bouyancy as a counter, really + { + // drop existing TV off the wall, turn off existing TV's supports + SimpleModelRemoveObject2(self->ghoulInst,"support1"); + SimpleModelRemoveObject2(self->ghoulInst,"support2"); + self->spawnflags ^= SF_NOPUSH; + self->movetype = MOVETYPE_DAN; + + // some chunks (those supports didn't just disappear, did they?) + VectorClear(debrisNorm); + FX_ThrowDebris(self->s.origin,debrisNorm, 3,DEBRIS_SM, MAT_METAL_DGREY,0,0,0, SURF_METAL); + + self->bouyancy = 0; + self->touch = tv_touch; + self->pain = tv_pain2; + gi.linkentity(self); + + // because the model is now rotated some (see tv_damaged_think) we should alter + //the bottom of the bbox accordingly + self->mins[2] += 9; + } +} + +void tv_damaged_think (edict_t *ent) +{ + vec3_t fwd,right, tvFwd, tvUp = {0,0,1}, tvPos, vDown = {0, 0, -1}; + vec3_t variance, angVel = {0,0,0}; + short length; + vec3_t holdPos; + Matrix4 matOld, matRot, matNew; + IGhoulInst* inst = NULL; + qboolean bSmoking = fxRunner.hasEffect("environ/normalsmoke", ent); + + if (ent->pain_debounce_time <= level.time && bSmoking) // Turn off the smoke and sparks? + { + fxRunner.stopContinualEffect("environ/normalsmoke", ent); + ent->s.sound = 0; + bSmoking = false; + } + + if (bSmoking) + { + AngleVectors(ent->s.angles,fwd,right,NULL); + } + + if (strcmp(ent->classname, "misc_generic_tv_ceiling") == 0) + { + if (inst = SimpleModelGetBolt(ent, 1) ) + { + // stop the rotation once the tv is pointed down + GetGhoulPosDir(ent->s.origin, ent->s.angles, inst, NULL, "face", tvPos, tvFwd, NULL, tvUp); + VectorCopy(tvFwd, fwd); + VectorNormalize(tvFwd); // ouch + if (DotProduct(vDown, tvFwd) < 0.90) + { + // it's not pointing down yet so rotate down some more + inst->GetXForm(matOld); + matRot.Rotate(2, 0.3f); + matNew.Concat(matOld, matRot); + inst->SetXForm(matNew); + } + else + { + ent->bouyancy = 1; + } + } + if (bSmoking) + { + VectorCopy(tvUp, variance); + VectorScale(variance, rand()%16 - 8, variance); + length = 20; + VectorMA(ent->s.origin,8,fwd,holdPos); + holdPos[2] -= 5; + VectorMA(holdPos,-7,right,holdPos); + VectorAdd(holdPos,variance,holdPos); + FX_MakeElectricArc(holdPos, length, right); + } + } + else + { + if (bSmoking) + { + VectorSet(variance, 0, 0, rand()%12 - 6); + length = 18; + VectorMA(ent->s.origin,8,fwd,holdPos); + VectorMA(holdPos,-6,right,holdPos); + VectorAdd(holdPos,variance,holdPos); + FX_MakeElectricArc(holdPos, length, right); + } + } + + ent->nextthink = level.time + .1; + +} + +void tv_ceiling_pain1 (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t spray1,holdPos; + vec3_t fwd,up; + vec3_t debrisNorm; + IGhoulInst *inst = NULL; + + // gotta remove the FACE and WORLD_LIGHT from the tv, which is bolted to the support + if (inst = SimpleModelGetBolt(ent, 1)) + { + SimpleModelRemoveObject2(inst,"FACE"); + SimpleModelRemoveObject2(inst,"WORLD_LIGHT"); + } + + AngleVectors(ent->s.angles,fwd,NULL,up); + + VectorMA(ent->s.origin,10,fwd,holdPos); + + // Throw some sparks + VectorSet(spray1, (rand()%21) - 10, (rand()%21) - 10, 0); + FX_MakeSparks(holdPos, spray1, 1); + VectorSet(spray1, (rand()%21) - 10, (rand()%21) - 10, 0); + FX_MakeSparks(holdPos, spray1, 1); + VectorSet(spray1, (rand()%41) - 20, (rand()%41) - 20, (gi.irand(5,10))); + FX_MakeSparks(holdPos, spray1, 1); + + // Throw some chunks + VectorClear(debrisNorm); + FX_ThrowDebris(holdPos,debrisNorm, 3,DEBRIS_SM, MAT_METAL_DGREY,0,0,0, SURF_METAL); + FX_ThrowDebris(holdPos,debrisNorm, 5,DEBRIS_SM, MAT_GLASS,0,0,0, SURF_GLASS); + + FX_LittleExplosion(holdPos, 100, 0); + + + gi.sound (ent, CHAN_VOICE, gi.soundindex("Impact/Glassbreak/Monitor.wav"), .6, ATTN_NORM, 0); + + ent->pain = tv_pain; + + ent->think = tv_damaged_think; + ent->nextthink = level.time; + + ent->pain_debounce_time = level.time + gi.flrand(6,12); // How long to smoke + ent->s.sound = gi.soundindex("Ambient/Gen/Electric/buzz.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + +} + +void tv_ceiling_sequence (edict_t *ent) +{ + IGhoulInst *inst = NULL; + if (inst = SimpleModelGetBolt(ent, 1)) + { + SimpleModelSetSequence2(inst,"tv",SMSEQ_LOOP); + } + ent->s.sound = gi.soundindex("Ambient/Models/Monitor/Static.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; +} + +void tv_ceiling_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + vec3_t wherehit = {0,0,0}; + + tv_ceiling_pain1 (ent,other, 0, 10,wherehit); +} + +// POSSIBLY : when shot drop to floor and explode +// NOTE: the bounding box for the tv_ceiling reflects the scaling factor of 1.5 + +/*QUAKED misc_generic_tv_ceiling (1 .5 0) (-18 -19 -22) (19 19 28) INVULNERABLE NOPUSH x x x x FLUFF +TV mounted from the ceiling. Has face of newcaster flashing on it. +Targeting with trigger makes it die +------ KEYS ------ +style : +0 - newscaster fading in and out +1 - bad guy symbol fading in and out +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls to ground when shot +- smokes and sparks when shot +*/ +void SP_misc_generic_tv_ceiling (edict_t *ent) +{ + VectorSet (ent->mins, -18, -19, -22); + VectorSet (ent->maxs, 19, 19, 28); + + ent->spawnflags |= SF_NOPUSH; + ent->pain = tv_ceiling_pain1; + ent->use = tv_ceiling_use; + ent->die = tv_die; + // need someplace to keep track of damage time + ent->bouyancy = 0.0f; + + SimpleModelInit2(ent,&genericModelData[OBJ_TV_CEILING_SUPPORT],NULL,NULL); + + SimpleModelAddBolt(ent,genericModelData[OBJ_TV_CEILING_SUPPORT],"DUMMY01", + genericModelData[OBJ_TV_CEILING],"DUMMY01",NULL); + + SimpleModelScale(ent,1.5f); + + ent->think = tv_ceiling_sequence; + ent->nextthink = level.time + .1 + ((rand() % 5) * .1); + + // cache sound CLSFX_EXP_SMALL, CLSFX_EXP_MEDIUM + entSoundsToCache[CLSFX_EXP_SMALL] = 1; + entSoundsToCache[CLSFX_EXP_MEDIUM] = 1; + // cache debris CLGHL_CHUNKGLASSSM, CLGHL_CHUNKMETALSM + entDebrisToCache[CLGHL_CHUNKGLASSSM] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKMETALSM] = DEBRIS_YES; + + gi.soundindex("Impact/Glassbreak/Monitor.wav"); // precache sound + gi.soundindex("Ambient/Gen/Electric/buzz.wav"); // precache sound + gi.soundindex("Ambient/Models/Monitor/Static.wav"); // precache sound + gi.effectindex("environ/normalsmoke"); + + if (ent->style == 1) + { + SetSkin(ent,genericModelData[OBJ_TV_CEILING].dir,genericModelData[OBJ_TV_CEILING].file, + genericModelData[OBJ_TV_CEILING].materialfile,"tv_br0", 1); + } +} + + +void tv_wall_pain1 (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t spray1; + vec3_t debrisNorm; + + ent->movetype = MOVETYPE_DAN; // Drop like a rock when shot + + // Remove the proper parts when damaged + if (ent->style == 0) // Monochrome screen + { + SimpleModelRemoveObject(ent,"FACE"); + + SimpleModelRemoveObject(ent,"WORLD_OMNI"); + } + else // Radar screen + { + SimpleModelRemoveObject(ent,"FACE2"); + + SimpleModelRemoveObject(ent,"FACE2B"); + + SimpleModelRemoveObject(ent,"FACE2C"); + + SimpleModelRemoveObject(ent,"FACE2D"); + + ent->s.sound = 0; + } + + // Damaged skin + SetSkin(ent,genericModelData[OBJ_TV_WALL].dir,genericModelData[OBJ_TV_WALL].file, + genericModelData[OBJ_TV_WALL].materialfile,"tv_wall_d", 0); + + // Throw some sparks + VectorSet(spray1, (rand()%21) - 10, (rand()%21) - 10, 0); + FX_MakeSparks(ent->s.origin, spray1, 1); + VectorSet(spray1, (rand()%21) - 10, (rand()%21) - 10, 0); + FX_MakeSparks(ent->s.origin, spray1, 1); + VectorSet(spray1, (rand()%41) - 20, (rand()%41) - 20, (gi.irand(5,10))); + FX_MakeSparks(ent->s.origin, spray1, 1); + + // Throw some chunks + VectorClear(debrisNorm); + FX_ThrowDebris(ent->s.origin,debrisNorm, 3,DEBRIS_SM, MAT_METAL_DGREY,0,0,0, SURF_METAL); + FX_ThrowDebris(ent->s.origin,debrisNorm, 5,DEBRIS_SM, MAT_GLASS,0,0,0, SURF_GLASS); + + FX_LittleExplosion(ent->s.origin, 100, 0); + + ent->pain_debounce_time = level.time + gi.flrand(6,12); // How long to smoke + + ent->pain = tv_pain; + + // drop off the wall + ent->spawnflags ^= SF_NOPUSH; + + ent->think = tv_damaged_think; + ent->nextthink = level.time; + + gi.sound (ent, CHAN_VOICE, gi.soundindex("Impact/Glassbreak/Monitor.wav"), .6, ATTN_NORM, 0); + + ent->s.sound = gi.soundindex("Ambient/Gen/Electric/buzz.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; +} + +void tv_wall_sequence (edict_t *ent) +{ + SimpleModelSetSequence(ent,"tv_wall",SMSEQ_LOOP); +} + +void tv_wall_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + vec3_t wherehit = {0,0,0}; + + tv_wall_pain1 (ent,other, 0, 10,wherehit); +} + + +// NOTE: the bounding box for the tv_wall reflects the scaling factor of 1.5 +/*QUAKED misc_generic_tv_wall (1 .5 0) (-5 -9 -9) (6 9 7) INVULNERABLE NOPUSH x x x x FLUFF +A wall-mounted TV. Has a scrolling monochrome screen +Targeting with trigger makes it die +------ KEYS ------ +style : +0 - monochrome screen +1 - radar screen +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls to floor when shot +- smokes and sparks when shot +*/ +void SP_misc_generic_tv_wall (edict_t *ent) +{ + VectorSet (ent->mins, -5, -9, -9); + VectorSet (ent->maxs, 6, 9, 7); + + ent->spawnflags |= SF_NOPUSH; + ent->pain = tv_wall_pain1; + ent->use = tv_wall_use; + ent->die = tv_die; + + SimpleModelInit2(ent,&genericModelData[OBJ_TV_WALL],NULL,NULL); + SetSkin(ent,genericModelData[OBJ_TV_WALL].dir,genericModelData[OBJ_TV_WALL].file, + genericModelData[OBJ_TV_WALL].materialfile,"tv_wall", 0); + + if (ent->style == 0) // Monochrome screen + { + SimpleModelRemoveObject(ent,"FACE2"); + + SimpleModelRemoveObject(ent,"FACE2B"); + + SimpleModelRemoveObject(ent,"FACE2C"); + + SimpleModelRemoveObject(ent,"FACE2D"); + } + else // Radar screen with grid + { + SimpleModelRemoveObject(ent,"FACE"); + + SimpleModelRemoveObject(ent,"WORLD_OMNI"); + + ent->s.sound = gi.soundindex("ambient/models/Panel/Panel1.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + + + SimpleModelScale(ent,1.5f); + + ent->think = tv_wall_sequence; + ent->nextthink = level.time + ((rand() % 5) * .1); + + // cache sound CLSFX_EXP_SMALL, CLSFX_EXP_MEDIUM + entSoundsToCache[CLSFX_EXP_SMALL] = 1; + entSoundsToCache[CLSFX_EXP_MEDIUM] = 1; + // cache debris CLGHL_CHUNKGLASSSM, CLGHL_CHUNKMETALSM + entDebrisToCache[CLGHL_CHUNKGLASSSM] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKMETALSM] = DEBRIS_YES; + + gi.soundindex("Impact/Glassbreak/Monitor.wav"); // precache sound + gi.soundindex("Ambient/Gen/Electric/buzz.wav"); // precache sound + gi.effectindex("environ/normalsmoke"); +} + + +void urinal_cookie_touch (edict_t *ent, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + // deal out a bit o' damage from flying urinal pucks + float speed = sqrt(ent->velocity[0] * ent->velocity[0] + ent->velocity[1] * ent->velocity[1] + + ent->velocity[2] * ent->velocity[2]); + if (( speed > 20) && (other->takedamage)) + { + T_Damage(other, ent, ent->owner, vec3_origin, ent->s.origin, ent->s.origin, int(sqrt(speed)*.1), 0, DT_PROJECTILE, 0); + } +} + +void urinal_cookie_think (edict_t *ent) +{ + ent->nextthink = 0; + G_FreeEdict(ent); +} + +void urinal_cookie_toss (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t accel = {0,0,-800}; + + if (level.time < self->pain_debounce_time) + return; + + + SetSkin(self,genericModelData[OBJ_URINAL].dir,genericModelData[OBJ_URINAL].file, + genericModelData[OBJ_URINAL].materialfile,"damaged", 0); + + self->think = toilet_dribble; + self->nextthink = level.time + .5; + + self->pain_debounce_time = level.time + gi.flrand (6,12); +} + +void urinal_die2(edict_t *self) +{ + // ObjBecomeDebris() only uses self and attacker, and it only uses the name of the attacker + //and even then it only uses it for debug messages + ObjBecomeDebris(self, NULL, self, 0, vec3_origin); + +} + +void urinal_create_water(edict_t *self) +{ + edict_t *water; + vec3_t forward; + + + water = G_Spawn(); + water->think = sink_spurt; + water->nextthink = level.time + .1; + VectorCopy(self->s.origin, water->s.origin); + + VectorCopy(self->s.angles, water->s.angles); + + AngleVectors(water->s.angles, forward, NULL, NULL); + + water->s.sound = gi.soundindex("Ambient/Gen/WtrFX/SprayBig.wav"); + water->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + + water->count = 10; + + gi.linkentity (water); +} + + +void urinal_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + urinal_create_water(self); + self->think = urinal_die2; + self->nextthink = level.time + .1f; +} + +void urinal_use (edict_t *self, edict_t *other, edict_t *activator) +{ + gi.sound (self, CHAN_BODY, gi.soundindex("Ambient/Models/Urinal/Flush.wav"), 1.0, ATTN_NORM, 0); +} + +/*QUAKED misc_generic_urinal (1 .5 0) (-6 -9 -11) (9 9 14) INVULNERABLE NOPUSH x x x x FLUFF +A urinal. +------ KEYS ------ +Skin : + 0 - dirty New York. (default) + 1 - clean Tokyo +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- throws out puck when shot +- produces water fountain when destroyed +*/ +void SP_misc_generic_urinal (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -6, -9, -11); + VectorSet (ent->maxs, 9, 9, 14); + + ent->spawnflags |= SF_NOPUSH; + + ent->pain = urinal_cookie_toss; + ent->use = urinal_use; // Use for trigger_uses + ent->plUse = urinal_use; // Use for when player pushes 'use' key + ent->die = urinal_die; + + switch (ent->s.skinnum) + { + case 1: + skinname = "urinal2"; //clean + break; + default: + skinname = "urinal"; //dirty + break; + } + + gi.soundindex("Ambient/Models/Urinal/Flush.wav"); + gi.soundindex("Ambient/Gen/WtrFX/SprayBig.wav"); + gi.effectindex("environ/k_waterspout3"); + + SimpleModelInit2(ent,&genericModelData[OBJ_URINAL],NULL,NULL); + SetSkin(ent,genericModelData[OBJ_URINAL].dir,genericModelData[OBJ_URINAL].file, + genericModelData[OBJ_URINAL].materialfile,skinname, 0); + ent->s.renderfx |= RF_LIGHT_FASTEST; + +} + + +/*QUAKED misc_generic_urinal_cake (1 .5 0) (-3 -3 -1) (3 3 1) INVULNERABLE NOPUSH x x x x FLUFF +A nice pink urinal cake. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_urinal_cake (edict_t *ent) +{ + VectorSet (ent->mins, -3, -3, -1); + VectorSet (ent->maxs, 3, 3, 1); + +// ent->pain = urinal_cookie_toss; + + SimpleModelInit2(ent,&genericModelData[OBJ_URINAL_CAKE],NULL,NULL); +} + +/*QUAKED misc_generic_urn (1 .5 0) (-16 -16 -14) (16 16 14) INVULNERABLE NOPUSH x x x x FLUFF +A fine looking urn. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_urn (edict_t *ent) +{ + VectorSet (ent->mins, -16, -16, -14); + VectorSet (ent->maxs, 16, 16, 14); + + SimpleModelInit2(ent,&genericModelData[OBJ_URN],NULL,NULL); +} + +void waste_pain2 (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + Obj_painroll (ent,other,damage*ROLLMULT_WASTE_BASKET,1); +} + +void waste_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + Obj_painflip (ent,other,damage*ROLLMULT_WASTE_BASKET); + + Obj_tipover(ent,other,damage); + ent->pain = waste_pain2; +} + +/*QUAKED misc_generic_waste_basket_wire (1 .5 0) (-6 -7 -7) (6 7 7) INVULNERABLE NOPUSH x x x x FLUFF +Small, circular wastebasket +------ KEYS ------ +Skin : + 0 - wire mesh. (default) + 1 - solid metal + 2 - rusty wire + 3 - rusty solid +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls over and rolls around when shot +*/ +void SP_misc_generic_waste_basket_wire (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -6, -7, -7); + VectorSet (ent->maxs, 6, 7, 7); + + ent->pain = waste_pain; + + switch (ent->s.skinnum) + { + case 1: + skinname = "waste_basket2"; + break; + case 2: + skinname = "waste_basket3"; + break; + case 3: + skinname = "waste_basket4"; + break; + default: + skinname = "waste_basket"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_WASTE_BASKET],skinname,NULL); + +} + + +/*QUAKED misc_generic_web_moss_animated (1 .5 0) (-4 -15 -10) (-1 15 10) INVULNERABLE NOPUSH NOANIMATE x x x FLUFF +moss/cobwebs blowing in the breeze +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +NOANIMATE - won't animate +FLUFF - won't show if gl_pictip is set +------ KEYS ------ +Skin : +0 - cobweb1 (default) +1 - cobweb2 +2 - moss1 +3 - moss2 +4 - bloodflap +*/ +void SP_misc_generic_web_moss_animated (edict_t *ent) +{ + char *skinname; + + ent->spawnflags |= SF_INVULNERABLE; + ent->spawnflags |= SF_NOPUSH; + + VectorSet (ent->mins, -4, -15, -10); + VectorSet (ent->maxs, -1, 15, 10); + + switch (ent->s.skinnum) + { + case 1: + skinname = "web2"; + break; + case 2: + skinname = "moss1"; + break; + case 3: + skinname = "moss2"; + break; + case 4: + skinname = "bloodflap1"; + break; + default: + skinname = "web1"; + break; + } + + SimpleModelInit2(ent,&genericModelData[OBJ_WEB_MOSS_ANIM],skinname,NULL); + +} + + +void wet_floor_fall (edict_t *self) +{ + if ((self->s.angles[0] >= 128) || (self->s.angles[0] <= -128) || + (self->s.angles[2] >= 90) || (self->s.angles[2] <= -90)) + { + if (self->s.angles[0] >= 128) + { + self->s.angles[0] = 128; + } + if (self->s.angles[0] <= -128) + { + self->s.angles[0] = -128; + } + if (self->s.angles[2] >= 90) + { + self->s.angles[2] = 90; + } + if (self->s.angles[2] <= -90) + { + self->s.angles[2] = -90; + } + VectorClear(self->avelocity); + self->nextthink = 0; + return; + } + self->avelocity[0] *= 1.5; + self->avelocity[2] *= 1.5; + self->health = 1; + self->nextthink = level.time + .1; +} + +void wet_floor_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t falldir; + vec3_t prelimavel; + float angle; + + VectorSubtract(self->s.origin, other->s.origin, falldir); + VectorNormalize(falldir); + angle = 360 - self->s.angle_diff; + angle = NormalizeAngle(angle); + angle *= DEGTORAD; + prelimavel[0] = falldir[0] * -70; + prelimavel[2] = falldir[1] * 70; + self->avelocity[0] = -1 * (prelimavel[0] * cos(angle) + prelimavel[2] * sin(angle)); + self->avelocity[2] = -1 * ( prelimavel[2] * cos(angle) + prelimavel[0] * -1 * sin(angle)); + VectorClear(self->velocity); + self->velocity[2] = 160; + self->think = wet_floor_fall; + self->nextthink = level.time + .1; + self->pain = NULL; +} + +/*QUAKED misc_generic_wet_floor_sign (1 .5 0) (-9 -8 -8) (9 8 8) INVULNERABLE NOPUSH x x x x FLUFF +A sign that says 'wet floor' +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- falls over when shot +*/ +void SP_misc_generic_wet_floor_sign (edict_t *ent) +{ + VectorSet (ent->mins, -9, -8, -8); + VectorSet (ent->maxs, 9, 8, 8); + + ent->pain = wet_floor_pain; + + SimpleModelInit2(ent,&genericModelData[OBJ_WETFLOOR_SIGN],NULL,NULL); +} + +/*QUAKED misc_generic_wpn_bat (1 .5 0) (-35 -33 55) (-31 3 60) INVULNERABLE NOPUSH x x x x FLUFF +A bat for cracking heads (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_wpn_bat (edict_t *ent) +{ + VectorSet (ent->mins, -35, -33, 55); + VectorSet (ent->maxs, -31, 3, 60); + + SimpleModelInit2(ent,&genericModelData[OBJ_WPN_BAT],NULL,NULL); + +} + +/*QUAKED misc_generic_wpn_desert_eagle (1 .5 0) (-42 -12 55) (-30 1 58) INVULNERABLE NOPUSH x x x x FLUFF +A weapon Desert Eagle (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_wpn_desert_eagle (edict_t *ent) +{ + VectorSet (ent->mins, -42, -12, 55); + VectorSet (ent->maxs, -30, 1, 58); + + SimpleModelInit2(ent,&genericModelData[OBJ_WPN_DESERT_EAGLE],NULL,NULL); + +} + +/*QUAKED misc_generic_wpn_glock (1 .5 0) (-40 -10 56) (-31 1 58) INVULNERABLE NOPUSH x x x x FLUFF +A weapon Glock (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_wpn_glock (edict_t *ent) +{ + VectorSet (ent->mins, -40, -10, 56); + VectorSet (ent->maxs, -31, 1, 58); + + SimpleModelInit2(ent,&genericModelData[OBJ_WPN_GLOCK],NULL,NULL); +} + +/*QUAKED misc_generic_wpn_ingram (1 .5 0) (-44 -13 55) (-27 2 59) INVULNERABLE NOPUSH x x x x FLUFF +A weapon Ingram (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_wpn_ingram (edict_t *ent) +{ + VectorSet (ent->mins, -44, -13, 55); + VectorSet (ent->maxs, -27, 2, 59); + + SimpleModelInit2(ent,&genericModelData[OBJ_WPN_INGRAM],NULL,NULL); +} + +/*QUAKED misc_generic_wpn_katana (1 .5 0) (-37 -42 54) (-30 9 61) INVULNERABLE NOPUSH x x x x FLUFF +A weapon Katana (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_wpn_katana (edict_t *ent) +{ + VectorSet (ent->mins, -37, -42, 54); + VectorSet (ent->maxs, -30, 9, 61); + + SimpleModelInit2(ent,&genericModelData[OBJ_WPN_KATANA],NULL,NULL); +} + +/*QUAKED misc_generic_wpn_minimi (1 .5 0) (-7 -2 -1) (29 7 3) INVULNERABLE NOPUSH x x x x FLUFF +A weapon Minimi (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_wpn_minimi (edict_t *ent) +{ + VectorSet (ent->mins, -7, -2, -1); + VectorSet (ent->maxs, 29, 7, 3); + + SimpleModelInit2(ent,&genericModelData[OBJ_WPN_MINIMI],NULL,NULL); +} + +/*QUAKED misc_generic_wpn_sig3000 (1 .5 0) (-60 -21 55) (-26 8 58) INVULNERABLE NOPUSH x x x x FLUFF +A weapon SIG3000 (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_wpn_sig3000 (edict_t *ent) +{ + VectorSet (ent->mins, -60, -21, 55); + VectorSet (ent->maxs, -26, 8, 58); + + SimpleModelInit2(ent,&genericModelData[OBJ_WPN_SIG3000],NULL,NULL); +} + +/*QUAKED misc_generic_wpn_spas12 (1 .5 0) (-60 -6 55) (-30 1 58) INVULNERABLE NOPUSH x x x x FLUFF +A weapon spas12 (not a pickup) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_generic_wpn_spas12 (edict_t *ent) +{ + VectorSet (ent->mins, -60, -6, 55); + VectorSet (ent->maxs, -30, 1, 58); + + SimpleModelInit2(ent,&genericModelData[OBJ_WPN_SPAS12],NULL,NULL); +} + +void generic_wpn_c4_use(edict_t *self, edict_t *other, edict_t *activator) +{ + if (self->spawnflags & C4_START_OFF) + { // at spawn time, this thing should be invisible, then become visible when "used" + SimpleModelTurnOnOff(self->ghoulInst, true); + } +} + +/*QUAKED misc_generic_wpn_c4 (1 .5 0) (-4 -2 -4) (3 2 4) INVULNERABLE NOPUSH START_OFF x x x +A c4 charge (not a pickup). No FLUFF flag cuz we'll probably only want it for a KOS1 cinematic. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +START_OFF - doesn't appear until used +*/ +void SP_misc_generic_wpn_c4 (edict_t *ent) +{ + VectorSet (ent->mins, -4, -2, -4); + VectorSet (ent->maxs, 3, 2, 4); + + SimpleModelInit2(ent,&genericModelData[OBJ_WPN_C4],NULL,NULL); + + if (ent->spawnflags & C4_START_OFF) + { // at spawn time, this thing should be invisible, then become visible when "used" + SimpleModelTurnOnOff(ent->ghoulInst, false); + } + ent->use = generic_wpn_c4_use; + ent->movetype = MOVETYPE_NONE; +} \ No newline at end of file diff --git a/Source/Game/gamecpp/g_ghoul.cpp b/Source/Game/gamecpp/g_ghoul.cpp new file mode 100644 index 0000000..d8a2f2b --- /dev/null +++ b/Source/Game/gamecpp/g_ghoul.cpp @@ -0,0 +1,1491 @@ +#include "g_local.h" +#include "..\qcommon\ef_flags.h" + +gameghoul_c game_ghoul; + +/////////////////////////////////////////////////////////////////// +// +// game_ghoul_boltinstance_c +// two real inworld things bolted together:the bolter is the +// only one considered a real instance, for now, to reduce complexity +// and because early tests seemed to indicate ghoul doesn't like it +// when bolter gets removed and boltee sticks around. still left +// this class in charge of destroying that instance, for possible flexibility. +/////////////////////////////////////////////////////////////////// + +ggBinstC::ggBinstC(ggBinstC *orig) +{ + bBoltedToOinst = orig->bBoltedToOinst; + bolter.MakeIndex(orig->bolter); + bolter2.MakeIndex(orig->bolter2); + + bolter_bolt = orig->bolter_bolt; + + scale = orig->scale; + + instance = NULL; + + bolt = orig->bolt; + sequence = orig->sequence; + object.MakeIndex(orig->object); +} + +void ggBinstC::Evaluate(ggBinstC *orig) +{ + bBoltedToOinst = orig->bBoltedToOinst; + bolter.MakePtr(*(int *)&orig->bolter); + bolter2.MakePtr(*(int *)&orig->bolter2); + bolter_bolt = orig->bolter_bolt; + scale = orig->scale; + bolt = orig->bolt; + sequence = orig->sequence; + object.MakePtr(*(int *)&orig->object); + + instance = LoadGhoulInst(object->GetMyObject(), object->GetName()); + // kef + if (bBoltedToOinst) + { + instance->SetUserData(bolter->GetInstEdict()); + bolter->GetInstPtr()->Bolt(bolter_bolt, instance, bolt); + bolter->AddBInst(this); + } + else + { + instance->SetUserData(bolter2->GetEdict()); + bolter2->GetInstPtr()->Bolt(bolter_bolt,instance,bolt); + bolter2->AddBInst(this); + } +} + +void ggBinstC::Read() +{ + char loaded[sizeof(ggBinstC)]; + + gi.ReadFromSavegame('GGBI', loaded + GGBINST_SAVE_START, sizeof(ggBinstC) - GGBINST_SAVE_START); + Evaluate((ggBinstC *)loaded); +} + +void ggBinstC::AddBInst(ggBinstC *ggbinst) +{ + bolts.PushBack(ggbinst); +} + +void ggBinstC::Write() +{ + ggBinstC *savable; + byte *save_start; + + savable = new ggBinstC(this); + save_start = (byte *)savable; + gi.AppendToSavegame('GGBI', save_start + GGBINST_SAVE_START, sizeof(*this) - GGBINST_SAVE_START); + savable->instance = NULL; + delete savable; + + if(instance) + { + SaveGhoulInst(instance, object->GetName()); + } +} + +void ggBinstC::ChangeOwnerTo(edict_t *newowner) +{ + List::Iter ibi; + int i; + assert(newowner); + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--) + { + (*ibi)->ChangeOwnerTo(newowner); + } + if (instance) + { + instance->SetUserData(newowner); + } +} + +ggBinstC::ggBinstC(ggOinstC *papa, GhoulID papaBolt, ggObjC *Obj, GhoulID Bolt, char *newskin, float newscale) +{ + bBoltedToOinst = true; + bolter = papa; + bolter_bolt = papaBolt; + + scale = newscale; + + Matrix4 oldM, scaleM, newM; + + bolt = Bolt; + sequence = NULL; + object = Obj; + if (!papa || !papaBolt || !Obj || !Bolt) + { + return; + } + instance = Obj->GetMyObject()->NewInst(); + instance->SetUserData(papa->GetInstEdict()); + + bolter->GetInstPtr()->Bolt(papaBolt,instance,Bolt); + + if (scale>1.00001||scale<0.99999) + { + instance->GetXForm(oldM); + scaleM.Identity(); + scaleM.Scale(scale); + newM.Concat(oldM,scaleM); + instance->SetXForm(newM); + } + + if (newskin) + { + GhoulID tempMat=0; + char matname[100]; + + strcpy(matname, Obj->GetSubName()); + + //fixme: this is slow, but allows various material names. + tempMat=Obj->GetMyObject()->FindMaterial(matname); + if (!tempMat) + { + tempMat=Obj->FindMaterialForSkin(newskin); + } + if (tempMat) + { + instance->SetFrameOverride(tempMat,newskin); + } + } +} + +ggBinstC::ggBinstC(ggBinstC *papa, GhoulID papaBolt, ggObjC *Obj, GhoulID Bolt, char *newskin, float newscale) +{ + bBoltedToOinst = false; + bolter2 = papa; + bolter_bolt = papaBolt; + + scale = newscale; + + Matrix4 oldM, scaleM, newM; + + bolt = Bolt; + sequence = NULL; + object = Obj; + if (!papa || !papaBolt || !Obj || !Bolt) + { + return; + } + instance = Obj->GetMyObject()->NewInst(); + instance->SetUserData(papa->GetEdict()); + + bolter2->GetInstPtr()->Bolt(papaBolt,instance,Bolt); + + if (scale>1.00001||scale<0.99999) + { + instance->GetXForm(oldM); + scaleM.Identity(); + scaleM.Scale(scale); + newM.Concat(oldM,scaleM); + instance->SetXForm(newM); + } + + if (newskin) + { + GhoulID tempMat=0; + char matname[100]; + + strcpy(matname, Obj->GetSubName()); + + //fixme: this is slow, but allows various material names. + tempMat=Obj->GetMyObject()->FindMaterial(matname); + if (!tempMat) + { + tempMat=Obj->FindMaterialForSkin(newskin); + } + if (tempMat) + { + instance->SetFrameOverride(tempMat,newskin); + } + } +} + +ggBinstC::~ggBinstC(void) +{ + List::Iter ibi; + // kef + for (ibi=bolts.Begin(); ibi != bolts.End(); ibi++) + { + (*ibi).Destroy(); + } + bolts.Erase(bolts.Begin(), bolts.End()); + + if (instance) + { + // kef + if (bBoltedToOinst) + { + if (bolter) + { + bolter->GetInstPtr()->UnBolt(instance); + } + } + else + { + if (bolter2) + { + bolter2->GetInstPtr()->UnBolt(instance); + } + } + instance->Destroy(); + } +} + +void ggBinstC::PlaySequence(GhoulID Seq,float Now,float PlayPos,bool Restart,IGhoulInst::EndCondition ec, bool MatchCurrentPos, bool reverseAnim) +{ + sequence = Seq; + if (sequence && instance) + { + instance->Play(Seq, Now, PlayPos, Restart, ec, MatchCurrentPos, reverseAnim); + } +} + +edict_t *ggBinstC::GetEdict(void) +{ + if (bBoltedToOinst) + { + if (bolter) + { + return bolter->GetInstEdict(); + } + } + else + { + if (bolter2) + { + return bolter2->GetEdict(); + } + } + return NULL; +} + +void ggBinstC::RemoveBolt(GhoulID bolted_to) +{ + List::Iter ibi; + List::Iter tibi; + int i; + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--) + { + tibi = ibi++; + if((* tibi)->GetBolterBolt()==bolted_to) + { + (*tibi).Destroy(); + bolts.Erase(tibi); + } + } +} + +void ggBinstC::StopAnimatingAtBolt(GhoulID mybolt) +{ + List::Iter ibi; + int i; + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--,ibi++) + { + if((*ibi)->GetBolterBolt()==mybolt) + { + (*ibi)->GetInstPtr()->Pause(level.time); + } + } +} + +void ggBinstC::StopAnimatingAtBolt(char *mybolt) +{ + List::Iter ibi; + int i; + GhoulID namedbolt=object->GetMyObject()->FindPart(mybolt); + if (namedbolt) + { + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--,ibi++) + { + if((*ibi)->GetBolterBolt()==namedbolt) + { + (*ibi)->GetInstPtr()->Pause(level.time); + } + } + } +} + +void ggBinstC::StopAnimatingAtAllBolts(void) +{ + List::Iter ibi; + int i; + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--,ibi++) + { + (*ibi)->GetInstPtr()->Pause(level.time); + } +} + +void ggBinstC::RemoveBoltInstance(ggBinstC *boltee) +{ + List::Iter ibi; + List::Iter tibi; + int i; + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--) + { + tibi = ibi++; + if((* tibi)==boltee) + { + (*tibi).Destroy(); + bolts.Erase(tibi); + } + } +} + +ggBinstC *ggBinstC::AddBoltInstance(GhoulID mybolt, ggObjC *babyObj, GhoulID babyBolt, char *boltskin, float newscale) +{ + gg_binst_c_ptr new_bolt; + gg_binst_c_ptr its_me=this; + + new_bolt = new ggBinstC(its_me, mybolt, babyObj, babyBolt, boltskin, newscale); + + bolts.PushBack(new_bolt); + + babyObj->RegistrationLock(); + + return new_bolt; +} + +ggBinstC *ggBinstC::GetBoltInstance(GhoulID mybolt) +{ + List::Iter ibi; + List::Iter tibi; + int i; + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--) + { + tibi = ibi++; + if((* tibi)->GetBolterBolt()==mybolt) + { + return (*tibi); + } + } + return NULL; +} + +ggBinstC *ggBinstC::FindBoltInstance(IGhoulInst * boltInst) +{ + List::Iter ibi; + List::Iter tibi; + int i; + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--) + { + tibi = ibi++; + if((* tibi)->GetInstPtr()==boltInst) + { + return (*tibi); + } + } + return NULL; +} + +////////////////////////////////////////////////////////////// +// +// ggOinstC +// an instance of an object--this is what you see in the game, an instance +// playing a sequence +////////////////////////////////////////////////////////////// + +ggOinstC::ggOinstC(ggOinstC *orig) +{ + TheInst = NULL; + *(int *)&my_edict = GetEdictNum(orig->my_edict); + my_obj.MakeIndex(orig->my_obj); + sequence = orig->sequence; +} + +void ggOinstC::Evaluate(ggOinstC *orig) +{ + my_edict = GetEdictPtr((int)orig->my_edict); + my_obj.MakePtr(*(int *)&orig->my_obj); + sequence = orig->sequence; + + TheInst = LoadGhoulInst(my_obj->GetMyObject(), my_obj->GetName()); + + TheInst->SetUserData(my_edict); + my_edict->ghoulInst = TheInst; + + my_obj->AddOInst(this, TheInst); +} + +void ggOinstC::Read() +{ + char loaded[sizeof(ggOinstC)]; + + gi.ReadFromSavegame('GGOI', loaded + GGOINSTC_SAVE_START, sizeof(ggOinstC) - GGOINSTC_SAVE_START); + Evaluate((ggOinstC *)loaded); +} + +void ggOinstC::Write() +{ + ggOinstC *savable; + byte *save_start; + List::Iter abolt; + gg_binst_c_ptr temp; + + savable = new ggOinstC(this); + save_start = (byte *)savable; + gi.AppendToSavegame('GGOI', save_start + GGOINSTC_SAVE_START, sizeof(*this) - GGOINSTC_SAVE_START); + savable->my_edict = NULL; + delete savable; + + if(TheInst) + { + SaveGhoulInst(TheInst, my_obj->GetName()); + } +} + +void ggOinstC::AddBInst(ggBinstC *ggbinst) +{ + bolts.PushBack(ggbinst); +} + +ggOinstC::ggOinstC(ggObjC *this_object, edict_t *whose) +{ + char temp[MAX_PATH]; + char name[GGHOUL_OBJ_NAME_LEN]; + char subclass[GGHOUL_OBJSUB_NAME_LEN]; + + if (this_object) + { + TheInst = this_object->GetMyObject()->NewInst(); + } + else + { + TheInst = NULL; + } + + if (!TheInst) + { + return; + } + sequence = 0; + +/* if(whose->ghoulInst) - this should be valid in the future, but at the moment it breaks weapon switching :( + { + whose->ghoulInst->Destroy(); + whose->ghoulInst = 0;//Is this safe? It would seem to be based on the test above... + //assert(0); + }*/ + + my_obj = this_object; + my_edict = whose; + if (whose) + { + my_edict->ghoulInst = TheInst; + my_edict->ghoulInst->SetUserData(my_edict); + } + + strcpy(name, this_object->GetName()); + strcpy(subclass, this_object->GetSubName()); + + Com_sprintf(temp, MAX_PATH, "%s_poff",subclass); + + gi.TurnOffPartsFromGSQFile(name, temp, this_object->GetMyObject(), TheInst); +} + +void ggOinstC::ChangeOwnerTo(edict_t *newowner) +{ + List::Iter ibi; + int i; + assert(newowner); + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--) + { + (*ibi)->ChangeOwnerTo(newowner); + } + if (my_edict) + { + my_edict->ghoulInst=NULL; + } + if (my_edict->client->ps.bod) + { + my_edict->client->ps.bod=NULL; + } + my_edict = newowner; + if (my_edict) + { + my_edict->ghoulInst = TheInst; + my_edict->ghoulInst->SetUserData(my_edict); + } +} + +ggOinstC::ggOinstC(ggObjC *this_object, edict_t *whose, IGhoulInst *clonedInst) +{ + char name[GGHOUL_OBJ_NAME_LEN]; + char subclass[GGHOUL_OBJSUB_NAME_LEN]; + + if (this_object && clonedInst) + { + TheInst = clonedInst->Clone(false); + } + else + { + TheInst = NULL; + } + + if (!TheInst) + { + return; + } + + sequence = 0; +/* if(whose->ghoulInst) - this should be valid in the future, but at the moment it breaks weapon switching :( + { + whose->ghoulInst->Destroy(); + whose->ghoulInst = 0;//Is this safe? It would seem to be based on the test above... + //assert(0); + }*/ + + my_obj = this_object; + my_edict = whose; + my_edict->ghoulInst = TheInst; + my_edict->ghoulInst->SetUserData(my_edict); + + strcpy(name, this_object->GetName()); + strcpy(subclass, this_object->GetSubName()); +} + +ggOinstC::~ggOinstC(void) +{ + List::Iter ibi; + List::Iter tibi; + int i; + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--) + { + tibi = ibi++; + (*tibi).Destroy(); + } + if (my_edict/* && my_edict->ghoulInst==TheInst*/) + { + my_edict->ghoulInst=0; + } + if (TheInst) + { + TheInst->Destroy(); + } +} + + +void ggOinstC::RemoveAllBolts(void) +{ + List::Iter ibi; + List::Iter tibi; + int i; + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--) + { + tibi = ibi++; + (*tibi).Destroy(); + bolts.Erase(tibi); + } +} + +void ggOinstC::RemoveBolt(GhoulID bolted_to) +{ + List::Iter ibi; + List::Iter tibi; + int i; + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--) + { + tibi = ibi++; + if((* tibi)->GetBolterBolt()==bolted_to) + { + (*tibi).Destroy(); + bolts.Erase(tibi); + } + } +} + +void ggOinstC::CopyBoltsTo(ggOinstC *recipient) +{ + List::Iter ibi; + ggBinstC *curBolt; + int i; + if (!recipient) + { + return; + } + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--) + { + curBolt = (*ibi); + if (curBolt) + { + ggObjC* boltObj=(*ibi)->GetBolteeObject(); + ggBinstC* newBolt; + newBolt=recipient->AddBoltInstance(curBolt->GetBolterBolt(), boltObj, curBolt->GetBolt(), /*char pointer for skin!*/NULL, curBolt->GetScale());\ + if (newBolt) + { + GhoulID tmat; + newBolt->PlaySequence(curBolt->GetSequence(), level.time);//looping or not? dunno!! + + //replicate all frame overrides! + for (tmat=boltObj->GetMyObject()->NumMaterials();tmat>0;tmat--) + { + if (curBolt->GetInstPtr()->GetFrameOverride(tmat)) + { + newBolt->GetInstPtr()->SetFrameOverride(tmat, curBolt->GetInstPtr()->GetFrameOverride(tmat)); + } + } + } + } + ibi++; + } +} + +void ggOinstC::StopAnimatingAtBolt(GhoulID mybolt) +{ + List::Iter ibi; + int i; + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--,ibi++) + { + if((*ibi)->GetBolterBolt()==mybolt) + { + (*ibi)->GetInstPtr()->Pause(level.time); + } + } +} + +void ggOinstC::StopAnimatingAtBolt(char *mybolt) +{ + List::Iter ibi; + int i; + GhoulID namedbolt=my_obj->GetMyObject()->FindPart(mybolt); + if (namedbolt) + { + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--,ibi++) + { + if((*ibi)->GetBolterBolt()==namedbolt) + { + (*ibi)->GetInstPtr()->Pause(level.time); + } + } + } +} + +void ggOinstC::StopAnimatingAtAllBolts(void) +{ + List::Iter ibi; + int i; + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--,ibi++) + { + (*ibi)->GetInstPtr()->Pause(level.time); + } +} + +void ggOinstC::RemoveBoltInstance(ggBinstC *boltee) +{ + List::Iter ibi; + List::Iter tibi; + int i; + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--) + { + tibi = ibi++; + if((* tibi)==boltee) + { + (*tibi).Destroy(); + bolts.Erase(tibi); + } + } +} + +ggBinstC *ggOinstC::AddBoltInstance(GhoulID mybolt, ggObjC *babyObj, GhoulID babyBolt, char *boltskin, float scale) +{ + gg_binst_c_ptr new_bolt; + gg_inst_c_ptr its_me=this; + + new_bolt = new ggBinstC(its_me, mybolt, babyObj, babyBolt, boltskin, scale); + + bolts.PushBack(new_bolt); + + babyObj->RegistrationLock(); + + return new_bolt; +} + +ggBinstC *ggOinstC::GetBoltInstance(GhoulID mybolt) +{ + List::Iter ibi; + List::Iter tibi; + int i; + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--) + { + tibi = ibi++; + if((* tibi)->GetBolterBolt()==mybolt) + { + return (*tibi); + } + } + return NULL; +} + +ggBinstC *ggOinstC::FindBoltInstance(IGhoulInst * boltInst) +{ + List::Iter ibi; + List::Iter tibi; + int i; + for (ibi=bolts.Begin(),i = bolts.Size();i>0;i--) + { + tibi = ibi++; + if((* tibi)->GetInstPtr()==boltInst) + { + return (*tibi); + } + } + return NULL; +} + +void ggOinstC::PlaySequence(GhoulID Seq,float Now,float PlayPos,bool Restart,IGhoulInst::EndCondition ec, bool MatchCurrentPos, bool reverseAnim) +{ + sequence = Seq; + if (Seq) + { + TheInst->Play(Seq, Now, PlayPos, Restart, ec, MatchCurrentPos, reverseAnim); + } +} + +void ggOinstC::SetEdictInst(void) +{ + if (my_edict) + { + my_edict->ghoulInst = TheInst; + } +} + + +///////////////////////////////////////////////////////// +//ghoul object +// the object, plus all of its parts, bolts, & seqs for reference +///////////////////////////////////////////////////////// + +ggObjC::ggObjC(ggObjC *orig) +{ + assert(orig->this_object); + + this_object = NULL; + registration_locked = orig->registration_locked; + register_all_skins = orig->register_all_skins; + + // Use strncpy to pad out the fields with nulls and to prevent any overflows + strncpy(name, orig->name, GGHOUL_OBJ_NAME_LEN); + strncpy(subname, orig->subname, GGHOUL_OBJSUB_NAME_LEN); + strncpy(skinname, orig->skinname, GGHOUL_OBJSUBSUB_NAME_LEN); + strncpy(basefile, orig->basefile, GGHOUL_OBJSUB_NAME_LEN); + + memcpy(availableSequences, orig->availableSequences, MAXIMUM_NUM_SEQUENCES); +} + +void ggObjC::Evaluate(ggObjC *orig) +{ + bool registration_locked_temp; + char temp[MAX_PATH]; + + this_object = NULL; + registration_locked = orig->registration_locked; + register_all_skins = orig->register_all_skins; + + // Use strncpy to pad out the fields with nulls and to prevent any overflows + strncpy(name, orig->name, GGHOUL_OBJ_NAME_LEN); + strncpy(subname, orig->subname, GGHOUL_OBJSUB_NAME_LEN); + strncpy(skinname, orig->skinname, GGHOUL_OBJSUBSUB_NAME_LEN); + strncpy(basefile, orig->basefile, GGHOUL_OBJSUB_NAME_LEN); + memcpy(availableSequences, orig->availableSequences, MAXIMUM_NUM_SEQUENCES); + registration_locked_temp = registration_locked; + registration_locked = false; + + // Reconstruct IGhoulObj (if it had one) + this_object = TheGhoul->NewObj(); + + if (basefile[0]) + { + Com_sprintf(temp, MAX_PATH, "ghoul/%s/%s.ghl", name, basefile); + this_object->RegisterSequence(temp); + } + gi.RegisterGSQSequences(name, subname, this_object); + + if(!register_all_skins) + { + int count, i; + char *mat, *skin; + + this_object->RegisterEverything(false); + + gi.ReadFromSavegame('GGON', &count, sizeof(count)); + for(i = 0; i < count / 2; i++) + { + gi.ReadFromSavegame('STRG', NULL, 0, (void **)&mat); + gi.ReadFromSavegame('STRG', NULL, 0, (void **)&skin); + + RegisterSkin(mat, skin); + + gi.TagFree((void *)mat); + gi.TagFree((void *)skin); + } + } + else + { + this_object->RegisterEverything(true); + } + registration_locked = registration_locked_temp; + + game_ghoul.AddObject(this_object, this); +} + +void ggObjC::Read() +{ + char loaded[sizeof(ggObjC)]; + + gi.ReadFromSavegame('GGOB', loaded + GGOBJC_SAVE_START, sizeof(ggObjC) - GGOBJC_SAVE_START); + Evaluate((ggObjC *)loaded); +} + +void ggObjC::Write() +{ + ggObjC *savable; + byte *save_start; + + savable = new ggObjC(this); + save_start = (byte *)savable; + gi.AppendToSavegame('GGOB', save_start + GGOBJC_SAVE_START, sizeof(*this) - GGOBJC_SAVE_START); + delete savable; + + if(!register_all_skins) + { + int count; + list::iterator it; + + count = registered_skins.size(); + gi.AppendToSavegame('GGON', &count, sizeof(count)); + + for(it = registered_skins.begin(); it != registered_skins.end(); it++) + { + gi.AppendToSavegame('STRG', (void *)(*it).c_str(), (*it).size() + 1); + } + } +} + +ggObjC::ggObjC(void) +{ + this_object = NULL; + registration_locked = false; + register_all_skins = false; +} + +ggObjC::ggObjC(const char* newname, const char* newsubname, bool allSkins, const char* newskinname, const char* newbasefile) +{ + // Make sure all strings are null + memset(availableSequences, 0, MAXIMUM_NUM_SEQUENCES); + memset(name, 0, GGHOUL_OBJ_NAME_LEN); + memset(subname, 0, GGHOUL_OBJSUB_NAME_LEN); + memset(skinname, 0, GGHOUL_OBJSUBSUB_NAME_LEN); + memset(basefile, 0, GGHOUL_OBJSUB_NAME_LEN); + + registration_locked = false; + register_all_skins = allSkins; + this_object = TheGhoul->NewObj(); + strcpy(name, newname); + strcpy(subname, newsubname); + + if (newskinname == NULL || newskinname[0]==0) + { + skinname[0]=0; + } + else + { + strcpy(skinname, newskinname); + } + + if (newbasefile == NULL || newbasefile[0]==0) + { + basefile[0]=0; + } + else + { + char temp[MAX_PATH]; + strcpy(basefile, newbasefile); + sprintf(temp, "ghoul/%s/%s.ghl", name, basefile); + this_object->RegisterSequence(temp); + } + //precache sequences according to name & subname. + + + gi.RegisterGSQSequences(name, subname, this_object); + + if (register_all_skins) + { + this_object->RegisterEverything(true); + + //registered everything, might as well lock it here + RegistrationLock(); + } + else + { + this_object->RegisterEverything(false); + +// if (skinname[0]) +// { +// RegisterSkin(skinname); +// } + } + + //this just sets up the ggSeqC list +// LoadSubClassSequences(subname); +} + +ggObjC::~ggObjC(void) +{ + map::iterator ii; + + for (ii=instances.begin();ii != instances.end(); ii++) + { + (*ii).second.Destroy(); + } + + if (this_object) + { + this_object->Destroy(); + } +} + +void ggObjC::RegistrationLock(void) +{ +// char temp[MAX_PATH]; + if (this_object && !registration_locked) + { +// This is no longer necessary, as we are creating an inst for the purpose of making a baseline +// Com_sprintf(temp, MAX_PATH, "%s_poff",subname); +// gi.PrecacheGSQFile(name, temp, this_object); + + ggOinstC *baseline=AddInstance(0); + this_object->PreCache(ghl_specular->value>0.0f&&ghl_light_method->value>0.0f); + RemoveInstance(baseline); + } + registration_locked = true; +} + +void ggObjC::RemoveInstances(edict_t *who) +{ + map::iterator iteri,tempi; + int i; + + if (!who->ghoulInst) + { + return; + } + + //fixme: if we can trust there's only one inst for an edict, just go through removeInstance(ggOinstC*) + for (iteri=instances.begin(),i=instances.size();i>0; i--) + { + tempi=iteri++; + if ((*tempi).second->GetInstEdict()==who) + { + (*tempi).second.Destroy(); + instances.erase(tempi); + } + } +} + +void ggObjC::RemoveInstances(void) +{ + map::iterator iteri,tempi; + int i; + //fixme: if we can trust there's only one inst for an edict, just go through removeInstance(ggOinstC*) + for (iteri=instances.begin(),i=instances.size();i>0; i--) + { + tempi=iteri++; + (*tempi).second.Destroy(); + instances.erase(tempi); + } +} + +void ggObjC::RemoveInstance(ggOinstC *inst) +{ + map::iterator iteri; + iteri=instances.find(inst->GetInstPtr()); + if (iteri!=instances.end()) + { + (*iteri).second.Destroy(); + instances.erase(iteri); + } +} + +ggOinstC *ggObjC::CloneInstance(edict_t *whose, IGhoulInst *clonedInst) +{ + gg_inst_c_ptr new_inst; + + new_inst = new ggOinstC(this, whose, clonedInst); + + //if sequence not available, forget it + if (new_inst->GetInstPtr() == NULL) + { + new_inst.Destroy(); + return NULL; + } + instances[new_inst->GetInstPtr()] = new_inst; + return new_inst; +} + +ggOinstC *ggObjC::AddInstance(edict_t *whose) +{ + gg_inst_c_ptr new_inst; + + new_inst = new ggOinstC(this, whose); + + //if sequence not available, forget it + if (new_inst->GetInstPtr() == NULL) + { + new_inst.Destroy(); + return NULL; + } + instances[new_inst->GetInstPtr()] = new_inst; + return new_inst; +} + +void ggObjC::AddOInst(ggOinstC *ggoinst, IGhoulInst *ghlinst) +{ + instances[ghlinst] = ggoinst; +} + +ggOinstC *ggObjC::FindOInst(IGhoulInst *findme) +{ + map::iterator iid; + ggOinstC *found_id=NULL; + + iid=instances.find(findme); + if (iid!=instances.end()) + { + found_id=(*iid).second; + } + return found_id; +} + + +GhoulID ggObjC::FindSequence(const char* seqname) +{ + char seqName[GGHOUL_OBJ_NAME_LEN]; + sprintf(seqName,"ghoul/%s/%s.ghl",name,seqname); + if (registration_locked) + { + return this_object->FindSequence(seqName); + } + gi.dprintf("Tried to find sequence %s before registration finished!\n", seqname); + return 0; +} + +GhoulID ggObjC::FindMaterialForSkin(char* findskinname) +{ + GhoulID curMat, maxMat; + maxMat=this_object->NumMaterials(); + for (curMat=1;curMat<=maxMat;curMat++) + { + if (this_object->FindSkin(curMat, findskinname)) + { + return curMat; + } + } + return 0; +} + +void ggObjC::SetEdictInsts(void) +{ + map::iterator ainst; + for (ainst = instances.begin(); ainst != instances.end();ainst++) + { + (*ainst).second->SetEdictInst(); + } +} + +GhoulID ggObjC::RegisterSkin(const char* matname, const char *regskinname) +{ + GhoulID matVal; + + matVal = this_object->FindMaterial(matname); + + //material's no good! + if (!matVal) + { + return 0; + } + + //i'm done registering, so sod off + if (registration_locked) + { + return this_object->FindSkin(matVal, regskinname); + } + registered_skins.push_back(matname); + registered_skins.push_back(regskinname); + + return this_object->RegisterSkin(matVal, regskinname); +} + +GhoulID ggObjC::RegisterSkin(const char *regskinname) +{ + GhoulID matVal,tSkin; + GhoulID maxMat; + char matname[MAX_OSPATH]; + + //i've got instances, so sod off + if (registration_locked) + { + return 0; + } + + maxMat = this_object->NumMaterials(); + for (matVal = 1; matVal <= maxMat; matVal++) + { + tSkin = this_object->RegisterSkin(matVal, regskinname); + this_object->GetMaterialName(matVal, matname); + + registered_skins.push_back(matname); + registered_skins.push_back(regskinname); + + if (tSkin) + { + return tSkin; + } + } + return 0; +} + +/////////////////////////////////////////////////////////////// +//game_ghoul_c +// list of all ghoul objects currently in use +/////////////////////////////////////////////////////////////// + +gameghoul_c::~gameghoul_c(void) +{ + map::iterator iob; + + for (iob = objects.begin(); iob != objects.end(); iob++) + { + (*iob).second->RemoveInstances(); + } + for (iob = objects.begin(); iob != objects.end(); iob++) + { + (*iob).second.Destroy(); + } +} + +ggOinstC *gameghoul_c::FindOInst(IGhoulInst *findme) +{ + map::iterator iid; + ggObjC *found_obj=NULL; + + //if the ghoul inst we're looking for is screwy (NULL or from a NULL Object), forget it. + if (!findme || !findme->GetGhoulObject()) + { + return NULL; + } + + iid=objects.find(findme->GetGhoulObject()); + if (iid!=objects.end()) + { + found_obj=(*iid).second; + } + + //if i didn't find the object, or it's NULL, forget it. + if (!found_obj) + { + return NULL; + } + + //use the object to find the inst + return found_obj->FindOInst(findme); +} + +//fixme: don't cleanup seqs, etc. that will be used in new level for leveltransitions +void gameghoul_c::LevelCleanUp(void) +{ + map::iterator iob; + + //get rid of all instances first + for(iob = objects.begin(); iob != objects.end(); iob++) + { + (*iob).second->RemoveInstances(); + } + while(objects.size()) + { + objects.begin()->second.Destroy(); + objects.erase(objects.begin()); + } + TheGhoul->DestroyAllObjects(); +} + +#include "ai_bodynoghoul.h" + +ggObjC *gameghoul_c::AddObject(const char* name, const char* subname, bool allSkins, const char *skinname, const char *basefile) +{ + gg_obj_c_ptr new_ob; + + new_ob = new ggObjC(name, subname, allSkins, skinname, basefile); + + //if object not available, forget it + if (new_ob->GetMyObject() == NULL) + { + new_ob.Destroy(); + return NULL; + } + + // oh dear + if(!strncmp(name, "enemy/meso", strlen("enemy/meso")) || + !strncmp(name, "enemy/ecto", strlen("enemy/ecto")) || + !strncmp(name, "enemy/female", strlen("enemy/female"))) + { + mmove_t *curMove = MMoves; + + while(*(curMove->ghoulSeqName)) + { + char seqName[GGHOUL_OBJ_NAME_LEN]; + Com_sprintf(seqName, GGHOUL_OBJ_NAME_LEN, "ghoul/%s/%s.ghl",new_ob->GetName(),curMove->ghoulSeqName); + if(new_ob->GetMyObject()->FindSequence(seqName)) + { + new_ob->SetSequenceAvailable(curMove - MMoves, 1); + } + else + { + new_ob->SetSequenceAvailable(curMove - MMoves, 0); + } + + curMove++; + } + } + else + { + new_ob->SetAllSequences(1); + } + + + objects[new_ob->GetMyObject()]=new_ob; + return new_ob; +} + +//set dontMakeNew to true if you only want an object that's already totally set up--to avoid caching stuff in the middle of a level +ggObjC *gameghoul_c::FindObject(const char* name, const char* subname, bool allSkins, const char *skinname, const char *basefile, bool dontMakeNew) +{ + map::iterator iob; + char *curSkinName; + char *curBaseFile; + + for (iob=objects.begin();iob != objects.end();iob++) + { + //not using index for main check--compare names + if (stricmp((*iob).second->GetName(),name)) + { + continue; + } + + //not using index for sub check--compare names + if (stricmp((*iob).second->GetSubName(),subname)) + { + continue; + } + + //wretched extra division to allow separate objects for simple objects + //safely assume that curSkinName is not NULL, no such assumption about skinname + curSkinName=(*iob).second->GetSkinName(); + if ((skinname&&stricmp(curSkinName,skinname))||(!skinname&&curSkinName[0])) + { + continue; + } + + //even more wretched extra extra division to allow separate objects for guys who look for the same seqs in different .ghb's + //--this allows us to cull out parts and sequences for specific levels' enemies, mainly for memory savings + //safely assume that curSkinName is not NULL, no such assumption about skinname + curBaseFile=(*iob).second->GetBaseFile(); + if ((basefile&&stricmp(curBaseFile,basefile))||(!basefile&&curBaseFile[0])) + { + continue; + } + + //the comparisons checked out, this object matches + return (*iob).second; + } + if (dontMakeNew)//not safe to make a new obj--probably not precached & not allowed + { + return NULL; + } + return AddObject(name, subname, allSkins, skinname, basefile); +} + +ggOinstC *gameghoul_c::AddObjectInstance(ggObjC *curObject, edict_t *whose) +{ + if (curObject) + { + return curObject->AddInstance(whose); + } + //object not found, return null + return NULL; +} + +//remove all instances associated with an entity--this is brute-force: instead start from edict's ghoulinst? +void gameghoul_c::RemoveObjectInstances(edict_t *who) +{ + map::iterator iob; + + if(!who) + { + return; + } + + for (iob=objects.begin();iob != objects.end();iob++) + { + (*iob).second->RemoveInstances(who); + } + + who->ghoulInst=NULL; +} + +void gameghoul_c::RemoveObjectInstances(ggOinstC *Oinst) +{ + Oinst->GetParentObject()->RemoveInstance(Oinst); +} + +GhoulID gameghoul_c::FindObjectSequence(ggObjC *curObject, const char* seqname) +{ + if (curObject) + { + return curObject->FindSequence(seqname); + } + //object not found, return nullid + return NULL; +} + +ggObjC *gameghoul_c::FindObject(IGhoulObj *curObject) +{ + map::iterator iob; + + iob = objects.find(curObject); + if (iob==objects.end()) + { + return NULL; + } + return (*iob).second; +} + + +void gameghoul_c::LevelPrecache(void) +{ + ggObjC *cacheObj; + cacheObj=FindObject("Enemy/bolt", "g_arm_torn_anim1"); + cacheObj=FindObject("Enemy/bolt", "g_bone_anim1"); + cacheObj=FindObject("Enemy/bolt", "g_brain"); + cacheObj=FindObject("Enemy/bolt", "g_cap1"); + cacheObj=FindObject("Enemy/bolt", "g_cap2"); + cacheObj=FindObject("Enemy/bolt", "g_cap3"); + cacheObj=FindObject("Enemy/bolt", "g_exit_chunky_anim1"); + cacheObj=FindObject("Enemy/bolt", "guts_bolton"); + cacheObj=FindObject("Enemy/bolt", "g_exit_lrg"); + cacheObj=FindObject("Enemy/bolt", "g_exit_smll"); + cacheObj=FindObject("Enemy/bolt", "g_guts"); + cacheObj=FindObject("Enemy/bolt", "g_guts3"); + cacheObj=FindObject("Enemy/bolt", "g_neck_torn_anim2"); +} + +ggBinstC *gameghoul_c::AddBoltInstance(ggOinstC *bolter, GhoulID bolterBolt, ggObjC *boltee, GhoulID bolteeBolt, GhoulID bolteeSeq, char *boltskin, float scale) +{ + ggBinstC *new_bolt = NULL; + + if (boltee&&bolterBolt&&bolteeBolt&&bolteeSeq) + { + new_bolt = bolter->AddBoltInstance(bolterBolt, boltee, bolteeBolt, boltskin, scale); + if (new_bolt) + { + new_bolt->PlaySequence(bolteeSeq,level.time,0.0,true,IGhoulInst::Loop,false,false); + } + } + else + { + gi.dprintf("Unable to add bolt on!\n"); + } + return new_bolt; +} + +ggBinstC *gameghoul_c::AddBoltInstance(ggOinstC *bolter, GhoulID bolterBolt, ggObjC *boltee, GhoulID bolteeBolt, char *boltskin, float scale) +{ + ggBinstC *new_bolt = NULL; + + if (boltee&&bolterBolt&&bolteeBolt) + { + new_bolt = bolter->AddBoltInstance(bolterBolt, boltee, bolteeBolt, boltskin, scale); + } + else + { + gi.dprintf("Unable to add bolt on!\n"); + } + return new_bolt; +} + +void gameghoul_c::SetSimpleGhoulModel(edict_t *ent, const char* dirname, const char *seqname, const char *skinname, const char *matname) +{ + ggObjC *simpObj; + GhoulID simpSeq; + ggOinstC *simpInst; + char subclassname[GGHOUL_OBJSUB_NAME_LEN]; +// char tempseqname[GGHOUL_ID_NAME_LEN]; + + if (ent->ghoulInst || (ent->s.renderfx&RF_GHOUL)) + { +// gi.dprintf("Entity already has ghoul properties--SetSimpleGhoulModel aborting!\n"); + return; + } + +// sprintf(subclassname,"simple%s",seqname); + strcpy(subclassname,seqname); + if (skinname && skinname[0] && matname && matname[0]) + { + simpObj = FindObject(dirname, subclassname, false, skinname); + simpObj->RegisterSkin(matname, skinname); + } + //no skinname specified--register all skins + else + { + simpObj = FindObject(dirname, subclassname); + } + if (!simpObj) + { + gi.dprintf("SetSimpleGhoulModel couldn't create ghoul object %s/%s.\n", dirname, subclassname); + return; + } + + simpObj->RegistrationLock(); + + simpSeq = simpObj->FindSequence(seqname);//true); + if (!simpSeq) + { + //sequence not there already--register it +// if (dirname[0]==0) +// { +// sprintf(tempseqname,"Ghoul/%s.GHL",seqname); +// } +// else +// { +// sprintf(tempseqname,"Ghoul/%s/%s.GHL",dirname,seqname); +// } +// simpObj->GetMyObject()->RegisterSequence(tempseqname); +// simpSeq = simpObj->FindSequence(seqname, true); +// if (!simpSeq) +// { + gi.dprintf("SetSimpleGhoulModel couldn't find ghoul sequence %s.\n",seqname); + return; +// } + } + + simpInst = simpObj->AddInstance(ent); + if (!simpInst) + { + gi.dprintf("SetSimpleGhoulModel couldn't add instance of ghoul object %s.\n",dirname); + return; + } + + ent->ghoulInst = simpInst->GetInstPtr(); + ent->s.renderfx = RF_GHOUL; + simpInst->PlaySequence(simpSeq, level.time); + + //tried to get gview to not loop (for testing) with this... no luck (!) +// simpInst->PlaySequence(simpSeq, level.time, true, IGhoulInst::Hold); +} + +void gameghoul_c::AddObject(IGhoulObj *ghlobj, ggObjC *ggobjc) +{ + objects[ghlobj] = ggobjc; +} diff --git a/Source/Game/gamecpp/g_ghoul.h b/Source/Game/gamecpp/g_ghoul.h new file mode 100644 index 0000000..616b5ce --- /dev/null +++ b/Source/Game/gamecpp/g_ghoul.h @@ -0,0 +1,319 @@ +//g_ghoul +//manager for ghoul animations: alloc, dealloc and dole out to edicts that need seqs +#ifndef _G_GHOUL_H +#define _G_GHOUL_H +#include "string.h" + +#define GGHOUL_OBJ_NAME_LEN 100 +#define GGHOUL_OBJSUB_NAME_LEN 100 +#define GGHOUL_OBJSUBSUB_NAME_LEN 100 + +//needed for the quickening of verifysequence - hopefully this should be more than enough, though +#define MAXIMUM_NUM_SEQUENCES 1024 + + +//yech. fixme--find a good home for this stuff. +typedef struct +{ + int flags; + float dist; + int yaw; +} mframe_t; + +typedef enum +{ +BBOX_PRESET_STAND, +BBOX_PRESET_CROUCH, +BBOX_PRESET_PRONE, +BBOX_PRESET_ALLFOURS, +BBOX_PRESET_SIT, +BBOX_PRESET_LAYFRONT, +BBOX_PRESET_LAYBACK, +BBOX_PRESET_LAYSIDE, +BBOX_PRESET_NONE, +BBOX_PRESET_NUMBER +} bbox_preset; + +typedef enum +{ + ACTCODE_STAND, + ACTCODE_MOVE, + ACTCODE_ATTACK, + ACTCODE_JUMP, + ACTCODE_FALL, + ACTCODE_PAIN, + ACTCODE_DEATH, + ACTCODE_DODGE, + ACTCODE_SCRIPTRELEASE +} action_code; + +typedef enum +{ + BODYPOS_UNKNOWN,//standard body positioning, or just plain unknown + BODYPOS_AIMWALK,//walking forward, back, or strafing while aiming a gun + BODYPOS_BLINDED,//help! i'm blind! + BODYPOS_IDLE, //just standing around, thinkin everything's ok + BODYPOS_RLEGHURT, //right leg injured, stick with that sort of anim + BODYPOS_LLEGHURT, //left leg injured, stick with that sort of anim + BODYPOS_WALKTURN, + BODYPOS_PLAYERLEANRIGHT, + BODYPOS_PLAYERLEANLEFT, + BODYPOS_TALKING, +} bodypos_t; + +typedef struct mmove_s +{ + //ghoul monsters + char ghoulSeqName[GGHOUL_ID_NAME_LEN]; + + action_code suggested_action; + //ghoul and reglar + float velScale; + float maxTurn; + float minTurn; + int actionFlags;//denotes what kind of action this anim can be associated with, provides easy way to let action know what state i end up in + bbox_preset bbox; + float playPos; // where the animation starts playing. (0...1), usually 0. + bodypos_t bodyPosition; //extra classification for the sequence so i can make a guess to what it'll transition well with +} mmove_t; +#include "pt_listpointer.h" + +class ggOinstC; +class ggObjC; + +class ggBinstC +{ +private: + List bolts; +#define GGBINST_SAVE_START offsetof(ggBinstC, bBoltedToOinst) + // kef + bool bBoltedToOinst; // am I bolted to a ggOinstC (as opposed to a ggBinstC)? + gg_binst_c_ptr bolter2; // the ggBinstC to which I'm bolted (NULL if bBoltedToOinst == true) + + //this is for keeping track of who i'm bolted to + gg_inst_c_ptr bolter; + GhoulID bolter_bolt; + + //this is the important stuff--i'm responsible for this. + IGhoulInst *instance; + GhoulID bolt; + GhoulID sequence; + gg_obj_c_ptr object; + + float scale; + +public: + ggBinstC(ggOinstC *papa, GhoulID papabolt, ggObjC *babyObj, GhoulID babyBolt, char *newskin=NULL, float newscale = 1.0); + ggBinstC(ggBinstC *papa, GhoulID papabolt, ggObjC *babyObj, GhoulID babyBolt, char *newskin=NULL, float newscale = 1.0); + ggBinstC(void){instance=NULL; bBoltedToOinst = true;} + ~ggBinstC(void); + + virtual int GetClassCode(void){return 0;}//this should be different for everybody in this class family +static ggBinstC *NewClassForCode(int code){return new ggBinstC;} + + IGhoulInst *GetInstPtr(void){return instance;} + ggObjC *GetBolteeObject(void){return object;} + ggOinstC *GetBolter(void){if (bBoltedToOinst) return bolter; else return NULL;} + GhoulID GetSequence(void){return sequence;} + GhoulID GetBolt(void){return bolt;} + float GetScale(void){return scale;} + + void ChangeOwnerTo(edict_t *newowner); + + GhoulID GetBolterBolt(void){return bolter_bolt;} + void PlaySequence(GhoulID Seq,float Now,float PlayPos=0.0f,bool Restart=true, + IGhoulInst::EndCondition ec=IGhoulInst::Loop, bool MatchCurrentPos=false, + bool reverseAnim=false); + + // kef + ggBinstC *GetBolter2(void){if (bBoltedToOinst) return NULL; else return bolter2;} + edict_t *GetEdict(void); + bool IsBoltedToOinst(void) { return bBoltedToOinst; } + ggBinstC *AddBoltInstance(GhoulID mybolt, ggObjC *babyObj, GhoulID babybolt, char *boltskin=NULL, float newscale = 1.0); + ggBinstC *GetBoltInstance(GhoulID mybolt); + void StopAnimatingAtBolt(GhoulID mybolt); + void StopAnimatingAtBolt(char *mybolt); + void StopAnimatingAtAllBolts(void); + ggBinstC *FindBoltInstance(IGhoulInst *boltInst); + void RemoveBolt(GhoulID bolted_to); + void RemoveBoltInstance(ggBinstC *boltee); + + ggBinstC(ggBinstC *orig); + void Evaluate(ggBinstC *orig); + virtual void Write(); + virtual void Read(); + void AddBInst(ggBinstC *ggbinst); +}; + +class ggOinstC +{ +private: + List bolts; +#define GGOINSTC_SAVE_START offsetof(ggOinstC, TheInst) + IGhoulInst *TheInst; + edict_t *my_edict; + gg_obj_c_ptr my_obj; + GhoulID sequence; +public: + ggOinstC(ggObjC *this_object, edict_t *whose, IGhoulInst *clonedInst); + ggOinstC(ggObjC *this_object, edict_t *whose); + ggOinstC(void){my_edict = NULL; TheInst = NULL;} + ~ggOinstC(void); + ggBinstC *AddBoltInstance(GhoulID mybolt, ggObjC *babyObj, GhoulID babybolt, char *boltskin=NULL, float scale = 1.0); + ggBinstC *GetBoltInstance(GhoulID mybolt); + void AddBInst(ggBinstC *ggbinst); + + void StopAnimatingAtBolt(GhoulID mybolt); + void StopAnimatingAtBolt(char *mybolt); + void StopAnimatingAtAllBolts(void); + + void ChangeOwnerTo(edict_t *newowner); + + void CopyBoltsTo(ggOinstC *recipient); + + ggBinstC *FindBoltInstance(IGhoulInst *boltInst); + + void RemoveBolt(GhoulID bolted_to); + void RemoveAllBolts(void); + void RemoveBoltInstance(ggBinstC *boltee); + + IGhoulInst *GetInstPtr(void){return TheInst;} + edict_t *GetInstEdict(void){return my_edict;} + ggObjC *GetParentObject(void){return my_obj;} + void PlaySequence(GhoulID Seq,float Now,float PlayPos=0.0f,bool Restart=true, + IGhoulInst::EndCondition ec=IGhoulInst::Loop, bool MatchCurrentPos=false, + bool reverseAnim=false); + + void SetEdictInst(void); + + void ClearMyEdict(void){my_edict = NULL;} + + virtual int GetClassCode(void){return 0;}//this should be different for everybody in this class family +static ggOinstC *NewClassForCode(int code){return new ggOinstC;} + + ggOinstC(ggOinstC *orig); + void Evaluate(ggOinstC *orig); + virtual void Write(); + virtual void Read(); +}; + +///////////////////////////////////////////////////////// +//ghoul object +///////////////////////////////////////////////////////// +class ggObjC +{ +private: + map instances; + list registered_skins; +#define GGOBJC_SAVE_START offsetof(ggObjC, this_object) + IGhoulObj *this_object; + bool registration_locked; + bool register_all_skins; + + char availableSequences[MAXIMUM_NUM_SEQUENCES];//don't feel like making this dynamic + + char name[GGHOUL_OBJ_NAME_LEN]; + char subname[GGHOUL_OBJSUB_NAME_LEN]; + + //for simple models: this will be the only skin to register! + char skinname[GGHOUL_OBJSUBSUB_NAME_LEN]; + char basefile[GGHOUL_OBJSUB_NAME_LEN]; + +public: + ggObjC(void); + ggObjC(const char* newname, const char* newsubname, bool allSkins, const char* newskinname, const char* newbasefile); + ~ggObjC(void); + + virtual int GetClassCode(void){return 0;}//this should be different for everybody in this class family +static ggObjC *NewClassForCode(int code){return new ggObjC;} + +//returns the ghoul object + IGhoulObj *GetMyObject(void){return this_object;} + +//get the name associated with this object--this will be the directory that sequences are looked for in + char *GetName(void){return name;} + char *GetSubName(void){return subname;} + char *GetSkinName(void){return skinname;} + char *GetBaseFile(void){return basefile;} + + //set all edict insts so they're right. + void SetEdictInsts(void); + + bool IsRegistrationLocked(void){return registration_locked;} + + GhoulID FindSequence(const char* seqname); + GhoulID FindMaterialForSkin(char *findskinname); + ggOinstC *FindOInst(IGhoulInst *findme); + + + GhoulID RegisterPart(const char* partname){return this_object->RegisterPart(partname);} + GhoulID RegisterSequence(const char* seqname){return this_object->RegisterSequence(seqname);} + GhoulID RegisterMaterial(const char* matname){return this_object->RegisterMaterial(matname);} + GhoulID RegisterSkin(const char* matname, const char *regskinname); + GhoulID RegisterSkin(const char *regskinname); + + void RegistrationLock(void); + + ggOinstC *AddInstance(edict_t *whose); + ggOinstC *CloneInstance(edict_t *whose, IGhoulInst *clonedInst); + void AddOInst(ggOinstC *ggoinst, IGhoulInst *ghlinst); + void RemoveInstances(void); + void RemoveInstances(edict_t *who); + void RemoveInstance(ggOinstC *inst); + + void SetSequenceAvailable(int seq, int val){availableSequences[seq] = val;} + int IsSequenceAvailable(int seq){return availableSequences[seq];} + void SetAllSequences(int val){memset(availableSequences, val, MAXIMUM_NUM_SEQUENCES);} + + ggObjC(ggObjC *orig); + void Evaluate(ggObjC *orig); +virtual void Write(); +virtual void Read(); +}; + +class gameghoul_c +{ +private: + map objects; + ggObjC *AddObject(const char* name, const char* subname, bool allSkins, const char *skinname, const char *basefile); + +public: + gameghoul_c(void){} + ~gameghoul_c(void); + + //load all the objects that may be seen on current level + void LevelPrecache(void); + //dealloc objects? + void LevelCleanUp(void); + +//returns the ghoul object designated by name--allocate if necessary + ggObjC *FindObject(IGhoulObj *curObject); + + //set dontMakeNew to true if you only want an object that's already totally set up--to avoid caching stuff in the middle of a level + ggObjC *FindObject(const char* name, const char* subname, bool allSkins=true, const char *skinname=NULL, const char *basefile=NULL, bool dontMakeNew=false); + void AddObject(IGhoulObj *ghlobj, ggObjC *ggobjc); + + ggOinstC *FindOInst(IGhoulInst *findme); + +//get ghoul id for seq, part or bolt attached to object + GhoulID FindObjectSequence(ggObjC *curObject, const char* seqname); + + ggOinstC *AddObjectInstance(ggObjC *curObject, edict_t *whose); + void RemoveObjectInstances(edict_t *who); + void RemoveObjectInstances(ggOinstC *Oinst); + + ggBinstC *AddBoltInstance(ggOinstC *bolter, GhoulID bolterBolt, ggObjC *boltee, GhoulID bolteeBolt, GhoulID bolteeSeq, char *boltskin=NULL, float scale = 1.0); + ggBinstC *AddBoltInstance(ggOinstC *bolter, GhoulID bolterBolt, ggObjC *boltee, GhoulID bolteeBolt, char *boltskin=NULL, float scale = 1.0); + + // kef + void AddBoltInstance(ggBinstC *bolter, GhoulID bolterBolt, ggObjC *boltee, GhoulID bolteeBolt, GhoulID bolteeSeq, char *boltskin=NULL, float scale = 1.0); + void AddBoltInstance(ggBinstC *bolter, GhoulID bolterBolt, ggObjC *boltee, GhoulID bolteeBolt, char *boltskin=NULL, float scale = 1.0); + + //this is to be used only for simple things that will have one sequence that can be expected to handle itself + //if you pass in a skinname, it will be the ONLY skin loaded for the model! + void SetSimpleGhoulModel(edict_t *ent, const char* dirname, const char *seqname, const char *skinname=NULL, const char *matname=NULL); +}; + +extern gameghoul_c game_ghoul; + +#endif _G_GHOUL_H \ No newline at end of file diff --git a/Source/Game/gamecpp/g_iraq.cpp b/Source/Game/gamecpp/g_iraq.cpp new file mode 100644 index 0000000..9ca2801 --- /dev/null +++ b/Source/Game/gamecpp/g_iraq.cpp @@ -0,0 +1,1082 @@ +/****************************************************** + * Objects between Iraq and a hard place (if you think about it, it really is funny) * + ******************************************************/ + +#include "g_local.h" +#include "g_obj.h" +#include "callback.h" + +#define FRUITSTAND_MELONS 4 +#define FRUITSTAND_ORANGES 8 +#define FRUITSTAND_NOFRUIT 16 + +#define HLTH_IRAQ_BASKET 50 +#define HLTH_IRAQ_CART_CAMEL 300 +#define HLTH_IRAQ_FLATBED 500 +#define HLTH_IRAQ_FLATBED_WHEEL 500 +#define HLTH_IRAQ_FRUIT_MELON 50 +#define HLTH_IRAQ_FRUIT_ORANGE 10 +#define HLTH_IRAQ_FRUIT_STAND 125 +#define HLTH_IRAQ_PARTITION 400 +#define HLTH_IRAQ_POTTERY 25 +#define HLTH_IRAQ_SPRINKLER 500 +#define HLTH_IRAQ_STEALTH 5000 +#define HLTH_IRAQ_TREE_PALM 1000 +#define HLTH_IRAQ_VALVE 300 + + +#define FLATBED_TRIGGERED 4 +#define FLATBED_LIGHTS 8 +#define FLATBED_WHEELS_ONLY 16 + +#define FLATBED_BRAKE_FACTOR 3 + + +#define VALVE_PORTCULLIS (1<<7) + +extern void debug_drawbox(edict_t* self,vec3_t vOrigin, vec3_t vMins, vec3_t vMaxs, int nColor); + +extern void drawthink(edict_t *ent); + + +// misc_iraq... +void SP_misc_iraq_basket (edict_t *ent); +void SP_misc_iraq_cart_camel (edict_t *ent); +void SP_misc_iraq_flatbed (edict_t *ent); +void SP_misc_iraq_fruit_melon (edict_t *ent); +void SP_misc_iraq_fruit_orange (edict_t *ent); +void SP_misc_iraq_fruit_stand (edict_t *ent); +void SP_misc_iraq_partition (edict_t *ent); +void SP_misc_iraq_pottery (edict_t *ent); +void SP_misc_iraq_sprinkler (edict_t *ent); +void SP_misc_iraq_stealth (edict_t *ent); +void SP_misc_iraq_tree_palm (edict_t *ent); +void SP_misc_iraq_valve (edict_t *ent); + +spawn_t iraqSpawns[] = +{ + // misc_iraq... + {"misc_iraq_basket", SP_misc_iraq_basket}, + {"misc_iraq_cart_camel", SP_misc_iraq_cart_camel}, + {"misc_iraq_flatbed", SP_misc_iraq_flatbed}, + {"misc_iraq_fruit_melon", SP_misc_iraq_fruit_melon}, + {"misc_iraq_fruit_orange", SP_misc_iraq_fruit_orange}, + {"misc_iraq_fruit_stand", SP_misc_iraq_fruit_stand}, + {"misc_iraq_partition", SP_misc_iraq_partition}, + {"misc_iraq_pottery", SP_misc_iraq_pottery}, + {"misc_iraq_sprinkler", SP_misc_iraq_sprinkler}, + {"misc_iraq_stealth", SP_misc_iraq_stealth}, + {"misc_iraq_tree_palm", SP_misc_iraq_tree_palm}, + {"misc_iraq_valve", SP_misc_iraq_valve}, + {NULL, NULL}, +}; + +typedef enum +{ + OBJ_BASKET = 0, + OBJ_CART_CAMEL, + OBJ_FLATBED_OFF, + OBJ_FLATBED_WHEEL, + OBJ_FLATBED_ON, + OBJ_FRUIT_MELON, + OBJ_FRUIT_ORANGE, + OBJ_FRUIT_STAND, + OBJ_LIGHT_BEAM, + OBJ_PARTITION, + OBJ_POTTERY, + OBJ_SPRINKLER, + OBJ_STEALTH, + OBJ_TREE_PALM, + OBJ_VALVE, + MAX_OBJS +}; + + +modelSpawnData_t iraqModelData[MD_IRAQ_SIZE] = +{ +// dir file surfaceType material health solid material file cnt scale +"objects/iraq/basket", "basket", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_IRAQ_BASKET, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_BASKET +"objects/iraq/cart_camel", "cart", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_IRAQ_CART_CAMEL, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_CART_CAMEL +"objects/iraq/flatbed", "off", SURF_METAL, MAT_METAL_LGREY, HLTH_IRAQ_FLATBED, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_FLATBED_OFF +"objects/iraq/flatbed", "tire", SURF_METAL, MAT_METAL_LGREY, HLTH_IRAQ_FLATBED_WHEEL, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_FLATBED_WHEEL +"objects/iraq/flatbed", "on", SURF_METAL, MAT_METAL_LGREY, HLTH_IRAQ_FLATBED, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_FLATBED_ON +"objects/iraq/fruit_melon", "melon", SURF_LIQUID_RED, MAT_DEFAULT, HLTH_IRAQ_FRUIT_MELON, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_FRUIT_MELON +"objects/iraq/fruit_orange", "orange", SURF_LIQUID_ORANGE, MAT_DEFAULT, HLTH_IRAQ_FRUIT_MELON, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_FRUIT_ORANGE +"objects/iraq/fruit_stand", "fruit_stand", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_IRAQ_FRUIT_STAND, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_FRUIT_STAND +"objects/generic/beam", "beam", SURF_NONE, MAT_NONE, 0, SOLID_NOT, NULL, 0, 0.0, NULL, // OBJ_LIGHT_BEAM +"objects/iraq/partition", "partition", SURF_NONE, MAT_DEFAULT, HLTH_IRAQ_PARTITION, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_PARTITION +"objects/iraq/pottery", "pottery", SURF_SAND_LBROWN, MAT_DEFAULT, HLTH_IRAQ_POTTERY, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_POTTERY +"objects/iraq/sprinklers", "sprinklers", SURF_METAL, MAT_METAL_LGREY, HLTH_IRAQ_SPRINKLER, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_SPRINKLER +"objects/iraq/stealth", "stealth", SURF_METAL, MAT_METAL_LGREY, HLTH_IRAQ_STEALTH, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_STEALTH +"objects/iraq/tree_palm", "tree", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_IRAQ_TREE_PALM, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_TREE_PALM +"objects/iraq/valve", "valve", SURF_METAL, MAT_METAL_LGREY, HLTH_IRAQ_VALVE, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_VALVE +}; + +void EntToWorldMatrix(vec3_t org, vec3_t angles, Matrix4 &m); + +/*QUAKED misc_iraq_basket (1 .5 0) (-6 -7 -18) (7 6 15) INVULNERABLE NOPUSH x x x x FLUFF +A tall thin wicker basket +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_iraq_basket (edict_t *ent) +{ + VectorSet (ent->mins, -6, -7, -18); + VectorSet (ent->maxs, 7, 6, 15); + + SimpleModelInit2(ent,&iraqModelData[OBJ_BASKET],NULL,NULL); +} + +/*QUAKED misc_iraq_cart_camel (1 .5 0) (-20 -48 -24) (20 48 24) INVULNERABLE NOPUSH x x x x FLUFF +A large two wheeled wooden cart +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_iraq_cart_camel (edict_t *ent) +{ + VectorSet (ent->mins, -20, -48, -24); + VectorSet (ent->maxs, 20, 48, 24); + + SimpleModelInit2(ent,&iraqModelData[OBJ_CART_CAMEL],NULL,NULL); +} + + + +void flatbed_stop (edict_t *self) +{ + GrabStuffOnTop (self); + VectorClear(self->velocity); + self->movetype = MOVETYPE_NONE; + self->s.sound = 0; + self->nextthink = -1; +} + +void flatbed_deccel (edict_t *self) +{ + + float distanceLeft; + float thisDist; + float curSpeed; + vec3_t newVel; + float xDiff, yDiff; + + GrabStuffOnTop (self); + xDiff = self->s.origin[0] - self->volume; + yDiff = self->s.origin[1] - self->attenuation; + distanceLeft = sqrt(xDiff*xDiff + yDiff*yDiff); + + curSpeed = sqrt(self->velocity[0]*self->velocity[0] + self->velocity[1]*self->velocity[1]); + thisDist = curSpeed * .1; + + if (curSpeed < 5) + { + newVel[0] = self->velocity[0] * (distanceLeft/thisDist); + newVel[1] = self->velocity[1] * (distanceLeft/thisDist); + newVel[2] = 0; + VectorCopy(newVel, self->velocity); + self->think = flatbed_stop; + self->nextthink = level.time + .1; + return; + } + + newVel[0] = self->velocity[0] * (distanceLeft/((FLATBED_BRAKE_FACTOR+1)*thisDist)); + newVel[1] = self->velocity[1] * (distanceLeft/((FLATBED_BRAKE_FACTOR+1)*thisDist)); + newVel[2] = 0; + VectorCopy(newVel, self->velocity); + self->nextthink = level.time + .1; +} + +qboolean FlatbedEndofLineCheck (edict_t *self) +{ + float distanceLeft; + float thisDist; + float curSpeed; + float xDiff, yDiff; + + xDiff = self->s.origin[0] - self->volume; + yDiff = self->s.origin[1] - self->attenuation; + distanceLeft = sqrt(xDiff*xDiff + yDiff*yDiff); + + curSpeed = sqrt(self->velocity[0]*self->velocity[0] + self->velocity[1]*self->velocity[1]); + thisDist = curSpeed * .1; + + if (VectorCompare(vec3_origin, self->velocity)) + { + return true; + } + +// if (self->spawnflags & TRAIN_DECCELERATE) + { + if (distanceLeft < (FLATBED_BRAKE_FACTOR*thisDist)) + { + vec3_t newVel; + + //adjust velocity then stop + newVel[0] = self->velocity[0] * (distanceLeft/((FLATBED_BRAKE_FACTOR+1)*thisDist)); + newVel[1] = self->velocity[1] * (distanceLeft/((FLATBED_BRAKE_FACTOR+1)*thisDist)); + newVel[2] = 0; + VectorCopy(newVel, self->velocity); + self->think = flatbed_deccel; + self->nextthink = level.time + .1; + return false; + } + else + { + return true; + } + } + +} + +void flatbed_WheelSpin (edict_t *self) +{ + + ggBinstC *wheel1,*wheel2,*wheel3,*wheel4; + vec3_t angVel = {0,0,0}; + eft_rotate_t *rotInfo = NULL; + + int tire_circ; + float speed,turns,radians; + + + tire_circ = (30 * M_PI); + speed = self->speed; + turns = speed / tire_circ; + radians = DEGTORAD * turns; + radians = M_PI * turns; + + wheel1 = SimpleModelFindBolt(self, iraqModelData[OBJ_FLATBED_WHEEL],"DUMMY01"); + wheel2 = SimpleModelFindBolt(self, iraqModelData[OBJ_FLATBED_WHEEL],"DUMMY02"); + wheel3 = SimpleModelFindBolt(self, iraqModelData[OBJ_FLATBED_WHEEL],"DUMMY03"); + wheel4 = SimpleModelFindBolt(self, iraqModelData[OBJ_FLATBED_WHEEL],"DUMMY04"); + + if (wheel1) + { + if (rotInfo = FXA_GetRotate(self)) + { + // adding to an existing rotation + rotInfo->xRot = radians*512;//512 accounts for the shift induced by FXA_SetRotate() + } + else + { + // need to create a rotating effect + angVel[PITCH] = radians; + FXA_SetRotate(self, angVel, + wheel1->GetInstPtr(),wheel2->GetInstPtr(), + wheel3->GetInstPtr(),wheel4->GetInstPtr()); + } + } +} + +void flatbed_linecheck (edict_t *self) +{ + + GrabStuffOnTop (self); + FlatbedEndofLineCheck(self); + self->nextthink = level.time + .1; + flatbed_WheelSpin (self); +} + +void flatbed_accel (edict_t *self) +{ + int chance; + + GrabStuffOnTop (self); + if ((double)(self->velocity[0]*self->velocity[0] + self->velocity[1]*self->velocity[1]) < (self->speed*self->speed)) //speed is max speed + { + self->velocity[1] += (-1 * self->accel * sin(self->s.angles[1] * DEGTORAD)); + self->velocity[0] += (self->accel * cos(self->s.angles[1] * DEGTORAD)); + self->nextthink = level.time + .1; + } + else + { + self->think = flatbed_linecheck; + self->nextthink = level.time + .1; + } + + chance = gi.irand(0,5); + FlatbedEndofLineCheck(self); + flatbed_WheelSpin (self); +} + +void flatbed_go (edict_t *self, edict_t *other, edict_t *activator) +{ + // flatbeds with facing 0 are "pointing" east (pos x) + self->movetype = MOVETYPE_DAN; + GrabStuffOnTop (self); + self->velocity[1] = -1 * self->accel * sin(self->s.angles[1] * DEGTORAD); + self->velocity[0] = self->accel * cos(self->s.angles[1] * DEGTORAD); + self->friction = 0; + self->gravity = 0; + self->nextthink = level.time + .1; + self->think = flatbed_accel; + self->use = NULL; + self->plUse = NULL; + +// self->s.sound = gi.soundindex("Ambient/Locs/Subway/Train/Move.wav"); + + FlatbedEndofLineCheck(self); +} + +void flatbedwheels_stop (edict_t *self) +{ + FXA_RemoveRotate(self); +} + +void flatbedwheels_roll (edict_t *self) +{ + ggBinstC *wheel1,*wheel2,*wheel3,*wheel4; + vec3_t angVel = {0,0,0}; + eft_rotate_t *rotInfo = NULL; + + int tire_circ; + float speed,turns,radians; + + + tire_circ = (30 * M_PI); + speed = self->speed; + turns = speed / tire_circ; + radians = DEGTORAD * turns; + radians = M_PI * turns; + + wheel1 = SimpleModelFindBolt(self, iraqModelData[OBJ_FLATBED_WHEEL],"DUMMY01"); + wheel2 = SimpleModelFindBolt(self, iraqModelData[OBJ_FLATBED_WHEEL],"DUMMY02"); + wheel3 = SimpleModelFindBolt(self, iraqModelData[OBJ_FLATBED_WHEEL],"DUMMY03"); + wheel4 = SimpleModelFindBolt(self, iraqModelData[OBJ_FLATBED_WHEEL],"DUMMY04"); + + if (wheel1) + { + if (rotInfo = FXA_GetRotate(self)) + { + // adding to an existing rotation + rotInfo->xRot = radians*512;//512 accounts for the shift induced by FXA_SetRotate() + } + else + { + // need to create a rotating effect + angVel[PITCH] = radians; + FXA_SetRotate(self, angVel, + wheel1->GetInstPtr(),wheel2->GetInstPtr(), + wheel3->GetInstPtr(),wheel4->GetInstPtr()); + } + } + +// self->think = flatbedwheels_roll; +// self->nextthink = level.time + .2; +} + +void flatbedwheels_use (edict_t *self, edict_t *other, edict_t *activator) +{ + + if (!self->count) + { + self->count = 1; // Let 'em know we're moving + flatbedwheels_roll(self); + } + else + { + self->count = 0; // Let 'em know we're not moving + flatbedwheels_stop(self); + } + +} + +void flatbed_remove(edict_t *self) +{ + IGhoulObj *obj = NULL; + GhoulID idEngine = 0; + float xattenuation = ATTN_NORM, xvolume = 1.0; + + if (self->ghoulInst && (obj = self->ghoulInst->GetGhoulObject())) + { + if (idEngine = obj->FindPart("ENGINE")) + { + fxRunner.stopContinualEffect("environ/normalsmoke", self, idEngine); + } + } +} + +void flatbed_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + IGhoulObj *obj = NULL; + GhoulID idEngine = 0; + float xattenuation = ATTN_NORM, xvolume = 1.0; + + if (self->ghoulInst && (obj = self->ghoulInst->GetGhoulObject())) + { + if (idEngine = obj->FindPart("ENGINE")) + { + fxRunner.execContinualEffect("environ/normalsmoke", self, idEngine); + gi.positioned_sound (self->s.origin, g_edicts, 0, gi.soundindex("impact/explosion/med.wav"), xvolume, xattenuation, 0); + self->think = flatbed_remove; + self->nextthink = level.time + 5; + self->die = NULL; + if (self->spawnflags & FLATBED_LIGHTS) + { // turn off headlights + SimpleModelTurnOnOff(SimpleModelGetBolt(self,1),false); + SimpleModelTurnOnOff(SimpleModelGetBolt(self,2), false); + SimpleModelRemoveObject(self, "HEADLIGHT1"); + SimpleModelRemoveObject(self, "HEADLIGHT2"); + } + } + } +} + +/*QUAKED misc_iraq_flatbed (1 .5 0) (-95 -40 -42) (95 40 45) INVULNERABLE NOPUSH TRIGGERED LIGHTS WHEELS_ONLY x FLUFF +A flatbed truck that can have a tank on the back +------ KEYS ------ +Style : +0 - no tank - just a flatbed (default) +1 - has a tank on the back +Distance - distance the truck will move when triggered +Speed - max speed (default 200) +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +TRIGGERED - trigger will cause the truck to move forward a specified amount +LIGHTS - the headlights are on +WHEELS_ONLY - wheels turn when used, stop turning when used again. +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- moves forward or backward +- wheels turn as it moves +*/ + +void SP_misc_iraq_flatbed (edict_t *ent) +{ + VectorSet (ent->mins, -95, -40, -42); + VectorSet (ent->maxs, 95, 40, 45); + + gi.effectindex("environ/normalsmoke"); + gi.soundindex("impact/explosion/med.wav"); + + SimpleModelInit2(ent,&iraqModelData[OBJ_FLATBED_ON],NULL,NULL); + + if (ent->style==0) // No tank + { + SimpleModelRemoveObject(ent,"OILTANK"); + } + + if (ent->spawnflags & FLATBED_LIGHTS) + { + SimpleModelAddBolt(ent,*ent->objSpawnData,"headlight1", + iraqModelData[OBJ_LIGHT_BEAM],"to_headlight",NULL); + + SimpleModelAddBolt(ent,*ent->objSpawnData,"headlight2", + iraqModelData[OBJ_LIGHT_BEAM],"to_headlight",NULL); + + SimpleModelAddObject(ent, "top1"); + SimpleModelAddObject(ent, "top2"); + SimpleModelAddObject(ent, "back1"); + SimpleModelAddObject(ent, "back2"); + SimpleModelAddObject(ent, "frt1"); + SimpleModelAddObject(ent, "frt2"); + SimpleModelAddObject(ent, "frt3"); + SimpleModelAddObject(ent, "frt4"); + } + else + { + SimpleModelRemoveObject(ent, "top1"); + SimpleModelRemoveObject(ent, "top2"); + SimpleModelRemoveObject(ent, "back1"); + SimpleModelRemoveObject(ent, "back2"); + SimpleModelRemoveObject(ent, "frt1"); + SimpleModelRemoveObject(ent, "frt2"); + SimpleModelRemoveObject(ent, "frt3"); + SimpleModelRemoveObject(ent, "frt4"); + } + + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY01", + iraqModelData[OBJ_FLATBED_WHEEL],"DUMMY05",NULL); + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY02", + iraqModelData[OBJ_FLATBED_WHEEL],"DUMMY05",NULL); + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY03", + iraqModelData[OBJ_FLATBED_WHEEL],"DUMMY05",NULL); + SimpleModelAddBolt(ent,*ent->objSpawnData,"DUMMY04", + iraqModelData[OBJ_FLATBED_WHEEL],"DUMMY05",NULL); + + // Turn wheels without moving it? + if (ent->spawnflags & FLATBED_WHEELS_ONLY) + { + ent->count = 0; // Let 'em know we're not moving + ent->use = flatbedwheels_use; + + if (!ent->speed) + { + ent->speed = 200; + } + } + // Turn wheels and apply velocity + else if (ent->spawnflags & FLATBED_TRIGGERED) + { + ent->use = flatbed_go; + ent->s.origin[2] += 1; // hack to avoid the sliding into floor brushes problem +// ent->touch = flatbed_smush; mcnutt said he won't need this + ent->elasticity = -1; + ent->flags |= FL_NO_KNOCKBACK; + + if (!ent->speed) + { + ent->speed = 200; + } + + ent->accel = 30; + + // using volume and attenuation for storage of finishing position + ent->volume = ent->s.origin[0] + st.distance * cos(ent->s.angles[1] * DEGTORAD); + ent->attenuation = ent->s.origin[1] + st.distance * sin(ent->s.angles[1] * DEGTORAD); + } + + ent->die = flatbed_die; +} + + +/*QUAK-ED misc_iraq_fruit_melon (1 .5 0) (-8 -4 -4) (8 4 4) INVULNERABLE NOPUSH x x x x FLUFF +Nice melons +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_iraq_fruit_melon (edict_t *ent) +{ + VectorSet (ent->mins, -8, -4, -4); + VectorSet (ent->maxs, 8, 4, 4); + + SimpleModelInit2(ent,&iraqModelData[OBJ_FRUIT_MELON],NULL,NULL); +} + +/*QUAK-ED misc_iraq_fruit_orange (1 .5 0) (-2 -2 -2) (2 2 2) INVULNERABLE NOPUSH x x x x FLUFF +Nice oranges +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_iraq_fruit_orange (edict_t *ent) +{ + VectorSet (ent->mins, -2, -2, -2); + VectorSet (ent->maxs, 2, 2, 2); + + SimpleModelInit2(ent,&iraqModelData[OBJ_FRUIT_ORANGE],NULL,NULL); +} + +void SimpleModelSetOriginRelative(edict_t *original,edict_t *dupe,float addforward,float addright,float addup); + + +void iraq_fruit_stand_throw(edict_t *self) +{ + self->velocity[0] = gi.flrand(-100,100); + self->velocity[1] = gi.flrand(-100,100); + self->velocity[2] = gi.flrand(200,500); + + self->avelocity[2]= gi.flrand(-100,100); + self->die = BecomeDebris; +} + +// Have fruit thrown before stand dies. +void iraq_fruit_stand_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + + edict_t *enemy[10],*holdent; + int i,total; + + if (self->goalentity == NULL) // No fruit on table, kill it. + { + BecomeDebris(self,inflictor,attacker,damage,point); + return; + } + + if ((self->spawnflags & FRUITSTAND_MELONS) && (self->spawnflags & FRUITSTAND_ORANGES)) + total = 10; + else + total = 5; + + holdent = self->goalentity; + + for (i=0;igoalentity; + enemy[i]->teammaster = NULL; // So they know they've been thrown + } + + if (total == 10) + { + iraq_fruit_stand_throw(enemy[9]); + iraq_fruit_stand_throw(enemy[8]); + iraq_fruit_stand_throw(enemy[7]); + iraq_fruit_stand_throw(enemy[6]); + iraq_fruit_stand_throw(enemy[5]); + } + + iraq_fruit_stand_throw(enemy[4]); + iraq_fruit_stand_throw(enemy[3]); + + enemy[2]->think = iraq_fruit_stand_throw; + enemy[2]->nextthink = level.time + FRAMETIME; + + enemy[1]->think = iraq_fruit_stand_throw; + enemy[1]->nextthink = level.time + FRAMETIME; + + enemy[0]->think = iraq_fruit_stand_throw; + enemy[0]->nextthink = level.time + FRAMETIME; + + BecomeDebris(self,inflictor,attacker,damage,point); + +} + +// One fruit dies, all fruit dies. +void iraq_fruit_stand_fruit_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + edict_t *table,*holdent,*holdent2; + int i,total; + + if (!self->teammaster) // table's dead. Leave other fruit alone. + return; + + + table = self->teammaster; + holdent = table->goalentity; + + table->goalentity = NULL; + + if ((table->spawnflags & FRUITSTAND_MELONS) && (table->spawnflags & FRUITSTAND_ORANGES)) + total = 10; + else + total = 5; + + // Kill all fruit from table + for (i=0;igoalentity; + BecomeDebris(holdent,inflictor,attacker,999,point); + holdent = holdent2; + } +} + +/*QUAKED misc_iraq_fruit_stand (1 .5 0) (-8 -16 -16) (8 16 16) INVULNERABLE NOPUSH MELONS ORANGES NOFRUIT x FLUFF +Nice fruit stand. If none of the spawnflags are used, the table will have both types of fruit. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +MELONS - only melons on table +ORANGES - only oranges +NOFRUIT - no fruit on table +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- fruti is thrown when table is shot +*/ +void SP_misc_iraq_fruit_stand (edict_t *ent) +{ + edict_t *melon,*melon2,*melon3,*melon4,*melon5; + edict_t *orange,*orange2,*orange3,*orange4,*orange5; + + VectorSet (ent->mins, -8, -16, -16); + VectorSet (ent->maxs, 8, 16, 16); + + SimpleModelInit2(ent,&iraqModelData[OBJ_FRUIT_STAND],NULL,NULL); + + if (ent->spawnflags & FRUITSTAND_NOFRUIT) // No fruit?? + return; + + // Didn't choose either so they must want both. + if (!(ent->spawnflags & FRUITSTAND_MELONS) && !(ent->spawnflags & FRUITSTAND_ORANGES)) + { + ent->spawnflags |= FRUITSTAND_MELONS | FRUITSTAND_ORANGES; + } + + // Melons on table?? + if (ent->spawnflags & FRUITSTAND_MELONS) + { + // Melon1 + melon = G_Spawn(); + melon->s.angles[1] = ent->s.angle_diff; + SP_misc_iraq_fruit_melon(melon); + melon->die = iraq_fruit_stand_fruit_die; + SimpleModelSetOriginRelative(ent,melon,0,0,20); + + // Melon2 + melon2 = G_Spawn(); + melon2->s.angles[1] = ent->s.angle_diff; + SP_misc_iraq_fruit_melon(melon2); + melon2->die = iraq_fruit_stand_fruit_die; + SimpleModelSetOriginRelative(ent,melon2,0,-8,20); + + // Melon3 + melon3 = G_Spawn(); + melon3->s.angles[1] = ent->s.angle_diff; + SP_misc_iraq_fruit_melon(melon3); + melon3->die = iraq_fruit_stand_fruit_die; + SimpleModelSetOriginRelative(ent,melon3,0,-16,20); + + // Melon4 + melon4 = G_Spawn(); + melon4->s.angles[1] = ent->s.angle_diff; + SP_misc_iraq_fruit_melon(melon4); + melon4->die = iraq_fruit_stand_fruit_die; + SimpleModelSetOriginRelative(ent,melon4,0,-4,27); + + // Melon5 + melon5 = G_Spawn(); + melon5->s.angles[1] = ent->s.angle_diff; + SP_misc_iraq_fruit_melon(melon5); + melon5->die = iraq_fruit_stand_fruit_die; + + // If there are no oranges, but a melon where the orangs go + if (ent->spawnflags & FRUITSTAND_ORANGES) // There are oranges + SimpleModelSetOriginRelative(ent,melon5,0,-12,27); + else + { + SimpleModelSetOriginRelative(ent,melon5,0,12,20); + melon5->s.angle_diff += 25; + } + } + + // Oranges on table??? + if (ent->spawnflags & FRUITSTAND_ORANGES) + { + orange = G_Spawn(); + orange->s.angles[1] = ent->s.angle_diff; + SP_misc_iraq_fruit_orange(orange); + orange->die = iraq_fruit_stand_fruit_die; + SimpleModelSetOriginRelative(ent,orange,2,8,18); + + // Orange2 + orange2 = G_Spawn(); + orange2->s.angles[1] = ent->s.angle_diff; + SP_misc_iraq_fruit_orange(orange2); + orange2->die = iraq_fruit_stand_fruit_die; + SimpleModelSetOriginRelative(ent,orange2,-2,8,18); + + // Orange3 + orange3 = G_Spawn(); + orange3->s.angles[1] = ent->s.angle_diff; + SP_misc_iraq_fruit_orange(orange3); + orange3->die = iraq_fruit_stand_fruit_die; + SimpleModelSetOriginRelative(ent,orange3,0,12,18); + + // Orange4 + orange4 = G_Spawn(); + orange4->s.angles[1] = ent->s.angle_diff; + SP_misc_iraq_fruit_orange(orange4); + orange4->die = iraq_fruit_stand_fruit_die; + SimpleModelSetOriginRelative(ent,orange4,4,12,18); + + // Orange5 + orange5 = G_Spawn(); + orange5->s.angles[1] = ent->s.angle_diff; + SP_misc_iraq_fruit_orange(orange5); + orange5->die = iraq_fruit_stand_fruit_die; + SimpleModelSetOriginRelative(ent,orange5,-8,18,18); + + } + + ent->die = iraq_fruit_stand_die; + + // Setup fruit and table to point to each other in case of death or dismemberment. + if ((ent->spawnflags & FRUITSTAND_MELONS) && (ent->spawnflags & FRUITSTAND_ORANGES)) + { + ent->goalentity = melon; + melon->goalentity = melon2; + melon2->goalentity = melon3; + melon3->goalentity = melon4; + melon4->goalentity = melon5; + + // Point fruit back to table so if a single fruit dies, all fruit dies. + melon->teammaster = ent; + melon2->teammaster = ent; + melon3->teammaster = ent; + melon4->teammaster = ent; + melon5->teammaster = ent; + + melon5->goalentity = orange; + orange->goalentity = orange2; + orange2->goalentity = orange3; + orange3->goalentity = orange4; + orange4->goalentity = orange5; + + // Point fruit back to table so if a single fruit dies, all fruit dies. + orange->teammaster = ent; + orange2->teammaster = ent; + orange3->teammaster = ent; + orange4->teammaster = ent; + orange5->teammaster = ent; + } + else if (ent->spawnflags & FRUITSTAND_MELONS) // Just melons + { + ent->goalentity = melon; + melon->goalentity = melon2; + melon2->goalentity = melon3; + melon3->goalentity = melon4; + melon4->goalentity = melon5; + + // Point fruit back to table so if one fruit dies, all fruit dies. + melon->teammaster = ent; + melon2->teammaster = ent; + melon3->teammaster = ent; + melon4->teammaster = ent; + melon5->teammaster = ent; + } + else if (ent->spawnflags & FRUITSTAND_ORANGES) // Just oranges + { + ent->goalentity = orange; + orange->goalentity = orange2; + orange2->goalentity = orange3; + orange3->goalentity = orange4; + orange4->goalentity = orange5; + + // Point fruit back to table so if a single fruit dies, all fruit dies. + orange->teammaster = ent; + orange2->teammaster = ent; + orange3->teammaster = ent; + orange4->teammaster = ent; + orange5->teammaster = ent; + } +} + + +/*QUAKED misc_iraq_partition (1 .5 0) (-63 -1 0) (62 2 35) INVULNERABLE NOPUSH x x x x FLUFF +Chrome pole with a felt line. Used by movie theaters use to keep people in line. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_iraq_partition (edict_t *ent) +{ + VectorSet (ent->mins, -63, -1, 0); + VectorSet (ent->maxs, 62, 2, 35); + + SimpleModelInit2(ent,&iraqModelData[OBJ_PARTITION],NULL,NULL); +} + +/*QUAKED misc_iraq_pottery (1 .5 0) (-8 -8 -9) (8 8 9) INVULNERABLE NOPUSH x x x x FLUFF +A knee high pot for storing dates and figs and such. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_iraq_pottery (edict_t *ent) +{ + VectorSet (ent->mins, -8, -8, -9); + VectorSet (ent->maxs, 8, 8, 9); + + SimpleModelInit2(ent,&iraqModelData[OBJ_POTTERY],NULL,NULL); +} + +/*QUAKED misc_iraq_sprinkler (1 .5 0) (-7 -63 -2) (6 64 2) INVULNERABLE NOPUSH x x x x FLUFF +A six headed cattle sprinkler. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_iraq_sprinkler (edict_t *ent) +{ + VectorSet (ent->mins, -7, -63, -2); + VectorSet (ent->maxs, 6, 64, 2); + + ent->spawnflags |= SF_NOPUSH; // Can't ever be pushed + + SimpleModelInit2(ent,&iraqModelData[OBJ_SPRINKLER],NULL,NULL); + +} + + +// kef 10/21/99 -- jersey needs the bbox smaller so Hawk can stand near it +// +// was (-285 -177 -54) (285 177 53) +// + +/*QUAKED misc_iraq_stealth (1 .5 0) (-32 -32 -54) (32 32 53) INVULNERABLE NOPUSH x x x x FLUFF +A big stealth plane +------ SPAWNFLAGS ------ +INVULNERABLE - N/A can't be damaged. +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_iraq_stealth (edict_t *ent) +{ + + VectorSet (ent->mins, -32, -32, -54); + VectorSet (ent->maxs, 32, 32, 53); + ent->spawnflags |= SF_INVULNERABLE; + + ent->s.angles[YAW] = 270; + + SimpleModelInit2(ent,&iraqModelData[OBJ_STEALTH],NULL,NULL); + +} + +/*QUAKED misc_iraq_tree_palm (1 .5 0) (-30 -9 -67) (-6 23 67) INVULNERABLE NOPUSH x x x x FLUFF +A tall palm tree +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set + + hey, designers! you need to put a clip brush around this joker cuz it defies physics. tree is non-solid, too. +*/ +void SP_misc_iraq_tree_palm (edict_t *ent) +{ +// VectorSet (ent->mins, -65, -47, -67); +// VectorSet (ent->maxs, 18, 69, 67); + VectorSet (ent->mins, -30, -9, -67); + VectorSet (ent->maxs, -6, 23, 67); + + ent->spawnflags |= SF_NOPUSH; // Can't ever be pushed + + SimpleModelInit2(ent,&iraqModelData[OBJ_TREE_PALM],NULL,NULL); + + ent->solid = SOLID_NOT; +// ent->think = drawthink; +// ent->nextthink = level.time + .1; +} + +/*QUAKED misc_generic_sprinkler (1 .5 0) (-4 -4 -4) (4 4 4) INVULNERABLE NOPUSH x x x x FLUFF +A ceiling water sprinkler + DO NOT USE YET! +*/ +void SP_misc_generic_sprinkler (edict_t *ent) +{ + VectorSet (ent->mins, -4, -4, -4); + VectorSet (ent->maxs, 4, 4, 4); + + ent->surfaceType = SURF_STONE_WHITE; + ent->health = 10; + ent->spawnflags |= SF_NOPUSH; + + game_ghoul.SetSimpleGhoulModel (ent,"objects/generic/urn","urn"); + SimpleModelInit(ent,SOLID_BBOX); + + fxRunner.execContinualEffect("environ/sprinkler", ent); +} + +valveCallback theValveCallback; + +bool valveCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + edict_t* self = (edict_t*)ent; + + self->ghoulInst->Pause(level.time); + + self->s.sound = 0; + + return true; +} + +// sadly, I just copied these from g_func.cpp rather than take the 20 or 30 hours +//to figure out how to #include them in a header somewhere +#define STATE_TOP 0 +#define STATE_BOTTOM 1 +#define STATE_UP 2 +#define STATE_DOWN 3 + +void valve_use_portcullis (edict_t *ent, edict_t *other, edict_t *activator) +{ + // based on the moveinfo.state of 'other', either turn the valve clockwise, ccw, or stop its turning + switch(other->moveinfo.state) + { + case STATE_TOP: + case STATE_BOTTOM: // stop + ent->avelocity[0] = 0.0; + break; + case STATE_UP: // cw + ent->avelocity[0] = 40.0; + break; + case STATE_DOWN: // ccw + ent->avelocity[0] = -40.0; + break; + default: // stop + ent->avelocity[0] = 0.0; + break; + } + gi.linkentity(ent); +} + +void iraq_valve_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + ggObjC *simpObj; + GhoulID simpSeq; + ggOinstC* myInstance; + GhoulID tempNote=0; + + if (!ent->ghoulInst) + { + return; + } + + if (ent->spawnflags & VALVE_PORTCULLIS) + { + valve_use_portcullis(ent, other, activator); + return; + } + else + { + gi.sound(ent, CHAN_VOICE, gi.soundindex("Ambient/Models/Valve/ValveTurn.wav"), .6, ATTN_NORM, 0); + } + + simpObj = game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + if (!simpObj) + { + return; + } + + //changed this to false, can't cache new seqs in after instances are created --ss + simpSeq = simpObj->FindSequence(iraqModelData[OBJ_VALVE].file); + + if (!simpSeq) + { + return; + } + + myInstance = simpObj->FindOInst(ent->ghoulInst); + if (!myInstance) + { + return; + } + + // Play turning sequence + myInstance->PlaySequence(simpSeq, level.time); + + // Setup stop frame when done playing sequence + tempNote = simpObj->GetMyObject()->FindNoteToken("EOS"); + if (tempNote) + { + ent->ghoulInst->AddNoteCallBack(&theValveCallback,tempNote); + } + +} + +/*QUAKED misc_iraq_valve (1 .5 0) (-12 -3 -10) (12 1 11) INVULNERABLE NOPUSH x x x x FLUFF PORTCULLIS +A circular valve that will spin when used. +------ SPAWNFLAGS ------ +INVULNERABLE - N/A, can't ever be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +PORTCULLIS - used by a func_door_portcullis +*/ +void SP_misc_iraq_valve (edict_t *ent) +{ + VectorSet (ent->mins, -12, -3, -10); + VectorSet (ent->maxs, 12, 1, 11); + + ent->spawnflags |= SF_INVULNERABLE; + ent->spawnflags |= SF_NOPUSH; // Can't ever be pushed + + SimpleModelInit2(ent,&iraqModelData[OBJ_VALVE],NULL,NULL); + + ent->ghoulInst->Pause(level.time); + ent->movetype = MOVETYPE_DAN; + ent->gravity = 0.0; + + ent->use = iraq_valve_use; + gi.soundindex("Ambient/Models/Valve/ValveTurn.wav"); +} + diff --git a/Source/Game/gamecpp/g_items.cpp b/Source/Game/gamecpp/g_items.cpp new file mode 100644 index 0000000..e5add7a --- /dev/null +++ b/Source/Game/gamecpp/g_items.cpp @@ -0,0 +1,1257 @@ +#include "g_local.h" +#include "../strings/items.h" +#include "p_body.h" +#include "w_weapons.h" +#include "dm_ctf.h" +#include "..\qcommon\ef_flags.h" +#include "..\qcommon\configstring.h" + +#define HLTH_ITEM_PICKUP 10000 + + +extern cvar_t *weaponarena; // for weapon testing + + +//------------- +// Ammo. +//------------- + +/*QUAKED item_ammo_pistol (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for pistol1 & machinepistol +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + +/*QUAKED item_ammo_shotgun (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for shotgun +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + +/*QUAKED item_ammo_pistol2 (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for pistol2 (the .44) +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + +/*QUAKED item_ammo_auto (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for assault rifle, machinegun, sniper rifle +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +/*QUAKED item_ammo_battery (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for Microwave Pulse Gun (MPG) +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + +/*QUAKED item_ammo_gas (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for Flame Thrower +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + +/*QUAKED item_ammo_rocket (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for Rocket Launcher +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + +/*QUAKED item_ammo_slug (0 .3 .3) (-21 -13 -6) (21 13 6) x x x START_CRATED +Ammo for Slug Thrower +For Deathmatch Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +// +// Single Player Ammo +// + + + +/*QUAKED item_ammo_sp_pistol (0 .3 .3) (-6 -3 0) (6 3 5) x x x START_CRATED +Ammo for pistol1 & machinepistol +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + +/*QUAKED item_ammo_sp_shotgun (0 .3 .3) (-7 -9 0) (13 7 9) x x x START_CRATED +Ammo for shotgun +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + +/*QUAKED item_ammo_sp_pistol2 (0 .3 .3) (-6 -4 0) (6 4 6) x x x START_CRATED +Ammo for pistol2 (the .44) +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + +/*QUAKED item_ammo_sp_auto (0 .3 .3) (-9 -3 0) (12 3 6) x x x START_CRATED x x x RESPAWN +Ammo for assault rifle, machinegun, sniper rifle +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + +/*QUAKED item_ammo_sp_battery (0 .3 .3) (-5 -4 0) (5 4 10) x x x START_CRATED +Ammo for Microwave Pulse Gun (MPG) +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + +/*QUAKED item_ammo_sp_gas (0 .3 .3) (-5 -3 0) (5 3 13) x x x START_CRATED +Ammo for Flame Thrower +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + +/*QUAKED item_ammo_sp_rocket (0 .3 .3) (-2 -10 -1) (8 4 15) x x x START_CRATED x x x RESPAWN +Ammo for Rocket Launcher +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + +/*QUAKED item_ammo_sp_slug (0 .3 .3) (-5 -8 -1) (11 6 9) x x x START_CRATED +Ammo for Slug Thrower +For SINGLE PLAYER Only +START_CRATED -- smash open a crate to get at this pickup +------ KEYS ------ +count - ammo value (default 1) +if count < 0, the ammo value will be a random number between 0 and count*-1 +*/ + + +//------------- +// Weapons. +//------------- + +/*QUAKED item_weapon_pistol2 (0 .3 .3) (-16 -5 -2) (8 8 3) x x x START_CRATED +Weapon pickup for pistol2 +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_weapon_pistol1 (0 .3 .3) (-12 -12 -2) (5 7 2) x x x START_CRATED +Weapon pickup for pistol1 +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_weapon_machinepistol (0 .3 .3) (-15 -14 -3) (15 15 4) x x x START_CRATED +Weapon pickup for machine pistol +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_weapon_assault_rifle (0 .3 .3) (-16 -7 -2) (16 11 2) x x x START_CRATED +Weapon pickup for assault rifle +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ +/*QUAKED item_weapon_sniper_rifle (0 .3 .3) (-36 -8 -2) (36 16 3) x x x START_CRATED +Weapon pickup sniper rifle +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_weapon_autoshotgun (0 .3 .3) (-37 -10 -9) (25 11 9) x x x START_CRATED +Weapon pickup for auto shotgun +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_weapon_shotgun (0 .3 .3) (-28 -4 -3) (24 9 3) x x x START_CRATED +Weapon pickup for shotgun +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_weapon_machinegun (0 .3 .3) (-27 -11 -3) (38 7 6) x x x START_CRATED +Weapon pickup for machine gun +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_weapon_rocketlauncher (0 .3 .3) (-15 -13 -11) (38 17 11) x x x START_CRATED +Weapon pickup for rocket launcher +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_weapon_microwavepulse (0 .3 .3) (-22 -12 -9) (44 14 7) x x x START_CRATED +Weapon pickup for Microwave Pulse Gun (MPG) +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_weapon_flamethrower (0 .3 .3) (-20 -6 -3) (29 10 3) x x x START_CRATED +Weapon pickup for Flame Thrower +If player already has weapon, ammo is given +START_CRATED -- smash open a crate to get at this pickup +*/ + +//------------- +// Armor. +//------------- + +/*QUAKED item_equip_armor (0 .3 .3) (-11 -9 -1) (11 9 5) x x x START_CRATED +count - armor value (default 50, max of 100) +if count < 0, the armor value will be a random number between 0 and count*-1 +START_CRATED -- smash open a crate to get at this pickup +*/ + + +//------------- +// Inventory items. +//------------- + +/*QUAKED item_equip_flashpack (0 .3 .3) (-5 -6 -9) (5 6 9) x x x START_CRATED +START_CRATED -- smash open a crate to get at this pickup +*/ + +/* item_equip_neural_grenade (0 .3 .3) (-8 -8 -8) (8 8 8) x x x START_CRATED +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_equip_c4 (0 .3 .3) (-2 -12 -11) (16 12 13) x x x START_CRATED +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_equip_light_goggles (0 .3 .3) (-5 -7 -4) (5 2 1) x x x START_CRATED +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_equip_claymore (0 .3 .3) (-4 -13 -6) (3 11 8) x x x START_CRATED +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_equip_medkit (0 .3 .3) (-11 -8 -0) (11 9 10) x x x START_CRATED +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_equip_grenade (0 .3 .3) (-3 -4 0) (4 4 8) x x x START_CRATED +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_ctf_flag (0 .3 .3) (-4 -13 -6) (3 11 8) x x x START_CRATED +count - team counter - 1 or 2 +START_CRATED -- smash open a crate to get at this pickup +*/ + +//------------- +// Health. +//------------- + +/*QUAKED item_health_small (0 .3 .3) (-7 -7 0) (7 7 7) x x x START_CRATED +count - health restored on pickup (default 10) +START_CRATED -- smash open a crate to get at this pickup +*/ + +/*QUAKED item_health_large (0 .3 .3) (-18 -4 -0) (18 4 26) x x x START_CRATED +count - health restored on pickup (default 50) +START_CRATED -- smash open a crate to get at this pickup +*/ + + + +// 12/27/99 kef -- replaced itemSpawnInfo_t itemSpawns[] with PickupList thePickupList. +PickupList thePickupList; + + +/* +=============== +G_CalcRespawnTime + +I made this in case we wanna do some kinda dynamic type respawn timing. Should +be called from game main loop somewhere (i.e. once per frame). -MW +=============== +*/ + +void G_CalcPickupRespawnTime(void) +{ + int count,i; + + for(count=0,i=0;iinuse) + count++; + } + + // FIXME: some kinda formula here using count. Then store result away in the + // game structure. + //game.PickupRespawnTime=30.0+((game.maxclients-count)*2.0); +} + +/* +=============== +itemAmmoTouch +=============== +*/ + +void itemAmmoTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + Pickup *pickup = thePickupList.GetPickupFromEdict(self); + + if(pickup && (other->client)&&(other->health>0)) + { + int nAmount = self->count * game.playerSkills.getAmmoMod(); + + if(pickup->GetPickupListIndex() == OBJ_AMMO_KNIFE) + { + // We're modifying the amount of ammo you recover by the current skill level + // of the game, but that's a little weird when you _know_ you're only picking + // up _one_ knife. + + nAmount=1; + } + + if(other->client->inv->addAmmoType(pickup->GetSpawnParm(),nAmount)) + { + thePickupList.HandleInfoEvent(PickupInfoList::event_PICKEDUP, self); + gi.sound(other, CHAN_ITEM, gi.soundindex("weapons/gpistol/cock.wav"), 1.0, ATTN_IDLE, 0); // LOUD --PAT + gi.SP_Print(other, pickup->GetPickupStringIndex()); + + // Respawn or delete this entity? + + if( ((deathmatch->value)&&(!(self->spawnflags&DROPPED_ITEM))) || + (self->spawnflags & SF_PICKUP_RESPAWN) ) + { + dm->setRespawn(self,pickup->GetRespawnTime()); + } + else + { + G_FreeEdict(self); + } + } + else + { + if(level.time>self->touch_debounce_time) + { + thePickupList.HandleInfoEvent(PickupInfoList::event_TOUCHED, self); + gi.SP_Print(other, pickup->GetItemFullStringIndex()); + self->touch_debounce_time = level.time + 5.0; + } + } + } +} + +/* +=============== +itemWeaponTouch +=============== +*/ + +void itemWeaponTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + Pickup *pickup = thePickupList.GetPickupFromEdict(self); + + if(pickup && (other->client)&&(other->health>0)) + { + // If the player touching me is the same player that *just* dropped me, + // they ain't gonna want to pick me up again so soon. + + if((self->spawnflags&DROPPED_ITEM)&&(self->enemy&&(self->enemy==other))&&(level.timetouch_debounce_time)) + return; + + // Determine how much ammo is in the weapon's clip. + + int clipAmount=(self->spawnflags&DROPPED_ITEM)?self->health:-1; + + // What happens next depends on whether we already have this weapon type + // in our inventory and whether we are encumbered. + + int hasWeapon=0; + + hasWeapon=other->client->inv->hasWeaponType(pickup->GetSpawnParm()); + + int encumbered=0; + + if((dm->getMaxEncumbrance()>0)&& + ((other->client->inv->getEncumbrance()+other->client->inv->getEncumbranceByType(pickup->GetSpawnParm()))>dm->getMaxEncumbrance())) + { + encumbered=1; + } + + if((!hasWeapon)&&(!encumbered)) + { + thePickupList.HandleInfoEvent(PickupInfoList::event_PICKEDUP, self); + if (clipAmount == CLIP_SHOULD_BE_FILLED) // this is a weapon that was dropped over 30 seconds ago in realistic DM, + { // so we need to refill it. It's ugly, yes... + clipAmount = other->client->inv->getClipMaxByType(pickup->GetSpawnParm()); + } + other->client->inv->addWeaponType(pickup->GetSpawnParm(), clipAmount); + + // Auto switch to this weapon if it's the best one? + + if(other->client->pers.bestweap[0]&&dm->allowAutoWeaponSwitch()) + { + sharedEdict_t sh; + + sh.inv=(inven_c *)other->client->inv; + sh.edict=other; + sh.inv->setOwner(&sh); + + if(pickup->GetSpawnParm()==sh.inv->getBestWeaponType()) + other->client->inv->takeOutBestWeapon(); + } + + // Sound and info display. + + gi.sound(other, CHAN_ITEM, gi.soundindex("weapons/gpistol/cock.wav"), 1.0, ATTN_IDLE, 0); // LOUD --PAT + gi.SP_Print(other, pickup->GetPickupStringIndex()); + + if(dm->dmRule_WEAPONS_STAY()&&(!(self->spawnflags&DROPPED_ITEM))) + return; + + // Respawn or delete this entity? + + if((deathmatch->value)&&(!(self->spawnflags&DROPPED_ITEM))) + { + dm->setRespawn(self,pickup->GetRespawnTime()); + } + else + { + G_FreeEdict(self); + } + } + else + { + if((!hasWeapon)&&encumbered) + { + if(level.time>self->touch_debounce_time) + { + // Couldn't carry another weapon. + thePickupList.HandleInfoEvent(PickupInfoList::event_TOUCHED, self); + + // if we're in single player, we want to let the player take the ammo from the weapon, + // even if he can't carry the weapon + if (!deathmatch->value) + { + if(other->client->inv-> + stripAmmoFromGun(pickup->GetSpawnParm(),(self->spawnflags & DROPPED_ITEM) ? self->health:0)) + { + thePickupList.HandleInfoEvent(PickupInfoList::event_PICKEDUP, self); + + if (self->health) + { + gi.sound(other, CHAN_ITEM, gi.soundindex("weapons/gpistol/cock.wav"), 1.0, ATTN_IDLE, 0); // LOUD --PAT + gi.SP_Print(other, pickup->GetAmmoPickupStringIndex()); + self->health = 0; // get rid of ammo in the now-empty weapon + } + } + } + + gi.SP_Print(other,ITEMS_ENCUMBERED); + self->touch_debounce_time = level.time + 5.0; + } + + return; + } + + // We can't take this weapon so try to take the ammo from it (we discard the weapon though). + // Note: in DM, extra ammo can only be gained from dropped weapons if DF_WEAPONS_STAY is off. + if((deathmatch->value)&&dm->dmRule_WEAPONS_STAY()&&(!(self->spawnflags&DROPPED_ITEM))) + { + // In DM, if DF_WEAPONS_STAY is on, extra ammo can only be gained + // from dropped weapons. + if (level.time > self->touch_debounce_time) + { + thePickupList.HandleInfoEvent(PickupInfoList::event_TOUCHED, self); + self->touch_debounce_time = level.time + 5.0; + } + + return; + } + // Double note: can't pick up duplicate weapons in realDM + else if((dm->isDM()) && (deathmatch->value == DM_REAL)) + { + if (level.time>self->touch_debounce_time) + { + thePickupList.HandleInfoEvent(PickupInfoList::event_TOUCHED, self); + gi.SP_Print(other, ITEMS_ALREADY_HAVE_THIS); + self->touch_debounce_time = level.time + 5.0; + return; + } + else + { + return; + } + } + else + { + // Ok, grab the ammo. + + if(other->client->inv-> + addAmmoByGunType(pickup->GetSpawnParm(),(self->spawnflags & DROPPED_ITEM) ? self->health:0)) + { + // OK, added the ammo so we're outa here! + thePickupList.HandleInfoEvent(PickupInfoList::event_PICKEDUP, self); + + gi.sound(other, CHAN_ITEM, gi.soundindex("weapons/gpistol/cock.wav"), 1.0, ATTN_IDLE, 0); // LOUD --PAT + gi.SP_Print(other, pickup->GetAmmoPickupStringIndex()); + + if((deathmatch->value)&&(!(self->spawnflags&DROPPED_ITEM))) + { + // In DM, I will respawn if I'm not a dropped weapon. + + dm->setRespawn(self,pickup->GetRespawnTime()); + } + else + { + G_FreeEdict(self); + } + } + else + { + if(level.time>self->touch_debounce_time) + { + thePickupList.HandleInfoEvent(PickupInfoList::event_TOUCHED, self); + gi.SP_Print(other, pickup->GetItemFullStringIndex()); + self->touch_debounce_time = level.time + 5.0; + } + } + } + } + } +} + +/* +=============== +itemEquipTouch +=============== +*/ + +void itemEquipTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + Pickup *pickup = thePickupList.GetPickupFromEdict(self); + + if(pickup && (other->client)&&(other->health>0)) + { + // If the player touching me is the same player that *just* dropped me, + // they ain't gonna want to pick me up again so soon. + + if((self->spawnflags&DROPPED_ITEM)&&(self->enemy&&(self->enemy==other))&&(level.timetouch_debounce_time)) + return; + + // Determine how many of these / how much ammo. + + int amount=(self->spawnflags&DROPPED_ITEM)?self->health:self->count; + + // Try to add items(s). + + if(other->client->inv->addItem(pickup->GetSpawnParm(),amount,pickup->GetDefaultMaxCount())) + { + thePickupList.HandleInfoEvent(PickupInfoList::event_PICKEDUP, self); + gi.sound(other, CHAN_ITEM, gi.soundindex("weapons/gpistol/cock.wav"), 1.0, ATTN_IDLE, 0); // LOUD --PAT + gi.SP_Print(other, pickup->GetPickupStringIndex()); + + // Respawn or delete this entity? + + if( (deathmatch->value)&&(!(self->spawnflags&DROPPED_ITEM)) ) + { + dm->setRespawn(self,pickup->GetRespawnTime()); + } + else + { + G_FreeEdict(self); + } + } + else + { + if(level.time>self->touch_debounce_time) + { + thePickupList.HandleInfoEvent(PickupInfoList::event_TOUCHED, self); + gi.SP_Print(other, pickup->GetItemFullStringIndex()); + self->touch_debounce_time = level.time + 5.0; + } + } + } +} + +/* +=============== +itemArmorTouch +=============== +*/ + +void itemArmorTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + Pickup *pickup = thePickupList.GetPickupFromEdict(self); + + if(pickup && (other->client)&&(other->health>0)) + { + if(PB_AddArmor(other, self->count * game.playerSkills.getArmorMod())) + { + thePickupList.HandleInfoEvent(PickupInfoList::event_PICKEDUP, self); + gi.sound(other, CHAN_ITEM, gi.soundindex("dm/armorpu.wav"), 1.0, ATTN_IDLE, 0); // LOUD --PAT + gi.SP_Print(other, pickup->GetPickupStringIndex()); + + if((deathmatch->value)&&(!(self->spawnflags&DROPPED_ITEM))) + { + dm->setRespawn(self,pickup->GetRespawnTime()); + } + else + { + G_FreeEdict(self); + } + } + else + { + if(level.time>self->touch_debounce_time) + { + thePickupList.HandleInfoEvent(PickupInfoList::event_TOUCHED, self); + gi.SP_Print(other, ITEMS_ARMOR_ALREADY_FULL); + self->touch_debounce_time = level.time + 5.0; + } + } + } +} + +int reset_flag(edict_t *self, edict_t *owner) +{ + edict_t *home = NULL; + Matrix4 matPickup; + float newScale = 1.75f; + char *flagname; + Pickup *pickup = thePickupList.GetPickupFromSpawnName("ctf"); + + // determine which flag it is + if (self->ctf_flags == TEAM1) + { + flagname="ctf_flag_blue"; + } + else + { + flagname="ctf_flag_red"; + } + + // if we are looking at ourselves, then we are at the flags original location, so exit + if (!strcmp(flagname, self->classname)) + { + self->touch_debounce_time = level.time + 5.0; + self->touch_debounce_owner = owner; + return 1; + } + + // ok, this flag is not at home, so find the home edict for this entity + home = G_Find (home, FOFS(classname), flagname); + if (!home) + return 1; + + // found it - now put a ghoul model of the flag at the home entity + SimpleModelInit2(home,pickup->GetModelSpawnData(),flagname,NULL); + + IGhoulInst *pickupInst = home->ghoulInst; + + if (pickupInst) + { + pickupInst->GetXForm(matPickup); + matPickup.Scale(newScale); + pickupInst->SetXForm(matPickup); + + pickupInst->SetMyBolt("quake_ground"); + home->mins[2] = 0; + pickupInst->SetFrameOverride("ctf_flag", flagname); + } + // indicate to everyone that this entity has a flag attached to it. + home->ctf_flags = self->ctf_flags; + home->solid = SOLID_TRIGGER; + home->s.renderfx |= RF_GHOUL_SHADOW; + + // indicate to all clients the state of the flags + if (home->ctf_flags == TEAM1) + { + gi.configstring(CS_CTF_BLUE_STAT, "h"); + } + else + { + gi.configstring(CS_CTF_RED_STAT, "h"); + } + + return 0; +} + +/* +=============== +itemFlagTouch +=============== +*/ +void itemFlagTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + Pickup *pickup = thePickupList.GetPickupFromEdict(self); + char *flagname; + edict_t *e2; + + + if(pickup && (other->client)&&(other->health>0)) + { + // this type of shit is getting complicated, so I gave it a second If. If it's ineffiecient, sue me. + if ((other != self->touch_debounce_owner) || (level.time > self->touch_debounce_time)) + { + // only pick up the flag if it's not ours and it has a flag attached to it + if (!(self->ctf_flags & other->client->resp.team)) + { + if(other->client->inv->addItem(pickup->GetSpawnParm(),1)) + { + char config[3]; + + thePickupList.HandleInfoEvent(PickupInfoList::event_PICKEDUP, self); + // indicate which flag we have + other->ctf_flags = self->ctf_flags; + gi.sound(other, CHAN_ITEM, gi.soundindex("weapons/gpistol/cock.wav"), 1.0, ATTN_IDLE, 0); // LOUD --PAT + + // remove the trigger from this object + self->solid = SOLID_NOT; + + // firstly, remove the ghoul object from the flag spawn edict + // be safe - shouldn't need this but better safe than sorry + if (self->objInfo) + { + delete self->objInfo; + self->objInfo = NULL; + } + game_ghoul.RemoveObjectInstances(self); + self->ghoulInst = NULL; + // have to do this or GHOUL complains + self->s.renderfx &= ~(RF_GHOUL|RF_GHOUL_SHADOW); + + // delimit the string correctly + config[0] = 'r'; + config[1] = other->s.number; + config[2] = 0; + // now add a flag to the player + if (self->ctf_flags == TEAM1) + { + flagname = "ctf_flag_blue"; + gi.configstring(CS_CTF_BLUE_STAT, config); + gi.SP_Print(NULL, DM_CTF_CAPTURE_FLAG_BLUE , other->s.number); + } + else + { + flagname = "ctf_flag_red"; + gi.configstring(CS_CTF_RED_STAT, config); + gi.SP_Print(NULL, DM_CTF_CAPTURE_FLAG_RED , other->s.number); + } + + // don't delete this edict, since we will need it to re-position the flag onto should we need to + self->ctf_flags = 0; + + PB_AddFlag(other, flagname, "flag_hold_idle"); + + // if we have a looping sound going already, don't interrupt it + if (!(other->s.sound)) + { + other->s.sound = gi.soundindex("player/flaglp.wav"); + other->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + + // send out the sound appropriate to each client dependant on which team we are on + for (int i=1; i<=game.maxclients;i++) + { + e2 = &g_edicts[i]; + if (!e2->inuse) + continue; + + if (!e2->client) + continue; + + //other wise, just a smaller bonus + if (e2->client->resp.team == other->client->resp.team) + { + // triumphant + gi.sound(e2,CHAN_VOICE,gi.soundindex("dm/ctf/triumphant.wav"),1.0,ATTN_NORM,0,SND_LOCALIZE_CLIENT); + } + else + { + // oh shit + gi.sound(e2,CHAN_VOICE,gi.soundindex("dm/ctf/flaggrab.wav"),1.0,ATTN_NORM,0,SND_LOCALIZE_CLIENT); + } + } + + + if (stricmp(flagname, self->classname)) + { + // remove the flag edict if it's not a flag spawn edict + G_FreeEdict(self); + } + + } + else + { + if(level.time>self->touch_debounce_time) + { + gi.SP_Print(other, pickup->GetItemFullStringIndex()); + self->touch_debounce_time = level.time + 5.0; + } + } + } + + // else, if its still an entity with a flag and its not at its base location, return it there + else if (self->ctf_flags) + { + thePickupList.HandleInfoEvent(PickupInfoList::event_TOUCHED, self); + + if (reset_flag(self, other)) + return; + + // give ourselves a bonus for returning the flag + other->client->resp.score += CTF_RECOVERY_BONUS; + if (self->ctf_flags == TEAM1) + { + gi.SP_Print(NULL, DM_CTF_RECOVER_FLAG_BLUE , other->s.number, CTF_RECOVERY_BONUS); + } + else + { + gi.SP_Print(NULL, DM_CTF_RECOVER_FLAG_RED , other->s.number, CTF_RECOVERY_BONUS); + } + + gi.sound(other,CHAN_NO_PHS_ADD,gi.soundindex("dm/ctf/flagret.wav"),1.0,ATTN_NONE,0,SND_LOCALIZE_GLOBAL); + + // remove the current edict entirely, ghoul model and all + G_FreeEdict(self); + } + } + } +} + +/* +=============== +itemCashTouch +=============== +*/ + +void itemCashTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ +/* if((other->client)&&(other->health>0)) + { + if(CPlayerStats *PlayerStats = GetPlayerStats(other)) + { + PlayerStats->AdjustCashOnHand(self->count); + + gi.sound(other, CHAN_ITEM, gi.soundindex("weapons/gpistol/cock.wav"), .6, ATTN_NORMAL, 0); + gi.cprintf(other,PRINT_MEDIUM,"Picked up %d %s\n", self->count,"dollars"); + + if((deathmatch->value)&&(!(self->spawnflags&DROPPED_ITEM))) + SetRespawn(self,30.0); // FIXME: propper time delay? + else + G_FreeEdict(self); + } + }*/ +} + +/* +=============== +tryToHeal + +FIXME (kinda): This will be needed as a helper imported by the player dll. +=============== +*/ +extern qboolean tryToHeal(edict_t *ent,int amountToHeal); + + +qboolean tryToHeal(edict_t *ent,int amountToHeal) +{ + int damagedHealth = ent->health; + if(ent->healthmax_health) + { + ent->health+=amountToHeal; + + if(ent->health>ent->max_health) + ent->health=ent->max_health; + + gi.sound(ent, CHAN_ITEM, gi.soundindex("dm/healthpu.wav"), 1.0, ATTN_IDLE, 0); // LOUD --PAT + + PB_RepairSkin(ent, damagedHealth); + ent->client->moveScale=0.0; + + return(true); + } + + return(false); +} + +/* +=============== +itemHealthTouch +=============== +*/ + +void itemHealthTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + Pickup *pickup = thePickupList.GetPickupFromEdict(self); + + if(pickup && (other->client)&&(other->health>0)) + { + if(tryToHeal(other,self->count)) + { + gi.sound(other, CHAN_ITEM, gi.soundindex("dm/healthpu.wav"), 1.0, ATTN_IDLE, 0); // LOUD --PAT + gi.SP_Print(other, pickup->GetPickupStringIndex()); + + thePickupList.HandleInfoEvent(PickupInfoList::event_PICKEDUP, self); + if((dm->isDM())&&(!(self->spawnflags&DROPPED_ITEM))) + { + dm->setRespawn(self,pickup->GetRespawnTime()); + } + else + { + G_FreeEdict(self); + } + } + thePickupList.HandleInfoEvent(PickupInfoList::event_TOUCHED, self); + } +} + +/* +=============== +I_Spawn +=============== +*/ + +void I_Spawn(edict_t *ent, Pickup *pickup) +{ + char *skinname = NULL; + +#ifndef _FINAL_ + if (thePickupList.WeaponArena(weaponarena->value)) + { // the number stored in weaponarena->value is an objType_t, an index into thePickupList. + //turn all pickups into the type represented by weaponarena->value. + if ( ((weaponarena->value) > OBJ_NONE) && ((weaponarena->value) < MAX_ITM_OBJS) ) + { + pickup = thePickupList.GetPickup(weaponarena->value); + } + else + { + // display help if value is invalid + thePickupList.WeaponArenaHelp(); + } + } +#endif // _FINAL_ + + // Classname. + + ent->classname = pickup->GetSpawnName(); + + // for some reason we get flags in a non dm game, so lets check them here, and deal with it + if (!stricmp("item_ctf_flag", ent->classname) && !dm->isDM()) + { + gi.dprintf ("No flags in normal singleplay\n"); + G_FreeEdict(ent); + return; + } + + // Ok, we want this item in the world, so go ahead and fill in the blanks. + + VectorSet (ent->mins,-8,-8,-8); // we'll adjust mins[2] after we scale the pickup + VectorSet (ent->maxs,8,8,8); + + ent->spawnflags|=SF_INVULNERABLE; + + // If this is a thrown knife that just stuck in something, handle it differently. + + if (ent->elasticity=255) + ent->elasticity=0; + + // kef -- don't change the edict's solidness after thePickupList.RegisterEdict() because it + //may get set within that fn, like if the pickup starts off in a crate + ent->solid = SOLID_TRIGGER; + + // Figure out the skiname and make it fullbright. + + skinname=pickup->GetSkin(); + + // if we are a CTF Flag, decide which color it should be + if (pickup->GetType() == PU_INV && pickup->GetPickupListIndex() == OBJ_CTF_FLAG) + { + if (ent->count == TEAM1) + { + skinname="ctf_flag_blue"; + gi.configstring(CS_CTF_BLUE_STAT, "h"); + } + else + { + skinname="ctf_flag_red"; + gi.configstring(CS_CTF_RED_STAT, "h"); + } + // make it so we can find these entities again should we want to relocate the flag + ent->classname = skinname; + } + + if(pickup->GetModelSpawnData() && pickup->GetModelSpawnData()->dir) + { + SimpleModelInit2(ent,pickup->GetModelSpawnData(),skinname,NULL); + if ( (pickup->GetType() == PU_ARMOR) && (dm->isDM()) ) + { // use special low-poly armor model + SimpleModelSetSequence(ent, pickup->GetLowPolyModel()->file, SMSEQ_HOLD); + } + // c4 pickups aren't supposed to blink + if (pickup->GetPickupListIndex() == OBJ_ITM_C4) + { + SimpleModelSetSequence(ent, pickup->GetModelSpawnData()->file, SMSEQ_HOLD); + } + } + else + { + gi.dprintf("No model specified for %s, can't spawn\n", ent->classname); + } + + // thePickupList already determined the scale for the pickups depending on type. + + IGhoulInst *pickupInst = ent->ghoulInst; + + if (pickupInst) + { + Matrix4 matPickup; + vec3_t adjMins = {0,0,0}; + float newScale = pickup->GetScale(); + + if (newScale != 1) + { + pickupInst->GetXForm(matPickup); + matPickup.Scale(newScale); + pickupInst->SetXForm(matPickup); + } + if (pickup->GetPickupListIndex() == OBJ_CTF_FLAG) + { + pickupInst->SetMyBolt("quake_ground"); + ent->mins[2] = 0; + pickupInst->SetFrameOverride("ctf_flag", skinname); + // indicate to everyone that this entity has a flag attached to it. + ent->ctf_flags = ent->count; + VectorSet (ent->mins,-12,-12,-10); + VectorSet (ent->maxs,12,12,30); + ent->s.renderfx |= RF_GHOUL_SHADOW; + } + VectorScale(ent->mins, newScale, ent->mins); + VectorScale(ent->maxs, newScale, ent->maxs); + pickup->GetBBoxAdjustMins(adjMins); + ent->mins[2] = adjMins[2]; + } + + st.color[0]=255; + st.color[1]=255; + st.color[2]=255; + + // 12/28/99 kef -- this is going to go away very soon + + ent->dmg=(pickup->GetPickupListIndex()); + + // Weapons should be precached. + + if(pickup->GetType() == PU_WEAPON) + { + AddWeaponTypeForPrecache(pickup->GetSpawnParm()); + } + + // What's this?? + // whatever it is, we don't want to do it if its a flag entity + if (!(pickup->GetType() == PU_INV && pickup->GetPickupListIndex() == OBJ_CTF_FLAG)) + { + if(ent->count==0) + ent->count=pickup->GetDefaultCount(); + else if(ent->count<0) + ent->count=gi.irand(0,ent->count*-1); + } + + // Set up touch function. + + ent->touch_debounce_time=0.0; + + switch(pickup->GetType()) + { + case PU_INV: + if (pickup->GetPickupListIndex() == OBJ_CTF_FLAG) + { + ent->touch = itemFlagTouch; + } + else + { + ent->touch = itemEquipTouch; + } + break; + + case PU_AMMO: + ent->touch = itemAmmoTouch; + // kef -- knives should lay flat when dropped + if (false && pickup->GetPickupListIndex() == OBJ_AMMO_KNIFE) + { + Matrix4 m; + ent->ghoulInst->GetXForm(m); + m.Rotate(0, M_PI*0.5); + m.CalcFlags(); + ent->ghoulInst->SetXForm(m); + } + break; + + case PU_WEAPON: + ent->touch = itemWeaponTouch; + break; + + case PU_ARMOR: + if (ent->count > 100) + { + // Make sure no more than 100 pts of armor. + + ent->count = 100; + } + ent->touch = itemArmorTouch; + break; + + case PU_CASH: + ent->touch = itemCashTouch; + break; + + case PU_HEALTH: + ent->touch = itemHealthTouch; + break; + + default: + break; + } + + if(dm->isDM()&&((pickup->GetType()==PU_ARMOR)||(pickup->GetType() == PU_WEAPON))&&(!(ent->spawnflags&DROPPED_ITEM))&&dm->dmRule_SPINNINGPICKUPS()) + { + ent->s.effects|=EF_SIMPLEROTATE; + if (pickup->GetType()==PU_WEAPON) + { + if (pickup->GetSpawnParm() == SFW_MACHINEGUN) // heavy MG is oriented differently + { + ent->s.angles[2]=-90.0; + } + else + { + ent->s.angles[2]=90.0; + } + } + ent->s.origin[2]+=6; + ent->gravity=0.0; + } + + gi.linkentity(ent); + + // 1/12/00 kef -- register this gem with thePickupList so we can check up on it each frame (as necessary). + //you can only register it _after_ you've set its classname, cuz that's how thePickupList knows which + //Pickup to associate with this edict_t. + thePickupList.RegisterEdict(ent); + + // be careful...checkItemAfterSpawn might just free the edict + if (dm->isDM()) + { + dm->checkItemAfterSpawn(ent, pickup); + } + +} + +/* +=============== +I_SpawnKnife +=============== +*/ + +void I_SpawnKnife(edict_t *ent) +{ + Pickup *pickup = thePickupList.GetPickup(OBJ_AMMO_KNIFE); + + if (pickup) + { + I_Spawn(ent,pickup); + + // don't want these jokers piling up + ent->think = G_FreeEdict; + + if(dm->dmRule_INFINITE_AMMO()) + { + ent->nextthink = level.time + 10.0; + } + else + { + ent->nextthink = level.time + 30.0; + } + } +} + +/* +=============== +I_SpawnArmor +=============== +*/ + +void I_SpawnArmor(edict_t *ent) +{ + Pickup *pickup = thePickupList.GetPickup(OBJ_ARMOR); + + if (pickup) + { + I_Spawn(ent,pickup); + } + // cuz the armor falls through the corpse (ARGH!!! WHY WHY WHY WHY WHY?!?!?!!!??) + ent->mins[2] -= 10; +} + +/* +=============== +MakeItem +=============== +*/ + +edict_t *MakeItem(char *name, vec3_t origin) +{ + Pickup *pickup = thePickupList.GetPickupFromSpawnName(name); + edict_t *ent=G_Spawn(); + + if (pickup && ent) + { + I_Spawn(ent,pickup); + } + VectorCopy(origin,ent->s.origin); + + return(ent); +} + diff --git a/Source/Game/gamecpp/g_lightmodels.cpp b/Source/Game/gamecpp/g_lightmodels.cpp new file mode 100644 index 0000000..ba95f82 --- /dev/null +++ b/Source/Game/gamecpp/g_lightmodels.cpp @@ -0,0 +1,1933 @@ +/****************************************************** + * Objects which are Lights * + ******************************************************/ + +#include "g_local.h" +#include "g_obj.h" +#include "callback.h" +#include "..\qcommon\configstring.h" + +#define HANGING_ONTABLE 8 +#define HANGING_NOANIM 16 + + +#define HLTH_LGHT_ALLEY_WALL 500 +#define HLTH_LGHT_ALLEY_WALL_OLD 500 +#define HLTH_LGHT_CAGED 500 +#define HLTH_LGHT_CANDELABRA 500 +#define HLTH_LGHT_CANDELABRA_SMALL 500 +#define HLTH_LGHT_CHANDELIER 500 +#define HLTH_LGHT_DESK_LAMP 500 +#define HLTH_LGHT_EMERGENCY 500 +#define HLTH_LGHT_EMERGENCY_BLUE 500 +#define HLTH_LGHT_HALFSHELL 500 +#define HLTH_LGHT_HANGING 500 +#define HLTH_LGHT_LANTERN 500 +#define HLTH_LGHT_LANTERN2 500 +#define HLTH_LGHT_LANTERN3 500 +#define HLTH_LGHT_MILITARY_DOOR 500 +#define HLTH_LGHT_MILITARY_DOOR_OUTSIDE 500 +#define HLTH_LGHT_SHOP 500 +#define HLTH_LGHT_STREET_MODERN 500 +#define HLTH_LGHT_STREET_OLD 500 +#define HLTH_LAMP_HANGING 500 + + +// light_generic... +void SP_light (edict_t *self); +void SP_light_generic_alley_wall (edict_t *ent); +void SP_light_generic_alley_wall_old (edict_t *ent); +void SP_light_generic_caged (edict_t *ent); +void SP_light_generic_candelabra(edict_t *ent); +void SP_light_generic_candelabra_small(edict_t *ent); +void SP_light_generic_chandelier (edict_t *ent); +void SP_light_generic_desk_lamp (edict_t *ent); +void SP_light_generic_emergency (edict_t *ent); +void SP_light_generic_emergency_blue (edict_t *ent); +void SP_light_generic_halfshell (edict_t *ent); +void SP_light_generic_hanging (edict_t *ent); +void SP_light_generic_lantern (edict_t *ent); +void SP_light_generic_lantern2 (edict_t *ent); +void SP_light_generic_lantern3 (edict_t *ent); +void SP_light_generic_military_door (edict_t *ent); +void SP_light_generic_military_door_outside (edict_t *ent); +void SP_light_generic_shop (edict_t *ent); +void SP_light_generic_street_modern (edict_t *ent); +void SP_light_generic_street_old (edict_t *ent); +void SP_light_generic_lamp_hang(edict_t *ent); + +spawn_t lightSpawns[] = +{ + // light_generic... + {"light", SP_light}, + {"light_generic_alley_wall", SP_light_generic_alley_wall}, + {"light_generic_alley_wall_old", SP_light_generic_alley_wall_old}, + {"light_generic_caged", SP_light_generic_caged}, + {"light_generic_candelabra", SP_light_generic_candelabra}, + {"light_generic_candelabra_small", SP_light_generic_candelabra_small}, + {"light_generic_chandelier", SP_light_generic_chandelier}, + {"light_generic_desk_lamp", SP_light_generic_desk_lamp}, + {"light_generic_emergency", SP_light_generic_emergency}, + {"light_generic_emergency_blue", SP_light_generic_emergency_blue}, + {"light_generic_halfshell", SP_light_generic_halfshell}, + {"light_generic_hanging", SP_light_generic_hanging}, + {"light_generic_lantern", SP_light_generic_lantern}, + {"light_generic_lantern2", SP_light_generic_lantern2}, + {"light_generic_lantern3", SP_light_generic_lantern3}, + {"light_generic_military_door", SP_light_generic_military_door}, + {"light_generic_military_door_outside", SP_light_generic_military_door_outside}, + {"light_generic_shop", SP_light_generic_shop}, + {"light_generic_street_modern", SP_light_generic_street_modern}, + {"light_generic_street_old", SP_light_generic_street_old}, + {"light_generic_lamp_hang", SP_light_generic_lamp_hang}, + {NULL, NULL}, +}; + +typedef enum +{ + OBJ_ALLEY_WALL = 0, + OBJ_ALLEY_WALL_OLD, + OBJ_CAGED, + OBJ_CANDLE, + OBJ_CANDLE2, + OBJ_CANDLE3, + OBJ_CANDELABRA, + OBJ_CANDELABRA_SMALL, + OBJ_CHANDELIER, + OBJ_DESK_LAMP, + OBJ_EMERGENCY, + OBJ_EMERGENCY_BLUE, + OBJ_HALFSHELL, + OBJ_HANGING, + OBJ_LANTERN, + OBJ_LANTERN2, + OBJ_LANTERN3, + OBJ_MILITARY_DOOR, + OBJ_MILITARY_DOOR_OUTSIDE, + OBJ_SHOP, + OBJ_STREET_MODERN, + OBJ_STREET_OLD, + OBJ_LAMP_HANG, + MAX_OBJS +}; + + +modelSpawnData_t lightModelData[MD_LIGHT_SIZE] = +{ +// dir file surfaceType material health solid material file cnt scale +"objects/light/alley_wall", "light", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_ALLEY_WALL, SOLID_NOT, NULL, 0, 0.0, NULL, // OBJ_ALLEY_WALL +"objects/light/alley_wall_old", "light", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_ALLEY_WALL_OLD, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_ALLEY_WALL_OLD +"objects/light/caged", "caged", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_CAGED, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_CAGED +"objects/light/candle", "candle", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_CANDELABRA, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_CANDLE +"objects/light/candle", "candle2", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_CANDELABRA, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_CANDLE2 +"objects/light/candle", "candle3", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_CANDELABRA, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_CANDLE3 +"objects/light/candle", "base", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_CANDELABRA, SOLID_BBOX, "candle", 0, 0.0, NULL, // OBJ_CANDELABRA +"objects/light/candle2", "base", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_CANDELABRA, SOLID_BBOX, "candle", 0, 0.0, NULL, // OBJ_CANDELABRA_SMALL +"objects/light/chandelier", "swing", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_CHANDELIER, SOLID_BBOX, "light", 0, 0.0, NULL, // OBJ_CHANDELIER +"objects/light/desk_lamp", "lamp", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_DESK_LAMP, SOLID_BBOX, "light", 0, 0.0, NULL, // OBJ_DESK_LAMP +"objects/light/emergency", "emergency", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_DESK_LAMP, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_EMERGENCY +"objects/light/emergency_blue", "emergency", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_DESK_LAMP, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_EMERGENCY_BLUE +"objects/light/halfshell", "shell", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_HANGING, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_HALFSHELL +"objects/light/hanging", "hanging", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_HANGING, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_HANGING +"objects/light/lantern", "lantern", SURF_METAL, MAT_WALL_WHITE, HLTH_LGHT_LANTERN, SOLID_BBOX, NULL, 8, DEBRIS_SM, NULL, // OBJ_LANTERN +"objects/light/lantern2", "lantern2", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_LANTERN2, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_LANTERN2 +"objects/light/lantern3", "lantern3", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_LANTERN3, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_LANTERN3 +"objects/light/military_door", "light", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_MILITARY_DOOR, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_MILITARY_DOOR +"objects/light/military_door_outside","light", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_MILITARY_DOOR_OUTSIDE,SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_MILITARY_DOOR_OUTSIDE +"objects/light/shop", "shop", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_SHOP, SOLID_BBOX, "light", 0, 0.0, NULL, // OBJ_SHOP +"objects/light/street_modern", "modern", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_STREET_MODERN, SOLID_NOT, NULL, 0, 0.0, NULL, // OBJ_STREET_MODERN +"objects/light/street_old", "old", SURF_METAL, MAT_METAL_RUSTY, HLTH_LGHT_STREET_OLD, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_STREET_OLD +"objects/light/lamp_hang", "lamp", SURF_METAL, MAT_METAL_RUSTY, HLTH_LAMP_HANGING, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_LAMP_HANG +}; + +//------------------------------------------------------------- +// For objects that break apart +//------------------------------------------------------------- +void candelabra_pain (edict_t *self,int partLost, vec3_t boltPos); + +// Breaking Light Parts Data enum +typedef enum +{ + BLPD_CANDELABRA = 0, + BLPD_MAX +}; + +// Breaking Light Parts Data for each object +objBreak_t lightObjBreak [BLPD_MAX] = +{ +// # of parts objParts ptr + 3, NULL, // BLPD_CANDELABRA +}; + + +// Breaking Light Parts Data for each part of each object +// WARNING: when updating this be sure to update lightObjBreak if more parts are added +objParts_t lightObjBoltPartsData[15] = +{ + // BLPD_CANDELABRA + "DUMMY01", 1, candelabra_pain, // candle 1 + "DUMMY02", 2, candelabra_pain, // candle 2 + "DUMMY03", 3, candelabra_pain, // candle 3 +}; + + +void kill_lamp(edict_t *ent) +{ + gi.configstring (CS_LIGHTS+ent->style, "a"); + ent->health = 50; + ent->die = LightBecomeDebris; +} + +void light_die (edict_t *ent, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point,vec3_t spray) +{ + + // Big damage completely takes out model + if ((ent->health - damage) < -100) + { + FX_MakeSparks(ent->s.origin, spray, 2); + LightBecomeDebris(ent,inflictor,attacker,damage,point); + return; + } + + // Lesser damage just kills lightbulb + if (!(ent->spawnflags & SF_LIGHT_START_OFF)) // Light is on + { + FX_MakeSparks(ent->s.origin, spray, 2); + gi.configstring (CS_LIGHTS+ent->style, "z"); + } + + ent->nextthink = level.time + FRAMETIME*2; + ent->think = kill_lamp; + +} + + +static void light_use2 (edict_t *self, edict_t *other, edict_t *activator) +{ + if (self->spawnflags & SF_LIGHT_START_OFF) + { + gi.configstring (CS_LIGHTS+self->style, "m"); + self->spawnflags &= ~SF_LIGHT_START_OFF; + } + else + { + gi.configstring (CS_LIGHTS+self->style, "a"); + self->spawnflags |= SF_LIGHT_START_OFF; + } +} + + + +void alley_wall_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is off, but it will be on + { + SimpleModelSetSequence(ent,"light",SMSEQ_HOLD); + + SimpleModelAddObject(ent,"BEAM"); + + } + else + { + SimpleModelSetSequence(ent,"light_off",SMSEQ_HOLD); + + SimpleModelRemoveObject(ent,"BEAM"); + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_alley_wall (0 1 0) (-48 -41 -53)(38 41 21) START_OFF VULNERABLE MOVEABLE +A light on the end of a long horizontal pole which should be mounted to a wall. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_alley_wall (edict_t *ent) +{ + VectorSet (ent->mins, -48, -41, -53); + VectorSet (ent->maxs, 38, 41, 21); + + SimpleModelInit2(ent,&lightModelData[OBJ_ALLEY_WALL],NULL,NULL); + + LightInit(ent); + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is off + { + SimpleModelSetSequence(ent,"light_off",SMSEQ_HOLD); + + SimpleModelRemoveObject(ent,"BEAM"); + } + + ent->use = alley_wall_use; + +} + +void alley_wall_old_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + char *partname = "SPRITEBALL_FLASH01"; + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is turning on + { + SimpleModelAddObject(ent,partname); + } + else // Light is turning off + { + SimpleModelSetSequence(ent,"light_off",SMSEQ_HOLD); + SimpleModelRemoveObject(ent,partname); + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_alley_wall_old (0 1 0) (-28 -4 -13) (4 4 9) START_OFF VULNERABLE MOVEABLE +An old-fashioned lamp on an arm which is to be mounted on a wall. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_alley_wall_old (edict_t *ent) +{ + VectorSet (ent->mins, -28, -4, -13); + VectorSet (ent->maxs, 4, 4, 9); + + SimpleModelInit2(ent,&lightModelData[OBJ_ALLEY_WALL_OLD],NULL,NULL); + + LightInit(ent); + + ent->use = alley_wall_old_use; + +} + +void caged_die (edict_t *ent, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + vec3_t spray; + char *partname = "SPRITEBALL_FLASH01"; + char *dir = "objects/light/caged_light"; + char *file = "caged_light"; + + VectorSet (spray, 0, 0, 80); // Goes up + + light_die (ent,inflictor,attacker,damage,point,spray); + + if (!(ent->spawnflags & SF_LIGHT_START_OFF)) // Light is on + { + SimpleModelRemoveObject(ent,partname); // Remove light flare + } +} + + +void caged_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + char *partname = "SPRITEBALL_FLASH02"; + char *part2name = "LIGHTBULB01"; + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is off, but it will be on + { + SimpleModelAddObject(ent,partname); + SimpleModelAddObject(ent,part2name); + } + else + { + SimpleModelRemoveObject(ent,partname); + SimpleModelRemoveObject(ent,part2name); + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_caged (0 1 0) (-3 -3 -10) (3 3 5) START_OFF VULNERABLE MOVEABLE +A small square light which hangs from the wall. It's in a metal cage. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_caged (edict_t *ent) +{ + solid_t solid; + char *partname = "SPRITEBALL_FLASH02"; + char *part2name = "LIGHTBULB01"; + + VectorSet (ent->mins, -3, -3, -10); + VectorSet (ent->maxs, 3, 3, 5); + + SimpleModelInit2(ent,&lightModelData[OBJ_CAGED],NULL,NULL); + + if (ent->spawnflags & SF_LIGHT_START_OFF) + { + SimpleModelRemoveObject(ent,partname); + SimpleModelRemoveObject(ent,part2name); + } + if (ent->spawnflags & SF_LIGHT_VULNERABLE) + solid = SOLID_BBOX; + else + solid = SOLID_NOT; + + LightInit(ent); + + ent->use = caged_use; + ent->die = caged_die; +} + +void chandelier_spin (edict_t *self) +{ + eft_rotate_t *rotInfo = NULL; + + if (rotInfo = FXA_GetRotate(self)) + { + rotInfo->zRot *= 0.75f; // Add friction + if (abs(rotInfo->zRot) < (0.3f * 512))//512 accounts for the shift induced by FXA_SetRotate() + { + // stop rotating + FXA_RemoveRotate(self); + self->think = NULL; + } + else + { + self->nextthink = level.time + 0.5f; + } + } +} + +#define CHANDELIER_MAXSPEED 5 + +void chandelier_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + eft_rotate_t *rotInfo = NULL; + float fMult; + vec3_t towherehit, cross, pathdir, up, angVel = {0,0,0}; + + SimpleModelSetSequence(ent,lightModelData[OBJ_CHANDELIER].file,SMSEQ_HOLD); + + fMult = 0.1f * damage; + + VectorSet(up, 0, 0, 1); + VectorSubtract(other->s.origin, ent->s.origin, pathdir); + VectorNormalize(pathdir); + VectorSubtract(wherehit,ent->s.origin, towherehit); + CrossProduct(pathdir, towherehit, cross); + if (DotProduct(cross, up) < 0) + { + if (rotInfo = FXA_GetRotate(ent)) + { + // adding to an existing rotation + rotInfo->zRot += fMult*512;//512 accounts for the shift induced by FXA_SetRotate() + } + else + { + // need to create a rotating effect + angVel[ROLL] = CHANDELIER_MAXSPEED; + FXA_SetRotate(ent, angVel, ent->ghoulInst); + } + } + else if (DotProduct(cross, up) > 0) + { + if (rotInfo = FXA_GetRotate(ent)) + { + // adding to an existing rotation + rotInfo->zRot += (-fMult)*512;//512 accounts for the shift induced by FXA_SetRotate() + } + else + { + // need to create a rotating effect + angVel[ROLL] = -CHANDELIER_MAXSPEED; + FXA_SetRotate(ent, angVel, ent->ghoulInst); + } + } + + if (rotInfo) + { + if (rotInfo->zRot > (CHANDELIER_MAXSPEED * 512)) + rotInfo->zRot = CHANDELIER_MAXSPEED * 512; + else if (rotInfo->zRot < (-CHANDELIER_MAXSPEED * 512)) + rotInfo->zRot = -CHANDELIER_MAXSPEED * 512; + } + + // need to think pretty often cuz that's where we'll slow down the light's rotation to simulate friction + ent->think = chandelier_spin; + ent->nextthink = level.time + 0.5f; +} + +void chandelier_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is off, but it will be on + { + SimpleModelAddObject(ent,"SPRITEBALL_FLASH01"); + SimpleModelAddObject(ent,"SPRITEBALL_FLASH02"); + SimpleModelAddObject(ent,"SPRITEBALL_FLASH03"); + SimpleModelAddObject(ent,"SPRITEBALL_FLASH04"); + } + else + { + SimpleModelRemoveObject(ent,"SPRITEBALL_FLASH01"); + SimpleModelRemoveObject(ent,"SPRITEBALL_FLASH02"); + SimpleModelRemoveObject(ent,"SPRITEBALL_FLASH03"); + SimpleModelRemoveObject(ent,"SPRITEBALL_FLASH04"); + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_chandelier (0 1 0) (-24 -21 -0) (25 21 51) START_OFF VULNERABLE MOVEABLE +A chandelier light which hangs from the ceiling. +------ KEYS ------ +Light - how bright it is (default 300) +Skin - +0 - gold chandelier +1 - iron chandelier +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +- Swings and spins when shot +*/ +void SP_light_generic_chandelier (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -24, -21, -0); + VectorSet (ent->maxs, 25, 21, 51); + + ent->pain = chandelier_pain; + + if (!(ent->spawnflags & SF_LIGHT_VULNERABLE)) + ent->health = 999999; + + ent->spawnflags |= SF_LIGHT_VULNERABLE; + + switch (ent->s.skinnum) + { + case 1: + skinname = "light2"; + break; + default : + skinname = "light"; + break; + } + + SimpleModelInit2(ent,&lightModelData[OBJ_CHANDELIER],skinname,NULL); + + LightInit(ent); + + ent->ghoulInst->Pause(level.time); + + ent->use = chandelier_use; +} + + +void desk_lamp_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + char *partname = "SPRITEBALL_FLASH01"; + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is off, but it will be on + { + SimpleModelSetSequence(ent,"lamp",SMSEQ_HOLD); + SimpleModelAddObject(ent,partname); + } + else + { + SimpleModelSetSequence(ent,"lamp_off",SMSEQ_HOLD); + SimpleModelRemoveObject(ent,partname); + } + + light_use2(ent,other,activator); + +} + + + +/*QUAKED light_generic_desk_lamp (0 1 0) (-6 -6 -5) (6 6 5) START_OFF VULNERABLE MOVEABLE +A small desk lamp. +------ KEYS ------ +Light - how bright it is (default 300) +Skin - skin of model +0 - bronze +1 - silver +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - will move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_desk_lamp (edict_t *ent) +{ + char * skinname; + + VectorSet (ent->mins, -6, -6, -5); + VectorSet (ent->maxs, 6, 6, 5); + + switch (ent->s.skinnum) + { + case 1: + skinname = "lightsilver"; + break; + default : + skinname = "light"; + break; + } + + SimpleModelInit2(ent,&lightModelData[OBJ_DESK_LAMP],skinname,NULL); + + LightInit(ent); + + ent->use = desk_lamp_use; +} + +void emergency_light_sequence (edict_t *ent) +{ + ggObjC *simpObj; + GhoulID simpSeq; + ggOinstC* myInstance; + + if (!ent->ghoulInst) + { + return; + } + + simpObj = game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + if (!simpObj) + { + return; + } + + //changed this to false, can't cache new seqs in after instances are created --ss + simpSeq = simpObj->FindSequence(lightModelData[OBJ_EMERGENCY].file); + + if (!simpSeq) + { + return; + } + + myInstance = simpObj->FindOInst(ent->ghoulInst); + if (!myInstance) + { + return; + } + + // Play sequence + myInstance->PlaySequence(simpSeq, level.time); + +} + +void emergency_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is off, but it will be on + { + SimpleModelSetSequence(ent,"emergency",SMSEQ_LOOP); + ent->s.sound = gi.soundindex("Ambient/Models/Alarm/alarm1.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + ent->think = emergency_light_sequence; + ent->nextthink = level.time + (rand() % 10) * .1; + } + else + { + SimpleModelSetSequence(ent,"emergency_off",SMSEQ_HOLD); + ent->s.sound = 0; + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_emergency (0 1 0) (-6 -6 -5) (6 6 5) START_OFF VULNERABLE MOVEABLE +A flashing emergency light +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - will move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_emergency (edict_t *ent) +{ + VectorSet (ent->mins, -6, -6, -5); + VectorSet (ent->maxs, 6, 6, 5); + + SimpleModelInit2(ent,&lightModelData[OBJ_EMERGENCY],NULL,NULL); + + LightInit(ent); + + gi.soundindex("Ambient/Models/Alarm/alarm1.wav"); + if (ent->spawnflags & SF_LIGHT_START_OFF) + { + SimpleModelSetSequence(ent,"emergency_off",SMSEQ_HOLD); + } + else + { + ent->s.sound = gi.soundindex("Ambient/Models/Alarm/alarm1.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + ent->think = emergency_light_sequence; + ent->nextthink = level.time + (rand() % 5) * .1; + } + + SimpleModelScale(ent,1.75f); + + ent->use = emergency_use; + +} +void emergency_light_blue_sequence (edict_t *ent) +{ + ggObjC *simpObj; + GhoulID simpSeq; + ggOinstC* myInstance; + + if (!ent->ghoulInst) + { + return; + } + + simpObj = game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + if (!simpObj) + { + return; + } + + //changed this to false, can't cache new seqs in after instances are created --ss + simpSeq = simpObj->FindSequence(lightModelData[OBJ_EMERGENCY_BLUE].file); + + if (!simpSeq) + { + return; + } + + myInstance = simpObj->FindOInst(ent->ghoulInst); + if (!myInstance) + { + return; + } + + // Play sequence + myInstance->PlaySequence(simpSeq, level.time); + +} + +void emergency_blue_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is off, but it will be on + { + SimpleModelSetSequence(ent,"emergency",SMSEQ_LOOP); + ent->s.sound = gi.soundindex("Ambient/Models/Alarm/alarm1.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + ent->think = emergency_light_sequence; + ent->nextthink = level.time + (rand() % 10) * .1; + } + else + { + SimpleModelSetSequence(ent,"emergency_off",SMSEQ_HOLD); + ent->s.sound = 0; + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_emergency_blue (0 1 0) (-6 -6 -5) (6 6 5) START_OFF VULNERABLE MOVEABLE +A flashing blue emergency light +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - will move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_emergency_blue (edict_t *ent) +{ + VectorSet (ent->mins, -6, -6, -5); + VectorSet (ent->maxs, 6, 6, 5); + + SimpleModelInit2(ent,&lightModelData[OBJ_EMERGENCY_BLUE],NULL,NULL); + + LightInit(ent); + gi.soundindex("Ambient/Models/Alarm/alarm1.wav"); + if (ent->spawnflags & SF_LIGHT_START_OFF) + { + gi.soundindex("Ambient/Models/Alarm/alarm1.wav"); + SimpleModelSetSequence(ent,"emergency_off",SMSEQ_HOLD); + } + else + { + ent->s.sound = gi.soundindex("Ambient/Models/Alarm/alarm1.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + ent->think = emergency_light_blue_sequence; + ent->nextthink = level.time + (rand() % 5) * .1; + } + + SimpleModelScale(ent,1.75f); + + ent->use = emergency_blue_use; + +} + +/*QUAKED light_generic_halfshell (0 1 0) (-2 -7 -2) (2 7 2) START_OFF VULNERABLE MOVEABLE +An old-fashioned lamp on an arm which is to be mounted on a wall. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_halfshell (edict_t *ent) +{ + + VectorSet (ent->mins, -2, -7, -2); + VectorSet (ent->maxs, 2, 7, 2); + + SimpleModelInit2(ent,&lightModelData[OBJ_HALFSHELL],NULL,NULL); + + LightInit(ent); + +} + + +void hanging_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + int per; + char soundName[MAX_QPATH]; + + per = gi.irand(1,3); + Com_sprintf(soundName,MAX_QPATH,"Weapons/FX/Rics/ric%d.wav",per); + + gi.sound (ent, CHAN_VOICE, gi.soundindex(soundName), .6, ATTN_NORM, 0); + + if (ent->spawnflags & SF_LIGHT_START_OFF) + { + SimpleModelSetSequence(ent,"hanging_off",SMSEQ_HOLD); + } + else + { + SimpleModelSetSequence(ent,"hanging",SMSEQ_HOLD); + } + +} + + +void hanging_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is off, but it will be on + { + SimpleModelSetSequence(ent,"hanging",SMSEQ_HOLD); + + ent->ghoulInst->Pause(level.time); + + SimpleModelAddObject(ent,"SPRITEBALL_FLASH01"); + + } + else + { + SimpleModelSetSequence(ent,"hanging_off",SMSEQ_HOLD); + + ent->ghoulInst->Pause(level.time); + + SimpleModelRemoveObject(ent,"SPRITEBALL_FLASH01"); + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_hanging (0 1 0) (-10 -10 -6) (10 10 44) START_OFF VULNERABLE MOVEABLE +Square light hanging from a cord. Attach to ceiling. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - will move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +- Swings when shot +*/ +void SP_light_generic_hanging (edict_t *ent) +{ + + + VectorSet (ent->mins, -10, -10, -6); + VectorSet (ent->maxs, 10, 10, 44); + + ent->pain = hanging_pain; + + if (!(ent->spawnflags & SF_LIGHT_VULNERABLE)) + ent->health = 999999; + + ent->spawnflags |= SF_LIGHT_VULNERABLE; + + SimpleModelInit2(ent,&lightModelData[OBJ_HANGING],NULL,NULL); + + LightInit(ent); + + if (ent->spawnflags & SF_LIGHT_START_OFF) + { + SimpleModelSetSequence(ent,"hanging_off",SMSEQ_HOLD); + + ent->ghoulInst->Pause(level.time); + + SimpleModelRemoveObject(ent,"SPRITEBALL_FLASH01"); + } + else + { + ent->ghoulInst->Pause(level.time); + } + + ent->use = hanging_use; +} + + +void lantern_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is off + SimpleModelSetSequence(ent,"lantern_off",SMSEQ_HOLD); + else + SimpleModelSetSequence(ent,lightModelData[OBJ_LANTERN].file,SMSEQ_HOLD); +} + +void lantern_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is off, but it will be on + { + SimpleModelSetSequence(ent,"lantern",SMSEQ_HOLD); + ent->ghoulInst->Pause(level.time); + } + else + { + SimpleModelSetSequence(ent,"lantern_off",SMSEQ_HOLD); + ent->ghoulInst->Pause(level.time); + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_lantern (0 1 0) (-7 -6 -22) (7 6 22) START_OFF VULNERABLE MOVEABLE +A hanging Chinese lantern. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - will move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +- Swings when shot +*/ +void SP_light_generic_lantern (edict_t *ent) +{ + VectorSet (ent->mins, -7, -6, -22); + VectorSet (ent->maxs, 7, 6, 22); + + ent->pain = lantern_pain; + + if (!(ent->spawnflags & SF_LIGHT_VULNERABLE)) + ent->health = 999999; + + ent->spawnflags |= SF_LIGHT_VULNERABLE; + + SimpleModelInit2(ent,&lightModelData[OBJ_LANTERN],NULL,NULL); + + LightInit(ent); + + ent->ghoulInst->Pause(level.time); + + ent->use = lantern_use; +} + +void lantern2_die (edict_t *ent, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + vec3_t spray; + char *partname = "SPRITEBALL_FLASH01"; + + VectorSet (spray, 0, 0, 80); // Goes up + + light_die (ent,inflictor,attacker,damage,point,spray); + + if (!(ent->spawnflags & SF_LIGHT_START_OFF)) // Light is on + { + SimpleModelRemoveObject(ent,partname); // Remove light flare + } +} + + +void lantern2_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + char *partname = "SPRITEBALL_FLASH01"; + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is on + { + SimpleModelSetSequence(ent,"lantern2",SMSEQ_HOLD); + SimpleModelAddObject(ent,partname); + } + else + { + SimpleModelSetSequence(ent,"lantern2_off",SMSEQ_HOLD); + SimpleModelRemoveObject(ent,partname); + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_lantern2 (0 1 0) (-8 -7 -9) (4 7 8) START_OFF VULNERABLE MOVEABLE +A square light attached to the wall by a small pole. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - will move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_lantern2 (edict_t *ent) +{ + solid_t solid; + char *partname = "SPRITEBALL_FLASH01"; + + VectorSet (ent->mins, -8, -7, -9); + VectorSet (ent->maxs, 8, 7, 8); + + SimpleModelInit2(ent,&lightModelData[OBJ_LANTERN2],NULL,NULL); + + if (ent->spawnflags & SF_LIGHT_START_OFF) + SimpleModelRemoveObject(ent,partname); + + if (ent->spawnflags & SF_LIGHT_VULNERABLE) + solid = SOLID_BBOX; + else + solid = SOLID_NOT; + + LightInit(ent); + + ent->use = lantern2_use; + ent->die = lantern2_die; +} + + +void lantern3_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + char *partname = "SPRITEBALL_FLASH01"; + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is on + { + SimpleModelSetSequence(ent,"lantern3",SMSEQ_HOLD); + SimpleModelAddObject(ent,partname); + } + else + { + SimpleModelSetSequence(ent,"lantern3",SMSEQ_HOLD); + SimpleModelRemoveObject(ent,partname); + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_lantern3 (0 1 0) (-7 -7 -13) (4 7 8) START_OFF VULNERABLE MOVEABLE +A square light attached to the wall by a small pole. Low polycount. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - will move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_lantern3 (edict_t *ent) +{ + solid_t solid; + char *partname = "SPRITEBALL_FLASH01"; + + VectorSet (ent->mins, -7, -7, -13); + VectorSet (ent->maxs, 4, 7, 8); + + SimpleModelInit2(ent,&lightModelData[OBJ_LANTERN3],NULL,NULL); + + if (ent->spawnflags & SF_LIGHT_START_OFF) + SimpleModelRemoveObject(ent,partname); + + if (ent->spawnflags & SF_LIGHT_VULNERABLE) + solid = SOLID_BBOX; + else + solid = SOLID_NOT; + + LightInit(ent); + + ent->use = lantern3_use; +} + +void military_door_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + char *partname = "SPRITEBALL_FLASH01"; + char *partname2 = "LIGHT_BULB01"; + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is on + { + SimpleModelAddObject(ent,partname); + SimpleModelAddObject(ent,partname2); + } + else + { + SimpleModelRemoveObject(ent,partname); + SimpleModelRemoveObject(ent,partname2); + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_military_door (0 1 0) (-6 -6 -2) (6 9 3) START_OFF VULNERABLE MOVEABLE +A little bent light to be hung above doors. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +--------SPAWNFLAGS---------- +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, won't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_military_door (edict_t *ent) +{ + solid_t solid; + + VectorSet (ent->mins, -6, -6, -2); + VectorSet (ent->maxs, 6, 9, 3); + + SimpleModelInit2(ent,&lightModelData[OBJ_MILITARY_DOOR],NULL,NULL); + + if (ent->spawnflags & SF_LIGHT_VULNERABLE) + solid = SOLID_BBOX; + else + solid = SOLID_NOT; + + LightInit(ent); + + ent->use = military_door_use; +} + + +void military_door_outside_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + char *partname = "SPRITEBALL_FLASH01"; + char *partname2 = "BEAM01"; + char *partname3 = "LIGHT_BULB01"; + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is on + { + SimpleModelAddObject(ent,partname); + SimpleModelAddObject(ent,partname2); + SimpleModelAddObject(ent,partname3); + } + else + { + SimpleModelRemoveObject(ent,partname); + SimpleModelRemoveObject(ent,partname2); + SimpleModelRemoveObject(ent,partname3); + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_military_door_outside (0 1 0) (-19 -22 -8) (19 27 10) START_OFF VULNERABLE MOVEABLE +A big bent light to be hung above doors. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, won't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_military_door_outside (edict_t *ent) +{ + solid_t solid; + + VectorSet (ent->mins, -19, -22, -8); + VectorSet (ent->maxs, 19, 27, 10); + + SimpleModelInit2(ent,&lightModelData[OBJ_MILITARY_DOOR_OUTSIDE],NULL,NULL); + + if (ent->spawnflags & SF_LIGHT_VULNERABLE) + solid = SOLID_BBOX; + else + solid = SOLID_NOT; + + LightInit(ent); + + ent->use = military_door_outside_use; +} + +void shop_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + int per; + char soundName[60]; + + per = gi.irand(1,3); + sprintf(soundName,"Weapons/FX/Rics/ric%d.wav",per); + + gi.sound (ent, CHAN_VOICE, gi.soundindex(soundName), .6, ATTN_NORM, 0); + + if (ent->spawnflags & SF_LIGHT_START_OFF) + { + SimpleModelSetSequence(ent,"shop_off",SMSEQ_HOLD); + } + else + { + SimpleModelSetSequence(ent,"shop",SMSEQ_HOLD); + } + +} + + +void shop_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is on + { + SimpleModelSetSequence(ent,"shop",SMSEQ_HOLD); + ent->ghoulInst->Pause(level.time); + } + else + { + SimpleModelSetSequence(ent,"shop_off",SMSEQ_HOLD); + ent->ghoulInst->Pause(level.time); + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_shop (0 1 0) (-19 -23 -4) (19 22 32) START_OFF VULNERABLE MOVEABLE +Rectangular light hanging from two poles. Attach to ceiling. +------ KEYS ------ +Light - how bright it is (default 300) +Skin - +0 - normal +1 - wire mesh over it +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +--------SPAWNFLAGS---------- +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +- Swings when shot +*/ +void SP_light_generic_shop (edict_t *ent) +{ + char * skinname; + + VectorSet (ent->mins, -19, -23, -4); + VectorSet (ent->maxs, 19, 22, 32); + + switch (ent->s.skinnum) + { + case 1: + skinname = "light2"; + break; + default : + skinname = "light"; + break; + } + + if (!(ent->spawnflags & SF_LIGHT_VULNERABLE)) + ent->health = 999999; + + ent->spawnflags |= SF_LIGHT_VULNERABLE; + + SimpleModelInit2(ent,&lightModelData[OBJ_SHOP],skinname,NULL); + + LightInit(ent); + + ent->ghoulInst->Pause(level.time); + + ent->use = shop_use; + ent->pain = shop_pain; +} + +void street_modern_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + char *partname = "SPRITEBALL_GLOW"; + char *partname2 = "BEAM"; + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is on + { + SimpleModelAddObject(ent,partname); + SimpleModelAddObject(ent,partname2); + SimpleModelSetSequence(ent,"modern",SMSEQ_HOLD); + } + else + { + SimpleModelSetSequence(ent,"modern_off",SMSEQ_HOLD); + SimpleModelRemoveObject(ent,partname); + SimpleModelRemoveObject(ent,partname2); + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_street_modern (0 1 0) (-88 -75 -218) (75 75 17) START_OFF VULNERABLE MOVEABLE +A tall street light. Sits on ground. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_street_modern (edict_t *ent) +{ + VectorSet (ent->mins, -88, -75, -218); + VectorSet (ent->maxs, 75, 75, 17); + + SimpleModelInit2(ent,&lightModelData[OBJ_STREET_MODERN],NULL,NULL); + + LightInit(ent); + + ent->use = street_modern_use; +} + +void street_old_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + char *partname = "SPRITEBALL_FLASH"; + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is on + { + SimpleModelAddObject(ent,partname); + SimpleModelSetSequence(ent,"old",SMSEQ_HOLD); + } + else + { + SimpleModelSetSequence(ent,"off",SMSEQ_HOLD); + SimpleModelRemoveObject(ent,partname); + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_street_old (0 1 0) (-7 -7 -48) (7 7 48) START_OFF VULNERABLE MOVEABLE +An old fashioned street light (vertical pole/lamp) +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_street_old (edict_t *ent) +{ + VectorSet (ent->mins, -7, -7, -48); + VectorSet (ent->maxs, 7, 7, 48); + + SimpleModelInit2(ent,&lightModelData[OBJ_STREET_OLD],NULL,NULL); + + LightInit(ent); + + ent->use = street_old_use; +} + +void lamp_hang_swing (edict_t *ent) +{ + if (ent->spawnflags & HANGING_NOANIM) // No animating + { + ent->ghoulInst->Pause(level.time); + } + else + { + SimpleModelSetSequence(ent,lightModelData[OBJ_LAMP_HANG].file,SMSEQ_LOOP); + } +} + +HanginLightCallback theHanginLightCallback; + +bool HanginLightCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + edict_t* self = (edict_t*)ent; + + lamp_hang_swing(self); + + return true; +} + +void lamp_hang_painstop (edict_t *ent) +{ + GhoulID tempNote=0; + ggObjC *cLight; + + if (!ent->ghoulInst) + { + return; + } + + cLight = game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + tempNote=cLight->GetMyObject()->FindNoteToken("EOS"); + + ent->ghoulInst->RemoveNoteCallBack(&theHanginLightCallback,tempNote); + lamp_hang_swing (ent); +} + +void lamp_hang_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + GhoulID tempNote=0; + ggObjC *cLight; + + if (!ent->ghoulInst) + { + return; + } + + if (ent->spawnflags & SF_LIGHT_START_OFF) + SimpleModelSetSequence(ent,"shot_off",SMSEQ_HOLD); + else + SimpleModelSetSequence(ent,"shot",SMSEQ_HOLD); + + // register a callback for the end of the pain sequence + cLight = game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + tempNote=cLight->GetMyObject()->FindNoteToken("EOS"); + + if (tempNote && ent->ghoulInst) + { + ent->ghoulInst->AddNoteCallBack(&theHanginLightCallback,tempNote); + } + +} + +void lamp_hang_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + char *partname = "SPRITEBALL_FLASH01"; + char *partname2 = "SPRITEBALL_FLASH02"; + + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is on + { + SimpleModelAddObject(ent,partname); + SimpleModelAddObject(ent,partname2); + if (ent->spawnflags & HANGING_NOANIM) // No animating + SimpleModelSetSequence(ent,"lamp",SMSEQ_HOLD); + else + SimpleModelSetSequence(ent,"lamp",SMSEQ_LOOP); + } + else + { + SimpleModelRemoveObject(ent,partname); + SimpleModelRemoveObject(ent,partname2); + if (ent->spawnflags & HANGING_NOANIM) // No animating + SimpleModelSetSequence(ent,"lamp_off",SMSEQ_HOLD); + else + SimpleModelSetSequence(ent,"lamp_off",SMSEQ_LOOP); + } + + light_use2(ent,other,activator); +} + +/*QUAKED light_generic_lamp_hang (0 1 0) (-6 -7 -10) (5 7 15) START_OFF VULNERABLE MOVEABLE TABLE NOANIM +A train swinging lamp. Can be hung from ceiling or placed on a table. +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +TABLE - can be placed on a table +NOANIM - won't animate +------ SPECIALS ------ +- If targeted, will toggle between on and off. +- Swings when shot +*/ +void SP_light_generic_lamp_hang(edict_t *ent) +{ + VectorSet (ent->mins, -6, -7, -10); + VectorSet (ent->maxs, 5, 7, 15); + + if (!(ent->spawnflags & SF_LIGHT_VULNERABLE)) + ent->health = 999999; + + ent->spawnflags |= SF_LIGHT_VULNERABLE; + + ent->pain = lamp_hang_pain; + + SimpleModelInit2(ent,&lightModelData[OBJ_LAMP_HANG],NULL,NULL); + + LightInit(ent); + + if (ent->spawnflags & HANGING_ONTABLE) // Sit still on a table + { + SimpleModelRemoveObject(ent,"HANDLE_LANTERN"); + + SimpleModelRemoveObject(ent,"ROPE_LANTERN"); + + ent->ghoulInst->Pause(level.time); + + ent->pain = NULL; + gi.linkentity (ent); + + } + else if (ent->spawnflags & HANGING_NOANIM) // No animating + { + ent->ghoulInst->Pause(level.time); + } + else + { + ent->think = lamp_hang_swing; + ent->nextthink = level.time + (rand() % 5); + } + + ent->use = lamp_hang_use; +} + +// called when a candle is shot off of the candelabra +void candelabra_pain (edict_t *self,int partLost, vec3_t boltPos) +{ + // Throw debris and make it go away + FX_ThrowDebris(boltPos, vec3_up, 5, DEBRIS_SM, MAT_WALL_WHITE, 0,0,0, SURF_BLOOD); + FX_SmokePuff(boltPos,120,120,120,200); +} + + + +void candelabra_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + char *partname = "SPRITEBALL_FLASH03"; + char *partname2 = "SPRITEBALL_FLAME01"; + IGhoulInst* inst = NULL; + int i = 0; + boltInstInfo_c *instInfo = NULL; + + if (!ent->objInfo || !(instInfo = (boltInstInfo_c*)ent->objInfo->GetInfo(OIT_BOLTINST)) ) + { + return; + } + if (ent->spawnflags & SF_LIGHT_START_OFF) // Light is turning on + { + for (i = 1; i <= 3; i++) + { + if ( instInfo && instInfo->IsOn(i) && (inst = SimpleModelGetBolt(ent, i)) ) + { + SimpleModelAddObject2(inst,partname); + SimpleModelAddObject2(inst,partname2); + } + } + } + else // Light is turning off + { + for (i = 1; i <= 3; i++) + { + if (inst = SimpleModelGetBolt(ent, i)) + { + SimpleModelRemoveObject2(inst,partname); + SimpleModelRemoveObject2(inst,partname2); + } + } + } + + light_use2(ent,other,activator); +} + + +/*QUAKED light_generic_candelabra (0 1 0) (-11 -11 -55) (11 11 23) START_OFF VULNERABLE MOVEABLE +Tall candelabra, intended for floor placement in only the finest Transylvanian homes. +------ KEYS ------ +Skin - +0 - gold candelabra +1 - iron candelabra +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, won't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_candelabra(edict_t *ent) +{ + Matrix4 mat1,mat2; + char *skinname; + int nRand = gi.irand(0, 2); + + VectorSet (ent->mins, -11, -11, -55); + VectorSet (ent->maxs, 11, 11, 23); + + ent->spawnflags |= SF_LIGHT_VULNERABLE; + + if (ent->spawnflags & SF_INVULNERABLE) + { + ent->takedamage = DAMAGE_NO; + } + else + { + ent->takedamage = DAMAGE_YES; + } + + switch (ent->s.skinnum) + { + case 1: + skinname = "candle2"; + break; + default : + skinname = "candle"; + break; + } + + // Set up object to break apart when shot + Obj_partbreaksetup (BLPD_CANDELABRA,&lightModelData[OBJ_CANDELABRA], + lightObjBoltPartsData, lightObjBreak); + + SimpleModelInit2(ent,&lightModelData[OBJ_CANDELABRA],skinname,NULL); + + // bolt the three different candle models on in random order + SimpleModelAddBolt(ent,lightModelData[OBJ_CANDELABRA],"DUMMY01", + lightModelData[OBJ_CANDLE + (nRand++ % 3)],"DUMMY01",NULL); + SimpleModelAddBolt(ent,lightModelData[OBJ_CANDELABRA],"DUMMY02", + lightModelData[OBJ_CANDLE + (nRand++ % 3)],"DUMMY01",NULL); + SimpleModelAddBolt(ent,lightModelData[OBJ_CANDELABRA],"DUMMY03", + lightModelData[OBJ_CANDLE + (nRand % 3)],"DUMMY01",NULL); + ent->pain = Obj_partpain; + + + LightInit(ent); + + ent->use = candelabra_use; +} + +/*QUAKED light_generic_candelabra_small (0 1 0) (-10 -5 -17) (10 5 0) START_OFF VULNERABLE MOVEABLE +Candelabra for a table +------ KEYS ------ +Light - how bright it is (default 300) +Style - type of light given off +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning +------ SPAWNFLAGS ------ +START_OFF - Will turn on if triggered +VULNERABLE - can be destroyed +MOVEABLE - N/A, can't ever move +------ SPECIALS ------ +- If targeted, will toggle between on and off. +*/ +void SP_light_generic_candelabra_small (edict_t *ent) +{ + VectorSet (ent->mins, -10, -5, -17); + VectorSet (ent->maxs, 10, 5, 0); + + + SimpleModelInit2(ent,&lightModelData[OBJ_CANDELABRA_SMALL],NULL,NULL); + + LightInit(ent); +} diff --git a/Source/Game/gamecpp/g_local.h b/Source/Game/gamecpp/g_local.h new file mode 100644 index 0000000..51dd4af --- /dev/null +++ b/Source/Game/gamecpp/g_local.h @@ -0,0 +1,1361 @@ +// g_local.h -- local definitions for game module + +// Prevent multiple inclusion. Why do id never do this? Sloppy. +#pragma once + +#include "q_shared.h" +#include "..\qcommon\mathlib.h" + +// define GAME_INCLUDE so that game.h does not define the +// short, server-visible gclient_t and edict_t structures, +// because we define the full size ones in this file +#define GAME_INCLUDE +#include "game.h" + +#include "list.h" +//#include "g_sf_local.h" + +#include "fx_effects.h" +#include "q_sh_fx.h" +#include "..\ghoul\ighoul.h" +#include "g_ghoul.h" +#include "dm.h" +#include "g_obj.h" + +#include "w_public.h" +#include "w_types.h" +#include "player.h" + +#include "CWeaponInfo.h" + +#include "ai_public.h" + +//#include "g_econ.h" +#include "fields.h" +#include "g_skilllevels.h" + +// #include "..\server\ipath.h" + +// the "gameversion" client command will print this plus compile date +#define GAMEVERSION "base" + +//============================================================================ + +// protocol bytes that can be directly added to messages +#define svc_temp_entity 1 +#define svc_unused 2 +#define svc_inventory 3 +#define svc_sound_info 4 +#define svc_effect 5 +#define svc_equip 6 + +//================================================================== + +// view pitching times +#define DAMAGE_TIME 0.5 +#define FALL_TIME 0.3 + + +// edict->spawnflags +// these are set with checkboxes on each entity in the map editor +#define SPAWNFLAG_NOT_EASY 0x00000100 +#define SPAWNFLAG_NOT_MEDIUM 0x00000200 +#define SPAWNFLAG_NOT_HARD 0x00000400 +#define SPAWNFLAG_NOT_DEATHMATCH 0x00000800 +#define SPAWNFLAG_NOT_COOP 0x00001000 + +#define TIME_ENTS (0) + +typedef struct +{ + char *name; + void (*spawn)(edict_t *ent); +#if TIME_ENTS + unsigned long time_used; + int count; +#endif // TIME_ENTS +} spawn_t; + + +// edict->flags +// FIXME: get rid of old q2 flags to save some space here, eh? +#define FL_FLY 0x00000001 +#define FL_SWIM 0x00000002 // implied immunity to drowining +#define FL_IMMUNE_LASER 0x00000004 +#define FL_INWATER 0x00000008 +#define FL_GODMODE 0x00000010 +#define FL_NOTARGET 0x00000020 +#define FL_IMMUNE_SLIME 0x00000040 +#define FL_IMMUNE_LAVA 0x00000080 +#define FL_PARTIALGROUND 0x00000100 // not all corners are valid +#define FL_WATERJUMP 0x00000200 // player jumping out of water +#define FL_TEAMSLAVE 0x00000400 // not the first on the team +#define FL_NO_KNOCKBACK 0x00000800 +#define FL_POWER_ARMOR 0x00001000 // power armor (if any) is active +#define FL_BODY_DAMAGE 0x00002000 // set when player takes physical damage +#define FL_ARMOR_DAMAGE 0x00004000 // set when armor is damaged +#define FL_LEAN_PLAYER 0x00008000 // set when player is leaning +#define FL_SPAWNED_IN 0x00010000 // stuff with this flag wasn't originally here +#define FL_CINEMATIC_CULL 0x00020000 // cull this joker out of current cinematic +#define FL_IAMTHEBOSS 0x00040000 // convient way to tell who is Dekker, or Dekker like +#define FL_NUGBUDDY 0x00100000 // set when player is crouching in deathmatch +#define FL_WEAPONBUDDY 0x00200000 // hangs out in front of player, encloses weapon and arms +#define FL_THROWN_WPN 0x00400000 // c4, knives, grenades... +#define FL_PICKUP 0x00800000 // flag an edict -- 'this is a pickup' + +#define FL_RESPAWN 0x80000000 // used for item respawning + +#define FRAMETIME 0.1 + + +#define MELEE_DISTANCE 80 + +#define BODY_QUEUE_SIZE 8 + +typedef enum +{ + DAMAGE_NO, + DAMAGE_YES, // will take damage if hit + DAMAGE_AIM, // auto targeting recognizes this + DAMAGE_YES_BUT_NOT_IN_CAMERA // kef -- Rick made me do it +} damage_t; + +typedef enum +{ + MISSION_NONE = 0, + MISSION_ACCOMPLISHED, + MISSION_EXIT, + MISSION_OBJECTIVES, +} mission_msg_t; + +//deadflag +#define DEAD_NO 0 +#define DEAD_DYING 1 +#define DEAD_DEAD 2 +#define DEAD_RESPAWNABLE 3 + +//range +#define RANGE_MELEE 0 +#define RANGE_NEAR 1 +#define RANGE_MID 2 +#define RANGE_FAR 3 + +//gib types +#define GIB_ORGANIC 0 +#define GIB_METALLIC 1 + +// handedness values +#define RIGHT_HANDED 0 +#define LEFT_HANDED 1 +#define CENTER_HANDED 2 + +// Time between death and allowing a respawn +#define RESPAWN_DELAY 4.0f + +// game.serverflags values +#define SFL_CROSS_TRIGGER_1 0x00000001 +#define SFL_CROSS_TRIGGER_2 0x00000002 +#define SFL_CROSS_TRIGGER_3 0x00000004 +#define SFL_CROSS_TRIGGER_4 0x00000008 +#define SFL_CROSS_TRIGGER_5 0x00000010 +#define SFL_CROSS_TRIGGER_6 0x00000020 +#define SFL_CROSS_TRIGGER_7 0x00000040 +#define SFL_CROSS_TRIGGER_8 0x00000080 +#define SFL_CROSS_TRIGGER_MASK 0x000000ff + +// physics defines +#define ESCAPE_VELOCITY 30 +#define FLOOR_STEEPNESS 0.7 +#define FRICTION_MULT 600 +#define AIRRESISTANCE_MULT .1 // should be much smaller than 600 + +//this would be quite a few +#define MAX_NODES 1024 + +// edict->movetype values + +// +typedef enum +{ +MOVETYPE_NONE, // never moves +MOVETYPE_NOCLIP, // origin and angles change with no interaction +MOVETYPE_PUSH, // no clip to world, push on box contact +MOVETYPE_STOP, // no clip to world, stops on box contact +MOVETYPE_WALK, // gravity +MOVETYPE_STEP, // gravity, special edge handling +MOVETYPE_FLY, +MOVETYPE_TOSS, // gravity +MOVETYPE_FLYMISSILE, // extra size to monsters +MOVETYPE_BOUNCE, +MOVETYPE_DAN, +MOVETYPE_TOUCHNOTSOLID, // For rockets, uses "Dan" movement, but a SOLID_NOT entity still will use its touch function. +MOVETYPE_SPECTATOR, // player ONLY - origin and angles change with no interaction except BSP stuff +} movetype_t; + + +// buddy stuff. not to be confused with body stuff. or, for that matter, baddy stuff. all of which is batty stuff. woo hoo hoo! +edict_t *GetBuddyOwner(edict_t *buddy); +void RemoveLeanBuddy(edict_t *owner); +void RemoveNugBuddy(edict_t *owner); +void RemoveWeaponBuddy(edict_t *owner); + + +// +// this structure is left intact through an entire game +// it should be initialized at dll load time, and read/written to +// the server.ssv file for savegames +// +typedef struct +{ + char helpmessage1[512]; + char helpmessage2[512]; + int helpchanged; // flash F1 icon if non 0, play sound + // and increment only if 1, 2, or 3 + + gclient_t *clients; // [maxclients] + + // can't store spawnpoint in level, because + // it would get overwritten by the savegame restore + char spawnpoint[512]; // needed for coop respawns + + // store latched cvars here that we want to get at often + int maxclients; + int maxentities; + + // cross level triggers + int serverflags; + + bool autosaved; + byte cinematicfreeze; + + int guysKilled; + int friendliesKilled; + + int throatShots; + int nutShots; + int headShots; + int gibs; + + int savesUsed; + int cashEarned; + float playedTime; + float skillRating; + + CPlayerSkill playerSkills; +} game_locals_t; + + +// +// this structure is cleared as each map is entered +// it is read/written to the level.sav file for savegames +// +typedef struct +{ + int framenum; + float time; + + char level_name[MAX_QPATH]; // the descriptive name (Outer Base, etc) + char mapname[MAX_QPATH]; // the server name (base1, etc) + char nextmap[MAX_QPATH]; // go here when fraglimit is hit + + float spawnFrequency; + float playerLoudness; + float runningSpawnTotal;//This records roughly how active the spawning has been for gameplay reasons + float lastSpawn; + float lullTime; + float lastEnemyKill; + char clearedNodes[MAX_NODES];//this array indicates which nodes are still valid for spawning + int baseSong; + float spawnRushTime; + float spawnSoundTime; + + int savesLeft; + + // intermission state + float intermissiontime; // time the intermission was started + char *changemap; + int exitintermission; + vec3_t intermission_origin; + vec3_t intermission_angle; + + edict_t *sight_client; // changed once each frame for coop games + edict_t *sight_monster; // changed once each frame for coop games + + edict_t *sight_entity; + int sight_entity_framenum; + edict_t *sound_entity; + int sound_entity_framenum; + edict_t *sound2_entity; + int sound2_entity_framenum; + + int pic_health; + + int total_secrets; + int found_secrets; + + int total_goals; + int found_goals; + + int total_monsters; + int killed_monsters; + + edict_t *current_entity; // entity running from G_RunFrame + int body_que; // dead bodies + + int alertedStatus; // extra spawning and lots more attentive regular enemies... + + int deadHostages; // current number of iced hostages + int maxDeadHostages; // maximum dead hostages allowed without mission failure + + int weaponsAvailable; // used in precachish situations + + int countdownEnded; + int missionStatus; // did I win? + + int forceHUD; // force the HUD to draw, even if we have no weapon. (tutorial level) + + int num_clients; // added for timing re-spawns of items based on player counts in DM + + //all the silly stat stuff - gets added in at the end of every level + int guysKilled; //added + int friendliesKilled; //added + + int throatShots; //added + int nutShots; //added + int headShots; //added + int gibs; //added + + int savesUsed; //added + int cashEarned; + float startTime; //added + float skillRating; + +} level_locals_t; + +extern player_export_t *pe; + +// spawn_temp_t is only used to hold entity field values that +// can be set from the editor, but aren't actualy present +// in edict_t during gameplay +typedef struct +{ + // world vars + char *sky; + float skyrotate; + vec3_t skyaxis; + char *musicSet; + char *terrainSet; + char *nextmap; + + vec3_t color; + vec3_t endpoint; + + float spawnfrequency; + + int lip; + int distance; + int height; + char *noise; + float pausetime; + char *item; + char *gravity; + + float minyaw; + float maxyaw; + float minpitch; + float maxpitch; + int killedValue; + int survivalValue; + int material; + float scale; + + int merctype; + int mercnum; + + char* waitAction1; + char* waitAction2; + char* waitAction3; + char* waitAction4; + char* waitAction5; + char* waitAction6; + + char* moveAction; + + int screeneffect; + + char *script; + char *parms[16]; + int surfaceType; + + int noweapons; // for levels like the armory where the player gets no weapons + int setweapons; // for levels like TRN1 and TSR1 where we set the player's inventory + + int maxDeadHostages; // max number of dead hostages allowed before mission failure + char *ambientSet; + int startmusic; + int forceHUD; + int weaponsAvailable; // designers can set what needs to be precached (tutorial level) + + char *ai_name; + + int dummy; // for assigning fields used by the bsp process, but never ingame +} spawn_temp_t; + + +typedef struct +{ + // fixed data + vec3_t start_origin; + vec3_t start_angles; + vec3_t end_origin; + vec3_t end_angles; + + int sound_start; + int sound_middle; + int sound_end; + + float accel; + float speed; + float decel; + float distance; + + float wait; + + // state data + int state; + vec3_t dir; + float current_speed; + float move_speed; + float next_speed; + float remaining_distance; + float decel_distance; + void (*endfunc)(edict_t *); + void (*thinkfunc)(edict_t *); +} moveinfo_t; + +extern game_locals_t game; +extern level_locals_t level; +extern game_import_t gi; +extern game_export_t globals; +extern spawn_temp_t st; + +extern char level_ai_name[MAX_QPATH]; // the over-ride for the AI per-level + +extern int sm_meat_index; + +#define MOD_UNKNOWN 0 +#define MOD_KNIFE_SLASH 1 +#define MOD_KNIFE_THROWN 2 +#define MOD_PISTOL1 3 +#define MOD_PISTOL2 4 +#define MOD_MPISTOL 5 +#define MOD_ASSAULTRIFLE 6 +#define MOD_SNIPERRIFLE 7 +#define MOD_AUTOSHOTGUN 8 +#define MOD_SHOTGUN 9 +#define MOD_MACHINEGUN 10 +#define MOD_PHOS_GRENADE 11 +#define MOD_ROCKET 12 +#define MOD_ROCKET_SPLASH 13 +#define MOD_MPG 14 +#define MOD_FLAMEGUN 15 +#define MOD_FLAMEGUN_NAPALM 16 +#define MOD_C4 17 +#define MOD_CLAYMORE 18 +#define MOD_NEURAL_GRENADE 19 +#define MOD_WATER 20 +#define MOD_SLIME 21 +#define MOD_CRUSH 22 +#define MOD_TELEFRAG 23 +#define MOD_FALLING 24 +#define MOD_SUICIDE 25 +#define MOD_EXPLOSIVE 26 +#define MOD_FIRE 27 +#define MOD_LAVA 28 +#define MOD_EXIT 29 +#define MOD_BARBWIRE 30 +#define MOD_DOGBITE 31 +#define MOD_TRIGGER_HURT 33 +#define MOD_SPLASH 34 +#define MOD_TARGET_LASER 35 +#define MOD_STAR_THROWN 36 +#define MOD_GRENADE 37 +#define MOD_CONC_GRENADE 38 + +#define MOD_FRIENDLY_FIRE 0x8000000 + +extern int meansOfDeath; + +extern edict_t *g_edicts; +extern IGhoul *TheGhoul; + +extern cvar_t *freezeworld; +extern cvar_t *maxentities; +extern cvar_t *deathmatch; +extern cvar_t *ctf_loops; +extern cvar_t *ctf_loops_count; +extern cvar_t *ctf_flag_captured; +extern cvar_t *ctf_team_red; +extern cvar_t *ctf_team_blue; + +extern cvar_t *mskins_expression_limit; +extern cvar_t *mskins_variety_limit; + +extern cvar_t *dmflags; +extern cvar_t *skill; +extern cvar_t *fraglimit; +extern cvar_t *timelimit; +extern cvar_t *password; +extern cvar_t *spectator_password; +extern cvar_t *dedicated; +extern cvar_t *sv_pmodlistfile; +extern cvar_t *sv_altpmodlistfile; +extern cvar_t *sv_suicidepenalty; + +extern cvar_t *sv_gravity; +extern cvar_t *sv_gravityx; +extern cvar_t *sv_gravityy; +extern cvar_t *sv_gravityz; +extern cvar_t *sv_maxvelocity; +extern cvar_t *followenemy; +extern cvar_t *thirdpersoncam; // hereticii-style camera if followenemy is -1 + +extern cvar_t *ai_freeze; // monsters halt +extern cvar_t *ai_goretest; // sets health really high +extern cvar_t *ai_pathtest; // adds omniscience to guys +extern cvar_t *ai_highpriority; // makes all guys really expensive (turns off culling) + +extern cvar_t *ei_show; +extern cvar_t *aipoints_show; +extern cvar_t *ai_nonodes; +extern cvar_t *aidec_show; +extern cvar_t *ai_dumb; +extern cvar_t *ai_maxcorpses; +extern cvar_t *ai_corpselife; + +extern cvar_t *ai_spawnfrequency; + +extern cvar_t *flood_msgs; +extern cvar_t *flood_persecond; +extern cvar_t *flood_waitdelay; +extern cvar_t *flood_killdelay; + +extern cvar_t *ghl_specular; +extern cvar_t *ghl_light_method; +extern cvar_t *ghl_precache_verts; +extern cvar_t *ghl_precache_texture; + +extern cvar_t *sv_rollspeed; +extern cvar_t *sv_rollangle; + +extern cvar_t *run_pitch; +extern cvar_t *run_roll; +extern cvar_t *bob_up; +extern cvar_t *bob_pitch; +extern cvar_t *bob_roll; + +extern cvar_t *log_file_counter; +extern cvar_t *log_file_mode; +extern cvar_t *log_file_name; +extern cvar_t *log_file_header; +extern cvar_t *log_file_footer; +extern cvar_t *log_file_line_header; + +extern cvar_t *camera_viewdist; + +extern cvar_t *sv_cheats; +extern cvar_t *maxclients; +extern cvar_t *maxspectators; + +extern cvar_t *nodamage; + +extern cvar_t *sk_spawning; +extern cvar_t *sk_saving; +extern cvar_t *sk_toughness; +extern cvar_t *sk_maxencum; + +extern cvar_t *gl_pictip; + +extern cvar_t *g_movescale; + +//----Parental lock cvars----// +extern bool lock_deaths; +extern bool lock_blood; +extern bool lock_gorezones; +extern bool lock_sever; +extern bool lock_textures; + + +// totally stolen from Heretic2 +#ifdef __cplusplus +extern "C" +{ +#endif + extern cvar_t *sv_jumpcinematic; +#ifdef __cplusplus +} +#endif + +// when the player dies, space bar restarts the level +extern cvar_t *sv_restartlevel; + +extern cvar_t *stealth; // show/hide stealth meter + + +#define world (&g_edicts[0]) +#define thePlayer (&g_edicts[1]) + + +// item spawnflags +//#define ITEM_NO_TOUCH 0x00000002 // totally unused +// 6 bits reserved for editor flags +// 8 bits used as power cube id bits for coop games +#define DROPPED_ITEM 0x00010000 +//#define DROPPED_PLAYER_ITEM 0x00020000 // totally unused +//#define ITEM_TARGETS_USED 0x00040000 // totally unused + +// +// g_save.c +// + +#define MMOVE_SCRIPT_SIZE 1 +#define MMOVE_HUMAN_SIZE 540 +#define MMOVE_DOG_SIZE 26 +#define MMOVE_COW_SIZE 6 + +#define MD_BOSNIA_SIZE 14 +#define MD_CASTLE_SIZE 15 +#define MD_GENERIC_SIZE 121 +#define MD_IRAQ_SIZE 15 +#define MD_ITEM_SIZE 41 +#define MD_LIGHT_SIZE 23 +#define MD_NY_SIZE 5 +#define MD_SIBERIA_SIZE 11 +#define MD_TOKYO_SIZE 12 +#define MD_UGANDA_SIZE 15 +#define MD_HELI_SIZE 12 +#define MD_TANK_SIZE 5 +#define MD_SNOWCAT_SIZE 3 + +void EnumerateFields(struct field_s *fields, byte *data, unsigned long chid, int len); +void EvaluateFields(struct field_s *fields, byte *data, unsigned long chid, int len); +IGhoulInst *LoadGhoulInst(IGhoulObj *obj, const char *name); +void SaveGhoulInst(IGhoulInst *inst, const char *name); + +int GetEdictNum(edict_t *e); +int GetMmoveNum(mmove_t *mm); +int GetEventNum(class Event *ev); +int GetThinkNum(void *func); + +edict_t *GetEdictPtr(int e); +mmove_t *GetMmovePtr(int mm); +class Event *GetEventPtr(int ev); +void *GetThinkPtr(int func); + +// +// g_cmds.c +// +void Cmd_Help_f (edict_t *ent); +void Cmd_Score_f (edict_t *ent); + +// +// g_utils.c +// +qboolean KillBox (edict_t *ent); +void G_ProjectSource (vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t result); +edict_t *G_Find (edict_t *from, int fieldofs, char *match, int charsToCompare = 0); +edict_t *oldfindradius (edict_t *from, vec3_t org, float rad); +edict_t *findradius (edict_t *from, vec3_t org, float rad, int nAreatype = AREA_SOLID); +edict_t *performTriggerSearch(edict_t *ent, vec3_t org, float rad); +edict_t *performEntitySearch(edict_t *ent, vec3_t org, float rad); +edict_t *G_PickTarget (char *targetname); +void G_UseTargets (edict_t *ent, edict_t *activator); +void G_SetMovedir (vec3_t angles, vec3_t movedir); +int pointLineIntersect(vec3_t start, vec3_t end, vec3_t point, float rad);//returns whether a give point is between the planes start and end + // and no more than rad from said vector + +void G_InitEdict (edict_t *e); +edict_t *G_Spawn (void); +void G_FreeEdict (edict_t *e); +void G_FreeAllEdicts (void); +void G_Explode(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + +void G_TouchTriggers (edict_t *ent); +void G_TouchSolids (edict_t *ent); + +char *G_CopyString (char *in); + +float *tv (float x, float y, float z); +char *vtos (vec3_t v); + +float vectoyaw (vec3_t vec); +void vectoangles (vec3_t vec, vec3_t angles); + +void InitiateRespawn(edict_t *ent); +void SetForRespawn(edict_t *ent, void (*spawnFunc)(edict_t *), float respawnDuration); + +int GetGhoulPosDir(vec3_t sourcePos, vec3_t sourceAng, IGhoulInst *inst, + GhoulID partID, char *name, vec3_t pos, vec3_t dir, vec3_t right, vec3_t up); +void EntToWorldMatrix(vec3_t org, vec3_t angles, Matrix4 &m); + +void Ignite(edict_t *target, edict_t *damager, float dmgAmount); // burn up guys +void Electrocute(edict_t *target, edict_t *damager); // zap guys +void RadiusBurn(edict_t *source, float radius);//burn up LOTS of guys ;) + +// +// g_combat.c +// +qboolean OnSameTeam (edict_t *ent1, edict_t *ent2); +qboolean CanDamage (edict_t *targ, edict_t *inflictor); +void T_Damage (edict_t *targ, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate = 0.0, float absorb = 0.0); +void T_RadiusDamage (edict_t *inflictor, edict_t *attacker, float damage, edict_t *ignore, float radius, int mod, int dflags = 0); +void T_RadiusDamage2 (edict_t *inflictor, edict_t *attacker, vec3_t damagepoint, float maxdamage, float mindamage, + float damageradius, edict_t *ignore, int mod, int dflags=0); +void T_ConeDamage(edict_t *inflictor, edict_t *attacker, float damage, edict_t *ignore, float radius, int mod, vec3_t coneDir, float range); + +// damage flags +// FIXME: Still need to evaluate if these are flexible enough / put all the right ones in t_damage() calls!!! -MW. + +#define DAMAGE_RADIUS 0x00000001 // damage was indirect +#define DAMAGE_NO_ARMOR 0x00000002 // armour does not protect from this damage,armor not effected +#define DAMAGE_ENERGY 0x00000004 // damage is from an energy based weapon +#define DAMAGE_NO_KNOCKBACK 0x00000008 // do not affect velocity, just view angles +#define DAMAGE_BULLET 0x00000010 // damage is from a bullet (used for ricochets) +#define DAMAGE_NO_PROTECTION 0x00000020 // armor, shields, invulnerability, and godmode have no effect +#define DAMAGE_NO_TEAMDAMAGE 0x00000040 // don't want to hurt team-mates +#define DAMAGE_ALL_KNOCKBACK 0x00000080 // Knockback-oriented weapon. Minimal damage. +#define DT_MELEE 0x00000100 // damage from hand held & thrown melee weapons +#define DT_PROJECTILE 0x00000200 // damage from high velocity projectile weapons +#define DT_EXPLODE 0x00000400 // damage from explosive force +#define DT_NEURAL 0x00000800 // damage from neuralweapons, e.g. like Rush Limbaugh, N'Sync and Tele-Tubbies. +#define DT_FIRE 0x00001000 // damage from fire (tastes like burning) +#define DT_FALL 0x00002000 // damage from falling impact +#define DT_WATER 0x00004000 // damage from drowning in water or slime +#define DT_MANGLE 0x00008000 // damage from massive mangling / crushing, e.g. complete dismemberment +#define DT_JUGGLE 0x00010000 // damage is from a rapid-fire projectile weapon capable of making guys do the dancy death +#define DT_SEVER 0x00020000 // damage can result in severed limbs (but not torsos) +#define DT_BLUNT 0x00040000 // damage is from a blunt weapon +#define DT_LONGRANGE 0x00080000 // yucky - signifies that the weapon shoots VERY far (basically for the sniper) +#define DT_DIRECTIONALGORE 0x00100000 // damage comes in a direction, but not at a spot +#define DT_SHOCK 0x00200000 // zap zap +#define DT_BACKSTAB 0x00400000 // damage is increased when victim is hit from behind +#define DT_ENEMY_ROCKET 0x00800000 +#define DT_STEALTHY 0x01000000 +#define DT_WATERZAP 0x02000000 // will do LOTS of damage to someone in water + +// 12/29/99 kef -- moved these jokers from CWeaponInfo.cpp +#define DT_AUTOSHOTGUN (DT_SEVER|DT_MANGLE) +#define DT_SHOTGUN (DT_SEVER) +#define DT_SNIPER (DT_LONGRANGE|DT_STEALTHY) +#define DT_MPISTOL (DT_JUGGLE|DT_STEALTHY) +#define DT_KNIFE (DT_STEALTHY) + +// Various default values. + +#define DEFAULT_BULLET_HSPREAD 300 +#define DEFAULT_BULLET_VSPREAD 500 +#define DEFAULT_SHOTGUN_HSPREAD 1000 +#define DEFAULT_SHOTGUN_VSPREAD 500 +#define DEFAULT_DM_SHOTGUN_CNT 12 +#define DEFAULT_SHOTGUN_COUNT 12 +#define DEFAULT_SSHOTGUN_COUNT 20 +#define DEFAULT_JITTER_DELTA 30 //12.5 + +// +// g_misc.c +// +void ThrowHead (edict_t *self, char *gibname, int damage, int type); +void ThrowClientHead (edict_t *self, int damage); +void ThrowGib (edict_t *self, char *gibname, int damage, int type); +void BecomeExplosion1(edict_t *self); +void ShakeCameras (vec3_t origin, int amount, int radius, int delta); +void BlindingLight(vec3_t origin, int intensity, float maxalpha, float delta); +void TearGasEnt(edict_t *ent, float intensity);//intense is from 0 to 1 +void StopMusic(edict_t *ent, short numSecs); +void RestartMusic(edict_t *ent); +void StartMusic(edict_t *ent, byte songID); +void SetActionMusic(edict_t &ent); +void UpdateMusicLevel(edict_t *ent); +void SetSkyColor(float red, float blue, float green); +void FindCorrectOrigin(edict_t *ent, vec3_t origin); +void LightInit (edict_t *self); +void SndInitWorldSounds(void); +int SND_getBModelSoundIndex(char *name, int spot); +void S_RestoreSoundsFromSave(void); + + +// +// g_ptrail.c +// +void PlayerTrail_Init (void); +void PlayerTrail_Add (vec3_t spot); +void PlayerTrail_New (vec3_t spot); +edict_t *PlayerTrail_PickFirst (edict_t *self); +edict_t *PlayerTrail_PickNext (edict_t *self); +edict_t *PlayerTrail_LastSpot (void); + + +// +// g_client.c +// +void respawn (edict_t *ent); +void BeginIntermission (edict_t *targ); +void PutClientInServer (edict_t *ent); +void InitClientPersistant (gclient_t *client); +void InitClientResp (gclient_t *client); +void InitBodyQue (void); +void ClientBeginServerFrame (edict_t *ent); + +// +// g_items.c +// + +void itemDropToFloor(edict_t *ent); +void I_Spawn(edict_t *ent, Pickup *pickup); +void I_SpawnKnife(edict_t *ent); +void I_SpawnArmor(edict_t *ent); +edict_t *MakeItem(char *name, vec3_t origin); +int reset_flag(edict_t *self, edict_t *owner); + +// +// g_player.c +// +void player_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void player_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + +// +// p_view.c +// + +void PlayerNoise(edict_t *who, vec3_t where, ai_sensetype_e type, edict_t *focus, float rad, int nodeId = 0, int stealthy = 0, int suppress = 0); +void ClientEndServerFrame (edict_t *ent); + +// +// p_hud.c +// +void MoveClientToIntermission(edict_t *ent, qboolean log_file); +void G_SetStats (edict_t *ent); +void DeathmatchScoreboardMessage (edict_t *ent, edict_t *killer, qboolean log_file); + +// +// g_phys.c +// +void G_RunEntity (edict_t *ent); + +// +// w_fire.cpp +// + +void cacheForItem(equipment_t curEquip);//call with whatever the player has +void CacheAttack(int atkID); + +// +// p_client.cpp +// + +void IsPlayerTargetSameTeam(edict_t *source); +void AddWeaponTypeForPrecache(int type); +void incMovescale(edict_t *ent,float inc); +void resetMovescale(edict_t *ent,float newScale); + +// +// various g_.cpp model files +// +bool WithinFOV(edict_t *source, vec3_t target, float halfFOV); +void BboxRotate(edict_t *self); +void PhysicsModelInit(edict_t *self, char *rendername); +void GhoulPhysicsModelInit(edict_t *self); +void TintModel(edict_t *self); +void SimpleModelInit(edict_t *ent, solid_t solid); +void BecomeDebris (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void SimpleModelTouch (edict_t *ent, edict_t *other, cplane_t *plane, struct mtexinfo_s *surf); + +// Model Spawn flags +#define SF_INVULNERABLE 1 +#define SF_NOPUSH 2 +#define SF_FLUFF 64 +#define SF_PICKUP_RESPAWN 128 + + +// Light Model Spawn flags +#define SF_LIGHT_START_OFF 1 +#define SF_LIGHT_VULNERABLE 2 +#define SF_LIGHT_PUSHABLE 4 + +// +// g_main.c +// +void PreserveClientData (void); +void RestoreClientData (edict_t *ent); +void IncreaseSpawnIntensity(float amount);//values range from 0 to 1 - most events shouldn't add more than .1 or .2 (these add up quick) + +// +// g_chase.c +// +void UpdateChaseCam(edict_t *ent); +void ChaseNext(edict_t *ent); +void ChasePrev(edict_t *ent); +void GetChaseTarget(edict_t *ent); + +//============================================================================ + +// client_t->anim_priority +#define ANIM_BASIC 0 // stand / run +#define ANIM_WAVE 1 +#define ANIM_JUMP 2 +#define ANIM_PAIN 3 +#define ANIM_ATTACK 4 +#define ANIM_DEATH 5 + +void PHYS_ClearAttachList(edict_t *ed); + +// +// Client data that stays across multiple level loads. +// + +typedef struct +{ + char userinfo[MAX_INFO_STRING]; + char netname[16]; + qboolean spectator; + char bestweap[16]; + int curWeaponType; + int fov; + + // A loadgame will leave valid entities that just don't have a connection yet. + + qboolean connected; + + // Values saved and restored from edicts when changing levels. + + int health; + int max_health; +} client_persistant_t; + +// +// Client data that stays across deathmatch respawns. +// + +typedef struct +{ + int enterframe; // level.framenum the client entered the game + int score; // frags, etc + vec3_t cmd_angles; // angles sent over in the last command + int game_helpchanged; + int helpchanged; + qboolean spectator; // client is a spectator + team_t team; // CTF team + + // CTF stuff + int ctf_state; +} client_respawn_t; + +// +// This structure is cleared on each PutClientInServer(), except for 'client->pers'. +// + +struct gclient_s +{ + // Known to server. + + player_state_t ps; // Communicated by server to clients. + int ping; + + // Private to game. + + client_persistant_t pers; + client_respawn_t resp; + pmove_state_t old_pmove; // Dor detecting out-of-pmove changes. + float moveScale; // scale down max speed for dmreal +// CPlayerStats m_PlayerStats; // Money et al. + invPub_c *inv; + player_dmInfo_ic *dmInfo; + + body_c *body; + char oldNetName[128]; //body needs to remember what the last name was, so corrections don't constantly get sent back + char oldSkinRequest[MAX_SKINNAME_LENGTH]; //body needs to remember what the last requested skin was, so corrections don't constantly get sent back + char oldTeamnameRequest[MAX_TEAMNAME_LENGTH]; //body needs to remember what the last requested teamname was, so corrections don't constantly get sent back + byte restart_count; + + // Client layout stuff. + + qboolean showscores; // Set layout stat for scores. + qboolean showinventory; // Set layout stat for inventory. + qboolean showhelp; // Set layout stat for help. + + // Action buttons. + + int buttons; + int oldbuttons; + int latched_buttons; + qboolean oktofire; + float fireEvent; + float altfireEvent; + + // Damage stuff. Sum up damage over an entire frame, so shotgun blasts give a single big kick. + + int damage_blood; // damage taken out of health + int damage_knockback; // impact damage + int damage_armor; // need this for appropriate feedback + vec3_t damage_from; // origin for vector calculation + + // View paramters. + + float killer_yaw; // when dead, look at killer + vec3_t weaponkick_angles; // weapon kicks + vec3_t kick_origin; + float v_dmg_roll, v_dmg_pitch, v_dmg_time; // damage kicks + float fall_time, fall_value; // for view drop on fall + float damage_alpha; + float bonus_alpha; + float blinding_alpha; + float blinding_alpha_delta; // added by Jake so we can control how fast the drop off from the blinding effect is + float gas_blend; + vec3_t damage_blend; + vec3_t v_angle; // aiming direction + float bobtime; // so off-ground doesn't change it + vec3_t oldviewangles; + vec3_t oldvelocity; + int old_waterlevel; + vec3_t fade_rgb; // fade screen to this color; + float fade_alpha; + edict_t *chase_target; // spectator chase-cam + qboolean update_chase; + + // Animation vars. + + int anim_end; + int anim_priority; + qboolean anim_duck; + qboolean anim_run; + qboolean running; + qboolean ghosted; // Invulnerability effect + qboolean goggles_on; // Light Intensifier goggles are on. + + // Timers. + + float next_drown_time; // Player drown debouncing. + float respawn_time; // Player can respawn when time > this. + float respawn_invuln_time; // Player is invulnerable until time > this. + float showhelp_time; // Player help de-activates when time > this. + + // Music. + + int musicTime; + + // What colors are used to draw other player's playernames. + + byte playernameColors[MAX_CLIENTS]; + byte oldPlayernameColors[MAX_CLIENTS]; + + // Camera related stuff. + + int RemoteCameraLockCount; + int RemoteCameraNumber; + int RemoteCameraType; + int MercCameraNumber; + qboolean CameraIs3rdPerson; + + // Anti flooding vars + + float flood_locktill; // locked from talking + float flood_when[10]; // when messages were said + int flood_whenhead; // head pointer for when said + float flood_nextnamechange; // next time for valid nick change + float flood_nextkill; // next time for suicide + + float friction_time; +}; + +class CScript; + +struct edict_s +{ + entity_state_t s; + struct gclient_s *client; // NULL if not a player + // the server expects the first part + // of gclient_s to be a player_state_t + // but the rest of it is opaque + + qboolean inuse; + int linkcount; + + // FIXME: move these fields to a server private sv_entity_t + link_t area; // linked to a division node or leaf + + int num_clusters; // if -1, use headnode instead + short clusternums[MAX_ENT_CLUSTERS]; + int headnode; // unused if num_clusters != -1 + int areanum, areanum2; + + //================================ + + int svflags; + vec3_t mins, maxs; + vec3_t absmin, absmax, size; + solid_t solid; + int clipmask; + edict_t *owner; + + + /// GHOUL + + IGhoulInst *ghoulInst; + + // new fields for checking if origin or mins/maxs have changed, and therefore should we relink entity? + vec3_t prev_mins,prev_maxs; + vec3_t prev_origin; + solid_t prev_solid; + vec3_t prev_angles; + + // DO NOT MODIFY ANYTHING ABOVE THIS, THE SERVER + // EXPECTS THE FIELDS IN THAT ORDER! + + //================================ + int movetype; + int flags; + + char *model; + +// rjr not needed yet +// char *rendermodel; + + float freetime; // sv.time when the object was freed + + // + // only used locally in game, not by server + // + char *message; + unsigned short sp_message; + + char *classname; +#if TIME_ENTS + spawn_t *owner_spawn; +#endif + int spawnflags; + + float timestamp; + + float angle; // set in qe3, -1 = up, -2 = down + char *target; + char *targetname; + char *scripttarget; + char *killtarget; + char *killfacing; + char *team; + char *pathtarget; + char *deathtarget; + char *combattarget; + char *soundName; + + char *spawn1; //for spawners + char *spawn2; + char *spawn3; + + mmove_t *wait_action1; //for path_corners + mmove_t *wait_action2; //for path_corners + mmove_t *wait_action3; //for path_corners + mmove_t *wait_action4; //for path_corners + mmove_t *wait_action5; //for path_corners + mmove_t *wait_action6; //for path_corners + + baseObjInfo_c *objInfo; //for ghoul objects + + edict_t *target_ent; //for trains, elevators + mmove_t *move_action; //for path_corners + + float speed, accel, decel; + vec3_t movedir; + vec3_t pos1, pos2; + + vec3_t velocity; + vec3_t avelocity; + + //velocity and avelocity that ai can use in their intentional movement, separate from normal physics + vec3_t intend_velocity; + vec3_t intend_avelocity; + + int mass; + float stopspeed; // defaults to 100.... see friction note + +//MoveType_Dan stuff + + float friction; // defaults to 1.0 may be used in the future + // in conjuction with a floor friction value + float gravity; // per entity gravity multiplier (1.0 is normal) + float airresistance; + float bouyancy; // 1 will counter gravity + float elasticity; // 0 will not bounce, 1 is 100% elastic, >1 == flubber, -1 means the object + // will bowl through stuff by not processing ClipVelocity_Dan + int physicsFlags; + short attachChain; + short attachOwner; +//MoveType_Dan stuff ends here // use for lowgrav artifact, flares + + float air_finished; + edict_t *goalentity; + + edict_t *movetarget; + modelSpawnData_t *objSpawnData; // Used by objects (chairs, tables, etc.) + + float yaw_speed; +// float ideal_yaw; //sfs--moved to be ai::ideal_angles + + float nextthink; + void (*think)(edict_t *self); + void (*blocked)(edict_t *self, edict_t *other); //move to moveinfo? + void (*touch)(edict_t *self, edict_t *other, cplane_t *plane, struct mtexinfo_s *surf); + void (*use)(edict_t *self, edict_t *other, edict_t *activator); + void (*plUse)(edict_t *self, edict_t *other, edict_t *activator); + void (*pain)(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); + void (*die)(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + + // are all these legit? do we need more/less of them? + float touch_debounce_time; // this one is legit + edict_t *touch_debounce_owner; // as is this onew + float pain_debounce_time; + float damage_debounce_time; + float fly_sound_debounce_time; //move to clientinfo + float last_move_time; + + int health; + int max_health; + int gib_health; + int deadflag; + + union + { + qboolean DoorIsOpen; + qboolean gibbed; + }; + + char *map; // target_changelevel + + int viewheight; // height above origin where eyesight is determined + int viewside; // yeah + int takedamage; + int dmg; + int sounds; //make this a spawntemp var? + int count; + int material; // debris type objects break into + + edict_t *chain; + edict_t *enemy; + edict_t *oldenemy; + edict_t *activator; + edict_t *groundentity; + int groundentity_linkcount; + + int personality; + + // As these are both edict_t * we can leave them unioned + union + { + edict_t *teamchain; + edict_t *targetEnt; // for camera; also used by players for their leaning buddies + }; + + edict_t *teammaster; + + edict_t *mynoise; // can go in client only + edict_t *mynoise2; + + int noise_index; + int noise_index2; + float volume; + float attenuation; + + // timing variables + float wait; + float delay; // before firing targets + float random; + float burntime; + float phosburntime; + edict_t *burninflictor; + float zapfxtime; + float zapdmgtime; + + union + { + float teleport_time; + float alertRadius;//for monsters--the distance-from-enemy at which they automatically wake up--regardless of infront, line-of-sight, lighting + }; + + int watertype; + int waterlevel; + + short spawnerID; + vec3_t spawnOrigin; + vec3_t spawnAngles; + float spawnHealth; + void (*respawnFunc)(edict_t *self); + float respawnTime; + + // move this to clientinfo? + int light_level; + + int style; // also used as areaportal number + + int surfaceType; + + // monetary value of items/monsters + int killedValue; // money given to player at end of mission for killin' stuff + int survivalValue; // money given to player at end of mission for lettin' stuff live + + int ctf_flags; // I hate doing this, there should be a more elegant way to do this.Anyway bit 0 = in possession of team 0 flag; bit 1 = team 1 + float ctf_hurt_carrier; // time since I last hurt the flag carrier + + // common data blocks + moveinfo_t moveinfo; + ai_c_ptr ai; + CScript *Script; +}; + +// g_spawn.cpp +#if TIME_ENTS + void PrintTimings(void); +#endif // _DEBUG + +char *ED_NewString (char *string); +void ED_CallSpawn (edict_t *ent); + +// Scripts ds.cpp +void ProcessScripts(void); +void ShutdownScripts(void); +void SaveLocals(void); +void LoadLocals(void); +void SaveGlobals(void); +void LoadGlobals(void); + +void Enemy_Printf (ai_public_c *which_ai, char *msg, ...); + +//#define MAX_RADIUS_FIND_SIZE 128 + +//fixme - needed this demo, but not for later +#define MAX_RADIUS_FIND_SIZE 1024 + +typedef enum + { + RADAREA_NONE = 0, + RADAREA_SOLIDS, + RADAREA_TRIGGERS, + RADAREA_SOLIDSANDTRIGGERS + } areatype_t; + +class CRadiusContent +{ +private: + edict_t *touchlist[MAX_RADIUS_FIND_SIZE]; + int numFound; +public: + + CRadiusContent(void){numFound = -1;} + CRadiusContent(vec3_t center, float radius, areatype_t desiredSolidTypes); + CRadiusContent(vec3_t center, float radius, int useAIPoints = 0, int nodeID = 0, int squashZ = 0); + int getNumFound(void){return numFound;} + edict_t *foundEdict(int i){assert(i > -1); assert(i < numFound); return touchlist[i];} + edict_t *getFirst(void){return touchlist[0];} + edict_t *getEnd(void){return touchlist[numFound];} + + void addEnt(edict_t *ent){touchlist[numFound] = ent; numFound++; assert(numFound < MAX_RADIUS_FIND_SIZE);} +}; \ No newline at end of file diff --git a/Source/Game/gamecpp/g_main.cpp b/Source/Game/gamecpp/g_main.cpp new file mode 100644 index 0000000..4701b32 --- /dev/null +++ b/Source/Game/gamecpp/g_main.cpp @@ -0,0 +1,1335 @@ +#include "g_local.h" +#include "p_body.h" +#include "w_weapons.h" +#include "ai_pathfinding.h" +#include "../strings/singleplr.h" +#include "../strings/dm_generic.h" +#include "dm_ctf.h" + +#if TIME_ENTS + #include + #include "timing.h" +#endif + +game_locals_t game; +level_locals_t level; +game_import_t gi; +game_export_t globals; +spawn_temp_t st; +player_export_t *pe=NULL; + +char level_ai_name[MAX_QPATH]; // the over-ride for the AI per-level + +int sm_meat_index; +int meansOfDeath; + +edict_t *g_edicts; +IGhoul *TheGhoul; + +cvar_t *deathmatch; +cvar_t *ctf_loops; +cvar_t *ctf_loops_count; +cvar_t *ctf_flag_captured; +cvar_t *ctf_team_red; +cvar_t *ctf_team_blue; + +//cvar_t *coop; +cvar_t *dmflags; +cvar_t *skill; +cvar_t *fraglimit; +cvar_t *timelimit; +cvar_t *password; +cvar_t *spectator_password; +cvar_t *maxclients; +cvar_t *maxspectators; +cvar_t *sv_maplist; +cvar_t *maxentities; +cvar_t *dedicated; +cvar_t *sv_pmodlistfile; +cvar_t *sv_altpmodlistfile; +cvar_t *sv_suicidepenalty; + +cvar_t *mskins_expression_limit; +cvar_t *mskins_variety_limit; + +cvar_t *freezeworld; + +cvar_t *thirdpersoncam; +cvar_t *followenemy; +cvar_t *sv_maxvelocity; +cvar_t *sv_gravity; +cvar_t *sv_gravityx; +cvar_t *sv_gravityy; +cvar_t *sv_gravityz; + +cvar_t *ai_freeze;//monsters halt +cvar_t *ai_goretest;//sets health really high +cvar_t *ai_pathtest;//adds omniscience to guys +cvar_t *ai_highpriority; + +cvar_t *ei_show; +cvar_t *aipoints_show; +cvar_t *ai_nonodes; +cvar_t *aidec_show; +cvar_t *ai_dumb; +cvar_t *ai_editdir; + +cvar_t *flood_msgs; +cvar_t *flood_persecond; +cvar_t *flood_waitdelay; +cvar_t *flood_killdelay; + +cvar_t *ghl_specular; +cvar_t *ghl_light_method; +cvar_t *ghl_precache_verts; +cvar_t *ghl_precache_texture; +cvar_t *ghl_no_server_update; + +cvar_t *sv_rollspeed; +cvar_t *sv_rollangle; + +cvar_t *run_pitch; +cvar_t *run_roll; +cvar_t *bob_up; +cvar_t *bob_pitch; +cvar_t *bob_roll; + +cvar_t *log_file_counter; +cvar_t *log_file_mode; +cvar_t *log_file_name; +cvar_t *log_file_header; +cvar_t *log_file_footer; +cvar_t *log_file_line_header; + +cvar_t *camera_viewdist; + +cvar_t *sv_cheats; +cvar_t *nodamage; +cvar_t *gl_pictip; + +cvar_t *sk_spawning; +cvar_t *sk_saving; +cvar_t *sk_toughness; +cvar_t *sk_maxencum; + +cvar_t *ai_spawnfrequency; +cvar_t *ai_maxcorpses; +cvar_t *ai_corpselife; + +cvar_t *sv_jumpcinematic; // set by player. means we're skipping the cinematic + +cvar_t *sv_restartlevel; // when the player dies, space bar restarts the level + +cvar_t *stealth; // show/hide stealth meter + +cvar_t *pickupinfo; // do we want to track pickup information for the next level? +cvar_t *weaponarena; // weapon testing -- sets all pickups in the game to the objtype_t in weaponarena + +cvar_t *g_movescale; + +void SpawnEntities (char *mapname, char *entities, char *spawnpoint); +void ClientThink (edict_t *ent, usercmd_t *cmd); +qboolean ClientConnect (edict_t *ent, char *userinfo); +void ClientUserinfoChanged (edict_t *ent, char *userinfo, bool not_first_time); +void ClientDisconnect (edict_t *ent); +void ClientBegin (edict_t *ent); +void ClientCommand (edict_t *ent); +void RunEntity (edict_t *ent); +void WriteGame (bool autosave); +bool ReadGame (bool autosave); +void WriteLevel (void); +void ReadLevel (void); +float G_RunFrame (int sframe); + +void UpdateWorldSpawningByFrame(void); +void CheckDeadHostageCount(edict_t *player); + +extern void Game_ShutdownPlayer (void); +extern int *Game_InitPlayer(void); + +int G_GameAllowASave(void); +void G_SavesLeft(void); + +bool lock_textures; + +// +// Callback should the skill level change +// + +void InitPlayerSkills(void) +{ + int skillLevel; + + skillLevel = floor(skill->value); + + // Lovely bit of "lateral thinking" code (read: hack) to let cheats be properly read in deathmatch + if(deathmatch->value) + { + skillLevel = 5; + } + + if(skillLevel < 0) + { + skillLevel = 0; + } + if(skillLevel > 5) + { + skillLevel = 5; + } + //hmm... + if(skillLevel == 0) + { + //some presets here + gi.cvar_forceset("sk_toughness", "0"); + gi.cvar_forceset("sk_spawning", "0"); + gi.cvar_forceset("sk_saving", "-1"); + gi.cvar_forceset("cheats", "1"); + gi.cvar_forceset("sk_maxencum", "0"); + + game.playerSkills.buildCustomSkillLevels(); + } + else if(skillLevel == 1) + { + //some presets here + gi.cvar_forceset("sk_toughness", "1"); + gi.cvar_forceset("sk_spawning", "1"); + gi.cvar_forceset("sk_saving", "8"); + gi.cvar_forceset("cheats", "1"); + gi.cvar_forceset("sk_maxencum", "1"); + + game.playerSkills.buildCustomSkillLevels(); + } + else if(skillLevel == 2) + { + //some presets here + gi.cvar_forceset("sk_toughness", "2"); + gi.cvar_forceset("sk_spawning", "2"); + gi.cvar_forceset("sk_saving", "5"); + gi.cvar_forceset("cheats", "1"); + gi.cvar_forceset("sk_maxencum", "2"); + + game.playerSkills.buildCustomSkillLevels(); + } + else if(skillLevel == 3) + { + //some presets here + gi.cvar_forceset("sk_toughness", "4"); + gi.cvar_forceset("sk_spawning", "3"); + gi.cvar_forceset("sk_saving", "2"); + gi.cvar_forceset("cheats", "0"); + gi.cvar_forceset("sk_maxencum", "3"); + + game.playerSkills.buildCustomSkillLevels(); + } + else if(skillLevel == 4) + { + //some presets here + gi.cvar_forceset("sk_toughness", "3"); + gi.cvar_forceset("sk_spawning", "4"); + gi.cvar_forceset("sk_saving", "0"); + gi.cvar_forceset("cheats", "0"); + gi.cvar_forceset("sk_maxencum", "4"); + + game.playerSkills.buildCustomSkillLevels(); + } + else + { + game.playerSkills.buildCustomSkillLevels(); + } + + game.playerSkills.setMoneyMult(); +} + +/* +============ +InitGame + +This will be called when the dll is first loaded, which +only happens when a new game is started or a save game +is loaded. +============ +*/ + +void InitGame (void) +{ + gi.dprintf ("==== InitGame ====\n"); + + //FIXME: sv_ prefix is wrong for these + sv_rollspeed = gi.cvar ("sv_rollspeed", "200", 0); + sv_rollangle = gi.cvar ("sv_rollangle", "2", 0); + sv_maxvelocity = gi.cvar ("sv_maxvelocity", "2000", 0); + sv_gravity = gi.cvar ("sv_gravity", "800", 0); + sv_gravityx = gi.cvar ("sv_gravityx", "0", 0); + sv_gravityy = gi.cvar ("sv_gravityy", "0", 0); + sv_gravityz = gi.cvar ("sv_gravityz", "1", 0); + g_movescale = gi.cvar ("g_movescale", "1.0", CVAR_SERVERINFO | CVAR_ARCHIVE); + + ai_freeze = gi.cvar ("ai_freeze", "0", 0); + ai_goretest = gi.cvar ("ai_goretest", "0", 0); + ai_pathtest = gi.cvar ("ai_pathtest", "0", 0); + ai_highpriority = gi.cvar ("ai_highpriority", "0", 0); + + ei_show = gi.cvar ("ei_show", "0", 0); + aipoints_show = gi.cvar ("aipoints_show", "0", 0); + ai_nonodes = gi.cvar ("ai_nonodes", "0", 0); + aidec_show = gi.cvar ("aidec_show", "0", 0); + ai_dumb = gi.cvar ("ai_dumb", "0", 0); + ai_editdir = gi.cvar ("ai_editdir", "p:", CVAR_ARCHIVE); + ai_maxcorpses = gi.cvar("ai_maxcorpses", "5", CVAR_ARCHIVE); + ai_corpselife = gi.cvar("ai_corpselife", "5", CVAR_ARCHIVE); + ai_spawnfrequency = gi.cvar("ai_spawnfrequency", "1.0", CVAR_MISC); + + ghl_specular = gi.cvar ("ghl_specular", "1", CVAR_ARCHIVE); + ghl_light_method = gi.cvar ("ghl_light_method", "2", CVAR_ARCHIVE); + ghl_precache_verts = gi.cvar ("ghl_precache_verts", "0", 0); + ghl_precache_texture = gi.cvar ("ghl_precache_texture", "1", 0); + ghl_no_server_update = gi.cvar ("ghl_no_server_update", "0", 0); + + followenemy = gi.cvar("followenemy","0",0); + thirdpersoncam = gi.cvar("thirdpersoncam","0",0); + + // noset vars + dedicated = gi.cvar ("dedicated", "0", CVAR_NOSET); + + // latched vars + sv_cheats = gi.cvar ("cheats", "0", CVAR_SERVERINFO | CVAR_LATCH); + gi.cvar ("gamename", GAMEVERSION , CVAR_SERVERINFO | CVAR_LATCH); + gi.cvar ("gamedate", __DATE__ , CVAR_SERVERINFO | CVAR_LATCH); + + maxclients = gi.cvar ("maxclients", "4", CVAR_SERVERINFO | CVAR_LATCH); + maxspectators = gi.cvar ("maxspectators", "4", CVAR_SERVERINFO| CVAR_LATCH); + deathmatch = gi.cvar ("deathmatch", "0", CVAR_SERVERINFO | CVAR_LATCH); + maxentities = gi.cvar ("maxentities", "1024", CVAR_LATCH); + ctf_loops = gi.cvar("ctf_loops", "3", CVAR_ARCHIVE | CVAR_SERVERINFO); + ctf_loops_count = gi.cvar("ctf_loops_count", "0", 0); + // just to be sure + ctf_loops_count->value = 0; + ctf_flag_captured = gi.cvar("ctf_flag_captured", "0", 0); + ctf_team_red = gi.cvar("ctf_team_red", "MeatWagon", CVAR_ARCHIVE | CVAR_SERVERINFO); + ctf_team_blue = gi.cvar("ctf_team_blue", "The Order", CVAR_ARCHIVE | CVAR_SERVERINFO); + + mskins_expression_limit = gi.cvar ("mskins_expression_limit", "0", CVAR_LATCH | CVAR_ARCHIVE); + mskins_variety_limit = gi.cvar ("mskins_variety_limit", "0", CVAR_LATCH | CVAR_ARCHIVE); + + // change anytime vars + dmflags = gi.cvar ("dmflags", "0", CVAR_SERVERINFO | CVAR_ARCHIVE); + fraglimit = gi.cvar ("fraglimit", "0", CVAR_SERVERINFO | CVAR_ARCHIVE); + timelimit = gi.cvar ("timelimit", "0", CVAR_SERVERINFO | CVAR_ARCHIVE); + sv_suicidepenalty = gi.cvar ("sv_suicidepenalty", "2", CVAR_SERVERINFO | CVAR_ARCHIVE); + password = gi.cvar ("password", "", CVAR_USERINFO); + spectator_password = gi.cvar ("spectator_password", "", CVAR_USERINFO); + + nodamage = gi.cvar ("nodamage", "0", 0); + + sk_spawning = gi.cvar ("sk_spawning", "2", CVAR_LATCH); + sk_saving = gi.cvar ("sk_saving", "2", CVAR_LATCH); + sk_toughness = gi.cvar ("sk_toughness", "2", CVAR_LATCH); + sk_maxencum = gi.cvar ("sk_maxencum", "0", CVAR_LATCH); + skill = gi.cvar ("skill", "2", CVAR_LATCH | CVAR_SERVERINFO); + + freezeworld = gi.cvar("freezeworld", "0", 0); + sv_maplist = gi.cvar ("sv_maplist", "", 0); + +#ifdef _OEMMP_ + sv_pmodlistfile = gi.cvar ("sv_pmodlistfile", "ghoul/pmodels/oemlist", CVAR_LATCH | CVAR_ARCHIVE); +#elif _DEMO_ + sv_pmodlistfile = gi.cvar ("sv_pmodlistfile", "ghoul/pmodels/demo", CVAR_LATCH | CVAR_ARCHIVE); +#else + sv_pmodlistfile = gi.cvar ("sv_pmodlistfile", "ghoul/pmodels/everybody", CVAR_LATCH | CVAR_ARCHIVE); +#endif //_OEMMP_ + + sv_altpmodlistfile = gi.cvar ("sv_altpmodlistfile", "custom", CVAR_LATCH | CVAR_ARCHIVE); + + run_pitch = gi.cvar ("run_pitch", "0.002", 0); + run_roll = gi.cvar ("run_roll", "0.005", 0); + bob_up = gi.cvar ("bob_up", "0.005", 0); + bob_pitch = gi.cvar ("bob_pitch", "0.002", 0); + bob_roll = gi.cvar ("bob_roll", "0.002", 0); + + lock_deaths = gi.cvar_variablevalue("lock_deaths") != 0.0; + lock_blood = gi.cvar_variablevalue("lock_blood") != 0.0; + lock_sever = gi.cvar_variablevalue("lock_sever") != 0.0; + lock_gorezones = gi.cvar_variablevalue("lock_gorezones") != 0.0; + lock_textures = gi.cvar_variablevalue("lock_textures") != 0.0; + + camera_viewdist = gi.cvar ("camera_viewdist", "60.0", 0); + + log_file_counter = gi.cvar("log_file_counter", "0", CVAR_ARCHIVE); + log_file_name = gi.cvar("log_file_name", "", CVAR_ARCHIVE); + log_file_footer = gi.cvar("log_file_footer", "", CVAR_ARCHIVE); + log_file_header = gi.cvar("log_file_header", "", CVAR_ARCHIVE); + log_file_line_header = gi.cvar("log_file_line_header", "", CVAR_ARCHIVE); + log_file_mode = gi.cvar("log_file_mode", "a", CVAR_ARCHIVE); + + sv_jumpcinematic = gi.cvar("sv_jumpcinematic", "0", 0); + + sv_restartlevel = gi.cvar("sv_restartlevel", "0", 0); + + stealth = gi.cvar ("stealth", "1", 0); + + pickupinfo = gi.cvar ("pickupinfo", "0", CVAR_SERVERINFO | CVAR_LATCH); + weaponarena = gi.cvar ("weaponarena", "0", CVAR_SERVERINFO | CVAR_LATCH); + + Com_sprintf (game.helpmessage1, sizeof(game.helpmessage1), ""); + Com_sprintf (game.helpmessage2, sizeof(game.helpmessage2), ""); + + // initialize all entities for this game + game.maxentities = maxentities->value; + g_edicts = (edict_s*)gi.TagMalloc (game.maxentities * sizeof(g_edicts[0]), TAG_GAME); + globals.edicts = g_edicts; + globals.max_edicts = game.maxentities; + + // initialize all clients for this game + game.maxclients = (int)maxclients->value; + game.clients = (gclient_s*)gi.TagMalloc (game.maxclients * sizeof(game.clients[0]), TAG_GAME); + globals.num_edicts = game.maxclients+1; + + flood_msgs = gi.cvar ("flood_msgs", "4", CVAR_ARCHIVE); + flood_persecond = gi.cvar ("flood_persecond", "4", CVAR_ARCHIVE); + flood_waitdelay = gi.cvar ("flood_waitdelay", "10", CVAR_ARCHIVE); + flood_killdelay = gi.cvar ("flood_killdelay", "10", CVAR_ARCHIVE); + + game.cinematicfreeze = 0; + + cpu_mmx = gi.cvar ("cpu_mmx", "0", 0); + cpu_amd3d = gi.cvar ("cpu_amd3d", "0", 0); + use_mmx = gi.cvar ("use_mmx", "1", 0); + use_amd3d = gi.cvar ("use_amd3d", "1", 0); + + gl_pictip = gi.cvar ("gl_pictip", "0", 0); + + // Init the skill level data + InitPlayerSkills(); + + // Load in and initialise the player dll + (*gi.isClient) = Game_InitPlayer(); +} + +//=================================================================== +void PB_KillBody(edict_t &ent); +void W_KillInv(edict_t &ent); + +void CleanUpGame (void) +{ + int i; + + gi.dprintf ("==== ShutdownGame ====\n"); + + if(pe) + { + pe->UncacheViewWeaponModels(); + } + +// game.GameStats->Delete(); + + ShutdownScripts(); + + // Delete each client's inventory object. + // And get rid of everybody's bodies, too! + + for (i = 0; i < game.maxclients; i++) + { + if(g_edicts[i + 1].client) + { + PB_KillBody(g_edicts[i + 1]); + W_KillInv(g_edicts[i + 1]); + + delete g_edicts[i + 1].client->dmInfo; + g_edicts[i + 1].client->ps.gun = 0; + } + } + + // clear out any pickup info from this level...BEFORE freeing edicts, please. + thePickupList.Destroy(); + + //clean up ai stuff that was created without exe's knowledge + G_FreeAllEdicts(); + + // Shutdown player dll. + (*gi.isClient) = 0; + Game_ShutdownPlayer(); + + //clean up all the ghoul stuff we've been using + W_ShutdownWorldWeaponModels(); + + DeleteDeathmatchSystem(); + aiPoints.clean(); +// EnemyInfo.cleanup(); + +#if TIME_ENTS + PrintTimings(); +#endif +} + +void ShutdownGame (void) +{ + CleanUpGame(); + gi.FreeTags (TAG_LEVEL); + gi.FreeTags (TAG_GAME); +} + +void G_SetCinematicFreeze(byte cf) +{ + game.cinematicfreeze = cf; +} + +byte G_GetCinematicFreeze(void) +{ + return(game.cinematicfreeze); +} + +void G_GetGameStats(void) +{ + int hours, minutes, seconds; + int thours, tminutes, tseconds; + float total; + + total = game.playedTime + (level.time - level.startTime); + if(!total) + { + return; + } + gi.cvar_set("stat_playedtime_base", va("%f", total)); + + tseconds = (int)total % 60; + total /= 60; + tminutes = (int)total % 60; + total /= 60; + thours = total; + + total = (level.time - level.startTime); + seconds = (int)total % 60; + total /= 60; + minutes = (int)total % 60; + total /= 60; + hours = total; + + gi.cvar_set("stat_guyskilled", va("%d " P_ORANGE "(%d)", level.guysKilled, game.guysKilled + level.guysKilled)); + gi.cvar_set("stat_friendlieskilled", va("%d " P_ORANGE "(%d)", level.friendliesKilled, game.friendliesKilled + level.friendliesKilled)); + gi.cvar_set("stat_throatshots", va("%d " P_ORANGE "(%d)", level.throatShots, game.throatShots + level.throatShots)); + gi.cvar_set("stat_nutshots", va("%d " P_ORANGE "(%d)", level.nutShots, game.nutShots + level.nutShots)); + gi.cvar_set("stat_headshots", va("%d " P_ORANGE "(%d)", level.headShots, game.headShots + level.headShots)); + gi.cvar_set("stat_gibs", va("%d " P_ORANGE "(%d)", level.gibs, game.gibs + level.gibs)); + gi.cvar_set("stat_savesused", va("%d " P_ORANGE "(%d)", level.savesUsed, game.savesUsed + level.savesUsed)); + gi.cvar_set("stat_playedtime", va("%d.%02d.%02d " P_ORANGE "(%d.%02d.%02d)", hours, minutes, seconds, thours, tminutes, tseconds)); + gi.cvar_set("stat_cashearned", va("%d " P_ORANGE "(%d)", level.cashEarned, game.cashEarned + level.cashEarned)); +} + +void G_UpdateInven(void) +{ + if(!dm->isDM()) + { // let the server know what kind of goodies we're coming out of here with - yeah! + sharedEdict_t sh; + + // Clear out any existing weapons + gi.cvar_setvalue("knife", 0.0f); + gi.cvar_setvalue("pistol1", 0.0f); + gi.cvar_setvalue("pistol2", 0.0f); + gi.cvar_setvalue("shotgun", 0.0f); + gi.cvar_setvalue("sniper", 0.0f); + gi.cvar_setvalue("assault", 0.0f); + gi.cvar_setvalue("mpistol", 0.0f); + gi.cvar_setvalue("machinegun", 0.0f); + gi.cvar_setvalue("slugger", 0.0f); + gi.cvar_setvalue("flamegun", 0.0f); + gi.cvar_setvalue("rocket", 0.0f); + gi.cvar_setvalue("mpg", 0.0f); + + gi.cvar_setvalue("grenade", 0.0f); + gi.cvar_setvalue("fpak", 0.0f); + gi.cvar_setvalue("goggles", 0.0f); + gi.cvar_setvalue("c4", 0.0f); + gi.cvar_setvalue("medkit", 0.0f); + + sh.inv = (inven_c *)g_edicts[1].client->inv; + + if (sh.inv) + { + sh.edict = &g_edicts[1]; + sh.inv->setOwner(&sh); + sh.inv->buildInvForMenu(0, g_edicts[1].health); + } + } +} + +const char *G_GetDMGameName(void) +{ + if(dm) + { + return(dm->getGameName()); + } + return("Unknown"); +} + +void ResetCTFTeam(edict_t *ent) +{ + if (ent->client) + if(ent->client->resp.team) + { + ent->client->resp.team = NOTEAM; + } +} + +/* +================= +GetGameAPI + +Returns a pointer to the structure with all entry points +and global variables +================= +*/ + +game_export_t *GetGameAPI (game_import_t *import) +{ + gi = *import; + + TheGhoul=(IGhoul *)gi.GetGhoul(); + + { + cvar_t *ghl_mip; + ghl_mip=gi.cvar("ghl_mip", "0", CVAR_ARCHIVE); + int mip=floor(ghl_mip->value+0.5f); + if (mip<0) + mip=0; + if (mip>2) + mip=2; + TheGhoul->SetMip(mip); + } + + globals.apiversion = GAME_API_VERSION; + globals.Init = InitGame; + globals.Shutdown = ShutdownGame; + globals.SpawnEntities = SpawnEntities; + + globals.WriteGame = WriteGame; + globals.ReadGame = ReadGame; + globals.WriteLevel = WriteLevel; + globals.ReadLevel = ReadLevel; + + globals.ClientThink = ClientThink; + globals.ClientConnect = ClientConnect; + globals.ClientUserinfoChanged = ClientUserinfoChanged; + globals.ClientDisconnect = ClientDisconnect; + globals.ClientBegin = ClientBegin; + globals.ClientCommand = ClientCommand; + globals.ResetCTFTeam = ResetCTFTeam; + + globals.GameAllowASave = G_GameAllowASave; + globals.SavesLeft = G_SavesLeft; + globals.GetGameStats = G_GetGameStats; + globals.UpdateInven = G_UpdateInven; + globals.GetDMGameName = G_GetDMGameName; + globals.GetCinematicFreeze = G_GetCinematicFreeze; + globals.SetCinematicFreeze = G_SetCinematicFreeze; + + globals.RunFrame = G_RunFrame; + + globals.edict_size = sizeof(edict_t); + + return &globals; +} + +#ifndef GAME_HARD_LINKED +// this is only here so the functions in q_shared.c and q_shwin.c can link +void Sys_Error (char *error, ...) +{ + va_list argptr; + char text[1024]; + + va_start (argptr, error); + vsprintf (text, error, argptr); + va_end (argptr); + + gi.error (ERR_FATAL, "%s", text); +} + +void Com_Printf (char *msg, ...) +{ + va_list argptr; + char text[1024]; + + va_start (argptr, msg); + vsprintf (text, msg, argptr); + va_end (argptr); + + gi.dprintf ("%s", text); +} + +#endif + +void Enemy_Printf (ai_public_c *which_ai, char *msg, ...) +{ + va_list argptr; + char text[1024]; + + if(!which_ai) + { + return; + } + + if(which_ai->BeingWatched() == false) + { + return; + } + + va_start (argptr, msg); + vsprintf (text, msg, argptr); + va_end (argptr); + + gi.dprintf ("%s", text); +} + +//====================================================================== + + +/* +================= +ClientEndServerFrames +================= +*/ +void ClientEndServerFrames (void) +{ + int i; + edict_t *ent; + + // calc the player views now that all pushing + // and damage has been added + for (i=0 ; i<(int)maxclients->value ; i++) + { + ent = g_edicts + 1 + i; + if (!ent->inuse || !ent->client) + continue; + ClientEndServerFrame (ent); + } + +} + +/* +================= +CreateTargetChangeLevel + +Returns a pointer to newly created target changelevel entity. +================= +*/ + +edict_t *CreateTargetChangeLevel(char *mapname) +{ + edict_t *ent; + + ent = G_Spawn (); + ent->classname = "target_changelevel"; + Com_sprintf(level.nextmap, sizeof(level.nextmap), "%s", mapname); + ent->map = level.nextmap; + + return(ent); +} + +/* +================= +EndDMLevel + +The timelimit or fraglimit has been exceeded +================= +*/ +void EndDMLevel (void) +{ + edict_t *ent; + char *s, *t, *f; + static const char *seps = " ,\n\r"; + + + // Stay on current level if DM flag tells us to do so. + if(dm->dmRule_SAME_LEVEL()) + { + BeginIntermission(CreateTargetChangeLevel(level.mapname)); + + return; + } + + // If we have a maplist, then look at that to see what map to load next. + + if (*sv_maplist->string) + { + s = strdup(sv_maplist->string); + f = NULL; + t = strtok(s, seps); + + while (t != NULL) + { + if (stricmp(t, level.mapname) == 0) + { + // Current level map is in the maplist, so go to the next map in + // the maplist. + + t = strtok(NULL, seps); + + if (t == NULL) + { + // Current map is at end of the maplist, so try to loop back + // to the first map in the maplist. + + if (f == NULL) + { + // But there isn't a first one, so just run the current + // level map again. + + BeginIntermission (CreateTargetChangeLevel (level.mapname) ); + } + else + { + BeginIntermission (CreateTargetChangeLevel (f) ); + } + } + else + { + BeginIntermission (CreateTargetChangeLevel (t) ); + } + + free(s); + + return; + } + + if (!f) + { + f = t; + } + + t = strtok(NULL, seps); + } + + if(f) + { + BeginIntermission(CreateTargetChangeLevel(f)); + + free(s); + + return; + } + else + free(s); + } + + if (level.nextmap[0]) + { + // Go to a specific map. + + BeginIntermission (CreateTargetChangeLevel (level.nextmap) ); + } + else + { + // Search for a changelevel. + + ent = G_Find (NULL, FOFS(classname), "target_changelevel"); + + if (!ent) + { + // The map designer didn't include a changelevel, so create a fake + // entity that goes back to the same level. + + BeginIntermission (CreateTargetChangeLevel (level.mapname) ); + + return; + } + + BeginIntermission (ent); + } +} + +/* +================= +CheckDMRules +================= +*/ + +void CheckDMRules (void) +{ + int i; + gclient_t *cl; + + if (level.intermissiontime) + return; + + if (!dm->isDM()) + return; + + // if we are done with this CTF game, end it. + if ((deathmatch->value == DM_CTF) && (ctf_flag_captured->value)) + { + gi.SP_Print (NULL, DM_CTF_END_GAME); + EndDMLevel (); + return; + } + + if (timelimit->value) + { + // kef -- actually check versus the time each client joined, not against + //level.time + for (i=0 ; i<(int)maxclients->value ; i++) + { + if (!g_edicts[i+1].inuse) + continue; + if ( (g_edicts[i+1].client) && + ((level.framenum - g_edicts[i+1].client->resp.enterframe) >= (timelimit->value * 600)) ) + { + gi.SP_Print (NULL, DM_GENERIC_TIME_LIMIT_HIT, (short)timelimit->value); + EndDMLevel (); + return; + } + } + } + + if (fraglimit->value) + { + + if(dm->dmRule_TEAMPLAY()) + { + struct TeamInfo_s teams[MAX_CLIENTS]; + int score = 0, j, total_teams = 0; + edict_t *cl_ent; + + for (i=0 ; i<(int)maxclients->value ; i++) + { + cl_ent=g_edicts+1+i; + + if(!cl_ent->inuse) + { + continue; + } + + // in a team game, we want to compare the team score to the fraglimit + score=game.clients[i].resp.score; + + for(j=0;j= fraglimit->value) + { + gi.SP_Print (NULL, DM_GENERIC_FRAG_LIMIT_HIT, (short)fraglimit->value); + EndDMLevel (); + return; + } + } + } + else + { + for (i=0 ; i<(int)maxclients->value ; i++) + { + cl = game.clients + i; + if (!g_edicts[i+1].inuse) + continue; + + if (cl->resp.score >= fraglimit->value) + { + gi.SP_Print (NULL, DM_GENERIC_FRAG_LIMIT_HIT, (short)fraglimit->value); + EndDMLevel (); + return; + } + } + } + } +} + +/* +====================== +FadeOutAfterDeath + + fade screen to black after single player death +====================== +*/ + +bool FadeOutAfterDeath(void) +{ + int i = 0; + bool bRGBFinished = false, bAFinished = false; + + for (i = 0; i <3; i++) + { + if (g_edicts[1].client->fade_rgb[i] < 1.0f) + { + g_edicts[1].client->fade_rgb[i] = 0.0f; + bRGBFinished = true; + } + } + if (g_edicts[1].client->fade_alpha > 0.95) + { + g_edicts[1].client->fade_alpha = 1.0f; + bAFinished = true; + } + else if (g_edicts[1].client->fade_alpha < 1.0f) + { + g_edicts[1].client->fade_alpha += 0.02f; + } + return (bRGBFinished && bAFinished); +} + +/* +============= +ExitLevel +============= +*/ + + +void ExitLevel (void) +{ + int i; + edict_t *ent; + char command [256]; + + Com_sprintf (command, sizeof(command), "gamemap \"%s\"\n", level.changemap); + gi.AddCommandString (command); + level.changemap = NULL; + level.exitintermission = 0; + level.intermissiontime = 0; + ClientEndServerFrames (); + + // clear some things before going to next level + + dm->ClearFlagCount(); + + // make sure we clear any flags related to being in a cinematic + game.cinematicfreeze = 0; + gi.cvar_set("sv_jumpcinematic","0"); + for (i=0 ; i<(int)maxclients->value ; i++) + { + ent = g_edicts + 1 + i; + if (!ent->inuse) + continue; + if (ent->health > ent->client->pers.max_health) + { + ent->health = ent->client->pers.max_health; + } + ent->client->ps.gun = 0; + } + + //sfs--need to register that ghoul models aren't available for weapon; this should also be different from disconnect, probably + W_ShutdownWorldWeaponModels(); +} + +/* +================== +gamerules_c::clientRankings +================== +*/ + +typedef struct scoreboardSort_s +{ + int sortedClients[MAX_CLIENTS]; + int sortedScores[MAX_CLIENTS]; + int sortedCount; +} scoreboardSort_t; + +void clientRankings(void) +{ + scoreboardSort_t scoreboardSort; + edict_t *cl_ent; + int cl_score, + i,j,k; + + memset((void *)&scoreboardSort,0,sizeof(scoreboardSort)); + + // Sort all the clients by score from highest to lowest. + + for(i=0;iinuse) + continue; + + // Spectators don't contribute to rankings. + + if(cl_ent->client->resp.spectator) + continue; + + cl_score=game.clients[i].resp.score; + + for(j=0;jscoreboardSort.sortedScores[j]) + break; + } + + for(k=scoreboardSort.sortedCount;k>j;k--) + { + scoreboardSort.sortedClients[k]=scoreboardSort.sortedClients[k-1]; + scoreboardSort.sortedScores[k]=scoreboardSort.sortedScores[k-1]; + } + + scoreboardSort.sortedClients[j]=i; + scoreboardSort.sortedScores[j]=cl_score; + scoreboardSort.sortedCount++; + } + + // Set DM ranking for each client. + + for(i=0;iclient->ps.dmRank=i+1; + cl_ent->client->ps.dmRankedPlyrs=scoreboardSort.sortedCount; + } +} + +/* +================ +G_RunFrame + +Advances the world by 0.1 seconds +================ +*/ + +float G_RunFrame (int serverframe) +{ + int i; + edict_t *ent; +#if TIME_ENTS + timing_c timing; +#endif // _DEBUG + + if(freezeworld->value) + { + return level.time; + } +#ifndef _FINAL_ +// Com_Printf(P_CYAN "%s\n", gi.GetLabel(&G_RunFrame)); +#endif + + level.framenum++; +// level.framenum=serverframe; + level.time = level.framenum*FRAMETIME; + + // choose a client for monsters to target this frame + gmonster.SetSightClient (); + gmonster.UpdateEnemyPriority(); + + UpdateWorldSpawningByFrame(); + + // check for restart if the player's dead + if (!dm->isDM()) + { + if (g_edicts[1].client && g_edicts[1].health <= 0) + { + if (FadeOutAfterDeath()) + { // finished fading out...go to load menu + gi.AddCommandString ("respawn\n"); + } + } + } + + // exit intermissions + + if (level.exitintermission) + { + ExitLevel (); + return level.time; + } + + if ((serverframe<2&&ghl_precache_verts->value>0.0f)||(serverframe<1&&ghl_precache_texture->value>0.0f)) + { + ent = &g_edicts[0]; + for (i=0 ; iinuse) + continue; + if (ent->ghoulInst) + ent->ghoulInst->GetGhoulObject()->PreCache(ghl_specular->value>0.0f&&ghl_light_method->value>0.0f); +// ent->ghoulInst->PreCache(ghl_specular->value>0.0f&&ghl_light_method->value>0.0f,serverframe==0&&ghl_precache_texture->value>0.0f,ghl_precache_verts->value>0.0f); + } + } + + TheGhoul->BeginServerFrame(); + // + // treat each object in turn + // even the world gets a chance to think + // + level.num_clients = 0; + + ent = &g_edicts[0]; + for (i=0 ; iinuse) + continue; + // If we are a client edict, increment the level.num_clients value + if ((i) && (i <= (int)maxclients->value)) + level.num_clients++; + +#if TIME_ENTS + timing.Start(); +#endif + + level.current_entity = ent; + + + // if the ground entity moved, make sure we are still on it + if ((ent->groundentity) && (ent->groundentity->linkcount != ent->groundentity_linkcount)) + { + ent->groundentity = NULL; + if ( !(ent->flags & (FL_SWIM|FL_FLY)) && (ent->ai) ) + { + gmonster.CheckGround (ent); + } + } + + if (i > 0 && i <= (int)maxclients->value) + { + // have we allowed too many hostages to die? + CheckDeadHostageCount(ent); + + ClientBeginServerFrame (ent); +#if TIME_ENTS + if (ent->owner_spawn) + { + unsigned long l=(unsigned long)timing.End() / 1000; + ent->owner_spawn->time_used += l; + if (l>3*400) + { + char temp[1024]; + sprintf(temp,"%s took ~%d ms in the game loop\n",ent->owner_spawn->name,(int)l/400); + OutputDebugString(temp); + } + } +#endif + //ss added to allow players to use callbacks (for dm) + PB_GhoulUpdate(*ent); + + continue; + } + + if (ent->ghoulInst&&ghl_no_server_update->value<0.5f) + { + ent->ghoulInst->ServerUpdate(level.time); + } + + G_RunEntity (ent); + +#if TIME_ENTS + if (ent->owner_spawn) + { + unsigned long l=(unsigned long)timing.End() / 1000; + ent->owner_spawn->time_used += l;; + if (l>3*400) + { + char temp[1024]; + sprintf(temp,"%s took ~%d ms in the game loop\n",ent->owner_spawn->name,(int)l/400); + OutputDebugString(temp); + } + } +#endif + } + + dm->checkEvents(); + + ProcessScripts (); + + // See if it is time to end a deathmatch. + CheckDMRules (); + + TheGhoul->EndServerFrame(); + + // Build the playerstate_t structures for all players. + ClientEndServerFrames (); + + // Generate DM rankings. + + if(dm->isDM()) + clientRankings(); + + return level.time; +} + + + + + + + + + + + + + + + + + + + + + + +// if we've allowed too many hostages to die in this level, we fail the mission. +void CheckDeadHostageCount(edict_t *player) +{ + if ((level.maxDeadHostages != -1) && + (level.deadHostages >= level.maxDeadHostages) && + player->client) + { + player_die(player, NULL, NULL, 99999, vec3_origin); + } +} + +int G_GameAllowASave(void) +{ + if(!level.savesLeft) + { + gi.SP_Print(NULL, SINGLEPLR_SAVES_NO_MORE); + return(0); + } + + level.savesLeft--; + level.savesUsed++; + + if(level.savesLeft == 1) + { + gi.SP_Print(NULL, SINGLEPLR_SAVES_ONE_LEFT); + } + else if(level.savesLeft > 0) + { + gi.SP_Print(NULL, SINGLEPLR_SAVES_N_LEFT, level.savesLeft); + } + else if(level.savesLeft == 0) + { + gi.SP_Print(NULL, SINGLEPLR_SAVES_USED_UP); + } + return(1); +} + +void G_SavesLeft(void) +{ + cvar_t *savesleft; + + if(level.savesLeft < 0) + { + gi.cvar_set("menu_savesleft", gi.SP_GetStringText(SINGLEPLR_UNLIMITED)); + } + else if(level.savesLeft > 0) + { + gi.cvar_setvalue("menu_savesleft", level.savesLeft); + } + else + { + gi.cvar_set("menu_savesleft", "0"); + } + savesleft = gi.cvar("menu_savesleft", "", 0); + gi.dprintf("Saves left : %s\n", savesleft->string); +} + +// end diff --git a/Source/Game/gamecpp/g_misc.cpp b/Source/Game/gamecpp/g_misc.cpp new file mode 100644 index 0000000..8f7f436 --- /dev/null +++ b/Source/Game/gamecpp/g_misc.cpp @@ -0,0 +1,1806 @@ +// g_misc.c +#include "g_local.h" +#include "fields.h" +#include "..\qcommon\configstring.h" +#include "..\qcommon\ef_flags.h" + +#define INVINCIBLE 1 +#define GLASS 2 + +#define AREA_PORTAL_START_OPEN 1 + +#define GLASS_PAINCHUNKS 2 +#define BREAKABLE_NOT_IN_CAM 8 + +void FindCorrectOrigin(edict_t *ent, vec3_t origin) +{ + // to accomodate BMODELS, which are dumb... + if ((ent->solid == SOLID_BSP) && (VectorCompare(ent->s.origin, vec3_origin))) + { + VectorScale(ent->absmax, .5, origin); + VectorMA(origin, .5, ent->absmin, origin); + } + else + { + VectorAdd(ent->mins, ent->maxs, origin); + VectorMA(ent->s.origin, .5, origin, origin); + } + return; +} + +/*QUAKED func_group (0 0 0) ? +Used to group brushes together just for editor convenience. +*/ + +//===================================================== + +void Use_Areaportal (edict_t *ent, edict_t *other, edict_t *activator) +{ + ent->count ^= 1; // toggle state +// gi.dprintf ("portalstate: %i = %i\n", ent->style, ent->count); + gi.SetAreaPortalState (ent->style, ent->count); +} + +/*QUAKED func_areaportal (0 0 0) ? + +This is a non-visible object that divides the world into +areas that are seperated when this portal is not activated. +Usually enclosed in the middle of a door. +*/ +void SP_func_areaportal (edict_t *ent) +{ +// ent->use = Use_Areaportal; according to our crack design staff, +// areaportals are ALWAYS triggered by doors. This stuff is already handled in door_use_areaportals, +// so we don' need it n'more + ent->count = 0; // always start closed; + +} + +//===================================================== + + +/* +================= +Misc functions +================= +*/ +void VelocityForDamage (int damage, vec3_t v) +{ + v[0] = gi.flrand(-100.0F, 100.0F); + v[1] = gi.flrand(-100.0F, 100.0F); + v[2] = gi.flrand(100.0F, 300.0F); + + if (damage < 50) + VectorScale (v, 0.7, v); + else + VectorScale (v, 1.2, v); +} + +void ClipGibVelocity (edict_t *ent) +{ + if (ent->velocity[0] < -300) + ent->velocity[0] = -300; + else if (ent->velocity[0] > 300) + ent->velocity[0] = 300; + if (ent->velocity[1] < -300) + ent->velocity[1] = -300; + else if (ent->velocity[1] > 300) + ent->velocity[1] = 300; + if (ent->velocity[2] < 200) + ent->velocity[2] = 200; // always some upwards + else if (ent->velocity[2] > 500) + ent->velocity[2] = 500; +} + + +/* +================= +gibs +================= +*/ +void gib_think (edict_t *self) +{ + self->s.frame++; + self->nextthink = level.time + FRAMETIME; + + if (self->s.frame == 10) + { + self->think = G_FreeEdict; + self->nextthink = level.time + gi.flrand(8.0F, 18.0F); + } +} + +void gib_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t normal_angles, right; + + if (!self->groundentity) + return; + + self->touch = NULL; + + if (plane) + { + gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/fhit3.wav"), .6, ATTN_NORM, 0); + + vectoangles (plane->normal, normal_angles); + AngleVectors (normal_angles, NULL, right, NULL); + vectoangles (right, self->s.angles); + + if (self->s.modelindex == sm_meat_index) + { + self->s.frame++; + self->think = gib_think; + self->nextthink = level.time + FRAMETIME; + } + } +} + +void gib_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + G_FreeEdict (self); +} + +void ThrowGib (edict_t *self, char *gibname, int damage, int type) +{ + edict_t *gib; + vec3_t vd; + vec3_t origin; + vec3_t size; + float vscale; + + gib = G_Spawn(); + + VectorScale (self->size, 0.5, size); + VectorAdd (self->absmin, size, origin); + gib->s.origin[0] = origin[0] + gi.flrand(-size[0], size[0]); + gib->s.origin[1] = origin[1] + gi.flrand(-size[1], size[1]); + gib->s.origin[2] = origin[2] + gi.flrand(-size[2], size[2]); + + gi.setmodel (gib, gibname); + gib->solid = SOLID_NOT; +// gib->s.effects |= EF_GIB; + gib->flags |= FL_NO_KNOCKBACK; + gib->takedamage = DAMAGE_YES; + gib->die = gib_die; + + if (type == GIB_ORGANIC) + { + gib->movetype = MOVETYPE_TOSS; + gib->touch = gib_touch; + vscale = 0.5; + } + else + { + gib->movetype = MOVETYPE_BOUNCE; + vscale = 1.0; + } + + VelocityForDamage (damage, vd); + VectorMA (self->velocity, vscale, vd, gib->velocity); + ClipGibVelocity (gib); + gib->avelocity[0] = gi.flrand(0.0F, 600.0F); + gib->avelocity[1] = gi.flrand(0.0F, 600.0F); + gib->avelocity[2] = gi.flrand(0.0F, 600.0F); + + gib->think = G_FreeEdict; + gib->nextthink = level.time + gi.flrand(10.0F, 20.0F); + + gi.linkentity (gib); +} + +void ThrowHead (edict_t *self, char *gibname, int damage, int type) +{ + vec3_t vd; + float vscale; + + self->s.skinnum = 0; + self->s.frame = 0; + VectorClear (self->mins); + VectorClear (self->maxs); + + gi.setmodel (self, gibname); + self->solid = SOLID_NOT; + self->s.sound = 0; + self->flags |= FL_NO_KNOCKBACK; + self->svflags &= ~SVF_MONSTER; + self->takedamage = DAMAGE_YES; + self->die = gib_die; + + if (type == GIB_ORGANIC) + { + self->movetype = MOVETYPE_TOSS; + self->touch = gib_touch; + vscale = 0.5; + } + else + { + self->movetype = MOVETYPE_BOUNCE; + vscale = 1.0; + } + + VelocityForDamage (damage, vd); + VectorMA (self->velocity, vscale, vd, self->velocity); + ClipGibVelocity (self); + + self->avelocity[YAW] = gi.flrand(-600.0F, 600.0F); + + self->think = G_FreeEdict; + self->nextthink = level.time + gi.flrand(10.0F, 20.0F); + + gi.linkentity (self); +} + +static int shakeIntensity[] = {7, 17, 35, 55, 80}; + +void ShakeCameras (vec3_t origin, int amount, int radius, int delta) +{ + edict_t *curSearch = NULL; + float shakeAmount; + vec3_t dist; + float distf; + int i, j = 0; + + CRadiusContent rad(origin, radius); + + for(i = 0; i < rad.getNumFound(); i++) + { + curSearch = rad.foundEdict(i); + + if(curSearch->client != NULL) + { + VectorSubtract(curSearch->s.origin, origin, dist); + distf = VectorLength(dist); + shakeAmount = (1.0 - (distf/radius)) * amount; + + j = 4; + while (j > 0) + { + if(shakeAmount > shakeIntensity[j])break; + + j--; + } + + FX_SetEvent_Data(curSearch, EV_CAMERA_SHAKE_VERYLIGHT + j, delta); + } + } +} + +void BlindingLight(vec3_t origin, int intensity, float maxalpha, float delta) +{ + edict_t *curBlinded = NULL; + trace_t tr; + vec3_t endPoint, tempVect; + float dist; + vec3_t fwd; + float val; + + while ((curBlinded = G_Find (curBlinded, FOFS(classname), "player")) != NULL) + { + VectorSubtract(origin, curBlinded->s.origin, tempVect); + dist = VectorLength(tempVect); + if(dist > intensity)continue; + + VectorCopy(curBlinded->s.origin, endPoint); + + //ss--i think this is valid viewheight + endPoint[2] += curBlinded->viewheight;// 26; // is there an actual value describing the player's view height? + + gi.trace (origin, NULL, NULL, endPoint, curBlinded, MASK_SHOT, &tr); + + if(tr.fraction <= .99)continue; + + AngleVectors(curBlinded->client->ps.viewangles, fwd, NULL, NULL); + VectorNormalize(tempVect); + val = DotProduct(fwd, tempVect); + if(val > 0) + { + if (curBlinded->client->goggles_on) + { // Using the light intensifier goggles. All flashes are more intense. + float blindalpha; + + blindalpha = intensity*.03/dist*val; + if (blindalpha < 0.4) + { + blindalpha += 0.4; + } + else + { + blindalpha *= 2.0; + } + curBlinded->client->blinding_alpha += blindalpha; + } + else + { // Normal blinding level. + curBlinded->client->blinding_alpha += intensity*.03/dist*val; + } + } + + if (curBlinded->client->goggles_on) + { // Flashes should last longer with goggles. + delta *= 0.5; + maxalpha += (1.0-maxalpha)*0.5; + } + + // Cap the alpha + if(curBlinded->client->blinding_alpha > maxalpha) + { + curBlinded->client->blinding_alpha = maxalpha; + } + + // add in the delta at which we think the screen flash should go down. + // use the slowed blind decay time you can... + if (curBlinded->client->blinding_alpha_delta <= 0 || delta < curBlinded->client->blinding_alpha_delta) + { + curBlinded->client->blinding_alpha_delta = delta; + } + } + + curBlinded = NULL; + + CRadiusContent rad(origin, intensity); + + for(int i = 0; i < rad.getNumFound(); i++) + { + curBlinded = rad.foundEdict(i); + + if (!curBlinded->ai)continue; + + VectorCopy(curBlinded->s.origin, endPoint); + endPoint[2] += curBlinded->viewheight; + gi.trace (origin, NULL, NULL, endPoint, curBlinded, MASK_SHOT, &tr); + + if(tr.fraction <= .99)continue; + + curBlinded->ai->GetLookVector(fwd); + + VectorSubtract(origin, curBlinded->s.origin, tempVect); + dist = VectorNormalize(tempVect); + + val = DotProduct(fwd, tempVect); + +// if(val > -0.75) + { + float monster_blind = ((float)intensity*0.5)/dist*(val+1.25); + if (monster_blind > 25) + { + monster_blind = 25; + } + curBlinded->ai->MuteSenses(sight_mask, monster_blind, smute_recov_linear, monster_blind); + } + } +} + +void TearGasEnt(edict_t *ent, float intensity) +{ + if(!strcmp(ent->classname, "player")) + { + ent->client->gas_blend += intensity; + if(ent->client->gas_blend > 1.0)ent->client->gas_blend = 1.0; + } + else if(ent->ai) + { + ent->ai->MuteSenses(sight_mask, intensity*50, smute_recov_linear, intensity*50); + } +} + +/* +================= +debris +================= +*/ +void debris_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + G_FreeEdict (self); +} + +void ThrowDebris (edict_t *self, char *modelname, float speed, vec3_t origin) +{ + edict_t *chunk; + vec3_t v; + + chunk = G_Spawn(); + VectorCopy (origin, chunk->s.origin); + gi.setmodel (chunk, modelname); + v[0] = gi.flrand(-100.0F, 100.0F); + v[1] = gi.flrand(-100.0F, 100.0F); + v[2] = gi.flrand(0.0F, 200.0F); + VectorMA (self->velocity, speed, v, chunk->velocity); + chunk->movetype = MOVETYPE_BOUNCE; + chunk->solid = SOLID_NOT; + chunk->avelocity[0] = gi.flrand(0.0F, 600.0F); + chunk->avelocity[1] = gi.flrand(0.0F, 600.0F); + chunk->avelocity[2] = gi.flrand(0.0F, 600.0F); + chunk->think = G_FreeEdict; + chunk->nextthink = level.time + gi.flrand(5.0F, 10.0F); + chunk->s.frame = 0; + chunk->flags = 0; + chunk->classname = "debris"; + chunk->takedamage = DAMAGE_YES; + chunk->die = debris_die; + gi.linkentity (chunk); +} + + +void BecomeExplosion1 (edict_t *self) +{ +/* gi.WriteByte (svc_temp_entity); + gi.WriteByte (TE_EXPLOSION1); + gi.WritePosition (self->s.origin); + gi.multicast (self->s.origin, MULTICAST_PVS);*/ + + G_FreeEdict (self); +} + + +void BecomeExplosion2 (edict_t *self) +{ +/* gi.WriteByte (svc_temp_entity); + gi.WriteByte (TE_EXPLOSION2); + gi.WritePosition (self->s.origin); + gi.multicast (self->s.origin, MULTICAST_PVS);*/ + + G_FreeEdict (self); +} + + +/*QUAKED path_corner (.5 .3 0) (-8 -8 -8) (8 8 8) TELEPORT WAITONECYCLE FACEPLAYER +WAITONECYCLE: ignores wait time, goes through waitactions once +FACEPLAYER: will face the player forever, once it reaches this point +Target: next path corner +Pathtarget: gets used when an entity that has + this path_corner targeted touches it +MoveAction: animation to play while moving to the next path_corner +Waitaction1: animations to play while waiting +Waitaction2: +Waitaction3: +Waitaction4: +Waitaction5: +Waitaction6: +Wait: time to wait (-1 for forever) +*/ + +#define MAX_PATHCORNER_WAITACTIONS 6 + +//for MMoves +#include "ai_private.h" + +void SetWaitAction(edict_t *self, int actionNum, char *actionName) +{ + mmove_t **putMoveHere; + int i; + + if (actionNum > MAX_PATHCORNER_WAITACTIONS) + { + return; + } + + if (!actionName || !(*actionName)) + { + return; + } + + //ahem. NO! fixme, this is a quick thing only + switch(actionNum) + { + case 1: + putMoveHere = &self->wait_action1; + break; + case 2: + putMoveHere = &self->wait_action2; + break; + case 3: + putMoveHere = &self->wait_action3; + break; + case 4: + putMoveHere = &self->wait_action4; + break; + case 5: + putMoveHere = &self->wait_action5; + break; + default: +#if _DEBUG + gi.dprintf("warning: trying to set invalid path_corner waitaction: %d\n", actionNum); +#endif + case 6: + putMoveHere = &self->wait_action6; + break; + } + + for (i=0; MMoves[i].ghoulSeqName[0]; i++)//this is yucky too--will prolly need to go through several lists + { + //found the move. + if (!stricmp(MMoves[i].ghoulSeqName, actionName)) + { + *putMoveHere = &MMoves[i]; + return; + } + } + gi.dprintf("couldn't find path_corner waitaction: %s (using stand)\n", actionName); + *putMoveHere=&generic_move_stand; +} + +void SetMoveAction(edict_t *self, char *actionName) +{ + mmove_t **putMoveHere; + int i; + + if (!actionName || !(*actionName)) + { + return; + } + + putMoveHere = &self->move_action; + + for (i=0; MMoves[i].ghoulSeqName[0]; i++)//this is yucky too--will prolly need to go through several lists + { + //found the move. + if (!stricmp(MMoves[i].ghoulSeqName, actionName)) + { + *putMoveHere = &MMoves[i]; + return; + } + } + gi.dprintf("couldn't find path_corner moveaction: %s (using walk)\n", actionName); + *putMoveHere=&generic_move_walk; +} + +mmove_t *GetMoveAction(edict_t *self) +{ + if (!self) + { + return NULL; + } + return self->move_action; +} + +mmove_t *GetWaitAction(edict_t *self, int actionNum) +{ + if ((actionNum > MAX_PATHCORNER_WAITACTIONS) || !self) + { + return NULL; + } + + //ahem. NO! fixme, this is a quick thing only + switch(actionNum) + { + case 1: + return self->wait_action1; + break; + case 2: + return self->wait_action2; + break; + case 3: + return self->wait_action3; + break; + case 4: + return self->wait_action4; + break; + case 5: + return self->wait_action5; + break; + case 6: + return self->wait_action6; + break; + } +#if _DEBUG + gi.dprintf("warning: trying to get invalid path_corner waitaction: %d\n", actionNum); +#endif + return NULL; +} + +void path_corner_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t v; + edict_t *next; + + if (other->movetarget != self) + return; + + if (other->enemy) + return; + + if (self->pathtarget) + { + char *savetarget; + + savetarget = self->target; + self->target = self->pathtarget; + G_UseTargets (self, other); + self->target = savetarget; + } + + if (self->target) + next = G_PickTarget(self->target); + else + next = NULL; + + if ((next) && (next->spawnflags & 1)) + { + VectorCopy (next->s.origin, v); + v[2] += next->mins[2]; + v[2] -= other->mins[2]; + VectorCopy (v, other->s.origin); + next = G_PickTarget(next->target); + } + + other->goalentity = other->movetarget = next; + + if (self->wait) + { +// other->monsterinfo.pausetime = level.time + self->wait; +// other->monsterinfo.stand (other); + return; + } + + if (!other->movetarget) + { +// other->monsterinfo.pausetime = level.time + 100000000; +// other->monsterinfo.stand (other); + } + else + { + VectorSubtract (other->goalentity->s.origin, other->s.origin, v); + } + +} + +void pathtest_think(edict_t *who) +{ + if (ai_pathtest->value) + { +// FX_MakeSparks(who->s.origin, vec3_up, 2); + } + who->nextthink=level.time+0.5; +} + +void SP_path_corner (edict_t *self) +{ +// trace_t tr; +// vec3_t dest; + + if (!self->targetname) + { + gi.dprintf ("path_corner with no targetname at %s\n", vtos(self->s.origin)); + G_FreeEdict (self); + return; + } + + SetWaitAction(self, 1, st.waitAction1); + SetWaitAction(self, 2, st.waitAction2); + SetWaitAction(self, 3, st.waitAction3); + SetWaitAction(self, 4, st.waitAction4); + SetWaitAction(self, 5, st.waitAction5); + SetWaitAction(self, 6, st.waitAction6); + + SetMoveAction(self, st.moveAction); + +/* VectorCopy(self->s.origin, dest); + dest[2]-=1000; + gi.trace (self->s.origin, NULL, NULL, dest, self, MASK_SOLID, &tr); + if (!tr.startsolid) + { + VectorCopy (tr.endpos, self->s.origin); + self->s.origin[2]+=10; + } +*/ + self->solid = SOLID_TRIGGER; + self->touch = path_corner_touch; + VectorSet (self->mins, -8, -8, -8); + VectorSet (self->maxs, 8, 8, 8); + + //oop, this bit was not welcome. i'll just do the pathfinding from a bit higher up. +// self->s.origin[2]+=8; + + self->svflags |= SVF_NOCLIENT; +// self->s.effects |= EF_TELEPORTER; +// self->s.modelindex = gi.modelindex ("sprites/s_bfg1.sp2"); + self->friction = 0; + self->gravity = 0; + self->airresistance = 0; + + self->think=pathtest_think; + self->nextthink=level.time+0.5; + + gi.linkentity (self); +} + + +/*QUAKED point_combat (0.5 0.3 0) (-8 -8 -8) (8 8 8) Hold WAITONECYCLE FACEPLAYER +Makes this the target of a monster and it will head here +when first activated before going after the activator. If +hold is selected, it will stay here. + +WAITONECYCLE: ignores wait time, goes through waitactions once +FACEPLAYER: will face the player forever, once it reaches this point +Target: next point_combat +Pathtarget: gets used when an entity that has + this path_corner targeted touches it +MoveAction: animation to play while moving to the next point_combat +Waitaction1: animations to play while waiting +Waitaction2: +Waitaction3: +Waitaction4: +Waitaction5: +Waitaction6: +Wait: time to wait (-1 for forever) +*/ +void point_combat_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + edict_t *activator; + + if (other->movetarget != self) + return; + + if (self->target) + { + other->target = self->target; + other->goalentity = other->movetarget = G_PickTarget(other->target); + if (!other->goalentity) + { + gi.dprintf("%s at %s target %s does not exist\n", self->classname, vtos(self->s.origin), self->target); + other->movetarget = self; + } + self->target = NULL; + } + else if ((self->spawnflags & 1) && !(other->flags & (FL_SWIM|FL_FLY))) + { +// other->monsterinfo.pausetime = level.time + 100000000; +// other->monsterinfo.aiflags |= AI_STAND_GROUND; +// other->monsterinfo.stand (other); + } + + if (other->movetarget == self) + { + other->target = NULL; + other->movetarget = NULL; + other->goalentity = other->enemy; +// other->monsterinfo.aiflags &= ~AI_COMBAT_POINT; + } + + if (self->pathtarget) + { + char *savetarget; + + savetarget = self->target; + self->target = self->pathtarget; + if (other->enemy && other->enemy->client) + activator = other->enemy; + else if (other->oldenemy && other->oldenemy->client) + activator = other->oldenemy; + else if (other->activator && other->activator->client) + activator = other->activator; + else + activator = other; + G_UseTargets (self, activator); + self->target = savetarget; + } +} + +void SP_point_combat (edict_t *self) +{ + if (dm->isDM()) + { + G_FreeEdict (self); + return; + } + + SetWaitAction(self, 1, st.waitAction1); + SetWaitAction(self, 2, st.waitAction2); + SetWaitAction(self, 3, st.waitAction3); + SetWaitAction(self, 4, st.waitAction4); + SetWaitAction(self, 5, st.waitAction5); + SetWaitAction(self, 6, st.waitAction6); + + SetMoveAction(self, st.moveAction); + + self->solid = SOLID_TRIGGER; + self->touch = point_combat_touch; + VectorSet (self->mins, -8, -8, -16); + VectorSet (self->maxs, 8, 8, 16); + self->svflags = SVF_NOCLIENT; + gi.linkentity (self); +}; + + +/*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4) +Used as a positional target for spotlights, etc. +*/ +void SP_info_null (edict_t *self) +{ + G_FreeEdict (self); +}; + + +/*QUAKED info_notnull (0 0.5 0) (-4 -4 -4) (4 4 4) +Used as a positional target for lightning. +*/ +void SP_info_notnull (edict_t *self) +{ + VectorCopy (self->s.origin, self->absmin); + VectorCopy (self->s.origin, self->absmax); +}; + + +/*QUAKED light (0 1 0) (-8 -8 -8) (8 8 8) START_OFF +Non-displayed light. +Default light value is 300. +Style - the light +0 - Normal, unflickering +1 - Flickering 1 +2 - Slow strong Pulse +3 - Candle 1 +4 - Fast Stribe +5 - Gentle Pulse 1 +6 - Flicker 2 +7 - Candle 2 +8 - Candle 3 +9 - Slow Strobe +10 - Flourscent Flicker +11 - Slow Pulse not Fade to Black +12 - Fast Pulse +13 - Special sky lightning + +If targeted, will toggle between on and off. +Default _cone value is 10 (used to set size of light for spotlights) +*/ + +void light_use (edict_t *self, edict_t *other, edict_t *activator) +{ + if (self->spawnflags & SF_LIGHT_START_OFF) + { + gi.configstring (CS_LIGHTS+self->style, "m"); + self->spawnflags &= ~SF_LIGHT_START_OFF; + } + else + { + gi.configstring (CS_LIGHTS+self->style, "a"); + self->spawnflags |= SF_LIGHT_START_OFF; + } +} + +void LightInit (edict_t *self) +{ + if (self->style >= 32) + { + self->use = light_use; + if (self->spawnflags & SF_LIGHT_START_OFF) + gi.configstring (CS_LIGHTS+self->style, "a"); + else + gi.configstring (CS_LIGHTS+self->style, "m"); + } +} + + +void SP_light (edict_t *self) +{ + if (!self->targetname || dm->isDM()) + { + G_FreeEdict (self); + return; + } + + if (self->style >= 32) + { + self->use = light_use; + if (self->spawnflags & SF_LIGHT_START_OFF) + gi.configstring (CS_LIGHTS+self->style, "a"); + else + gi.configstring (CS_LIGHTS+self->style, "m"); + } +} + + +/*QUAKED func_wall (0 .5 .8) ? TRIGGER_SPAWN TOGGLE START_ON ANIMATED ANIMATED_FAST +This is just a solid wall if not inhibited + +TRIGGER_SPAWN the wall will not be present until triggered + it will then blink in to existance; it will + kill anything that was in it's way + +TOGGLE only valid for TRIGGER_SPAWN walls + this allows the wall to be turned on and off + +START_ON only valid for TRIGGER_SPAWN walls + the wall will initially be present +*/ + +void func_wall_use (edict_t *self, edict_t *other, edict_t *activator) +{ + if (self->solid == SOLID_NOT) + { + self->solid = SOLID_BSP; + self->svflags &= ~SVF_NOCLIENT; + KillBox (self); + } + else + { + self->solid = SOLID_NOT; + self->svflags |= SVF_NOCLIENT; + } + gi.linkentity (self); + + if (!(self->spawnflags & 2)) + self->use = NULL; +} + +void SP_func_wall (edict_t *self) +{ + self->movetype = MOVETYPE_PUSH; + gi.setmodel (self, self->model); + + if (self->spawnflags & 8) + self->s.effects |= EF_ANIM_ALL; + if (self->spawnflags & 16) + self->s.effects |= EF_ANIM_ALLFAST; + + // just a wall + if ((self->spawnflags & 7) == 0) + { + self->solid = SOLID_BSP; + gi.linkentity (self); + return; + } + + // it must be TRIGGER_SPAWN + if (!(self->spawnflags & 1)) + { +// gi.dprintf("func_wall missing TRIGGER_SPAWN\n"); + self->spawnflags |= 1; + } + + // yell if the spawnflags are odd + if (self->spawnflags & 4) + { + if (!(self->spawnflags & 2)) + { +// gi.dprintf("func_wall START_ON without TOGGLE\n"); + self->spawnflags |= 2; + } + } + + self->use = func_wall_use; + if (self->spawnflags & 4) + { + self->solid = SOLID_BSP; + } + else + { + self->solid = SOLID_NOT; + self->svflags |= SVF_NOCLIENT; + } + gi.linkentity (self); +} + + +/*QUAKED func_object (0 .5 .8) ? TRIGGER_SPAWN ANIMATED ANIMATED_FAST +This is solid bmodel that will fall if it's support it removed. +*/ + +void func_object_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + // only squash thing we fall on top of + if (!plane) + return; + if (plane->normal[2] < 1.0) + return; + if (other->takedamage == DAMAGE_NO) + return; + T_Damage (other, self, self, vec3_origin, self->s.origin, self->s.origin, self->dmg, 1, 0, MOD_CRUSH); +} + +void func_object_release (edict_t *self) +{ + self->movetype = MOVETYPE_TOSS; + self->touch = func_object_touch; +} + +void func_object_use (edict_t *self, edict_t *other, edict_t *activator) +{ + self->solid = SOLID_BSP; + self->svflags &= ~SVF_NOCLIENT; + self->use = NULL; + KillBox (self); + func_object_release (self); +} + +void SP_func_object (edict_t *self) +{ + gi.setmodel (self, self->model); + + self->mins[0] += 1; + self->mins[1] += 1; + self->mins[2] += 1; + self->maxs[0] -= 1; + self->maxs[1] -= 1; + self->maxs[2] -= 1; + + if (!self->dmg) + self->dmg = 100; + + if (self->spawnflags == 0) + { + self->solid = SOLID_BSP; + self->movetype = MOVETYPE_PUSH; + self->think = func_object_release; + self->nextthink = level.time + 2 * FRAMETIME; + } + else + { + self->solid = SOLID_NOT; + self->movetype = MOVETYPE_PUSH; + self->use = func_object_use; + self->svflags |= SVF_NOCLIENT; + } + + if (self->spawnflags & 2) + self->s.effects |= EF_ANIM_ALL; + if (self->spawnflags & 4) + self->s.effects |= EF_ANIM_ALLFAST; + + self->clipmask = MASK_MONSTERSOLID; + + gi.linkentity (self); +} + +//===================================================== + +/*QUAKED target_character (0 0 1) ? +used with target_string (must be on same "team") +"count" is position in the string (starts at 1) +*/ + +void SP_target_character (edict_t *self) +{ + self->movetype = MOVETYPE_PUSH; + gi.setmodel (self, self->model); + self->solid = SOLID_BSP; + self->s.frame = 12; + gi.linkentity (self); + return; +} + + +/*QUAKED target_string (0 0 1) (-8 -8 -8) (8 8 8) +*/ + +void target_string_use (edict_t *self, edict_t *other, edict_t *activator) +{ + edict_t *e; + int n, l; + char c; + + l = strlen(self->message); + for (e = self->teammaster; e; e = e->teamchain) + { + if (!e->count) + continue; + n = e->count - 1; + if (n > l) + { + e->s.frame = 12; + continue; + } + + c = self->message[n]; + if (c >= '0' && c <= '9') + e->s.frame = c - '0'; + else if (c == '-') + e->s.frame = 10; + else if (c == ':') + e->s.frame = 11; + else + e->s.frame = 12; + } +} + +void SP_target_string (edict_t *self) +{ + if (!self->message) + self->message = ""; + self->use = target_string_use; +} + + +/*QUAKED func_clock (0 0 1) (-8 -8 -8) (8 8 8) TIMER_UP TIMER_DOWN START_OFF MULTI_USE +target a target_string with this + +The default is to be a time of day clock + +TIMER_UP and TIMER_DOWN run for "count" seconds and the fire "pathtarget" +If START_OFF, this entity must be used before it starts + +"style" 0 "xx" + 1 "xx:xx" + 2 "xx:xx:xx" +*/ + +#define CLOCK_MESSAGE_SIZE 16 + +// don't let field width of any clock messages change, or it +// could cause an overwrite after a game load + +static void func_clock_reset (edict_t *self) +{ + self->activator = NULL; + if (self->spawnflags & 1) + { + self->health = 0; + self->wait = self->count; + } + else if (self->spawnflags & 2) + { + self->health = self->count; + self->wait = 0; + } +} + +static void func_clock_format_countdown (edict_t *self) +{ + if (self->style == 0) + { + Com_sprintf (self->message, CLOCK_MESSAGE_SIZE, "%2i", self->health); + return; + } + + if (self->style == 1) + { + Com_sprintf(self->message, CLOCK_MESSAGE_SIZE, "%2i:%02i", self->health / 60, self->health % 60); + return; + } + + if (self->style == 2) + { + Com_sprintf(self->message, CLOCK_MESSAGE_SIZE, "%2i:%02i:%02i", self->health / 3600, (self->health - (self->health / 3600) * 3600) / 60, self->health % 60); + return; + } +} + +void func_clock_think (edict_t *self) +{ + if (!self->enemy) + { + self->enemy = G_Find (NULL, FOFS(targetname), self->target); + if (!self->enemy) + return; + } + + if (self->spawnflags & 1) + { + func_clock_format_countdown (self); + self->health++; + } + else if (self->spawnflags & 2) + { + func_clock_format_countdown (self); + self->health--; + } + else + { + struct tm *ltime; + time_t gmtime; + + time(&gmtime); + ltime = localtime(&gmtime); + Com_sprintf (self->message, CLOCK_MESSAGE_SIZE, "%2i:%02i:%02i", ltime->tm_hour, ltime->tm_min, ltime->tm_sec); + } + + self->enemy->message = self->message; + self->enemy->use (self->enemy, self, self); + + if (((self->spawnflags & 1) && (self->health > self->wait)) || + ((self->spawnflags & 2) && (self->health < self->wait))) + { + if (self->pathtarget) + { + char *savetarget; + char *savemessage; + + savetarget = self->target; + savemessage = self->message; + self->target = self->pathtarget; + self->message = NULL; + G_UseTargets (self, self->activator); + self->target = savetarget; + self->message = savemessage; + } + + if (!(self->spawnflags & 8)) + return; + + func_clock_reset (self); + + if (self->spawnflags & 4) + return; + } + + self->nextthink = level.time + 1; +} + +void func_clock_use (edict_t *self, edict_t *other, edict_t *activator) +{ + if (!(self->spawnflags & 8)) + self->use = NULL; + if (self->activator) + return; + self->activator = activator; + self->think (self); +} + +void SP_func_clock (edict_t *self) +{ + if (!self->target) + { + gi.dprintf("%s with no target at %s\n", self->classname, vtos(self->s.origin)); + G_FreeEdict (self); + return; + } + + if ((self->spawnflags & 2) && (!self->count)) + { + gi.dprintf("%s with no count at %s\n", self->classname, vtos(self->s.origin)); + G_FreeEdict (self); + return; + } + + if ((self->spawnflags & 1) && (!self->count)) + self->count = 60*60;; + + func_clock_reset (self); + + self->message = (char*)gi.TagMalloc (CLOCK_MESSAGE_SIZE, TAG_LEVEL); + + self->think = func_clock_think; + + if (self->spawnflags & 4) + self->use = func_clock_use; + else + self->nextthink = level.time + 1; +} + + +//================================================================================= + +void FinishRespawn(edict_t *ent) +{ + edict_t *newEnt; + + // fixme: check to see that the respawn location is unoccupied, esp. for deathmatch! +/* if (my space is occupied) + { + + nextthink = level.time +.1; + return; + } +*/ + newEnt = G_Spawn(); + VectorCopy(ent->s.origin, newEnt->s.origin); + VectorCopy(ent->s.angles, newEnt->s.angles); + newEnt->health = ent->health; + newEnt->spawnflags = ent->spawnflags; + newEnt->wait = ent->wait; + newEnt->accel = ent->accel; + newEnt->style = ent->style; + newEnt->targetname = ent->targetname; + newEnt->target = ent->target; + ent->respawnFunc(newEnt); + + G_FreeEdict(ent); +} + +void InitiateRespawn(edict_t *ent) +{ + edict_t *newEnt; + + newEnt = G_Spawn(); + VectorCopy(ent->spawnOrigin, newEnt->s.origin); + VectorCopy(ent->spawnAngles, newEnt->s.angles); + newEnt->respawnFunc = ent->respawnFunc; + newEnt->health = ent->spawnHealth; + newEnt->movetype = MOVETYPE_NONE; + newEnt->solid = SOLID_NOT; + newEnt->spawnflags = ent->spawnflags; + newEnt->wait = ent->wait; + newEnt->accel = ent->accel; + newEnt->style = ent->style; + newEnt->targetname = ent->targetname; + newEnt->target = ent->target; + newEnt->think = FinishRespawn; + + newEnt->nextthink = level.time + ent->respawnTime; +} + +void SetForRespawn(edict_t *ent, void (*spawnFunc)(edict_t *), float respawnDuration) +{ + VectorCopy(ent->s.origin, ent->spawnOrigin); + VectorCopy(ent->s.angles, ent->spawnAngles); + ent->spawnHealth = ent->health; + ent->respawnFunc = spawnFunc; + ent->respawnTime = respawnDuration; +} + + +/*QUAKED test_model (1 .5 0) (-16 -16 -16) (16 16 16) +set model to the name of the model to show +*/ +void SP_test_model (edict_t *ent) +{ + ent->movetype = MOVETYPE_NONE; + ent->solid = SOLID_BBOX; + ent->s.modelindex = gi.modelindex (ent->model); + VectorSet (ent->mins, -16, -16, -16); + VectorSet (ent->maxs, 16, 16, 16); + gi.linkentity (ent); +} + + +/*QUAKED func_breakable_brush (0 .5 .8) ? INVINCIBLE PAINCHUNKS DEKKER CANT_DMG_IN_CAMERA_MODE +A breakable brush which has chunk size and type based upon the size and type of the brush. +--------SPAWNFLAGS---------- +INVINCIBLE - intended to be used in conjunction with triggers +PAINCHUNKS - spawn debris when hurt (used for windows that shatter when first shot) +DEKKER - only damageable by Dekker, will do damage to folks in the area when breaking +CANT_DMG_IN_CAMERA_MODE -- you can damage this brush normally but it's invincible when player is viewing thru a camera +-------KEYS----------------- +count - # of debris chunks to throw + +mass - size of chunks to throw +1 - small chunks +2 - medium chunks +3 - big chunks + +health - defaults to 100. The "dmg" key/value pair will set how much damage will be done on +its destruction (defaults to 0). The "volume" key/value pair will determine the radius of the +damage. Damage falls off linearly to zero at this radius. Volume will default to whatever +"dmg" is set to. + +message - text to print when it dies + +material - defines the type of debris to create when the brush breaks + 0 - MAT_NONE, (defaults to stone) + 1 - MAT_BRICK_BROWN, + 2 - MAT_BRICK_DBROWN, + 3 - MAT_BRICK_LBROWN, + 4 - MAT_BRICK_LGREY, + 5 - MAT_BRICK_DGREY, + 6 - MAT_BRICK_RED, + + 7 - MAT_GLASS, + + 8 - MAT_METAL_LGREY, + 9 - MAT_METAL_DGREY, +10 - MAT_METAL_RUSTY, +11 - MAT_METAL_SHINY, + +12 - MAT_ROCK_BROWN, +13 - MAT_ROCK_LBROWN, +14 - MAT_ROCK_DBROWN, +15 - MAT_ROCK_LGREY, +16 - MAT_ROCK_DGREY, + +17 - MAT_WOOD_LBROWN, +18 - MAT_WOOD_DBROWN, +19 - MAT_WOOD_LGREY, +20 - MAT_WOOD_DGREY, + +21 - MAT_WALL_BLACK, +22 - MAT_WALL_BROWN, +23 - MAT_WALL_DARKBROWN, +24 - MAT_WALL_LIGHTBROWN, +25 - MAT_WALL_GREY, +26 - MAT_WALL_DARKGREY, +27 - MAT_WALL_LIGHTGREY, +28 - MAT_WALL_GREEN, +29 - MAT_WALL_ORANGE, +30 - MAT_WALL_RED, +31 - MAT_WALL_WHITE, +32 - MAT_ROCK_FLESH, +33 - MAT_WALL_STRAW, +34 - MAT_ROCK_SNOW, + + +surfaceType - defines what sound to use when the brush breaks or takes damage +0 - defaults to stone... sorry Jersey :{ +14 - wood +17 - stone +28 - metal +35 - blood (how does blood break? I don't know.) +37 - glass +40 - paper + +*/ + +void breakable_brush_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + float volume; + vec3_t origin; + byte x_max,y_max,z_max; + int scale,numchunks; + vec3_t debrisNorm; + + VectorClear(debrisNorm); + volume = self->size[0] * self->size[1] * self->size[2]; + + // Calc numchunks??? + numchunks = (byte)((volume / 9000) + 2); + + if (numchunks > 20) + numchunks = 20; + else if (numchunks < 10) + numchunks = 10; + + // sending a scale of 0 will not give you the debris you want + scale = DEBRIS_SM; + + // Calc scale on breakable brushes + if (strcmp(self->classname, "func_breakable_brush") == 0) + { + // Find scale of debris to throw + if (volume > 250000) + scale = DEBRIS_LRG; + else if (volume > 40000) + scale = DEBRIS_MED; + else + scale = DEBRIS_SM; + } + + VectorAdd(self->absmax,self->absmin, origin); + VectorScale(origin, .5, origin); + + if (self->material > 0) + { + if (strcmp(self->classname, "func_breakable_brush") == 0) + { + x_max = self->size[0]; + y_max = self->size[1]; + z_max = self->size[2]*0.5; + + } + else + { + x_max = (byte) self->maxs[0]; + y_max = (byte) self->maxs[1]; + z_max = (byte) self->maxs[2]; + } + + VectorSubtract (other->s.origin, origin, debrisNorm); + VectorNormalize(debrisNorm); + FX_ThrowDebris(origin,debrisNorm, numchunks, scale, self->material,x_max,y_max,z_max, self->surfaceType); + } +} + +extern void breakable_brush_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + vec3_t origin; + float volume; + + volume = self->size[0] * self->size[1] * self->size[2]; + + VectorAdd(self->absmax,self->absmin, origin); + VectorScale(origin, .5, origin); + + // kef -- possibly spawn some pickups from a broken crate? + thePickupList.BustCrate(self); + + if (self->dmg) + { + if (!self->volume) + { + self->volume = self->dmg; + } + T_RadiusDamage (self, self, self->dmg, self, self->volume, MOD_EXPLOSIVE); + gmonster.RadiusDeafen(self, self->dmg, self->dmg); + } + + BecomeDebris(self,inflictor,attacker,damage,point); +} + +void breakable_brush_use(edict_t *self, edict_t *other, edict_t *activator) +{ + breakable_brush_die (self, self, other, self->health, vec3_origin); +} + +void SP_func_breakable_brush (edict_t *ent) +{ + ent->solid = SOLID_BSP; + ent->movetype = MOVETYPE_NONE; + + if (ent->spawnflags & INVINCIBLE) + { + ent->takedamage = DAMAGE_NO; + } + else if (ent->spawnflags & BREAKABLE_NOT_IN_CAM) + { + ent->takedamage = DAMAGE_YES_BUT_NOT_IN_CAMERA; // 3/1/00 kef -- used to be DAMAGE_YES + } + else + { + ent->takedamage = DAMAGE_YES; + } + + if ((st.surfaceType > 0) && (st.surfaceType < SURF_NUM)) + { + ent->surfaceType = st.surfaceType; + } + else + { + ent->surfaceType = SURF_DEFAULT; // kef -- ARGH!!! + } + + if (!ent->health) + { + if ((ent->material == MAT_GLASS) || (ent->surfaceType == SURF_GLASS)) + ent->health = 50; // So windows break after one shot. + else + ent->health = 100; + } + + if (ent->targetname) + { + ent->use = breakable_brush_use; + } + + ent->die = breakable_brush_die; + + if ((st.material < MATERIAL_NUM) && (st.material >= 0)) + ent->material = st.material; + else + ent->material = SURF_NONE; + + if (ent->spawnflags & GLASS_PAINCHUNKS) + { + ent->pain = breakable_brush_pain; + } + + gi.setmodel (ent, ent->model); + gi.linkentity (ent); +} + +/*QUAKED func_trigger_brush (0 .5 .8) ? NO_DRAW START_OFF +A brush that can take damage to a point, then call its triggers. + +Health defaults to 100. + +*/ + +#define TRIGGER_BRUSH_NO_DRAW 1 +#define TRIGGER_BRUSH_START_OFF 2 + +extern void trigger_brush_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + G_UseTargets(self,self); + G_FreeEdict(self); +} + +void trigger_brush_use(edict_t *self, edict_t *other, edict_t *activator) +{ + // 1/7/00 kef -- this is what it used to do. + //trigger_brush_die (self, self, other, self->health, vec3_origin); + + if (self->takedamage == DAMAGE_NO) + { + self->takedamage = DAMAGE_YES; + } + else + { + self->takedamage = DAMAGE_NO; + } +} + +void SP_func_trigger_brush (edict_t *ent) +{ + ent->solid = SOLID_BSP; + ent->movetype = MOVETYPE_NONE; + + if (!ent->health) + { + ent->health = 100; + } + + ent->takedamage = DAMAGE_YES; + if (ent->spawnflags & TRIGGER_BRUSH_START_OFF) + { + ent->takedamage = DAMAGE_NO; + } + + if (ent->spawnflags & TRIGGER_BRUSH_NO_DRAW) + { + ent->svflags = SVF_NOCLIENT; + } + + if (ent->targetname) + { + ent->use = trigger_brush_use; + } + + ent->die = trigger_brush_die; + + gi.setmodel (ent, ent->model); + gi.linkentity (ent); +} + +void func_score_use(edict_t *self, edict_t *other, edict_t *activator) +{ + char *teamname; + + if (activator->client) + { + if (self->team) // Team specific score + { + teamname=Info_ValueForKey(activator->client->pers.userinfo,"teamname"); + if (teamname) + { + if (!strcmp(self->team,teamname)) + { + activator->client->resp.score += self->count; + } + } + } + else + { + activator->client->resp.score += self->count; + } + } +} + +/*QUAKED func_score (1 0 0) (-8 -8 -8) (8 8 8) +Awards certain amount of score to a player +-----KEYS----- +count - amount awarded to player +*/ +void SP_func_score (edict_t *ent) +{ + ent->solid = SOLID_NOT; + ent->takedamage = DAMAGE_NO; + ent->use = func_score_use; + gi.linkentity (ent); +} + + + +//ShakeCameras (ent->s.origin, ent->health, ent->health*2); + +/*QUAKED func_camerashake (0 .5 .8) (-8 -8 -8) (8 8 8) +Shakes the camera, centered on where the func is +"count" = intensity (from 0 to 100) - default is 30 +"health" = radius of shaking (will fall off over distance) - default is 300 +"delay" = the duration of the shaking (in seconds) - default is 3 +"style" = makes a sound as it shakes the camera - 0 is default + 1 == Dull explosion +*/ + +#define DEFAULT(a, b) ((a) ? (a):(b)) +#define FUNCSHAKE_THINK_TIME .2 + +void funcshake_think(edict_t *self) +{ + ShakeCameras(self->s.origin, self->count, self->health, DEFAULT_JITTER_DELTA); + + if(self->wait < level.time) + { + self->nextthink = 0; + } + else + { + self->nextthink = level.time + FUNCSHAKE_THINK_TIME; + } +} + +void funcshake_use (edict_t *self, edict_t *other, edict_t *activator) +{ + self->wait = level.time + self->delay; + self->nextthink = level.time;//eh? + + if(self->style == 1) + { + gi.sound (self, CHAN_VOICE, gi.soundindex ("Ambient/Gen/Battle/ExpRvb.wav"), .8, 0, 0); + } +} + +void SP_func_camerashake(edict_t *self) +{ + self->use = funcshake_use; + self->count = DEFAULT(self->count, 30); + self->health = DEFAULT(self->health, 300); + self->delay = DEFAULT(self->delay, 3); + + self->think = funcshake_think; + + if(self->style == 1) + { + gi.soundindex("Ambient/Gen/Battle/ExpRvb.wav"); + } +} + +/*QUAKED _region (0 1 1) ? + +For FOG Areas: + fog_mode (0 = normal, 1 = additive) + fog_start (0.0 to infinity) (4.0 recommended) + fog_end (fog_start to infinity) (400.0 recommended) + fog_height (fog_start to infinity) + fog_density (0.0 to 1.0) + fog_density_range (-1.0 to 1.0) + fog_color (vector RGB) + fog_flags (1 = PULSATE, 2 = HEIGHT, 4 = MAP, 8 = ANTI) + fog_time (speed) + fog_distance_cull (distance for culling fog areas) + fog_chop_size (size bsp should break up (128 default) ) +*/ + + +/*QUAKED func_fade (0 .5 .8) (-8 -8 -8) (8 8 8) REVERSE +"color" color to fade to in red green blue format, from 0.0 to 1.0, (with 1.0 being white like "1.0 1.0 1.0") +"delay" the length of time it'll take to fully fade -- defaults to 5 NOTE: do NOT set this +to zero! If you want instantaneous, use .1 + +Reverse flag fades from the color to "normal" + +*/ + +#define FADE_REVERSE 1 + +void funcfade_think (edict_t *self) +{ + edict_t *player = NULL; + + while ((player = G_Find (player, FOFS(classname), "player")) != NULL) + { + if ( self->spawnflags & FADE_REVERSE) + { + player->client->fade_alpha -= .1/self->delay; + if (player->client->fade_alpha < 0) + { + player->client->fade_alpha = 0; + self->nextthink = 0; + } + else + { + self->nextthink = level.time+.1; + } + } + else + { + player->client->fade_alpha += .1/self->delay; + if (player->client->fade_alpha > 1) + { + player->client->fade_alpha = 1; + self->nextthink = 0; + } + else + { + self->nextthink = level.time+.1; + } + } + } +} + +void funcfade_use (edict_t *self, edict_t *other, edict_t *activator) // put this in g_save +{ + edict_t *player = NULL; + + while ((player = G_Find (player, FOFS(classname), "player")) != NULL) + { + VectorCopy(self->intend_velocity, player->client->fade_rgb); + if (self->spawnflags & FADE_REVERSE) + { + player->client->fade_alpha = 1 + .1/self->delay; + } + else + { + player->client->fade_alpha = 0;//just in case + } + } + funcfade_think(self); +} + +void SP_func_fade(edict_t *self) +{ + + VectorClear(self->intend_velocity); + VectorCopy(st.color, self->intend_velocity); + self->delay = DEFAULT(self->delay, 5); + self->use = funcfade_use; + self->think = funcfade_think; + self->nextthink = 0; +} \ No newline at end of file diff --git a/Source/Game/gamecpp/g_monster.cpp b/Source/Game/gamecpp/g_monster.cpp new file mode 100644 index 0000000..30c68d4 --- /dev/null +++ b/Source/Game/gamecpp/g_monster.cpp @@ -0,0 +1,964 @@ +#include "g_local.h" + +#include "ai_private.h" +#include "ai_pathfinding.h" + +#define STEPSIZE 18 + +monster_global gmonster; + +extern cvar_t *maxclients; + +//============================================================================ + + +/* +================= +AI_SetSightClient + +Called once each frame to set level.sight_client to the +player to be checked for in findtarget. + +If all clients are either dead or in notarget, sight_client +will be null. + +In coop games, sight_client will cycle between the clients. +================= +*/ + +void monster_global::SetSightClient (void) +{ + edict_t *ent; + int start, check; + + if (level.sight_client == NULL) + start = 1; + else + start = level.sight_client - g_edicts; + + check = start; + while (1) + { + check++; + //this only checks clients + if (check > game.maxclients) + check = 1; + ent = &g_edicts[check]; + + if (ent->inuse + //&& ent->health > 0//allow seeing dead guys + /*&& !(ent->flags & FL_NOTARGET)*/) + { + level.sight_client = ent; + break; // got one + } + if (check == start) + { + level.sight_client = NULL; + break; // nobody to see + } + } + + if (level.sight_monster == NULL) + start = game.maxclients; + else + start = level.sight_monster - g_edicts; + + check = start; + + while (1) + { + check++; + + //this checks all non-client ents + if (check >= globals.num_edicts) + check = game.maxclients; + ent = &g_edicts[check]; + + //allow only monsters--make sure current ent is monster + if ((ent->inuse + && ent->health > 0 + && !(ent->flags & FL_NOTARGET)) + && (ent->ai) + && (ent->ai->IsActive())) + { + level.sight_monster = ent; + break; // got one + } + if (check == start) + { + level.sight_monster = NULL; + break; // nobody to see + } + } +} + +//============================================================================ +/* +.enemy +Will be world if not currently angry at anyone. + +.movetarget +The next path spot to walk toward. If .enemy, ignore .movetarget. +When an enemy is killed, the monster will try to return to it's path. + +.hunt_time +Set to time + something when the player is in sight, but movement straight for +him is blocked. This causes the monster to use wall following code for +movement direction instead of sighting on the player. + +.ideal_yaw +A yaw angle of the intended direction, which will be turned towards at up +to 45 deg / state. If the enemy is in view and hunt_time is not active, +this will be the exact line towards the enemy. + +.pausetime +A monster will leave it's stand state and head towards it's .movetarget when +time > .pausetime. + +walkmove(angle, speed) primitive is all or nothing +*/ + +/* +============= +range + +can pass in the distance to be considered, if you want (default set-up will compute it for you). + +returns the range catagorization of an entity reletive to self +0 melee range, will become hostile even if back is turned +1 visibility and infront, or visibility and show hostile +2 infront and show hostile +3 only triggered by damage +============= +*/ + +int monster_global::Range (edict_t *self, edict_t *other, float dist_sq) +{ + vec3_t v; + float len; + + if (dist_sq>0) + { + len = dist_sq; + } + else + { + VectorSubtract (self->s.origin, other->s.origin, v); + len = VectorLengthSquared (v); + } + + if (len < MELEE_DISTANCE*MELEE_DISTANCE) + return RANGE_MELEE; + if (len < 250000)//500 + return RANGE_NEAR; + if (len < 2250000)//1500 + return RANGE_MID; + return RANGE_FAR; +} + +/* +============= +visible + +returns 1 if the entity is visible to self, even if not infront () +============= +*/ +qboolean monster_global::Visible (edict_t *self, edict_t *other) +{ + vec3_t spot1; + vec3_t spot2; + trace_t trace; + + VectorCopy (self->s.origin, spot1); + spot1[2] += self->viewheight; + VectorCopy (other->s.origin, spot2); + spot2[2] += other->viewheight; + + if (!gi.inPVS(spot1,spot2)) + { + return false; + } + + gi.trace (spot1, vec3_origin, vec3_origin, spot2, self, MASK_OPAQUE, &trace); + + if (trace.fraction == 1.0) + return true; + return false; +} + + +/* +============= +infront + +returns 1 if the entity is in front (in sight) of self +============= +*/ +qboolean monster_global::Infront (edict_t *self, edict_t *other) +{ + vec3_t vec; + float dot; + vec3_t forward; + float threshold=0.75; + float otherSpeedSq; + + if (self->ai) + { + self->ai->GetLookVector(forward); + attention_index curAtLevel = self->ai->GetAttention(*self); + + switch(curAtLevel) + { + case ATTENTION_DISTRACTED: + threshold = .85; + break; + case ATTENTION_IDLE: + threshold = .75; + break; + case ATTENTION_ALERT: + threshold = -.2; //this will actually give guys a greater than 180 field of view - but for motion, this is fine + break; + } + } + else + { + AngleVectors (self->s.angles, forward, NULL, NULL); + } + VectorSubtract (other->s.origin, self->s.origin, vec); + VectorNormalize (vec); + dot = DotProduct (vec, forward); + + if (other->ai) + { + otherSpeedSq = VectorLengthSquared(other->ai->velocity); + } + if (other->client) + { + otherSpeedSq = VectorLengthSquared(other->velocity); + } + + //if my senses are muted, pretend the guy's moving slower than he really is--brings thresholds in further + if (self->spawnflags & SPAWNFLAG_SENSE_MUTE) + { + otherSpeedSq*=0.01; +// otherSpeedSq=0; + threshold+=0.225; + } + + if (otherSpeedSq>10000)//walking + { +// gi.dprintf("player vel: %4.3f\n",sqrt(otherSpeedSq)); + threshold-=0.25; + if (otherSpeedSq>40000)//running + { + threshold-=0.25; + } + } + + if (dot > threshold) + return true; + return false; +} + + +/* +============= +CheckBottom + +Returns false if any part of the bottom of the entity is off an edge that +is not a staircase. + +============= +*/ + +qboolean monster_global::CheckBottom (edict_t *ent) +{ + vec3_t mins, maxs, start, stop; + trace_t trace; + int x, y; + float mid, bottom; + + VectorAdd (ent->s.origin, ent->mins, mins); + VectorAdd (ent->s.origin, ent->maxs, maxs); + +// if all of the points under the corners are solid world, don't bother +// with the tougher checks +// the corners must be within 16 of the midpoint + start[2] = mins[2] - 1; + for (x=0 ; x<=1 ; x++) + for (y=0 ; y<=1 ; y++) + { + start[0] = x ? maxs[0] : mins[0]; + start[1] = y ? maxs[1] : mins[1]; + if (gi.pointcontents (start) != CONTENTS_SOLID) + goto realcheck; + } + + return true; // we got out easy + +realcheck: +// +// check it for real... +// + start[2] = mins[2]; + +// the midpoint must be within 16 of the bottom + start[0] = stop[0] = (mins[0] + maxs[0])*0.5; + start[1] = stop[1] = (mins[1] + maxs[1])*0.5; + stop[2] = start[2] - 2*STEPSIZE; + gi.trace (start, vec3_origin, vec3_origin, stop, ent, MASK_MONSTERSOLID, &trace); + + if (trace.fraction == 1.0) + return false; + mid = bottom = trace.endpos[2]; + +// the corners must be within 16 of the midpoint + for (x=0 ; x<=1 ; x++) + for (y=0 ; y<=1 ; y++) + { + start[0] = stop[0] = x ? maxs[0] : mins[0]; + start[1] = stop[1] = y ? maxs[1] : mins[1]; + + gi.trace (start, vec3_origin, vec3_origin, stop, ent, MASK_MONSTERSOLID, &trace); + + if (trace.fraction != 1.0 && trace.endpos[2] > bottom) + bottom = trace.endpos[2]; + if (trace.fraction == 1.0 || mid - trace.endpos[2] > STEPSIZE) + return false; + } + + return true; +} + + + +qboolean monster_global::CheckBottom (ai_c &which_ai, edict_t *ent, vec3_t pos, int motion_allowed) +{ + vec3_t mins, maxs, start, stop; + trace_t trace; + int x, y; + float mid, bottom; + float checkheight; + + //does the motion mask passed in allow falling or stepping or neither? + if (motion_allowed & fall_movemask) + { +// return true; +// checkheight = which_ai.GetFallHeight(); + checkheight = which_ai.GetStepHeight(); + } + //check stepheight under position + else if (motion_allowed & step_movemask) + { + checkheight = which_ai.GetStepHeight(); + } + //just check tiny distance under position + else + { + checkheight = 2; + } + + VectorAdd (pos, ent->mins, mins); + VectorAdd (pos, ent->maxs, maxs); + +// if all of the points under the corners are solid world, don't bother +// with the tougher checks +// the corners must be within 16 of the midpoint + start[2] = mins[2] - 1; + for (x=0 ; x<=1 ; x++) + for (y=0 ; y<=1 ; y++) + { + start[0] = x ? maxs[0] : mins[0]; + start[1] = y ? maxs[1] : mins[1]; + if (gi.pointcontents (start) != CONTENTS_SOLID) + { + goto realcheck; + } + } + + return true; // we got out easy + +realcheck: +// +// check it for real... +// + start[2] = mins[2]; + +// the midpoint must be within 16 of the bottom + start[0] = stop[0] = (mins[0] + maxs[0])*0.5; + start[1] = stop[1] = (mins[1] + maxs[1])*0.5; + stop[2] = start[2] - 2*checkheight; + gi.trace (start, vec3_origin, vec3_origin, stop, ent, MASK_MONSTERSOLID, &trace); + + //midpoint trace didn't hit anything solid + if (trace.fraction == 1.0) + { + return false; + } + mid = bottom = trace.endpos[2]; + +// the corners must be within 16 of the midpoint + for (x=0 ; x<=1 ; x++) + for (y=0 ; y<=1 ; y++) + { + start[0] = stop[0] = x ? maxs[0] : mins[0]; + start[1] = stop[1] = y ? maxs[1] : mins[1]; + + gi.trace (start, vec3_origin, vec3_origin, stop, ent, MASK_MONSTERSOLID, &trace); + + //update lowest point in groundcheck + if (trace.fraction != 1.0 && trace.endpos[2] > bottom) + { + bottom = trace.endpos[2]; + } + //if any of the corners trace down farther than i'm allowed to fall, this position not valid + if (trace.fraction == 1.0 || mid - trace.endpos[2] > checkheight) + { + return false; + } + } + + return true; +} + + +void monster_global::CheckGround (edict_t *ent) +{ + vec3_t point; + trace_t trace; + edict_t *oldground = ent->groundentity; + + if (ent->flags & (FL_SWIM|FL_FLY)) + return; + + if (ent->velocity[2] > ESCAPE_VELOCITY) // moving up, so it's not on the ground! + { + ent->groundentity = NULL; + return; + } + +// if the hull point one-quarter unit down is solid the entity is on ground + point[0] = ent->s.origin[0]; + point[1] = ent->s.origin[1]; + point[2] = ent->s.origin[2] - 0.25; + if (ent->groundentity) + { + if (ent->groundentity->solid == SOLID_GHOUL) + { + point[2] = ent->s.origin[2] - 2.5; + } + } + + gi.trace (ent->s.origin, ent->mins, ent->maxs, point, ent, MASK_MONSTERSOLID, &trace); + + // check steepness + if ( (trace.plane.normal[2] < FLOOR_STEEPNESS) && !trace.startsolid) + { + ent->groundentity = NULL; // slide down this... + return; + } + +// ent->groundentity = trace.ent; +// ent->groundentity_linkcount = trace.ent->linkcount; +// if (!trace.startsolid && !trace.allsolid) +// VectorCopy (trace.endpos, ent->s.origin); + if (!trace.startsolid && !trace.allsolid) + { + VectorCopy (trace.endpos, ent->s.origin); + ent->groundentity = trace.ent; + ent->groundentity_linkcount = trace.ent->linkcount; + + //landed--stop falling + if (ent->groundentity) + { + if ((ent->groundentity != oldground) && ent->groundentity->touch) + { + ent->groundentity->touch(ent->groundentity, ent, NULL, NULL); + } + ent->velocity[2] = 0; + } + } +} + + +void monster_global::CatagorizePosition (edict_t *ent) +{ + vec3_t point; + int cont; + +// +// get waterlevel +// + point[0] = ent->s.origin[0]; + point[1] = ent->s.origin[1]; + point[2] = ent->s.origin[2] + ent->mins[2] + 1; + cont = gi.pointcontents (point); + + if (!(cont & MASK_WATER)) + { + ent->waterlevel = 0; + ent->watertype = 0; + return; + } + + ent->watertype = cont; + ent->waterlevel = 1; + point[2] += 26; + cont = gi.pointcontents (point); + if (!(cont & MASK_WATER)) + return; + + ent->waterlevel = 2; + point[2] += 22; + cont = gi.pointcontents (point); + if (cont & MASK_WATER) + ent->waterlevel = 3; +} + + +void monster_global::WorldEffects (edict_t *ent) +{ + int dmg; + + if (ent->health > 0) + { + if (!(ent->flags & FL_SWIM)) + { + if (ent->waterlevel < 3) + { + ent->air_finished = level.time + 12; + } + else if (ent->air_finished < level.time) + { // drown! + if (ent->pain_debounce_time < level.time) + { + dmg = 2 + 2 * floor(level.time - ent->air_finished); + if (dmg > 15) + dmg = 15; + T_Damage (ent, world, world, vec3_origin, ent->s.origin, ent->s.origin, dmg, 0, DAMAGE_NO_ARMOR|DT_WATER, MOD_WATER); + ent->pain_debounce_time = level.time + 1; + } + } + } + else + { + if (ent->waterlevel > 0) + { + ent->air_finished = level.time + 9; + } + else if (ent->air_finished < level.time) + { // suffocate! + if (ent->pain_debounce_time < level.time) + { + dmg = 2 + 2 * floor(level.time - ent->air_finished); + if (dmg > 15) + dmg = 15; + T_Damage (ent, world, world, vec3_origin, ent->s.origin, ent->s.origin, dmg, 0, DAMAGE_NO_ARMOR|DT_WATER, MOD_WATER); + ent->pain_debounce_time = level.time + 1; + } + } + } + } + + if (ent->waterlevel == 0) + { + if (ent->flags & FL_INWATER) + { + // 9/14/99 kef -- Chia wants this out +// gi.sound (ent, CHAN_BODY, gi.soundindex("player/watr_out.wav"), .6, ATTN_NORM, 0); + ent->flags &= ~FL_INWATER; + } + return; + } + + if ((ent->watertype & CONTENTS_LAVA) && !(ent->flags & FL_IMMUNE_LAVA)) + { + if (ent->damage_debounce_time < level.time) + { + ent->damage_debounce_time = level.time + 0.2; + T_Damage (ent, world, world, vec3_origin, ent->s.origin, ent->s.origin, 10*ent->waterlevel, 0, DAMAGE_NO_ARMOR|DT_FIRE, MOD_LAVA); + } + } + if ((ent->watertype & CONTENTS_SLIME) && !(ent->flags & FL_IMMUNE_SLIME)) + { + if (ent->damage_debounce_time < level.time) + { + ent->damage_debounce_time = level.time + 1; + T_Damage (ent, world, world, vec3_origin, ent->s.origin, ent->s.origin, 4*ent->waterlevel, 0, DAMAGE_NO_ARMOR|DT_WATER, MOD_SLIME); + } + } + + if ( !(ent->flags & FL_INWATER) ) + { + if (!(ent->svflags & SVF_DEADMONSTER)) + { +/* if (ent->watertype & CONTENTS_LAVA) + if (random() <= 0.5) + gi.sound (ent, CHAN_BODY, gi.soundindex("player/lava1.wav"), .6, ATTN_NORM, 0); + else + gi.sound (ent, CHAN_BODY, gi.soundindex("player/lava2.wav"), .6, ATTN_NORM, 0); + else if (ent->watertype & CONTENTS_SLIME) + gi.sound (ent, CHAN_BODY, gi.soundindex("player/watr_in.wav"), .6, ATTN_NORM, 0); + else if (ent->watertype & CONTENTS_WATER) + gi.sound (ent, CHAN_BODY, gi.soundindex("player/watr_in.wav"), .6, ATTN_NORM, 0);*/ + } + + ent->flags |= FL_INWATER; + ent->damage_debounce_time = 0; + } +} + +void monster_global::DropToFloor (edict_t *ent) +{ + vec3_t end; + trace_t trace; + + ent->s.origin[2] += 1; + VectorCopy (ent->s.origin, end); + end[2] -= 256; + + gi.trace (ent->s.origin, ent->mins, ent->maxs, end, ent, MASK_MONSTERSOLID, &trace); + + if (trace.fraction == 1 || trace.allsolid) + return; + + VectorCopy (trace.endpos, ent->s.origin); + + gi.linkentity (ent); + CheckGround (ent); + CatagorizePosition (ent); +} + +void monster_global::MakeSound(edict_t *listener, vec3_t origin, float time, edict_t *noisemaker, ai_sensetype_e type) +{ + if (listener->ai) + { + listener->ai->RegisterSenseEvent(sound_mask, origin, time, noisemaker, type); +// listener->ai->NewSense(new sound_sense(origin, time, noisemaker, type), listener); + } +} + + +void monster_global::RadiusDeafen (edict_t *inflictor, float degree, float radius) +{ + float points; + edict_t *ent = NULL; + vec3_t v; + vec3_t inflictor_origin; + +// This computes a pseudo origin for bmodels, such as func_breakable_brush, which +// don't have an origin. + FindCorrectOrigin(inflictor, inflictor_origin); + +// look for targets within (radius) from inflictor_origin + CRadiusContent rad(inflictor_origin, radius); + + for(int i = 0; i < rad.getNumFound(); i++) + { + ent = rad.foundEdict(i); + + if(!ent->ai) + { + continue; + } + if(ent->health <= 0) + { + continue; + } + if(ent == world) + { + continue; + } + + VectorAdd (ent->mins, ent->maxs, v); + VectorMA (ent->s.origin, 0.5, v, v); + VectorSubtract (inflictor_origin, v, v); + points = degree * (1- (VectorLength(v) / radius)); + if (points > 0) + { + if (points > 100) + { + points = 100; + } + ent->ai->MuteSenses(sound_mask, points, smute_recov_linear, points); + } + } +} + +typedef struct eSort_s +{ + float dist; + int index; +}eSort_t; + +int eCmp(void const *a, void const *b) +{ + eSort_t *esA, *esB; + + esA = (eSort_t *)a; + esB = (eSort_t *)b; + + //ahem. sort from LEAST to GREATEST. --ss + return (esA->dist < esB->dist) ? -1:1; +} + +//fixme - base this off of skill level somehow? +#define ENEMIES_NUM_HIGH 7 +#define ENEMIES_NUM_MEDIUM 13 +#define PRIORITY_UPDATE_TIME .5 + +void monster_global::UpdateEnemyPriority(void) +{ + eSort_t elist[512];//fixme - um, huh? Is that really bad? We BETTER not exceed this... + int count = 0; + edict_t *ent = &g_edicts[0]; + float *source; + + if(!level.sight_client)return; + + numNearbyEnemies = 0; + numSeenEnemies = 0; + + aiPoints.setupClientPathInfo(&clientNode, &clientRegion); + + for (int i = 0 ; iinuse)continue; + if (!ent->ai)continue; + if (ent->health < 1)continue;//these guys don't count + if(ent->spawnflags&SPAWNFLAG_TRIGGER_SPAWN)continue; + + vec3_t dif; + VectorSubtract(ent->s.origin, level.sight_client->s.origin, dif); + float val = (dif[0] * dif[0]) + (dif[1] * dif[1]) + (dif[2]*dif[2]*16);//sort of an oval, really + + if(ent->ai->IsActive() || (val < (1024*1024))) + //if(val < (1024*1024)) + { + nearbyEnemies[numNearbyEnemies] = i; + numNearbyEnemies++; + } + if (!ent->ai->IsActive())continue; + + if(gi.inPVS(level.sight_client->s.origin,ent->s.origin)) + { + numSeenEnemies++; + } + + // all enemies should always have their positional stuff handled + ent->ai->UpdatePathPosition(ent); + } + + //something has gone very wrong with priorities--update now + if (lastPriorityUpdate > level.time + 0.1) + { + lastPriorityUpdate = level.time - PRIORITY_UPDATE_TIME - 0.1; + } + + // only do this every 5 frames (is this too infrequent?) + if(lastPriorityUpdate > level.time - PRIORITY_UPDATE_TIME) + { + return; + } + + //this is not very good criteria - can we change this around and make it good and tasty? + + source = level.sight_client->s.origin; + + ent = &g_edicts[0]; + + float closestDist = 999999; + int closestGuy = -1; + + int highAdded = 0; + for (i = 0 ; iinuse || + !ent->ai || + ent->health < 1 || + !ent->ai->IsActive()) + { + continue; + } + + float curDist = (source[0] - ent->s.origin[0])*(source[0] - ent->s.origin[0]) + + (source[1] - ent->s.origin[1])*(source[1] - ent->s.origin[1]) + + ((source[2] - ent->s.origin[2])*(source[2] - ent->s.origin[2])*9);//vertical differences count thrice as much + + if(i && curDist < closestDist) + { + closestGuy = i; + closestDist = curDist; + } + + if(gi.inPVS(level.sight_client->s.origin,ent->s.origin)) + { + ent->ai->SetPriority(PRIORITY_HIGH); + highAdded++; + continue; + } + + if(ai_highpriority->value) + { + ent->ai->SetPriority(PRIORITY_HIGH); + } + else + { + ent->ai->SetPriority(PRIORITY_LOW); + } + + elist[count].index = i; +// if(!elist[count].dist) + { //err... just guess then + elist[count].dist = curDist; + } + count++; + } + + //bad? I dunno + qsort((void *)elist, count, sizeof(eSort_t), eCmp); + + if(highAdded < ENEMIES_NUM_HIGH) + { + for(i = 0; i < count && i < (ENEMIES_NUM_HIGH-highAdded); i++) + { + g_edicts[elist[i].index].ai->SetPriority(PRIORITY_HIGH); + } + } + + if(closestGuy != -1) + { + closestEnemy = closestGuy; + } + else + { + closestEnemy = 0; + } + + lastPriorityUpdate = level.time; +} + + +void monster_global::FindGuysInRadius(vec3_t center, float radius, CRadiusContent *content, int squashZ) +{ + float radSq = radius*radius;//minor optimization --sfs + + // hopefully in most cases this will be a fairly small number, like 10 or 15 + // also note that due to the radius restrictions of the list, searches greater than 1024 units won't work properly + for(int i = 0; i < numNearbyEnemies; i++) + { + vec3_t dif; + + VectorSubtract(g_edicts[nearbyEnemies[i]].s.origin, center, dif); + + if(squashZ) + { // our game is largely 2d, not so much 3d. Sometimes this is needed + dif[2] *= 3;//this will narrow the z portion to a 3rd of the x and y portions + } + + if(DotProduct(dif, dif) < radSq) + { + content->addEnt(&g_edicts[nearbyEnemies[i]]); + } + } +} + +qboolean monster_global::IsReadyForWakeSound(void) +{ + //if wake sound time is greater than level time, something's fucked + if (lastWakeSound > level.time + 0.1) + { + lastWakeSound = level.time - 3.0; + } + + return lastWakeSound level.time + 0.1) + { + lastVoiceSound = level.time - 3.0; + } + + return lastVoiceSoundai) + { //try to spook this guy + curSearch->ai->Spook(style, center); + } + } + +} + +void monster_global::AddSoundTrigger(int val) +{ + for(int i = 0; i < numSoundTriggers; i++) + { + if(soundTriggers[i] == val) + { + return; + } + } + if(numSoundTriggers == MAX_SOUND_TRIGGERS) + { + return;//fixme - error condition? + } + soundTriggers[numSoundTriggers] = val; + numSoundTriggers++; +} + +void monster_global::RemoveSoundTrigger(int val) +{ + if(!soundTriggersValid) + { + InitSoundTriggers(); + } + + for(int i = 0; i < numSoundTriggers; i++) + { + //warning - assumes each entry shows up only once (which should be the case) + if(soundTriggers[i] == val) + { + soundTriggers[i] = soundTriggers[numSoundTriggers - 1]; + numSoundTriggers--; + return; + } + } +} + +void monster_global::InitSoundTriggers(void) +{ + ClearSoundTriggers(); + + edict_t *curTest = g_edicts; + for ( curTest = g_edicts; curTest < &g_edicts[globals.num_edicts] ; curTest++) + { + if (!curTest->inuse)continue; + if(strcmp(curTest->classname, "trigger_sound"))continue; + + AddSoundTrigger(curTest - g_edicts); + } + + soundTriggersValid = 1; +} + +edict_t *monster_global::GetClosestEnemy(void) +{ + return closestEnemy ? &g_edicts[closestEnemy]:0; +} \ No newline at end of file diff --git a/Source/Game/gamecpp/g_monster.h b/Source/Game/gamecpp/g_monster.h new file mode 100644 index 0000000..ee60bfd --- /dev/null +++ b/Source/Game/gamecpp/g_monster.h @@ -0,0 +1,214 @@ + +#ifndef __G_MONSTER_H__ +#define __G_MONSTER_H__ + +class CRadiusContent; +class ai_c; + +#define MAX_SEARCHABLE_ENEMIES 64 +#define MAX_SOUND_TRIGGERS 16 + +typedef enum +{ + VOICECODE_UNKNOWN, + VOICECODE_BACKUP, + VOICECODE_THROW, + VOICECODE_DUCK, + VOICECODE_RETREAT, + VOICECODE_HELP, + VOICECODE_REACT +} voiceCode_e; + +typedef enum +{ + SPOOK_NOT, + SPOOK_DEAD_FRIEND, + SPOOK_EXPLOSIVE, //use this for initial impact + SPOOK_EXPLOSIVE2 //use this for the time period after the initial impact (so guys don't keep rolling) +}; + +class monster_global +{ +private: + float lastPriorityUpdate; + int lastWakeSound; + int lastVoiceSound; + voiceCode_e lastVoiceCode; + int clientNode; + int clientRegion; + + int nearbyEnemies[MAX_SEARCHABLE_ENEMIES]; + int numNearbyEnemies; + int numSeenEnemies; + + int numSoundTriggers; + int soundTriggers[MAX_SOUND_TRIGGERS];//these will be searched frequently, so make them quick + int soundTriggersValid; + + int closestEnemy; +public: + monster_global(void){ Init(); } +void Init(void) { lastPriorityUpdate = 0; lastWakeSound = 0; lastVoiceSound = 0; lastVoiceCode = VOICECODE_UNKNOWN; soundTriggersValid = 0; closestEnemy = 0; clientNode = 0; clientRegion = 0; } +qboolean CheckBottom (ai_c &which_ai, edict_t *ent, vec3_t pos, int motion_allowed); +qboolean CheckBottom (edict_t *ent); +void CheckGround (edict_t *ent); +void CatagorizePosition (edict_t *ent); +void WorldEffects (edict_t *ent); +void DropToFloor (edict_t *ent); +void SetSightClient (void); +int Range (edict_t *self, edict_t *other, float dist_sq=0); +qboolean Visible (edict_t *self, edict_t *other); +qboolean Infront (edict_t *self, edict_t *other); +void MakeSound(edict_t *listener, vec3_t origin, float time, edict_t *noisemaker, ai_sensetype_e type); +void RadiusDeafen (edict_t *inflictor, float degree, float radius); +void UpdateEnemyPriority(void); +int GetClientNode(void){return clientNode;} +void FindGuysInRadius(vec3_t center, float radius, CRadiusContent *content, int squashZ); +void AddSeenEnemy(void){numSeenEnemies++;} +int GetSeenEnemyCount(void){return numSeenEnemies;} + +void SetVoiceSoundTime(float newVoiceTime){lastVoiceSound=newVoiceTime;} +voiceCode_e GetVoiceCode(void){return lastVoiceCode;} +void SetVoiceCode(voiceCode_e newVoiceCode){lastVoiceCode=newVoiceCode;} +qboolean IsReadyForVoiceSound(void); + +void SetWakeSoundTime(float newWakeTime){lastWakeSound=newWakeTime;} +qboolean GetWakeSoundTime(void){return lastWakeSound;} +qboolean IsReadyForWakeSound(void); +int GetNumNearbyEnemies(void){return numNearbyEnemies;} + +void SpookEnemies(vec3_t center, float radius, int style); + +void InitSoundTriggers(void); +void ClearSoundTriggers(void){numSoundTriggers = 0;} +void AddSoundTrigger(int val); +void RemoveSoundTrigger(int val); +int GetActiveSoundTriggers(void){if(!soundTriggersValid)InitSoundTriggers(); return numSoundTriggers;} +int GetSoundTrigger(int num){if(!soundTriggersValid)InitSoundTriggers(); assert(num > -1);assert(num < numSoundTriggers);return soundTriggers[num];} + +edict_t *GetClosestEnemy(void); + +}; + +extern monster_global gmonster; + +// monster +void SP_m_x_romulan (edict_t *self); +void SP_m_x_chopper_black (edict_t *self); +void SP_m_x_chopper_green (edict_t *self); +void SP_m_x_chopper_white (edict_t *self); +void SP_m_x_hind (edict_t *self); +void SP_m_x_tank (edict_t *self); +void SP_m_x_snowcat (edict_t *self); +void SP_m_x_bull(edict_t *self); + +//dogs +void SP_m_x_husky(edict_t *self); +void SP_m_x_rottweiler(edict_t *self); +void SP_m_x_germanshep(edict_t *self); +void SP_m_x_raiderdog(edict_t *self); + +//ectos +void SP_m_kos_eofficer (edict_t *self); +void SP_m_nyc_etourist (edict_t *self); +void SP_m_irq_eofficer (edict_t *self); +void SP_m_irq_eman1 (edict_t *self); +void SP_m_nyc_estockbroker (edict_t *self); +void SP_m_nyc_eskinhead3 (edict_t *self); +void SP_m_nyc_ebum (edict_t *self); +void SP_m_nyc_epunk (edict_t *self); +void SP_m_sib_eofficer (edict_t *self); +void SP_m_sib_escientist1 (edict_t *self); +void SP_m_tok_mman1 (edict_t *self); +void SP_m_afr_eworker (edict_t *self); +void SP_m_afr_ecommander (edict_t *self); +//unfinished +void SP_m_kos_erefugee (edict_t *self); + +//mesos +void SP_m_x_mskinboss (edict_t *self); +void SP_m_nyc_mskinhead1 (edict_t *self); +void SP_m_nyc_mskinhead2a (edict_t *self); +void SP_m_nyc_mpunk (edict_t *self); +void SP_m_nyc_mswat (edict_t *self); +void SP_m_nyc_mswatleader (edict_t *self); +void SP_m_nyc_mpolitician (edict_t *self); +void SP_m_kos_mgrunt1 (edict_t *self); +void SP_m_cas_mraider2a (edict_t *self); +void SP_m_irq_mpolice (edict_t *self); +void SP_m_irq_msoldier1 (edict_t *self); +void SP_m_irq_msoldier2a (edict_t *self); +void SP_m_irq_mrepguard1a (edict_t *self); +void SP_m_irq_moilworker (edict_t *self); +void SP_m_sib_mtrooper1b (edict_t *self); +void SP_m_sib_mcleansuit (edict_t *self); +void SP_m_tok_mman2 (edict_t *self); +void SP_m_afr_msniper (edict_t *self); +void SP_m_afr_msoldier1a (edict_t *self); +void SP_m_afr_msoldier2 (edict_t *self); +//unfinished +void SP_m_x_mraiderboss1 (edict_t *self); +void SP_m_x_mraiderboss2 (edict_t *self); +void SP_m_x_miraqboss(edict_t *self); +void SP_m_nyc_mskinhead2b (edict_t *self); +void SP_m_afr_msoldier1b (edict_t *self); +void SP_m_afr_msoldier3 (edict_t *self); +void SP_m_afr_mbrute (edict_t *self); +void SP_m_afr_mrocket (edict_t *self); +void SP_m_kos_mgrunt2 (edict_t *self); +void SP_m_kos_mgrunt3 (edict_t *self); +void SP_m_kos_msniper1a (edict_t *self); +void SP_m_kos_msniper1b (edict_t *self); +void SP_m_kos_mcomtroop (edict_t *self); +void SP_m_kos_mbrute1a (edict_t *self); +void SP_m_kos_mbrute1b (edict_t *self); +void SP_m_kos_mmechanic (edict_t *self); +void SP_m_kos_mrebel (edict_t *self); +void SP_m_kos_mklaleader (edict_t *self); +void SP_m_sib_mtrooper1a (edict_t *self); +void SP_m_sib_mtrooper2 (edict_t *self); +void SP_m_sib_mguard1 (edict_t *self); +void SP_m_sib_mguard3 (edict_t *self); +void SP_m_sib_mguard4 (edict_t *self); +void SP_m_sib_mmechanic (edict_t *self); +void SP_m_irq_msoldier2b (edict_t *self); +void SP_m_irq_mrepguard1b (edict_t *self); +void SP_m_irq_mcommander (edict_t *self); +void SP_m_irq_mbrute1a (edict_t *self); +void SP_m_irq_mbrute1b (edict_t *self); +void SP_m_irq_mbodyguard (edict_t *self); +void SP_m_irq_mrocket (edict_t *self); +void SP_m_irq_msaddam (edict_t *self); +void SP_m_irq_mman2 (edict_t *self); +void SP_m_tok_mhench1 (edict_t *self); +void SP_m_tok_mhench2 (edict_t *self); +void SP_m_tok_mkiller (edict_t *self); +void SP_m_tok_fassassin (edict_t *self); +void SP_m_tok_mninja (edict_t *self); +void SP_m_tok_mbrute (edict_t *self); +void SP_m_cas_mraider1 (edict_t *self); +void SP_m_cas_mraider2b (edict_t *self); +void SP_m_cas_mbrute (edict_t *self); +void SP_m_cas_mrocket (edict_t *self); + +void SP_m_x_mcharacter(edict_t *self); +void SP_m_x_mcharacter_snow(edict_t *self); +void SP_m_x_mcharacter_desert(edict_t *self); +void SP_m_x_mmerc(edict_t *self); +void SP_m_x_mhurtmerc(edict_t *self); +void SP_m_x_msam(edict_t *self); + +//females +void SP_m_nyc_fskinchick(edict_t *self); +void SP_m_x_ftaylor (edict_t *self); +//unfinished +void SP_m_nyc_fwoman(edict_t *self); +void SP_m_sib_fguard2(edict_t *self); +void SP_m_sib_fscientist2(edict_t *self); +void SP_m_irq_fwoman1 (edict_t *self); +void SP_m_irq_fwoman2 (edict_t *self); +void SP_m_tok_fwoman1 (edict_t *self); +void SP_m_tok_fwoman2 (edict_t *self); +void SP_m_cas_ffemale (edict_t *self); + +#endif \ No newline at end of file diff --git a/Source/Game/gamecpp/g_newyork.cpp b/Source/Game/gamecpp/g_newyork.cpp new file mode 100644 index 0000000..ff41311 --- /dev/null +++ b/Source/Game/gamecpp/g_newyork.cpp @@ -0,0 +1,354 @@ +/****************************************************** + * Objects for New York * + ******************************************************/ + +#include "g_local.h" +#include "g_obj.h" + +// misc_newyork... +void SP_misc_newyork_burned_car (edict_t *ent); +void SP_misc_newyork_gumball (edict_t *ent); +void SP_misc_newyork_news_machine (edict_t *ent); +void SP_misc_newyork_trash_pile (edict_t *ent); +void SP_misc_newyork_trashcan (edict_t *ent); + +#define HLTH_NY_BURNED_CAR 10000 +#define HLTH_NY_GUMBALL 1000 +#define HLTH_NY_NEWS_MACHINE 600 +#define HLTH_NY_TRASH_PILE 300 +#define HLTH_NY_TRASHCAN 300 + +float s_lastTrashcanPainTime = 0; + +spawn_t newyorkSpawns[] = +{ + // misc_newyork. . . + {"misc_newyork_burned_car", SP_misc_newyork_burned_car}, + {"misc_newyork_gumball", SP_misc_newyork_gumball}, + {"misc_newyork_news_machine", SP_misc_newyork_news_machine}, + {"misc_newyork_trash_pile", SP_misc_newyork_trash_pile}, + {"misc_newyork_trashcan", SP_misc_newyork_trashcan}, + {NULL, NULL}, +}; + +typedef enum +{ + OBJ_BURNED_CAR = 0, + OBJ_GUMBALL, + OBJ_NEWS_MACHINE, + OBJ_TRASH_PILE, + OBJ_TRASHCAN, + MAX_OBJS +}; + + +modelSpawnData_t nyModelData[MD_NY_SIZE] = +{ +// dir file surfaceType material health solid material file cnt scale +"objects/newyork/burned_car", "burned_car", SURF_METAL, MAT_METAL_RUSTY, HLTH_NY_BURNED_CAR, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_BURNED_CAR +"objects/newyork/gumball", "gumball", SURF_METAL, MAT_METAL_SHINY, HLTH_NY_GUMBALL, SOLID_BBOX, "gumball", 0, 0.0, NULL, // OBJ_GUMBALL +"objects/newyork/news_machine", "news", SURF_METAL, MAT_METAL_SHINY, HLTH_NY_GUMBALL, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_NEWS_MACHINE +"objects/newyork/trash_pile", "trash_pile", SURF_METAL, MAT_METAL_RUSTY, HLTH_NY_TRASH_PILE, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_TRASH_PILE +"objects/newyork/trashcan", "trashcan", SURF_METAL, MAT_METAL_RUSTY, HLTH_NY_TRASHCAN, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_TRASHCAN +}; + + +/*QUAKED misc_newyork_burned_car (1 .5 0) (-91 -33 -25) (91 33 25) INVULNERABLE NOPUSH x x x x FLUFF +Burned out car. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_newyork_burned_car (edict_t *ent) +{ + VectorSet (ent->mins, -91, -33, -25); + VectorSet (ent->maxs, 91, 33, 25); + + SimpleModelInit2(ent,&nyModelData[OBJ_BURNED_CAR],NULL,NULL); +} + + +void gumball_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t vec1, gumballorigin; + vec3_t debrisNorm; + + if (self->s.skinnum == 1) + { + return; + } + + SetSkin(self,nyModelData[OBJ_GUMBALL].dir,nyModelData[OBJ_GUMBALL].file, + nyModelData[OBJ_GUMBALL].materialfile,"gumball2", 0); + + VectorCopy(self->s.origin, gumballorigin); + gumballorigin[2] += 10; + + VectorClear(debrisNorm); + FX_ThrowDebris(gumballorigin,debrisNorm, 5,DEBRIS_SM, MAT_GLASS, 0,0,0, SURF_GLASS); + + VectorSet(vec1, gi.irand(-21,20), gi.irand(-21,20), 0); + FX_MakeGumballs(gumballorigin, vec1, 0); + + VectorSet(vec1, gi.irand(-21,20), gi.irand(-21,20), 0); + FX_MakeCoins(gumballorigin, vec1, 0); + + VectorSet(vec1, gi.irand(-21,20), gi.irand(-21,20), 0); + FX_MakeGumballs(gumballorigin, vec1, 0); + + gi.sound (self, CHAN_ENT1, gi.soundindex("Impact/GlassBreak/GBSmall.wav"), .6, ATTN_NORM, 0); + + self->s.skinnum = 1; + self->health = 1; +} + +/*QUAKED misc_newyork_gumball (1 .5 0) (-8 -8 -19) (8 8 19) INVULNERABLE NOPUSH x x x x FLUFF +A gumball machine +------ KEYS ------ +Skin - +0 - intact, full of gumballs +1 - broken, no gumballs +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- when shot gumballs come out +*/ +void SP_misc_newyork_gumball (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -8, -8, -19); + VectorSet (ent->maxs, 8, 8, 19); + + switch (ent->s.skinnum) + { + case 1: + skinname = "gumball2"; + break; + default: + skinname = "gumball"; + break; + } + + ent->pain = gumball_pain; + + SimpleModelInit2(ent,&nyModelData[OBJ_GUMBALL],NULL,NULL); + + SetSkin(ent,nyModelData[OBJ_GUMBALL].dir,nyModelData[OBJ_GUMBALL].file, + nyModelData[OBJ_GUMBALL].materialfile,skinname, 0); + + // cache debris CLGHL_CHUNKGLASSSM + entDebrisToCache[CLGHL_CHUNKGLASSSM] = DEBRIS_YES; + gi.soundindex("Impact/GlassBreak/GBSmall.wav"); // precache sound +} + +void news_machine_pain2 (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + + FX_PaperCloud(self->s.origin, 3); +} + +void news_machine_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t forward,right,holdPos; + vec3_t debrisNorm; + + AngleVectors(self->s.angles, forward, right, NULL); + VectorMA(self->s.origin, 10, forward, holdPos); + + FX_PaperCloud(holdPos, 3); + VectorClear(debrisNorm); + FX_ThrowDebris(holdPos,debrisNorm, 5,DEBRIS_SM, MAT_GLASS,0,0,0, SURF_GLASS); + + VectorMA(self->s.origin, 10, forward, holdPos); + VectorMA(self->s.origin, 15, right, holdPos); + holdPos[2] += 10; + FX_MakeCoins(holdPos, forward, 0); + + SimpleModelSetSequence(self,nyModelData[OBJ_NEWS_MACHINE].file,SMSEQ_HOLD); + + self->pain = news_machine_pain2; + +} + +/*QUAK-ED misc_newyork_news_machine (1 .5 0) (-21 -35 -20) (21 12 19) INVULNERABLE NOPUSH x x x x FLUFF +A newspaper machine +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- when shot front opens up and newspapers float out +*/ +void SP_misc_newyork_news_machine (edict_t *ent) +{ + VectorSet (ent->mins, -21, -35, -20); + VectorSet (ent->maxs, 21, 12, 19); + + ent->pain = news_machine_pain; + SimpleModelInit2(ent,&nyModelData[OBJ_NEWS_MACHINE],NULL,NULL); + + ent->ghoulInst->Pause(level.time); + + // cache debris CLGHL_CHUNKGLASSSM, CLGHL_PAPER + entDebrisToCache[CLGHL_CHUNKGLASSSM] = DEBRIS_YES; + entDebrisToCache[CLGHL_PAPER] = DEBRIS_YES; +} + + +void trashcan_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + // don't perform pain stuff more often than 1 second + if ((level.time - s_lastTrashcanPainTime) > 0.5) + { + // if we're hit in the flap, don't take damage + if ((wherehit[2] - self->s.origin[2]) > 10) + { + // play through the can's flip/flop sequence once + SimpleModelSetSequence(self,nyModelData[OBJ_TRASHCAN].file,SMSEQ_HOLD); + + // put our health back (so you can keep shooting the flap and you won't destroy the trashcan) + self->health += damage; + // play the flippity-flippity sound + FX_TrashcanHit(self->s.origin); + } + s_lastTrashcanPainTime = level.time; + } +} + +void trashcan_death(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + FX_SmokePuff(self->s.origin,200, 200, 200, 250); + FX_SmokePuff(self->s.origin,200, 200, 200, 250); + FX_SmokePuff(self->s.origin,200, 200, 200, 250); + SpecialBecomeDebris(self, inflictor, attacker, damage, point); +} + +/*QUAKED misc_newyork_trashcan (1 .5 0) (-10 -10 -19) (10 10 20) INVULNERABLE NOPUSH x x x x FLUFF +A "Pitch In" trash can +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- when shot on upper half, the top spins and generates papers +*/ +void SP_misc_newyork_trashcan (edict_t *ent) +{ + VectorSet (ent->mins, -10, -10, -18); + VectorSet (ent->maxs, 10, 10, 20); + + ent->die = trashcan_death; + ent->pain = trashcan_pain; + SimpleModelInit2(ent,&nyModelData[OBJ_TRASHCAN],NULL,NULL); + // default for SimpleModelInit2() is to play the sequence looping. we don't want that. + SimpleModelSetSequence(ent,nyModelData[OBJ_TRASHCAN].file,SMSEQ_HOLD); + // cache sound CLSFX_TRASHCAN_FLIP + entSoundsToCache[CLSFX_TRASHCAN_FLIP] = 1; + + // cache debris CLGHL_CAN, CLGHL_PAPER + entDebrisToCache[CLGHL_CAN] = DEBRIS_YES; + entDebrisToCache[CLGHL_PAPER] = DEBRIS_YES; +} + +void trash_piece_think(edict_t *ent) +{ + G_FreeEdict(ent); +} + +void trash_pile_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + edict_t *trash; + vec3_t boltPos; + char *boltName,*objName; + char soundName[60]; + int per; + + if (self->count == 0) + { + boltName = "DUMMY01"; + objName = "_CAN1"; + } + else if (self->count == 1) + { + boltName = "DUMMY02"; + objName = "_CAN2"; + } + else if (self->count == 2) + { + boltName = "DUMMY03"; + objName = "_SHOE"; + } + else if (self->count == 3) + { + boltName = "DUMMY04"; + objName = "_OILCAN"; + } + + per = gi.irand(1,3); + sprintf(soundName,"Weapons/FX/Rics/ric%d.wav",per); + + gi.sound (self, CHAN_VOICE, gi.soundindex(soundName), .6, ATTN_NORM, 0); + + // Remove part from main model + SimpleModelRemoveObject(self,objName); + + + // Spawn little piece + trash = G_Spawn(); + + VectorSet (trash->mins, -5, -5, -5); + VectorSet (trash->maxs, 5, 5, 5); + + VectorCopy(self->s.origin,trash->s.origin); + + trash->s.origin[2] += 30; + SimpleModelInit2(trash,&nyModelData[OBJ_TRASH_PILE],NULL,NULL); + + SimpleModelSetObject(trash,objName); + + trash->velocity[0] = gi.flrand(-200.0F, 200.0F); + trash->velocity[1] = gi.flrand(-200.0F, 200.0F); + trash->velocity[2] = gi.flrand(50.0F, 150.0F); + + trash->nextthink = level.time + gi.flrand(0.0F, 30.0F); + trash->think = trash_piece_think; + gi.linkentity (trash); + + GetGhoulPosDir(self->s.origin, self->s.angles, self->ghoulInst, + NULL, boltName, boltPos, NULL, NULL, NULL); + + FX_SmokePuff(boltPos,200, 200, 200, 250); + + ++self->count; + + if (self->count == 4) + { + G_FreeEdict(self); // Remove original trash + } +} + + +/*QUAKED misc_newyork_trash_pile (1 .5 0) (-14 -8 0) (5 14 14) INVULNERABLE NOPUSH x x x x FLUFF +Several beer/oil cans and a gas can. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- when shot one of the cans flys off +*/ +void SP_misc_newyork_trash_pile (edict_t *ent) +{ + VectorSet (ent->mins, -10, -11, -6); + VectorSet (ent->maxs, 10, 11, 18); + + ent->spawnflags |= SF_NOPUSH; + + ent->pain = trash_pile_pain; + SimpleModelInit2(ent,&nyModelData[OBJ_TRASH_PILE],NULL,NULL); + +} \ No newline at end of file diff --git a/Source/Game/gamecpp/g_obj.cpp b/Source/Game/gamecpp/g_obj.cpp new file mode 100644 index 0000000..f09d806 --- /dev/null +++ b/Source/Game/gamecpp/g_obj.cpp @@ -0,0 +1,2552 @@ +/****************************************************** + * Miscellaneous Object Code * + ******************************************************/ + +#include "g_local.h" +#include "g_obj.h" +#include "windows.h" + +int boltInstInfo_c::nMax = MAX_BOLTINSTINFO; + +// The code I stole from Bob didn't actually properly adjust the bounding boxes. +// So, at Rick's prompting, I'm going to put in a cheap, lame hardcode to fix bounding +// boxes for 90, 180, and 270 degree rotations. It's fast and it works. +// +void breakable_brush_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void EntToWorldMatrix(vec3_t org, vec3_t angles, Matrix4 &m); + +void BboxRotate(edict_t *self) +{ + vec3_t holdmins,holdmaxs,holdangs; + + VectorCopy(self->mins, holdmins); + VectorCopy(self->maxs, holdmaxs); + VectorCopy(self->s.angles, holdangs); + + anglemod(holdangs[0]); // replace the following lines, prevent the possibility of a loooooooong loop +/* while(holdangs[0] < 0) + { + holdangs[0] += 360; + } + while(holdangs[0] > 359) + { + holdangs[0] -= 360; + } +*/ + switch ((int)holdangs[0]) // pitch + { + case(90): + self->mins[0] = holdmins[2]; + self->mins[2] = -1 * holdmaxs[0]; + self->maxs[0] = holdmaxs[2]; + self->maxs[2] = -1 * holdmins[0]; + break; + case(180): + self->mins[0] = -1 * holdmaxs[0]; + self->mins[2] = -1 * holdmaxs[2]; + self->maxs[0] = -1 * holdmins[0]; + self->maxs[2] = -1 * holdmins[2]; + break; + case(270): + self->mins[0] = -1 * holdmaxs[2]; + self->mins[2] = holdmins[0]; + self->maxs[0] = -1 * holdmins[2]; + self->maxs[2] = holdmaxs[0]; + break; + default: + break; + } + + anglemod(holdangs[1]); // replace the following lines, prevent the possibility of a loooooooong loop +/* while(holdangs[1] < 0) + { + holdangs[1] += 360; + } + while(holdangs[1] > 359) + { + holdangs[1] -= 360; + } +*/ + switch ((int)holdangs[1]) // yaw + { + case(90): + self->mins[0] = -1 * holdmaxs[1]; + self->mins[1] = holdmins[0]; + self->maxs[0] = -1 * holdmins[1]; + self->maxs[1] = holdmaxs[0]; + break; + case(180): + self->mins[0] = -1 * holdmaxs[0]; + self->mins[1] = -1 * holdmaxs[1]; + self->maxs[0] = -1 * holdmins[0]; + self->maxs[1] = -1 * holdmins[1]; + break; + case(270): + self->mins[0] = holdmins[1]; + self->mins[1] = -1 * holdmaxs[0]; + self->maxs[0] = holdmaxs[1]; + self->maxs[1] = -1 * holdmins[0]; + break; + default: + break; + } + + anglemod(holdangs[2]); // replace the following lines, prevent the possibility of a loooooooong loop +/* while(holdangs[2] < 0) + { + holdangs[2] += 360; + } + while(holdangs[2] > 359) + { + holdangs[2] -= 360; + } +*/ + switch ((int)holdangs[2]) // roll + { + case(90): + self->mins[1] = -1 * holdmaxs[2]; + self->mins[2] = holdmins[1]; + self->maxs[1] = -1 * holdmins[2]; + self->maxs[2] = holdmaxs[1]; + break; + case(180): + self->mins[1] = -1 * holdmaxs[1]; + self->mins[2] = -1 * holdmaxs[2]; + self->maxs[1] = -1 * holdmins[1]; + self->maxs[2] = -1 * holdmins[2]; + break; + case(270): + self->mins[1] = holdmins[2]; + self->mins[2] = -1 * holdmaxs[1]; + self->maxs[1] = holdmaxs[2]; + self->maxs[2] = -1 * holdmins[1]; + break; + default: + break; + } + return; +} + +void PhysicsModelInit(edict_t *self, char *rendername) +{ + self->solid = SOLID_BSP; + gi.setmodel(self, self->model); + gi.setrendermodel(self, rendername); +// rjr too dangerous self->rendermodel = rendername; + self->s.angle_diff = self->s.angles[1]; + self->s.angles[1] = 0; +} + +void GhoulPhysicsModelInit(edict_t *self) +{ + self->solid = SOLID_BSP; + gi.setmodel(self, self->model); + self->s.angle_diff = self->s.angles[1]; + self->s.angles[1] = 0; +} + +void TintModel(edict_t *self) +{ + if (!self->ghoulInst) + { + return; + } + if (st.color[0] || st.color[1] || st.color[2]) + { + self->ghoulInst->SetTint(st.color[0],st.color[1],st.color[2],1); + } + return; +} + +void SetSkin2(IGhoulInst* inst, char* modelName, char* modelSubname, char *matName, char *skinName) +{ + if (!inst) + { + Com_Printf("ERROR: trying to set skin %s on NULL ghoulInst!\n", skinName); + return; + } + if (inst->SetFrameOverride(matName, skinName)) + { + //successful. YEAH! + return; + } + + //this stuff just for debugging: + if (!inst->GetGhoulObject() || !inst->GetGhoulObject()->FindMaterial(matName)) + { + Com_Printf ("WARNING: Can't find material:%s\n",matName); + return; + } + if (!inst->GetGhoulObject()->FindSkin(inst->GetGhoulObject()->FindMaterial(matName), skinName)) + { + Com_Printf ("WARNING: Can't find skin:%s\n", skinName); + return; + } + Com_Printf ("WARNING: unknown error in SetSkin2 on object %s/%s.\n", modelName, modelSubname); +} + +void SetSkin(edict_t *self, char* modelName, char* modelSubname, char *matName, char *skinName, int nSetBoltonSkins) +{ + IGhoulInst* boltInst = NULL; + boltInstInfo_c *boltInfo = NULL; + baseObjInfo_c *objInfo = NULL; + int i = 0; + + if (self) + { + // if nSetBoltonSkins is true, find all boltons and set their skin also (duh) + SetSkin2(self->ghoulInst, modelName, modelSubname, matName, skinName); + if (nSetBoltonSkins) + { + if ( (objInfo = self->objInfo) && (boltInfo = (boltInstInfo_c*)objInfo->GetInfo(OIT_BOLTINST)) ) + { + // this may look like we're using the wrong modelName and modelSubname for this + //bolton, but SetSkin2 only uses those names for debugging purposes -- all it + //really needs is an IGhoulInst*, a matName, and a skinName + for (i = 1; i <= boltInfo->GetNum(); i++) + { + if (boltInst = SimpleModelGetBolt(self, i)) + { + SetSkin2(boltInst, modelName, modelSubname, matName, skinName); + } + } + } + } + } + else + Com_Printf ("WARNING: Can't set skin for NULL edict\n"); + + return; +} + + +void BecomeDebrisFinal(edict_t *self,byte numchunks,byte scale,edict_t *attacker) +{ + float volume; + vec3_t origin; + byte x_max,y_max,z_max; + vec3_t debrisNorm; + + if (!scale || !numchunks) + { + volume = self->size[0] * self->size[1] * self->size[2]; + + // Calc numchunks??? + if (!numchunks) + { + numchunks = (byte)((volume / 9000) + 2); + } + + if (numchunks > 20) + numchunks = 20; + else if (numchunks < 10) + numchunks = 10; + + // sending a scale of 0 will not give you the debris you want + if (0 == scale) + { + scale = DEBRIS_SM; + } + } + + // Calc scale on breakable brushes + if (strcmp(self->classname, "func_breakable_brush") == 0) + { + // Find scale of debris to throw + if (volume > 250000) + scale = DEBRIS_LRG; + else if (volume > 40000) + scale = DEBRIS_MED; + else + scale = DEBRIS_SM; + } + + VectorAdd(self->absmax,self->absmin, origin); + VectorScale(origin, .5, origin); + + if (self->material > 0) + { + if (strcmp(self->classname, "func_breakable_brush") == 0) + { + if (self->count) + { + numchunks = self->count; + scale = self->mass; + x_max = 0; + y_max = 0; + z_max = 0; + } + else + { + x_max = self->size[0]; + y_max = self->size[1]; + z_max = self->size[2]*0.5; + } + } + else + { + x_max = (byte) self->maxs[0]; + y_max = (byte) self->maxs[1]; + z_max = (byte) self->maxs[2]; + } + + VectorSubtract (attacker->s.origin, origin, debrisNorm); + VectorNormalize(debrisNorm); + FX_ThrowDebris(origin,debrisNorm, numchunks, scale, self->material,x_max,y_max,z_max, self->surfaceType); + } + + if (self->message) + { + gi.centerprintf (attacker, "%s", self->message); + gi.sound (attacker, CHAN_AUTO, gi.soundindex ("Misc/Talk.wav"), .6, ATTN_NORM, 0); + } + + + G_UseTargets(self,self); + + G_FreeEdict (self); +} + +// specifically, spawn a cloud of papers and cans for certain objects before they get debrisified. could +//be written more generally for other objects' pre-death stuff +void SpecialBecomeDebris(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + int i = 0; + vec3_t vDir = {0,0,1}; + + // create a cloud of papers when this object is destroyed + FX_PaperCloud(self->s.origin, 0); + // ...and some coke cans + if (attacker) + { + VectorSubtract(attacker->s.origin, self->s.origin, vDir); + } + else if (inflictor) + { + VectorSubtract(inflictor->s.origin, self->s.origin, vDir); + } + VectorNormalize(vDir); + FX_SodaCans(self->s.origin, vDir, 100, 0); + + // ObjBecomeDebris() frees the edict so call it last + ObjBecomeDebris(self, inflictor, attacker, damage, point); +} + +void ObjBecomeDebris (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + byte numchunks; + byte scale; + + if (self->objSpawnData) + { + numchunks = self->objSpawnData->debrisCnt; + scale = self->objSpawnData->debrisScale;// * 10; + } + + BecomeDebrisFinal(self,numchunks,scale,attacker); + +} + +void BecomeDebris (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + BecomeDebrisFinal(self,0,0,attacker); +} + + +void LightBecomeDebris (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + // Turn off light +// gi.configstring (CS_LIGHTS+self->style, "a"); // FIXME - lights should go out when shot + + BecomeDebris (self,inflictor,attacker,damage,point); +} + +void ObjectStopMove (edict_t *ent) +{ + ent->friction = 1; // Don't move +} + +void SimpleModelTouch (edict_t *ent, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t movedir; + + if (!other->client) + return; + + // This should really be changed to reflect mass + VectorSubtract(ent->s.origin, other->s.origin, movedir); + VectorNormalize(movedir); + VectorScale(movedir, 100, ent->velocity); + ent->friction = 0; + + ent->think = ObjectStopMove; + ent->nextthink = level.time + FRAMETIME; +} + +void SimpleModelScale(edict_t *ent,float objscale) +{ + Matrix4 m,scale,tmp; + + if (!ent->ghoulInst) + return; + + ent->ghoulInst->GetXForm(m); + scale.Scale(objscale); + tmp.Concat(scale,m); + ent->ghoulInst->SetXForm(tmp); +} + +void SimpleModelInit(edict_t *ent, solid_t solid) +{ + Matrix4 ToWorldNoOrigin; + Vect3 mins,maxs; + + // make sure the edict_t::objInfo field is properly inited + if (!ent->objInfo) + { // create a baseObjInfo_c for our edict + baseObjInfo_c *newInfo = new baseObjInfo_c(ent); + ent->objInfo = newInfo; + } + // putting this in stops the game asserting later on during a server cliptrace if you call this + // function on a model that failed to load it's GHL file - slc. + // + if (solid == SOLID_GHOUL && !ent->ghoulInst) + { + gi.dprintf("ERROR: attempting to set SOLID_GHOUL without ghoulInst (model '%s')!\n", ent->classname); + solid = SOLID_NOT; + } + + // Set bounding box to match orientation of object + BboxRotate(ent); + + ent->solid=solid; + ent->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID; + + // Lights are a little different + if (strncmp (ent->classname, "light", 5)==0) + { + // Set the takedamage field to reflect INVINCIBLE setting + if (ent->spawnflags & SF_LIGHT_VULNERABLE) + ent->takedamage = DAMAGE_YES; + else + ent->takedamage = DAMAGE_NO; + + // Can be damaged but no death function? + if ((ent->takedamage == DAMAGE_YES) && (!ent->die)) + { + ent->die = LightBecomeDebris; + } + + // Set the movetype + if (!(ent->spawnflags & SF_LIGHT_PUSHABLE)) + ent->movetype = MOVETYPE_NONE; // Can't be moved + else + { + if (!ent->touch) + ent->touch = SimpleModelTouch; + + ent->movetype = MOVETYPE_DAN; // Can be pushed around + } + } + else + { + // Set the takedamage field to reflect INVINCIBLE setting + if (ent->spawnflags & SF_INVULNERABLE) + ent->takedamage = DAMAGE_NO; + else + ent->takedamage = DAMAGE_YES; + + // Can be damaged but no death function? + if ((ent->takedamage == DAMAGE_YES) && (!ent->die)) + { + ent->die = BecomeDebris; + } + + // Set the movetype + if (ent->spawnflags & SF_NOPUSH) + ent->movetype = MOVETYPE_NONE; // Can't be moved + else + { + if (!ent->touch) + ent->touch = SimpleModelTouch; + + ent->movetype = MOVETYPE_DAN; // Can be pushed around + } + + } + + + EntToWorldMatrix(ent->s.origin,ent->s.angles, ToWorldNoOrigin); + ToWorldNoOrigin.SetRow(3,Vect3(0.0f,0.0f,0.0f)); + ToWorldNoOrigin.CalcFlags(); + + if (solid == SOLID_GHOUL) + { + if (ent->ghoulInst) + { + ent->ghoulInst->GetBoundBox(level.time,ToWorldNoOrigin,mins,maxs); + + *(Vect3 *)ent->mins=mins; + *(Vect3 *)ent->maxs=maxs; + } + else + { + gi.dprintf("ERROR: couldn't find ghoul object for %s!\n", ent->classname); + } + } + + TintModel(ent); + + gi.linkentity (ent); +} + +void SimpleModelInit2(edict_t *ent, modelSpawnData_t *modelData,char *skinname,char *partname) +{ + Matrix4 ToWorldNoOrigin; + Vect3 mins,maxs; + float volume = (ent->maxs[0] - ent->mins[0]) * (ent->maxs[1] - ent->mins[1]) * (ent->maxs[2] - ent->mins[2]); + + if (NULL == modelData) + { + return; + } + // make sure the edict_t::objInfo field is properly inited + if (!ent->objInfo) + { // create a baseObjInfo_c for our edict + baseObjInfo_c *newInfo = new baseObjInfo_c(ent); + ent->objInfo = newInfo; + } + game_ghoul.SetSimpleGhoulModel (ent,modelData->dir,modelData->file,skinname,modelData->materialfile); + + // Set skin, if there is one + if (skinname) + SetSkin(ent, modelData->dir,modelData->file, modelData->materialfile, skinname, 0); + + // Set partname, if there is one + if (partname) + SimpleModelSetObject(ent,partname); + + if (!ent->surfaceType) + ent->surfaceType = modelData->surfaceType; + if (!ent->material) + ent->material = modelData->material; + if (!ent->health) + ent->health = modelData->health; + if (!ent->solid) + ent->solid = modelData->solid; + + // putting this in stops the game asserting later on during a server cliptrace if you call this + // function on a model that failed to load it's GHL file - slc. + // + if (ent->solid == SOLID_GHOUL && !ent->ghoulInst) + { + gi.dprintf("ERROR: attempting to set SOLID_GHOUL without ghoulInst (model '%s')!\n", ent->classname); + ent->solid = SOLID_NOT; + } + + // Set bounding box to match orientation of object + BboxRotate(ent); + + ent->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID; + + ent->objSpawnData = (modelData); + + + if (st.scale) + SimpleModelScale(ent,st.scale); + + // Lights are a little different + if (strncmp (ent->classname, "light", 5)==0) + { + // Set the takedamage field to reflect INVINCIBLE setting + if (ent->spawnflags & SF_LIGHT_VULNERABLE) + ent->takedamage = DAMAGE_YES; + else + ent->takedamage = DAMAGE_NO; + + // Can be damaged but no death function? + if ((ent->takedamage == DAMAGE_YES) && (!ent->die)) + { + ent->die = LightBecomeDebris; + } + + // Set the movetype + if (!(ent->spawnflags & SF_LIGHT_PUSHABLE)) + ent->movetype = MOVETYPE_NONE; // Can't be moved + else + { + if (!ent->touch) + ent->touch = SimpleModelTouch; + + ent->movetype = MOVETYPE_DAN; // Can be pushed around + } + } + else + { + // Set the takedamage field to reflect INVINCIBLE setting + if (ent->spawnflags & SF_INVULNERABLE) + ent->takedamage = DAMAGE_NO; + else + ent->takedamage = DAMAGE_YES; + + // Can be damaged but no death function? + if ((ent->takedamage == DAMAGE_YES) && (!ent->die)) + { + ent->die = ObjBecomeDebris; + } + + // Set the movetype + if (ent->spawnflags & SF_NOPUSH) + ent->movetype = MOVETYPE_NONE; // Can't be moved + else + { + if (!ent->touch) + ent->touch = SimpleModelTouch; + + ent->movetype = MOVETYPE_DAN; // Can be pushed around + } + + } + + + EntToWorldMatrix(ent->s.origin,ent->s.angles, ToWorldNoOrigin); + ToWorldNoOrigin.SetRow(3,Vect3(0.0f,0.0f,0.0f)); + ToWorldNoOrigin.CalcFlags(); + + if (ent->solid == SOLID_GHOUL) + { + if (ent->ghoulInst) + { + ent->ghoulInst->GetBoundBox(level.time,ToWorldNoOrigin,mins,maxs); + + *(Vect3 *)ent->mins=mins; + *(Vect3 *)ent->maxs=maxs; + } + else + { + gi.dprintf("ERROR: couldn't find ghoul object for %s!\n", ent->classname); + } + } + + TintModel(ent); + + gi.linkentity (ent); + + ent->mass = 800; +} + +void SimpleModelSetObject(edict_t *ent,char *partname) +{ + GhoulID part = NULL_GhoulID; + gg_obj_c_ptr MyGhoulObj; + + if (!ent->ghoulInst) + { + return; + } + + MyGhoulObj=game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + + if (MyGhoulObj) + { + if (MyGhoulObj->GetMyObject()) + { + part=MyGhoulObj->GetMyObject()->FindPart(partname); + } + if (ent->ghoulInst && part != NULL_GhoulID) + { + ent->ghoulInst->SetAllPartsOnOff(false); + ent->ghoulInst->SetPartOnOff(part, true); + } + } +} + +void SimpleModelRemoveObject(edict_t *ent,char *partname) +{ + GhoulID part = NULL_GhoulID; + gg_obj_c_ptr MyGhoulObj; + + if (!ent->ghoulInst) + { + return; + } + + MyGhoulObj=game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + + if (MyGhoulObj && MyGhoulObj->GetMyObject()) + { + part=MyGhoulObj->GetMyObject()->FindPart(partname); + } + if (ent->ghoulInst && part != NULL_GhoulID) + { + ent->ghoulInst->SetPartOnOff(part, false); + } + else + { + gi.dprintf("ERROR: SimpleModelRemoveObject - can find part %s!\n", partname); + } +} + +void SimpleModelRemoveObject2(IGhoulInst* inst,char *partname) +{ + GhoulID part = NULL_GhoulID; + gg_obj_c_ptr MyGhoulObj; + + if (!inst) + { + return; + } + + MyGhoulObj=game_ghoul.FindObject(inst->GetGhoulObject()); + + if (MyGhoulObj && MyGhoulObj->GetMyObject()) + { + part=MyGhoulObj->GetMyObject()->FindPart(partname); + } + if (inst && part != NULL_GhoulID) + { + inst->SetPartOnOff(part, false); + } + else + { + gi.dprintf("ERROR: SimpleModelRemoveObject - can find part %s!\n", partname); + } +} + +void RecursiveTurnOff(IGhoulInst* inst) +{ + int i,num=inst->GetNumChildren(); + GhoulID junkID; + + if (!inst) + { + return; + } + inst->SetAllPartsOnOff(false); + for (i=0;iGetChild(i,junkID)); + } +} + +void SimpleModelTurnOnOff(IGhoulInst* inst, bool bOnOff) +{ + if (inst) + { + inst->SetAllPartsOnOff(bOnOff); + } +} + +void SimpleModelAddObject2(IGhoulInst* inst,char *partname) +{ + GhoulID part = NULL_GhoulID; + gg_obj_c_ptr MyGhoulObj; + + if (!inst) + { + return; + } + + MyGhoulObj=game_ghoul.FindObject(inst->GetGhoulObject()); + + if (MyGhoulObj && MyGhoulObj->GetMyObject()) + { + part=MyGhoulObj->GetMyObject()->FindPart(partname); + } + if (inst && part != NULL_GhoulID) + { + inst->SetPartOnOff(part, true); + } +} + +void SimpleModelAddObject(edict_t *ent,char *partname) +{ + GhoulID part = NULL_GhoulID; + gg_obj_c_ptr MyGhoulObj; + + if (!ent->ghoulInst) + { + return; + } + + MyGhoulObj=game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + + if (MyGhoulObj && MyGhoulObj->GetMyObject()) + { + part=MyGhoulObj->GetMyObject()->FindPart(partname); + } + if (ent->ghoulInst && part != NULL_GhoulID) + { + ent->ghoulInst->SetPartOnOff(part, true); + } +} + +void SimpleModelSetSequence(edict_t *ent,char *seqname,int loopFlag) +{ + ggObjC *object=NULL; + GhoulID objectSeq=0; + + if (!ent->ghoulInst) + { + return; + } + + object = game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + + //changed this to false, can't cache new seqs in after instances are created --ss + objectSeq = game_ghoul.FindObjectSequence(object,seqname); + + if (ent && ent->ghoulInst && objectSeq) + { + if (!loopFlag) + ent->ghoulInst->Play(objectSeq,level.time,0.0f,true,IGhoulInst::Hold); + else + ent->ghoulInst->Play(objectSeq,level.time,0.0f,true,IGhoulInst::Loop); + } +} + +GhoulID SimpleModelSetSequence2(IGhoulInst* inst,char *seqname,int loopFlag) +{ + ggObjC *object=0; + GhoulID objectSeq=0; + + if (!inst) + { + return 0; + } + + object = game_ghoul.FindObject(inst->GetGhoulObject()); + + //changed this to false, can't cache new seqs in after instances are created --ss + objectSeq = game_ghoul.FindObjectSequence(object,seqname); + + if (inst && objectSeq) + { + if (0 == loopFlag) + { + inst->Play(objectSeq,level.time,0.0f,true,IGhoulInst::Hold); + } + else if (1 == loopFlag) + { + inst->Play(objectSeq,level.time,0.0f,true,IGhoulInst::Loop); + } + else if (2 == loopFlag) + { + inst->Play(objectSeq,level.time,0.0f,true,IGhoulInst::HoldFrame); + } + return objectSeq; + } + return 0; +} + + +void SimpleModelSetOriginRelative(edict_t *original,edict_t *dupe,float addforward,float addright,float addup) +{ + vec3_t holdangles,forward,right; + + VectorCopy(original->s.origin,dupe->s.origin); + VectorCopy(original->s.angles,dupe->s.angles); + dupe->s.origin[2] += addup; + + VectorCopy(original->s.angles, holdangles); + holdangles[1] = original->s.angle_diff; + + AngleVectors(holdangles, forward, right, NULL); + VectorMA(dupe->s.origin, addforward, forward, dupe->s.origin); + VectorMA(dupe->s.origin, addright, right, dupe->s.origin); + +} + +// Boltee is the object being added on +// Bolter is the object the Boltee is being added on to +ggBinstC *SimpleModelAddBolt2(IGhoulInst* pBolterInst,modelSpawnData_t &bolterModelData,char*bolterBoltName, + modelSpawnData_t &bolteeModelData,char *bolteeBoltName,char *skinName) +{ + ggObjC *bolterObj = NULL; + ggObjC *bolteeObj = NULL; + GhoulID bolterBolt = NULL_GhoulID; + GhoulID bolteeBolt = NULL_GhoulID; + GhoulID bolteeSeq = NULL_GhoulID; + ggBinstC *cBolteeBolted = NULL; + ggOinstC *bolterOInstance = NULL; + IGhoulObj* pBolterObj = NULL, *pBolteeObj = NULL; + char* matFile = NULL; + + // is there a material file for the object getting bolted on + if (bolteeModelData.materialfile) + { + matFile = bolteeModelData.materialfile; + } + else if (bolterModelData.materialfile) // how bout for the base object, then? + { + matFile = bolterModelData.materialfile; + } + + bolterObj = game_ghoul.FindObject(pBolterInst->GetGhoulObject()); + + //if a skinname is specified, only register that skin; otherwise register everything + if (skinName&&skinName[0]) + { + bolteeObj = game_ghoul.FindObject(bolteeModelData.dir,bolteeModelData.file, false, skinName);//make sure i have unique object for this skin + if (bolteeObj) + { + bolteeObj->RegisterSkin(matFile, skinName);//actually register the skin. + } + } + else + { + bolteeObj = game_ghoul.FindObject(bolteeModelData.dir,bolteeModelData.file);//registers all skins + } + + if (bolteeObj) + { + bolteeObj->RegistrationLock(); + } + + if (bolterObj && bolteeObj) + { + bolterOInstance = bolterObj->FindOInst(pBolterInst); + pBolterObj = bolterObj->GetMyObject(); + pBolteeObj = bolteeObj->GetMyObject(); + + if (bolterOInstance && pBolterObj && pBolteeObj) + { + bolterBolt = pBolterObj->FindPart(bolterBoltName); + + bolteeSeq = game_ghoul.FindObjectSequence(bolteeObj,bolteeModelData.file); + + bolteeBolt = pBolteeObj->FindPart(bolteeBoltName); + + if (bolterBolt && bolteeBolt && bolteeSeq) + { + cBolteeBolted = bolterOInstance->AddBoltInstance(bolterBolt, bolteeObj, bolteeBolt); + if (cBolteeBolted) + { + if (matFile && skinName) + { + cBolteeBolted->GetInstPtr()->SetFrameOverride(matFile,skinName); + } + + cBolteeBolted->PlaySequence(bolteeSeq,level.time,0.0,true, + IGhoulInst::HoldFrame,false,false); + } + } + else + { + if (!bolterBolt) + gi.dprintf("ERROR: SimpleModelAddBolt - can't find bolt %s!\n", bolterBoltName); + + if (!bolteeBolt) + gi.dprintf("ERROR: SimpleModelAddBolt - can't find bolt %s!\n", bolteeBoltName); + } + } + } + else + { + if (!bolterObj) + gi.dprintf("ERROR: SimpleModelAddBolt - can't find object %s!\n", bolterModelData.file); + + if (!bolteeObj) + gi.dprintf("ERROR: SimpleModelAddBolt - can't find object %s!\n", bolteeModelData.file); + + } + + return(cBolteeBolted); +} + +// +// SimpleModelAddBolt +// +// -bolting an object to an entity +// -Boltee is the object being added on +// -Bolter is the object the Boltee is being added on to +ggBinstC *SimpleModelAddBolt(edict_t *ent,modelSpawnData_t &bolterModelData,char*bolterBoltName, + modelSpawnData_t &bolteeModelData,char *bolteeBoltName,char *skinName) +{ + ggBinstC *newBinst = NULL; + + if (!ent || !ent->ghoulInst) + { + return NULL; + } + + if (ent->objInfo && (newBinst = SimpleModelAddBolt2(ent->ghoulInst, bolterModelData, bolterBoltName, + bolteeModelData, bolteeBoltName, skinName)) ) + { + ent->objInfo->AddBolt(newBinst); + } + return newBinst; +} + +// +// ComplexModelAddBolt +// +// -bolting an object to an existing bolted-on object +// -Boltee is the object being added on +// -Bolter is the object the Boltee is being added on to +ggBinstC *ComplexModelAddBolt(ggBinstC* bInst,modelSpawnData_t &bolterModelData,char*bolterBoltName, + modelSpawnData_t &bolteeModelData,char *bolteeBoltName,char *skinName) +{ + ggObjC *bolterObj = NULL; + ggObjC *bolteeObj = NULL; + GhoulID bolterBolt; + GhoulID bolteeBolt; + GhoulID bolteeSeq; + ggBinstC *cBolteeBolted = NULL; + IGhoulObj* pBolterObj = NULL, *pBolteeObj = NULL; + edict_t *root = NULL; + char* matFile = NULL; + + // is there a material file for the object getting bolted on + if (bolteeModelData.materialfile) + { + matFile = bolteeModelData.materialfile; + } + else if (bolterModelData.materialfile) // how bout for the base object, then? + { + matFile = bolterModelData.materialfile; + } + + if (bInst && bInst->GetInstPtr()) + { + bolterObj = game_ghoul.FindObject(bInst->GetInstPtr()->GetGhoulObject()); + } + + //if a skinname is specified, only register that skin; otherwise register everything + if (skinName&&skinName[0]) + { + bolteeObj = game_ghoul.FindObject(bolteeModelData.dir,bolteeModelData.file, false, skinName);//make sure i have unique object for this skin + if (bolteeObj) + { + bolteeObj->RegisterSkin(matFile, skinName);//actually register the skin. + } + } + else + { + bolteeObj = game_ghoul.FindObject(bolteeModelData.dir,bolteeModelData.file);//registers all skins + } + + if (bolteeObj) + { + bolteeObj->RegistrationLock(); + } + + if (bolterObj && bolteeObj) + { + pBolterObj = bolterObj->GetMyObject(); + pBolteeObj = bolteeObj->GetMyObject(); + + if (pBolterObj && pBolteeObj) + { + bolterBolt = pBolterObj->FindPart(bolterBoltName); + + bolteeSeq = game_ghoul.FindObjectSequence(bolteeObj,bolteeModelData.file); + + bolteeBolt = pBolteeObj->FindPart(bolteeBoltName); + + if (bolterBolt && bolteeBolt && bolteeSeq) + { + cBolteeBolted = bInst->AddBoltInstance(bolterBolt, bolteeObj, bolteeBolt); + if (cBolteeBolted) + { + if (matFile && skinName) + { + cBolteeBolted->GetInstPtr()->SetFrameOverride(matFile,skinName); + } + + cBolteeBolted->PlaySequence(bolteeSeq,level.time,0.0,true, + IGhoulInst::HoldFrame,false,false); + + // add this bolton to our root entity's list of boltons + if ( (root = cBolteeBolted->GetEdict()) && (root->objInfo) ) + { + root->objInfo->AddBolt(cBolteeBolted); + } + else + { + gi.dprintf("ERROR: ComplexModelAddBolt - can't find root edict for %s!\n", bolterBoltName); + } + } + } + else + { + if (!bolterBolt) + gi.dprintf("ERROR: ComplexModelAddBolt - can't find bolt %s!\n", bolterBoltName); + + if (!bolteeBolt) + gi.dprintf("ERROR: SimpleModelAddBolt - can't find bolt %s!\n", bolteeBoltName); + } + } + } + else + { + if (!bolterObj) + gi.dprintf("ERROR: ComplexModelAddBolt - can't find object %s!\n", bolterModelData.file); + + if (!bolteeObj) + gi.dprintf("ERROR: ComplexModelAddBolt - can't find object %s!\n", bolteeModelData.file); + + } + + return(cBolteeBolted); +} + +ggBinstC *SimpleModelFindBolt(edict_t *ent, modelSpawnData_t bolterModelData, char*bolterBoltName) +{ + if (!ent->ghoulInst) + { + return NULL; + } + + ggObjC* bolterObj = game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + GhoulID bolterBolt = 0; + ggOinstC* bolterOInst = NULL; + ggBinstC* boltee = NULL; + IGhoulObj* pBolterObj = NULL; + + if (bolterObj && (pBolterObj = bolterObj->GetMyObject()) ) + { + bolterBolt = pBolterObj->FindPart(bolterBoltName); + if (bolterBolt) + { + bolterOInst = bolterObj->FindOInst(ent->ghoulInst); + if (bolterOInst) + { + boltee = bolterOInst->GetBoltInstance(bolterBolt); + } + else + { + gi.dprintf("ERROR: SimpleModelFindBolt - can't find instance of %s!\n", bolterModelData.file); + } + } + else + { + gi.dprintf("ERROR: SimpleModelFindBolt - can't find bolt %s!\n", bolterBoltName); + } + } + else + { + gi.dprintf("ERROR: SimpleModelFindBolt - can't find object %s!\n", bolterModelData.file); + } + + return boltee; +} + +IGhoulInst* SimpleModelGetBolt(edict_t *ent, int nBolt) +{ + baseObjInfo_c *objInfo = NULL; + + if (objInfo = ent->objInfo) + { + return objInfo->GetBolt(nBolt); + } + return NULL; +} + +bool WithinFOV(edict_t *source, vec3_t target, float halfFOV) +{ + // FIXME + // note: this function essentially duplicated in g_monster.cpp infront. optimize at some point? + // EXCEPT! we are ignoring the z component! + vec3_t forward, vec; + float threshold, dot; + + AngleVectors (source->s.angles, forward, NULL, NULL); + + VectorSubtract (target, source->s.origin, vec); + forward[2] = 0; + VectorNormalize (forward); + vec[2] = 0; + VectorNormalize (vec); + dot = DotProduct (vec, forward); + + threshold = cos (halfFOV * DEGTORAD); + + Com_Printf("Threshold %f Dot %f\n", threshold, dot); + + if (dot < threshold) + { + return false; + } + + return true; +} + +edict_t *SV_TestEntityPosition (edict_t *ent); + +void GrabStuffOnTop (edict_t *self) +{ + edict_t *check, *block; + int e; + vec3_t move; + + + check = g_edicts+1; + for (e = 1; e < globals.num_edicts; e++, check++) + { + if (!check->inuse) + continue; + if (check->movetype == MOVETYPE_PUSH + || check->movetype == MOVETYPE_STOP + || check->movetype == MOVETYPE_NONE + || check->movetype == MOVETYPE_NOCLIP) + continue; + + if (!check->area.prev) + continue; // not linked in anywhere + if (check->groundentity != self) + continue; + // something is on top of me, add my velocity to it + VectorScale(self->velocity, .1, move); + VectorAdd(check->s.origin, move, check->s.origin); + + block = SV_TestEntityPosition (check); + if (!block) + { // pushed ok + gi.linkentity (check); + // impact? + continue; + } + + // if it is ok to leave in the old position, do it + // this is only relevent for riding entities, not pushed + // FIXME: this doesn't acount for rotation + VectorSubtract (check->s.origin, move, check->s.origin); + } +} + + + +// make object flip around when hit +void Obj_painflip (edict_t *ent,edict_t *other,int damage) +{ + vec3_t falldir; + float fVecScale = damage; + float f; + + VectorSubtract(ent->s.origin, other->s.origin, falldir); + VectorNormalize(falldir); + VectorScale(falldir, f = gi.flrand(4.0,10.0) * fVecScale, ent->velocity); + ent->velocity[2] = gi.flrand(4.0,6.0) * fVecScale; // Just a little push up + + ent->avelocity[1] = gi.flrand(4.0,6.0) * fVecScale; +} + +// make object roll around when hit +void Obj_painroll (edict_t *ent,edict_t *other,int damage,int axis) +{ + vec3_t falldir; + + VectorSubtract(ent->s.origin, other->s.origin, falldir); + VectorNormalize(falldir); + VectorScale(falldir, gi.flrand(10.0,15.0) * damage, ent->velocity); + ent->avelocity[axis] = falldir[axis] * 200; +} + + + + + +void Obj_tipoverthink (edict_t *self) +{ + if (self->health <= 0) + { + return; + } + + if ((self->s.angles[0] >= 90) || (self->s.angles[0] <= -90) || + (self->s.angles[2] >= 90) || (self->s.angles[2] <= -90)) + { + if (self->s.angles[0] >= 90) + { + self->s.angles[0] = 90; + } + if (self->s.angles[0] <= -90) + { + self->s.angles[0] = -90; + } + if (self->s.angles[2] >= 90) + { + self->s.angles[2] = 90; + } + if (self->s.angles[2] <= -90) + { + self->s.angles[2] = -90; + } + VectorClear(self->avelocity); + if (self->health < 25) + { + self->nextthink = level.time + .3; + } + else + { + self->nextthink = 0; + } + return; + } + self->avelocity[0] *= 1.6; + self->avelocity[2] *= 1.6; + self->nextthink = level.time + .1; +} + +void Obj_tipover (edict_t *ent, edict_t *other, int damage) +{ + vec3_t falldir; + vec3_t prelimavel; + float angle; + + VectorSubtract(ent->s.origin, other->s.origin, falldir); + VectorNormalize(falldir); + angle = 360 - ent->s.angle_diff; + angle = NormalizeAngle(angle); + angle *= DEGTORAD; + prelimavel[0] = falldir[0] * -70; + prelimavel[2] = falldir[1] * 70; + ent->avelocity[0] = -1*(prelimavel[0] * cos(angle) + prelimavel[2] * sin(angle)); + ent->avelocity[2] = -1*(prelimavel[2] * cos(angle) + prelimavel[0] * -1 * sin(angle)); + VectorScale(falldir, damage*6, ent->velocity); + ent->velocity[2] = 150; + ent->elasticity = .7; + + ent->think = Obj_tipoverthink; + ent->nextthink = level.time + .1; + ent->elasticity = .7; + +} + +void Obj_explode(edict_t *ent,vec3_t *pos,int radiusBurn,int blindingLight) +{ + // Always do the damage BEFORE burning, 'cause those that aren't dead won't burn. + T_RadiusDamage (ent, ent, 100, ent, 100, 0); + if (radiusBurn) + RadiusBurn(ent, 100); + + gmonster.RadiusDeafen(ent, 200, 200); + + fxRunner.exec("weapons/world/airexplode", ent->s.origin); + FX_C4Explosion(ent); + + if(blindingLight) + BlindingLight(*pos, ent->health*10, 0.9, 0.5); + + ShakeCameras (ent->s.origin, 100, 100*2, DEFAULT_JITTER_DELTA); +} + + +void Obj_partbreaksetup (int bpd_enum,modelSpawnData_t *modelData, + objParts_t *objBoltPartsData,objBreak_t *objBreak) +{ + int indextotal,i; + + indextotal = 0; + + // Find proper part index + for (i=0;i< bpd_enum;++i) + { + indextotal += objBreak[i].partCnt; + } + + // Point to first part of object in array + modelData->objBreakData = &objBreak[bpd_enum]; + modelData->objBreakData->boltPartData = &objBoltPartsData[indextotal]; +} + +void Obj_DefaultPain(edict_t *self,int partLost, vec3_t boltPos) +{ + vec3_t debrisNorm; + + // Throw debris and make it go away + VectorClear(debrisNorm); + FX_ThrowDebris(boltPos,debrisNorm, 5, DEBRIS_SM, self->material, 0,0,0, self->surfaceType); + FX_SmokePuff(boltPos,120,120,120,200); +} + +static void FlingNearbyObjects(edict_t *self) +{ + objInfo_c *infoPtr = self->objInfo->GetInfo(OIT_BOLTINST); + edict_t *flingee = NULL; + + if (NULL == infoPtr) + { // nowhere to store information + return; + } + if (infoPtr->head == self) + { // ooh, I've got an idea. let's _not_ go into an infinite loop. + return; + } + while (flingee = infoPtr->head) + { + // flingee is an edict that we need to fling away from self + VectorSubtract(flingee->s.origin, self->s.origin, flingee->velocity); + VectorNormalize(flingee->velocity); + VectorScale(flingee->velocity, gi.flrand(75, 125), flingee->velocity); + flingee->s.angles[YAW] += gi.flrand(-20, 20); + /* + AngleVectors(self->s.angles, flingee->velocity, right, NULL); + VectorScale(flingee->velocity, gi.flrand(-150, 150), flingee->velocity); + VectorMA(flingee->velocity, gi.flrand(-150, 150), right, flingee->velocity); + */ + flingee->velocity[2] += 50; + flingee->s.origin[2] += 15; + // find the next node in the list + if (NULL == flingee->objInfo) + { // next node doesn't have an objInfo + infoPtr->head = NULL; + return; + } + // now that the flingee is no longer touching self, remove it from the list + infoPtr->head = NULL; + infoPtr = flingee->objInfo->GetInfo(OIT_BOLTINST); + } +} + +void Obj_partpain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + + Matrix4 ToWorldNoOrigin; + Vect3 mins,maxs; + vec3_t boltPos; + ggOinstC* myInstance; + ggObjC *MyGhoulObj; + GhoulID bolterBolt; + Matrix4 BoltToEntity; + Matrix4 BoltToWorld; + IGhoulInst *BoltInst = NULL; + int i; + objParts_t *boltPartData; + objParts_t *holdboltPartData; + boltInstInfo_c *info = NULL; + + // Some checks + if (!self->objSpawnData) + return; + if (!self->objSpawnData->objBreakData) + return; + if (!self->objSpawnData->objBreakData->boltPartData) + return; + if ( !self->objInfo || !(info = (boltInstInfo_c*)self->objInfo->GetInfo(OIT_BOLTINST)) ) + { + return; + } + + boltPartData = self->objSpawnData->objBreakData->boltPartData; + + MyGhoulObj=game_ghoul.FindObject(self->ghoulInst->GetGhoulObject()); + myInstance = MyGhoulObj->FindOInst(self->ghoulInst); + + EntToWorldMatrix(self->s.origin,self->s.angles, ToWorldNoOrigin); + ToWorldNoOrigin.SetRow(3,Vect3(0.0f,0.0f,0.0f)); + ToWorldNoOrigin.CalcFlags(); + + holdboltPartData = self->objSpawnData->objBreakData->boltPartData; + + // Loop through all parts bolted to this object + for(i=0;iobjSpawnData->objBreakData->partCnt;++i,++boltPartData,++holdboltPartData) + { + BoltInst = SimpleModelGetBolt(self, holdboltPartData->partnum); + + if (!BoltInst || !info->IsOn(holdboltPartData->partnum)) // This part is already gone + continue; + + bolterBolt = MyGhoulObj->GetMyObject()->FindPart(boltPartData->partnull); + + self->ghoulInst->GetBoltMatrix(level.time,BoltToEntity,bolterBolt, + IGhoulInst::MatrixType::Entity); + + BoltToEntity.SetRow(3,Vect3(0.0f,0.0f,0.0f)); + BoltToEntity.CalcFlags(); + BoltToWorld.Concat(BoltToEntity,ToWorldNoOrigin); + + // Get part bounding box + BoltInst->GetBoundBox(level.time,BoltToWorld,mins,maxs); + + GetGhoulPosDir(self->s.origin, self->s.angles, self->ghoulInst, + NULL, boltPartData->partnull, boltPos, NULL, NULL, NULL); + + // Get bolted part's bounding box (extend it by 2 pixels for any minor discrepancies) + Vec3AddAssign(boltPos,*(vec3_t*)(&mins)); + mins[0] -= 2; + mins[1] -= 2; + mins[2] -= 2; + + Vec3AddAssign(boltPos,*(vec3_t*)(&maxs)); + maxs[0] += 2; + maxs[1] += 2; + maxs[2] += 2; + + // Is it a hit + if ((wherehit[2] >= mins[2]) && (wherehit[2] <= maxs[2])) + { + + if ((wherehit[1] >= mins[1]) && (wherehit[1] <= maxs[1])) + { + + if ((wherehit[0] >= mins[0]) && (wherehit[0] <= maxs[0])) + { + //myInstance->RemoveBoltInstance(BoltInst); + SimpleModelTurnOnOff(BoltInst, false); + info->TurnOff(holdboltPartData->partnum); + + // Does this part have a pain function??? + if (boltPartData->pain) + { + boltPartData->pain(self,boltPartData->partnum, boltPos); + } + else + { + Obj_DefaultPain(self, boltPartData->partnum, boltPos); + } + + break; // Found a piece to blow up, no need to look further + } + } + } + } + // if we have any objects stored off of our head ptr, that hopefully means they + //were put there because we need to move them when this edict gets hurt. like, say, + //if there are things sitting on a table + FlingNearbyObjects(self); + +} + + + + +void Obj_partkill (edict_t *self,int boltNum,int debrisFlag) +{ + + Matrix4 ToWorldNoOrigin; + Vect3 mins,maxs; + vec3_t boltPos; + ggOinstC* myInstance = NULL; + ggObjC *MyGhoulObj = NULL; + Matrix4 BoltToEntity; + Matrix4 BoltToWorld; + objParts_t *boltPartData; + IGhoulInst *BoltInst = NULL; + boltInstInfo_c *info = NULL; + vec3_t debrisNorm; + + if ( !self->objInfo || !(info = (boltInstInfo_c*)self->objInfo->GetInfo(OIT_BOLTINST)) ) + { + return; + } + + if ( !(BoltInst = SimpleModelGetBolt(self, boltNum)) ) + { + return; + } + + // Some checks + if (!self->objSpawnData) + return; + if (!self->objSpawnData->objBreakData) + return; + if (!self->objSpawnData->objBreakData->boltPartData) + return; + if (!self->ghoulInst) + { + return; + } + + boltPartData = self->objSpawnData->objBreakData->boltPartData; + + MyGhoulObj=game_ghoul.FindObject(self->ghoulInst->GetGhoulObject()); + if (MyGhoulObj) + { + myInstance = MyGhoulObj->FindOInst(self->ghoulInst); + } + + GetGhoulPosDir(self->s.origin, self->s.angles, BoltInst, + NULL, boltPartData->partnull, boltPos, NULL, NULL, NULL); + + // Throw debris and make it go away + if (debrisFlag) + { + VectorClear(debrisNorm); + FX_ThrowDebris(boltPos,debrisNorm, 5, DEBRIS_SM, self->material, 0,0,0, self->surfaceType); + FX_SmokePuff(boltPos,120,120,120,200); + } + + if (myInstance) + { + //myInstance->RemoveBoltInstance(BoltInst); + SimpleModelTurnOnOff(BoltInst, false); + info->TurnOff(boltNum); + } +} + +boltonOrientation_c::boltonOrientation_c() +{ + root = NULL; + boltonInst = NULL; + boltonID = 0; + parentInst = NULL; + parentID = 0; + VectorClear(vTarget); + fMinPitch = 0; + fMaxPitch = 0; + fMinYaw = 0; + fMaxYaw = 0; + fMaxTurnSpeed = 0; + fRetPitch = 0; + fRetYaw = 0; + bUsePitch = false; + bUseYaw = false; + bToRoot = true; +} + +// OrientBolton will pitch and/or yaw a bolton of a ghoulInst, limiting the rotation +//speed and bolton's orientation with respect to its parent +boltonOrientation_c::retCode_e boltonOrientation_c::OrientBolton() +{ + retCode_e bRet = ret_TRUE; + + if (!root || !root->ghoulInst || (!bUseYaw && !bUsePitch) || !parentInst) + { + return ret_ERROR; + } + + Matrix4 EntityToWorld, BoltToEntity, BoltToWorld, WorldToBolt, + ParentToEntity, ParentToWorld, WorldToParent; + Matrix4 matOld, matR1, matR2, matTemp, matNew; + float angle1 = 0, angle2 = 0; + float fOldAngle1 = 0, fOldAngle2 = 0, parentAng1 = 0, parentAng2 = 0, + boltToParentAng1 = 0, boltToParentAng2 = 0; + float fMin1 = fMinYaw, fMax1 = fMaxYaw, fMin2 = fMinPitch, fMax2 = fMaxPitch; + float fDelta1 = 0.0f, fDelta2 = 0.0f; + Vect3 vTemp, vBoltPos, vParentPos, TargetPos, TargetPosInBoltSpace, TargetPosInParentSpace; + float XZ = 0, XY = 0; + IGhoulInst* parent = boltonInst->GetParent(); + + EntToWorldMatrix(root->s.origin,root->s.angles,EntityToWorld); + boltonInst->GetBoltMatrix(level.time,BoltToEntity,boltonID, + IGhoulInst::MatrixType::Entity, bToRoot); + BoltToWorld.Concat(BoltToEntity,EntityToWorld); + WorldToBolt.Inverse(BoltToWorld); + TargetPos = *(Vect3*)vTarget; + GetAngles(TargetPos, WorldToBolt, angle1, angle2); + + // need to know the bolt's parent's relationship to the world so we can + //properly limit the range of motion of the bolt + if (parent != root->ghoulInst) + { + parentInst->GetBoltMatrix(level.time, ParentToEntity, parentID, + IGhoulInst::MatrixType::Entity, true); + ParentToWorld.Concat(ParentToEntity, EntityToWorld); + } + else + { + ParentToWorld = EntityToWorld; + } + // need to know the bolt's relationship to its parent so we can properly + //limit the range of motion + BoltToWorld.GetRow(0, vTemp); + BoltToWorld.GetRow(3, vBoltPos); + WorldToParent.Inverse(ParentToWorld); + // to prevent pitch weirdness account for disparity in height of bolt origin and parent origin + ParentToWorld.GetRow(3, vParentPos); + vBoltPos.Set(vBoltPos.x(), vBoltPos.y(), vParentPos.z()); + vTemp *= 100; // make sure minor floating point issues don't spooj our calculations + vTemp += vBoltPos; + GetAngles(vTemp, WorldToParent, boltToParentAng1, boltToParentAng2); + //limit the angles here with respect to the parent + + GetAngles(TargetPos, WorldToParent, parentAng1, parentAng2); + + // ensure the traversal is in the shortest direction + if (parentAng1 > M_PI) + { + parentAng1 = -(2*M_PI - parentAng1); + } + else if (parentAng1 < -M_PI) + { + parentAng1 = 2*M_PI + parentAng1; + } + if (parentAng2 > M_PI) + { + parentAng2 = -(2*M_PI - parentAng2); + } + else if (parentAng2 < -M_PI) + { + parentAng2 = 2*M_PI + parentAng2; + } + if (boltToParentAng1 > M_PI) + { + boltToParentAng1 = -(2*M_PI - boltToParentAng1); + } + else if (boltToParentAng1 < -M_PI) + { + boltToParentAng1 = 2*M_PI + boltToParentAng1; + } + if (boltToParentAng2 > M_PI) + { + boltToParentAng2 = -(2*M_PI - boltToParentAng2); + } + else if (boltToParentAng2 < -M_PI) + { + boltToParentAng2 = 2*M_PI + boltToParentAng2; + } + + if ((parentAng1 < fMin1 - FLOAT_ZERO_EPSILON) && (bUseYaw)) + { + // the angle we've been told to reach is outside our limit, so set the angle to our limit + bRet = ret_ERROR; + angle1 = fMin1 - boltToParentAng1; + } + else if ((parentAng1 > fMax1 + FLOAT_ZERO_EPSILON) && (bUseYaw)) + { + // the angle we've been told to reach is outside our limit, so set the angle to our limit + bRet = ret_ERROR; + angle1 = fMax1 - boltToParentAng1; + } + if ((parentAng2 < fMin2 - FLOAT_ZERO_EPSILON) && (bUsePitch)) + { + // the angle we've been told to reach is outside our limit, so set the angle to our limit + bRet = ret_ERROR; + angle2 = fMin2 - boltToParentAng2; + } + else if ((parentAng2 > fMax2 + FLOAT_ZERO_EPSILON) && (bUsePitch)) + { + // the angle we've been told to reach is outside our limit, so set the angle to our limit + bRet = ret_ERROR; + angle2 = fMax2 - boltToParentAng2; + } + + boltonInst->GetXForm(matOld); + + fDelta1 = ((angle1 > 0.01) || (angle1 < -0.01))?angle1:0; + fDelta2 = ((angle2 > 0.01) || (angle2 < -0.01))?angle2:0; + + if ((fDelta1 > fMaxTurnSpeed) && (bUseYaw)) + { + fDelta1 = fMaxTurnSpeed; + // our max turning speed has clamped our motion + //angle1 = fDelta1 + fOldAngle1; + bRet = ret_FALSE; + } + else if ((fDelta1 < -fMaxTurnSpeed) && (bUseYaw)) + { + fDelta1 = -fMaxTurnSpeed; + // our max turning speed has clamped our motion + //angle1 = fDelta1 + fOldAngle1; + bRet = ret_FALSE; + } + if ((fDelta2 > fMaxTurnSpeed) && (bUsePitch)) + { + fDelta2 = fMaxTurnSpeed; + // our max turning speed has clamped our motion + //angle2 = fDelta2 + fOldAngle2; + bRet = ret_FALSE; + } + else if ((fDelta2 < -fMaxTurnSpeed) && (bUsePitch)) + { + fDelta2 = -fMaxTurnSpeed; + // our max turning speed has clamped our motion + //angle2 = fDelta2 + fOldAngle2; + bRet = ret_FALSE; + } + + // if we're outside of our limit, return to our limit + if ((boltToParentAng1 - fMax1) > 0.0001) + { + fDelta1 = ((boltToParentAng1 - fMax1)>fMaxTurnSpeed)?-fMaxTurnSpeed:(fMax1 - boltToParentAng1); + } + else if ((fMin1 - boltToParentAng1) > 0.0001) + { + fDelta1 = ((fMin1 - boltToParentAng1)>fMaxTurnSpeed)?fMaxTurnSpeed:(fMin1 - boltToParentAng1); + } + if ((boltToParentAng2 - fMax2) > 0.0001) + { + fDelta2 = ((boltToParentAng2 - fMax2)>fMaxTurnSpeed)?-fMaxTurnSpeed:(fMax2 - boltToParentAng2); + } + else if ((fMin2 - boltToParentAng2) > 0.0001) + { + fDelta2 = ((fMin2 - boltToParentAng2)>fMaxTurnSpeed)?fMaxTurnSpeed:(fMin2 - boltToParentAng2); + } + if (!bUseYaw) + { + fDelta1 = angle1 = 0; + } + if (!bUsePitch) + { + fDelta2 = angle2 = 0; + } + // set our return values + fRetYaw = boltToParentAng1 + fDelta1; + fRetPitch = boltToParentAng2 + fDelta2; + + if (fDelta1 < 0.001 && fDelta1 > -0.001 && + fDelta2 < 0.001 && fDelta2 > -0.001) + { + // if our current return code is an error, we're at the limit of our motion. if + //it's not an error, we've reached our destination + if (bRet != ret_ERROR) + { + bRet = ret_TRUE; + } + } + matR1.Rotate(1, fDelta2); + matR2.Rotate(2, fDelta1); + matTemp.Concat(matR1, matOld); + matNew.Concat(matR2, matTemp); + boltonInst->SetXForm(matNew); + return bRet; +} + +// OrientInst will pitch/yaw an entity, limiting its rotation speed and orientation +//with respect to the world +boltonOrientation_c::retCode_e boltonOrientation_c::OrientEnt() +{ + boltonOrientation_c::retCode_e bRet = ret_TRUE; + + if (!root || !root->ghoulInst || (!bUseYaw && !bUsePitch)) + { + return ret_ERROR; + } + + Matrix4 EntityToWorld, WorldToEntity, WorldToParent; + float angle1 = 0, angle2 = 0, boltToParentAng1 = 0, boltToParentAng2 = 0, + parentAng1 = 0, parentAng2 = 0; + float fOldAngle1 = 0, fOldAngle2 = 0; + float fMin1 = fMinYaw, fMax1 = fMaxYaw, fMin2 = fMinPitch, fMax2 = fMaxPitch; + float fDelta1 = 0.0f, fDelta2 = 0.0f; + Vect3 TargetPos; + float XZ = 0, XY = 0; + bool bOldUsePitch = bUsePitch, bOldUseYaw = bUseYaw; + + EntToWorldMatrix(root->s.origin,root->s.angles,EntityToWorld); + TargetPos = *(Vect3*)vTarget; + WorldToEntity.Inverse(EntityToWorld); + GetAngles(TargetPos, WorldToEntity, angle1, angle2); + + // our "parent" is actually the absolute world axes at the location of the entity + WorldToParent.Translate(-root->s.origin[0],-root->s.origin[1],-root->s.origin[2]); + GetAngles(TargetPos, WorldToParent, parentAng1, parentAng2); + + boltToParentAng1 = -DEGTORAD*root->s.angles[YAW]; + boltToParentAng2 = -DEGTORAD*root->s.angles[PITCH]; + + // ensure the traversal is in the shortest direction + if (parentAng1 > M_PI) + { + parentAng1 = -(2*M_PI - parentAng1); + } + else if (parentAng1 < -M_PI) + { + parentAng1 = 2*M_PI + parentAng1; + } + if (parentAng2 > M_PI) + { + parentAng2 = -(2*M_PI - parentAng2); + } + else if (parentAng2 < -M_PI) + { + parentAng2 = 2*M_PI + parentAng2; + } + + if ((parentAng1 < fMin1 - FLOAT_ZERO_EPSILON) && (bUseYaw)) + { + // the angle we've been told to reach is outside our limit, so set the angle to our limit + bRet = ret_ERROR; + angle1 = fMin1 - boltToParentAng1; + } + else if ((parentAng1 > fMax1 + FLOAT_ZERO_EPSILON) && (bUseYaw)) + { + // the angle we've been told to reach is outside our limit, so set the angle to our limit + bRet = ret_ERROR; + angle1 = fMax1 - boltToParentAng1; + } + if ((parentAng2 < fMin2 - FLOAT_ZERO_EPSILON) && (bUsePitch)) + { + // the angle we've been told to reach is outside our limit, so set the angle to our limit + bRet = ret_ERROR; + angle2 = fMin2 - boltToParentAng2; + } + else if ((parentAng2 > fMax2 + FLOAT_ZERO_EPSILON) && (bUsePitch)) + { + // the angle we've been told to reach is outside our limit, so set the angle to our limit + bRet = ret_ERROR; + angle2 = fMax2 - boltToParentAng2; + } + + + fOldAngle1 = boltToParentAng1; + fOldAngle2 = boltToParentAng2; + fDelta1 = angle1; + fDelta2 = angle2; + + if ((fDelta1 > fMaxTurnSpeed) && (bUseYaw)) + { + fDelta1 = fMaxTurnSpeed; + // our max turning speed has clamped our motion + bRet = ret_FALSE; + } + else if ((fDelta1 < -fMaxTurnSpeed) && (bUseYaw)) + { + fDelta1 = -fMaxTurnSpeed; + // our max turning speed has clamped our motion + bRet = ret_FALSE; + } + if ((fDelta2 > fMaxTurnSpeed) && (bUsePitch)) + { + fDelta2 = fMaxTurnSpeed; + // our max turning speed has clamped our motion + bRet = ret_FALSE; + } + else if ((fDelta2 < -fMaxTurnSpeed) && (bUsePitch)) + { + fDelta2 = -fMaxTurnSpeed; + // our max turning speed has clamped our motion + bRet = ret_FALSE; + } + + if (bUseYaw) + { + angle1 = fDelta1 + fOldAngle1; + root->s.angles[YAW] = -angle1*RADTODEG; + } + if (bUsePitch) + { + angle2 = fDelta2 + fOldAngle2; + root->s.angles[PITCH] = -angle2*RADTODEG; + } + return bRet; +} + +void boltonOrientation_c::GetAngles(Vect3 &pos, Matrix4 &mat, float &angle1, float &angle2) +{ + Vect3 posInMatrixSpace; + + mat.XFormPoint(posInMatrixSpace,pos); + angle1 = -atan2(posInMatrixSpace.y(), posInMatrixSpace.x()); + angle2 = atan2(posInMatrixSpace.z(), sqrt(posInMatrixSpace.y()*posInMatrixSpace.y()+posInMatrixSpace.x()*posInMatrixSpace.x())); +} + +// think function for applying the flipping velocity to an object +void ObjFlippingThink(edict_t *self) +{ + objInfo_c *pHdr = NULL; + objFlipInfo_c *pFlip = NULL; + + // give the object a rotational velocity in the proper direction + if (self && self->objInfo && (pFlip = (objFlipInfo_c*)self->objInfo->GetInfo(OIT_FLIP)) ) + { + if (pFlip->Update()) + { + // finished rotating + if (self->think = pFlip->lastThinkFn) + { + self->nextthink = level.time + FRAMETIME; + } + // get rid of the objFlipInfo_c we created in FlipObject() + pFlip->Destroy(); + } + else + { + // not finished rotating yet + self->nextthink = level.time + FRAMETIME; + } + } +} + +// rotate an object 90 degrees (if possible). used for flipping tables over for cover, +//knocking over barrels, etc. +void FlipObject(edict_t *ent,edict_t *pusher, edict_t *activator) +{ + vec3_t fwd, right, vEnd = {0,0,0}, vPush; + float checkDist = 0, fDot = 0; + trace_t trace; + vec3_t vTemp; + objFlipInfo_c *newFlip = NULL; + + if ( !ent->objInfo || !(newFlip = (objFlipInfo_c*)ent->objInfo->GetInfo(OIT_FLIP)) ) + { + // bad + return; + } + // set the current ground level underneath our object + newFlip->ground = ent->s.origin[2] + ent->mins[2]; + VectorSet(vTemp, ent->s.origin[0], ent->s.origin[1], newFlip->ground); + VectorCopy(ent->s.angles, newFlip->preFlipAngles); + // determine which direction we're trying to push the object + AngleVectors(ent->s.angles,fwd,right,NULL); + VectorSubtract(ent->s.origin, pusher->s.origin, vPush); + vPush[2] = 0; + VectorNormalize(vPush); // ouch + if ( ((fDot = DotProduct(fwd, vPush)) > .707f) || + (fDot < -.707f) ) + { + // want either the forward or backward vector of the pushed object. either way, the + //new height of the object is the oldmaxs[0] - oldmins[0] + checkDist = ent->maxs[0] - ent->mins[0]; + // is there enough vertical space to flip the object? + VectorMA(vTemp, checkDist, vec3_up, vEnd); + gi.trace (vTemp, NULL, NULL, vEnd, ent, CONTENTS_SOLID, &trace); + if (trace.fraction < 1.0f) + { + // there isn't enough overhead clearance so don't flip + ent->objInfo->ResetInfo(OIT_FLIP); + return; + } + if (fDot < 0.0) + { + // pushing in the direction of the backward vector + // can we move the object in the direction of the push? + checkDist = ent->maxs[2] - ent->mins[2]; + VectorMA(ent->s.origin, -checkDist, fwd, vEnd); + gi.trace (ent->s.origin, NULL, NULL, vEnd, ent, CONTENTS_SOLID, &trace); + if (trace.fraction < 1.0f) + { + // there isn't forward clearance so don't flip + ent->objInfo->ResetInfo(OIT_FLIP); + return; + } + // begin flipping the object backward + newFlip->dir = objFlipInfo_c::flipDir_e::FLIPDIR_B; + VectorNegate(fwd, newFlip->fwd); + newFlip->radius = sqrt(ent->mins[0]*ent->mins[0] + ent->mins[2]*ent->mins[2]); + VectorMA(vTemp, -ent->mins[0], newFlip->fwd, newFlip->flipOrigin); + newFlip->initRadiusAng = 90 + (RADTODEG*atan2(-ent->mins[0], -ent->mins[2])); // atan(x/y) + newFlip->lastThinkFn = ent->think; + } + else + { + // pushing in the direction of the forward vector + // can we move the object in the direction of the push? + checkDist = ent->maxs[2] - ent->mins[2]; + VectorMA(ent->s.origin, checkDist, fwd, vEnd); + gi.trace (ent->s.origin, NULL, NULL, vEnd, ent, CONTENTS_SOLID, &trace); + if (trace.fraction < 1.0f) + { + // there isn't forward clearance so don't flip + ent->objInfo->ResetInfo(OIT_FLIP); + return; + } + // begin flipping the object forward + newFlip->dir = objFlipInfo_c::flipDir_e::FLIPDIR_F; + VectorCopy(fwd, newFlip->fwd); + newFlip->radius = sqrt(ent->maxs[0]*ent->maxs[0] + ent->mins[2]*ent->mins[2]); + VectorMA(vTemp, ent->maxs[0], newFlip->fwd, newFlip->flipOrigin); + newFlip->initRadiusAng = 90 + (RADTODEG*atan2(ent->maxs[0], -ent->mins[2])); // atan(x/y) + newFlip->lastThinkFn = ent->think; + } + } + else + { + // want either the right or left vector of the pushed object. either way, the + //new height of the object is the oldmaxs[1] - oldmins[1] + checkDist = ent->maxs[1] - ent->mins[1]; + // is there enough vertical space to flip the object? + VectorMA(vTemp, checkDist, vec3_up, vEnd); + gi.trace (vTemp, NULL, NULL, vEnd, ent, CONTENTS_SOLID, &trace); + if (trace.fraction < 1.0f) + { + // there isn't enough overhead clearance so don't flip + ent->objInfo->ResetInfo(OIT_FLIP); + return; + } + if ( (fDot = DotProduct(right, vPush)) < 0.0 ) + { + // pushing in the direction of the left vector + // can we move the object in the direction of the push? + checkDist = ent->maxs[2] - ent->mins[2]; + VectorMA(ent->s.origin, -checkDist, right, vEnd); + gi.trace (ent->s.origin, NULL, NULL, vEnd, ent, CONTENTS_SOLID, &trace); + if (trace.fraction < 1.0f) + { + // there isn't forward clearance so don't flip + ent->objInfo->ResetInfo(OIT_FLIP); + return; + } + // begin flipping the object to the left + newFlip->dir = objFlipInfo_c::flipDir_e::FLIPDIR_L; + VectorNegate(right, newFlip->fwd); + newFlip->radius = sqrt(ent->mins[1]*ent->mins[1] + ent->mins[2]*ent->mins[2]); + VectorMA(vTemp, -ent->mins[1], newFlip->fwd, newFlip->flipOrigin); + newFlip->initRadiusAng = 90 + (RADTODEG*atan2(-ent->mins[1], -ent->mins[2])); // atan(x/y) + newFlip->lastThinkFn = ent->think; + } + else + { + // pushing in the direction of the right vector + // can we move the object in the direction of the push? + checkDist = ent->maxs[2] - ent->mins[2]; + VectorMA(ent->s.origin, checkDist, right, vEnd); + gi.trace (ent->s.origin, NULL, NULL, vEnd, ent, CONTENTS_SOLID, &trace); + if (trace.fraction < 1.0f) + { + // there isn't forward clearance so don't flip + ent->objInfo->ResetInfo(OIT_FLIP); + return; + } + // begin flipping the object to the right + newFlip->dir = objFlipInfo_c::flipDir_e::FLIPDIR_R; + VectorCopy(right, newFlip->fwd); + newFlip->radius = sqrt(ent->maxs[1]*ent->maxs[1] + ent->mins[2]*ent->mins[2]); + VectorMA(vTemp, ent->maxs[1], newFlip->fwd, newFlip->flipOrigin); + newFlip->initRadiusAng = 90 + (RADTODEG*atan2(ent->maxs[1], -ent->mins[2])); // atan(x/y) + newFlip->lastThinkFn = ent->think; + } + } + // once an object is flipped, don't let the player try to flip it again + ent->plUse = NULL; + ent->think = ObjFlippingThink; + ent->nextthink = level.time + FRAMETIME; +} + +// +// boltInstInfo_c stuff +// + + +boltInstInfo_c::boltInstInfo_c(boltInstInfo_c *orig) +: objInfo_c(orig) +{ + onOff = orig->onOff; + nNum = orig->nNum; + nMax = orig->nMax; +} + +void boltInstInfo_c::Evaluate(boltInstInfo_c *orig) +{ + onOff = orig->onOff; + nNum = orig->nNum; + nMax = orig->nMax; + + objInfo_c::Evaluate(orig); +} + +boltInstInfo_c::~boltInstInfo_c() +{ + onOff = 0; +} + +bool boltInstInfo_c::AddBolt(bool bOn /*true*/) +{ + if (nNum < nMax) + { + nNum++; + if (bOn) + { + TurnOn(nNum); + } + else + { + TurnOff(nNum); + } + return true; + } + return false; +} + +void boltInstInfo_c::Destroy() +{ + Reset(); +} + +void boltInstInfo_c::Reset() +{ + head = NULL; + nInfoType = OIT_BOLTINST; + onOff = 0; + nNum = 0; + nMax = MAX_BOLTINSTINFO; +} + +// +// baseObjInfo_c stuff +// + +baseObjInfo_c::~baseObjInfo_c() +{ + // because the elems of this list are ggBinstC's, gameghoul will (hopefully) + //free the objects themselves. we should only have to free the list space here. + bolts.erase(bolts.begin(), bolts.end()); +} + +IGhoulInst* baseObjInfo_c::GetBolt(int nBolt) +{ + // every place in the project _except_in_here_, bolt indices are 1-indexed. argh. + gg_binst_c_ptr binst; + + if (nBolt <= bolts.size() && nBolt > 0) + { + binst = bolts[nBolt-1]; + if ((ggBinstC*)binst) + { + return ((ggBinstC*)binst)->GetInstPtr(); + } + } + return NULL; +} + +objInfo_c* baseObjInfo_c::GetInfo(int nType) +{ + switch(nType) + { + case OIT_BOLTINST: + { + return (objInfo_c*)&boltInstInfo; + break; + } + case OIT_FLIP: + { + return (objInfo_c*)&flipInfo; + break; + } + } + return NULL; +} + +bool baseObjInfo_c::AddBolt(ggBinstC *newBolt) +{ + boltInstInfo_c* instInfo = NULL; + + if (newBolt) + { + instInfo = (boltInstInfo_c*)GetInfo(OIT_BOLTINST); + instInfo->AddBolt(); + bolts.push_back((gg_binst_c_ptr)newBolt); + return true; + } + return false; +} + +void baseObjInfo_c::ResetInfo(int nType) +{ + switch(nType) + { + case OIT_BOLTINST: + { + boltInstInfo.Reset(); + break; + } + case OIT_FLIP: + { + flipInfo.Reset(); + break; + } + default: // no clue what type we're talking about + { + break; + } + } +} + +baseObjInfo_c::baseObjInfo_c(baseObjInfo_c *orig) +{ + boltInstInfo_c *bii; + objFlipInfo_c *ofi; + + *(int *)&owner = GetEdictNum(orig->owner); + + bii = new boltInstInfo_c(&orig->boltInstInfo); + boltInstInfo = *bii; + delete bii; + + ofi = new objFlipInfo_c(&orig->flipInfo); + flipInfo = *ofi; + delete ofi; +} + +void baseObjInfo_c::Evaluate(baseObjInfo_c *orig) +{ + owner = GetEdictPtr((int)orig->owner); + boltInstInfo.Evaluate(&orig->boltInstInfo); + flipInfo.Evaluate(&orig->flipInfo); +} + +void baseObjInfo_c::Read(void) +{ + char loaded[sizeof(baseObjInfo_c)]; + int count, i; + int *index_list; + + gi.ReadFromSavegame('EDOI', loaded + BOI_SAVE_START, sizeof(baseObjInfo_c) - BOI_SAVE_START); + Evaluate((baseObjInfo_c *)loaded); + + owner->objInfo = this; + + gi.ReadFromSavegame('EDBN', &count, sizeof(count)); + if(count) + { + index_list = new int [count]; + gi.ReadFromSavegame('EDBL', index_list, count * sizeof(int)); + for(i = 0; i < count; i++) + { + bolts.push_back(binstL.GetPointerFromIndex(index_list[i])); + } + delete [] index_list; + } +} + +void baseObjInfo_c::Write(void) +{ + baseObjInfo_c *savable; + byte *save_start; + int count, i; + vector::iterator it; + int *index_list; + + savable = new baseObjInfo_c(this); + save_start = (byte *)savable; + gi.AppendToSavegame('EDOI', save_start + BOI_SAVE_START, sizeof(*this) - BOI_SAVE_START); + delete savable; + + count = bolts.size(); + gi.AppendToSavegame('EDBN', &count, sizeof(count)); + + if(count) + { + index_list = new int [count]; + for(it = bolts.begin(), i = 0; it != bolts.end(); it++, i++) + { + index_list[i] = (*it).GetIndex(); + } + gi.AppendToSavegame('EDBL', index_list, count * sizeof(int)); + delete [] index_list; + } +} + +// +// objInfo_c stuff +// + +void objInfo_c::Evaluate(objInfo_c *orig) +{ + nInfoType = orig->nInfoType; + head = GetEdictPtr((int)orig->head); +} + +objInfo_c::objInfo_c(objInfo_c *orig) +{ + nInfoType = orig->nInfoType; + *(int *)&head = GetEdictNum(orig->head); +} + +void objInfo_c::Destroy() +{ + switch(nInfoType) + { + case OIT_BOLTINST: + { + ((boltInstInfo_c*)this)->Destroy(); + break; + } + case OIT_FLIP: + { + ((objFlipInfo_c*)this)->Destroy(); + break; + } + default: // no clue what type we're talking about + { + delete this; + break; + } + } +} + +// +// objFlipInfo_c stuff +// + +objFlipInfo_c::objFlipInfo_c(objFlipInfo_c *orig) +: objInfo_c(orig) +{ + dir = orig->dir; + startTime = orig->startTime; + ground = orig->ground; + radius = orig->radius; + initRadiusAng = orig->initRadiusAng; + VectorCopy(orig->preFlipAngles, preFlipAngles); + VectorCopy(orig->flipOrigin, flipOrigin); + VectorCopy(orig->fwd, fwd); + *(int *)&lastThinkFn = GetThinkNum(orig->lastThinkFn); +} + +void objFlipInfo_c::Evaluate(objFlipInfo_c *orig) +{ + dir = orig->dir; + startTime = orig->startTime; + ground = orig->ground; + radius = orig->radius; + initRadiusAng = orig->initRadiusAng; + VectorCopy(orig->preFlipAngles, preFlipAngles); + VectorCopy(orig->flipOrigin, flipOrigin); + VectorCopy(orig->fwd, fwd); + lastThinkFn = (void (*)(edict_t *self))GetThinkPtr((int)orig->lastThinkFn); + + objInfo_c::Evaluate(orig); +} + +objFlipInfo_c::objFlipInfo_c(edict_t *ent) +: objInfo_c(ent) +{ + nInfoType = OIT_FLIP; + dir = FLIPDIR_UNK; + lastThinkFn = NULL; + VectorClear(preFlipAngles); + VectorClear(fwd); + VectorClear(flipOrigin); + ground = 0; + radius = 0; + initRadiusAng = 0; + startTime = level.time; +} + +void objFlipInfo_c::Destroy() +{ + Reset(); +} + +void objFlipInfo_c::Reset() +{ + head = NULL; + nInfoType = OIT_FLIP; + dir = FLIPDIR_UNK; + lastThinkFn = NULL; + VectorClear(preFlipAngles); + VectorClear(fwd); + VectorClear(flipOrigin); + ground = 0; + radius = 0; + initRadiusAng = 0; + startTime = level.time; +} + +bool objFlipInfo_c::Update() +{ + float fInitVel = 30, // gotta be higher than 12 to overcome friction + fDelta = 0; + bool bStop = false; + vec3_t vTemp; + + if (head) + { + switch(dir) + { + case flipDir_e::FLIPDIR_F: // pitch 90deg + { + // if we don't yet have a rotational velocity, start one + if (0 == head->avelocity[PITCH]) + { + head->avelocity[PITCH] = fInitVel; + } + else // we're already rotating. when do we stop? + { + if ( (fDelta = (head->s.angles[PITCH] - preFlipAngles[PITCH])) > 85) + { + // stop the rotation + head->avelocity[PITCH] = 0; + head->s.angles[PITCH] = preFlipAngles[PITCH] + 90; + // make sure the object is placed properly + VectorMA(flipOrigin, -head->mins[2], fwd, vTemp); + VectorMA(vTemp, head->maxs[0], vec3_up, head->s.origin); + bStop = true; + } + else + { // accelerate our rotation a little bit + head->avelocity[PITCH] += fInitVel; + } + } + break; + } + case flipDir_e::FLIPDIR_B: // pitch 270deg + { + // if we don't yet have a rotational velocity, start one + if (0 == head->avelocity[PITCH]) + { + head->avelocity[PITCH] = -fInitVel; + } + else // we're already rotating. when do we stop? + { + if ( (fDelta = (preFlipAngles[PITCH] - head->s.angles[PITCH])) > 85) + { + // stop the rotation + head->avelocity[PITCH] = 0; + head->s.angles[PITCH] = preFlipAngles[PITCH] - 90; + // make sure the object is placed properly + VectorMA(flipOrigin, -head->mins[2], fwd, vTemp); + VectorMA(vTemp, -head->mins[0], vec3_up, head->s.origin); + bStop = true; + } + else + { // accelerate our rotation a little bit + head->avelocity[PITCH] -= fInitVel; + } + } + break; + } + case flipDir_e::FLIPDIR_L: // roll 270deg + { + // if we don't yet have a rotational velocity, start one + if (0 == head->avelocity[ROLL]) + { + head->avelocity[ROLL] = -fInitVel; + } + else // we're already rotating. when do we stop? + { + if ( (fDelta = (preFlipAngles[ROLL] - head->s.angles[ROLL])) > 85) + { + // stop the rotation + head->avelocity[ROLL] = 0; + head->s.angles[ROLL] = preFlipAngles[ROLL] - 90; + // make sure the object is placed properly + VectorMA(flipOrigin, -head->mins[2], fwd, vTemp); + VectorMA(vTemp, head->maxs[1], vec3_up, head->s.origin); + bStop = true; + } + else + { // accelerate our rotation a little bit + head->avelocity[ROLL] -= fInitVel; + } + } + break; + } + case flipDir_e::FLIPDIR_R: // roll 90deg + { + // if we don't yet have a rotational velocity, start one + if (0 == head->avelocity[ROLL]) + { + head->avelocity[ROLL] = fInitVel; + } + else // we're already rotating. when do we stop? + { + if ( (fDelta = (head->s.angles[ROLL] - preFlipAngles[ROLL])) > 85) + { + // stop the rotation + head->avelocity[ROLL] = 0; + head->s.angles[ROLL] = preFlipAngles[ROLL] + 90; + // make sure the object is placed properly + VectorMA(flipOrigin, -head->mins[2], fwd, vTemp); + VectorMA(vTemp, -head->mins[1], vec3_up, head->s.origin); + bStop = true; + } + else + { // accelerate our rotation a little bit + head->avelocity[ROLL] += fInitVel; + } + } + break; + } + } + if (!bStop) + { + // update our origin in the horizontal sense + VectorScale(fwd, cos(DEGTORAD*(initRadiusAng - fDelta))*radius, vTemp); + // update in the vertical sense + VectorMA(vTemp, sin(DEGTORAD*(initRadiusAng - fDelta))*radius, vec3_up, vTemp); + // update our edict's position + VectorAdd(vTemp, flipOrigin, head->s.origin); + } + else + { + // we stopped rotating so fix our bbox + BboxRotate(head); + } + return bStop; + } + // not _really_ true but it'll get us out of this fn + return true; +} \ No newline at end of file diff --git a/Source/Game/gamecpp/g_obj.h b/Source/Game/gamecpp/g_obj.h new file mode 100644 index 0000000..88bbdc9 --- /dev/null +++ b/Source/Game/gamecpp/g_obj.h @@ -0,0 +1,224 @@ +// g_obj.h -- genric object information + +// included for entSoundsToCache[], an array for entities to mark which client sfx they need cached +#include "g_spawn.h" + +#ifndef _G_OBJ_H_ +#define _G_OBJ_H_ + +#define SMSEQ_HOLD 0 +#define SMSEQ_LOOP 1 +#define SMSEQ_HOLDFRAME 2 + + +typedef struct objParts_s +{ + char *partnull; // Null on parent the part is bolted to + int partnum; // Which field on ent struct to use + void (*pain)(edict_t *ent,int partlost, vec3_t boltPos); // Update function when part is destroyed +} objParts_t; + + +typedef struct objBreak_s +{ + int partCnt; // Number of parts on object + objParts_t *boltPartData; // Pointer to first of bolted on parts array data +} objBreak_t; + +typedef struct modelSpawnData_s +{ + char *dir; + char *file; + int surfaceType; + int material; + int health; + solid_t solid; + char *materialfile; + int debrisCnt; // Amount of debris to throw + float debrisScale; // Size of debris to throw + objBreak_t *objBreakData; // Pointer to objBreak array member +} modelSpawnData_t; + +// achtung! every entry in this list (except OIT_HEADER and OIT_MAX) has to be accounted for +//in FreeEdictUserData() +typedef enum +{ + OIT_HEADER = 0, + OIT_BOLTINST, + OIT_FLIP, + OIT_MAX // keep this at the end of the enum list, pleez +} objInfoType_e; + +#define MAX_BOLTINSTINFO 6 + +// objInfo_c is the base class for any class referred to +//in the objInfoType_e list +class objInfo_c +{ +public: + int nInfoType; + edict_t *head; +public: + objInfo_c() { nInfoType = OIT_HEADER; head = NULL; } + objInfo_c(objInfo_c *orig); + objInfo_c(edict_t* ent) { nInfoType = OIT_HEADER; head = NULL; } + virtual ~objInfo_c() { head = NULL; } + + void Evaluate(objInfo_c *orig); + virtual void Destroy(); +}; + +class boltInstInfo_c : public objInfo_c +{ +protected: + int onOff; // heckuva name, huh? one bit per bolton. + int nNum; // number of boltons attached to the edict + static int nMax; // right now it's 6 +public: + boltInstInfo_c() { head = NULL; Reset(); } + boltInstInfo_c(boltInstInfo_c *orig); + boltInstInfo_c(edict_t *ent):objInfo_c(ent) { nInfoType = OIT_BOLTINST; onOff = 0; nNum = 0; nMax = MAX_BOLTINSTINFO;} + boltInstInfo_c(int n,edict_t *ent):objInfo_c(ent) { nInfoType = OIT_BOLTINST; onOff = 0; nNum = n; nMax = MAX_BOLTINSTINFO; for(int i = 0; i < n; i++) onOff |= (1<= 1) onOff |= (1<<(n-1)); } + void TurnOff(int n) { if (n <= nMax && n >= 1) onOff &= ~(1<<(n-1)); } + bool IsOn(int n) { if (n <= nMax && n >= 1) return (onOff & (1<<(n-1))) != 0; return false;} + void Reset(); + void Evaluate(boltInstInfo_c *orig); +}; + +class objFlipInfo_c : public objInfo_c +{ +public: + enum flipDir_e + { + FLIPDIR_UNK = 0, // not set yet, I guess + FLIPDIR_F, + FLIPDIR_B, + FLIPDIR_L, + FLIPDIR_R + }; + flipDir_e dir; + float startTime; + float ground; + float radius; + float initRadiusAng; + vec3_t preFlipAngles; + vec3_t flipOrigin; + vec3_t fwd; + void (*lastThinkFn)(edict_t *ent); +public: + objFlipInfo_c() { head = NULL; Reset();} + objFlipInfo_c(objFlipInfo_c *orig); + objFlipInfo_c(edict_t *ent); + virtual void Destroy(); + bool Update(); + void Reset(); + void Evaluate(objFlipInfo_c *orig); +}; + +// an instance of this class is pointed to by edict_t::objInfo +class baseObjInfo_c +{ +protected: + vector bolts; +#define BOI_SAVE_START offsetof(baseObjInfo_c, owner) + edict_t *owner; + boltInstInfo_c boltInstInfo; + objFlipInfo_c flipInfo; +public: + baseObjInfo_c(edict_t *ent) {owner = ent; boltInstInfo.head = NULL; flipInfo.head = NULL;} + baseObjInfo_c(baseObjInfo_c *orig); + ~baseObjInfo_c(); + + IGhoulInst* GetBolt(int nBolt); + objInfo_c* GetInfo(int nType); + void ResetInfo(int nType); + bool AddBolt(ggBinstC *newBolt); + void Read(void); + void Write(void); + void Evaluate(baseObjInfo_c *orig); +}; + +class boltonOrientation_c +{ +public: + enum retCode_e + { + ret_TRUE = 1, + ret_FALSE, + ret_ERROR + }; + edict_t *root; // the ultimate root of the bolton (parent, grandparent, whatever) + IGhoulInst *boltonInst; // instance of the bolted-on object that's getting oriented + GhoulID boltonID; // id of the bolted-on object + IGhoulInst *parentInst; // instance of the bolted-on object's immediate parent (may be the root) + GhoulID parentID; // id of the bolted-on object's immediate parent (only if not the root) + vec3_t vTarget; // where you'd like the bolton to be pointing + float fMinPitch; // limits the bolton's pitch w.r.t. its immediate parent + float fMaxPitch; // limits the bolton's pitch w.r.t. its immediate parent + float fMinYaw; // limits the bolton's yaw w.r.t. its immediate parent + float fMaxYaw; // limits the bolton's yaw w.r.t. its immediate parent + float fMaxTurnSpeed; // how fast the bolton can turn (max rotational speed, really) + float fRetPitch; // the post-rotation pitch of the rotated bolt (wrt the parent) + float fRetYaw; // the post-rotation yaw of the rotated bolt (wrt the parent) + bool bUsePitch; // rotate bolton vertically + bool bUseYaw; // rotate bolton horizontally + bool bToRoot; // true == get bolt matrix wrt to root + // false == get bolt matrix wrt to parent +public: + boltonOrientation_c(); + boltonOrientation_c::retCode_e OrientBolton(); + boltonOrientation_c::retCode_e OrientEnt(); +protected: + void GetAngles(Vect3 &pos, Matrix4 &mat, float &angle1, float &angle2); +}; + +void LightBecomeDebris (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void ObjBecomeDebris (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void SpecialBecomeDebris (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + +void SimpleModelInit2(edict_t *ent, modelSpawnData_t *modelData,char *skinname,char *partname); + +void SimpleModelSetObject(edict_t *ent,char *partname); +void SimpleModelSetSequence(edict_t *ent,char *seqname,int loopflag); +GhoulID SimpleModelSetSequence2(IGhoulInst* inst,char *seqname,int loopFlag); +void SimpleModelScale(edict_t *ent,float objscale); +void SimpleModelRemoveObject(edict_t *ent,char *partname); +void SimpleModelRemoveObject2(IGhoulInst* inst,char *partname); +void RecursiveTurnOff(IGhoulInst* inst); +void SimpleModelTurnOnOff(IGhoulInst* inst, bool bOnOff); +ggBinstC* SimpleModelAddBolt(edict_t *ent,modelSpawnData_t &bolterModelData,char*bolterBoltName, + modelSpawnData_t &bolteeModelData,char *bolteeBoltName,char *skinName); +ggBinstC *ComplexModelAddBolt(ggBinstC* bInst,modelSpawnData_t &bolterModelData,char*bolterBoltName, + modelSpawnData_t &bolteeModelData,char *bolteeBoltName,char *skinName); +ggBinstC* SimpleModelFindBolt(edict_t *ent, modelSpawnData_t bolterModelData, char*bolterBoltName); +IGhoulInst* SimpleModelGetBolt(edict_t *ent, int nBolt); +void SimpleModelAddObject(edict_t *ent,char *partname); +void SimpleModelAddObject2(IGhoulInst* inst,char *partname); + +void SetSkin(edict_t *self, char* modelName, char* modelSubname, char *matName, char *skinName, int nSetBoltonSkins); +void SetSkin2(IGhoulInst* inst, char* modelName, char* modelSubname, char *matName, char *skinName); + +void GrabStuffOnTop (edict_t *self); + +void breakable_brush_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + +void Obj_painflip (edict_t *ent,edict_t *other,int damage); +void Obj_tipover (edict_t *ent, edict_t *other, int damage); + +void Obj_painroll (edict_t *ent,edict_t *other,int damage,int axis); +void Obj_partpain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); + +void Obj_explode(edict_t *ent,vec3_t *pos,int radiusBurn,int blindingLight); +void Obj_partbreaksetup (int bpd_enum,modelSpawnData_t *modelData, + objParts_t *objBoltPartsData,objBreak_t *objBreak); +void Obj_partkill (edict_t *self,int boltNum,int debrisFlag); + +void FlipObject(edict_t *ent,edict_t *other, edict_t *activator); // intended to be used as a plUse fn + +#endif //_G_OBJ_H \ No newline at end of file diff --git a/Source/Game/gamecpp/g_phys.cpp b/Source/Game/gamecpp/g_phys.cpp new file mode 100644 index 0000000..6f6e247 --- /dev/null +++ b/Source/Game/gamecpp/g_phys.cpp @@ -0,0 +1,1807 @@ +// g_phys.c + +#include "g_local.h" +#include "..\qcommon\ef_flags.h" +#include "ai_private.h" + +#define STOP_EPSILON 1.0 +#define ZSTOP_EPSILON 100.0 // this is bigger to stop stupid vertical oscillations when things + +typedef struct +{ + edict_t *ent; + vec3_t origin; + vec3_t angles; + float deltayaw; +} pushed_t; +pushed_t pushed[MAX_EDICTS], *pushed_p; +void SV_CheckGround (edict_t *ent); +void G_UpdateFrameEffects(edict_t *ent); +extern void debug_drawbox(edict_t* self,vec3_t vOrigin, vec3_t vMins, vec3_t vMaxs, int nColor); + + // bounce close to the ground +/* + + +pushmove objects do not obey gravity, and do not interact with each other or trigger +fields, but block normal movement and push normal objects when they move. + +onground is set for toss objects when they come to a complete rest. +it is set for steping or walking objects + +doors, plats, etc are SOLID_BSP, and MOVETYPE_PUSH +bonus items are SOLID_TRIGGER touch, and MOVETYPE_TOSS +corpses are SOLID_NOT and MOVETYPE_TOSS +crates are SOLID_BBOX and MOVETYPE_TOSS +walking monsters are SOLID_SLIDEBOX and MOVETYPE_STEP +flying/floating monsters are SOLID_SLIDEBOX and MOVETYPE_FLY + +solid_edge items only clip against bsp models. + +*/ +void SV_Physics_Step (edict_t *ent); +void SV_HandleGenericGroundEffect(edict_t *ent); + +/* +============ +SV_TestEntityPosition + +============ +*/ +edict_t *SV_TestEntityPosition (edict_t *ent) +{ + trace_t trace; + int mask; + + if (ent->clipmask) + mask = ent->clipmask; + else + mask = MASK_SOLID; + gi.trace (ent->s.origin, ent->mins, ent->maxs, ent->s.origin, ent, mask, &trace); + + if (trace.startsolid) + return g_edicts; + + return NULL; +} + + +/* +================ +SV_CheckVelocity +================ +*/ +void SV_CheckVelocity (edict_t *ent) +{ + int i; + +// +// bound velocity +// + for (i=0 ; i<3 ; i++) + { + if (ent->velocity[i] > sv_maxvelocity->value) + ent->velocity[i] = sv_maxvelocity->value; + else if (ent->velocity[i] < -sv_maxvelocity->value) + ent->velocity[i] = -sv_maxvelocity->value; + } +} + +void Lean_TouchTriggers(edict_t *ent) +{ + edict_t *playerEnt = GetBuddyOwner(ent); + vec3_t fwd, right, up; + + AngleVectors(playerEnt->client->ps.viewangles, fwd, right, up); + VectorMA(playerEnt->s.origin, -30 * playerEnt->viewside, right, ent->s.origin); + VectorAdd(ent->s.origin, ent->mins, ent->absmin); + VectorAdd(ent->s.origin, ent->maxs, ent->absmax); + G_TouchTriggers(playerEnt); + VectorClear(ent->s.origin); +} + +/* +============= +SV_RunThink + +Runs thinking code for this frame if necessary +============= +*/ +qboolean SV_RunThink (edict_t *ent) +{ + float thinktime; + + thinktime = ent->nextthink; + if (thinktime <= 0 || (!ent->think && !ent->ai)) + { + if ((ent->flags & FL_LEAN_PLAYER) && (GetBuddyOwner(ent))) + { // this is a leanbuddy + Lean_TouchTriggers(ent); + } + return true; + } + if (thinktime > level.time+0.001) + { + return true; + } + + ent->nextthink = 0; + if (ent->ai) + { + //need to set think to NULL in order for ai to do anything + if (ent->ai->IsFirstFrameTime()) + { + ent->ai->FirstFrame(ent); + ent->think(ent); + } + else + { + ent->ai->Think(*ent); + G_TouchTriggers(ent); + } + } + else + { +// rjr shouldn't be able to occur +// if (!ent->think) +// gi.error ("NULL ent->think for item '%s'", ent->classname); + ent->think (ent); + } + + // find this ghosting bug. + assert(!((ent->s.renderfx & RF_GHOUL) && !(ent->ghoulInst))); + return false; +} + +/* +================== +SV_Impact + +Two entities have touched, so run their touch functions +================== +*/ +int attachmentNotCircular(edict_t *e1) +{ + edict_t *next; + + next = e1; + + while(next->attachChain) + { + next = &g_edicts[next->attachChain]; + if(next == e1)return 0; + } + return 1; +} + +//moves all general world objects that are attached to a guy... but if a guy is of type push, he might have to be returned to a prior position +void updateAttachments(edict_t *e, int isTypePush, vec3_t move, vec3_t amove) +{ + edict_t *curChain; + vec3_t preRotate; + vec3_t postRotate; + int depth = 0; + + if(!(e->attachChain))return; + + curChain = e; + while(curChain->attachChain) + { + curChain = &g_edicts[curChain->attachChain]; + + if(isTypePush) + { + pushed_p->ent = curChain; + VectorCopy(curChain->s.origin, pushed_p->origin); + VectorCopy(curChain->s.angles, pushed_p->angles); + pushed_p++; + } + + VectorAdd(curChain->s.origin, move, curChain->s.origin); + VectorAdd(curChain->s.angles, amove, curChain->s.angles); + + if(amove[YAW])//need to handle other rotations - FIXME + { // angular stuff :/ + + VectorSubtract(curChain->s.origin, e->s.origin, preRotate); + + postRotate[0] = cos(-amove[YAW] * M_PI / 180.0) * preRotate[0] + sin(-amove[YAW] * M_PI / 180.0) * preRotate[1]; + postRotate[1] = -sin(-amove[YAW] * M_PI / 180.0) * preRotate[0] + cos(-amove[YAW] * M_PI / 180.0) * preRotate[1]; + postRotate[2] = preRotate[2]; + + VectorAdd(e->s.origin, postRotate, curChain->s.origin); + } + + depth++; + assert(depth < 10);//circular list? ACK!!! + } +} + +bool SV_Impact (edict_t *e1, trace_t *trace) +{ + edict_t *e2; + + e2 = trace->ent; + + // 1/11/99 kef -- we shouldn't be able to shoot our own LeanBuddy, NugBuddy, or WeaponBuddy + if (e2->svflags & SVF_BUDDY) + { + if(e2->owner == e1->owner) + { // an impact with our own buddy + return false; + } + else if(e1->health == 31337) + { + // a knife hit a buddy + } + else + { // I don't know of a pretty way to fix this off hand, but basically we don't want you + //to be able to land a c4 or a thrown knife on a buddy + if (e1->flags & FL_THROWN_WPN) + { // hit something like a weaponbuddy, so bounce off of it + if (trace->plane.normal && (DotProduct(trace->plane.normal, vec3_up) > .8) ) + { // landed on a buddy + e1->velocity[2] *= -1; + VectorScale(e1->velocity, .4, e1->velocity); + } + else + { + VectorScale(e1->velocity, -.2, e1->velocity); + } + + if (e1->touch && (e1->solid != SOLID_NOT || e1->movetype == MOVETYPE_TOUCHNOTSOLID)) + e1->touch (e1, e2, &trace->plane, trace->surface); + + return false; + } + } + } + // If entity1 is a MOVETYPE_TOUCHNOTSOLID, like a missile, + // then it should run its touch function, solid or not. + if (e1->touch && (e1->solid != SOLID_NOT || e1->movetype == MOVETYPE_TOUCHNOTSOLID)) + e1->touch (e1, e2, &trace->plane, trace->surface); + + if (e2->touch && e2->solid != SOLID_NOT) + e2->touch (e2, e1, NULL, NULL); + + return true; +} + + +/* +================== +ClipVelocity + +Slide off of the impacting object +returns the blocked flags (1 = floor, 2 = step / wall) +================== +*/ + +int ClipVelocity (vec3_t in, vec3_t normal, vec3_t out, float overbounce) +{ + float backoff; + float change; + int i, blocked; + + blocked = 0; + if (normal[2] > 0) + blocked |= 1; // floor + if (!normal[2]) + blocked |= 2; // step + + backoff = DotProduct (in, normal) * overbounce; + + if (backoff == 0)//if plane is parallel to velocity, physics are screwy, so bounce off with equal weight given to plane & vel + { + VectorScale(in,0.5,in); + backoff = VectorLength(in)*overbounce; + } + + for (i=0 ; i<3 ; i++) + { + change = normal[i]*backoff; + out[i] = in[i] - change; + if (out[i] > -STOP_EPSILON && out[i] < STOP_EPSILON) + out[i] = 0; + } + + return blocked; +} + +void ClipVelocity_Dan (vec3_t in, vec3_t normal, vec3_t out, float elasticity) +// Calculate the velocity resulting from an impact with a plane surface. +// ************************************************************************************************ +{ + float DotProd; + vec3_t InverseIn, + WorkVec; + int i; + + // Calculation for reflection in a plane is 2*(N.D)*N-D, where D is the inverse of the incident + // ray. + + if (elasticity == -1) + { + VectorCopy(in, out); + return; + } + + VectorScale(in,-1.0 * elasticity,InverseIn); + + DotProd=DotProduct(normal,InverseIn); + + VectorScale(normal,DotProd*1.8,WorkVec); // not using 2.0 because I need to fudge + + VectorSubtract(WorkVec,InverseIn,out); + + for (i=0 ; i<2 ; i++) + { + if (out[i] > -STOP_EPSILON && out[i] < STOP_EPSILON) + { + out[i] = 0; + } + } + if (out[2] > -ZSTOP_EPSILON && out[2] < ZSTOP_EPSILON) + { + out[2] = 0; + } + +} + + +/* +============ +SV_FlyMove + +The basic solid body movement clip that slides along multiple planes +Returns the clipflags if the velocity was modified (hit something solid) +1 = floor +2 = wall / step +4 = dead stop +============ +*/ +#define MAX_CLIP_PLANES 5 +int SV_FlyMove (edict_t *ent, float time, int mask) +{ + edict_t *hit; + int bumpcount, numbumps; + vec3_t dir; + float d; + int numplanes; + vec3_t planes[MAX_CLIP_PLANES]; + vec3_t primal_velocity, original_velocity, new_velocity; + int i, j; + trace_t trace; + vec3_t end; + float time_left; + int blocked; + + // corpse stuff + vec3_t mins, maxs; + // end corpse stuff + + + numbumps = 4; + + blocked = 0; + VectorCopy (ent->velocity, original_velocity); + VectorCopy (ent->velocity, primal_velocity); + numplanes = 0; + + time_left = time; + + ent->groundentity = NULL; + for (bumpcount=0 ; bumpcounts.origin[i] + time_left * ent->velocity[i]; +// trace isn't picking up models as entities! + + //corpse stuff + if (ent->solid == SOLID_CORPSE) + { + VectorCopy(ent->mins, mins); + VectorCopy(ent->maxs, maxs); + mins[0] = -8; + mins[1] = -8; + maxs[0] = 8; + maxs[1] = 8; + maxs[2] = 8; + gi.trace (ent->s.origin, mins, maxs, end, ent, mask, &trace); + } + // end corpse stuff + else + { + gi.trace (ent->s.origin, ent->mins, ent->maxs, end, ent, mask, &trace); + } + +// Com_Printf("%s %d Tracing from (%f,%f,%f) to (%f,%f,%f)\n", ent->classname, ent->s.number, ent->s.origin[0], ent->s.origin[1], ent->s.origin[2], +// end[0], end[1], end[2]); + + + + if (trace.allsolid) + { // entity is trapped in another solid + VectorCopy (vec3_origin, ent->velocity); + return 3; + } + + hit = trace.ent; + +/* if (trace.fraction != 1) + { + Com_Printf("Stopped at (%f,%f,%f)\n", trace.endpos[0], trace.endpos[1], trace.endpos[2]); + } + Com_Printf("%s %d Trace hit entity %s %d \n", ent->classname, ent->s.number, hit->classname, hit->s.number); +*/ + + {//test only--did last trace take me into a solid?!!!!!!!!! +// static int i98=0; +// Com_Printf("Horrible extra trace in FLYMOVE (%d)\n",i98++); + trace_t dbtrace; + + //corpse stuff + if (ent->solid == SOLID_CORPSE) + { + gi.trace (trace.endpos, mins, maxs, trace.endpos, ent, mask, &dbtrace); + } + //end corpse stuff + else + { + gi.trace (trace.endpos, ent->mins, ent->maxs, trace.endpos, ent, mask, &dbtrace); + } + if (dbtrace.startsolid || dbtrace.allsolid) + { + if (trace.fraction > 0 && trace.fraction < 1 && trace.plane.normal[2] > 0.7) + { + if (( hit->solid == SOLID_BSP) || (hit->solid == SOLID_GHOUL)) + { + ent->groundentity = trace.ent; + ent->groundentity_linkcount = trace.ent->linkcount; + } + } + VectorNormalize (ent->velocity); + VectorScale (ent->velocity, -1, ent->velocity);//back outta here + for (i=0;i<3;i++) + ent->velocity[i] += gi.flrand(-1.0F, 1.0F); + return 7;//trace failed!!!!! we're FUKD!!!!!!! + } + } + + + if (trace.fraction > 0) + { // actually covered some distance + VectorCopy (trace.endpos, ent->s.origin); + VectorCopy (ent->velocity, original_velocity); + numplanes = 0; + } + + if (trace.fraction == 1) + break; // moved the entire distance + + + if (trace.plane.normal[2] > 0.7) + { + blocked |= 1; // floor + if (( hit->solid == SOLID_BSP) || (hit->solid == SOLID_GHOUL)) + { + ent->groundentity = hit; + ent->groundentity_linkcount = hit->linkcount; + SV_HandleGenericGroundEffect(ent); + } + } + if (!trace.plane.normal[2]) + { + blocked |= 2; // step + } + +// +// run the impact function +// + if (!SV_Impact (ent, &trace)) + { + break; + } + if (!ent->inuse) + break; // removed by the impact function + + + time_left -= time_left * trace.fraction; + + // cliped to another plane + if (numplanes >= MAX_CLIP_PLANES) + { // this shouldn't really happen + VectorCopy (vec3_origin, ent->velocity); + return 3; + } + + VectorCopy (trace.plane.normal, planes[numplanes]); + numplanes++; + +// +// modify original_velocity so it parallels all of the clip planes +// + if (ent->movetype != MOVETYPE_NOCLIP) + { + + for (i=0 ; ivelocity); + } + else + { // go along the crease + if (numplanes != 2) + { + // gi.dprintf ("clip velocity, numplanes == %i\n",numplanes); + VectorCopy (vec3_origin, ent->velocity); + return 7; + } + CrossProduct (planes[0], planes[1], dir); + d = DotProduct (dir, ent->velocity); + VectorScale (dir, d, ent->velocity); + } + } +// +// if original velocity is against the original velocity, stop dead +// to avoid tiny occilations in sloping corners +// +/* if (DotProduct (ent->velocity, primal_velocity) < 0)//don't zero me out if plane is parallel to vel + { + VectorCopy (vec3_origin, ent->velocity); + return blocked; + }*/ +// ^^ this is crap. essentially, it says, if something is going to bounce back the way it came, +// just stop it... I think the "tiny occillations" were vertical, which could be gotten rid +// of with: + if ((ent->velocity[2] * primal_velocity[2]) < 0) + { + ent->velocity[2] = 0; + return blocked; + } + + + } + + return blocked; +} + + +/* +============ +SV_AddGravity + +============ +*/ +void SV_AddGravity (edict_t *ent) +{ + vec3_t gravdir; + + gravdir[0] = sv_gravityx->value; + gravdir[1] = sv_gravityy->value; + gravdir[2] = sv_gravityz->value; // note that positive z is downward +// VectorNormalize(gravdir); + + ent->velocity[0] += ent->gravity * sv_gravity->value * FRAMETIME * gravdir[0]; + ent->velocity[1] += ent->gravity * sv_gravity->value * FRAMETIME * gravdir[1]; + ent->velocity[2] -= ent->gravity * sv_gravity->value * FRAMETIME * gravdir[2]; + if (ent->waterlevel == 1) + { + ent->velocity[2] += ent->bouyancy * sv_gravity->value * FRAMETIME; + } +} + +/* +=============================================================================== + +PUSHMOVE + +=============================================================================== +*/ + +/* +============ +SV_PushEntity + +Does not change the entities velocity at all +============ +*/ +trace_t SV_PushEntity (edict_t *ent, vec3_t push) +{ + trace_t trace; + vec3_t start; + vec3_t end; + int mask; + + VectorCopy (ent->s.origin, start); + VectorAdd (start, push, end); + +retry: + if (ent->clipmask) + mask = ent->clipmask; + else + mask = MASK_SOLID; + + gi.trace (start, ent->mins, ent->maxs, end, ent, mask, &trace); + + // If we start in an object, we shouldn't move. We need this mainly for corpses, so to be safe, we only use it on MOVETYPE_TOSS + if (trace.allsolid && ent->movetype == MOVETYPE_TOSS) + { // Don't move at all + gi.linkentity (ent); + } + else + { + VectorCopy (trace.endpos, ent->s.origin); + + gi.linkentity (ent); + + if (trace.fraction != 1.0) // it's gonna hit something + { + SV_Impact (ent, &trace); + + // if the pushed entity went away and the pusher is still there + if (!trace.ent->inuse && ent->inuse) + { + // move the pusher back and try again + VectorCopy (start, ent->s.origin); + gi.linkentity (ent); + goto retry; + } + } + } + + if (ent->inuse) + G_TouchTriggers (ent); + + return trace; +} + +edict_t *obstacle; + +/* +============ +SV_Push + +Objects need to be moved back on a failed push, +otherwise riders would continue to slide. +============ +*/ +qboolean SV_Push (edict_t *pusher, vec3_t move, vec3_t amove) +{ + int i, e; + edict_t *check, *block; + vec3_t mins, maxs; + pushed_t *p; + vec3_t org, org2, move2, forward, right, up; + + // clamp the move to 1/8 units, so the position will + // be accurate for client side prediction +/* + for (i=0 ; i<3 ; i++) + { + float temp; + temp = move[i]*8.0; + if (temp > 0.0) + temp += 0.5; + else + temp -= 0.5; + move[i] = 0.125 * (int)temp; + } +*/ + + // find the bounding box + for (i=0 ; i<3 ; i++) + { + mins[i] = pusher->absmin[i] + move[i]; + maxs[i] = pusher->absmax[i] + move[i]; + } + +// we need this for pushing things later + VectorSubtract (vec3_origin, amove, org); + AngleVectors (org, forward, right, up); + +// save the pusher's original position + pushed_p->ent = pusher; + VectorCopy (pusher->s.origin, pushed_p->origin); + VectorCopy (pusher->s.angles, pushed_p->angles); + if (pusher->client) + pushed_p->deltayaw = pusher->client->ps.pmove.delta_angles[YAW]; + pushed_p++; + +// move the pusher to it's final position + VectorAdd (pusher->s.origin, move, pusher->s.origin); + VectorAdd (pusher->s.angles, amove, pusher->s.angles); + gi.linkentity (pusher); + + //FIXME - NOT WORTH BOTHERING WITH - JUST MAKE KNIVES AND WHAT NOT BOUNCE OFF OF DOORS +// updateAttachments(pusher, 1, move, amove); + +// see if any solid entities are inside the final position + check = g_edicts+1; + for (e = 1; e < globals.num_edicts; e++, check++) + { + if (!check->inuse) + continue; + if (check->movetype == MOVETYPE_PUSH + || check->movetype == MOVETYPE_STOP + || check->movetype == MOVETYPE_NONE + || check->movetype == MOVETYPE_NOCLIP + || check->s.solid == SOLID_NOT) + continue; + + if(check->attachOwner)continue;//these guys are attached - let's leave 'em alone for now and let 'em rest... + + if (!check->area.prev) + continue; // not linked in anywhere + + // if the entity is standing on the pusher, it will definitely be moved + if (check->groundentity != pusher) + { + // see if the ent needs to be tested + if ( check->absmin[0] >= maxs[0] + || check->absmin[1] >= maxs[1] + || check->absmin[2] >= maxs[2] + || check->absmax[0] <= mins[0] + || check->absmax[1] <= mins[1] + || check->absmax[2] <= mins[2] ) + continue; + + //sfs--i put in this bit to fix the stuck trapdoors on the train, but until i can run a map with elevators on it, i can't test it and it shouldn't be in. + //pushers should be able to go through dead monsters (WHO AREN'T STANDING ON THE PUSHER!) +// if (check->svflags & SVF_DEADMONSTER) +// continue; + + // see if the ent's bbox is inside the pusher's final position + if (!SV_TestEntityPosition (check)) + continue; + } + + if ((pusher->movetype == MOVETYPE_PUSH) || (check->groundentity == pusher)) + { + // move this entity + pushed_p->ent = check; + VectorCopy (check->s.origin, pushed_p->origin); + VectorCopy (check->s.angles, pushed_p->angles); + pushed_p++; + + // try moving the contacted entity + VectorAdd (check->s.origin, move, check->s.origin); + if (check->client) + { // FIXME: doesn't rotate monsters? + check->client->ps.pmove.delta_angles[YAW] += amove[YAW]; + } + + // figure movement due to the pusher's amove + VectorSubtract (check->s.origin, pusher->s.origin, org); + org2[0] = DotProduct (org, forward); + org2[1] = -DotProduct (org, right); + org2[2] = DotProduct (org, up); + VectorSubtract (org2, org, move2); +// rjr EmergencySnapPosition() took care of this +// VectorScale(move2, 2.0, move2); + VectorAdd (check->s.origin, move2, check->s.origin); + + // may have pushed them off an edge + if (check->groundentity != pusher) + check->groundentity = NULL; + + block = SV_TestEntityPosition (check); + if (!block) + { // pushed ok + gi.linkentity (check); + // impact? + continue; + } + + // if it is ok to leave in the old position, do it + // this is only relevent for riding entities, not pushed + // FIXME: this doesn't acount for rotation + VectorSubtract (check->s.origin, move, check->s.origin); + block = SV_TestEntityPosition (check); + if (!block) + { + pushed_p--; + continue; + } + } + + // save off the obstacle so we can call the block function + obstacle = check; + + // move back any entities we already moved + // go backwards, so if the same entity was pushed + // twice, it goes back to the original position + for (p=pushed_p-1 ; p>=pushed ; p--) + { + VectorCopy (p->origin, p->ent->s.origin); + VectorCopy (p->angles, p->ent->s.angles); + if (p->ent->client) + { + p->ent->client->ps.pmove.delta_angles[YAW] = p->deltayaw; + } + gi.linkentity (p->ent); + } + return false; + } + +//FIXME: is there a better way to handle this? + // see if anything we moved has touched a trigger + for (p=pushed_p-1 ; p>=pushed ; p--) + G_TouchTriggers (p->ent); + + return true; +} + +/* +================ +SV_Physics_Pusher + +Bmodel objects don't interact with each other, but +push all box objects +================ +*/ +void SV_Physics_Pusher (edict_t *ent) +{ + vec3_t move, amove; + edict_t *part, *mv; + + // if not a team captain, so movement will be handled elsewhere + if ( ent->flags & FL_TEAMSLAVE) + return; + + // make sure all team slaves can move before commiting + // any moves or calling any think functions + // if the move is blocked, all moved objects will be backed out +//retry: + pushed_p = pushed; + for (part = ent ; part ; part=part->teamchain) + { + if (part->velocity[0] || part->velocity[1] || part->velocity[2] || + part->avelocity[0] || part->avelocity[1] || part->avelocity[2] + ) + { // object is moving + VectorScale (part->velocity, FRAMETIME, move); + VectorScale (part->avelocity, FRAMETIME, amove); + + if (!SV_Push (part, move, amove)) + break; // move was blocked + } + } + if (pushed_p > &pushed[MAX_EDICTS]) + gi.error (ERR_FATAL, "pushed_p > &pushed[MAX_EDICTS], memory corrupted"); + + if (part) + { + // the move failed, bump all nextthink times and back out moves + for (mv = ent ; mv ; mv=mv->teamchain) + { + if (mv->nextthink > 0) + mv->nextthink += FRAMETIME; + } + + // if the pusher has a "blocked" function, call it + // otherwise, just stay in place until the obstacle is gone + if (part->blocked) + part->blocked (part, obstacle); +#if 0 + // if the pushed entity went away and the pusher is still there + if (!obstacle->inuse && part->inuse) + goto retry; +#endif + } + else + { + // the move succeeded, so call all think functions + for (part = ent ; part ; part=part->teamchain) + { + SV_RunThink (part); + } + } +} + +//================================================================== + +/* +============= +SV_Physics_None + +Non moving objects can only think +============= +*/ +void SV_Physics_None (edict_t *ent) +{ +// regular thinking + SV_RunThink (ent); +} + +/* +============= +SV_Physics_Noclip + +A moving object that doesn't obey physics +============= +*/ +void SV_Physics_Noclip (edict_t *ent) +{ + + VectorMA (ent->s.angles, FRAMETIME, ent->avelocity, ent->s.angles); + VectorMA (ent->s.origin, FRAMETIME, ent->velocity, ent->s.origin); + gi.linkentity (ent); + // regular thinking + if (!SV_RunThink (ent)) + return; + + + +} + +/* +============================================================================== + +TOSS / BOUNCE + +============================================================================== +*/ + +/* +============= +SV_Physics_Toss + +Toss, bounce, and fly movement. When onground, do nothing. +============= +*/ +void SV_Physics_Toss (edict_t *ent) +{ + trace_t trace; + vec3_t move; + float backoff; + edict_t *slave; + qboolean wasinwater; + qboolean isinwater; + vec3_t old_origin; + +// regular thinking + SV_RunThink (ent); + + // if not a team captain, so movement will be handled elsewhere + if ( ent->flags & FL_TEAMSLAVE) + return; + + if (ent->velocity[2] > 0) + ent->groundentity = NULL; + +// check for the groundentity going away + if (ent->groundentity) + if (!ent->groundentity->inuse) + ent->groundentity = NULL; + +// if onground, return without moving + if ( ent->groundentity ) + return; + + VectorCopy (ent->s.origin, old_origin); + + SV_CheckVelocity (ent); + +// add gravity + if (ent->movetype != MOVETYPE_FLY + && ent->movetype != MOVETYPE_FLYMISSILE) + SV_AddGravity (ent); + +// move angles + VectorMA (ent->s.angles, FRAMETIME, ent->avelocity, ent->s.angles); + +// move origin + VectorScale (ent->velocity, FRAMETIME, move); + trace = SV_PushEntity (ent, move); + if (!ent->inuse) + return; + + if (trace.fraction < 1) // if it will hit something + { + if (ent->movetype == MOVETYPE_BOUNCE) + backoff = 1.5; + else + backoff = 1; + + ClipVelocity (ent->velocity, trace.plane.normal, ent->velocity, backoff); + + // stop if on ground + if (trace.plane.normal[2] > 0.7) + { + if (ent->velocity[2] < 30 || ent->movetype != MOVETYPE_BOUNCE ) +// fixme: if (ent->velocity[2] < 60 || ent->movetype != MOVETYPE_BOUNCE ) +// this hardcoded 60 (or 30) is bad... + { + ent->groundentity = trace.ent; + ent->groundentity_linkcount = trace.ent->linkcount; + ent->movetype = MOVETYPE_STEP; + ent->velocity[2] = 0; + SV_Physics_Step (ent); + // VectorCopy (vec3_origin, ent->velocity); + // VectorCopy (vec3_origin, ent->avelocity); + } + SV_HandleGenericGroundEffect(ent); + } + +// if (ent->touch) +// ent->touch (ent, trace.ent, &trace.plane, trace.surface); + } + +// check for water transition + wasinwater = (ent->watertype & MASK_WATER); + ent->watertype = gi.pointcontents (ent->s.origin); + isinwater = ent->watertype & MASK_WATER; + + if (isinwater) + ent->waterlevel = 1; + else + ent->waterlevel = 0; + +/* + if (!wasinwater && isinwater) + { + gi.positioned_sound (old_origin, g_edicts, CHAN_AUTO, gi.soundindex("misc/h2ohit1.wav"), .6, 1, 0); + } + else if (wasinwater && !isinwater) + { + gi.positioned_sound (ent->s.origin, g_edicts, CHAN_AUTO, gi.soundindex("misc/h2ohit1.wav"), .6, 1, 0); + } +*/ + +// move teamslaves + for (slave = ent->teamchain; slave; slave = slave->teamchain) + { + VectorCopy (ent->s.origin, slave->s.origin); + gi.linkentity (slave); + } +} + +/* +=============================================================================== + +STEPPING MOVEMENT + +=============================================================================== +*/ + +/* +============= +SV_Physics_Step + +Monsters freefall when they don't have a ground entity, otherwise +all movement is done with discrete steps. + +This is also used for objects that have become still on the ground, but +will fall if the floor is pulled out from under them. +FIXME: is this true? +============= +*/ + +#define sv_waterfriction 1 + +void SV_AddRotationalFriction (edict_t *ent, qboolean onground) +{ + int n; + float adjustment; + + if (onground) + { + adjustment = FRAMETIME * ent->friction * FRICTION_MULT * .2; + } + else + { + adjustment = FRAMETIME * ent->airresistance * AIRRESISTANCE_MULT; + } + + for (n = 0; n < 3; n++) + { + if (ent->avelocity[n] > 0) + { + ent->avelocity[n] -= adjustment; + if (ent->avelocity[n] < 0) + ent->avelocity[n] = 0; + } + else + { + ent->avelocity[n] += adjustment; + if (ent->avelocity[n] > 0) + ent->avelocity[n] = 0; + } + } +} + +void SV_Rotate (edict_t *ent) +{ + int i; + + + + for (i = 0; i < 3; i++) + { + if ((ent->avelocity[i] > -STOP_EPSILON) && (ent->avelocity[i] < STOP_EPSILON)) + { + ent->avelocity[i] = 0; + } + } + + VectorMA (ent->s.angles, FRAMETIME, ent->avelocity, ent->s.angles); + +} + +void SV_AddLinearFriction (edict_t *ent, qboolean onground) +{ + int n; + float adjustment; + + if (onground) + { + adjustment = FRAMETIME * ent->friction * FRICTION_MULT; + } + else + { + adjustment = FRAMETIME * ent->airresistance * AIRRESISTANCE_MULT; + } // fixme: make airresistance quadratic? + + for (n = 0; n < 3; n++) + { + if (ent->velocity[n] > 0) + { + ent->velocity[n] -= adjustment; + if (ent->velocity[n] < 0) + ent->velocity[n] = 0; + } + else + { + ent->velocity[n] += adjustment; + if (ent->velocity[n] > 0) + ent->velocity[n] = 0; + } + } +} + +void SV_Physics_Step (edict_t *ent) +{ + qboolean wasonground; + qboolean hitsound = false; + float *vel; + float speed, newspeed, control; + float friction; + edict_t *groundentity; + int mask; + + if (!ent->stopspeed) + { + ent->stopspeed = 100; + } + + // airborn monsters should always check for ground +// if (!ent->groundentity) +// M_CheckGround (ent); + +// corpse stuff + if (ent->solid == SOLID_CORPSE) + { + SV_CheckGround(ent); + } + + + groundentity = ent->groundentity; + + SV_CheckVelocity (ent); + + if (groundentity) + wasonground = true; + else + wasonground = false; + + //only do movement if i'm not an inactive monster...--ss + if (!ent->ai || ent->ai->IsActive()) + { + if (ent->avelocity[0] || ent->avelocity[1] || ent->avelocity[2]) + { + SV_Rotate(ent); + SV_AddRotationalFriction (ent, wasonground); + } + // add gravity except: + // flying monsters + // swimming monsters who are in the water + if (! wasonground) + if (!(ent->flags & FL_FLY)) + if (!((ent->flags & FL_SWIM) && (ent->waterlevel > 2))) + { + if (ent->velocity[2] < sv_gravity->value*-0.1) + hitsound = true; + if (ent->waterlevel == 0) + SV_AddGravity (ent); + } + + // friction for flying monsters that have been given vertical velocity + if ((ent->flags & FL_FLY) && (ent->velocity[2] != 0)) + { + speed = fabs(ent->velocity[2]); + control = speed < ent->stopspeed ? ent->stopspeed : speed; + friction = (ent->friction) * FRICTION_MULT/3; + newspeed = speed - (FRAMETIME * control * friction); + if (newspeed < 0) + newspeed = 0; + newspeed /= speed; + ent->velocity[2] *= newspeed; + } + + // friction for flying monsters that have been given vertical velocity + if ((ent->flags & FL_SWIM) && (ent->velocity[2] != 0)) + { + speed = fabs(ent->velocity[2]); + control = speed < ent->stopspeed ? ent->stopspeed : speed; + newspeed = speed - (FRAMETIME * control * sv_waterfriction * ent->waterlevel); + if (newspeed < 0) + newspeed = 0; + newspeed /= speed; + ent->velocity[2] *= newspeed; + } + + if (ent->velocity[2] || ent->velocity[1] || ent->velocity[0])// || (ent->solid == SOLID_CORPSE)) + { +// Com_Printf("%s %d inside Step Physics -- velocity not 0 \n", ent->classname, ent->s.number); + + // apply friction + // let dead monsters who aren't completely onground slide + if ((wasonground) || (ent->flags & (FL_SWIM|FL_FLY))) + if (!(ent->health <= 0.0 && !gmonster.CheckBottom(ent))) + { + vel = ent->velocity; + speed = sqrt(vel[0]*vel[0] +vel[1]*vel[1]); + if (speed) + { + friction = ent->friction * FRICTION_MULT; + +// control = speed < ent->stopspeed ? ent->stopspeed : speed; + +// newspeed = speed - FRAMETIME*control*friction; This is the old line. It stopped guys +// from sliding more often than not. + + if (ent->health < 0) + { + newspeed = speed - FRAMETIME * friction * 5; + } + else + { + newspeed = speed - FRAMETIME * friction * ent->stopspeed; + } + + if (newspeed < 0) + newspeed = 0; + newspeed /= speed; + + vel[0] *= newspeed; + vel[1] *= newspeed; + } + } + + if (ent->ai) + mask = MASK_MONSTERSOLID; + else + mask = MASK_SOLID; // dpk -- should this be changed for corpses? + if ((ent->solid == SOLID_CORPSE) && wasonground) + { // we're dead and we're on the ground. don't slide so much. certainly not uphill. + body_c *body = NULL; + ai_c *myAI = (ai_c*)(ai_public_c*)ent->ai; + if (myAI && + (body = (body_c*)myAI->GetBody()) && + (((level.time - body->GetInitialKilledTime()) > 1.5f) || + (body->IsInStationaryDeathAnim())) ) + { + if (ent->velocity[2] > 0) + { + VectorScale(ent->velocity, 0.2, ent->velocity); + } + else + { + VectorScale(ent->velocity, 0.5, ent->velocity); + } + } + } + SV_FlyMove (ent, FRAMETIME, mask); + + gi.linkentity (ent); + if (ent->solid != SOLID_CORPSE) + { + G_TouchTriggers (ent); + } + + // if (ent->groundentity) + // if (!wasonground) + // if (hitsound) + // gi.sound (ent, 0, gi.soundindex("world/land.wav"), .6, 1, 0); + } +/* else + { + Com_Printf("%s %d inside Step Physics -- velocity IS 0 \n", ent->classname, ent->s.number); + } +*/ + } + + if (ent->ai) + { + G_UpdateFrameEffects(ent); + } + + +// regular thinking + SV_RunThink (ent); +} + +void SV_CheckGround (edict_t *ent) +{ + vec3_t point; + trace_t trace; + +// if the hull point one-quarter unit down is solid the entity is on ground + point[0] = ent->s.origin[0]; + point[1] = ent->s.origin[1]; + point[2] = ent->s.origin[2] - 0.25; + if (ent->groundentity) + { + if (ent->groundentity->solid == SOLID_GHOUL) + { + point[2] = ent->s.origin[2] - 2.5; + } + } + + //corpse stuff + if (ent->solid == SOLID_CORPSE) + { + vec3_t mins, maxs; + VectorCopy(ent->mins, mins); + VectorCopy(ent->maxs, maxs); + mins[0] = -8; + mins[1] = -8; + maxs[0] = 8; + maxs[1] = 8; + maxs[2] = 8; +// debug_drawbox(ent, NULL, NULL, NULL, 1); + gi.trace (ent->s.origin, mins, maxs, point, ent, ent->clipmask, &trace); + } + else + { + gi.trace (ent->s.origin, ent->mins, ent->maxs, point, ent, ent->clipmask, &trace); + } + +// If I started in something solid, and it's solid benath me, say I'm on the ground + if(trace.startsolid && trace.allsolid) + { + ent->groundentity = trace.ent; + ent->groundentity_linkcount = trace.ent->linkcount; + return; + } + +// If I started in something solid, and I can fall through, I'm not on the ground + if(trace.startsolid && !trace.allsolid) + { + ent->groundentity = NULL; + return; + } + + +// If the trace went all the way, I ain't on the ground + if ( trace.fraction == 1.0 ) + { + ent->groundentity = NULL; + return; + } +// Ok, I hit something, can I stand on it? + if ( trace.plane.normal[2] < FLOOR_STEEPNESS) + { + ent->groundentity = NULL; // Nope, it is too steep + return; + } + else + { +// Yep, I'm standing on this thing + VectorCopy (trace.endpos, ent->s.origin); + ent->groundentity = trace.ent; + ent->groundentity_linkcount = trace.ent->linkcount; +// ent->velocity[2] = 0; + } +} + +void SV_Physics_Dan (edict_t *ent) +{ + edict_t *groundentity, *hit; + qboolean wasonground; + int numbumps, bumpcount, blocked, numplanes, i, j; + vec3_t original_velocity, primal_velocity, end, new_velocity; + vec3_t planes[MAX_CLIP_PLANES], dir; + float time_left, d; + trace_t trace; + + // first, run regular think + SV_RunThink(ent); + if (!ent->inuse) + { // were we just deleted? + return; + } + + if(ent->attachOwner)return;//if you're connected to something, there's no way you can collide with stuff, right? Okay, maybe not, but we'll fix that later maybe... + + // Rick's suggested optimisation...(saves approx 600 traces a second on final/nyc) + // + if (!(Vec3IsZero(ent->velocity) && ent->groundentity && ent->groundentity->s.number==0)) + { + // am I on the ground? + SV_CheckGround (ent); + } +// else +// { +// static int i99=0; +// Com_Printf("Skipped %d GroundChecks in PHYSICS_DAN\n",i99++); // (needs "developer 1" to see this) +// } + + groundentity = ent->groundentity; // I was standing on this (NULL if air) + if (groundentity) + { + wasonground = true; + } + else + { + wasonground = false; + } + + SV_CheckVelocity (ent); // Make my velocities "in bounds" (defined by the cvar, + // sv_maxvelocity, which defaults to 2000. + + +// dk I changed if test to make sure all MOVETYPE_DAN objects are always affected +// by non-standard gravity... + if ((ent->gravity && !wasonground) || ((sv_gravityx->value) || (sv_gravityy->value) + || (sv_gravityz->value < 0))) + { + SV_AddGravity(ent); // Add gravity if I'm in air (the cvar sv_gravity is multiplied by the + // entity's gravity. sv_gravity defaults to 800, entity + // gravity defaults to 1. + // If I'm in water, bouyancy will detract from this + } + + if (ent->velocity[0] || ent->velocity[1] || ent->velocity[2]) + { + // setting up for the collision detections + numbumps = 4; // maximum of 4 clip planes checked + blocked = 0; + + VectorCopy (ent->velocity, original_velocity); + VectorCopy (ent->velocity, primal_velocity); + + numplanes = 0; + time_left = FRAMETIME; + + ent->groundentity = NULL; // clear the ground entity for the new trace + + for (bumpcount=0 ; bumpcounts.origin[i] + time_left * ent->velocity[i]; // the endpoint of the trace + } + // do the trace from ---box-------------- to ignore mask(for now) + gi.trace (ent->s.origin, ent->mins, ent->maxs, end, ent, ent->clipmask, &trace); + + // ***Since the trace doesn't use the correct bounding box yet, I'm disabling this for now*** + // if (trace.allsolid) + // { // entity is trapped in another solid, so we'll never move + // VectorCopy (vec3_origin, ent->velocity); + // return; + // } + + // did last trace take me into a solid?! If it did, bad things, man... + { +// static int i97=0; +// Com_Printf("Horrible extra trace in PHYSICS_DAN (%d)\n",i97++); + + trace_t dbtrace; + vec3_t dumbmins, dumbmaxs, ones; + + for (i=0;i<3;i++) + ones[i] = 1; + VectorCopy(ent->mins, dumbmins); + VectorAdd(dumbmins, ones, dumbmins); + VectorCopy(ent->maxs, dumbmaxs); + VectorSubtract(dumbmaxs, ones, dumbmaxs); + gi.trace (trace.endpos, dumbmins, dumbmaxs, trace.endpos, ent, ent->clipmask, &dbtrace); + + if (dbtrace.startsolid || dbtrace.allsolid) + { + // kef -- if we're starting in a solid, and we're a knife, maybe hit someone's + //buddy? + if (dbtrace.ent && (dbtrace.ent->svflags & SVF_BUDDY)) + { // hit a buddy. try to impact with its owner + if (NULL == trace.ent) + { + trace.ent = dbtrace.ent->owner; + } + } + else + { + if (trace.fraction > 0 && trace.fraction < 1 && trace.plane.normal[2] > 0.7) + { + if ( dbtrace.ent->solid == SOLID_BSP) + { + ent->groundentity = trace.ent; + ent->groundentity_linkcount = trace.ent->linkcount; + } + } + + VectorClear(ent->velocity); // I added this line - bl + + // Commenting these 4 lines out because they seem rather unneeded - bl + // VectorNormalize (ent->velocity); + // VectorScale (ent->velocity, -1, ent->velocity);//back outta here + // for (i=0;i<3;i++) + // ent->velocity[i] +=crandom(); // get me outta here + return;//trace failed!!!!! muy mal! + } + } + } + + + if (trace.fraction > 0) + { // trace covered at least a portion of the distance + VectorCopy (trace.endpos, ent->s.origin); // move me + /* if (ent->chain) + { + VectorCopy(ent->s.origin, ent->chain->s.origin); + } + */ VectorCopy (ent->velocity, original_velocity); // store what my velocity was + numplanes = 0; + } + + if (trace.fraction == 1) + break; // moved the entire distance of the trace, get out of this loop + + hit = trace.ent; // If we're getting here, we hit something. store it + + if (trace.plane.normal[2] > 0.7) // we hit floor + { + blocked |= 1; + if (( hit->solid == SOLID_BSP) || (hit->solid == SOLID_GHOUL)) // *** should this include models? i think so +// if ( hit->solid == SOLID_BSP ) + { + ent->groundentity = hit; + ent->groundentity_linkcount = hit->linkcount; + } + SV_HandleGenericGroundEffect(ent); + } + if (trace.plane.normal[2] < 0.7) + { + blocked |= 2; // step or wall + } +/* if (!trace.plane.normal[2]) + { + blocked |= 2; // step or wall + } +*/ + // + // run the impact function + // + if (!SV_Impact (ent, &trace)) // runs their touch functions + { + break; + } + if (!ent->inuse) + break; // if we lost our entity due to the impact function, get out + + time_left -= time_left * trace.fraction; + + // clipped to another plane + if (numplanes >= MAX_CLIP_PLANES) + { // this shouldn't really happen + VectorCopy (vec3_origin, ent->velocity); + return; + } + + VectorCopy (trace.plane.normal, planes[numplanes]); // store normals of the planes I hit + numplanes++; + + // + // modify original_velocity so it parallels all of the clip planes + // + for (i=0 ; ielasticity); +// if elasticity is -1, we want to use whatever the ent's velocity is now, to plow through stuff. + if (ent->elasticity == -1) + { + VectorCopy(ent->velocity, new_velocity); + } + for (j=0 ; jvelocity); + } + else + { // go along the crease + if (numplanes != 2) + { + VectorCopy (vec3_origin, ent->velocity); + return; + } + CrossProduct (planes[0], planes[1], dir); + d = DotProduct (dir, ent->velocity); + VectorScale (dir, d, ent->velocity); + } + } + + SV_CheckGround (ent); + } + + groundentity = ent->groundentity; // I was standing on this (NULL if air) + if (groundentity) + { + wasonground = true; + } + else + { + wasonground = false; + } + + if (ent->avelocity[0] || ent->avelocity[1] || ent->avelocity[2]) + { + SV_Rotate(ent); // Go ahead and rotate for now, + // but this might be a good place for + // a collision test some day + SV_AddRotationalFriction (ent, wasonground); // Add rotational friction or + // rotational air resistance + } + + if (ent->velocity[0] || ent->velocity[1] || ent->velocity[2]) + { + SV_AddLinearFriction(ent, wasonground); // Add linear friction or air resistance + } + + gi.linkentity (ent); +} + +//============================================================================ +/* +================ +G_RunEntity + +================ +*/ +void G_RunEntity (edict_t *ent) +{ + + switch ( (int)ent->movetype) + { + case MOVETYPE_PUSH: + case MOVETYPE_STOP: + SV_Physics_Pusher (ent); + break; + case MOVETYPE_NONE: + SV_Physics_None (ent); + break; + case MOVETYPE_NOCLIP: + SV_Physics_Noclip (ent); + break; + case MOVETYPE_STEP: + SV_Physics_Step (ent); + break; + case MOVETYPE_TOSS: + case MOVETYPE_BOUNCE: + case MOVETYPE_FLY: + case MOVETYPE_FLYMISSILE: + SV_Physics_Toss (ent); + break; + case MOVETYPE_DAN: + case MOVETYPE_TOUCHNOTSOLID: + SV_Physics_Dan (ent); + break; + default: + gi.error ("SV_Physics: bad movetype %i", (int)ent->movetype); + } +} + +void SV_HandleGenericGroundEffect(edict_t *ent) +{ + // are velocities negative or positive at this point??? + if(ent->client) + { // player floor collision is already handled elsewhere + return; + } + + if (ent->health <= 0) + { + return; + } + + if(ent->velocity[2] > -100) +// if(ent->velocity[2] > -30) + { + } + else if(ent->velocity[2] > -200) +// else if(ent->velocity[2] > -120) + { + FX_SetEvent(ent, EV_OBJECT_COLLIDE_SHORT); + } + else if(ent->velocity[2] > -400) +// else if(ent->velocity[2] > -360) + { + FX_SetEvent(ent, EV_OBJECT_COLLIDE_MEDIUM); + } + else + { + FX_SetEvent(ent, EV_OBJECT_COLLIDE_FAR); + } +} + +void PHYS_ClearAttachList(edict_t *ed) +{ + edict_t *curCheck; + int next; + + if(ed->attachOwner) + { //remove a guy from the list + curCheck = &g_edicts[ed->attachOwner]; + + while(curCheck->attachChain) + { + if(&g_edicts[curCheck->attachChain] == ed) + {//eliminate this guy from the attach chain list + curCheck->attachChain = ed->attachChain; + ed->attachChain = 0; + break; + } + curCheck = &g_edicts[curCheck->attachChain]; + } + assert(attachmentNotCircular(&g_edicts[ed->attachOwner])); + } + else if(ed->attachChain) + { //must be the start of a chain - disconnect everyone + curCheck = &g_edicts[ed->attachChain]; + next = curCheck->attachChain; + + while(next) + { + next = curCheck->attachChain; + curCheck->attachChain = 0; + curCheck->attachOwner = 0; + curCheck = &g_edicts[next]; + } + + } +} diff --git a/Source/Game/gamecpp/g_player.cpp b/Source/Game/gamecpp/g_player.cpp new file mode 100644 index 0000000..48ddfc6 --- /dev/null +++ b/Source/Game/gamecpp/g_player.cpp @@ -0,0 +1,150 @@ +#include "g_local.h" + +void CalcFireDirection(edict_t *self, vec3_t fwd, float waverVal, float maxWaver, attacks_e atkID); +void SetProjVel(edict_t &self, edict_t&newEnt, float fwd, float right, float up); +void FireServer(sharedEdict_t &sh, edict_t &ent, inven_c &inven); +void AltfireServer(sharedEdict_t &sh, edict_t &ent, inven_c &inven); +void ShowReload(edict_t *ent);//in p_body +void WeaponDropServer(edict_t *ent,int type, int clipSize); +bool DoWeHaveTheFlag(edict_t *ent); +void ShowItemUse(edict_t *ent, int itemType);//in p_body +void ItemDropServer(edict_t *ent,int type,int ammmoCount); + +bool flashpackUse(edict_t &ent, itemSlot_c &slot); +bool neuralGrenadeUse(edict_t &ent, itemSlot_c &slot); +bool c4use(edict_t &ent, itemSlot_c &slot); +bool fireGrenade(weaponFireInfo_t &wf); +bool fireMolitov(weaponFireInfo_t &wf); +bool claymoreUse(edict_t &ent, itemSlot_c &slot); +bool medkitUse(edict_t &ent, itemSlot_c &slot); +bool grenadeUse(edict_t &ent, itemSlot_c &slot); +bool goggleUse(edict_t &ent, itemSlot_c &slot); + +void CacheAttack(int atkID); + +float getFireEvent(edict_t *ent); +void clearFireEvent(edict_t *ent); +float getAltfireEvent(edict_t *ent); +void clearAltfireEvent(edict_t *ent); + +/* +=============== +Game_ShutdownPlayer + +Called when either the entire server is being killed, or it is changing to a +different game directory. +=============== +*/ + +void Game_ShutdownPlayer (void) +{ + if (!pe) + { + return; + } + + pe->Shutdown (); + gi.Sys_UnloadPlayer (0); + pe = NULL; +} + +/* +=============== +Game_InitPlayer + +Init the player subsystem for a new map. +=============== +*/ + +int *Game_InitPlayer(void) +{ + player_com_import_t picom; + player_sv_import_t pisv; + + if (pe) + { + Game_ShutdownPlayer(); + } + + picom.Cvar_Get=gi.cvar; + picom.Cvar_Set=gi.cvar_set; + picom.Cvar_SetValue=gi.cvar_setvalue; + + picom.Cmd_Argc=gi.argc; + picom.Cmd_Argv=gi.argv; + picom.Cmd_Args=gi.args; + + picom.Com_Printf = Com_Printf; + picom.Com_Sprintf = Com_sprintf; + picom.Com_DPrintf = gi.dprintf; + + picom.FS_LoadFile=gi.FS_LoadFile; + picom.FS_FreeFile=gi.FS_FreeFile; + + picom.irand = gi.irand; + + picom.ghl_specular=ghl_specular; + picom.FindGSQFile=gi.FindGSQFile; + picom.ReadGsqEntry=gi.ReadGsqEntry; + picom.PrecacheGSQFile=gi.PrecacheGSQFile; + picom.RegisterGSQSequences=gi.RegisterGSQSequences; + picom.TurnOffPartsFromGSQFile=gi.TurnOffPartsFromGSQFile; + + pisv.GetGhoul=gi.GetGhoul; + pisv.levelTime=&level.time; + pisv.FireHelper=&FireServer; + pisv.AltfireHelper=&AltfireServer; + pisv.ShowReload=&ShowReload; + pisv.ShowItemUse=&ShowItemUse; + pisv.WeaponDrop=&WeaponDropServer; + pisv.DoWeHaveTheFlag=&DoWeHaveTheFlag; + pisv.getFireEvent=getFireEvent; + pisv.clearFireEvent=clearFireEvent; + pisv.getAltfireEvent=getAltfireEvent; + pisv.clearAltfireEvent=clearAltfireEvent; + pisv.ItemDrop=&ItemDropServer; + pisv.EffectIndex=gi.effectindex; + pisv.CvarInfo = gi.cvar_info; + pisv.SP_Print = gi.SP_Print; + pisv.SP_GetStringText = gi.SP_GetStringText; + pisv.SoundIndex=gi.soundindex; + pisv.Sound=gi.sound; + pisv.AddCommand = gi.AddCommandString; + pisv.flashpackUse=&flashpackUse; + pisv.neuralGrenadeUse=&neuralGrenadeUse; + pisv.c4use=&c4use; + pisv.claymoreuse=&claymoreUse; + pisv.medkituse=&medkitUse; + pisv.grenadeuse=&grenadeUse; + pisv.goggleuse=&goggleUse; + pisv.WriteByteSizebuf=gi.WriteByteSizebuf; + pisv.WriteShortSizebuf=gi.WriteShortSizebuf; + pisv.WriteLongSizebuf=gi.WriteLongSizebuf; + pisv.ReliableWriteByteToClient=gi.ReliableWriteByteToClient; + pisv.ReliableWriteDataToClient=gi.ReliableWriteDataToClient; + pisv.SZ_Init=gi.SZ_Init; + pisv.SZ_Clear=gi.SZ_Clear; + pisv.SZ_Write=gi.SZ_Write; + pisv.AppendToSavegame = gi.AppendToSavegame; + pisv.ReadFromSavegame = gi.ReadFromSavegame; + pisv.CacheAttack = CacheAttack; + + pe = (player_export_t *)gi.Sys_GetPlayerAPI((void *)&picom,(void *)NULL,(void *)&pisv,0); + + if (!pe) + { + gi.error("Game failed to load player DLL"); + } + if (pe->api_version != PLAYER_API_VERSION) + { + gi.error("player is version %i, not %i", pe->api_version,PLAYER_API_VERSION); + } + + pe->Init(); + + gi.dprintf ("==== InitPlayer Complete ====\n"); + + return(pe->isClient); +} + +// end \ No newline at end of file diff --git a/Source/Game/gamecpp/g_save.cpp b/Source/Game/gamecpp/g_save.cpp new file mode 100644 index 0000000..386c65b --- /dev/null +++ b/Source/Game/gamecpp/g_save.cpp @@ -0,0 +1,2244 @@ +#define WINDOWS_LEAN_AND_MEAN +#include + +#include "g_local.h" +#include "ds.h" +#include "fields.h" +#include "callback.h" +#include "ef_flags.h" + +// all pointer fields should be listed here, or savegames +// won't work properly (they will crash and burn). +// this wasn't just tacked on to the fields array, because +// these don't need names, we wouldn't want map fields using +// some of these, and if one were accidentally present twice +// it would double swizzle (fuck) the pointer. + +void AngleMove_Begin(edict_t *self); +void AngleMove_Done(edict_t *self); +void AngleMove_Final(edict_t *self); +void auto_gun_arc(edict_t *self); +void auto_gun_target(edict_t *self); +void banner_animate(edict_t *self); +void barrel_chemical_fall(edict_t *self); +void bed_deccel(edict_t *self); +void bed_stop(edict_t *self); +void blinds_stoppain(edict_t *self); +void blownpartremove_think(edict_t *self); +void boltDropNotSolid(edict_t *self); +void bosnia_truck_remove(edict_t *self); +void button_done(edict_t *self); +void button_return(edict_t *self); +void button_wait(edict_t *self); +void buttonInit(edict_t *self); +void c4Explode(edict_t *self); +void cash_register_paindone(edict_t *self); +void chair_squeak(edict_t *self); +void chandelier_spin(edict_t *self); +void CharThink(edict_t *self); +void chunk_spewer_think(edict_t *self); +void ClearEffects (edict_t *ent); +void Cobra2_OutOfControl(edict_t *self); +void Cobra2AIHelper(edict_t *self); +void Cobra2AutoFireHelper(edict_t *self); +void Cobra2ChainGunEnableHelper(edict_t *self); +void Cobra2DeathDestHelper(edict_t *self); +void Cobra2FaceAbsDirHelper(edict_t *self); +void Cobra2FaceAbsHelper(edict_t *self); +void Cobra2FaceRelCoordsHelper(edict_t *self); +void Cobra2FaceRelEntHelper(edict_t *self); +void Cobra2FireAtAbsHelper(edict_t *self); +void Cobra2FireAtRelEntHelper(edict_t *self); +void Cobra2FireAtRelHelper(edict_t *self); +void Cobra2GotoCoordsHelper(edict_t *self); +void Cobra2GotoRelEntHelper(edict_t *self); +void Cobra2HeadFaceAbsCoordsHelper(edict_t *self); +void Cobra2HeadFaceRelCoordsHelper(edict_t *self); +void Cobra2HeadFaceRelEntHelper(edict_t *self); +void Cobra2HealthHelper(edict_t *self); +void Cobra2HoverHelper(edict_t *self); +void Cobra2LandHelper(edict_t *self); +void Cobra2RearmHelper(edict_t *self); +void Cobra2RocketsEnableHelper(edict_t *self); +void Cobra2StrafeHelper(edict_t *self); +void Cobra2TraceDimsHelper(edict_t *self); +void Cobra2WorldHelper(edict_t *self); +void Cobra2Think_AI(edict_t *self); +void Cobra2Think_DipFireAt(edict_t *self); +void Cobra2Think_FireAt(edict_t *self); +void Cobra2Think_GotoFireAt(edict_t *self); +void Cobra2Think_HeadToDest(edict_t *self); +void Cobra2Think_Hover(edict_t *self); +void Cobra2Think_Land(edict_t *self); +void Cobra2Think_MovementFinish(edict_t *self); +void Cobra2Think_Repair(edict_t *self); +void Cobra2Think_SidestrafeToDest(edict_t *self); +void Cobra2Think_SmartHeadToDest(edict_t *self); +void Cobra2Think_TakeOff(edict_t *self); +void Cobra2Think_TurnToFace(edict_t *self); +void Cobra2TraceDimsHelper(edict_t *self); +void Cobra2WorldHelper(edict_t *self); +void cone_fall(edict_t *self); +void dekker_init (edict_t *self); +void desk_phone_effects(edict_t *self); +void door_go_down(edict_t *self); +void door_hit_bottom(edict_t *self); +void door_hit_top(edict_t *self); +void door_secret_done(edict_t *self); +void door_secret_move1(edict_t *self); +void door_secret_move2(edict_t *self); +void door_secret_move3(edict_t *self); +void door_secret_move4(edict_t *self); +void door_secret_move5(edict_t *self); +void door_secret_move6(edict_t *self); +void door_spawn_areaportal_think(edict_t *self); +void DoRespawn(edict_t *self); +void drawMonkeyThink(edict_t *self); +void dustsource_think(edict_t *self); +void EmergencyLightFade(edict_t *self); +void EmergencyLightRedGlow(edict_t *self); +void EmergencyLightReturn(edict_t *self); +void emergency_light_blue_sequence(edict_t *self); +void emergency_light_sequence(edict_t *self); +void EmergencyLightStutter(edict_t *self); +void exploding_heli_final(edict_t *self); +void exploding_heli_remove(edict_t *self); +void exploding_heli_think(edict_t *self); +void exploding_heli_think2(edict_t *self); +void fan_big_accelerate(edict_t *self); +void FinishRespawn(edict_t *self); +void fire_extinguisher_dying(edict_t *self); +void fireballBurn(edict_t *self); +void fireballRemove(edict_t *self); +void FireThink(edict_t *self); +void fish_sink(edict_t *self); +void fish_think(edict_t *self); +void flag_pole_sequence(edict_t *self); +void flameGlobThink(edict_t *self); +void flashpackExplode(edict_t *self); +void flatbed_accel(edict_t *self); +void flatbed_deccel(edict_t *self); +void flatbed_linecheck(edict_t *self); +void flatbed_remove(edict_t *self); +void flatbed_stop(edict_t *self); +void func_clock_think(edict_t *self); +void funcfade_think (edict_t *self); +void func_object_release(edict_t *self); +void func_remote_camera_think(edict_t *self); +void func_timer_think(edict_t *self); +void func_train_find(edict_t *self); +void funcshake_think(edict_t *self); +void G_FreeEdict(edict_t *self); +void generic_animal_init(edict_t *self); +void generic_armor_init(edict_t *self); +void generic_enemy_npc_init(edict_t *self); +void generic_grunt_init(edict_t *self); +void generic_heavyweapons_init(edict_t *self); +void generic_heli_init(edict_t *self); +void generic_leader_init(edict_t *self); +void generic_npc_init(edict_t *self); +void generic_snowcat_init (edict_t *self); +void generic_tank_init(edict_t *self); +void GetReadyForBlownPartAIToTakeOver(edict_t *ent); +void ghoul_model_think(edict_t *self); +void gib_think(edict_t *self); +void globe_spin(edict_t *self); +void grenadeThink(edict_t *self); +void gun_big_target (edict_t *self); +void guttedcow_swing(edict_t *self); +void HeliMissileRemove2(edict_t *self); +void hydrant_pulse(edict_t *self); +void infernoThink(edict_t *self); +void invis_attack_think(edict_t *self); +void iraq_fruit_stand_throw(edict_t *self); +void itemDropToFloor(edict_t *self); +void keep_using_think(edict_t *self); +void kill_lamp(edict_t *self); +void lamp_hang_swing(edict_t *self); +void LightningGenThink(edict_t *self); +void linetrapThink(edict_t *self); +void makebloodpool(edict_t *self); +void MissileCountdown(edict_t *self); +void MissileRemove(edict_t *self); +void MissileSplit(edict_t *ent); +void MolitovThink(edict_t *self); +void Move_Begin(edict_t *self); +void Move_Done(edict_t *self); +void Move_Final(edict_t *self); +void multi_wait(edict_t *self); +void Obj_tipoverthink(edict_t *self); +void ObjectStopMove(edict_t *self); +void pathtest_think(edict_t *self); +void plat_go_down(edict_t *self); +void plat_hit_bottom(edict_t *self); +void plat_hit_top(edict_t *self); +void platInit(edict_t *self); +void portcullis_think(edict_t* self); +void rotateInit(edict_t *self); +void searchbeam_think(edict_t* ent); +void searchlight_think(edict_t *self); +void security_cam_rotate(edict_t *self); +void security_cam_scan(edict_t *self); +void sideobeef_swing(edict_t *self); +void sink_spurt(edict_t *self); +void skyfadeThink(edict_t *self); +void SnowcatW_GotoCoords(edict_t *ent); +void SnowcatW_FireCannonAtCoords(edict_t *ent); +void SnowcatW_MachGunAuto(edict_t *ent); +void soundGenInit(edict_t *self); +void spark_gen_think(edict_t *self); +void spawner_booster_defaultthink(edict_t *ent); +void spawnerInit(edict_t *ent); +void spawnerThink(edict_t *ent); +void speaker_spark(edict_t *self); +void SteamThink(edict_t *self); +void stoplight_change(edict_t *self); +void TankW_GotoCoords(edict_t *ent); +void TankW_FireCannonAtCoords(edict_t *ent); +void TankW_CannonAttack(edict_t *ent); +void TankW_MachGunAuto(edict_t *ent); +void TankW_Die(edict_t *ent); +void TankW_AimTurret(edict_t *ent); +void target_crosslevel_target_think(edict_t *self); +void target_earthquake_think(edict_t *self); +void target_explosion_explode(edict_t *self); +void target_laser_start(edict_t *self); +void target_laser_think(edict_t *self); +void target_lightramp_think(edict_t *self); +void Testboltzap(edict_t *self); +void Think_AccelMove(edict_t *self); +void Think_CalcMoveSpeed(edict_t *self); +void Think_Delay(edict_t *self); +void Think_SpawnDoorTrigger(edict_t *self); +void toilet_dribble(edict_t *self); +void toilet_pulse(edict_t *self); +void train_accel(edict_t *self); +void train_deccel(edict_t *self); +void train_getlength(edict_t *self); +void train_linecheck(edict_t *self); +void train_next(edict_t *self); +void train_stop(edict_t *self); +void train_wait(edict_t *self); +void trainarm_think(edict_t *self); +void trash_piece_think(edict_t *self); +void trashcan_barrel_fall(edict_t *self); +void trigger_countdown_think(edict_t *self); +void trigger_elevator_init(edict_t *self); +void tv_ceiling_sequence(edict_t *self); +void tv_damaged_think(edict_t *self); +void tv_wall_sequence(edict_t *self); +void urinal_cookie_think(edict_t *self); +void urinal_die2(edict_t *self); +void wet_floor_fall(edict_t *self); +void WhiteThink(edict_t *self); +void spawnerThink(edict_t *ent); +void fireEnemyMWave(edict_t *self); + +void (*think_f[])(edict_t *self) = +{ + AngleMove_Begin, + AngleMove_Done, + AngleMove_Final, + auto_gun_arc, + auto_gun_target, + banner_animate, + barrel_chemical_fall, + bed_deccel, + bed_stop, + blinds_stoppain, + blownpartremove_think, + boltDropNotSolid, + bosnia_truck_remove, + button_done, + button_return, + button_wait, + buttonInit, + c4Explode, + cash_register_paindone, + chair_squeak, + chandelier_spin, + CharThink, + chunk_spewer_think, + ClearEffects, + Cobra2_OutOfControl, + Cobra2AIHelper, + Cobra2AutoFireHelper, + Cobra2ChainGunEnableHelper, + Cobra2DeathDestHelper, + Cobra2FaceAbsDirHelper, + Cobra2FaceAbsHelper, + Cobra2FaceRelCoordsHelper, + Cobra2FaceRelEntHelper, + Cobra2FireAtAbsHelper, + Cobra2FireAtRelEntHelper, + Cobra2FireAtRelHelper, + Cobra2GotoCoordsHelper, + Cobra2GotoRelEntHelper, + Cobra2HeadFaceAbsCoordsHelper, + Cobra2HeadFaceRelCoordsHelper, + Cobra2HeadFaceRelEntHelper, + Cobra2HealthHelper, + Cobra2HoverHelper, + Cobra2LandHelper, + Cobra2RearmHelper, + Cobra2RocketsEnableHelper, + Cobra2StrafeHelper, + Cobra2TraceDimsHelper, + Cobra2WorldHelper, + Cobra2Think_AI, + Cobra2Think_DipFireAt, + Cobra2Think_FireAt, + Cobra2Think_GotoFireAt, + Cobra2Think_HeadToDest, + Cobra2Think_Hover, + Cobra2Think_Land, + Cobra2Think_MovementFinish, + Cobra2Think_Repair, + Cobra2Think_SidestrafeToDest, + Cobra2Think_SmartHeadToDest, + Cobra2Think_TakeOff, + Cobra2Think_TurnToFace, + Cobra2TraceDimsHelper, + Cobra2WorldHelper, + cone_fall, + dekker_init, + desk_phone_effects, + door_go_down, + door_hit_bottom, + door_hit_top, + door_secret_done, + door_secret_move1, + door_secret_move2, + door_secret_move3, + door_secret_move4, + door_secret_move5, + door_secret_move6, + door_spawn_areaportal_think, + DoRespawn, + drawMonkeyThink, + dustsource_think, + EmergencyLightFade, + EmergencyLightRedGlow, + EmergencyLightReturn, + emergency_light_blue_sequence, + emergency_light_sequence, + EmergencyLightStutter, + exploding_heli_final, + exploding_heli_remove, + exploding_heli_think, + exploding_heli_think2, + fan_big_accelerate, + FinishRespawn, + fireballBurn, + fireballRemove, + fire_extinguisher_dying, + FireThink, + fish_sink, + fish_think, + flag_pole_sequence, + flameGlobThink, + flashpackExplode, + flatbed_accel, + flatbed_deccel, + flatbed_linecheck, + flatbed_remove, + flatbed_stop, + func_clock_think, + funcfade_think, + func_object_release, + func_remote_camera_think, + func_timer_think, + func_train_find, + funcshake_think, + G_FreeEdict, + generic_animal_init, + generic_armor_init, + generic_enemy_npc_init, + generic_grunt_init, + generic_heavyweapons_init, + generic_heli_init, + generic_leader_init, + generic_npc_init, + generic_snowcat_init, + generic_tank_init, + GetReadyForBlownPartAIToTakeOver, + ghoul_model_think, + gib_think, + globe_spin, + grenadeThink, + gun_big_target, + guttedcow_swing, + HeliMissileRemove2, + hydrant_pulse, + infernoThink, + invis_attack_think, + iraq_fruit_stand_throw, + itemDropToFloor, + keep_using_think, + kill_lamp, + lamp_hang_swing, + linetrapThink, + LightningGenThink, + makebloodpool, + MissileCountdown, + MissileRemove, + MissileSplit, + MolitovThink, + Move_Begin, + Move_Done, + Move_Final, + multi_wait, + Obj_tipoverthink, + ObjectStopMove, + pathtest_think, + plat_go_down, + plat_hit_bottom, + plat_hit_top, + platInit, + portcullis_think, + rotateInit, + searchbeam_think, + searchlight_think, + security_cam_rotate, + security_cam_scan, + sideobeef_swing, + sink_spurt, + skyfadeThink, + SnowcatW_GotoCoords, + SnowcatW_FireCannonAtCoords, + SnowcatW_MachGunAuto, + soundGenInit, + spark_gen_think, + spawner_booster_defaultthink, + spawnerInit, + spawnerThink, + speaker_spark, + SteamThink, + stoplight_change, + TankW_GotoCoords, + TankW_FireCannonAtCoords, + TankW_CannonAttack, + TankW_MachGunAuto, + TankW_Die, + TankW_AimTurret, + target_crosslevel_target_think, + target_earthquake_think, + target_explosion_explode, + target_laser_start, + target_laser_think, + target_lightramp_think, + Testboltzap, + Think_AccelMove, + Think_CalcMoveSpeed, + Think_Delay, + Think_SpawnDoorTrigger, + toilet_dribble, + toilet_pulse, + train_accel, + train_deccel, + train_getlength, + train_linecheck, + train_next, + train_stop, + train_wait, + trainarm_think, + trash_piece_think, + trashcan_barrel_fall, + trigger_countdown_think, + trigger_elevator_init, + tv_ceiling_sequence, + tv_damaged_think, + tv_wall_sequence, + urinal_cookie_think, + urinal_die2, + wet_floor_fall, + WhiteThink, + spawnerThink, + fireEnemyMWave +}; + +void door_blocked(edict_t *self, edict_t *other); +void door_secret_blocked(edict_t *self, edict_t *other); +void plat_blocked(edict_t *self, edict_t *other); +void rotating_blocked(edict_t *self, edict_t *other); +void train_blocked(edict_t *self, edict_t *other); + +void (*blocked_f[])(edict_t *self, edict_t *other) = +{ + door_blocked, + door_secret_blocked, + plat_blocked, + rotating_blocked, + train_blocked +}; + +void apjack_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void barbwire_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void barrel_fire_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void BlownPartTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void button_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void c4Touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void car_rolls_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void Cobra2Touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void door_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void fireballCollide(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void flashTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void func_object_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void generic_monster_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void gib_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void grenadeTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void HeliMissileCollide2(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void hurt_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void infernoTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void itemAmmoTouch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void itemArmorTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void itemCashTouch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void itemEquipTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void itemHealthTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void itemWeaponTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void keep_using_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void KnifeThrowCollide(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void landmine_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void MissileCollide(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void MissileCollide2(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void MissileSmallCollide(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void molitovCollide(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void objectives_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void rotating_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void path_corner_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void PhosTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void point_combat_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void safezone_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void SimpleModelTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void sink_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void SlugCollide(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void StarThrowCollide(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void tabletouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void tank_jack_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void tanktouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void Touch_DoorTrigger(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void Touch_Multi(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void Touch_Plat_Center(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void touch_pushkillbox(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void train_smush(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void trigger_countdown_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void trigger_gravity_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void trigger_monsterjump_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void trigger_movedown_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void trigger_push_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void truck_touch (edict_t *ent, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void tv_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void urinal_cookie_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); +void danglyTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf); + +void (*touch_f[])(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) = +{ + apjack_touch, + barbwire_touch, + barrel_fire_touch, + BlownPartTouch, + button_touch, + car_rolls_touch, + c4Touch, + Cobra2Touch, + fireballCollide, + door_touch, + flashTouch, + func_object_touch, + generic_monster_touch, + gib_touch, + grenadeTouch, + HeliMissileCollide2, + hurt_touch, + infernoTouch, + itemAmmoTouch , + itemArmorTouch, + itemCashTouch , + itemEquipTouch, + itemHealthTouch, + itemWeaponTouch, + keep_using_touch, + KnifeThrowCollide, + landmine_touch, + MissileCollide, + MissileCollide2, + MissileSmallCollide, + molitovCollide, + objectives_touch, + path_corner_touch, + PhosTouch, + safezone_touch, + point_combat_touch, + rotating_touch, + SimpleModelTouch, + sink_touch, + SlugCollide, + StarThrowCollide, + tabletouch, + tank_jack_touch, + tanktouch, + Touch_DoorTrigger, + Touch_Multi, + Touch_Plat_Center, + touch_pushkillbox, + train_smush, + trigger_countdown_touch, + trigger_gravity_touch, + trigger_monsterjump_touch, + trigger_movedown_touch, + trigger_push_touch, + truck_touch, + tv_touch, + urinal_cookie_touch, + danglyTouch, +}; + +void alarm_use(edict_t *self, edict_t *other, edict_t *activator); +void alley_wall_use(edict_t *self, edict_t *other, edict_t *activator); +void barrel_chemical_use(edict_t *self, edict_t *other, edict_t *activator); +void bed_go(edict_t *self, edict_t *other, edict_t *activator); +void bedwheels_use(edict_t *self, edict_t *other, edict_t *activator); +void breakable_brush_use(edict_t *self, edict_t *other, edict_t *activator); +void button_use(edict_t *self, edict_t *other, edict_t *activator); +void caged_use(edict_t *self, edict_t *other, edict_t *activator); +void candelabra_use (edict_t *ent, edict_t *other, edict_t *activator); +void car_european_use(edict_t *self, edict_t *other, edict_t *activator); +void car_rolls_use(edict_t *self, edict_t *other, edict_t *activator); +void chandelier_use (edict_t *ent, edict_t *other, edict_t *activator); +void chunk_spewer_use(edict_t *self, edict_t *other, edict_t *activator); +void Cobra2_ToggleGun(edict_t *self, edict_t *other, edict_t *activator); +void Dekker_split(edict_t *self, edict_t *other, edict_t *activator); +void desk_lamp_use (edict_t *ent, edict_t *other, edict_t *activator); +void door_secret_use(edict_t *self, edict_t *other, edict_t *activator); +void door_use(edict_t *self, edict_t *other, edict_t *activator); +void dustsource_use(edict_t *self, edict_t *other, edict_t *activator); +void effect_continual_use(edict_t *self, edict_t *other, edict_t *activator); +void effect_use(edict_t *self, edict_t *other, edict_t *activator); +void emergency_blue_use(edict_t *self, edict_t *other, edict_t *activator); +void emergency_lights_use(edict_t *self, edict_t *other, edict_t *activator); +void emergency_use(edict_t *self, edict_t *other, edict_t *activator); +void explodeUse(edict_t *self, edict_t *other, edict_t *activator); +void extinguisher_use(edict_t *self, edict_t *other, edict_t *activator); +void f_HtPG_use (edict_t *self, edict_t *other, edict_t *activator); +void fan_big_use(edict_t *self, edict_t *other, edict_t *activator); +void fire_use(edict_t *self, edict_t *other, edict_t *activator); +void fish_die(edict_t *self, edict_t *other, edict_t *activator); +void flatbed_go(edict_t *self, edict_t *other, edict_t *activator); +void flatbedwheels_use (edict_t *self, edict_t *other, edict_t *activator); +void forklift_use(edict_t *self, edict_t *other, edict_t *activator); +void func_ambientSetUse(edict_t *self, edict_t *other, edict_t *activator); +void func_clock_use(edict_t *self, edict_t *other, edict_t *activator); +void func_conveyor_use(edict_t *self, edict_t *other, edict_t *activator); +void func_musicControlUse(edict_t *self, edict_t *other, edict_t *activator); +void func_object_use(edict_t *self, edict_t *other, edict_t *activator); +void func_score_use(edict_t *self, edict_t *other, edict_t *activator); +void func_timer_use(edict_t *self, edict_t *other, edict_t *activator); +void func_wall_use(edict_t *self, edict_t *other, edict_t *activator); +void funcfade_use(edict_t *self, edict_t *other, edict_t *activator); +void funcshake_use(edict_t *self, edict_t *other, edict_t *activator); +void generic_wpn_c4_use(edict_t *self, edict_t *other, edict_t *activator); +void generic_monster_activate(edict_t *self, edict_t *other, edict_t *activator); +void gun_castle_use(edict_t *self, edict_t *other, edict_t *activator); +void hanging_use(edict_t *self, edict_t *other, edict_t *activator); +void hurt_use(edict_t *self, edict_t *other, edict_t *activator); +void ignite_use(edict_t *self, edict_t *other, edict_t *activator); +void infernoUse(edict_t *self, edict_t *other, edict_t *activator); +void invis_attack_use(edict_t *ent, edict_t *other, edict_t *activator); +void iraq_valve_use(edict_t *self, edict_t *other, edict_t *activator); +void lamp_hang_use(edict_t *self, edict_t *other, edict_t *activator); +void lantern_use (edict_t *ent, edict_t *other, edict_t *activator); +void lantern2_use(edict_t *self, edict_t *other, edict_t *activator); +void lantern3_use(edict_t *ent, edict_t *other, edict_t *activator); +void light_use(edict_t *self, edict_t *other, edict_t *activator); +void LighteningGenUse(edict_t *self, edict_t *other, edict_t *activator); +void linefountainUse(edict_t *self, edict_t *other, edict_t *activator); +void lineTrapUse(edict_t *self, edict_t *other, edict_t *activator); +void military_door_use(edict_t *self, edict_t *other, edict_t *activator); +void objectives_use(edict_t *self, edict_t *other, edict_t *activator); +void portcullis_use(edict_t *self, edict_t *other, edict_t *activator); +void raingen_use(edict_t *self, edict_t *other, edict_t *activator); +void rainTrigger_use(edict_t *self, edict_t *other, edict_t *activator); +void roadflare_use(edict_t *self, edict_t *other, edict_t *activator); +void rotating_use(edict_t *self, edict_t *other, edict_t *activator); +void safezone_use (edict_t *self, edict_t *other, edict_t *activator); +void script_use(edict_t *self, edict_t *other, edict_t *activator); +void shop_use(edict_t *self, edict_t *other, edict_t *activator); +void smoke_gen_use(edict_t *self, edict_t *other, edict_t *activator); +void smokeBurstUse(edict_t *self, edict_t *other, edict_t *activator); +void sound_gen_use(edict_t *self, edict_t *other, edict_t *activator); +void spark_gen_use(edict_t *self, edict_t *other, edict_t *activator); +void spawnerUse(edict_t *self, edict_t *other, edict_t *activator); +void street_modern_use(edict_t *self, edict_t *other, edict_t *activator); +void SteamUse(edict_t *self, edict_t *other, edict_t *activator); +void tank_gas_use(edict_t *self, edict_t *other, edict_t *activator); +void TankUse(edict_t *self, edict_t *other, edict_t *activator); +void target_earthquake_use(edict_t *self, edict_t *other, edict_t *activator); +void target_laser_use(edict_t *self, edict_t *other, edict_t *activator); +void target_lightramp_use(edict_t *self, edict_t *other, edict_t *activator); +void target_string_use(edict_t *self, edict_t *other, edict_t *activator); +void train_go(edict_t *self, edict_t *other, edict_t *activator); +void train_use(edict_t *self, edict_t *other, edict_t *activator); +void trainarm_spawn(edict_t *self, edict_t *other, edict_t *activator); +void trigger_activate_use (edict_t *self, edict_t *other, edict_t *activator); +void trigger_brush_use(edict_t *self, edict_t *other, edict_t *activator); +void trigger_countdown_use(edict_t *self, edict_t *other, edict_t *activator); +void trigger_counter_use(edict_t *self, edict_t *other, edict_t *activator); +void trigger_crosslevel_trigger_use(edict_t *self, edict_t *other, edict_t *activator); +void trigger_elevator_use(edict_t *self, edict_t *other, edict_t *activator); +void trigger_enable(edict_t *self, edict_t *other, edict_t *activator); +void trigger_push_use(edict_t *self, edict_t *other, edict_t *activator); +void trigger_relay_use(edict_t *self, edict_t *other, edict_t *activator); +void tv_ceiling_use(edict_t *self, edict_t *other, edict_t *activator); +void tv_wall_use(edict_t *self, edict_t *other, edict_t *activator); +void urinal_use(edict_t *self, edict_t *other, edict_t *activator); +void Use_Areaportal(edict_t *self, edict_t *other, edict_t *activator); +void Use_DoorTrigger(edict_t *self, edict_t *other, edict_t *activator); +void use_killbox(edict_t *self, edict_t *other, edict_t *activator); +void Use_Multi(edict_t *self, edict_t *other, edict_t *activator); +void Use_Plat(edict_t *self, edict_t *other, edict_t *activator); +void use_player_armor(edict_t *self, edict_t *other, edict_t *activator); +void use_player_health(edict_t *self, edict_t *other, edict_t *activator); +void use_player_item(edict_t *self, edict_t *other, edict_t *activator); +void Use_remote_camera(edict_t *self, edict_t *other, edict_t *activator); +void use_snipercam_zoom(edict_t *self, edict_t *other, edict_t *activator); +void use_target_changelevel(edict_t *self, edict_t *other, edict_t *activator); +void use_target_explosion(edict_t *self, edict_t *other, edict_t *activator); +void use_target_goal(edict_t *self, edict_t *other, edict_t *activator); +void Use_Target_Help(edict_t *self, edict_t *other, edict_t *activator); +void use_target_secret(edict_t *self, edict_t *other, edict_t *activator); +void use_target_spawner(edict_t *self, edict_t *other, edict_t *activator); +void Use_Target_Speaker(edict_t *self, edict_t *other, edict_t *activator); +void use_target_splash(edict_t *self, edict_t *other, edict_t *activator); +void Use_Target_Tent(edict_t *self, edict_t *other, edict_t *activator); +void valve_use_portcullis(edict_t *self, edict_t *other, edict_t *activator); +void trigger_sound_use(edict_t *self, edict_t *other, edict_t *activator); + +void (*use_f[])(edict_t *self, edict_t *other, edict_t *activator) = +{ + alarm_use, + alley_wall_use, + barrel_chemical_use, + bed_go, + bedwheels_use, + breakable_brush_use, + button_use, + caged_use, + candelabra_use, + car_european_use, + car_rolls_use, + chandelier_use, + chunk_spewer_use, + Cobra2_ToggleGun, + Dekker_split, + desk_lamp_use, + door_secret_use, + door_use, + dustsource_use, + effect_continual_use, + effect_use, + emergency_blue_use, + emergency_lights_use, + emergency_use, + explodeUse, + extinguisher_use, + f_HtPG_use, + fan_big_use, + fire_use, + fish_die, + flatbed_go, + flatbedwheels_use, + forklift_use, + func_ambientSetUse, + func_clock_use, + func_conveyor_use, + func_musicControlUse, + func_object_use, + func_score_use, + func_timer_use, + func_wall_use, + funcfade_use, + funcshake_use, + generic_wpn_c4_use, + generic_monster_activate, + gun_castle_use, + hanging_use, + hurt_use, + ignite_use, + infernoUse, + invis_attack_use, + iraq_valve_use, + lamp_hang_use, + lantern_use, + lantern2_use, + lantern3_use, + light_use, + LighteningGenUse, + linefountainUse, + lineTrapUse, + military_door_use, + objectives_use, + portcullis_use, + raingen_use, + rainTrigger_use, + roadflare_use, + rotating_use, + safezone_use, + script_use, + shop_use, + smoke_gen_use, + smokeBurstUse, + sound_gen_use, + spark_gen_use, + spawnerUse, + SteamUse, + street_modern_use, + tank_gas_use, + TankUse, + target_earthquake_use, + target_laser_use, + target_lightramp_use, + target_string_use, + train_go, + train_use, + trainarm_spawn, + trigger_activate_use, + trigger_brush_use, + trigger_countdown_use, + trigger_counter_use, + trigger_crosslevel_trigger_use, + trigger_elevator_use, + trigger_enable, + trigger_push_use, + trigger_relay_use, + tv_ceiling_use, + tv_wall_use, + urinal_use, + Use_Areaportal, + Use_DoorTrigger, + use_killbox, + Use_Multi, + Use_Plat, + use_player_armor, + use_player_health, + use_player_item, + Use_remote_camera, + use_snipercam_zoom, + use_target_changelevel, + use_target_explosion, + use_target_goal, + Use_Target_Help, + use_target_secret, + use_target_spawner, + Use_Target_Speaker, + use_target_splash, + Use_Target_Tent, + valve_use_portcullis, + trigger_sound_use +}; + +void button_use(edict_t *self, edict_t *other, edict_t *activator); +void car_rolls_use(edict_t *self, edict_t *other, edict_t *activator); +void door_secret_use(edict_t *self, edict_t *other, edict_t *activator); +void extinguisher_use(edict_t *self, edict_t *other, edict_t *activator); +void generic_monster_use(edict_t *self, edict_t *other, edict_t *activator); +void keep_using_use(edict_t *self, edict_t *other, edict_t *activator); +void plDoorUse(edict_t *self, edict_t *other, edict_t *activator); +void trigger_heal_spent (edict_t *self,edict_t *other,edict_t *activator); +void trigger_heal_use (edict_t *self,edict_t *other,edict_t *activator); +void urinal_use(edict_t *self, edict_t *other, edict_t *activator); +void Use_DoorTrigger(edict_t *self, edict_t *other, edict_t *activator); +void Use_Multi(edict_t *self, edict_t *other, edict_t *activator); +void useable_use(edict_t *self, edict_t *other, edict_t *activator); + +void (*pluse_f[])(edict_t *self, edict_t *other, edict_t *activator) = +{ + button_use, + car_rolls_use, + door_secret_use, + extinguisher_use, + generic_monster_use, + keep_using_use, + plDoorUse, + trigger_heal_spent, + trigger_heal_use, + urinal_use, + Use_DoorTrigger, + Use_Multi, + useable_use +}; + +void ashtray_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void ashtray_pain2(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void auto_gun_spark(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void banner_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit); +void barrel_chemical_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void benchbottom_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void blind_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void breakable_brush_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void broom_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void car_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void cash_register_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void chair_spin(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void chandelier_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void comp_keyboard_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void comp_monitor_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void comp_monitor2_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void cone_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void desk_phone_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void desk_phone_pain2(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void fire_extinguisher_explode(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void garbage_bag_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void generic_car_rolls_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void globe_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void gong_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void gore_pile_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void gumball_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void guttedcow_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void hanging_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void lamp_hang_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void landmine_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void lantern_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void motorcycle_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void news_machine_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void news_machine_pain2(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void Obj_partpain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void payphone_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void player_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void searchlight_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void searchlight_pain2(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void shop_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void sideobeef_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void sink_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void sofa_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void stoplight_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void toilet_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void trash_pile_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void trashcan_barrel_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void trashcan_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void tv_ceiling_pain1(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void tv_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void tv_pain2(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void tv_wall_pain1(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void urinal_cookie_toss(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void waste_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void waste_pain2(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); +void wet_floor_pain(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit); + +void (*pain_f[])(edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) = +{ + ashtray_pain, + ashtray_pain2, + auto_gun_spark , + banner_pain, + barrel_chemical_pain, + benchbottom_pain, + breakable_brush_pain, + blind_pain, + broom_pain, + car_pain, + cash_register_pain, + chair_spin, + chandelier_pain, + comp_keyboard_pain, + comp_monitor_pain, + comp_monitor2_pain, + cone_pain, + desk_phone_pain, + desk_phone_pain2, + fire_extinguisher_explode, + garbage_bag_pain, + generic_car_rolls_pain, + globe_pain, + gong_pain, + gore_pile_pain, + gumball_pain, + guttedcow_pain, + hanging_pain, + lamp_hang_pain, + landmine_pain, + lantern_pain, + motorcycle_pain, + news_machine_pain, + news_machine_pain2, + Obj_partpain, + payphone_pain, + player_pain, + searchlight_pain, + searchlight_pain2, + shop_pain, + sideobeef_pain, + sink_pain, + sofa_pain, + stoplight_pain, + toilet_pain , + trash_pile_pain, + trashcan_barrel_pain, + trashcan_pain , + tv_ceiling_pain1, + tv_pain, + tv_pain2, + tv_wall_pain1, + urinal_cookie_toss, + waste_pain, + waste_pain2, + wet_floor_pain +}; + +void auto_gun_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void barrel_chemical_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void BecomeDebris(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void big_gun_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void bosnia_truck_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void breakable_brush_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void button_killed(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void caged_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void comp_monitor_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void debris_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void door_killed(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void door_secret_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void fire_extinguisher_boom(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void fire_extinguisher_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void flatbed_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void G_Explode(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void gib_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void hydrant_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void iraq_fruit_stand_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void iraq_fruit_stand_fruit_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void landmine_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void lantern2_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void LightBecomeDebris(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void ObjBecomeDebris(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void player_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void sink_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void speaker_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void SpecialBecomeDebris(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void tank_gas_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void tank_propane_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void toilet_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void trashcan_death(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void trigger_brush_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void tv_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); +void urinal_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + +void (*die_f[])(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) = +{ + auto_gun_die, + barrel_chemical_die, + BecomeDebris, + big_gun_die, + bosnia_truck_die, + breakable_brush_die, + button_killed, + caged_die, + comp_monitor_die, + debris_die, + door_killed, + door_secret_die, + fire_extinguisher_boom, + fire_extinguisher_die, + flatbed_die, + G_Explode, + gib_die, + iraq_fruit_stand_die, + hydrant_die, + iraq_fruit_stand_fruit_die, + landmine_die, + lantern2_die, + LightBecomeDebris, + ObjBecomeDebris, + player_die, + sink_die, + speaker_die, + SpecialBecomeDebris, + tank_gas_die, + tank_propane_die, + toilet_die, + trashcan_death, + trigger_brush_die, + tv_die, + urinal_die +}; + +void SP_misc_generic_fire_extinguisher(edict_t *self); +void SP_misc_generic_train(edict_t *self); + +void (*respawn_f[])(edict_t *self) = +{ + SP_misc_generic_fire_extinguisher, + SP_misc_generic_train +}; + +extern BannerCallback theBannerCallback; +extern DropWeaponCallBack TheDropWeaponCallBack; + +extern FireCallBack TheDogFireCallBack; +extern FollowGenericPivot TheDogFollowGenericPivot; +extern FootLeftCallback TheDogFootLeftCallback; +extern FootRightCallback TheDogFootRightCallback; +extern GroundCallback TheDogGroundCallback; +extern InAirCallBack TheDogInAirCallBack; +extern JumpCallBack TheDogJumpCallBack; +extern KneeCallBack TheDogKneeCallBack; +extern MonsterSeqBeginCallback TheDogMonsterSeqBeginCallback; +extern MonsterSeqEndCallback TheDogMonsterSeqEndCallback; +extern MouthCallback TheDogMouthCallback; +extern SetVectorCallback TheDogSetVectorCallback; +extern ThudCallBack TheDogThudCallBack; + +extern GroundCallback TheCowGroundCallback; +extern SetVectorCallback TheCowSetVectorCallback; +extern FireCallBack TheCowFireCallBack; +extern FollowGenericPivot TheCowFollowGenericPivot; +extern MouthCallback TheCowMouthCallback; +extern FootRightCallback TheCowFootRightCallback; +extern FootLeftCallback TheCowFootLeftCallback; +extern MonsterSeqEndCallback TheCowMonsterSeqEndCallback; +extern MonsterSeqBeginCallback TheCowMonsterSeqBeginCallback; + +extern FireCallBack TheFireCallBack; +extern FollowGenericPivot TheFollowGenericPivot; +extern FootLeftCallback TheFootLeftCallback; +extern FootRightCallback TheFootRightCallback; +extern GroundCallback TheGroundCallback; +extern gutCallback theGutCallback; +extern GuttedCowCallback theGuttedCowCallback; +extern HanginLightCallback theHanginLightCallback; +extern InAirCallBack TheInAirCallBack; +extern JumpCallBack TheJumpCallBack; +extern KneeCallBack TheKneeCallBack; +extern MainHeliCallback2 theMainHeliCallback2; +extern MainRotor2Callback theMainRotor2Callback; +extern TankTreadCallback theTankTreadCallback; +extern MonsterSeqBeginCallback TheMonsterSeqBeginCallback; +extern MonsterSeqEndCallback TheMonsterSeqEndCallback; +extern MonsterSoundCallBack TheMonsterSoundCallBack; +extern MouthCallback TheMouthCallback; +extern SetVectorCallback TheSetVectorCallback; +extern SideOBeefCallback theSideOBeefCallback; +extern TestSeqEndCallback theTestSeqEndCallback; +extern ThrowCallBack TheThrowCallBack; +extern ThudCallBack TheThudCallBack; +extern valveCallback theValveCallback; +extern PickupRespawnCallback thePickupRespawnCallback; +extern LimbEOSCallback TheLimbEOSCallback; +extern SnowcatTreadCallback theSnowcatTreadCallback; + +IGhoulCallBack *IGhoulCallbackList[] = +{ + &theBannerCallback, + &TheDogFireCallBack, + &TheDogFollowGenericPivot, + &TheDogFootLeftCallback, + &TheDogFootRightCallback, + &TheDogGroundCallback, + &TheDogInAirCallBack, + &TheDogJumpCallBack, + &TheDogKneeCallBack, + &TheDogMonsterSeqBeginCallback, + &TheDogMonsterSeqEndCallback, + &TheDogMouthCallback, + &TheDogSetVectorCallback, + &TheDogThudCallBack, + &TheCowGroundCallback, + &TheCowSetVectorCallback, + &TheCowFireCallBack, + &TheCowFollowGenericPivot, + &TheCowMouthCallback, + &TheCowFootRightCallback, + &TheCowFootLeftCallback, + &TheCowMonsterSeqEndCallback, + &TheCowMonsterSeqBeginCallback, + &TheDropWeaponCallBack, + &TheFireCallBack, + &TheFollowGenericPivot, + &TheFootLeftCallback, + &TheFootRightCallback, + &TheGroundCallback, + &theGutCallback, + &theGuttedCowCallback, + &theHanginLightCallback, + &TheInAirCallBack, + &TheJumpCallBack, + &TheKneeCallBack, + &theMainHeliCallback2, + &theMainRotor2Callback, + &theTankTreadCallback, + &TheMonsterSeqBeginCallback, + &TheMonsterSeqEndCallback, + &TheMonsterSoundCallBack, + &TheMouthCallback, + &TheSetVectorCallback, + &theSideOBeefCallback, + &theTestSeqEndCallback, + &TheThudCallBack, + &TheThrowCallBack, + &theValveCallback, + &thePickupRespawnCallback, + &TheLimbEOSCallback, + &theSnowcatTreadCallback +}; + +int function_table_sizes[] = +{ + sizeof(think_f), + sizeof(blocked_f), + sizeof(touch_f), + sizeof(use_f), + sizeof(pluse_f), + sizeof(pain_f), + sizeof(die_f), + sizeof(respawn_f), + sizeof(IGhoulCallbackList) +}; + +// ------------------------------------------------- + +typedef struct tables_s +{ + byte *base; + int count; +} tables_t; + +#define MMOVE_SIZE 4 + +extern mmove_t ScriptReleaseMove[]; +extern mmove_t MMoves[]; +extern mmove_t MDogMoves[]; +extern mmove_t MCowMoves[]; + +tables_t mmove_tables[MMOVE_SIZE] = +{ + { (byte *)ScriptReleaseMove, MMOVE_SCRIPT_SIZE }, + { (byte *)MMoves, MMOVE_HUMAN_SIZE }, + { (byte *)MDogMoves, MMOVE_DOG_SIZE }, + { (byte *)MCowMoves, MMOVE_COW_SIZE } +}; + +#define MSD_SIZE 13 + +extern modelSpawnData_t bosniaModelData[]; +extern modelSpawnData_t castleModelData[]; +extern modelSpawnData_t genericModelData[]; +extern modelSpawnData_t iraqModelData[]; +extern modelSpawnData_t pickupModelData[]; +extern modelSpawnData_t lightModelData[]; +extern modelSpawnData_t nyModelData[]; +extern modelSpawnData_t siberiaModelData[]; +extern modelSpawnData_t tokyoModelData[]; +extern modelSpawnData_t ugandaModelData[]; +extern modelSpawnData_t heliModelData[]; +extern modelSpawnData_t tankModelData[]; +extern modelSpawnData_t snowcatModelData[]; + +tables_t msd_tables[MSD_SIZE] = +{ + { (byte *)bosniaModelData, MD_BOSNIA_SIZE }, + { (byte *)castleModelData, MD_CASTLE_SIZE }, + { (byte *)genericModelData, MD_GENERIC_SIZE }, + { (byte *)iraqModelData, MD_IRAQ_SIZE }, + { (byte *)pickupModelData, MD_ITEM_SIZE }, + { (byte *)lightModelData, MD_LIGHT_SIZE }, + { (byte *)nyModelData, MD_NY_SIZE }, + { (byte *)siberiaModelData, MD_SIBERIA_SIZE }, + { (byte *)tokyoModelData, MD_TOKYO_SIZE }, + { (byte *)ugandaModelData, MD_UGANDA_SIZE }, + { (byte *)heliModelData, MD_HELI_SIZE }, + { (byte *)tankModelData, MD_TANK_SIZE }, + { (byte *)snowcatModelData, MD_SNOWCAT_SIZE } +}; + +// ------------------------------------------------- + +field_t savefields[] = +{ + {"", FOFS(client), F_CLIENT}, + {"", FOFS(owner), F_EDICT}, + {"", FOFS(model), F_STRING}, + {"", FOFS(message), F_STRING}, + {"", FOFS(classname), F_STRING}, + {"", FOFS(target), F_STRING}, + {"", FOFS(targetname), F_STRING}, + {"", FOFS(scripttarget), F_STRING}, + {"", FOFS(killtarget), F_STRING}, + {"", FOFS(killfacing), F_STRING}, + {"", FOFS(team), F_STRING}, + {"", FOFS(pathtarget), F_STRING}, + {"", FOFS(deathtarget), F_STRING}, + {"", FOFS(combattarget), F_STRING}, + {"", FOFS(soundName), F_STRING}, + {"", FOFS(spawn1), F_STRING}, + {"", FOFS(spawn2), F_STRING}, + {"", FOFS(spawn3), F_STRING}, + {"", FOFS(target_ent), F_EDICT}, + {"", FOFS(goalentity), F_EDICT}, + {"", FOFS(movetarget), F_EDICT}, + + {"", FOFS(wait_action1), F_MMOVE}, + {"", FOFS(wait_action2), F_MMOVE}, + {"", FOFS(wait_action3), F_MMOVE}, + {"", FOFS(wait_action4), F_MMOVE}, + {"", FOFS(wait_action5), F_MMOVE}, + {"", FOFS(wait_action6), F_MMOVE}, + {"", FOFS(move_action), F_MMOVE}, + + {"", FOFS(objSpawnData), F_OSD}, + + {"", FOFS(map), F_STRING}, + {"", FOFS(chain), F_EDICT}, + {"", FOFS(enemy), F_EDICT}, + {"", FOFS(oldenemy), F_EDICT}, + {"", FOFS(activator), F_EDICT}, + {"", FOFS(groundentity), F_EDICT}, + {"", FOFS(teamchain), F_EDICT}, + {"", FOFS(teammaster), F_EDICT}, + {"", FOFS(mynoise), F_EDICT}, + {"", FOFS(mynoise2), F_EDICT}, + + {"", FOFS(think), F_THINK_F}, + {"", FOFS(moveinfo.endfunc), F_THINK_F}, + {"", FOFS(blocked), F_BLOCKED_F}, + {"", FOFS(touch), F_TOUCH_F}, + {"", FOFS(use), F_USE_F}, + {"", FOFS(plUse), F_PLUSE_F}, + {"", FOFS(pain), F_PAIN_F}, + {"", FOFS(die), F_DIE_F}, + {"", FOFS(respawnFunc), F_RESPAWN_F}, + + {"", FOFS(ai), F_BOOLPTR}, + {"", FOFS(Script), F_BOOLPTR}, + {"", FOFS(objInfo), F_NULL}, + + {NULL, 0, F_IGNORE} +}; + +field_t levelfields[] = +{ + {"", LLOFS(changemap), F_STRING}, + + {"", LLOFS(sight_client), F_EDICT}, + {"", LLOFS(sight_monster), F_EDICT}, + {"", LLOFS(sight_entity), F_EDICT}, + {"", LLOFS(sound_entity), F_EDICT}, + {"", LLOFS(sound2_entity), F_EDICT}, + {"", LLOFS(current_entity), F_EDICT}, + + {NULL, 0, F_IGNORE} +}; + +field_t clientfields[] = +{ + {"", CLOFS(inv), F_BOOLPTR}, + {"", CLOFS(body), F_BOOLPTR}, + {"", CLOFS(ps.gun), F_NULL}, + + {NULL, 0, F_IGNORE} +}; + +//========================================================= + +list stringlist; + +int GetStringNum(char *str) +{ + assert(str != (char *)0xcdcdcdcd); + // Null pointers have an index of -1 + if(!str) + { + return(-1); + } + stringlist.push_back(str); + return(strlen(str) + 1); +} + +int GetEdictNum(edict_t *e) +{ + assert(e != (edict_t *)0xcdcdcdcd); + + if(e == NULL) + { + return(-1); + } + else + { + return(e - g_edicts); + } +} + +int GetClientNum(gclient_t *c) +{ + assert(c != (gclient_t *)0xcdcdcdcd); + + if(c == NULL) + { + return(-1); + } + else + { + return(c - game.clients); + } +} + +int GetFunctionIdx(void **func_table, void *func, int table_size, char *str) +{ + int i; + + assert(func != (void *)0xcdcdcdcd); + // Null functions are perfectly valid + if(!func) + { + return(-1); + } + // Enumerate function + for(i = 0; i < (table_size / sizeof(func)); i++) + { + if(func_table[i] == func) + { + return(i); + } + } +#if (!_FINAL_) && (_RAVEN_) + Com_Printf(P_RED "Unable to enumerate %s function %s\n", str, gi.GetLabel(func)); +#else + Com_Printf(P_RED "Unable to enumerate %s function\n", str); +#endif + return(-1); +} + +int GetThinkNum(void *func) +{ + return(GetFunctionIdx((void **)think_f, func, sizeof(think_f), "think")); +} + +int GetBiTableIndex(byte *ptr, tables_t *table, int count, int size) +{ + int i, j; + + assert(ptr != (byte *)0xcdcdcdcd); + // Null pointers are perfectly valid + if(!ptr) + { + return(-1); + } + for(j = 0; j < count; j++) + { + i = (ptr - table[j].base) / size; + if((i >= 0) && (i < table[j].count)) + { + return((j << 16) | i); + } + } + Com_Printf(P_RED "Unable to enumerate bi table pointer\n"); + return(-1); +} + +int GetMmoveNum(mmove_t *mm) +{ + return(GetBiTableIndex((byte *)mm, mmove_tables, MMOVE_SIZE, sizeof(mmove_t))); +} + +int GetMSDNum(modelSpawnData_t *msd) +{ + return(GetBiTableIndex((byte *)msd, msd_tables, MSD_SIZE, sizeof(modelSpawnData_t))); +} + +int GetEventNum(Event *ev) +{ + list::iterator it; + int i, j; + + assert(ev != (Event *)0xcdcdcdcd); + if(!ev) + { + return(-1); + } + for(it = Scripts.begin(), i = 0; it != Scripts.end(); it++, i++) + { + j = (*it)->GetEventNum(ev); + if(j >= 0) + { + return((i << 16) | j); + } + } + Com_Printf(P_RED "Unable to enumerate event\n"); + return(-1); +} + +int GetVarNum(void *var) +{ + assert(var != (void *)0xcdcdcdcd); + // SPECIAL CASE!! Null pointers have an index of 0 + if(!var) + { + return(NULL); + } + // Only need to know whether pointer exists or not + return(-1); +} + +void EnumerateField(field_t *field, byte *base) +{ + void *p; + + p = (void *)(base + field->ofs); + switch (field->type) + { + case F_INT: + case F_SHORT: + case F_FLOAT: + break; + case F_STRING: + *(int *)p = GetStringNum(*(char **)p); + break; + + case F_VECTOR: + case F_ANGLEHACK: + break; + + case F_EDICT: + *(int *)p = GetEdictNum(*(edict_t **)p); + break; + case F_ITEM: + // Fixme + *(int *)p = -1; + break; + case F_MMOVE: + *(int *)p = GetMmoveNum(*(mmove_t **)p); + break; + case F_OSD: + *(int *)p = GetMSDNum(*(modelSpawnData_t **)p); + break; + case F_CLIENT: + *(int *)p = GetClientNum(*(gclient_t **)p); + break; + + // These are placed in when their relevant owners are loaded + case F_BOOLPTR: + *(qboolean *)p = !!(*(int *)p); + break; + + // These are pointers that are always recreated + case F_NULL: + *(void **)p = NULL; + break; + + // Enumerate function pointers so as to make the loadgames not completely + // sensitive to minor code changes + case F_THINK_F: + *(int *)p = GetFunctionIdx((void **)think_f, *(void **)p, sizeof(think_f), "think"); + break; + case F_BLOCKED_F: + *(int *)p = GetFunctionIdx((void **)blocked_f, *(void **)p, sizeof(blocked_f), "blocked"); + break; + case F_TOUCH_F: + *(int *)p = GetFunctionIdx((void **)touch_f, *(void **)p, sizeof(touch_f), "touch"); + break; + case F_USE_F: + *(int *)p = GetFunctionIdx((void **)use_f, *(void **)p, sizeof(use_f), "use"); + break; + case F_PLUSE_F: + *(int *)p = GetFunctionIdx((void **)pluse_f, *(void **)p, sizeof(pluse_f), "pluse"); + break; + case F_PAIN_F: + *(int *)p = GetFunctionIdx((void **)pain_f, *(void **)p, sizeof(pain_f), "pain"); + break; + case F_DIE_F: + *(int *)p = GetFunctionIdx((void **)die_f, *(void **)p, sizeof(die_f), "die"); + break; + case F_RESPAWN_F: + *(int *)p = GetFunctionIdx((void **)respawn_f, *(void **)p, sizeof(respawn_f), "respawn"); + break; + + case F_IGNORE: + break; + + default: + gi.error ("EnumerateField: unknown field type"); + break; + } +} + +void EnumerateFields(field_t *fields, byte *data, unsigned long chid, int len) +{ + field_t *field; + int i; + string str; + list::iterator it; + + assert(stringlist.empty()); + + // Enumerate all the fields + if(fields) + { + for(field = fields; field->name; field++) + { + EnumerateField(field, data); + } + } + // Save out raw data + gi.AppendToSavegame(chid, data, len); + + // Save out any associated strings + it = stringlist.begin(); + for(i = 0; i < stringlist.size(); i++, it++) + { + gi.AppendToSavegame('STRG', (void *)(*it).c_str(), (*it).length() + 1); + } + + // Make sure everything is cleaned up nicely + stringlist.clear(); +} + +//========================================================= + +char *GetStringPtr(int str) +{ + char *strdata; + + if(str == -1) + { + return(NULL); + } + gi.ReadFromSavegame('STRG', NULL, str, (void **)&strdata); + + return(strdata); +} + +edict_t *GetEdictPtr(int e) +{ + if(e == -1) + { + return(NULL); + } + assert(e >= 0); + assert(e < 1024); + return(g_edicts + e); +} + +gclient_t *GetClientPtr(int c) +{ + if(c == -1) + { + return(NULL); + } + assert(c >= 0); + assert(c < 256); + return(game.clients + c); +} + +void *GetFunctionPtr(void **func_table, int func, int table_size, char *str) +{ + assert(func < 4096); + assert(func != 0xcdcdcdcd); + // Index of -1 means Null function ptr + if(func == -1) + { + return(NULL); + } + if((func < 0) || (func >= (table_size / sizeof(func)))) + { + Com_Printf(va(P_RED "Unable to evaluate %s function %d\n", str, func)); + return(NULL); + } + return(func_table[func]); +} + +void *GetThinkPtr(int func) +{ + return(GetFunctionPtr((void **)think_f, func, sizeof(think_f), "think")); +} + +byte *GetBiTablePtr(int index, tables_t *table, int size) +{ + int base, idx; + + if(index == -1) + { + return(NULL); + } + base = index >> 16; + idx = index & 0xffff; + + return(table[base].base + (idx * size)); +} + +mmove_t *GetMmovePtr(int idx) +{ + return((mmove_t *)GetBiTablePtr(idx, mmove_tables, sizeof(mmove_t))); +} + +modelSpawnData_t *GetMSDPtr(int idx) +{ + return((modelSpawnData_t *)GetBiTablePtr(idx, msd_tables, sizeof(modelSpawnData_t))); +} + +Event *GetEventPtr(int ev) +{ + list::iterator it; + int i; + Event *event; + + if(ev == -1) + { + return(NULL); + } + it = Scripts.begin(); + for(i = 0; i < (ev >> 16); i++) + { + it++; + } + event = (*it)->GetEventPtr(ev & 0xffff); + if(!event) + { + Com_Printf(P_RED "Unable to evaluate event\n"); + } + return(event); +} + +void EvaluateField(field_t *field, byte *base) +{ + void *p; + + p = (void *)(base + field->ofs); + switch (field->type) + { + case F_INT: + case F_SHORT: + case F_FLOAT: + break; + case F_STRING: + *(char **)p = GetStringPtr(*(int *)p); + break; + + case F_VECTOR: + case F_ANGLEHACK: + break; + + case F_EDICT: + *(edict_t **)p = GetEdictPtr(*(int *)p); + break; + case F_ITEM: + // Fixme + *(int *)p = 0; + break; + case F_MMOVE: + *(mmove_t **)p = GetMmovePtr(*(int *)p); + break; + case F_OSD: + *(modelSpawnData_t **)p = GetMSDPtr(*(int *)p); + break; + case F_CLIENT: + *(gclient_t **)p = GetClientPtr(*(int *)p); + break; + + // These fields are patched in when their relevant owners are loaded + case F_BOOLPTR: + case F_NULL: + break; + + // Reevaluate function pointers from indices + case F_THINK_F: + *(void **)p = GetFunctionPtr((void **)think_f, *(int *)p, sizeof(think_f), "think"); + break; + case F_BLOCKED_F: + *(void **)p = GetFunctionPtr((void **)blocked_f, *(int *)p, sizeof(blocked_f), "blocked"); + break; + case F_TOUCH_F: + *(void **)p = GetFunctionPtr((void **)touch_f, *(int *)p, sizeof(touch_f), "touch"); + break; + case F_USE_F: + *(void **)p = GetFunctionPtr((void **)use_f, *(int *)p, sizeof(use_f), "use"); + break; + case F_PLUSE_F: + *(void **)p = GetFunctionPtr((void **)pluse_f, *(int *)p, sizeof(pluse_f), "pluse"); + break; + case F_PAIN_F: + *(void **)p = GetFunctionPtr((void **)pain_f, *(int *)p, sizeof(pain_f), "pain"); + break; + case F_DIE_F: + *(void **)p = GetFunctionPtr((void **)die_f, *(int *)p, sizeof(die_f), "die"); + break; + case F_RESPAWN_F: + *(void **)p = GetFunctionPtr((void **)respawn_f, *(int *)p, sizeof(respawn_f), "respawn"); + break; + + case F_IGNORE: + break; + + default: + gi.error ("EvaluateField: unknown field type"); + break; + } +} + +void EvaluateFields(field_t *fields, byte *data, unsigned long chid, int size) +{ + field_t *field; + + // Read in field from disk + gi.ReadFromSavegame(chid, (void *)data, size); + + // Convert indices to pointers + if(fields) + { + for(field = fields; field->name; field++) + { + EvaluateField(field, data); + } + } +} + +//========================================================= + +map UUIDRemap; + +GhoulUUID GetRemappedUUID(GhoulUUID old) +{ + map::iterator it; + + it = UUIDRemap.find(old); + if(it == UUIDRemap.end()) + { + assert(0); + return(0); + } + return((*it).second); +} + +void RemapUUIDs(void) +{ + int i; + edict_t *ent; + eft_rotate_t *rot; + + for(i = 0, ent = g_edicts; i < globals.num_edicts; i++, ent++) + { + if(!ent->inuse) + { + continue; + } + if(ent->s.effects & EF_ROTATE) + { + rot = (eft_rotate_t *)ent->s.effectData; + if(rot->boltonID) + { + rot->boltonID = GetRemappedUUID(rot->boltonID); + } + if(rot->boltonID2) + { + rot->boltonID2 = GetRemappedUUID(rot->boltonID2); + } + if(rot->boltonID3) + { + rot->boltonID3 = GetRemappedUUID(rot->boltonID3); + } + if(rot->boltonID4) + { + rot->boltonID4 = GetRemappedUUID(rot->boltonID4); + } + } + } + UUIDRemap.clear(); +} + +void SaveGhoulInst(IGhoulInst *inst, const char *name) +{ + byte buffer[MAX_GHOULINST_SIZE]; + int size; + + size = inst->SaveState(buffer, MAX_GHOULINST_SIZE, IGhoulCallbackList, sizeof(IGhoulCallbackList) / 4, name); + gi.AppendToSavegame('GHLI', buffer, size); +} + +IGhoulInst *LoadGhoulInst(IGhoulObj *obj, const char *name) +{ + IGhoulInst *inst; + byte buffer[MAX_GHOULINST_SIZE]; + int size; + GhoulUUID id; + + size = gi.ReadFromSavegame('GHLI', buffer, 0); + + inst = obj->NewInst(); + id = inst->RestoreState(buffer, size, IGhoulCallbackList, sizeof(IGhoulCallbackList) / 4, name); + + UUIDRemap[id] = inst->MyUUID(); + return(inst); +} + +//========================================================= + +#if _DEBUG +/* +================= +ValidateLoadedData + +Make sure we have no silly numbers anywhere +================= +*/ + +void ValidateLoadedData() +{ + int i; + edict_t *ent; + + ent = g_edicts; + for(i = 0; i < globals.num_edicts; i++, ent++) + { + if(ent->ai == (ai_public_c *)1) + { + assert(0); + } + } +} +#endif + +/* +============ +WriteGame + +This will be called whenever the game goes to a new level, +and when the user explicitly saves the game. + +Game information include cross level data, like multi level +triggers, help computer info, and all client states. + +A single player death will automatically restore from the +last save position. +============ +*/ +void WriteGame (bool autosave) +{ + int i; + gclient_t temp; + game_locals_t gtemp; + + if(!autosave) + { + PreserveClientData (); + } + gtemp = game; + gtemp.autosaved = autosave; + gtemp.clients = NULL; + gi.AppendToSavegame('GAME', >emp, sizeof(game_locals_t)); + + for(i = 0; i < game.maxclients; i++) + { + temp = game.clients[i]; + // Enumerate pointer fields + EnumerateFields(clientfields, (byte *)&temp, 'CLNT', sizeof(gclient_t)); + // Save out inventory + if(temp.inv) + { + game.clients[i].inv->Write(); + } + } +} + +bool ReadGame (bool autosave) +{ + int i; + gclient_t *clients; + + (**gi.isClient) = 0; + + clients = game.clients; + + gi.ReadFromSavegame('GAME', (void *)&game, sizeof(game_locals_t)); + + game.clients = clients; + for(i = 0; i < game.maxclients; i++) + { + // Reevaluate all fields + EvaluateFields(clientfields, (byte *)&game.clients[i], 'CLNT', sizeof(gclient_t)); + // Need to read in inventory + if(game.clients[i].inv) + { + game.clients[i].inv = (invPub_c *)pe->NewInv(); + game.clients[i].inv->Read(); + } + // Need to recreate dmInfo + game.clients[i].dmInfo = new player_dmInfo_ic(); + } + return(game.autosaved); +} + +//========================================================== + +/* +============== +WriteLevelLocals + +All pointer variables (except function pointers) must be handled specially. +============== +*/ +void WriteLevelLocals () +{ + level_locals_t temp; + + // Copy out all data into a temp space + temp = level; + // Enumerate any fields that require enumeration + EnumerateFields(levelfields, (byte *)&temp, 'LVLC', sizeof(level_locals_t)); +} + +/* +============== +ReadLevelLocals + +All pointer variables (except function pointers) must be handled specially. +============== +*/ +void ReadLevelLocals () +{ + // Evaluate any pointers + EvaluateFields(levelfields, (byte *)&level, 'LVLC', sizeof(level_locals_t)); +} + +/* +============== +WriteObjInfo + +============== +*/ + +void WriteObjInfo() +{ + int i, count; + edict_t *ent; + + for(i = 0, ent = g_edicts, count = 0; i < globals.num_edicts; i++, ent++) + { + if(ent->objInfo) + { + count++; + } + } + gi.AppendToSavegame('OINM', &count, sizeof(count)); + + for(i = 0, ent = g_edicts, count = 0; i < globals.num_edicts; i++, ent++) + { + if(ent->objInfo) + { + ent->objInfo->Write(); + } + } +} + +/* +============== +ReadObjInfo + +============== +*/ + +void ReadObjInfo() +{ + int i, count; + baseObjInfo_c *obj; + + gi.ReadFromSavegame('OINM', &count, sizeof(count)); + + for(i = 0; i < count; i++) + { + obj = new baseObjInfo_c((edict_t *)NULL); + obj->Read(); + } +} + +/* +============== +WriteEdicts + +All pointer variables (except function pointers) must be handled specially. +============== +*/ + +void WriteEdicts() +{ + int i, count; + edict_t *ent; + edict_t temp; + + // Find number of edicts to write + ent = g_edicts; + count = 0; + for(i = 0; i < globals.num_edicts; i++, ent++) + { + if(ent->inuse) + { + count++; + } + } + // Save this out + gi.AppendToSavegame('NMED', &count, sizeof(int)); + + // Scan thru and save out active edicts + ent = g_edicts; + for(i = 0; i < globals.num_edicts; i++, ent++) + { + if (!ent->inuse) + { + continue; + } + // Write out edict number and edict data + gi.AppendToSavegame('EDNM', (void *)&i, sizeof(int)); + + // Unlink from the world + gi.unlinkentity(ent); + // Copy Out data + temp = *ent; + // Link back in + gi.linkentity(ent); + // Enumerate any fields that require it + EnumerateFields(savefields, (byte *)&temp, 'EDCT', sizeof(edict_t)); + } +} + +/* +============== +ReadEdicts + +All pointer variables (except function pointers) must be handled specially. +============== +*/ + +void ReadEdicts() +{ + int i, count, entnum; + edict_t *ent; + + // Get number of edicts to read + gi.ReadFromSavegame('NMED', (void *)&count, sizeof(int)); + // Read in and setup each edict + for(i = 0; i < count; i++) + { + gi.ReadFromSavegame('EDNM', (void *)&entnum, sizeof(int)); + if (entnum >= globals.num_edicts) + { + globals.num_edicts = entnum + 1; + } + ent = g_edicts + entnum; + // Reconstitute pointers + EvaluateFields(savefields, (byte *)ent, 'EDCT', sizeof(edict_t)); + + // let the server rebuild world links for this ent + gi.linkentity (ent); + } +} + +/* +================= +WriteLevel +================= +*/ +void WriteLevel () +{ + // Used to make sure + gi.AppendToSavegame('FTSZ', function_table_sizes, sizeof(function_table_sizes)); + + // write out level_locals_t + WriteLevelLocals (); + + // write out all the entities + WriteEdicts(); + + // Save out all the scripting data + SaveGlobals(); + SaveLocals(); + + // write out the lists of dynamically allocd stuff (ais, senses, etc) + DynListWrite(); + + // Write out all the multiple bolted instance data + WriteObjInfo(); + + // Write out all the pickup data + thePickupList.Write(); +} + +/* +================= +ReadLevel + +SpawnEntities will already have been called on the +level the same way it was when the level was saved. + +That is necessary to get the baselines +set up identically. + +The server will have cleared all of the world links before +calling ReadLevel. + +No clients are connected yet. +================= +*/ +void ReadLevel () +{ + int *ftp; + int i; + edict_t *ent; + + // free any dynamic memory allocated by loading the level + // base state + gi.FreeTags (TAG_LEVEL); + UUIDRemap.clear(); + thePickupList.Destroy(); + + // Free the edicts spawned when creating baseline + G_FreeAllEdicts(); + + globals.num_edicts = (int)maxclients->value + 1; + + // Verify there aren't any new functions + gi.ReadFromSavegame('FTSZ', NULL, sizeof(function_table_sizes), (void **)&ftp); + for(i = 0; i < sizeof(function_table_sizes) / 4; i++) + { + if(ftp[i] != function_table_sizes[i]) + { + gi.error("Function index tables have changed size"); + } + } + gi.TagFree(ftp); + + // load the level locals + ReadLevelLocals (); + + // load all the entities + ReadEdicts(); + + // Load up scripting data and patch into edict array + // Needs to be before the ai stuff + ShutdownScripts(); + LoadGlobals(); + LoadLocals(); + + // load the lists of dynamically allocd stuff (ais, senses, etc) + DynListRead(); + + // Read in objinfo structures + ReadObjInfo(); + + // Read in all the pickup data + thePickupList.Read(); + + // mark all clients as unconnected + for(i = 0; i < (int)maxclients->value; i++) + { + ent = g_edicts + i + 1; + ent->client = game.clients + i; + ent->client->pers.connected = false; + } + + // Remap the loaded UUIDs to the new created ones + RemapUUIDs(); + + // Precache all weapons + pe->UncacheViewWeaponModels(); + pe->PrecacheViewWeaponModels(level.weaponsAvailable); + +#if _DEBUG + ValidateLoadedData(); +#endif +} + +// end diff --git a/Source/Game/gamecpp/g_siberia.cpp b/Source/Game/gamecpp/g_siberia.cpp new file mode 100644 index 0000000..1cc565f --- /dev/null +++ b/Source/Game/gamecpp/g_siberia.cpp @@ -0,0 +1,369 @@ +/****************************************************** + * Objects for Siberia * + ******************************************************/ + +#include "g_local.h" +#include "g_obj.h" + +// For snowcat +#define SNOWCAT_LIGHTS 4 + +#define FLARE_STARTOFF 4 +#define FLARE_BLUE 8 + + +#define HLTH_GEN_LIGHT_BEAM 250 +#define HLTH_SIBERIA_CARTON1 500 +#define HLTH_SIBERIA_CARTON2 10000 +#define HLTH_SIBERIA_CARTON3 10000 +#define HLTH_SIBERIA_CARTON4 10000 +#define HLTH_SIBERIA_FLAG 500 +#define HLTH_SIBERIA_ICICLES 10000 +#define HLTH_SIBERIA_ROADFLARE 500 +#define HLTH_SIBERIA_SEARCHLIGHT 500 +#define HLTH_SIBERIA_SNOWCAT 10000 + +// misc_siberia... +void SP_misc_siberia_carton1 (edict_t *ent); +void SP_misc_siberia_carton2 (edict_t *ent); +void SP_misc_siberia_carton3 (edict_t *ent); +void SP_misc_siberia_carton4 (edict_t *ent); +void SP_misc_siberia_flag (edict_t *ent); +void SP_misc_siberia_icicles (edict_t *ent); +void SP_misc_siberia_roadflare (edict_t *ent); +void SP_misc_siberia_searchlight (edict_t *ent); +void SP_misc_siberia_snowcat (edict_t *ent); + +spawn_t siberiaSpawns[] = +{ + // misc_siberia. . . + {"misc_siberia_carton1", SP_misc_siberia_carton1}, + {"misc_siberia_carton2", SP_misc_siberia_carton2}, + {"misc_siberia_carton3", SP_misc_siberia_carton3}, + {"misc_siberia_carton4", SP_misc_siberia_carton4}, + {"misc_siberia_flag", SP_misc_siberia_flag}, + {"misc_siberia_icicles", SP_misc_siberia_icicles}, + {"misc_siberia_roadflare", SP_misc_siberia_roadflare}, + {"misc_siberia_searchlight", SP_misc_siberia_searchlight}, + {"misc_siberia_snowcat", SP_misc_siberia_snowcat}, + + {NULL, NULL}, +}; + + +typedef enum +{ + OBJ_CARTON1 = 0, + OBJ_CARTON2, + OBJ_CARTON3, + OBJ_CARTON4, + OBJ_FLAG, + OBJ_ICICLES, + OBJ_LIGHT_BEAM, + OBJ_ROADFLARE, + OBJ_SEARCHLIGHT, + OBJ_SEARCHLIGHTARM, + OBJ_SNOWCAT, + MAX_OBJS +}; + + +modelSpawnData_t siberiaModelData[MD_SIBERIA_SIZE] = +{ +// dir file surfaceType material health solid material file cnt scale +"objects/siberia/carton1", "carton1", SURF_METAL, MAT_METAL_DGREY, HLTH_SIBERIA_CARTON1, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_CARTON1 +"objects/siberia/carton2", "carton2", SURF_METAL, MAT_METAL_DGREY, HLTH_SIBERIA_CARTON2, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_CARTON2 +"objects/siberia/carton3", "carton3", SURF_METAL, MAT_METAL_DGREY, HLTH_SIBERIA_CARTON3, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_CARTON3 +"objects/siberia/carton4", "carton4", SURF_METAL, MAT_METAL_DGREY, HLTH_SIBERIA_CARTON4, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_CARTON4 +"objects/siberia/flag", "flag", SURF_DEFAULT, MAT_DEFAULT, HLTH_SIBERIA_FLAG, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_FLAG +"objects/siberia/icicles", "icicles", SURF_DEFAULT, MAT_DEFAULT, HLTH_SIBERIA_ICICLES, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_ICICLES +"objects/generic/beam", "beam", SURF_NONE, MAT_NONE, HLTH_GEN_LIGHT_BEAM, SOLID_NOT, NULL, 0, 0.0, NULL, // OBJ_LIGHT_BEAM +"objects/siberia/flare", "null", SURF_NONE, MAT_NONE, HLTH_SIBERIA_ROADFLARE, SOLID_NOT, NULL, 0, 0.0, NULL, // OBJ_ROADFLARE +"objects/siberia/searchlight", "lamp", SURF_METAL, MAT_METAL_DGREY, HLTH_SIBERIA_SNOWCAT, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_SEARCHLIGHT +"objects/siberia/searchlight", "arm", SURF_METAL, MAT_METAL_DGREY, HLTH_SIBERIA_SNOWCAT, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_SEARCHLIGHT_ARM +"objects/siberia/snowcat", "snowcat", SURF_METAL, MAT_METAL_DGREY, HLTH_SIBERIA_SNOWCAT, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_SNOWCAT +}; + + + +/*QUAKED misc_siberia_carton1 (1 .5 0) (-15 -15 -15) (15 15 15) INVULNERABLE NOPUSH x x x x FLUFF +A funky looking carton. 30 x 30 x 30 +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_siberia_carton1 (edict_t *ent) +{ + VectorSet (ent->mins, -15, -15, -15); + VectorSet (ent->maxs, 15, 15, 15); + + SimpleModelInit2(ent,&siberiaModelData[OBJ_CARTON1],NULL,NULL); +} + + +/*QUAKED misc_siberia_carton2 (1 .5 0) (-8 -8 -7) (8 8 7) INVULNERABLE NOPUSH x x x x FLUFF +A square carton. 16 x 16 x 14 +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_siberia_carton2 (edict_t *ent) +{ + VectorSet (ent->mins, -8, -8, -7); + VectorSet (ent->maxs, 8, 8, 7); + + SimpleModelInit2(ent,&siberiaModelData[OBJ_CARTON2],NULL,NULL); + +} + + +/*QUAKED misc_siberia_carton3 (1 .5 0) (-3 -3 -4) (3 3 4) INVULNERABLE NOPUSH x x x x FLUFF +A tiny carton - looks like a soup thermos. 6 x 6 x 8 +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_siberia_carton3 (edict_t *ent) +{ + VectorSet (ent->mins, -3, -3, -3); // the -3 here is correct. leave the -4 in the QUAKED line. + VectorSet (ent->maxs, 3, 3, 4); + + SimpleModelInit2(ent,&siberiaModelData[OBJ_CARTON3],NULL,NULL); +} + + +/*QUAKED misc_siberia_carton4 (1 .5 0) (-10 -10 -15) (10 10 15) INVULNERABLE NOPUSH x x x x FLUFF +A barrel shaped carton. 20 x 20 x 30 +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_siberia_carton4 (edict_t *ent) +{ + VectorSet (ent->mins, -10, -10, -15); + VectorSet (ent->maxs, 10, 10, 15); + + SimpleModelInit2(ent,&siberiaModelData[OBJ_CARTON4],NULL,NULL); +} + +/*QUAKED misc_siberia_icicles (1 .5 0) (-1 -41 -41) (1 41 41) INVULNERABLE NOPUSH NOANIMATE x x x FLUFF +Icicles +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't be pushed +NOANIMATE - won't animate +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_siberia_icicles (edict_t *ent) +{ + VectorSet (ent->mins, -1, -41, -41); + VectorSet (ent->maxs, 1, 41, 41); + + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&siberiaModelData[OBJ_ICICLES],NULL,NULL); +} + + + +/*QUAKED misc_siberia_flag (1 .5 0) (-16 -1 -1) (1 1 79) INVULNERABLE NOPUSH x x x x FLUFF +A flag +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_siberia_flag (edict_t *ent) +{ + VectorSet (ent->mins, -16, -1, -1); + VectorSet (ent->maxs, 1, 1, 79); + + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&siberiaModelData[OBJ_FLAG],NULL,NULL); + +} + +void roadflare_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + + if (ent->spawnflags & FLARE_STARTOFF) // It was off + { + ent->spawnflags &= ~FLARE_STARTOFF; // Now it's on + + ent->s.sound = gi.soundindex("Ambient/Gen/FireFX/FlareLP.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + if (ent->spawnflags & FLARE_BLUE) + { + fxRunner.execContinualEffect("environ/roadflare_blue", ent); + } + else + { + fxRunner.execContinualEffect("environ/roadflare", ent); + } + } + else // It was on + { + ent->spawnflags |= FLARE_STARTOFF; // Now it's off + + ent->s.sound = NULL; + if (ent->spawnflags & FLARE_BLUE) + { + fxRunner.stopContinualEffect("environ/roadflare_blue", ent); + } + else + { + fxRunner.stopContinualEffect("environ/roadflare", ent); + } + } + +} + +/*QUAKED misc_siberia_roadflare (1 .5 0) (-2 -2 -2) (2 2 2) INVULNERABLE NOPUSH STARTOFF BLUE x x FLUFF +A flaming, sputtering road flare +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't be pushed +FLUFF - won't show if gl_pictip is set +BLUE - it'll be blue. defaults to red if this flag not set +*/ +void SP_misc_siberia_roadflare (edict_t *ent) +{ + VectorSet (ent->mins, -2, -2, -2); + VectorSet (ent->maxs, 2, 2, 2); + + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&siberiaModelData[OBJ_ROADFLARE],NULL,NULL); + SimpleModelTurnOnOff(ent->ghoulInst, false); + + if (!(ent->spawnflags & FLARE_STARTOFF)) + { + ent->s.sound = gi.soundindex("Ambient/Gen/FireFX/FlareLP.wav"); + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + + if (ent->spawnflags & FLARE_BLUE) + { + fxRunner.execContinualEffect("environ/roadflare_blue", ent); + } + else + { + fxRunner.execContinualEffect("environ/roadflare", ent); + } + } + + gi.soundindex("Ambient/Gen/FireFX/FlareLP.wav"); + ent->use = roadflare_use; +} + + +/*QUAKED misc_siberia_searchlight (1 .5 0) (-10 -10 -8) (10 10 12) INVULNERABLE NOPUSH STARTOFF x x x FLUFF +A small search light +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A, can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_siberia_searchlight (edict_t *ent) +{ + boltonOrientation_c boltonInfo; + IGhoulInst* lampInst = NULL, + *armInst = NULL; + GhoulID lampBolt; + + VectorSet (ent->mins, -10, -10, -8); + VectorSet (ent->maxs, 10, 10, 12); + + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&siberiaModelData[OBJ_SEARCHLIGHTARM],NULL,NULL); + + ent->touch = NULL; + SimpleModelAddBolt(ent,siberiaModelData[OBJ_SEARCHLIGHTARM],"DUMMY02", + siberiaModelData[OBJ_SEARCHLIGHT],"DUMMY02",NULL); + + lampInst = SimpleModelGetBolt(ent, 1); + armInst = ent->ghoulInst; + +// ******************************************************************************************** +// Find my target entity and then orient myself to look at it. +// ******************************************************************************************** + ent->targetEnt=G_Find(NULL,FOFS(targetname),ent->target); + boltonInfo.root = ent; + + if (ent->targetEnt) + { + if (lampInst && lampInst->GetGhoulObject()) + { + lampBolt = lampInst->GetGhoulObject()->FindPart("DUMMY02"); + } + if (!lampBolt) + { + return; + } + // yaw the entity + boltonInfo.boltonInst = armInst; + boltonInfo.parentInst = NULL; + VectorCopy(ent->targetEnt->s.origin, boltonInfo.vTarget); + boltonInfo.fMinPitch = 0; + boltonInfo.fMaxPitch = 0; + boltonInfo.fMinYaw = -4000; + boltonInfo.fMaxYaw = 4000; + boltonInfo.fMaxTurnSpeed = 4000; + boltonInfo.bUsePitch = false; + boltonInfo.bUseYaw = true; + boltonInfo.bToRoot = true; + boltonInfo.OrientEnt(); + // pitch the gun + { + boltonInfo.boltonInst = lampInst; + boltonInfo.boltonID = lampBolt; + boltonInfo.parentInst = lampInst->GetParent(); + boltonInfo.parentID = lampInst->GetParent()->GetGhoulObject()->FindPart("DUMMY02"); + VectorCopy(ent->targetEnt->s.origin, boltonInfo.vTarget); + boltonInfo.fMinPitch = -4000; + boltonInfo.fMaxPitch = 4000; + boltonInfo.fMinYaw = 0; + boltonInfo.fMaxYaw = 0; + boltonInfo.fMaxTurnSpeed = 4000; + boltonInfo.bUsePitch = true; + boltonInfo.bUseYaw = false; + boltonInfo.bToRoot = true; + boltonInfo.OrientBolton(); + } + } + +// ent->think = searchlight_think; +// ent->nextthink = level.time + FRAMETIME; +} + +/*QUAKED misc_siberia_snowcat (1 .5 0) (-91 -66 -33) (91 66 58) INVULNERABLE NOPUSH LIGHTS x x x FLUFF +Large Immobile Snowcat with turret. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - N/A can't be pushed +LIGHTS - turns on headlights +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_siberia_snowcat (edict_t *ent) +{ + VectorSet (ent->mins, -91, -66, -33); + VectorSet (ent->maxs, 91, 66, 58); + + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&siberiaModelData[OBJ_SNOWCAT],NULL,NULL); + + if (ent->spawnflags & SNOWCAT_LIGHTS) + { + SimpleModelAddBolt(ent,siberiaModelData[OBJ_SNOWCAT],"HEADLIGHT01", + siberiaModelData[OBJ_LIGHT_BEAM],"to_headlight",NULL); + + SimpleModelAddBolt(ent,siberiaModelData[OBJ_SNOWCAT],"HEADLIGHT02", + siberiaModelData[OBJ_LIGHT_BEAM],"to_headlight",NULL); + } +} \ No newline at end of file diff --git a/Source/Game/gamecpp/g_skilllevels.cpp b/Source/Game/gamecpp/g_skilllevels.cpp new file mode 100644 index 0000000..d54b7aa --- /dev/null +++ b/Source/Game/gamecpp/g_skilllevels.cpp @@ -0,0 +1,175 @@ +#include "g_local.h" + +CPlayerSkill skillStats [NUM_SKILL_LEVELS] = +{ // dodge aimMaxDist WanderAmount PlayerMaxEncumbrance ArmorModifier SpawnLull SpawnForceTime canCheat Saves TurnSpeed + // accuracy Hesitation PlayerDamage AmmoModifier SpawnFrequency SpawnNonLull SpawnMaxNearbyGuys SpawnMinTime fullHealth + CPlayerSkill( .3f, .25f, 0.4f, 3.0, .5f, .15f, 0, 2.0, 2.0, 0.0, 0, 0, 0, 0, 1, 0.0, -1, .5, 1), //EXTREMELY EASY + CPlayerSkill( .5f, .4f, 0.5f, 1.5f, 1.0, .3f, 10, 1.0, 1.0, .3, 10, 4, 2, 2, 1, 15.0, 8, .5, 1), //EASY + CPlayerSkill( 1.0, 0.6f, 0.8f, 1.0f, 1.0, .4f, 7, 1.0, 1.0, .85, 10, 4, 1, 3, 1, 8.0, 5, 1.0, 0), //STANDARD + CPlayerSkill( 3, 0.8f, 1.0f, 0.7f, 1.0, .6f, 5, 1.0, 1.0, 1.0, 12, 6, 1, 3, 0, 6.0, 2, 1.5, 0), //DIFFICULT + CPlayerSkill( 99.0, 1.5f, 2.5f, 0.2f, 99.0, 1.0, 5, 5.0, .5f, 3.0, 4, 12, .5, 4, 0, 2.0, 0, 3, 0), //EXTREMELY DIICULT +}; + +// lower hesitations make the game more exciting + +CPlayerSkill::CPlayerSkill(float newaiDodgeFrequency, float newaiAccuracy, float newaiAimMaxDist, float newaiHesitation, + float newaiWanderAmount, float newplayerDamage, int newplayerMaxEncumbrance, float newammoModifier, + float newarmorModifier, float newspawnFrequency, float newspawnLullTime, float newspawnNonLullTime, + float newspawnForceTime, float newspawnMaxGuys, int newcanCheat, float newspawnMinTime, int newNumberOfSaves, + float newaiTurnSpeed, int newfullHealth) +{ + // fixme - aiWanderAmount is currently not implemented + + aiDodgeFrequency = newaiDodgeFrequency; + aiAccuracy = newaiAccuracy; + aiAimMaxDist = newaiAimMaxDist; + aiHesitation = newaiHesitation; + aiWanderAmount = newaiWanderAmount; + aiTurnSpeed = newaiTurnSpeed; + + playerDamage = newplayerDamage; + playerMaxEncumbrance = newplayerMaxEncumbrance; + ammoModifier = newammoModifier; + armorModifier = newarmorModifier; + + spawnFrequency = newspawnFrequency; + spawnLullTime = newspawnLullTime; + spawnNonLullTime = newspawnNonLullTime; + spawnForceTime = newspawnForceTime; + spawnMaxGuys = newspawnMaxGuys; + cheatsAvailable = newcanCheat; + spawnMinTime = newspawnMinTime; + numberOfSaves = newNumberOfSaves; + + fullHealth = newfullHealth; +} + +/* + + Saves +Set with sk_saving +Unlimited +… +2 +1 +0 + +Spawning +Set with sk_spawning +None (0) +Light (1) +Standard (2) +Heavy (3) +Ridiculous (4) + +Enemy Toughness +Set with sk_toughness +Non-Threatening (0) +Uncertain (1) +Standard (2) +Aggressive (3) +Bloodthirsty (4) + + */ + +void CPlayerSkill::buildCustomSkillLevels(void) +{ + // build 'em all now + + numberOfSaves = sk_saving->value; + cheatsAvailable = sv_cheats->value; + + spawnValue = sk_spawning->value; + if(spawnValue < 0)spawnValue = 0; + if(spawnValue > 4)spawnValue = 4; + spawnFrequency = skillStats[spawnValue].spawnFrequency; + spawnLullTime = skillStats[spawnValue].spawnLullTime; + spawnNonLullTime = skillStats[spawnValue].spawnNonLullTime; + spawnForceTime = skillStats[spawnValue].spawnForceTime; + spawnMaxGuys = skillStats[spawnValue].spawnMaxGuys; + spawnMinTime = skillStats[spawnValue].spawnMinTime; + ammoModifier = skillStats[spawnValue].ammoModifier; //this is pretty spawn related + + enemyValue = sk_toughness->value; + if(enemyValue < 0)enemyValue = 0; + if(enemyValue > 4)enemyValue = 4; + aiDodgeFrequency = skillStats[enemyValue].aiDodgeFrequency; + aiAccuracy = skillStats[enemyValue].aiAccuracy; + aiAimMaxDist = skillStats[enemyValue].aiAimMaxDist; + aiHesitation = skillStats[enemyValue].aiHesitation; + aiWanderAmount = skillStats[enemyValue].aiWanderAmount; + aiTurnSpeed = skillStats[enemyValue].aiTurnSpeed; + playerDamage = skillStats[enemyValue].playerDamage; + armorModifier = skillStats[enemyValue].armorModifier; + fullHealth = skillStats[enemyValue].fullHealth; + + int encumidx=sk_maxencum->value; + if(encumidx<0)encumidx=0; + if(encumidx>4)encumidx=4; + playerMaxEncumbrance = skillStats[encumidx].playerMaxEncumbrance; +} + +float CPlayerSkill::getMoneyMultiplier(void) +{ + float val = 1; + + if(numberOfSaves == -1) + { + val *= .4; + } + else if(!numberOfSaves) + { + val *= 2; + } + else + { + val -= numberOfSaves * .05; + } + + if(cheatsAvailable) + { + val *= .5; + } + + if(!spawnValue) + { + val *= .3; + } + else if(spawnValue == 4) + { + val *= 4;//this is silly + } + else + { + val += spawnValue * .3; + } + + if(!enemyValue) + { + val *= .3; + } + else if(enemyValue == 4) + { //this is very painful + val *= 3; + } + else + { + val += enemyValue * .4; + } + + if(!playerMaxEncumbrance) + { + val *= .5; + } + else + { + val *= 10.0 / playerMaxEncumbrance; + } + + if(val < .2) + { + val = .2; + } + + return val; +} diff --git a/Source/Game/gamecpp/g_skilllevels.h b/Source/Game/gamecpp/g_skilllevels.h new file mode 100644 index 0000000..4da4bff --- /dev/null +++ b/Source/Game/gamecpp/g_skilllevels.h @@ -0,0 +1,84 @@ +#ifndef __G_SKILLLEVELS_H +#define __G_SKILLLEVELS_H + +#define NUM_SKILL_LEVELS 5 + +class CPlayerSkill +{ +private: + float aiDodgeFrequency; + float aiAccuracy; + float aiAimMaxDist; + float aiHesitation; + float aiWanderAmount; + float aiTurnSpeed; + + float playerDamage; + int playerMaxEncumbrance; + float ammoModifier; + float armorModifier; + int cheatsAvailable; + int fullHealth; + + float spawnFrequency; + float spawnLullTime; + float spawnNonLullTime; + float spawnForceTime; + float spawnMaxGuys; + float spawnMinTime; + + int numberOfSaves; + + int spawnValue; + int enemyValue; + + float moneyMult; + +public: + //yuck + CPlayerSkill(void){spawnValue = -1; enemyValue = -1; moneyMult = -1;};//ew! + CPlayerSkill(float newaiDodgeFrequency, float newaiAccuracy, float newaiAimMaxDist, float newaiHesitation, + float newaiWanderAmount, float newplayerDamage, int newplayerMaxEncumbrance, float newammoModifier, + float newarmorModifier, float newspawnFrequency, float newspawnLullTime, float newspawnNonLullTime, + float newspawnForceTime, float newspawnMaxGuys, int newcanCheat, float newspawnMinTime, int newNumberOfSaves, + float newaiTurnSpeed, int newfullHealth); + + float getDodge(void){return aiDodgeFrequency;} + float getAccuracy(void){return aiAccuracy;} + float getAimMaxDist(void){return aiAimMaxDist;} + float getHesitation(void){return aiHesitation;} + float getWanderAmount(void){return aiWanderAmount;} + float getTurnSpeed(void){return aiTurnSpeed;} + + float getPlayerDamageMod(void){return playerDamage;} + int getPlayerMaxEncumbrance(void){return playerMaxEncumbrance;} + float getAmmoMod(void){return ammoModifier;} + float getArmorMod(void){return armorModifier;} + int canCheat(void){return cheatsAvailable;} + int fullHealthEachLevel(void){return fullHealth;} + + float getSpawnFreq(void){return spawnFrequency;} + float getSpawnLullTime(void){return spawnLullTime;} + float getSpawnNonLullTime(void){return spawnNonLullTime;} + float getSpawnForceTime(void){return spawnForceTime;} + float getSpawnMaxGuys(void){return spawnMaxGuys;} + float getSpawnMinTime(void){return spawnMinTime;} + + int getNumberOfSaves(void){return numberOfSaves;} + + void buildCustomSkillLevels(void); + + float getMoneyMultiplier(void); + + float getMoney(void){return moneyMult;} + void setMoneyMult(void){moneyMult = getMoneyMultiplier(); } + + float getInited(void){return (enemyValue != -1);} + + int getSpawnValue(void){return spawnValue;} + int getEnemyValue(void){return enemyValue;} +}; + +extern CPlayerSkill skillStats[NUM_SKILL_LEVELS]; + +#endif \ No newline at end of file diff --git a/Source/Game/gamecpp/g_sound.cpp b/Source/Game/gamecpp/g_sound.cpp new file mode 100644 index 0000000..fec1273 --- /dev/null +++ b/Source/Game/gamecpp/g_sound.cpp @@ -0,0 +1,511 @@ +#include "g_local.h" +#include "ef_flags.h" +#include "music.h" + +typedef unsigned char qlenString_t[MAX_QPATH]; + +#define MAX_GENERAL_SETS 256 +#define MAX_LOCAL_SETS 256 +#define MAX_BMODEL_SETS 256 +#define MAX_AMBWAVES 1024 +#define MAX_WAVES_PER_GROUP 16 +#define NOWAVE_VAL 0xffff + +#define CUR_DMS_FORMAT 11 + +typedef struct ambientGroup_s +{ + char setName[MAX_QPATH]; + unsigned short loopWaveNum; + byte numWavesUsed; + unsigned short wavesUsed[MAX_WAVES_PER_GROUP]; +}ambientServerGroup_t; + +typedef struct ambientInfo_s +{ + // loaded info from .ams + + qlenString_t waveNames[MAX_AMBWAVES]; + ambientServerGroup_t gen[MAX_GENERAL_SETS]; + ambientServerGroup_t loc[MAX_LOCAL_SETS]; + ambientServerGroup_t bmodel[MAX_BMODEL_SETS]; + int numWaves; + int numGenSets; + int numLocalSets; + int numBModelSets; +}ambientServerInfo_t; + +ambientServerInfo_t aSet; + +static void getDataAfterString(char **string) +{ + while(**string != 0) + { + (*string)++; + } + (*string)++; +} + +byte *LoadServerSets(byte *curPos, int numSets, ambientServerGroup_t *group) +{ + int i, j; + + if(numSets == 0xff)return curPos;//empty - has no sets... + + for(i = 0; i < numSets; i++) + { + strcpy(group[i].setName, (const char *)curPos); + getDataAfterString((char **)&curPos); + curPos+=10; + group[i].loopWaveNum = *((unsigned short *)curPos); + curPos+=2; + group[i].numWavesUsed = *((unsigned short *)curPos); + curPos+=2; + for(j = 0; j < group[i].numWavesUsed; j++) + { + group[i].wavesUsed[j] = *((unsigned short *)curPos); + curPos+=2; + } + curPos += 6; + } + + return curPos; +} + +void LoadAmbientInfo(void) +{ + byte *setInfo; + byte *curPos; + int fileLen; + char version; + int i; + + fileLen = gi.FS_LoadFile ("sound/sound.ams", (void **)&setInfo); + if (fileLen == -1) + { + Com_Printf("Unable to locate sound/sound.ams - all ambient sounds will be disabled\n"); + return; + } + + curPos = setInfo; + + version = *curPos++; + if(version != CUR_DMS_FORMAT) + { + Com_Printf ("Invalid version (%d) for Ambient Sound Set (Should be %d)\n", version, CUR_DMS_FORMAT); + gi.FS_FreeFile(setInfo); + return; + } + + aSet.numWaves = *((unsigned long *)curPos); + curPos +=4; + aSet.numGenSets = *((unsigned long *)curPos); + curPos +=4; + aSet.numLocalSets = *((unsigned long *)curPos); + curPos +=4; + aSet.numBModelSets = *((unsigned long *)curPos); + curPos +=4; + + for(i = 0; i < aSet.numWaves; i++) + { + strcpy((char *)aSet.waveNames[i], (const char *)curPos); + getDataAfterString((char **)&curPos); + } + + curPos = LoadServerSets(curPos, aSet.numGenSets, &aSet.gen[0]); + curPos = LoadServerSets(curPos, aSet.numLocalSets, &aSet.loc[0]); + curPos = LoadServerSets(curPos, aSet.numBModelSets, &aSet.bmodel[0]); + + gi.FS_FreeFile(setInfo); +} + +// pretty much everything I'm gonna do in here should be moved and rearranged and stuff... + +int FindSetsSounds(edict_t *ent, ambientServerGroup_t *group, int num) +{ + int i, j; + + for(i = 0; i < num; i++) + { + if(!stricmp(ent->soundName, group[i].setName)) + { + + if(group[i].loopWaveNum != NOWAVE_VAL) + { + gi.soundindex((char *)aSet.waveNames[group[i].loopWaveNum]); + } + + //tell it to precache everything involved with this... + for(j = 0; j < group[i].numWavesUsed; j++) + { + gi.soundindex((char *)aSet.waveNames[group[i].wavesUsed[j]]); + } + + return 1; + } + } + return 0; +} + +void SndInitWorldSounds(void) +{ + edict_t *checkedEnt; + + LoadAmbientInfo();//so aSet should be nice and populated at this point... + +/* + // wouldn't this be easier? This way you don't miss any of the sounds inside of the ambient sound set + // it would appear that the aim of all that is below, and the routine above is simply to register the sounds + // referenced by the gen, loc and bmode sound set types, but since there are obviously some within the + // sound set that *aren't* referenced this way, we can either + // a) tidy up the ambient sound sets so they *do* only contain sounds that are referenced or + // b) The lazy way, just register everything. This will work for now, but is NOT a good answer + for(int i = 0; i < aSet.numWaves; i++) + { + gi.soundindex((char *)aSet.waveNames[i]); + + } +*/ + + for (checkedEnt = g_edicts; checkedEnt < &g_edicts[globals.num_edicts]; checkedEnt++) + { + if(!checkedEnt->inuse) + continue; + if(!checkedEnt->soundName) + continue; + if(!stricmp(checkedEnt->soundName, "")) + continue; + + if(FindSetsSounds(checkedEnt, &aSet.gen[0], aSet.numGenSets))continue; + if(FindSetsSounds(checkedEnt, &aSet.loc[0], aSet.numLocalSets))continue; + if(FindSetsSounds(checkedEnt, &aSet.bmodel[0], aSet.numBModelSets))continue; + +// Com_Printf("Couldn't find a sound group \"%s\"\n", checkedEnt->soundName); + } +} + +int GetIDForSoundSet(char *setName, ambientServerGroup_t *group, int num) +{ + int i; + + if(!setName) + { +// Com_Printf("soundset with NULL set name!!!\n"); + return -1; + } + + for(i = 0; i < num; i++) + { + if(!stricmp(setName, group[i].setName)) + { + return i; + } + } + return -1;//this is bad... +} + +int SND_getBModelSoundIndex(char *name, int spot) +{ + int i; + + if(!name)return -1; + + if(!stricmp(name, ""))return -1; + + for(i = 0; i < MAX_BMODEL_SETS; i++) + { + if(!stricmp(name, aSet.bmodel[i].setName)) + { + return gi.soundindex((char *)aSet.waveNames[aSet.bmodel[i].wavesUsed[spot]]); + } + } + return -1; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + +//fixme all - unicast vs multicast - what's up with this? +void SetMusicIntensity(edict_t *ent, int newLevel) +{ + assert(ent); + assert(ent->client); + assert((newLevel == MUSIC_ACTION)||(newLevel == MUSIC_WANDER)); + + ent->client->ps.musicID = newLevel; +} + +void StopMusic(edict_t *ent, short numSecs) +{ + assert(ent); + assert(ent->client); + + ent->client->ps.musicID = MUSIC_NONE; +} + +void RestartMusic(edict_t *ent) +{ + assert(ent); + assert(ent->client); + + ent->client->ps.musicID = MUSIC_WANDER;//? +} + +void StartMusic(edict_t *ent, byte songID) +{ + assert(ent); + assert(ent->client); + assert(songID < 250);//irk - because of offset + + ent->client->ps.musicID = songID + MUSIC_OFFSET;//? +} + +void SetAmbientSoundSet (edict_t *ent, int setID) +{ + if(!ent)return; + if(!ent->inuse)return; + if(!ent->client)return; + + ent->client->ps.soundID = setID; +} + +void SetAmbientSoundSet (edict_t *ent, char *setName) +{ + int id; + + id = GetIDForSoundSet(setName, &aSet.gen[0], MAX_GENERAL_SETS); + if (id == -1 || !ent) + { + return; + } + + if(!ent)return; + if(!ent->inuse)return; + if(!ent->client)return; + + ent->client->ps.soundID = id; +} + +/*QUAKED func_ambientset (0 .5 .8) (-8 -8 -8) (8 8 8) +sets the current world ambient sound set to be played: +set soundName to be the name of the sound group you would like to use... +*/ + +void func_ambientSetUse(edict_t *ent, edict_t *other, edict_t *activator) +{ + SetAmbientSoundSet (activator, ent->soundName); +} + +void SP_func_ambientSet (edict_t *ent) +{ + ent->movetype = MOVETYPE_NONE; + ent->solid = SOLID_NOT; + ent->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID; + VectorSet (ent->mins, -5, -5, -7); + VectorSet (ent->maxs, 5, 5, 12); + ent->s.modelindex = 0; + ent->use = func_ambientSetUse; + gi.linkentity (ent); + +} + +/*QUAKED func_musicControl (0 .5 .8) (-8 -8 -8) (8 8 8) +sets the current state of music... +"sounds" + -2 = turn music off + -1 = let game take over music again + 0-255 = ID number of specific song to be played... +*/ + +void func_musicControlUse(edict_t *ent, edict_t *other, edict_t *activator) +{ + assert(activator); + assert(activator->client); + + if(ent->health == -2) + { + StopMusic(ent, ent->health);//fixme - I doubt this will work + } + else if(ent->health == -1) + { + RestartMusic(activator); + } + else + { + StartMusic(activator, ent->sounds); + } +} + +void SP_func_musicControl (edict_t *ent) +{ + ent->movetype = MOVETYPE_NONE; + ent->solid = SOLID_NOT; + ent->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID; + VectorSet (ent->mins, -5, -5, -7); + VectorSet (ent->maxs, 5, 5, 12); + ent->s.modelindex = 0; + ent->use = func_musicControlUse; + gi.linkentity (ent); +} + +#define START_OFF 1 +/*QUAKED environ_soundgen (0 1 0) (-12 -12 -12) (12 12 12) START_OFF +"soundName" name of the soundset to use... +*/ + +void sound_gen_use (edict_t *ent, edict_t *other, edict_t *activator) +{ + if(ent->s.effects & EF_AMB_SOUND_SET) + { + ent->s.effects &= ~EF_AMB_SOUND_SET; + ent->s.sound = 0; + } + else + { + int id; + + id = GetIDForSoundSet(ent->soundName, &aSet.loc[0], MAX_LOCAL_SETS); + + ent->s.effects |= EF_AMB_SOUND_SET; + ent->s.sound = id; + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } +} + +void soundGenInit(edict_t *ent) +{ + int id; + + id = GetIDForSoundSet(ent->soundName, &aSet.loc[0], MAX_LOCAL_SETS); + + if(id == -1) + { + Com_Printf("Soundgen with invalid name!\n"); + G_FreeEdict(ent); + return; + } + + ent->s.sound = id; + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + ent->s.effects |= EF_AMB_SOUND_SET; + + ent->think = NULL; + ent->nextthink = 0; +} + +void SP_environ_soundgen (edict_t *ent) +{ + int id; + + id = GetIDForSoundSet(ent->soundName, &aSet.loc[0], MAX_LOCAL_SETS); + + ent->movetype = MOVETYPE_NONE; + ent->solid = SOLID_NOT; + ent->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID; + VectorSet (ent->mins, -5, -5, -7); + VectorSet (ent->maxs, 5, 5, 12); + ent->s.modelindex = 0; + BboxRotate(ent); + gi.linkentity (ent); + + if(!ent->spawnflags & START_OFF) + { // the sound info isn't loaded up until after everything is spawned in, so we have to wait a bit before it becomes valid... + ent->think = soundGenInit; + ent->nextthink = level.time + .3; + } + ent->use = sound_gen_use; +} + +void SetActionMusic(edict_t &ent) +{ + assert(ent.client); + if(!ent.client)return; + + if((ent.client->ps.musicID != MUSIC_ACTION)&&(ent.client->ps.musicID != MUSIC_WANDER)&&(ent.client->ps.musicID != MUSIC_UNSET)) + { // no dynamic music active + return; + } + + ent.client->ps.musicID = MUSIC_ACTION; + ent.client->musicTime = level.time; +} + +int classifyMusicSituation(edict_t &ent) +{ + edict_t *search = NULL; + int val = 0; + int angryGuys = 0; + + CRadiusContent rad(ent.s.origin, 600); + + for(int i = 0; i < rad.getNumFound(); i++) + { + search = rad.foundEdict(i); + + if (search->ai && search->health > 0) + { + //use dist a bit too... + if(search->ai->GetMood(*search) == EMOTION_MEAN) + { + val+=4; + angryGuys = 1; + } + //else val++; + + } + } + if(ent.health < 50)val+=2; + if(ent.health < 25)val+=2; + if((val > 8)&&(angryGuys))return MUSIC_ACTION; + return MUSIC_WANDER; +} + +void UpdateMusicLevel(edict_t *ent) +{ + int curSituation; + + assert(ent); + assert(ent->client); + + if((ent->client->ps.musicID != MUSIC_ACTION)&&(ent->client->ps.musicID != MUSIC_WANDER)&&(ent->client->ps.musicID != MUSIC_UNSET)) + { // no dynamic music active + return; + } + + if((ent->client->ps.musicID == MUSIC_ACTION) && + (ent->client->musicTime > level.time - MIN_ACTION_MUSIC_TIME)) + { + return;//never change too quickly + } + + curSituation = classifyMusicSituation(*ent); + + if(curSituation != ent->client->ps.musicID) + { + ent->client->ps.musicID = curSituation; + ent->client->musicTime = level.time; + } +} diff --git a/Source/Game/gamecpp/g_spawn.cpp b/Source/Game/gamecpp/g_spawn.cpp new file mode 100644 index 0000000..a414dbe --- /dev/null +++ b/Source/Game/gamecpp/g_spawn.cpp @@ -0,0 +1,2060 @@ + +#include "g_local.h" +#include "g_spawn.h" +#include "fields.h" +#include "ai_pathfinding.h" +#include "p_body.h" +#include "..\qcommon\configstring.h" + +#if TIME_ENTS + #include +#endif + +void CalculatePlayerEntryWeapons(int *weaponsAvailable); + +byte entSoundsToCache[NUM_CLSFX]; +char entDebrisToCache[NUM_CLGHL]; + +// 1/12/99 sfs -- this should fix the crummy randomness in pakfile creating +static cvar_t *fs_createpak; + +extern spawn_t environSpawns[]; +extern spawn_t funcSpawns[]; +extern spawn_t triggerSpawns[]; +extern spawn_t targetSpawns[]; +extern spawn_t lightSpawns[]; +extern spawn_t bosniaSpawns[]; +extern spawn_t castleSpawns[]; +extern spawn_t iraqSpawns[]; +extern spawn_t genericSpawns[]; +extern spawn_t newyorkSpawns[]; +extern spawn_t siberiaSpawns[]; +extern spawn_t tokyoSpawns[]; +extern spawn_t ugandaSpawns[]; +extern spawn_t dmSpawns[]; + +void CleanUpGame (void); + +// info_... +//void SP_info_merc_start (edict_t *ent); +void SP_info_notnull (edict_t *self); +void SP_info_null (edict_t *self); +void SP_info_player_start (edict_t *ent); +void SP_info_player_deathmatch (edict_t *ent); +void SP_info_player_team1 (edict_t *ent); +void SP_info_player_team2 (edict_t *ent); +//void SP_info_player_coop (edict_t *ent); +void SP_info_player_intermission (edict_t *ent); + +int ai_loadAllBolts = 0; + + +// misc non-id stuff +void SP_func_remote_camera(edict_t *Self); +void SP_misc_ctf_base (edict_t *self); + + +// misc_ id stuff +void SP_path_corner (edict_t *self); +void SP_point_combat (edict_t *self); +void SP_misc_gib_arm (edict_t *self); +void SP_misc_gib_leg (edict_t *self); +void SP_misc_gib_head (edict_t *self); + +void SP_spawner(edict_t *ent); +void SP_spawner_monster(edict_t *ent); +void SP_spawner_boosterpack(edict_t *ent); + +// worldspawn... +void SP_worldspawn (edict_t *ent); + +// testing things +void SP_ghoul_model (edict_t *ent); +void SP_test_model (edict_t *ent); +void SP_test_rj (edict_t *ent); + +extern void SP_script_runner (edict_t *ent); + +void InitEntSoundCaching(void); +void InitEntMetalSoundCaching(void); +void InitEntDebrisCaching(void); +void CacheEntDebrisAndSounds(edict_t *ent); +void CacheAllDebris(void); +void CacheAllWallEffects(void); +void CacheAllSounds(void); + +spawn_t spawns[] = +{ + // info_... +// {"info_merc_start", SP_info_merc_start}, + {"info_null", SP_info_null}, + {"info_notnull", SP_info_notnull}, +// {"info_player_coop", SP_info_player_coop}, + {"info_player_deathmatch", SP_info_player_deathmatch}, + {"info_player_team1", SP_info_player_team1}, + {"info_player_team2", SP_info_player_team2}, + {"info_player_intermission", SP_info_player_intermission}, + {"info_player_start", SP_info_player_start}, + + // misc_nonid stuff + {"func_remote_camera", SP_func_remote_camera}, + {"misc_ctf_base", SP_misc_ctf_base}, + + // misc_ id stuff + {"path_corner", SP_path_corner}, + {"point_combat", SP_point_combat}, + + // monster_... + {"m_x_romulan", SP_m_x_romulan}, + {"m_x_tank", SP_m_x_tank}, + {"m_x_snowcat", SP_m_x_snowcat}, + {"m_x_husky", SP_m_x_husky}, + {"m_x_rottweiler", SP_m_x_rottweiler}, + {"m_x_germanshep", SP_m_x_germanshep}, + {"m_x_raiderdog", SP_m_x_raiderdog}, + {"m_x_bull", SP_m_x_bull}, + {"m_x_chopper_black", SP_m_x_chopper_black}, + {"m_x_chopper_green", SP_m_x_chopper_green}, + {"m_x_chopper_white", SP_m_x_chopper_white}, + {"m_x_hind", SP_m_x_hind}, + {"m_x_mcharacter", SP_m_x_mcharacter}, + {"m_x_mcharacter_snow", SP_m_x_mcharacter_snow}, + {"m_x_mcharacter_desert", SP_m_x_mcharacter_desert}, + {"m_x_mmerc", SP_m_x_mmerc}, + {"m_x_mhurtmerc", SP_m_x_mhurtmerc}, + {"m_x_msam", SP_m_x_msam}, + {"m_x_miraqboss", SP_m_x_miraqboss}, + {"m_x_mraiderboss1", SP_m_x_mraiderboss1}, + {"m_x_mraiderboss2", SP_m_x_mraiderboss2}, + {"m_x_ftaylor", SP_m_x_ftaylor}, + {"m_x_mskinboss", SP_m_x_mskinboss}, + + {"m_sib_mtrooper1a", SP_m_sib_mtrooper1a}, + {"m_sib_mtrooper1b", SP_m_sib_mtrooper1b}, + {"m_sib_mtrooper2", SP_m_sib_mtrooper2}, + {"m_sib_mguard1", SP_m_sib_mguard1}, + {"m_sib_fguard2", SP_m_sib_fguard2}, + {"m_sib_mguard3", SP_m_sib_mguard3}, + {"m_sib_mguard4", SP_m_sib_mguard4}, + {"m_sib_mcleansuit", SP_m_sib_mcleansuit}, + {"m_sib_eofficer", SP_m_sib_eofficer}, + {"m_sib_mmechanic", SP_m_sib_mmechanic}, + {"m_sib_escientist1", SP_m_sib_escientist1}, + {"m_sib_fscientist2", SP_m_sib_fscientist2}, + + {"m_afr_msoldier1a", SP_m_afr_msoldier1a}, + {"m_afr_msoldier1b", SP_m_afr_msoldier1b}, + {"m_afr_msoldier2", SP_m_afr_msoldier2}, + {"m_afr_msoldier3", SP_m_afr_msoldier3}, + {"m_afr_msniper", SP_m_afr_msniper}, + {"m_afr_ecommander", SP_m_afr_ecommander}, + {"m_afr_eworker", SP_m_afr_eworker}, + {"m_afr_mbrute", SP_m_afr_mbrute}, + {"m_afr_mrocket", SP_m_afr_mrocket}, + + {"m_kos_mgrunt1", SP_m_kos_mgrunt1}, + {"m_kos_mgrunt2", SP_m_kos_mgrunt2}, + {"m_kos_mgrunt3", SP_m_kos_mgrunt3}, + {"m_kos_msniper1a", SP_m_kos_msniper1a}, + {"m_kos_msniper1b", SP_m_kos_msniper1b}, + {"m_kos_mcomtroop", SP_m_kos_mcomtroop}, + {"m_kos_eofficer", SP_m_kos_eofficer}, + {"m_kos_mbrute1a", SP_m_kos_mbrute1a}, + {"m_kos_mbrute1b", SP_m_kos_mbrute1b}, + {"m_kos_mmechanic", SP_m_kos_mmechanic}, + {"m_kos_mrebel", SP_m_kos_mrebel}, + {"m_kos_mklaleader", SP_m_kos_mklaleader}, + {"m_kos_erefugee", SP_m_kos_erefugee}, + + {"m_tok_mman1", SP_m_tok_mman1}, + {"m_tok_mman2", SP_m_tok_mman2}, + {"m_tok_mhench1", SP_m_tok_mhench1}, + {"m_tok_mhench2", SP_m_tok_mhench2}, + {"m_tok_mkiller", SP_m_tok_mkiller}, + {"m_tok_fassassin", SP_m_tok_fassassin}, + {"m_tok_mninja", SP_m_tok_mninja}, + {"m_tok_mbrute", SP_m_tok_mbrute}, + {"m_tok_fwoman1", SP_m_tok_fwoman1}, + {"m_tok_fwoman2", SP_m_tok_fwoman2}, + + {"m_irq_msoldier1", SP_m_irq_msoldier1}, + {"m_irq_msoldier2a", SP_m_irq_msoldier2a}, + {"m_irq_msoldier2b", SP_m_irq_msoldier2b}, + {"m_irq_mrepguard1a", SP_m_irq_mrepguard1a}, + {"m_irq_mrepguard1b", SP_m_irq_mrepguard1b}, + {"m_irq_mpolice", SP_m_irq_mpolice}, + {"m_irq_eofficer", SP_m_irq_eofficer}, + {"m_irq_mcommander", SP_m_irq_mcommander}, + {"m_irq_mbrute1a", SP_m_irq_mbrute1a}, + {"m_irq_mbrute1b", SP_m_irq_mbrute1b}, + {"m_irq_mbodyguard", SP_m_irq_mbodyguard}, + {"m_irq_mrocket", SP_m_irq_mrocket}, + {"m_irq_msaddam", SP_m_irq_msaddam}, + {"m_irq_moilworker", SP_m_irq_moilworker}, + {"m_irq_eman1", SP_m_irq_eman1}, + {"m_irq_mman2", SP_m_irq_mman2}, + {"m_irq_fwoman1", SP_m_irq_fwoman1}, + {"m_irq_fwoman2", SP_m_irq_fwoman2}, + + {"m_cas_mraider1", SP_m_cas_mraider1}, + {"m_cas_mraider2a", SP_m_cas_mraider2a}, + {"m_cas_mraider2b", SP_m_cas_mraider2b}, + {"m_cas_mbrute", SP_m_cas_mbrute}, + {"m_cas_ffemale", SP_m_cas_ffemale}, + {"m_cas_mrocket", SP_m_cas_mrocket}, + + {"m_nyc_mskinhead1", SP_m_nyc_mskinhead1}, + {"m_nyc_mskinhead2a", SP_m_nyc_mskinhead2a}, + {"m_nyc_mskinhead2b", SP_m_nyc_mskinhead2b}, + {"m_nyc_eskinhead3", SP_m_nyc_eskinhead3}, + {"m_nyc_fskinchick", SP_m_nyc_fskinchick}, + {"m_nyc_mpunk", SP_m_nyc_mpunk}, + {"m_nyc_epunk", SP_m_nyc_epunk}, + {"m_nyc_mswat", SP_m_nyc_mswat}, + {"m_nyc_mswatleader", SP_m_nyc_mswatleader}, + {"m_nyc_estockbroker", SP_m_nyc_estockbroker}, + {"m_nyc_ebum", SP_m_nyc_ebum}, + {"m_nyc_etourist", SP_m_nyc_etourist}, + {"m_nyc_mpolitician", SP_m_nyc_mpolitician}, + {"m_nyc_fwoman", SP_m_nyc_fwoman}, + + + {"script_runner", SP_script_runner}, + + {"spawner", SP_spawner}, + {"spawner_monster", SP_spawner_monster}, + {"spawner_boosterpack", SP_spawner_boosterpack}, + + // worldspawn + {"worldspawn", SP_worldspawn}, + + // testing stuff + {"ghoul_model", SP_ghoul_model}, + {"test_model", SP_test_model}, + {"test_rj", SP_test_rj}, + + + {NULL, NULL} +}; + +field_t fields[] = +{ + {"classname", FOFS(classname), F_STRING}, + {"origin", FOFS(s.origin), F_VECTOR}, + {"model", FOFS(model), F_STRING}, + {"spawnflags", FOFS(spawnflags), F_INT}, + {"speed", FOFS(speed), F_FLOAT}, + {"accel", FOFS(accel), F_FLOAT}, + {"decel", FOFS(decel), F_FLOAT}, + {"target", FOFS(target), F_STRING}, + {"targetname", FOFS(targetname), F_STRING}, + {"scripttarget", FOFS(scripttarget), F_STRING}, + {"pathtarget", FOFS(pathtarget), F_STRING}, + {"deathtarget", FOFS(deathtarget), F_STRING}, + {"killtarget", FOFS(killtarget), F_STRING}, + {"killfacing", FOFS(killfacing), F_STRING}, + {"combattarget", FOFS(combattarget), F_STRING}, + {"soundname", FOFS(soundName), F_STRING}, + {"spawn1", FOFS(spawn1), F_STRING}, + {"spawn2", FOFS(spawn2), F_STRING}, + {"spawn3", FOFS(spawn3), F_STRING}, + {"message", FOFS(message), F_STRING}, + {"sp_message", FOFS(sp_message), F_INT}, + {"team", FOFS(team), F_STRING}, + {"wait", FOFS(wait), F_FLOAT}, + {"delay", FOFS(delay), F_FLOAT}, + {"random", FOFS(random), F_FLOAT}, + {"style", FOFS(style), F_INT}, + {"count", FOFS(count), F_INT}, + {"health", FOFS(health), F_INT}, + {"sounds", FOFS(sounds), F_INT}, + {"light", 0, F_IGNORE}, + {"dmg", FOFS(dmg), F_INT}, + {"angles", FOFS(s.angles), F_VECTOR}, + {"angle", FOFS(s.angles), F_ANGLEHACK}, + {"mass", FOFS(mass), F_INT}, + {"volume", FOFS(volume), F_FLOAT}, + {"attenuation", FOFS(attenuation), F_FLOAT}, + {"map", FOFS(map), F_STRING}, + {"skin",FOFS(s.skinnum), F_INT}, + {"alertradius", FOFS(alertRadius), F_FLOAT}, + {"personality", FOFS(personality), F_INT}, + + // temp spawn vars -- only valid when the spawn function is called + {"lip", STOFS(lip), F_INT, FFL_SPAWNTEMP}, + {"distance", STOFS(distance), F_INT, FFL_SPAWNTEMP}, + {"height", STOFS(height), F_INT, FFL_SPAWNTEMP}, + {"noise", STOFS(noise), F_STRING, FFL_SPAWNTEMP}, + {"pausetime", STOFS(pausetime), F_FLOAT, FFL_SPAWNTEMP}, + {"item", STOFS(item), F_STRING, FFL_SPAWNTEMP}, + {"gravity", STOFS(gravity), F_STRING, FFL_SPAWNTEMP}, + {"sky", STOFS(sky), F_STRING, FFL_SPAWNTEMP}, + {"skyrotate", STOFS(skyrotate), F_FLOAT, FFL_SPAWNTEMP}, + {"skyaxis", STOFS(skyaxis), F_VECTOR, FFL_SPAWNTEMP}, + {"terrainset", STOFS(terrainSet), F_STRING, FFL_SPAWNTEMP}, + {"musicSet", STOFS(musicSet), F_STRING, FFL_SPAWNTEMP}, + {"color", STOFS(color), F_VECTOR, FFL_SPAWNTEMP}, + {"endpoint", STOFS(endpoint), F_VECTOR, FFL_SPAWNTEMP}, + {"minyaw", STOFS(minyaw), F_FLOAT, FFL_SPAWNTEMP}, + {"maxyaw", STOFS(maxyaw), F_FLOAT, FFL_SPAWNTEMP}, + {"minpitch", STOFS(minpitch), F_FLOAT, FFL_SPAWNTEMP}, + {"maxpitch", STOFS(maxpitch), F_FLOAT, FFL_SPAWNTEMP}, + {"nextmap", STOFS(nextmap), F_STRING, FFL_SPAWNTEMP}, + {"script", STOFS(script), F_STRING, FFL_SPAWNTEMP}, + {"killedvalue", STOFS(killedValue), F_INT, FFL_SPAWNTEMP}, + {"survivalvalue", STOFS(survivalValue), F_INT, FFL_SPAWNTEMP}, + {"material", STOFS(material), F_INT, FFL_SPAWNTEMP}, + {"scale", STOFS(scale), F_FLOAT, FFL_SPAWNTEMP}, + {"merctype", STOFS(merctype), F_INT, FFL_SPAWNTEMP}, + {"mercnum", STOFS(mercnum), F_INT, FFL_SPAWNTEMP}, + {"waitaction1", STOFS(waitAction1), F_STRING, FFL_SPAWNTEMP}, + {"waitaction2", STOFS(waitAction2), F_STRING, FFL_SPAWNTEMP}, + {"waitaction3", STOFS(waitAction3), F_STRING, FFL_SPAWNTEMP}, + {"waitaction4", STOFS(waitAction4), F_STRING, FFL_SPAWNTEMP}, + {"waitaction5", STOFS(waitAction5), F_STRING, FFL_SPAWNTEMP}, + {"waitaction6", STOFS(waitAction6), F_STRING, FFL_SPAWNTEMP}, + {"moveaction", STOFS(moveAction), F_STRING, FFL_SPAWNTEMP}, + {"screeneffect", STOFS(screeneffect), F_INT, FFL_SPAWNTEMP}, + {"spawnfrequency", STOFS(spawnfrequency), F_FLOAT, FFL_SPAWNTEMP}, + {"parm1", STOFS(parms[0]), F_STRING, FFL_SPAWNTEMP}, + {"parm2", STOFS(parms[1]), F_STRING, FFL_SPAWNTEMP}, + {"parm3", STOFS(parms[2]), F_STRING, FFL_SPAWNTEMP}, + {"parm4", STOFS(parms[3]), F_STRING, FFL_SPAWNTEMP}, + {"parm5", STOFS(parms[4]), F_STRING, FFL_SPAWNTEMP}, + {"parm6", STOFS(parms[5]), F_STRING, FFL_SPAWNTEMP}, + {"parm7", STOFS(parms[6]), F_STRING, FFL_SPAWNTEMP}, + {"parm8", STOFS(parms[7]), F_STRING, FFL_SPAWNTEMP}, + {"parm9", STOFS(parms[8]), F_STRING, FFL_SPAWNTEMP}, + {"parm10", STOFS(parms[9]), F_STRING, FFL_SPAWNTEMP}, + {"surfacetype", STOFS(surfaceType), F_INT, FFL_SPAWNTEMP}, + {"noweapons", STOFS(noweapons), F_INT, FFL_SPAWNTEMP}, + {"setweapons", STOFS(setweapons), F_INT, FFL_SPAWNTEMP}, + {"maxDeadHostages", STOFS(maxDeadHostages), F_INT, FFL_SPAWNTEMP}, + {"ambientSet", STOFS(ambientSet), F_STRING, FFL_SPAWNTEMP}, + {"startmusic", STOFS(startmusic), F_INT, FFL_SPAWNTEMP}, + {"forceHUD", STOFS(forceHUD), F_INT, FFL_SPAWNTEMP}, + {"weaponsAvailable", STOFS(weaponsAvailable), F_INT, FFL_SPAWNTEMP}, + {"ainame", STOFS(ai_name), F_STRING, FFL_SPAWNTEMP}, + + // BSP dummy options + {"distcull", STOFS(dummy), F_INT, FFL_SPAWNTEMP}, + {"chopsky", STOFS(dummy), F_INT, FFL_SPAWNTEMP}, + + {NULL, 0, F_INT} +}; + +typedef spawn_t *spawnPtr; + +spawnPtr spawnLists[] = +{ + environSpawns, + funcSpawns, + triggerSpawns, + targetSpawns, + lightSpawns, + bosniaSpawns, + castleSpawns, + iraqSpawns, + genericSpawns, + newyorkSpawns, + siberiaSpawns, + tokyoSpawns, + ugandaSpawns, + dmSpawns, + spawns, + NULL +}; + +#if TIME_ENTS + +void ClearTimings(bool DoCount) +{ + spawnPtr *table; + spawn_t *s; + + for(table = spawnLists; *table; table++) + { + for (s=*table; s->name ; s++) + { + s->time_used = 0; + if (DoCount) + { + s->count = 0; + } + } + } +} + +void PrintTimings(void) +{ + spawnPtr *table; + spawn_t *s; + char temp[1024]; + unsigned long total=0; + multimap > sortit; + + for(table = spawnLists; *table; table++) + { + for (s=*table; s->name ; s++) + { + if (s->time_used) + { + sortit.insert(pair >(-s->time_used,pair(s->name, s->count))); + total+=s->time_used; + } + } + } + if (total) + { + OutputDebugString("Entity Timing Report\n"); + OutputDebugString("================================\n"); + multimap >::iterator i; + for (i=sortit.begin();i!=sortit.end();i++) + { + float p=100.0f*float(-(*i).first)/float(total); + sprintf(temp,"%4.1f\t%3d\t%s\n",p,(*i).second.second,(*i).second.first); + OutputDebugString(temp); + } + OutputDebugString("================================\n"); + } +} + +#endif + +/* +=============== +ED_CallSpawn + +Finds the spawn function for the entity and calls it +=============== +*/ +void ED_CallSpawn (edict_t *ent) +{ + spawnPtr *table; + spawn_t *s; + Pickup *pickup = NULL; + + if (!ent->classname) + { + gi.dprintf ("ED_CallSpawn: NULL classname\n"); + return; + } + + if (ent->classname[0] == '_') + { + G_FreeEdict(ent); + return; + } + + // Don't spawn fluff objects. + if (gl_pictip->value) + { + if ((strncmp (ent->classname, "misc_", 5)==0) && (ent->spawnflags & SF_FLUFF)) + { + G_FreeEdict(ent); + return; + } + } + + // Check item spawn functions. + if (pickup = thePickupList.GetPickupFromEdict(ent)) + { + if (dm->checkItemSpawn(ent, &pickup)) + { + I_Spawn(ent, pickup); + } + return; + } + + // Check normal spawn functions. + for(table = spawnLists; *table; table++) + { + for (s=*table; s->name ; s++) + { + if (!strcmp(s->name, ent->classname)) + { + // Found it. + s->spawn (ent); +#if TIME_ENTS + ent->owner_spawn = s; + s->count++; +#endif + return; + } + } + } + + // No spawn func == no exist. + gi.dprintf ("%s doesn't have a spawn function\n", ent->classname); + G_FreeEdict(ent); +} + +/* +============= +ED_NewString +============= +*/ +char *ED_NewString (char *string) +{ + char *newb, *new_p; + int i,l; + + l = strlen(string) + 1; + + newb = (char*)gi.TagMalloc (l, TAG_LEVEL); + + new_p = newb; + + for (i=0 ; i< l ; i++) + { + if (string[i] == '\\' && i < l-1) + { + i++; + if (string[i] == 'n') + *new_p++ = '\n'; + else + *new_p++ = '\\'; + } + else + *new_p++ = string[i]; + } + + return newb; +} + +/* +=============== +ED_ParseField + +Takes a key/value pair and sets the binary values +in an edict +=============== +*/ +void ED_ParseField (char *key, char *value, edict_t *ent) +{ + field_t *f; + byte *b; + float v; + vec3_t vec; + + for (f=fields ; f->name ; f++) + { + if (!stricmp(f->name, key)) + { // found it + if (f->flags & FFL_SPAWNTEMP) + b = (byte *)&st; + else + b = (byte *)ent; + + switch (f->type) + { + case F_STRING: + *(char **)(b+f->ofs) = ED_NewString (value); + break; + case F_VECTOR: + sscanf (value, "%f %f %f", &vec[0], &vec[1], &vec[2]); + ((float *)(b+f->ofs))[0] = vec[0]; + ((float *)(b+f->ofs))[1] = vec[1]; + ((float *)(b+f->ofs))[2] = vec[2]; + break; + case F_INT: + *(int *)(b+f->ofs) = atoi(value); + break; + case F_SHORT: + *(short *)(b+f->ofs) = (short)atoi(value); + break; + case F_FLOAT: + *(float *)(b+f->ofs) = atof(value); + break; + case F_ANGLEHACK: + v = atof(value); + ((float *)(b+f->ofs))[0] = 0; + ((float *)(b+f->ofs))[1] = v; + ((float *)(b+f->ofs))[2] = 0; + break; + case F_IGNORE: + break; + } + return; + } + } + gi.dprintf ("%s is not a field\n", key); +} + +/* +==================== +ED_ParseEdict + +Parses an edict out of the given string, returning the new position +ed should be a properly initialized empty edict. +==================== +*/ +char *ED_ParseEdict (char *data, edict_t *ent) +{ + qboolean init; + char keyname[256]; + char *com_token; + + init = false; + memset (&st, 0, sizeof(st)); + +// go through all the dictionary pairs + while (1) + { + // parse key + com_token = COM_Parse (&data); + if (com_token[0] == '}') + break; + if (!data) + gi.error ("ED_ParseEntity: EOF without closing brace"); + + strncpy (keyname, com_token, sizeof(keyname)-1); + + // parse value + com_token = COM_Parse (&data); + if (!data) + gi.error ("ED_ParseEntity: EOF without closing brace"); + + if (com_token[0] == '}') + gi.error ("ED_ParseEntity: closing brace without data"); + + init = true; + + // keynames with a leading underscore are used for utility comments, + // and are immediately discarded by quake + if (keyname[0] == '_') + continue; + + ED_ParseField (keyname, com_token, ent); + } + + if (!init) + memset (ent, 0, sizeof(*ent)); + + return data; +} + + +/* +================ +G_FindTeams + +Chain together all entities with a matching team field. + +All but the first will have the FL_TEAMSLAVE flag set. +All but the last will have the teamchain field set to the next one +================ +*/ +void G_FindTeams (void) +{ + edict_t *e, *e2, *chain; + int i, j; + int c, c2; + + c = 0; + c2 = 0; + for (i=1, e=g_edicts+i ; i < globals.num_edicts ; i++,e++) + { + if (!e->inuse) + continue; + if (!e->team) + continue; + if (e->flags & FL_TEAMSLAVE) + continue; + chain = e; + e->teammaster = e; + c++; + c2++; + for (j=i+1, e2=e+1 ; j < globals.num_edicts ; j++,e2++) + { + if (!e2->inuse) + continue; + if (!e2->team) + continue; + if (e2->flags & FL_TEAMSLAVE) + continue; + if (!strcmp(e->team, e2->team)) + { + c2++; + chain->teamchain = e2; + e2->teammaster = e; + chain = e2; + e2->flags |= FL_TEAMSLAVE; + } + } + } + + gi.dprintf ("%i teams with %i entities\n", c, c2); +} + +void HackPrecacheLevelSounds(void); + + +void RegisterCommonStringPackets(void) +{ + gi.SP_Register("items"); + gi.SP_Register("weapons"); + gi.SP_Register("general"); +} + + +/* +============== +SpawnEntities + +Creates a server's entity / program execution context by +parsing textual entity definitions out of an ent file. +============== +*/ + +edict_t* WorldSpawnScriptRunner; +extern float walldamagetime; // rjr: yeah, yucky extern here, but reserving real words for what I feel... + +void SpawnEntities (char *mapname, char *entities, char *spawnpoint) +{ + edict_t *ent; + int inhibit; + char *com_token; + int i; + + WorldSpawnScriptRunner = NULL; + + PreserveClientData (); + + ShutdownScripts(); + gi.FreeTags (TAG_LEVEL); + + memset (&level, 0, sizeof(level)); + G_FreeAllEdicts(); + + gmonster.Init(); + + strncpy (level.mapname, mapname, sizeof(level.mapname)-1); + strncpy (game.spawnpoint, spawnpoint, sizeof(game.spawnpoint)-1); + + // set client fields on player ents + for (i=0 ; ivalue) + { + ai_loadAllBolts=1; + } +// parse ents + while (1) + { + // parse the opening brace + com_token = COM_Parse (&entities); + if (!entities) + break; + if (com_token[0] != '{') + gi.error ("ED_LoadFromFile: found %s when expecting {",com_token); + + if (!ent) + ent = g_edicts; + else + ent = G_Spawn (); + entities = ED_ParseEdict (entities, ent); + + // remove things (except the world) from different skill levels or deathmatch + if (ent != g_edicts) + { + if (dm->isDM()) + { + if ( ent->spawnflags & SPAWNFLAG_NOT_DEATHMATCH ) + { + G_FreeEdict (ent); + inhibit++; + continue; + } + } + + else + { + + if ((((game.playerSkills.getEnemyValue() == 0) || (game.playerSkills.getEnemyValue() == 1)) && (ent->spawnflags & SPAWNFLAG_NOT_EASY)) || + (((game.playerSkills.getEnemyValue() == 2)) && (ent->spawnflags & SPAWNFLAG_NOT_MEDIUM)) || + (((game.playerSkills.getEnemyValue() == 3) || (game.playerSkills.getEnemyValue() == 4)) && (ent->spawnflags & SPAWNFLAG_NOT_HARD))) + { + G_FreeEdict (ent); + inhibit++; + continue; + } + // 12/27/99 kef -- here is where we should remove fluff objects...currently done in ED_CallSpawn, I think + } + + + ent->spawnflags &= ~(SPAWNFLAG_NOT_EASY|SPAWNFLAG_NOT_MEDIUM|SPAWNFLAG_NOT_HARD|SPAWNFLAG_NOT_DEATHMATCH); +// ent->spawnflags &= ~(SPAWNFLAG_NOT_DEATHMATCH); + } + + // put skill level item check here -- dk wubba + + ED_CallSpawn (ent); + // cache necessary debris models based on ent's material + CacheEntDebrisAndSounds(ent); + } + + // 1/31/00 kef -- just need to call this sometime after spawning all pickups. see CWeaponInfo.h. + thePickupList.PostSpawnInit(); + + + ai_loadAllBolts=0; + + // Gametype specific initialisation. + + dm->levelInit(); + + gi.Update(0.25f, true); + CacheAllDebris(); + CacheAllSounds(); + CacheAllWallEffects(); + + gi.dprintf ("%i entities inhibited\n", inhibit); + + G_FindTeams (); + + PlayerTrail_Init (); + + gi.Update(0.28f, true); + SndInitWorldSounds(); + + CalculatePlayerEntryWeapons(&level.weaponsAvailable); + + gi.Update(0.30f, true); + + // Clear out all the (now invalid) pointers to the weapon ghoul objects. + pe->UncacheViewWeaponModels(); + + // level.weaponsAvailable - this will take care of everything enemies are + // carrying / items lying around - players come later. + pe->PrecacheViewWeaponModels(level.weaponsAvailable); + + gi.CreateGhoulConfigStrings(); + gi.Update(0.33f, true); + + walldamagetime = -999999.0; +} + + +//=================================================================== + +void PrecacheSurfaceTypes(void) +{ + byte List[256], count; + + count = gi.SurfaceTypeList(List, sizeof(List)); + + while(count) + { + count--; + + switch(List[count]) + { + case SURF_DEFAULT: + break; + case SURF_METAL: + break; + case SURF_SAND_YELLOW: + break; + case SURF_SAND_WHITE: + break; + case SURF_SAND_LBROWN: + break; + case SURF_SAND_DBROWN: + break; + + case SURF_GRAVEL_GREY: + break; + case SURF_GRAVEL_DBROWN: + break; + case SURF_GRAVEL_LBROWN: + break; + + case SURF_SNOW: + break; + + case SURF_LIQUID_BLUE: + break; + case SURF_LIQUID_GREEN: + break; + case SURF_LIQUID_ORANGE: + break; + case SURF_LIQUID_BROWN: + break; + + case SURF_WOOD_LBROWN: + break; + case SURF_WOOD_DBROWN: + break; + case SURF_WOOD_LGREY: + break; + + case SURF_STONE_LGREY: + break; + case SURF_STONE_DGREY: + break; + case SURF_STONE_LBROWN: + break; + case SURF_STONE_DBROWN: + break; + case SURF_STONE_WHITE: + break; + case SURF_STONE_GREEN: + break; + case SURF_STONE_RED: + break; + case SURF_STONE_BLACK: + break; + + case SURF_GRASS_GREEN: + break; + case SURF_GRASS_BROWN: + break; + + case SURF_LIQUID_RED: + break; + + case SURF_METAL_STEAM: + break; + case SURF_METAL_WATERJET: + break; + case SURF_METAL_OILSPURT: + break; + case SURF_METAL_CHEMSPURT: + break; + case SURF_METAL_COMPUTERS: + break; + + case SURF_SNOW_LBROWN: + break; + case SURF_SNOW_GREY: + break; + case SURF_BLOOD: + break; + case SURF_LIQUID_BLACK: + break; + case SURF_GLASS: + break; + case SURF_GLASS_COMPUTER: + break; + case SURF_SODAMACHINE: + break; + case SURF_PAPERWALL: + break; + case SURF_NEWSPAPER_DAMAGE: + break; + + + } + } +} + +void PrecacheSpawningEnemies(edict_t *ent) +{ + edict_t *newGuy; + char *curSpawn; + int oldLoadAllBolts=ai_loadAllBolts; + + ai_loadAllBolts = 1; + + for(int i = 0; i < 3; i++) + { + switch(i) + { + case 0: + curSpawn = ent->spawn1; + break; + case 1: + curSpawn = ent->spawn2; + break; + case 2: + curSpawn = ent->spawn3; + break; + } + + if(!curSpawn) + { + continue; + } + + if(!strcmp(curSpawn, "")) + { + continue; + } + + newGuy = G_Spawn(); + + newGuy->classname = curSpawn; + ED_CallSpawn (newGuy); + G_FreeEdict(newGuy); + } + ai_loadAllBolts = oldLoadAllBolts; +} + + +/*QUAKED worldspawn (0 0 0) ? + +Only used for the world. +"sky" environment map name +"skyaxis" vector axis for rotating sky +"skyrotate" speed of rotation in degrees/second +"sounds" music cd track number +"gravity" 800 is default gravity +"message" text to print at user logon +"musicset" filename of the musicset for this level +"terrainset" filename of the terrainset for this level +"distcull" sets the maximum distance for vis (100 is good) +"chop" sets the surface patch size for lighting +"chopsky" sets the surface patch size for sky +"chopwarp" sets the surface patch size for warp surfaces +"script" filename of a script to run at map loadtime +"raffel" set this to 1 if you want your map to run slower +"jersey" set this to 1 to make all enemies talk funny +"screeneffect" sets the style of general screen effect +"spawn1" +"spawn2" +"spawn3" types of guys that will be spawned into the world from combat +"spawnfrequency" 0..1 (from no guys to very likely) - default is 0 +"noweapons" for levels like the armory where the player gets no weapons. set to 1 for no weapons. +"setweapons" set the player's inventory. For TRN1 and TSR1 use 1. overridden by noweapons. +"maxDeadHostages" number of dead hostages allowed before you fail this mission +"ambientset" filename of the ambient set for this level +"startmusic" set if you want to force a specific song at startup +"forceHUD" set this for the tutorial level. draws HUD even with no weapon. +"weaponsAvailable" magic number for precaching weapons. ask a programmer. (68 for tutorial level) +"ainame" over-ride for per-level enemy set +*/ + +void SP_worldspawn (edict_t *ent) +{ + int nWeapons = -1; + + ent->movetype = MOVETYPE_PUSH; + ent->solid = SOLID_BSP; + ent->inuse = true; // since the world doesn't use G_Spawn() + ent->s.modelindex = 1; // world model is always index 1 + + level.spawnFrequency = st.spawnfrequency; + level.playerLoudness = 0;//defaults to this + level.spawnRushTime = -999; + level.spawnSoundTime = 0; + level.lullTime = 0; + level.lastSpawn = 0; + level.weaponsAvailable = 0; + level.lastEnemyKill = 0; + memset(level.clearedNodes, 0, MAX_NODES); + if (st.ai_name) + { + strcpy(level_ai_name, st.ai_name); + } + else + { + level_ai_name[0] = 0; + } + + level.forceHUD = st.forceHUD; + level.weaponsAvailable = st.weaponsAvailable; + if (st.noweapons) + { + nWeapons = 0; + } + else if (st.setweapons) + { + nWeapons = st.setweapons; + } + if (nWeapons >= 0) + { + // oh my gosh this is so lame + if (!ent->objInfo) + { // create a baseObjInfo_c for our edict + baseObjInfo_c *newInfo = new baseObjInfo_c(ent); + + // somewhere in the newInfo struct note the fact that this is a "no weapons" level + if (ent->objInfo = newInfo) + { + objFlipInfo_c *pFlipInfo = (objFlipInfo_c*)newInfo->GetInfo(OIT_FLIP); + switch(nWeapons) + { + case 0: + pFlipInfo->radius = -1; // tried to make this lamer. couldn't. + break; + case 1: + pFlipInfo->radius = -2; + break; + default: + break; + } + } + } + } + + if (st.maxDeadHostages) + { // how many hostages are allowed to die before you fail this mission + level.maxDeadHostages = st.maxDeadHostages; + } + else + { // if there's no value here, save a good flag-value + level.maxDeadHostages = -1; + } + + // init the status of our countdown timer (if there isn't one in this level, who cares?) + level.countdownEnded = 0; + // just starting the mission...no status yet + level.missionStatus = MISSION_NONE; + + //--------------- + + // reserve some spots for dead player bodies for coop / deathmatch + InitBodyQue (); + + // set configstrings for items +// SetItemNames (); + + if (st.nextmap) + strcpy (level.nextmap, st.nextmap); + + // make some data visible to the server + + if (ent->message && ent->message[0]) + { + gi.configstring (CS_NAME, ent->message); + strncpy (level.level_name, ent->message, sizeof(level.level_name)); + } + else + strncpy (level.level_name, level.mapname, sizeof(level.level_name)); + + if (st.sky && st.sky[0]) + gi.configstring (CS_SKY, st.sky); + else + gi.configstring (CS_SKY, "none"); + + if (st.terrainSet && st.terrainSet[0]) + { + gi.configstring (CS_TERRAINNAME, va("%s", st.terrainSet)); + } + + gi.configstring (CS_SKYROTATE, va("%f", st.skyrotate) ); + + gi.configstring (CS_SKYAXIS, va("%f %f %f", + st.skyaxis[0], st.skyaxis[1], st.skyaxis[2]) ); + + gi.configstring (CS_CDTRACK, va("%i", ent->sounds) ); + + gi.configstring (CS_MAXCLIENTS, va("%i", (int)(maxclients->value) ) ); + + gi.configstring (CS_SCREENEFFECT, va("%i", (int)(st.screeneffect) ) ); + + if (st.musicSet && st.musicSet[0]) + { + gi.configstring (CS_MUSICSET, va("%s", st.musicSet) ); + } + + // set ambient sound set name. + // if its blank, then force it to "sounds/sound.amb" + if (st.ambientSet && st.ambientSet[0]) + { + gi.configstring (CS_AMBSET, va("%s", st.ambientSet)); + } + else + { + gi.configstring (CS_AMBSET, "sound/sound.ams"); + } + + if(st.startmusic) + { + level.baseSong = st.startmusic; + } + else + { + level.baseSong = 0; + } + + if(st.script) + { +/* edict_t *runner; + + runner = + runner->classname = "script_runner"; + + ED_CallSpawn(runner); + + runner->use(runner, runner, runner); +*/ + + WorldSpawnScriptRunner = G_Spawn(); + WorldSpawnScriptRunner->classname = "script_runner"; + ED_CallSpawn(WorldSpawnScriptRunner); + } + + //--------------- + + + // help icon for statusbar +// level.pic_health = gi.imageindex ("pics/status/i_health"); + level.alertedStatus = 0; + + //sniper scope images + gi.imageindex ("pics/scope/arrows128_1"); + gi.imageindex ("pics/scope/arrows128_2"); + gi.imageindex ("pics/scope/arrows128_3"); + gi.imageindex ("pics/scope/arrows128_4"); + + + if (!st.gravity) + gi.cvar_set("sv_gravity", "800"); + else + gi.cvar_set("sv_gravity", st.gravity); + +// +// Setup light animation tables. 'a' is total darkness, 'z' is doublebright. +// + + // 0 normal + gi.configstring(CS_LIGHTS+0, "m"); + + // 1 FLICKER (first variety) + gi.configstring(CS_LIGHTS+1, "mmnmmommommnonmmonqnmmo"); + + // 2 SLOW STRONG PULSE + gi.configstring(CS_LIGHTS+2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcb"); + + // 3 CANDLE (first variety) + gi.configstring(CS_LIGHTS+3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg"); + + // 4 FAST STROBE + gi.configstring(CS_LIGHTS+4, "mamamamamama"); + + // 5 GENTLE PULSE 1 + gi.configstring(CS_LIGHTS+5,"jklmnopqrstuvwxyzyxwvutsrqponmlkj"); + + // 6 FLICKER (second variety) + gi.configstring(CS_LIGHTS+6, "nmonqnmomnmomomno"); + + // 7 CANDLE (second variety) + gi.configstring(CS_LIGHTS+7, "mmmaaaabcdefgmmmmaaaammmaamm"); + + // 8 CANDLE (third variety) + gi.configstring(CS_LIGHTS+8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa"); + + // 9 SLOW STROBE (fourth variety) + gi.configstring(CS_LIGHTS+9, "aaaaaaaazzzzzzzz"); + + // 10 FLUORESCENT FLICKER + gi.configstring(CS_LIGHTS+10, "mmamammmmammamamaaamammma"); + + // 11 SLOW PULSE NOT FADE TO BLACK + gi.configstring(CS_LIGHTS+11, "abcdefghijklmnopqrrqponmlkjihgfedcba"); + + // 12 FAST PULSE FOR JEREMY + gi.configstring(CS_LIGHTS+12, "mkigegik"); + + // 13 Special sky lightning on client - don't muck with this, por favor... + gi.configstring(CS_LIGHTS+CL_WORLDSKYLIGHT, "ex"); + + + // styles 32-62 are assigned by the light program for switchable lights + + // 63 testing + gi.configstring(CS_LIGHTS+63, "a"); + + gi.cvar_set("timescale", "1.0");//in case a script was interrupted... + + // precache stuff - this should probably be handled better... + PrecacheSurfaceTypes(); + + PrecacheSpawningEnemies(ent); +} + +void SetSkyColor(float red, float blue, float green) +{ + gi.configstring (CS_SKYCOLOR, va("%f %f %f", red, green, blue) ); +} + +void InitEntMetalSoundCaching(void) +{ + int i = 0; + + entSoundsToCache[CLSFX_LAND_METAL] = 1; + + for (i = CLSFX_METALSTRIKE1; i <= CLSFX_METALSTRIKE3; i++) + { + entSoundsToCache[i] = 1; + } + + for (i = 0; i < NUM_FOOTSTEPS_PER_GROUP; i++) + { + entSoundsToCache[CLSFX_FOOTSTEP_METAL + i] = 1; + } +} + +void InitEntSoundCaching(void) +{ + int i = 0, stepsnd = -1; + byte List[256], count; + + memset(entSoundsToCache, 0, sizeof(byte)*NUM_CLSFX); + + // world geometry sounds (ricochets, wood splintering, etc) + count = gi.SurfaceTypeList(List, sizeof(List)); + + while(count) + { + count--; + + // references to CLSFX_METALIMPACT have been commented out because we're forcing Metal sound Precaching anyway :/ + switch(List[count]) + { + case SURF_DEFAULT: + //CLSFX_FOOTSTEP_STONE, CLSFX_STONEIMPACT, CLSFX_LAND_STONE, + stepsnd = CLSFX_FOOTSTEP_STONE; + entSoundsToCache[CLSFX_STONEIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_STONE] = 1; + break; + case SURF_METAL: + //CLSFX_FOOTSTEP_METAL, CLSFX_METALIMPACT, CLSFX_LAND_METAL, + stepsnd = CLSFX_FOOTSTEP_METAL; +// entSoundsToCache[CLSFX_METALIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_METAL] = 1; + break; + case SURF_SAND_YELLOW: + //CLSFX_FOOTSTEP_SAND, CLSFX_SANDIMPACT, CLSFX_LAND_SAND, + stepsnd = CLSFX_FOOTSTEP_SAND; + entSoundsToCache[CLSFX_SANDIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_SAND] = 1; + break; + case SURF_SAND_WHITE: + //CLSFX_FOOTSTEP_SAND, CLSFX_SANDIMPACT, CLSFX_LAND_SAND, + stepsnd = CLSFX_FOOTSTEP_SAND; + entSoundsToCache[CLSFX_SANDIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_SAND] = 1; + break; + case SURF_SAND_LBROWN: + //CLSFX_FOOTSTEP_SAND, CLSFX_SANDIMPACT, CLSFX_LAND_SAND, + stepsnd = CLSFX_FOOTSTEP_SAND; + entSoundsToCache[CLSFX_SANDIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_SAND] = 1; + break; + case SURF_SAND_DBROWN: + //CLSFX_FOOTSTEP_SAND, CLSFX_SANDIMPACT, CLSFX_LAND_SAND, + stepsnd = CLSFX_FOOTSTEP_SAND; + entSoundsToCache[CLSFX_SANDIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_SAND] = 1; + break; + case SURF_GRAVEL_GREY: + //CLSFX_FOOTSTEP_GRAVEL, CLSFX_GRAVELIMPACT, CLSFX_LAND_GRAVEL + stepsnd = CLSFX_FOOTSTEP_GRAVEL; + entSoundsToCache[CLSFX_GRAVELIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_GRAVEL] = 1; + break; + case SURF_GRAVEL_DBROWN: + //CLSFX_FOOTSTEP_GRAVEL, CLSFX_GRAVELIMPACT, CLSFX_LAND_GRAVEL + stepsnd = CLSFX_FOOTSTEP_GRAVEL; + entSoundsToCache[CLSFX_GRAVELIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_GRAVEL] = 1; + break; + case SURF_GRAVEL_LBROWN: + //CLSFX_FOOTSTEP_GRAVEL, CLSFX_GRAVELIMPACT, CLSFX_LAND_GRAVEL + stepsnd = CLSFX_FOOTSTEP_GRAVEL; + entSoundsToCache[CLSFX_GRAVELIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_GRAVEL] = 1; + break; + case SURF_SNOW: + //CLSFX_FOOTSTEP_SNOW, CLSFX_SNOWIMPACT, CLSFX_LAND_SNOW, + stepsnd = CLSFX_FOOTSTEP_SNOW; + entSoundsToCache[CLSFX_SNOWIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_SNOW] = 1; + break; + case SURF_LIQUID_BLUE: + //CLSFX_FOOTSTEP_WATER, CLSFX_WATERIMPACT, CLSFX_LAND_WATER, + stepsnd = CLSFX_FOOTSTEP_WATER; + entSoundsToCache[CLSFX_WATERIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_WATER] = 1; + break; + case SURF_LIQUID_GREEN: + //CLSFX_FOOTSTEP_WATER, CLSFX_WATERIMPACT, CLSFX_LAND_WATER, + stepsnd = CLSFX_FOOTSTEP_WATER; + entSoundsToCache[CLSFX_WATERIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_WATER] = 1; + break; + case SURF_LIQUID_ORANGE: + //CLSFX_FOOTSTEP_WATER, CLSFX_WATERIMPACT, CLSFX_LAND_WATER, + stepsnd = CLSFX_FOOTSTEP_WATER; + entSoundsToCache[CLSFX_WATERIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_WATER] = 1; + break; + case SURF_LIQUID_BROWN: + //CLSFX_FOOTSTEP_WATER, CLSFX_WATERIMPACT, CLSFX_LAND_WATER, + stepsnd = CLSFX_FOOTSTEP_WATER; + entSoundsToCache[CLSFX_WATERIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_WATER] = 1; + break; + case SURF_WOOD_LBROWN: + //CLSFX_FOOTSTEP_WOOD, CLSFX_WOODIMPACT, CLSFX_LAND_WOOD, + stepsnd = CLSFX_FOOTSTEP_WOOD; + entSoundsToCache[CLSFX_WOODIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_WOOD] = 1; + break; + case SURF_WOOD_DBROWN: + //CLSFX_FOOTSTEP_WOOD, CLSFX_WOODIMPACT, CLSFX_LAND_WOOD, + stepsnd = CLSFX_FOOTSTEP_WOOD; + entSoundsToCache[CLSFX_WOODIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_WOOD] = 1; + break; + case SURF_WOOD_LGREY: + //CLSFX_FOOTSTEP_WOOD, CLSFX_WOODIMPACT, CLSFX_LAND_WOOD, + stepsnd = CLSFX_FOOTSTEP_WOOD; + entSoundsToCache[CLSFX_WOODIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_WOOD] = 1; + break; + case SURF_STONE_LGREY: + //CLSFX_FOOTSTEP_STONE, CLSFX_STONEIMPACT, CLSFX_LAND_STONE, + stepsnd = CLSFX_FOOTSTEP_STONE; + entSoundsToCache[CLSFX_STONEIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_STONE] = 1; + break; + case SURF_STONE_DGREY: + //CLSFX_FOOTSTEP_STONE, CLSFX_STONEIMPACT, CLSFX_LAND_STONE, + stepsnd = CLSFX_FOOTSTEP_STONE; + entSoundsToCache[CLSFX_STONEIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_STONE] = 1; + break; + case SURF_STONE_LBROWN: + //CLSFX_FOOTSTEP_STONE, CLSFX_STONEIMPACT, CLSFX_LAND_STONE, + stepsnd = CLSFX_FOOTSTEP_STONE; + entSoundsToCache[CLSFX_STONEIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_STONE] = 1; + break; + case SURF_STONE_DBROWN: + //CLSFX_FOOTSTEP_STONE, CLSFX_STONEIMPACT, CLSFX_LAND_STONE, + stepsnd = CLSFX_FOOTSTEP_STONE; + entSoundsToCache[CLSFX_STONEIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_STONE] = 1; + break; + case SURF_STONE_WHITE: + //CLSFX_FOOTSTEP_STONE, CLSFX_STONEIMPACT, CLSFX_LAND_STONE, + stepsnd = CLSFX_FOOTSTEP_STONE; + entSoundsToCache[CLSFX_STONEIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_STONE] = 1; + break; + case SURF_STONE_GREEN: + //CLSFX_FOOTSTEP_STONE, CLSFX_STONEIMPACT, CLSFX_LAND_STONE, + stepsnd = CLSFX_FOOTSTEP_STONE; + entSoundsToCache[CLSFX_STONEIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_STONE] = 1; + break; + case SURF_STONE_RED: + //CLSFX_FOOTSTEP_STONE, CLSFX_STONEIMPACT, CLSFX_LAND_STONE, + stepsnd = CLSFX_FOOTSTEP_STONE; + entSoundsToCache[CLSFX_STONEIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_STONE] = 1; + break; + case SURF_STONE_BLACK: + //CLSFX_FOOTSTEP_STONE, CLSFX_STONEIMPACT, CLSFX_LAND_STONE, + stepsnd = CLSFX_FOOTSTEP_STONE; + entSoundsToCache[CLSFX_STONEIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_STONE] = 1; + break; + case SURF_GRASS_GREEN: + //CLSFX_FOOTSTEP_GRASS, CLSFX_GRASSIMPACT, CLSFX_LAND_GRASS, + stepsnd = CLSFX_FOOTSTEP_GRASS; + entSoundsToCache[CLSFX_GRASSIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_GRASS] = 1; + break; + case SURF_GRASS_BROWN: + //CLSFX_FOOTSTEP_GRASS, CLSFX_GRASSIMPACT, CLSFX_LAND_GRASS, + stepsnd = CLSFX_FOOTSTEP_GRASS; + entSoundsToCache[CLSFX_GRASSIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_GRASS] = 1; + break; + case SURF_LIQUID_RED: + //CLSFX_FOOTSTEP_WATER, CLSFX_WATERIMPACT, CLSFX_LAND_WATER, + stepsnd = CLSFX_FOOTSTEP_WATER; + entSoundsToCache[CLSFX_WATERIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_WATER] = 1; + break; + case SURF_METAL_STEAM: + //CLSFX_FOOTSTEP_METAL, CLSFX_METALIMPACT, CLSFX_LAND_METAL, + stepsnd = CLSFX_FOOTSTEP_METAL; +// entSoundsToCache[CLSFX_METALIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_METAL] = 1; + break; + case SURF_METAL_WATERJET: + //CLSFX_FOOTSTEP_METAL, CLSFX_METALIMPACT, CLSFX_LAND_METAL, + stepsnd = CLSFX_FOOTSTEP_METAL; +// entSoundsToCache[CLSFX_METALIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_METAL] = 1; + break; + case SURF_METAL_OILSPURT: + //CLSFX_FOOTSTEP_METAL, CLSFX_METALIMPACT, CLSFX_LAND_METAL, + stepsnd = CLSFX_FOOTSTEP_METAL; +// entSoundsToCache[CLSFX_METALIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_METAL] = 1; + break; + case SURF_METAL_CHEMSPURT: + //CLSFX_FOOTSTEP_METAL, CLSFX_METALIMPACT, CLSFX_LAND_METAL, + stepsnd = CLSFX_FOOTSTEP_METAL; +// entSoundsToCache[CLSFX_METALIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_METAL] = 1; + break; + case SURF_METAL_COMPUTERS: + //CLSFX_FOOTSTEP_METAL, CLSFX_METALIMPACT, CLSFX_LAND_METAL, + //CLSFX_SPARK1, CLSFX_EXP_SMALL + stepsnd = CLSFX_FOOTSTEP_METAL; +// entSoundsToCache[CLSFX_METALIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_METAL] = 1; + // if damaged, the surface requires certain sounds... + entSoundsToCache[CLSFX_SPARK1] = 1; + entSoundsToCache[CLSFX_SPARK2] = 1; + entSoundsToCache[CLSFX_EXP_SMALL] = 1; + break; + case SURF_SNOW_LBROWN: + //CLSFX_FOOTSTEP_STONE, CLSFX_STONEIMPACT, CLSFX_LAND_STONE, + stepsnd = CLSFX_FOOTSTEP_STONE; + entSoundsToCache[CLSFX_STONEIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_STONE] = 1; + break; + case SURF_SNOW_GREY: + //CLSFX_FOOTSTEP_STONE, CLSFX_STONEIMPACT, CLSFX_LAND_STONE, + stepsnd = CLSFX_FOOTSTEP_STONE; + entSoundsToCache[CLSFX_STONEIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_STONE] = 1; + break; + case SURF_BLOOD: + //CLSFX_STONEIMPACT, CLSFX_STONEIMPACT, CLSFX_LAND_STONE, + stepsnd = CLSFX_FOOTSTEP_STONE; + entSoundsToCache[CLSFX_STONEIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_STONE] = 1; + break; + case SURF_LIQUID_BLACK: + //CLSFX_FOOTSTEP_WATER, CLSFX_WATERIMPACT, CLSFX_LAND_WATER, + stepsnd = CLSFX_FOOTSTEP_WATER; + entSoundsToCache[CLSFX_WATERIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_WATER] = 1; + break; + case SURF_GLASS: + //CLSFX_FOOTSTEP_METAL, CLSFX_METALIMPACT, CLSFX_LAND_METAL, + //CLSFX_BREAK_GLASSSMALL + stepsnd = CLSFX_FOOTSTEP_METAL; +// entSoundsToCache[CLSFX_METALIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_METAL] = 1; + // if damaged, the surface requires a certain sound... + entSoundsToCache[CLSFX_BREAK_GLASSSMALL] = 1; + break; + case SURF_GLASS_COMPUTER: + //CLSFX_FOOTSTEP_METAL, CLSFX_METALIMPACT, CLSFX_LAND_METAL, + //CLSFX_BREAK_GLASSSMALL + stepsnd = CLSFX_FOOTSTEP_METAL; +// entSoundsToCache[CLSFX_METALIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_METAL] = 1; + // if damaged, the surface requires a certain sound... + entSoundsToCache[CLSFX_BREAK_GLASSSMALL] = 1; + break; + case SURF_SODAMACHINE: + //CLSFX_FOOTSTEP_METAL, CLSFX_METALIMPACT, CLSFX_LAND_METAL, + stepsnd = CLSFX_FOOTSTEP_METAL; +// entSoundsToCache[CLSFX_METALIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_METAL] = 1; + break; + case SURF_PAPERWALL: + //CLSFX_FOOTSTEP_WOOD, CLSFX_WOODIMPACT, CLSFX_LAND_WOOD, + stepsnd = CLSFX_FOOTSTEP_WOOD; + entSoundsToCache[CLSFX_WOODIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_WOOD] = 1; + break; + case SURF_NEWSPAPER_DAMAGE: + //CLSFX_FOOTSTEP_METAL, CLSFX_METALIMPACT, CLSFX_LAND_METAL, + stepsnd = CLSFX_FOOTSTEP_METAL; +// entSoundsToCache[CLSFX_METALIMPACT] = 1; + entSoundsToCache[CLSFX_LAND_METAL] = 1; + break; + } + + if (stepsnd >= 0) + { + for (i = 0; i < NUM_FOOTSTEPS_PER_GROUP; i++) + { + entSoundsToCache[stepsnd + i] = 1; + } + } + stepsnd = -1; + } + + entSoundsToCache[CLSFX_SPARK1] = 1; + entSoundsToCache[CLSFX_SPARK2] = 1; + +} + +void InitEntDebrisCaching(void) +{ + int i = 0; + + memset(entDebrisToCache, 'n', sizeof(char)*NUM_CLGHL); + + // there may be some debris models that we'll always want to cache, but I + //can't think of 'em right now + +} + +void CacheEntDebrisAndSounds(edict_t *ent) +{ + // cache the debris that this ent turns into when it breaks/dies/explodes + switch(ent->material) + { + case MAT_BRICK_BROWN: + case MAT_BRICK_LBROWN: + case MAT_BRICK_LGREY: + case MAT_BRICK_DGREY: + case MAT_BRICK_RED: + entDebrisToCache[CLGHL_CHUNKBRICK] = DEBRIS_YES; + break; + + case MAT_GLASS: + entDebrisToCache[CLGHL_CHUNKGLASSSM] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKGLASSMED] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKGLASSLRG] = DEBRIS_YES; + break; + + case MAT_METAL_LGREY: + case MAT_METAL_DGREY: + case MAT_METAL_RUSTY: + case MAT_METAL_SHINY: + entDebrisToCache[CLGHL_CHUNKMETALSM] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKMETALMED] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKMETALLRG] = DEBRIS_YES; + break; + + case MAT_ROCK_BROWN: + case MAT_ROCK_LBROWN: + case MAT_ROCK_DBROWN: + case MAT_ROCK_LGREY: + case MAT_ROCK_DGREY: + case MAT_ROCK_FLESH: + entDebrisToCache[CLGHL_CHUNKROCKSM] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKROCKMED] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKROCKLRG] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKROCKTINY] = DEBRIS_YES; + break; + + case MAT_WOOD_LBROWN: + case MAT_WOOD_DBROWN: + case MAT_WOOD_DGREY: + case MAT_WOOD_LGREY: + entDebrisToCache[CLGHL_CHUNKWOODSM] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKWOODMED] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKWOODLRG] = DEBRIS_YES; + break; + + case MAT_WALL_BLACK: + case MAT_WALL_BROWN: + case MAT_WALL_DARKBROWN: + case MAT_WALL_LIGHTBROWN: + case MAT_WALL_GREY: + case MAT_WALL_DARKGREY: + case MAT_WALL_LIGHTGREY: + case MAT_WALL_GREEN: + case MAT_WALL_ORANGE: + case MAT_WALL_RED: + case MAT_WALL_WHITE: + case MAT_WALL_STRAW: + entDebrisToCache[CLGHL_CHUNKWALLSM] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKWALLMED] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKWALLLRG] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKWALLTINY] = DEBRIS_YES; + break; + case MAT_ROCK_SNOW: + entDebrisToCache[CLGHL_CHUNKROCKSM] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKROCKMED] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKROCKLRG] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKROCKTINY] = DEBRIS_YES; + break; + } + +// kef -- have to keep some of the precaching stuff out for now cuz it crashes final/nyc with +// an index overflow in the soundlist +#if 1 + // some surfaceTypes have various client fx associated with their death. these + //fx tend to generate a lot of chunks. also, the sounds needed by the client function + //HandleDebris() are precached here. + switch(ent->surfaceType) + { + case SURF_DEFAULT: + // MakeDefaultWallEffect -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_WOOD_LBROWN: + // MakeDefaultWallEffect -- no chunks + entSoundsToCache[CLSFX_BREAK_WOOD] = 1; + break; + case SURF_WOOD_DBROWN: + // MakeDefaultWallEffect -- no chunks + entSoundsToCache[CLSFX_BREAK_WOOD] = 1; + break; + case SURF_WOOD_LGREY: + // MakeDefaultWallEffect -- no chunks + entSoundsToCache[CLSFX_BREAK_WOOD] = 1; + break; + case SURF_STONE_LGREY: + // MakeDefaultWallEffect -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_STONE_DGREY: + // MakeDefaultWallEffect -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_STONE_LBROWN: + // MakeDefaultWallEffect -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_STONE_DBROWN: + // MakeDefaultWallEffect -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_STONE_WHITE: + // MakeDefaultWallEffect -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_STONE_GREEN: + // MakeDefaultWallEffect -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_STONE_RED: + // MakeDefaultWallEffect -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_STONE_BLACK: + // MakeDefaultWallEffect -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_GRASS_GREEN: + // MakeDefaultWallEffect -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_GRASS_BROWN: + // MakeDefaultWallEffect -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_METAL: + // MakeSparks -- no chunks + entSoundsToCache[CLSFX_BREAK_METAL] = 1; + break; + case SURF_SAND_YELLOW: + // MakeSplatter -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_SAND_WHITE: + // MakeSplatter -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_SAND_LBROWN: + // MakeSplatter -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_SAND_DBROWN: + // MakeSplatter -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_GRAVEL_GREY: + // MakeSplatter -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_GRAVEL_DBROWN: + // MakeSplatter -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_GRAVEL_LBROWN: + // MakeSplatter -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_SNOW: + // MakeSplatter -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_SNOW_LBROWN: + // MakeSplatter -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_SNOW_GREY: + // MakeSplatter -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_LIQUID_BLUE: + // MakeSplatWater -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_LIQUID_GREEN: + // MakeSplatWater -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_LIQUID_ORANGE: + // MakeSplatWater -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_LIQUID_BROWN: + // MakeSplatWater -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_LIQUID_RED: + // MakeSplatWater -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_LIQUID_BLACK: + // MakeSplatWater -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_METAL_STEAM: + // MakeShortSteam -- no chunks + entSoundsToCache[CLSFX_BREAK_METAL] = 1; + break; + case SURF_METAL_WATERJET: + // MakeLiquidSpurt -- no chunks + entSoundsToCache[CLSFX_BREAK_METAL] = 1; + break; + case SURF_METAL_OILSPURT: + // MakeLiquidSpurt -- no chunks + entSoundsToCache[CLSFX_BREAK_METAL] = 1; + break; + case SURF_METAL_CHEMSPURT: + // MakeLiquidSpurt -- no chunks + entSoundsToCache[CLSFX_BREAK_METAL] = 1; + break; + case SURF_METAL_COMPUTERS: + // MakeComputerDamage -- calls ThrowChunks with surfaceType SURF_STONE_DGREY + //CLSFX_SPARK1, CLSFX_EXP_SMALL + entDebrisToCache[CLGHL_CHUNKWALLSM] = DEBRIS_YES; + entSoundsToCache[CLSFX_BREAK_METAL] = 1; + entSoundsToCache[CLSFX_SPARK1] = 1; + entSoundsToCache[CLSFX_EXP_SMALL] = 1; + break; + case SURF_BLOOD: + // MakeBloodSplatter -- no chunks + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + case SURF_GLASS: + // MakeSplatGlass -- throws some glass chunks + //CLSFX_BREAK_GLASSSMALL,CLSFX_BREAK_GLASSMED,CLSFX_BREAK_GLASSBIG + entDebrisToCache[CLGHL_CHUNKGLASSSM] = DEBRIS_YES; + entSoundsToCache[CLSFX_BREAK_GLASSSMALL] = 1; + entSoundsToCache[CLSFX_BREAK_GLASSMED] = 1; + entSoundsToCache[CLSFX_BREAK_GLASSBIG] = 1; + break; + case SURF_GLASS_COMPUTER: + // MakeComputerGlassDamage + //CLSFX_BREAK_GLASSSMALL,CLSFX_BREAK_GLASSMED,CLSFX_BREAK_GLASSBIG + entDebrisToCache[CLGHL_CHUNKGLASSSM] = DEBRIS_YES; + entDebrisToCache[CLGHL_CHUNKWALLSM] = DEBRIS_YES; + entSoundsToCache[CLSFX_BREAK_GLASSSMALL] = 1; + entSoundsToCache[CLSFX_BREAK_GLASSMED] = 1; + entSoundsToCache[CLSFX_BREAK_GLASSBIG] = 1; + break; + case SURF_SODAMACHINE: + // MakeSodaDamage -- you guessed it...spews cans + entDebrisToCache[CLGHL_CAN] = DEBRIS_YES; + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + + case SURF_PAPERWALL: + // MakePaperWallDamage + //CLSFX_WOODIMPACT + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + + case SURF_NEWSPAPER_DAMAGE: + // MakeNewspaperDamage + entDebrisToCache[CLGHL_PAPER] = DEBRIS_YES; + entSoundsToCache[CLSFX_BREAK_STONE] = 1; + break; + } +#endif +} + +void CacheAllDebris(void) +{ + + if (NUM_CLGHL > MAX_QPATH) // Too many different types of debris + { + Com_Printf("ERROR: NUM_CLGHL > MAX_QPATH!\n"); + return; + } + + gi.configstring(CS_DEBRISPRECACHE,entDebrisToCache); // Set up string to send across +} + +void CacheAllSounds(void) +{ + int i = 0; + + // never know when we'll have water available, so make sure the 'I entered water' sound + //is always precached + entSoundsToCache[CLSFX_LAND_WATER] = 1; + for (i = 0; i < NUM_CLSFX; i++) + { + if (entSoundsToCache[i]) + { + gi.soundindex(cl_fxs[i].filename); + } + } +} + +// this is less than cool +void CacheAllWallEffects(void) +{ + gi.effectindex("environ/waterspurt"); + gi.effectindex("environ/oilspurt"); + gi.effectindex("environ/chemspurt"); + gi.effectindex("environ/metal_computer"); + gi.effectindex("environ/glass_computer"); + gi.effectindex("environ/metal_steam"); + gi.effectindex("environ/bulletsplash"); + gi.effectindex("environ/splatgreen"); + gi.effectindex("environ/splatorange"); + gi.effectindex("environ/splatred"); + gi.effectindex("environ/splatbrown"); + gi.effectindex("environ/splatblack"); +} + +char *weaponList[] = +{ "nothing", + "knife", + "pistol2", + "pistol1", + "mpistol", + "assault", + "sniper", + "slugger", + "shotgun", + "machinegun", + "rocket", + "mpg", + "flamegun", + 0 +}; + +void CalculatePlayerEntryWeapons(int *weaponsAvailable) +{ + char *curSpot; + char *curTokSpot; + char token[256]; + char temp[256]; + int value; + + //assume curSpot is somewhere decent + + curSpot = gi.cvar_info(CVAR_WEAPON | CVAR_ITEM | CVAR_AMMO); + + if(!curSpot || (!strcmp(curSpot, ""))) + { // if there is nothing, plug in the defaults + return; + } + + while(*curSpot) + { + curTokSpot = token; + + if(*curSpot == '\\') + { + curSpot++; + } + + while(*curSpot && (*curSpot != '\\')) + { + *curTokSpot++ = *curSpot++; + } + *curTokSpot = 0; + + assert(*curSpot); + + if(*curSpot == '\\') + { + curSpot++; + } + + curTokSpot = temp; + while((*curSpot) && (*curSpot != '\\')) + { + *curTokSpot++ = *curSpot++; + } + *curTokSpot = 0; + value = atoi(temp); + + // okay, we have the two tokens... let's do stuff with them now... + + + char *testString; + int curCheck; + int found = 0; + + + + // look for weapons + + curCheck = 0; + + do + { + testString = weaponList[curCheck]; + + if(!stricmp(token, testString)) + { // hey, I have one of these! Cool! + if(value) + {// add the weapon + *weaponsAvailable |= (1<style); + gi.WritePosition (ent->s.origin); + gi.multicast (ent->s.origin, MULTICAST_PVS); +} + +void SP_target_temp_entity (edict_t *ent) +{ + ent->use = Use_Target_Tent; +} + + +//========================================================== + +//========================================================== + +/*QUAKED target_speaker (1 0 0) (-8 -8 -8) (8 8 8) looped-on looped-off reliable +"noise" wav file to play +"attenuation" +-1 = none, send to whole level +1 = normal fighting sounds +2 = idle sound level +3 = ambient sound level +"volume" 0.0 to 1.0 + +Normal sounds play each time the target is used. The reliable flag can be set for crucial voiceovers. + +Looped sounds are always atten 3 / vol 1, and the use function toggles it on/off. +Multiple identical looping sounds will just increase volume without any speed cost. +*/ +void Use_Target_Speaker (edict_t *ent, edict_t *other, edict_t *activator) +{ + int chan; + + if (ent->spawnflags & 3) + { // looping sound toggles + if (ent->s.sound) + ent->s.sound = 0; // turn it off + else + { + ent->s.sound = ent->noise_index; // start it + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + } + else + { // normal sound + if (ent->spawnflags & 4) + chan = CHAN_VOICE|CHAN_RELIABLE; + else + chan = CHAN_VOICE; + // use a positioned_sound, because this entity won't normally be + // sent to any clients because it is invisible + gi.positioned_sound (ent->s.origin, ent, chan, ent->noise_index, ent->volume, ent->attenuation, 0); + } +} + +void SP_target_speaker (edict_t *ent) +{ + char buffer[MAX_QPATH]; + + if(!st.noise) + { + gi.dprintf("target_speaker with no noise set at %s\n", vtos(ent->s.origin)); + return; + } + if (!strstr (st.noise, ".wav")) + Com_sprintf (buffer, sizeof(buffer), "%s.wav", st.noise); + else + strncpy (buffer, st.noise, sizeof(buffer)); + ent->noise_index = gi.soundindex (buffer); + + if (!ent->volume) + ent->volume = 1.0; + + if (!ent->attenuation) + ent->attenuation = 1.0; + else if (ent->attenuation == -1) // use -1 so 0 defaults to 1 + ent->attenuation = 0; + + // check for prestarted looping sound + if (ent->spawnflags & 1) + { + ent->s.sound = ent->noise_index; + ent->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + + ent->use = Use_Target_Speaker; + + // must link the entity so we get areas and clusters so + // the server can determine who to send updates to + gi.linkentity (ent); +} + + +//========================================================== + +void Use_Target_Help (edict_t *ent, edict_t *other, edict_t *activator) +{ + if (ent->spawnflags & 1) + strncpy (game.helpmessage1, ent->message, sizeof(game.helpmessage2)-1); + else + strncpy (game.helpmessage2, ent->message, sizeof(game.helpmessage1)-1); + + game.helpchanged++; +} + +/*QUAKED target_help (1 0 1) (-16 -16 -24) (16 16 24) help1 +When fired, the "message" key becomes the current personal computer string, and the message light will be set on all clients status bars. +*/ +void SP_target_help(edict_t *ent) +{ + if (dm->isDM()) + { // auto-remove for deathmatch + G_FreeEdict (ent); + return; + } + + if (!ent->message) + { + gi.dprintf ("%s with no message at %s\n", ent->classname, vtos(ent->s.origin)); + G_FreeEdict (ent); + return; + } + ent->use = Use_Target_Help; +} + +//========================================================== + +/*QUAKED target_secret (1 0 1) (-8 -8 -8) (8 8 8) +Counts a secret found. +These are single use targets. +*/ +void use_target_secret (edict_t *ent, edict_t *other, edict_t *activator) +{ + gi.sound (ent, CHAN_VOICE, ent->noise_index, .6, ATTN_NORM, 0); + + level.found_secrets++; + + G_UseTargets (ent, activator); + G_FreeEdict (ent); +} + +void SP_target_secret (edict_t *ent) +{ + if (dm->isDM()) + { // auto-remove for deathmatch + G_FreeEdict (ent); + return; + } + + ent->use = use_target_secret; + if (!st.noise) + st.noise = "misc/secret.wav"; + ent->noise_index = gi.soundindex (st.noise); + ent->svflags = SVF_NOCLIENT; + level.total_secrets++; + +/* (appears to be left over from Q2 - slc) + // map bug hack + if (!stricmp(level.mapname, "mine3") && ent->s.origin[0] == 280 && ent->s.origin[1] == -2048 && ent->s.origin[2] == -624) + ent->message = "You have found a secret area."; +*/ +} + +//========================================================== + +/*QUAKED target_goal (1 0 1) (-8 -8 -8) (8 8 8) +Counts a goal completed. +These are single use targets. +*/ +void use_target_goal (edict_t *ent, edict_t *other, edict_t *activator) +{ + gi.sound (ent, CHAN_VOICE, ent->noise_index, .6, ATTN_NORM, 0); + + level.found_goals++; + + if (level.found_goals == level.total_goals) + gi.configstring (CS_CDTRACK, "0"); + + G_UseTargets (ent, activator); + G_FreeEdict (ent); +} + +void SP_target_goal (edict_t *ent) +{ + if (dm->isDM()) + { // auto-remove for deathmatch + G_FreeEdict (ent); + return; + } + + ent->use = use_target_goal; + if (!st.noise) + st.noise = "misc/secret.wav"; + ent->noise_index = gi.soundindex (st.noise); + ent->svflags = SVF_NOCLIENT; + level.total_goals++; +} + +//========================================================== + + +/*QUAKED target_explosion (1 0 0) (-8 -8 -8) (8 8 8) +Spawns an explosion temporary entity when used. + +"delay" wait this long before going off +"dmg" how much radius damage should be done, defaults to 0 +*/ +void target_explosion_explode (edict_t *self) +{ + float save; + + T_RadiusDamage (self, self->activator, self->dmg, NULL, self->dmg+40, MOD_EXPLOSIVE); + gmonster.RadiusDeafen(self, self->dmg, self->dmg); + + save = self->delay; + self->delay = 0; + G_UseTargets (self, self->activator); + self->delay = save; +} + +void use_target_explosion (edict_t *self, edict_t *other, edict_t *activator) +{ + self->activator = activator; + + if (!self->delay) + { + target_explosion_explode (self); + return; + } + + self->think = target_explosion_explode; + self->nextthink = level.time + self->delay; +} + +void SP_target_explosion (edict_t *ent) +{ + ent->use = use_target_explosion; + ent->svflags = SVF_NOCLIENT; +} + + +//========================================================== + +/*QUAKED target_changelevel (1 0 0) (-8 -8 -8) (8 8 8) +Changes level to "map" when fired +*/ + +void use_target_changelevel (edict_t *self, edict_t *other, edict_t *activator) +{ + if (level.intermissiontime) + { + // Already activated. + + return; + } + + if (!dm->isDM()) + { + if (g_edicts[1].health <= 0) + return; + } + + // Do a ton of damage to other if trying to exit in a dm game + if (dm->isDM() && other != world) + { + T_Damage (other, self, self, vec3_origin, other->s.origin, other->s.origin, 10 * other->max_health, 1000, DAMAGE_NO_PROTECTION, MOD_EXIT); + return; + } + + // If multiplayer, let everyone know who hit the exit. + + if (dm->isDM()) + { + if (activator && activator->client) + gi.bprintf (PRINT_HIGH, "%s exited the level.\n", activator->client->pers.netname); + } + + // If going to a new unit, clear cross triggers. + + if (strstr(self->map, "*")) + game.serverflags &= ~(SFL_CROSS_TRIGGER_MASK); + + if(!dm->isDM()) + { // let the server know what kind of goodies we're coming out of here with - yeah! + sharedEdict_t sh; + + sh.inv = (inven_c *)g_edicts[1].client->inv; + + if (sh.inv) + { + sh.edict = &g_edicts[1]; + sh.inv->setOwner(&sh); + sh.inv->buildInvForMenu(1, g_edicts[1].health); + } + + //also add in our stats + game.guysKilled += level.guysKilled; + game.friendliesKilled += level.friendliesKilled; + + game.throatShots += level.throatShots; + game.nutShots += level.nutShots; + game.headShots += level.headShots; + game.gibs += level.gibs; + + game.savesUsed += level.savesUsed; + game.cashEarned += level.cashEarned; + game.playedTime += level.time - level.startTime; + + } + + if(pe) + { // toss the old shite, as it were - not doing this is a good way to get a huge crash + pe->UncacheViewWeaponModels(); + } + + + BeginIntermission (self); +} + +void SP_target_changelevel (edict_t *ent) +{ + if (!ent->map) + { + gi.dprintf("target_changelevel with no map at %s\n", vtos(ent->s.origin)); + G_FreeEdict (ent); + + return; + } + + ent->use = use_target_changelevel; + ent->svflags = SVF_NOCLIENT; +} + +//========================================================== + +/*QUAKED target_splash (1 0 0) (-8 -8 -8) (8 8 8) +Creates a particle splash effect when used. + +Set "sounds" to one of the following: + 1) sparks + 2) blue water + 3) brown water + 4) slime + 5) lava + 6) blood + +"count" how many pixels in the splash +"dmg" if set, does a radius damage at this location when it splashes + useful for lava/sparks +*/ + +void use_target_splash (edict_t *self, edict_t *other, edict_t *activator) +{ + if (self->dmg) + { + T_RadiusDamage (self, activator, self->dmg, NULL, 5, MOD_SPLASH, 0); + gmonster.RadiusDeafen(self, self->dmg, self->dmg); + } +} + +void SP_target_splash (edict_t *self) +{ + self->use = use_target_splash; + G_SetMovedir (self->s.angles, self->movedir); + + if (!self->count) + self->count = 32; + + self->svflags = SVF_NOCLIENT; +} + + +//========================================================== + +/*QUAKED target_spawner (1 0 0) (-8 -8 -8) (8 8 8) +Set target to the type of entity you want spawned. +Useful for spawning monsters and gibs in the factory levels. + +For monsters: + Set direction to the facing you want it to have. + +For gibs: + Set direction if you want it moving and + speed how fast it should be moving otherwise it + will just be dropped +*/ +void ED_CallSpawn (edict_t *ent); + +void use_target_spawner (edict_t *self, edict_t *other, edict_t *activator) +{ + edict_t *ent; + + ent = G_Spawn(); + ent->classname = self->target; + VectorCopy (self->s.origin, ent->s.origin); + VectorCopy (self->s.angles, ent->s.angles); + ED_CallSpawn (ent); + gi.unlinkentity (ent); + KillBox (ent); + gi.linkentity (ent); + if (self->speed) + VectorCopy (self->movedir, ent->velocity); +} + +void SP_target_spawner (edict_t *self) +{ + self->use = use_target_spawner; + self->svflags = SVF_NOCLIENT; + if (self->speed) + { + G_SetMovedir (self->s.angles, self->movedir); + VectorScale (self->movedir, self->speed, self->movedir); + } +} + +//========================================================== + +/*QUAKED target_crosslevel_trigger (.5 .5 .5) (-8 -8 -8) (8 8 8) trigger1 trigger2 trigger3 trigger4 trigger5 trigger6 trigger7 trigger8 +Once this trigger is touched/used, any trigger_crosslevel_target with the same trigger number is automatically used when a level is started within the same unit. It is OK to check multiple triggers. Message, delay, target, and killtarget also work. +*/ +void trigger_crosslevel_trigger_use (edict_t *self, edict_t *other, edict_t *activator) +{ + game.serverflags |= self->spawnflags; + G_FreeEdict (self); +} + +void SP_target_crosslevel_trigger (edict_t *self) +{ + self->svflags = SVF_NOCLIENT; + self->use = trigger_crosslevel_trigger_use; +} + +/*QUAKED target_crosslevel_target (.5 .5 .5) (-8 -8 -8) (8 8 8) trigger1 trigger2 trigger3 trigger4 trigger5 trigger6 trigger7 trigger8 +Triggered by a trigger_crosslevel elsewhere within a unit. If multiple triggers are checked, all must be true. Delay, target and +killtarget also work. + +"delay" delay before using targets if the trigger has been activated (default 1) +*/ +void target_crosslevel_target_think (edict_t *self) +{ + if (self->spawnflags == (game.serverflags & SFL_CROSS_TRIGGER_MASK & self->spawnflags)) + { + G_UseTargets (self, self); + G_FreeEdict (self); + } +} + +void SP_target_crosslevel_target (edict_t *self) +{ + if (! self->delay) + self->delay = 1; + self->svflags = SVF_NOCLIENT; + + self->think = target_crosslevel_target_think; + self->nextthink = level.time + self->delay; +} + +//========================================================== + +/*QUAKED target_laser (0 .5 .8) (-8 -8 -8) (8 8 8) START_ON RED GREEN BLUE YELLOW ORANGE FAT +When triggered, fires a laser. You can either set a target +or a direction. +*/ + +void target_laser_think (edict_t *self) +{ + edict_t *ignore; + vec3_t start; + vec3_t end; + trace_t tr; + vec3_t point; + vec3_t last_movedir; + int count; + + if (self->spawnflags & 0x80000000) + count = 8; + else + count = 4; + + if (self->enemy) + { + VectorCopy (self->movedir, last_movedir); + VectorMA (self->enemy->absmin, 0.5, self->enemy->size, point); + VectorSubtract (point, self->s.origin, self->movedir); + VectorNormalize (self->movedir); + if (!VectorCompare(self->movedir, last_movedir)) + self->spawnflags |= 0x80000000; + } + + ignore = self; + VectorCopy (self->s.origin, start); + VectorMA (start, 2048, self->movedir, end); + while(1) + { + gi.trace (start, NULL, NULL, end, ignore, CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_DEADMONSTER, &tr); + + if (!tr.ent) + break; + + // hurt it if we can + if ((tr.ent->takedamage) && !(tr.ent->flags & FL_IMMUNE_LASER)) + T_Damage (tr.ent, self, self->activator, self->movedir, tr.endpos, start, self->dmg, 1, DAMAGE_ENERGY, MOD_TARGET_LASER); + + // if we hit something that's not a monster or player or is immune to lasers, we're done + if (!(tr.ent->svflags & SVF_MONSTER) && (!tr.ent->client)) + { + if (self->spawnflags & 0x80000000) + { + self->spawnflags &= ~0x80000000; + } + break; + } + + ignore = tr.ent; + VectorCopy (tr.endpos, start); + } + + self->nextthink = level.time + FRAMETIME; +} + +void target_laser_on (edict_t *self) +{ + if (!self->activator) + self->activator = self; + self->spawnflags |= 0x80000001; + self->svflags &= ~SVF_NOCLIENT; + target_laser_think (self); +} + +void target_laser_off (edict_t *self) +{ + self->spawnflags &= ~1; + self->svflags |= SVF_NOCLIENT; + self->nextthink = 0; +} + +void target_laser_use (edict_t *self, edict_t *other, edict_t *activator) +{ + self->activator = activator; + if (self->spawnflags & 1) + target_laser_off (self); + else + target_laser_on (self); +} + +void target_laser_start (edict_t *self) +{ + edict_t *ent; + + self->movetype = MOVETYPE_NONE; + self->solid = SOLID_NOT; + self->s.renderfx |= RF_TRANSLUCENT; + self->s.modelindex = 1; // must be non-zero + + // set the beam diameter + if (self->spawnflags & 64) + self->s.frame = 16; + else + self->s.frame = 4; + + // set the color + if (self->spawnflags & 2) + self->s.skinnum = 0xf2f2f0f0; + else if (self->spawnflags & 4) + self->s.skinnum = 0xd0d1d2d3; + else if (self->spawnflags & 8) + self->s.skinnum = 0xf3f3f1f1; + else if (self->spawnflags & 16) + self->s.skinnum = 0xdcdddedf; + else if (self->spawnflags & 32) + self->s.skinnum = 0xe0e1e2e3; + + if (!self->enemy) + { + if (self->target) + { + ent = G_Find (NULL, FOFS(targetname), self->target); + if (!ent) + gi.dprintf ("%s at %s: %s is a bad target\n", self->classname, vtos(self->s.origin), self->target); + self->enemy = ent; + } + else + { + G_SetMovedir (self->s.angles, self->movedir); + } + } + self->use = target_laser_use; + self->think = target_laser_think; + + if (!self->dmg) + self->dmg = 1; + + VectorSet (self->mins, -8, -8, -8); + VectorSet (self->maxs, 8, 8, 8); + gi.linkentity (self); + + if (self->spawnflags & 1) + target_laser_on (self); + else + target_laser_off (self); +} + +void SP_target_laser (edict_t *self) +{ + // let everything else get spawned before we start firing + self->think = target_laser_start; + self->nextthink = level.time + 1; +} + +//========================================================== + +/*QUAKED target_lightramp (0 .5 .8) (-8 -8 -8) (8 8 8) TOGGLE +speed How many seconds the ramping will take +message two letters; starting lightlevel and ending lightlevel +*/ + +void target_lightramp_think (edict_t *self) +{ + char style[2]; + + style[0] = 'a' + self->movedir[0] + (level.time - self->timestamp) / FRAMETIME * self->movedir[2]; + style[1] = 0; + gi.configstring (CS_LIGHTS+self->enemy->style, style); + + if ((level.time - self->timestamp) < self->speed) + { + self->nextthink = level.time + FRAMETIME; + } + else if (self->spawnflags & 1) + { + char temp; + + temp = self->movedir[0]; + self->movedir[0] = self->movedir[1]; + self->movedir[1] = temp; + self->movedir[2] *= -1; + } +} + +void target_lightramp_use (edict_t *self, edict_t *other, edict_t *activator) +{ + if (!self->enemy) + { + edict_t *e; + + // check all the targets + e = NULL; + while (1) + { + e = G_Find (e, FOFS(targetname), self->target); + if (!e) + break; + if (strcmp(e->classname, "light") != 0) + { + gi.dprintf("%s at %s ", self->classname, vtos(self->s.origin)); + gi.dprintf("target %s (%s at %s) is not a light\n", self->target, e->classname, vtos(e->s.origin)); + } + else + { + self->enemy = e; + } + } + + if (!self->enemy) + { + gi.dprintf("%s target %s not found at %s\n", self->classname, self->target, vtos(self->s.origin)); + G_FreeEdict (self); + return; + } + } + + self->timestamp = level.time; + target_lightramp_think (self); +} + +void SP_target_lightramp (edict_t *self) +{ + if (!self->message || strlen(self->message) != 2 || self->message[0] < 'a' || self->message[0] > 'z' || self->message[1] < 'a' || self->message[1] > 'z' || self->message[0] == self->message[1]) + { + gi.dprintf("target_lightramp has bad ramp (%s) at %s\n", self->message, vtos(self->s.origin)); + G_FreeEdict (self); + return; + } + + if (dm->isDM()) + { + G_FreeEdict (self); + return; + } + + if (!self->target) + { + gi.dprintf("%s with no target at %s\n", self->classname, vtos(self->s.origin)); + G_FreeEdict (self); + return; + } + + self->svflags |= SVF_NOCLIENT; + self->use = target_lightramp_use; + self->think = target_lightramp_think; + + self->movedir[0] = self->message[0] - 'a'; + self->movedir[1] = self->message[1] - 'a'; + self->movedir[2] = (self->movedir[1] - self->movedir[0]) / (self->speed / FRAMETIME); +} + +//========================================================== + +/*QUAKED target_earthquake (1 0 0) (-8 -8 -8) (8 8 8) +When triggered, this initiates a level-wide earthquake. +All players and monsters are affected. +"speed" severity of the quake (default:200) +"count" duration of the quake (default:5) +*/ + +void target_earthquake_think (edict_t *self) +{ + int i; + edict_t *e; + + if (self->last_move_time < level.time) + { + gi.positioned_sound (self->s.origin, self, CHAN_AUTO, self->noise_index, 1.0, ATTN_NONE, 0); + self->last_move_time = level.time + 0.5; + } + + for (i=1, e=g_edicts+i; i < globals.num_edicts; i++,e++) + { + if (!e->inuse) + continue; + if (!e->client) + continue; + if (!e->groundentity) + continue; + + e->groundentity = NULL; + e->velocity[0] += gi.flrand(-150.0F, 150.0F); + e->velocity[1] += gi.flrand(-150.0F, 150.0F); + e->velocity[2] = self->speed * (100.0 / e->mass); + } + + if (level.time < self->timestamp) + self->nextthink = level.time + FRAMETIME; +} + +void target_earthquake_use (edict_t *self, edict_t *other, edict_t *activator) +{ + self->timestamp = level.time + self->count; + self->nextthink = level.time + FRAMETIME; + self->activator = activator; + self->last_move_time = 0; +} + +void SP_target_earthquake (edict_t *self) +{ + if (!self->targetname) + gi.dprintf("untargeted %s at %s\n", self->classname, vtos(self->s.origin)); + + if (!self->count) + self->count = 5; + + if (!self->speed) + self->speed = 200; + + self->svflags |= SVF_NOCLIENT; + self->think = target_earthquake_think; + self->use = target_earthquake_use; + + self->noise_index = gi.soundindex ("world/quake.wav"); +} diff --git a/Source/Game/gamecpp/g_tokyo.cpp b/Source/Game/gamecpp/g_tokyo.cpp new file mode 100644 index 0000000..2dfb607 --- /dev/null +++ b/Source/Game/gamecpp/g_tokyo.cpp @@ -0,0 +1,286 @@ +/****************************************************** + * Objects for Tokyo * + ******************************************************/ + +#include "g_local.h" +#include "g_obj.h" + +#define HELIFLAG_STARTOFF (1<<2) + + +#define HLTH_TOKYO_BOWL 100 +#define HLTH_TOKYO_BUDDHA 2000 +#define HLTH_TOKYO_FAN 50 +#define HLTH_TOKYO_GONG 1000 +#define HLTH_TOKYO_GYM_EQUIP1 2000 +#define HLTH_TOKYO_GYM_EQUIP2 2000 +#define HLTH_TOKYO_PLANT_BONSAI 100 +#define HLTH_TOKYO_SAMURAI_SUIT 1000 +#define HLTH_TOKYO_SAMURAI_SUIT_SM 1000 +#define HLTH_TOKYO_SHOE 100 +#define HLTH_TOKYO_STONE_LIGHT 1000 + + +// misc_tokyo +void SP_misc_tokyo_bowl (edict_t *ent); +void SP_misc_tokyo_buddha (edict_t *ent); +void SP_misc_tokyo_fan (edict_t *ent); +void SP_misc_tokyo_gong (edict_t *ent); +void SP_misc_tokyo_gym_equipment1 (edict_t *ent); +void SP_misc_tokyo_gym_equipment2 (edict_t *ent); +void SP_misc_tokyo_plant_bonsai (edict_t *ent); +void SP_misc_tokyo_samurai_suit (edict_t *ent); +void SP_misc_tokyo_samurai_suit_small (edict_t *ent); +void SP_misc_tokyo_shoe (edict_t *ent); +void SP_misc_tokyo_stone_light (edict_t *ent); +void SP_misc_exploding_heli(edict_t *ent); + +spawn_t tokyoSpawns[] = +{ + // misc_tokyo + {"misc_tokyo_bowl", SP_misc_tokyo_bowl}, + {"misc_tokyo_buddha", SP_misc_tokyo_buddha}, + {"misc_tokyo_fan", SP_misc_tokyo_fan}, + {"misc_tokyo_gong", SP_misc_tokyo_gong}, + {"misc_tokyo_gym_equipment1", SP_misc_tokyo_gym_equipment1}, + {"misc_tokyo_gym_equipment2", SP_misc_tokyo_gym_equipment2}, + {"misc_tokyo_plant_bonsai", SP_misc_tokyo_plant_bonsai}, + {"misc_tokyo_samurai_suit", SP_misc_tokyo_samurai_suit}, + {"misc_tokyo_samurai_suit_small", SP_misc_tokyo_samurai_suit_small}, + {"misc_tokyo_shoe", SP_misc_tokyo_shoe}, + {"misc_tokyo_stone_light", SP_misc_tokyo_stone_light}, + {"misc_exploding_heli", SP_misc_exploding_heli}, + + {NULL, NULL}, +}; + + + +typedef enum +{ + OBJ_BOWL = 0, + OBJ_BUDDHA, + OBJ_FAN, + OBJ_GONG, + OBJ_GYM_EQUIP1, + OBJ_GYM_EQUIP2, + OBJ_PLANT_BONSAI, + OBJ_SAMURAI_SUIT, + OBJ_SAMURAI_SUIT_SM, + OBJ_SHOE, + OBJ_STONE_LIGHT, + OBJ_EXPLODING_HELI, + MAX_OBJS +}; + + +modelSpawnData_t tokyoModelData[MD_TOKYO_SIZE] = +{ +// dir file surfaceType material health solid material file cnt scale +"objects/tokyo/bowl", "bowl", SURF_WOOD_LBROWN, MAT_WOOD_LBROWN, HLTH_TOKYO_BOWL, SOLID_BBOX, NULL, 6, DEBRIS_SM, NULL, // OBJ_BOWL +"objects/tokyo/buddha", "buddha", SURF_METAL, MAT_METAL_SHINY, HLTH_TOKYO_BUDDHA, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_BUDDHA +"objects/tokyo/fan", "fan", SURF_WOOD_LBROWN, SURF_WOOD_LBROWN, HLTH_TOKYO_FAN, SOLID_BBOX, NULL, 0, DEBRIS_TINY, NULL, // OBJ_FAN +"objects/tokyo/gong", "gong", SURF_METAL, MAT_METAL_SHINY, HLTH_TOKYO_GONG, SOLID_BBOX, NULL, 6, 0.5, NULL, // OBJ_GONG +"objects/tokyo/gym_equip1", "equip1", SURF_METAL, MAT_METAL_SHINY, HLTH_TOKYO_GYM_EQUIP1, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_GYM_EQUIP1 +"objects/tokyo/gym_equip2", "equip2", SURF_METAL, MAT_METAL_SHINY, HLTH_TOKYO_GYM_EQUIP2, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_GYM_EQUIP2 +"objects/tokyo/plant_bonsai", "bonsai", SURF_WOOD_LBROWN, MAT_WOOD_LBROWN, HLTH_TOKYO_PLANT_BONSAI, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_PLANT_BONSAI +"objects/tokyo/samurai_suit_small", "samurai_sm", SURF_METAL, MAT_METAL_RUSTY, HLTH_TOKYO_SAMURAI_SUIT, SOLID_BBOX, NULL, 0, DEBRIS_MED, NULL, // OBJ_SAMURIA_SUIT +"objects/tokyo/samurai_suit_small", "samurai_sm", SURF_METAL, MAT_METAL_RUSTY, HLTH_TOKYO_SAMURAI_SUIT_SM, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_SAMURIA_SUIT_SM +"objects/tokyo/shoe", "shoe", SURF_WOOD_LBROWN, MAT_WOOD_LBROWN, HLTH_TOKYO_SHOE, SOLID_BBOX, NULL, 4, DEBRIS_SM, NULL, // OBJ_SHOE +"objects/tokyo/stone_light", "light", SURF_STONE_LGREY, MAT_ROCK_LGREY, HLTH_TOKYO_STONE_LIGHT, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_STONE_LIGHT +"objects/generic/stunt_chopper", "stunt_chopper", SURF_METAL, MAT_METAL_SHINY, 1, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_EXPLODING_HELI +}; + + +/*QUAKED misc_tokyo_bowl (1 .5 0) (-5 -5 -1) (5 5 2) INVULNERABLE NOPUSH x x x x FLUFF +A small bowl +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_tokyo_bowl (edict_t *ent) +{ + VectorSet (ent->mins, -5, -5,-1); + VectorSet (ent->maxs, 5, 5, 2); + + SimpleModelInit2(ent,&tokyoModelData[OBJ_BOWL],NULL,NULL); +} + +/*QUAK-ED misc_tokyo_buddha (1 .5 0) (-14 -24 -32) (19 24 32) INVULNERABLE NOPUSH x x x x FLUFF +A chest high statue of buddha +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_tokyo_buddha (edict_t *ent) +{ + VectorSet (ent->mins, -14, -24, -32); + VectorSet (ent->maxs, 19, 24, 32); + + SimpleModelInit2(ent,&tokyoModelData[OBJ_BUDDHA],NULL,NULL); +} + +/*QUAKED misc_tokyo_fan (1 .5 0) (0 -9 -4) (1 10 6) INVULNERABLE NOPUSH x x x x FLUFF +A small hand held fan +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_tokyo_fan (edict_t *ent) +{ + VectorSet (ent->mins, -14, -24, -32); + VectorSet (ent->maxs, 19, 24, 32); + + SimpleModelInit2(ent,&tokyoModelData[OBJ_FAN],NULL,NULL); + +} + +void gong_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + + SimpleModelSetSequence(ent,tokyoModelData[OBJ_GONG].file,SMSEQ_HOLD); +} + +/*QUAKED misc_tokyo_gong (1 .5 0) (-2 -29 -33) (6 29 35) INVULNERABLE NOPUSH x x x x FLUFF +Large gold gong. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- swings when shot +*/ +void SP_misc_tokyo_gong (edict_t *ent) +{ + + VectorSet (ent->mins, -3, -29, -34); + VectorSet (ent->maxs, 3, 29, 34); + + SimpleModelInit2(ent,&tokyoModelData[OBJ_GONG],NULL,NULL); + ent->ghoulInst->Pause(level.time); + + ent->pain = gong_pain; + +} + +/*QUAK-ED misc_tokyo_gym_equipment1 (1 .5 0) (-36 -13 -27) (36 14 27) INVULNERABLE NOPUSH x x x x FLUFF +A treadmill. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_tokyo_gym_equipment1 (edict_t *ent) +{ + VectorSet (ent->mins, -36, -13, -27); + VectorSet (ent->maxs, 36, 14, 27); + + SimpleModelInit2(ent,&tokyoModelData[OBJ_GYM_EQUIP1],NULL,NULL); +} + +/*QUAK-ED misc_tokyo_gym_equipment2 (1 .5 0) (-48 -28 -34) (58 33 35) INVULNERABLE NOPUSH x x x x FLUFF +A weight machine. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_tokyo_gym_equipment2 (edict_t *ent) +{ + VectorSet (ent->mins, -48, -28, -34); + VectorSet (ent->maxs, 58, 33, 35); + + SimpleModelInit2(ent,&tokyoModelData[OBJ_GYM_EQUIP2],NULL,NULL); +} + +/*QUAKED misc_tokyo_plant_bonsai (1 .5 0) (-5 -10 -8) (5 10 8) INVULNERABLE NOPUSH x x x x FLUFF +A small bonsai tree +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_tokyo_plant_bonsai (edict_t *ent) +{ + VectorSet (ent->mins, -5, -10, -8); + VectorSet (ent->maxs, 5, 10, 8); + + SimpleModelInit2(ent,&tokyoModelData[OBJ_PLANT_BONSAI],NULL,NULL); +} + +/*QUAKED misc_tokyo_samurai_suit (1 .5 0) (-6 -18 -37) (9 16 37) INVULNERABLE NOPUSH x x x x FLUFF +A samurai suit of armor, man sized. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_tokyo_samurai_suit (edict_t *ent) +{ + VectorSet (ent->mins, -6, -18, -37); + VectorSet (ent->maxs, 9, 16, 37); + + SimpleModelInit2(ent,&tokyoModelData[OBJ_SAMURAI_SUIT],NULL,NULL); + SimpleModelScale(ent,1.1f); +} + +/*QUAKED misc_tokyo_samurai_suit_small (1 .5 0) (-3 -8 -17) (4 7 17) INVULNERABLE NOPUSH x x x x FLUFF +A doll-sized samurai suit of armor. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_tokyo_samurai_suit_small (edict_t *ent) +{ + VectorSet (ent->mins, -3, -8, -17); + VectorSet (ent->maxs, 4, 7, 17); + + SimpleModelInit2(ent,&tokyoModelData[OBJ_SAMURAI_SUIT_SM],NULL,NULL); + SimpleModelScale(ent,0.50f); +} + +/*QUAKED misc_tokyo_shoe (1 .5 0) (-6 -3 -2) (6 3 2) INVULNERABLE NOPUSH x x x x FLUFF +a brown sandal +------ SPAWNFLAGS ------- +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_tokyo_shoe (edict_t *ent) +{ + VectorSet (ent->mins, -6, -3, -2); + VectorSet (ent->maxs, 6, 3, 2); + + SimpleModelInit2(ent,&tokyoModelData[OBJ_SHOE],NULL,NULL); +} + +/*QUAKED misc_tokyo_stone_light (1 .5 0) (-15 -13 -14) (15 13 14) INVULNERABLE NOPUSH x x x x FLUFF +A waist high column of stone +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_tokyo_stone_light (edict_t *ent) +{ + VectorSet (ent->mins, -15, -13, 14); + VectorSet (ent->maxs, 15, 13, 14); + + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&tokyoModelData[OBJ_STONE_LIGHT],NULL,NULL); +} + +/*QUAKED misc_exploding_heli (1 .5 0) (-280 -280 -50) (280 280 70) INVULNERABLE NOPUSH START_OFF +NOT TO BE USED!!!!!!!! +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +*/ +void SP_misc_exploding_heli (edict_t *ent) +{ +} diff --git a/Source/Game/gamecpp/g_trigger.cpp b/Source/Game/gamecpp/g_trigger.cpp new file mode 100644 index 0000000..de7bd79 --- /dev/null +++ b/Source/Game/gamecpp/g_trigger.cpp @@ -0,0 +1,1192 @@ +#include "g_local.h" +#include "fields.h" +#include "strip.h" +#include "..\strings\singleplr.h" + +extern float s_levelStatusBegin; // declared in g_cmds.cpp + +// trigger_... +void SP_trigger_activate (edict_t *ent); +void SP_trigger_always (edict_t *ent); +void SP_trigger_countdown (edict_t *ent); +void SP_trigger_counter (edict_t *ent); +void SP_trigger_elevator (edict_t *ent); +void SP_trigger_gravity (edict_t *ent); +void SP_trigger_hurt (edict_t *ent); +void SP_trigger_key (edict_t *ent); +void SP_trigger_monsterjump (edict_t *ent); +void SP_trigger_multiple (edict_t *ent); +void SP_trigger_once (edict_t *ent); +void SP_trigger_push (edict_t *ent); +void SP_trigger_relay (edict_t *ent); +void SP_trigger_useable (edict_t *ent); +void SP_trigger_heal (edict_t *ent); +void SP_trigger_movedown (edict_t *ent); +void SP_trigger_keep_using (edict_t *ent); +void SP_trigger_safezone (edict_t *ent); +void SP_trigger_sound (edict_t *ent); +void SP_trigger_objectives (edict_t *ent); + +spawn_t triggerSpawns[] = +{ + // trigger.. + {"trigger_activate", SP_trigger_activate}, + {"trigger_always", SP_trigger_always}, + {"trigger_countdown", SP_trigger_countdown}, + {"trigger_counter", SP_trigger_counter}, + {"trigger_elevator", SP_trigger_elevator}, + {"trigger_gravity", SP_trigger_gravity}, + {"trigger_hurt", SP_trigger_hurt}, + {"trigger_key", SP_trigger_key}, + {"trigger_monsterjump", SP_trigger_monsterjump}, + {"trigger_multiple", SP_trigger_multiple}, + {"trigger_once", SP_trigger_once}, + {"trigger_push", SP_trigger_push}, + {"trigger_relay", SP_trigger_relay}, + {"trigger_useable", SP_trigger_useable}, + {"trigger_heal", SP_trigger_heal}, + {"trigger_movedown", SP_trigger_movedown}, + {"trigger_keep_using", SP_trigger_keep_using}, + {"trigger_safezone", SP_trigger_safezone}, + {"trigger_sound", SP_trigger_sound}, + {"trigger_objectives", SP_trigger_objectives}, + {NULL, NULL}, +}; + +#define TRIG_START_OFF 1 + +#define TRIG_MULT_TRIGGERED 4 +#define TRIG_MULT_USEKEY 8 + +#define TRIG_CNTDWN_ANYUSE 2 +#define TRIG_CNTDWN_REUSEABLE 4 + +#define TRIG_HURT_IGNORE_ARMOR 64 + +#define TRIGGER_HEAL_DEFAULT 25 + +void InitTrigger (edict_t *self) +{ + if (!VectorCompare (self->s.angles, vec3_origin)) + G_SetMovedir (self->s.angles, self->movedir); + + self->solid = SOLID_TRIGGER; + self->movetype = MOVETYPE_NONE; + gi.setmodel (self, self->model); + self->svflags = SVF_NOCLIENT; +} + + +// the wait time has passed, so set back up for another activation +void multi_wait (edict_t *ent) +{ + ent->nextthink = 0; +} + + +// the trigger was just activated +// ent->activator should be set to the activator so it can be held through a delay +// so wait for the delay time before firing +void multi_trigger (edict_t *ent) +{ + if (ent->nextthink) + return; // already been triggered + + G_UseTargets (ent, ent->activator); + + if (ent->wait > 0) + { + ent->think = multi_wait; + ent->nextthink = level.time + ent->wait; + } + else + { // we can't just remove (self) here, because this is a touch function + // called while looping through area links... + ent->touch = NULL; + ent->nextthink = level.time + FRAMETIME; + ent->think = G_FreeEdict; + } +} + +void Use_Multi (edict_t *ent, edict_t *other, edict_t *activator) +{ + ent->last_move_time = level.time; + ent->activator = activator; + multi_trigger (ent); +} + +void Touch_Multi (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if(other->client || (other->flags & FL_LEAN_PLAYER)) + { + if (self->spawnflags & 2) + return; + } + else if (other->svflags & SVF_MONSTER) + { + if (!(self->spawnflags & 1)) + return; + } + else + return; + + if (!VectorCompare(self->movedir, vec3_origin)) + { + vec3_t forward; + + AngleVectors(other->s.angles, forward, NULL, NULL); + if (DotProduct(forward, self->movedir) < 0) + return; + } + + self->activator = other; + multi_trigger (self); +} + +/*QUAKED trigger_multiple (.5 .5 .5) ? MONSTER NOT_PLAYER TRIGGERED USEKEY +Variable sized repeatable trigger. Must be targeted at one or more entities. +If "delay" is set, the trigger waits some time after activating before firing. +"wait" : Seconds between triggerings. (.2 default) +sounds +1)the "talk" beep +2)the "talk" beep +3)the "talk" beep + +set "message" to text string +"sp_message" is for a string package ID (numerical) + +If they are NOT targeted, then there are three flags you need to be aware of: + +The MONSTER flag must be set if you want a monster to be able to activate the trigger by walking into it. + +The NO_PLAYER flag must be set if you do NOT want the player to be able to activate the + trigger by walking into it. + +The TRIGGERED flag allows a trigger to be disabled until something else activates it. +After this activation, the trigger will be activated when something (depending on how +the first two flags are set) steps into it. Since this flag requires the trigger to +have a targetname, this flag will obviously override the "I can't be activated by anything +but my targeter" condition once it has been triggered. +*/ +void trigger_enable (edict_t *self, edict_t *other, edict_t *activator) +{ + self->solid = SOLID_TRIGGER; + self->use = Use_Multi; + if (!(self->spawnflags & TRIG_MULT_USEKEY)) + { + self->touch = Touch_Multi; + } + gi.linkentity (self); +} + +void SP_trigger_multiple (edict_t *ent) +{ +/* if (ent->sounds == 1) + ent->noise_index = gi.soundindex ("misc/secret.wav"); + else */ + if ((ent->sounds >= 1) && (ent->sounds <= 3)) + ent->noise_index = gi.soundindex ("misc/talk.wav"); +/* else if (ent->sounds == 3) + ent->noise_index = gi.soundindex ("misc/trigger1.wav"); +*/ + if (!ent->wait) + ent->wait = 0.2; + +// Commented out because the only time it's going to have a targetname is if it's TRIG_MULT_TRIGGERED +// if (!ent->targetname) +// { + if(ent->spawnflags & TRIG_MULT_USEKEY) + { + ent->plUse = Use_Multi; + ent->last_move_time = level.time - 10.0;//safe for monsters to use me... + ent->touch = NULL; + } + else + { + ent->touch = Touch_Multi; + } +// } + + ent->movetype = MOVETYPE_NONE; + ent->svflags |= SVF_NOCLIENT; + + + if (ent->spawnflags & TRIG_MULT_TRIGGERED) + { + ent->solid = SOLID_NOT; + ent->use = trigger_enable; + } + else + { + ent->solid = SOLID_TRIGGER; + ent->use = Use_Multi; + } + + if (!VectorCompare(ent->s.angles, vec3_origin)) + G_SetMovedir (ent->s.angles, ent->movedir); + + gi.setmodel (ent, ent->model); + gi.linkentity (ent); +} + + +/*QUAKED trigger_once (.5 .5 .5) ? MONSTER NOT_PLAYER TRIGGERED USEKEY +Triggers once, then removes itself. +You must set the key "target" to the name of another object in the level that has a matching "targetname". + +The MONSTER flag must be set if you want a monster to be able to activate the trigger by walking into it. + +The NO_PLAYER flag must be set if you do NOT want the player to be able to activate the + trigger by walking into it. + +If TRIGGERED, this trigger must be triggered before it is live. + +sounds + 1) secret + 2) beep beep + 3) large switch + 4) + +"message" string to be displayed when triggered +"sp_message" is for a string package ID (numerical) +*/ + +void SP_trigger_once(edict_t *ent) +{ + // make old maps work because I messed up on flag assignments here + // triggered was on bit 1 when it should have been on bit 4 +/* if (ent->spawnflags & 1) + { + vec3_t v; + + VectorMA (ent->mins, 0.5, ent->size, v); + ent->spawnflags &= ~1; + ent->spawnflags |= 4; + gi.dprintf("fixed TRIGGERED flag on %s at %s\n", ent->classname, vtos(v)); + } +*/ + ent->wait = -1; + SP_trigger_multiple (ent); +} + +/*QUAKED trigger_relay (.5 .5 .5) (-8 -8 -8) (8 8 8) +This fixed size trigger cannot be touched, it can only be fired by other events. +*/ +void trigger_relay_use (edict_t *self, edict_t *other, edict_t *activator) +{ + G_UseTargets (self, activator); +} + +void SP_trigger_relay (edict_t *self) +{ + self->use = trigger_relay_use; +} + + +/* +============================================================================== + +trigger_key + +============================================================================== +*/ + +/*QUAKED trigger_key (.5 .5 .5) (-8 -8 -8) (8 8 8) +A relay trigger that only fires it's targets if player has the proper key. +Use "item" to specify the required key, for example "key_data_cd" +*/ +void trigger_key_use (edict_t *self, edict_t *other, edict_t *activator) +{ +// int index; + +// if (!self->item) + return; +/* if (!activator->client) + return; + + index = ITEM_INDEX(self->item); + if (!activator->client->pers.inventory[index]) + { + if (level.time < self->touch_debounce_time) + return; + self->touch_debounce_time = level.time + 5.0; + gi.centerprintf (activator, "You need the %s", self->item->pickup_name); + gi.sound (activator, CHAN_AUTO, gi.soundindex ("misc/keytry.wav"), .6, ATTN_NORM, 0); + return; + } + + gi.sound (activator, CHAN_AUTO, gi.soundindex ("misc/keyuse.wav"), .6, ATTN_NORM, 0); + if (coop->value) + { + int player; + edict_t *ent; + + for (player = 1; player <= game.maxclients; player++) + { + ent = &g_edicts[player]; + if (!ent->inuse) + continue; + if (!ent->client) + continue; + ent->client->pers.inventory[index] = 0; + } + } + else + { + activator->client->pers.inventory[index]--; + } + + G_UseTargets (self, activator); + + self->use = NULL;*/ +} + +void SP_trigger_key (edict_t *self) +{ + if (!st.item) + { + gi.dprintf("no key item for trigger_key at %s\n", vtos(self->s.origin)); + return; + } +// self->item = FindItemByClassname (st.item); + +/* if (!self->item) + { + gi.dprintf("item %s not found for trigger_key at %s\n", st.item, vtos(self->s.origin)); + return; + }*/ + + if (!self->target) + { + gi.dprintf("%s at %s has no target\n", self->classname, vtos(self->s.origin)); + return; + } + + gi.soundindex ("misc/keytry.wav"); + gi.soundindex ("misc/keyuse.wav"); + + self->use = trigger_key_use; +} + + +/* +============================================================================== + +trigger_counter + +============================================================================== +*/ + +/*QUAKED trigger_counter (.5 .5 .5) ? nomessage +Acts as an intermediary for an action that takes multiple inputs. + +If nomessage is not set, t will print "1 more.. " etc when triggered and "sequence complete" when finished. + +After the counter has been triggered "count" times (default 2), it will fire all of it's targets and remove itself. +*/ + +void trigger_counter_use(edict_t *self, edict_t *other, edict_t *activator) +{ + if (self->count == 0) + return; + + self->count--; + + if (self->count) + { + if (! (self->spawnflags & 1)) + { + gi.SP_Print(activator, SINGLEPLR_MORE_TO_GO, self->count); + gi.sound (activator, CHAN_AUTO, gi.soundindex ("Misc/Talk.wav"), .6, ATTN_NORM, 0); + } + return; + } + + if (! (self->spawnflags & 1)) + { + gi.SP_Print(activator, SINGLEPLR_SEQUENCE_COMPLETED); + gi.sound (activator, CHAN_AUTO, gi.soundindex ("Misc/Talk.wav"), .6, ATTN_NORM, 0); + } + self->activator = activator; + multi_trigger (self); +} + +void SP_trigger_counter (edict_t *self) +{ + self->wait = -1; + if (!self->count) + self->count = 2; + + self->use = trigger_counter_use; +} + + +/* +============================================================================== + +trigger_countdown + +============================================================================== +*/ + +void trigger_countdown_use (edict_t *self, edict_t *other, edict_t *activator); + +void trigger_countdown_remove (edict_t *self) +{ + G_UseTargets(self, self->activator); + G_FreeEdict (self); +} + +void trigger_countdown_think(edict_t *self) +{ + // send ( start time + countdown length - current time ) + float fTimeRemaining = self->elasticity + self->count - level.time; + + gi.WriteByte(svc_countdown); + if (fTimeRemaining <= 0.0f) + { // finished counting down + fTimeRemaining = 0.0f; + gi.WriteLong(0); // if I need to, maybe send a byte code after this zero to indicate + //which message to display. right now it just says, "mission failed" + gi.multicast(self->s.origin, MULTICAST_ALL); + + if (!(self->spawnflags & TRIG_CNTDWN_REUSEABLE)) + { + // set a level-wide variable here to let the client know we need to display a message + level.countdownEnded = 1; + trigger_countdown_remove(self); + } + else + { + G_UseTargets(self, self->activator); + trigger_countdown_use(self, self, self); + } + } + else + { // still counting + gi.WriteLong((int)fTimeRemaining); + gi.multicast(self->s.origin, MULTICAST_ALL); + self->nextthink = level.time + 1; + } +} + +void trigger_countdown_use (edict_t *self, edict_t *other, edict_t *activator) +{ + int count = 0; + + if ((other && other->client) || (self->spawnflags & TRIG_CNTDWN_ANYUSE)) + { + if (self->think) + { // if we've already set a think function, that means we're now toggling it off + self->elasticity = 0; + // clean up and remove the trigger + gi.WriteByte(svc_countdown); + gi.WriteLong(0); + gi.multicast(self->s.origin, MULTICAST_ALL); + + if (!(self->spawnflags & TRIG_CNTDWN_REUSEABLE)) + { + self->count = 0; + G_FreeEdict (self); + } + else + { + self->solid = SOLID_TRIGGER; + self->think = NULL; + } + return; + } + self->nextthink = level.time + 1; + // save start time + self->elasticity = level.time; + + count = (int)self->count; + + gi.WriteByte(svc_countdown); + gi.WriteLong(count); + gi.multicast(other->s.origin, MULTICAST_ALL); + + self->activator = activator; + self->solid = SOLID_NOT; + self->think = trigger_countdown_think; + self->nextthink = level.time + 1; + } +} + +void trigger_countdown_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if ((other->client) || (self->spawnflags & TRIG_CNTDWN_ANYUSE)) + { + trigger_countdown_use(self,other,other); + } +} + +/*QUAKED trigger_countdown (.5 .5 .5) ? START_OFF ANY_USE REUSEABLE +Produces a timer on screen that counts backwards. When done it fires all of its targets and removes itself. Is activated by touch or use. +------ KEYS ------ +count - # to start counting backwards from (default 10, can be MUCH bigger than 255) +------ SPAWNFLAGS ------ +START_OFF - trigger is turned off so it can't be touched (use trigger_activate to make 'touchable') +*/ +void SP_trigger_countdown (edict_t *self) +{ + if (!self->count) + self->count = 10; + + InitTrigger (self); + + if (self->spawnflags & TRIG_START_OFF) + { + self->solid = SOLID_NOT; + } + else + { + self->solid = SOLID_TRIGGER; + } + + self->touch = trigger_countdown_touch; + self->use = trigger_countdown_use; + self->think = NULL; // this needs to be NULL until we actually use the trigger + + gi.linkentity (self); + +} +/* +============================================================================== + +trigger_always + +============================================================================== +*/ + +/*QUAKED trigger_always (.5 .5 .5) (-8 -8 -8) (8 8 8) +This trigger will always fire. It is activated by the world. +*/ +void SP_trigger_always (edict_t *ent) +{ + // we must have some delay to make sure our use targets are present + if (ent->delay < 0.2) + ent->delay = 0.2; + G_UseTargets(ent, ent); +} + + +/* +============================================================================== + +trigger_activate + +============================================================================== +*/ +void trigger_activate_use (edict_t *self, edict_t *other, edict_t *activator) +{ + edict_t *t; + + if (self->target) + { + t = NULL; + while ((t = G_Find (t, FOFS(targetname), self->target))) + { + if (t == self) + { + gi.dprintf ("WARNING: Entity used itself.\n"); + } + else + { + if (t->solid == SOLID_NOT) + { + t->solid = SOLID_TRIGGER; + } + else + { + t->solid = SOLID_NOT; + } + + gi.linkentity (t); + + } + + if (!self->inuse) + { + gi.dprintf("entity was removed while using targets\n"); + return; + } + } + } + +} + + +/*QUAKED trigger_activate (.5 .5 .5) ? +Will make a trigger active if it is inactive, or inactive if it's active +*/ +void SP_trigger_activate (edict_t *ent) +{ + InitTrigger (ent); + + ent->use = trigger_activate_use; + + gi.linkentity (ent); +} + +/* +============================================================================== + +trigger_push + +============================================================================== +*/ + +// kef -- defining this is here is _so_ not good. now we've got to define any other flags +//for this trigger right here also, in stark defiance of the ones at the top of this file. +#define PUSH_ONCE 1 +#define PUSH_START_OFF 2 + +void trigger_push_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if (self->spawnflags & PUSH_START_OFF) + { // if this trigger hasn't been 'used' yet, it hasn't been turned on so it shouldn't push + if (0 == (self->count % 2)) + { + return; + } + } + if (strcmp(other->classname, "grenade") == 0) + { + VectorScale (self->movedir, self->speed * 10, other->velocity); + } + else if (other->health > 0) + { + // kef -- I should have my programming license revoked for this but I'm afraid of + //using a more general check for fear of breaking something else + if (other->targetname && (0 == strcmp("sib2_heli",other->targetname))) + { + return; + } + VectorScale (self->movedir, self->speed * 10, other->velocity); + + if (other->client) + { + // don't take falling damage immediately from this + VectorCopy (other->velocity, other->client->oldvelocity); + if (other->fly_sound_debounce_time < level.time) + { + other->fly_sound_debounce_time = level.time + 1.5; + } + } + } + if (self->spawnflags & PUSH_ONCE) + G_FreeEdict (self); +} + +// this should only be called if the trigger has the START_OFF spawnflag +void trigger_push_use(edict_t *self, edict_t *other, edict_t *activator) +{ + self->count++; +} + +/*QUAKED trigger_push (.5 .5 .5) ? PUSH_ONCE START_OFF +Pushes the player +"speed" defaults to 1000 + +PUSH_ONCE you guessed it. only works once. +START_OFF 'use' this trigger to turn on the pushing. 'use' it again to turn it off. rinse. repeat. +*/ +void SP_trigger_push (edict_t *self) +{ + InitTrigger (self); + self->touch = trigger_push_touch; + if (!self->speed) + self->speed = 1000; + + if (self->spawnflags & PUSH_START_OFF) + { + self->use = trigger_push_use; + } + // count is used in conjunction with start_off + self->count = 0; + gi.linkentity (self); +} + + +/* +============================================================================== + +trigger_hurt + +============================================================================== +*/ + +#define PLAYER_ONLY 32 + +/*QUAKED trigger_hurt (.5 .5 .5) ? START_OFF x SILENT NO_PROTECTION SLOW PLAYER_ONLY IGNORE_ARMOR +Any entity that touches this will be hurt. +------ KEYS ------ +"dmg" - points of damage per server frame (default 5) whole numbers only +------ SPAWNFLAGS ------ +START_OFF - won't fire until trigger_activate is used +x - not in use +SILENT - does nothing yet +NO_PROTECTION - *nothing* stops the damage +SLOW - changes the damage rate to once per second +PLAYER_ONLY - trigger will only affect player +IGNORE_ARMOR - this damage ignores armor +*/ +void hurt_use (edict_t *self, edict_t *other, edict_t *activator) +{ + if (self->solid == SOLID_NOT) + self->solid = SOLID_TRIGGER; + else + self->solid = SOLID_NOT; + + gi.linkentity (self); + +// if (!(self->spawnflags & 2)) +// self->use = NULL; +} + + +void hurt_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + int dflags; + + if ((!other->takedamage) || ((self->spawnflags & PLAYER_ONLY) && (!other->client))) + return; + + if (self->spawnflags & 16) + { + if ((self->timestamp > level.time) && ((self->timestamp - level.time) != 1)) + { + // can't hurt stuff this frame + return; + } + else + { + self->timestamp = level.time + 1; + } + } + else + self->timestamp = level.time + FRAMETIME; + + if (!(self->spawnflags & 4)) + { + if ((level.framenum % 10) == 0) + gi.sound (other, CHAN_AUTO, self->noise_index, .6, ATTN_NORM, 0); + } + + if (self->spawnflags & 8) + dflags = DAMAGE_NO_PROTECTION; + else + dflags = 0; + + if (self->spawnflags & TRIG_HURT_IGNORE_ARMOR) + { + dflags |= DAMAGE_NO_ARMOR; + } + T_Damage (other, self, self, vec3_origin, other->s.origin, other->s.origin, self->dmg, self->dmg, dflags, MOD_TRIGGER_HURT); +} + +void SP_trigger_hurt (edict_t *self) +{ + InitTrigger (self); + + self->touch = hurt_touch; + + if (!self->dmg) + self->dmg = 5; + + if (self->spawnflags & TRIG_START_OFF) + self->solid = SOLID_NOT; + else + self->solid = SOLID_TRIGGER; + +// if (self->spawnflags & 2) + self->use = hurt_use; + + gi.linkentity (self); +} + + +/* +============================================================================== + +trigger_gravity + +============================================================================== +*/ + +/*QUAKED trigger_gravity (.5 .5 .5) ? +Changes the touching entites gravity to +the value of "gravity". 1.0 is standard +gravity for the level. +*/ + +void trigger_gravity_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + other->gravity = self->gravity; +} + +void SP_trigger_gravity (edict_t *self) +{ + if (st.gravity == 0) + { + gi.dprintf("trigger_gravity without gravity set at %s\n", vtos(self->s.origin)); + G_FreeEdict (self); + return; + } + + InitTrigger (self); + + self->gravity = atoi(st.gravity); + self->touch = trigger_gravity_touch; +} + + +/* +============================================================================== + +trigger_monsterjump + +============================================================================== +*/ + +/*QUAKED trigger_monsterjump (.5 .5 .5) ? +Walking monsters that touch this will jump in the direction of the trigger's angle +"speed" default to 200, the speed thrown forward +"height" default to 200, the speed thrown upwards +*/ + +void trigger_monsterjump_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if (other->flags & (FL_FLY | FL_SWIM) ) + return; + if (other->svflags & SVF_DEADMONSTER) + return; + if ( !(other->svflags & SVF_MONSTER)) + return; + +// set XY even if not on ground, so the jump will clear lips + other->velocity[0] = self->movedir[0] * self->speed; + other->velocity[1] = self->movedir[1] * self->speed; + + if (!other->groundentity) + return; + + other->groundentity = NULL; + other->velocity[2] = self->movedir[2]; +} + +void SP_trigger_monsterjump (edict_t *self) +{ + if (!self->speed) + self->speed = 200; + if (!st.height) + st.height = 200; + if (self->s.angles[YAW] == 0) + self->s.angles[YAW] = 360; + InitTrigger (self); + self->touch = trigger_monsterjump_touch; + self->movedir[2] = st.height; +} + +/* +============================================================================== + +trigger_useable + +============================================================================== +*/ + +/*QUAKED trigger_useable (.5 .5 .5) ? +A trigger that fires its targets only when the player hits the use key. +----------KEY--------- +targetname -- name of a sound to be played when the trigger is used. make sure +you put the ".wav" at the end +*/ +void useable_use (edict_t *self,edict_t *other,edict_t *activator) +{ + self->last_move_time = level.time; + G_UseTargets (self, activator); + if (self->targetname && strstr(self->targetname,"wav")) + { // play a sound +// gi.sound (self, CHAN_AUTO, gi.soundindex(self->targetname), .6, ATTN_NORM, 0); + gi.sound (self, CHAN_AUTO, gi.soundindex (self->targetname), 1, ATTN_NORM, 0);//FIXME + } +} + +void SP_trigger_useable (edict_t *ent) +{ + InitTrigger (ent); + ent->plUse = useable_use; + ent->last_move_time = level.time - 10.0;//safe for monsters to use me... + gi.linkentity (ent); + // precache any sound we're supposed to play + if (ent->targetname && strstr(ent->targetname,"wav")) + { + gi.soundindex(ent->targetname); + } +} + +/* +============================================================================== + +trigger_heal + +============================================================================== +*/ + +/*QUAKED trigger_heal (.5 .5 .5) ? +A trigger that heals the user only when the player hits the use key. +----------KEY--------- +health -- the number of points to be healed (defaults to 15) +*/ + +qboolean tryToHeal(edict_t *ent,int amountToHeal); + +void trigger_heal_spent (edict_t *self,edict_t *other,edict_t *activator) +{ + gi.sound (self, CHAN_AUTO, gi.soundindex ("misc/hlthstation/empty.wav"), 1, ATTN_NONE, 0); +} + +void trigger_heal_use (edict_t *self,edict_t *other,edict_t *activator) +{ + if (tryToHeal(other, self->health)) + { + gi.sound (self, CHAN_AUTO, gi.soundindex ("misc/hlthstation/health.wav"), 1, ATTN_NONE, 0); + self->plUse = trigger_heal_spent; + G_UseTargets (self, activator); + } + gi.sound (self, CHAN_AUTO, gi.soundindex ("misc/hlthstation/full.wav"), 1, ATTN_NONE, 0); +} + +void SP_trigger_heal (edict_t *ent) +{ + InitTrigger (ent); + ent->plUse = trigger_heal_use; + if (!ent->health) + { + ent->health = TRIGGER_HEAL_DEFAULT; + } + gi.linkentity (ent); + // precache any sound we're supposed to play + gi.soundindex("misc/hlthstation/health.wav"); + gi.soundindex("misc/hlthstation/full.wav"); + gi.soundindex("misc/hlthstation/empty.wav"); + +} + + + +/* +============================================================================== + +trigger_movedown + +============================================================================== +*/ +/*QUAKED trigger_movedown (.5 .5 .5) ? +A trigger that forces thing downward. Meant to be used in conjunction with pushkill brush. +*/ +void trigger_movedown_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + other->velocity[2] = -200; +} + +void SP_trigger_movedown (edict_t *ent) +{ + InitTrigger(ent); + ent->touch = trigger_movedown_touch; + gi.linkentity (ent); +} + +/*QUAKED trigger_keep_using (.5 .5 .5) ? +A trigger that keeps firing as long as the player hits the use key and keeps touching it. +*/ +void keep_using_use(edict_t *self,edict_t *other,edict_t *activator) +{ + if (other->client) + { // the player just used this trigger, so we're cool to start using our target + self->count = 1; + } +} + +void keep_using_touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ // mark the last time the player touched this trigger (providing the player has used us) + if (self->count) + { + self->last_move_time = level.time; + } +} + +void keep_using_think(edict_t *ent) +{ // if we've been used and the player hasn't stopped touching us since then, use our target. + //if it's been more than two frames since our last touch, don't use our target right now. + if ((level.time - ent->last_move_time) > (2 * FRAMETIME)) + { + ent->count = 0; + } + else + { // use our target + G_UseTargets (ent, ent); + } + ent->nextthink = level.time + FRAMETIME; +} + +void SP_trigger_keep_using(edict_t *ent) +{ + InitTrigger (ent); + ent->plUse = keep_using_use; + ent->touch = keep_using_touch; + ent->count = 0; + ent->last_move_time = -10.0; + ent->think = keep_using_think; + ent->nextthink = level.time + FRAMETIME; + gi.linkentity (ent); +} + +/* +============================================================================== + +trigger_safezone + +============================================================================== +*/ +/*QUAKED trigger_safezone (.5 .5 .5) ? START_OFF +Using this entity will toggle whether it hides players or not. +------ SPAWNFLAGS ------ +START_OFF - won't hide anybody until trigger is used +*/ + +void safezone_use (edict_t *self, edict_t *other, edict_t *activator) +{ + if (self->solid == SOLID_NOT) + self->solid = SOLID_TRIGGER; + else + self->solid = SOLID_NOT; + + gi.linkentity (self); +} + + +void safezone_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ +// if ((!other->takedamage) || ((self->spawnflags & PLAYER_ONLY) && (!other->client))) +// return; + + if (!other->client) + return; + +// if (self->timestamp > level.time) +// return; + +// self->timestamp = level.time + FRAMETIME; + + other->svflags |= SVF_ISHIDING; +} + +void SP_trigger_safezone (edict_t *ent) +{ + InitTrigger(ent); + + ent->touch = safezone_touch; + + if (ent->spawnflags & TRIG_START_OFF) + ent->solid = SOLID_NOT; + else + ent->solid = SOLID_TRIGGER; + + ent->use = safezone_use; + + gi.linkentity (ent); +} + +/*QUAKED trigger_sound (.5 .5 .5) (-4 -4 -4) (4 4 4) +Will trigger target when noisy things occur nearby (radius for activation is set by health (defaults to 128)) +target will set what it should trigger, of course +*/ + +void SetGenericEffectInfo(edict_t *ent); + +void trigger_sound_use(edict_t *self, edict_t *other, edict_t *activator) +{ + if(self->target) + { + G_UseTargets(self, self); + } + gmonster.RemoveSoundTrigger(self - g_edicts); + G_FreeEdict(self); +} + +void SP_trigger_sound (edict_t *ent) +{ + SetGenericEffectInfo(ent);//er + + if(ent->health == 0) + { + ent->health = 128; + } + ent->use = trigger_sound_use; + ent->classname = "trigger_sound"; + + gmonster.AddSoundTrigger(ent - g_edicts); + + ent->health *= ent->health; +} + +/*QUAKED trigger_objectives (.5 .5 .5) ? START_OFF +Using this entity will toggle the trigger enabled/disabled. When enabled, the trigger will +display a "check your objectives screen" message. +------ SPAWNFLAGS ------ +START_OFF - won't display anything until used +*/ + +void objectives_use (edict_t *self, edict_t *other, edict_t *activator) +{ + if (self->solid == SOLID_NOT) + { + self->solid = SOLID_TRIGGER; + } + else + { + self->solid = SOLID_NOT; + } + + gi.linkentity (self); +} + +void objectives_touch (edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if (!other->client) + { + return; + } + // display message + level.missionStatus = MISSION_OBJECTIVES; + s_levelStatusBegin = level.time; + + // once we show this message, we probably want this trigger to go away + G_FreeEdict(self); +} + +void SP_trigger_objectives (edict_t *ent) +{ + InitTrigger(ent); + + ent->use = objectives_use; + + if (ent->spawnflags & TRIG_START_OFF) + { // don't display a message yet + ent->count = 0; + ent->solid = SOLID_NOT; + } + else + { + ent->count = 1; + ent->solid = SOLID_TRIGGER; + } + + ent->touch = objectives_touch; + + gi.linkentity (ent); +} + diff --git a/Source/Game/gamecpp/g_uganda.cpp b/Source/Game/gamecpp/g_uganda.cpp new file mode 100644 index 0000000..934bf0d --- /dev/null +++ b/Source/Game/gamecpp/g_uganda.cpp @@ -0,0 +1,591 @@ +/****************************************************** + * Objects for Uganda/Sudan/Africa level * + ******************************************************/ + +#include "g_local.h" +#include "g_obj.h" +#include "callback.h" + +#define HLTH_UGANDA_AFRICAN_TREE 1000 +#define HLTH_UGANDA_CHAINSAW 500 +#define HLTH_UGANDA_COW 400 +#define HLTH_UGANDA_COW_HEAD 100 +#define HLTH_UGANDA_GORE_PILE 300 +#define HLTH_UGANDA_GUTTED_COW 1000 +#define HLTH_UGANDA_HOOK 1000 +#define HLTH_UGANDA_NUKE 1000 +#define HLTH_UGANDA_ROCKET_CORE 3000 +#define HLTH_UGANDA_ROCKET_ENGINE 4000 +#define HLTH_UGANDA_SIDE_O_BEEF 500 +#define HLTH_UGANDA_TRAIN_ARM 500 +#define HLTH_UGANDA_TRAIN_BUMPER 500 +#define HLTH_UGANDA_TRAIN_COUPLING 500 +#define HLTH_UGANDA_TRAIN_WHEEL 500 + + + +#define GUTTED_COW_BLOOD_POOL 4 +#define GUTTED_COW_BLOOD_DRIP 8 +#define GUTTED_COW_SWING 16 + +#define COW_HEAD_BLOOD_POOL 4 + +#define CHAINSAW_RUNNING 4 + +#define SIDEOBEEF_SWING 4 + + +// misc_uganda... +void SP_misc_uganda_african_tree (edict_t *ent); +void SP_misc_uganda_chainsaw (edict_t *ent); +void SP_misc_uganda_cow (edict_t *ent); +void SP_misc_uganda_cow_head (edict_t *ent); +void SP_misc_uganda_gore_pile (edict_t *ent); +void SP_misc_uganda_gutted_cow (edict_t *ent); +void SP_misc_uganda_hook (edict_t *ent); +void SP_misc_uganda_nuke (edict_t *ent); +void SP_misc_uganda_rocket_core (edict_t *ent); +void SP_misc_uganda_rocket_engine (edict_t *ent); +void SP_misc_uganda_side_o_beef (edict_t *ent); +void SP_misc_uganda_train_arm (edict_t *ent); +void SP_misc_uganda_train_bumper (edict_t *ent); +void SP_misc_uganda_train_coupling (edict_t *ent); +void SP_misc_uganda_train_wheel (edict_t *ent); + +spawn_t ugandaSpawns[] = +{ + // Uganda items + {"misc_uganda_african_tree", SP_misc_uganda_african_tree}, + {"misc_uganda_chainsaw", SP_misc_uganda_chainsaw}, + {"misc_uganda_cow", SP_misc_uganda_cow}, + {"misc_uganda_cow_head", SP_misc_uganda_cow_head}, + {"misc_uganda_gore_pile", SP_misc_uganda_gore_pile}, + {"misc_uganda_gutted_cow", SP_misc_uganda_gutted_cow}, + {"misc_uganda_hook", SP_misc_uganda_hook}, + {"misc_uganda_nuke", SP_misc_uganda_nuke}, + {"misc_uganda_rocket_core", SP_misc_uganda_rocket_core}, + {"misc_uganda_rocket_engine", SP_misc_uganda_rocket_engine}, + {"misc_uganda_side_o_beef", SP_misc_uganda_side_o_beef}, + {"misc_uganda_train_arm", SP_misc_uganda_train_arm}, + {"misc_uganda_train_bumper", SP_misc_uganda_train_bumper}, + {"misc_uganda_train_coupling", SP_misc_uganda_train_coupling}, + {"misc_uganda_train_wheel", SP_misc_uganda_train_wheel}, + + {NULL, NULL}, +}; + + + +typedef enum +{ + OBJ_AFRICAN_TREE = 0, + OBJ_CHAINSAW, + OBJ_COW, + OBJ_COW_HEAD, + OBJ_GORE_PILE, + OBJ_GUTTED_COW, + OBJ_HOOK, + OBJ_NUKE, + OBJ_ROCKET_CORE, + OBJ_ROCKET_ENGINE, + OBJ_SIDE_O_BEEF, + OBJ_TRAIN_ARM, + OBJ_TRAIN_BUMPER, + OBJ_TRAIN_COUPLING, + OBJ_TRAIN_WHEEL, + MAX_OBJS +}; + + + +modelSpawnData_t ugandaModelData[MD_UGANDA_SIZE] = +{ +// dir file surfaceType material health solid material file cnt scale +"objects/uganda/african_tree", "tree", SURF_WOOD_DBROWN, MAT_WOOD_DBROWN, HLTH_UGANDA_AFRICAN_TREE, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_AFRICAN_TREE +"objects/uganda/chainsaw", "chainsaw", SURF_METAL, MAT_METAL_DGREY, HLTH_UGANDA_CHAINSAW, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_CHAINSAW +"objects/uganda/cow", "cow", SURF_LIQUID_RED, MAT_DEFAULT, HLTH_UGANDA_COW, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_COW +"objects/uganda/cow_head", "head", SURF_LIQUID_RED, MAT_DEFAULT, HLTH_UGANDA_COW_HEAD, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_COW_HEAD +"objects/uganda/gore_pile", "gore_pile", SURF_LIQUID_RED, MAT_DEFAULT, HLTH_UGANDA_GORE_PILE, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_GORE_PILE +"objects/uganda/gutted_cow", "gutted_cow", SURF_LIQUID_RED, MAT_ROCK_FLESH, HLTH_UGANDA_GUTTED_COW, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_GUTTED_COW +"objects/uganda/hook", "hook", SURF_METAL, MAT_METAL_DGREY, HLTH_UGANDA_HOOK, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_HOOK +"objects/uganda/nuke", "nuke", SURF_METAL, MAT_METAL_DGREY, HLTH_UGANDA_NUKE, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_NUKE +"objects/uganda/rocket_core", "core", SURF_METAL, MAT_METAL_DGREY, HLTH_UGANDA_TRAIN_COUPLING, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_ROCKET_CORE +"objects/uganda/rocket_engine", "engine", SURF_METAL, MAT_METAL_DGREY, HLTH_UGANDA_TRAIN_COUPLING, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_ROCKET_ENGINE +"objects/uganda/side_o_beef", "beef", SURF_LIQUID_RED, MAT_ROCK_FLESH, HLTH_UGANDA_SIDE_O_BEEF, SOLID_BBOX, "beef", 0, 0.0, NULL, // OBJ_SIDE_O_BEEF +"objects/uganda/train_arm", "arm", SURF_METAL, MAT_METAL_DGREY, HLTH_UGANDA_TRAIN_BUMPER, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_TRAIN_ARM +"objects/uganda/train_bumper", "bumper", SURF_METAL, MAT_METAL_DGREY, HLTH_UGANDA_TRAIN_BUMPER, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_TRAIN_BUMPER +"objects/uganda/train_coupling", "coupling", SURF_METAL, MAT_METAL_DGREY, HLTH_UGANDA_TRAIN_COUPLING, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_TRAIN_COUPLING +"objects/uganda/train_wheel", "wheel", SURF_METAL, MAT_METAL_DGREY, HLTH_UGANDA_TRAIN_WHEEL, SOLID_BBOX, NULL, 0, 0.0, NULL, // OBJ_TRAIN_WHEEL +}; + + +/*QUAKED misc_uganda_african_tree (1 .5 0) (-42 -77 -76) (42 77 76) INVULNERABLE NOPUSH x x x x FLUFF +Tree with funky sprite-ish foliage. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_uganda_african_tree (edict_t *ent) +{ + VectorSet (ent->mins, -42, -77, -76); + VectorSet (ent->maxs, 42, 77, 76); + + SimpleModelInit2(ent,&ugandaModelData[OBJ_AFRICAN_TREE],NULL,NULL); +} + + +/*QUAKED misc_uganda_chainsaw (1 .5 0) (-14 -4 -5) (14 4 5) INVULNERABLE NOPUSH RUNNING x x x FLUFF +a chainsaw +------ KEYS ------ +Skin : +0 - very dirty +1 - mildly dirty +2 - clean +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +RUNNING - shake and smoke +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- will smoke if running flag is set +*/ +void SP_misc_uganda_chainsaw (edict_t *ent) +{ + VectorSet (ent->mins, -14, -4, -5); + VectorSet (ent->maxs, 14, 4, 5); + + if (ent->spawnflags & CHAINSAW_RUNNING) + { + fxRunner.execContinualEffect("environ/normalsmoke", ent); + } + + SimpleModelInit2(ent,&ugandaModelData[OBJ_CHAINSAW],NULL,NULL); +} + + +/*QUAKED misc_uganda_cow (1 .5 0) (-13 -38 -29) (13 43 28) INVULNERABLE NOPUSH x x x x FLUFF +A cow. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_uganda_cow (edict_t *ent) +{ + VectorSet (ent->mins, -13, -38, -29); + VectorSet (ent->maxs, 13, 43, 28); + + SimpleModelInit2(ent,&ugandaModelData[OBJ_COW],NULL,NULL); +} + + +/*QUAKED misc_uganda_cow_head (1 .5 0) (-10 -13 -8) (10 13 8) INVULNERABLE NOPUSH BLOOD_POOL x x x FLUFF +A severed cow head +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +BLOOD_POOL - places a blood pool underneath +FLUFF - won't show if gl_pictip is set +*/ +void makebloodpool (edict_t *self); + +void SP_misc_uganda_cow_head (edict_t *ent) +{ + VectorSet (ent->mins, -10, -13, -8); + VectorSet (ent->maxs, 10, 13, 8); + + if (ent->spawnflags & COW_HEAD_BLOOD_POOL) + { + ent->think = makebloodpool; + ent->nextthink = level.time + 2; + } + + SimpleModelInit2(ent,&ugandaModelData[OBJ_COW_HEAD],NULL,NULL); +} + + +void gore_pile_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + vec3_t splatDir; + + VectorSubtract(wherehit, other->s.origin, splatDir); + FX_MakeBloodSpray(wherehit, splatDir, 200, 1, self); +} + +/*QUAKED misc_uganda_gore_pile (1 .5 0) (-26 -23 -3) (26 23 3) INVULNERABLE NOPUSH x x x x FLUFF +Heart, intestines, and assorted gore in a pile. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- splatters blood when shot +*/ +void SP_misc_uganda_gore_pile (edict_t *ent) +{ + VectorSet (ent->mins, -26, -23, -3); + VectorSet (ent->maxs, 26, 23, 3); + + ent->pain = gore_pile_pain; + + SimpleModelInit2(ent,&ugandaModelData[OBJ_GORE_PILE],NULL,NULL); + +} + + +void makebloodpool (edict_t *self) +{ + FX_MakeDecalBelow(self->s.origin, FXDECAL_BLOODPOOL, 0); + self->think = NULL; + self->nextthink = 0; +} + +void guttedcow_swing(edict_t *self) +{ + SimpleModelSetSequence(self,"gutted_cow",SMSEQ_LOOP); +} + + + +GuttedCowCallback theGuttedCowCallback; + +bool GuttedCowCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + edict_t* self = (edict_t*)ent; + + if (self->spawnflags & GUTTED_COW_SWING) // Swing! + guttedcow_swing(self); + + return true; +} + + + +void guttedcow_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + GhoulID tempNote=0; + ggObjC *cCow; + vec3_t vec_to_other; + vec3_t myfacing; + float dirToFace,holdDir; + char *seq; + + VectorSubtract(other->s.origin,ent->s.origin,vec_to_other); + vectoangles(vec_to_other,myfacing); + dirToFace = anglemod(myfacing[YAW]); + holdDir = dirToFace - ent->s.angles[YAW]; + holdDir = anglemod(holdDir); + + if ((holdDir < 30) || (holdDir > 340)) // In front + seq = "swing1"; + else if ((holdDir > 150) && (holdDir < 210)) // Behind you + seq = "swing1"; + else + seq = "swing2"; + + if (!ent->ghoulInst) + { + return; + } + + SimpleModelSetSequence(ent,seq,SMSEQ_HOLD); + + // register a callback for the end of the pain sequence + cCow = game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + tempNote=cCow->GetMyObject()->FindNoteToken("EOS"); + + if (tempNote && ent->ghoulInst) + { + ent->ghoulInst->AddNoteCallBack(&theGuttedCowCallback,tempNote); + } + +} + + +/*QUAKED misc_uganda_gutted_cow (1 .5 0) (-15 -33 -99) (27 25 1) INVULNERABLE NOPUSH BLOOD_POOL BLOOD_DRIP SWING x FLUFF +A gutted cow hanging by its leg from a chain. +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +BLOODPOOL - blood underneath +BLOODDRIP - drips blood +SWING - gentle swing around +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- swings when shot +*/ +void SP_misc_uganda_gutted_cow (edict_t *ent) +{ + VectorSet (ent->mins, -15, -33, -99); + VectorSet (ent->maxs, 27, 25, 1); + + SimpleModelInit2(ent,&ugandaModelData[OBJ_GUTTED_COW],NULL,NULL); + + VectorSet (ent->mins, -15, -33, -99); + VectorSet (ent->maxs, 27, 25, 1); + gi.linkentity(ent); + + if (ent->spawnflags & GUTTED_COW_BLOOD_POOL) + { + ent->think = makebloodpool; + ent->nextthink = level.time + 2; + } + + if (ent->spawnflags & GUTTED_COW_BLOOD_DRIP) + { + fxRunner.execContinualEffect("environ/bloodrain", ent); + } + + + if (ent->spawnflags & GUTTED_COW_SWING) // So they don't swing around in unison + { + ent->think = guttedcow_swing; + ent->nextthink = level.time + (rand() % 10); + } + else + { + ent->ghoulInst->Pause(level.time); + } + + ent->pain = guttedcow_pain; +} + + +/*QUAKED misc_uganda_hook (1 .5 0) (-1 -7 -14) (1 1 0) INVULNERABLE NOPUSH x x x x FLUFF +a large meathook meant to hang from the ceiling +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_uganda_hook (edict_t *ent) +{ + VectorSet (ent->mins, -1, -4, -7); + VectorSet (ent->maxs, 1, 4, 7); + + SimpleModelInit2(ent,&ugandaModelData[OBJ_HOOK],NULL,NULL); +} + + +/*QUAKED misc_uganda_nuke (1 .5 0) (-31 -28 -24) (30 14 25) INVULNERABLE NOPUSH x x x x FLUFF +a nuclear bomb +--------SPAWNFLAGS---------- +INVULNERABLE - N/A can't be damaged. +NOPUSH - N/A can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_uganda_nuke (edict_t *ent) +{ + VectorSet (ent->mins, -31, -28, -24); + VectorSet (ent->maxs, 30, 14, 25); + + ent->spawnflags |= SF_INVULNERABLE; + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&ugandaModelData[OBJ_NUKE],NULL,NULL); + +} + +/*QUAKED misc_uganda_rocket_core (1 .5 0) (-55 -14 -14) (55 14 14) INVULNERABLE NOPUSH x x x x FLUFF +The payload compartment of a rocket +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_uganda_rocket_core (edict_t *ent) +{ + VectorSet (ent->mins, -55, -14, -14); + VectorSet (ent->maxs, 55, 14, 14); + + SimpleModelInit2(ent,&ugandaModelData[OBJ_ROCKET_CORE],NULL,NULL); +} + + +/*QUAKED misc_uganda_rocket_engine (1 .5 0) (-76 -28 -27) (76 34 32) INVULNERABLE NOPUSH x x x x FLUFF +Rocket engine without the metal skin +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_uganda_rocket_engine (edict_t *ent) +{ + + VectorSet (ent->mins, -76, -28, -27); + VectorSet (ent->maxs, 76, 34, 32); + + SimpleModelInit2(ent,&ugandaModelData[OBJ_ROCKET_ENGINE],NULL,NULL); + +} + +void sideobeef_swing(edict_t *self) +{ + SimpleModelSetSequence(self,"SLOW",SMSEQ_LOOP); +} + +SideOBeefCallback theSideOBeefCallback; + +bool SideOBeefCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + edict_t* self = (edict_t*)ent; + + if (self->spawnflags & SIDEOBEEF_SWING) // Swing! + { + sideobeef_swing(self); + } + + return true; +} + +void sideobeef_pain (edict_t *ent, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + GhoulID tempNote=0; + ggObjC *cCow; + vec3_t vec_to_other; + vec3_t myfacing; + float dirToFace,holdDir; + char *seq; + + VectorSubtract(other->s.origin,ent->s.origin,vec_to_other); + vectoangles(vec_to_other,myfacing); + dirToFace = anglemod(myfacing[YAW]); + holdDir = dirToFace - ent->s.angles[YAW]; + holdDir = anglemod(holdDir); + + if ((holdDir < 30) || (holdDir > 340)) // In front + seq = "SWING2"; + else if ((holdDir > 150) && (holdDir < 210)) // Behind you + seq = "SWING2"; + else + seq = "SWING1"; + + if (!ent->ghoulInst) + { + return; + } + + SimpleModelSetSequence(ent,seq,SMSEQ_HOLD); + + // register a callback for the end of the pain sequence + cCow = game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + tempNote=cCow->GetMyObject()->FindNoteToken("EOS"); + + if (tempNote && ent->ghoulInst) + { + ent->ghoulInst->AddNoteCallBack(&theSideOBeefCallback,tempNote); + } + +} + + +/*QUAKED misc_uganda_side_o_beef (1 .5 0) (-13 -16 -55) (19 17 48) INVULNERABLE NOPUSH SWING x x x FLUFF +Dressed side of beef which hangs from ceiling +------ KEYS ------ +skin : +0 - normal +1 - frozen +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't be pushed +SWING - swings gently +FLUFF - won't show if gl_pictip is set +------ SPECIALS ------ +- swings when shot +*/ +void SP_misc_uganda_side_o_beef (edict_t *ent) +{ + char *skinname; + + VectorSet (ent->mins, -13, -16, -55); + VectorSet (ent->maxs, 19, 17, 48); + + switch (ent->s.skinnum) + { + case 1: + skinname = "beef_f"; + break; + default: + skinname = "beef"; + break; + } + + SimpleModelInit2(ent,&ugandaModelData[OBJ_SIDE_O_BEEF],skinname,NULL); + + if (ent->spawnflags & SIDEOBEEF_SWING) // So they don't swing around in unison + { + ent->think = sideobeef_swing; + ent->nextthink = level.time + gi.irand(1,10); + } + + ent->pain = sideobeef_pain; +} + +/*QUAK-ED misc_uganda_train_arm (1 .5 0) (-99 -5 -110) (99 5 110) INVULNERABLE NOPUSH x x x x FLUFF +A train arm. . .for water or something. +------ SPAWNFLAGS ------ +INVULNERABLE - N/A can't be damaged. +NOPUSH - N/A can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_uganda_train_arm (edict_t *ent) +{ + VectorSet (ent->mins, -99, -5, -110); + VectorSet (ent->maxs, 99, 5, 110); + + ent->spawnflags |= SF_INVULNERABLE; + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&ugandaModelData[OBJ_TRAIN_ARM],NULL,NULL); +} +/*QUAKED misc_uganda_train_bumper (1 .5 0) (-32 -15 -16) (32 15 10) INVULNERABLE NOPUSH x x x x FLUFF +A train bumper +------ SPAWNFLAGS ------ +INVULNERABLE - N/A can't be damaged. +NOPUSH - N/A can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_uganda_train_bumper (edict_t *ent) +{ + VectorSet (ent->mins, -32, -15, -16); + VectorSet (ent->maxs, 32, 15, 10); + + ent->spawnflags |= SF_INVULNERABLE; + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&ugandaModelData[OBJ_TRAIN_BUMPER],NULL,NULL); +} + +/*QUAKED misc_uganda_train_coupling (1 .5 0) (-31 -11 -5) (31 11 5) INVULNERABLE NOPUSH x x x x FLUFF +A train coupling +------ SPAWNFLAGS ------ +INVULNERABLE - N/A can't be damaged. +NOPUSH - N/A can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_uganda_train_coupling (edict_t *ent) +{ + VectorSet (ent->mins, -31, -11, -5); + VectorSet (ent->maxs, 31, 11, 5); + + ent->spawnflags |= SF_INVULNERABLE; + ent->spawnflags |= SF_NOPUSH; + + SimpleModelInit2(ent,&ugandaModelData[OBJ_TRAIN_COUPLING],NULL,NULL); +} + +/*QUAK-ED misc_uganda_train_wheel (1 .5 0) (-14 -1 -14) (14 1 14) INVULNERABLE NOPUSH x x x x FLUFF +A spinning train wheel +------ SPAWNFLAGS ------ +INVULNERABLE - can't be damaged. +NOPUSH - can't ever be pushed +FLUFF - won't show if gl_pictip is set +*/ +void SP_misc_uganda_train_wheel (edict_t *ent) +{ + VectorSet (ent->mins, -14, -1, -14); + VectorSet (ent->maxs, 14, 1, 14); + + SimpleModelInit2(ent,&ugandaModelData[OBJ_TRAIN_WHEEL],NULL,NULL); +} diff --git a/Source/Game/gamecpp/g_utils.cpp b/Source/Game/gamecpp/g_utils.cpp new file mode 100644 index 0000000..9e9b01c --- /dev/null +++ b/Source/Game/gamecpp/g_utils.cpp @@ -0,0 +1,1296 @@ +// g_utils.c -- misc utility functions for game module + +#include "g_local.h" +#include "matrix4.h" +#include "fields.h" +#include "..\qcommon\ef_flags.h" + +void G_ProjectSource (vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t result) +{ + result[0] = point[0] + forward[0] * distance[0] + right[0] * distance[1]; + result[1] = point[1] + forward[1] * distance[0] + right[1] * distance[1]; + result[2] = point[2] + forward[2] * distance[0] + right[2] * distance[1] + distance[2]; +} + + +/* +============= +G_Find + +Searches all active entities for the next one that holds +the matching string at fieldofs (use the FOFS() macro) in the structure. + +Searches beginning at the edict after from, or the beginning if NULL +NULL will be returned if the end of the list is reached. + +chars to compare is the number of characters to compare for a match (like strncmp) - + set to 0 to mimic old behavior + +============= +*/ +edict_t *G_Find (edict_t *from, int fieldofs, char *match, int charsToCompare) +{ + char *s; + + if (!match) + { + return NULL; + } + + if (!from) + from = g_edicts; + else + from++; + + for ( ; from < &g_edicts[globals.num_edicts] ; from++) + { + if (!from->inuse) + continue; + s = *(char **) ((byte *)from + fieldofs); + if (!s) + continue; + if(charsToCompare) + { + if (!strnicmp(s, match, charsToCompare)) + return from; + } + else + { + if (!stricmp (s, match)) + return from; + } + } + + return NULL; +} + +/* +================= +findradius + +Returns entities that have origins within a spherical area + +findradius (origin, radius) +================= +*/ +//#if 1 +//fast version + +CRadiusContent::CRadiusContent(vec3_t center, float radius, areatype_t desiredSolidTypes) +{ + numFound = 0; + + float max2; + vec3_t min; + vec3_t max; + vec3_t eorg; + int j; + edict_t *attachTouchList[MAX_RADIUS_FIND_SIZE]; + int numTrigFound = 0; + + max2=radius*radius; + VectorCopy(center,min); + VectorCopy(center,max); + for (j=0 ; j<3 ; j++) + { + min[j]-=radius; + max[j]+=radius; + } + + switch (desiredSolidTypes) + { + case RADAREA_SOLIDS: + numFound = gi.BoxEdicts(min,max, touchlist, MAX_RADIUS_FIND_SIZE, AREA_SOLID); + break; + case RADAREA_TRIGGERS: + numFound = gi.BoxEdicts(min,max, touchlist, MAX_RADIUS_FIND_SIZE, AREA_TRIGGERS); + break; + case RADAREA_SOLIDSANDTRIGGERS: + numFound = gi.BoxEdicts(min,max, touchlist, MAX_RADIUS_FIND_SIZE, AREA_SOLID); + numTrigFound = gi.BoxEdicts(min,max, attachTouchList, MAX_RADIUS_FIND_SIZE, AREA_TRIGGERS); + break; + default: + case RADAREA_NONE: + return; + break; + } + + for (int i = 0; i < numTrigFound; i++) + { + touchlist[numFound+i] = attachTouchList[i]; + } + numFound += numTrigFound; + + // if this returns MAX_RADIUS_FIND_SIZE, you've just searched an area with at least 128 ents around - wow! If so, we've got + // problems... That's just too much. + assert(numFound < MAX_RADIUS_FIND_SIZE); + + // The following two steps eliminate invalid guys + + int foundNum = numFound; + + for( i = 0; i < foundNum; i++) + { + if(!touchlist[i]->inuse) + { + touchlist[i] = 0; + numFound--; + } + else + { + for (j = 0 ; j<3 ; j++) + { + eorg[j] = center[j] - (touchlist[i]->s.origin[j] + (touchlist[i]->mins[j] + touchlist[i]->maxs[j])*0.5); + } + if(VectorLengthSquared(eorg) > max2) + { + touchlist[i] = 0; + numFound--; + } + } + } + + edict_t **start = &touchlist[0]; + edict_t **end = &touchlist[foundNum-1]; + + do + { + while((*start)&&(start < end)) + { + start++; + } + while((!(*end))&&(end > start)) + { + end--; + } + + // this should be the first set of empty / fulls we can find + *start = *end; + start++; + end--; + }while(start < end); +} + +CRadiusContent::CRadiusContent(vec3_t center, float radius, int useAIPoints, int nodeID, int squashZ) +{ + numFound = 0; + + if(useAIPoints) + { + // this no longer uses the AIpoints but instead something a bit quicker, easier, and more consistent + gmonster.FindGuysInRadius(center, radius, this, squashZ); + return; + } + + float max2; + vec3_t min; + vec3_t max; + vec3_t eorg; + int j; + + max2=radius*radius; + VectorCopy(center,min); + VectorCopy(center,max); + for (j=0 ; j<3 ; j++) + { + min[j]-=radius; + max[j]+=radius; + } + + numFound = gi.BoxEdicts(min,max, touchlist, MAX_RADIUS_FIND_SIZE, AREA_SOLID); + + // if this returns MAX_RADIUS_FIND_SIZE, you've just searched an area with at least 128 ents around - wow! If so, we've got + // problems... That's just too much. + assert(numFound < MAX_RADIUS_FIND_SIZE); + + // The following two steps eliminate invalid guys + + int foundNum = numFound; + + for(int i = 0; i < foundNum; i++) + { + if(!touchlist[i]->inuse) + { + touchlist[i] = 0; + numFound--; + } + else + { + for (j = 0 ; j<3 ; j++) + { + eorg[j] = center[j] - (touchlist[i]->s.origin[j] + (touchlist[i]->mins[j] + touchlist[i]->maxs[j])*0.5); + } + if(VectorLengthSquared(eorg) > max2) + { + touchlist[i] = 0; + numFound--; + } + } + } + + edict_t **start = &touchlist[0]; + edict_t **end = &touchlist[foundNum-1]; + + do + { + while((*start)&&(start < end)) + { + start++; + } + while((!(*end))&&(end > start)) + { + end--; + } + + // this should be the first set of empty / fulls we can find + *start = *end; + start++; + end--; + }while(start < end); +} + +/********************/ + +edict_t *performTriggerSearch(edict_t *ent, vec3_t source, float useRange) +{ + edict_t *curSearch = NULL; + + VectorCopy(ent->s.origin, source); + + // if our bbox is intersecting with multiple triggers, that's a + //design error in the map. if we find a trigger, use it. + while( (curSearch = findradius(curSearch, source, useRange, AREA_TRIGGERS)) ) + { + if (curSearch->plUse && strstr(curSearch->classname, "trigger")) + { + return curSearch; + } + } + return NULL; +} + +edict_t *performEntitySearch(edict_t *ent, vec3_t source, float useRange) +{ + vec3_t toOther,looking; + float bestDp, curDp, dpMin; + edict_t *bestSearch = NULL, *curSearch = NULL; + vec3_t tempOrg; + trace_t tr; + + dpMin = bestDp = 0.2; // this value affects how similar the players view vector and the vector + //from the player to the used entity have to be + AngleVectors(ent->client->ps.viewangles,looking,NULL,NULL); + + VectorCopy(ent->s.origin, source); + source[2] += ent->client->ps.viewoffset[2]; + + while(curSearch = findradius(curSearch, source, useRange, AREA_SOLID)) + { + if (!curSearch->plUse) + { + continue; + } + + FindCorrectOrigin(curSearch, tempOrg); + + VectorSubtract(tempOrg, ent->s.origin, toOther); + toOther[2] = 0; // we're gonna ignore the z component so there! + looking[2] = 0; + VectorNormalize(looking); + VectorNormalize(toOther); + curDp = DotProduct(toOther, looking); + + if(curDp <= bestDp)continue; + + gi.trace(source, NULL, NULL, tempOrg, ent, MASK_ALL, &tr); + if((tr.ent != curSearch) && (tr.fraction != 1.0))continue; + + bestDp = curDp; + bestSearch = curSearch; + } + return bestSearch; +} + +edict_t *findinbounds(edict_t *from, vec3_t min, vec3_t max, int nAreatype) +{ + static edict_t *touchlist[MAX_EDICTS]; + static int index=-1; + static int num; + + if (!from) + { + num = gi.BoxEdicts(min,max, touchlist, MAX_EDICTS, nAreatype/*usually AREA_SOLID*/); + index=0; + } + else + { + assert(touchlist[index]==from); + // you cannot adjust the pointers yourself... + // this means you did not call it with the previous edict + index++; + } + for (;indexinuse) + continue; + return touchlist[index]; + } + return NULL; +} + +edict_t *findradius (edict_t *from, vec3_t org, float rad, int nAreatype /*AREA_SOLID*/) +{ + static float max2; + static vec3_t min; + static vec3_t max; + vec3_t eorg; + int j; + float elen; + + if (!from) + { + max2=rad*rad; + VectorCopy(org,min); + VectorCopy(org,max); + for (j=0 ; j<3 ; j++) + { + min[j]-=rad; + max[j]+=rad; + } + } + while (1) + { + from=findinbounds(from,min,max, nAreatype); + if (!from) + { + return 0; + } + if (!from->inuse) + continue; + // if we did an AREA_TRIGGERS search and came back with a trigger, there's no need + //to check anything else. just return the trigger. + if (AREA_TRIGGERS == nAreatype) + { + return from; + } + for (j=0 ; j<3 ; j++) + eorg[j] = org[j] - (from->s.origin[j] + (from->mins[j] + from->maxs[j])*0.5); + elen = DotProduct(eorg,eorg); + if (elen > max2) + continue; + return from; + } +} + +//#else +//slow version +edict_t *oldfindradius (edict_t *from, vec3_t org, float rad) +{ + vec3_t eorg; + int j; + + if (!from) + from = g_edicts; + else + from++; + for ( ; from < &g_edicts[globals.num_edicts]; from++) + { + if (!from->inuse) + continue; + if (from->solid == SOLID_NOT) + continue; + for (j=0 ; j<3 ; j++) + eorg[j] = org[j] - (from->s.origin[j] + (from->mins[j] + from->maxs[j])*0.5); + if (VectorLength(eorg) > rad) + continue; + return from; + } + + return NULL; +} +//#endif + +/* +============= +G_PickTarget + +Searches all active entities for the next one that holds +the matching string at fieldofs (use the FOFS() macro) in the structure. + +Searches beginning at the edict after from, or the beginning if NULL +NULL will be returned if the end of the list is reached. + +============= +*/ +#define MAXCHOICES 8 + +edict_t *G_PickTarget (char *targetname) +{ + edict_t *ent = NULL; + int num_choices = 0; + edict_t *choice[MAXCHOICES]; + + if (!targetname) + { + gi.dprintf("G_PickTarget called with NULL targetname\n"); + return NULL; + } + + while(1) + { + ent = G_Find (ent, FOFS(targetname), targetname); + if (!ent) + break; + choice[num_choices++] = ent; + if (num_choices == MAXCHOICES) + break; + } + + if (!num_choices) + { + gi.dprintf("G_PickTarget: target %s not found\n", targetname); + return NULL; + } + + return choice[rand() % num_choices]; +} + + + +void Think_Delay (edict_t *ent) +{ + G_UseTargets (ent, ent->activator); + G_FreeEdict (ent); +} + +/* +============================== +G_UseTargets + +the global "activator" should be set to the entity that initiated the firing. + +If self.delay is set, a DelayedUse entity will be created that will actually +do the SUB_UseTargets after that many seconds have passed. + +Centerprints any self.message to the activator. + +Search for (string)targetname in all entities that +match (string)self.target and call their .use function + +============================== +*/ +void G_UseTargets (edict_t *ent, edict_t *activator) +{ + edict_t *t; + +// +// check for a delay +// + if (ent->delay) + { + // create a temp object to fire at a later time + t = G_Spawn(); + t->classname = "DelayedUse"; + t->nextthink = level.time + ent->delay; + t->think = Think_Delay; + t->activator = activator; + if (!activator) + gi.dprintf ("Think_Delay with no activator\n"); + t->message = ent->message; + t->target = ent->target; + t->killtarget = ent->killtarget; + t->killfacing = ent->killfacing; + return; + } + + +// +// print the message +// + if ((ent->message || ent->sp_message) && !(activator->svflags & SVF_MONSTER)) + { + if (ent->sp_message) + { + gi.SP_Print(activator, ent->sp_message); + } + else + { + gi.centerprintf (activator, "%s", ent->message); + } + if (ent->noise_index) + { + gi.sound (activator, CHAN_AUTO, ent->noise_index, .6, ATTN_NORM, 0); + } + else + { + gi.sound (activator, CHAN_AUTO, gi.soundindex ("Misc/Talk.wav"), .6, ATTN_NORM, 0); + } + } + +// +// kill killtargets +// + if (ent->killtarget) + { + t = NULL; + while ((t = G_Find (t, FOFS(targetname), ent->killtarget))) + { + G_FreeEdict (t); + if (!ent->inuse) + { + gi.dprintf("entity was removed while using killtargets\n"); + return; + } + } + } + +// +// fire targets +// + if (ent->target) + { + t = NULL; + while ((t = G_Find (t, FOFS(targetname), ent->target))) + { + // doors fire area portals in a specific way + if (!stricmp(t->classname, "func_areaportal") && + (!stricmp(ent->classname, "func_door") || !stricmp(ent->classname, "func_door_rotating"))) + continue; + + if (t == ent) + { + gi.dprintf ("WARNING: Entity used itself.\n"); + } + else + { + if (t->use) + t->use (t, ent, activator); + } + if (!ent->inuse) + { + gi.dprintf("entity was removed while using targets\n"); + return; + } + } + } +} + + +/* +============= +TempVector + +This is just a convenience function +for making temporary vectors for function calls +============= +*/ +float *tv (float x, float y, float z) +{ + static int index; + static vec3_t vecs[8]; + float *v; + + // use an array so that multiple tempvectors won't collide + // for a while + v = vecs[index]; + index = (index + 1)&7; + + v[0] = x; + v[1] = y; + v[2] = z; + + return v; +} + + +/* +============= +VectorToString + +This is just a convenience function +for printing vectors +============= +*/ +char *vtos (vec3_t v) +{ + static int index; + static char str[8][32]; + char *s; + + // use an array so that multiple vtos won't collide + s = str[index]; + index = (index + 1)&7; + + Com_sprintf (s, 32, "(%i %i %i)", (int)v[0], (int)v[1], (int)v[2]); + + return s; +} + + +vec3_t VEC_UP = {0, -1, 0}; +vec3_t MOVEDIR_UP = {0, 0, 1}; +vec3_t VEC_DOWN = {0, -2, 0}; +vec3_t MOVEDIR_DOWN = {0, 0, -1}; + +void G_SetMovedir (vec3_t angles, vec3_t movedir) +{ + if (VectorCompare (angles, VEC_UP)) + { + VectorCopy (MOVEDIR_UP, movedir); + } + else if (VectorCompare (angles, VEC_DOWN)) + { + VectorCopy (MOVEDIR_DOWN, movedir); + } + else + { + AngleVectors (angles, movedir, NULL, NULL); + } + + VectorClear (angles); +} + + +float vectoyaw (vec3_t vec) +{ + float yaw; + + if (vec[YAW] == 0 && vec[PITCH] == 0) + yaw = 0; + else + { + yaw = (int) (atan2(vec[YAW], vec[PITCH]) * 180 / M_PI); + if (yaw < 0) + yaw += 360; + } + + return yaw; +} + + +vec_t VectorNormalize2 (vec3_t v, vec3_t out) +{ + float length; + float ilength = 1; + + length = sqrt(DotProduct(v, v)); + + if (length) + { + ilength /= length; + out[0] = v[0] * ilength; + out[1] = v[1] * ilength; + out[2] = v[2] * ilength; + } + + return length; +} + +void LocalToWorldVect(const vec3_t angles,const vec3_t in, vec3_t out) +{ + Matrix4 m; + m.Rotate(-angles[2],-angles[0],angles[1]); + m.XFormVect(*(Vect3 *)out,*(const Vect3 *)in); +} + +void AnglesFromDir(vec3_t direction, vec3_t angles) +{ + angles[YAW] = atan2(direction[1], direction[0]); + angles[PITCH] = -atan2(direction[2], sqrt(direction[0]*direction[0] + direction[1]*direction[1])); + angles[ROLL] = 0; +} + +void vectoangles(vec3_t in, vec3_t out) +{ +// vec3_t temp; + +// VectorNormalize2(in, temp); + AnglesFromDir(in, out); + VectorRadiansToDegrees(out, out); +} + + +char *G_CopyString (char *in) +{ + char *out; + + out = (char*)gi.TagMalloc (strlen(in)+1, TAG_LEVEL); + strcpy (out, in); + return out; +} + + +void G_InitEdict (edict_t *e) +{ + e->inuse = true; + e->classname = "noclass"; + e->s.number = e - g_edicts; + + e->gravity = 1.0; + e->friction = 1.0; + e->airresistance = 1.0; + e->bouyancy = 0.0; + e->elasticity = 0.5; + +// rjr e->rendermodel = NULL; + e->s.renderindex = -1; + + e->ghoulInst= 0; + + // reset some CTF variables + e->count = e->ctf_flags = e->ctf_hurt_carrier = 0; + + // set these prev fields to any silly values that won't match. There are no sensible #defines to use, so... + // + VectorSet(e->prev_mins, 1000, 1000, 1000); + VectorSet(e->prev_maxs, -1000,-1000,-1000); + VectorSet(e->prev_origin,10000,10000,10000); + e->prev_solid = SOLID_NOMATCH; +} + +/* +================= +G_Spawn + +Either finds a free edict, or allocates a new one. +Try to avoid reusing an entity that was recently freed, because it +can cause the client to think the entity morphed into something else +instead of being removed and recreated, which can cause interpolated +angles and bad trails. +================= +*/ +edict_t *G_Spawn (void) +{ + int i; + edict_t *e; + + e = &g_edicts[(int)maxclients->value + 1]; + for (i = (int)maxclients->value + 1; i < globals.num_edicts; i++, e++) + { + // the first couple seconds of server time can involve a lot of + // freeing and allocating, so relax the replacement policy + if (!e->inuse && (e->freetime < 2 || ((level.time - e->freetime) > 0.5))) + { + G_InitEdict (e); + return(e); + } + } + + if (i == game.maxentities) + { + gi.error ("ED_Alloc: no free edicts"); + } + globals.num_edicts++; + G_InitEdict (e); + return e; +} + +/* +================= +FreeEdictBoltData + +deallocate any model-specific data we stored in the edict_t +================= +*/ +void FreeEdictBoltData(edict_t *ed) +{ + if (ed->objInfo) + { + delete ed->objInfo; + ed->objInfo = NULL; + } +} + +/* +================= +G_FreeEdict + +Marks the edict as free +================= +*/ +void G_FreeEdict (edict_t *ed) +{ + // if this was a pickup of some sort, it might have been registered with thePickupList + if (ed->flags & FL_PICKUP) + { + thePickupList.Unregister(ed); + } + + // if this edict is a complex model of some sort we need to get rid of its + //bolton-related info + FreeEdictBoltData(ed); + + game_ghoul.RemoveObjectInstances(ed); +/* + if (ed->ghoulInst) + { + ed->ghoulInst->Destroy(); + ed->ghoulInst=0; + } +*/ + gi.unlinkentity (ed); // unlink from world + + if (ed->ai) + { + ed->ai.Destroy(); + } + + PHYS_ClearAttachList(ed); + + if ((ed - g_edicts) <= ((int)maxclients->value + BODY_QUEUE_SIZE)) + { +// gi.dprintf("tried to free special edict\n"); + ed->s.renderfx=0; + return; + } + + memset (ed, 0, sizeof(*ed)); + ed->classname = "freed"; + ed->freetime = level.time; + ed->inuse = false; +} + +void G_Explode(edict_t *ent, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ +// Com_Printf("The explosion is being triggered now.\n"); + ent->nextthink = level.time + .2; + ent->s.effects |= EF_EXPLODING; + ent->think = G_FreeEdict; +} + +void G_FreeAllEdicts() +{ + edict_t *ent; + int i; + + ent = g_edicts; + for(i = 0; i < game.maxentities; i++, ent++) + { + if(ent->inuse) + { + G_FreeEdict(ent); + } + } + memset (g_edicts, 0, game.maxentities * sizeof (g_edicts[0])); + + // This is just being ultra safe - the above should have cleared out everything + game_ghoul.LevelCleanUp(); +} + +/* +============ +G_TouchTriggers + +============ +*/ +void G_TouchTriggers (edict_t *ent) +{ + int i, num; + edict_t *touch[MAX_EDICTS], *hit; + + // dead things don't activate triggers! + if ((ent->client || (ent->svflags & SVF_MONSTER)) && (ent->health <= 0)) + return; + + num = gi.BoxEdicts (ent->absmin, ent->absmax, touch + , MAX_EDICTS, AREA_TRIGGERS); + + // be careful, it is possible to have an entity in this + // list removed before we get to it (killtriggered) + for (i=0 ; iinuse) + continue; + if (!hit->touch) + continue; + hit->touch (hit, ent, NULL, NULL); + } +} + +/* +============ +G_TouchSolids + +Call after linking a new trigger in during gameplay +to force all entities it covers to immediately touch it +============ +*/ +void G_TouchSolids (edict_t *ent) +{ + int i, num; + edict_t *touch[MAX_EDICTS], *hit; + + num = gi.BoxEdicts (ent->absmin, ent->absmax, touch + , MAX_EDICTS, AREA_SOLID); + + // be careful, it is possible to have an entity in this + // list removed before we get to it (killtriggered) + for (i=0 ; iinuse) + continue; + if (ent->touch) + ent->touch (hit, ent, NULL, NULL); + if (!ent->inuse) + break; + } +} + + + + +/* +============================================================================== + +Kill box + +============================================================================== +*/ + +/* +================= +KillBox + +Kills all entities that would touch the proposed new positioning +of ent. Ent should be unlinked before calling this! +================= +*/ +qboolean KillBox (edict_t *ent) +{ + trace_t tr; + + while (1) + { + gi.trace (ent->s.origin, ent->mins, ent->maxs, ent->s.origin, NULL, MASK_PLAYERSOLID, &tr); + if (!tr.ent) + break; + + // nail it + T_Damage (tr.ent, ent, ent, vec3_origin, ent->s.origin, ent->s.origin, 100000, 0, DAMAGE_NO_PROTECTION, MOD_TELEFRAG); + + // if we didn't kill it, fail + if (tr.ent->solid) + return false; + } + + return true; // all clear +} + +int GetGhoulPosDir(vec3_t sourcePos, vec3_t sourceAng, IGhoulInst *inst, + GhoulID partID, char *name, vec3_t pos, vec3_t dir, vec3_t right, vec3_t up) +{ + //what the hell? This doesn't seem to work correctly for bolt-ons ;( + //perhaps I'm doing something wrong? I'm quite good at that... + + IGhoulObj *obj = inst->GetGhoulObject(); + + if(obj) + { + GhoulID part = (partID) ? partID:obj->FindPart(name); + + if(part) + { + Matrix4 EntityToWorld; + EntToWorldMatrix(sourcePos,sourceAng,EntityToWorld); + + Matrix4 BoltToWorld; + Matrix4 BoltToEntity; + + inst->GetBoltMatrix(level.time, BoltToEntity, part, IGhoulInst::MatrixType::Entity); + BoltToWorld.Concat(BoltToEntity,EntityToWorld); + + Vect3 ChunkLoc; + BoltToWorld.GetRow(3,ChunkLoc); + + if (pos) + VectorCopy((float *)&ChunkLoc, pos); + + if (dir) + BoltToWorld.GetRow(2,*(Vect3 *)dir); + + if(right) + { + BoltToWorld.GetRow(1,*(Vect3 *)right); + } + if(up) + { + BoltToWorld.GetRow(0,*(Vect3 *)up); + } + return 1; + } + } + + if (pos) + VectorClear(pos); + if (dir) + VectorClear(dir); + return 0; +} + +void EntToWorldMatrix(vec3_t org, vec3_t angles, Matrix4 &m) +{ + vec3_t fwd, right, up; + + AngleVectors(angles, fwd, right, up); + m.Identity(); + (*(Vect3 *)right)*=-1.0f; + m.SetRow(0,*(Vect3 *)fwd); + m.SetRow(1,*(Vect3 *)right); + m.SetRow(2,*(Vect3 *)up); + m.SetRow(3,*(Vect3 *)org); + m.CalcFlags(); +} + +void G_UpdateFrameEffects(edict_t *self) +{ + if (!(self->takedamage)) + { + return; + } + + // Check for burning effects, but ONLY on dead people! + if (self->burntime > level.time && self->health <= 0) + { + // Only every .3 seconds. + if ((int)(level.time * 10.0)%3 == 0) + { + IGhoulInst *inst = self->ghoulInst; + float r, g, b, a; + + if (self->burninflictor == NULL) + self->burninflictor = world; + T_RadiusDamage (self, self->burninflictor, 10, self, 80, MOD_FIRE, DAMAGE_NO_ARMOR); + + if (inst) + { + inst->GetTint(&r, &g, &b, &a); + if (r>0.2 || g>0.2 || b>0.2) + { + r-=.05; + g-=.05; + b-=.05; + inst->SetTintOnAll(r, g, b, a); + } + } + } + } + + // Check for white phosphorous slow burn + if (self->phosburntime > level.time) + { + // Only every .3 seconds, and only if dead. + if (((int)(level.time * 10.0) % 3) == 0) + { + if (self->health <= 0) + { + IGhoulInst *inst = self->ghoulInst; + float r, g, b, a; + + if (inst) + { + inst->GetTint(&r, &g, &b, &a); + if (r>0.2 || g>0.2 || b>0.2) + { + r-=.05; + g-=.05; + b-=.05; + inst->SetTintOnAll(r, g, b, a); + } + } + } + + if (self->burninflictor == NULL) + self->burninflictor = world; + // Also apply some nasty slow damage to the mix. + T_Damage(self, self, self->burninflictor, vec3_up, self->s.origin, self->s.origin, + (self->phosburntime - level.time)*5.0, 0, (int)DAMAGE_NO_ARMOR, (int)MOD_FIRE, 0, 0); + } + } +} + + +void Ignite(edict_t *target, edict_t *damager, float dmgAmount) +{ + assert(target); // we got a crash reported here, so I'll make it not crash in release... + assert(damager); // If anyone gets stuck here, please tell me(Nathan) + + if (lock_deaths) + { // Adult lockout + return; + } + + // kef -- I'm sorry to have to do this, but Sabre needs to be invincible if his count isn't 100 + // dpk -- woo hoo, Dekker too! + bool bSabre = target->classname && (0 == strcmp("m_x_mskinboss", target->classname)); + bool bDekker = target->classname && ((0 == strcmp("m_x_mraiderboss1", target->classname)) || + (0 == strcmp("m_x_mraiderboss2", target->classname))); + + if ((bSabre || bDekker) && (target->count != 100)) + { + return; + } + + if ((target->takedamage == DAMAGE_NO) || (target->flags & FL_GODMODE)) + { //no burning of dead stuff? I dunno. + return; + } + + if (target->burntime <= level.time + 2.0 && target->health <= 0) // Only if dead. + { + if(target->ghoulInst) + { + fxRunner.exec("environ/onfireburst", target, 0); + } + + target->burntime = level.time + 4.0; + } + else + { + if(target->ghoulInst) + { + fxRunner.exec("environ/quickfireburst", target, 0); + } + } + target->burninflictor = damager; +} + + +void Electrocute(edict_t *target, edict_t *damager) +{ + assert(target); // we got a crash reported here, so I'll make it not crash in release... + assert(damager); // If anyone gets stuck here, please tell me(Nathan) + + + // kef -- I'm sorry to have to do this, but Sabre needs to be invincible if his count isn't 100 + // dpk -- woo hoo, Dekker too! + bool bSabre = target->classname && (0 == strcmp("m_x_mskinboss", target->classname)); + bool bDekker = target->classname && ((0 == strcmp("m_x_mraiderboss1", target->classname)) || + (0 == strcmp("m_x_mraiderboss2", target->classname))); + + if ((bSabre || bDekker) && (target->count != 100)) + { + return; + } + + if ((target->takedamage == DAMAGE_NO) || (target->flags & FL_GODMODE)) + { //no burning of dead stuff? I dunno. + return; + } + + if(target->health <= 0) + { // char dead folks + if (!lock_deaths) + { + if (target->burntime <= level.time) + { + if(target->ghoulInst) + { + fxRunner.exec("environ/onfireburst", target, 0); + } + else + { + fxRunner.exec("environ/onfireburst", target); + } + target->burntime = level.time + 2.0; + } + } + } + else if (target->zapfxtime <= level.time) + { + if(target->ghoulInst) + { + fxRunner.exec("weapons/world/mpgzap", target, 0); + } + else + { + fxRunner.exec("weapons/world/mpgzap", target); + } + target->burntime = level.time + 1.0; + } + target->burninflictor = damager; + + // Blind, shake target. + if (target->client) + { // Was a player! + target->client->blinding_alpha += 0.3; + if (target->client->blinding_alpha > 0.9) + target->client->blinding_alpha = 0.9; + + if (target->client->blinding_alpha_delta <= 0 || target->client->blinding_alpha_delta > 0.2) + { + target->client->blinding_alpha_delta = 0.2; + } + + FX_SetEvent_Data(target, EV_CAMERA_SHAKE_VERYHEAVY, DEFAULT_JITTER_DELTA); + } + else if (target->ai) + { // Tis a monster! + target->ai->MuteSenses(sight_mask, 25, smute_recov_linear, 25); + } +} + + + +void RadiusBurn(edict_t *source, float radius) +{ + edict_t *target = NULL; + trace_t los; + + CRadiusContent rad(source->s.origin, radius); + + for(int i = 0; i < rad.getNumFound(); i++) + { + target = rad.foundEdict(i); + + gi.trace(source->s.origin, vec3_origin, vec3_origin, target->s.origin, source, MASK_SOLID, &los); + if (los.fraction > 0.99) + { + Ignite(target, source, 3); + } + } +} + +// this requires 3 sqrts :( +int pointLineIntersect(vec3_t start, vec3_t end, vec3_t point, float rad) +{ + vec3_t line1, line2, line3; + float len; + float cosVal; + float sinVal; + float minDistToLine; + + VectorSubtract(end, start, line1); + VectorSubtract(point, start, line2); + VectorSubtract(point, end, line3); + + // prelim quick tests to see if we're 'tween these two planes + if(DotProduct(line1, line2) < 0) + { + return 0; + } + + if(DotProduct(line3, line1) > 0) + { + return 0; + } + + VectorNormalize(line1); + len = VectorNormalize(line2); + + cosVal = DotProduct(line1, line2); + + sinVal = sqrt(1 - (cosVal * cosVal)); + + minDistToLine = len * sinVal; + + if(minDistToLine < rad) + { + return 1; + } + else + { + return 0; + } +} diff --git a/Source/Game/gamecpp/game.def b/Source/Game/gamecpp/game.def new file mode 100644 index 0000000..df4958f --- /dev/null +++ b/Source/Game/gamecpp/game.def @@ -0,0 +1,2 @@ +EXPORTS + GetGameAPI diff --git a/Source/Game/gamecpp/game.h b/Source/Game/gamecpp/game.h new file mode 100644 index 0000000..58fb105 --- /dev/null +++ b/Source/Game/gamecpp/game.h @@ -0,0 +1,345 @@ +#ifndef _GAME_H_ +#define _GAME_H_ + +// game.h -- game dll information visible to server + +#include "GSQFile.h" +#include "..\qcommon\snd_common.h" + +#define GAME_API_VERSION 3 + +// edict->svflags + +#define SVF_NOCLIENT 0x00000001 // don't send entity to clients, even if it has effects +#define SVF_DEADMONSTER 0x00000002 // treat as CONTENTS_DEADMONSTER for collision +#define SVF_MONSTER 0x00000004 // treat as CONTENTS_MONSTER for collision +#define SVF_DOORHACK_X 0x00000008 // kef -- you've got to believe me when I say this is better +#define SVF_DOORHACK_Y 0x00000010 // than the alternative +#define SVF_DOORHACK_Z 0x00000020 // +#define SVF_ISHIDING 0x00000040 // the entity is hiding in shadows +#define SVF_BUDDY 0x00000080 // LeanBuddy(TM) and NugBuddy(TM) use this to get shot +#define SVF_ALWAYS_SEND 0x00000100 // always transmit to the client, even if out of PVS +#define SVF_FAKE_CLIENT 0x00000200 // not a real connection, so ignore any network writes + + +// edict->solid values + +typedef enum +{ +SOLID_NOT, // no interaction with other objects +SOLID_TRIGGER, // only touch when inside, after moving +SOLID_BBOX, // touch on edge +SOLID_BSP, // bsp clip, touch on edge +SOLID_GHOUL, // use ghoul BoxTrace +SOLID_CORPSE, // solid type for humanoid corpses only +// +SOLID_NOMATCH = -1 // special value initial ent prev-solid field to ensure non-match, DO NOT USE ELSEWHERE!!!! +} solid_t; + +//=============================================================== + +// link_t is only used for entity area links now +typedef struct link_s +{ + struct link_s *prev, *next; +} link_t; + +#define MAX_ENT_CLUSTERS 64 + + +typedef struct edict_s edict_t; +typedef struct gclient_s gclient_t; +typedef struct sharedEdict_s sharedEdict_t; +class inven_c; +class itemSlot_c; + +#ifndef GAME_INCLUDE + +struct gclient_s +{ + player_state_t ps; // communicated by server to clients + int ping; + // the game dll can add anything it wants after + // this point in the structure +}; + + +struct edict_s +{ + entity_state_t s; + struct gclient_s *client; + qboolean inuse; + int linkcount; + + // FIXME: move these fields to a server private sv_entity_t + link_t area; // linked to a division node or leaf + + int num_clusters; // if -1, use headnode instead + short clusternums[MAX_ENT_CLUSTERS]; + int headnode; // unused if num_clusters != -1 + int areanum, areanum2; + + //================================ + + int svflags; // SVF_NOCLIENT, SVF_DEADMONSTER, SVF_MONSTER, etc + vec3_t mins, maxs; + vec3_t absmin, absmax, size; + solid_t solid; + int clipmask; + edict_t *owner; + + /// GHOUL + void *ghoulInst; + + // new fields for checking if origin or mins/maxs have changed, and therefore should we relink entity? + vec3_t prev_mins,prev_maxs; + vec3_t prev_origin; + solid_t prev_solid; + vec3_t prev_angles; + + // the game dll can add anything it wants after + // this point in the structure +}; + +#endif // GAME_INCLUDE + +//=============================================================== + + +// +// functions provided by the main engine +// +typedef struct +{ + // The *index functions create configstrings and some internal server state. + + int (*modelindex) (const char *name); + int (*soundindex) (const char *name); + int (*effectindex) (const char *name); + int (*imageindex) (const char *name); + + void (*unload_sound) (const char *name); + qboolean (*FilterPacket) (char *from); + + void (*CreateGhoulConfigStrings) (void); + + void (*setmodel) (edict_t *ent, char *name); + void (*setrendermodel) (edict_t *ent, char *name); + + // ClientCommand parameter access. + + int (*argc) (void); + char *(*argv) (int n); + char *(*args) (void); // concatenation of all argv >= 1 + + // Special messages. + + void (*bprintf) (int printlevel, char *fmt, ...); + void (*dprintf) (char *fmt, ...); + void (*cprintf) (edict_t *ent, int printlevel, char *fmt, ...); + void (*clprintf) (edict_t *ent, edict_t *from, int color, char *fmt, ...); + void (*welcomeprint) (edict_t *ent); + void (*centerprintf) (edict_t *ent, char *fmt, ...); + void (*cinprintf) (edict_t *ent,int x, int y, int textspeed, char *text); + void (*bcaption) (int printlevel, unsigned short ID); + void (*captionprintf) (edict_t *ent, unsigned short ID); + void (*Con_ClearNotify) (void); + + void (*sound) (edict_t *ent, int channel, int soundindex, float volume, float attenuation, float timeofs, int localize=SND_LOCALIZE_GLOBAL); + void (*positioned_sound) (vec3_t origin, edict_t *ent, int channel, int soundinedex, float volume, float attenuation, float timeofs, int localize=SND_LOCALIZE_GLOBAL); + + // Misc. bullshit. + + void (*DebugGraph) (float value, int color); + bool (*DamageTexture) (struct mtexinfo_s *surface, int amount); + int (*SurfaceTypeList) (byte *mat_list, int max_size); + void (*Update)(float percent, bool server); + + // Network messaging. + + void (*multicast) (vec3_t origin, multicast_t to); + void (*multicastignore)(vec3_t origin, multicast_t to, int ignoreID); + void (*unicast) (edict_t *ent, qboolean reliable); + void (*WriteChar) (int c); + void (*WriteByte) (int c); + void (*WriteShort) (int c); + void (*WriteLong) (int c); + void (*WriteFloat) (float f); + void (*WriteString) (char *s); + void (*WritePosition) (vec3_t pos); // some fractional bits + void (*WriteDir) (vec3_t pos); // single byte encoded, very coarse + void (*WriteAngle) (float f); + + void (*WriteByteSizebuf)(sizebuf_t *sz,int c); + void (*WriteShortSizebuf)(sizebuf_t *sz,int s); + void (*WriteLongSizebuf)(sizebuf_t *sz,int i); + void (*ReliableWriteByteToClient)(byte b,int clientNum); + void (*ReliableWriteDataToClient)(const void *data,int length,int clientNum); + + int (*GetNearestByteNormal) (vec3_t dir); + + void (*sendPlayernameColors)(edict_t *ent,int len,int numClients,byte *clientColors); + + + // String Package + + void (*SP_Register)(const char *Package); + void (*SP_Print)(edict_t *ent, unsigned short ID, ...); + void (*SP_Print_Obit)(edict_t *ent, unsigned short ID, ...); + int (*SP_SPrint)(char *buffer, int buffer_size, unsigned short ID, ...); + const char *(*SP_GetStringText)(unsigned short ID); + + // Collision detection. + + qboolean (*trace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, edict_t *passent, int contentmask, trace_t *trace); + qboolean (*polyTrace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, edict_t *passent, int contentmask, trace_t *trace, int (*PolyHitFunc)(trace_t *tr, vec3_t start, vec3_t end, int clipMask)); + int (*pointcontents) (vec3_t point); + float (*RegionDistance) (vec3_t vert); + qboolean (*inPVS) (vec3_t p1, vec3_t p2); + qboolean (*inPHS) (vec3_t p1, vec3_t p2); + void (*SetAreaPortalState) (int portalnum, qboolean open); + qboolean (*AreasConnected) (int area1, int area2); + + // Stuff needed by gameghoul. + + void *(*GetGhoul)(void); + IPlayerModelInfoC *(*NewPlayerModelInfo)(char *modelname); + int (*FindGSQFile)(char *gsqdir, char *gsqfile, void **buffer); + bool (*ReadGsqEntry)(int &filesize, char **tdata, char *seqname); + void (*PrecacheGSQFile)(char *dirname, char *gsq_file, IGhoulObj *object); + int (*RegisterGSQSequences)(char *gsqdir, char *subclass, IGhoulObj *object); + void (*TurnOffPartsFromGSQFile)(char *dirname, char *poff_file, IGhoulObj *this_object, IGhoulInst *this_inst); + + int **isClient; + + // Config strings hold all the index strings, the lightstyles, and misc data like + // the sky definition and cdtrack. All of the current configstrings are sent to + // clients when they connect, and changes are sent to all connected clients. + + void (*configstring) (int num, char *string); + + // Sizebuf stuff. + + void (*SZ_Init)(sizebuf_t *buf, byte *data, int length); + void (*SZ_Clear)(sizebuf_t *buf); + void (*SZ_Write)(sizebuf_t *buf, const void *data, int length); + + // Anyone care to comment on this? + + void (*error) (char *fmt, ...); + + void (*Sys_ConsoleOutput)(char *string); + void *(*Sys_GetPlayerAPI)(void *parmscom,void *parmscl,void *parmssv,int isClient); + void (*Sys_UnloadPlayer)(int isClient); + + float (*flrand)(float min, float max); + int (*irand)(int min, int max); + + // An entity will never be sent to a client or used for collision if it is not + // passed to linkentity. If the size, position, or solidity changes, it must be relinked. + + void (*linkentity) (edict_t *ent); + void (*unlinkentity) (edict_t *ent); // call before removing an interactive edict + int (*BoxEdicts) (vec3_t mins, vec3_t maxs, edict_t **list, int maxcount, int areatype); + void (*Pmove) (pmove_t *pmove); // player movement code common with client prediction + + // Managed memory allocation. + + void *(*TagMalloc) (int size, int tag); + void (*TagFree) (void *block); + void (*FreeTags) (int tag); + + // Savegame handling + + qboolean (*AppendToSavegame)(unsigned long chid, void *data, int length); + int (*ReadFromSavegame)(unsigned long chid, void *address, int length, void **addressptr = NULL); +#if (!_FINAL_) && (_RAVEN_) + char *(*GetLabel)(void *addr); +#endif + + // Console variable interaction. + + cvar_t *(*cvar) (const char *var_name, const char *value, int flags, cvarcommand_t command = NULL); + cvar_t *(*cvar_set) (const char *var_name, const char *value); + void (*cvar_setvalue) (const char *var_name, float value); + cvar_t *(*cvar_forceset) (const char *var_name, const char *value); + char *(*cvar_info)(int flag); + float (*cvar_variablevalue)(const char *var_name); + + // General purpose filesystem routines. + + int (*FS_LoadFile) (char *name, void **buf, bool OverridePak = false); + void (*FS_FreeFile) (void *buf); + char *(*FS_Userdir) (void); + void (*FS_CreatePath) (char *path); + int (*FS_FileExists) (char *path); + + // Add commands to the server console as if they were typed in for map changing etc. + + void (*AddCommandString) (const char *text); +} game_import_t; + + +// +// functions exported by the game subsystem +// +typedef struct +{ + int apiversion; + + // the init function will only be called when a game starts, + // not each time a level is loaded. Persistant data for clients + // and the server can be allocated in init + void (*Init) (void); + void (*Shutdown) (void); + + // each new level entered will cause a call to SpawnEntities + void (*SpawnEntities) (char *mapname, char *entstring, char *spawnpoint); + + // Read/Write Game is for storing persistant cross level information + // about the world state and the clients. + // WriteGame is called every time a level is exited. + // ReadGame is called on a loadgame. + void (*WriteGame) (bool autosave); + bool (*ReadGame) (bool autosave); + + // ReadLevel is called after the default map information has been + // loaded with SpawnEntities + void (*WriteLevel) (void); + void (*ReadLevel) (void); + + qboolean (*ClientConnect) (edict_t *ent, char *userinfo); + void (*ClientBegin) (edict_t *ent); + void (*ClientUserinfoChanged) (edict_t *ent, char *userinfo, bool not_first_time); + void (*ClientDisconnect) (edict_t *ent); + void (*ClientCommand) (edict_t *ent); + void (*ClientThink) (edict_t *ent, usercmd_t *cmd); + void (*ResetCTFTeam) (edict_t *ent); + + int (*GameAllowASave) (void); + void (*SavesLeft) (void); + void (*GetGameStats) (void); + void (*UpdateInven) (void); + const char *(*GetDMGameName) (void); + byte (*GetCinematicFreeze) (void); + void (*SetCinematicFreeze) (byte cf); + + float (*RunFrame) (int serverframe); + + // + // global variables shared between game and server + // + + // The edict array is allocated in the game dll so it + // can vary in size from one game to another. + // + // The size will be fixed when ge->Init() is called + struct edict_s *edicts; + int edict_size; + int num_edicts; // current number, <= max_edicts + int max_edicts; +} game_export_t; + +game_export_t *GetGameApi (game_import_t *import); + +#endif // _GAME_H_ \ No newline at end of file diff --git a/Source/Game/gamecpp/gamecpp.dsp b/Source/Game/gamecpp/gamecpp.dsp new file mode 100644 index 0000000..1e53f0c --- /dev/null +++ b/Source/Game/gamecpp/gamecpp.dsp @@ -0,0 +1,824 @@ +# Microsoft Developer Studio Project File - Name="gamecpp" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=GAMECPP - WIN32 FINAL RELEASE +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "gamecpp.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "gamecpp.mak" CFG="GAMECPP - WIN32 FINAL RELEASE" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "gamecpp - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "gamecpp - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "gamecpp - Win32 Final Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName ""$/SOF/Code2/gamecpp", BXJAAAAA" +# PROP Scc_LocalPath "." +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "gamecpp - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir ".\Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /W3 /Gm /Gi /GX /Zi /O2 /Ob2 /I "..\qcommon" /I "..\player" /D "NDEBUG" /D "_KEF_" /D "WIN32" /D "_WINDOWS" /D "_SOF_" /D "__GAME__" /D "_RAVEN_" /YX /FD /c +# SUBTRACT CPP /Fr +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib /nologo /base:"0x50000000" /subsystem:windows /dll /profile /debug /machine:I386 /nodefaultlib:"libcd" /nodefaultlib:"libcmt" /out:"../release/gamex86.dll" +# SUBTRACT LINK32 /map /nodefaultlib + +!ELSEIF "$(CFG)" == "gamecpp - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /W3 /Gm /Gi /GX /ZI /Od /I "..\qcommon" /I "..\player" /D "_DEBUG" /D "_KEF_" /D "WIN32" /D "_WINDOWS" /D "_SOF_" /D "__GAME__" /D "_RAVEN_" /FR /Fp".\Debug/gamecpp.pch" /YX /Fo".\Debug/" /Fd".\Debug/" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib /nologo /subsystem:windows /dll /pdb:"../Debug/gamex86.pdb" /debug /machine:I386 /def:".\game.def" /out:"..\debug\gamex86.dll" /pdbtype:sept +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "gamecpp - Win32 Final Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "gamecpp___Win32_Final_Release" +# PROP BASE Intermediate_Dir "gamecpp___Win32_Final_Release" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Final" +# PROP Intermediate_Dir "Final" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /Gm /Gi /GX /Zi /O2 /I "..\qcommon" /I "..\player" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_SOF_" /D "__GAME__" /FR /YX /FD /c +# ADD CPP /nologo /W3 /Gi /GX /O2 /Ob2 /I "..\qcommon" /I "..\player" /D "NDEBUG" /D "_FINAL_" /D "WIN32" /D "_WINDOWS" /D "_SOF_" /D "__GAME__" /D "_RAVEN_" /YX /FD /c +# SUBTRACT CPP /Fr +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 ../smartheap/shlw32m.lib kernel32.lib user32.lib /nologo /subsystem:windows /dll /profile /map:"..\Release/gamex86.map" /debug /machine:I386 /out:"../release/gamex86.dll" +# ADD LINK32 kernel32.lib user32.lib /nologo /base:"0x50000000" /subsystem:windows /dll /pdb:none /map:"..\Final/gamex86.map" /machine:I386 /nodefaultlib:"libcmt" /out:"../Final/gamex86.dll" +# SUBTRACT LINK32 /profile /debug + +!ENDIF + +# Begin Target + +# Name "gamecpp - Win32 Release" +# Name "gamecpp - Win32 Debug" +# Name "gamecpp - Win32 Final Release" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp" +# Begin Source File + +SOURCE=.\ai.cpp +# End Source File +# Begin Source File + +SOURCE=.\ai_actions.cpp +# End Source File +# Begin Source File + +SOURCE=.\ai_body.cpp +# End Source File +# Begin Source File + +SOURCE=.\ai_bodycow.cpp +# End Source File +# Begin Source File + +SOURCE=.\ai_bodydekker.cpp +# End Source File +# Begin Source File + +SOURCE=.\ai_bodydog.cpp +# End Source File +# Begin Source File + +SOURCE=.\ai_bodyhuman.cpp +# End Source File +# Begin Source File + +SOURCE=.\ai_bodynoghoul.cpp +# End Source File +# Begin Source File + +SOURCE=.\ai_decisions.cpp +# End Source File +# Begin Source File + +SOURCE=.\ai_path_pre.cpp +# End Source File +# Begin Source File + +SOURCE=.\ai_pathfinding.cpp +# End Source File +# Begin Source File + +SOURCE=.\ai_senses.cpp +# End Source File +# Begin Source File + +SOURCE=.\CWeaponInfo.cpp +# End Source File +# Begin Source File + +SOURCE=.\dm.cpp +# End Source File +# Begin Source File + +SOURCE=.\dm_arsenal.cpp +# End Source File +# Begin Source File + +SOURCE=.\dm_assassin.cpp +# End Source File +# Begin Source File + +SOURCE=.\dm_ctf.cpp +# End Source File +# Begin Source File + +SOURCE=.\dm_none.cpp +# End Source File +# Begin Source File + +SOURCE=.\dm_real.cpp +# End Source File +# Begin Source File + +SOURCE=.\dm_standard.cpp +# End Source File +# Begin Source File + +SOURCE=.\ds.cpp +# End Source File +# Begin Source File + +SOURCE=.\fx_effects.cpp +# End Source File +# Begin Source File + +SOURCE=.\fx_tempents.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_bosnia.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_castle.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_chase.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_cmds.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_combat.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_environ.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_func.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_generic.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_ghoul.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_iraq.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_items.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_lightmodels.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_main.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_misc.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_monster.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_newyork.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_obj.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_phys.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_player.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_save.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_siberia.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_skilllevels.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_sound.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_spawn.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_svcmds.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_target.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_tokyo.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_trigger.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_uganda.cpp +# End Source File +# Begin Source File + +SOURCE=.\g_utils.cpp +# End Source File +# Begin Source File + +SOURCE=.\m_ecto.cpp +# End Source File +# Begin Source File + +SOURCE=.\m_female.cpp +# End Source File +# Begin Source File + +SOURCE=.\m_generic.cpp +# End Source File +# Begin Source File + +SOURCE=.\m_heliactions.cpp +# End Source File +# Begin Source File + +SOURCE=.\m_heliai.cpp +# End Source File +# Begin Source File + +SOURCE=.\m_meso.cpp +# End Source File +# Begin Source File + +SOURCE=.\m_snowcatactions.cpp +# End Source File +# Begin Source File + +SOURCE=.\m_snowcatai.cpp +# End Source File +# Begin Source File + +SOURCE=.\m_tankactions.cpp +# End Source File +# Begin Source File + +SOURCE=.\m_tankai.cpp +# End Source File +# Begin Source File + +SOURCE=..\ghoul\matrix4.cpp +# End Source File +# Begin Source File + +SOURCE=.\mp_ents.cpp +# End Source File +# Begin Source File + +SOURCE=.\p_body.cpp +# End Source File +# Begin Source File + +SOURCE=.\p_client.cpp +# End Source File +# Begin Source File + +SOURCE=.\p_hud.cpp +# End Source File +# Begin Source File + +SOURCE=.\p_trail.cpp +# End Source File +# Begin Source File + +SOURCE=.\p_view.cpp +# End Source File +# Begin Source File + +SOURCE=.\pt_listpointer.cpp +# End Source File +# Begin Source File + +SOURCE=.\q_sh_fx.cpp +# End Source File +# Begin Source File + +SOURCE=.\q_shared.cpp +# End Source File +# Begin Source File + +SOURCE=..\smartheap\SMRTHEAP.C + +!IF "$(CFG)" == "gamecpp - Win32 Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "gamecpp - Win32 Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "gamecpp - Win32 Final Release" + +# PROP BASE Exclude_From_Build 1 +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\test.cpp +# End Source File +# Begin Source File + +SOURCE=..\ghoul\vect3.cpp +# End Source File +# Begin Source File + +SOURCE=.\w_equip.cpp +# End Source File +# Begin Source File + +SOURCE=.\w_fire.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\actionids.h +# End Source File +# Begin Source File + +SOURCE=.\ai.h +# End Source File +# Begin Source File + +SOURCE=.\ai_actions.h +# End Source File +# Begin Source File + +SOURCE=.\ai_body.h +# End Source File +# Begin Source File + +SOURCE=.\ai_bodycow.h +# End Source File +# Begin Source File + +SOURCE=.\ai_bodydekker.h +# End Source File +# Begin Source File + +SOURCE=.\ai_bodydog.h +# End Source File +# Begin Source File + +SOURCE=.\ai_bodyhuman.h +# End Source File +# Begin Source File + +SOURCE=.\ai_bodynoghoul.h +# End Source File +# Begin Source File + +SOURCE=.\ai_decisions.h +# End Source File +# Begin Source File + +SOURCE=.\ai_path_pre.h +# End Source File +# Begin Source File + +SOURCE=.\ai_pathfinding.h +# End Source File +# Begin Source File + +SOURCE=.\ai_private.h +# End Source File +# Begin Source File + +SOURCE=.\ai_public.h +# End Source File +# Begin Source File + +SOURCE=.\ai_senses.h +# End Source File +# Begin Source File + +SOURCE=..\client\amd3d.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\Angles.h +# End Source File +# Begin Source File + +SOURCE=.\callback.h +# End Source File +# Begin Source File + +SOURCE=..\client\cdaudio.h +# End Source File +# Begin Source File + +SOURCE=..\client\client.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\configstring.h +# End Source File +# Begin Source File + +SOURCE=..\client\console.h +# End Source File +# Begin Source File + +SOURCE=.\CWeaponInfo.h +# End Source File +# Begin Source File + +SOURCE=.\dm.h +# End Source File +# Begin Source File + +SOURCE=..\strings\dm_arsenal.h +# End Source File +# Begin Source File + +SOURCE=..\strings\dm_assassin.h +# End Source File +# Begin Source File + +SOURCE=.\dm_ctf.h +# End Source File +# Begin Source File + +SOURCE=..\strings\dm_generic.h +# End Source File +# Begin Source File + +SOURCE=.\dm_private.h +# End Source File +# Begin Source File + +SOURCE=.\ds.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\ef_flags.h +# End Source File +# Begin Source File + +SOURCE=..\client\fffx.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\fields.h +# End Source File +# Begin Source File + +SOURCE=.\fx_effects.h +# End Source File +# Begin Source File + +SOURCE=.\g_ghoul.h +# End Source File +# Begin Source File + +SOURCE=.\g_local.h +# End Source File +# Begin Source File + +SOURCE=.\g_monster.h +# End Source File +# Begin Source File + +SOURCE=.\g_obj.h +# End Source File +# Begin Source File + +SOURCE=.\g_skilllevels.h +# End Source File +# Begin Source File + +SOURCE=.\g_spawn.h +# End Source File +# Begin Source File + +SOURCE=.\game.h +# End Source File +# Begin Source File + +SOURCE=..\strings\general.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\GSQFile.h +# End Source File +# Begin Source File + +SOURCE=..\ghoul\ighoul.h +# End Source File +# Begin Source File + +SOURCE=..\client\input.h +# End Source File +# Begin Source File + +SOURCE=..\strings\items.h +# End Source File +# Begin Source File + +SOURCE=..\client\keys.h +# End Source File +# Begin Source File + +SOURCE=.\list.h +# End Source File +# Begin Source File + +SOURCE=.\m_ecto.h +# End Source File +# Begin Source File + +SOURCE=.\m_female.h +# End Source File +# Begin Source File + +SOURCE=.\m_generic.h +# End Source File +# Begin Source File + +SOURCE=.\m_heliactions.h +# End Source File +# Begin Source File + +SOURCE=.\m_heliai.h +# End Source File +# Begin Source File + +SOURCE=.\m_meso.h +# End Source File +# Begin Source File + +SOURCE=.\m_snowcatactions.h +# End Source File +# Begin Source File + +SOURCE=.\m_snowcatai.h +# End Source File +# Begin Source File + +SOURCE=.\m_tankactions.h +# End Source File +# Begin Source File + +SOURCE=.\m_tankai.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\mathlib.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\matrix4.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\music.h +# End Source File +# Begin Source File + +SOURCE=.\p_body.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\p_heights.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\palette.h +# End Source File +# Begin Source File + +SOURCE=.\pcode.h +# End Source File +# Begin Source File + +SOURCE=..\player\player.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\pmove.h +# End Source File +# Begin Source File + +SOURCE=.\pt_listpointer.h +# End Source File +# Begin Source File + +SOURCE=.\q_sh_fx.h +# End Source File +# Begin Source File + +SOURCE=.\q_sh_interface.h +# End Source File +# Begin Source File + +SOURCE=.\q_shared.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\qcommon.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\qfiles.h +# End Source File +# Begin Source File + +SOURCE=..\client\ref.h +# End Source File +# Begin Source File + +SOURCE=..\client\screen.h +# End Source File +# Begin Source File + +SOURCE=..\strings\singleplr.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\snd_common.h +# End Source File +# Begin Source File + +SOURCE=..\client\sound.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\timing.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\vect3.h +# End Source File +# Begin Source File + +SOURCE=..\client\vid.h +# End Source File +# Begin Source File + +SOURCE=..\player\w_public.h +# End Source File +# Begin Source File + +SOURCE=..\player\w_types.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\w_types.h +# End Source File +# Begin Source File + +SOURCE=..\player\w_utils.h +# End Source File +# Begin Source File + +SOURCE=..\player\w_weapons.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\game.def + +!IF "$(CFG)" == "gamecpp - Win32 Release" + +!ELSEIF "$(CFG)" == "gamecpp - Win32 Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "gamecpp - Win32 Final Release" + +!ENDIF + +# End Source File +# End Group +# End Target +# End Project diff --git a/Source/Game/gamecpp/gamecpp.dsw b/Source/Game/gamecpp/gamecpp.dsw new file mode 100644 index 0000000..1bca5a8 --- /dev/null +++ b/Source/Game/gamecpp/gamecpp.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "gamecpp"=.\gamecpp.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/Source/Game/gamecpp/list.h b/Source/Game/gamecpp/list.h new file mode 100644 index 0000000..af9ab2b --- /dev/null +++ b/Source/Game/gamecpp/list.h @@ -0,0 +1,90 @@ +#pragma once + +template +class List +{ + struct Node; + friend struct Node; + struct Node + { + Node *next; + Node *prev; + V value; + }; + + Node *NewNode() + { + Node *r=new Node; + r->prev=r; + r->next=r; + return r; + } + Node *NewNode(const V& val,Node *n=0,Node *p=0) + { + Node *r=new Node; + r->value=val; + r->prev=p?p:r; + r->next=n?n:r; + return r; + } + void DelNode(Node *n) {delete n;} + Node *Head; + int size; +public: + class Iter; + friend class Iter; + class Iter + { + Node *cur; + public: + Iter() {} + Iter(Node *t) {cur=t;} + V & operator*() const {return cur->value;} + Iter& operator++() {cur=cur->next;return *this;} + Iter operator++(int) {Iter Tmp = *this;++*this;return Tmp;} + Iter& operator--() {cur=cur->prev;return *this;} + Iter operator--(int) {Iter Tmp = *this;--*this;return Tmp;} + bool operator==(const Iter& x) const {return cur == x.cur; } + bool operator!=(const Iter& x) const {return !(*this == x); } + Node *Mynode() const {return cur;} + }; + + List() {Head=NewNode();size=0;} + ~List() + { + Erase(Begin(), End()); + DelNode(Head); + Head = 0; + size = 0; + } + int Size() const {return size;} + Iter Begin() {return Iter(Head->next);} + Iter End() {return Iter(Head);} + void Insert(Iter P, const V& X) + { + Node *S = P.Mynode(); + S->prev = NewNode(X,S,S->prev); + S = S->prev; + S->prev->next=S; + size++; + } + Iter Erase(Iter P) + { + Node *S = (P++).Mynode(); + S->prev->next=S->next; + S->next->prev=S->prev; + DelNode(S); + --size; + return (P); + } + Iter Erase(Iter F,Iter L) + { + while (F != L) + Erase(F++); + return (F); + } + void PushFront(const V& X) {Insert(Begin(), X); } + void PopFront() {Erase(Begin()); } + void PushBack(const V& X) {Insert(End(), X); } + void PopBack() {Erase(--End()); } +}; diff --git a/Source/Game/gamecpp/m_ecto.cpp b/Source/Game/gamecpp/m_ecto.cpp new file mode 100644 index 0000000..6613d9c --- /dev/null +++ b/Source/Game/gamecpp/m_ecto.cpp @@ -0,0 +1,997 @@ +#include "g_local.h" +#include "ai_private.h" +#include "m_generic.h" +#include "m_ecto.h" + +#define ECTO_POUCH_SCALE 1.125 +#define ECTO_HAT_SCALE 1.125 +#define ECTO_GLASSES_SCALE 1.0 +#define ECTO_WEAPON_SCALE 1.0 +#define ECTO_OTHER_SCALE 1.125 + +#define ECTO_GLASSES_NAME "acc_ecto_glasses" + +void generic_ecto_ai::AddBody(edict_t *monster) +{ + if (!monster) + { + return; + } + body = new bodyecto_c(); +} + +const char *generic_ecto_ai::GetInterpFile(char *theclass, char *subclass) +{ + lev_interp_code curLevel = GetInterpCode(); + + switch (curLevel) + { + case LEVCODE_NYC_SUBWAY: + return "ecto_tsr1";//no npc-only or player-only seqs + case LEVCODE_KOS_SEWER: + return "ecto_kos1";//super-simple refugee for script + case LEVCODE_TUTORIAL: + return "ecto_tut1"; + case LEVCODE_ARM_1: + case LEVCODE_ARM_2: + case LEVCODE_ARM_3: + return "ecto_arm";//super-simple fellas for armory + case LEVCODE_SIB_BASE: + return "ecto_sib2"; + case LEVCODE_AFR_YARD: + case LEVCODE_AFR_HOUSE: + case LEVCODE_AFR_FACT: + return "ecto_sud"; + case LEVCODE_IRQ_TOWNA: + case LEVCODE_NYC_SUBWAY2: + case LEVCODE_SIB_CANYON: + case LEVCODE_NYC_WARE: + case LEVCODE_CAS_1: + case LEVCODE_CAS_3: + case LEVCODE_CAS_4: + case LEVCODE_SIB_PLANT: + case LEVCODE_NYC_STREETS: + case LEVCODE_TOK_STREET: + case LEVCODE_TOK_OFFICE: + case LEVCODE_IRQ_STREETS: + case LEVCODE_IRQ_FORT: + case LEVCODE_AFR_TRAIN: + case LEVCODE_KOS_BIGGUN: + case LEVCODE_KOS_HANGAR: + case LEVCODE_IRQ_BUNKER: + case LEVCODE_IRQ_CARGO: + case LEVCODE_NYC_STEAM: + case LEVCODE_TOK_PENT: + case LEVCODE_IRQ_OIL: + case LEVCODE_CAS_2: + case LEVCODE_UNKNOWN: + gi.dprintf("WARNING: no level .ghb for ecto--using ecto.ghb!\n"); + break; + } + return "ecto"; +} + +void generic_ecto_ai::Init(edict_t *monster, char *ghoulname, char *subclass) +{ + generic_human_ai::Init(monster, ghoulname, subclass); + +/* scale *= 0.9f; + + Matrix4 mat, mat1, mat2; + + monster->ghoulInst->GetXForm(mat); + mat2.Identity(); + mat1=mat; + mat2.Scale(0.9f); + mat.Concat(mat1, mat2); + monster->ghoulInst->SetXForm(mat); +*/ +} + +void skinleader_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_nycskinhleader",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycskinhleader",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_nycskinhleader2",VARIETY_PRIORITY_LOW); + RegisterSkin("a","a_nycskinhleader2",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_w_12_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_12_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_1_s",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_w_1_",VARIETY_PRIORITY_LOW); +} + +void skinleader_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC *myInstance; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + if (!(monster->spawnflags & SPAWNFLAG_NO_WEAPONS)) + { + body->SetRightHandWeapon(*monster, ATK_PISTOL1); +// body->SetLeftHandWeapon(*monster, ATK_MOLITOV); + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_blck", ECTO_OTHER_SCALE); + } + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", ECTO_GLASSES_NAME, "to_abolt_head_t", myInstance, "acc_glasses_sun", ECTO_GLASSES_SCALE); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_baseball", "to_abolt_head_t_bkwd", myInstance, "acc_hat_baseball_grcamo", ECTO_OTHER_SCALE); + + + bool gotleather = false; + if (gi.irand(0,1)) + { + if (body->ApplySkin(*monster, myInstance, "b", "b_nycskinhleader2")) + { + gotleather=true; + body->ApplySkin(*monster, myInstance, "a", "a_nycskinhleader2"); + } + } + if (!gotleather) + { + body->ApplySkin(*monster, myInstance, "b", "b_nycskinhleader"); + body->ApplySkin(*monster, myInstance, "a", "a_nycskinhleader"); + } + + bool newface = false; + + if ((gi.irand(0,1)) && body->ApplySkin(*monster, myInstance, "h", "h_w_1_s")) + { + body->SetFace(*monster,"f_w_1_"); + newface = true; + } + if (!newface) + { + body->ApplySkin(*monster, myInstance, "h", "h_w_12_s"); + + body->SetFace(*monster,"f_w_12_"); + } + body->SetVoiceDirectories(*monster, "sk", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + gi.effectindex("environ/onfireburst"); +} + +void zitpunk_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterFaceSkins("f_w_12_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_nycpunk2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycpunk2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_12_s",VARIETY_PRIORITY_HIGHEST); +} + +void zitpunk_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + if (!(monster->spawnflags & SPAWNFLAG_NO_WEAPONS)) + { + body->SetRightHandWeapon(*monster, ATK_PISTOL1); + } + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", ECTO_GLASSES_NAME, "to_abolt_head_t", myInstance, "acc_glasses_sun", ECTO_GLASSES_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "a", "a_nycpunk2"); + body->ApplySkin(*monster, myInstance, "b", "b_nycpunk2"); + + body->ApplySkin(*monster, myInstance, "h", "h_w_12_s"); + body->SetFace(*monster,"f_w_12_"); + + body->SetVoiceDirectories(*monster, "sk", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void stockbroker_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_nycmalestockbroker",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycmalestockbroker",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycmalestockbrokerb",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_b_1_s",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_b_1_",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_w_2_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_2_",VARIETY_PRIORITY_HIGHEST); +} + +void stockbroker_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + qboolean altskin=false; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + + body->AddRandomBoltedItem(0.5, *monster, "wbolt_hand_l", "Enemy/Bolt", "w_briefcase", "to_wbolt_hand_l", myInstance, "rubbish", ECTO_WEAPON_SCALE); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", ECTO_GLASSES_NAME, "to_abolt_head_t", myInstance, "acc_glasses_norm", ECTO_GLASSES_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_nycmalestockbroker"); + + if (!strcmp(subclass,"stockbroke2"))//is a black stockbroker + { + altskin=body->ApplySkin(*monster, myInstance, "a", "a_nycmalestockbrokerb") + && body->ApplySkin(*monster, myInstance, "h", "h_b_1_s"); + } + if (altskin) + { + body->SetFace(*monster,"f_b_1_"); + } + else + { + GhoulID bang; + bang = MyGhoulObj->GetMyObject()->FindPart("_lhairbang"); + if (rand()%2 && bang) + { + myInstance->GetInstPtr()->SetPartOnOff(bang, false); + } + bang = MyGhoulObj->GetMyObject()->FindPart("_rhairbang"); + if (rand()%2 && bang) + { + myInstance->GetInstPtr()->SetPartOnOff(bang, false); + } + + body->ApplySkin(*monster, myInstance, "a", "a_nycmalestockbroker"); + body->ApplySkin(*monster, myInstance, "h", "h_w_2_c"); + body->SetFace(*monster,"f_w_2_"); + } + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void bum_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_nycbum",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycbum",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("hb","hb_h_1_b",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_hb_1_",VARIETY_PRIORITY_HIGHEST); +} + +void bum_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_flop", "to_abolt_head_t", myInstance, "acc_hat_flop_brwn", ECTO_HAT_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_nycbum"); + body->ApplySkin(*monster, myInstance, "a", "a_nycbum"); + body->ApplySkin(*monster, myInstance, "hb", "hb_h_1_b"); + body->SetFace(*monster,"f_hb_1_"); + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void tourist_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_dcmaletourist",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_dcmaletourist",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_4_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_4_",VARIETY_PRIORITY_HIGHEST); +} + +void tourist_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", ECTO_GLASSES_NAME, "to_abolt_head_t", myInstance, "acc_glasses_norm", ECTO_GLASSES_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_dcmaletourist"); + body->ApplySkin(*monster, myInstance, "a", "a_dcmaletourist"); + body->ApplySkin(*monster, myInstance, "h", "h_w_4_s"); + + body->SetFace(*monster,"f_w_4_"); + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void commander_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_ugncommander",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_ugncommander",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_2_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_b_2_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_1_s",VARIETY_PRIORITY_LOWEST); + RegisterFaceSkins("f_b_1_",VARIETY_PRIORITY_LOWEST); +} + +void commander_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL2); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_general", "to_abolt_head_t", myInstance, "acc_hat_general_brwn", ECTO_HAT_SCALE); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", ECTO_GLASSES_NAME, "to_abolt_head_t", myInstance, "acc_glasses_sun", ECTO_GLASSES_SCALE); + body->AddRandomBoltedItem(0.5, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_brwn"); + body->AddRandomBoltedItem(0.5, *monster, "abolt_thigh_l", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_l", myInstance, "acc_pouch_thigh_tan", ECTO_POUCH_SCALE); + body->AddRandomBoltedItem(0.5, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_brwn", ECTO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_ugncommander"); + body->ApplySkin(*monster, myInstance, "a", "a_ugncommander"); + + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_b_1_s")) + { + body->SetFace(*monster,"f_b_1_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_b_2_s"); + body->SetFace(*monster,"f_b_2_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void factoryworker_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_ugnfactoryworker",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_ugnfactoryworker",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_4_c",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_b_4_",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_b_3_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_b_3_",VARIETY_PRIORITY_HIGHEST); +} + +void factoryworker_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL2); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_top", "to_abolt_head_t", myInstance, "acc_hat_top_wht", ECTO_HAT_SCALE); + body->AddRandomBoltedItem(0.5, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_blck", ECTO_OTHER_SCALE); + body->AddRandomBoltedItem(0.5, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_r", myInstance, "acc_box_hip_smll_blck", ECTO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_ugnfactoryworker"); + body->ApplySkin(*monster, myInstance, "a", "a_ugnfactoryworker"); + + if (gi.irand(0,1) && body->ApplySkin(*monster, myInstance, "h", "h_b_4_c")) + { + body->SetFace(*monster,"f_b_4_"); + monster->ghoulInst->SetPartOnOff("_headcrew",false); +// monster->ghoulInst->SetPartOnOff("_headbald",false); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_b_3_s"); + body->SetFace(*monster,"f_b_3_"); + monster->ghoulInst->SetPartOnOff("_headcrew",false); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + + +void irqcitizen_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqmalecitizen",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqmalecitizen",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_2_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_2_",VARIETY_PRIORITY_HIGHEST); +// MyGhoulObj->RegisterSkin("hb","hb_h_1_b"); +// RegisterFaceSkins("f_hb_1_"); +} + +void irqcitizen_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", ECTO_GLASSES_NAME, "to_abolt_head_t", myInstance, "acc_glasses_norm", ECTO_GLASSES_SCALE); + + if (!body->AddRandomBoltedItem(0.3333333, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_turbin", "to_abolt_head_t", myInstance, "acc_hat_turbin_wht", ECTO_HAT_SCALE)) + { + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_top", "to_abolt_head_t", myInstance, "acc_hat_top_wht", ECTO_HAT_SCALE); + } + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_irqmalecitizen"); + body->ApplySkin(*monster, myInstance, "a", "a_irqmalecitizen"); +// if (gi.irand(0,1)) +// { + myInstance->GetInstPtr()->SetPartOnOff("_headbeard",false); + body->ApplySkin(*monster, myInstance, "h", "h_m_2_s"); + body->SetFace(*monster,"f_m_2_"); +// } +// else +// { +// myInstance->GetInstPtr()->SetPartOnOff("_headbald",false); +// body->ApplySkin(*monster, myInstance, "hb", "hb_h_1_b"); +// body->SetFace(*monster,"f_hb_1_"); +// } + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void prisoner1_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_colmaleprisoner1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_colmaleprisoner1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("hb","hb_h_1_b",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_hb_1_",VARIETY_PRIORITY_HIGHEST); +} + +void prisoner1_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_flop", "to_abolt_head_t", myInstance, "acc_hat_flop_brwn", ECTO_HAT_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_colmaleprisoner1"); + body->ApplySkin(*monster, myInstance, "a", "a_colmaleprisoner1"); + body->ApplySkin(*monster, myInstance, "hb", "hb_h_1_b"); + body->SetFace(*monster,"f_hb_1_"); + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void prisoner2_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_colmaleprisoner2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_colmaleprisoner2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_h_1_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_h_1_",VARIETY_PRIORITY_HIGHEST); +} + +void prisoner2_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_colmaleprisoner2"); + body->ApplySkin(*monster, myInstance, "a", "a_colmaleprisoner2"); + body->ApplySkin(*monster, myInstance, "h", "h_h_1_c"); + body->SetFace(*monster,"f_h_1_"); + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void iraqofficer_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqofficer",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqofficer",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_1_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_1_",VARIETY_PRIORITY_HIGHEST); +} + +void iraqofficer_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL2); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_beret", "to_abolt_head_t", myInstance, "acc_hat_beret_blck", ECTO_HAT_SCALE); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", ECTO_GLASSES_NAME, "to_abolt_head_t", myInstance, "acc_glasses_sun", ECTO_GLASSES_SCALE); + body->AddRandomBoltedItem(0.5, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_brwn", ECTO_OTHER_SCALE); + body->AddRandomBoltedItem(0.5, *monster, "abolt_thigh_l", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_l", myInstance, "acc_pouch_thigh_blck", ECTO_POUCH_SCALE); + body->AddRandomBoltedItem(0.5, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_brwn", ECTO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_irqofficer"); + body->ApplySkin(*monster, myInstance, "a", "a_irqofficer"); + + body->ApplySkin(*monster, myInstance, "h", "h_m_1_s"); + body->SetFace(*monster,"f_m_1_"); + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void serbofficer_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_kosofficer",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_kosofficer",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_5_c",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_w_5_",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_w_2_c",VARIETY_PRIORITY_LOWEST); + RegisterFaceSkins("f_w_2_",VARIETY_PRIORITY_LOWEST); + RegisterSkin("h","h_h_6_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_h_6_",VARIETY_PRIORITY_HIGHEST); +} + +void serbofficer_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL2); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_general2", "to_abolt_head_t", myInstance, "acc_hat_general2_grn", ECTO_HAT_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_brwn", ECTO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_kosofficer"); + body->ApplySkin(*monster, myInstance, "a", "a_kosofficer"); + + if (!gi.irand(0,2)&&body->ApplySkin(*monster, myInstance, "h", "h_w_2_c")) + { + body->SetFace(*monster,"f_w_2_"); + } + else if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_w_5_c")) + { + body->SetFace(*monster,"f_w_5_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_h_6_s"); + body->SetFace(*monster,"f_h_6_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void kosrefugee_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_kosrefugee",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_kosrefugee",VARIETY_PRIORITY_HIGHEST); +// MyGhoulObj->RegisterSkin("hb","hb_h_1_b"); +// RegisterFaceSkins("f_hb_1_"); + RegisterSkin("h","h_w_4_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_4_",VARIETY_PRIORITY_HIGHEST); +} + +void kosrefugee_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL2); +// body->SetLeftHandWeapon(*monster, ATK_MOLITOV); + + body->AddRandomBoltedItem(0.2, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_baseball", "to_abolt_head_t_fwd", myInstance, "acc_hat_baseball_tan", ECTO_HAT_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_brwn", ECTO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_kosrefugee"); + body->ApplySkin(*monster, myInstance, "a", "a_kosrefugee"); + +// if (gi.irand(0,1)) +// { + myInstance->GetInstPtr()->SetPartOnOff("_headbeard",false); + body->ApplySkin(*monster, myInstance, "h", "h_w_4_s"); + body->SetFace(*monster,"f_w_4_"); +// } +// else +// { +// myInstance->GetInstPtr()->SetPartOnOff("_headbald",false); +// body->ApplySkin(*monster, myInstance, "hb", "hb_h_1_b"); +// body->SetFace(*monster,"f_hb_1_"); +// break; +// } + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + gi.effectindex("environ/onfireburst"); +} + +void chemist_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_colchemist",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_colchemist",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_h_1_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_h_1_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_h_2_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_h_2_",VARIETY_PRIORITY_HIGHEST); +} + +void chemist_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL2); + + if (!body->AddRandomBoltedItem(0.3333333, *monster, "abolt_head_t", "Enemy/Bolt", ECTO_GLASSES_NAME, "to_abolt_head_t", myInstance, "acc_glasses_norm", ECTO_GLASSES_SCALE)) + { + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", ECTO_GLASSES_NAME, "to_abolt_head_t", myInstance, "acc_glasses_sun", ECTO_GLASSES_SCALE); + } + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_top", "to_abolt_head_t", myInstance, "acc_hat_top_wht", ECTO_HAT_SCALE); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_blck", ECTO_OTHER_SCALE); + body->AddRandomBoltedItem(0.5, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_r", myInstance, "acc_box_hip_smll_blck", ECTO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_colchemist"); + body->ApplySkin(*monster, myInstance, "a", "a_colchemist"); + + if (!strcmp(subclass,"chemist2")&&body->ApplySkin(*monster, myInstance, "h", "h_h_1_c")) + { + body->SetFace(*monster,"f_h_1_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_h_2_s"); + body->SetFace(*monster,"f_h_2_"); + } + + body->SetVoiceDirectories(*monster, "soldier", 2, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void sibsuit_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_sibsuit",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_sibsuit",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_5_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_5_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_3_",VARIETY_PRIORITY_HIGH); + RegisterSkin("h","h_w_3_s",VARIETY_PRIORITY_HIGH); +} + +void sibsuit_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + qboolean imBald; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL1); + + body->AddRandomBoltedItem(0.5, *monster, "wbolt_hand_l", "Enemy/Bolt", "w_briefcase", "to_wbolt_hand_l", myInstance, "rubbish", ECTO_WEAPON_SCALE); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", ECTO_GLASSES_NAME, "to_abolt_head_t", myInstance, "acc_glasses_norm", ECTO_GLASSES_SCALE); + + imBald=(NULL != body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_tall", "to_abolt_head_t", myInstance, "acc_hat_tall_gry", ECTO_HAT_SCALE)); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_blck", ECTO_OTHER_SCALE); + body->AddRandomBoltedItem(0.5, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_holster", "to_abolt_hip_r", myInstance, "acc_holster_blck", ECTO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_sibsuit"); + body->ApplySkin(*monster, myInstance, "a", "a_sibsuit"); + + if (!strcmp(subclass,"sibsuit2") && body->ApplySkin(*monster, myInstance, "h", "h_w_3_s")) + { + imBald=true; + body->SetFace(*monster,"f_w_3_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_w_5_c"); + body->SetFace(*monster,"f_w_5_"); + } + + if (imBald) + { + myInstance->GetInstPtr()->SetPartOnOff("_headcrew",false); + } + else + { + myInstance->GetInstPtr()->SetPartOnOff("_headbald",false); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void sibscientist_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_sibscientist",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_sibscientist",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_2_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_2_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_1_",VARIETY_PRIORITY_LOWEST); + RegisterSkin("h","h_w_1_s",VARIETY_PRIORITY_LOWEST); +} + +void sibscientist_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_ecto_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", ECTO_GLASSES_NAME, "to_abolt_head_t", myInstance, "acc_glasses_norm", ECTO_GLASSES_SCALE); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_blck", ECTO_OTHER_SCALE); + body->AddRandomBoltedItem(0.5, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_r", myInstance, "acc_box_hip_smll_blck", ECTO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_sibscientist"); + body->ApplySkin(*monster, myInstance, "a", "a_sibscientist"); + + if (!strcmp(subclass,"sibscience2")&&body->ApplySkin(*monster, myInstance, "h", "h_w_1_s")) + { + body->SetFace(*monster,"f_w_1_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_w_2_c"); + body->SetFace(*monster,"f_w_2_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void SP_m_nyc_estockbroker (edict_t *self) +{ + generic_monster_spawnnow(self); + if (rand()%2) + { + self->ai = ai_c::Create(AI_ECTO_STOCKBROKER, self, "enemy/ecto", "stockbroke"); + } + else + { + self->ai = ai_c::Create(AI_ECTO_STOCKBROKER, self, "enemy/ecto", "stockbroke2"); + } + self->think = generic_npc_init; +} + +void SP_m_nyc_etourist (edict_t *self) +{ + generic_monster_spawnnow(self); + self->think = generic_npc_init; + self->ai = ai_c::Create(AI_ECTO_DCTOURIST, self, "enemy/ecto", "tourist"); +} + +void SP_m_nyc_epunk (edict_t *self) +{ + generic_monster_spawnnow(self); + self->think = generic_grunt_init; + self->ai = ai_c::Create(AI_ECTO_PUNK2, self, "enemy/ecto", "zitpunk"); +} + +void SP_m_nyc_eskinhead3 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_ECTO_SKINLEADER, self, "enemy/ecto", "skinleader"); + self->think = generic_grunt_init; +} + +void SP_m_afr_eworker (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_ECTO_FACTORY, self, "enemy/ecto", "factory"); + self->think = generic_grunt_init; +} + +void SP_m_kos_eofficer (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_ECTO_SERBOFFICER, self, "enemy/ecto", "serbofficer"); + self->think = generic_leader_init; +} + +void SP_m_kos_erefugee (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_ECTO_KOSREFUGEE, self, "enemy/ecto", "kosrefugee"); + self->think = generic_leader_init; +} + +void SP_m_irq_eofficer (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_ECTO_IRAQOFFICER, self, "enemy/ecto", "iraqofficer"); + self->think = generic_leader_init; +} + + +void SP_m_afr_ecommander (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_ECTO_UGNCOMMANDER, self, "enemy/ecto", "commander"); + self->think = generic_leader_init; +} + +void SP_m_nyc_ebum (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_ECTO_NYCBUM, self, "enemy/ecto", "bum"); + self->think = generic_npc_init; +} + +void SP_m_irq_eman1 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_ECTO_IRAQCITIZEN, self, "enemy/ecto", "irqcitizen"); + self->think = generic_npc_init; +} + +void SP_m_sib_eofficer (edict_t *self) +{ + generic_monster_spawnnow(self); + if (rand()&1) + { + self->ai = ai_c::Create(AI_ECTO_SIBSUIT, self, "enemy/ecto", "sibsuit1"); + } + else + { + self->ai = ai_c::Create(AI_ECTO_SIBSUIT, self, "enemy/ecto", "sibsuit2"); + } + self->think = generic_leader_init; +} + +void SP_m_sib_escientist1 (edict_t *self) +{ + generic_monster_spawnnow(self); + if (rand()&1) + { + self->ai = ai_c::Create(AI_ECTO_SIBSCIENCE, self, "enemy/ecto", "sibscience1"); + } + else + { + self->ai = ai_c::Create(AI_ECTO_SIBSCIENCE, self, "enemy/ecto", "sibscience2"); + } + self->think = generic_leader_init; +} + + + + + + + + + + diff --git a/Source/Game/gamecpp/m_ecto.h b/Source/Game/gamecpp/m_ecto.h new file mode 100644 index 0000000..fc3ad7c --- /dev/null +++ b/Source/Game/gamecpp/m_ecto.h @@ -0,0 +1,163 @@ + +class generic_ecto_ai : public generic_human_ai +{ +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual const char *GetInterpFile(char *theclass, char *subclass); + virtual void AddBody(edict_t *monster); +}; + + +class skinleader_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return TEAM_SKINHEADS;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_SKINLEADER;}//this should be different for everybody in this class family +}; + +class stockbroker_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_STOCKBROKER;}//this should be different for everybody in this class family +}; + +class tourist_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_DCTOURIST;}//this should be different for everybody in this class family +}; + +class zitpunk_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return TEAM_SKINHEADS;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_PUNK2;}//this should be different for everybody in this class family +}; + +class bum_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int IsInnocent() { return 1; } + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_NYCBUM;}//this should be different for everybody in this class family +}; + +class prisoner1_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_COLPRISONER1;}//this should be different for everybody in this class family +}; + +class prisoner2_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_COLPRISONER2;}//this should be different for everybody in this class family +}; + +class irqcitizen_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int IsInnocent() { return 1; } + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_IRAQCITIZEN;}//this should be different for everybody in this class family +}; + +class commander_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_UGNCOMMANDER;}//this should be different for everybody in this class family +}; + +class serbofficer_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_SERBOFFICER;}//this should be different for everybody in this class family +}; + +class kosrefugee_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_KOSREFUGEE;}//this should be different for everybody in this class family +}; + +class iraqofficer_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_IRAQOFFICER;}//this should be different for everybody in this class family +}; + +class factoryworker_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_FACTORY;}//this should be different for everybody in this class family +}; + +class chemist_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_CHEMIST;}//this should be different for everybody in this class family +}; + +class sibsuit_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_SIBSUIT;}//this should be different for everybody in this class family +}; + +class sibscientist_ai : public generic_ecto_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_ECTO_SIBSCIENCE;}//this should be different for everybody in this class family +}; diff --git a/Source/Game/gamecpp/m_female.cpp b/Source/Game/gamecpp/m_female.cpp new file mode 100644 index 0000000..33563e9 --- /dev/null +++ b/Source/Game/gamecpp/m_female.cpp @@ -0,0 +1,692 @@ +#include "g_local.h" +#include "ai_private.h" +#include "m_generic.h" +#include "m_female.h" + +#define FEMALE_POUCH_SCALE 1.125 +#define FEMALE_HAT_SCALE 1.125 +#define FEMALE_GLASSES_SCALE 1.0 +#define FEMALE_WEAPON_SCALE 1.0 +#define FEMALE_OTHER_SCALE 1.125 + + +void generic_female_ai::AddBody(edict_t *monster) +{ + if (!monster) + { + return; + } + body = new bodyfemale_c(); +} + +const char *generic_female_ai::GetInterpFile(char *theclass, char *subclass) +{ + lev_interp_code curLevel = GetInterpCode(); + + switch (curLevel) + { + case LEVCODE_NYC_SUBWAY://tsr1 + case LEVCODE_SIB_CANYON://sib1 + case LEVCODE_SIB_BASE://sib2 + case LEVCODE_NYC_WARE://nyc1 + return "fem_pistol";//no npc-only or player-only seqs + + case LEVCODE_ARM_1://arm1 + case LEVCODE_ARM_2://arm2 + case LEVCODE_ARM_3://arm3 + return "fem_arm";//no player-only or pistol seqs + + case LEVCODE_CAS_1://ger1 + + //taylor is said to be here, so this may need specialness... + case LEVCODE_CAS_3://ger3 + case LEVCODE_CAS_4://ger4 + return "fem_shot";//no npc-only or player-only seqs + + case LEVCODE_SIB_PLANT://sib3 + case LEVCODE_NYC_STREETS://nyc3 + case LEVCODE_TOK_STREET://jpn1 + case LEVCODE_TOK_OFFICE://jpn2 + return "fem_pisnpc";//no player-only seqs + + case LEVCODE_IRQ_TOWNA://irq1a + case LEVCODE_IRQ_BUNKER: + case LEVCODE_IRQ_CARGO: + case LEVCODE_IRQ_STREETS://irq2a + case LEVCODE_IRQ_FORT://irq2b + case LEVCODE_IRQ_OIL: + return "fem_npc";//no player-only or armed seqs--should be very small + + + case LEVCODE_TUTORIAL: + case LEVCODE_NYC_SUBWAY2: + case LEVCODE_AFR_TRAIN: + case LEVCODE_KOS_SEWER: + case LEVCODE_KOS_BIGGUN: + case LEVCODE_KOS_HANGAR: + case LEVCODE_NYC_STEAM: + case LEVCODE_AFR_YARD: + case LEVCODE_AFR_HOUSE: + case LEVCODE_AFR_FACT: + case LEVCODE_TOK_PENT: + case LEVCODE_CAS_2: + case LEVCODE_UNKNOWN: + gi.dprintf("WARNING: no level .ghb for female--using female.ghb!\n"); + break; + } + return "female"; +} + +void skinchick_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_nycskinchick",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycskinchick",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_15_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_15_",VARIETY_PRIORITY_HIGHEST); +} + +void skinchick_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC *myInstance; + + generic_female_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL1); + + body->ApplySkin(*monster, myInstance, "b", "b_nycskinchick"); + body->ApplySkin(*monster, myInstance, "a", "a_nycskinchick"); + + body->ApplySkin(*monster, myInstance, "h", "h_w_15_c"); + body->SetFace(*monster,"f_w_15_"); + + body->SetVoiceDirectories(*monster, "skf", 1, DEATHVOICE_FEMALE); + body->SetRootBolt(*monster); +} + +void nycwoman_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_nycwomanw",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycwomanw",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_18_m",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_18_",VARIETY_PRIORITY_HIGHEST); + + RegisterSkin("b","b_nycwomanb",VARIETY_PRIORITY_LOW); + RegisterSkin("a","a_nycwomanb",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_b_8_c",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_b_8_",VARIETY_PRIORITY_LOW); +} + +void nycwoman_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC *myInstance; + qboolean altskin=false; + + generic_female_ai::Init(monster, ghoulname, subclass); + + if (!body || !monster->ghoulInst) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + if (gi.irand(0,1))//caucasian + { + altskin = body->ApplySkin(*monster, myInstance, "b", "b_nycwomanb") + && body->ApplySkin(*monster, myInstance, "a", "a_nycwomanb"); + } + if (altskin) + { + body->ApplySkin(*monster, myInstance, "h", "h_b_8_c"); + body->SetFace(*monster,"f_b_8_"); + + //she uses crew hair... + monster->ghoulInst->SetPartOnOff("_medmhairmhead",false); + } + else + { + body->ApplySkin(*monster, myInstance, "b", "b_nycwomanw"); + body->ApplySkin(*monster, myInstance, "a", "a_nycwomanw"); + body->ApplySkin(*monster, myInstance, "h", "h_w_18_m"); + body->SetFace(*monster,"f_w_18_"); + + //she uses medium hair... + monster->ghoulInst->SetPartOnOff("_crewhair",false); + monster->ghoulInst->SetPartOnOff("_lear",false); + monster->ghoulInst->SetPartOnOff("_rear",false); + } + body->SetVoiceDirectories(*monster, "npcf", 1, DEATHVOICE_FEMALE); + body->SetRootBolt(*monster); +} + +void tokassassin_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_tokassassin",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_tokassassin",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_j_8_m",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_j_8_",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_j_7_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_j_7_",VARIETY_PRIORITY_HIGHEST); +} + +void tokassassin_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC *myInstance; + qboolean altskin=false; + + generic_female_ai::Init(monster, ghoulname, subclass); + + if (!body || !monster->ghoulInst) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL1); + body->SetLeftHandWeapon(*monster, ATK_THROWSTAR); + + body->ApplySkin(*monster, myInstance, "b", "b_tokassassin"); + body->ApplySkin(*monster, myInstance, "a", "a_tokassassin"); + + if (gi.irand(0,1)) + { + altskin=body->ApplySkin(*monster, myInstance, "h", "h_j_8_m"); + } + + if (altskin) + { + //she uses medium hair... + body->SetFace(*monster,"f_j_8_"); + monster->ghoulInst->SetPartOnOff("_crewhair",false); + monster->ghoulInst->SetPartOnOff("_lear",false); + monster->ghoulInst->SetPartOnOff("_rear",false); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_j_7_c"); + body->SetFace(*monster,"f_j_7_"); + + //she uses crew hair... + monster->ghoulInst->SetPartOnOff("_medmhairmhead",false); + } + + body->SetVoiceDirectories(*monster, "skinhead", 2, DEATHVOICE_FEMALE); + body->SetRootBolt(*monster); +} + +void tokwoman1_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_tokwoman1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_tokwoman1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_j_8_m",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_j_8_",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_j_7_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_j_7_",VARIETY_PRIORITY_HIGHEST); +} + +void tokwoman1_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC *myInstance; + qboolean altskin=false; + + generic_female_ai::Init(monster, ghoulname, subclass); + + if (!body || !monster->ghoulInst) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_norm", FEMALE_GLASSES_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_tokwoman1"); + body->ApplySkin(*monster, myInstance, "a", "a_tokwoman1"); + + if (gi.irand(0,1)) + { + altskin=body->ApplySkin(*monster, myInstance, "h", "h_j_8_m"); + } + if (altskin) + { + body->SetFace(*monster,"f_j_8_"); + + //she uses medium hair... + monster->ghoulInst->SetPartOnOff("_crewhair",false); + monster->ghoulInst->SetPartOnOff("_lear",false); + monster->ghoulInst->SetPartOnOff("_rear",false); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_j_7_c"); + body->SetFace(*monster,"f_j_7_"); + + //she uses crew hair... + monster->ghoulInst->SetPartOnOff("_medmhairmhead",false); + } + + body->SetVoiceDirectories(*monster, "npcf", 1, DEATHVOICE_FEMALE); + body->SetRootBolt(*monster); +} + +void tokwoman2_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_tokwoman2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_tokwoman2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_j_8_m",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_j_8_",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_j_7_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_j_7_",VARIETY_PRIORITY_HIGHEST); +} + +void tokwoman2_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC *myInstance; + qboolean altskin=false; + + generic_female_ai::Init(monster, ghoulname, subclass); + + if (!body || !monster->ghoulInst) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_norm", FEMALE_GLASSES_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_tokwoman2"); + body->ApplySkin(*monster, myInstance, "a", "a_tokwoman2"); + + if (gi.irand(0,1)) + { + altskin=body->ApplySkin(*monster, myInstance, "h", "h_j_8_m"); + } + if (altskin) + { + body->SetFace(*monster,"f_j_8_"); + + //she uses medium hair... + monster->ghoulInst->SetPartOnOff("_crewhair",false); + monster->ghoulInst->SetPartOnOff("_lear",false); + monster->ghoulInst->SetPartOnOff("_rear",false); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_j_7_c"); + body->SetFace(*monster,"f_j_7_"); + + //she uses crew hair... + monster->ghoulInst->SetPartOnOff("_medmhairmhead",false); + } + + body->SetVoiceDirectories(*monster, "npcf", 1, DEATHVOICE_FEMALE); + body->SetRootBolt(*monster); +} + +void fsibguard_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_sibguard2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_sibguard2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_18_m",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_w_18_",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_w_17_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_17_",VARIETY_PRIORITY_HIGHEST); +} + +void fsibguard_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC *myInstance; + qboolean altskin=false; + + generic_female_ai::Init(monster, ghoulname, subclass); + + if (!body || !monster->ghoulInst) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_MACHINEPISTOL); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_baseball", "to_abolt_head_t", myInstance, "acc_hat_baseball_sib", FEMALE_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_sibguard2"); + body->ApplySkin(*monster, myInstance, "a", "a_sibguard2"); + + if (gi.irand(0,1)) + { + altskin=body->ApplySkin(*monster, myInstance, "h", "h_w_18_m"); + } + if (altskin) + { + body->SetFace(*monster,"f_w_18_"); + + //she uses medium hair... + monster->ghoulInst->SetPartOnOff("_crewhair",false); + monster->ghoulInst->SetPartOnOff("_lear",false); + monster->ghoulInst->SetPartOnOff("_rear",false); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_w_17_c"); + body->SetFace(*monster,"f_w_17_"); + + //she uses crew hair... + monster->ghoulInst->SetPartOnOff("_medmhairmhead",false); + } + body->SetVoiceDirectories(*monster, "", 1, DEATHVOICE_FEMALE); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_CHEST); +} + +void fsibscience_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_sibscientist2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_sibscientist2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_18_m",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_w_18_",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_w_17_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_17_",VARIETY_PRIORITY_HIGHEST); +} + +void fsibscience_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC *myInstance; + qboolean altskin=false; + + generic_female_ai::Init(monster, ghoulname, subclass); + + if (!body || !monster->ghoulInst) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->ApplySkin(*monster, myInstance, "b", "b_sibscientist2"); + body->ApplySkin(*monster, myInstance, "a", "a_sibscientist2"); + + if (gi.irand(0,2)) + { + altskin=body->ApplySkin(*monster, myInstance, "h", "h_w_18_m"); + } + + if (altskin) + { + body->SetFace(*monster,"f_w_18_"); + if(gi.irand(0,1)) + { + monster->ghoulInst->SetPartOnOff("_crewhair",false); + monster->ghoulInst->SetPartOnOff("_lear",false); + monster->ghoulInst->SetPartOnOff("_rear",false); + } + else + { + monster->ghoulInst->SetPartOnOff("_medmhairmhead",false); + monster->ghoulInst->SetPartOnOff("_lbang",false); + monster->ghoulInst->SetPartOnOff("_rbang",false); + } + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_w_17_c"); + body->SetFace(*monster,"f_w_17_"); + //she uses crew hair... + monster->ghoulInst->SetPartOnOff("_medmhairmhead",false); + monster->ghoulInst->SetPartOnOff("_lbang",false); + monster->ghoulInst->SetPartOnOff("_rbang",false); + } + body->SetVoiceDirectories(*monster, "", 1, DEATHVOICE_FEMALE); + body->SetRootBolt(*monster); +} + +void irqwoman1_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqwoman1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqwoman1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_irqwoman1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_irqwoman1",VARIETY_PRIORITY_HIGHEST); +} + +void irqwoman1_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC *myInstance; + + generic_female_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->ApplySkin(*monster, myInstance, "b", "b_irqwoman1"); + body->ApplySkin(*monster, myInstance, "a", "a_irqwoman1"); + body->ApplySkin(*monster, myInstance, "h", "h_irqwoman1"); + body->ApplySkin(*monster, myInstance, "f", "f_irqwoman1"); + + body->SetVoiceDirectories(*monster, "npcf", 1, DEATHVOICE_FEMALE); + body->SetRootBolt(*monster); +} + +void irqwoman2_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqwoman2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqwoman2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_irqwoman2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_irqwoman2",VARIETY_PRIORITY_HIGHEST); +} + +void irqwoman2_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC *myInstance; + + generic_female_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->ApplySkin(*monster, myInstance, "b", "b_irqwoman2"); + body->ApplySkin(*monster, myInstance, "a", "a_irqwoman2"); + + body->ApplySkin(*monster, myInstance, "h", "h_irqwoman2"); + body->ApplySkin(*monster, myInstance, "f", "f_irqwoman2"); + + body->SetVoiceDirectories(*monster, "npcf", 1, DEATHVOICE_FEMALE); + body->SetRootBolt(*monster); +} + +void fraider_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_dcfemale",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_dcfemale",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_raider5",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_raider5",VARIETY_PRIORITY_HIGHEST); +} + +void fraider_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC *myInstance; + + generic_female_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetLeftHandWeapon(*monster, ATK_FLASHGREN); + body->SetRightHandWeapon(*monster, ATK_FLAMEGUN); + + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_tanks", "to_abolt_back", myInstance, "acc_tanks_cas", FEMALE_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_dcfemale"); + body->ApplySkin(*monster, myInstance, "a", "a_dcfemale"); + + body->ApplySkin(*monster, myInstance, "h", "h_raider5"); + body->ApplySkin(*monster, myInstance, "f", "f_raider5"); + + body->SetVoiceDirectories(*monster, "raf", 1, DEATHVOICE_FEMALE); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_FULL); +} + +void taylor_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_xtaylor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_xtaylor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_taylor",VARIETY_PRIORITY_HIGHEST); + + RegisterFaceSkins("f_taylor_", VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_taylor_n",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_taylor_b",VARIETY_PRIORITY_HIGHEST); + + RegisterTalkFaceSkins("f_taylor_n", VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_taylor_nt1",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_taylor_nt2",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_taylor_nt3",VARIETY_PRIORITY_HIGHEST); +} + +void taylor_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC *myInstance; + + generic_female_ai::Init(monster, ghoulname, subclass); + + SetSpecialBuddy(true); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + if ( !(monster->spawnflags & SPAWNFLAG_NO_WEAPONS) ) + { + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); + } + +// body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_backpack_smll", "to_abolt_back", myInstance, "acc_backpack_smll_dgrey", FEMALE_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_xtaylor"); + body->ApplySkin(*monster, myInstance, "a", "a_xtaylor"); + + body->ApplySkin(*monster, myInstance, "h", "h_taylor"); + body->SetFace(*monster,"f_taylor_"); + + body->SetVoiceDirectories(*monster, "taylor", 1, DEATHVOICE_FEMALE); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_FULL); +} + +void SP_m_nyc_fskinchick (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_FEMALE_SKINCHICK, self, "enemy/female", "skinchick"); + self->think = generic_grunt_init; +} + + +void SP_m_nyc_fwoman (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_FEMALE_NYWOMAN, self, "enemy/female", "nywoman"); + self->think = generic_npc_init; +} + +void SP_m_sib_fguard2 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_FEMALE_SIBGUARD, self, "enemy/female", "sibguard"); + self->think = generic_grunt_init; +} + +void SP_m_sib_fscientist2 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_FEMALE_SIBSCIENCE, self, "enemy/female", "sibscience"); + self->think = generic_npc_init; +} + +void SP_m_irq_fwoman1 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_FEMALE_IRQWOMAN1, self, "enemy/female", "irqwoman1"); + self->think = generic_npc_init; +} + +void SP_m_irq_fwoman2 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_FEMALE_IRQWOMAN2, self, "enemy/female", "irqwoman2"); + self->think = generic_npc_init; +} + +void SP_m_tok_fwoman1 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_FEMALE_TOKWOMAN1, self, "enemy/female", "tokwoman1"); + self->think = generic_npc_init; +} + +void SP_m_tok_fwoman2 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_FEMALE_TOKWOMAN2, self, "enemy/female", "tokwoman2"); + self->think = generic_npc_init; +} + +void SP_m_cas_ffemale (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_FEMALE_RAIDER, self, "enemy/female", "raider"); + self->think = generic_grunt_init; +} + +void SP_m_tok_fassassin (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_FEMALE_TOKASSASSIN, self, "enemy/female", "tokassassin"); + self->think = generic_grunt_init; +} + +void SP_m_x_ftaylor (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_FEMALE_TAYLOR, self, "enemy/female", "taylor"); + self->think = generic_grunt_init; +} diff --git a/Source/Game/gamecpp/m_female.h b/Source/Game/gamecpp/m_female.h new file mode 100644 index 0000000..0ed67e6 --- /dev/null +++ b/Source/Game/gamecpp/m_female.h @@ -0,0 +1,115 @@ + +class generic_female_ai : public generic_human_ai +{ +protected: +public: + virtual const char *GetInterpFile(char *theclass, char *subclass); + virtual void AddBody(edict_t *monster); +}; + + +class skinchick_ai : public generic_female_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return TEAM_SKINHEADS;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_FEMALE_SKINCHICK;}//this should be different for everybody in this class family +}; + +class nycwoman_ai : public generic_female_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_FEMALE_NYWOMAN;}//this should be different for everybody in this class family +}; + +class fsibguard_ai : public generic_female_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_FEMALE_SIBGUARD;}//this should be different for everybody in this class family +}; + +class fsibscience_ai : public generic_female_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_FEMALE_SIBSCIENCE;}//this should be different for everybody in this class family +}; + +class irqwoman1_ai : public generic_female_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int IsInnocent() { return 1; } + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_FEMALE_IRQWOMAN1;}//this should be different for everybody in this class family +}; + +class irqwoman2_ai : public generic_female_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int IsInnocent() { return 1; } + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_FEMALE_IRQWOMAN2;}//this should be different for everybody in this class family +}; + +class tokwoman1_ai : public generic_female_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_FEMALE_TOKWOMAN1;}//this should be different for everybody in this class family +}; + +class tokwoman2_ai : public generic_female_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_FEMALE_TOKWOMAN2;}//this should be different for everybody in this class family +}; + +class tokassassin_ai : public generic_female_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_FEMALE_TOKASSASSIN;}//this should be different for everybody in this class family +}; + +class fraider_ai : public generic_female_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_FEMALE_RAIDER;}//this should be different for everybody in this class family +}; + +class taylor_ai : public generic_female_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_FEMALE_TAYLOR;}//this should be different for everybody in this class family +}; diff --git a/Source/Game/gamecpp/m_generic.cpp b/Source/Game/gamecpp/m_generic.cpp new file mode 100644 index 0000000..fa89ae8 --- /dev/null +++ b/Source/Game/gamecpp/m_generic.cpp @@ -0,0 +1,3281 @@ +#include "g_local.h" +#include "ai_private.h" +#include "m_generic.h" +#include "..\qcommon\ef_flags.h" + +#define MERC_WEAPON_SCALE 1.142857142857 +#define MERC_OTHER_SCALE 1.142857142857 + + +edict_t *last_monster_used; + +/* +void BoltOnCraziness(ai_c &which_ai, edict_t *monster) +{ + + if (!which_ai.GetBody()) + { + return; + } + + ggOinstC *myInstance=which_ai.GetGhoulObj()->FindOInst(monster->ghoulInst); + + switch (rand()%3) + { + case 0: + which_ai.GetBody()->AddBoltedItem(*monster, "wbolt_hand_l", "Enemy/Bolt", "w_briefcase", "to_wbolt_hand_l", myInstance); + break; + case 1: + which_ai.GetBody()->SetRightHandWeapon(*monster, ATK_PISTOL2); + break; + default: + which_ai.GetBody()->SetRightHandWeapon(*monster, ATK_PISTOL1); + break; + } + switch (rand()%3) + { + case 0: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_norm"); + break; + case 1: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_sun"); + break; + default: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_goggles", "to_abolt_head_t", myInstance); + break; + } + switch (rand()%3) + { + case 0: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_backpack_lrg", "to_abolt_back", myInstance); + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_antenna", "to_abolt_back", myInstance); + break; + case 1: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_backpack_smll", "to_abolt_back", myInstance); + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_antenna", "to_abolt_back", myInstance); + break; + default: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_hip_r", "Enemy/Bolt", "acc_backpack_low", "to_abolt_hip_r", myInstance); + break; + } + switch (rand()%5) + { + case 0: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance); + break; + case 1: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_lrg", "to_abolt_hip_l", myInstance); + break; + case 2: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance); + break; + case 3: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_thigh_l", "Enemy/Bolt", "acc_machette", "to_abolt_thigh_l", myInstance); + break; + default: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_thigh_l", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_l", myInstance); + break; + } + switch (rand()%6) + { + case 0: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_r", myInstance); + break; + case 1: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_hip_lrg", "to_abolt_hip_r", myInstance); + break; + case 2: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_r", myInstance); + break; + case 3: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "abolt_hip_r", myInstance); + break; + case 4: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_thigh_r", "Enemy/Bolt", "acc_machette", "to_abolt_thigh_r", myInstance); + break; + default: + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_thigh_r", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_r", myInstance); + break; + } + + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_shoulder_l", "Enemy/Bolt", "acc_spikes_shlder", "to_abolt_shoulder_l", myInstance); + which_ai.GetBody()->AddBoltedItem(*monster, "abolt_shoulder_r", "Enemy/Bolt", "acc_spikes_shlder", "to_abolt_shoulder_r", myInstance); +} +*/ +////////////////////////////////////////////////////////////////////// +// sense +////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////// +// decision +////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////// +// ai +////////////////////////////////////////////////////////////////////// +void generic_human_ai::RegisterSkins(void) +{ +} + +void generic_human_ai::RegisterFaceSkin(const char *theMaterialName, const char *faceSkinName, expressionPriority_e expressionPriorityVal) +{ +} + +void generic_human_ai::RegisterSkin(const char *theMaterialName, const char *theSkinName, varietyPriority_e varietyPriorityVal) +{ + if ((varietyPriorityVal==VARIETY_PRIORITY_HIGHEST)||((float)varietyPriorityVal>(mskins_variety_limit->value-0.1))) + { + MyGhoulObj->RegisterSkin(theMaterialName, theSkinName); + } +} + +void generic_human_ai::RegisterGoreSkins(void) +{ + //register gorezones + RegisterSkin("gz","gz_sing1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("gz","gz_sing2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("gz","gz_sing3",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("gz","gz_sing_k",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("gz","gz_multi1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("gz","gz_multi2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("gz","gz_multi3",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("gz","gz_multi_k",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("gz","gz_mass1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("gz","gz_mass2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("gz","gz_mass3",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("gz","gz_mass_k",VARIETY_PRIORITY_HIGHEST); + + //caps + RegisterSkin("c","c_blood",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("c","c_black",VARIETY_PRIORITY_HIGHEST); +} + +void generic_human_ai::RegisterFaceSkins(const char *faceBase, varietyPriority_e varietyPriorityVal) +{ + if ((varietyPriorityVal==VARIETY_PRIORITY_HIGHEST)||((float)varietyPriorityVal>(mskins_variety_limit->value-0.1))) + { + char tface[20]; + sprintf(tface,"%sn",faceBase); + MyGhoulObj->RegisterSkin("f",tface); + sprintf(tface,"%sd",faceBase); + MyGhoulObj->RegisterSkin("f",tface); + + //pain face not vital, but good + if ((mskins_expression_limit->value-0.1)RegisterSkin("f",tface); + } + + //fear & mean faces not vital, but good + if ((mskins_expression_limit->value-0.1)RegisterSkin("f",tface); + sprintf(tface,"%sf",faceBase); + MyGhoulObj->RegisterSkin("f",tface); + } + + //blink face total fluff + if ((mskins_expression_limit->value-0.1)RegisterSkin("f",tface); + } + } +} + +void generic_human_ai::RegisterTalkFaceSkins(const char *faceBase, varietyPriority_e varietyPriorityVal) +{ + if ((varietyPriorityVal==VARIETY_PRIORITY_HIGHEST)||((float)varietyPriorityVal>(mskins_variety_limit->value-0.1))) + { + char tface[20]; + + //1st talk frame--highest priority + if ((mskins_expression_limit->value-0.1)RegisterSkin("f",tface); + } + + //2nd talk frame + if ((mskins_expression_limit->value-0.1)RegisterSkin("f",tface); + } + + //3rd talk frame--least priority + if ((mskins_expression_limit->value-0.1)RegisterSkin("f",tface); + } + } +} + +const char *generic_human_ai::GetInterpFile(char *theclass, char *subclass) +{ + //override specially for mesos (& possibly for ectos, females) + return NULL; +} + +void generic_human_ai::Init(edict_t *monster, char *theclass, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + Matrix4 mat,mat1,mat2; + + ai_c::Init(monster, theclass, subclass); + + //fixme? for client-side physics to be a reasonable approximate, dimensions should be multiples of 8 + InitBBoxPreset(BBOX_PRESET_STAND, -16, -16, -32, 16, 16, 41); // scaled-up 8/7ths + InitBBoxPreset(BBOX_PRESET_CROUCH, -16, -16, -16, 16, 16, 28); + InitBBoxPreset(BBOX_PRESET_PRONE, -32, -32, -8, 32, 32, 16); + InitBBoxPreset(BBOX_PRESET_ALLFOURS, -8, -8, -8, 8, 8, 0);//temporary!!!! + InitBBoxPreset(BBOX_PRESET_SIT, -32, -32, -8, 32, 32, 8); + InitBBoxPreset(BBOX_PRESET_LAYFRONT, -41, -41, -38, 41, 41, -24); + InitBBoxPreset(BBOX_PRESET_LAYBACK, -41, -41, -32, 41, 41, -24); + InitBBoxPreset(BBOX_PRESET_LAYSIDE, -41, -41, -32, 41, 41, -24); + InitBBoxPreset(BBOX_PRESET_NONE, 0, 0, 0, 0, 0, 0); + + //ick. if i'm a body part, use my parent's ghoulobj, not the level's monster ghoulobj + if (monster->owner && monster->owner->ghoulInst) + { + ggObjC *theParentObj=game_ghoul.FindObject(monster->owner->ghoulInst->GetGhoulObject()); + + MyGhoulObj=game_ghoul.FindObject(theParentObj->GetName(), theParentObj->GetSubName(), false, theParentObj->GetSkinName(), theParentObj->GetBaseFile()); + } + else + { + MyGhoulObj=game_ghoul.FindObject(theclass, subclass, false, GetObjectSkin(theclass,subclass), GetInterpFile(theclass,subclass)); + } + + if (!MyGhoulObj) + { + gi.error("Couldn't find enemy model %s/%s.\n",theclass,subclass); + } + + RegisterSkins(); + + MyGhoulObj->RegistrationLock(); + + if (!body) + { + return; + } + + game_ghoul.AddObjectInstance(MyGhoulObj, monster); + + + //only consider scaling if guy's scale hasn't already been messed with +/* if (scale > 0.99 && scale < 1.01) + { + if (!(monster->spawnflags & SPAWNFLAG_NOSCALE)) + { + scale = (gi.flrand(0.95,1.1)); + } + else + { + scale = 1.0; + } + } +*/ + monster->ghoulInst->GetXForm(mat); + mat1.Identity(); + mat2=mat; + mat1.Rotate(2,-M_PI*0.5); + mat.Concat(mat1, mat2); + mat2.Identity(); + mat1=mat; + mat2.Scale(scale); + mat.Concat(mat1, mat2); + monster->ghoulInst->SetXForm(mat); + + //need to call setrootbolt yet! don't forget in specifc init! +} + +//THIS is why i don't want this function overriden like crazy--to ensure +//that we don't load in multiple meso .ghb's on one level, it would be best +//if all mesos went through here +const char *generic_meso_ai::GetInterpFile(char *theclass, char *subclass) +{ + lev_interp_code curLevel = GetInterpCode(); + + switch (curLevel) + { + case LEVCODE_TUTORIAL: + return "meso_tut1"; + case LEVCODE_NYC_SUBWAY: + return "meso_nyc"; + case LEVCODE_NYC_SUBWAY2: + return "meso_tsr2"; + case LEVCODE_AFR_TRAIN: + return "meso_train"; + case LEVCODE_SIB_BASE: + return "meso_sib2"; + + case LEVCODE_KOS_SEWER: + return "meso_kos1"; + case LEVCODE_KOS_BIGGUN: + return "meso_kos2"; + case LEVCODE_KOS_HANGAR: + return "meso_kos3"; + case LEVCODE_SIB_CANYON: + return "meso_sib1"; + case LEVCODE_SIB_PLANT: + return "meso_sib3"; + + case LEVCODE_IRQ_TOWNA: + return "meso_irq1a"; + case LEVCODE_IRQ_BUNKER: + return "meso_irq2a"; + case LEVCODE_IRQ_CARGO: + return "meso_irq3a"; + case LEVCODE_NYC_WARE: + return "meso_nyc1"; + case LEVCODE_NYC_STEAM: + return "meso_nyc2"; + case LEVCODE_NYC_STREETS: + return "meso_nyc3"; + case LEVCODE_AFR_YARD: + return "meso_sud1"; + case LEVCODE_AFR_HOUSE: + return "meso_sud2"; + case LEVCODE_AFR_FACT: + return "meso_sud3"; + case LEVCODE_TOK_STREET: + return "meso_tok1"; + case LEVCODE_TOK_OFFICE: + return "meso_tok2"; + case LEVCODE_TOK_PENT: + return "meso_tok3"; + case LEVCODE_IRQ_STREETS: + return "meso_irq1b"; + + case LEVCODE_IRQ_FORT: + return "meso_irq2b"; + case LEVCODE_IRQ_OIL: + return "meso_irq3b"; + case LEVCODE_CAS_1: + return "meso_cas1"; + case LEVCODE_CAS_2: + return "meso_cas2"; + case LEVCODE_CAS_3: + return "meso_cas3"; + case LEVCODE_CAS_4: + return "meso_cas4"; + + case LEVCODE_ARM_1: + case LEVCODE_ARM_2: + case LEVCODE_ARM_3: + return "meso_arm"; + + + case LEVCODE_UNKNOWN: + break; + } + return "meso"; +} + +void generic_meso_ai::AddBody(edict_t *monster) +{ + if (!monster) + { + return; + } + body = new bodymeso_c(); +} + + + +////////////////////////////////////////////////////////////////////// +// Specialized corpse ai +////////////////////////////////////////////////////////////////////// + + +void playercorpse_ai::AddBody(edict_t *monster) +{ + //fixme: check what variety player (monster->owner?) is, and add meso or female body accordingly + if (!monster || !monster->owner || !monster->owner->client || !monster->owner->client->body) + { + gi.dprintf("Couldn't find player body for replication!\n"); + return; + } + body = body_c::NewClassForCode(monster->owner->client->body->GetClassCode()); +} + +#include "callback.h" +extern FollowGenericPivot TheFollowGenericPivot; + +action_c *playercorpse_ai::DeathAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + return new deathcorpse_action(od, oa, newanim, monster, inflictor, attacker, damage, point); +} + +void playercorpse_ai::Init(edict_t *monster, char *theclass, char* subclass) +{ + ggOinstC* myInstance; + +// generic_human_ai::Init(monster, theclass, subclass); + + //i don't like how the human init goes, so here's a rough approximation of it without the ghoulobj & inst creating (icky, i know): + if(body) + { + body->SetOwner(monster); + } + + if (!body || !monster->owner) + { + return; + } + + InitBBoxPreset(BBOX_PRESET_STAND, monster->owner->mins[0]-16, monster->owner->mins[1]-16, monster->owner->mins[2], monster->owner->maxs[0]+16, monster->owner->maxs[1]+16, monster->owner->maxs[2]); // scaled-up 8/7ths + InitBBoxPreset(BBOX_PRESET_CROUCH, monster->owner->mins[0]-16, monster->owner->mins[1]-16, monster->owner->mins[2], monster->owner->maxs[0]+16, monster->owner->maxs[1]+16, monster->owner->maxs[2]); + InitBBoxPreset(BBOX_PRESET_PRONE, monster->owner->mins[0]-16, monster->owner->mins[1]-16, monster->owner->mins[2], monster->owner->maxs[0]+16, monster->owner->maxs[1]+16, monster->owner->maxs[2]); + InitBBoxPreset(BBOX_PRESET_ALLFOURS, monster->owner->mins[0]-16, monster->owner->mins[1]-16, monster->owner->mins[2], monster->owner->maxs[0]+16, monster->owner->maxs[1]+16, monster->owner->maxs[2]);//temporary!!!! + InitBBoxPreset(BBOX_PRESET_SIT, monster->owner->mins[0]-16, monster->owner->mins[1]-16, monster->owner->mins[2], monster->owner->maxs[0]+16, monster->owner->maxs[1]+16, monster->owner->maxs[2]); + InitBBoxPreset(BBOX_PRESET_LAYFRONT, monster->owner->mins[0]-16, monster->owner->mins[1]-16, monster->owner->mins[2], monster->owner->maxs[0]+16, monster->owner->maxs[1]+16, monster->owner->maxs[2]); + InitBBoxPreset(BBOX_PRESET_LAYBACK, monster->owner->mins[0]-16, monster->owner->mins[1]-16, monster->owner->mins[2], monster->owner->maxs[0]+16, monster->owner->maxs[1]+16, monster->owner->maxs[2]); + InitBBoxPreset(BBOX_PRESET_LAYSIDE, monster->owner->mins[0]-16, monster->owner->mins[1]-16, monster->owner->mins[2], monster->owner->maxs[0]+16, monster->owner->maxs[1]+16, monster->owner->maxs[2]); + InitBBoxPreset(BBOX_PRESET_NONE, monster->owner->mins[0]-16, monster->owner->mins[1]-16, monster->owner->mins[2], monster->owner->maxs[0]+16, monster->owner->maxs[1]+16, monster->owner->maxs[2]); + + game_ghoul.RemoveObjectInstances(monster); + + monster->s.renderfx=monster->owner->s.renderfx; + monster->s.number = monster - g_edicts; + + if (monster->owner && monster->owner->client && monster->owner->client->body && monster->owner->client->body->GetMove()) + { + body->SetRootBolt(*monster);//ick--i'm going to do this later, but to make ::Die call not freak out, i need to do it here too + NewAction(DeathAction(NULL, NULL, monster->owner->client->body->GetMove(), *monster, NULL, NULL, 1, vec3_origin), monster, true); + + //eek! Since I don't have an inst yet, I need to set the move by hand, and without setting an animation! + body->SetMove(monster->owner->client->body->GetMove()); + + Die (*monster, NULL, NULL, 0, vec3_origin, 0); + } + + //dangerous, fast way of doing corpse ghoulInsts + if (monster->owner && monster->owner->ghoulInst) + { + MyGhoulObj=game_ghoul.FindObject(monster->owner->ghoulInst->GetGhoulObject()); + if (MyGhoulObj) + { + myInstance=MyGhoulObj->FindOInst(monster->owner->ghoulInst); + if (myInstance) + { + myInstance->ChangeOwnerTo(monster); + } + } + } + + body->SetRootBolt(*monster); + + body->Emote(*monster, EMOTION_DEAD, 999999.9); + + monster->ghoulInst->SetMyBolt("quake_ground"); + + //this fixes spinny corpses, because we're no longer bolted to quake_origin... + GhoulID tempBolt=monster->ghoulInst->GetGhoulObject()->FindPart("quake_origin"); + monster->ghoulInst->RemoveMatrixCallBack(&TheFollowGenericPivot,tempBolt,IGhoulInst::MatrixType::JacobianEntity); + + monster->owner=NULL; + + if(myInstance) + { + ggBinstC *boltedptr; + + boltedptr=myInstance->GetBoltInstance(monster->ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r")); + if (boltedptr) + { + myInstance->RemoveBoltInstance(boltedptr); + } + } +} + + + +blownpart_ai::blownpart_ai(blownpart_ai *orig) +: generic_human_ai(orig) +{ + severTime = orig->severTime; + removeMe = orig->removeMe; + Stopped = orig->Stopped; + frozen = orig->frozen; + bFading = orig->bFading; +} + + +void blownpart_ai::Evaluate(blownpart_ai *orig) +{ + severTime = orig->severTime; + removeMe = orig->removeMe; + Stopped = orig->Stopped; + frozen = orig->frozen; + bFading = orig->bFading; + + generic_human_ai::Evaluate(orig); +} + +const char *blownpart_ai::GetInterpFile(char *theclass, char *subclass) +{ + if (ent && ent->owner) + { + if (ent->owner->ai) + { + return ent->owner->ai->GetInterpFile(theclass, subclass); + } + else if (ent->owner->client)//FIXME--COULD BE A FEMALE!!! + { + if (!stricmp(theclass, "enemy/meso")) + { + return "meso_player"; + } + if (!stricmp(theclass, "enemy/female")) + { + return "fem_play"; + } + } + } + return NULL; +} + +const char *blownpart_ai::GetObjectSkin(char *theclass, char *subclass) +{ + if (ent && ent->owner && ent->owner->ghoulInst) + { + ggObjC *theParentObj=game_ghoul.FindObject(ent->owner->ghoulInst->GetGhoulObject()); + if (theParentObj) + { + return theParentObj->GetSkinName(); + } + } + return NULL; +} + +void blownpart_ai::Init(edict_t *monster, char *theclass, char* subclass) +{ + generic_human_ai::Init(monster, theclass, subclass); + + //make sure I've got the same ghoul object as who I used to be attached to + if (monster->owner && monster->owner->ghoulInst && monster->owner->ghoulInst->GetGhoulObject() != MyGhoulObj->GetMyObject()) + { + ggObjC *theParentObj=game_ghoul.FindObject(monster->owner->ghoulInst->GetGhoulObject()); + gi.dprintf("Warning! Blown-off limb has object%s-%s-%s; parent has %s-%s-%s\n", MyGhoulObj->GetName(), MyGhoulObj->GetSubName(), MyGhoulObj->GetSkinName(), theParentObj->GetName(), theParentObj->GetSubName(), theParentObj->GetSkinName()); + game_ghoul.RemoveObjectInstances(monster); + MyGhoulObj=game_ghoul.FindObject(monster->owner->ghoulInst->GetGhoulObject()); + game_ghoul.AddObjectInstance(MyGhoulObj, monster); + } + + removeMe = false; + Stopped = false; + frozen=false; + bFading=false; + severTime = 0; +} +void debug_drawbox(edict_t* self,vec3_t vOrigin, vec3_t vMins, vec3_t vMaxs, int nColor); + +void blownpart_ai::Think(edict_t &monster) +{ + if (bFading) + { + G_FreeEdict(&monster); + return; + } + + if (!severTime) + { + severTime = level.time - 0.1; + } + + //stop bolt animation + if (!frozen && (level.time > severTime + 1)) + { + if (MyGhoulObj) + { + ggOinstC *myInstance; + + myInstance=MyGhoulObj->FindOInst(monster.ghoulInst); + if (myInstance) + { + frozen = true; + myInstance->StopAnimatingAtAllBolts(); + } + } + } + + if (removeMe) + { + int i; + bool freeMe=true; + edict_t *ent; + vec3_t ent_facing, ent_to_me; + + //if it's been over 60 seconds since i was severed, git ridda me no matter what. + if (level.time-severTimeinuse) + { + continue; + } + VectorSubtract(ent->s.origin, monster.s.origin, ent_to_me); + + //if e's greater than 800 units away, assume he can't see me + if (VectorLengthSquared(ent_to_me)>640000) + { + continue; + } + + //if client can't possibly see me, will have no effect on whether i remove or no + if (!gi.inPVS(monster.s.origin, monster.s.origin)) + { + continue; + } + AngleVectors(ent->s.angles, ent_facing, NULL, NULL); + VectorNormalize(ent_to_me); + //if client is looking in my general dir, don't remove for sure + if (DotProduct(ent_to_me, ent_facing)<.2) + { + freeMe = false; + break; + } + } + } + + if (freeMe) + { + FXA_SetFadeOut(&monster, BLOWN_PART_FADE); + + // Come back when we are done fading. + monster.nextthink=level.time+BLOWN_PART_FADE+0.1; + bFading = true; + return; + } + } + + + if (!Stopped) + { +// gi.sound (&monster, CHAN_BODY, gi.soundindex ("impact/gore/limbfall.wav"), .6, ATTN_NORM, 0); + + if (VectorLengthSquared(monster.velocity)<10||level.time-severTime>BODY_PART_MAXLIFE) + { + + VectorClear(monster.avelocity); + VectorClear(monster.velocity); + + + if (monster.avelocity[0]) + { + monster.s.angles[0]=-90; + monster.s.angles[2]=0; + } + VectorClear(monster.avelocity); + removeMe = true; + monster.nextthink=level.time+5; + if (!frozen) + { + monster.nextthink=level.time+.1; + } + + + + // once we've stopped, switch over to the stand anim + // monster.ghoulInst->Play(GetBody()->GetSequence(*this, monster, &generic_move_stand),level.time,0.0,true,IGhoulInst::Hold, false, false); + + Stopped = true; + return; + } + + if (monster.s.angles[0] <= -85) + { + monster.s.angles[0]=-90; + monster.s.angles[2]=0; + VectorClear(monster.avelocity); + } + } + +/* if ((Stopped) && (!(irand(0,100)))) + { + if (((bodyhuman_c*)GetBody())->VerifySequence(*this, monster, &generic_move_limb_jitter, 0)) + { + monster.ghoulInst->Play(GetBody()->GetSequence(*this, monster, &generic_move_limb_jitter),level.time,0.0,true,IGhoulInst::Hold, false, false); + monster.nextthink=level.time+5; + return; + } + } +/*I'm taking this out for now because it does some gay bounding-box crap that really sucks when it twitches + +*/ + monster.nextthink = level.time + .1; +} + + +// use the ai_c constructor designed for the heli so that it won't call AddBody(). we want +//our generic_ghoul_dog_ai constructor to call that so we'll get a dog body +void generic_ghoul_dog_ai::Init(edict_t *monster, char *theclass, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + Matrix4 mat,mat1,mat2; + + ggOinstC *myInstance; + + ai_c::Init(monster, theclass, subclass); + +// group = new group_c(); + + InitBBoxPreset(BBOX_PRESET_STAND, -24, -24, -20, 24, 24, 20); // set for dog + InitBBoxPreset(BBOX_PRESET_CROUCH, -16, -16, -16, 16, 16, 8); // set for human + InitBBoxPreset(BBOX_PRESET_PRONE, -32, -32, -8, 32, 32, 8); // set for human + InitBBoxPreset(BBOX_PRESET_ALLFOURS, -24, -24, -8, 24, 24, 8); // set for human + InitBBoxPreset(BBOX_PRESET_SIT, -32, -32, -8, 32, 32, 8); // set for human + InitBBoxPreset(BBOX_PRESET_LAYFRONT, -32, -32, -26, 32, 32, 8); // set for dog + InitBBoxPreset(BBOX_PRESET_LAYBACK, -24, -24, -32, 24, 24, -24); // set for human + InitBBoxPreset(BBOX_PRESET_LAYSIDE, -32, -32, -28, 32, 32, 16); // set for dog + InitBBoxPreset(BBOX_PRESET_NONE, 0, 0, 0, 0, 0, 0); // set for dog + + + MyGhoulObj=game_ghoul.FindObject(theclass,subclass); + + if (!body || !MyGhoulObj) + { + return; + } + + myInstance = game_ghoul.AddObjectInstance(MyGhoulObj, monster); + + + if (!(monster->spawnflags & SPAWNFLAG_NOSCALE)) + { + scale = gi.flrand(1.0F, 1.15F); + } + else + { + scale = 1.0; + } + monster->ghoulInst->GetXForm(mat); + mat1=mat2=mat; + mat1.Rotate(2,-M_PI*0.5); + mat2.Scale(scale); + mat.Concat(mat1, mat2); + monster->ghoulInst->SetXForm(mat); + +// body->SetVoiceDirectories(*monster, "soldier", 2, DEATHVOICE_DEFAULT);//heh? + body->SetRootBolt(*monster); + + // I guess precache sounds here + gi.soundindex("Enemy/Dog/Bark1.wav"); + gi.soundindex("Enemy/Dog/Bark2.wav"); + gi.soundindex("Enemy/Dog/Bark3.wav"); + gi.soundindex("Enemy/Dog/Bite1.wav"); + gi.soundindex("Enemy/Dog/Bite2.wav"); + gi.soundindex("Enemy/Dog/Die.wav"); + gi.soundindex("Enemy/Dog/Pain.wav"); + + //set up some statistics for the dog + CAISkills newSkills(16, 72, 0, 1, 0, 0, 200, 1.0, AIS_NOSUPPRESS|AIS_CHEATERSEARCH|AIS_NODUCK, + ESSA_ATTACK_DIRECTION, ESFK_IGNORE, + ESAT_APPROACH, ESOR_APPROACH, ESTC_HOLD_POSITION, ESEX_IGNORE);//irk + + mySkills = newSkills; + +} + +void generic_ghoul_dog_ai::AddBody(edict_t *monster) +{ + if (!monster) + { + return; + } +// if (!body) +// { +// body = new bodydog_c(); +// } +} + +void dog_husky_ai::AddBody(edict_t *monster) +{ + if (!monster) + { + return; + } + if (!body) + { + body = new bodyhusky_c(); + } +} + +void dog_rottweiler_ai::AddBody(edict_t *monster) +{ + if (!monster) + { + return; + } + if (!body) + { + body = new bodyrott_c(); + } +} + +action_c *generic_ghoul_dog_ai::AttackAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t attackPos, vec3_t facing, float timeout, qboolean fullAnimation) +{ + return new running_melee_attack_action(od, oa, newanim, attackTarget, attackPos, facing, timeout,fullAnimation); +} + +action_c *generic_ghoul_dog_ai::WalkAction(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing, float timeout, qboolean fullAnimation) +{ + return new dog_walk_action(od, oa, newanim, destination, facing, timeout,fullAnimation); +} + + +// use the ai_c constructor designed for the heli so that it won't call AddBody(). we want +//our cow_ai constructor to call that so we'll get a cow body +void cow_ai::Init(edict_t *monster, char *theclass, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + Matrix4 mat,mat1,mat2; + + ggOinstC *myInstance; + + ai_c::Init(monster, theclass, subclass); + +// group = new group_c(); + + InitBBoxPreset(BBOX_PRESET_STAND, -24, -14, -20, 36, 14, 20); // set for cow + InitBBoxPreset(BBOX_PRESET_CROUCH, -16, -16, -16, 16, 16, 8); // set for human + InitBBoxPreset(BBOX_PRESET_PRONE, -32, -32, -8, 36, 32, 8); // set for dog + InitBBoxPreset(BBOX_PRESET_ALLFOURS, -24, -24, -8, 24, 24, 8); // set for human + InitBBoxPreset(BBOX_PRESET_SIT, -32, -32, -8, 32, 32, 8); // set for human + InitBBoxPreset(BBOX_PRESET_LAYFRONT, -32, -32, -26, 32, 32, 8); // set for dog + InitBBoxPreset(BBOX_PRESET_LAYBACK, -24, -24, -32, 24, 24, -24); // set for human + InitBBoxPreset(BBOX_PRESET_LAYSIDE, -22, -26, -20, 36, 26, 0); // set for cow + InitBBoxPreset(BBOX_PRESET_NONE, 0, 0, 0, 0, 0, 0); // set for dog + + + MyGhoulObj=game_ghoul.FindObject(theclass,subclass); + + if (!body || !MyGhoulObj) + { + return; + } + + myInstance = game_ghoul.AddObjectInstance(MyGhoulObj, monster); + + + if (!(monster->spawnflags & SPAWNFLAG_NOSCALE)) + { + scale = 1.5; + } + else + { + scale = 1.5; + } + monster->ghoulInst->GetXForm(mat); + mat1=mat2=mat; + mat1.Rotate(2,-M_PI*0.5); + mat2.Scale(scale); + mat.Concat(mat1, mat2); + monster->ghoulInst->SetXForm(mat); + +// body->SetVoiceDirectories(*monster, "soldier", 2, DEATHVOICE_DEFAULT);//heh? + body->SetRootBolt(*monster); + + // I guess precache sounds here + gi.soundindex("Enemy/Cow/Moo1.wav"); + gi.soundindex("Enemy/Cow/Moo2.wav"); + gi.soundindex("Enemy/Cow/Die.wav"); +} + +void cow_ai::AddBody(edict_t *monster) +{ + if (!monster) + { + return; + } + if (!body) + { + body = new bodycow_c(); + } +} + + + + +/*QUAKED m_x_romulan (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +*/ +/*QUAKED m_x_rottweiler (1 .5 0) (-32 -32 -23) (32 32 14) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +an animal +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this guy dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_husky (1 .5 0) (-33 -33 -28) (33 33 16) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +an animal +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_germanshep (1 .5 0) (-33 -33 -28) (33 33 16) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +an animal +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_raiderdog (1 .5 0) (-33 -33 -28) (33 33 16) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +an animal +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_bull (1 .5 0) (-30 -14 -33) (56 14 26) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +an animal +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + +/*QUAKED m_sib_mtrooper1a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_sib_mtrooper1b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_sib_mtrooper2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_sib_mguard1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_sib_fguard2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_sib_mguard3 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_sib_mguard4 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_sib_mcleansuit (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_sib_mmechanic (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_sib_escientist1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_sib_fscientist2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_sib_eofficer (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_afr_ecommander (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_afr_msniper (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_afr_msoldier1a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_afr_msoldier1b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_afr_msoldier2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_afr_msoldier3 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_afr_eworker (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_afr_mbrute (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_afr_mrocket (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_kos_mgrunt1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_kos_mgrunt2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_kos_mgrunt3 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_kos_msniper1a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_kos_msniper1b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_kos_mcomtroop (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_kos_eofficer (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_kos_mbrute1a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_kos_mbrute1b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_kos_mmechanic (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_kos_mrebel (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_kos_mklaleader (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_kos_erefugee (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_tok_mman1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_tok_mman2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_tok_mhench1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_tok_mhench2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_tok_mkiller (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_tok_fassassin (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_tok_mninja (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_tok_mbrute (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_tok_fwoman1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_tok_fwoman2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_msoldier2b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_mrepguard1b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_mcommander (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_mbrute1a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_mbrute1b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_mrocket (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_msaddam (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_fwoman1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_fwoman2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_mman2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_mbodyguard (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_mpolice (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_msoldier1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_msoldier2a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_mrepguard1a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_eofficer (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_eman1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_irq_moilworker (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_cas_mraider1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_cas_mraider2a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_cas_mraider2b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_cas_mbrute (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_cas_ffemale (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_cas_mrocket (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_nyc_mpolitician (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_nyc_etourist (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_nyc_mpunk (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + +/*QUAKED m_nyc_epunk (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + +/*QUAKED m_nyc_eskinhead3 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_nyc_mskinhead1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_nyc_mskinhead2a (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_nyc_mskinhead2b (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_nyc_fskinchick (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_nyc_ebum (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_nyc_estockbroker (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_nyc_mswat (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_nyc_mswatleader (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_nyc_fwoman (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_mcharacter (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_mcharacter_snow (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_mcharacter_desert (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_mraiderboss1 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human with desert eagle +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_mraiderboss2 (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human with mpg +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_ftaylor (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_mskinboss (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_mmerc (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_mhurtmerc (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +hawk, all beat up +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_msam (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE FACE_PLAYER +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. +FACE_PLAYER: always faces the player. set wait to 0 to turn off, 1 to turn back on. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ +/*QUAKED m_x_miraqboss (1 .5 0) (-16 -16 -40) (16 16 40) ECON_OVERRIDE BLIND DEAF NOSCALE TRIGGER_SPAWN SENSE_MUTE START_ACTIVE HOLD_POSITION NEVER_STARTLED HOSTAGE NO_ARMOR ARMOR_PICKUP NO_WEAPONS NO_WOUND HAS_PROJECTILE +a human +--------SPAWNFLAGS---------- +ECON_OVERRIDE: specify cash value +BLIND: cannot see (turns off when script finishes) +DEAF: cannot hear (turns off when script finishes) +NOSCALE: don't apply random scaling; use standard size +TRIGGER_SPAWN: doesn't show up until triggered, or mentioned in a script +SENSE_MUTE: cone of vision is severely reduced +NEVER_STARTLED: don't play startled sequence for this guy +HOSTAGE: npc's only. use in conjunction with worldspawn.maxdeadhostages +NO_ARMOR: when this meso dies it won't spawn an item_equip_armor +ARMOR_PICKUP: we're only spawning this guy as an armor-yielding corpse. MUST HAVE UNIQUE TARGETNAME!!! +NO_WEAPONS: yup. you guessed it. no weapons. +NO_WOUND HAS_PROJECTILE: this guy will never drop his weapon. you'll have to kill him. + +--------FIELDS-------------- +alertradius: distance from player which will automatically alert monster +*/ + +void generic_monster_touch(edict_t *who, edict_t *user, cplane_s *theplane, mtexinfo_s *thetexinfo) +{ + if ((user->client) && (who->movetype != MOVETYPE_NONE) && (who->movetype != MOVETYPE_BOUNCE) && (who->movetype != MOVETYPE_PUSH) && (who->movetype != MOVETYPE_STOP)) + { + who->ai->TouchMonster(user); + } +} + +void generic_monster_use(edict_t *who, edict_t *user, edict_t *activator) +{ + if ((user->client) && (who->movetype != MOVETYPE_NONE) && (who->movetype != MOVETYPE_BOUNCE) && (who->movetype != MOVETYPE_PUSH) && (who->movetype != MOVETYPE_STOP)) + { + + last_monster_used = who; + +// if (who->ai && OnSameTeam(who, user)) +// { +// who->ai->SetAbusedByTeam(true); +// } + who->ai->UseMonster(user); + +//#ifdef _DEBUG + if (ai_pathtest->value) + { + vec3_t dir; + vec3_t kvel; + float mass; + + //push the guy + if (who->mass < 50) + { + mass = 50; + } + else + { + mass = who->mass; + } + + VectorSubtract(who->s.origin, user->s.origin, dir); + VectorNormalize(dir); + + VectorScale (dir, 50000.0 / mass, kvel); + + VectorAdd (who->velocity, kvel, who->velocity); + who->groundentity = NULL; + //...end pushing the guy + + + edict_t *curPt=NULL; + gi.dprintf("starting path_corner anim list:\n"); + while ((curPt = G_Find (curPt, FOFS(classname), "path_corner"))) + { + if (curPt->wait_action1) + gi.dprintf("%s.ghl\n",curPt->wait_action1->ghoulSeqName); + if (curPt->wait_action2) + gi.dprintf("%s.ghl\n",curPt->wait_action2->ghoulSeqName); + if (curPt->wait_action3) + gi.dprintf("%s.ghl\n",curPt->wait_action3->ghoulSeqName); + if (curPt->wait_action4) + gi.dprintf("%s.ghl\n",curPt->wait_action4->ghoulSeqName); + if (curPt->wait_action5) + gi.dprintf("%s.ghl\n",curPt->wait_action5->ghoulSeqName); + if (curPt->wait_action6) + gi.dprintf("%s.ghl\n",curPt->wait_action6->ghoulSeqName); + if (curPt->move_action) + gi.dprintf("%s.ghl\n",curPt->move_action->ghoulSeqName); + } + gi.dprintf("end path_corner anim list, starting point_combat:\n"); + while ((curPt = G_Find (curPt, FOFS(classname), "point_combat"))) + { + if (curPt->wait_action1) + gi.dprintf("%s.ghl\n",curPt->wait_action1->ghoulSeqName); + if (curPt->wait_action2) + gi.dprintf("%s.ghl\n",curPt->wait_action2->ghoulSeqName); + if (curPt->wait_action3) + gi.dprintf("%s.ghl\n",curPt->wait_action3->ghoulSeqName); + if (curPt->wait_action4) + gi.dprintf("%s.ghl\n",curPt->wait_action4->ghoulSeqName); + if (curPt->wait_action5) + gi.dprintf("%s.ghl\n",curPt->wait_action5->ghoulSeqName); + if (curPt->wait_action6) + gi.dprintf("%s.ghl\n",curPt->wait_action6->ghoulSeqName); + if (curPt->move_action) + gi.dprintf("%s.ghl\n",curPt->move_action->ghoulSeqName); + } + gi.dprintf("end point_combat anim list.\n"); + } +//#endif //_DEBUG + } +} + +void generic_monster_activate(edict_t *who, edict_t *user, edict_t *activator) +{ + if (who && who->ai) + { + //if i'm not there, make me be there + if ((!who->ai->IsActive())&&(who->spawnflags&SPAWNFLAG_TRIGGER_SPAWN)) + { + // Destroy Any Who Oppose Me!!! + CRadiusContent rad(who->s.origin, 40, 1, 0, 1); + + for(int i = 0; i < rad.getNumFound(); i++) + { + if(rad.foundEdict(i)->flags & FL_SPAWNED_IN) + { // this guys just escape + rad.foundEdict(i)->ai->Escape(*rad.foundEdict(i)); + } +/* else // maybe do this later, but I must admit this scares me a bit + { // these guys just die - they are in the way + T_Damage(rad.foundEdict(i), who, who, vec3_up, who->s.origin, who->s.origin, 1000, 0, 0, 0);//? + }*/ + } + + who->ai->Activate(*who); + } + //if i'm there, make me target the activator + else + { + if (who->spawnflags&SPAWNFLAG_BLIND) + { + who->ai->NewSense(new normalsight_sense(), who); + who->spawnflags&=(~SPAWNFLAG_BLIND); + } + if (who->spawnflags&SPAWNFLAG_DEAF) + { + who->ai->NewSense(new sound_sense(), who); + who->spawnflags&=(~SPAWNFLAG_DEAF); + } + + if (!who->ai->IsActive()) + { + who->ai->Activate(*who); + } + if (activator) + { + who->ai->SetTargetTime(level.time, activator, activator->s.origin); + + //is this necessary still? if i'm adding the settarget time above, don't know if this is needed... + gmonster.MakeSound(who,activator->s.origin,level.time,activator,AI_SENSETYPE_SOUND_MAGICAL); + } + } + } +} + +void generic_monster_init (edict_t *self) +{ + edict_t *ent; + + if (self->target) + { + ent = G_PickTarget (self->target); + if (ent && !strcmp(ent->classname, "path_corner")) + { + self->ai->NewDecision(new pathidle_decision(ent), self); + } + else if (ent && !strcmp(ent->classname, "point_combat")) + { + self->ai->NewDecision(new pathcombat_decision(ent), self); + self->ai->SetStartleability(false); + } + } + + if (self->combattarget) + { + ent = G_PickTarget (self->combattarget); + if (ent && !strcmp(ent->classname, "point_combat")) + { + self->ai->NewDecision(new pathcombat_decision(ent), self); + self->ai->SetStartleability(false); + } + } + + if (self->spawnflags & SPAWNFLAG_NO_ARMOR) + { // needs to be set if we're going to perform a scripted kill on this joker + if ( ((ai_c*)((ai_public_c*)self->ai))->GetBody()) + { + ((bodyorganic_c*)((ai_c*)((ai_public_c*)self->ai))->GetBody())->SetArmor(*self, ARMOR_NONE); + } + } + + if (self->spawnflags & SPAWNFLAG_HOSTAGE) + { // need to know when hostages get capped + self->ai->SetHostage(true); + } + + if (self->spawnflags&SPAWNFLAG_NEVER_STARTLED) + { + self->ai->SetStartleability(false); + } + + if (!(self->spawnflags&SPAWNFLAG_DEAF)) + { + self->ai->NewSense(new sound_sense(), self); + } + + if (!(self->spawnflags&SPAWNFLAG_BLIND)) + { + self->ai->NewSense(new normalsight_sense(), self); + } + + if (self->spawnflags&SPAWNFLAG_HOLD_POSITION) + { + self->flags |= FL_NO_KNOCKBACK; + } + + //magically see guys within my alertRadius + //default to 75 + if (self->alertRadius<0.1) + { + self->alertRadius=75.0f; + } + self->ai->NewSense(new magicsight_sense(self->alertRadius), self); + + if (ai_pathtest->value) + { + self->ai->NewSense(new omniscience_sense(), self); + } + + self->nextthink = level.time + FRAMETIME; + self->plUse = generic_monster_use; + self->touch = generic_monster_touch; + self->use = generic_monster_activate; +} + +void dekker_init (edict_t *self) +{ + generic_monster_init(self); + self->ai->NewDecision(new dekker1_decision(), self); + self->ai->NewDecision(new dekker2_decision(), self); + self->ai->NewDecision(new dekker3_decision(), self); + self->ai->NewDecision(new dekker4_decision(), self); + self->ai->NewDecision(new dodge_decision(), self); + + self->ai->SetRank(3); + + self->ai->NewSense(new omniscience_sense(), self); +} + +void generic_leader_init (edict_t *self) +{ + generic_monster_init(self); + self->ai->NewDecision(new pursue_decision(), self); + self->ai->NewDecision(new pointcombat_decision(), self); + self->ai->NewDecision(new search_decision(), self); + self->ai->NewDecision(new retreat_decision(), self); + self->ai->NewDecision(new dodge_decision(), self); + + self->ai->SetRank(3); +} + +void generic_grunt_init (edict_t *self) +{ + generic_monster_init(self); + self->ai->NewDecision(new pursue_decision(), self); + self->ai->NewDecision(new pointcombat_decision(), self); + self->ai->NewDecision(new search_decision(), self); + self->ai->NewDecision(new retreat_decision(), self); + self->ai->NewDecision(new dodge_decision(), self); +} + +void generic_heavyweapons_init (edict_t *self) +{ + generic_monster_init(self); + self->ai->NewDecision(new pursue_decision(), self); + self->ai->NewDecision(new pointcombat_decision(), self); + self->ai->NewDecision(new search_decision(), self); + self->ai->NewDecision(new retreat_decision(), self); + self->ai->SetRank(2); +} + +void generic_enemy_npc_init (edict_t *self) +{ + generic_monster_init(self); + self->ai->NewDecision(new pursue_decision(), self); + self->ai->NewDecision(new pointcombat_decision(), self); + self->ai->NewDecision(new retreat_decision(), self); +} + +void generic_npc_init (edict_t *self) +{ + generic_monster_init(self); + self->ai->NewDecision(new pursue_decision(), self); + self->ai->NewDecision(new retreat_decision(), self); +} + +void generic_animal_init (edict_t *self) +{ + generic_monster_init(self); + self->ai->NewDecision(new pursue_decision(), self); +} + +void generic_armor_init (edict_t *self) +{ + // used when a meso is being created just so he can be dead and yield armor. + //rather morbid, actually. + + // call magic ai function here to forcefeed a deatharmor_action into the entity + if (self->ai) + { + // spawn an armor pickup over his corpse + if ( ((ai_c*)(ai_public_c*)self->ai)->GetBody() ) + { + edict_t *armor = G_Spawn(); + armor->count = self->count; + VectorCopy(self->s.origin, armor->s.origin); + armor->s.origin[2] += (self->maxs[2] - armor->mins[2] + 2); + VectorCopy(self->s.angles, armor->s.angles); + // set this armor's target to the targetname of the spawning corpse so we + //can find it later in deatharmor_action::SafeToRemove() + armor->target = self->targetname; + // remove armor from corpse + ((ai_c*)(ai_public_c*)self->ai)->GetBody()->StripArmor(); + I_SpawnArmor(armor); + } + + ((ai_c*)(ai_public_c*)self->ai)->NewDeathArmorAction(*self); + } + self->nextthink = level.time + FRAMETIME; +} + + +//set think to yer specific init, then call me. +void generic_monster_spawnnow (edict_t *self) +{ + self->s.renderfx = RF_GHOUL|RF_GHOUL_SHADOW; + + //basic physics stuff: + //FIXME!!!! GAG! this should prolly be handled differently--i hadn't noticed the switch off movetype Before think is called + self->movetype = MOVETYPE_STEP; + + //testing flying fellows +// self->movetype = MOVETYPE_FLY; +// self->flags|=FL_FLY; + + //this too--case statement magnet + self->solid = SOLID_BBOX; + + self->friction = 0.01; // this friction value must be changed on death to alleviate corpse floating + + VectorSet (self->mins, -16, -16, -32); + VectorSet (self->maxs, 16, 16, 41); + self->mass = 200; + //end basic physics stuff + + //hold off on the ai til i've had a chance to init.--ever'thing need to get its name straight + self->svflags |= SVF_MONSTER; + self->nextthink = level.time + FRAMETIME; + + //this stuff is fine--basic actor set-up + self->health = self->max_health = 100; + self->gibbed = false; + + if (ai_goretest->value) + { + self->health = self->max_health = 1000; + } + + self->takedamage = DAMAGE_AIM; + + if (!(self->spawnflags & SPAWNFLAG_TRIGGER_SPAWN) && level.time < 1) + { + gmonster.DropToFloor (self); + } + self->solid = SOLID_NOT; + + self->viewheight = 0; + + + gi.linkentity (self); + +/* if (self->spawnflags & SPAWNFLAG_ECON_OVERRIDE) + { + game.GameStats->AddMonsterToStatsList(self, st.killedValue, st.survivalValue); + } + else + { + game.GameStats->AddMonsterToStatsList(self); + }*/ +} + +// call me instead of monster_spawnnow if you're spawning a meso just to have him +//be dead and yield armor +void generic_armor_spawnnow (edict_t *self) +{ + self->s.renderfx = RF_GHOUL; + + //basic physics stuff: + //FIXME!!!! GAG! this should prolly be handled differently--i hadn't noticed the switch off movetype Before think is called + self->movetype = MOVETYPE_STEP; + + //this too--case statement magnet + self->solid = SOLID_BBOX; + + self->friction = 0.01; // this friction value must be changed on death to alleviate corpse floating + + VectorSet (self->mins, -16, -16, -32); + VectorSet (self->maxs, 16, 16, 41); + self->mass = 200; + //end basic physics stuff + + //hold off on the ai til i've had a chance to init.--ever'thing need to get its name straight + self->svflags |= SVF_MONSTER; + self->nextthink = level.time + FRAMETIME; + + //this stuff is fine--basic actor set-up + self->health = 0; + self->max_health = 100; + + if (ai_goretest->value) + { + self->health = self->max_health = 1000; + } + + self->takedamage = DAMAGE_AIM; + + if (!(self->spawnflags & SPAWNFLAG_TRIGGER_SPAWN) && level.time < 1) + { + gmonster.DropToFloor (self); + } + + self->viewheight = 0; + self->solid = SOLID_NOT; + + + gi.linkentity (self); + +} + +void generic_dog_spawnnow (edict_t *self, char *subclass) +{ + char dogClass[128]; + int nAICode;// = AI_GENERIC_DOG; + + //get the ai set up right away, so caching of ghoul stuff can happen + generic_monster_spawnnow (self); + sprintf(dogClass,"enemy/%s", subclass); + + // there's doubtlessly a more clever way to do this... + if (stricmp(subclass, "husky") == 0) + { + nAICode = AI_DOG_HUSKY; + } + else if (stricmp(subclass, "rottweiler") == 0) + { + nAICode = AI_DOG_ROTTWEILER; + } + self->ai = ai_c::Create(nAICode, self, dogClass, subclass);//new generic_ghoul_dog_ai(self, "enemy/husky", subclass); +} + +void generic_cow_spawnnow (edict_t *self, char *subclass) +{ + char cowClass[128]; + int nAICode = AI_GENERIC_COW; + + //get the ai set up right away, so caching of ghoul stuff can happen + generic_monster_spawnnow (self); + sprintf(cowClass,"enemy/%s", subclass); + self->ai = ai_c::Create(nAICode, self, cowClass, subclass);//new generic_ghoul_dog_ai(self, "enemy/husky", subclass); +} + +void SP_m_x_romulan (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_UGNSNIPER, self, "enemy/meso", "romulan"); + self->think = generic_npc_init; +} + + +void SP_m_x_husky (edict_t *self) +{ + generic_dog_spawnnow(self,"husky"); + VectorSet(self->mins, -33, -33, -28); + VectorSet(self->maxs, 33, 33, 16); + self->think = generic_animal_init; +} + +void SP_m_x_rottweiler (edict_t *self) +{ + generic_dog_spawnnow(self,"rottweiler"); + VectorSet(self->mins, -26, -26, -20); + VectorSet(self->maxs, 26, 26, 11); + self->think = generic_animal_init; +} + + + +void SP_m_x_germanshep (edict_t *self) +{ + SP_m_x_husky(self); +} + +void SP_m_x_raiderdog (edict_t *self) +{ + SP_m_x_husky(self); +} + +void SP_m_x_bull (edict_t *self) +{ + generic_cow_spawnnow(self, "bull"); + VectorSet(self->mins, -30, -14, -33); + VectorSet(self->maxs, 56, 14, 26); + self->think = generic_animal_init; + BboxRotate(self); +} + + + diff --git a/Source/Game/gamecpp/m_generic.h b/Source/Game/gamecpp/m_generic.h new file mode 100644 index 0000000..2138404 --- /dev/null +++ b/Source/Game/gamecpp/m_generic.h @@ -0,0 +1,135 @@ + +//initialization functions that should be useful... +void generic_monster_spawnnow (edict_t *self); +void generic_armor_spawnnow (edict_t *self); +void dekker_init (edict_t *self); +void generic_leader_init (edict_t *self); +void generic_grunt_init (edict_t *self); +void generic_heavyweapons_init (edict_t *self); +void generic_npc_init (edict_t *self); +void generic_animal_init (edict_t *self); +void generic_armor_init(edict_t *self); + +typedef enum +{ + EXPRESSION_PRIORITY_LOWEST=0, + EXPRESSION_PRIORITY_LOW, + EXPRESSION_PRIORITY_HIGH, + EXPRESSION_PRIORITY_HIGHEST, +} expressionPriority_e; + +typedef enum +{ + VARIETY_PRIORITY_LOWEST=0, + VARIETY_PRIORITY_LOW, + VARIETY_PRIORITY_HIGH, + VARIETY_PRIORITY_HIGHEST, +} varietyPriority_e; + +class generic_human_ai : public ai_c +{ +protected: + virtual void RegisterSkins(void); + virtual void RegisterGoreSkins(void); + + virtual void RegisterFaceSkin(const char *theMaterialName, const char *faceSkinName, expressionPriority_e expressionPriorityVal); + virtual void RegisterSkin(const char *theMaterialName, const char *theSkinName, varietyPriority_e varietyPriorityVal); + + virtual void RegisterFaceSkins(const char *faceBase, varietyPriority_e varietyPriorityVal); + virtual void RegisterTalkFaceSkins(const char *faceBase, varietyPriority_e varietyPriorityVal); +public: + virtual const char* GetInterpFile(char *theclass, char *subclass); + virtual ~generic_human_ai(){} + virtual void Init(edict_t *monster, char *theclass, char* subclass); + virtual int GetClassCode(void){return AI_GENERIC;}//this should be different for everybody in this class family + generic_human_ai():ai_c(){} + generic_human_ai(generic_human_ai *orig):ai_c(orig){} +}; + +class playercorpse_ai : public generic_human_ai +{ +protected: + virtual void RegisterSkins(void){} +public: + virtual action_c *DeathAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + virtual void AddBody(edict_t *monster); + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_PLAYERCORPSE;}//this should be different for everybody in this class family +}; + +class generic_meso_ai : public generic_human_ai +{ +protected: +public: + virtual const char* GetInterpFile(char *theclass, char *subclass); + virtual void AddBody(edict_t *monster); +}; + +class blownpart_ai : public generic_human_ai +{ +private: +protected: + float severTime; + bool removeMe; + bool Stopped; + bool frozen; + bool bFading; + virtual qboolean IsFirstFrameTime(void){return false;} +public: + virtual const char* GetInterpFile(char *theclass, char *subclass); + virtual const char* GetObjectSkin(char *theclass, char *subclass); + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_BLOWNPART;}//this should be different for everybody in this class family + virtual void Think(edict_t &monster); + + blownpart_ai():generic_human_ai(){} + blownpart_ai(blownpart_ai *orig); + virtual void Evaluate(blownpart_ai *orig); +}; + +class generic_ghoul_dog_ai : public ai_c//generic_human_ai +{ +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetTeam(edict_t &monster){return 1;} + virtual int GetClassCode(void){return AI_GENERIC_DOG;}//this should be different for everybody in this class family + + virtual action_c *AttackAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t attackPos, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false); + virtual action_c *WalkAction(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false); + +protected: + virtual void AddBody(edict_t *monster); +}; + +class dog_husky_ai : public generic_ghoul_dog_ai +{ +protected: + virtual void AddBody(edict_t *monster); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass) {generic_ghoul_dog_ai::Init(monster, ghoulname, subclass);} + virtual int GetClassCode(void){return AI_DOG_HUSKY;}//this should be different for everybody in this class family +}; + +class dog_rottweiler_ai : public generic_ghoul_dog_ai +{ +protected: + virtual void AddBody(edict_t *monster); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass) {generic_ghoul_dog_ai::Init(monster, ghoulname, subclass);} + virtual int GetClassCode(void){return AI_DOG_ROTTWEILER;}//this should be different for everybody in this class family +}; + +class cow_ai : public ai_c +{ +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetTeam(edict_t &monster){return 100;} + virtual int GetClassCode(void){return AI_GENERIC_COW;}//this should be different for everybody in this class family + +// virtual action_c *AttackAction(decision_c *od, action_c *oa, mmove_t *newanim, edict_t *attackTarget, vec3_t attackPos, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false); +// virtual action_c *WalkAction(decision_c *od, action_c *oa, mmove_t *newanim, vec3_t destination, vec3_t facing = vec3_origin, float timeout=999999999999, qboolean fullAnimation = false); + +protected: + virtual void AddBody(edict_t *monster); +}; + diff --git a/Source/Game/gamecpp/m_heliactions.cpp b/Source/Game/gamecpp/m_heliactions.cpp new file mode 100644 index 0000000..f5ed05b --- /dev/null +++ b/Source/Game/gamecpp/m_heliactions.cpp @@ -0,0 +1,722 @@ +// m_heliactions.cpp + +#include "g_local.h" +#include "ai_private.h" +#include "m_heliai.h" +//#include "m_heli.h" + +//#include // for OutputDebugString() only, do not leave in! + + +/********************************************************************************** + **********************************************************************************/ +heli_action::heli_action(decision_c *od, action_c *oa, mmove_t *newanim, + int nCommand, vec3_t vPos, edict_t* target, float fArg) +:action_c(od, oa, newanim, vPos, vPos, NULL, 999999, true) +{ + m_nCommand = nCommand; + action_target = target; + m_fArg = fArg; + m_think = NULL; + m_nextthink = NULL; + m_nID = -1; +} + +qboolean heli_action::Think(ai_c &which_ai, edict_t &monster) +{ + float fHealthPercentage = 1.0f; + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)&which_ai; + body_heli* body = NULL; + + if (ai) + { + body = ai->GetHeliBody(); + } + if (!body) + { + return false; + } + qboolean bRet = true; + if (m_think) + { + // set our script params in the body's member variables + body->m_fArg = m_fArg; + VectorCopy(dest, body->m_vPos); + body->m_target = action_target; + + // this past think may have updated our next think + if (m_nextthink && m_nextthink != m_think) + { + m_think = m_nextthink; + m_nextthink = NULL; + } + + m_think(&monster); + + fHealthPercentage = (float)monster.health/(float)monster.max_health; + body->UpdateSmoke(&monster, fHealthPercentage); + + // kef -- dunno if I like this. probly a cleaner way... + bRet = ((generic_ghoul_heli_ai*)&which_ai)->IsActionDone(); + } + + // check our need for creating a pseudo-action if our current action + //completed or if we just reached zer0 health + if (bRet || + ((body->m_flags & HELIFLAG_ISDEAD) && !(body->m_flags & HELIFLAG_ISDEADACKNOWLEDGED))) + { + // going to emulate Ste's CobraThink_Think here so we can "insert" + //pseudo-actions into the action queue + + // if it's on the pad, explode + if (((body->m_flags & HELIFLAG_ISDEAD) && !(body->m_flags & HELIFLAG_ISDEADACKNOWLEDGED)) && + fabs(monster.s.origin[0]) - fabs(body->m_v3HeliPadRestPos[0]) < 0.1f && + fabs(monster.s.origin[1]) - fabs(body->m_v3HeliPadRestPos[1]) < 0.1f && + fabs(monster.s.origin[2]) - fabs(body->m_v3HeliPadRestPos[2]) < 0.1f ) + { + ai->TimeToDie(true); + ResolveAction(which_ai, monster, 1.0, 1.0); + } + else if(InsertPseudoAction(body, &monster)) + { + // inserted a pseudo-action, so we want the heli ai to believe + //we're still executing the same action + bRet = false; + } + else + { + ResolveAction(which_ai, monster, 1.0, 1.0); + } + + // just finished an action so reset our variable + ((generic_ghoul_heli_ai*)&which_ai)->ActionIsDone(false); + } + return bRet; +} + + +// overriding this fn is a quick way of keeping action_c from screwing with +//our heli's sequence +qboolean heli_action::SetAnimation(ai_c &which_ai, edict_t &monster) +{ + //just bein safe + if (!which_ai.GetBody()) + { + gi.dprintf("heli_action::SetAnimation--ai has no body!\n"); + return false; + } + return true; +} + +// overriding this fn is a quick way of keeping action_c from screwing with +//our heli's sequence +qboolean heli_action::ForceAnimation(ai_c &which_ai, edict_t &monster) +{ + //just bein safe + if (!which_ai.GetBody()) + { + gi.dprintf("heli_action::ForceAnimation--ai has no body!\n"); + return false; + } + return true; +} + +qboolean heli_action::InsertPseudoAction(body_heli* body, edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + + // if we've been given the script command to turn ai on, check here + //to see if we should turn it off and start executing more script cmds + + body->m_flags &= ~HELIFLAG_SCRIPTEDAIJUSTFINISHED; // regardless + + if (body->m_flags & HELIFLAG_DOINGSCRIPTEDAI && + ((ai && level.time > body->m_fHeliAITimer && ai->GetActionSize()) || + (body->m_flags & HELIFLAG_ISDEAD)) ) + { + body->m_flags &= ~( HELIFLAG_DOINGSCRIPTEDAI | + HELIFLAG_DOINGSMARTGOTO | + HELIFLAG_DOINGSCRIPTEDFIREAT); + body->m_flags |= HELIFLAG_SCRIPTEDAIJUSTFINISHED; // so hover code can pick it up + } + + if ((body->m_flags & HELIFLAG_ISDEAD) && !(body->m_flags & HELIFLAG_ISDEADACKNOWLEDGED)) + { + body->m_flags |= HELIFLAG_ISDEADACKNOWLEDGED; + if (self->spawnflags & ONDIE_HEAD2SPAWN) + { + Cobra2_LegaliseVector(self, body->m_v3HeliDeathDest, body->m_v3HeliDeathDest, true); // qboolean qbUseWorldClip + VectorCopy(body->m_v3HeliDeathDest, dest); + m_think = Cobra2GotoCoordsHelper; + } + else + { + // store the current forward vector in body->m_v3HeliDeathDest + vec3_t vF, vR, vU; + + AngleVectors(self->s.angles, vF, vR, vU); + VectorNegate(vR, body->m_v3HeliDeathDest); + body->m_v3HeliDeathDest[2] = 0; + body->m_fHeliHoverTimer = level.time + 2.0f; + m_think = m_nextthink = Cobra2_OutOfControl; + } + return true; + } + + if (body->m_flags & HELIFLAG_DOINGSMARTGOTO) // this one MUST be before the 'HELIFLAG_DOINGSCRIPTEDLANDING' check + { + m_think = Cobra2Think_SmartHeadToDest; + return true; + } + + if (body->m_flags & HELIFLAG_DOINGSCRIPTEDLANDING) + { + m_nextthink = m_think = Cobra2Think_Land; + body->m_flags &= ~HELIFLAG_DOINGSCRIPTEDLANDING; + return true; + } + + if (body->m_flags & HELIFLAG_DOINGSCRIPTEDFIREAT) + { + m_think = Cobra2Think_GotoFireAt; + return true; + } + + if (body->m_flags & HELIFLAG_DOINGSCRIPTEDHOVER) + { + m_think = Cobra2Think_Hover; + return true; + } + + if (body->m_flags & HELIFLAG_DOINGSCRIPTEDAI) + { + Cobra2Think_AI(self); + return true; + } + + return false; +} + +heli_action::heli_action(heli_action *orig) +: action_c(orig) +{ + m_nID = orig->m_nID; + m_nCommand = orig->m_nCommand; + m_fArg = orig->m_fArg; + + *(int *)&m_think = GetThinkNum(orig->m_think); + *(int *)&m_nextthink = GetThinkNum(orig->m_nextthink); +} + +void heli_action::Evaluate(heli_action *orig) +{ + m_nID = orig->m_nID; + m_nCommand = orig->m_nCommand; + m_fArg = orig->m_fArg; + + m_think = (void (*)(edict_t *self))GetThinkPtr((int)orig->m_think); + m_nextthink = (void (*)(edict_t *self))GetThinkPtr((int)orig->m_nextthink); + + action_c::Evaluate(orig); +} + +void heli_action::Read() +{ + char loaded[sizeof(heli_action)];; + + gi.ReadFromSavegame('AIHE', loaded, sizeof(heli_action)); + Evaluate((heli_action *)loaded); +} + +void heli_action::Write() +{ + heli_action *savable; + + savable = new heli_action(this); + gi.AppendToSavegame('AIHE', savable, sizeof(*this)); + delete savable; +} + +/********************************************************************************** + **********************************************************************************/ +helimove_action::helimove_action(decision_c *od, action_c *oa, ai_c* which_ai, + mmove_t *newanim, int nCommand, vec3_t vPos, + edict_t* target, float fArg, int nID) +:heli_action(od, oa, newanim, nCommand, vPos, target, fArg) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)which_ai; + body_heli* body = NULL; + + if (ai) + { + body = ai->GetHeliBody(); + } + if (!body) + { + return; + } + // save our id (uniquely determined by the ai) + m_nID = nID; + // save our script params + m_fArg = fArg; + VectorCopy(vPos, dest); + action_target = target; + + switch(m_nCommand) + { + case generic_ghoul_heli_ai::hse_TAKEOFF: + { + m_think = Cobra2Think_TakeOff; + break; + } + case generic_ghoul_heli_ai::hse_LAND: + { + VectorCopy(body->m_v3HeliPadRestPos,dest); + m_think = Cobra2LandHelper; + break; + } + case generic_ghoul_heli_ai::hse_GOTO_COORDS: + { + m_think = Cobra2GotoCoordsHelper; + break; + } + case generic_ghoul_heli_ai::hse_GOTOREL_ENTITY: + { + if (target) + { + body->m_target = target; + VectorCopy(vPos, body->m_vPos); + m_think = Cobra2GotoRelEntHelper; + } + break; + } + case generic_ghoul_heli_ai::hse_GOTOREL_ENT_X: + { + if (target) + { + body->m_target = target; + VectorSet(dest, fArg, 0, 0); + m_think = Cobra2GotoRelEntHelper; + } + break; + } + case generic_ghoul_heli_ai::hse_GOTOREL_ENT_Y: + { + if (target) + { + body->m_target = target; + VectorSet(dest, 0, fArg, 0); + m_think = Cobra2GotoRelEntHelper; + } + break; + } + case generic_ghoul_heli_ai::hse_GOTOREL_ENT_Z: + { + if (target) + { + body->m_target = target; + VectorSet(dest, 0, 0, fArg); + m_think = Cobra2GotoRelEntHelper; + } + break; + } + case generic_ghoul_heli_ai::hse_MOVEREL: + { + VectorCopy(vPos, body->m_vPos); + m_think = Cobra2GotoRelHelper; + break; + } + case generic_ghoul_heli_ai::hse_STRAFE_RT: + { + m_fArg = fabs(fArg); + m_think = Cobra2StrafeHelper; + break; + } + case generic_ghoul_heli_ai::hse_STRAFE_LT: + { + m_fArg = -fabs(fArg); + m_think = Cobra2StrafeHelper; + break; + } + case generic_ghoul_heli_ai::hse_HOVER_PASSIVE: + { + m_fArg = fArg; + dest[0] = 0; + m_think = Cobra2HoverHelper; + break; + } + case generic_ghoul_heli_ai::hse_HOVER_AGGRESSIVE: + { + body->m_fArg = fArg; + dest[0] = 1; + m_think = Cobra2HoverHelper; + break; + } + case generic_ghoul_heli_ai::hse_REPAIR: + { + m_think = Cobra2Think_Repair; + break; + } + case generic_ghoul_heli_ai::hse_REARM: + { + m_think = Cobra2RearmHelper; + break; + } + case generic_ghoul_heli_ai::hse_SET_WORLDMINS: + { + m_fArg = body->m_fArg = 0; // 0 == mins + VectorCopy(vPos, body->m_vPos); + m_think = Cobra2WorldHelper; + break; + } + case generic_ghoul_heli_ai::hse_SET_WORLDMAXS: + { + m_fArg = body->m_fArg = 1; // 1 == maxs + VectorCopy(vPos, body->m_vPos); + m_think = Cobra2WorldHelper; + break; + } + case generic_ghoul_heli_ai::hse_SET_DEATHDEST: + { + m_think = Cobra2DeathDestHelper; + break; + } + case generic_ghoul_heli_ai::hse_SET_TRACEDIMS: + { + m_think = Cobra2TraceDimsHelper; + break; + } + case generic_ghoul_heli_ai::hse_SET_HEALTH: + { + dest[0] = 0; // 0 == health + m_think = Cobra2HealthHelper; + break; + } + case generic_ghoul_heli_ai::hse_SET_MAXHEALTH: + { + dest[0] = 1; // 1 == maxhealth + m_think = Cobra2HealthHelper; + break; + } + case generic_ghoul_heli_ai::hse_CHANGE_SKIN: + { + // set the skin + if (1 == m_fArg) + { + SetSkin(target, "enemy/chopper", "cobrass", "cobra","m_x_chopper_black", true); + } + else if (2 == m_fArg) + { + SetSkin(target, "enemy/chopper", "cobrass", "cobra","m_x_chopper_green", true); + } + else + { + SetSkin(target, "enemy/chopper", "cobrass", "cobra","m_x_chopper_white", true); + } + break; + } + case generic_ghoul_heli_ai::hse_CHANGE_BODY: + { + // set the body + if (1 == m_fArg) + { + ai->ChangeBody(target, "enemy/hind", "hind"); + } + break; + } + case generic_ghoul_heli_ai::hse_OUT_OF_CONTROL: + { + // body->m_v3HeliDeathDest contains a base velocity for crashing + VectorClear(body->m_v3HeliDeathDest); + body->m_fHeliHoverTimer = level.time + 2.0f; + m_think = Cobra2_OutOfControl; + break; + } + case generic_ghoul_heli_ai::hse_AI: + { + m_think = Cobra2AIHelper; + break; + } + case generic_ghoul_heli_ai::hse_WAYPOINT: + { + ai->AddWaypoint(vPos); + break; + } + case generic_ghoul_heli_ai::hse_VOLUME: + { + ai->SetWaypointPtVolume(ai->GetNumWaypointPts()-1,vPos); + break; + } + case generic_ghoul_heli_ai::hse_VOLUMEMINS: + { + // vPos is in world coords, change to rel-to-waypt-origin + heliWaypoint* pt = ai->GetWaypointPt(ai->GetNumWaypointPts()-1); + if (pt) + { + VectorCopy(vPos, pt->m_volMins); + } + break; + } + case generic_ghoul_heli_ai::hse_VOLUMEMAXS: + { + // vPos is in world coords, change to rel-to-waypt-origin + vec3_t vTemp; + heliWaypoint* pt = ai->GetWaypointPt(ai->GetNumWaypointPts()-1); + if (pt) + { + VectorCopy(vPos, pt->m_volMaxs); + VectorAdd(pt->m_volMins, pt->m_volMins, vTemp); + VectorScale(vTemp, 0.5f, pt->m_v); + VectorSubtract(pt->m_volMins, pt->m_v, pt->m_volMins); + VectorSubtract(pt->m_volMaxs, pt->m_v, pt->m_volMaxs); + ai->SetWaypointPtVolume(ai->GetNumWaypointPts()-1,pt->m_volMaxs); + } + break; + } + case generic_ghoul_heli_ai::hse_DEBUG: + { + // sets the proper spawnflag in ds.cpp, nothing to do here + break; + } + default: + break; + } +} + +/********************************************************************************** + **********************************************************************************/ +heliface_action::heliface_action(decision_c *od, action_c *oa, ai_c* which_ai, + mmove_t *newanim, int nCommand, vec3_t vPos, + edict_t* target, float fArg, int nID) +:heli_action(od, oa, newanim, nCommand, vPos, target, fArg) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)which_ai; + body_heli* body = NULL; + + if (ai) + { + body = ai->GetHeliBody(); + } + if (!body) + { + return; + } + // save our id (uniquely determined by the ai) + m_nID = nID; + // save our script params + m_fArg = fArg; + VectorCopy(vPos, dest); + action_target = target; + + switch(m_nCommand) + { + case generic_ghoul_heli_ai::hse_FACE_RELENT: + { + if (target) + { + body->m_target = target; + VectorCopy(vPos, body->m_vPos); + m_think = Cobra2FaceRelEntHelper; + } + break; + } + case generic_ghoul_heli_ai::hse_FACE_ABSCOORDS: + { + VectorCopy(vPos, body->m_vPos); + m_think = Cobra2FaceAbsHelper; + break; + } + case generic_ghoul_heli_ai::hse_FACE_ABSDIR: + { + VectorCopy(vPos, body->m_vPos); + m_think = Cobra2FaceAbsDirHelper; + break; + } + case generic_ghoul_heli_ai::hse_FACE_RELCOORDS: + { + VectorCopy(vPos, body->m_vPos); + m_think = Cobra2FaceRelCoordsHelper; + break; + } + case generic_ghoul_heli_ai::hse_PILOT_FACERELENT: + case generic_ghoul_heli_ai::hse_GUNNER_FACERELENT: + { + if (target) + { + body->m_target = target; + VectorCopy(vPos, body->m_vPos); + if (m_nCommand == generic_ghoul_heli_ai::hse_GUNNER_FACERELENT) + { + m_fArg = 0; // 0 == gunner + } + else + { + m_fArg = 1; // 1 == pilot + } + m_think = Cobra2HeadFaceRelEntHelper; + } + break; + } + case generic_ghoul_heli_ai::hse_PILOT_FACERELCOORDS: + case generic_ghoul_heli_ai::hse_GUNNER_FACERELCOORDS: + { + VectorCopy(vPos, body->m_vPos); + if (m_nCommand == generic_ghoul_heli_ai::hse_GUNNER_FACERELCOORDS) + { + m_fArg = 0; // 0 == gunner + } + else + { + m_fArg = 1; // 1 == pilot + } + m_think = Cobra2HeadFaceRelCoordsHelper; + break; + } + case generic_ghoul_heli_ai::hse_PILOT_FACEABSCOORDS: + case generic_ghoul_heli_ai::hse_GUNNER_FACEABSCOORDS: + { + VectorCopy(vPos, body->m_vPos); + if (m_nCommand == generic_ghoul_heli_ai::hse_GUNNER_FACEABSCOORDS) + { + m_fArg = 0; // 0 == gunner + } + else + { + m_fArg = 1; // 1 == pilot + } + m_think = Cobra2HeadFaceAbsCoordsHelper; + break; + } + default: + break; + } +} + +/********************************************************************************** + **********************************************************************************/ +heliattack_action::heliattack_action(decision_c *od, action_c *oa, ai_c* which_ai, + mmove_t *newanim, int nCommand, vec3_t vPos, + edict_t* target, float fArg, int nID) +:heli_action(od, oa, newanim, nCommand, vPos, target, fArg) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)which_ai; + body_heli* body = NULL; + + if (ai) + { + body = ai->GetHeliBody(); + } + if (!body) + { + return; + } + // save our id (uniquely determined by the ai) + m_nID = nID; + // save our script params + m_fArg = fArg; + VectorCopy(vPos, dest); + action_target = target; + + switch(m_nCommand) + { + case generic_ghoul_heli_ai::hse_ROCKETS_ENABLE: + { + m_fArg = 1; + m_think = Cobra2RocketsEnableHelper; + break; + } + case generic_ghoul_heli_ai::hse_ROCKETS_DISABLE: + { + m_fArg = 0; + m_think = Cobra2RocketsEnableHelper; + break; + } + case generic_ghoul_heli_ai::hse_CHAINGUN_ENABLE: + { + m_fArg = 1; + m_think = Cobra2ChainGunEnableHelper; + break; + } + case generic_ghoul_heli_ai::hse_CHAINGUN_DISABLE: + { + m_fArg = 0; + m_think = Cobra2ChainGunEnableHelper; + Cobra2_Fire_OFF(body->GetHeliEdict()); + body->m_fArg = 0; + ai->ActionIsDone(true); + break; + } + case generic_ghoul_heli_ai::hse_AUTOFIRE_ON: + { + m_fArg = 1; + m_think = Cobra2AutoFireHelper; + break; + } + case generic_ghoul_heli_ai::hse_AUTOFIRE_OFF: + { + m_fArg = 0; + m_think = Cobra2AutoFireHelper; + break; + } + case generic_ghoul_heli_ai::hse_FIREAT_RELENT: + { + if (target) + { + body->m_target = target; + VectorCopy(vPos, body->m_vPos); + body->m_fArg = fArg; + m_think = Cobra2FireAtRelEntHelper; + } + break; + } + case generic_ghoul_heli_ai::hse_FIREAT_ABSCOORDS: + { + VectorCopy(vPos, body->m_vPos); + body->m_fArg = fArg; + m_think = Cobra2FireAtAbsHelper; + break; + } + case generic_ghoul_heli_ai::hse_FIREAT_RELCOORDS: + { + VectorCopy(vPos, body->m_vPos); + body->m_fArg = fArg; + m_think = Cobra2FireAtRelHelper; + break; + } + default: + break; + } +} + + + +/********************************************************************************** + **********************************************************************************/ +helideath_action::helideath_action(decision_c *od, action_c *oa, ai_c* which_ai, + mmove_t *newanim, int nCommand, vec3_t vPos, + edict_t* target, float fArg, int nID) +:heli_action(od, oa, newanim, nCommand, vPos, target, fArg) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)which_ai; + body_heli* body = NULL; + + if (ai) + { + body = ai->GetHeliBody(); + } + if (!body) + { + return; + } + + m_think = Cobra2GotoCoordsHelper; + + // save our id (uniquely determined by the ai) + m_nID = nID; + // save our script params + m_fArg = fArg; + VectorCopy(vPos, dest); + action_target = target; + +} + diff --git a/Source/Game/gamecpp/m_heliactions.h b/Source/Game/gamecpp/m_heliactions.h new file mode 100644 index 0000000..ad12039 --- /dev/null +++ b/Source/Game/gamecpp/m_heliactions.h @@ -0,0 +1,115 @@ +/********************************************************************************** + **********************************************************************************/ + +class heli_action : public action_c +{ +private: +protected: + int m_nID; + int m_nCommand; + float m_fArg; + + void (*m_think)(edict_t *self); + void (*m_nextthink)(edict_t *self); + + virtual qboolean SetAnimation(ai_c &which_ai, edict_t &monster); + virtual qboolean ForceAnimation(ai_c &which_ai, edict_t &monster); + + virtual qboolean InsertPseudoAction(body_heli* body, edict_t* self); + +public: + + heli_action(decision_c *od, action_c *oa, mmove_t *newanim, int nCommand, vec3_t vPos, edict_t* target, float fArg); + heli_action(void):action_c(){ m_nID = -1;} + virtual ~heli_action(void) {} + + virtual int GetClassCode(void){return HELI_ACTION;}//this should be different for everybody in this class family + + virtual actiontype_e Type(void){return atype_walk;} + virtual qboolean Think(ai_c &which_ai, edict_t &monster); + virtual void SetThink(void (*think)(edict_t *self)) { m_think = think; } + virtual void SetNextThink(void (*think)(edict_t *self)) { m_nextthink = think; } + + virtual int GetID() { return m_nID; } + + heli_action(heli_action *orig); + void Evaluate(heli_action *orig); + virtual void Write(void); + virtual void Read(void); +}; + +/********************************************************************************** + **********************************************************************************/ + +class helimove_action : public heli_action +{ +private: +protected: + +public: + + helimove_action(decision_c *od, action_c *oa, ai_c* which_ai, mmove_t *newanim, int nCommand, vec3_t vPos, edict_t* target, float fArg, int nID); + helimove_action(void):heli_action(){} + virtual ~helimove_action(void) {} + + virtual int GetClassCode(void){return HELIMOVE_ACTION;}//this should be different for everybody in this class family + + virtual actiontype_e Type(void){return atype_walk;} +}; + +/********************************************************************************** + **********************************************************************************/ + +class heliface_action : public heli_action +{ +private: +protected: + +public: + + heliface_action(decision_c *od, action_c *oa, ai_c* which_ai, mmove_t *newanim, int nCommand, vec3_t vPos, edict_t* target, float fArg, int nID); + heliface_action(void):heli_action(){} + virtual ~heliface_action(void) {} + + virtual int GetClassCode(void){return HELIFACE_ACTION;}//this should be different for everybody in this class family + + virtual actiontype_e Type(void){return atype_walk;} +}; + +/********************************************************************************** + **********************************************************************************/ + +class heliattack_action : public heli_action +{ +private: +protected: + +public: + + heliattack_action(decision_c *od, action_c *oa, ai_c* which_ai, mmove_t *newanim, int nCommand, vec3_t vPos, edict_t* target, float fArg, int nID); + heliattack_action(void):heli_action(){} + virtual ~heliattack_action(void) {} + + virtual int GetClassCode(void){return HELIATTACK_ACTION;}//this should be different for everybody in this class family + + virtual actiontype_e Type(void){return atype_walk;} +}; + +/********************************************************************************** + **********************************************************************************/ + +class helideath_action : public heli_action +{ +private: +protected: + +public: + + helideath_action(decision_c *od, action_c *oa, ai_c* which_ai, mmove_t *newanim, int nCommand, vec3_t vPos, edict_t* target, float fArg, int nID); + helideath_action(void):heli_action(){} + virtual ~helideath_action(void) {} + + virtual int GetClassCode(void){return HELIDEATH_ACTION;}//this should be different for everybody in this class family + + virtual actiontype_e Type(void){return atype_walk;} +}; diff --git a/Source/Game/gamecpp/m_heliai.cpp b/Source/Game/gamecpp/m_heliai.cpp new file mode 100644 index 0000000..b72bd76 --- /dev/null +++ b/Source/Game/gamecpp/m_heliai.cpp @@ -0,0 +1,5641 @@ +// m_heliai.cpp +#include "g_local.h" +#include "ai_private.h" +#include "m_generic.h" +#include "m_heliai.h" +#include "g_obj.h" // for aiming the gun and the heads +#include "callback.h" +#include "..\qcommon\ef_flags.h" + +//#include "m_heli.h" + +//#include // temp, purely for OutputDebugString(). Will be removed. + +#ifndef max +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +#define HELI_DIFFICULTY 3 + +typedef enum +{ + HELIOBJ_HELI = 0, + HELIOBJ_BARREL, + HELIOBJ_BARREL_NULL, + HELIOBJ_HEAD, + HELIOBJ_ROTOR, + HELIOBJ_NAV_LITE1, + HELIOBJ_NAV_LITE2, + HELIOBJ_NAV_LITE3, + HELIOBJ_TAIL_LITE, + HELIOBJ_CANOPY, + HELIOBJ_HIND, + HELIOBJ_HIND_CANOPY, + HELIOBJ_MAXOBJS +}; + +modelSpawnData_t heliModelData[MD_HELI_SIZE] = +{ +// dir file surfaceType material health solid material file cnt scale +"enemy/chopper", "cobrass", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, "cobra", 0, DEBRIS_SM, NULL, // HELIOBJ_HELI = 0, +"enemy/chopper", "barrel", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, "cobra", 0, DEBRIS_SM, NULL, // HELIOBJ_BARREL, +"objects/generic/gun_auto", "null", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // HELIOBJ_BARREL_NULL +"enemy/chopper", "head", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, "cobra", 0, DEBRIS_SM, NULL, // HELIOBJ_HEAD, +"enemy/chopper", "rotor", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, "cobra", 0, DEBRIS_SM, NULL, // HELIOBJ_ROTOR, +"enemy/chopper", "nav_lite", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, "cobra", 0, DEBRIS_SM, NULL, // HELIOBJ_NAV_LITE1, +"enemy/chopper", "nav_lite2", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, "cobra", 0, DEBRIS_SM, NULL, // HELIOBJ_NAV_LITE2, +"enemy/chopper", "nav_lite3", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, "cobra", 0, DEBRIS_SM, NULL, // HELIOBJ_NAV_LITE3, +"enemy/chopper", "tail_lite", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, "cobra", 0, DEBRIS_SM, NULL, // HELIOBJ_TAIL_LITE, +"enemy/chopper", "canopy", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, "cobra", 0, DEBRIS_SM, NULL, // HELIOBJ_CANOPY, +"enemy/hind", "hind", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, "hind", 0, DEBRIS_SM, NULL, // HELIOBJ_HIND, +"enemy/hind", "canopy", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, "hind", 0, DEBRIS_SM, NULL, // HELIOBJ_HIND_CANOPY, +}; + +// kef -- copy of FX_ fns of the same name on the client +int GetGhoulChildPosDir2(vec3_t sourcePos, vec3_t sourceAng, IGhoulInst *inst, GhoulID partID, + IGhoulInst *childInst, GhoulID childPartID, char *name, char *name2, + vec3_t pos, vec3_t dir, vec3_t right, vec3_t up); +int GetGhoulPosDir2(vec3_t sourcePos, vec3_t sourceAng, IGhoulInst *inst, + GhoulID partID, char *name, vec3_t pos, vec3_t dir, vec3_t right, + vec3_t up); + +/// Someone please put this in the right header +void EntToWorldMatrix(vec3_t org, vec3_t angles, Matrix4 &m); + + + +MainRotor2Callback theMainRotor2Callback; +MainHeliCallback2 theMainHeliCallback2; + +bool MainRotor2Callback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + edict_t* self = (edict_t*)ent; + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = NULL; + + if (ai) + { + body = ai->GetHeliBody(); + } + if (!body) + { + return false; + } + body->SetRotorEOS(true); + return true; +} + +bool MainHeliCallback2::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + edict_t* self = (edict_t*)ent; + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = NULL; + + if (ai) + { + body = ai->GetHeliBody(); + } + if (!body) + { + return false; + } + body->SetFuselageEOS(true); + return true; +} + +// ensure angle is in range -179..0..180 +// +_inline float angle2posneg2 (float _angle) +{ + _angle = anglemod(_angle); // ensure known-range + if (_angle>180) + _angle-=360; + + return _angle; +} + + +float generic_ghoul_heli_ai::fHeliXWorldMin2 = -10000; +float generic_ghoul_heli_ai::fHeliXWorldMax2 = 10000; +float generic_ghoul_heli_ai::fHeliYWorldMin2 = -10000; +float generic_ghoul_heli_ai::fHeliYWorldMax2 = 10000; +float generic_ghoul_heli_ai::fHeliZWorldMin2 = -10000; +float generic_ghoul_heli_ai::fHeliZWorldMax2 = 10000; + + +void debug_drawbox(edict_t* self,vec3_t vOrigin, vec3_t vMins, vec3_t vMaxs, int nColor) +{ + vec3_t vO; + vec3_t mns, mxs; + if (self) + { + VectorCopy(self->mins, mns); + VectorCopy(self->maxs, mxs); + } + else + { + VectorCopy(vMins, mns); + VectorCopy(vMaxs, mxs); + } + // corpse stuff override +// mns[0] = -8; +// mns[1] = -8; +// mxs[0] = 8; +// mxs[1] = 8; +// mxs[2] = 8; + + vec3_t corners[] = { + {mns[0], mns[1], mns[2]}, + {mns[0], mns[1], mxs[2]}, + {mns[0], mxs[1], mns[2]}, + {mns[0], mxs[1], mxs[2]}, + {mxs[0], mns[1], mns[2]}, + {mxs[0], mns[1], mxs[2]}, + {mxs[0], mxs[1], mns[2]}, + {mxs[0], mxs[1], mxs[2]} + }; + + if (self) + { + VectorCopy(self->s.origin, vO); + } + else + { + VectorCopy(vOrigin, vO); + } + paletteRGBA_t p; + float colors[] = { + 0, 0, 64, + 0, 0, 128, + 0, 0, 192, + 0, 0, 255, + 0, 64, 0, + 0, 128,0, + 0, 192,0, + 0, 255,0, + 64, 0, 0, + 128,0, 0, + 192,0, 0, + 255,0, 0 + }; + int lines[] = { + 0, 1, + 0, 2, + 0, 4, + 7, 6, + 7, 5, + 7, 3, + 2, 3, + 2, 6, + 6, 4, + 4, 5, + 5, 1, + 1, 3 + }; + vec3_t c1, c2; + int i = 0; + p.a = 250; + p.r = p.g = p.b = 0; + + switch (nColor) + { + case 1: + p.r = 255; + break; + case 2: + p.g = 255; + break; + default: + if (nColor) + { + p.b = 255; + } + break; + } + for (i = 0; i < 12; i++) + { + if (0 == nColor) + { + p.r = colors[i*3]; + p.g = colors[i*3+1]; + p.b = colors[i*3+2]; + } + VectorAdd(vO, corners[lines[i*2]], c1); + VectorAdd(vO, corners[lines[i*2+1]], c2); + FX_MakeLine(c1, c2, p); // need a better one than this + } +} + +void generic_ghoul_heli_ai::Activate(edict_t &monster) +{ + isActive=true; +} + +void generic_ghoul_heli_ai::BuildHeliModel(edict_t *self, char *ghoulname, char *subclass) +{ + // fuselage + ggObjC *cheli=NULL; + // bolt located on the fuselage (aka "bolter") + GhoulID cBolterBolt=0; + // bolt located on the bolted-on item (aka "boltee") + GhoulID cBolteeBolt=0; + ggOinstC *t=NULL; + ggBinstC *cBolteeBolted=NULL, *bInstBarrelNULL = NULL; + IGhoulInst *pBoltInst=NULL; + Matrix4 mat,mat1,mat2; + GhoulID tempNote=0; + bool bHind = (0 == strcmp("hind", subclass)); // heh heh. bHind. heh heh. + float fTailRotorScale = bHind?0.375:0.25f, + fMainRotorScale = bHind?1.875:1.25f; + + + // create the helicopter fuselage, init ghoul stuff, sequence + + // gotta do this to make setsimpleghoulmodel happy + ent->s.renderfx &= ~RF_GHOUL; + + if (bHind) + { + SimpleModelInit2(self, &heliModelData[HELIOBJ_HIND], NULL, NULL); + } + else + { + SimpleModelInit2(self, &heliModelData[HELIOBJ_HELI], NULL, NULL); + } + if (self->ghoulInst) + { + self->ghoulInst->SetUserData(self); + + if (GetHeliBody()) + { + //GetHeliBody()->SetFuselageObj(cheli); + //let body know about my inst, too + GetHeliBody()->SetHeliEdict(self); + } + } + else + { + gi.dprintf("generic_ghoul_heli_ai::Init failed to create heli fuselage\n"); + return; + } + // create some navigation lights + if (bHind) + { + } + else + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HELI], "nav_lite", + heliModelData[HELIOBJ_NAV_LITE1], "to_nav_lite", NULL); + if (cBolteeBolted) + { + SimpleModelSetSequence2(cBolteeBolted->GetInstPtr(),"nav_lite", SMSEQ_LOOP); + } + else + { + gi.dprintf("generic_ghoul_heli_ai::Init failed to create nav_lite bolton\n"); + } + } + + if (bHind) + { + } + else + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HELI], "nav_lite2", + heliModelData[HELIOBJ_NAV_LITE2], "to_nav_lite2", NULL); + if (cBolteeBolted) + { + SimpleModelSetSequence2(cBolteeBolted->GetInstPtr(),"nav_lite2", SMSEQ_LOOP); + } + else + { + gi.dprintf("generic_ghoul_heli_ai::Init failed to create nav_lite2 bolton\n"); + } + } + + if (bHind) + { + } + else + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HELI], "nav_lite3", + heliModelData[HELIOBJ_NAV_LITE3], "to_nav_lite3", NULL); + if (cBolteeBolted) + { + SimpleModelSetSequence2(cBolteeBolted->GetInstPtr(),"nav_lite3", SMSEQ_LOOP); + } + else + { + gi.dprintf("generic_ghoul_heli_ai::Init failed to create nav_lite3 bolton\n"); + } + } + + // create a tail light + if (bHind) + { + } + else + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HELI], "tail_lite", + heliModelData[HELIOBJ_TAIL_LITE], "to_tail_lite", NULL); + if (NULL == cBolteeBolted) + { + gi.dprintf("generic_ghoul_heli_ai::Init failed to create tail_lite bolton\n"); + } + } + + // create the gun + // + // step 1 -- create a NULL, attach it to the heli. this will allow yaw. + if (bHind) + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HIND], "barrel_base", + heliModelData[HELIOBJ_BARREL_NULL], "DUMMY01", NULL); + } + else + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HELI], "barrel_base", + heliModelData[HELIOBJ_BARREL_NULL], "DUMMY01", NULL); + } + if (cBolteeBolted) + { + bInstBarrelNULL = cBolteeBolted; + GetHeliBody()->SetBarrelNULLInst(cBolteeBolted); + if ((pBoltInst = cBolteeBolted->GetInstPtr()) && pBoltInst->GetGhoulObject()) + { + GetHeliBody()->SetBarrelNULLBolt(pBoltInst->GetGhoulObject()->FindPart("DUMMY01")); + // the NULL actually has some geometry in it (ghoul made me do it :< ) so turn it off + SimpleModelTurnOnOff(pBoltInst, false); + } + } + else + { + gi.dprintf("generic_ghoul_heli_ai::Init failed to create NULL (for barrel) bolton\n"); + } + + // step 2 -- create the barrel, attach it to the NULL. this will allow pitch. + cBolteeBolted = ComplexModelAddBolt(bInstBarrelNULL, heliModelData[HELIOBJ_BARREL_NULL], "DUMMY01", + heliModelData[HELIOBJ_BARREL], "to_barrel_base", NULL); + if (cBolteeBolted) + { + GetHeliBody()->SetBarrelInst(cBolteeBolted); + if ((pBoltInst = cBolteeBolted->GetInstPtr()) && pBoltInst->GetGhoulObject()) + { + GetHeliBody()->SetBarrelBolt(pBoltInst->GetGhoulObject()->FindPart("to_barrel_base")); + } + } + else + { + gi.dprintf("generic_ghoul_heli_ai::Init failed to create barrel bolton\n"); + } + + // create the gunner's head + if (bHind) + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HIND], "body1", + heliModelData[HELIOBJ_HEAD], "to_body", NULL); + } + else + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HELI], "body1", + heliModelData[HELIOBJ_HEAD], "to_body", NULL); + } + if (cBolteeBolted) + { + GetHeliBody()->SetGunnerInst(cBolteeBolted); + if ((pBoltInst = cBolteeBolted->GetInstPtr()) && pBoltInst->GetGhoulObject()) + { + GetHeliBody()->SetGunnerBolt(pBoltInst->GetGhoulObject()->FindPart("to_body")); + GetHeliBody()->SetGunBoltOffset( 0/*84.795f*/, 0.0f, 6.411f); + } + } + else + { + gi.dprintf("generic_ghoul_heli_ai::Init failed to create gunner's head bolton\n"); + } + + // create the pilot's head + if (bHind) + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HIND], "body2", + heliModelData[HELIOBJ_HEAD], "to_body", NULL); + } + else + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HELI], "body2", + heliModelData[HELIOBJ_HEAD], "to_body", NULL); + } + if (cBolteeBolted) + { + GetHeliBody()->SetPilotInst(cBolteeBolted); + if ((pBoltInst = cBolteeBolted->GetInstPtr()) && pBoltInst->GetGhoulObject()) + { + GetHeliBody()->SetPilotBolt(pBoltInst->GetGhoulObject()->FindPart("to_body")); + GetHeliBody()->SetPilotBoltOffset(22/*44.215f*/, 0.0f, 12.935f); + } + } + else + { + gi.dprintf("generic_ghoul_heli_ai::Init failed to create pilot's head bolton\n"); + } + + // create the tail rotor + if (bHind) + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HIND], "rotor_tail", + heliModelData[HELIOBJ_ROTOR], "to_rotor", NULL); + } + else + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HELI], "rotor_tail", + heliModelData[HELIOBJ_ROTOR], "to_rotor", NULL); + } + if (cBolteeBolted) + { + GetHeliBody()->SetTailRotorBoltInst(cBolteeBolted); + GetHeliBody()->SetTailRotorInst(cBolteeBolted); + if (pBoltInst = cBolteeBolted->GetInstPtr()) + { + pBoltInst->GetXForm(mat); + mat1=mat2=mat; + mat2.Scale(fTailRotorScale); + mat.Concat(mat1, mat2); + pBoltInst->SetXForm(mat); + } + if (self->spawnflags & IN_AIR) + SimpleModelSetSequence2(pBoltInst,"rotor_anim", SMSEQ_LOOP); + else + SimpleModelSetSequence2(pBoltInst,"rotor", SMSEQ_LOOP); + } + else + { + gi.dprintf("generic_ghoul_heli_ai::Init failed to create tail rotor bolton\n"); + } + + // create the main rotor + if (bHind) + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HIND], "rotor_main", + heliModelData[HELIOBJ_ROTOR], "to_rotor", NULL); + } + else + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HELI], "rotor_main", + heliModelData[HELIOBJ_ROTOR], "to_rotor", NULL); + } + if (cBolteeBolted) + { + GetHeliBody()->SetMainRotorBoltInst(cBolteeBolted); + GetHeliBody()->SetMainRotorInst(cBolteeBolted); + if (pBoltInst = cBolteeBolted->GetInstPtr()) + { + pBoltInst->GetXForm(mat); + mat1=mat2=mat; + mat2.Scale(fMainRotorScale); + mat.Concat(mat1, mat2); + pBoltInst->SetXForm(mat); + } + GetHeliBody()->SetRotorEOS(false); + if (self->spawnflags & IN_AIR) + SimpleModelSetSequence2(pBoltInst,"rotor_anim", SMSEQ_LOOP); + else + SimpleModelSetSequence2(pBoltInst,"rotor", SMSEQ_LOOP); + // register a callback for the main rotor's sequence + tempNote=pBoltInst->GetGhoulObject()->FindNoteToken("EOS"); + if (tempNote && pBoltInst) + { + pBoltInst->AddNoteCallBack(&theMainRotor2Callback,tempNote); + } + } + else + { + gi.dprintf("generic_ghoul_heli_ai::Init failed to create main rotor bolton\n"); + } + + // create the canopy for the cockpit + if (bHind) + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HIND], "canopy", + heliModelData[HELIOBJ_HIND_CANOPY], "to_canopy", NULL); + } + else + { + cBolteeBolted = SimpleModelAddBolt(self, heliModelData[HELIOBJ_HELI], "canopy", + heliModelData[HELIOBJ_CANOPY], "to_canopy", NULL); + } + if (cBolteeBolted) + { + GetHeliBody()->SetCockpitInst(cBolteeBolted); + if (pBoltInst = cBolteeBolted->GetInstPtr()) + { + SimpleModelSetSequence2(pBoltInst,"canopy", SMSEQ_HOLD); + } + } + else + { + gi.dprintf("generic_ghoul_heli_ai::Init failed to create canopy bolton\n"); + } + + // create our rotor sound + self->s.sound = gi.soundindex("Enemy/Helicopter/Blade.wav"); + self->s.sound_data = (255 & ENT_VOL_MASK) | SND_FARATTN; +} + +void generic_ghoul_heli_ai::Init(edict_t *self, char *ghoulname, char* subclass) +{ + m_bActionDone = false; + m_bTimeToDie = false; + m_bPilotDead = false; + m_bGunnerDead = false; + m_attacker = NULL; + m_nActionSize = 0; + m_ScriptActionCounter = m_LastThinkingActionID = 0; + + m_waypoints = NULL; + m_nNumWaypoints = m_nNumWaypointPts = m_nNumWaypointVols = 0; + + BuildHeliModel(self, ghoulname, subclass); +} + +void generic_ghoul_heli_ai::ChangeBody(edict_t *self, char *ghoulname, char* subclass) +{ + float fMin = min(self->mins[0],self->mins[1]); + float fMax = max(self->maxs[0],self->maxs[1]); + float fXYRadius = max(fabs(fMin),fMax); // max radius dist from centre + float fZRadius = (max(fabs(self->mins[2]),self->maxs[2]))*2; // max radius dist from centre + float fAggressiveness = 0; + vec3_t vPad = {0,0,0}, vDeathDest = {0,0,0}; + + body_heli* oldbody = GetHeliBody(), *newbody = NULL; + + if (oldbody) + { + fAggressiveness = oldbody->m_fAIAggressiveness; + VectorCopy(oldbody->m_v3HeliPadRestPos, vPad); + VectorCopy(oldbody->m_v3HeliDeathDest, vDeathDest); + } + body.Destroy(); + game_ghoul.RemoveObjectInstances(self); + MyGhoulObj = NULL; + AddBody(self); + BuildHeliModel(self, ghoulname, subclass); + + newbody = GetHeliBody(); + + if (newbody) + { + VectorSet(newbody->m_v3HeliTraceMins,-fXYRadius,-fXYRadius,-fZRadius); + VectorSet(newbody->m_v3HeliTraceMaxs, fXYRadius, fXYRadius, fZRadius); + VectorCopy(vPad, newbody->m_v3HeliPadRestPos); + VectorCopy(vDeathDest, newbody->m_v3HeliDeathDest); + newbody->m_fAIAggressiveness = fAggressiveness; + } + self->flags |= FL_NO_KNOCKBACK; + self->movetype = MOVETYPE_FLY; + self->solid = SOLID_BBOX; + self->takedamage= DAMAGE_YES; + self->pain = NULL;//CobraThink_Pain; + self->die = NULL;//CobraThink_Die; +} + + +generic_ghoul_heli_ai::~generic_ghoul_heli_ai() +{ + heliWaypoint* temp = NULL; + while (m_waypoints) + { + temp = m_waypoints; + m_waypoints = m_waypoints->m_next; + m_nNumWaypoints--; + delete temp; + } +} + +void generic_ghoul_heli_ai::AddBody(edict_t *monster) +{ + if (!monster) + { + return; + } + if (!body) + { + body = new body_heli(monster); + } +} + +action_c *generic_ghoul_heli_ai::MoveAction(decision_c *od, action_c *oa, + ai_c* ai, mmove_t *newanim, int nCommand, vec3_t vPos, edict_t* target, float fArg) +{ + // uniquely identify each action generated by the script so we can poll it later in + //HelicopterDoneEvent::Process() to find out when it's done + m_ScriptActionCounter++; + return new helimove_action(od, oa, ai, newanim, nCommand, vPos, target, fArg, m_ScriptActionCounter); +} + +action_c *generic_ghoul_heli_ai::FaceAction(decision_c *od, action_c *oa, + ai_c* ai, mmove_t *newanim, int nCommand, vec3_t vPos, edict_t* target, float fArg) +{ + // uniquely identify each action generated by the script so we can poll it later in + //HelicopterDoneEvent::Process() to find out when it's done + m_ScriptActionCounter++; + return new heliface_action(od, oa, ai, newanim, nCommand, vPos, target, fArg, m_ScriptActionCounter); +} + +action_c *generic_ghoul_heli_ai::AttackAction(decision_c *od, action_c *oa, + ai_c* ai, mmove_t *newanim, int nCommand, vec3_t vPos, edict_t* target, float fArg) +{ + // uniquely identify each action generated by the script so we can poll it later in + //HelicopterDoneEvent::Process() to find out when it's done + m_ScriptActionCounter++; + return new heliattack_action(od, oa, ai, newanim, nCommand, vPos, target, fArg, m_ScriptActionCounter); +} + +void generic_ghoul_heli_ai::SetCurrentActionThink(void (*think)(edict_t *self)) +{ + if (current_action) + { + ((heli_action*)(action_c*)current_action)->SetThink(think); + } +} + +void generic_ghoul_heli_ai::SetCurrentActionNextThink(void (*think)(edict_t *self)) +{ + if (current_action) + { + ((heli_action*)(action_c*)current_action)->SetNextThink(think); + } +} +void EntToWorldMatrix(vec3_t org, vec3_t angles, Matrix4 &m); + +static float s_fNextThink = 0; // only used when the heli dies in jpn3 + +void exploding_heli_final(edict_t *self) +{ + G_FreeEdict(self); +} + +void exploding_heli_remove(edict_t *self) +{ + vec3_t vPos, vF; + generic_ghoul_heli_ai *ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli *body = ai->GetHeliBody(); + + // big explosion inside the heli fuselage + GetGhoulPosDir2(self->s.origin, self->s.angles, self->ghoulInst, 0, "ROTOR_MAIN1", vPos, vF, NULL, NULL); + fxRunner.exec("heli_expl", vPos, MULTICAST_ALL); + self->s.effects |= EF_EXPLODING; + // make the fuselage disappear + //SimpleModelTurnOnOff(self->ghoulInst, false); + + // make the rotor smoke go away + body->UpdateSmoke(self, -1); + + // in a few seconds make the whole deal go away + s_fNextThink = level.time + 5; + self->nextthink = level.time + FRAMETIME; + self->think = exploding_heli_final; +} + +void exploding_heli_think2(edict_t *self) +{ + IGhoulObj *obj = NULL; + GhoulID idBase = 0; + float xattenuation = ATTN_NORM, xvolume = 1.0; + + // explosion at base of rotor + if(obj = self->ghoulInst->GetGhoulObject()) + { + idBase = obj->FindPart("ROTOR_MAIN"); + fxRunner.execWithInst("weapons/world/autogundeath", self, + self->ghoulInst, idBase); + gi.positioned_sound (self->s.origin, g_edicts, 0, gi.soundindex("impact/explosion/exp1.wav"), xvolume, xattenuation, 0); + } + + s_fNextThink = level.time + 1; + self->nextthink = level.time + FRAMETIME; + self->think = exploding_heli_remove; +} + +void exploding_heli_think(edict_t *self) +{ + generic_ghoul_heli_ai *ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli *body = ai->GetHeliBody(); + IGhoulObj *obj = NULL; + GhoulID idCockpit = 0; + float xattenuation = ATTN_NORM, xvolume = 1.0; + + if (body) + { + // remove pilot and gunner + if (body->GetGunnerInst()) + { + body->GetGunnerInst()->SetOnOff(false,level.time); + } + if (body->GetPilotInst()) + { + body->GetPilotInst()->SetOnOff(false,level.time); + } + } + + // explosion inside cockpit + if(obj = self->ghoulInst->GetGhoulObject()) + { + idCockpit = obj->FindPart("BODY1"); + fxRunner.execWithInst("weapons/world/autogundeath", self, + self->ghoulInst, idCockpit); + gi.positioned_sound (self->s.origin, g_edicts, 0, gi.soundindex("impact/explosion/med.wav"), xvolume, xattenuation, 0); + } + + s_fNextThink = level.time + .2; + self->nextthink = level.time + FRAMETIME; + self->think = exploding_heli_think2; +} + +void generic_ghoul_heli_ai::Think(edict_t &monster) +{ + int i = 0, nDifficulty = HELI_DIFFICULTY; // right now this is the number of shots fired per attack + + // if we're dead, do some special stuff + monster.nextthink = level.time + FRAMETIME; + if (monster.deadflag == DEAD_DEAD) + { + monster.s.effects &= ~EF_EXPLODING; + monster.movetype = MOVETYPE_FLY; + monster.gravity = 0; + monster.velocity[2] = 0; + if (level.time >= s_fNextThink) + { + monster.think(&monster); + } + return; + } + + if (ai_freeze->value) + { + return; + } + +// debug_drawbox(&monster, NULL, NULL, NULL, 0); +// Com_Printf("%3.2f%%, %d hit points\n", (float)monster.health/(float)monster.max_health, monster.health); + // that Greg... + if (GetHeliBody() && GetHeliBody()->IsFiring()) + { + IGhoulInst *instMuzzle = GetHeliBody()->GetBarrelInst(); + IGhoulInst *instHeli = GetHeliBody()->GetHeliInst(); + IGhoulObj *obj = NULL; + GhoulID idEndOfMuzzle = 0, idBoltHeliToMuzzle = 0; + if(instHeli && instMuzzle && (obj = instMuzzle->GetGhoulObject()) ) + { + idEndOfMuzzle = obj->FindPart("flash_barrel"); + fxRunner.execWithInst("weapons/othermz/heli", &monster, + instMuzzle, idEndOfMuzzle); + // actually attack our current target + vec3_t vWaver, vFirePoint, vFireDir, vFireDir2; + obj = instHeli->GetGhoulObject(); + if(obj) + { + idBoltHeliToMuzzle = obj->FindPart("barrel_base"); + + GetGhoulChildPosDir2(monster.s.origin, monster.s.angles, + instHeli, + idBoltHeliToMuzzle, + instMuzzle, + idEndOfMuzzle, + NULL, NULL, vFirePoint, vFireDir, NULL, NULL); // this is way too long ;( + VectorScale(vFireDir, 100, vFireDir); +// for (i = 0; i < nDifficulty; i++) + { + VectorSet(vWaver, gi.irand(-10,10), gi.irand(-10,10), gi.irand(-10,10)); + VectorAdd(vFireDir, vWaver, vFireDir2); + weapons.attack(ATK_HELIGUN, &monster, vFirePoint, vFireDir2);//same damage, but bigger impact sound + } + //gi.sound (self, CHAN_WEAPON, gi.soundindex("weapons/assault/fire.wav"), .9, .5, 0);//tihs wasn't here before - do we want it here? + } + } + } + EvaluateSenses(monster); +#if 0 +//#ifdef _DEBUG + if (monster.spawnflags & DEBUG_WAYPOINTS) + { + // loop-limit number is how many to draw per cycle... + for (int iPlexPass=0; iPlexPass<1; iPlexPass++) + { + vec3_t vOrigin = {0,0,0}, + vMins = {fHeliXWorldMin2,fHeliYWorldMin2,fHeliZWorldMin2}, + vMaxs = {fHeliXWorldMax2,fHeliYWorldMax2,fHeliZWorldMax2}; + + + static int iMasterPlex=0; + int iThisPlex=-1; + + // draw sky box + if (++iThisPlex==iMasterPlex) + debug_drawbox(NULL, vOrigin, vMins, vMaxs, 1); + + // draw heli box + if (++iThisPlex==iMasterPlex) + debug_drawbox(&monster, vOrigin, vMins, vMaxs, 0); + + // draw volumes + int i = 0, n = GetNumWaypointVols(); + heliWaypoint* waypt = NULL; + + for (i = 0; i < n; i++) + { + if (++iThisPlex==iMasterPlex) + { + waypt = GetWaypointVol(i); + if (waypt) + { + waypt->GetVolumeMins(vMins); + waypt->GetVolumeMaxs(vMaxs); + debug_drawbox(NULL, vOrigin, vMins, vMaxs, 2); + } + } + } + + n = GetNumWaypointPts(); + for (i = 0; i < n; i++) + { + if (++iThisPlex==iMasterPlex) + { + waypt = GetWaypointPt(i); + if (waypt) + { + VectorSet(vMins,-10,-10,-10); + VectorSet(vMaxs, 10, 10, 10); + debug_drawbox(NULL, waypt->m_v, vMins, vMaxs, 3); + } + } + } + if (++iMasterPlex == 2 + GetNumWaypointVols() + GetNumWaypointPts()) + iMasterPlex = 0; + }// for (int iPlexPass=0; iPlexPass<5; iPlexPass++) + }// if (monster.spawnflags & DEBUG_WAYPOINTS) +#endif + // if someone just capped the pilot or gunner, we want the heli + //to go out of control and crash regardless of the current action. + if (GetHeliBody()) + { + if (GetHeliBody()->IsPilotDead()) + { + if (GetHeliBody()->IsGunnerDead()) + { + CrewMemberKilled(&monster, HC_SKIN_BOTH); + } + else + { + CrewMemberKilled(&monster, HC_SKIN_PILOT); + } + } + else if (GetHeliBody()->IsGunnerDead()) + { + CrewMemberKilled(&monster, HC_SKIN_GUNNER); + } + } + if (!current_action) + { // do some thinking - this is not correct + if (actions.size()) + { + NextAction(monster); + } + } + m_nActionSize = actions.size(); +#if 0 +#else + if (current_action) + { + m_LastThinkingActionID = ((heli_action*)(action_c*)current_action)->GetID(); + if (current_action->Think(*this, monster)) + { + NextAction(monster); + if (GetHeliBody()) + { + GetHeliBody()->ResetScriptParams(); + } + } + } +#endif + gi.linkentity(&monster); + + if (monster.linkcount != linkcount) + { + linkcount = monster.linkcount; + gmonster.CheckGround (&monster); + } + gmonster.CatagorizePosition (&monster); + gmonster.WorldEffects (&monster);//leaving this in for drowning, lava damage, etc., but it should prolly be handled in ai class somewhere + + //if monster is dead, consider removing it + if (m_bTimeToDie) + { + //get ai to poll actions, decisions, & senses to check if removal is ok + if (SafeToRemove(monster)) + { + Die(monster, m_attacker, m_attacker, monster.max_health, vec3_origin); + if (monster.killtarget && (strcmp("musicscript", monster.killtarget))) + { // hacked in ending for jpn3 + vec3_t pos = {-1000, 744, 986}; + VectorSet(monster.velocity, -10, 40, 0); + VectorCopy(pos,monster.s.origin); + monster.s.angles[ROLL] = -10; + s_fNextThink = level.time + 1; + monster.think = exploding_heli_think; + monster.nextthink = level.time + FRAMETIME; + } + else + { + G_FreeEdict (&monster); + } + } + } +} + +void generic_ghoul_heli_ai::CrewMemberKilled(edict_t* self, int nSkin) +{ + // make sure we're solid so we can hit something and explode now that we're out of control + self->movetype = MOVETYPE_FLY; + if ( !(GetHeliBody()->m_flags & HELIFLAG_ISDEADACKNOWLEDGED) ) + { + // get rid of all actions currently available + list::iterator ia; + vec3_t vPos = {0,0,0}; + for (ia=actions.begin();ia!=actions.end();ia++) + { + (*ia).Destroy(); + } + while (actions.size()) + { + actions.pop_front(); + } + + //this may be unnecessary, but it makes me nervous seeing current_action just set to NULL--ss + if (current_action) + { + current_action.Destroy(); + } + current_action = NULL; + + // only send the heli out of control if it's not landed + if (self->s.origin[0] != GetHeliBody()->m_v3HeliPadRestPos[0] || + self->s.origin[1] != GetHeliBody()->m_v3HeliPadRestPos[1] || + self->s.origin[2] != GetHeliBody()->m_v3HeliPadRestPos[2]) + { + // add a new action for going out of control + decision_c* DecisionPointer; + if (!(DecisionPointer = ((ai_c*)(this))->FindScriptedDecision(self))) + { + NewDecision(DecisionPointer = new scripted_decision(NULL,SCRIPTED_PRIORITY_ROOT,0,self),self); + } + NewAction( MoveAction(DecisionPointer, + NULL, (ai_c*)this, &MMoves[15], + generic_ghoul_heli_ai::hse_OUT_OF_CONTROL, + vPos, NULL, 0),self, true); + + // alert our body to its imminent demise + GetHeliBody()->m_flags |= HELIFLAG_ISDEADACKNOWLEDGED; + } + if (lock_blood) + { + // no exploding heads for you + return; + } + // change skin on the cockpit + GetHeliBody()->ChangeCockpitSkin(nSkin); + // make the afflicted head disappear + if (nSkin == HC_SKIN_PILOT && + GetHeliBody()->GetPilotInst()) + { + GetHeliBody()->GetPilotInst()->SetOnOff(false,level.time); + } + else if (nSkin == HC_SKIN_GUNNER && + GetHeliBody()->GetGunnerInst()) + { + GetHeliBody()->GetGunnerInst()->SetOnOff(false,level.time); + } + else if (nSkin == HC_SKIN_BOTH && + GetHeliBody()->GetGunnerInst() && + GetHeliBody()->GetPilotInst()) + { + GetHeliBody()->GetGunnerInst()->SetOnOff(false,level.time); + GetHeliBody()->GetPilotInst()->SetOnOff(false,level.time); + } + } +} + +qboolean generic_ghoul_heli_ai::Damage (edict_t &monster, edict_t *inflictor, + edict_t *attacker, vec3_t dir, vec3_t point, + vec3_t origin, int damage, int knockback, + int dflags, int mod, float penetrate, float absorb) +{ + // fixme: centralize skill level stuff + int take; + + VectorNormalize(dir); + + take = damage; + + if (mod == MOD_C4) + { + return false; + } + if (body && take) + { + if(dflags&(DT_PROJECTILE|DT_EXPLODE)) + { + take=damage=body->ShowDamage(monster, inflictor, attacker, dir, point, origin, damage, knockback, dflags, mod, penetrate, absorb); + } + } + +// do the damage + if (take) + { + monster.health = monster.health - take; + + if (monster.health <= 0) + { + m_attacker = attacker; + monster.flags |= FL_NO_KNOCKBACK; + if (GetHeliBody()) + { + GetHeliBody()->m_flags |= HELIFLAG_ISDEAD; + } + monster.takedamage = DAMAGE_NO; + monster.nextthink = level.time + FRAMETIME; // should break heli out of PAUSE command if in one, but only private heli pause, not script main pause (unless that breaks out when you get shot anyway) + return true; + } + + if(dflags&(DT_PROJECTILE|DT_EXPLODE)) + { + Pain (monster, attacker, knockback, take); + } + return true; + } + + return false;//no hit! +} + +void generic_ghoul_heli_ai::Pain(edict_t &monster, edict_t *other, float kick, int damage) +{ + float fHealthPercentage = (float)monster.health/(float)monster.max_health; + + if (GetHeliBody()) + { + GetHeliBody()->UpdateSmoke(&monster, fHealthPercentage); + } +} + +void generic_ghoul_heli_ai::Die(edict_t &monster, edict_t *inflictor, edict_t *attacker, + int damage, vec3_t point) +{ + vec3_t forward,to_dam; + edict_t *killTarget = NULL; + bool bSpecialDeath = false; + + if (monster.health < -999) + { + monster.health = -999; + } + + if (monster.killtarget) + { + bSpecialDeath = true; + while ((killTarget = G_Find (killTarget, FOFS(targetname), ent->killtarget))) + { + killTarget->use(killTarget, &monster, &monster); + } + } + + monster.enemy = attacker;//for awarding credit? + // CHECKME possible issues: + // If monster is killed by barrel, should we chain to find who was the barrel's killer? + // what about being clever and using architecture to kill monsters (like 16 ton weights) + + if (monster.deadflag != DEAD_DEAD) + { + vec3_t facedir; + list::iterator ia; + list::iterator is; + list::iterator id; + + +/* if (attacker && game.GameStats->CanBuy(attacker)) + { + //changed this to be conditional so it wouldn't crash --ss + if(CMonsterStats *MonsterStats = game.GameStats->GetMonsterStats(&monster)) + { + GetPlayerStats(attacker)->AdjustCashToBeAwarded(MonsterStats->GetKilledValue()); + } + else + { + gi.dprintf("Error: no stats for monster!\n"); + } + // this stuff gets put into bank account at "end" of mission + } +*/ +//fixme: do need the npc check, but do it a good way +// if (!(monster.monsterinfo.aiflags & AI_GOOD_GUY)) +// { + level.killed_monsters++; +/* if (coop->value && attacker && attacker->client) + { + attacker->client->resp.score++; + }*/ +// } + + // huh? should have list-eating separated out? + + for (is=senses.begin();is != senses.end();is++) + { + (*is).Destroy(); + } + for (ia=actions.begin();ia!=actions.end();ia++) + { + (*ia).Destroy(); + } + for (id=decisions.begin();id!=decisions.end();id++) + { + (*id).Destroy(); + } + + //now ditch nodes + + while (senses.size()) + { + senses.pop_front(); + } + + while (actions.size()) + { + actions.pop_front(); + } + while (decisions.size()) + { + decisions.pop_front(); + } + + if (current_action) + { + current_action.Destroy(); + } + + if (recycle_action) + { + recycle_action.Destroy(); + } + + AngleVectors(monster.s.angles, forward, NULL, NULL); + VectorSubtract(point, monster.s.origin, to_dam); + VectorNormalize(to_dam); + + monster.touch = NULL;//do we need this here? + monster.deadflag = DEAD_DEAD; + + VectorSubtract(point,monster.s.origin,facedir); + VectorCopy(monster.s.angles, ideal_angles); + gi.linkentity (&monster); + } + + if (bSpecialDeath && (strcmp("musicscript", monster.killtarget))) + { // this means we had a kill target (like, say, in jpn3) and fired a script or something, + //so don't do the regular explosion + } + else + { + monster.s.effects |= EF_EXPLODING; + //FX_VehicleExplosion(monster.s.origin, 255); + fxRunner.exec("heli_expl", monster.s.origin); + //BlindingLight(monster.s.origin, 5000, 0.9, 0.5); + } +} + +heliWaypoint* generic_ghoul_heli_ai::GetWaypointPt(int nWay) +{ + if (nWay < 0 || nWay > m_nNumWaypointPts || 0 == m_nNumWaypoints) + { + return NULL; + } + int nPts = 0; + heliWaypoint* temp = m_waypoints; + while (temp) + { + if (temp->IsPoint()) + { + if (nPts == nWay) + { + return temp; + } + nPts++; + } + temp = temp->m_next; + } + return NULL; +} + +heliWaypoint* generic_ghoul_heli_ai::GetWaypointVol(int nWay) +{ + if (nWay < 0 || nWay > m_nNumWaypointVols || 0 == m_nNumWaypoints) + { + return NULL; + } + int nVols = 0; + heliWaypoint* temp = m_waypoints; + while (temp) + { + // if the heliWaypoint is, in fact, a volume and not just a point + if (!temp->IsPoint()) + { + if (nVols == nWay) + { + return temp; + } + nVols++; + } + temp = temp->m_next; + } + return NULL; +} + +int generic_ghoul_heli_ai::AddWaypoint(vec3_t v) +{ + heliWaypoint* newPt = new heliWaypoint(v), *temp = m_waypoints; + if (0 == m_nNumWaypoints) + { + m_waypoints = newPt; + } + else + { + while (temp->m_next) + { + temp = temp->m_next; + } + temp->m_next = newPt; + } + m_nNumWaypointPts++; + return ++m_nNumWaypoints; +} + +qboolean generic_ghoul_heli_ai::SetWaypointPtVolume(int nWay, vec3_t v) +{ + heliWaypoint* pt = GetWaypointPt(nWay); + vec3_t vClipMins, vClipMaxs; + + if (pt && ent) + { + if (pt->IsPoint()) + { + // turning a point into a volume + m_nNumWaypointPts--; + } + // perform any necessary clipping to reduce volume to a space + //in which we can place our body's origin, not just our bbox + for (int i = 0; i < 3; i++) + { + if (v[i]*2 >= (ent->maxs[i] - ent->mins[i])) + { + vClipMins[i] = -v[i] - ent->mins[i]; + vClipMaxs[i] = v[i] - ent->maxs[i]; + } + else + { + return false; + } + } + m_nNumWaypointVols++; + VectorAdd(pt->m_v, vClipMins, vClipMins); + VectorAdd(pt->m_v, vClipMaxs, vClipMaxs); + pt->SetVolume(vClipMins, vClipMaxs); + return true; + } + else + { + return false; + } +} + +int generic_ghoul_heli_ai::GetCurrentActionID() +{ + if (current_action) + { + return ((heli_action*)(action_c*)current_action)->GetID(); + } + else + { + return 0; + } +} + +int generic_ghoul_heli_ai::GetMostRecentlyAddedActionID() +{ + return m_ScriptActionCounter; +} + + + +//////////////////////////////////////////////////////////////////////// +// begin: stuff copied directly from m_heli.cpp +//////////////////////////////////////////////////////////////////////// +/* +#define HELIFLAG_DOINGSCRIPTEDLANDING 0x00000001 // # +#define HELIFLAG_ROTORSCHANGINGSPEED 0x00000002 +#define HELIFLAG_SIDESTRAFEISTOLEFT 0x00000004 +#define HELIFLAG_ROCKETSENABLED 0x00000008 +#define HELIFLAG_CHAINGUNENABLED 0x00000010 +#define HELIFLAG_MGUN_GHOULSEQ_RUNNING 0x00000020 // special use thingy +#define HELIFLAG_AUTOFIRE 0x00000040 +#define HELIFLAG_DOINGSCRIPTEDHOVER 0x00000080 // # +#define HELIFLAG_HOVERISAGGRESIVE 0x00000100 +#define HELIFLAG_DOINGSCRIPTEDFIREAT 0x00000200 // # +*/ + +void Cobra2Think_TakeOff(edict_t *self) +{ + ggBinstC* boltMain=NULL, *boltTail=NULL; + ggObjC* objMain=NULL, *objTail=NULL; + IGhoulInst* instMainRotor = NULL, *instTailRotor = NULL; + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + // were we waiting for rotors to windup to speed? + // + if (self->spawnflags & IN_AIR) + { +#ifdef _DEBUG +#ifdef SHOW_DESIGNER_ERRORS + gi.dprintf("### HELISCRIPT: Can't takeoff when spawned in air!\n"); +#endif +#endif + ai->ActionIsDone(true); + return; + } + instMainRotor = body->GetMainRotorInst(); + instTailRotor = body->GetTailRotorInst(); + if (body->m_flags & HELIFLAG_ROTORSCHANGINGSPEED) + { + if (!body->GetRotorEOS()) + return; + + // rotors at full speed, switch to normal looping anim... + // + //if (objMain && boltMain && objTail && boltTail) + if (instMainRotor && instTailRotor) + { + SimpleModelSetSequence2(instMainRotor, "rotor_anim", SMSEQ_LOOP); + SimpleModelSetSequence2(instTailRotor, "rotor_anim", SMSEQ_LOOP); + } + body->m_flags&= ~HELIFLAG_ROTORSCHANGINGSPEED; + } + else + { + // time to start rotor windup... + // + if (instMainRotor && instTailRotor) + { + SimpleModelSetSequence2(instMainRotor, "rotor_start", SMSEQ_HOLD); + SimpleModelSetSequence2(instTailRotor, "rotor_start", SMSEQ_HOLD); + body->SetRotorEOS(false); + body->m_flags |= HELIFLAG_ROTORSCHANGINGSPEED; + } + return; + } + + // set dest as being a pos above us... + // + vec3_t vDest; + VectorCopy(self->s.origin,vDest); + vDest[2] += 56*4; // climb to 4 man-heights above pad initially + Cobra2Think_SetDumbFlyDest(self, vDest); +}// void Cobra2Think_TakeOff(edict_t *self) + +void Cobra2_InitTurnStuff(edict_t *self, vec3_t v3) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + body->SetPosStop(v3); + body->SetStartYaw(self->s.angles[HELI_YAW]); +} + +void Cobra2Think_HeadToDest(edict_t *self) +{ + // interesting bugette here, if I set the pilot's head to look at the dest target every cycle then when + // we get to the end of a move he suddenly tries to look backwards over his right shoulder because he himself + // is beyond the dest point (I think that's why, anyway), so to compensate we should project a vector further + // along (past the end point) for him to look at...(the vector being at least the size of the heli) + // + // note that the value worked out is constant, ie could be determined at move start rather than every cycle, but + // apparently field-space within entities is at a premium so trade it off for CPU work instead... + // + vec3_t v3Gradient; + vec3_t v3HeliDims; + vec3_t v3LookDest; + float fHeliLength; + + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + Vector_GetHalfWayPoint(body->m_v3HeliDesiredPos_Start, body->m_v3HeliDesiredPos_Stop, body->m_v3HeliDesiredPos_Halfway); + VectorSubtract (body->m_v3HeliDesiredPos_Stop,body->m_v3HeliDesiredPos_Start,v3Gradient); + VectorNormalize(v3Gradient); + VectorSubtract (self->maxs, self->mins, v3HeliDims); + fHeliLength = VectorLength(v3HeliDims); + VectorMA(body->m_v3HeliDesiredPos_Stop, fHeliLength, v3Gradient, v3LookDest); + Cobra2AimPilotAtPos(self, v3LookDest); + // aim the gunner/gun as well, but only if we're going to fire at something on arrival... :-) + // + if (body->m_flags & HELIFLAG_DOINGSCRIPTEDFIREAT) + Cobra2AimGunAtPos(self, body->m_v3HeliFireAtCoords, true); // qboolean bSynchGunner + else + { + if ( (body->m_flags & HELIFLAG_AUTOFIRE) && (body->m_flags & HELIFLAG_CHAINGUNENABLED) ) // do not OR these 2 into one "(flag & val)" check + { + // keith's seek-to-45-degree-pitch code... + // + vec3_t vF; + + AngleVectors(self->s.angles, vF, NULL, NULL); + vF[2]=0; + VectorNormalize(vF); + vec3_t v3; + VectorSet(v3,0,0,-1); + VectorAdd(vF,v3,v3); + Cobra2AimGunInDirection(self, v3, true); // qboolean bSynchGunner + } + else + Cobra2ResetGunner(self); + } + + // Helicopters can (and do) head towards things then start turning to face them once they're on the way, so + // head in that dir regardless, do the turn-to-face stuff as you go... + // + + // have we reached our dest?... + // + if (fabs (self->s.origin[0] - body->m_v3HeliDesiredPos_Stop[0]) <= body->m_fHeliMoveSpeed && + fabs (self->s.origin[1] - body->m_v3HeliDesiredPos_Stop[1]) <= body->m_fHeliMoveSpeed && + fabs (self->s.origin[2] - body->m_v3HeliDesiredPos_Stop[2]) <= body->m_fHeliMoveSpeed + ) + { + // we're reached it (or close enough), so do final position adjustement to make it exact... + // + VectorCopy(body->m_v3HeliDesiredPos_Stop,self->s.origin); + body->m_fHeliMoveSpeed = 0; + + // now detonate if this is the right time... + // + if (body->m_flags & HELIFLAG_ISDEADFINALGOTO) + { + ai->SetCurrentActionNextThink(Cobra2_Explode); + return; + } + + ai->SetCurrentActionNextThink(Cobra2Think_MovementFinish); + } + else + {// not reached dest... + + // + // acceleration/pitch logic here... + // + qboolean qbBeyondHalfWay = + WithinOrBeyondVectors2(self->s.origin, body->m_v3HeliDesiredPos_Halfway, + body->m_v3HeliDesiredPos_Stop); + if (!qbBeyondHalfWay || (body->m_flags & HELIFLAG_ISDEADFINALGOTO)) // keep accelerating during death plunge + { + // accel... + // + body->m_fHeliMoveSpeed += HELI_COBRA_ACCEL; + + // pitch. First, how far are we along the first half of the journey as a %age?... + // + vec3_t v3TotLengthVect,v3LengthVect; + VectorSubtract(body->m_v3HeliDesiredPos_Halfway, body->m_v3HeliDesiredPos_Start, v3TotLengthVect); // journey dist + VectorSubtract(body->m_v3HeliDesiredPos_Halfway, self->s.origin, v3LengthVect); // dist so far + v3TotLengthVect[2] = v3LengthVect[2] = 0; // lose the Z component + + // get the inverse percentage... + // (broken into if-checked lines because of sqrt() returning float-errors occasionally when zeros occur) + float fTotLen = VectorLength(v3TotLengthVect); + if (fTotLen>0) + { + float fSoFarLen = VectorLength(v3LengthVect); + if (fSoFarLen>0) + { + float fDistPercent = 100-((100/fTotLen) * fSoFarLen); // 100%= start, 0 = reached halfway (end of accel) + float fIdealPitch = -(HELI_COBRA_MAXPITCH-((fDistPercent * HELI_COBRA_MAXPITCH)/100)); // HELI_COBRA_MAXPITCH..0 + if (qbBeyondHalfWay) + fIdealPitch = 0; + fIdealPitch *= -1; // kef + + // now just adjust our pitch to suit... + // + if (self->s.angles[HELI_PITCH] + HELI_COBRA_PITCHADJSPEED <= fIdealPitch) // kef + self->s.angles[HELI_PITCH] +=HELI_COBRA_PITCHADJSPEED; + else + if (self->s.angles[HELI_PITCH] - HELI_COBRA_PITCHADJSPEED >= fIdealPitch) // kef + self->s.angles[HELI_PITCH] -=HELI_COBRA_PITCHADJSPEED; + } + } + } + else + { + // decel... + // + body->m_fHeliMoveSpeed -= HELI_COBRA_ACCEL; + if (body->m_fHeliMoveSpeed < HELI_COBRA_MIN_HEAD2DESTSPEED) // arb, should be z, but this ensure we keep moving if we fall a little short + body->m_fHeliMoveSpeed = HELI_COBRA_MIN_HEAD2DESTSPEED; + + // pitch. First, how far are we along the 2nd half of the journey as a %age?... + // + vec3_t v3TotLengthVect,v3LengthVect; + VectorSubtract(body->m_v3HeliDesiredPos_Stop, body->m_v3HeliDesiredPos_Halfway, v3TotLengthVect); // journey dist + VectorSubtract(body->m_v3HeliDesiredPos_Stop, self->s.origin, v3LengthVect); // dist so far + v3TotLengthVect[2] = v3LengthVect[2] = 0; // lose the Z component + + // get the percentage... + // (broken into if-checked lines because of sqrt() returning float-errors occasionally when zeros occur) + float fTotLen = VectorLength(v3TotLengthVect); + if (fTotLen>0) + { + float fSoFarLen = VectorLength(v3LengthVect); + if (fSoFarLen>0) + { + float fDistPercent = (100/fTotLen) * fSoFarLen; + float fIdealPitch = HELI_COBRA_MAXPITCH_DECEL-((fDistPercent * HELI_COBRA_MAXPITCH_DECEL)/100); // 0..HELI_COBRA_MAXPITCH_DECEL + if (body->m_fHeliMoveSpeed < 4) + { + fIdealPitch = 0; + } + fIdealPitch *= -1; // kef + + // now just adjust our pitch to suit... + // + self->s.angles[HELI_PITCH] = angle2posneg (self->s.angles[HELI_PITCH]); + if (self->s.angles[HELI_PITCH] + HELI_COBRA_PITCHADJSPEED_DECEL <= fIdealPitch) // kef + self->s.angles[HELI_PITCH] +=HELI_COBRA_PITCHADJSPEED_DECEL; + else + if (self->s.angles[HELI_PITCH] - HELI_COBRA_PITCHADJSPEED_DECEL >= fIdealPitch) // kef + self->s.angles[HELI_PITCH] -=HELI_COBRA_PITCHADJSPEED_DECEL; + } + } + } + + + // actual move... + // + vec3_t v; + + VectorSubtract(body->m_v3HeliDesiredPos_Stop,self->s.origin,v); + VectorNormalize(v); + VectorMA(self->s.origin, (body->m_fHeliMoveSpeedm_flags & HELIFLAG_ISDEADFINALGOTO))? + body->m_fHeliMoveSpeed:HELI_COBRA_MAXSPEED, v, self->s.origin); + + // swing round to face it as we move... (and record for firing decision later) + // + float fDegreesToGo; + Cobra2_TurnToFace(self, body->m_v3HeliDesiredPos_Stop, + false, // qbRoll + false, // qbYAWDictatesFiring + &fDegreesToGo // float *pfDegreesToGo + ); + + // should we be firing?... + // + if (body->GetFlags() & HELIFLAG_AUTOFIRE) + { + // check YAW is within (say) 20 degrees either side of desired final , + // and that heli is facing downwards (not up into air on decel phase)...... + // + // (update, greg wants it firing almost all the time, so check based on speed instead) + // + if (fDegreesToGo<20 && //self->s.angles[HELI_PITCH]<0 + body->m_fHeliMoveSpeed>(HELI_COBRA_MAXSPEED/10) + ) + { + // (-ve pitch is nose-down) + Cobra2_Fire(self, (self->s.angles[HELI_PITCH]<=0)? // +ve pitch is nose-up + true:false // qboolean qbInihibitRockets + ); + } + else + Cobra2_Fire_OFF(self); + + }// if (dwHeliFlags & HELIFLAG_AUTOFIRE) + + }// not reached dest... +}// void Cobra2Think_HeadToDest(edict_t *self) + +int Cobra2AimHeadAtPos(edict_t *self, vec3_t vTarget, IGhoulInst* head, GhoulID bolt, + vec3_t vOffset) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + int bRet = AIM_TRUE; + boltonOrientation_c boltonInfo; + + if (!head || !bolt) + return AIM_ERROR; + + boltonInfo.root = self; + boltonInfo.boltonInst = head; + boltonInfo.boltonID = bolt; + boltonInfo.parentInst = self->ghoulInst; + VectorCopy(vTarget, boltonInfo.vTarget); + boltonInfo.fMinPitch = -GUN_PITCH_UP; + boltonInfo.fMaxPitch = GUN_PITCH_DOWN; + boltonInfo.fMinYaw = GUN_YAW_CCW; + boltonInfo.fMaxYaw = GUN_YAW_CW; + boltonInfo.fMaxTurnSpeed = AIM_MAX_TURN_DELTA; + boltonInfo.bUsePitch = false; + boltonInfo.bUseYaw = true; + boltonInfo.bToRoot = true; + + return boltonInfo.OrientBolton(); + +} + +int Cobra2AimGunnerAtPos(edict_t *self, vec3_t vTarget) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + int bRet = AIM_TRUE; + + vec3_t vTargetCopy, vOffset; + + VectorCopy(vTarget, vTargetCopy); + body->GetGunnerBoltOffset(vOffset); + bRet = Cobra2AimHeadAtPos(self, vTargetCopy, body->GetGunnerInst(), + body->GetGunnerBolt(), vOffset); + return bRet; +} + +int Cobra2AimPilotAtPos(edict_t *self, vec3_t vTarget) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + int bRet = AIM_TRUE; + + vec3_t vTargetCopy, vOffset; + + VectorCopy(vTarget, vTargetCopy); + body->GetPilotBoltOffset(vOffset); + bRet = Cobra2AimHeadAtPos(self, vTargetCopy, body->GetPilotInst(), + body->GetPilotBolt(), vOffset); + return bRet; +} + +// set self->think to this funct when a movement such as turntoface, strafetodest, headtodest etc has finished +// and this'll take care of ensuring pitch/roll/pilot head levelled out... +// +void Cobra2Think_MovementFinish(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + int bRet = AIM_TRUE; + + if (body->GetFlags() & HELIFLAG_AUTOFIRE) + Cobra2_Fire_OFF(self); + + if (Cobra2MovementFinished(self)) + { + ai->ActionIsDone(true); + } +}// void Cobra2Think_MovementFinish(edict_t *self) + + +// called at the end of a firing sequence, basically just used to clean up some ghoul anim stuff... +// +void Cobra2_Fire_OFF(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + if (body->GetFlags() & HELIFLAG_CHAINGUNENABLED) + Cobra2FireGun_Off(self); +} + +// Do not try and use the helicopter after you've called this!!!! +void Cobra2_Explode(edict_t *self) +{ + // let the ai know it needs to explode and go away now + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + ai->TimeToDie(true); + ai->ActionIsDone(true); +} + +// called by above, kept seperate so it can also be called by landing code... +// +qboolean Cobra2MovementFinished(edict_t *self) +{ + // we must do these calls even if we early-ret later... + // + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + qboolean qbRollFinished = Cobra2_EnsureRollFinished(self); + int iPilotStatus = Cobra2ResetPilot(self); + int iGunnerStatus = ( (body->m_flags & HELIFLAG_AUTOFIRE) && // do not OR these 2 into one "(flag & val)" check + (body->m_flags & HELIFLAG_CHAINGUNENABLED) + ) + ?Cobra2ResetGunner(self):AIM_TRUE; + // + // level off before going into hover... + // + if (self->s.angles[HELI_PITCH] > 180) + { + self->s.angles[HELI_PITCH] = 360 - self->s.angles[HELI_PITCH]; + } + else if (self->s.angles[HELI_PITCH] < -180) + { + self->s.angles[HELI_PITCH] = self->s.angles[HELI_PITCH] + 360; + } + if ( (self->s.angles[HELI_PITCH] >= 0 && self->s.angles[HELI_PITCH] <= HELI_COBRA_PITCHADJSPEED) || + (self->s.angles[HELI_PITCH] <= 0 && self->s.angles[HELI_PITCH] >= -HELI_COBRA_PITCHADJSPEED) + ) + self->s.angles[HELI_PITCH] = 0; + else + { + // pitch needs leveling... + // + if (self->s.angles[HELI_PITCH] < -HELI_COBRA_PITCHADJSPEED) + { + self->s.angles[HELI_PITCH] += HELI_COBRA_PITCHADJSPEED; // kef + } + else + { + self->s.angles[HELI_PITCH] -= HELI_COBRA_PITCHADJSPEED; // kef + } + + return false; + } + + if (!qbRollFinished)// || iPilotStatus == AIM_FALSE || iGunnerStatus == AIM_FALSE) + return false; + + // levelled off pitch and roll, and pilot yaw'd back to default... + // + return true; + +}// qboolean Cobra2MovementFinished(edict_t *self) + +// adjusts heli YAW by a certain amount, returns TRUE if now facing the desired direction... +// +qboolean Cobra2_TurnToFace(edict_t *self, vec3_t v3WorldPos, qboolean qbRoll, qboolean qbYAWDictatesFiring, float *pfDegreesToGo) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + qboolean qbTurningLeft; + vec3_t v; + + // new bit: special check, if target dir differs only in Z then just return, saves the effect of zero-diff always causing + // it to face east when changing Z position only during HeadToDest... + // + if (self->s.origin[0] == v3WorldPos[0] && self->s.origin[1] == v3WorldPos[1]) + { + if (pfDegreesToGo) + *pfDegreesToGo = 0; + return true; + } + + // gradually alter our facing angle (YAW) to suit travel dir... + // + VectorSubtract(v3WorldPos,self->s.origin,v); + + vec3_t v3DirToFace; + vectoangles(v,v3DirToFace); + +// v3DirToFace[HELI_YAW] -= 90; +// v3DirToFace[HELI_YAW] = anglemod(v3DirToFace[HELI_YAW]); + + // this line is needed to avoid tail-skittering when on autofire in HeadToDest (which converts the YAW to -180..0..180) + // +// self->s.angles[HELI_YAW] = anglemod(self->s.angles[HELI_YAW]); + if (self->s.angles[HELI_YAW] > 180) + { + self->s.angles[HELI_YAW] -= 360; + } + + float fMove = v3DirToFace[HELI_YAW] - self->s.angles[HELI_YAW]; + + if (fabs(fMove) <= HELI_YAWADJ_SPEED) + { + self->s.angles[HELI_YAW] = v3DirToFace[HELI_YAW]; + if (pfDegreesToGo) + *pfDegreesToGo = 0; + return true; + } + else + { + if (pfDegreesToGo) + *pfDegreesToGo = fabs(fMove); + + fMove = anglemod(fMove); + + if (fMove<180) + { + // turn to left... + // + self->s.angles[HELI_YAW] += HELI_YAWADJ_SPEED; + qbTurningLeft = true; + } + else + { + // turn to right... + // + self->s.angles[HELI_YAW] -= HELI_YAWADJ_SPEED; + qbTurningLeft = false; + } + + self->s.angles[HELI_YAW] = anglemod(self->s.angles[HELI_YAW]); + + if (qbRoll) + { + // now handle ROLL... + // (note that this can be much simpler if accel/decel max roll angles are forced to be the same, but they're not, so... + // + // work out how far we are along the turn, and therefore our ideal ROLL angle... + // + float fDegreesInTurn = v3DirToFace[HELI_YAW] - body->m_fHeliTurnStartYaw; + fDegreesInTurn = anglemod(fDegreesInTurn); + if (fDegreesInTurn > 180) + fDegreesInTurn = fabs(360-fDegreesInTurn); + float fHalfWay = fDegreesInTurn/2; + float fCurrentTurnDegs= self->s.angles[HELI_YAW] - body->m_fHeliTurnStartYaw; + fCurrentTurnDegs= anglemod(fCurrentTurnDegs); + if (fCurrentTurnDegs > 180) + fCurrentTurnDegs = fabs(360-fCurrentTurnDegs); + + // how far are we from midpoint in the turn as a percentage?... (with 0% at centre, 100% at edges) + // + float fPercent = (100/fHalfWay) * (fabs(fCurrentTurnDegs-fHalfWay)); + + // (should we be firing, by the way?) + // + if (qbYAWDictatesFiring && (body->m_flags & HELIFLAG_AUTOFIRE)) + { + if (fPercent<90) + Cobra2_Fire(self,false); // qboolean qbInihibitRockets); + else + Cobra2_Fire_OFF(self); + } + + // so are we on the accel or decel phase?... + // + if (fCurrentTurnDegss.angles[HELI_ROLL]>180) + self->s.angles[HELI_ROLL]-= 360; + + if (fabs(self->s.angles[HELI_ROLL] - fIdealRoll) <= HELI_ROLLADJ_SPEED) + self->s.angles[HELI_ROLL] = fIdealRoll; + else + { + if (self->s.angles[HELI_ROLL] < fIdealRoll) + self->s.angles[HELI_ROLL] += HELI_ROLLADJ_SPEED; + else + self->s.angles[HELI_ROLL] -= HELI_ROLLADJ_SPEED; + } + } + else + { + // decel phase... + // + float fIdealRoll = (fPercent * HELI_COBRA_MAXROLL_DECEL)/100; // 0..HELI_COBRA_MAXROLL_DECEL + + if (!qbTurningLeft) + fIdealRoll = -fIdealRoll; + + // make sure 0..360 angle is -180..0..180... + // + if (self->s.angles[HELI_ROLL]>180) + self->s.angles[HELI_ROLL]-= 360; + + if (fabs(self->s.angles[HELI_ROLL] - fIdealRoll) <= HELI_ROLLADJ_SPEED) + self->s.angles[HELI_ROLL] = fIdealRoll; + else + { + if (self->s.angles[HELI_ROLL] < fIdealRoll) + self->s.angles[HELI_ROLL] += HELI_ROLLADJ_SPEED; + else + self->s.angles[HELI_ROLL] -= HELI_ROLLADJ_SPEED; + } + } + }// if (qbRoll) + } + + return false; + +}// qboolean Cobra2_TurnToFace(edict_t *self, vec3_t v3WorldPos, qboolean qbRoll, qboolean qbYAWDictatesFiring, float *pfDegreesToGo) + +// feed this our current pos, the halfway point along our root, and the end point +// returns FALSE if not yet halfway, else TRUE for anything else. +// +qboolean WithinOrBeyondVectors2(vec3_t v3Me, vec3_t v3Halfway, vec3_t v3End) +{ + // sigh, we need to cope with stupid rounding errors, because of when the debugger shows (eg) 452.50 & 452.50 and yet + // says that one is bigger than the other because of some tiny rounding errors that it doesn't display. + + // X... + // + if (fabs(v3Halfway[0]-v3End[0]) > 1.0f) + { + if (v3Halfway[0] < v3End[0]) + { + if (v3Me[0]v3Halfway[0]) + return false; + } + } + + // Y... + // + if (fabs(v3Halfway[1]-v3End[1]) > 1.0f) + { + if (v3Halfway[1] < v3End[1]) + { + if (v3Me[1]v3Halfway[1]) + return false; + } + } + + // Z... + // + if (fabs(v3Halfway[2]-v3End[2]) > 1.0f) + { + if (v3Halfway[2] < v3End[2]) + { + if (v3Me[2]v3Halfway[2]) + return false; + } + } + + return true; + +}// qboolean WithinOrBeyondVectors(vec3_t v3Me, vec3_t v3Halfway, vec3_t v3End) + +void Cobra2FireRockets(edict_t *self, int nLeftRockets, int nRightRockets) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + IGhoulInst *instHeli = NULL; + GhoulID idBoltLeftRocketPod, idBoltRightRocketPod; + IGhoulObj *obj = NULL; + //vec3_t vWaver; + vec3_t vTemp, vF, vR, vU, vFirePoint, vFireDir; + int i = 0; + + instHeli = self->ghoulInst; + if (NULL == instHeli) + { + return; + } + + obj = instHeli->GetGhoulObject(); + if(NULL == obj) + { + return; + } + + AngleVectors(self->s.angles, vF, vR, vU); + VectorScale(vF, 5.0, vF); + VectorScale(vR, 5.0, vR); + VectorScale(vU, 5.0, vU); + + // firing rocket from left pod + if (nLeftRockets > 0) + { + // get id of bolt on the front of left rocket pod + idBoltLeftRocketPod = obj->FindPart("FLASH_ROCKET1"); + + + // actually attack our current target + + GetGhoulPosDir2(self->s.origin, self->s.angles, + instHeli, + idBoltLeftRocketPod, + NULL, vTemp, vFireDir, NULL, NULL); + { + switch(nLeftRockets) + { + case 1: + VectorAdd(vTemp, vR, vFirePoint); + VectorAdd(vFirePoint, vU, vFirePoint); + break; + case 2: + VectorAdd(vTemp, vR, vFirePoint); + VectorSubtract(vFirePoint, vU, vFirePoint); + break; + case 3: + VectorSubtract(vTemp, vR, vFirePoint); + VectorSubtract(vFirePoint, vU, vFirePoint); + break; + case 4: + VectorSubtract(vTemp, vR, vFirePoint); + VectorAdd(vFirePoint, vU, vFirePoint); + break; + } + + // launch the rocket + + // instead of pitching the heli, we'll just fire the rocket at the target + //regardless of z difference + edict_t *targ = body->m_AITarget?body->m_AITarget:Cobra2_GetEntToTarget(self); + VectorSubtract(targ->s.origin, self->s.origin, vFireDir); + VectorNormalize(vFireDir); + fireHeliRocket2(self, vFirePoint, vFireDir); + } + } + // firing rocket from right pod + if (nRightRockets > 0) + { + // get id of bolt on the front of right rocket pod + idBoltRightRocketPod = obj->FindPart("FLASH_ROCKET2"); + + // actually attack our current target + GetGhoulPosDir2(self->s.origin, self->s.angles, + instHeli, + idBoltRightRocketPod, + NULL, vTemp, vFireDir, NULL, NULL); + { + switch(nRightRockets) + { + case 1: + VectorAdd(vTemp, vR, vFirePoint); + VectorAdd(vFirePoint, vU, vFirePoint); + break; + case 2: + VectorAdd(vTemp, vR, vFirePoint); + VectorSubtract(vFirePoint, vU, vFirePoint); + break; + case 3: + VectorSubtract(vTemp, vR, vFirePoint); + VectorSubtract(vFirePoint, vU, vFirePoint); + break; + case 4: + VectorSubtract(vTemp, vR, vFirePoint); + VectorAdd(vFirePoint, vU, vFirePoint); + break; + } + + // launch the rocket + + // instead of pitching the heli, we'll just fire the rocket at the target + //regardless of z difference + edict_t *targ = body->m_AITarget?body->m_AITarget:Cobra2_GetEntToTarget(self); + VectorSubtract(targ->s.origin, self->s.origin, vFireDir); + VectorNormalize(vFireDir); + fireHeliRocket2(self, vFirePoint, vFireDir); + } + } +} + +void Cobra2FireGun(edict_t *self, qboolean bSporadic) +{ + IGhoulInst *instHeli = NULL, *instMuzzle = NULL; + GhoulID idBoltHeliToMuzzle, idEndOfMuzzle; + IGhoulObj *obj = NULL; + GhoulID seq = 0; + vec3_t vFirePoint, vFireDir, vFireDir2; + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + int i = 0, nDifficulty =HELI_DIFFICULTY; + + if (body->m_nRandGunWait || !bSporadic) + { + if (body->m_bGunFiring || !bSporadic) + { + instHeli = self->ghoulInst; + if (NULL == instHeli) + { + return; + } + instMuzzle = body->GetBarrelInst(); + if (NULL == instMuzzle) + { + return; + } + if (!(body->m_flags & HELIFLAG_MGUN_GHOULSEQ_RUNNING)) + { + body->m_flags |= HELIFLAG_MGUN_GHOULSEQ_RUNNING; + + // play the barrel sequence with attached flickering light + if (body->GetBarrelInst()) + { + SimpleModelSetSequence2(body->GetBarrelInst(), "barrel", SMSEQ_LOOP); + } + } + // get id of bolt that connects the gun barrel to the heli + obj = instHeli->GetGhoulObject(); + if(NULL == obj) + { + return; + } + idBoltHeliToMuzzle = obj->FindPart("barrel_base"); + + // get id of the muzzle of the gun barrel + obj = instMuzzle->GetGhoulObject(); + if(NULL == obj) + { + return; + } + idEndOfMuzzle = obj->FindPart("flash_barrel"); + + // instantaneous muzzle flash +// FX_HeliGun(self, instHeli, instMuzzle, idBoltHeliToMuzzle, idEndOfMuzzle); + fxRunner.execWithInst("weapons/othermz/heli", self, instMuzzle, idEndOfMuzzle); + + // actually attack our current target + vec3_t vWaver; + + GetGhoulChildPosDir2(self->s.origin, self->s.angles, + instHeli, + idBoltHeliToMuzzle, + instMuzzle, + idEndOfMuzzle, + NULL, NULL, vFirePoint, vFireDir, NULL, NULL); // this is way too long ;( + VectorScale(vFireDir, 100, vFireDir); +// for (i = 0; i < nDifficulty; i++) + if (body->m_fArg != 1337) + { // introduce some waver to our accuracy + VectorSet(vWaver, gi.irand(-10,10), gi.irand(-10,10), gi.irand(-10,10)); + VectorAdd(vFireDir, vWaver, vFireDir2); + } + else + { // the heck with waver, we want to hit a particular molecule + VectorCopy(vFireDir, vFireDir2); + } + weapons.attack(ATK_HELIGUN, self, vFirePoint, vFireDir2);//same damage, but bigger impact sound + gi.sound (self, CHAN_WEAPON, gi.soundindex("weapons/assault/fire.wav"), .9, .5, 0); + } + } + else + { + body->m_nRandGunWait = gi.irand(2, 10); + body->m_bGunFiring = !body->m_bGunFiring; + } + body->m_nRandGunWait--; + +} + +// stop the ghoul mgun barrel sequence when I stop firing... +// +void Cobra2FireGun_Off(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + if (body->m_flags & HELIFLAG_MGUN_GHOULSEQ_RUNNING) + { + body->m_flags &= ~HELIFLAG_MGUN_GHOULSEQ_RUNNING; + + if (body->GetBarrelInst()) + { + SimpleModelSetSequence2(body->GetBarrelInst(), "barrel_still", SMSEQ_HOLD); + } + } +} + +// returns TRUE when ROLL has leveled off ok, called by both the turn and move code +// +qboolean Cobra2_EnsureRollFinished(edict_t *self) +{ + #define HELI_COBRA_ROLLADJSPEED_LEVELOUT 4 + + self->s.angles[HELI_ROLL] = anglemod(self->s.angles[HELI_ROLL]); + + if ( (self->s.angles[HELI_ROLL] == 0) || + (self->s.angles[HELI_ROLL] + HELI_COBRA_ROLLADJSPEED_LEVELOUT > 360) || + (self->s.angles[HELI_ROLL] - HELI_COBRA_ROLLADJSPEED_LEVELOUT < 0) + ) + { + self->s.angles[HELI_ROLL] = 0; + return true; + } + + if (self->s.angles[HELI_ROLL] > 180) + self->s.angles[HELI_ROLL] += HELI_COBRA_ROLLADJSPEED_LEVELOUT; + else + self->s.angles[HELI_ROLL] -= HELI_COBRA_ROLLADJSPEED_LEVELOUT; + + return false; +} + +int Cobra2ResetHead(edict_t *self, IGhoulInst* head, GhoulID bolt, vec3_t vOffset) +{ + vec3_t vF, vR, vPos; + + AngleVectors(self->s.angles, vF, vR, NULL); + VectorMA(self->s.origin, 100, vF, vPos); + return Cobra2AimHeadAtPos(self, vPos, head, bolt, vOffset); +} + +int Cobra2ResetPilot(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + vec3_t vOffset; + + body->GetPilotBoltOffset(vOffset); + return Cobra2ResetHead(self, body->GetPilotInst(), body->GetPilotBolt(), vOffset); +} + + +int GetGhoulChildPosDir2(vec3_t sourcePos, vec3_t sourceAng, IGhoulInst *inst, GhoulID partID, + IGhoulInst *childInst, GhoulID childPartID, char *name, char *name2, vec3_t pos, vec3_t dir, vec3_t right, vec3_t up) +{ + IGhoulObj *obj = inst->GetGhoulObject(); + IGhoulObj *obj2 = childInst->GetGhoulObject(); + + if(obj && obj2) + { + GhoulID part = (partID) ? partID:obj->FindPart(name); + GhoulID part2 = (childPartID) ? childPartID:obj2->FindPart(name2); + + if(part && part2) + { + Matrix4 EntityToWorld; + EntToWorldMatrix(sourcePos,sourceAng,EntityToWorld); + + Matrix4 childToEntity; + childInst->GetBoltMatrix(level.time, childToEntity, part2, IGhoulInst::MatrixType::Entity); + + Matrix4 BoltToWorld; + BoltToWorld.Concat(childToEntity, EntityToWorld); + + + Vect3 ChunkLoc; + BoltToWorld.GetRow(3,ChunkLoc); //inital pos of chunk, will be unchanged. + // this works too BoltToWorld.XFormPoint(ChunkLoc,Vect3(0.0f,0.0f,0.0f)); + + VectorCopy((float *)&ChunkLoc, pos); + + if (dir) + { + Vect3 zaxisV; + BoltToWorld.GetRow(2,zaxisV); + VectorCopy((float *)&zaxisV, dir); + } + + if(right) + { + Vect3 yaxisV; + BoltToWorld.GetRow(1,yaxisV); + VectorCopy((float *)&yaxisV, right); + } + if(up) + { + Vect3 xaxisV; + BoltToWorld.GetRow(0,xaxisV); + VectorCopy((float *)&xaxisV, up); + } + return 1; + } + } + VectorClear(pos); + VectorClear(dir); + return 0; +} + +int GetGhoulPosDir2(vec3_t sourcePos, vec3_t sourceAng, IGhoulInst *inst, + GhoulID partID, char *name, vec3_t pos, vec3_t dir, vec3_t right, vec3_t up) +{ + IGhoulObj *obj = inst->GetGhoulObject(); + + if(obj) + { + GhoulID part = (partID) ? partID:obj->FindPart(name); + + if(part) + { + Matrix4 EntityToWorld; + EntToWorldMatrix(sourcePos,sourceAng,EntityToWorld); + + Matrix4 BoltToWorld; + Matrix4 BoltToEntity; + + inst->GetBoltMatrix(level.time, BoltToEntity, part, IGhoulInst::MatrixType::Entity); + BoltToWorld.Concat(BoltToEntity,EntityToWorld); + + Vect3 ChunkLoc; + BoltToWorld.GetRow(3,ChunkLoc); + + VectorCopy((float *)&ChunkLoc, pos); + + Vect3 zaxisV; + BoltToWorld.GetRow(2,zaxisV); + VectorCopy((float *)&zaxisV, dir); + + if(right) + { + Vect3 yaxisV; + BoltToWorld.GetRow(1,yaxisV); + VectorCopy((float *)&yaxisV, right); + } + if(up) + { + Vect3 xaxisV; + BoltToWorld.GetRow(0,xaxisV); + VectorCopy((float *)&xaxisV, up); + } + return 1; + } + } + VectorClear(pos); + VectorClear(dir); + return 0; +} + +qboolean Cobra2TargetWithinArc(vec3_t vTargetPos, vec3_t vHeliAngles, vec3_t vHeliPos) +{ + // check the angle between heli's forward vector and the + //target direction vector + +// default is a 160deg firing arc (80deg to either side of forward vector) + float fArcCos = 0.173f; // cos(80degrees) + + float fDot = fArcCos; + vec3_t vForward; + vec3_t vTargetDir; + int i = 0; + + // make sure angles are in the range [0, 360) + for (i=0;i<3;i++) + { + vHeliAngles[i]=anglemod(vHeliAngles[i]); + } + + VectorSubtract(vTargetPos, vHeliPos, vTargetDir); + VectorNormalize(vTargetDir); + AngleVectors(vHeliAngles, vForward, NULL, NULL); + fDot = DotProduct(vForward, vTargetDir); + if (fDot >= fArcCos && fDot <= 1.0f) + { + // current target is within our firing arc + return true; + } + return false; +} + +// we already know when this is called that the target is valid, ie a live player or merc... +// +qboolean Cobra2HasTargetLOS(edict_t *self, edict_t *target, qboolean qbAccountForArc) +{ + trace_t tr; + + vec3_t v3TargetEyeLevel; + VectorCopy(target->s.origin, v3TargetEyeLevel); + v3TargetEyeLevel[2] += target->viewheight; + + gi.trace(self->s.origin, NULL, NULL, v3TargetEyeLevel, self, MASK_OPAQUE, &tr); + if (tr.fraction == 1.0 && (!qbAccountForArc || Cobra2TargetWithinArc(tr.endpos, self->s.angles, self->s.origin))) + return true; + + return false; +} + +int Cobra2AimGunAtPos(edict_t *self, vec3_t vTarget, qboolean bSynchGunner) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + int bRet = AIM_TRUE; + IGhoulInst* barrelInst = body->GetBarrelInst(); + GhoulID barrelBolt = body->GetBarrelBolt(); + boltonOrientation_c boltonInfo; + + if (!barrelInst || !barrelBolt) + return AIM_ERROR; + if (bSynchGunner) + { + Cobra2AimGunnerAtPos(self, vTarget); + } + + // first, yaw the NULL to which the barrel is attached + boltonInfo.root = self; + boltonInfo.boltonInst = body->GetBarrelNULLInst(); + boltonInfo.boltonID = body->GetBarrelNULLBolt(); + boltonInfo.parentInst = self->ghoulInst; + VectorCopy(vTarget, boltonInfo.vTarget); + boltonInfo.fMinPitch = 0; + boltonInfo.fMaxPitch = 0; + boltonInfo.fMinYaw = GUN_YAW_CCW; + boltonInfo.fMaxYaw = GUN_YAW_CW; + boltonInfo.fMaxTurnSpeed = AIM_MAX_TURN_DELTA; + boltonInfo.bUsePitch = false; + boltonInfo.bUseYaw = true; + boltonInfo.bToRoot = true; + boltonInfo.OrientBolton(); + + // now pitch the barrel itself + boltonInfo.parentInst = boltonInfo.boltonInst; + boltonInfo.parentID = boltonInfo.boltonID; + boltonInfo.boltonInst = body->GetBarrelInst(); + boltonInfo.boltonID = body->GetBarrelBolt(); + boltonInfo.fMinPitch = -GUN_PITCH_UP; + boltonInfo.fMaxPitch = GUN_PITCH_DOWN; + boltonInfo.fMinYaw = 0; + boltonInfo.fMaxYaw = 0; + boltonInfo.fMaxTurnSpeed = AIM_MAX_TURN_DELTA; + boltonInfo.bUsePitch = true; + boltonInfo.bUseYaw = false; + boltonInfo.bToRoot = true; + + return boltonInfo.OrientBolton(); +} + +int Cobra2AimGunInDirection(edict_t *self, vec3_t vTargetDir, qboolean bSynchGunner) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + int bRet = AIM_TRUE; + IGhoulInst* barrelInst = body->GetBarrelInst(); + GhoulID barrelBolt = body->GetBarrelBolt(); + boltonOrientation_c boltonInfo; + vec3_t vPos, vF; + + if (!barrelInst || !barrelBolt) + return AIM_ERROR; + if (bSynchGunner) + { + GetGhoulPosDir2(self->s.origin, self->s.angles, body->GetGunnerInst(), 0, "to_body", vPos, vF, NULL, NULL); + VectorMA(vPos, 1000, vTargetDir, vPos); + Cobra2AimGunnerAtPos(self, vPos); + } + + GetGhoulPosDir2(self->s.origin, self->s.angles, body->GetBarrelNULLInst(), 0, "DUMMY01", vPos, vF, NULL, NULL); + VectorMA(vPos, 1000, vTargetDir, vPos); + return Cobra2AimGunAtPos(self, vPos, bSynchGunner); +} + +void HeliMissileRemove2(edict_t *self) +{ + G_FreeEdict(self); +} + +void HeliMissileCollide2(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if(surf) + { + if(surf->flags & SURF_SKY) + { + G_FreeEdict(self); + return; + } + } + T_RadiusDamage (self, self->owner, 130, self, 150, 0); + gmonster.RadiusDeafen(self, 150, 250); + fxRunner.exec("weapons/world/rocketexplode", self->s.origin); + ShakeCameras (self->s.origin, 100, 300, DEFAULT_JITTER_DELTA); + G_FreeEdict(self); +} + +void fireHeliRocket2(edict_t *self, vec3_t v3FirePoint, vec3_t v3FireDir) +{ + edict_t *missile; + + missile = G_Spawn(); + missile->movetype = MOVETYPE_DAN; + missile->solid = SOLID_BBOX; + missile->clipmask = MASK_SHOT; + VectorCopy(v3FirePoint, missile->s.origin); + VectorScale(v3FireDir, 600.0, missile->velocity); + VectorSet (missile->mins, -4, -2, -4); + VectorSet (missile->maxs, 3, 2, 4); + missile->health = 100; + missile->think = HeliMissileRemove2; + missile->nextthink = level.time + 10.0; + missile->touch = HeliMissileCollide2; + missile->gravity = .02; + vectoangles(v3FireDir, missile->s.angles); + gi.linkentity(missile); + missile->owner = self; + + game_ghoul.SetSimpleGhoulModel(missile, "Weapon/Projectiles/Rocket", "Rocket"); + + fxRunner.execContinualEffect("weapons/world/rockettrail2", missile); +} + +int Cobra2AimGunnerInDirection(edict_t *self, vec3_t vTargetDir) +{ + int bRet = AIM_TRUE; + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + IGhoulInst* gunnerInst = body->GetGunnerInst(); + GhoulID gunnerBolt = body->GetGunnerBolt(); + + if (!gunnerInst || !gunnerBolt) + return AIM_ERROR; + + vec3_t vTargetDirCopy, vOffset, vPos; + + VectorCopy(vTargetDir, vTargetDirCopy); + body->GetGunnerBoltOffset(vOffset); + VectorMA(self->s.origin, 10, vTargetDirCopy, vPos); + bRet = Cobra2AimHeadAtPos(self, vPos, gunnerInst, gunnerBolt, vOffset); + return bRet; +} + +int Cobra2AimPilotInDirection(edict_t *self, vec3_t vTargetDir) +{ + int bRet = AIM_TRUE; + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + IGhoulInst* pilotInst = body->GetPilotInst(); + GhoulID pilotBolt = body->GetPilotBolt(); + + if (!pilotInst || !pilotBolt) + return AIM_ERROR; + + vec3_t vTargetDirCopy, vOffset, vPos; + + VectorCopy(vTargetDir, vTargetDirCopy); + body->GetPilotBoltOffset(vOffset); + VectorMA(self->s.origin, 10, vTargetDirCopy, vPos); + bRet = Cobra2AimHeadAtPos(self, vPos, pilotInst, pilotBolt, vOffset); + return bRet; +} + +void Cobra2InitHead(edict_t *self, vec3_t vTargetDir, IGhoulInst* head, + GhoulID bolt, vec3_t vOffset) +{ + vec3_t vOrigin, vF, vR, vU; + + if (!head || !bolt) + { + return; + } + // the origin we use is the NULL at the base of the gunner's head, which + //is calc'd (heli's origin + offset) + AngleVectors(self->s.angles, vF, vR, vU); + VectorScale(vR, vOffset[1], vR); + VectorScale(vF, vOffset[0], vF); + VectorScale(vU, vOffset[2], vU); + VectorAdd(self->s.origin, vF, vOrigin); + VectorAdd(vOrigin, vR, vOrigin); + VectorAdd(vOrigin, vU, vOrigin); + + Matrix4 EntityToWorld; + EntToWorldMatrix(vOrigin,self->s.angles,EntityToWorld); + + Matrix4 BoltToEntity; + self->ghoulInst->GetBoltMatrix(level.time,BoltToEntity,bolt,IGhoulInst::MatrixType::Entity); + + Matrix4 BoltToWorld; + BoltToWorld.Concat(BoltToEntity,EntityToWorld); + + Matrix4 WorldToBolt; + WorldToBolt.Inverse(BoltToWorld); + + Vect3 TargetDir=*(Vect3 *)vTargetDir; + + Vect3 TargetDirInBoltSpace; + WorldToBolt.XFormVect(TargetDirInBoltSpace,TargetDir); + + Matrix4 matR1, matR2, matNew; + float angle1=-atan2(TargetDirInBoltSpace.y(),sqrt(TargetDirInBoltSpace.z()*TargetDirInBoltSpace.z()+TargetDirInBoltSpace.x()*TargetDirInBoltSpace.x())); + float angle2=atan2(TargetDirInBoltSpace.z(),TargetDirInBoltSpace.x()); + float fMin1 = -HEAD_PITCH_UP, fMax1 = HEAD_PITCH_DOWN, + fMin2 = -HEAD_YAW_CW, fMax2 = HEAD_YAW_CCW; + float fDelta1 = 0.0f, fDelta2 = 0.0f; + + //limit the angles here to a reasonble range + + if (angle1 < fMin1 - FLOAT_ZERO_EPSILON) + { + angle1 = fMin1; + } + else if (angle1 > fMax1 + FLOAT_ZERO_EPSILON) + { + angle1 = fMax1; + } + if (angle2 < fMin2 - FLOAT_ZERO_EPSILON || (angle2 >= M_PI/2.0 && angle2 <= M_PI)) + { + // trying to look at quadrant2 or quadrant3 (looking straight down at the head) + angle2 = fMin2; + } + else if (angle2 > fMax2 + FLOAT_ZERO_EPSILON && angle2 <= M_PI/2.0) + { + // trying to look at quadrant1 or quadrant4 (looking straight down at the head) + angle2 = fMax2; + } + + matR1.Rotate(2, angle1); + matR2.Rotate(1, angle2); + matNew.Concat(matR1,matR2); + head->SetXForm(matNew); +} + +int Cobra2ResetGunner(edict_t *self) +{ + vec3_t vF, vR; + + AngleVectors(self->s.angles, vF, vR, NULL); + VectorMA(self->s.origin, 500, vF, vF); + return Cobra2AimGunAtPos(self, vF, true); +} + +// called once per script fireat command... +// +void Cobra2Think_SetFireAt(edict_t *self, vec3_t v3FireDest, float fTime) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + VectorCopy(v3FireDest,body->m_v3HeliFireAtCoords); + VectorCopy(v3FireDest,body->m_v3HeliFireAtCoords_Original); + body->m_fHeliFireAtTimer = fTime; // store timer for now, we're not necessarily in a position to fire + body->m_flags |= HELIFLAG_DOINGSCRIPTEDFIREAT; +#ifdef _DEBUG +#ifdef SHOW_DESIGNER_ERRORS + if (body->m_fHeliFireAtTimer<0 && !(body->m_flags & HELIFLAG_ROCKETSENABLED)) + { + gi.dprintf("\n###### HELI SCRIPT ERROR:\n"); + gi.dprintf("Rocket fire wanted, but rockets disabled!\n\n"); + } +#endif +#endif + + // this'll look nicer, if doing fire from an aggressive hover, and rockets enabled, then change hover param + // so it'll do a pitch-fire, rather than Z match... + // + // (also done now from scripted AI, so it doesn't lose carefully set up Z points by doing a Z match for >2 rockets firing) + // + if ( (body->m_flags & HELIFLAG_ROCKETSENABLED) && body->m_iHeliRocketsLeft) + { + // we have rockets available for firing... + // + if (body->m_flags & (HELIFLAG_DOINGSCRIPTEDHOVER|HELIFLAG_DOINGSCRIPTEDAI)) + body->m_fHeliFireAtTimer = (gi.irand(0,10)>=5)?-2:-1; // fire 1 or 2 rockets at player, dipping to fire, not hori-z-match + } + + ai->SetCurrentActionNextThink(Cobra2Think_GotoFireAt); + self->nextthink = level.time + FRAMETIME; +} + +// called repeatedly until the chopper is in a position to fire at it's assigned target... +// +// (after consulting with Greg, it's been decided that the heli will still goto a suitable firing position first, +// even if it was able to work out that it wouldn't be able to fire even before it set off (eg no rockets for a +// rocket attack). +// +void Cobra2Think_GotoFireAt(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + trace_t tr; + + self->nextthink = level.time + FRAMETIME; + + // ok, there's a clear line of sight to the target, but can we bring our weapons to bear at this angle?... + // + // (this means checking if missiles are to be used, if so, the entire heli body needs to be brought to bear, + // if not, then we can just swivel the minigun round to the target) + // + qboolean qbWholeBodyMustMatch = ( body->m_fHeliFireAtTimer<0 || (body->m_flags & HELIFLAG_ROCKETSENABLED && body->m_iHeliRocketsLeft)); + + if (qbWholeBodyMustMatch) + { + // YAW the heli round to face the target if nec... + // + float fDegreesToGo; + Cobra2_TurnToFace(self, body->m_v3HeliFireAtCoords, // vec3_t v3WorldPos + false, // qboolean qbRoll + false, // qboolean qbYAWDictatesFiring + &fDegreesToGo // float *pfDegreesToGo + ); + + if (fDegreesToGo) + { + // we need to swing the heli round... + // + Cobra2Think_SetTurnDest(self, body->m_v3HeliFireAtCoords); + return; + } + + // Missile yaw ok, checking Z... + + + // if we've specifically asked for either one or 2 rockets to be fired, then we'll do the pitch adjust, + // any other number gets done via a Z match and a long debounce-timed-stream of them... + // + if (body->m_fHeliFireAtTimer == -1 || body->m_fHeliFireAtTimer == -2) + { + // Ideally the chopper should pitch forward/back enough to fire missiles at target, but with deadlines + // pressing I'll do a Z match instead. But for now, the basic algorithm is as follows... + // + float fYlen = fabs(self->s.origin[2] - body->m_v3HeliFireAtCoords[2]); + vec3_t v3DiffVect; + VectorSubtract(body->m_v3HeliFireAtCoords,self->s.origin,v3DiffVect); + v3DiffVect[2]=0; + float fXlen = VectorLength(v3DiffVect); + float fFudgeFactor = 1.0; + float fPitch = atan2(fYlen, fXlen) * RADTODEG * fFudgeFactor; + if (body->m_v3HeliFireAtCoords[2] > self->s.origin[2]) + fPitch = -fPitch; + + if (fabs(fPitch) < HELI_MAX_FIRE_PITCH) + { + // we can hit this target with a pitch change... + // + ai->SetCurrentActionNextThink(Cobra2Think_DipFireAt); + + self->nextthink = level.time + FRAMETIME; + body->m_flags &= ~HELIFLAG_DOINGSCRIPTEDFIREAT; // important! + body->m_flags &= ~(HELIFLAG_FIREDIP1DONE | HELIFLAG_FIREDIP2DONE); + body->m_fHeliFirePitch = fPitch*.1; + + return; + } + // target beyond pitch-adjust, so do normal Z-match version... + } + + // code to match heli Z height to ideal flat-launch pos... + // + if (self->s.origin[2] != body->m_v3HeliFireAtCoords[2]) + { + // height needs adjusting... + // + vec3_t v3; + + VectorCopy(self->s.origin,v3); + v3[2] = body->m_v3HeliFireAtCoords[2]; + + // note, technically the heli should use its real mins/maxs box for this bit, but if I do, it might not be able + // to rise up again from the firing point if it was juat about level with the ground (eg if it was shooting at + // th player), so to avoid getting stuck when lifting up again and using the standard size collision box, I + // have to use the extended one all thtime, even if it means that occasionally it misses a more obvious shot. + // + // (this shouldn't matter too much in the final game since on either the train or tokyo level you never actually + // walk around on the very bottom level of the map, it's only in the choppertest map that it stops some shots) + // + + if (gi.trace(self->s.origin, _HELI_TRACEPARAM_MIN2, + _HELI_TRACEPARAM_MAX2, v3, self,MASK_SOLID, &tr)) + { + // it's clear, so head for it... + // + Cobra2Think_SetDumbFlyDest(self, v3); + return; + } + + // path blocked, so let's just go as far as we can and launch anyway... + // + // (lift up a bit from whatever we trace-hit so we don't (eg) touch the floor)... + // + VectorCopy(tr.endpos,v3); + v3[2] += 40; // arb., roughly 2/3 of a man height + // + // limit-check this new dest, just in case we're in a really strange map area... + // + // (see reasoning on trace call above) + // + gi.trace(self->s.origin, _HELI_TRACEPARAM_MIN2, _HELI_TRACEPARAM_MAX2, + v3, self,MASK_SOLID, &tr); + if (tr.fraction < 1.0) + VectorCopy(tr.endpos,v3); + + body->m_v3HeliFireAtCoords[2] = v3[2]; // so code will see it as a match next time and not do this again + Cobra2Think_SetDumbFlyDest(self, v3); + return; + } + + // Z coords match! + + // success (ready to fire), so fall through... + // + }// if (qbWholeBodyMustMatch) + else + { + // just try aiming the chaingun at it.. + // + int iGunAim = Cobra2AimGunAtPos(self, body->m_v3HeliFireAtCoords, true); // qboolean bSynchGunner + + switch (iGunAim) + { + case AIM_FALSE: + + return; // gun still moving, let's wait and see + + case AIM_ERROR: + { + // bugger, gun has hit edge-stop and can't bear on target, so move heli body... + // + // slightly weird usage this, but it does the job... (will cause YAW movement towards target if not already there) + // + float fDegreesToGo; + Cobra2_TurnToFace(self, body->m_v3HeliFireAtCoords, // vec3_t v3WorldPos + false, // qboolean qbRoll + false, // qboolean qbYAWDictatesFiring + &fDegreesToGo // float *pfDegreesToGo + ); + + if (fDegreesToGo) + { + // we need to swing the heli round... + // + Cobra2Think_SetTurnDest(self, body->m_v3HeliFireAtCoords); + return; + } + else + { + // forget it, although we've got an LOS to the target, we can't get the mgun to bear on it from this + // position even though the YAW is correct, ergo it must be too far underneath us. + // + // this is really more of a scripting error (ie heli not put in suitable place), so for now I'm just + // going to fail this command, though later it could be improved to change position... + // + ai->ActionIsDone(true); + body->m_flags &= ~HELIFLAG_DOINGSCRIPTEDFIREAT; + return; + } + } + + }// switch (iGunAim) + } + + // we're in a suitable firing position here, so... + // + ai->SetCurrentActionNextThink(Cobra2Think_FireAt); + self->nextthink = level.time + FRAMETIME; + body->m_flags &= ~HELIFLAG_DOINGSCRIPTEDFIREAT; // important! + + // duration arg is either a time (if +ve), else a -ve rocket count... + // + if (body->m_fHeliFireAtTimer>0) + body->m_fHeliFireAtTimer += level.time; + +}// void CobraThink_GotoFireAt(edict *self) + + + +// we're trying to fire at something that involves pitching up/down to aim at it (because of missiles)... +// +void Cobra2Think_DipFireAt(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + self->nextthink = level.time + FRAMETIME; + + Cobra2AimPilotAtPos(self, body->m_v3HeliFireAtCoords); + Cobra2AimGunAtPos(self, body->m_v3HeliFireAtCoords, true); // qboolean bSynchGunner + + if ( (body->m_flags & (HELIFLAG_FIREDIP1DONE|HELIFLAG_FIREDIP2DONE)) != (HELIFLAG_FIREDIP1DONE|HELIFLAG_FIREDIP2DONE) ) + _Cobra2Fire_Chaingun(self); + else + Cobra2_Fire_OFF(self); + + if (!(body->m_flags & HELIFLAG_FIREDIP1DONE)) + { + // still heading towards ideal pitch pos... + // + self->s.angles[HELI_PITCH] = angle2posneg2(self->s.angles[HELI_PITCH]); + + if (fabs(self->s.angles[HELI_PITCH] - body->m_fHeliFirePitch) <= HELI_COBRA_DIPFIRE_PITCHADJSPEED) + { + self->s.angles[HELI_PITCH] = body->m_fHeliFirePitch; + body->m_flags |= HELIFLAG_FIREDIP1DONE; + + // fire missiles...(fHeliFireAtTimer == -1 or -2 here) + // + _Cobra2Fire_Rockets(self, -body->m_fHeliFireAtTimer); // iRocketsToForceFire + body->m_fHeliFirePitch = -(body->m_fHeliFirePitch/2); // so we pitch back to the other extent afterwards (looks nicer) + } + else + { + // still heading there... + // + if (self->s.angles[HELI_PITCH] > body->m_fHeliFirePitch) // kef + self->s.angles[HELI_PITCH] -= HELI_COBRA_DIPFIRE_PITCHADJSPEED; + else + self->s.angles[HELI_PITCH] += HELI_COBRA_DIPFIRE_PITCHADJSPEED; + + } + return; + } + + if (!(body->m_flags & HELIFLAG_FIREDIP2DONE)) + { + // heading back towards over-compensate backpitch pos... + // + self->s.angles[HELI_PITCH] = angle2posneg2(self->s.angles[HELI_PITCH]); + + if (fabs(self->s.angles[HELI_PITCH] - body->m_fHeliFirePitch) <= HELI_COBRA_DIPFIRE_PITCHADJSPEED) + { + self->s.angles[HELI_PITCH] = body->m_fHeliFirePitch; + body->m_flags |= HELIFLAG_FIREDIP2DONE; + } + else + { + // still heading there... + // + if (self->s.angles[HELI_PITCH] > body->m_fHeliFirePitch) // kef + self->s.angles[HELI_PITCH] -= HELI_COBRA_DIPFIRE_PITCHADJSPEED; + else + self->s.angles[HELI_PITCH] += HELI_COBRA_DIPFIRE_PITCHADJSPEED; + } + return; + } + + // all pitch stuff done (though we still need to level out again, so... + // + ai->SetCurrentActionNextThink(Cobra2Think_MovementFinish); +}// void CobraThink_DipFireAt(edict_t *self) + + + + + +// called repeatedly while actually firing at something... +// +void Cobra2Think_FireAt(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + qboolean qbFireDone = false; + + self->nextthink = level.time + FRAMETIME; + + // do minor YAW adj here as well for when gun is aimed at target ok, but body still has a bit to go... + // + Cobra2_TurnToFace(self, body->m_v3HeliFireAtCoords, // vec3_t v3WorldPos + false, // qboolean qbRoll + false, // qboolean qbYAWDictatesFiring + NULL // float *pfDegreesToGo + ); + Cobra2AimPilotAtPos(self, body->m_v3HeliFireAtCoords); // same reasoning. + // + // if heli YAW'd, gun will be off-target... + // + Cobra2AimGunAtPos(self, body->m_v3HeliFireAtCoords_Original, true); // qboolean bSynchGunner + + int iRocketsFired = Cobra2_Fire(self, false); // qboolean qbInihibitRockets + + // check whether our time is a duration, or a rocket count... + // + if (body->m_fHeliFireAtTimer<0) // if -ve, it's a rocket count... + { +#ifdef _DEBUG +#ifdef SHOW_DESIGNER_ERRORS + if (!(body->m_flags & HELIFLAG_ROCKETSENABLED)) + { + gi.dprintf("### HELI SCRIPT: aborting attack, rockets disabled!\n"); + Cobra2_Fire_OFF(self); + ai->ActionIsDone(true); + return; + } +#endif +#endif + body->m_fHeliFireAtTimer += iRocketsFired; // dec rockets-to-fire count (-ve) + + // this is a specific rocket attack, so cease firing if the required number have been fired + // or if we've run out... + // + if (body->m_iHeliRocketsLeft==0 || body->m_fHeliFireAtTimer==0.0f) + qbFireDone = true; + } + else + {// end timer must be a real timer then, so... + + if (level.time > body->m_fHeliFireAtTimer) + qbFireDone = true; + } + + if (qbFireDone || (body->m_flags & HELIFLAG_ISDEAD)) + { + Cobra2_Fire_OFF(self); + ai->ActionIsDone(true); + } + +}// void CobraThink_FireAt(edict_t *self) + +// set journey dest but don't worry about any obstructions, just do straight line... +// +void Cobra2Think_SetDumbFlyDest(edict_t *self, vec3_t v3) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + Cobra2_InitTurnStuff(self,v3); + + VectorCopy(self->s.origin, body->m_v3HeliDesiredPos_Start); + + ai->SetCurrentActionNextThink(Cobra2Think_HeadToDest); + self->nextthink = level.time + FRAMETIME; +} + + +// Set journey dest, and ensure it gets there safely even if you have to do several calls to the dumb one to work +// your way round obstacles. If you set a dest that's inside a solid area then it sends out a ring of check positions +// further and further out until one of them is in a clear spot, then changes the dest to that. +// +#define _RING_ENTRIES 18 +const vec3_t fRingTable[_RING_ENTRIES]= +{ + // for speed reasons, this entry is tried first, not in it's logical place below + { 0, 0, 1}, // special entry, searches upwards (copes with common hover-point mistakes by designers) + + { -1, 1, 0}, + { 0, 1, 0}, + { 1, 1, 0}, + + { -1, 0, 0}, + { 1, 0, 0}, + + { -1,-1, 0}, + { 0,-1, 0}, + { 1,-1, 0}, + + // unlikely this'll be needed, but just in case we're told to fly too high... + { 0, 0,-1}, + + // extra search ring, the surrounding 8 compass points but moving upwards at the same time + + { -1, 1, 1}, + { 0, 1, 1}, + { 1, 1, 1}, + + { -1, 0, 1}, + { 1, 0, 1}, + + { -1,-1, 1}, + { 0,-1, 1}, + { 1,-1, 1}, + +}; + +qboolean Cobra2_VecWithinWorld(edict_t *self, vec3_t v3) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + if (ai) + { + return ( + v3[0] < ai->GetHeliXWorldMin2() || + v3[0] > ai->GetHeliXWorldMax2() || + v3[1] < ai->GetHeliYWorldMin2() || + v3[1] > ai->GetHeliYWorldMax2() || + v3[2] < ai->GetHeliZWorldMin2() || + v3[2] > ai->GetHeliZWorldMax2() + )?false:true; + } + return false; +} + + +// ensure that a vector isn't in a wall or off the edge of the map, adjust until legal, then return it... +// +void Cobra2_LegaliseVector(edict_t *self, vec3_t v3in, vec3_t v3Out, qboolean qbUseWorldClip) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + trace_t tr; + + vec3_t v3Dest; + int iSafetyLoopCount=0; + + VectorCopy(v3in,v3Dest); +// Cobra2_ClipVecToWorld(self, v3Dest); + // new bit, let's see if it's impossible to get to this area because the dest is inside a solid + // (this can happen with both hover-twitching and entity-relative goto commands) + // + // This is achieved by tracing back from the dest and seeing if the starting point was solid... + // + gi.trace(v3Dest, _HELI_TRACEPARAM_MIN2, _HELI_TRACEPARAM_MAX2, self->s.origin, + self, MASK_SOLID, &tr); + + // if smart dest pos is inside a wall or off the edge of the map, then we need to change it!... + // + if (tr.startsolid) + { + // dest point is unreachable by any means because it's inside a solid, so we've got to find a new dest pos. + // + // Unfortunately the trace command doesn't work how I'd like (ie. if you start off solid then the endpos is the first + // non-solid point) so I'm going to put 8 points around the dest, then keep expanding them in a ring until I get a + // valid destination...(aaarrggh!!!!) + // + #define HELI_WORLDSPACE_STEPUNITS 100 // step this many units per scan until we find a blank + + int iRingNumber=-1; + int iPassMult=1; + while (1) + { + if (++iSafetyLoopCount>100) + { + // sod it, something's seriously shagged, probably heli is in a highly-cluttered world (unlikely), or + // some dozy twat of a designer has given it a dest coord miles off beyond the map edge. So all we can do is + // forget this goto, since the server's going to take too long to resolve it... + // + // (once the game is at release, this part of the code should never be hit, but it's here JIC) + // + VectorCopy(self->s.origin, v3Dest); + break; // out of while loop + } + + if (++iRingNumber==_RING_ENTRIES) + { + iRingNumber=0; + iPassMult++; + } + + vec3_t v3; + + VectorSet(v3, fRingTable[iRingNumber][0] * (iPassMult * HELI_WORLDSPACE_STEPUNITS), + fRingTable[iRingNumber][1] * (iPassMult * HELI_WORLDSPACE_STEPUNITS), + fRingTable[iRingNumber][2] * (iPassMult * HELI_WORLDSPACE_STEPUNITS) + ); + Vec3AddAssign(v3Dest, v3); + + // update, as a speed issue, I can skip known world edges to avoid spurious traces... + // + if (Cobra2_VecWithinWorld(self, v3)) + {// within designer-specified world limits... + gi.trace(v3, _HELI_TRACEPARAM_MIN2, _HELI_TRACEPARAM_MAX2, + self->s.origin,self,MASK_SOLID, &tr); + + if (!tr.startsolid) + { + // we've maybe found a clear bit, but we have to make sure it isn't off the edge of the map as well, so... + // (reverse src/dest params and try again) + gi.trace(self->s.origin, _HELI_TRACEPARAM_MIN2, _HELI_TRACEPARAM_MAX2, + v3,self,MASK_SOLID, &tr); + + if (tr.fraction != 0.0f) // gotta have dest that allows *some* movement + { + // at last, we've found a clear bit, so let's use this as the final destination... + // + VectorCopy(v3,v3Dest); + break; // out of while loop + } + } + }// within designer-specified world limits... + }// while (1) + }// if smart dest is in a wall +#ifdef _DEBUG +#ifdef SHOW_DESIGNER_ERRORS + // doesn't actually appear on screen, but wtf? + if (!VectorCompare(v3Dest,v3in)) + gi.dprintf("Vector Legalised (%d retries needed)\n",iSafetyLoopCount); +#endif +#endif + VectorCopy(v3Dest,v3Out); + +}// void Cobra_LegaliseVector(edict_t *self, vec3_t v3in, vec3_t v3Out, qboolean qbUseWorldClip) + +void Cobra2_ClipVecToWorld(edict_t* self, vec3_t v3) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + if (ai) + { + if (v3[0] < ai->GetHeliXWorldMin2()) + v3[0] = ai->GetHeliXWorldMin2(); + else if (v3[0] > ai->GetHeliXWorldMax2()) + v3[0] = ai->GetHeliXWorldMax2(); + + if (v3[1] < ai->GetHeliYWorldMin2()) + v3[1] = ai->GetHeliYWorldMin2(); + else if (v3[1] > ai->GetHeliYWorldMax2()) + v3[1] = ai->GetHeliYWorldMax2(); + + if (v3[2] < ai->GetHeliZWorldMin2()) + v3[2] = ai->GetHeliZWorldMin2(); + else if (v3[2] > ai->GetHeliZWorldMax2()) + v3[2] = ai->GetHeliZWorldMax2(); + } +} + + +void Cobra2Think_SetSmartFlyDest(edict_t *self, vec3_t v3) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + VectorCopy(v3,body->m_v3HeliDesiredPos_Smart); + body->m_flags |= HELIFLAG_DOINGSMARTGOTO; + + Cobra2_LegaliseVector(self, body->m_v3HeliDesiredPos_Smart, + body->m_v3HeliDesiredPos_Smart, true); + + ai->SetCurrentActionNextThink(Cobra2Think_SmartHeadToDest); + self->nextthink = level.time + FRAMETIME; + +}// void CobraThink_SetSmartFlyDest(edict_t *self, vec3_t v3) + +// every time we get here we should either stop the smart-goto, or set another dumb-goto target... +// +void Cobra2Think_SmartHeadToDest(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + vec3_t v3Dest; // so we can modify it to work our way round things + + VectorCopy(body->m_v3HeliDesiredPos_Smart,v3Dest); + + // are we actually there?... + // + if (VectorCompare(self->s.origin,v3Dest)) + { + ai->ActionIsDone(true); + self->nextthink = level.time + FRAMETIME; + body->m_flags &= ~HELIFLAG_DOINGSMARTGOTO; // amazingly important to do this + return; + } + + // we're not there yet, but can we see it from here?... + trace_t tr; + + { + gi.trace(self->s.origin, _HELI_TRACEPARAM_MIN2, _HELI_TRACEPARAM_MAX2, v3Dest, self,MASK_SOLID, &tr); + } + + if (tr.fraction == 1.0) + { + // yep, so head for it... + // + Cobra2Think_SetDumbFlyDest(self, v3Dest); + if (VectorLength(body->m_v3HeliDeathDest) && + VectorCompare(body->m_v3HeliDesiredPos_Smart,body->m_v3HeliDeathDest)) + { + body->m_flags |= HELIFLAG_ISDEADFINALGOTO; + } + return; + } + + // ------------------ + // quick test, try tracing from the target back to us (which will be blocked), then set a dest position 3/4 up in the sky + // above the block point, and see if we can see that... + // + vec3_t v3InitialBlockage; + VectorCopy(tr.endpos,v3InitialBlockage); // preserve this collision point + gi.trace(v3Dest, _HELI_TRACEPARAM_MIN2, _HELI_TRACEPARAM_MAX2, self->s.origin, + self,MASK_SOLID, &tr); + if (tr.fraction != 1.0) // sanity check, should never happen because of collision in code above + { + VectorCopy(tr.endpos,v3Dest); // preserve this collision point + v3Dest[2] = ai->GetHeliZWorldMin2() + (((ai->GetHeliZWorldMax2() - ai->GetHeliZWorldMin2())/4)*3); + // + // ok, can we see this sugested point from our current pos... + // + + if (gi.trace(self->s.origin, _HELI_TRACEPARAM_MIN2, _HELI_TRACEPARAM_MAX2, + v3Dest, self,MASK_SOLID, &tr)) + { + // yep, so head for it... + // + Cobra2Think_SetDumbFlyDest(self, v3Dest); + return; + } + // oh well, worth a try... + } + VectorCopy(v3InitialBlockage,tr.endpos); // restore old collision point + // ------------------ + + // we can't see the smart-dest from here, so for now let's try and aim at the blockage point x,y, but set the Z to be + // 3/4 up in the sky... + // + VectorCopy(tr.endpos,v3Dest); + v3Dest[2] = ai->GetHeliZWorldMin2() + ((ai->GetHeliZWorldMax2() - ai->GetHeliZWorldMin2())*0.75); + // + // can we see this point? + // + + if (gi.trace(self->s.origin, _HELI_TRACEPARAM_MIN2, _HELI_TRACEPARAM_MAX2, v3Dest, + self,MASK_SOLID, &tr)) + { + // yes, so let's go with this... + // + // (1st, a fix for things we can't reach by flying over the top of stuff...) + // + if (VectorCompare(self->s.origin, v3Dest)) + { + // let's do a 50-50 thing... + // + if (gi.flrand(0,1)>0.5) + { + Cobra2Think_SetDumbFlyDest(self, *Cobra2Think_GetRandomPatrolDestPos(self)); + return; + } +#ifdef _DEBUG +#ifdef SHOW_DESIGNER_ERRORS + gi.dprintf("### HELISCRIPT ERROR: Can't reach dest by climbing over! Aborting...\n"); +#endif +#endif + ai->ActionIsDone(true); + self->nextthink = level.time + FRAMETIME; + body->m_flags &= ~HELIFLAG_DOINGSMARTGOTO; // amazingly important to do this + return; + } + + Cobra2Think_SetDumbFlyDest(self, v3Dest); + return; + } + + // damn, we must be in a really blocked area, how about straight up?... + // + VectorCopy(self->s.origin,v3Dest); + v3Dest[2] = ai->GetHeliZWorldMin2() + ((ai->GetHeliZWorldMax2() - ai->GetHeliZWorldMin2())*0.75); + + if (gi.trace(self->s.origin, _HELI_TRACEPARAM_MIN2, _HELI_TRACEPARAM_MAX2, v3Dest, + self,MASK_SOLID, &tr)) + { + // yes, so let's go with this... + // + Cobra2Think_SetDumbFlyDest(self, v3Dest); + return; + } + + // hmmm, wherever we are we must be *really* blocked in, so fall out and allow normal code to pick a new random pos... + // + Cobra2Think_SetDumbFlyDest(self, *Cobra2Think_GetRandomPatrolDestPos(self)); + +}// void CobraThink_SmartHeadToDest(edict_t *self) + +void Cobra2Think_SetTurnDest(edict_t *self, vec3_t v3) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + Cobra2_InitTurnStuff(self,v3); + + ai->SetCurrentActionNextThink(Cobra2Think_TurnToFace); + self->nextthink = level.time + FRAMETIME; +} + +// fXStrafeDist is of course +ve to our RT, -ve to LT... +// +void Cobra2Think_SetSidestrafeDest(edict_t *self, float fXStrafeDist) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + trace_t tr; + + vec3_t v3Offset,v3NewRelativeDest, vF, vR; + + AngleVectors(self->s.angles, vF, vR, NULL); + VectorScale(vR, fXStrafeDist, v3NewRelativeDest); + if (fXStrafeDist>=0) + { // strafing right + body->m_flags &= ~HELIFLAG_SIDESTRAFEISTOLEFT; + } + else + { + body->m_flags |= HELIFLAG_SIDESTRAFEISTOLEFT; + } + VectorSet(v3Offset,fXStrafeDist,0,0); + + VectorAdd(self->s.origin,v3NewRelativeDest,body->m_v3HeliDesiredPos_Stop); + VectorCopy(self->s.origin, body->m_v3HeliDesiredPos_Start); + + // we need to know if the strafe will send us off the entire world... + // + if (!Cobra2_VecWithinWorld(self, body->m_v3HeliDesiredPos_Stop)) + { + // hmmm, let's have try re-calcing the dest stop pos... + // + // notice the use of the Vector_GetHalfWayPoint() call rather than just world-clipping the dest, + // this keeps the vector correct... + // + for (int iTries=0; iTries<10; iTries++) // 30 = arb. + { + Vector_GetHalfWayPoint(self->s.origin, body->m_v3HeliDesiredPos_Stop, + body->m_v3HeliDesiredPos_Stop); + + if (Cobra2_VecWithinWorld(self, body->m_v3HeliDesiredPos_Stop)) + break; + } + + if (iTries==10) + { + // this is daft, it's well off the edge... + // +#ifdef _DEBUG +#ifdef SHOW_DESIGNER_ERRORS + gi.dprintf("### HELISCRIPT: Sidestrafe would go off world edge!\n"); +#endif +#endif + + self->nextthink = level.time + FRAMETIME; + ai->ActionIsDone(true); + return; + } + // new pos now back within world... + } + + // vector is within the world, so let's check if it's clear... + // + gi.trace(self->s.origin, _HELI_TRACEPARAM_MIN2, _HELI_TRACEPARAM_MAX2, + body->m_v3HeliDesiredPos_Stop, self,MASK_SOLID, &tr); + if (tr.fraction < 1.0) // did the trace hit something? + VectorCopy(tr.endpos,body->m_v3HeliDesiredPos_Stop); + + ai->SetCurrentActionNextThink(Cobra2Think_SidestrafeToDest); + self->nextthink = level.time + FRAMETIME; +} + +void Cobra2Think_Hover(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + self->nextthink = level.time + FRAMETIME; + + // hover anim still playing? (approx 3 seconds) + // + if ((body->m_flags & HELIFLAG_PLAYINGHOVERANIM) && !body->GetFuselageEOS()) + return; + + // Hover anim finished. Switch to first frame (normal static position) and hold... + // + body->m_flags &= ~HELIFLAG_PLAYINGHOVERANIM; + SimpleModelSetSequence(self, "cobrass", SMSEQ_HOLD); + // + // Now, either finish hover think, + // or do something nasty (if aggressive) + // or start anim off again for another hover cycle. + + // finish hover?... + // + if (level.time > body->m_fHeliHoverTimer || (body->m_flags & (HELIFLAG_ISDEAD|HELIFLAG_SCRIPTEDAIJUSTFINISHED))) + { + // yep... + // + body->m_flags &= ~HELIFLAG_DOINGSCRIPTEDHOVER; + ai->SetCurrentActionNextThink(Cobra2Think_MovementFinish); + return; + } + + + // do something nasty? + // + if (body->m_flags & HELIFLAG_HOVERISAGGRESIVE) + { + // Shoot at people from time to time... + // + // (originally, it only did this on a 20% chance, which was fine when this was called every .1 seconds, but + // since it only gets here after a 3 second hover anim has finished it should do it all the time now) + if ( + (body->m_flags & (HELIFLAG_ROCKETSENABLED|HELIFLAG_CHAINGUNENABLED)) // any weapon enabled + ) + { + edict_t *target = Cobra2_GetEntToTarget(self); + + // if doing hover as a result of scripted AI then ignore visibility arc (because it's more aggressive and probably went into hover at a known good waypoint)... + // + if (target && Cobra2HasTargetLOS(self, target, (body->m_flags & HELIFLAG_DOINGSCRIPTEDAI)?false:true)) // qboolean qbAccountForArc + { + Cobra2Think_SetFireAt(self, target->s.origin, 1.0f); // 1 second burst + return; + } + } + + // Turn occasionally, just to look more belligerent/alert... + // + // (originally, it only did this on a 20% chance, which was fine when this was called every .1 seconds, but + // since it only gets here after a 3 second hover anim has finished it should do it all the time now) + // + { + // set random turn dir... + // + + vec3_t v3; + VectorSet(v3, gi.flrand(-1000,1000), gi.flrand(-1000,1000), 0); + Vec3AddAssign(self->s.origin,v3); + Cobra2Think_SetTurnDest(self, v3); + return; + } + } + + // start hover anim off again... + // + SimpleModelSetSequence(self, "cobrass", SMSEQ_HOLD); + body->m_flags |= HELIFLAG_PLAYINGHOVERANIM; + body->SetFuselageEOS(false); + +}// void CobraThink_Hover(edict_t *self) + +void Cobra2_SetHoverParams(edict_t *self, float fTime, qboolean qbAggressive) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + // set flags... + // + body->m_flags |= HELIFLAG_DOINGSCRIPTEDHOVER; + + if (qbAggressive) + body->m_flags |= HELIFLAG_HOVERISAGGRESIVE; + else + body->m_flags &=~HELIFLAG_HOVERISAGGRESIVE; + // + // set duration... + // + body->m_fHeliHoverTimer = level.time + fTime; + + // go... + // + self->nextthink = level.time + FRAMETIME; + ai->SetCurrentActionNextThink(Cobra2Think_Hover); +} + +void Cobra2Think_SidestrafeToDest(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + vec3_t v3HeliDesiredPos_Halfway; + Vector_GetHalfWayPoint(body->m_v3HeliDesiredPos_Start, body->m_v3HeliDesiredPos_Stop, v3HeliDesiredPos_Halfway); + + self->nextthink = level.time + FRAMETIME; + + Cobra2AimPilotAtPos(self, body->m_v3HeliDesiredPos_Stop); // should look ok I think + Cobra2ResetGunner(self); // jic. + + + // have we reached our dest?... + // + if (fabs (self->s.origin[0] - body->m_v3HeliDesiredPos_Stop[0]) <= body->m_fHeliMoveSpeed && + fabs (self->s.origin[1] - body->m_v3HeliDesiredPos_Stop[1]) <= body->m_fHeliMoveSpeed && + fabs (self->s.origin[2] - body->m_v3HeliDesiredPos_Stop[2]) <= body->m_fHeliMoveSpeed + ) + { + // we've reached it (or close enough), so do final position adjustement to make it exact... + // + //VectorCopy(body->m_v3HeliDesiredPos_Stop,self->s.origin); + body->m_fHeliMoveSpeed = 0; + + // make sure we've turned off the gun barrel sequence + SimpleModelSetSequence2(body->GetBarrelInst(), "barrel_still", SMSEQ_HOLD); + ai->SetCurrentActionNextThink(Cobra2Think_MovementFinish); + } + else + {// not reached dest... + // + // acceleration/roll logic here... + // + if (!WithinOrBeyondVectors2(self->s.origin, v3HeliDesiredPos_Halfway, body->m_v3HeliDesiredPos_Stop)) + { + // accel... + // + body->m_fHeliMoveSpeed += (HELI_COBRA_ACCEL*2.0); + + // First, how far are we along the first half of the journey as a %age?... + // + vec3_t v3TotLengthVect,v3LengthVect; + VectorSubtract(v3HeliDesiredPos_Halfway, body->m_v3HeliDesiredPos_Start, v3TotLengthVect); // journey dist + VectorSubtract(v3HeliDesiredPos_Halfway, self->s.origin, v3LengthVect); // dist so far + v3TotLengthVect[2] = v3LengthVect[2] = 0; // lose the Z component + + // get the inverse percentage... + // (broken into if-checked lines because of sqrt() returning float-errors occasionally when zeros occur) + float fTotLen = VectorLength(v3TotLengthVect); + if (fTotLen>0) + { + float fSoFarLen = VectorLength(v3LengthVect); + if (fSoFarLen>0) + { + float fDistPercent = 100-((100/fTotLen) * fSoFarLen); + float fIdealRoll = -(HELI_COBRA_MAXROLL-((fDistPercent * HELI_COBRA_MAXROLL)/100)); // HELI_COBRA_MAXROLL..0 + + if (!(body->m_flags & HELIFLAG_SIDESTRAFEISTOLEFT)) + fIdealRoll = -fIdealRoll; + + // make sure 0..360 angle is -180..0..180... + // + self->s.angles[HELI_ROLL] = angle2posneg (self->s.angles[HELI_ROLL]); + + if (fabs(self->s.angles[HELI_ROLL] - fIdealRoll) <= HELISTRAFE_ROLLADJ_SPEED) + self->s.angles[HELI_ROLL] = fIdealRoll; + else + { + if (self->s.angles[HELI_ROLL] < fIdealRoll) + self->s.angles[HELI_ROLL] += HELISTRAFE_ROLLADJ_SPEED; + else + self->s.angles[HELI_ROLL] -= HELISTRAFE_ROLLADJ_SPEED; + } + } + } + } + else + {// decel... + + body->m_fHeliMoveSpeed -= (HELI_COBRA_ACCEL*1.5); + if (body->m_fHeliMoveSpeed < 2) // arb, should be z, but this ensure we keep moving if we fall a little short + body->m_fHeliMoveSpeed = 2; + + // pitch. First, how far are we along the 2nd half of the journey as a %age?... + // + vec3_t v3TotLengthVect,v3LengthVect; + VectorSubtract(body->m_v3HeliDesiredPos_Stop, v3HeliDesiredPos_Halfway, v3TotLengthVect); // journey dist + VectorSubtract(body->m_v3HeliDesiredPos_Stop, self->s.origin, v3LengthVect); // dist so far + v3TotLengthVect[2] = v3LengthVect[2] = 0; // lose the Z component + + // get the percentage... + // (broken into if-checked lines because of sqrt() returning float-errors occasionally when zeros occur) + float fTotLen = VectorLength(v3TotLengthVect); + if (fTotLen>0) + { + float fSoFarLen = VectorLength(v3LengthVect); + if (fSoFarLen>0) + { + float fDistPercent = (100/fTotLen) * fSoFarLen; + float fIdealRoll = HELI_COBRA_MAXROLL_DECEL-((fDistPercent * HELI_COBRA_MAXROLL_DECEL)/100); // 0..HELI_COBRA_MAXROLL_DECEL + if (body->m_fHeliMoveSpeed < 2) + fIdealRoll = 0; + + // now just adjust our ROLL to suit... + // + if (!(body->m_flags & HELIFLAG_SIDESTRAFEISTOLEFT)) + fIdealRoll = -fIdealRoll; + + // make sure 0..360 angle is -180..0..180... + // + self->s.angles[HELI_ROLL] = angle2posneg (self->s.angles[HELI_ROLL]); + + if (fabs(self->s.angles[HELI_ROLL] - fIdealRoll) <= HELISTRAFE_ROLLADJ_SPEED) + self->s.angles[HELI_ROLL] = fIdealRoll; + else + { + if (self->s.angles[HELI_ROLL] < fIdealRoll) + self->s.angles[HELI_ROLL] += HELISTRAFE_ROLLADJ_SPEED; + else + self->s.angles[HELI_ROLL] -= HELISTRAFE_ROLLADJ_SPEED; + } + } + } + }// decel + + // actual move... + // + vec3_t v; + + VectorSubtract(body->m_v3HeliDesiredPos_Stop,self->s.origin,v); + VectorNormalize(v); + VectorMA(self->s.origin, (body->m_fHeliMoveSpeedm_fHeliMoveSpeed:HELI_COBRA_MAXSPEED, v, self->s.origin); + + // fire!!... + // + if (body->m_fHeliMoveSpeed > HELI_COBRA_MAXSPEED/4) // looks more natural + Cobra2_Fire(self,false); // qboolean qbInihibitRockets + else + Cobra2_Fire_OFF(self); + + }// not reached dest... + +}// void CobraThink_SidestrafeToDest(edict_t *self) + +// called for final vertical descent when over pad...(and rotor winddown) +// +void Cobra2Think_Land(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + IGhoulInst* instMainRotor = NULL, *instTailRotor = NULL; + + self->nextthink = level.time + FRAMETIME; + instMainRotor = body->GetMainRotorInst(); + instTailRotor = body->GetTailRotorInst(); + + // heli pitch and roll will already be zero here, but straighten out heads of pilot and gunner... + // + if (!Cobra2MovementFinished(self)) + return; + + // set speed as a percentage of the landing height... + // + float fPercent = ((100.0f/(float)(HELI_COBRA_IDEAL_LANDING_HEIGHT)) * (self->s.origin[2] - body->m_v3HeliPadRestPos[2])); + float fSpeed = (fPercent * HELI_MAX_LANDING_SPEED)/100; // HELI_MAX_LANDING_SPEED..0 + if (fSpeed<2) + fSpeed=2; // arb., maintain a certain minimum speed + + body->m_fHeliMoveSpeed = fSpeed; + + // since this is only called when X&Y are ok, we'll just check the Z... + // + if (fabs (self->s.origin[2] - body->m_v3HeliPadRestPos[2]) < body->m_fHeliMoveSpeed) + { + // close enough, we've either just landed or are winding down the rotors... + // + VectorCopy(body->m_v3HeliPadRestPos,self->s.origin); // force right coords anyway + + // wind down the rotor anim... + // + if (body->m_flags & HELIFLAG_ROTORSCHANGINGSPEED) + { + if (!body->m_bRotorEOS) + return; + + // rotors wound down to stop, switch to static blade anim... + // + if (instMainRotor && instTailRotor) + { + SimpleModelSetSequence2(instMainRotor, "rotor", SMSEQ_HOLD); + SimpleModelSetSequence2(instTailRotor, "rotor", SMSEQ_HOLD); + body->m_flags&= ~HELIFLAG_ROTORSCHANGINGSPEED; + } + } + else + { + // time to start rotor winddown... + // + // (this is still far faster than a real chopper wind-down, but short of having a ghoul anim 2 zillion frames long + // we'll probably have to live with it. + // Let's just pretend that combat choppers have rotor-brakes for fast-shutdown... ) + // + if (instMainRotor && instTailRotor) + { + SimpleModelSetSequence2(instMainRotor, "rotor_end", SMSEQ_HOLD); + SimpleModelSetSequence2(instTailRotor, "rotor_end", SMSEQ_HOLD); + body->m_flags&= ~HELIFLAG_ROTORSCHANGINGSPEED; + body->m_flags |= HELIFLAG_ROTORSCHANGINGSPEED; + body->m_bRotorEOS = false; + } + return; + } + + // assuming the rotor is now stopped... + // + ai->SetCurrentActionNextThink(Cobra2Think_OnPad); + body->m_fHeliMoveSpeed = 0; + return; + } + + // still descending... + // + self->s.origin[2] -= body->m_fHeliMoveSpeed; + +}// void CobraThink_Land(edict_t *self) + +// AI can 'rest' inside this code if no script events pending... +// +void Cobra2Think_OnPad(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + if (body->m_flags & HELIFLAG_ISDEAD) + { + ai->SetCurrentActionNextThink(Cobra2_Explode); + } + else + { + ai->ActionIsDone(true); + } +} + +// should only be called when you know it's on the pad... +// +void Cobra2Think_Repair(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + self->nextthink = level.time + FRAMETIME; + + if (self->health < self->max_health) + { + // repairing... + // + #define HELI_SECONDS_FOR_FULLREPAIR 5 + self->health += (self->max_health / (HELI_SECONDS_FOR_FULLREPAIR*10)); + if (self->health <= self->max_health) + return; + + // healed... + self->health = self->max_health; + } + + // done with healing... + // + ai->SetCurrentActionNextThink(Cobra2Think_OnPad); +} + +vec3_t *Cobra2Think_GetRandomPatrolDestPos(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + static vec3_t v3 = {0,0,0}; + trace_t tr; + + // come up with a random position relative to ourselves... + // + v3[0] = self->s.origin[0] + ((gi.flrand(0, 5000))-2500); // 5000 = roughly 535 feet (assuming 6' man is 56 units high) + v3[1] = self->s.origin[1] + ((gi.flrand(0, 5000))-2500); // + v3[2] = self->s.origin[2] + ((gi.flrand(0, 500 ))- 250); // less vert movement + + Cobra2_ClipVecToWorld(self, v3); + + // for aesthetics, don't go too near the ground when picking random heli dest positions... + // + if (v3[2] < ai->GetHeliZWorldMin2()+56*2) // no lower than 2 man heights above the pad + v3[2] = ai->GetHeliZWorldMin2()+56*2; + + // now trace between current pos and dest pos to check flightpath is clear... + // + gi.trace(self->s.origin, _HELI_TRACEPARAM_MIN2, _HELI_TRACEPARAM_MAX2, v3, + self,MASK_SOLID, &tr); + + // (as it happens, this also copes with map edges by returning current position as the new dest (when tr.fraction=0.0f), + // which would cause a new random dir to be generated next cycle since we'd 'complete' this one instantly) + // + if (tr.fraction < 1.0) + VectorCopy(tr.endpos,v3); // route blocked, so adopt collision point as dest pos... + + return &v3; +} + +void Cobra2Think_SetPilotlookDest(edict_t *self, vec3_t v3) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + VectorCopy(v3,body->m_v3HeliHeadStop); + ai->SetCurrentActionNextThink(Cobra2Think_PilotLookat); + self->nextthink = level.time + FRAMETIME; +} + +void Cobra2Think_SetGunnerlookDest(edict_t *self, vec3_t v3) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + VectorCopy(v3,body->m_v3HeliHeadStop); + ai->SetCurrentActionNextThink(Cobra2Think_GunnerLookat); + self->nextthink = level.time + FRAMETIME; +} + +void Cobra2Think_PilotLookat(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + self->nextthink = level.time + FRAMETIME; + + if (Cobra2AimPilotAtPos(self, body->m_v3HeliHeadStop) != AIM_FALSE) + { + ai->ActionIsDone(true); + } +} + +void Cobra2Think_GunnerLookat(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + self->nextthink = level.time + FRAMETIME; + + if (Cobra2AimGunAtPos(self, body->m_v3HeliHeadStop, true) != AIM_FALSE) // qboolean bSynchGunner); + { + ai->ActionIsDone(true); + } +} + + +// called from the strafeing code... (ie probably every 10th of a second) +// +// (if you call this, you must call the OFF version below when finished with it) +// +// (return val is a # rockets actually fired) +// +int _Cobra2Fire_Rockets(edict_t *self, int iRocketsToForceFire) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + int iRocketsFired = 0; + + if ((body->m_flags & HELIFLAG_ROCKETSENABLED) && body->m_iHeliRocketsLeft) + { + if (iRocketsToForceFire || + level.time > body->m_fHeliRocketFireDebounceTime) // takes care of both debounce time and initial zero value + { + do + { + int iTubeNumber = ((body->m_iHeliRocketsLeft+1)&~1)/2; // 1/2/3/4 + + Cobra2FireRockets(self, (body->m_iHeliRocketsLeft&1)?iTubeNumber:0, // int nLeftRockets + (body->m_iHeliRocketsLeft&1)?0:iTubeNumber // int nRightRockets + ); + body->m_iHeliRocketsLeft--; + // re-arm heli when run out, if Greg etc wants it to. Note that I do this instead of removing the -- operator + // above because this way the code for which tube to fire out of still works ok + // + if (!body->m_iHeliRocketsLeft && (self->spawnflags & INFINITE_ROCKETS)) + body->m_iHeliRocketsLeft = HELI_MAX_ROCKETS; + + body->m_fHeliRocketFireDebounceTime = level.time + 1.0f; // only fires rockets once a second max + iRocketsFired++; + } + while ((--iRocketsToForceFire)>0); + } + } + + return iRocketsFired; +} +void _Cobra2Fire_Chaingun(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + if (body->m_flags & HELIFLAG_CHAINGUNENABLED) + Cobra2FireGun(self, false); // qboolean bSporadic +} + + +int Cobra2_Fire(edict_t *self, qboolean qbInihibitRockets) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + +#ifdef _DEBUG +#ifdef SHOW_DESIGNER_ERRORS + if (!(body->m_flags & (HELIFLAG_ROCKETSENABLED | HELIFLAG_CHAINGUNENABLED))) + gi.dprintf("### HELISCRIPT: FIRE called when all weapons disabled!\n"); +#endif +#endif + + _Cobra2Fire_Chaingun(self); + return (qbInihibitRockets)?0: _Cobra2Fire_Rockets (self, 0); // int iRocketsToForceFire) + +}// int Cobra_Fire(edict_t *self, qboolean qbInihibitRockets) + + +void Cobra2Think_TurnToFace(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + self->nextthink = level.time + FRAMETIME; + + // aim the pilot at the turn dest, but only aim the gunner/gun there if we're going to fire at the dest on arrival... :-) + // + if (body->m_flags & HELIFLAG_DOINGSCRIPTEDFIREAT) + Cobra2AimGunAtPos(self, body->m_v3HeliFireAtCoords, true); // qboolean bSynchGunner + else + Cobra2ResetGunner(self); + + Cobra2AimPilotAtPos(self, body->m_v3HeliDesiredPos_Stop); + + if (!Cobra2_TurnToFace(self, body->m_v3HeliDesiredPos_Stop, true, // qbRoll + true, // qbYAWDictatesFiring + NULL)) // float *pfDegreesToGo + { + return; + } + + ai->SetCurrentActionNextThink(Cobra2Think_MovementFinish); +} + + + +void Cobra2_SetAIParams(edict_t *self, float fTime) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + body->m_flags |= HELIFLAG_DOINGSCRIPTEDAI; + + body->m_fHeliAITimer = level.time + fTime; + body->m_iHeliAITable = -1; + + self->nextthink = level.time + FRAMETIME; + ai->SetCurrentActionNextThink(Cobra2Think_AI); +} + + +/* +findme:mystuff +qboolean Cobra2TargetEntValid(edict_t *self, edict_t *target) +edict_t *Cobra2_GetEntToTarget(edict_t *self) + + edict_t* m_AITarget; + + + ai logic flow + ============= + + sublogic code: + { + before switch(): + + if (current target ent no longer valid) + cease this ai sublogic + else + { + if (can see target ent) + { + switch (rand) + { + case: + + if (rand()) + { + if (missiles enabled) + fire 1..2 missile(s) at target ent + break; + } + + fire for rand() time, qb_rocketinhibit = rand() + break; + + case: + + if (rand) + { + find waypoint nearest to target ent + if (waypoint nearer than present origin) + { + if !already there, + goto it +// else +// aggressive hover + } +// else +// aggressive hover + } + else + aggressive hover; + + break; + } + } + else + { + do normal switch-case code + } + } + } + + + sublogic caller: + + (after sublogic called, before new table chooser) + + if (current target ent no longer valid) + if (no new target ent found) + set random hover + + + + + // rand ai's... + // + type 1: (volume sidestrafe) find volume centre nearest current target, if can Z match him (and X or Y volume bounds exceed player's coord), process for strafe + type 2: (waypoint hover) goto random waypoint, pilot lookat, hover-aggressive for short rand time + type 3: (volume wander) pick random points within volume space, hover-aggressive, pick random within another volume (do as clipped moverel), goto. + type 4: (volume zoom) pick random point within a volume, goto, pick any other point within volume, headtodest + +*/ + +// return values:- +// +// 0 = cease the calling AI code function and pick another (probably because target is dead) +// 1 = carry on with normal AI code +// 2 = new logic has been setup in here, so just return (hmmm, in the end, this turns out to need the same action upon return as retval 0. Oh well) +// +int Cobra2_AISublogic(edict_t *self, generic_ghoul_heli_ai* ai, body_heli* body) +{ + + // if current target ent no longer valid then cease this sublogic... + // + if (!Cobra2TargetEntValid(self, body->m_AITarget)) + { + return 0; + } + + // if not a very aggressive heli, then don't bother trying to fire at target... + if (!(body->m_fAIAggressiveness > gi.irand(0,10))) + { + return 1; + } + + // if we can't see the target, return and carry on as normal... + // + // (check heli aggressiveness to decide whether it can see behind it (actually, this is intelligence really, but + // there isn't a seperate variable for that)... + // + if (!(body->m_fAIAggressiveness > gi.irand(0,10))) + { + // not-so-aggressive helis check line-of-sight... + // + if (!Cobra2HasTargetLOS(self, body->m_AITarget, true)) // qboolean qbAccountForArc + { + return 1; + } + } + + // now either fire at the target, or move nearer to him to fire later... + // + switch (gi.irand(0,1)) + { + case 0: + { + vec3_t v3; + + // if there are any rockets available, then do rocket-specific attack (if you don't check for this then it might + // do rocket-firing during a timed attack, which'd cause it to Z-match and change heights (potentially going behind + // obstructions etc and losing LOS) + // + if ( (body->m_flags & HELIFLAG_ROCKETSENABLED) && body->m_iHeliRocketsLeft) + { + if (body->m_flags & HELIFLAG_ROCKETSENABLED) + { + VectorSet(v3,gi.flrand(-10,10),gi.flrand(-10,10),0); // at least have a chance of missing + VectorAdd(body->m_AITarget->s.origin, v3, v3); + v3[2] += body->m_AITarget->viewheight; + Cobra2Think_SetFireAt(self, v3, (gi.irand(0,10)>=5)?-1:-2); + break; + } + } + + // if we got here then no rocket attack happened, so do a timed attack... (which because of above check will be chaingun only) + // + VectorSet(v3,0,0,0); // flrand(-50,50),flrand(-50,50),0); + v3[2] += body->m_AITarget->viewheight; + VectorAdd(body->m_AITarget->s.origin, v3, v3); + Cobra2Think_SetFireAt(self, v3, gi.flrand(2,4)); + break; + } + + case 1: + { + // 50-50 either do an aggressive hover, or goto nearest waypoint from which he can see the player... + // + int iWayPoints = ai->GetNumWaypointPts(); + if (iWayPoints && (body->m_fAIAggressiveness > gi.irand(0,10))) + { + // find nearest waypoint to target ent... + // + vec3_t v3; + float fBestDist = 1000000; // some suitably huge number bigger than any map (there is some sort of float_max defined, but only for windows, and this is server-side code) + vec3_t v3BestWayPoint; + + float fBestDist_Visible = 1000000; // some suitably huge number bigger than any map (there is some sort of float_max defined, but only for windows, and this is server-side code) + vec3_t v3BestWayPoint_Visible; + qboolean qbVisibleWayPointFound = false; + + trace_t tr; + + // this will be used several times, so work it out here... + // + vec3_t v3TargetEyeLevel; + VectorCopy (body->m_AITarget->s.origin, v3TargetEyeLevel); + v3TargetEyeLevel[2] += body->m_AITarget->viewheight; + + float fClosestSeePosDist = 1000000; // some suitably huge number bigger than any map (there is some sort of float_max defined, but only for windows, and this is server-side code) + vec3_t v3ClosestSeePosToCurrent; + VectorClear(v3ClosestSeePosToCurrent); // tested for Z later + + for (int i=0; iGetWaypointPt(i); + + if (NULL == pWayPoint) + { + continue; + } + VectorSubtract(body->m_AITarget->s.origin,pWayPoint->m_v,v3); + float fThisDist = VectorLength(v3); + + + // Can we see the target from here?... + // + if (gi.trace(pWayPoint->m_v, NULL, NULL, v3TargetEyeLevel, self, MASK_OPAQUE, &tr)) + { + // yes, so keep the best can-see waypoint... + // + if (fThisDistm_v,v3BestWayPoint_Visible); + qbVisibleWayPointFound = true; + } + + // is this visible waypoint the closest to our current position?...(used later on for logic tweak) + // + VectorSubtract(self->s.origin,pWayPoint->m_v,v3); + if (!Vec3IsZero(v3)) // don't bother if we're already at this position + { + fThisDist = VectorLength(v3); + if (fThisDistm_v,v3ClosestSeePosToCurrent); + } + } + } + else + { + // no, but record it anyway in case none of the waypoint positions can see the target... + // + if (fThisDistm_v,v3BestWayPoint); + } + } + } + + // We'll always have a valid best waypoint here, no need to verify. + // Now, if we can already see the target from here, then only adopt the new position if it can also + // see the player and is closer, but if we can't see it (and the new position can) then go there even if + // it's further away (this will look really intelligent)... + // + VectorSubtract(body->m_AITarget->s.origin,self->s.origin,v3); + float fThisDist = VectorLength(v3); + + // can we see the target already?... + // + if (gi.trace(self->s.origin, NULL, NULL, v3TargetEyeLevel, self, MASK_OPAQUE, &tr)) + { + // yes, did we find another waypoint that could also see the target?... + // + if (qbVisibleWayPointFound) + { + // is the new waypoint at least 800 (arb.) world units closer?... + // + if (fBestDist_Visible+800ai; + body_heli* body = ai->GetHeliBody(); + + int iSublogicRet = Cobra2_AISublogic(self, ai, body); + + switch (iSublogicRet) + { + case 0: body->m_iHeliAITable = -1; // (and fall through) + case 2: return; + } + + switch (body->m_iHeliAIIndex++) + { + case 0: + { + + // is there a suitable waypoint volume we can go to for a strafe?... + // + int iWayPointVolumes = ai->GetNumWaypointVols(); + if (iWayPointVolumes) + { + // + // find nearest volume to target ent... + // + vec3_t v3; + float fBestDist = 1000000; // some suitably huge number bigger than any map (there is some sort of float_max defined, but only for windows, and this is server-side code) + heliWaypoint* pBestWayPoint = NULL; + + for (int i=0; iGetWaypointVol(i); + + VectorSubtract(body->m_AITarget->s.origin,pWayPoint->m_v,v3); + float fThisDist = VectorLength(v3); + + if (fThisDistGetVolumeMins(vMins); + pBestWayPoint->GetVolumeMaxs(vMaxs); + + if (body->m_AITarget->s.origin[2] >= vMins[2] && + body->m_AITarget->s.origin[2] <= vMaxs[2] + ) + {// volume encompasses target Z + // + // now check either Y or X first... + // + int iAxisIndex = gi.irand(0,1); // 0 or 1 + int iGoodAxis = -1; + + if (vMins[iAxisIndex] < body->m_AITarget->s.origin[iAxisIndex] && + vMaxs[iAxisIndex] > body->m_AITarget->s.origin[iAxisIndex] + ) + iGoodAxis = iAxisIndex; + else + { + iAxisIndex ^=1; // toggle 0..1 (ie between x and y axis) + if (vMins[iAxisIndex] < body->m_AITarget->s.origin[iAxisIndex] && + vMaxs[iAxisIndex] > body->m_AITarget->s.origin[iAxisIndex] + ) + iGoodAxis = iAxisIndex; + } + + if (iGoodAxis != -1) + { + // excellent! we've found a suitable strafeing volume... + // + // now work out a suitable sidestrafe distance... + // + body->m_fSideStrafeDist = min( fabs(vMins[iGoodAxis] - body->m_AITarget->s.origin[iGoodAxis]), + fabs(vMaxs[iGoodAxis] - body->m_AITarget->s.origin[iGoodAxis]) + ); + body->m_fSideStrafeDist = min(body->m_fSideStrafeDist,800); // limit it + + // don't do small strafes, by the time it's ready to fire the run has ended... + if (body->m_fSideStrafeDist > 100) + { + // make up a dest coord within the volume at nearest point to target...(strafe centre) + // + vec3_t v3; + VectorCopy(body->m_AITarget->s.origin,v3); + + if (vMins[iGoodAxis^1]>body->m_AITarget->s.origin[iGoodAxis^1]) + { + v3[iGoodAxis^1] = vMins[iGoodAxis^1]; + if (iGoodAxis==1) + body->m_iSideStrafeDir = 3; + else + body->m_iSideStrafeDir = 2; + } + else + { + v3[iGoodAxis^1] = vMaxs[iGoodAxis^1]; + if (iGoodAxis==1) + body->m_iSideStrafeDir = 1; + else + body->m_iSideStrafeDir = 0; + } + + // now move to one side... + // + if (gi.irand(0,10)>=5) + body->m_fSideStrafeDist = -body->m_fSideStrafeDist; // random left or right + + const vec3_t v3StrafeDirMults[4] = { + {1,0,0}, // facing north, strafeing RT + {0,-1,0}, // facing east, strafeing RT + {-1,0,0}, // facing south, strafeing RT + {0,1,0} // facing west, strafeing RT + }; + + for (int i=0; i<3; i++) + v3[i] += (v3StrafeDirMults[body->m_iSideStrafeDir][i]) * -body->m_fSideStrafeDist; + + Cobra2Think_SetSmartFlyDest(self, v3); + return; + }// if (body->m_fSideStrafeDist > 100) + }// Cobra2Think_SetSmartFlyDest(self, v3BestWayPoint_Visible); + }// volume encompasses target Z + }// if (pBestWayPoint) + }// if (iWayPointVolumes) + break; // no suitable volume found, so break out and invalidate table at func bot. + }// case 0: + + case 1: + { + // we've arrived at one end of the strafe run, so turn to face the proper direction... + // + const vec3_t v3StrafeDirAdds[4] = { + {0,1,0}, // facing north + {1,0,0}, // facing east + {0,-1,0}, // facing south + {-1,0,0} // facing west + }; + vec3_t v3; + VectorCopy(self->s.origin,v3); + for (int i=0; i<3; i++) + v3[i] += v3StrafeDirAdds[body->m_iSideStrafeDir][i] * 1000; + + Cobra2Think_SetTurnDest(self, v3); + return; + } + + case 2: + { + // we're now at the correct position, facing the correct dir, so start the strafe... + // + Cobra2Think_SetSidestrafeDest(self, body->m_fSideStrafeDist*2); // *2 because prev value was effectively the 'radius' (ie half) + return; + } + }// switch (body->m_iHeliAIIndex++) + + body->m_iHeliAITable = -1; +} + + + + +// type 2: (waypoint hover) goto random waypoint, pilot lookat, hover-aggressive for short rand time +void Cobra2AI_1(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + int iSublogicRet = Cobra2_AISublogic(self, ai, body); + + switch (iSublogicRet) + { + case 0: body->m_iHeliAITable = -1; // (and fall through) + case 2: return; + } + + switch (body->m_iHeliAIIndex++) + { + case 0: + { + // pick random waypoint to head to... + // + int iWayPoints = ai->GetNumWaypointPts(); + if (iWayPoints) + { + heliWaypoint* pWayPoint = ai->GetWaypointPt(gi.irand(0,100)%iWayPoints); + + Cobra2Think_SetSmartFlyDest(self, pWayPoint->m_v); + return; + } + break; // no waypoints, so forget this logic code + } + + case 1: + { + // I'll not bother doing a pilot lookat, it'd get overridden on the first hover-turn anyway, + // so just swing round to face the player.. + // + Cobra2Think_SetTurnDest(self, body->m_AITarget->s.origin); + return; + } + + case 2: + { + // hover for a short time... + // + Cobra2_SetHoverParams(self,gi.flrand(1,3), true + //(body->m_fAIAggressiveness > irand(0,10))?true:false); // qboolean qbAggressive + ); + return; + } + }// switch (body->m_iHeliAIIndex++) + + body->m_iHeliAITable = -1; +} + + +// type 3: (volume wander) pick random points within volume space, hover-aggressive, repeat sequence, exit +void Cobra2AI_2(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + int iSublogicRet = Cobra2_AISublogic(self, ai, body); + + switch (iSublogicRet) + { + case 0: body->m_iHeliAITable = -1; // (and fall through) + case 2: return; + } + + switch (body->m_iHeliAIIndex++) + { + case 0: + case 2: + { + + int iWayPointVolumes = ai->GetNumWaypointVols(); + if (iWayPointVolumes) + { + heliWaypoint* pVolume = ai->GetWaypointVol(gi.irand(0,100)%iWayPointVolumes); + + // now goto a random position within that volume... + // + vec3_t v3,vMins,vMaxs; + pVolume->GetVolumeMins(vMins); + pVolume->GetVolumeMaxs(vMaxs); + + VectorSet(v3,gi.flrand(vMins[0],vMaxs[0]),gi.flrand(vMins[1],vMaxs[1]),gi.flrand(vMins[2],vMaxs[2])); + Cobra2Think_SetSmartFlyDest(self, v3); + return; + } + break; + } + + case 1: + case 3: + { + // hover aggressive for a short time... + // + Cobra2_SetHoverParams(self,gi.flrand(1,3), true); // qboolean qbAggressive + return; + } + }// switch (body->m_iHeliAIIndex++) + + body->m_iHeliAITable = -1; +} + + +// type 4: (volume zoom) pick random point within a volume, goto, pick any other point within same volume, headtodest +void Cobra2AI_3(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + edict_t* nextTarget = Cobra2_GetEntToTarget(self); + int iSublogicRet = Cobra2_AISublogic(self, ai, body); + + switch (iSublogicRet) + { + case 0: body->m_iHeliAITable = -1; // (and fall through) + case 2: return; + } + + switch (body->m_iHeliAIIndex++) + { + case 0: + { + int iWayPointVolumes = ai->GetNumWaypointVols(); + if (iWayPointVolumes) + { + body->m_iWhichRandVolume = gi.irand(0,100)%iWayPointVolumes; + heliWaypoint* pVolume = ai->GetWaypointVol(body->m_iWhichRandVolume); + + // now goto a random position within that volume... + // + vec3_t v3,vMins,vMaxs; + pVolume->GetVolumeMins(vMins); + pVolume->GetVolumeMaxs(vMaxs); + + VectorSet(v3,gi.flrand(vMins[0],vMaxs[0]),gi.flrand(vMins[1],vMaxs[1]),gi.flrand(vMins[2],vMaxs[2])); + Cobra2Think_SetSmartFlyDest(self, v3); + return; + } + break; + } + + case 1: + case 2: + { + // goto another point within the same volume... + // + heliWaypoint* pVolume = ai->GetWaypointVol(body->m_iWhichRandVolume); + + // now goto a random position within that volume... + // + vec3_t v3,vMins,vMaxs; + pVolume->GetVolumeMins(vMins); + pVolume->GetVolumeMaxs(vMaxs); + + VectorSet(v3,gi.flrand(vMins[0],vMaxs[0]),gi.flrand(vMins[1],vMaxs[1]),gi.flrand(vMins[2],vMaxs[2])); + Cobra2Think_SetSmartFlyDest(self, v3); + return; + } + + case 3: + { + // hover aggressive for a short time... + // + Cobra2_SetHoverParams(self,2, true); // qboolean qbAggressive + return; + } + } + + body->m_iHeliAITable = -1; +} + +#define NUM_COBRA2_AI_ROUTINES 4 // update this as needed + + +void Cobra2Think_AI(edict_t *self) +{ + self->nextthink = level.time + FRAMETIME; + + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + int iHeliAITable_Last = body->m_iHeliAITable; + + if (body->m_iHeliAITable != -1) + { + switch (body->m_iHeliAITable) + { + case 0: Cobra2AI_0(self); break; + case 1: Cobra2AI_1(self); break; + case 2: Cobra2AI_2(self); break; + case 3: Cobra2AI_3(self); break; + } + } + + if (body->m_iHeliAITable == -1) + { + // pick a rand AI table (and check it's not the one we've just done) and a new target... + // + body->m_AITarget = Cobra2_GetEntToTarget(self); + body->m_iHeliAITable = gi.irand(0,NUM_COBRA2_AI_ROUTINES)%NUM_COBRA2_AI_ROUTINES; // because irand() *almost* never returns the max arg + if (body->m_iHeliAITable == iHeliAITable_Last) + body->m_iHeliAITable = (body->m_iHeliAITable+1)%NUM_COBRA2_AI_ROUTINES; + body->m_iHeliAIIndex = 0; + ai->ActionIsDone(true); + + } + +}// void CobraThink_AI(edict_t *self) + + +// this should be return true if the target is either a live client or merc... +// +qboolean Cobra2TargetEntValid(edict_t *self, edict_t *target) +{ + // fixme: update this when we decide how to tell a merc from a monster... + // + if (!target || + !target->inuse || // dead merc + (target->inuse && target->takedamage==DAMAGE_NO) // dead client + ) + return false; + + return true; +} + + +// called at every new internal-AI action to decide who to shoot at, currently this will cycle just +// between player(s), but later will have to be rewritten in order to shoot at non-client teammates (ie mercs in SoF) +// +// (returns NULL if no suitable target found) +// +edict_t *Cobra2_GetEntToTarget(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + edict_t *target; + edict_t *target_firstfound=NULL; + int iTargetFirstFoundIndex; + + // time to select a new target?... + // + if (level.time < body->m_fNewTargetTimer && Cobra2TargetEntValid(self, body->m_AITarget)) + return body->m_AITarget; + + body->m_fNewTargetTimer = level.time + 30; // new target picked every 30 seconds + body->m_AITarget = NULL; + + // fixme: this loop will probably need expanding when it's finally decided how mercs are implemented... + for (int i=1; iclient) + break; // apparently there's no gap in the client list, so this point is EOL + + if (!Cobra2TargetEntValid(self, target)) + continue; + + // this entity is alive and a viable heli target... + // + if (!target_firstfound) + { + target_firstfound = target; + iTargetFirstFoundIndex = i; + } + + // should we use this as the return value? + // + if (i>body->m_iLastEntFoundIndex) + { + body->m_iLastEntFoundIndex=i; + body->m_AITarget = target; // found a target further along ent list than last time, so use it + break; + } + } + + // list exhausted, if there was anyone at all then target them... + // + if (target_firstfound) + { + body->m_iLastEntFoundIndex=iTargetFirstFoundIndex; + body->m_AITarget = target_firstfound; + } + + return body->m_AITarget; + +}// edict_t *Cobra2_GetEntToTarget(edict_t *self) + + + + +//////////////////////////////////////////////////////////////////////// +// end: stuff copied directly from m_heli.cpp +//////////////////////////////////////////////////////////////////////// + +void Cobra2_OutOfControl(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + vec3_t vGravity = {0, 0, 0}; + vec3_t vF, vR, vU; + float fFinalPitch = 20; // kef + AngleVectors(self->s.angles, vF, vR, vU); + { + vF[2] = 0; + if (self->s.angles[HELI_PITCH] < fFinalPitch) + { + self->s.angles[HELI_PITCH] += 2; + } + else + { + self->s.angles[HELI_PITCH] -= 2; + } + + if (-fFinalPitch - fabs(self->s.angles[HELI_PITCH]) < 2) + { + vGravity[2] = max(-10, -4*(level.time - body->m_fHeliHoverTimer)); + } + VectorAdd(self->velocity, vGravity, self->velocity); + VectorMA(self->velocity, self->s.angles[HELI_PITCH]*-2.5f, vF, self->velocity); + + self->avelocity[YAW] = min(self->avelocity[YAW]+45,180); + } + ai->SetCurrentActionNextThink(Cobra2_OutOfControl); +} + +void Cobra2Touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + if (body->m_flags & HELIFLAG_ISDEADACKNOWLEDGED) + { + ai->TimeToDie(true); + } +} + +void Cobra2LandHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + if (self->spawnflags & IN_AIR) + { +#ifdef _DEBUG +#ifdef SHOW_DESIGNER_ERRORS + gi.dprintf("### HELISCRIPT: Can't land when spawned in air! (no pad position)\n"); +#endif +#endif + ai->ActionIsDone(true); + return; + } + + // may as well check if we're already at the right XY position... (saves climbing up to v3IdealLandingPos then dropping again) + // + if (self->s.origin[0] != body->m_v3HeliPadRestPos[0] || + self->s.origin[1] != body->m_v3HeliPadRestPos[1] || + self->s.origin[2] > body->m_v3HeliPadRestPos[2]+HELI_COBRA_IDEAL_LANDING_HEIGHT + ) + { + // xy mismatch, or too high, so head to a suitable place above the pad... + // + vec3_t v3IdealLandingPos; + + VectorCopy(body->m_v3HeliPadRestPos,v3IdealLandingPos); + v3IdealLandingPos[2]+=HELI_COBRA_IDEAL_LANDING_HEIGHT; + + Cobra2Think_SetSmartFlyDest(self, v3IdealLandingPos); + } + else + { + ai->ActionIsDone(true); + } + body->m_flags |= HELIFLAG_DOINGSCRIPTEDLANDING; // the clever bit (well, there has to be one...) +} + +void Cobra2GotoCoordsHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + vec3_t vPos; + VectorCopy(body->m_vPos,vPos); + + Cobra2Think_SetSmartFlyDest(self, vPos); +} + +void Cobra2GotoRelEntHelper(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + vec3_t vPos; + VectorCopy(body->m_target->s.origin, body->m_v3HeliDesiredPos_Smart); + if (body->m_vPos[0]) + { + body->m_v3HeliDesiredPos_Smart[0] = body->m_target->s.origin[0] + body->m_vPos[0]; + } + if (body->m_vPos[1]) + { + body->m_v3HeliDesiredPos_Smart[1] = body->m_target->s.origin[1] + body->m_vPos[1]; + } + if (body->m_vPos[2]) + { + body->m_v3HeliDesiredPos_Smart[2] = body->m_target->s.origin[2] + body->m_vPos[2]; + } + VectorCopy(body->m_v3HeliDesiredPos_Smart,vPos); + + Cobra2Think_SetSmartFlyDest(self, vPos); +} + +void Cobra2GotoRelHelper(edict_t *self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + vec3_t vPos; + VectorAdd(body->m_vPos, self->s.origin, vPos); + + Cobra2Think_SetSmartFlyDest(self, vPos); +} + +void Cobra2StrafeHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + Cobra2Think_SetSidestrafeDest(self, body->m_fArg); +} + +void Cobra2HoverHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + // kinda silly, but I'm using body->m_vPos[0] as a boolean cuz I need + //a parameter other than body->m_fArg + Cobra2_SetHoverParams(self, body->m_fArg, body->m_vPos[0]); +} + +void Cobra2HamburgerHelper(edict_t* self) +{ + // I couldn't resist... +} + +void Cobra2FaceRelEntHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + vec3_t v3; + + VectorAdd(body->m_target->s.origin, body->m_vPos, v3); + Cobra2Think_SetTurnDest(self, v3); +} + +void Cobra2FaceAbsHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + vec3_t v3; + + VectorCopy(body->m_vPos, v3); + Cobra2Think_SetTurnDest(self, v3); +} + +void Cobra2FaceAbsDirHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + vec3_t v3; + + VectorCopy(body->m_vPos, v3); + VectorNormalize(v3); + VectorMA(self->s.origin, 1000, v3, v3); + Cobra2Think_SetTurnDest(self, v3); +} + +void Cobra2FaceRelCoordsHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + vec3_t v3; + + VectorAdd(self->s.origin, body->m_vPos, v3); + Cobra2Think_SetTurnDest(self, v3); +} + +void Cobra2HeadFaceRelEntHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + vec3_t v3; + + VectorAdd(body->m_target->s.origin, body->m_vPos, v3); + if (body->m_fArg) + { + Cobra2Think_SetPilotlookDest(self, v3); + } + else + { + Cobra2Think_SetGunnerlookDest(self, v3); + } +} + +void Cobra2HeadFaceRelCoordsHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + vec3_t v3; + + VectorAdd(self->s.origin, body->m_vPos, v3); + if (body->m_fArg) + { + Cobra2Think_SetPilotlookDest(self, v3); + } + else + { + Cobra2Think_SetGunnerlookDest(self, v3); + } +} + +void Cobra2HeadFaceAbsCoordsHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + vec3_t v3; + + VectorCopy(body->m_vPos, v3); + if (body->m_fArg) + { + Cobra2Think_SetPilotlookDest(self, v3); + } + else + { + Cobra2Think_SetGunnerlookDest(self, v3); + } +} + +void Cobra2FireAtRelEntHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + // if told to fire at someone who's dead, then don't bother... + edict_t* target = body->m_target; + + if (!Cobra2TargetEntValid(self,target)) + { + ai->ActionIsDone(true); + return; + } + + vec3_t v3; + VectorAdd(target->s.origin, body->m_vPos, v3); + Cobra2Think_SetFireAt(self, v3, body->m_fArg); +} + +void Cobra2FireAtAbsHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + vec3_t v3; + + VectorCopy(body->m_vPos, v3); + Cobra2Think_SetFireAt(self, v3, body->m_fArg); +} + +void Cobra2FireAtRelHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + vec3_t v3; + + VectorAdd(self->s.origin, body->m_vPos, v3); + Cobra2Think_SetFireAt(self, v3, body->m_fArg); +} + +void Cobra2RocketsEnableHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + if (body->m_fArg) + { + body->m_flags |= HELIFLAG_ROCKETSENABLED; + } + else + { + body->m_flags &= ~HELIFLAG_ROCKETSENABLED; + } + ai->ActionIsDone(true); +} + +void Cobra2ChainGunEnableHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + if (body->m_fArg) + { + body->m_flags |= HELIFLAG_CHAINGUNENABLED; + } + else + { + body->m_flags &= ~HELIFLAG_CHAINGUNENABLED; + Cobra2_Fire_OFF(self); + } + ai->ActionIsDone(true); +} + +void Cobra2AutoFireHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + if (body->m_fArg) + { + body->m_flags |= HELIFLAG_AUTOFIRE; + } + else + { + body->m_flags &= ~HELIFLAG_AUTOFIRE; + } + ai->ActionIsDone(true); +} + +void Cobra2WorldHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + if (body->m_fArg) // 1 == maxs + { + ai->SetHeliXWorldMax2(body->m_vPos[0]); + ai->SetHeliYWorldMax2(body->m_vPos[1]); + ai->SetHeliZWorldMax2(body->m_vPos[2]); + } + else // 0 == mins + { + ai->SetHeliXWorldMin2(body->m_vPos[0]); + ai->SetHeliYWorldMin2(body->m_vPos[1]); + ai->SetHeliZWorldMin2(body->m_vPos[2]); + } + ai->ActionIsDone(true); +} + +void Cobra2RearmHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + body->m_iHeliRocketsLeft = HELI_MAX_ROCKETS; + + ai->ActionIsDone(true); +} + +void Cobra2DeathDestHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + VectorCopy(body->m_vPos, body->m_v3HeliDeathDest); + ai->ActionIsDone(true); +} + +void Cobra2HealthHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + float fSkillMultiplier = 1; // 1 is the default for skill level 3 -- "challenging" + + //fSkillMultiplier = (.25 * (1 + level.skillLevel)); + fSkillMultiplier = ( 0.33 * (1 + game.playerSkills.getEnemyValue()) ); + if (0 == body->m_vPos[0]) // 0 == health + { + if (body->m_fArg < 1) + { + self->health = 0; + } + else + { + self->health = 1000 + (int)(fSkillMultiplier * body->m_fArg); + } + } + else if (1 == body->m_vPos[0]) // 1 == maxhealth + { + if (self->max_health < 1) + { + self->max_health = 0; + } + else + { + self->max_health = 1000 + (int)(fSkillMultiplier * body->m_fArg); + } + } + ai->ActionIsDone(true); +} + +void Cobra2TraceDimsHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + if (body->m_fArg) + { + body->m_flags &= ~HELIFLAG_NOTRACEDIMS; + } + else + { + body->m_flags |= HELIFLAG_NOTRACEDIMS; + } + ai->ActionIsDone(true); +} + +void Cobra2AIHelper(edict_t* self) +{ + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + Cobra2_SetAIParams(self, body->m_fArg); + ai->ActionIsDone(true); +} + +void Cobra2_ToggleGun(edict_t *self, edict_t *other, edict_t *activator) +{ + // Greg is so demanding. I swear. + generic_ghoul_heli_ai* ai = (generic_ghoul_heli_ai*)(ai_public_c*)self->ai; + body_heli* body = ai->GetHeliBody(); + + if (body) + { + body->SetFiring(!body->IsFiring()); + } +} + +/*QUAKED m_x_chopper_black (1 .5 0) (-280 -280 -50) (280 280 70) IN_AIR ONDIE_HEAD2SPAWN INFINITE_ROCKETS DEBUG_WAYPOINTS ATTACK_CHOPPER + + This is the version that uses the class-based AI code. + +--------SPAWNFLAGS---------- +IN_AIR: already in the air, no pad exists (so don't try landing it!!) +ONDIE_HEAD2SPAWN: when damaged to death, plummet towards spawn pos before exploding +INFINITE_ROCKETS: go on, guess. +DEBUG_WAYPOINTS: enable this flag if you want to see waypoints/volumes/world dims drawn in the air +ATTACK_CHOPPER: this heli will become a Hind attack chopper with a certain script command +ALWAYS_SEEN draws no matter what + +--------KEYS------------ +Volume - aggressiveness. You *must* fill this in (values 0 to 10). 10's good for Tokyo, 3 is ok for Train. +*/ + +/*QUAKED m_x_chopper_green (1 .5 0) (-280 -280 -50) (280 280 70) IN_AIR ONDIE_HEAD2SPAWN INFINITE_ROCKETS DEBUG_WAYPOINTS ATTACK_CHOPPER ALWAYS_SEEN + + This is the version that uses the class-based AI code. + +--------SPAWNFLAGS---------- +IN_AIR: already in the air, no pad exists (so don't try landing it!!) +ONDIE_HEAD2SPAWN: when damaged to death, plummet towards spawn pos before exploding +INFINITE_ROCKETS: go on, guess. +DEBUG_WAYPOINTS: enable this flag if you want to see waypoints/volumes/world dims drawn in the air +ATTACK_CHOPPER: this heli will become a Hind attack chopper with a certain script command +ALWAYS_SEEN draws no matter what + +--------KEYS------------ +Volume - aggressiveness. You *must* fill this in (values 0 to 10). 10's good for Tokyo, 3 is ok for Train. +*/ + +/*QUAKED m_x_chopper_white (1 .5 0) (-280 -280 -50) (280 280 70) IN_AIR ONDIE_HEAD2SPAWN INFINITE_ROCKETS DEBUG_WAYPOINTS ATTACK_CHOPPER ALWAYS_SEEN + + This is the version that uses the class-based AI code. + +--------SPAWNFLAGS---------- +IN_AIR: already in the air, no pad exists (so don't try landing it!!) +ONDIE_HEAD2SPAWN: when damaged to death, plummet towards spawn pos before exploding +INFINITE_ROCKETS: go on, guess. +DEBUG_WAYPOINTS: enable this flag if you want to see waypoints/volumes/world dims drawn in the air +ATTACK_CHOPPER: this heli will become a Hind attack chopper with a certain script command +ALWAYS_SEEN draws no matter what + +--------KEYS------------ +Volume - aggressiveness. You *must* fill this in (values 0 to 10). 10's good for Tokyo, 3 is ok for Train. +*/ + +/*QUAKED m_x_hind (1 .5 0) (-280 -280 -50) (280 280 70) IN_AIR ONDIE_HEAD2SPAWN INFINITE_ROCKETS DEBUG_WAYPOINTS ATTACK_CHOPPER ALWAYS_SEEN + + This is the version that uses the class-based AI code. + +--------SPAWNFLAGS---------- +IN_AIR: already in the air, no pad exists (so don't try landing it!!) +ONDIE_HEAD2SPAWN: when damaged to death, plummet towards spawn pos before exploding +INFINITE_ROCKETS: go on, guess. +DEBUG_WAYPOINTS: enable this flag if you want to see waypoints/volumes/world dims drawn in the air +ATTACK_CHOPPER: this heli will become a Hind attack chopper with a certain script command +ALWAYS_SEEN draws no matter what + +--------KEYS------------ +Volume - aggressiveness. You *must* fill this in (values 0 to 10). 10's good for Tokyo, 3 is ok for Train. +*/ + +void generic_heli_spawnnow (edict_t *self, char *subclass, char* skinname) +{ + vec3_t v3DeathDest; // unfortunately we need a temp vector since the body doesn't exist till later + trace_t tr; + bool bHind = (0 == strcmp(subclass, "hind")); + char *modelName = bHind?"enemy/hind":"enemy/chopper", + *modelSubname = bHind?"hind":"cobrass"; + + // precache sounds and effects + entSoundsToCache[CLSFX_SHOT_HELI1] = 1; + entSoundsToCache[CLSFX_SHOT_HELI2] = 1; + entSoundsToCache[CLSFX_SHOT_HELI3] = 1; + + gi.effectindex("weapons/othermz/heli"); + CacheAttack(ATK_HELIGUN); + + +// self->spawnflags |= DEBUG_WAYPOINTS; ///////////''''''''''''''''''''''''''''''' +// self->spawnflags |= INFINITE_ROCKETS; ///////////''''''''''''''''''''''''''''''' +// self->volume = 0; ///////////////////////////////''''''''''''''''''''''''''''''' + + self->svflags |= SVF_MONSTER; + + if (self->spawnflags & HELI_ALWAYS_SEEN) + { + self->svflags |= SVF_ALWAYS_SEND; // draw this thing all the dang time. forget the pvs. + } + self->s.renderfx = RF_GHOUL; + self->use = Cobra2_ToggleGun; + + VectorSet (self->mins, -280,-280,-50); + VectorSet (self->maxs, 280, 280, 70); + + VectorCopy(self->s.origin,v3DeathDest); // default to spawn pos + + if (!(self->spawnflags & IN_AIR)) + { + // legalise vector BEFORE doing pad Z-match, or it ends up in the air again! + + // fixme: Cobra2_LegaliseVector() doesn't work in this position now that the heli is ai/class based +//findme: body->m_flags |= HELIFLAG_NOTRACEDIMS + if (self->ai) + { + Cobra2_LegaliseVector(self, self->s.origin, self->s.origin, false); // qboolean qbUseWorldClip + } +//findme: body->m_flags &= ~HELIFLAG_NOTRACEDIMS + + // Weird bit...because heli doesn't get pulled down with gravity then use a trace to measure ground distance & place properly. + // + // (and of course the code I'm calling still doesn't do the right thing - sigh) + // + VectorCopy(self->s.origin,v3DeathDest); // default to legalised spawn pos + self->s.origin[2]+=200; + vec3_t v3; + VectorCopy(self->s.origin,v3); + v3[2] = -(200*3); + + // first, work out suitable default death dest... + // + gi.trace(self->s.origin, self->mins, self->maxs, v3, self,MASK_SOLID, &tr); + if (tr.fraction < 1.0 && // if no hit, then this is one *deep* world, and probably a mistake... + tr.fraction != 0.0f // but if 0.0 returned, then we've gone outside the world, ie low roof! + ) + VectorCopy(tr.endpos,v3DeathDest); + + // now work out correct landing pos... + // + vec3_t v3LandMins; + VectorSet(v3LandMins,0,0,self->mins[2]); + gi.trace(self->s.origin, v3LandMins, NULL, v3, self,MASK_SOLID, &tr); + if (tr.fraction < 1.0 && // if no hit, then this is one *deep* world, and probably a mistake... + tr.fraction != 0.0f // but if 0.0 returned, then we've gone outside the world, ie low roof! + ) + VectorCopy(tr.endpos,self->s.origin); + else + self->s.origin[2]-=200; // ... so just put it back as it was. + } + +// body->m_flags = 0; +// body->m_fHeliMoveSpeed = 0; +// fHeliRocketFireDebounceTime = 0; +// iHeliRocketsLeft = HELI_MAX_ROCKETS; + + self->health = self->max_health = 1000; + + gi.linkentity (self); + + + // Update, we need to get the biggest bounding box possible for trace statements since the heli + // can turn as it moves. Note that this should only be the X and Y axis (since 99% of the collision is + // for the rotor, which is round, and the tail is thin enough that even when it swings to 45 degree points + // it shouldn't stick out beyond the widest X or Y point. As for the Z, handle it by just doing twice the + // normal height (to cope with pitches etc) + // + float fMin = min(self->mins[0],self->mins[1]); + float fMax = max(self->maxs[0],self->maxs[1]); + float fXYRadius = max(fabs(fMin),fMax); // max radius dist from centre + float fZRadius = (max(fabs(self->mins[2]),self->maxs[2]))*2; // max radius dist from centre + + self->ai = ai_c::Create(AI_HELI, self, modelName, subclass);//new generic_ghoul_heli_ai(self, subclass); + + if (self->ai) + { + body_heli* body = ((generic_ghoul_heli_ai*)(ai_public_c*)self->ai)->GetHeliBody(); + + if (body) + { + VectorSet(body->m_v3HeliTraceMins,-fXYRadius,-fXYRadius,-fZRadius); + VectorSet(body->m_v3HeliTraceMaxs, fXYRadius, fXYRadius, fZRadius); + VectorCopy(self->s.origin, body->m_v3HeliPadRestPos); + VectorCopy(v3DeathDest, body->m_v3HeliDeathDest); + body->m_fAIAggressiveness = self->volume; // 0..10 + // set the skin + SetSkin(self, modelName, modelSubname, subclass, skinname, false); + + if ( (self->spawnflags & ATTACK_CHOPPER) && (game.playerSkills.getEnemyValue() > 1) ) + { + body->SetSnipeability(false); + } + else + { + body->SetSnipeability(true); + } + } + } + + self->flags |= FL_NO_KNOCKBACK; + self->movetype = MOVETYPE_FLY; + self->solid = SOLID_BBOX; + self->takedamage= DAMAGE_YES; + self->pain = NULL;//CobraThink_Pain; + self->die = NULL;//CobraThink_Die; + self->think = NULL;//CobraThink_OnPad; + self->touch = Cobra2Touch; + self->nextthink = level.time + FRAMETIME; + +} + +void generic_heli_init (edict_t *self) +{ + // this is the last time we have to set the nextthink. from now on the ai + //will take care of it. + self->nextthink = level.time + FRAMETIME; + self->ai->NewDecision(new base_decision(), self); + /* +// self->ai->NewDecision(new formation_mob_decision(NULL), self); + self->ai->NewDecision(new pursue_decision(), self); + self->ai->NewDecision(new search_decision(), self); +// self->ai->NewDecision(new dodge_decision(), self); +// self->ai->NewDecision(new capture_decision(LEADERFLAG_RECRUIT), self); + self->ai->NewDecision(new leader_sfile_decision(LEADERFLAG_RECRUIT), self); + self->ai->NewDecision(new retreat_decision(), self); + + self->ai->SetRank(3); +*/ + gi.effectindex("environ/helismoke"); + gi.effectindex("heli_expl"); + gi.soundindex("impact/explosion/exp1.wav"); + gi.soundindex("impact/explosion/med.wav"); + gi.effectindex("weapons/world/autogundeath"); + CacheAttack(ATK_ROCKET); + gi.soundindex("weapons/assault/fire.wav"); + gi.effectindex("weapons/world/rockettrail2"); + + // if the ATTACK_CHOPPER flag is set, we'll precache the Hind body by creating + //an edict, using it to spawn a Hind, and then free the edict + if (self->spawnflags & ATTACK_CHOPPER) + { + edict_t *ent = G_Spawn(); + SP_m_x_hind(ent); + G_FreeEdict(ent); + } +} + + + + + +void SP_m_x_chopper_black (edict_t *self) +{ + + generic_heli_spawnnow(self,"cobra","m_x_chopper_black"); + self->think = generic_heli_init; +} + +void SP_m_x_chopper_green (edict_t *self) +{ + + generic_heli_spawnnow(self,"cobra","m_x_chopper_green"); + self->think = generic_heli_init; +} + +void SP_m_x_chopper_white (edict_t *self) +{ + + generic_heli_spawnnow(self,"cobra","m_x_chopper_white"); + self->think = generic_heli_init; +} + +void SP_m_x_hind (edict_t *self) +{ + + generic_heli_spawnnow(self,"hind","hind"); + self->think = generic_heli_init; +} + +heliWaypoint::heliWaypoint(heliWaypoint *orig) +{ + VectorCopy(orig->m_v, m_v); + VectorCopy(orig->m_volMins, m_volMins); + VectorCopy(orig->m_volMaxs, m_volMaxs); + m_next = NULL; +} + +generic_ghoul_heli_ai::generic_ghoul_heli_ai(generic_ghoul_heli_ai *orig) +{ + m_bActionDone = orig->m_bActionDone; + m_bTimeToDie = orig->m_bTimeToDie; + m_bPilotDead = orig->m_bPilotDead; + m_bGunnerDead = orig->m_bGunnerDead; + *(int *)&m_attacker = GetEdictNum(orig->m_attacker); + m_ScriptActionCounter = orig->m_ScriptActionCounter; + m_LastThinkingActionID = orig->m_LastThinkingActionID; + + fHeliXWorldMin2 = orig->fHeliXWorldMin2; + fHeliXWorldMax2 = orig->fHeliXWorldMax2; + fHeliYWorldMin2 = orig->fHeliYWorldMin2; + fHeliYWorldMax2 = orig->fHeliYWorldMax2; + fHeliZWorldMin2 = orig->fHeliZWorldMin2; + fHeliZWorldMax2 = orig->fHeliZWorldMax2; + + m_nActionSize = orig->m_nActionSize; + + m_waypoints = NULL; + + m_nNumWaypoints = orig->m_nNumWaypoints; + m_nNumWaypointPts = orig->m_nNumWaypointPts; + m_nNumWaypointVols = orig->m_nNumWaypointVols; +} + +void generic_ghoul_heli_ai::Evaluate(generic_ghoul_heli_ai *orig) +{ + m_bActionDone = orig->m_bActionDone; + m_bTimeToDie = orig->m_bTimeToDie; + m_bPilotDead = orig->m_bPilotDead; + m_bGunnerDead = orig->m_bGunnerDead; + m_attacker = GetEdictPtr((int)orig->m_attacker); + m_ScriptActionCounter = orig->m_ScriptActionCounter; + m_LastThinkingActionID = orig->m_LastThinkingActionID; + + fHeliXWorldMin2 = orig->fHeliXWorldMin2; + fHeliXWorldMax2 = orig->fHeliXWorldMax2; + fHeliYWorldMin2 = orig->fHeliYWorldMin2; + fHeliYWorldMax2 = orig->fHeliYWorldMax2; + fHeliZWorldMin2 = orig->fHeliZWorldMin2; + fHeliZWorldMax2 = orig->fHeliZWorldMax2; + + m_nActionSize = orig->m_nActionSize; + + m_waypoints = NULL; + + m_nNumWaypoints = orig->m_nNumWaypoints; + m_nNumWaypointPts = orig->m_nNumWaypointPts; + m_nNumWaypointVols = orig->m_nNumWaypointVols; + // Don't go down the Evaluate heirachy as this is a special case +} + +void generic_ghoul_heli_ai::Read() +{ + char loaded[sizeof(generic_ghoul_heli_ai)]; + heliWaypoint *loadable; + heliWaypoint **llist; + int i; + + gi.ReadFromSavegame('AIHA', loaded + GGHA_SAVE_START, GGHA_SAVE_END - GGHA_SAVE_START); + Evaluate((generic_ghoul_heli_ai *)loaded); + + ai_c::Read(); + + if(GetNumWaypoints()) + { + llist = &m_waypoints; + for(i = 0; i < GetNumWaypoints(); i++) + { + loadable = new heliWaypoint(); + gi.ReadFromSavegame('HEWP', loadable, sizeof(heliWaypoint)); + + *llist = loadable; + llist = &(loadable->m_next); + } + } +} + +void generic_ghoul_heli_ai::Write() +{ + byte *save_start; + generic_ghoul_heli_ai *savable; + heliWaypoint *wp; + heliWaypoint *temp; + + savable = new generic_ghoul_heli_ai(this); + save_start = (byte *)savable; + gi.AppendToSavegame('AIHA', save_start + GGHA_SAVE_START, GGHA_SAVE_END - GGHA_SAVE_START); + delete savable; + + ai_c::Write(); + + if(GetNumWaypoints()) + { + for(wp = m_waypoints; wp; wp = wp->m_next) + { + temp = new heliWaypoint(wp); + gi.AppendToSavegame('HEWP', temp, sizeof(heliWaypoint)); + } + } +} + +// end \ No newline at end of file diff --git a/Source/Game/gamecpp/m_heliai.h b/Source/Game/gamecpp/m_heliai.h new file mode 100644 index 0000000..10ab9a6 --- /dev/null +++ b/Source/Game/gamecpp/m_heliai.h @@ -0,0 +1,448 @@ +// m_heliai.h + +#ifndef M_HELIAI_H +#define M_HELIAI_H + +////// kef -- 2/18/99 originally stored in m_heli.h ////////////// + +// these make it a more responsive, though necessarily loses some fluidity to do so... +// +#if 0 +// +// This is the original behaviour-control define block, graceful but slow... +// +#define HELI_COBRA_MAXSPEED 40.0f +#define HELI_COBRA_ACCEL ((float)((HELI_COBRA_MAXSPEED/10.0f)/5.0f)) // ie takes 5 seconds to reach max speed +#define HELI_COBRA_IDEAL_LANDING_HEIGHT (56*4) // roughly 4 man heights above landing pad, before beginning vert descent +#define HELI_COBRA_MAXPITCH 45.0f +#define HELI_COBRA_PITCHADJSPEED ((float)((HELI_COBRA_MAXPITCH/10.0f)/4.0f)) // ie takes 4 seconds to reach max pitch +#define HELI_COBRA_MAXPITCH_DECEL (HELI_COBRA_MAXPITCH/3) +#define HELI_COBRA_PITCHADJSPEED_DECEL ((float)((HELI_COBRA_MAXPITCH_DECEL/10.0f)/4.0f)) // ie takes 4 seconds to reach max pitch +#define HELI_COBRA_MAXROLL 20 +#define HELI_COBRA_MAXROLL_DECEL 8 +// +#define HELI_MAX_FIRE_PITCH 40 +#define HELI_COBRA_DIPFIRE_PITCHADJSPEED 4 // faster than normal pitch adjust speed +#define HELI_COBRA_ROLLADJSPEED_LEVELOUT 4 +#define HELI_YAWADJ_SPEED (9/2) // value of 9 @ 10fps = 1 second to turn 90 degrees, now halved for playability +#define HELI_ROLLADJ_SPEED 1 //2 +#define HELISTRAFE_ROLLADJ_SPEED 2 +#define HELI_MAX_LANDING_SPEED 10.0f +#define HELI_COBRA_MIN_HEAD2DESTSPEED 1 + +#else +// +// this version provides a much more responsive (for gameplay pace), but less realistic, heli behaviour... +// +#define HELI_COBRA_MAXSPEED 80.0f +#define HELI_COBRA_ACCEL ((float)((HELI_COBRA_MAXSPEED/10.0f)/3.0f)) // ie takes 3 seconds to reach max speed +#define HELI_COBRA_IDEAL_LANDING_HEIGHT (56*4) // roughly 4 man heights above landing pad, before beginning vert descent +#define HELI_COBRA_MAXPITCH 45.0f +#define HELI_COBRA_PITCHADJSPEED ((float)((HELI_COBRA_MAXPITCH/10.0f)/3.0f)) // ie takes 3 seconds to reach max pitch +#define HELI_COBRA_MAXPITCH_DECEL (HELI_COBRA_MAXPITCH/3) +#define HELI_COBRA_PITCHADJSPEED_DECEL ((float)((HELI_COBRA_MAXPITCH_DECEL/10.0f)/2.0f)) // ie takes 2 seconds to reach max pitch +#define HELI_COBRA_MAXROLL 40 +#define HELI_COBRA_MAXROLL_DECEL 16 +// +#define HELI_MAX_FIRE_PITCH 40 +#define HELI_COBRA_DIPFIRE_PITCHADJSPEED 5 // faster than normal pitch adjust speed +#define HELI_COBRA_ROLLADJSPEED_LEVELOUT 4 +#define HELI_YAWADJ_SPEED (9) // value of 9 @ 10fps = 1 second to turn 90 degrees, now halved for playability +#define HELI_ROLLADJ_SPEED 2 +#define HELISTRAFE_ROLLADJ_SPEED 3.5 +#define HELI_MAX_LANDING_SPEED 10.0f +#define HELI_COBRA_MIN_HEAD2DESTSPEED 2 + +#endif + + +// fixme:Ghoul has a slight bug in that the model angles are the wrong way round, so for now... +// update: actually i think it's because the heli model seems to have a 90 degree rotation glitch or something. +// Sod it, these work anyway... +// +#define HELI_PITCH PITCH +#define HELI_ROLL ROLL +#define HELI_YAW YAW + + +// return values for fns that aim heads or the gun +#define AIM_TRUE 1 +#define AIM_FALSE 2 +#define AIM_ERROR 3 +// let me know if any other AIM_xxx defines are added - Ste. + + +// radians a head or gun may turn per think +#define AIM_MAX_TURN_DELTA (M_PI/10) +#define AIM_MAX_TURN_EPSILON 0.01 + +// gunner/pilot head restrictions +#define HEAD_PITCH_UP (M_PI/4.0) +#define HEAD_PITCH_DOWN 0 +#define HEAD_YAW_CW (M_PI*0.5) +#define HEAD_YAW_CCW (-M_PI*0.5) +#define GUN_PITCH_UP (M_PI/8.0) +#define GUN_PITCH_DOWN (M_PI/4.0) +#define GUN_YAW_CW (1) // max yaw (clockwise looking down on heli) +#define GUN_YAW_CCW (-1) // min yaw (clockwise looking down on heli) + +#define HEAD_PITCH_UP_DEG (HEAD_PITCH_UP*180.0f/M_PI) +#define HEAD_PITCH_DOWN_DEG (HEAD_PITCH_DOWN*180.0f/M_PI) +#define HEAD_YAW_CW_DEG (HEAD_YAW_CW*180.0f/M_PI) +#define HEAD_YAW_CCW_DEG (HEAD_YAW_CCW*180.0f/M_PI) +#define GUN_PITCH_UP_DEG (GUN_PITCH_UP*180.0f/M_PI) +#define GUN_PITCH_DOWN_DEG (GUN_PITCH_DOWN*180.0f/M_PI) +#define GUN_YAW_CW_DEG (GUN_YAW_CW*180.0f/M_PI) +#define GUN_YAW_CCW_DEG (GUN_YAW_CCW*180.0f/M_PI) + + + +// Info: defines marked with a '#' have to insert their own pseudo-scriptevents into the script queue +// (typically 'goto'/'turnto' instructions) in order to accomplish their tasks. +// +#define HELIFLAG_DOINGSCRIPTEDLANDING 0x00000001 // # +#define HELIFLAG_ROTORSCHANGINGSPEED 0x00000002 +#define HELIFLAG_SIDESTRAFEISTOLEFT 0x00000004 +#define HELIFLAG_ROCKETSENABLED 0x00000008 +#define HELIFLAG_CHAINGUNENABLED 0x00000010 +#define HELIFLAG_MGUN_GHOULSEQ_RUNNING 0x00000020 // special use thingy +#define HELIFLAG_AUTOFIRE 0x00000040 +#define HELIFLAG_DOINGSCRIPTEDHOVER 0x00000080 // # +#define HELIFLAG_HOVERISAGGRESIVE 0x00000100 +#define HELIFLAG_DOINGSCRIPTEDFIREAT 0x00000200 // # +#define HELIFLAG_DOINGSMARTGOTO 0x00000400 // # +#define HELIFLAG_FIREDIP1DONE 0x00000800 // space-saver bool +#define HELIFLAG_FIREDIP2DONE 0x00001000 // "" +#define HELIFLAG_SCRIPTENDMENTIONED 0x00002000 +#define HELIFLAG_ISDEAD 0x00004000 +#define HELIFLAG_ISDEADACKNOWLEDGED 0x00008000 +#define HELIFLAG_ISDEADFINALGOTO 0x00010000 +#define HELIFLAG_PLAYINGHOVERANIM 0x00020000 +#define HELIFLAG_NOTRACEDIMS 0x00040000 +#define HELIFLAG_DOINGSCRIPTEDAI 0x00080000 +#define HELIFLAG_PILOTDEAD 0x00100000 +#define HELIFLAG_GUNNERDEAD 0x00200000 +#define HELIFLAG_SCRIPTEDAIJUSTFINISHED 0x00400000 // special usage, so AI-hover knows to cut short if main AI timed out + +#define HELI_MAX_ROCKETS 8 // 4 per tube, 8 fits the graphic so don't alter it, use reloads if you want more + + +// Heli spawn flags... +// +#define IN_AIR 1 +#define ONDIE_HEAD2SPAWN 2 +#define INFINITE_ROCKETS 4 +#define DEBUG_WAYPOINTS 8 +#define ATTACK_CHOPPER 16 +#define HELI_ALWAYS_SEEN 32 + + +// stuff for Nathan's moving terrain... +// +#define HELI_MAX_TERRAIN_LEAN 10 // 45 +#define MAX_GROUND_SPEED 200 + +// kept as defines just in case I ever need to change them all back at once.. +// +#define _HELI_TRACEPARAM_MIN (dwHeliFlags&HELIFLAG_NOTRACEDIMS)?NULL:v3HeliTraceMins // self->mins +#define _HELI_TRACEPARAM_MAX (dwHeliFlags&HELIFLAG_NOTRACEDIMS)?NULL:v3HeliTraceMaxs // self->maxs + +#define _HELI_TRACEPARAM_MIN2 (body->m_flags&HELIFLAG_NOTRACEDIMS)?NULL:body->m_v3HeliTraceMins // self->mins +#define _HELI_TRACEPARAM_MAX2 (body->m_flags&HELIFLAG_NOTRACEDIMS)?NULL:body->m_v3HeliTraceMaxs // self->maxs + + +// ensure angle is in range -179..0..180 +// +_inline float angle2posneg (float _angle) +{ + _angle = anglemod(_angle); // ensure known-range + if (_angle>180) + _angle-=360; + + return _angle; +} +////////////////////////////////////////////////////////////////// + +void debug_drawbox(edict_t* self,vec3_t vOrigin, vec3_t vMins, vec3_t vMaxs, int nColor); + +void Cobra2Think_TakeOff(edict_t *self); +void Cobra2_InitTurnStuff(edict_t *self, vec3_t v3); +void Cobra2Think_HeadToDest(edict_t *self); +int Cobra2AimHeadAtPos(edict_t *self, vec3_t vTarget, IGhoulInst* head, GhoulID bolt, + vec3_t vOffset); +int Cobra2AimGunnerAtPos(edict_t *self, vec3_t vTarget); +int Cobra2AimPilotAtPos(edict_t *self, vec3_t vTarget); +void Cobra2Think_MovementFinish(edict_t *self); +qboolean Cobra2MovementFinished(edict_t *self); +qboolean WithinOrBeyondVectors2(vec3_t v3Me, vec3_t v3Halfway, vec3_t v3End); +void Cobra2FireRockets(edict_t *self, int nLeftRockets, int nRightRockets); +void Cobra2FireGun(edict_t *self, qboolean bSporadic); +void Cobra2FireGun_Off(edict_t *self); +qboolean Cobra2_EnsureRollFinished(edict_t *self); +int Cobra2ResetHead(edict_t *self, IGhoulInst* head, GhoulID bolt, vec3_t vOffset); +int Cobra2ResetPilot(edict_t *self); +int Cobra2ResetGunner(edict_t *self); +qboolean Cobra2TargetWithinArc(vec3_t vTargetPos, vec3_t vHeliAngles, vec3_t vHeliPos); +qboolean Cobra2HasTargetLOS(edict_t *self, edict_t *target, qboolean qbAccountForArc); +int Cobra2AimGunAtPos(edict_t *self, vec3_t vTarget, qboolean bSynchGunner); +int Cobra2AimGunInDirection(edict_t *self, vec3_t vTargetDir, qboolean bSynchGunner); +void fireHeliRocket2(edict_t *self, vec3_t v3FirePoint, vec3_t v3FireDir); +int Cobra2AimGunnerInDirection(edict_t *self, vec3_t vTarget); +int Cobra2AimPilotInDirection(edict_t *self, vec3_t vTarget); +void Cobra2InitHead(edict_t *self, vec3_t vTargetDir, IGhoulInst* head, + GhoulID bolt, vec3_t vOffset); +int CobraResetGunner(edict_t *self); +void Cobra2Think_SetFireAt(edict_t *self, vec3_t v3FireDest, float fTime); +void Cobra2Think_GotoFireAt(edict_t *self); +void Cobra2Think_FireAt(edict_t *self); +void Cobra2Think_DipFireAt(edict_t *self); +void Cobra2Think_SetDumbFlyDest(edict_t *self, vec3_t v3); +void Cobra2Think_SetSmartFlyDest(edict_t *self, vec3_t v3); +void Cobra2Think_SmartHeadToDest(edict_t *self); +void Cobra2Think_SetTurnDest(edict_t *self, vec3_t v3); +void Cobra2Think_SetSidestrafeDest(edict_t *self, float fXStrafeDist); +void Cobra2Think_Hover(edict_t *self); +void Cobra2Think_AI(edict_t *self); +void Cobra2_SetAIParams(edict_t *self, float fTime); +void Cobra2_SetHoverParams(edict_t *self, float fTime, qboolean qbAggressive); +void Cobra2Think_SidestrafeToDest(edict_t *self); +void Cobra2Think_Land(edict_t *self); +void Cobra2Think_OnPad(edict_t *self); +void Cobra2Think_Repair(edict_t *self); +void Cobra2Think_TurnToFace(edict_t *self); +qboolean Cobra2_TurnToFace(edict_t *self, vec3_t v3WorldPos, qboolean qbRoll, qboolean qbYAWDictatesFiring, float *pfDegreesToGo); +vec3_t *Cobra2Think_GetRandomPatrolDestPos(edict_t *self); +void Cobra2Think_SetPilotlookDest(edict_t *self, vec3_t v3); +void Cobra2Think_SetGunnerlookDest(edict_t *self, vec3_t v3); +void Cobra2Think_PilotLookat(edict_t *self); +void Cobra2Think_GunnerLookat(edict_t *self); +int _Cobra2Fire_Rockets(edict_t *self, int iRocketsToForceFire); +void _Cobra2Fire_Chaingun(edict_t *self); +int Cobra2_Fire(edict_t *self, qboolean qbInihibitRockets); +void Cobra2_Fire_OFF(edict_t *self); +void Cobra2_Explode(edict_t *self); +qboolean Cobra2_VecWithinWorld(edict_t *self, vec3_t v3); +void Cobra2_LegaliseVector(edict_t *self, vec3_t v3in, vec3_t v3Out, qboolean qbUseWorldClip); +void Cobra2_ClipVecToWorld(edict_t *self, vec3_t v3); +void Cobra2_TerrainSpeed2GhoulAngles(edict_t *self, vec3_t v3GroundSpeed); +void Cobra2_OutOfControl(edict_t* self); +void Cobra2Touch(edict_t *self, edict_t *other, cplane_t *plane, struct mtexinfo_s *surf); +qboolean Cobra2TargetEntValid(edict_t *self, edict_t *target); +edict_t *Cobra2_GetEntToTarget(edict_t *self); + +// helper fns for movement thinks +void Cobra2LandHelper(edict_t *self); +void Cobra2GotoCoordsHelper(edict_t *self); +void Cobra2GotoRelEntHelper(edict_t *self); +void Cobra2GotoRelHelper(edict_t *self); +void Cobra2StrafeHelper(edict_t *self); +void Cobra2HoverHelper(edict_t *self); +void Cobra2HamburgerHelper(edict_t *self); +void Cobra2FaceRelEntHelper(edict_t* self); +void Cobra2FaceAbsHelper(edict_t* self); +void Cobra2FaceAbsDirHelper(edict_t* self); +void Cobra2FaceRelCoordsHelper(edict_t* self); +void Cobra2HeadFaceRelEntHelper(edict_t* self); +void Cobra2HeadFaceRelCoordsHelper(edict_t* self); +void Cobra2HeadFaceAbsCoordsHelper(edict_t* self); +void Cobra2FireAtRelEntHelper(edict_t* self); +void Cobra2FireAtAbsHelper(edict_t* self); +void Cobra2FireAtRelHelper(edict_t* self); +void Cobra2RocketsEnableHelper(edict_t* self); +void Cobra2ChainGunEnableHelper(edict_t* self); +void Cobra2AutoFireHelper(edict_t* self); +void Cobra2WorldHelper(edict_t* self); +void Cobra2RearmHelper(edict_t* self); +void Cobra2DeathDestHelper(edict_t* self); +void Cobra2HealthHelper(edict_t* self); +void Cobra2TraceDimsHelper(edict_t* self); +void Cobra2AIHelper(edict_t* self); + + +class heliWaypoint +{ +public: + vec3_t m_v; + vec3_t m_volMins; + vec3_t m_volMaxs; + heliWaypoint* m_next; + + heliWaypoint(){ VectorClear(m_v); VectorClear(m_volMins); VectorClear(m_volMaxs); m_next = NULL;} + heliWaypoint(vec3_t v){ VectorCopy(v, m_v); VectorClear(m_volMins); VectorClear(m_volMaxs); m_next = NULL;} + virtual ~heliWaypoint(){} + heliWaypoint(heliWaypoint *orig); + + // the mins and maxs for a waypoint are in world coords, not relative to m_v + void SetVolume(vec3_t vMins, vec3_t vMaxs) {VectorCopy(vMins, m_volMins);VectorCopy(vMaxs, m_volMaxs);} + void GetVolumeMins(vec3_t vRet) { VectorCopy(m_volMins, vRet); } + void GetVolumeMaxs(vec3_t vRet) { VectorCopy(m_volMaxs, vRet); } + qboolean IsPoint() { if (m_volMins[0] || m_volMins[1] || m_volMins[2] || m_volMaxs[0] || m_volMaxs[1] || m_volMaxs[2]) return false; return true;} +}; + +class generic_ghoul_heli_ai : public ai_c +{ +// findme: helicommands +public: +enum hse_Commands + { + hse_NONE=0, // + hse_TAKEOFF, // // should only be called when you know heli is landed + hse_LAND, // // can be called from anywhere in map (when in air) + hse_REPAIR, // // it'd be better to do this on pad, but in truth can even be called in-flight + hse_REARM, // // refills heli with max rockets, instantly (see also INFINITE_ROCKETS spawn flag) + hse_GOTO_COORDS, // + hse_GOTOREL_ENTITY, // + hse_GOTOREL_ENT_X, // + hse_GOTOREL_ENT_Y, // + hse_GOTOREL_ENT_Z, // + hse_MOVEREL, // + hse_PAUSE, // // script pause supercedes this + hse_FACE_RELENT, // + hse_FACE_ABSCOORDS, // + hse_FACE_ABSDIR, // face a direction given relative to the world + hse_FACE_RELCOORDS, // + hse_PILOT_FACERELENT, // + hse_PILOT_FACERELCOORDS, // + hse_PILOT_FACEABSCOORDS, // + hse_GUNNER_FACERELENT, // + hse_GUNNER_FACERELCOORDS, // + hse_GUNNER_FACEABSCOORDS, // + hse_STRAFE_RT, // + hse_STRAFE_LT, // + hse_ROCKETS_ENABLE, // + hse_ROCKETS_DISABLE, // + hse_CHAINGUN_ENABLE, // + hse_CHAINGUN_DISABLE, // + hse_FIREAT_RELENT, // + hse_FIREAT_ABSCOORDS, // + hse_FIREAT_RELCOORDS, // + hse_AUTOFIRE_ON, // + hse_AUTOFIRE_OFF, // + hse_HOVER_PASSIVE, // + hse_HOVER_AGGRESSIVE, // + hse_SET_WORLDMINS, // + hse_SET_WORLDMAXS, // + hse_SET_MAXHEALTH, // + hse_SET_HEALTH, // + hse_SET_DEATHDEST, // // set this to change default (pad) crash position for death + hse_SET_TRACEDIMS, // // arg is a 0/1 bool. set to 0 to turn off trace-checking in flight if you want to script for a really close skim + hse_AI, // // arg is time in seconds to do internal AI before reading next script command. Use 0 as arg to end a script if you want to wait for another script to start + hse_WAYPOINT, // // hint position for heli to fire from during internal AI + hse_VOLUME, // // use this straight after WAYPOINT arg to set dims (transforms a waypoint into a suggested-flying-area volume). Args are radius,s eg Z 150 would be 300 high + hse_VOLUMEMINS, // // use this straight after WAYPOINT arg to set dims (transforms a waypoint into a suggested-flying-area volume). Arg is in world coords + hse_VOLUMEMAXS, // // use this straight after WAYPOINT arg to set dims (transforms a waypoint into a suggested-flying-area volume). Arg is in world coords + hse_DEBUG, + hse_CHANGE_SKIN, + hse_CHANGE_BODY, + hse_OUT_OF_CONTROL // // Keith's internal use only, do not use in scripts + }; + +protected: +#define GGHA_SAVE_START offsetof(generic_ghoul_heli_ai, m_bActionDone) + qboolean m_bActionDone; + qboolean m_bTimeToDie; + qboolean m_bPilotDead; + qboolean m_bGunnerDead; + edict_t* m_attacker; + int m_ScriptActionCounter; + int m_LastThinkingActionID; + + static float fHeliXWorldMin2; + static float fHeliXWorldMax2; + static float fHeliYWorldMin2; + static float fHeliYWorldMax2; + static float fHeliZWorldMin2; + static float fHeliZWorldMax2; + + + + // kef -- hate exposing this, but the dumb scripted ai stuff needs it + int m_nActionSize; + + heliWaypoint* m_waypoints; + int m_nNumWaypoints; + int m_nNumWaypointPts; + int m_nNumWaypointVols; +#define GGHA_SAVE_END (offsetof(generic_ghoul_heli_ai, m_nNumWaypointVols) + sizeof(m_nNumWaypointVols)) + virtual void AddBody(edict_t *monster); + virtual void Pain(edict_t &monster, edict_t *other, float kick, int damage); + virtual void Die(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + + virtual void CrewMemberKilled(edict_t* self, int nSkin); + virtual void BuildHeliModel(edict_t *self, char *ghoulname, char* subclass); + +public: + generic_ghoul_heli_ai() {} + virtual void Init(edict_t *self, char *ghoulname, char* subclass); + virtual ~generic_ghoul_heli_ai(); + virtual int GetClassCode(void){return AI_HELI;}//this should be different for everybody in this class family + virtual void Activate(edict_t &monster); + inline virtual body_heli *GetHeliBody(void){return (body_heli*)(body_c*)body;} + + static float GetHeliXWorldMin2() { return fHeliXWorldMin2; } + static float GetHeliXWorldMax2() { return fHeliXWorldMax2; } + static float GetHeliYWorldMin2() { return fHeliYWorldMin2; } + static float GetHeliYWorldMax2() { return fHeliYWorldMax2; } + static float GetHeliZWorldMin2() { return fHeliZWorldMin2; } + static float GetHeliZWorldMax2() { return fHeliZWorldMax2; } + static void SetHeliXWorldMin2(float val) {fHeliXWorldMin2 = val;} + static void SetHeliXWorldMax2(float val) {fHeliXWorldMax2 = val;} + static void SetHeliYWorldMin2(float val) {fHeliYWorldMin2 = val;} + static void SetHeliYWorldMax2(float val) {fHeliYWorldMax2 = val;} + static void SetHeliZWorldMin2(float val) {fHeliZWorldMin2 = val;} + static void SetHeliZWorldMax2(float val) {fHeliZWorldMax2 = val;} + + qboolean IsActionDone() { return m_bActionDone; } + void ActionIsDone(qboolean bDone) { m_bActionDone = bDone; } + qboolean IsTimeToDie() { return m_bTimeToDie; } + void TimeToDie(qboolean bTime) { m_bTimeToDie = bTime; } + void SetCurrentActionThink(void (*think)(edict_t *self)); + void SetCurrentActionNextThink(void (*think)(edict_t *self)); + int GetActionSize() { return m_nActionSize; } + + // return something other than 1 so we can assassinate Amu + virtual int GetTeam(edict_t &monster){return 10;} + virtual bool AmIAsGoodAsDead() {return false;} + + virtual void Think(edict_t &monster); + virtual qboolean Damage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb); + + virtual edict_t* GetAttacker() { return m_attacker; } + void PilotCapped() { m_bPilotDead = true; } + void GunnerCapped() { m_bGunnerDead = true; } + + virtual action_c *MoveAction(decision_c *od, action_c *oa, ai_c* ai, + mmove_t *newanim, int nCommand, vec3_t vPos, edict_t* target, float fArg); + virtual action_c *FaceAction(decision_c *od, action_c *oa, ai_c* ai, + mmove_t *newanim, int nCommand, vec3_t vPos, edict_t* target, float fArg); + virtual action_c *AttackAction(decision_c *od, action_c *oa, ai_c* ai, + mmove_t *newanim, int nCommand, vec3_t vPos, edict_t* target, float fArg); + + int GetNumWaypoints() { return m_nNumWaypoints; } + int GetNumWaypointPts() { return m_nNumWaypointPts; } + int GetNumWaypointVols() { return m_nNumWaypointVols; } + // returns number of waypoints (points and volumes) in list + int AddWaypoint(vec3_t v); + // returns false if our bbox can't fit in the given volume. + //nWay is the index of the pt that's becoming a volume. + //v is the maxs for the volume, -v will be the volume's mins. + qboolean SetWaypointPtVolume(int nWay, vec3_t v); + + heliWaypoint* GetWaypointPt(int nWay); + heliWaypoint* GetWaypointVol(int nWay); + + int GetCurrentActionID(); + int GetMostRecentlyAddedActionID(); + int GetLastThinkingActionID() { return m_LastThinkingActionID; } + + void ChangeBody(edict_t *self, char *ghoulname, char* subclass); + + generic_ghoul_heli_ai(generic_ghoul_heli_ai *orig); + void Evaluate(generic_ghoul_heli_ai *orig); + virtual void Write(void); + virtual void Read(void); +}; + +#endif // #ifndef M_HELIAI_H +/////////////////////// eof //////////////////////////// + diff --git a/Source/Game/gamecpp/m_meso.cpp b/Source/Game/gamecpp/m_meso.cpp new file mode 100644 index 0000000..5c29fbe --- /dev/null +++ b/Source/Game/gamecpp/m_meso.cpp @@ -0,0 +1,4245 @@ +#include "g_local.h" +#include "ai_private.h" +#include "m_generic.h" +#include "m_meso.h" + +#define MESO_POUCH_SCALE 1.142857142857 +#define MESO_HAT_SCALE 1.142857142857 +#define MESO_GLASSES_SCALE 1.142857142857 +#define MESO_WEAPON_SCALE 1.0 +#define MESO_OTHER_SCALE 1.142857142857 + +// NOTE +// This is now generated in code, so hand editing is probably a bad idea... +// + +CAISkills enemySkills[] = +{// rangeMin dodge hesitation cashValue flags + // rangeMax accuracy aimTime turnSpeed + CAISkills(192.00, 512.00, 0.60, 2.50, 0.50, 2.00, 64.00, 2.00, 0),//AI_ECTO_SKINLEADER :: PISTOL1 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_ECTO_STOCKBROKER + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_ECTO_DCTOURIST + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_ECTO_NYCBUM + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_ECTO_COLPRISONER1 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_ECTO_COLPRISONER2 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_ECTO_IRAQCITIZEN + CAISkills(57.60, 512.00, 0.20, 1.25, 0.38, 1.50, 112.50, 1.50, 0),//AI_ECTO_UGNCOMMANDER :: PISTOL2 + CAISkills(192.00, 512.00, 0.30, 1.25, 0.50, 3.00, 31.25, 1.50, 0),//AI_ECTO_SERBOFFICER :: PISTOL2 + CAISkills(192.00, 512.00, 0.30, 1.25, 0.50, 3.00, 31.25, 1.50, 0),//AI_ECTO_KOSREFUGEE :: PISTOL2 + CAISkills(192.00, 512.00, 0.30, 1.25, 0.38, 1.00, 162.50, 1.50, 0),//AI_ECTO_IRAQOFFICER :: PISTOL2 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_ECTO_FACTORY :: PISTOL2 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_ECTO_CHEMIST :: PISTOL2 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 2.50, 42.00, 2.00, 0),//AI_ECTO_SIBSUIT :: PISTOL1 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_ECTO_SIBSCIENCE + CAISkills(192.00, 512.00, 0.60, 2.50, 0.50, 2.00, 64.00, 2.00, 0),//AI_ECTO_PUNK2 :: PISTOL1 + + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_JOHN :: PISTOL1 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_JOHN_SNOW :: PISTOL1 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_JOHN_DESERT :: PISTOL1 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_HAWK :: MPISTOL + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_HURTHAWK + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_SAM + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_IRAQWORKER + CAISkills(144.00, 192.00, 0.00, 0.25, 1.00, 2.00, 96.00, 0.60, 16),//AI_MESO_NYCPUNK :: SHOTGUN + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_AMU + CAISkills(192.00, 512.00, 0.70, 1.25, 0.38, 1.00, 275.00, 1.50, 5),//AI_MESO_RAIDERBOSS :: PISTOL2 + CAISkills(192.00, 384.00, 0.28, 0.50, 0.75, 1.00, 2750.00, 0.60, 37),//AI_MESO_RAIDERBOSS2 :: MICRO + CAISkills(256.00, 512.00, 0.18, 0.50, 0.75, 1.00, 546.00, 1.50, 10),//AI_MESO_IRAQSOLDIER1 :: SNIPER + CAISkills(192.00, 384.00, 0.18, 0.13, 0.75, 2.00, 403.00, 1.00, 16),//AI_MESO_IRAQSOLDIER2 :: ASSAULT + CAISkills(192.00, 384.00, 0.18, 0.25, 1.13, 2.00, 936.00, 1.00, 16),//AI_MESO_IRAQSOLDIER2B :: MACHINEG + CAISkills(192.00, 384.00, 0.18, 0.13, 0.75, 2.00, 403.00, 1.00, 16),//AI_MESO_IRAQREPGUARD :: ASSAULT + CAISkills(192.00, 384.00, 0.18, 0.25, 1.13, 2.00, 936.00, 1.00, 16),//AI_MESO_IRAQREPGUARDB :: MACHINEG + CAISkills(192.00, 512.00, 0.30, 1.25, 0.38, 1.00, 162.50, 1.50, 0),//AI_MESO_IRAQPOLICE :: PISTOL2 + CAISkills(192.00, 512.00, 0.30, 1.25, 0.38, 1.00, 162.50, 1.50, 0),//AI_MESO_IRAQCOMMANDER :: PISTOL2 + CAISkills(192.00, 384.00, 0.18, 0.13, 0.75, 2.00, 403.00, 1.00, 16),//AI_MESO_IRAQBRUTEA :: ASSAULT + CAISkills(32.00, 128.00, 0.00, 0.50, 0.00, 0.00, 832.00, 4.00, 176),//AI_MESO_IRAQBRUTEB :: FLAME + CAISkills(256.00, 512.00, 0.18, 0.50, 0.75, 1.00, 546.00, 1.50, 10),//AI_MESO_IRAQBODYGUARD :: SNIPER + CAISkills(128.00, 512.00, 0.00, 0.50, 0.75, 1.00, 1105.00, 0.70, 53),//AI_MESO_IRAQROCKET :: ROCKET + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_IRAQSADDAM + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_IRAQMAN2 + CAISkills(76.80, 512.00, 0.12, 0.50, 0.75, 1.50, 378.00, 1.50, 10),//AI_MESO_UGNSNIPER :: SNIPER + CAISkills(57.60, 512.00, 0.20, 2.50, 0.38, 1.50, 90.00, 2.00, 0),//AI_MESO_UGNSOLDIER1 :: PISTOL1 + CAISkills(43.20, 192.00, 0.00, 0.25, 0.75, 1.50, 135.00, 0.60, 16),//AI_MESO_UGNSOLDIER1B :: SHOTGUN + CAISkills(43.20, 192.00, 0.00, 0.25, 0.75, 1.50, 135.00, 0.60, 16),//AI_MESO_UGNSOLDIER2 :: SHOTGUN + CAISkills(9.60, 128.00, 0.00, 0.50, 0.00, 0.00, 576.00, 4.00, 176),//AI_MESO_UGNSOLDIER3 :: FLAME + CAISkills(192.00, 512.00, 0.60, 2.50, 0.50, 2.00, 64.00, 2.00, 0),//AI_MESO_NYCSWATGUY :: PISTOL1 + CAISkills(192.00, 512.00, 0.60, 2.50, 0.50, 2.00, 64.00, 2.00, 0),//AI_MESO_NYCSWATLEADER :: PISTOL1 + CAISkills(192.00, 384.00, 0.42, 0.25, 1.13, 2.00, 1584.00, 1.00, 21),//AI_MESO_RAIDER1 :: MACHINEG + CAISkills(192.00, 384.00, 0.42, 0.13, 0.75, 2.00, 748.00, 1.00, 5),//AI_MESO_RAIDER2A :: MPISTOL + CAISkills(192.00, 384.00, 0.42, 0.50, 0.75, 2.00, 1364.00, 1.00, 5),//AI_MESO_RAIDER2B :: AUTO + CAISkills(192.00, 384.00, 0.28, 0.50, 0.75, 1.00, 2750.00, 0.60, 37),//AI_MESO_RAIDERBRUTE :: MICRO + CAISkills(128.00, 512.00, 0.00, 0.50, 0.75, 1.00, 1870.00, 0.70, 53),//AI_MESO_RAIDERROCKET :: ROCKET + CAISkills(192.00, 384.00, 0.18, 0.13, 1.00, 5.00, 142.80, 1.00, 0),//AI_MESO_SIBTROOPER2 :: MPISTOL + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 2.50, 42.00, 2.00, 0),//AI_MESO_SIBCLEANSUIT :: PISTOL1 + CAISkills(144.00, 192.00, 0.00, 0.25, 1.00, 3.00, 37.50, 0.60, 16),//AI_MESO_SERBGRUNT1 :: SHOTGUN + CAISkills(192.00, 384.00, 0.18, 0.13, 1.00, 6.00, 77.50, 1.00, 16),//AI_MESO_SERBGRUNT2 :: ASSAULT + CAISkills(192.00, 384.00, 0.18, 0.13, 1.00, 6.00, 77.50, 1.00, 16),//AI_MESO_SERBGRUNT3 :: ASSAULT + CAISkills(256.00, 512.00, 0.18, 0.50, 1.00, 3.00, 105.00, 1.50, 10),//AI_MESO_SERBSNIPER1A :: SNIPER + CAISkills(256.00, 512.00, 0.18, 0.50, 1.00, 3.00, 105.00, 1.50, 10),//AI_MESO_SERBSNIPER1B :: SNIPER + CAISkills(192.00, 512.00, 0.30, 1.25, 0.50, 3.00, 31.25, 1.50, 0),//AI_MESO_SERBCOMTROOP :: PISTOL2 + CAISkills(192.00, 384.00, 0.18, 0.13, 1.00, 6.00, 77.50, 1.00, 16),//AI_MESO_SERBBRUTE1A :: ASSAULT + CAISkills(192.00, 384.00, 0.18, 0.13, 1.00, 6.00, 77.50, 1.00, 16),//AI_MESO_SERBBRUTE1B :: ASSAULT + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_SERBMECHANIC + CAISkills(192.00, 384.00, 0.18, 0.13, 1.00, 6.00, 77.50, 1.00, 16),//AI_MESO_KOSREBEL :: ASSAULT + CAISkills(192.00, 384.00, 0.18, 0.13, 1.00, 6.00, 77.50, 1.00, 16),//AI_MESO_KOSKLAGUY :: ASSAULT + CAISkills(144.00, 192.00, 0.00, 0.25, 1.00, 2.00, 96.00, 0.60, 16),//AI_MESO_SKINHEAD1 :: SHOTGUN + CAISkills(192.00, 512.00, 0.60, 2.50, 0.50, 2.00, 64.00, 2.00, 0),//AI_MESO_SKINHEAD2A :: PISTOL1 + CAISkills(192.00, 384.00, 0.36, 0.13, 1.00, 4.00, 198.40, 1.00, 16),//AI_MESO_SKINHEAD2B :: ASSAULT + CAISkills(192.00, 512.00, 0.60, 1.25, 0.50, 2.00, 80.00, 1.50, 0),//AI_MESO_SKINHEADBOSS :: PISTOL2 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_MALEPOLITICIAN + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_TOKMALEHOSTAGE + CAISkills(192.00, 512.00, 1.00, 2.50, 0.38, 1.00, 110.00, 2.00, 0),//AI_MESO_TOKHENCH1 :: PISTOL1 + CAISkills(192.00, 384.00, 0.60, 0.13, 0.75, 2.00, 341.00, 1.00, 16),//AI_MESO_TOKHENCH2 :: ASSAULT + CAISkills(192.00, 384.00, 0.40, 0.50, 0.75, 1.00, 1375.00, 0.60, 32),//AI_MESO_TOKKILLER :: MICRO + CAISkills(192.00, 384.00, 0.60, 0.13, 0.75, 2.00, 374.00, 1.00, 0),//AI_MESO_TOKNINJA :: MPISTOL + CAISkills(192.00, 384.00, 0.60, 0.13, 0.75, 2.00, 341.00, 1.00, 16),//AI_MESO_TOKBRUTE :: ASSAULT + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_JAPANSUIT + CAISkills(57.60, 512.00, 0.20, 1.25, 0.38, 1.50, 112.50, 1.50, 0),//AI_MESO_UGNBRUTE :: PISTOL2 + CAISkills(38.40, 512.00, 0.00, 0.50, 0.75, 1.50, 765.00, 0.70, 53),//AI_MESO_UGNROCKET :: ROCKET + CAISkills(192.00, 384.00, 0.18, 0.13, 1.00, 5.00, 130.20, 1.00, 16),//AI_MESO_SIBTROOPER1A :: ASSAULT + CAISkills(256.00, 512.00, 0.18, 0.50, 1.00, 2.50, 176.40, 1.50, 10),//AI_MESO_SIBTROOPER1B :: SNIPER + CAISkills(192.00, 384.00, 0.18, 0.13, 1.00, 5.00, 130.20, 1.00, 16),//AI_MESO_SIBGUARD :: ASSAULT + CAISkills(192.00, 384.00, 0.18, 0.13, 1.00, 5.00, 142.80, 1.00, 0),//AI_MESO_SIBGUARD3 :: MPISTOL + CAISkills(192.00, 384.00, 0.18, 0.13, 1.00, 5.00, 130.20, 1.00, 16),//AI_MESO_SIBGUARD4 :: ASSAULT + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_MESO_SIBMECH + + CAISkills(192.00, 512.00, 0.60, 2.50, 0.50, 2.00, 64.00, 2.00, 0),//AI_FEMALE_SKINCHICK :: PISTOL1 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_FEMALE_NYWOMAN + CAISkills(192.00, 384.00, 0.18, 0.13, 1.00, 5.00, 142.80, 1.00, 0),//AI_FEMALE_SIBGUARD :: MPISTOL + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_FEMALE_SIBSCIENCE + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_FEMALE_IRQWOMAN1 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_FEMALE_IRQWOMAN2 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_FEMALE_TOKWOMAN1 + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_FEMALE_TOKWOMAN2 + CAISkills(192.00, 512.00, 1.00, 2.50, 0.38, 1.00, 110.00, 2.00, 0),//AI_FEMALE_TOKASSASSIN :: PISTOL1 + CAISkills(32.00, 128.00, 0.00, 0.50, 0.00, 0.00, 1408.00, 4.00, 181),//AI_FEMALE_RAIDER :: FLAME + CAISkills(192.00, 512.00, 0.30, 2.50, 0.50, 3.00, 25.00, 2.00, 0),//AI_FEMALE_TAYLOR :: ASSAULT +}; + + +void john_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterFaceSkins("f_john_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_xjohn",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_xjohn",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_john",VARIETY_PRIORITY_HIGHEST); + + //EH! these guys may have to be registered in the same order they appear in the .ifl! + RegisterTalkFaceSkins("f_john_n",VARIETY_PRIORITY_HIGHEST); + RegisterTalkFaceSkins("f_john_m",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_john_nt1",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_john_nt2",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_john_nt3",VARIETY_PRIORITY_HIGHEST); +} + +void john_ai::Init(edict_t *monster, char *theclass, char* subclass) +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, theclass, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_backpack_smll", "to_abolt_back", myInstance, "acc_backpack_smll_dgrey", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_flop3", "to_abolt_head_t", myInstance, "acc_hat_flop3", 1.05); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_headset", "to_abolt_head_t", myInstance, "acc_headset", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_canteen1", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_calf_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_blck", MESO_OTHER_SCALE); + + if ( !(monster->spawnflags & SPAWNFLAG_NO_WEAPONS) ) + { + body->SetRightHandWeapon(*monster, ATK_PISTOL1); + } + + body->ApplySkin(*monster, myInstance, "b", "b_xjohn"); + body->ApplySkin(*monster, myInstance, "a", "a_xjohn"); + body->ApplySkin(*monster, myInstance, "h", "h_john"); + body->SetFace(*monster,"f_john_"); + + body->SetVoiceDirectories(*monster, "jm", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void john_snow_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterFaceSkins("f_john_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_xjohn_snow",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_xjohn_snow",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_john",VARIETY_PRIORITY_HIGHEST); + + //EH! these guys may have to be registered in the same order they appear in the .ifl! + RegisterTalkFaceSkins("f_john_n",VARIETY_PRIORITY_HIGHEST); + RegisterTalkFaceSkins("f_john_m",VARIETY_PRIORITY_HIGHEST); +} + +void john_snow_ai::Init(edict_t *monster, char *theclass, char* subclass) +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, theclass, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_backpack_lrg", "to_abolt_back", myInstance, "acc_backpack_lrg_blk", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_snow", "to_abolt_head_t", myInstance, "acc_hat_snow", MESO_HAT_SCALE); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_headset", "to_abolt_head_t", myInstance, "acc_headset", MESO_OTHER_SCALE); +// body->AddBoltedItem(*monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_canteen1", MESO_OTHER_SCALE); +// body->AddBoltedItem(*monster, "abolt_calf_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_blck", MESO_OTHER_SCALE); + + if ( !(monster->spawnflags & SPAWNFLAG_NO_WEAPONS) ) + { + body->SetRightHandWeapon(*monster, ATK_PISTOL1); + } + + body->ApplySkin(*monster, myInstance, "b", "b_xjohn_snow"); + body->ApplySkin(*monster, myInstance, "a", "a_xjohn_snow"); + body->ApplySkin(*monster, myInstance, "h", "h_john"); + body->SetFace(*monster,"f_john_"); + + body->SetVoiceDirectories(*monster, "jm", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void john_desert_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterFaceSkins("f_john_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_xjohn_desert",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_xjohn_desert",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_john",VARIETY_PRIORITY_HIGHEST); + + //EH! these guys may have to be registered in the same order they appear in the .ifl! + RegisterTalkFaceSkins("f_john_n",VARIETY_PRIORITY_HIGHEST); + RegisterTalkFaceSkins("f_john_m",VARIETY_PRIORITY_HIGHEST); +} + +void john_desert_ai::Init(edict_t *monster, char *theclass, char* subclass) +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, theclass, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_backpack_smll", "to_abolt_back", myInstance, "acc_backpack_smll", MESO_OTHER_SCALE); +// body->AddBoltedItem(*monster, "abolt_thigh_r", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_r", myInstance, "acc_pouch_thigh_tan",MESO_POUCH_SCALE); +// body->AddBoltedItem(*monster, "abolt_thigh_l", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_l", myInstance, "acc_pouch_thigh_tan",MESO_POUCH_SCALE); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_flop3", "to_abolt_head_t", myInstance, "acc_hat_flop3_desert", 1.05); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_headset", "to_abolt_head_t", myInstance, "acc_headset", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_canteen1", MESO_OTHER_SCALE); +// body->AddBoltedItem(*monster, "abolt_calf_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_blck", MESO_OTHER_SCALE); + + if ( !(monster->spawnflags & SPAWNFLAG_NO_WEAPONS) ) + { + body->SetRightHandWeapon(*monster, ATK_PISTOL1); + } + + body->ApplySkin(*monster, myInstance, "b", "b_xjohn_desert"); + body->ApplySkin(*monster, myInstance, "a", "a_xjohn_desert"); + body->ApplySkin(*monster, myInstance, "h", "h_john"); + body->SetFace(*monster,"f_john_"); + + body->SetVoiceDirectories(*monster, "jm", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void hurthawk_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterFaceSkins("f_b_6_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_mercdemo1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_mercdemo1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_6_s",VARIETY_PRIORITY_HIGHEST); + + //EH! these guys may have to be registered in the same order they appear in the .ifl! + RegisterTalkFaceSkins("f_b_6_n",VARIETY_PRIORITY_HIGHEST); + RegisterTalkFaceSkins("f_b_6_f",VARIETY_PRIORITY_HIGHEST); +} + +void hurthawk_ai::Init(edict_t *monster, char *theclass, char* subclass) +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, theclass, subclass); + +// SetSpecialBuddy(true); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->ApplySkin(*monster, myInstance, "b", "b_mercdemo1"); + body->ApplySkin(*monster, myInstance, "a", "a_mercdemo1"); + body->ApplySkin(*monster, myInstance, "h", "h_b_6_s"); + body->SetFace(*monster,"f_b_6_"); + + body->SetVoiceDirectories(*monster, "hawk", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void hawk_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterFaceSkins("f_b_6_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_mercdemo1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_mercdemo1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_6_s",VARIETY_PRIORITY_HIGHEST); + + //EH! these guys may have to be registered in the same order they appear in the .ifl! + RegisterTalkFaceSkins("f_b_6_n",VARIETY_PRIORITY_HIGHEST); + RegisterTalkFaceSkins("f_b_6_f",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_b_6_nt1",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_b_6_nt2",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_b_6_nt3",VARIETY_PRIORITY_HIGHEST); +} + +void hawk_ai::Init(edict_t *monster, char *theclass, char* subclass) +{ + ggOinstC* myInstance; + + monster->flags |= FL_NO_KNOCKBACK; + + generic_meso_ai::Init(monster, theclass, subclass); + + SetSpecialBuddy(true); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_backpack_lrg", "to_abolt_back", myInstance, "acc_backpack_lrg_tan", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_sun", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_headset", "to_abolt_head_t", myInstance, "acc_headset", MESO_OTHER_SCALE); + + if ( !(monster->spawnflags & SPAWNFLAG_NO_WEAPONS) ) + { + body->SetRightHandWeapon(*monster, ATK_MACHINEPISTOL); + } + + body->ApplySkin(*monster, myInstance, "b", "b_mercdemo1"); + body->ApplySkin(*monster, myInstance, "a", "a_mercdemo1"); + body->ApplySkin(*monster, myInstance, "h", "h_b_6_s"); + body->SetFace(*monster,"f_b_6_"); + + body->SetVoiceDirectories(*monster, "hawk", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void sam_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterFaceSkins("f_sam_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_xsam",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_xsam",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_sam",VARIETY_PRIORITY_HIGHEST); + + //EH! these guys may have to be registered in the same order they appear in the .ifl! + RegisterTalkFaceSkins("f_sam_n",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_sam_nt1",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_sam_nt2",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_sam_nt3",VARIETY_PRIORITY_HIGHEST); +} + +void sam_ai::Init(edict_t *monster, char *theclass, char* subclass) +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, theclass, subclass); + + SetSpecialBuddy(true); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_norm", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_xsam"); + body->ApplySkin(*monster, myInstance, "a", "a_xsam"); + body->ApplySkin(*monster, myInstance, "h", "h_sam"); + body->SetFace(*monster,"f_sam_"); + + body->SetVoiceDirectories(*monster, "sam", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void skinheadboss_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_nycskinboss",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycskinboss",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_8_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_8_",VARIETY_PRIORITY_HIGHEST); + + RegisterTalkFaceSkins("f_w_8_m",VARIETY_PRIORITY_HIGHEST); +} + +void skinheadboss_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + scale = 1.1; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + if ( !(monster->spawnflags & SPAWNFLAG_NO_WEAPONS) ) + { + body->SetRightHandWeapon(*monster, ATK_PISTOL2); + body->AddBoltedItem(*monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_blck", MESO_OTHER_SCALE); + } + + + body->ApplySkin(*monster, myInstance, "b", "b_nycskinboss"); + body->ApplySkin(*monster, myInstance, "a", "a_nycskinboss"); + body->ApplySkin(*monster, myInstance, "h", "h_w_8_s"); + body->SetFace(*monster,"f_w_8_"); + + body->SetVoiceDirectories(*monster, "sk", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void amu_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_xamu",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_xamu",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_amu",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_amu_",VARIETY_PRIORITY_HIGHEST); + + //EH! these guys may have to be registered in the same order they appear in the .ifl! + RegisterTalkFaceSkins("f_amu_f",VARIETY_PRIORITY_HIGHEST); + RegisterTalkFaceSkins("f_amu_n",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_amu_ft1",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_amu_ft2",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("f","f_amu_ft3",VARIETY_PRIORITY_HIGHEST); +} + +void amu_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddBoltedItem(*monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_brwn", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_beret", "to_abolt_head_t", myInstance, "acc_hat_beret_red",MESO_HAT_SCALE+0.04); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_amu_head", "to_abolt_head_t", myInstance, "rubbish", MESO_OTHER_SCALE+0.045); + + body->ApplySkin(*monster, myInstance, "b", "b_xamu"); + body->ApplySkin(*monster, myInstance, "a", "a_xamu"); + body->ApplySkin(*monster, myInstance, "h", "h_amu"); + body->SetFace(*monster,"f_amu_"); + + body->SetVoiceDirectories(*monster, "soldier", 2, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + + +void raiderboss_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_xdekker",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_xdekker",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_dekker",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_dekker",VARIETY_PRIORITY_HIGHEST); +} + + +void raiderboss_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + scale = 1.1; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL2); + + body->ApplySkin(*monster, myInstance, "b", "b_xdekker"); + body->ApplySkin(*monster, myInstance, "a", "a_xdekker"); + body->ApplySkin(*monster, myInstance, "h", "h_dekker"); + body->ApplySkin(*monster, myInstance, "f", "f_dekker"); + + body->SetVoiceDirectories(*monster, "soldier", 2, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + body->SetArmor(*monster, ARMOR_FULL); +} + +void raiderboss_ai::AddBody(edict_t *monster) +{ + if (!monster) + { + return; + } + body = new bodydekker_c(); +} + +void raiderboss2_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_xdekker",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_xdekker",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_dekker",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_dekker",VARIETY_PRIORITY_HIGHEST); +} + + +void raiderboss2_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + scale = 1.1; + stepheight = 32.0F; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + monster->ghoulInst->SetSpeed(gsOne); + + if ( !(monster->spawnflags & SPAWNFLAG_NO_WEAPONS) ) + { + body->SetRightHandWeapon(*monster, ATK_DEKKER); + body->SetLeftHandWeapon(*monster, ATK_GRENADE); + } + + body->ApplySkin(*monster, myInstance, "b", "b_xdekker"); + body->ApplySkin(*monster, myInstance, "a", "a_xdekker"); + body->ApplySkin(*monster, myInstance, "h", "h_dekker"); + body->ApplySkin(*monster, myInstance, "f", "f_dekker"); + + body->SetVoiceDirectories(*monster, "soldier", 2, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + monster->flags |= FL_IAMTHEBOSS; + + body->SetArmor(*monster, ARMOR_FULL); + body->SetArmor(*monster, ARMOR_TOUGH); + monster->flags |= FL_NO_KNOCKBACK; + + gi.effectindex("environ/dekarmor1"); +} + +void raiderboss2_ai::Think(edict_t &monster) +{ + ai_c::Think(monster); +} + +void raiderboss2_ai::AddBody(edict_t *monster) +{ + if (!monster) + { + return; + } + body = new bodydekker_c(); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void skinhead1_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_nycskinhead1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycskinhead1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_nycskinhead1b",VARIETY_PRIORITY_LOW); + RegisterSkin("a","a_nycskinhead1b",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_w_1_s",VARIETY_PRIORITY_LOWEST); + RegisterFaceSkins("f_w_1_",VARIETY_PRIORITY_LOWEST); + RegisterSkin("h","h_w_13_s",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_w_13_",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_w_3_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_3_",VARIETY_PRIORITY_HIGHEST); +} + +void skinhead1_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + qboolean altSkin=false; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_SHOTGUN); +// body->SetLeftHandWeapon(*monster, ATK_MOLITOV); + +// GetMySkills()->setSkills(128, 192, 0, 0, .2, 0, 0, 128); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_sun", MESO_GLASSES_SCALE); + + if (gi.irand(0,1)) + { + altSkin=body->ApplySkin(*monster, myInstance, "b", "b_nycskinhead1b") + && body->ApplySkin(*monster, myInstance, "a", "a_nycskinhead1b"); + } + + if (altSkin) + { + if (!body->AddRandomBoltedItem(0.125, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_baseball", "to_abolt_head_t_bkwd", myInstance, "acc_hat_baseball_grcamo", MESO_OTHER_SCALE)) + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_baseball", "to_abolt_head_t_bkwd", myInstance, "acc_hat_baseball_dgrey", MESO_OTHER_SCALE); + } + else + { + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_baseball", "to_abolt_head_t_bkwd", myInstance, "acc_hat_baseball_dgrey", MESO_OTHER_SCALE); + body->ApplySkin(*monster, myInstance, "b", "b_nycskinhead1"); + body->ApplySkin(*monster, myInstance, "a", "a_nycskinhead1"); + } + + altSkin=false; + + if (!gi.irand(0,2)) + { + altSkin=body->ApplySkin(*monster, myInstance, "h", "h_w_1_s"); + } + if (altSkin) + { + body->SetFace(*monster,"f_w_1_"); + } + else + { + if (!gi.irand(0,1)) + { + altSkin=body->ApplySkin(*monster, myInstance, "h", "h_w_13_s"); + } + if (altSkin) + { + body->SetFace(*monster,"f_w_13_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_w_3_s"); + body->SetFace(*monster,"f_w_3_"); + } + } + + body->SetVoiceDirectories(*monster, "sk", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + gi.effectindex("environ/onfireburst"); + gi.effectindex("environ/takeleak"); // Skinheads can take the piss, as it were... :-/ +} + +void skinhead2a_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_nycskinhead2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycskinhead2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_nycskinhead2b",VARIETY_PRIORITY_LOW); + RegisterSkin("a","a_nycskinhead2b",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_w_11_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_11_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_6_s",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_w_6_",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_w_9_s",VARIETY_PRIORITY_HIGH); + RegisterFaceSkins("f_w_9_",VARIETY_PRIORITY_HIGH); +} + +void skinhead2a_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + qboolean altskin=false; + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + if ( !(monster->spawnflags & SPAWNFLAG_NO_WEAPONS) ) + { + body->SetRightHandWeapon(*monster, ATK_PISTOL1); +// body->SetLeftHandWeapon(*monster, ATK_MOLITOV); + } +// GetMySkills()->setSkills(256, 512, .5, .5, 1.0, .5, .5, 512); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_sun", MESO_GLASSES_SCALE); + + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "b", "b_nycskinhead2b")) + { + body->ApplySkin(*monster, myInstance, "a", "a_nycskinhead2b"); + } + else + { + body->ApplySkin(*monster, myInstance, "b", "b_nycskinhead2"); + body->ApplySkin(*monster, myInstance, "a", "a_nycskinhead2"); + } + + if (gi.irand(0,1)) + { + altskin=body->ApplySkin(*monster, myInstance, "h", "h_w_6_s"); + } + if (altskin) + { + body->SetFace(*monster,"f_w_6_"); + } + else + { + if (!gi.irand(0,2)) + { + altskin = body->ApplySkin(*monster, myInstance, "h", "h_w_9_s"); + } + if (altskin) + { + body->SetFace(*monster,"f_w_9_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_w_11_c"); + myInstance->GetInstPtr()->SetPartOnOff("_baldhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_crewhead", true); + body->SetFace(*monster,"f_w_11_"); + } + } + + body->SetVoiceDirectories(*monster, "sk", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + gi.effectindex("environ/onfireburst"); +} + +void skinhead2b_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_nycskinhead2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycskinhead2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_nycskinhead2b",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycskinhead2b",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_11_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_11_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_6_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_6_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_9_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_9_",VARIETY_PRIORITY_HIGHEST); +} + +void skinhead2b_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + qboolean altskin=false; + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); +// body->SetLeftHandWeapon(*monster, ATK_MOLITOV); + +// GetMySkills()->setSkills(192, 384, .3, .1, .7, .7, .7, 128); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_sun", MESO_GLASSES_SCALE); + + if (rand()%2&&body->ApplySkin(*monster, myInstance, "b", "b_nycskinhead2")) + { + body->ApplySkin(*monster, myInstance, "a", "a_nycskinhead2"); + } + else + { + body->ApplySkin(*monster, myInstance, "b", "b_nycskinhead2b"); + body->ApplySkin(*monster, myInstance, "a", "a_nycskinhead2b"); + } + + if (!gi.irand(0,2)) + { + altskin = body->ApplySkin(*monster, myInstance, "h", "h_w_11_c"); + } + if (altskin) + { + myInstance->GetInstPtr()->SetPartOnOff("_baldhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_crewhead", true); + body->SetFace(*monster,"f_w_11_"); + } + else + { + if (gi.irand(0,1)) + { + altskin=body->ApplySkin(*monster, myInstance, "h", "h_w_6_s"); + } + if (altskin) + { + body->SetFace(*monster,"f_w_6_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_w_9_s"); + body->SetFace(*monster,"f_w_9_"); + } + } + + body->SetVoiceDirectories(*monster, "sk", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + gi.effectindex("environ/onfireburst"); +} + +void nypunk_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_nycpunk1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycpunk1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_3_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_3_",VARIETY_PRIORITY_HIGHEST); +} + +void nypunk_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_SHOTGUN); + +// GetMySkills()->setSkills(128, 256, .2, .3, 1.0, 0, .8, 128); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_sun",MESO_GLASSES_SCALE); + body->AddBoltedItem(*monster, "abolt_shoulder_r", "Enemy/Bolt", "acc_spikes_shlder", "to_abolt_shoulder_r", myInstance, "acc_spikes_shlder", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_shoulder_l", "Enemy/Bolt", "acc_spikes_shlder", "to_abolt_shoulder_l", myInstance, "acc_spikes_shlder", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_nycpunk1"); + body->ApplySkin(*monster, myInstance, "a", "a_nycpunk1"); + + body->ApplySkin(*monster, myInstance, "h", "h_w_3_s"); + body->SetFace(*monster,"f_w_3_"); + + body->SetVoiceDirectories(*monster, "sk", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void nyswatguy_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_nycswat",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycswat2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_3_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_3_",VARIETY_PRIORITY_HIGHEST); +} + +void nyswatguy_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body || !monster->ghoulInst) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL1); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_helmet2", "to_abolt_head_t", myInstance, "acc_helmet2", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_goggles", "to_abolt_head_t", myInstance, "acc_goggles", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_blck", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_blck", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_nycswat"); + + body->ApplySkin(*monster, myInstance, "a", "a_nycswat2"); + body->ApplySkin(*monster, myInstance, "h", "h_w_3_s"); + body->SetFace(*monster,"f_w_3_"); + + body->SetVoiceDirectories(*monster, "sw", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_CHEST); +} + +void nyswatleader_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_nycswat",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_nycswat",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_4_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_b_4_",VARIETY_PRIORITY_HIGHEST); + RegisterTalkFaceSkins("f_b_4_n",VARIETY_PRIORITY_HIGHEST); +} + +void nyswatleader_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + SetSpecialBuddy(true); + + if (!body || !monster->ghoulInst) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL1); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_helmet2", "to_abolt_head_t", myInstance, "acc_helmet2", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_goggles", "to_abolt_head_t", myInstance, "acc_goggles", MESO_OTHER_SCALE); + + body->AddBoltedItem(*monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_blck", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_blck", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_nycswat"); + + body->ApplySkin(*monster, myInstance, "a", "a_nycswat"); + body->ApplySkin(*monster, myInstance, "h", "h_b_4_c"); + body->SetFace(*monster,"f_b_4_"); + + body->SetVoiceDirectories(*monster, "sw", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_CHEST); +} + +void malepolitician_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_dcmalepol",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_dcmalepol",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_2_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_b_2_",VARIETY_PRIORITY_HIGHEST); +} + +void malepolitician_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddRandomBoltedItem(0.5, *monster, "wbolt_hand_l", "Enemy/Bolt", "w_briefcase", "to_wbolt_hand_l", myInstance, "rubbish", MESO_WEAPON_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_norm",MESO_GLASSES_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_dcmalepol"); + body->ApplySkin(*monster, myInstance, "a", "a_dcmalepol"); + + body->ApplySkin(*monster, myInstance, "h", "h_b_2_s"); + body->SetFace(*monster,"f_b_2_"); + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void ugsoldier1_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_ugnsoldier1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_ugnsoldier1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_5_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_b_5_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_4_c",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_b_4_",VARIETY_PRIORITY_LOW); +} + +void ugsoldier1_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + qboolean hasHat = false; + qboolean isBald = false; + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body || !monster->ghoulInst) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL1); + + //fixme--this hat is a screwy screwy thing indeed. + hasHat=body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_flop2", "to_abolt_head_t", myInstance, "acc_hat_flop2_tan", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_brwn", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_brwn", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_ugnsoldier1"); + body->ApplySkin(*monster, myInstance, "a", "a_ugnsoldier1"); + + + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_b_4_c")) + { + body->SetFace(*monster,"f_b_4_"); + isBald=false; + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_b_5_s"); + body->SetFace(*monster,"f_b_5_"); + isBald=true; + } + + //use bald head if i'm bald or if i'm wearing a hat + if (isBald || hasHat) + { + monster->ghoulInst->SetPartOnOff("_crewhead", false); + } + else + { + monster->ghoulInst->SetPartOnOff("_baldhead", false); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void ugsoldier1b_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_ugnsoldier1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_ugnsoldier1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_5_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_b_5_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_4_c",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_b_4_",VARIETY_PRIORITY_LOW); +} + +void ugsoldier1b_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + qboolean hasHat = false; + qboolean isBald = false; + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body || !monster->ghoulInst) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + if ( !(monster->spawnflags & SPAWNFLAG_NO_WEAPONS) ) + { + body->SetRightHandWeapon(*monster, ATK_SHOTGUN); + body->SetLeftHandWeapon(*monster, ATK_GRENADE); + } + + //fixme--this hat is a screwy screwy thing indeed. + hasHat=body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_flop2", "to_abolt_head_t", myInstance, "acc_hat_flop2_tan", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_brwn", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_brwn", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_ugnsoldier1"); + body->ApplySkin(*monster, myInstance, "a", "a_ugnsoldier1"); + + + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_b_4_c")) + { + body->SetFace(*monster,"f_b_4_"); + isBald=false; + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_b_5_s"); + body->SetFace(*monster,"f_b_5_"); + isBald=true; + } + + //use bald head if i'm bald or if i'm wearing a hat + if (isBald || hasHat) + { + monster->ghoulInst->SetPartOnOff("_crewhead", false); + } + else + { + monster->ghoulInst->SetPartOnOff("_baldhead", false); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void ugsoldier2_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_ugnsoldier2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_ugnsoldier2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_2_s",VARIETY_PRIORITY_HIGH); + RegisterFaceSkins("f_b_2_",VARIETY_PRIORITY_HIGH); + RegisterSkin("h","h_b_3_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_b_3_",VARIETY_PRIORITY_HIGHEST); +} + +void ugsoldier2_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_SHOTGUN); + + if (!body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_baseball", "to_abolt_head_t_fwd", myInstance, "acc_hat_baseball_tan", MESO_OTHER_SCALE)) + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_flop2", "to_abolt_head_t", myInstance, "acc_hat_flop2_tan", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_canteen1", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_r", myInstance, "acc_box_hip_smll_brwn", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_ugnsoldier2"); + body->ApplySkin(*monster, myInstance, "a", "a_ugnsoldier2"); + + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_b_2_s")) + { + body->SetFace(*monster,"f_b_2_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_b_3_s"); + body->SetFace(*monster,"f_b_3_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void ugsoldier3_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_ugnsoldier3",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_ugnsoldier3",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_3_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_b_3_",VARIETY_PRIORITY_HIGHEST); +} + +void ugsoldier3_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_FLAMEGUN); + body->SetLeftHandWeapon(*monster, ATK_GRENADE); + + if (body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", "acc_helmet2", "to_abolt_head_t", myInstance, "acc_helmet2_tan", MESO_OTHER_SCALE)) + { + monster->ghoulInst->SetPartOnOff("_baldhead", false); + monster->ghoulInst->SetPartOnOff("_comface", false); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_goggles", "to_abolt_head_t", myInstance, "acc_goggles",MESO_OTHER_SCALE); + } + else + { + monster->ghoulInst->SetPartOnOff("_helmethead", false); + monster->ghoulInst->SetPartOnOff("_helmetface", false); + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_sun",MESO_GLASSES_SCALE); + } + + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_tanks", "to_abolt_back", myInstance, "acc_tanks_afr", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_ugnsoldier3"); + body->ApplySkin(*monster, myInstance, "a", "a_ugnsoldier3"); + + body->ApplySkin(*monster, myInstance, "h", "h_b_3_s"); + body->SetFace(*monster,"f_b_3_"); + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_CHEST); +} + +void ugsniper_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_ugnsniper",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_ugnsniper",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_5_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_b_5_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_2_s",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_b_2_",VARIETY_PRIORITY_LOW); +} + +void ugsniper_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_SNIPER); + body->SetLeftHandWeapon(*monster, ATK_GRENADE); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_baseball", "to_abolt_head_t_bkwd", myInstance, "acc_hat_baseball_tan", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_sun",MESO_GLASSES_SCALE); + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_brwn", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_ugnsniper"); + body->ApplySkin(*monster, myInstance, "a", "a_ugnsniper"); + + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_b_2_s")) + { + body->SetFace(*monster,"f_b_2_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_b_5_s"); + body->SetFace(*monster,"f_b_5_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void ugbrute_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_ugbutcher",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_ugbutcher",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_b_7_s",VARIETY_PRIORITY_HIGH); + RegisterFaceSkins("f_b_7_",VARIETY_PRIORITY_HIGH); + RegisterSkin("h","h_b_2_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_b_2_",VARIETY_PRIORITY_HIGHEST); +} + +void ugbrute_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL2); + body->SetLeftHandWeapon(*monster, ATK_MACHETE); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_top", "to_abolt_head_t", myInstance, "acc_hat_top_wht", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_ugbutcher"); + body->ApplySkin(*monster, myInstance, "a", "a_ugbutcher"); + + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_b_7_s")) + { + body->SetFace(*monster,"f_b_7_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_b_2_s"); + body->SetFace(*monster,"f_b_2_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_TOUGH); +} + +void ugrocket_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_ugnrocket",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_ugnrocket",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_afrrocket",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_afrrocket",VARIETY_PRIORITY_HIGHEST); +} + +void ugrocket_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ROCKET); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_faceplate", "to_abolt_head_t", myInstance, "acc_faceplate_afr", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_back", "Enemy/Bolt", "acc_backpack_smll", "to_abolt_back", myInstance, "acc_backpack_smll_tan", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_ugnrocket"); + body->ApplySkin(*monster, myInstance, "a", "a_ugnrocket"); + + body->ApplySkin(*monster, myInstance, "h", "h_afrrocket"); + body->ApplySkin(*monster, myInstance, "f", "f_afrrocket"); + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_FULL); + // if this changes, update fx_surfaces.cpp also. + /* + for (int i = 1; i <= 3; i++) + { + gi.soundindex(va("enemy/rocket/foot%d.wav", i)); + } + */ +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void serbgrunt1_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_kosgrunt1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_kosgrunt1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("md","md_serbgrunt1",VARIETY_PRIORITY_HIGHEST); +} + +void serbgrunt1_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_SHOTGUN); + body->SetLeftHandWeapon(*monster, ATK_GASGREN); + + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_tanks", "to_abolt_back", myInstance, "acc_tanks_kos", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_canteen1", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.25, *monster, "abolt_thigh_l", "Enemy/Bolt", "acc_puch_thigh", "to_abolt_thigh_l", myInstance, "acc_pouch_thigh_green", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + + body->ApplySkin(*monster, myInstance, "b", "b_kosgrunt1"); + body->ApplySkin(*monster, myInstance, "a", "a_kosgrunt1"); + body->ApplySkin(*monster, myInstance, "md", "md_serbgrunt1"); + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void serbgrunt2_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_kosgrunt2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_kosgrunt2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("md","md_serbgrunt2",VARIETY_PRIORITY_HIGHEST); +} + +void serbgrunt2_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); + body->SetLeftHandWeapon(*monster, ATK_GASGREN); + + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_tanks", "to_abolt_back", myInstance, "acc_tanks_kos", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_r", myInstance, "acc_box_hip_canteen1", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.25, *monster, "abolt_thigh_l", "Enemy/Bolt", "acc_puch_thigh", "to_abolt_thigh_l", myInstance, "acc_pouch_thigh_tan", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + + body->ApplySkin(*monster, myInstance, "b", "b_kosgrunt2"); + body->ApplySkin(*monster, myInstance, "a", "a_kosgrunt2"); + body->ApplySkin(*monster, myInstance, "md", "md_serbgrunt2"); + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void serbgrunt3_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_kosgrunt3",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_kosgrunt3",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_h_6_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_h_6_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_h_3_s",VARIETY_PRIORITY_LOWEST); + RegisterFaceSkins("f_h_3_",VARIETY_PRIORITY_LOWEST); + RegisterSkin("h","h_w_5_c",VARIETY_PRIORITY_HIGH); + RegisterFaceSkins("f_w_5_",VARIETY_PRIORITY_HIGH); +} + +void serbgrunt3_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_helmet", "to_abolt_head_t", myInstance, "acc_helmet_green1", MESO_HAT_SCALE); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_gas_mask2", "to_abolt_head_t", myInstance, "acc_gas_mask2a", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_back", "Enemy/Bolt", "acc_backpack_low", "to_abolt_back", myInstance, "acc_backpack_low_tan", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_canteen1", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + + body->ApplySkin(*monster, myInstance, "b", "b_kosgrunt3"); + body->ApplySkin(*monster, myInstance, "a", "a_kosgrunt3"); + + if (!gi.irand(0,2)&&body->ApplySkin(*monster, myInstance, "h", "h_w_3_s")) + { + body->SetFace(*monster,"f_w_3_"); + } + else + { + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_w_5_c")) + { + body->SetFace(*monster,"f_w_5_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_h_6_s"); + body->SetFace(*monster,"f_h_6_"); + } + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void serbsniper1a_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_kossnipe",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_kossnipe",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_h_6_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_h_6_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_10_s",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_w_10_",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_w_2_c",VARIETY_PRIORITY_LOWEST); + RegisterFaceSkins("f_w_2_",VARIETY_PRIORITY_LOWEST); +} + +void serbsniper1a_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_SNIPER); + body->SetLeftHandWeapon(*monster, ATK_GASGREN); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_helmet2", "to_abolt_head_t", myInstance, "acc_helmet2_green", MESO_HAT_SCALE); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_gas_mask2", "to_abolt_head_t", myInstance, "acc_gas_mask2a", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_goggles", "to_abolt_head_t", myInstance, "acc_goggles", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + + body->ApplySkin(*monster, myInstance, "b", "b_kossnipe"); + body->ApplySkin(*monster, myInstance, "a", "a_kossnipe"); + + if (!gi.irand(0,2)&&body->ApplySkin(*monster, myInstance, "h", "h_w_2_c")) + { + body->SetFace(*monster,"f_w_2_"); + } + else + { + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_w_10_s")) + { + body->SetFace(*monster,"f_w_10_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_h_6_s"); + body->SetFace(*monster,"f_h_6_"); + } + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_CHEST); +} + +void serbsniper1b_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_kossnipe",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_kossnipe",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_h_6_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_h_6_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_10_s",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_w_10_",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_w_2_c",VARIETY_PRIORITY_LOWEST); + RegisterFaceSkins("f_w_2_",VARIETY_PRIORITY_LOWEST); +} + +void serbsniper1b_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_SNIPER); + body->SetLeftHandWeapon(*monster, ATK_GASGREN); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_helmet2", "to_abolt_head_t", myInstance, "acc_helmet2_green", MESO_HAT_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_goggles", "to_abolt_head_t", myInstance, "acc_goggles", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + + body->ApplySkin(*monster, myInstance, "b", "b_kossnipe"); + body->ApplySkin(*monster, myInstance, "a", "a_kossnipe"); + + if (!gi.irand(0,2)&&body->ApplySkin(*monster, myInstance, "h", "h_w_2_c")) + { + body->SetFace(*monster,"f_w_2_"); + } + else + { + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_w_10_s")) + { + body->SetFace(*monster,"f_w_10_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_h_6_s"); + body->SetFace(*monster,"f_h_6_"); + } + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_CHEST); +} + +void serbcomtroop_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_koscomtroop",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_koscomtroop",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_19_s",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_w_19_",VARIETY_PRIORITY_LOW); + RegisterSkin("h","h_w_4_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_4_",VARIETY_PRIORITY_HIGHEST); +} + +void serbcomtroop_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL2); + body->SetLeftHandWeapon(*monster, ATK_GRENADE); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_helmet", "to_abolt_head_t", myInstance, "acc_helmet_green1", MESO_HAT_SCALE); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_gas_mask2", "to_abolt_head_t", myInstance, "acc_gas_mask2a", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_backpack_lrg", "to_abolt_back", myInstance, "acc_backpack_lrg_grn", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_antenna", "to_abolt_back", myInstance, "acc_antenna", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + + body->ApplySkin(*monster, myInstance, "b", "b_koscomtroop"); + body->ApplySkin(*monster, myInstance, "a", "a_koscomtroop"); + + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_w_19_s")) + { + body->SetFace(*monster,"f_w_19_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_w_4_s"); + body->SetFace(*monster,"f_w_4_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void serbbrute1a_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_kosbrute",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_kosbrute",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_h_6_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_h_6_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_3_s",VARIETY_PRIORITY_HIGH); + RegisterFaceSkins("f_w_3_",VARIETY_PRIORITY_HIGH); + RegisterSkin("h","h_w_5_c",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_w_5_",VARIETY_PRIORITY_LOW); +} + +void serbbrute1a_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); + body->SetLeftHandWeapon(*monster, ATK_GRENADE); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_gas_mask2", "to_abolt_head_t", myInstance, "acc_gas_mask2a", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.1, *monster, "abolt_back", "Enemy/Bolt", "acc_backpack_lrg", "to_abolt_back", myInstance, "acc_backpack_lrg_brwn", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_brwn", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_beret", "to_abolt_head_t", myInstance, "acc_hat_beret_red",MESO_HAT_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + + body->ApplySkin(*monster, myInstance, "b", "b_kosbrute"); + body->ApplySkin(*monster, myInstance, "a", "a_kosbrute"); + + if (!gi.irand(0,2)&&body->ApplySkin(*monster, myInstance, "h", "h_w_5_c")) + { + body->SetFace(*monster,"f_w_5_"); + } + else + { + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_w_3_s")) + { + body->SetFace(*monster,"f_w_3_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_h_6_s"); + body->SetFace(*monster,"f_h_6_"); + } + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_TOUGH); +} + +void serbbrute1b_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_kosbrute",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_kosbrute",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_h_6_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_h_6_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_3_s",VARIETY_PRIORITY_HIGH); + RegisterFaceSkins("f_w_3_",VARIETY_PRIORITY_HIGH); + RegisterSkin("h","h_w_5_c",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_w_5_",VARIETY_PRIORITY_LOW); +} + +void serbbrute1b_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); + body->SetLeftHandWeapon(*monster, ATK_GRENADE); + + body->AddRandomBoltedItem(0.1, *monster, "abolt_back", "Enemy/Bolt", "acc_backpack_lrg", "to_abolt_back", myInstance, "acc_backpack_lrg_brwn", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_brwn", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_beret", "to_abolt_head_t", myInstance, "acc_hat_beret_red",MESO_HAT_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + + body->ApplySkin(*monster, myInstance, "b", "b_kosbrute"); + body->ApplySkin(*monster, myInstance, "a", "a_kosbrute"); + + if (!gi.irand(0,2)&&body->ApplySkin(*monster, myInstance, "h", "h_w_5_c")) + { + body->SetFace(*monster,"f_w_5_"); + } + else + { + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_w_3_s")) + { + body->SetFace(*monster,"f_w_3_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_h_6_s"); + body->SetFace(*monster,"f_h_6_"); + } + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_TOUGH); +} + +void serbmechanic_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_kosmechanic",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_kosmechanic",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_4_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_4_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","hb_h_2_b",VARIETY_PRIORITY_HIGH); + RegisterFaceSkins("f_hb_1_",VARIETY_PRIORITY_HIGH); +} + +void serbmechanic_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_hard", "to_abolt_head_t", myInstance, "acc_hat_hard_kos", MESO_HAT_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + + body->ApplySkin(*monster, myInstance, "b", "b_kosmechanic"); + body->ApplySkin(*monster, myInstance, "a", "a_kosmechanic"); + + if(gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "hb_h_2_b")) + { + myInstance->GetInstPtr()->SetPartOnOff("_baldhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_comface", false); + body->SetFace(*monster,"f_hb_1_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_w_4_s"); + myInstance->GetInstPtr()->SetPartOnOff("_beardhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_beardface", false); + body->SetFace(*monster,"f_w_4_"); + } + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void kosrebel_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_kosrebel1",VARIETY_PRIORITY_HIGH); + RegisterSkin("a","a_kosrebel1",VARIETY_PRIORITY_HIGH); + RegisterSkin("b","b_kosrebel2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_kosrebel2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_19_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_19_",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("h","h_w_20_c",VARIETY_PRIORITY_HIGHEST); +// RegisterFaceSkins("f_w_20_",VARIETY_PRIORITY_HIGHEST); +// RegisterTalkFaceSkins("f_w_20_n",VARIETY_PRIORITY_HIGHEST); +} + +void kosrebel_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + bool isbald=!!gi.irand(0,1); + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); +// body->SetLeftHandWeapon(*monster, ATK_MOLITOV); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_back", "Enemy/Bolt", "acc_backpack_low", "to_abolt_back", myInstance, "acc_backpack_low_dgrey", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_canteen1", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "b", "b_kosrebel1")) + { + body->ApplySkin(*monster, myInstance, "a", "a_kosrebel1"); + } + else + { + body->ApplySkin(*monster, myInstance, "b", "b_kosrebel2"); + body->ApplySkin(*monster, myInstance, "a", "a_kosrebel2"); + } + +// if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_w_19_s")) +// { +// body->SetFace(*monster,"f_w_19_"); +// isbald=true; +// } +// else +// { +// body->ApplySkin(*monster, myInstance, "h", "h_w_20_c"); +// body->SetFace(*monster,"f_w_20_"); +// } + body->ApplySkin(*monster, myInstance, "h", "h_w_19_s"); + body->SetFace(*monster,"f_w_19_"); + isbald=true; + + + if (body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_helmet", "to_abolt_head_t", myInstance, "acc_helmet_green1", MESO_HAT_SCALE)) + { + myInstance->GetInstPtr()->SetPartOnOff("_crewhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_baldhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_comface", false); + } + else + { + myInstance->GetInstPtr()->SetPartOnOff("_helmethead", false); + myInstance->GetInstPtr()->SetPartOnOff("_helmetface", false); + isbald=body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_baseball", "to_abolt_head_t_fwd", myInstance, "acc_hat_baseball_grcamo", MESO_OTHER_SCALE)||isbald; + if (isbald) + { + myInstance->GetInstPtr()->SetPartOnOff("_crewhead", false); + } + else + { + myInstance->GetInstPtr()->SetPartOnOff("_baldhead", false); + } + } + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + gi.effectindex("environ/onfireburst"); +} + +void kosklaguy_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_kosrebel2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_kosrebel2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_20_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_20_",VARIETY_PRIORITY_HIGHEST); + RegisterTalkFaceSkins("f_w_20_n",VARIETY_PRIORITY_HIGHEST); +} + +void kosklaguy_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + bool isbald=!!gi.irand(0,1); + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + SetSpecialBuddy(true); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); +// body->SetLeftHandWeapon(*monster, ATK_MOLITOV); + + body->AddBoltedItem(*monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_canteen1", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_baseball", "to_abolt_head_t_fwd", myInstance, "acc_hat_baseball_grcamo", MESO_OTHER_SCALE)||isbald; + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + + body->ApplySkin(*monster, myInstance, "b", "b_kosrebel2"); + body->ApplySkin(*monster, myInstance, "a", "a_kosrebel2"); + + body->ApplySkin(*monster, myInstance, "h", "h_w_20_c"); + body->SetFace(*monster,"f_w_20_"); + + myInstance->GetInstPtr()->SetPartOnOff("_helmethead", false); + myInstance->GetInstPtr()->SetPartOnOff("_helmetface", false); + myInstance->GetInstPtr()->SetPartOnOff("_crewhead", false); + + body->SetVoiceDirectories(*monster, "", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + gi.effectindex("environ/onfireburst"); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void sibtrooper1a_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_sibtrooper2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_sibtrooper2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("hd","hd_sibtroop",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_sibtroop",VARIETY_PRIORITY_HIGHEST); +} + +void sibtrooper1a_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_gas_mask", "to_abolt_head_t", myInstance, "acc_gas_mask", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_backpack_lrg", "to_abolt_back", myInstance, "acc_backpack_lrg_wht", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_antenna", "to_abolt_back", myInstance, "acc_antenna", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_sibtrooper2"); + body->ApplySkin(*monster, myInstance, "a", "a_sibtrooper2"); + + body->ApplySkin(*monster, myInstance, "hd", "hd_sibtroop"); + body->ApplySkin(*monster, myInstance, "f", "f_sibtroop"); +// body->SetFace(*monster,"f_sibtroop_");//eh? + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void sibtrooper1b_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_sibtrooper2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_sibtrooper2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("hd","hd_sibtroop",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_sibtroop",VARIETY_PRIORITY_HIGHEST); +} + +void sibtrooper1b_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_SNIPER); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_gas_mask", "to_abolt_head_t", myInstance, "acc_gas_mask", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_backpack_smll", "to_abolt_back", myInstance, "acc_backpack_smll_wht", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_blck", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_sibtrooper2"); + body->ApplySkin(*monster, myInstance, "a", "a_sibtrooper2"); + + body->ApplySkin(*monster, myInstance, "hd", "hd_sibtroop"); + body->ApplySkin(*monster, myInstance, "f", "f_sibtroop"); +// body->SetFace(*monster,"f_sibtroop_");//eh? + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void sibtrooper2_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_sibtrooper2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_sibtrooper2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("hd","hd_sibtroop",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_sibtroop2",VARIETY_PRIORITY_HIGHEST); +} + +void sibtrooper2_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetLeftHandWeapon(*monster, ATK_FLASHGREN); + body->SetRightHandWeapon(*monster, ATK_MACHINEPISTOL); + + body->AddBoltedItem(*monster, "abolt_hip_r", "Enemy/Bolt", "acc_backpack_low", "to_abolt_hip_r", myInstance, "acc_backpack_low_dgrey", MESO_OTHER_SCALE); + body->AddBoltedItem(*monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_blck", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_sibtrooper2"); + body->ApplySkin(*monster, myInstance, "a", "a_sibtrooper2"); + + body->ApplySkin(*monster, myInstance, "hd", "hd_sibtroop"); + body->ApplySkin(*monster, myInstance, "f", "f_sibtroop2"); +// body->SetFace(*monster,"f_sibtroop2_");//eh? + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void sibguard_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_sibguard1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_sibguard1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_16_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_16_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_10_s",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_w_10_",VARIETY_PRIORITY_LOW); +} + +void sibguard_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetLeftHandWeapon(*monster, ATK_FLASHGREN); + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); + + body->AddRandomBoltedItem(0.5, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_baseball", "to_abolt_head_t", myInstance, "acc_hat_baseball_sib", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.5, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_blk", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_sibguard1"); + body->ApplySkin(*monster, myInstance, "a", "a_sibguard1"); + + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_w_10_s")) + { + body->SetFace(*monster,"f_w_10_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_w_16_s"); + body->SetFace(*monster,"f_w_16_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void sibguard3_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_sibguard1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_sibguard1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_16_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_16_",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("h","h_w_10_s",VARIETY_PRIORITY_LOW); +// RegisterFaceSkins("f_w_10_",VARIETY_PRIORITY_LOW); + RegisterTalkFaceSkins("f_w_16_n",VARIETY_PRIORITY_HIGHEST); +} + +void sibguard3_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetLeftHandWeapon(*monster, ATK_FLASHGREN); + body->SetRightHandWeapon(*monster, ATK_MACHINEPISTOL); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_tall", "to_abolt_head_t", myInstance, "acc_hat_tall_gry", MESO_HAT_SCALE); + body->AddRandomBoltedItem(0.5, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_blk", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_sibguard1"); + body->ApplySkin(*monster, myInstance, "a", "a_sibguard1"); + +// if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_w_10_s")) +// { +// body->SetFace(*monster,"f_w_10_"); +// } +// else +// { + body->ApplySkin(*monster, myInstance, "h", "h_w_16_s"); + body->SetFace(*monster,"f_w_16_"); +// } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void sibguard4_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_sibguard4",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_sibguard4",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_21_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_w_21_",VARIETY_PRIORITY_HIGHEST); +} + +void sibguard4_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetLeftHandWeapon(*monster, ATK_FLASHGREN); + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_sibguard4"); + body->ApplySkin(*monster, myInstance, "a", "a_sibguard4"); + + body->ApplySkin(*monster, myInstance, "h", "h_w_21_s"); + body->SetFace(*monster,"f_w_21_"); + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void sibcleansuit_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_sibclean",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_sibclean",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("md","md_clean",VARIETY_PRIORITY_HIGHEST); +} + +void sibcleansuit_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL1); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_r", myInstance, "acc_box_hip_smll_blck", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + + //fixme: first one is real one, other two are secret dancer-guys +// switch(gi.irand(0,2)) +// { +// default: +// case 0: + body->ApplySkin(*monster, myInstance, "b", "b_sibclean"); + body->ApplySkin(*monster, myInstance, "a", "a_sibclean"); + body->ApplySkin(*monster, myInstance, "md", "md_clean"); +// break; +// case 1: +// body->ApplySkin(*monster, myInstance, "b", "b_sibclean2"); +// body->ApplySkin(*monster, myInstance, "a", "a_sibclean2"); +// body->ApplySkin(*monster, myInstance, "md", "md_clean2"); +// break; +// case 2: +// body->ApplySkin(*monster, myInstance, "b", "b_sibclean3"); +// body->ApplySkin(*monster, myInstance, "a", "a_sibclean3"); +// body->ApplySkin(*monster, myInstance, "md", "md_clean3"); +// break; +// } + + body->SetVoiceDirectories(*monster, "cln", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void sibmech_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_sibmechanic",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_sibmechanic",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_w_19_s",VARIETY_PRIORITY_HIGH); + RegisterFaceSkins("f_w_19_",VARIETY_PRIORITY_HIGH); + RegisterSkin("h","hb_h_2_b",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_hb_1_",VARIETY_PRIORITY_HIGHEST); +} + +void sibmech_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_hard", "to_abolt_head_t", myInstance, "acc_hat_hard_sib", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + + body->ApplySkin(*monster, myInstance, "b", "b_sibmechanic"); + body->ApplySkin(*monster, myInstance, "a", "a_sibmechanic"); + + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_w_19_s")) + { + myInstance->GetInstPtr()->SetPartOnOff("_beardhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_beardface", false); + body->SetFace(*monster,"f_w_19_"); + } + else + { + myInstance->GetInstPtr()->SetPartOnOff("_baldhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_comface", false); + body->ApplySkin(*monster, myInstance, "h", "hb_h_2_b"); + body->SetFace(*monster,"f_hb_1_"); + } + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void irqsoldier1_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqsoldier1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqsoldier1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_3_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_3_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_1_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_1_",VARIETY_PRIORITY_HIGHEST); +} + +void irqsoldier1_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_SNIPER); + body->SetLeftHandWeapon(*monster, ATK_GRENADE); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_beret", "to_abolt_head_t", myInstance, "acc_hat_beret_red",MESO_HAT_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_sun",MESO_GLASSES_SCALE); + body->AddRandomBoltedItem(0.25, *monster, "abolt_thigh_r", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_r", myInstance, "acc_pouch_thigh_green",MESO_POUCH_SCALE); + body->AddRandomBoltedItem(0.25, *monster, "abolt_thigh_l", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_l", myInstance, "acc_pouch_thigh_green",MESO_POUCH_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_irqsoldier1"); + body->ApplySkin(*monster, myInstance, "a", "a_irqsoldier1"); + + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_m_3_s")) + { + body->SetFace(*monster,"f_m_3_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_m_1_s"); + body->SetFace(*monster,"f_m_1_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void irqsoldier2_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqsoldier2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqsoldier2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_3_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_3_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_4_c",VARIETY_PRIORITY_HIGH); + RegisterFaceSkins("f_m_4_",VARIETY_PRIORITY_HIGH); +} + +void irqsoldier2_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_helmet", "to_abolt_head_t", myInstance, "acc_helmet_tan1",MESO_HAT_SCALE); + body->AddBoltedItem(*monster, "abolt_hip_r", "Enemy/Bolt", "acc_backpack_low", "to_abolt_hip_r", myInstance, "acc_backpack_low_tan", MESO_OTHER_SCALE); + + if (!body->AddRandomBoltedItem(0.1, *monster, "abolt_thigh_r", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_r", myInstance, "acc_pouch_thigh_tan",MESO_POUCH_SCALE)) + { + body->AddRandomBoltedItem(0.15, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_r", myInstance, "acc_box_hip_smll_brwn", MESO_OTHER_SCALE); + } + if (!body->AddRandomBoltedItem(0.1, *monster, "abolt_thigh_l", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_l", myInstance, "acc_pouch_thigh_tan",MESO_POUCH_SCALE)) + { + body->AddRandomBoltedItem(0.15, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_brwn", MESO_OTHER_SCALE); + } + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_irqsoldier2"); + body->ApplySkin(*monster, myInstance, "a", "a_irqsoldier2"); + + //use crew head here! + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_m_4_c")) + { + body->SetFace(*monster,"f_m_4_"); + } + //use bald head here! + else + { + body->ApplySkin(*monster, myInstance, "h", "h_m_3_s"); + body->SetFace(*monster,"f_m_3_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void irqsoldier2b_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqsoldier2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqsoldier2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_3_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_3_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_4_c",VARIETY_PRIORITY_HIGH); + RegisterFaceSkins("f_m_4_",VARIETY_PRIORITY_HIGH); +} + +void irqsoldier2b_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_MACHINEGUN); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_helmet", "to_abolt_head_t", myInstance, "acc_helmet_tan1",MESO_HAT_SCALE); + body->AddBoltedItem(*monster, "abolt_hip_r", "Enemy/Bolt", "acc_backpack_low", "to_abolt_hip_r", myInstance, "acc_backpack_low_tan", MESO_OTHER_SCALE); + + if (!body->AddRandomBoltedItem(0.1, *monster, "abolt_thigh_r", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_r", myInstance, "acc_pouch_thigh_tan",MESO_POUCH_SCALE)) + { + body->AddRandomBoltedItem(0.15, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_r", myInstance, "acc_box_hip_smll_brwn", MESO_OTHER_SCALE); + } + if (!body->AddRandomBoltedItem(0.1, *monster, "abolt_thigh_l", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_l", myInstance, "acc_pouch_thigh_tan",MESO_POUCH_SCALE)) + { + body->AddRandomBoltedItem(0.15, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_brwn", MESO_OTHER_SCALE); + } + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_irqsoldier2"); + body->ApplySkin(*monster, myInstance, "a", "a_irqsoldier2"); + + //use crew head here! + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_m_4_c")) + { + body->SetFace(*monster,"f_m_4_"); + } + //use bald head here! + else + { + body->ApplySkin(*monster, myInstance, "h", "h_m_3_s"); + body->SetFace(*monster,"f_m_3_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void irqrepgd_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqrepguard",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqrepguard",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_5_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_5_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_1_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_1_",VARIETY_PRIORITY_HIGHEST); +} + + +void irqrepgd_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); + body->SetLeftHandWeapon(*monster, ATK_GRENADE); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_helmet", "to_abolt_head_t", myInstance, "acc_helmet_green1",MESO_HAT_SCALE); + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_backpack_smll", "to_abolt_back", myInstance, "acc_backpack_smll_green", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.15, *monster, "abolt_thigh_r", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_r", myInstance, "acc_pouch_thigh_dark1",MESO_POUCH_SCALE); + body->AddRandomBoltedItem(0.15, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_hip_lrg", "to_abolt_hip_r", myInstance, "acc_box_hip_lrg_green", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.15, *monster, "abolt_thigh_l", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_l", myInstance, "acc_pouch_thigh_dark1",MESO_POUCH_SCALE); + body->AddRandomBoltedItem(0.15, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_lrg", "to_abolt_hip_l", myInstance, "acc_box_hip_lrg_green", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_irqrepguard"); + body->ApplySkin(*monster, myInstance, "a", "a_irqrepguard"); + + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_m_5_s")) + { + body->SetFace(*monster,"f_m_5_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_m_1_s"); + body->SetFace(*monster,"f_m_1_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void irqrepgdb_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqrepguard",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqrepguard",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_5_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_5_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_1_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_1_",VARIETY_PRIORITY_HIGHEST); +} + + +void irqrepgdb_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_MACHINEGUN); + body->SetLeftHandWeapon(*monster, ATK_GASGREN); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_helmet", "to_abolt_head_t", myInstance, "acc_helmet_green1",MESO_HAT_SCALE); + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_backpack_smll", "to_abolt_back", myInstance, "acc_backpack_smll_green", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.15, *monster, "abolt_thigh_r", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_r", myInstance, "acc_pouch_thigh_dark1",MESO_POUCH_SCALE); + body->AddRandomBoltedItem(0.15, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_hip_lrg", "to_abolt_hip_r", myInstance, "acc_box_hip_lrg_green", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.15, *monster, "abolt_thigh_l", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_l", myInstance, "acc_pouch_thigh_dark1",MESO_POUCH_SCALE); + body->AddRandomBoltedItem(0.15, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_lrg", "to_abolt_hip_l", myInstance, "acc_box_hip_lrg_green", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_irqrepguard"); + body->ApplySkin(*monster, myInstance, "a", "a_irqrepguard"); + + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_m_5_s")) + { + body->SetFace(*monster,"f_m_5_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_m_1_s"); + body->SetFace(*monster,"f_m_1_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void irqpolice_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqpolice",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqpolice",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_5_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_5_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_4_c",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_m_4_",VARIETY_PRIORITY_LOW); +} + +void irqpolice_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL2); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_helmet", "to_abolt_head_t", myInstance, "acc_helmet_wht1",MESO_HAT_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_sun",MESO_GLASSES_SCALE); + body->AddRandomBoltedItem(0.15, *monster, "abolt_thigh_r", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_r", myInstance, "acc_pouch_thigh_tan",MESO_POUCH_SCALE); + body->AddRandomBoltedItem(0.15, *monster, "abolt_thigh_l", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_l", myInstance, "acc_pouch_thigh_tan",MESO_POUCH_SCALE); + + if (!body->AddRandomBoltedItem(0.1, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_brwn", MESO_OTHER_SCALE)) + { + body->AddRandomBoltedItem(0.15, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_r", myInstance, "acc_box_hip_smll_blck", MESO_OTHER_SCALE); + } + body->AddRandomBoltedItem(0.15, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip_smll", "to_abolt_hip_l", myInstance, "acc_box_hip_smll_blck", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_irqpolice"); + body->ApplySkin(*monster, myInstance, "a", "a_irqpolice"); + + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_m_4_c")) + { + body->SetFace(*monster,"f_m_4_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_m_5_s"); + body->SetFace(*monster,"f_m_5_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void irqcommander_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqcommander",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqcommander",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_5_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_5_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","hb_h_2_b",VARIETY_PRIORITY_HIGH); + RegisterFaceSkins("f_hb_1_",VARIETY_PRIORITY_HIGH); +} + +void irqcommander_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL2); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_beret", "to_abolt_head_t", myInstance, "acc_hat_beret_grn", MESO_HAT_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_blck", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_irqcommander"); + body->ApplySkin(*monster, myInstance, "a", "a_irqcommander"); + + if (gi.irand(0,1) && body->ApplySkin(*monster, myInstance, "h", "hb_h_2_b")) + { + body->SetFace(*monster,"f_hb_1_"); + myInstance->GetInstPtr()->SetPartOnOff("_baldhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_comface", false); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_m_5_s"); + body->SetFace(*monster,"f_m_5_"); + myInstance->GetInstPtr()->SetPartOnOff("_beardhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_beardface", false); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void irqbrutea_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqbrute",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqbrute",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_5_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_5_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_3_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_3_",VARIETY_PRIORITY_HIGHEST); +} + +void irqbrutea_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); + body->SetLeftHandWeapon(*monster, ATK_GRENADE); + + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_backpack_lrg", "to_abolt_back", myInstance, "acc_backpack_lrg_tan", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_brwn", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.15, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_blk", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_irqbrute"); + body->ApplySkin(*monster, myInstance, "a", "a_irqbrute"); + + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_m_5_s")) + { + body->SetFace(*monster,"f_m_5_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_m_3_s"); + body->SetFace(*monster,"f_m_3_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_TOUGH); +} + +void irqbruteb_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqbrute",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqbrute",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_5_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_5_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_3_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_3_",VARIETY_PRIORITY_HIGHEST); +} + +void irqbruteb_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_FLAMEGUN); + + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_tanks", "to_abolt_back", myInstance, "acc_tanks_irq", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_sun",MESO_GLASSES_SCALE); + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_brwn", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.15, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_blk", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_irqbrute"); + body->ApplySkin(*monster, myInstance, "a", "a_irqbrute"); + + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_m_5_s")) + { + body->SetFace(*monster,"f_m_5_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_m_3_s"); + body->SetFace(*monster,"f_m_3_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_SOMEWHAT_TOUGH); +} + +void irqbodyguard_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_irqbodyguard",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqbodyguard",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_1_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_1_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_4_c",VARIETY_PRIORITY_LOWEST); + RegisterFaceSkins("f_m_4_",VARIETY_PRIORITY_LOWEST); +} + +void irqbodyguard_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_SNIPER); + body->SetLeftHandWeapon(*monster, ATK_GRENADE); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_beret", "to_abolt_head_t", myInstance, "acc_hat_beret_blck",MESO_HAT_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_hip_r", "Enemy/Bolt", "acc_holster", "to_abolt_hip_r", myInstance, "acc_holster_blck", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.15, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_blk", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_irqbodyguard"); + body->ApplySkin(*monster, myInstance, "a", "a_irqbodyguard"); + + if (rand()%2 && body->ApplySkin(*monster, myInstance, "h", "h_m_4_c")) + { + body->SetFace(*monster,"f_m_4_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_m_1_s"); + body->SetFace(*monster,"f_m_1_"); + } + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_CHEST); +} + +void irqrocket_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_irqrocket",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqrocket",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_irqrocket",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_irqrocket",VARIETY_PRIORITY_HIGHEST); +} + +void irqrocket_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + +// GetMySkills()->setSkills(128, 192, 0, 0, .2, 0, 0, 0, 128); + + body->SetRightHandWeapon(*monster, ATK_ROCKET); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_faceplate", "to_abolt_head_t", myInstance, "acc_faceplate_irq", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_back", "Enemy/Bolt", "acc_backpack_smll", "to_abolt_back", myInstance, "acc_backpack_smll_tan", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_irqrocket"); + body->ApplySkin(*monster, myInstance, "a", "a_irqrocket"); + body->ApplySkin(*monster, myInstance, "f", "f_irqrocket"); + body->ApplySkin(*monster, myInstance, "h", "h_irqrocket"); + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_FULL); + // if this changes, update fx_surfaces.cpp also. + /* + for (int i = 1; i <= 3; i++) + { + gi.soundindex(va("enemy/rocket/foot%d.wav", i)); + } + */ +} + +void irqsaddam_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqsaddam",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqsaddam",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_saddam",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_saddam_",VARIETY_PRIORITY_HIGHEST); + RegisterTalkFaceSkins("f_saddam_n",VARIETY_PRIORITY_HIGHEST); +} + +void irqsaddam_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + +// body->SetRightHandWeapon(*monster, ATK_PISTOL2); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_beret", "to_abolt_head_t", myInstance, "acc_hat_beret_blck",MESO_HAT_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_irqsaddam"); + body->ApplySkin(*monster, myInstance, "a", "a_irqsaddam"); + body->ApplySkin(*monster, myInstance, "h", "h_saddam"); + body->SetFace(*monster,"f_saddam_"); + + body->SetVoiceDirectories(*monster, "so", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void irqworker_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqworker",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqworker",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_2_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_2_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_1_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_1_",VARIETY_PRIORITY_HIGHEST); +} + +void irqworker_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + bool newface=false; + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_norm",MESO_GLASSES_SCALE); + + if (!body->AddRandomBoltedItem(0.1, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_turbin", "to_abolt_head_t", myInstance, "acc_hat_turbin_wht",MESO_HAT_SCALE)) + { + body->AddRandomBoltedItem(0.85, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_hard", "to_abolt_head_t", myInstance, "acc_hat_hard_wht",MESO_HAT_SCALE); + } + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_irqworker"); + body->ApplySkin(*monster, myInstance, "a", "a_irqworker"); + + if ((rand()%2) && body->ApplySkin(*monster, myInstance, "h", "h_m_2_s")) + { + body->SetFace(*monster,"f_m_2_"); + newface = true; + } + if (!newface) + { + body->ApplySkin(*monster, myInstance, "h", "h_m_1_s"); + body->SetFace(*monster,"f_m_1_"); + } + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void irqman2_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_irqman2a",VARIETY_PRIORITY_LOW); + RegisterSkin("a","a_irqman2a",VARIETY_PRIORITY_LOW); + RegisterSkin("b","b_irqman2b",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_irqman2b",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_1_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_1_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_m_2_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_m_2_",VARIETY_PRIORITY_HIGHEST); +// RegisterSkin("h","hb_h_2_b",VARIETY_PRIORITY_LOWEST); +// RegisterFaceSkins("f_hb_1_",VARIETY_PRIORITY_LOWEST); +} + +void irqman2_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + +// body->AddRandomBoltedItem(0.5, *monster, "wbolt_hand_l", "Enemy/Bolt", "w_sack", "to_wbolt_hand_l", myInstance, "rubbish", MESO_WEAPON_SCALE); + + if (!body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_turbin", "to_abolt_head_t", myInstance, "acc_hat_turbin_wht",MESO_HAT_SCALE)) + { + if (!body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_top", "to_abolt_head_t", myInstance, "acc_hat_top",MESO_HAT_SCALE)) + { + body->AddRandomBoltedItem(0.33333, *monster, "abolt_head_t", "Enemy/Bolt", "acc_hat_top", "to_abolt_head_t", myInstance, "acc_hat_top_wht",MESO_HAT_SCALE); + } + } + + body->AddRandomBoltedItem(0.15, *monster, "abolt_thigh_r", "Enemy/Bolt", "acc_machette", "to_abolt_thigh_r", myInstance, "acc_machette",MESO_POUCH_SCALE); + + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "b", "b_irqman2a")) + { + body->ApplySkin(*monster, myInstance, "a", "a_irqman2a"); + } + else + { + body->ApplySkin(*monster, myInstance, "b", "b_irqman2b"); + body->ApplySkin(*monster, myInstance, "a", "a_irqman2b"); + } + +// if(!gi.irand(0,2)&&body->ApplySkin(*monster, myInstance, "h", "hb_h_2_b")) +// { +// myInstance->GetInstPtr()->SetPartOnOff("_baldhead", false); +// myInstance->GetInstPtr()->SetPartOnOff("_comface", false); +// body->SetFace(*monster,"f_hb_1_"); +// } +// else +// { + if(gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_m_2_s")) + { + myInstance->GetInstPtr()->SetPartOnOff("_beardhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_beardface", false); + body->SetFace(*monster,"f_m_2_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_m_1_s"); + myInstance->GetInstPtr()->SetPartOnOff("_beardhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_beardface", false); + body->SetFace(*monster,"f_m_1_"); + } +// } + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void tokhench1_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_tokhench1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_tokhench1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_j_5_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_j_5_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_j_2_s",VARIETY_PRIORITY_LOWEST); + RegisterFaceSkins("f_j_2_",VARIETY_PRIORITY_LOWEST); + RegisterSkin("h","h_j_6_s",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_j_6_",VARIETY_PRIORITY_LOW); +} + +void tokhench1_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_PISTOL1); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_sun",MESO_GLASSES_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_tokhench1"); + body->ApplySkin(*monster, myInstance, "a", "a_tokhench1"); + + if(!gi.irand(0,2)&&body->ApplySkin(*monster, myInstance, "h", "h_j_2_s")) + { + myInstance->GetInstPtr()->SetPartOnOff("_crewhead", false); + if (gi.irand(0,1)) + { + myInstance->GetInstPtr()->SetPartOnOff("_ponytail", false); + } + body->SetFace(*monster,"f_j_2_"); + } + else + { + if(gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_j_6_s")) + { + myInstance->GetInstPtr()->SetPartOnOff("_crewhead", false); + if (gi.irand(0,1)) + { + myInstance->GetInstPtr()->SetPartOnOff("_ponytail", false); + } + body->SetFace(*monster,"f_j_6_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_j_5_c"); + myInstance->GetInstPtr()->SetPartOnOff("_baldhead", false); + body->SetFace(*monster,"f_j_5_"); + } + } + + body->SetVoiceDirectories(*monster, "ya", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void tokhench2_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_tokhench2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_tokhench2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_j_3_s",VARIETY_PRIORITY_HIGH); + RegisterFaceSkins("f_j_3_",VARIETY_PRIORITY_HIGH); + RegisterSkin("h","h_j_4_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_j_4_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_j_6_s",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_j_6_",VARIETY_PRIORITY_LOW); +} + +void tokhench2_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_sun",MESO_GLASSES_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_tokhench2"); + body->ApplySkin(*monster, myInstance, "a", "a_tokhench2"); + + if(gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_j_6_s")) + { + myInstance->GetInstPtr()->SetPartOnOff("_crewhead", false); + body->SetFace(*monster,"f_j_6_"); + } + else + { + if(!gi.irand(0,2)&&body->ApplySkin(*monster, myInstance, "h", "h_j_3_s")) + { + myInstance->GetInstPtr()->SetPartOnOff("_baldhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_ponytail", false); + body->SetFace(*monster,"f_j_3_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_j_4_s"); + myInstance->GetInstPtr()->SetPartOnOff("_crewhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_ponytail", false); + body->SetFace(*monster,"f_j_4_"); + } + } + + body->SetVoiceDirectories(*monster, "ya", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void tokkiller_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_tokkiller",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_tokkiller",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_j_5_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_j_5_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_j_2_s",VARIETY_PRIORITY_LOWEST); + RegisterFaceSkins("f_j_2_",VARIETY_PRIORITY_LOWEST); +} + +void tokkiller_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_MICROWAVE_ALT); + + body->ApplySkin(*monster, myInstance, "b", "b_tokkiller"); + body->ApplySkin(*monster, myInstance, "a", "a_tokkiller"); + + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_j_2_s")) + { + myInstance->GetInstPtr()->SetPartOnOff("_crewhead", false); + body->SetFace(*monster,"f_j_2_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_j_5_c"); + myInstance->GetInstPtr()->SetPartOnOff("_baldhead", false); + body->SetFace(*monster,"f_j_5_"); + } + + body->SetVoiceDirectories(*monster, "ya", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_CHEST); +} + +void tokninja_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_tokninja",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_tokninja",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_ninja",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_ninja",VARIETY_PRIORITY_HIGHEST); +} + +void tokninja_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + +// body->SetLeftHandWeapon(*monster, ATK_FLASHGREN); + body->SetLeftHandWeapon(*monster, ATK_THROWSTAR); + body->SetRightHandWeapon(*monster, ATK_MACHINEPISTOL); + + body->AddBoltedItem(*monster, "abolt_back", "Enemy/Bolt", "acc_sword", "to_abolt_back", myInstance, "acc_sword", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_tokninja"); + body->ApplySkin(*monster, myInstance, "a", "a_tokninja"); + + body->ApplySkin(*monster, myInstance, "h", "h_ninja"); + body->ApplySkin(*monster, myInstance, "f", "f_ninja"); + + body->SetVoiceDirectories(*monster, "ni", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void tokbrute_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_tokbrute",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_tokbrute",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_j_3_s",VARIETY_PRIORITY_HIGH); + RegisterFaceSkins("f_j_3_",VARIETY_PRIORITY_HIGH); + RegisterSkin("h","h_j_4_s",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_j_4_",VARIETY_PRIORITY_HIGHEST); +} + +void tokbrute_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ASSAULTRIFLE); + + body->ApplySkin(*monster, myInstance, "b", "b_tokbrute"); + body->ApplySkin(*monster, myInstance, "a", "a_tokbrute"); + + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_j_3_s")) + { + body->SetFace(*monster,"f_j_3_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_j_4_s"); + body->SetFace(*monster,"f_j_4_"); + } + + body->SetVoiceDirectories(*monster, "ya", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_TOUGH); +} + +void tokmalehostage_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_tokman1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_tokman1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_j_1_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_j_1_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_j_2_s",VARIETY_PRIORITY_LOWEST); + RegisterFaceSkins("f_j_2_",VARIETY_PRIORITY_LOWEST); +} + +void tokmalehostage_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_norm",MESO_GLASSES_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_tokman1"); + body->ApplySkin(*monster, myInstance, "a", "a_tokman1"); + + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_j_2_s")) + { + myInstance->GetInstPtr()->SetPartOnOff("_crewhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_lbang", false); + myInstance->GetInstPtr()->SetPartOnOff("_rbang", false); + body->SetFace(*monster,"f_j_2_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_j_1_c"); + myInstance->GetInstPtr()->SetPartOnOff("_baldhead", false); + if (gi.irand(0,1)) + { + myInstance->GetInstPtr()->SetPartOnOff("_lbang", false); + } + if (gi.irand(0,1)) + { + myInstance->GetInstPtr()->SetPartOnOff("_rbang", false); + } + body->SetFace(*monster,"f_j_1_"); + } + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void japansuit_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_tokmhostage",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_tokmhostage",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_j_5_c",VARIETY_PRIORITY_HIGHEST); + RegisterFaceSkins("f_j_5_",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_j_6_s",VARIETY_PRIORITY_LOW); + RegisterFaceSkins("f_j_6_",VARIETY_PRIORITY_LOW); +} + +void japansuit_ai::Init(edict_t *monster, char *ghoulname, char* subclass) +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_glasses", "to_abolt_head_t", myInstance, "acc_glasses_norm",MESO_GLASSES_SCALE); + + body->ApplySkin(*monster, myInstance, "b", "b_tokmhostage"); + body->ApplySkin(*monster, myInstance, "a", "a_tokmhostage"); + + if (gi.irand(0,1)&&body->ApplySkin(*monster, myInstance, "h", "h_j_6_s")) + { + myInstance->GetInstPtr()->SetPartOnOff("_crewhead", false); + myInstance->GetInstPtr()->SetPartOnOff("_lbang", false); + body->SetFace(*monster,"f_j_6_"); + } + else + { + body->ApplySkin(*monster, myInstance, "h", "h_j_5_c"); + myInstance->GetInstPtr()->SetPartOnOff("_baldhead", false); + if (gi.irand(0,1)) + { + myInstance->GetInstPtr()->SetPartOnOff("_lbang", false); + } + body->SetFace(*monster,"f_j_5_"); + } + + body->SetVoiceDirectories(*monster, "npc", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void raider1_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_dcraider1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_dcraider1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_raider1",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_raider2",VARIETY_PRIORITY_HIGHEST); +} + +void raider1_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + if ( !(monster->spawnflags & SPAWNFLAG_NO_WEAPONS) ) + { + body->SetRightHandWeapon(*monster, ATK_MACHINEGUN); + } + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_goggles", "to_abolt_head_t", myInstance, "acc_goggles", MESO_OTHER_SCALE); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_back", "Enemy/Bolt", "acc_backpack_smll", "to_abolt_back", myInstance, "acc_backpack_smll_dgrey", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.3333, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_blk", MESO_OTHER_SCALE); + body->AddRandomBoltedItem(0.3333, *monster, "abolt_thigh_l", "Enemy/Bolt", "acc_pouch_thigh", "to_abolt_thigh_l", myInstance, "acc_pouch_thigh_blck",MESO_POUCH_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_dcraider1"); + body->ApplySkin(*monster, myInstance, "a", "a_dcraider1"); + + body->ApplySkin(*monster, myInstance, "h", "h_raider1"); + body->ApplySkin(*monster, myInstance, "f", "f_raider2"); + + body->SetVoiceDirectories(*monster, "ra", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); +} + +void raider2_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_dcraider2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_dcraider2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_raider2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_raider2",VARIETY_PRIORITY_HIGHEST); +} + +void raider2_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_MACHINEPISTOL); + body->SetLeftHandWeapon(*monster, ATK_GRENADE); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_nightvision2", "to_abolt_head_t", myInstance, "acc_nightvision", MESO_OTHER_SCALE); + if (!body->AddRandomBoltedItem(0.25, *monster, "abolt_back", "Enemy/Bolt", "acc_backpack_smll", "to_abolt_back", myInstance, "acc_backpack_smll_dgrey", MESO_OTHER_SCALE)) + { + if (body->AddRandomBoltedItem(0.3333, *monster, "abolt_back", "Enemy/Bolt", "acc_backpack_lrg", "to_abolt_back", myInstance, "acc_backpack_lrg_blk", MESO_OTHER_SCALE)) + { + body->AddRandomBoltedItem(0.5, *monster, "abolt_back", "Enemy/Bolt", "acc_antenna", "to_abolt_back", myInstance, "acc_antenna", MESO_OTHER_SCALE); + } + } + body->AddRandomBoltedItem(0.3333, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_blk", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_dcraider2"); + body->ApplySkin(*monster, myInstance, "a", "a_dcraider2"); + + body->ApplySkin(*monster, myInstance, "h", "h_raider2"); + body->ApplySkin(*monster, myInstance, "f", "f_raider2"); + + body->SetVoiceDirectories(*monster, "ra", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_CHESTLIMBS); +} + +void raider2b_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_dcraider2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_dcraider2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_raider2",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_raider2",VARIETY_PRIORITY_HIGHEST); +} + +void raider2b_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_AUTOSHOTGUN); + + body->AddRandomBoltedItem(0.25, *monster, "abolt_head_t", "Enemy/Bolt", "acc_nightvision2", "to_abolt_head_t", myInstance, "acc_acc_nightvision", MESO_OTHER_SCALE); + + if (!body->AddRandomBoltedItem(0.25, *monster, "abolt_back", "Enemy/Bolt", "acc_backpack_smll", "to_abolt_back", myInstance, "acc_backpack_smll_dgrey", MESO_OTHER_SCALE)) + { + if (body->AddRandomBoltedItem(0.3333, *monster, "abolt_back", "Enemy/Bolt", "acc_backpack_lrg", "to_abolt_back", myInstance, "acc_backpack_lrg_blk", MESO_OTHER_SCALE)) + { + body->AddRandomBoltedItem(0.5, *monster, "abolt_back", "Enemy/Bolt", "acc_antenna", "to_abolt_back", myInstance, "acc_antenna", MESO_OTHER_SCALE); + } + } + body->AddRandomBoltedItem(0.3333, *monster, "abolt_hip_l", "Enemy/Bolt", "acc_box_hip", "to_abolt_hip_l", myInstance, "acc_box_hip_blk", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_dcraider2"); + body->ApplySkin(*monster, myInstance, "a", "a_dcraider2"); + + body->ApplySkin(*monster, myInstance, "h", "h_raider2"); + body->ApplySkin(*monster, myInstance, "f", "f_raider2"); + + body->SetVoiceDirectories(*monster, "ra", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_CHESTLIMBS); +} + +void raiderbrute_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("b","b_dcbrute",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_dcbrute",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_raider4",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_raider4",VARIETY_PRIORITY_HIGHEST); +} + +void raiderbrute_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_MICROWAVE_ALT); + body->SetLeftHandWeapon(*monster, ATK_GRENADE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_dcbrute"); + body->ApplySkin(*monster, myInstance, "a", "a_dcbrute"); + + body->ApplySkin(*monster, myInstance, "h", "h_raider4"); + body->ApplySkin(*monster, myInstance, "f", "f_raider4"); + + body->SetVoiceDirectories(*monster, "ra", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_TOUGH); +} + +void raiderrocket_ai::RegisterSkins(void) +{ + RegisterGoreSkins(); + RegisterSkin("gz","gz_armor",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("b","b_casrocket",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("a","a_casrocket",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("h","h_raider3",VARIETY_PRIORITY_HIGHEST); + RegisterSkin("f","f_raider3",VARIETY_PRIORITY_HIGHEST); +} + +void raiderrocket_ai::Init(edict_t *monster, char *ghoulname, char* subclass)//i'm torn on whether all this stuff should go here or no +{ + ggOinstC* myInstance; + + generic_meso_ai::Init(monster, ghoulname, subclass); + + if (!body) + { + return; + } + + myInstance = MyGhoulObj->FindOInst(monster->ghoulInst); + + body->SetRightHandWeapon(*monster, ATK_ROCKET); + + body->AddBoltedItem(*monster, "abolt_head_t", "Enemy/Bolt", "acc_faceplate2", "to_abolt_head_t", myInstance, "acc_faceplate2", MESO_OTHER_SCALE); + + body->ApplySkin(*monster, myInstance, "c", "c_black"); + body->ApplySkin(*monster, myInstance, "b", "b_casrocket"); + body->ApplySkin(*monster, myInstance, "a", "a_casrocket"); + + body->ApplySkin(*monster, myInstance, "h", "h_raider3"); + body->ApplySkin(*monster, myInstance, "f", "f_raider3"); + + body->SetVoiceDirectories(*monster, "ra", 1, DEATHVOICE_DEFAULT); + body->SetRootBolt(*monster); + + body->SetArmor(*monster, ARMOR_FULL); + // if this changes, update fx_surfaces.cpp also. + /* + for (int i = 1; i <= 3; i++) + { + gi.soundindex(va("enemy/rocket/foot%d.wav", i)); + } + */ +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void SP_m_x_mmerc(edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_HAWK, self, "enemy/meso", "hawk"); + self->think = generic_grunt_init; + + gi.soundindex("impact/Hawk/LookOut.adp");//Hawk gets pissed when you shoot at him +} + +void SP_m_x_mhurtmerc(edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_HURTHAWK, self, "enemy/meso", "hawk"); + self->think = generic_grunt_init; +} + +void SP_m_x_msam(edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SAM, self, "enemy/meso", "sam"); + self->think = generic_grunt_init; +} + +void SP_m_x_mcharacter(edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_JOHN, self, "enemy/meso", "john"); + self->think = generic_grunt_init; +} + +void SP_m_x_mcharacter_snow(edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_JOHN_SNOW, self, "enemy/meso", "johnsnow"); + self->think = generic_grunt_init; +} + +void SP_m_x_mcharacter_desert(edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_JOHN_DESERT, self, "enemy/meso", "johndesert"); + self->think = generic_grunt_init; +} + +void SP_m_x_mskinboss (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SKINHEADBOSS, self, "enemy/meso", "skinboss"); + self->think = generic_leader_init; +} + +void SP_m_x_mraiderboss1 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_RAIDERBOSS, self, "enemy/meso", "dekker1"); + self->think = generic_leader_init; +} + +void SP_m_x_mraiderboss2 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_RAIDERBOSS2, self, "enemy/meso", "dekker2"); + self->think = dekker_init; +} + +void SP_m_x_miraqboss(edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_AMU, self, "enemy/meso", "amu"); + self->think = generic_leader_init; +} + +///////////////////////////////////////////////////////////////////////////////////////////// + +void SP_m_nyc_mskinhead1 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SKINHEAD1, self, "enemy/meso", "skinhead1"); + self->think = generic_grunt_init; +} + +void SP_m_nyc_mskinhead2a (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SKINHEAD2A, self, "enemy/meso", "skinhead2"); + self->think = generic_grunt_init; +} + +void SP_m_nyc_mskinhead2b (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SKINHEAD2B, self, "enemy/meso", "skinhead2b"); + self->think = generic_grunt_init; +} + +void SP_m_nyc_mswat (edict_t *self) +{ + // check the "i'm only here for my armor" flag now, cuz it does some different stuff straightaway + if (self->spawnflags & SPAWNFLAG_ARMOR_PICKUP) + { + generic_armor_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_NYCSWATGUY, self, "enemy/meso", "nyswatguy"); + self->think = generic_armor_init; + } + else + { + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_NYCSWATGUY, self, "enemy/meso", "nyswatguy"); + self->think = generic_grunt_init; + } +} + +void SP_m_nyc_mswatleader (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_NYCSWATLEADER, self, "enemy/meso", "nyswatlead"); + self->think = generic_grunt_init; +} + +void SP_m_nyc_mpolitician (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_MALEPOLITICIAN, self, "enemy/meso", "politician"); + self->think = generic_npc_init; +} + +void SP_m_nyc_mpunk (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_NYCPUNK, self, "enemy/meso", "nypunk"); + self->think = generic_grunt_init; +} + +///////////////////////////////////////////////////////////////////////////////////////////// + +void SP_m_afr_msoldier1a (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_UGNSOLDIER1, self, "enemy/meso", "ugsoldier1"); + self->think = generic_grunt_init; +} + +void SP_m_afr_msoldier1b (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_UGNSOLDIER1B, self, "enemy/meso", "ugsoldier1b"); + self->think = generic_grunt_init; +} + +void SP_m_afr_msoldier2 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_UGNSOLDIER2, self, "enemy/meso", "ugsoldier2"); + self->think = generic_grunt_init; +} + +void SP_m_afr_msoldier3 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_UGNSOLDIER3, self, "enemy/meso", "ugsoldier3"); + self->think = generic_grunt_init; +} + +void SP_m_afr_msniper (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_UGNSNIPER, self, "enemy/meso", "ugsniper"); + self->think = generic_leader_init; +} + +void SP_m_afr_mbrute (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_UGNBRUTE, self, "enemy/meso", "butch"); + self->think = generic_leader_init; +} + +void SP_m_afr_mrocket (edict_t *self) +{ + generic_monster_spawnnow(self); + self->flags |= FL_NO_KNOCKBACK; + self->ai = ai_c::Create(AI_MESO_UGNROCKET, self, "enemy/meso", "ugrocket"); + self->think = generic_leader_init; +} + +///////////////////////////////////////////////////////////////////////////////////////////// + +void SP_m_kos_mgrunt1 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SERBGRUNT1, self, "enemy/meso", "serbgrunt"); + self->think = generic_grunt_init; +} + +void SP_m_kos_mgrunt2 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SERBGRUNT2, self, "enemy/meso", "serbgrunt2"); + self->think = generic_grunt_init; +} + +void SP_m_kos_mgrunt3 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SERBGRUNT3, self, "enemy/meso", "serbgrunt3"); + self->think = generic_grunt_init; +} + +void SP_m_kos_msniper1a (edict_t *self) +{ + // check the "i'm only here for my armor" flag now, cuz it does some different stuff straightaway + if (self->spawnflags & SPAWNFLAG_ARMOR_PICKUP) + { + generic_armor_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SERBSNIPER1A, self, "enemy/meso", "serbsniper"); + self->think = generic_armor_init; + } + else + { + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SERBSNIPER1A, self, "enemy/meso", "serbsniper"); + self->think = generic_grunt_init; + } +} + +void SP_m_kos_msniper1b (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SERBSNIPER1B, self, "enemy/meso", "serbsniper"); + self->think = generic_grunt_init; +} + +void SP_m_kos_mcomtroop (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SERBCOMTROOP, self, "enemy/meso", "serbcomtroop"); + self->think = generic_grunt_init; +} + +void SP_m_kos_mbrute1a (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SERBBRUTE1A, self, "enemy/meso", "serbbrute"); + self->think = generic_grunt_init; +} + +void SP_m_kos_mbrute1b (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SERBBRUTE1B, self, "enemy/meso", "serbbrute"); + self->think = generic_grunt_init; +} + +void SP_m_kos_mmechanic (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SERBMECHANIC, self, "enemy/meso", "serbmechanic"); + self->think = generic_npc_init; +} + +void SP_m_kos_mrebel (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_KOSREBEL, self, "enemy/meso", "kosrebel"); + self->think = generic_grunt_init; +} + +void SP_m_kos_mklaleader (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_KOSKLAGUY, self, "enemy/meso", "kosklaguy"); + self->think = generic_grunt_init; +} + +///////////////////////////////////////////////////////////////////////////////////////////// + +void SP_m_sib_mtrooper1a (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SIBTROOPER1A, self, "enemy/meso", "sibtroop1a"); + self->think = generic_grunt_init; +} + +void SP_m_sib_mtrooper1b (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SIBTROOPER1B, self, "enemy/meso", "sibtroop1b"); + self->think = generic_grunt_init; +} + +void SP_m_sib_mtrooper2 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SIBTROOPER2, self, "enemy/meso", "sibtroop2"); + self->think = generic_grunt_init; +} + +void SP_m_sib_mguard1 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SIBGUARD, self, "enemy/meso", "sibguard"); + self->think = generic_grunt_init; +} + +void SP_m_sib_mguard3 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SIBGUARD3, self, "enemy/meso", "sibguard3"); + self->think = generic_grunt_init; +} + +void SP_m_sib_mguard4 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SIBGUARD4, self, "enemy/meso", "sibguard4"); + self->think = generic_grunt_init; +} + +void SP_m_sib_mcleansuit (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SIBCLEANSUIT, self, "enemy/meso", "sibclean"); + self->think = generic_grunt_init; +} + +void SP_m_sib_mmechanic (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_SIBMECH, self, "enemy/meso", "sibmech"); + self->think = generic_grunt_init; +} + +///////////////////////////////////////////////////////////////////////////////////////////// + +void SP_m_irq_msoldier1 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_IRAQSOLDIER1, self, "enemy/meso", "irqsoldier1"); + self->think = generic_grunt_init; +} + +void SP_m_irq_msoldier2a (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_IRAQSOLDIER2, self, "enemy/meso", "irqsoldier2"); + self->think = generic_grunt_init; +} + +void SP_m_irq_msoldier2b (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_IRAQSOLDIER2B, self, "enemy/meso", "irqsoldier2b"); + self->think = generic_grunt_init; +} + +void SP_m_irq_mrepguard1a (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_IRAQREPGUARD, self, "enemy/meso", "irqrepgd"); + self->think = generic_grunt_init; +} + +void SP_m_irq_mrepguard1b (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_IRAQREPGUARDB, self, "enemy/meso", "irqrepgdb"); + self->think = generic_grunt_init; +} + +void SP_m_irq_mpolice (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_IRAQPOLICE, self, "enemy/meso", "irqpolice"); + self->think = generic_leader_init; +} + +void SP_m_irq_mcommander (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_IRAQCOMMANDER, self, "enemy/meso", "irqcommand"); + self->think = generic_leader_init; +} + +void SP_m_irq_mbrute1a (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_IRAQBRUTEA, self, "enemy/meso", "irqbrute"); + self->think = generic_leader_init; +} + +void SP_m_irq_mbrute1b (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_IRAQBRUTEB, self, "enemy/meso", "irqbruteb"); + self->think = generic_leader_init; +} + +void SP_m_irq_mbodyguard (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_IRAQBODYGUARD, self, "enemy/meso", "irqbguard"); + self->think = generic_leader_init; +} + +void SP_m_irq_mrocket (edict_t *self) +{ + generic_monster_spawnnow(self); + self->flags |= FL_NO_KNOCKBACK; + self->ai = ai_c::Create(AI_MESO_IRAQROCKET, self, "enemy/meso", "irqrocket"); + self->think = generic_leader_init; +} + +void SP_m_irq_msaddam (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_IRAQSADDAM, self, "enemy/meso", "saddam"); + self->think = generic_leader_init; +} + +void SP_m_irq_moilworker (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_IRAQWORKER, self, "enemy/meso", "irqworker"); + self->think = generic_npc_init; +} + +void SP_m_irq_mman2 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_IRAQMAN2, self, "enemy/meso", "irqman2"); + self->think = generic_leader_init; +} + +///////////////////////////////////////////////////////////////////////////////////////////// + +void SP_m_tok_mhench1 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_TOKHENCH1, self, "enemy/meso", "tokhench1"); + self->think = generic_grunt_init; +} + +void SP_m_tok_mhench2 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_TOKHENCH2, self, "enemy/meso", "tokhench2"); + self->think = generic_grunt_init; +} + +void SP_m_tok_mkiller (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_TOKKILLER, self, "enemy/meso", "tokkiller"); + self->think = generic_grunt_init; +} + +void SP_m_tok_mninja (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_TOKNINJA, self, "enemy/meso", "tokninja"); + self->think = generic_grunt_init; +} + +void SP_m_tok_mbrute (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_TOKBRUTE, self, "enemy/meso", "tokbrute"); + self->think = generic_grunt_init; +} + +void SP_m_tok_mman1 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_JAPANSUIT, self, "enemy/meso", "japansuit"); + self->think = generic_npc_init; +} + +void SP_m_tok_mman2 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_TOKMALEHOSTAGE, self, "enemy/meso", "tokhostage"); + self->think = generic_npc_init; +} + +///////////////////////////////////////////////////////////////////////////////////////////// + +void SP_m_cas_mraider1 (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_RAIDER1, self, "enemy/meso", "dcraider1"); + self->think = generic_grunt_init; +} + +void SP_m_cas_mraider2a (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_RAIDER2A, self, "enemy/meso", "dcraider2"); + self->think = generic_grunt_init; +} + +void SP_m_cas_mraider2b (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_RAIDER2B, self, "enemy/meso", "dcraider2b"); + self->think = generic_grunt_init; +} + +void SP_m_cas_mbrute (edict_t *self) +{ + generic_monster_spawnnow(self); + self->ai = ai_c::Create(AI_MESO_RAIDERBRUTE, self, "enemy/meso", "dcraiderbrute"); + self->think = generic_grunt_init; +} + +void SP_m_cas_mrocket (edict_t *self) +{ + generic_monster_spawnnow(self); + self->flags |= FL_NO_KNOCKBACK; + self->ai = ai_c::Create(AI_MESO_RAIDERROCKET, self, "enemy/meso", "dcraiderrocket"); + self->think = generic_grunt_init; +} + +///////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Source/Game/gamecpp/m_meso.h b/Source/Game/gamecpp/m_meso.h new file mode 100644 index 0000000..7e326ae --- /dev/null +++ b/Source/Game/gamecpp/m_meso.h @@ -0,0 +1,647 @@ + +class john_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_JOHN;}//this should be different for everybody in this class family +}; + +class john_snow_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_JOHN_SNOW;}//this should be different for everybody in this class family +}; + +class john_desert_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_JOHN_DESERT;}//this should be different for everybody in this class family +}; + +class hawk_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_HAWK;}//this should be different for everybody in this class family +}; + +class hurthawk_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_HURTHAWK;}//this should be different for everybody in this class family +}; + +class sam_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SAM;}//this should be different for everybody in this class family +}; + +class skinheadboss_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return TEAM_SKINHEADS;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SKINHEADBOSS;}//this should be different for everybody in this class family +}; + +class amu_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_AMU;}//this should be different for everybody in this class family +}; + +class raiderboss_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void AddBody(edict_t *monster); + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_RAIDERBOSS;}//this should be different for everybody in this class family +}; + +class raiderboss2_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Think(edict_t &monster); + virtual void AddBody(edict_t *monster); + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_RAIDERBOSS2;}//this should be different for everybody in this class family +}; + +class nypunk_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return TEAM_SKINHEADS;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_NYCPUNK;}//this should be different for everybody in this class family +}; + +class nyswatguy_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetTeam(edict_t &monster){return 0;} + virtual int GetClassCode(void){return AI_MESO_NYCSWATGUY;}//this should be different for everybody in this class family +}; + +class nyswatleader_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetTeam(edict_t &monster){return 0;} + virtual int GetClassCode(void){return AI_MESO_NYCSWATLEADER;}//this should be different for everybody in this class family +}; + +class malepolitician_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetTeam(edict_t &monster){return 0;} + virtual int GetClassCode(void){return AI_MESO_MALEPOLITICIAN;}//this should be different for everybody in this class family +}; + +class skinhead1_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return TEAM_SKINHEADS;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SKINHEAD1;}//this should be different for everybody in this class family +}; + +class skinhead2a_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return TEAM_SKINHEADS;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SKINHEAD2A;}//this should be different for everybody in this class family +}; + +class skinhead2b_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return TEAM_SKINHEADS;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SKINHEAD2B;}//this should be different for everybody in this class family +}; + +class ugsoldier1_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_UGNSOLDIER1;}//this should be different for everybody in this class family +}; + +class ugsoldier1b_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_UGNSOLDIER1B;}//this should be different for everybody in this class family +}; + +class ugsoldier2_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_UGNSOLDIER2;}//this should be different for everybody in this class family +}; + +class ugsoldier3_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_UGNSOLDIER3;}//this should be different for everybody in this class family +}; + +class ugsniper_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_UGNSNIPER;}//this should be different for everybody in this class family +}; + +class ugbrute_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_UGNBRUTE;}//this should be different for everybody in this class family +}; + +class ugrocket_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_UGNROCKET;}//this should be different for everybody in this class family +}; + +class irqsoldier1_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_IRAQSOLDIER1;}//this should be different for everybody in this class family +}; + +class irqsoldier2_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_IRAQSOLDIER2;}//this should be different for everybody in this class family +}; + +class irqsoldier2b_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_IRAQSOLDIER2B;}//this should be different for everybody in this class family +}; + +class irqrepgd_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_IRAQREPGUARD;}//this should be different for everybody in this class family +}; + +class irqrepgdb_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_IRAQREPGUARDB;}//this should be different for everybody in this class family +}; + +class irqpolice_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_IRAQPOLICE;}//this should be different for everybody in this class family +}; + +class irqbodyguard_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_IRAQBODYGUARD;}//this should be different for everybody in this class family +}; + +class irqcommander_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_IRAQCOMMANDER;}//this should be different for everybody in this class family +}; + +class irqbrutea_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_IRAQBRUTEA;}//this should be different for everybody in this class family +}; + +class irqbruteb_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_IRAQBRUTEB;}//this should be different for everybody in this class family +}; + +class irqrocket_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_IRAQROCKET;}//this should be different for everybody in this class family +}; + +class irqsaddam_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_IRAQSADDAM;}//this should be different for everybody in this class family +}; + +class irqworker_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int IsInnocent() { return 1; } + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_IRAQWORKER;}//this should be different for everybody in this class family +}; + +class irqman2_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int IsInnocent() { return 1; } + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_IRAQMAN2;}//this should be different for everybody in this class family +}; + +class raider1_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_RAIDER1;}//this should be different for everybody in this class family +}; + +class raider2_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_RAIDER2A;}//this should be different for everybody in this class family +}; + +class raider2b_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_RAIDER2B;}//this should be different for everybody in this class family +}; + +class raiderbrute_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_RAIDERBRUTE;}//this should be different for everybody in this class family +}; + +class raiderrocket_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_RAIDERROCKET;}//this should be different for everybody in this class family +}; + +class sibtrooper1a_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SIBTROOPER1A;}//this should be different for everybody in this class family +}; + +class sibtrooper1b_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SIBTROOPER1B;}//this should be different for everybody in this class family +}; + +class sibtrooper2_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SIBTROOPER2;}//this should be different for everybody in this class family +}; + +class sibguard_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SIBGUARD;}//this should be different for everybody in this class family +}; + +class sibguard3_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SIBGUARD3;}//this should be different for everybody in this class family +}; + +class sibguard4_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SIBGUARD4;}//this should be different for everybody in this class family +}; + +class sibcleansuit_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SIBCLEANSUIT;}//this should be different for everybody in this class family +}; + +class sibmech_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int IsInnocent() { return 1; } + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SIBMECH;}//this should be different for everybody in this class family +}; + +class serbgrunt1_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SERBGRUNT1;}//this should be different for everybody in this class family +}; + +class serbgrunt2_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SERBGRUNT2;}//this should be different for everybody in this class family +}; + +class serbgrunt3_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SERBGRUNT3;}//this should be different for everybody in this class family +}; + +class serbsniper1a_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SERBSNIPER1A;}//this should be different for everybody in this class family +}; + +class serbsniper1b_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SERBSNIPER1B;}//this should be different for everybody in this class family +}; + +class serbcomtroop_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SERBCOMTROOP;}//this should be different for everybody in this class family +}; + +class serbbrute1a_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SERBBRUTE1A;}//this should be different for everybody in this class family +}; + +class serbbrute1b_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SERBBRUTE1B;}//this should be different for everybody in this class family +}; + +class serbmechanic_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int IsInnocent() { return 1; } + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_SERBMECHANIC;}//this should be different for everybody in this class family +}; + +class kosrebel_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_KOSREBEL;}//this should be different for everybody in this class family +}; + +class kosklaguy_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_KOSKLAGUY;}//this should be different for everybody in this class family +}; + +class tokmalehostage_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetTeam(edict_t &monster){return 0;} + virtual int GetClassCode(void){return AI_MESO_TOKMALEHOSTAGE;}//this should be different for everybody in this class family +}; + +class tokhench1_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_TOKHENCH1;}//this should be different for everybody in this class family +}; + +class tokhench2_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_TOKHENCH2;}//this should be different for everybody in this class family +}; + +class tokkiller_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_TOKKILLER;}//this should be different for everybody in this class family +}; + +class tokninja_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_TOKNINJA;}//this should be different for everybody in this class family +}; + +class tokbrute_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_TOKBRUTE;}//this should be different for everybody in this class family +}; + +class japansuit_ai : public generic_meso_ai +{ +protected: + virtual void RegisterSkins(void); +public: + virtual int GetTeam(edict_t &monster){return 0;} + virtual void Init(edict_t *monster, char *ghoulname, char* subclass); + virtual int GetClassCode(void){return AI_MESO_JAPANSUIT;}//this should be different for everybody in this class family +}; + diff --git a/Source/Game/gamecpp/m_snowcatactions.cpp b/Source/Game/gamecpp/m_snowcatactions.cpp new file mode 100644 index 0000000..6b4d4e6 --- /dev/null +++ b/Source/Game/gamecpp/m_snowcatactions.cpp @@ -0,0 +1,172 @@ +// m_snowcatactions.cpp + +#include "g_local.h" +#include "ai_private.h" +#include "m_snowcatai.h" + +//#include // for OutputDebugString() only, do not leave in! + + +/********************************************************************************** + **********************************************************************************/ +snowcat_action::snowcat_action(decision_c *od, action_c *oa, ai_c* which_ai, + mmove_t *newanim, int nCommand, vec3_t vPos, + edict_t* target, float fArg, int nID) +:action_c(od, oa, newanim, vPos, vPos, NULL, 999999, true) +{ + generic_ghoul_snowcat_ai* ai = (generic_ghoul_snowcat_ai*)(ai_public_c*)which_ai; + body_snowcat* body = NULL; + + if (ai) + { + body = ai->GetSnowcatBody(); + } + if (!body) + { + return; + } + m_nCommand = nCommand; + action_target = target; + m_think = NULL; + m_nextthink = NULL; + + // save our id (uniquely determined by the ai) + m_nID = nID; + // save our script params + m_fArg = fArg; + VectorCopy(vPos, dest); + action_target = target; + + // set our body params + body->m_target = target; + VectorCopy(vPos, body->m_vPos); + body->m_fArg = fArg; + + switch(m_nCommand) + { + case generic_ghoul_snowcat_ai::tse_GOTOCOORDS: + { + m_think = SnowcatW_GotoCoords; + break; + } + case generic_ghoul_snowcat_ai::tse_FIRECANNONATCOORDS: + { + m_think = SnowcatW_FireCannonAtCoords; + break; + } + case generic_ghoul_snowcat_ai::tse_MACHGUNAUTO: + { + m_think = SnowcatW_MachGunAuto; + break; + } + default: + break; + } +} + +qboolean snowcat_action::Think(ai_c &which_ai, edict_t &monster) +{ + float fHealthPercentage = 1.0f; + generic_ghoul_snowcat_ai* ai = (generic_ghoul_snowcat_ai*)(ai_public_c*)&which_ai; + body_snowcat* body = NULL; + + if (ai) + { + body = ai->GetSnowcatBody(); + } + if (!body) + { + return false; + } + qboolean bRet = true; + if (m_think) + { + // set our script params in the body's member variables + body->m_fArg = m_fArg; + VectorCopy(dest, body->m_vPos); + body->m_target = action_target; + + // this past think may have updated our next think + if (m_nextthink && m_nextthink != m_think) + { + m_think = m_nextthink; + m_nextthink = NULL; + } + + m_think(&monster); + bRet = ai->GetRetVal(); + fHealthPercentage = (float)monster.health/(float)monster.max_health; + body->UpdateSmoke(&monster, fHealthPercentage); + + } + + return bRet; +} + + +// overriding this fn is a quick way of keeping action_c from screwing with +//our snowcat's sequence +qboolean snowcat_action::SetAnimation(ai_c &which_ai, edict_t &monster) +{ + //just bein safe + if (!which_ai.GetBody()) + { + gi.dprintf("snowcat_action::SetAnimation--ai has no body!\n"); + return false; + } + return true; +} + +// overriding this fn is a quick way of keeping action_c from screwing with +//our snowcat's sequence +qboolean snowcat_action::ForceAnimation(ai_c &which_ai, edict_t &monster) +{ + //just bein safe + if (!which_ai.GetBody()) + { + gi.dprintf("snowcat_action::ForceAnimation--ai has no body!\n"); + return false; + } + return true; +} + +snowcat_action::snowcat_action(snowcat_action *orig) +: action_c(orig) +{ + m_nID = orig->m_nID; + m_nCommand = orig->m_nCommand; + m_fArg = orig->m_fArg; + + *(int *)&m_think = GetThinkNum(orig->m_think); + *(int *)&m_nextthink = GetThinkNum(orig->m_nextthink); +} + +void snowcat_action::Evaluate(snowcat_action *orig) +{ + m_nID = orig->m_nID; + m_nCommand = orig->m_nCommand; + m_fArg = orig->m_fArg; + + m_think = (void (*)(edict_t *self))GetThinkPtr((int)orig->m_think); + m_nextthink = (void (*)(edict_t *self))GetThinkPtr((int)orig->m_nextthink); + + action_c::Evaluate(orig); +} + +void snowcat_action::Read() +{ + char loaded[sizeof(snowcat_action)]; + + gi.ReadFromSavegame('AITK', loaded, sizeof(snowcat_action)); + Evaluate((snowcat_action *)loaded); +} + +void snowcat_action::Write() +{ + snowcat_action *savable; + + savable = new snowcat_action(this); + gi.AppendToSavegame('AITK', savable, sizeof(*this)); + delete savable; +} + diff --git a/Source/Game/gamecpp/m_snowcatactions.h b/Source/Game/gamecpp/m_snowcatactions.h new file mode 100644 index 0000000..db9fbe5 --- /dev/null +++ b/Source/Game/gamecpp/m_snowcatactions.h @@ -0,0 +1,39 @@ +/********************************************************************************** + **********************************************************************************/ + +class snowcat_action : public action_c +{ +private: +protected: + int m_nID; + int m_nCommand; + float m_fArg; + + void (*m_think)(edict_t *self); + void (*m_nextthink)(edict_t *self); + + virtual qboolean SetAnimation(ai_c &which_ai, edict_t &monster); + virtual qboolean ForceAnimation(ai_c &which_ai, edict_t &monster); + +public: + + snowcat_action(decision_c *od, action_c *oa, ai_c* which_ai, mmove_t *newanim, int nCommand, vec3_t vPos, edict_t* target, + float fArg, int nID); + snowcat_action(void):action_c(){ m_nID = -1;} + virtual ~snowcat_action(void) {} + + virtual int GetClassCode(void){return SNOWCAT_ACTION;}//this should be different for everybody in this class family + + virtual actiontype_e Type(void){return atype_walk;} + virtual qboolean Think(ai_c &which_ai, edict_t &monster); + virtual void SetThink(void (*think)(edict_t *self)) { m_think = think; } + virtual void SetNextThink(void (*think)(edict_t *self)) { m_nextthink = think; } + + snowcat_action(snowcat_action *orig); + void Evaluate(snowcat_action *orig); + virtual void Write(void); + virtual void Read(void); + + virtual int GetID() { return m_nID; } +}; + diff --git a/Source/Game/gamecpp/m_snowcatai.cpp b/Source/Game/gamecpp/m_snowcatai.cpp new file mode 100644 index 0000000..8cc7870 --- /dev/null +++ b/Source/Game/gamecpp/m_snowcatai.cpp @@ -0,0 +1,1027 @@ +// m_snowcatai.cpp + +#include "g_local.h" +#include "ai_private.h" +#include "m_generic.h" +#include "m_snowcatai.h" +#include "g_obj.h" // for OrientBolton() and modelSpawnData stuff +#include "callback.h" +#include "..\qcommon\ef_flags.h" + +#define SNOWCAT_INACTIVE (1<<0) + +typedef enum +{ + SNOWCATOBJ_SNOWCAT = 0, + SNOWCATOBJ_TURRET, + SNOWCATOBJ_GUN, + SNOWCATOBJ_MAXOBJS +}; + +modelSpawnData_t snowcatModelData[MD_SNOWCAT_SIZE] = +{ +// dir file surfaceType material health solid material file cnt scale +"enemy/snowcat", "body", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // SNOWCATOBJ_SNOWCAT +"enemy/snowcat", "turret", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // SNOWCATOBJ_TURRET +"enemy/snowcat", "gun", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // SNOWCATOBJ_GUN +}; + +modelSpawnData_t headlight = +{ +"objects/generic/beam", "beam", SURF_NONE, MAT_NONE, 0, SOLID_NOT, NULL, 0, 0.0, NULL, // SNOWCATOBJ_HEADLIGHTBEAM +}; + +SnowcatTreadCallback theSnowcatTreadCallback; + +bool SnowcatTreadCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + edict_t* self = (edict_t*)ent; + generic_ghoul_snowcat_ai* ai = (generic_ghoul_snowcat_ai*)(ai_public_c*)self->ai; + body_snowcat* body = NULL; + + if (ai) + { + body = ai->GetSnowcatBody(); + } + if (!body) + { + return false; + } + if (body->GetTreadFire()) + { + // we're at the end of a firing sequence for the snowcat body, so switch + //back to the appropriate non-firing tread sequence (slightly complicated + //by the rotating texture coords for the treads) + body->SetTreadFire(false); + if (body->GetTreads()) + { + SimpleModelSetSequence2(body->GetTankInst(), "snowcat", SMSEQ_LOOP); + } + else + { + SimpleModelSetSequence2(body->GetTankInst(), "snowcat", SMSEQ_HOLDFRAME); + } + } + return true; +} + +void debug_drawbox(edict_t* self,vec3_t vOrigin, vec3_t vMins, vec3_t vMaxs, int nColor); + +int GetGhoulPosDir2(vec3_t sourcePos, vec3_t sourceAng, IGhoulInst *inst, + GhoulID partID, char *name, vec3_t pos, vec3_t dir, vec3_t right, + vec3_t up); + +generic_ghoul_snowcat_ai::~generic_ghoul_snowcat_ai() +{ +} + +void generic_ghoul_snowcat_ai::Think(edict_t &monster) +{ + //debug_drawbox(&monster, NULL, NULL, NULL, 0); + if (ai_freeze->value) + { + return; + } + +// gi.dprintf("tank health = %3.2f percent\n", (float)monster.health/(float)monster.max_health); + if (GetSnowcatBody() && GetSnowcatBody()->IsDeactivated()) + { + // deactivate + monster.nextthink = 0; + GetSnowcatBody()->SetTreads(false); + return; + } + + // if our machine gun has been set to auto attack... + if (m_bMachGunAuto) + { + Snowcat_MachGunAuto(&monster); + } + monster.nextthink = level.time + FRAMETIME; + EvaluateSenses(monster); + + if (!current_action) + { // do some thinking - this is not correct + if (actions.size()) + { + NextAction(monster); + } + } + + if (current_action) + { + m_LastThinkingActionID = ((snowcat_action*)(action_c*)current_action)->GetID(); + if (current_action->Think(*this, monster)) + { + NextAction(monster); + if (GetSnowcatBody()) + { + GetSnowcatBody()->ResetScriptParams(); + } + } + } + gi.linkentity(&monster); + + if (monster.linkcount != linkcount) + { + linkcount = monster.linkcount; + gmonster.CheckGround (&monster); + } + gmonster.CatagorizePosition (&monster); + gmonster.WorldEffects (&monster);//leaving this in for drowning, lava damage, etc., but it should prolly be handled in ai class somewhere + + //if monster is dead, consider removing it + if (m_bTimeToDie) + { + //get ai to poll actions, decisions, & senses to check if removal is ok + if (SafeToRemove(monster)) + { + Die(monster, m_attacker, m_attacker, monster.max_health, vec3_origin); + G_FreeEdict (&monster); + } + } +// AimMainGun(ent->s.origin); +// AimMachGun(ent->s.origin); +} + +void generic_ghoul_snowcat_ai::Init(edict_t *self, char *ghoulname, char* subclass) +{ + m_ScriptActionCounter = m_LastThinkingActionID = 0; + m_bTimeToDie = false; + m_attacker = NULL; + m_bMachGunAuto = false; + m_bCheckMachGunLOS = true; + m_bRetVal = false; + // build the snowcat here + + // snowcat (root object) + ggObjC *cSnowcat = NULL; + // turret, cannon, machine gun + ggObjC *cTurret = NULL, + *cCannon = NULL, + *cNull = NULL, + *cMachGun = NULL; + // anims for fuselage and boltons + GhoulID cTurretSeq=0, + cSnowcatSeq=0, + cCannonSeq=0, + cNullSeq=0, + cMachGunSeq=0; + // bolt located on the fuselage (aka "bolter") + GhoulID cBolterBolt=0; + // bolt located on the bolted-on item (aka "boltee") + GhoulID cBolteeBolt=0; + ggOinstC *t=NULL; + ggBinstC *cBolteeBolted=NULL, *bInstTurret = NULL, *bInstMachGunBase = NULL; + IGhoulInst *pInst=NULL; + Matrix4 mat,mat1,mat2; + GhoulID tempNote=0, tempMaterial = 0; + char materialName[100] = ""; + IGhoulObj *boltObj = NULL; + + ent->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID; + + if (!GetSnowcatBody()) + { + return; + } + // create the snowcat body + + // gotta remove this flag or SimpleModelInit2 bombs out + ent->s.renderfx &= ~RF_GHOUL; + SimpleModelInit2(ent,&snowcatModelData[SNOWCATOBJ_SNOWCAT],NULL,NULL); + if (ent->ghoulInst) + { + ent->movetype = MOVETYPE_PUSH; + GetSnowcatBody()->SetTankEdict(ent); + SimpleModelSetSequence2(GetSnowcatBody()->GetTankInst(), "snowcat", SMSEQ_HOLD); + } + + // bolt on the turret + if ( cBolteeBolted = SimpleModelAddBolt(ent, snowcatModelData[SNOWCATOBJ_SNOWCAT], "DUMMY03", + snowcatModelData[SNOWCATOBJ_TURRET], "DUMMY03", NULL) ) + { + bInstTurret = cBolteeBolted; + pInst = cBolteeBolted->GetInstPtr(); + GetSnowcatBody()->SetTurretInst(cBolteeBolted); + + if (pInst && (boltObj = pInst->GetGhoulObject()) ) + { + GetSnowcatBody()->SetTurretBolt(boltObj->FindPart("DUMMY03")); + // register a callback for the snowcat tread sequence + tempNote=pInst->GetGhoulObject()->FindNoteToken("EOS"); + if (tempNote) + { + pInst->AddNoteCallBack(&theSnowcatTreadCallback,tempNote); + } + } + } + + // bolt mach gun #1 onto the turret + if (cBolteeBolted = ComplexModelAddBolt(bInstTurret, snowcatModelData[SNOWCATOBJ_TURRET], + "DUMMY01", snowcatModelData[SNOWCATOBJ_GUN], "DUMMY01", NULL)) + { + pInst = cBolteeBolted->GetInstPtr(); + GetSnowcatBody()->SetMachGunInst(cBolteeBolted); + } + if (pInst && pInst->GetGhoulObject()) + { + GetSnowcatBody()->SetMachGunBolt(pInst->GetGhoulObject()->FindPart("dummy01")); + } + + // bolt the cannon onto the turret + if (cBolteeBolted = ComplexModelAddBolt(bInstTurret, snowcatModelData[SNOWCATOBJ_TURRET], + "DUMMY02", snowcatModelData[SNOWCATOBJ_GUN], "DUMMY01", NULL)) + { + pInst = cBolteeBolted->GetInstPtr(); + GetSnowcatBody()->SetMachGun2Inst(cBolteeBolted); + } + if (pInst && pInst->GetGhoulObject()) + { + GetSnowcatBody()->SetMachGun2Bolt(pInst->GetGhoulObject()->FindPart("dummy01")); + } + + // when we deactivate the 'cat we'll turn off the headlights and taillights, but we _do_ want + //them bolted on + + // light beams + if ( cBolteeBolted = SimpleModelAddBolt(ent,snowcatModelData[SNOWCATOBJ_SNOWCAT],"headlight_left", + headlight,"to_headlight",NULL) ) + { + GetSnowcatBody()->SetLeftHeadLightInst(cBolteeBolted); + pInst = cBolteeBolted->GetInstPtr(); + if (pInst && (boltObj = pInst->GetGhoulObject()) ) + { + GetSnowcatBody()->SetLeftHeadLightBolt(boltObj->FindPart("to_headlight")); + } + } + if ( cBolteeBolted = SimpleModelAddBolt(ent,snowcatModelData[SNOWCATOBJ_SNOWCAT],"headlight_right", + headlight,"to_headlight",NULL) ) + { + GetSnowcatBody()->SetRightHeadLightInst(cBolteeBolted); + pInst = cBolteeBolted->GetInstPtr(); + if (pInst && (boltObj = pInst->GetGhoulObject()) ) + { + GetSnowcatBody()->SetRightHeadLightBolt(boltObj->FindPart("to_headlight")); + } + } + /* + // headlights + SimpleModelAddObject(ent, "front_left"); + SimpleModelAddObject(ent, "front_right"); + // taillights + SimpleModelAddObject(ent, "rear_left"); + SimpleModelAddObject(ent, "rear_right"); + // exhaust effects + if (ent->ghoulInst && (boltObj = ent->ghoulInst->GetGhoulObject()) ) + { + // left + if (cBolterBolt = boltObj->FindPart("exhuast_left")) // love Joe's spelling of exhaust + { + fxRunner.execContinualEffect("environ/kf_exhaust01", ent, cBolterBolt, 0); + } + // right + if (cBolterBolt = boltObj->FindPart("exhuast_right")) // love Joe's spelling of exhaust + { + fxRunner.execContinualEffect("environ/kf_exhaust01", ent, cBolterBolt, 0); + } + } + */ +} + +void generic_ghoul_snowcat_ai::Activate(edict_t &monster) +{ + isActive=true; +} + +void generic_ghoul_snowcat_ai::AddBody(edict_t *monster) +{ + if (!monster) + { + return; + } + if (!body) + { + body = new body_snowcat(monster); + } +} + +int generic_ghoul_snowcat_ai::AimMainGun(vec3_t vTarget) +{ + return AimMachGun(vTarget); +} + +bool generic_ghoul_snowcat_ai::AimMachGun(vec3_t vTarget) +{ + body_snowcat* body = GetSnowcatBody(); + IGhoulInst *gunInst = body->GetMachGunInst(), + *turretInst = body->GetTurretInst(); + GhoulID gunBolt = body->GetMachGunBolt(), + turretBolt = NULL; + boltonOrientation_c boltonInfo; + edict_t* self = NULL; + boltonOrientation_c::retCode_e ret1, ret2; + + if (!body || + !body->GetTankInst() || + !(self = body->GetTankEdict()) || + (game.playerSkills.getEnemyValue() == 0)) + { + return false; + } + if (!turretInst || !turretInst->GetGhoulObject()) + { + return false; + } + // turn the turret to face the player (only pivots horizontally) + if (!gunInst || !gunBolt || !(turretBolt = turretInst->GetGhoulObject()->FindPart("dummy03")) ) + { + return false; + } + boltonInfo.root = self; + boltonInfo.boltonInst = turretInst; + boltonInfo.boltonID = turretBolt; + boltonInfo.parentInst = self->ghoulInst; + VectorCopy(vTarget, boltonInfo.vTarget); + boltonInfo.vTarget[2] += 20; + boltonInfo.fMinPitch = 0; + boltonInfo.fMaxPitch = 0; + boltonInfo.fMinYaw = -4000; + boltonInfo.fMaxYaw = 4000; + boltonInfo.fMaxTurnSpeed = body->GetTurretSpeed(); + boltonInfo.bUsePitch = false; + boltonInfo.bUseYaw = true; + boltonInfo.bToRoot = true; + ret1 = boltonInfo.OrientBolton(); + // determine min pitch based on turret facing + if (boltonInfo.fRetYaw > -0.5 && boltonInfo.fRetYaw < 0.5) + { + boltonInfo.fMinPitch = -0.30; + } + else if (boltonInfo.fRetYaw > 1.0 && boltonInfo.fRetYaw < 1.65) + { + boltonInfo.fMinPitch = -0.2; + } + else if (boltonInfo.fRetYaw < -1.0 && boltonInfo.fRetYaw > -1.65) + { + boltonInfo.fMinPitch = -0.2; + } + else if (boltonInfo.fRetYaw < -2.72 || boltonInfo.fRetYaw > 2.72) + { + boltonInfo.fMinPitch = -0.10; + } + else + { + boltonInfo.fMinPitch = -0.1; + } + + // turn the first mach gun itself (only pivots vertically) + boltonInfo.boltonInst = gunInst; + boltonInfo.boltonID = gunBolt; + boltonInfo.parentInst = turretInst; + boltonInfo.parentID = turretBolt; +// boltonInfo.fMinPitch = -M_PI*0.035; + boltonInfo.fMaxPitch = M_PI*0.25; + boltonInfo.fMinYaw = 0; + boltonInfo.fMaxYaw = 0; + boltonInfo.fMaxTurnSpeed = body->GetTurretSpeed(); + boltonInfo.bUsePitch = true; + boltonInfo.bUseYaw = false; + boltonInfo.bToRoot = true; + ret2 = boltonInfo.OrientBolton(); + // turn the second mach gun itself (only pivots vertically) + gunInst = body->GetMachGun2Inst(); + gunBolt = body->GetMachGun2Bolt(); + boltonInfo.boltonInst = gunInst; + boltonInfo.boltonID = gunBolt; + boltonInfo.parentInst = turretInst; + boltonInfo.parentID = turretBolt; +// boltonInfo.fMinPitch = -M_PI*0.035; + boltonInfo.fMaxPitch = M_PI*0.25; + boltonInfo.fMinYaw = 0; + boltonInfo.fMaxYaw = 0; + boltonInfo.fMaxTurnSpeed = body->GetTurretSpeed(); + boltonInfo.bUsePitch = true; + boltonInfo.bUseYaw = false; + boltonInfo.bToRoot = true; + ret2 = boltonInfo.OrientBolton(); + return ( (boltonOrientation_c::retCode_e::ret_TRUE == ret1) && (ret2 == ret1) ); +} +/* +action_c *generic_ghoul_snowcat_ai::TankAction(decision_c *od, action_c *oa, ai_c* ai, mmove_t *newanim, + int nCommand, vec3_t vPos, edict_t* target, float fArg) +{ + // uniquely identify each action generated by the script so we can poll it later in + //TankDoneEvent::Process() to find out when it's done + m_ScriptActionCounter++; + return new snowcat_action(od, oa, ai, newanim, nCommand, vPos, target, fArg, m_ScriptActionCounter); +} +*/ +int generic_ghoul_snowcat_ai::GetCurrentActionID() +{ + if (current_action) + { + return ((snowcat_action*)(action_c*)current_action)->GetID(); + } + else + { + return 0; + } +} + +int generic_ghoul_snowcat_ai::GetMostRecentlyAddedActionID() +{ + return m_ScriptActionCounter; +} + +qboolean generic_ghoul_snowcat_ai::Damage (edict_t &monster, edict_t *inflictor, + edict_t *attacker, vec3_t dir, vec3_t point, + vec3_t origin, int damage, int knockback, + int dflags, int mod, float penetrate, float absorb) +{ + // fixme: centralize skill level stuff + int take; + + VectorNormalize(dir); + + take = damage; + + if (attacker && attacker->client && attacker->client->inv) + { + // knives can't hurt tanks, silly. + if (SFW_KNIFE == attacker->client->inv->getCurWeaponType()) + { + // make some pretty sparks, though + vec3_t vNormal; // fake this + VectorSubtract(attacker->s.origin, monster.s.origin, vNormal); + fxRunner.exec("environ/wallspark", point); + gi.sound (&monster, CHAN_VOICE, gi.soundindex(va("impact/surfs/metal%d.wav",gi.irand(1,3))), .6, ATTN_NORM, 0); + return true; + } + } + if (body && take) + { + if(dflags&(DT_PROJECTILE|DT_EXPLODE)) + { + take=damage=body->ShowDamage(monster, inflictor, attacker, dir, point, origin, damage, knockback, dflags, mod, penetrate, absorb); + } + } + +// do the damage + if (take) + { + monster.health = monster.health - take; + + if (monster.health <= 0) + { + m_attacker = attacker; + monster.flags |= FL_NO_KNOCKBACK; + monster.takedamage = DAMAGE_NO; + if (monster.deadflag != DEAD_DEAD) + { + generic_ghoul_tank_ai::Die(monster, inflictor, attacker, damage, point); + } + monster.nextthink = level.time + FRAMETIME; // should break heli out of PAUSE command if in one, but only private heli pause, not script main pause (unless that breaks out when you get shot anyway) + return true; + } + + if(dflags&(DT_PROJECTILE|DT_EXPLODE)) + { + Pain (monster, attacker, knockback, take); + } + + return true; + } + + return false;//no hit! +} + +void generic_ghoul_snowcat_ai::Pain(edict_t &monster, edict_t *other, float kick, int damage) +{ + float fHealthPercentage = (float)monster.health/(float)monster.max_health; + + if (GetSnowcatBody()) + { + GetSnowcatBody()->UpdateSmoke(&monster, fHealthPercentage); + } +} + +void generic_ghoul_snowcat_ai::Die(edict_t &monster, edict_t *inflictor, edict_t *attacker, + int damage, vec3_t point) +{ + vec3_t forward,to_dam; + if (monster.health < -999) + { + monster.health = -999; + } + + if (monster.killtarget) + { + edict_t *t = NULL; + while ((t = G_Find (t, FOFS(targetname), ent->killtarget))) + { + t->use(t, &monster, &monster); + } + } + + monster.enemy = attacker;//for awarding credit? + // CHECKME possible issues: + // If monster is killed by barrel, should we chain to find who was the barrel's killer? + // what about being clever and using architecture to kill monsters (like 16 ton weights) + + if (monster.deadflag != DEAD_DEAD) + { + vec3_t facedir; + list::iterator ia; + list::iterator is; + list::iterator id; + + +/* if (attacker && game.GameStats->CanBuy(attacker)) + { + //changed this to be conditional so it wouldn't crash --ss + if(CMonsterStats *MonsterStats = game.GameStats->GetMonsterStats(&monster)) + { + GetPlayerStats(attacker)->AdjustCashToBeAwarded(MonsterStats->GetKilledValue()); + } + else + { + gi.dprintf("Error: no stats for monster!\n"); + } + // this stuff gets put into bank account at "end" of mission + }*/ + +//fixme: do need the npc check, but do it a good way +// if (!(monster.monsterinfo.aiflags & AI_GOOD_GUY)) +// { + level.killed_monsters++; +/* if (coop->value && attacker && attacker->client) + { + attacker->client->resp.score++; + }*/ +// } + + // huh? should have list-eating separated out? + + for (is=senses.begin();is != senses.end();is++) + { + (*is).Destroy(); + } + for (ia=actions.begin();ia!=actions.end();ia++) + { + (*ia).Destroy(); + } + for (id=decisions.begin();id!=decisions.end();id++) + { + (*id).Destroy(); + } + + //now ditch nodes + + while (senses.size()) + { + senses.pop_front(); + } + + while (actions.size()) + { + actions.pop_front(); + } + while (decisions.size()) + { + decisions.pop_front(); + } + + if (current_action) + { + current_action.Destroy(); + } + + if (recycle_action) + { + recycle_action.Destroy(); + } + + AngleVectors(monster.s.angles, forward, NULL, NULL); + VectorSubtract(point, monster.s.origin, to_dam); + VectorNormalize(to_dam); + + monster.touch = NULL;//do we need this here? + monster.deadflag = DEAD_DEAD; + + VectorSubtract(point,monster.s.origin,facedir); + VectorCopy(monster.s.angles, ideal_angles); + gi.linkentity (&monster); + } + + monster.s.effects |= EF_EXPLODING; + FX_VehicleExplosion(monster.s.origin, 255); + BlindingLight(monster.s.origin, 5000, 0.9, 0.5); +} + +void generic_ghoul_snowcat_ai::SetCurrentActionNextThink(void (*think)(edict_t *ent)) +{ + if (current_action) + { + ((snowcat_action*)(action_c*)current_action)->SetNextThink(think); + } +} + +/*QUAKED m_x_snowcat (1 .5 0) (-91 -66 -33) (91 66 58) INACTIVE + + Not much AI right now, but you can disable what's there with the INACTIVE flag. + +--------SPAWNFLAGS---------- +INACTIVE - just a snowcat. no AI. + +--------KEYS------------ +*/ + +void generic_snowcat_spawnnow (edict_t *self, char *subclass) +{ + bool bDeactivate = false; + + self->s.renderfx = RF_GHOUL; + + VectorSet (self->mins, -92,-67,-34); + VectorSet (self->maxs, 92, 67, 58); + + if (self->spawnflags & SNOWCAT_INACTIVE) + { + bDeactivate = true; + // set a new bbox, aligned with the snowcat (BBoxRotate will get called by SimpleModelInit2) + VectorSet (self->mins, -91,-66,-33); + VectorSet (self->maxs, 91, 66, 58); + } + self->spawnflags = SF_NOPUSH; + self->flags |= FL_NO_KNOCKBACK; + self->movetype = MOVETYPE_DAN; + self->solid = SOLID_BBOX; + self->takedamage= DAMAGE_YES; + self->pain = NULL;//CobraThink_Pain; + self->die = NULL;//CobraThink_Die; + self->think = NULL;//CobraThink_OnPad; + self->nextthink = level.time + FRAMETIME; + + self->health = self->max_health = 1000; + + gi.linkentity (self); + + + self->ai = ai_c::Create(AI_SNOWCAT, self, "enemy/snowcat", subclass);//new generic_ghoul_heli_ai(self, subclass); + + if (self->ai) + { + body_snowcat* body = ((generic_ghoul_snowcat_ai*)(ai_public_c*)self->ai)->GetSnowcatBody(); + if (body) + { + body->Deactivate(bDeactivate); + } + } +} + +void generic_snowcat_init (edict_t *self) +{ + // this is the last time we have to set the nextthink. from now on the ai + //will take care of it. + self->nextthink = level.time + FRAMETIME; + self->ai->NewDecision(new base_decision(), self); +} + +void SP_m_x_snowcat (edict_t *self) +{ + generic_snowcat_spawnnow(self,"snowcat"); + self->think = generic_snowcat_init; + gi.soundindex("Ambient/Models/Tank/tanklp.wav"); + gi.effectindex("environ/helismoke"); + gi.effectindex("weapons/othermz/tank"); + gi.effectindex("weapons/world/rocketexplode"); + gi.effectindex("weapons/othermz/machinegun"); + gi.effectindex("environ/kf_exhaust01"); + gi.effectindex("environ/snowspray"); + gi.effectindex("environ/machgun_smoke2"); + // in case some moron attacks a tank with a knife + gi.soundindex("impact/surfs/metal1.wav"); + gi.soundindex("impact/surfs/metal2.wav"); + gi.soundindex("impact/surfs/metal3.wav"); + gi.effectindex("environ/wallspark"); + game_ghoul.FindObject("effects/explosion", "explode80"); +} + +// +// snowcat helpers +// + +bool generic_ghoul_snowcat_ai::SnowcatH_FaceCoords(edict_t *entity) +{ + body_snowcat* body = GetSnowcatBody(); + vec3_t vDest, vDestDir, vDestAngles; + + if (!body) + { + return false; + } + VectorCopy(body->m_vPos, vDest); + VectorSubtract(vDest, ent->s.origin, vDestDir); + vectoangles(vDestDir, vDestAngles); + if (ent->s.angles[YAW] > 180) + { + ent->s.angles[YAW] -= 360; + } + + float fMove = vDestAngles[YAW] - ent->s.angles[YAW]; + float fMaxYawSpeed = body->GetMaxYawSpeed(); + + ent->s.angles[YAW] = anglemod(ent->s.angles[YAW]); + fMove = anglemod(fMove); + + if ( fabs(fMove) < 1 ) + { + ent->s.angles[YAW] = vDestAngles[YAW]; + ent->avelocity[YAW] = 0; + return true; + } + else + { + + if (fMove<180) + { + // turn to left... + // + ent->avelocity[YAW] = fMaxYawSpeed; + } + else + { + // turn to right... + // + ent->avelocity[YAW] = -fMaxYawSpeed; + } + } + return false; +} + +bool generic_ghoul_snowcat_ai::SnowcatH_MoveForward(edict_t *entity) +{ + // already facing our destination, so move toward it + body_snowcat* body = GetSnowcatBody(); + edict_t *ent = NULL; + trace_t tr; + vec3_t vDest, vFwd; + + if (body && (ent = body->GetTankEdict()) ) + { + VectorCopy(body->m_vPos, vDest); + // am I really close to my dest? + if (fabs(vDest[0] - ent->s.origin[0]) < 30 && + fabs(vDest[1] - ent->s.origin[1]) < 30 && + fabs(vDest[2] - ent->s.origin[2]) < 30) + { + // pretty close. stop the snowcat and stop the treads + VectorClear(ent->velocity); + body->SetTreads(false); + return true; + } + gi.trace(ent->s.origin, ent->mins, ent->maxs, vDest, ent, MASK_SOLID, &tr); + if (1 == tr.fraction) + { + // if we aren't moving yet, set our velocity + if (ent->velocity[0] || ent->velocity[1] || ent->velocity[2]) + { + // already moving + return false; + } + else + { + // not moving yet, apply our velocity + AngleVectors(ent->s.angles, vFwd, NULL, NULL); + VectorNormalize(vFwd); // ouch + VectorScale(vFwd, body->GetMaxFwdSpeed(), ent->velocity); + // set the sequence on our treads + body->SetTreads(true); + return false; + } + } + else + { + // sumthin's in the way. should probably do a huge amount of damage to it and just roll + //through it + body->SetTreads(false); + return true; + } + } + return true; +} + +bool generic_ghoul_snowcat_ai::SnowcatH_AimCannon(edict_t *entity) +{ + body_snowcat* body = GetSnowcatBody(); + + if (body) + { + return AimMachGun(body->m_vPos); + } + return true; +} + +bool generic_ghoul_snowcat_ai::SnowcatH_FireCannon(edict_t *entity) +{ + return SnowcatH_FireMachGun(entity); +} + +bool generic_ghoul_snowcat_ai::SnowcatH_FireMachGun(edict_t *entity) +{ + // at this point our machine gun should already be pointing at our target, so + //just fire the dumb thing + vec3_t vFireDir, vFirePos, vTemp; + body_snowcat* body = GetSnowcatBody(); + IGhoulInst *instMachGun = NULL, *instMachGun2 = NULL; + IGhoulObj *obj = NULL, *obj2 = NULL; + GhoulID idEndOfMachGun = NULL_GhoulID, idEndOfMachGun2 = NULL_GhoulID; + trace_t tr; + bool bFire = true; + + if ( !body || + !(instMachGun = body->GetMachGunInst()) || !(obj = instMachGun->GetGhoulObject()) || + !(instMachGun2 = body->GetMachGun2Inst()) || !(obj2 = instMachGun2->GetGhoulObject()) ) + { + return true; + } + idEndOfMachGun = obj->FindPart("_flash1"); + idEndOfMachGun2 = obj2->FindPart("_flash1"); + GetGhoulPosDir2(entity->s.origin, ent->s.angles, instMachGun, idEndOfMachGun, NULL, + vFirePos, vFireDir, NULL, NULL); + if (m_bCheckMachGunLOS) + { + gi.trace(vFirePos, NULL, NULL, m_vMachGunTarget, entity, MASK_SOLID, &tr); + if (tr.fraction < 1.0) + { + GetGhoulPosDir2(entity->s.origin, ent->s.angles, instMachGun2, idEndOfMachGun2, NULL, + vFirePos, vFireDir, NULL, NULL); + gi.trace(vFirePos, NULL, NULL, m_vMachGunTarget, entity, MASK_SOLID, &tr); + if (tr.fraction < 1.0) + { + bFire = false; + } + } + } + if (bFire) + { + bool bBursting = ((level.time - m_fLastBurst) < ( (gi.flrand(0.0, 0.2)*game.playerSkills.getEnemyValue()) + 0.2) ); + + if ( ((level.time - m_fLastBurst) > 0) && bBursting ) // ~1.0-second bursts + { + float waver = (5 - game.playerSkills.getEnemyValue())*0.05; + // perform the effect + if (true/*gi.irand(0, 3)*/) + { + fxRunner.execWithInst("weapons/othermz/machinegun", entity, instMachGun, idEndOfMachGun); + fxRunner.execWithInst("weapons/othermz/machinegun", entity, instMachGun2, idEndOfMachGun2); + } + // do the damage + VectorSet(vTemp, gi.flrand(-waver, waver), gi.flrand(-waver, waver), gi.flrand(-waver, waver)); + VectorAdd(vFireDir, vTemp, vFireDir); + // fire mach gun 1 + weapons.attack(ATK_MACHINEGUN, entity, vFirePos, vFireDir);//same damage, but bigger impact sound + // fire mach gun 2 + GetGhoulPosDir2(entity->s.origin, ent->s.angles, instMachGun2, idEndOfMachGun2, NULL, + vFirePos, vFireDir, NULL, NULL); + weapons.attack(ATK_MACHINEGUN, entity, vFirePos, vFireDir);//same damage, but bigger impact sound + } + else if (!bBursting) + { // time to reset our burst timer for a new ~0.5 second break (depending on skill) in the firing + m_fLastBurst = level.time + (gi.flrand(0.3, 0.6) * (5 - game.playerSkills.getEnemyValue())); + } + } + return true; +} + +// +// snowcat action wrappers -- these get called from snowcat_actions, then they call the corresponding +// member function for the ai +// + +void SnowcatW_GotoCoords(edict_t* ent) +{ + generic_ghoul_snowcat_ai* ai = (generic_ghoul_snowcat_ai*)(ai_public_c*)ent->ai; + ai->SetRetVal(ai->Snowcat_GotoCoords(ent)); +} + +void SnowcatW_FireCannonAtCoords(edict_t* ent) +{ + generic_ghoul_snowcat_ai* ai = (generic_ghoul_snowcat_ai*)(ai_public_c*)ent->ai; + ai->SetRetVal(ai->Snowcat_FireCannonAtCoords(ent)); +} + +void SnowcatW_MachGunAuto(edict_t *ent) +{ + // wherever the player is, attack him with the machine gun ( or stop attacking him) + generic_ghoul_snowcat_ai* ai = (generic_ghoul_snowcat_ai*)(ai_public_c*)ent->ai; + body_snowcat* body = NULL; + + if (ai && (body = ai->GetSnowcatBody()) ) + { + ai->SetMachGunAuto(0 != body->m_fArg); + } + ai->SetRetVal(true); +} + +// +// snowcat action functions +// + +bool generic_ghoul_snowcat_ai::Snowcat_GotoCoords(edict_t *entity) +{ + body_snowcat* body = GetSnowcatBody(); + trace_t tr; + vec3_t vDest; + edict_t *ent = NULL; + + if (body && (ent = body->GetTankEdict()) ) + { + VectorCopy(body->m_vPos, vDest); + gi.trace(ent->s.origin, ent->mins, ent->maxs, vDest, ent, MASK_SOLID, &tr); + if (1 == tr.fraction) + { + // turn to face our destination + if (SnowcatH_FaceCoords(entity)) + { + // head toward destination + if (SnowcatH_MoveForward(entity)) + { + // reached destination + return true; + } + else + { + // still moving toward destination + } + } + else + { + // still turning toward our destination + } + } + return false; + } + return true; +} + +bool generic_ghoul_snowcat_ai::Snowcat_FireCannonAtCoords(edict_t *entity) +{ + body_snowcat* body = GetSnowcatBody(); + + if (body) + { + if (SnowcatH_AimCannon(entity)) + { + return SnowcatH_FireCannon(entity); + } + return false; + } + return true; +} + +bool generic_ghoul_snowcat_ai::Snowcat_MachGunAuto(edict_t *entity) +{ + // wherever the player is, attack him with the machine gun + body_snowcat* body = GetSnowcatBody(); + edict_t *target = NULL; + + if (body && body->IsMachGunFunctioning()) + { + target = &g_edicts[1]; + if ( (!(target->flags & FL_NOTARGET)) && AimMachGun(target->s.origin)) + { + // make sure the gun has LOS + VectorCopy(target->s.origin, m_vMachGunTarget); + SnowcatH_FireMachGun(entity); + return true; + } + return false; + } + return true; +} + +// +// end of snowcat_action stuff +// + +generic_ghoul_snowcat_ai::generic_ghoul_snowcat_ai() +{ + m_ScriptActionCounter = -1; + m_LastThinkingActionID = -1; + m_attacker = NULL; + m_bTimeToDie = false; + VectorClear(m_vCannonTarget); + m_bMachGunAuto = false; + m_bCheckMachGunLOS = true; + m_bRetVal = false; + m_fLastBurst = 0; + VectorClear(m_vMachGunTarget); +} + +generic_ghoul_snowcat_ai::generic_ghoul_snowcat_ai(generic_ghoul_snowcat_ai *orig) +{ + m_fLastBurst = orig->m_fLastBurst; +} + diff --git a/Source/Game/gamecpp/m_snowcatai.h b/Source/Game/gamecpp/m_snowcatai.h new file mode 100644 index 0000000..3b3f485 --- /dev/null +++ b/Source/Game/gamecpp/m_snowcatai.h @@ -0,0 +1,85 @@ +// m_snowcatai.h + +#ifndef _M_SNOWCATAI_H_ +#define _M_SNOWCATAI_H_ +#include "m_tankai.h" + +class generic_ghoul_snowcat_ai : public generic_ghoul_tank_ai//ai_c +{ +public: +enum hse_Commands + { + tse_NONE=0, // + tse_GOTOCOORDS, + tse_FIRECANNONATCOORDS, + tse_MACHGUNAUTO + }; + +protected: +#define GGSA_SAVE_START offsetof(generic_ghoul_snowcat_ai, m_ScriptActionCounter) +/* int m_ScriptActionCounter; + int m_LastThinkingActionID; + edict_t *m_attacker; + qboolean m_bTimeToDie; + vec3_t m_vCannonTarget; + bool m_bMachGunAuto; + bool m_bCheckMachGunLOS; + float m_fLastBurst;*/ +// vec3_t m_vMachGunTarget; +#define GGSA_SAVE_END (offsetof(generic_ghoul_snowcat_ai, m_vMachGunTarget) + sizeof(m_vMachGunTarget)) + + +public: + generic_ghoul_snowcat_ai(); + virtual ~generic_ghoul_snowcat_ai(); + virtual void Init(edict_t *self, char *ghoulname, char* subclass); + virtual void Activate(edict_t &monster); + inline virtual body_snowcat *GetSnowcatBody(void){return (body_snowcat*)(body_c*)body;} + virtual void Think(edict_t &monster); + virtual void AddBody(edict_t *monster); + virtual int GetClassCode(void){return AI_SNOWCAT;}//this should be different for everybody in this class family + int GetCurrentActionID(); + int GetMostRecentlyAddedActionID(); + int GetLastThinkingActionID() { return m_LastThinkingActionID; } +// virtual action_c *TankAction(decision_c *od, action_c *oa, ai_c* ai, mmove_t *newanim, +// int nCommand, vec3_t vPos, edict_t* target, float fArg); + + generic_ghoul_snowcat_ai(generic_ghoul_snowcat_ai *orig); + + virtual void Pain(edict_t &monster, edict_t *other, float kick, int damage); + virtual void Die(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + virtual qboolean Damage(edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb); + qboolean IsTimeToDie() { return m_bTimeToDie; } + void TimeToDie(qboolean bTime) { m_bTimeToDie = bTime; } + void SetCurrentActionNextThink(void (*think)(edict_t *entity)); + void SetMachGunAuto(bool bOn) { m_bMachGunAuto = bOn;} + + // action functions available for snowcat_actions + bool Snowcat_GotoCoords(edict_t *entity); + bool Snowcat_FireCannonAtCoords(edict_t *entity); + bool Snowcat_MachGunAuto(edict_t *entity); + + // helper functions for dealing with snowcat_actions + bool SnowcatH_FaceCoords(edict_t *entity); + bool SnowcatH_MoveForward(edict_t *entity); + bool SnowcatH_AimCannon(edict_t *entity); + bool SnowcatH_FireCannon(edict_t *entity); + bool SnowcatH_FireMachGun(edict_t *entity); + +protected: + + virtual int AimMainGun(vec3_t vTarget); + virtual bool AimMachGun(vec3_t vTarget); + void SetCannonTarget(vec3_t vPos) { VectorCopy(vPos, m_vCannonTarget); } + void SetMachGunTarget(vec3_t vPos) { VectorCopy(vPos, m_vMachGunTarget); } + void GetCannonTarget(vec3_t vTarg) { VectorCopy(m_vCannonTarget, vTarg); } + void GetMachGunTarget(vec3_t vTarg) { VectorCopy(m_vMachGunTarget, vTarg); } +}; + + +// wrappers for ai functions that can be called by snowcat_actions +void SnowcatW_GotoCoords(edict_t *ent); +void SnowcatW_FireCannonAtCoords(edict_t *ent); +void SnowcatW_MachGunAuto(edict_t *ent); + +#endif //_M_SNOWCATAI_H_ diff --git a/Source/Game/gamecpp/m_tankactions.cpp b/Source/Game/gamecpp/m_tankactions.cpp new file mode 100644 index 0000000..1d919ba --- /dev/null +++ b/Source/Game/gamecpp/m_tankactions.cpp @@ -0,0 +1,183 @@ +// m_tankactions.cpp + +#include "g_local.h" +#include "ai_private.h" +#include "m_tankai.h" + +//#include // for OutputDebugString() only, do not leave in! + + +/********************************************************************************** + **********************************************************************************/ +tank_action::tank_action(decision_c *od, action_c *oa, ai_c* which_ai, + mmove_t *newanim, int nCommand, vec3_t vPos, + edict_t* target, float fArg, int nID) +:action_c(od, oa, newanim, vPos, vPos, NULL, 999999, true) +{ + generic_ghoul_tank_ai* ai = (generic_ghoul_tank_ai*)(ai_public_c*)which_ai; + body_tank* body = NULL; + + if (ai) + { + body = ai->GetTankBody(); + } + if (!body) + { + return; + } + m_nCommand = nCommand; + action_target = target; + m_think = NULL; + m_nextthink = NULL; + + // save our id (uniquely determined by the ai) + m_nID = nID; + // save our script params + m_fArg = fArg; + VectorCopy(vPos, dest); + action_target = target; + + // set our body params + body->m_target = target; + VectorCopy(vPos, body->m_vPos); + body->m_fArg = fArg; + + switch(m_nCommand) + { + case generic_ghoul_tank_ai::tse_GOTOCOORDS: + { + m_think = TankW_GotoCoords; + break; + } + case generic_ghoul_tank_ai::tse_FIRECANNONATCOORDS: + { + m_think = TankW_FireCannonAtCoords; + break; + } + case generic_ghoul_tank_ai::tse_MACHGUNAUTO: + { + m_think = TankW_MachGunAuto; + break; + } + case generic_ghoul_tank_ai::tse_DIE: + { + m_think = TankW_Die; + break; + } + case generic_ghoul_tank_ai::tse_AIMTURRET: + { + m_think = TankW_AimTurret; + break; + } + default: + break; + } +} + +qboolean tank_action::Think(ai_c &which_ai, edict_t &monster) +{ + float fHealthPercentage = 1.0f; + generic_ghoul_tank_ai* ai = (generic_ghoul_tank_ai*)(ai_public_c*)&which_ai; + body_tank* body = NULL; + + if (ai) + { + body = ai->GetTankBody(); + } + if (!body) + { + return false; + } + qboolean bRet = true; + if (m_think) + { + // set our script params in the body's member variables + body->m_fArg = m_fArg; + VectorCopy(dest, body->m_vPos); + body->m_target = action_target; + + // this past think may have updated our next think + if (m_nextthink && m_nextthink != m_think) + { + m_think = m_nextthink; + m_nextthink = NULL; + } + + m_think(&monster); + bRet = ai->GetRetVal(); + + fHealthPercentage = (float)monster.health/(float)monster.max_health; + body->UpdateSmoke(&monster, fHealthPercentage); + + } + + return bRet; +} + + +// overriding this fn is a quick way of keeping action_c from screwing with +//our tank's sequence +qboolean tank_action::SetAnimation(ai_c &which_ai, edict_t &monster) +{ + //just bein safe + if (!which_ai.GetBody()) + { + gi.dprintf("tank_action::SetAnimation--ai has no body!\n"); + return false; + } + return true; +} + +// overriding this fn is a quick way of keeping action_c from screwing with +//our tank's sequence +qboolean tank_action::ForceAnimation(ai_c &which_ai, edict_t &monster) +{ + //just bein safe + if (!which_ai.GetBody()) + { + gi.dprintf("tank_action::ForceAnimation--ai has no body!\n"); + return false; + } + return true; +} + +tank_action::tank_action(tank_action *orig) +: action_c(orig) +{ + m_nID = orig->m_nID; + m_nCommand = orig->m_nCommand; + m_fArg = orig->m_fArg; + + *(int *)&m_think = GetThinkNum(orig->m_think); + *(int *)&m_nextthink = GetThinkNum(orig->m_nextthink); +} + +void tank_action::Evaluate(tank_action *orig) +{ + m_nID = orig->m_nID; + m_nCommand = orig->m_nCommand; + m_fArg = orig->m_fArg; + + m_think = (void (*)(edict_t *self))GetThinkPtr((int)orig->m_think); + m_nextthink = (void (*)(edict_t *self))GetThinkPtr((int)orig->m_nextthink); + + action_c::Evaluate(orig); +} + +void tank_action::Read() +{ + char loaded[sizeof(tank_action)]; + + gi.ReadFromSavegame('AITK', loaded, sizeof(tank_action)); + Evaluate((tank_action *)loaded); +} + +void tank_action::Write() +{ + tank_action *savable; + + savable = new tank_action(this); + gi.AppendToSavegame('AITK', savable, sizeof(*this)); + delete savable; +} + diff --git a/Source/Game/gamecpp/m_tankactions.h b/Source/Game/gamecpp/m_tankactions.h new file mode 100644 index 0000000..9a6bbbb --- /dev/null +++ b/Source/Game/gamecpp/m_tankactions.h @@ -0,0 +1,39 @@ +/********************************************************************************** + **********************************************************************************/ + +class tank_action : public action_c +{ +private: +protected: + int m_nID; + int m_nCommand; + float m_fArg; + + void (*m_think)(edict_t *self); + void (*m_nextthink)(edict_t *self); + + virtual qboolean SetAnimation(ai_c &which_ai, edict_t &monster); + virtual qboolean ForceAnimation(ai_c &which_ai, edict_t &monster); + +public: + + tank_action(decision_c *od, action_c *oa, ai_c* which_ai, mmove_t *newanim, int nCommand, vec3_t vPos, edict_t* target, + float fArg, int nID); + tank_action(void):action_c(){ m_nID = -1;} + virtual ~tank_action(void) {} + + virtual int GetClassCode(void){return TANK_ACTION;}//this should be different for everybody in this class family + + virtual actiontype_e Type(void){return atype_walk;} + virtual qboolean Think(ai_c &which_ai, edict_t &monster); + virtual void SetThink(void (*think)(edict_t *self)) { m_think = think; } + virtual void SetNextThink(void (*think)(edict_t *self)) { m_nextthink = think; } + + tank_action(tank_action *orig); + void Evaluate(tank_action *orig); + virtual void Write(void); + virtual void Read(void); + + virtual int GetID() { return m_nID; } +}; + diff --git a/Source/Game/gamecpp/m_tankai.cpp b/Source/Game/gamecpp/m_tankai.cpp new file mode 100644 index 0000000..ffb64bb --- /dev/null +++ b/Source/Game/gamecpp/m_tankai.cpp @@ -0,0 +1,1385 @@ +// m_tankai.cpp + +#include "g_local.h" +#include "ai_private.h" +#include "m_generic.h" +#include "m_tankai.h" +#include "g_obj.h" // for OrientBolton() and modelSpawnData stuff +#include "callback.h" +#include "..\qcommon\ef_flags.h" + +#define TANK_INACTIVE (1<<0) + +typedef enum +{ + TANKOBJ_TANK = 0, + TANKOBJ_TURRET, + TANKOBJ_CANNON, + TANKOBJ_NULL, + TANKOBJ_MACHGUN, + TANKOBJ_MAXOBJS +}; + +enum +{ + MAINGUN_FALSE = 0, + MAINGUN_TRUE, + MAINGUN_ERROR +}; + +void debug_drawbox(edict_t* self,vec3_t vOrigin, vec3_t vMins, vec3_t vMaxs, int nColor); + +modelSpawnData_t tankModelData[MD_TANK_SIZE] = +{ +// dir file surfaceType material health solid material file cnt scale +"enemy/tank", "tank", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, "tank", 0, DEBRIS_SM, NULL, // TANKOBJ_TANK +"enemy/tank", "turret", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // TANKOBJ_TURRET +"enemy/tank", "canon", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // TANKOBJ_CANON +"objects/generic/gun_auto", "null", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // TANKOBJ_NULL +"enemy/tank", "machine_gun", SURF_METAL, MAT_METAL_DGREY, 100, SOLID_BBOX, NULL, 0, DEBRIS_SM, NULL, // TANKOBJ_MACHGUN +}; + +TankTreadCallback theTankTreadCallback; + +bool TankTreadCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + edict_t* self = (edict_t*)ent; + generic_ghoul_tank_ai* ai = (generic_ghoul_tank_ai*)(ai_public_c*)self->ai; + body_tank* body = NULL; + + if (ai) + { + body = ai->GetTankBody(); + } + if (!body) + { + return false; + } + if (body->GetTreadFire()) + { + // we're at the end of a firing sequence for the tank body, so switch + //back to the appropriate non-firing tread sequence (slightly complicated + //by the rotating texture coords for the treads) + body->SetTreadFire(false); + if (body->GetTreads()) + { + SimpleModelSetSequence2(body->GetTankInst(), "tank", SMSEQ_LOOP); + } + else + { + SimpleModelSetSequence2(body->GetTankInst(), "tank", SMSEQ_HOLDFRAME); + } + } + return true; +} + +int GetGhoulPosDir2(vec3_t sourcePos, vec3_t sourceAng, IGhoulInst *inst, + GhoulID partID, char *name, vec3_t pos, vec3_t dir, vec3_t right, + vec3_t up); + + +static void FinalTankDeathFX(edict_t &monster, body_tank *tank) +{ + IGhoulObj *obj = (tank->GetTankInst()?tank->GetTankInst()->GetGhoulObject():NULL); + GhoulID smoke1 = (obj?obj->FindPart("bolt_turret"):NULL); + + // stop the tank + VectorClear(monster.velocity); + VectorClear(monster.avelocity); + + FX_VehicleExplosion(monster.s.origin, 255); + BlindingLight(monster.s.origin, 5000, 0.9, 0.5); + + // stop treads + tank->SetTreads(false); + + // turn off main turret, cannon, and machine gun + SimpleModelTurnOnOff(tank->GetTurretInst(), false); + SimpleModelTurnOnOff(tank->GetCannonInst(), false); + SimpleModelTurnOnOff(tank->GetMachGunInst(), false); + + // if this is a snowcat, turn off the other mach gun barrel + if (tank->GetClassCode() == BODY_SNOWCAT) + { + SimpleModelTurnOnOff( ((body_snowcat*)tank)->GetMachGun2Inst(), false); + ((body_snowcat*)tank)->SetTreads(false); + } + + // switch to damage skin + SetSkin2(tank->GetTankInst(), "enemy/tank", "tank", "tank","tank_d"); + + // toss some debris + FX_ThrowDebris(monster.s.origin, vec3_up, 30, DEBRIS_MED, MAT_METAL_DGREY, 0, 0, 0, SURF_METAL); + + // smoke 'em if you got 'em + fxRunner.execContinualEffect("environ/helismoke", &monster, smoke1); + fxRunner.editContinualEffect("environ/helismoke", &monster, smoke1, 1.5); + + // no more thinking for you + tank->Deactivate(true); +} + +generic_ghoul_tank_ai::~generic_ghoul_tank_ai() +{ +} + +void generic_ghoul_tank_ai::Think(edict_t &monster) +{ + if (ai_freeze->value) + { + return; + } + +// gi.dprintf("tank health = %3.2f percent\n", (float)monster.health*100/(float)monster.max_health); +// debug_drawbox(&monster, NULL, NULL, NULL, 0); + if (GetTankBody() && GetTankBody()->IsDeactivated()) + { + // deactivate +// monster.nextthink = 0; + GetTankBody()->SetTreads(false); + monster.s.sound = 0; + monster.s.sound_data = 0; + return; + } + + // if our machine gun has been set to auto attack... + if (m_bMachGunAuto) + { + Tank_MachGunAuto(&monster); + } + monster.nextthink = level.time + FRAMETIME; + EvaluateSenses(monster); + + if (!current_action) + { // do some thinking - this is not correct + if (actions.size()) + { + NextAction(monster); + } + } + + if (current_action) + { + m_LastThinkingActionID = ((tank_action*)(action_c*)current_action)->GetID(); + if (current_action->Think(*this, monster)) + { + NextAction(monster); + if (GetTankBody()) + { + GetTankBody()->ResetScriptParams(); + } + } + } + gi.linkentity(&monster); + + if (monster.linkcount != linkcount) + { + linkcount = monster.linkcount; + gmonster.CheckGround (&monster); + } + gmonster.CatagorizePosition (&monster); + gmonster.WorldEffects (&monster);//leaving this in for drowning, lava damage, etc., but it should prolly be handled in ai class somewhere + + //if monster is dead, consider removing it + if (m_bTimeToDie) + { + //get ai to poll actions, decisions, & senses to check if removal is ok + if (SafeToRemove(monster)) + { + Die(monster, m_attacker, m_attacker, monster.max_health, vec3_origin); + G_FreeEdict (&monster); + } + } +// AimMainGun(ent->s.origin); +// AimMachGun(ent->s.origin); +} + +void generic_ghoul_tank_ai::Init(edict_t *self, char *ghoulname, char* subclass) +{ + m_ScriptActionCounter = m_LastThinkingActionID = 0; + m_bTimeToDie = false; + m_attacker = NULL; + m_bMachGunAuto = false; + m_bMoveBackward = false; + m_bCheckMachGunLOS = true; + m_bRetVal = false; + // build the tank here + + // tank (root object) + ggObjC *cTank = NULL; + // turret, cannon, machine gun + ggObjC *cTurret = NULL, + *cCannon = NULL, + *cNull = NULL, + *cMachGun = NULL; + // anims for fuselage and boltons + GhoulID cTurretSeq=0, + cTankSeq=0, + cCannonSeq=0, + cNullSeq=0, + cMachGunSeq=0; + // bolt located on the fuselage (aka "bolter") + GhoulID cBolterBolt=0; + // bolt located on the bolted-on item (aka "boltee") + GhoulID cBolteeBolt=0; + ggOinstC *t=NULL; + ggBinstC *cBolteeBolted=NULL, *bInstTurret = NULL, *bInstMachGunBase = NULL; + IGhoulInst *pInst=NULL; + Matrix4 mat,mat1,mat2; + GhoulID tempNote=0, tempMaterial = 0; + char materialName[100] = ""; + IGhoulObj *boltObj = NULL; + + ent->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID; + + if (!GetTankBody()) + { + return; + } + // create the tank body + + // gotta remove this flag or SimpleModelInit2 bombs out + ent->s.renderfx &= ~RF_GHOUL; + SimpleModelInit2(ent,&tankModelData[TANKOBJ_TANK],NULL,NULL); + if (ent->ghoulInst) + { + ent->movetype = MOVETYPE_PUSH; + GetTankBody()->SetTankEdict(ent); + SimpleModelSetSequence2(GetTankBody()->GetTankInst(), "tank", SMSEQ_HOLDFRAME); + } + + // bolt on the turret + if ( cBolteeBolted = SimpleModelAddBolt(ent, tankModelData[TANKOBJ_TANK], "bolt_turret", + tankModelData[TANKOBJ_TURRET], "to_bolt_turret", NULL) ) + { + bInstTurret = cBolteeBolted; + pInst = cBolteeBolted->GetInstPtr(); + GetTankBody()->SetTurretInst(cBolteeBolted); + + if (pInst && (boltObj = pInst->GetGhoulObject()) ) + { + GetTankBody()->SetTurretBolt(boltObj->FindPart("to_bolt_turret")); + // register a callback for the tank tread sequence + tempNote=pInst->GetGhoulObject()->FindNoteToken("EOS"); + if (tempNote) + { + pInst->AddNoteCallBack(&theTankTreadCallback,tempNote); + } + } + } + + // bolt the cannon onto the turret + if (cBolteeBolted = ComplexModelAddBolt(bInstTurret, tankModelData[TANKOBJ_TURRET], + "bolt_canon", tankModelData[TANKOBJ_CANNON], "to_bolt_canon", NULL)) + { + pInst = cBolteeBolted->GetInstPtr(); + GetTankBody()->SetCannonInst(cBolteeBolted); + } + if (pInst && pInst->GetGhoulObject()) + { + GetTankBody()->SetCannonBolt(pInst->GetGhoulObject()->FindPart("to_bolt_canon")); + } + + // bolt the machine gun base (just a null) onto the turret + if (cBolteeBolted = ComplexModelAddBolt(bInstTurret, tankModelData[TANKOBJ_TURRET], + "bolt_machine_gun", tankModelData[TANKOBJ_NULL], "DUMMY01", NULL)) + { + bInstMachGunBase = cBolteeBolted; + pInst = bInstMachGunBase->GetInstPtr(); + GetTankBody()->SetMachGunNullInst(bInstMachGunBase); + if (pInst && pInst->GetGhoulObject()) + { + GetTankBody()->SetMachGunNullBolt(pInst->GetGhoulObject()->FindPart("DUMMY01")); + // the NULL actually has some geometry in it (ghoul made me do it :< ) so turn it off + SimpleModelTurnOnOff(pInst, false); + } + } + + // bolt the machine gun onto its base + if (cBolteeBolted = ComplexModelAddBolt(bInstMachGunBase, tankModelData[TANKOBJ_NULL], + "DUMMY01", tankModelData[TANKOBJ_MACHGUN], "to_bolt_machine_gun", NULL)) + { + GetTankBody()->SetMachGunInst(cBolteeBolted); + pInst = cBolteeBolted->GetInstPtr(); + if (pInst && pInst->GetGhoulObject()) + { + GetTankBody()->SetMachGunBolt(pInst->GetGhoulObject()->FindPart("to_bolt_machine_gun")); + } + } +} + +void generic_ghoul_tank_ai::Activate(edict_t &monster) +{ + isActive=true; +} + +void generic_ghoul_tank_ai::AddBody(edict_t *monster) +{ + if (!monster) + { + return; + } + if (!body) + { + body = new body_tank(monster); + } +} + +int generic_ghoul_tank_ai::AimMainGun(vec3_t vTarget) +{ + body_tank* body = GetTankBody(); + IGhoulInst* gunInst = body->GetTurretInst(); + GhoulID gunBolt = body->GetTurretBolt(); + boltonOrientation_c boltonInfo; + edict_t* self = NULL; + boltonOrientation_c::retCode_e ret1, ret2; + + if (!body || !body->GetTankInst() || !(self = (edict_t*)body->GetTankInst()->GetUserData()) ) + { + return MAINGUN_ERROR; + } + if (!gunInst || !gunInst->GetGhoulObject()) + { + return MAINGUN_ERROR; + } + + // turn the turret to face the player (only pivots horizontally) + + boltonInfo.root = self; + boltonInfo.boltonInst = gunInst; + boltonInfo.boltonID = gunBolt; + boltonInfo.parentInst = self->ghoulInst; + VectorCopy(vTarget, boltonInfo.vTarget); + boltonInfo.vTarget[2] += 12; + boltonInfo.fMinPitch = 0; + boltonInfo.fMaxPitch = 0; + boltonInfo.fMinYaw = -4000; + boltonInfo.fMaxYaw = 4000; + boltonInfo.fMaxTurnSpeed = body->GetTurretSpeed(); + boltonInfo.bUsePitch = false; + boltonInfo.bUseYaw = true; + boltonInfo.bToRoot = true; + + ret1 = boltonInfo.OrientBolton(); + + // turn the cannon to face the player (only pivots vertically) + boltonInfo.boltonInst = body->GetCannonInst(); + boltonInfo.boltonID = body->GetCannonBolt(); + boltonInfo.parentInst = gunInst; + boltonInfo.parentID = gunInst->GetGhoulObject()->FindPart("to_bolt_turret"); + // determine min yaw based on turret facing + if (boltonInfo.fRetYaw > -0.13 && boltonInfo.fRetYaw < 0.13) + { + boltonInfo.fMinPitch = -0.05; + } + else if (boltonInfo.fRetYaw > 0.8 && boltonInfo.fRetYaw < 2.4) + { + boltonInfo.fMinPitch = -0.05; + } + else if (boltonInfo.fRetYaw < -0.8 && boltonInfo.fRetYaw > -2.4) + { + boltonInfo.fMinPitch = -0.05; + } + else + { + boltonInfo.fMinPitch = -0.02; + } + + boltonInfo.fMaxPitch = .2; + boltonInfo.fMinYaw = -4000; + boltonInfo.fMaxYaw = 4000; + boltonInfo.fMaxTurnSpeed = body->GetCannonSpeed(); + boltonInfo.bUsePitch = true; + boltonInfo.bUseYaw = false; + boltonInfo.bToRoot = true; + ret2 = boltonInfo.OrientBolton(); + if ( (boltonOrientation_c::retCode_e::ret_TRUE == ret1) && (ret2 == ret1) ) + { // pointing at our target + return MAINGUN_TRUE; + } + else if ( (boltonOrientation_c::retCode_e::ret_ERROR == ret1 && boltonOrientation_c::retCode_e::ret_TRUE == ret2) || + (boltonOrientation_c::retCode_e::ret_ERROR == ret2 && boltonOrientation_c::retCode_e::ret_TRUE == ret1) || + (boltonOrientation_c::retCode_e::ret_ERROR == ret1 && boltonOrientation_c::retCode_e::ret_ERROR == ret2) ) + { // either the pitch or the yaw is outside of our range of motion. don't return error until we've + //gotten as close as we can. + return MAINGUN_ERROR; + } + else + { // we just plain haven't got there yet + return MAINGUN_FALSE; + } +} + +bool generic_ghoul_tank_ai::AimMachGun(vec3_t vTarget) +{ + body_tank* body = GetTankBody(); + IGhoulInst *gunInst = body->GetMachGunInst(), + *baseInst = body->GetMachGunNullInst(), + *turretInst = body->GetTurretInst(); + GhoulID gunBolt = body->GetMachGunBolt(), + baseBolt = body->GetMachGunNullBolt(); + boltonOrientation_c boltonInfo; + edict_t* self = NULL; + boltonOrientation_c::retCode_e ret1, ret2; + + if (!body || + !body->GetTankInst() || + !(self = (edict_t*)body->GetTankInst()->GetUserData()) || + (game.playerSkills.getEnemyValue() == 0)) + { + return false; + } + if (!turretInst || !turretInst->GetGhoulObject()) + { + return false; + } + // turn the mach gun's base (just a null) to face the player (only pivots horizontally) + if (!gunInst || !gunBolt || !baseInst || !baseBolt) + { + return false; + } + boltonInfo.root = self; + boltonInfo.boltonInst = baseInst; + boltonInfo.boltonID = baseBolt; + boltonInfo.parentInst = turretInst; + boltonInfo.parentID = turretInst->GetGhoulObject()->FindPart("to_bolt_turret"); + VectorCopy(vTarget, boltonInfo.vTarget); + boltonInfo.vTarget[2] += 20; + boltonInfo.fMinPitch = 0; + boltonInfo.fMaxPitch = 0; + boltonInfo.fMinYaw = -4000; + boltonInfo.fMaxYaw = 4000; + boltonInfo.fMaxTurnSpeed = body->GetMachGunSpeed(); + boltonInfo.bUsePitch = false; + boltonInfo.bUseYaw = true; + boltonInfo.bToRoot = true; + ret1 = boltonInfo.OrientBolton(); + // turn the mach gun itself (only pivots vertically) + boltonInfo.boltonInst = gunInst; + boltonInfo.boltonID = gunBolt; + boltonInfo.parentInst = baseInst; + boltonInfo.parentID = baseBolt; + boltonInfo.fMinPitch = -M_PI*0.10; + boltonInfo.fMaxPitch = M_PI*0.25; + boltonInfo.fMinYaw = 0; + boltonInfo.fMaxYaw = 0; + boltonInfo.fMaxTurnSpeed = body->GetMachGunSpeed(); + boltonInfo.bUsePitch = true; + boltonInfo.bUseYaw = false; + boltonInfo.bToRoot = true; + ret2 = boltonInfo.OrientBolton(); + return ( (boltonOrientation_c::retCode_e::ret_TRUE == ret1) && (ret2 == ret1) ); +} + +action_c *generic_ghoul_tank_ai::TankAction(decision_c *od, action_c *oa, + ai_c* ai, mmove_t *newanim, int nCommand, vec3_t vPos, edict_t* target, float fArg) +{ + // uniquely identify each action generated by the script so we can poll it later in + //HelicopterDoneEvent::Process() to find out when it's done + m_ScriptActionCounter++; + return new tank_action(od, oa, ai, newanim, nCommand, vPos, target, fArg, m_ScriptActionCounter); +} + +int generic_ghoul_tank_ai::GetCurrentActionID() +{ + if (current_action) + { + return ((tank_action*)(action_c*)current_action)->GetID(); + } + else + { + return 0; + } +} + +int generic_ghoul_tank_ai::GetMostRecentlyAddedActionID() +{ + return m_ScriptActionCounter; +} + +qboolean generic_ghoul_tank_ai::Damage (edict_t &monster, edict_t *inflictor, + edict_t *attacker, vec3_t dir, vec3_t point, + vec3_t origin, int damage, int knockback, + int dflags, int mod, float penetrate, float absorb) +{ + // fixme: centralize skill level stuff + int take; + edict_t *killTarget = NULL; + + VectorNormalize(dir); + + take = damage; + + if (attacker && attacker->client && attacker->client->inv) + { + // knives can't hurt tanks, silly. + if (SFW_KNIFE == attacker->client->inv->getCurWeaponType()) + { + // make some pretty sparks, though + vec3_t vNormal; // fake this + VectorSubtract(attacker->s.origin, monster.s.origin, vNormal); + fxRunner.exec("environ/wallspark", point); + gi.sound (&monster, CHAN_VOICE, gi.soundindex(va("impact/surfs/metal%d.wav",gi.irand(1,3))), .6, ATTN_NORM, 0); + return true; + } + } + if (body && take) + { + if(dflags&(DT_PROJECTILE|DT_EXPLODE)) + { + take=damage=body->ShowDamage(monster, inflictor, attacker, dir, point, origin, damage, knockback, dflags, mod, penetrate, absorb); + } + } + +// do the damage + if (take) + { + monster.health = monster.health - take; + + if (monster.health <= 0) + { + if (monster.killtarget) + { + while ((killTarget = G_Find (killTarget, FOFS(targetname), monster.killtarget))) + { + killTarget->use(killTarget, &monster, &monster); + } + } + else + { + m_attacker = attacker; + monster.flags |= FL_NO_KNOCKBACK; +// monster.takedamage = DAMAGE_NO; + if (monster.deadflag != DEAD_DEAD) + { + Die(monster, inflictor, attacker, damage, point); + } + monster.nextthink = level.time + FRAMETIME; // should break heli out of PAUSE command if in one, but only private heli pause, not script main pause (unless that breaks out when you get shot anyway) + } + return true; + } + + if(dflags&(DT_PROJECTILE|DT_EXPLODE)) + { + Pain (monster, attacker, knockback, take); + } + + return true; + } + + return false;//no hit! +} + +void generic_ghoul_tank_ai::Pain(edict_t &monster, edict_t *other, float kick, int damage) +{ + float fHealthPercentage = (float)monster.health/(float)monster.max_health; + + if (GetTankBody()) + { + GetTankBody()->UpdateSmoke(&monster, fHealthPercentage); + } +} + +void generic_ghoul_tank_ai::Die(edict_t &monster, edict_t *inflictor, edict_t *attacker, + int damage, vec3_t point) +{ + vec3_t forward,to_dam; + if (monster.health < -999) + { + monster.health = -999; + } + + + // make sure our movement sound is off + monster.s.sound = 0; + monster.s.sound_data = 0; + + if (monster.killtarget) + { + edict_t *t = NULL; + while ((t = G_Find (t, FOFS(targetname), ent->killtarget))) + { + t->use(t, &monster, &monster); + } + } + + monster.enemy = attacker;//for awarding credit? + // CHECKME possible issues: + // If monster is killed by barrel, should we chain to find who was the barrel's killer? + // what about being clever and using architecture to kill monsters (like 16 ton weights) + + if (monster.deadflag != DEAD_DEAD) + { + vec3_t facedir; + list::iterator ia; + list::iterator is; + list::iterator id; + + +/* if (attacker && game.GameStats->CanBuy(attacker)) + { + //changed this to be conditional so it wouldn't crash --ss + if(CMonsterStats *MonsterStats = game.GameStats->GetMonsterStats(&monster)) + { + GetPlayerStats(attacker)->AdjustCashToBeAwarded(MonsterStats->GetKilledValue()); + } + else + { + gi.dprintf("Error: no stats for monster!\n"); + } + // this stuff gets put into bank account at "end" of mission + } +*/ +//fixme: do need the npc check, but do it a good way +// if (!(monster.monsterinfo.aiflags & AI_GOOD_GUY)) +// { + level.killed_monsters++; +/* if (coop->value && attacker && attacker->client) + { + attacker->client->resp.score++; + }*/ +// } + + // huh? should have list-eating separated out? + + for (is=senses.begin();is != senses.end();is++) + { + (*is).Destroy(); + } + for (ia=actions.begin();ia!=actions.end();ia++) + { + (*ia).Destroy(); + } + for (id=decisions.begin();id!=decisions.end();id++) + { + (*id).Destroy(); + } + + //now ditch nodes + + while (senses.size()) + { + senses.pop_front(); + } + + while (actions.size()) + { + actions.pop_front(); + } + while (decisions.size()) + { + decisions.pop_front(); + } + + if (current_action) + { + current_action.Destroy(); + } + + if (recycle_action) + { + recycle_action.Destroy(); + } + + AngleVectors(monster.s.angles, forward, NULL, NULL); + VectorSubtract(point, monster.s.origin, to_dam); + VectorNormalize(to_dam); + + monster.touch = NULL;//do we need this here? + monster.deadflag = DEAD_DEAD; + + VectorSubtract(point,monster.s.origin,facedir); + VectorCopy(monster.s.angles, ideal_angles); + gi.linkentity (&monster); + } + +// monster.s.effects |= EF_EXPLODING; + if (GetTankBody()) + { + FinalTankDeathFX(monster, GetTankBody()); + } +} + +void generic_ghoul_tank_ai::SetCurrentActionNextThink(void (*think)(edict_t *ent)) +{ + if (current_action) + { + ((tank_action*)(action_c*)current_action)->SetNextThink(think); + } +} + +void tanktouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t up = {0,0,1}; + vec3_t point; + vec3_t pushVel; + + if ((other->s.origin[2] + other->mins[2]) > self->s.origin[2]) + { + VectorSet(point, other->s.origin[0], other->s.origin[1], other->absmin[2]); + T_Damage(other, self, self, up, point, point, 10, 100, DT_SHOTGUN, 0); + VectorSubtract(other->s.origin, self->s.origin, pushVel); + VectorNormalize(pushVel); + VectorScale(pushVel, 100, pushVel); + if (pushVel[2] < 10) + { + pushVel[2] = 10; + } + VectorAdd(other->velocity, pushVel, other->velocity); + } +} + +void TankUse(edict_t *self, edict_t *other, edict_t *activator) +{ + bool bDeactivate = false; + + // toggle the tank on and off + if (self->spawnflags & TANK_INACTIVE) + { + self->spawnflags &= ~TANK_INACTIVE; + } + else + { + self->spawnflags |= TANK_INACTIVE; + bDeactivate = true; + } + if (self->ai) + { + body_tank* body = ((generic_ghoul_tank_ai*)(ai_public_c*)self->ai)->GetTankBody(); + if (body) + { + body->Deactivate(bDeactivate); + } + } +} + +/*QUAKED m_x_tank (1 .5 0) (-152 -85 -44) (152 85 80) INACTIVE + + Not much AI right now, but you can disable what's there with the INACTIVE flag. + +--------SPAWNFLAGS---------- +INACTIVE - just a tank. no AI. + +--------KEYS------------ +*/ + + +void generic_tank_spawnnow (edict_t *self, char *subclass) +{ + bool bDeactivate = false; + + self->s.renderfx = RF_GHOUL; + + VectorSet (self->mins, -152,-85,-44); + VectorSet (self->maxs, 152, 85, 80); + + if (self->spawnflags & TANK_INACTIVE) + { + bDeactivate = true; + // set a new bbox, aligned with the tank (BBoxRotate will get called by SimpleModelInit2) +// VectorSet (self->mins, -154,-78,-44); +// VectorSet (self->maxs, 267, 78, 24); + } + self->spawnflags = SF_NOPUSH; + self->flags |= FL_NO_KNOCKBACK; + self->movetype = MOVETYPE_DAN; + self->solid = SOLID_BBOX; + self->takedamage= DAMAGE_YES; + self->pain = NULL;//CobraThink_Pain; + self->die = NULL;//CobraThink_Die; + self->think = NULL;//CobraThink_OnPad; + self->nextthink = level.time + FRAMETIME; + self->use = TankUse; // get it? Tank Use? Like, tank use very much? + self->touch = tanktouch; + + self->health = self->max_health = 500 + (game.playerSkills.getEnemyValue()*500); + + gi.linkentity (self); + + + self->ai = ai_c::Create(AI_TANK, self, "enemy/tank", subclass);//new generic_ghoul_heli_ai(self, subclass); + + if (self->ai) + { + body_tank* body = ((generic_ghoul_tank_ai*)(ai_public_c*)self->ai)->GetTankBody(); + if (body) + { + body->Deactivate(bDeactivate); + } + } +} + +void generic_tank_init (edict_t *self) +{ + // this is the last time we have to set the nextthink. from now on the ai + //will take care of it. + self->nextthink = level.time + FRAMETIME; + self->ai->NewDecision(new base_decision(), self); +} + +void SP_m_x_tank (edict_t *self) +{ + generic_tank_spawnnow(self,"tank"); + self->think = generic_tank_init; + + gi.soundindex("Ambient/Models/Tank/tanklp.wav"); + + // in case some moron attacks a tank with a knife + gi.soundindex("impact/surfs/metal1.wav"); + gi.soundindex("impact/surfs/metal2.wav"); + gi.soundindex("impact/surfs/metal3.wav"); + gi.effectindex("environ/wallspark"); + + gi.effectindex("environ/helismoke"); + gi.effectindex("weapons/othermz/tank"); + gi.effectindex("weapons/world/rocketexplode"); + gi.effectindex("weapons/othermz/machinegun"); + gi.effectindex("environ/machgun_smoke2"); + game_ghoul.FindObject("effects/explosion", "explode80"); +} + + +// +// tank helpers +// + +bool generic_ghoul_tank_ai::TankH_FaceCoords(edict_t *entity) +{ + body_tank* body = GetTankBody(); + vec3_t vDest, vDestDir, vDestAngles; + + if (!body) + { + return false; + } + VectorCopy(body->m_vPos, vDest); + VectorSubtract(vDest, ent->s.origin, vDestDir); + if (m_bMoveBackward) + { // negate direction but leave z alone + vDestDir[0] = -vDestDir[0]; + vDestDir[1] = -vDestDir[1]; + } + vectoangles(vDestDir, vDestAngles); + if (ent->s.angles[YAW] > 180) + { + ent->s.angles[YAW] -= 360; + } + + float fMove = vDestAngles[YAW] - ent->s.angles[YAW]; + float fAbsMove = 0; + float fMaxYawSpeed = body->GetMaxYawSpeed(); + + ent->s.angles[YAW] = anglemod(ent->s.angles[YAW]); + fAbsMove = fabs(fMove); + fMove = anglemod(fMove); + + if ( fAbsMove < 1.5 ) + { + ent->s.angles[YAW] = vDestAngles[YAW]; + ent->avelocity[YAW] = 0; + return true; + } + else + { + + if (fMove<180) + { + // turn to left... + // + ent->avelocity[YAW] = fMaxYawSpeed; + } + else + { + // turn to right... + // + ent->avelocity[YAW] = -fMaxYawSpeed; + } + } + return false; +} + +bool generic_ghoul_tank_ai::TankH_MoveForward(edict_t *entity) +{ + // already facing our destination, so move toward it + body_tank* body = GetTankBody(); + edict_t *ent = NULL; + trace_t tr; + vec3_t vDest, vFwd; + + if (body && (ent = body->GetTankEdict()) ) + { + VectorCopy(body->m_vPos, vDest); + // am I really close to my dest? + if (fabs(vDest[0] - ent->s.origin[0]) < 5 && + fabs(vDest[1] - ent->s.origin[1]) < 5)// && + //fabs(vDest[2] - ent->s.origin[2]) < 5) + { + // pretty close. stop the tank and stop the treads + VectorClear(ent->velocity); + body->SetTreads(false); + return true; + } + gi.trace(ent->s.origin, ent->mins, ent->maxs, vDest, ent, MASK_SOLID, &tr); + if (1 == tr.fraction) + { + // if we aren't moving yet, set our velocity + if (ent->velocity[0] || ent->velocity[1] || ent->velocity[2]) + { + // already moving + return false; + } + else + { + // not moving yet, apply our velocity + AngleVectors(ent->s.angles, vFwd, NULL, NULL); + VectorNormalize(vFwd); // ouch + VectorScale(vFwd, body->GetMaxFwdSpeed(), ent->velocity); + if (m_bMoveBackward) + { + VectorInverse(ent->velocity); + } + // set the sequence on our treads + body->SetTreads(true); + return false; + } + } + else + { + // sumthin's in the way. should probably do a huge amount of damage to it and just roll + //through it + body->SetTreads(false); + return true; + } + } + return true; +} + +bool generic_ghoul_tank_ai::TankH_AimCannon(edict_t *entity) +{ + body_tank* body = GetTankBody(); + int aimRet = MAINGUN_ERROR; + + if (body) + { + aimRet = AimMainGun(body->m_vPos); + if ( (aimRet == MAINGUN_TRUE) || (aimRet == MAINGUN_ERROR) ) + { + return true; + } + else + { + return false; + } + } + return true; +} + +bool generic_ghoul_tank_ai::TankH_FireCannon(edict_t *entity) +{ + body_tank* body = GetTankBody(); + IGhoulInst *instCannon = NULL; + IGhoulObj *obj = NULL; + GhoulID idEndOfCannon = 0; + + // fire! + if (body && (instCannon = body->GetCannonInst()) ) + { + if (obj = instCannon->GetGhoulObject()) + { + // play a nice firing sound + FX_LargeExplosion(entity->s.origin, 1/*doesn't matter for sound-only effect*/, 2/*2 == sound only*/); + // perform the visual effect + idEndOfCannon = obj->FindPart("flash_canon"); + fxRunner.execWithInst("weapons/othermz/tank", body->GetTankEdict(), + instCannon, idEndOfCannon); + // play the recoil sequence for the cannon + SimpleModelSetSequence2(instCannon, "canon", SMSEQ_HOLD); + // play the recoil sequence for the turret + SimpleModelSetSequence2(body->GetTurretInst(), "turret", SMSEQ_HOLD); + // play the recoil sequence for the tank body + if (body->GetTreads()) + { + body->SetTreadFire(true); + SimpleModelSetSequence2(body->GetTankInst(), "tank_fire", SMSEQ_HOLD); + } + else + { + body->SetTreadFire(true); + SimpleModelSetSequence2(body->GetTankInst(), "tank_still", SMSEQ_HOLD); + } + // start the attack + if (TankH_CannonAttack(entity)) + { + // finished the attack + return true; + } + else + { + // need to continue the attack + SetCurrentActionNextThink(TankW_CannonAttack); + return false; + } + } + } + + return true; +} + +bool generic_ghoul_tank_ai::TankH_CannonAttack(edict_t *entity) +{ + // the raison d'etre for this fn is that we want to depict the cannon firing as a + //projectile weapon (as opposed to an instantaneous weapon like a pistol) but we don't want to + //show a moving projectile (like the rocket launcher does) + vec3_t vFireDir, vFirePos, vEndPos; + body_tank* body = GetTankBody(); + edict_t *ent = NULL; + IGhoulInst *instCannon = NULL; + IGhoulObj *obj = NULL; + GhoulID idEndOfCannon = 0; + trace_t tr; + float fProjectileDist = 0; + + if (!body || !(instCannon = body->GetCannonInst()) || !(obj = instCannon->GetGhoulObject()) || + !(ent = body->GetTankEdict()) ) + { + body->SetCurProjectileDist(0); // just to make sure + return true; + } + + // have we launched our shell yet? + if ( !(fProjectileDist = body->GetCurProjectileDist()) ) + { + // get id of bolt on the front of the cannon + idEndOfCannon = obj->FindPart("flash_canon"); + + // find range to target + GetGhoulPosDir2(ent->s.origin, ent->s.angles, + instCannon, + idEndOfCannon, + NULL, vFirePos, vFireDir, NULL, NULL); + VectorMA(vFirePos, 4096, vFireDir, vEndPos); + gi.trace(vFirePos, NULL, NULL, vEndPos, ent, MASK_SOLID, &tr); + if (1 == tr.fraction) + { + // freakin' a. this thing just shot 4096 units and didn't hit a thing. + return true; + } + fProjectileDist = tr.fraction * 4000; // shave off a little to make sure we hit the correct + //side of the architecture + body->SetGroundZero(tr.endpos); + } + // wherever it hits, generate an explosion. if it hits something a fair distance away, though, + //wait a frame or two before the damage occurs (projectile moves at 500 units a frame) + if ( fProjectileDist > 500 ) + { + // shell is still moving + body->SetCurProjectileDist(fProjectileDist - 500); + return false; + } + else + { // shell will land this frame + body->SetCurProjectileDist(0); + + // damage! (stolen from MissileCollide()) + vec3_t pos; + edict_t *tempXP = G_Spawn(); + + body->GetGroundZero(pos); + pos[2] += 10; + tempXP->owner = ent; + VectorCopy(pos, tempXP->s.origin); + + fxRunner.exec("weapons/world/rocketexplode", pos); + + T_RadiusDamage (tempXP, tempXP->owner, 130, tempXP, 150, 0, DT_MANGLE); + gmonster.RadiusDeafen(tempXP, 150, 250); + ShakeCameras (tempXP->s.origin, 100, 300, DEFAULT_JITTER_DELTA); + G_FreeEdict(tempXP); + + return true; + } +} + +bool generic_ghoul_tank_ai::TankH_FireMachGun(edict_t *entity) +{ + // at this point our machine gun should already be pointing at our target, so + //just fire the dumb thing + vec3_t vFireDir, vFirePos, vTemp; + body_tank* body = GetTankBody(); + IGhoulInst *instMachGun = NULL; + IGhoulObj *obj = NULL; + GhoulID idEndOfMachGun = 0; + trace_t tr; + bool bFire = true; + + if ( !body || !(instMachGun = body->GetMachGunInst()) || !(obj = instMachGun->GetGhoulObject()) ) + { + return true; + } + idEndOfMachGun = obj->FindPart("flash_machine_gun"); + GetGhoulPosDir2(entity->s.origin, ent->s.angles, instMachGun, idEndOfMachGun, NULL, + vFirePos, vFireDir, NULL, NULL); + if (m_bCheckMachGunLOS) + { + gi.trace(vFirePos, NULL, NULL, m_vMachGunTarget, entity, MASK_SOLID, &tr); + if (tr.fraction < .95) + { // something's blocking our line of sight to our target. if it's an entity that's + //not on our team, shoot anyway. + if (tr.ent && (tr.ent != &g_edicts[0])) + { + if ( (NULL == (ai_public_c*)tr.ent->ai) || (!OnSameTeam(tr.ent, entity)) ) + { // hit a non-ai entity (like maybe a crate) or an entity that's not on our team. + //either way, shoot it. + bFire = true; + } + else + { // I suppose it's conceivable that our trace hit an entity that's on our team. don't shoot. + bFire = false; + } + } + else + { // probably hit architecture. that'll stop a bullet. + bFire = false; + } + } + } + if (bFire) + { + bool bBursting = ((level.time - m_fLastBurst) < ( (gi.flrand(0.0, 0.2)*game.playerSkills.getEnemyValue()) + 0.2) ); + // perform the effect + if (((level.time - m_fLastBurst) > 0) && bBursting) + { + float waver = (5 - game.playerSkills.getEnemyValue())*0.03; + fxRunner.execWithInst("weapons/othermz/machinegun", entity, instMachGun, idEndOfMachGun); + VectorSet(vTemp, gi.flrand(-waver, waver), gi.flrand(-waver, waver), gi.flrand(-waver, waver)); + VectorAdd(vFireDir, vTemp, vFireDir); + // do the damage + weapons.attack(ATK_MACHINEGUN, entity, vFirePos, vFireDir);//same damage, but bigger impact sound + } + else if (!bBursting) + { // time to reset our burst timer for a new ~0.5 second break (depending on skill) in the firing + m_fLastBurst = level.time + (gi.flrand(0.3, 0.6) * (5 - game.playerSkills.getEnemyValue())); + } + } + return true; +} + +// +// tank action wrappers -- these get called from tank_actions, then they call the corresponding +// member function for the ai +// + +void TankW_GotoCoords(edict_t* ent) +{ + generic_ghoul_tank_ai* ai = (generic_ghoul_tank_ai*)(ai_public_c*)ent->ai; + body_tank* body = NULL; + + if (ai && (body = ai->GetTankBody()) ) + { + ai->MoveBackward(body->m_fArg == 1.0); + } + ai->SetRetVal(ai->Tank_GotoCoords(ent)); +} + +void TankW_FireCannonAtCoords(edict_t* ent) +{ + generic_ghoul_tank_ai* ai = (generic_ghoul_tank_ai*)(ai_public_c*)ent->ai; + ai->SetRetVal(ai->Tank_FireCannonAtCoords(ent)); +} + +void TankW_CannonAttack(edict_t *ent) +{ + generic_ghoul_tank_ai* ai = (generic_ghoul_tank_ai*)(ai_public_c*)ent->ai; + ai->SetRetVal(ai->TankH_CannonAttack(ent)); +} + +void TankW_MachGunAuto(edict_t *ent) +{ + // wherever the player is, attack him with the machine gun ( or stop attacking him) + generic_ghoul_tank_ai* ai = (generic_ghoul_tank_ai*)(ai_public_c*)ent->ai; + body_tank* body = NULL; + + if (ai && (body = ai->GetTankBody()) ) + { + ai->SetMachGunAuto(0 != body->m_fArg); + } + ai->SetRetVal(true); +} + +void TankW_Die(edict_t *ent) +{ + // perform some spectacular exploding, dying, blammo effects + generic_ghoul_tank_ai* ai = (generic_ghoul_tank_ai*)(ai_public_c*)ent->ai; + + if (ai) + { + ai->Die(*ent, NULL, ent, 10000, vec3_origin); + } + ai->SetRetVal(true); +} + +void TankW_AimTurret(edict_t *ent) +{ + generic_ghoul_tank_ai* ai = (generic_ghoul_tank_ai*)(ai_public_c*)ent->ai; + ai->SetRetVal(ai->TankH_AimCannon(ent)); +} + +// +// tank action functions +// + +bool generic_ghoul_tank_ai::Tank_GotoCoords(edict_t *entity) +{ + body_tank* body = GetTankBody(); + trace_t tr; + vec3_t vDest; + edict_t *ent = NULL; + + if (body && (ent = body->GetTankEdict()) ) + { + VectorCopy(body->m_vPos, vDest); + gi.trace(ent->s.origin, ent->mins, ent->maxs, vDest, ent, MASK_SOLID, &tr); + if (1 == tr.fraction) + { + // turn to face our destination. turn on our movement sound + entity->s.sound = gi.soundindex("Ambient/Models/Tank/tanklp.wav"); + entity->s.sound_data = (255 & ENT_VOL_MASK) | SND_FARATTN; + if (TankH_FaceCoords(entity)) + { + // head toward destination + if (TankH_MoveForward(entity)) + { + // reached destination. turn off our movement sound. + /// entity->s.sound = 0; + // entity->s.sound_data = 0; + return true; + } + else + { + // still moving toward destination + } + } + else + { + // still turning toward our destination + } + } + return false; + } + entity->s.sound = 0; + entity->s.sound_data = 0; + return true; +} + +bool generic_ghoul_tank_ai::Tank_FireCannonAtCoords(edict_t *entity) +{ + body_tank* body = GetTankBody(); + + if (body) + { + if (TankH_AimCannon(entity)) + { + return TankH_FireCannon(entity); + } + return false; + } + return true; +} + +bool generic_ghoul_tank_ai::Tank_MachGunAuto(edict_t *entity) +{ + // wherever the player is, attack him with the machine gun + body_tank* body = GetTankBody(); + edict_t *target = NULL; + + if (body && body->IsMachGunFunctioning()) + { + target = &g_edicts[1]; + if (AimMachGun(target->s.origin)) + { + // make sure the gun has LOS + VectorCopy(target->s.origin, m_vMachGunTarget); + TankH_FireMachGun(entity); + return true; + } + return false; + } + return true; +} + +// +// end of tank_action stuff +// + +generic_ghoul_tank_ai::generic_ghoul_tank_ai() +{ + m_ScriptActionCounter = -1; + m_LastThinkingActionID = -1; + m_attacker = NULL; + m_bTimeToDie = false; + m_bMoveBackward = false; + VectorClear(m_vCannonTarget); + m_bMachGunAuto = false; + m_bCheckMachGunLOS = true; + m_bRetVal = false; + m_fLastBurst = 0; + VectorClear(m_vMachGunTarget); +} + +generic_ghoul_tank_ai::generic_ghoul_tank_ai(generic_ghoul_tank_ai *orig) +{ + m_ScriptActionCounter = orig->m_ScriptActionCounter; + m_LastThinkingActionID = orig->m_LastThinkingActionID; + *(int *)&m_attacker = GetEdictNum(orig->m_attacker); + m_bTimeToDie = orig->m_bTimeToDie; + m_bMoveBackward = orig->m_bMoveBackward; + VectorCopy(orig->m_vCannonTarget, m_vCannonTarget); + m_bMachGunAuto = orig->m_bMachGunAuto; + m_bCheckMachGunLOS = orig->m_bCheckMachGunLOS; + m_bRetVal = orig->m_bRetVal; + m_fLastBurst = orig->m_fLastBurst; + VectorCopy(orig->m_vMachGunTarget, m_vMachGunTarget); +} + +void generic_ghoul_tank_ai::Evaluate(generic_ghoul_tank_ai *orig) +{ + m_ScriptActionCounter = orig->m_ScriptActionCounter; + m_LastThinkingActionID = orig->m_LastThinkingActionID; + m_attacker = GetEdictPtr((int)orig->m_attacker); + m_bTimeToDie = orig->m_bTimeToDie; + m_bMoveBackward = orig->m_bMoveBackward; + VectorCopy(orig->m_vCannonTarget, m_vCannonTarget); + m_bMachGunAuto = orig->m_bMachGunAuto; + m_bCheckMachGunLOS = orig->m_bCheckMachGunLOS; + m_bRetVal = orig->m_bRetVal; + m_fLastBurst = orig->m_fLastBurst; + VectorCopy(orig->m_vMachGunTarget, m_vMachGunTarget); + // Don't go down the Evaluate heirachy as this is a special case +} + +void generic_ghoul_tank_ai::Read() +{ + char loaded[sizeof(generic_ghoul_tank_ai)]; + + gi.ReadFromSavegame('AITA', loaded + GGTA_SAVE_START, GGTA_SAVE_END - GGTA_SAVE_START); + Evaluate((generic_ghoul_tank_ai *)loaded); + + ai_c::Read(); +} + +void generic_ghoul_tank_ai::Write() +{ + byte *save_start; + generic_ghoul_tank_ai *savable; + + savable = new generic_ghoul_tank_ai(this); + save_start = (byte *)savable; + gi.AppendToSavegame('AITA', save_start + GGTA_SAVE_START, GGTA_SAVE_END - GGTA_SAVE_START); + delete savable; + + ai_c::Write(); +} + + + + diff --git a/Source/Game/gamecpp/m_tankai.h b/Source/Game/gamecpp/m_tankai.h new file mode 100644 index 0000000..6dcaceb --- /dev/null +++ b/Source/Game/gamecpp/m_tankai.h @@ -0,0 +1,99 @@ +// m_tankai.h + +#ifndef _M_TANKAI_H_ +#define _M_TANKAI_H_ + +class generic_ghoul_tank_ai : public ai_c +{ +public: +enum hse_Commands + { + tse_NONE=0, // + tse_GOTOCOORDS, + tse_FIRECANNONATCOORDS, + tse_MACHGUNAUTO, + tse_DIE, + tse_AIMTURRET + }; + +protected: +#define GGTA_SAVE_START offsetof(generic_ghoul_tank_ai, m_ScriptActionCounter) + int m_ScriptActionCounter; + int m_LastThinkingActionID; + edict_t *m_attacker; + qboolean m_bTimeToDie; + bool m_bMoveBackward; + vec3_t m_vCannonTarget; + bool m_bMachGunAuto; + bool m_bCheckMachGunLOS; + bool m_bRetVal; + float m_fLastBurst; + vec3_t m_vMachGunTarget; +#define GGTA_SAVE_END (offsetof(generic_ghoul_tank_ai, m_vMachGunTarget) + sizeof(m_vMachGunTarget)) + +public: + generic_ghoul_tank_ai(); + virtual ~generic_ghoul_tank_ai(); + virtual void Init(edict_t *self, char *ghoulname, char* subclass); + virtual void Activate(edict_t &monster); + inline virtual body_tank *GetTankBody(void){return (body_tank*)(body_c*)body;} + virtual void Think(edict_t &monster); + virtual void AddBody(edict_t *monster); + virtual int GetClassCode(void){return AI_TANK;}//this should be different for everybody in this class family + int GetCurrentActionID(); + int GetMostRecentlyAddedActionID(); + int GetLastThinkingActionID() { return m_LastThinkingActionID; } + virtual action_c *TankAction(decision_c *od, action_c *oa, ai_c* ai, mmove_t *newanim, + int nCommand, vec3_t vPos, edict_t* target, float fArg); + virtual bool AmIAsGoodAsDead() {return false;} + + generic_ghoul_tank_ai(generic_ghoul_tank_ai *orig); + void Evaluate(generic_ghoul_tank_ai *orig); + virtual void Write(); + virtual void Read(); + + virtual void Pain(edict_t &monster, edict_t *other, float kick, int damage); + virtual void Die(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point); + virtual qboolean Damage(edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb); + qboolean IsTimeToDie() { return m_bTimeToDie; } + void TimeToDie(qboolean bTime) { m_bTimeToDie = bTime; } + void SetCurrentActionNextThink(void (*think)(edict_t *entity)); + void SetMachGunAuto(bool bOn) { m_bMachGunAuto = bOn;} + void MoveBackward(bool bOn) { m_bMoveBackward = bOn;} + + // action functions available for tank_actions + bool Tank_GotoCoords(edict_t *entity); + bool Tank_FireCannonAtCoords(edict_t *entity); + bool Tank_MachGunAuto(edict_t *entity); + + // helper functions for dealing with tank_actions + bool TankH_FaceCoords(edict_t *entity); + bool TankH_MoveForward(edict_t *entity); + bool TankH_AimCannon(edict_t *entity); + bool TankH_FireCannon(edict_t *entity); + bool TankH_CannonAttack(edict_t *entity); + bool TankH_FireMachGun(edict_t *entity); + + bool GetRetVal() { return m_bRetVal; } + void SetRetVal(bool bVal) { m_bRetVal = bVal; } + +protected: + + virtual int AimMainGun(vec3_t vTarget); + virtual bool AimMachGun(vec3_t vTarget); + void SetCannonTarget(vec3_t vPos) { VectorCopy(vPos, m_vCannonTarget); } + void SetMachGunTarget(vec3_t vPos) { VectorCopy(vPos, m_vMachGunTarget); } + void GetCannonTarget(vec3_t vTarg) { VectorCopy(m_vCannonTarget, vTarg); } + void GetMachGunTarget(vec3_t vTarg) { VectorCopy(m_vMachGunTarget, vTarg); } +}; + + +// wrappers for ai functions that can be called by tank_actions +void TankW_GotoCoords(edict_t *ent); +void TankW_FireCannonAtCoords(edict_t *ent); +void TankW_CannonAttack(edict_t *ent); +void TankW_MachGunAuto(edict_t *ent); +void TankW_Die(edict_t *ent); +void TankW_AimTurret(edict_t *ent); + +#endif //_M_TANKAI_H_ \ No newline at end of file diff --git a/Source/Game/gamecpp/mp_ents.cpp b/Source/Game/gamecpp/mp_ents.cpp new file mode 100644 index 0000000..54d5bfe --- /dev/null +++ b/Source/Game/gamecpp/mp_ents.cpp @@ -0,0 +1,914 @@ +#include "g_local.h" +#include "ai_pathfinding.h" + +#define DEFAULT(a, b) ((a) ? (a):(b)) + +// deathmatch +void SP_dm_KOTH_targetzone (edict_t *ent); + +spawn_t dmSpawns[] = +{ + {"dm_KOTH_targetzone", SP_dm_KOTH_targetzone}, + {NULL, NULL}, +}; + +edict_t *SV_TestEntityPosition (edict_t *ent); + +void SetGenericInvisible(edict_t *ent) +{ // get some good defaults here... + ent->movetype = MOVETYPE_NONE; + ent->solid = SOLID_NOT; + ent->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID; + VectorSet (ent->mins, -5, -5, -7); + VectorSet (ent->maxs, 5, 5, 12); + ent->s.modelindex = 0; + BboxRotate(ent); + gi.linkentity (ent); +} + +void SetGenericInvisVBBox(edict_t *ent) +{ + SetGenericInvisible(ent); + + gi.setmodel (ent, ent->model); + ent->s.modelindex = 0; + + ent->s.origin[0] = (ent->absmax[0] + ent->absmin[0])*.5; + ent->s.origin[1] = (ent->absmax[1] + ent->absmin[1])*.5; + ent->s.origin[2] = (ent->absmax[2] + ent->absmin[2])*.5; +} + + +//---------------------------------------------------------------------------------------------------- + +/*QUAKED dm_KOTH_targetzone (0 1 0) ? START_OFF +*/ + +void SP_dm_KOTH_targetzone (edict_t *ent) +{ + SetGenericInvisVBBox(ent); + + //blah... +} + +/*QUAKED spawner (0 1 0) (-16 -16 -32) (16 16 32) START_OFF SINGLE_TYPE +"soundName" door sound to be played when spawner is activated +"count" number of ents to be spawned at a single time (default 1) +"delay" frequency to spawn an ent in normal circumstances (default 30) +"wait" frequency to spawn an ent in triggered/active circumstances (default 10) +"mass" maximum number of ents owned by this trigger that can be in the world at once (default 1) ... -1 is unlimited +"health" number of items to spawn before removing - -1 is unlimited (default -1) +"lip" minimum radius to spawn guys in when you're not facing the spawner (defaults to 450) +"spawn1" +... +"spawn3" name of the ent to spawn from the ent list +*/ + +/*QUAKED spawner_monster (0 1 0) (-16 -16 -32) (16 16 32) START_OFF SINGLE_TYPE TARGET_PLAYER IGNORE_VISIBLITY IGNORE_LIMITS +"target" if this is set, this will be run when the spawner is out of guys +"soundName" door sound to be played when spawner is activated +"count" number of ents to be spawned at a single time (default 1) +"delay" frequency to spawn an ent in normal circumstances (default 30) - set to -1 to NEVER spawn in non-alert mode +"wait" frequency to spawn an ent in triggered/active circumstances (default 10) +"mass" maximum number of ents owned by this trigger that can be in the world at once (default 1) ... -1 is unlimited +"health" number of items to spawn before removing - -1 is unlimited (default -1) +"lip" minimum radius to spawn guys in when you're not facing the spawner (defaults to 450) +"spawn1" +... +"spawn3" name of the ent to spawn from the ent list + +TARGET_PLAYER makes spawned guys default to attacking the player immediately +*/ + +/*QUAKED spawner_boosterpack (0 1 0) (-16 -16 -32) (16 16 32) +"health" number of items to spawn before removing - default is 8 +"spawn1" +... +"spawn3" name of the ent to spawn from the ent list +*/ + + +#define START_OFF 1 +#define SINGLE_TYPE 2 +#define TARGET_PLAYER 4 +#define IGNORE_VISIBLITY 8 +#define IGNORE_LIMITS 16 +#define ACTIVE_BOOSTER 32 +#define IS_ENEMY 64 +#define IS_BOOSTER 128 +#define USEDBOOSTER 256 + +int canSpawnEnemies(void) +{ + //fixme - what SHOULD this be limited to? + + if(gmonster.GetNumNearbyEnemies() >= 7) + { + return 0; + } + return 1; +} + +float PlayersRangeFromSpot (edict_t *spot); + +int spawnDistValid(edict_t *ent) +{ + int val = PlayersRangeFromSpot(ent); + + // Is this reasonable? + + if(val > 768)return 0; + return 1; +} + +int visibleToPlayer(edict_t *spawner) +{ + if(!level.sight_client) + { + return 0; + } + + if(spawner->spawnflags & IGNORE_VISIBLITY) + { + return 0; + } + + if((spawner->spawnflags & (IS_BOOSTER|USEDBOOSTER)) == (IS_BOOSTER|USEDBOOSTER)) + { + return 1;//these guys are no good + } + + vec3_t dif; + vec3_t lookDir; + + VectorSubtract(spawner->s.origin, level.sight_client->s.origin, dif); + AngleVectors(level.sight_client->client->ps.viewangles, lookDir, 0, 0); + + if(((DotProduct(dif, lookDir) < 0)&&(DotProduct(dif, dif) > spawner->gib_health*spawner->gib_health)) + ||(!gi.inPVS(level.sight_client->s.origin, spawner->s.origin))) + { // only if far away does the behind-check work + return 0; + } + + if(spawner->spawnflags & IS_BOOSTER) + { + trace_t tr; + + gi.trace(spawner->s.origin, vec3_origin, vec3_origin, level.sight_client->s.origin, level.sight_client, MASK_SOLID, &tr); + if(tr.fraction < .99) + { + return 0; + } + else + { + spawner->spawnflags |= USEDBOOSTER; + } + } + return 1; +} + +void spawnerUse(edict_t *ent, edict_t *other, edict_t *activator) +{ + if(ent->spawnflags & IS_BOOSTER) + { //these are one shots - they don't get turned off + ent->spawnflags |= ACTIVE_BOOSTER; + } + else + { + if(ent->nextthink > 0) + { + ent->nextthink = 0; + } + else + { + ent->nextthink = level.time + 1.0; + } + } +} + +int curSpawnCountIsTooLarge(edict_t *ent, int testVal) +{ + int num = 0; + edict_t *curTest = g_edicts; + + if(testVal == -1)return 0; + + for ( curTest = g_edicts; curTest < &g_edicts[globals.num_edicts] ; curTest++) + { + if (!curTest->inuse)continue; + if (!(curTest->flags & FL_SPAWNED_IN))continue; + if ((curTest->ai)&&(curTest->health <= 0))continue; + + if(curTest->spawnerID == ent - g_edicts)num++; + if(num >= testVal)return 1; + } + + return 0; +} + +int IsNextSpawnTime(edict_t *ent) +{ + if(ent->spawnflags & IS_BOOSTER) + { + return 1;//it's always... booster time! + } + if(level.alertedStatus) + { + if(ent->wait == -1) + { + return 0; + } + else + { + return (level.time - ent->health > ent->wait); + } + } + else + { + if(ent->delay == -1) + { + return 0; + } + else + { + return (level.time - ent->health > ent->delay); + } + } + + return 0;//msdev is a ninny +} + +void debug_drawbox(edict_t* self,vec3_t vOrigin, vec3_t vMins, vec3_t vMaxs, int nColor); + +int getValidSpawnPoint(edict_t *ent, vec3_t outspot, edict_t **outGuy) +{ + edict_t *test; + + int numSpots = 0; + + for (test = ent; test; test = test->teamchain)numSpots++;//get the number in the chain + + edict_t *start; + int offset = gi.irand(0, numSpots - 1); + + start = ent; + while(offset) + { + start = start->teamchain; + offset--; + } + + test = start; + for (int i = 0; i < numSpots; i++) + { + test = test->teamchain; + if(!test) + { + test = ent;//restart from the beginning + } + + if(!spawnDistValid(test)) + { // must be within a certain range + continue; + } + if(visibleToPlayer(test)) + { + continue; + } + + vec3_t spotAdd; + VectorCopy(test->s.origin, spotAdd); + spotAdd[2] += 8.0; + trace_t trace; + + vec3_t down; + VectorCopy(test->s.origin, down); + down[2] -= 256; + gi.trace(test->s.origin, vec3_origin, vec3_origin, down, ent, MASK_SOLID, &trace); + VectorCopy(trace.endpos, spotAdd); + spotAdd[2] += 12; + + vec3_t testMin = {-16, -16, 0}; + vec3_t testMax = {16, 16, 73}; + gi.trace (spotAdd, testMin, testMax, spotAdd, 0, MASK_MONSTERSOLID, &trace); + + if(trace.startsolid) + { + continue; + } + + *outGuy = test; + VectorCopy(spotAdd, outspot); + return 1; + } + return 0; +} + +void spawnerThink(edict_t *ent) +{ + edict_t *newEnt; + int i; + char *newEntClass; + + if(ent->flags & FL_TEAMSLAVE) + { // no thinking for you! + ent->nextthink = 0; + return; + } + +/* if(ent->s.sound) + { + if (ent->moveinfo.sound_end != -1) + gi.sound (ent, CHAN_NO_PHS_ADD+CHAN_VOICE, ent->moveinfo.sound_end, .8, .4, 0); + ent->s.sound = 0; + }*/ + + if ((!ent->spawn1) && (!ent->spawn2) && (!ent->spawn3)) + { + gi.dprintf("spawner set to spawn nothing!\n"); + ent->nextthink=level.time+99999.9; + return; + } + + ent->nextthink = level.time + 1.0; + + if(ent->max_health == 0) + { + // if I have a target name, I need to trigger it. yeah. + edict_t *test; + int free = 1; + for (test = ent; test; test = test->teamchain) + { + if(test->killtarget) + { + if(!curSpawnCountIsTooLarge(ent, 1)) + { // this means that additionally I have no childrenses + if(ei_show->value)Com_Printf("Level spawner running kill target\n"); + + ent->count = 0; + ent->delay = 0; + ent->wait = 0; + ent->mass = 0; + ent->health = 0; + ent->target = ent->killtarget; //don't really wanna kill + ent->killtarget = 0; + + G_UseTargets(ent, ent);//activator? hrm. + } + else + { + free = 0; + } + } + } + + if(free) + { + edict_t *next; + for(test = ent; test; test = next) + { + next = test->teamchain; + G_FreeEdict(test); + } + return; + } + } + + if(!IsNextSpawnTime(ent)) + { + return; + } + + if((!canSpawnEnemies()) && (!(ent->spawnflags & IGNORE_LIMITS))) + { // must not have too many active enemies or too many enemies nearby + if(ei_show->value)Com_Printf("Level spawner can't spawn - too many enemies nearby\n"); + ent->nextthink = level.time + 1.0; + return; + } + + + for(i = 0; (i < ent->count) && ent->max_health; i++) + { + if(curSpawnCountIsTooLarge(ent, ent->mass) || game.cinematicfreeze)//no spawn during cine's!!! + { + if(ei_show->value)Com_Printf("Level spawner can't spawn - either has too many kids or is in cinematics\n"); + ent->nextthink = level.time + 1.0; + return; + } + + vec3_t outspot; + edict_t *spotEnt = 0; + if(!getValidSpawnPoint(ent, outspot, &spotEnt)) + { + if(ei_show->value)Com_Printf("Level spawner can't spawn - no valid spots\n"); + ent->nextthink = level.time + 1.0; + return; + } + + newEnt = G_Spawn(); + //positional stuff? + if((i == 0)||(!(ent->spawnflags & SINGLE_TYPE))) + { + do + { + switch(gi.irand(0, 2)) + { + case 0: + newEntClass = ent->spawn1; + break; + case 1: + newEntClass = ent->spawn2; + break; + case 2: + newEntClass = ent->spawn3; + break; + } + }while((!newEntClass)||(!strcmp(newEntClass, ""))); + } + newEnt->classname = newEntClass; + VectorCopy(outspot, newEnt->s.origin);//?? this can't work yet + newEnt->s.origin[2] += 35.0;//eh + //newEnt->s.origin[2] += 96.0; + VectorCopy(spotEnt->s.angles, newEnt->s.angles); + newEnt->target = spotEnt->target; + + VectorSet(newEnt->mins, -16, -16, -32); + VectorSet(newEnt->maxs, 16, 16, 41); + + int oldmask = newEnt->clipmask; + newEnt->clipmask = MASK_MONSTERSOLID; + + //make certain that the spot isn't already occupied.. + if(SV_TestEntityPosition(newEnt)) + { + G_FreeEdict(newEnt); + ent->nextthink = level.time + 1.0; + if(ei_show->value)Com_Printf("Level spawner can't spawn - space is occupied\n"); + return;//eh? + } + + ED_CallSpawn (newEnt); + + if (newEnt->inuse) + { + newEnt->spawnerID = ent - g_edicts; + + newEnt->clipmask = oldmask; + newEnt->flags |= FL_SPAWNED_IN; + newEnt->ai->Activate(*newEnt); + newEnt->ai->SetPriority(PRIORITY_HIGH); + + if((ent->spawnflags & IS_BOOSTER) || (ent->spawnflags & TARGET_PLAYER)) + { + //fixme - they should really come out to the person who spotted the guy + PlayerNoise(level.sight_client, newEnt->s.origin, AI_SENSETYPE_SOUND_WAKEUP, 0, 90, 7); + newEnt->ai->SetTargetTime(level.time, level.sight_client, level.sight_client->s.origin); + } + + //if (spotEnt->moveinfo.sound_start != -1) + // gi.sound (spotEnt, CHAN_NO_PHS_ADD+CHAN_VOICE, spotEnt->moveinfo.sound_start, .8, .4, 0); + /*if (spotEnt->moveinfo.sound_middle != -1) + { + spotEnt->s.sound = spotEnt->moveinfo.sound_middle; + spotEnt->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + }*/ + + if(ent->max_health > 0) + { //max health is the total number of guys the spawner can ever spawn... + ent->max_health--; + } + + + ent->health = level.time; + if(level.alertedStatus) + { + ent->nextthink = level.time + ent->wait; + } + else + { + ent->nextthink = level.time + ent->delay; + } + if(ei_show->value)Com_Printf("Level spawner spawned a guy\n"); + } + else + { + Com_Printf("Couldn't spawn entity type %s!\n", newEntClass); + } + } +} + +void spawnerInit(edict_t *ent) +{ + ent->moveinfo.sound_start = SND_getBModelSoundIndex(ent->soundName, 0); + ent->moveinfo.sound_middle = SND_getBModelSoundIndex(ent->soundName, 1); + ent->moveinfo.sound_end = SND_getBModelSoundIndex(ent->soundName, 2); + + ent->think = spawnerThink; + spawnerThink(ent); +} + +void SP_spawner(edict_t *ent) +{ + SetGenericInvisible(ent); + ent->think = spawnerInit; + ent->use = spawnerUse; + ent->nextthink = level.time + 1.0; + ent->delay = DEFAULT(ent->delay, 30); + ent->wait = DEFAULT(ent->wait, 10); + ent->count = DEFAULT(ent->count, 1); + ent->mass = DEFAULT(ent->mass, 1); + ent->max_health = DEFAULT(ent->health, -1); + ent->gib_health = DEFAULT(st.lip, 450); + ent->health = level.time;//health is the last time the spawner was used... + ent->classname = "spawner"; + if(ent->spawnflags & START_OFF)ent->nextthink = 0; + + for(int i = 0; i < 3; i++) + { + edict_t *newEnt = G_Spawn(); + char *newEntClass; + + switch(i) + { + case 0: + newEntClass = ent->spawn1; + break; + case 1: + newEntClass = ent->spawn2; + break; + case 2: + newEntClass = ent->spawn3; + break; + } + + if(!newEntClass || (!(*newEntClass))) + { + continue; + } + + newEnt->classname = newEntClass; + VectorCopy(ent->s.origin, newEnt->s.origin);//?? this can't work yet + ED_CallSpawn (newEnt); + G_FreeEdict(newEnt); + } +} + +void SP_spawner_monster(edict_t *ent) +{ + SP_spawner(ent); + ent->spawnflags |= IS_ENEMY; +} + +/*"target" if this is set, this will be run when the spawner is out of guys +"soundName" door sound to be played when spawner is activated +"count" number of ents to be spawned at a single time (default 1) +"delay" frequency to spawn an ent in normal circumstances (default 30) - set to -1 to NEVER spawn in non-alert mode +"wait" frequency to spawn an ent in triggered/active circumstances (default 10) +"mass" maximum number of ents owned by this trigger that can be in the world at once (default 1) ... -1 is unlimited +"lip" minimum radius to spawn guys in when you're not facing the spawner (defaults to 450) +"spawn1" +... +"spawn3" name of the ent to spawn from the ent list +*/ + +void spawner_booster_defaultthink(edict_t *ent) +{ //make certain we haven't been seen + if(ent->spawnflags & USEDBOOSTER) + { + ent->nextthink = 0;//all done + return; + } + + if(ent->spawnflags & ACTIVE_BOOSTER) + { + spawnerThink(ent); + } + + ent->nextthink = level.time + .4; + + if(!level.sight_client) + { + return; + } + + vec3_t dif; + vec3_t lookDir; + + VectorSubtract(ent->s.origin, level.sight_client->s.origin, dif); + AngleVectors(level.sight_client->client->ps.viewangles, lookDir, 0, 0); + + if(!gi.inPVS(level.sight_client->s.origin, ent->s.origin)) + { + return; + } + + trace_t tr; + + gi.trace(ent->s.origin, vec3_origin, vec3_origin, level.sight_client->s.origin, level.sight_client, MASK_SOLID, &tr); + if(tr.fraction < .99) + { + return; + } + + ent->spawnflags |= USEDBOOSTER; +} + +void SP_spawner_boosterpack(edict_t *ent) +{ + ent->health = DEFAULT(ent->health, 8); + SP_spawner(ent); + ent->spawnflags |= IS_ENEMY|IS_BOOSTER; + + ent->count = 1; + ent->delay = 1; + ent->wait = 1; + ent->mass = 20; + + ent->nextthink = level.time + .4; + ent->think = spawner_booster_defaultthink; +} + + + + + + + + + + + + + + + + + +//****************************************************************************** +// +// World Spawning Stuff +// +//****************************************************************************** + + +// amount every 10th of a second to go down = this equals 20 seconds to go from full to nothing +#define SPAWN_CAP 1.0 +#define SPAWN_CHECKRAD 600 +#define SPAWN_EXCITE_LEVEL .4 + +edict_t *SV_TestEntityPosition (edict_t *ent); + +bool HandleWorldSpawning(vec3_t origin, edict_t &ent, vec3_t startLookAng, int allowBehind) +{ + vec3_t spot; + CRadiusContent rad(origin, SPAWN_CHECKRAD, 1, 0, 1); + if(rad.getNumFound() > game.playerSkills.getSpawnMaxGuys() + 1) + { + if(ei_show->value)Com_Printf("World can't spawn - too many guys nearby\n"); + return false;//one of these is the player + } + + vec3_t lookVect; + + AngleVectors(ent.s.angles, lookVect, 0, 0); + + //if(!aiPoints.getNearNonvisible(gmonster.GetClientNode(), spot, 640, lookVect, ent.s.origin)) + if(!aiPoints.getSpawnPosition(spot, allowBehind)) + { + if(ei_show->value)Com_Printf("World can't spawn - no spots available for spawning\n"); + return false; + } + + trace_t trace; + vec3_t testMin = {-16, -16, -32}; + vec3_t testMax = {16, 16, 41}; + gi.trace (spot, testMin, testMax, spot, 0, MASK_MONSTERSOLID, &trace); + + if(trace.startsolid) + { + if(ei_show->value)Com_Printf("World spawn trying to spawn, but spot is occupied\n"); + return false; + } + + if ((!world->spawn1) && (!world->spawn2) && (!world->spawn3)) + { + return false; + } + + char *spawnName; + + do + { + switch(gi.irand(0, 2)) + { + case 0: + spawnName = world->spawn1; + break; + case 1: + spawnName = world->spawn2; + break; + case 2: + spawnName = world->spawn3; + break; + } + }while((!spawnName)||(!strcmp(spawnName, ""))); + + if((!spawnName)||(!strcmp(spawnName, ""))) + { + if(ei_show->value)Com_Printf("World spawn trying to spawn, but no fields set\n"); + return false; + } + + edict_t *newEnt = G_Spawn(); + + newEnt->classname = spawnName; + VectorCopy(spot, newEnt->s.origin); + newEnt->s.origin[2] += 8; + ED_CallSpawn (newEnt); + + //irk! This was placed before callspawn! + if(!newEnt->ai) + { //er... huh? + G_FreeEdict(newEnt); + return false; + } + + vec3_t dif; + VectorSubtract(origin, newEnt->s.origin, dif); + dif[2] = 0; + VectorNormalize(dif); + vectoangles(dif, newEnt->s.angles); + +// newEnt->ai->SetTargetTime(level.time, &ent, origin); + +// PlayerNoise(level.sight_client, newEnt->s.origin, AI_SENSETYPE_SOUND_WAKEUP, 0, 90, 7); +// newEnt->ai->SetTargetTime(level.time, level.sight_client, level.sight_client->s.origin); + + +// newEnt->ai->setFirstTargetTime(level.time + 3.0);//spawned guys take a bit longer to get warmed up + + int oldmask = newEnt->clipmask; + newEnt->clipmask = MASK_MONSTERSOLID; + + //make certain that the spot isn't already occupied.. + //this doesn't appear to do anything even close to working + if(SV_TestEntityPosition(newEnt)) + { + if(ei_show->value)Com_Printf("World spawn trying to spawn, but spot is occupied\n"); + G_FreeEdict(newEnt); + return false;//eh? + } + + level.lastSpawn = level.time; + newEnt->clipmask = oldmask; + + newEnt->flags |= FL_SPAWNED_IN; + + newEnt->ai->SetPriority(PRIORITY_HIGH); + + if(ei_show->value) + { + Com_Printf("World spawned in a guy\n"); + gi.sound (newEnt, CHAN_AUTO, gi.soundindex ("Weapons/mpg/fire.wav"), 1, 0, 0); + } + return true; +} + + +void IncreaseSpawnIntensity(float amount) +{ + if(level.spawnRushTime + game.playerSkills.getSpawnLullTime() > level.time)//fixme - you know the drill + { + //don't bother here + } + else + { + float spawnMul = ai_spawnfrequency->value * game.playerSkills.getSpawnFreq(); + if(spawnMul < .1) + { + spawnMul = .1; + } + //.4 is because I'm slowing both the rising and the falling + level.playerLoudness += amount * .7 * spawnMul; + if(level.playerLoudness > SPAWN_CAP)level.playerLoudness = SPAWN_CAP; + if(ai_spawnfrequency->value < .1 || (game.playerSkills.getSpawnFreq() < .1)) + { + if(level.playerLoudness > SPAWN_CAP * .4) + { + level.playerLoudness = SPAWN_CAP * .4; + } + } + } +} + +void UpdateWorldSpawningByFrame(void) +{ + int spawn = 0; + + if((!(level.sight_client))) + { // no spawning during any of the above cases + return; + } + + if((ai_spawnfrequency->value <= 0.01)|| + (game.playerSkills.getSpawnFreq() <= 0.01)|| + dm->isDM()|| + (game.cinematicfreeze)) + { // no spawning during any of the above cases + level.playerLoudness -= ((.003 + (.015 * level.playerLoudness)))*.7;//wacky - peaks drop quicker + return; + } + + if(level.spawnRushTime > level.time) + {//overwhelm the player for getting too loud +// Com_Printf("Rushing!!!\n"); + + level.playerLoudness = SPAWN_CAP; + + PlayerNoise(level.sight_client, level.sight_client->s.origin, AI_SENSETYPE_SOUND_WEAPON, NULL, 800, gmonster.GetClientNode()); + + if(level.spawnSoundTime + .75 < level.time) + { + level.spawnSoundTime = level.time; + gi.sound (level.sight_client, CHAN_AUTO, gi.soundindex ("misc/padd/max.wav"), 1.0, 0, 0); + } + + if(level.time> level.lastSpawn + game.playerSkills.getSpawnForceTime())//fixme - make skill level dependent + { + bool didSpawn = HandleWorldSpawning(level.sight_client->s.origin, + *level.sight_client, level.sight_client->s.angles, 1); + } + } + else + { + if(level.spawnRushTime + game.playerSkills.getSpawnLullTime() > level.time)//fixme - you know the drill + {//give the player a breather, poor guy +// Com_Printf("Resting.\n"); +/* if(level.spawnSoundTime + 1.0 < level.time) + { + level.spawnSoundTime = level.time; + gi.sound (level.sight_client, CHAN_AUTO, gi.soundindex ("misc/padd/max.wav"), .05, 0, 0); + }*/ + level.playerLoudness = (1.0 - (level.time - level.spawnRushTime) + /game.playerSkills.getSpawnLullTime())*SPAWN_CAP; + } + else + { + + int peakHit = 0; + + if(level.playerLoudness == SPAWN_CAP) + { + peakHit = 1; + } + + // update the primary variable + //.4 is because I'm slowing both the rising and the falling + level.playerLoudness -= ((.003 + (.015 * level.playerLoudness)))*.7;//wacky - peaks drop quicker + if(level.playerLoudness < 0) + { + level.playerLoudness = 0; + } + + if(peakHit) + { + level.spawnRushTime = level.time + game.playerSkills.getSpawnNonLullTime();//fixme - make skill level dependant + } + + if(level.playerLoudness > SPAWN_CAP * .75) + { + float vol = (level.playerLoudness - (SPAWN_CAP * .75))/(SPAWN_CAP * .25);//this yields a range of 0 to 1 + float pause = 1.0 - .8 * vol; + vol = .4; + + if(level.spawnSoundTime + pause < level.time) + { + level.spawnSoundTime = level.time; + gi.sound (level.sight_client, CHAN_AUTO, gi.soundindex ("misc/padd/warning.wav"), vol, 0, 0); + } + if(level.time> level.lastSpawn + game.playerSkills.getSpawnMinTime())//fixme - make skill level dependent + { + bool didSpawn = HandleWorldSpawning(level.sight_client->s.origin, + *level.sight_client, level.sight_client->s.angles, 0); + } + + } + else if(level.playerLoudness > SPAWN_CAP * .5) + { + float vol = 2 * (level.playerLoudness - (SPAWN_CAP * .5))/(SPAWN_CAP * .5);//this yields a range of 0 to 1 + float pause = 3.0 - 2.0 * vol; + vol = .4; + if(level.spawnSoundTime + pause < level.time) + { + level.spawnSoundTime = level.time; + gi.sound (level.sight_client, CHAN_AUTO, gi.soundindex ("misc/padd/warning.wav"), vol, 0, 0); + } + if(level.time> level.lastSpawn + game.playerSkills.getSpawnMinTime())//fixme - make skill level dependent + { + bool didSpawn = HandleWorldSpawning(level.sight_client->s.origin, + *level.sight_client, level.sight_client->s.angles, 0); + } + } + } + } +} diff --git a/Source/Game/gamecpp/p_body.cpp b/Source/Game/gamecpp/p_body.cpp new file mode 100644 index 0000000..ab0edc4 --- /dev/null +++ b/Source/Game/gamecpp/p_body.cpp @@ -0,0 +1,2442 @@ +////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////// +/// +/// player body +/// +////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////// + + +#include "g_local.h" +#include "ai_private.h" +#include "p_body.h" +#include "m_generic.h" +#include "..\qcommon\ef_flags.h" + +#ifdef __PLAYERTEST_3DPERSON + +#define THIRDPERSON_HACK true + +#else + +#define THIRDPERSON_HACK false + +#endif + +////////////////////////////////////////////////////////////////////// +// Local-use functions +////////////////////////////////////////////////////////////////////// + +static bool BodyPreUse(edict_t *ent) +{ +#ifdef __PLAYERTEST_3DPERSON + //for testing purposes only + if (ent && ent->client && ent->client->ps.bod) + { + ent->ghoulInst = ent->client->ps.bod; + return ent->ghoulInst!=NULL; + } + return false; +#else + //use this line for real--the rest is for testing + return true; +#endif +} + +static void BodyPostUse(edict_t *ent) +{ +#ifdef __PLAYERTEST_3DPERSON + if (ent) + { + ent->ghoulInst = NULL; + } +#endif +} + +static void AdjustDestForSpeed(edict_t *ent, vec3_t dest) +{ + vec3_t to_dest; + VectorSubtract(dest, ent->s.origin, to_dest); + to_dest[2]=0; + if (VectorNormalize(to_dest)>0.1) + { + if (ent->client->running) + { + VectorScale(to_dest, 100.0f, to_dest); + } + else + { + VectorScale(to_dest, 1.0f, to_dest); + } + to_dest[2]=dest[2]-ent->s.origin[2]; + VectorAdd(to_dest, ent->s.origin, dest); + } +} + +static GhoulSpeed GetAnimSpeedForMove(edict_t *ent, vec3_t to_dest, float moveScale) +{ + //yuck. the damn scales were not implemented meaning the same thing. now i'm dizzy (well, dizzier). --sfs + float adjustedMoveScale=1.0/moveScale; + +// gi.dprintf("hello! player speed scale: %f!\n", adjustedMoveScale); + + if (adjustedMoveScale > 1.875) + { +// gi.dprintf("hello! player anim scale: gs16Over8!\n"); + return gs16Over8; + } + else if (adjustedMoveScale > 1.75) + { +// gi.dprintf("hello! player anim scale: gs15Over8!\n"); + return gs15Over8; + } + else if (adjustedMoveScale > 1.625) + { +// gi.dprintf("hello! player anim scale: gs14Over8!\n"); + return gs14Over8; + } + else if (adjustedMoveScale > 1.5) + { +// gi.dprintf("hello! player anim scale: gs13Over8!\n"); + return gs13Over8; + } + else if (adjustedMoveScale > 1.375) + { +// gi.dprintf("hello! player anim scale: gs12Over8!\n"); + return gs12Over8; + } + else if (adjustedMoveScale > 1.25) + { +// gi.dprintf("hello! player anim scale: gs11Over8!\n"); + return gs11Over8; + } + else if (adjustedMoveScale > 1.125) + { +// gi.dprintf("hello! player anim scale: gs10Over8!\n"); + return gs10Over8; + } + else if (ent->client->moveScale > 1.0f) + { +// gi.dprintf("hello! player anim scale: gs9Over8!\n"); + return gs9Over8; + } + else if (adjustedMoveScale > 0.875) + { +// gi.dprintf("hello! player anim scale: gsOne!\n"); + return gsOne; + } + else if (adjustedMoveScale > 0.75) + { +// gi.dprintf("hello! player anim scale: gs7Over8!\n"); + return gs7Over8; + } + else if (adjustedMoveScale > 0.625) + { +// gi.dprintf("hello! player anim scale: gs6Over8!\n"); + return gs6Over8; + } + else if (adjustedMoveScale > 0.5) + { +// gi.dprintf("hello! player anim scale: gs5Over8!\n"); + return gs5Over8; + } + else + { +// gi.dprintf("hello! player anim scale: gs4Over8!\n"); + return gs4Over8; + } +} + +static GhoulSpeed GetAnimSpeedForNonMove(edict_t *ent, vec3_t to_dest, float moveScale) +{ +// return SetAnimSpeedForNonMove(ent, dest, moveScale); + return gsOne; +} + +static void SetAnimSpeed(edict_t *ent, vec3_t dest, mmove_t *move) +{ + if (ent->ghoulInst && ent->client) + { + float tempMoveScale = /*ent->client->moveScale * */dm->clientGetMovescale(ent); + vec3_t to_dest; + VectorSubtract(dest, ent->s.origin, to_dest); + to_dest[2]=0; + + if (VectorNormalize(to_dest)>0.1) + { + if (ent->client->running) + { + ent->ghoulInst->SetSpeed(GetAnimSpeedForMove(ent, to_dest, tempMoveScale)); + VectorScale(to_dest, 100.0f, to_dest); + } + else + { + //slow down crouchmove anims + if (move->bbox==BBOX_PRESET_CROUCH && (move->actionFlags&ACTFLAG_LOOPANIM)) + { + tempMoveScale*=0.75; + } + + ent->ghoulInst->SetSpeed(GetAnimSpeedForMove(ent, to_dest, tempMoveScale)); + VectorScale(to_dest, 1.0f, to_dest); + } + to_dest[2]=dest[2]-ent->s.origin[2]; +// VectorAdd(to_dest, ent->s.origin, dest); + } + else + { +// ent->ghoulInst->SetSpeed(gs16Over8); + ent->ghoulInst->SetSpeed(GetAnimSpeedForNonMove(ent, to_dest, tempMoveScale)); + } + } +} + +static void RegisterPlayerGameSkins(ggObjC *MyGhoulObj, char *facebase) +{ + //gorezones + MyGhoulObj->RegisterSkin("gz","gz_sing1"); + MyGhoulObj->RegisterSkin("gz","gz_sing2"); + MyGhoulObj->RegisterSkin("gz","gz_sing3"); + MyGhoulObj->RegisterSkin("gz","gz_sing_k"); + MyGhoulObj->RegisterSkin("gz","gz_multi1"); + MyGhoulObj->RegisterSkin("gz","gz_multi2"); + MyGhoulObj->RegisterSkin("gz","gz_multi3"); + MyGhoulObj->RegisterSkin("gz","gz_multi_k"); + MyGhoulObj->RegisterSkin("gz","gz_mass1"); + MyGhoulObj->RegisterSkin("gz","gz_mass2"); + MyGhoulObj->RegisterSkin("gz","gz_mass3"); + MyGhoulObj->RegisterSkin("gz","gz_mass_k"); + //caps + MyGhoulObj->RegisterSkin("c","c_blood"); + MyGhoulObj->RegisterSkin("c","c_black"); + + //faces--note that normal face is NOT precached--it's expected in the skin-setting section! + if (facebase && facebase[0]) + { + char facetemp[100]; + + Com_sprintf(facetemp, 100, "%sd",facebase); + MyGhoulObj->RegisterSkin("f", facetemp); + + //pain face not vital, but good + if ((mskins_expression_limit->value-0.1)RegisterSkin("f",facetemp); + } + + //blink face total fluff + if ((mskins_expression_limit->value-0.1)RegisterSkin("f",facetemp); + } + } +} + +static bbox_preset GetGoalBBox(edict_t *ent) +{ + if (ent && ent->client && ent->client->ps.pmove.pm_flags & PMF_DUCKED) + { + return BBOX_PRESET_CROUCH; + } + return BBOX_PRESET_STAND; +} + +//this func assumes i've already done pre-use and will do post-use outside +static mmove_t *GetLeaningSequence(edict_t *ent, vec3_t dest, vec3_t face, bbox_preset goal_bbox) +{ + mmove_t *curMove; + qboolean isLeaningLeft, isLeaningRight; + qboolean wasLeaningLeft, wasLeaningRight; + attacks_e curWeapon; + bbox_preset curBbox; + if (!ent || !ent->client || !ent->client->body || !(curMove=ent->client->body->GetMove())) + { + return NULL; + } + +// gi.dprintf("lean start..."); + + curBbox=curMove->bbox; + curWeapon = ent->client->body->GetRightHandWeapon(*ent); + isLeaningLeft = ent->viewside > 0.0 && ent->client->ps.kick_angles[ROLL] < -5.0; + isLeaningRight = ent->viewside < 0.0 && ent->client->ps.kick_angles[ROLL] > 5.0; + wasLeaningLeft = (curMove->bodyPosition==BODYPOS_PLAYERLEANLEFT); + wasLeaningRight = (curMove->bodyPosition==BODYPOS_PLAYERLEANRIGHT); + + if (curBbox == BBOX_PRESET_STAND) + { + if (isLeaningLeft && curBbox == goal_bbox)//leaning left + { + if (wasLeaningLeft) + { + if (!ent->client->body->IsAnimationFinished()&&!(curMove->actionFlags&ACTFLAG_LOOPANIM)) + { + return curMove; + } + else if (curWeapon == ATK_ROCKET) + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanlt_mid_l); + } + else + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanlt_mid_a); + } + } + else + { + if (curWeapon == ATK_ROCKET) + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanlt_to_l); + } + else + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanlt_to_a); + } + } + } + else if (isLeaningRight && curBbox == goal_bbox)//leaning right + { + if (wasLeaningRight) + { + if (!ent->client->body->IsAnimationFinished()&&!(curMove->actionFlags&ACTFLAG_LOOPANIM)) + { + return curMove; + } + else if (curWeapon == ATK_ROCKET) + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanrt_mid_l); + } + else + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanrt_mid_a); + } + } + else + { + if (curWeapon == ATK_ROCKET) + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanrt_to_l); + } + else + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanrt_to_a); + } + } + } + else + { + if (wasLeaningLeft) + { + if (curWeapon == ATK_ROCKET) + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanlt_frm_l); + } + else + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanlt_frm_a); + } + } + if (wasLeaningRight) + { + if (curWeapon == ATK_ROCKET) + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanrt_frm_l); + } + else + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanrt_frm_a); + } + } + } + } + + if (curBbox == BBOX_PRESET_CROUCH) + { + if (isLeaningLeft && curBbox == goal_bbox)//leaning left + { + if (wasLeaningLeft) + { + if (!ent->client->body->IsAnimationFinished()&&!(curMove->actionFlags&ACTFLAG_LOOPANIM)) + { + return curMove; + } + else if (curWeapon == ATK_ROCKET) + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanclt_mid_l); + } + else + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanclt_mid_a); + } + } + else + { + if (curWeapon == ATK_ROCKET) + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanclt_to_l); + } + else + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanclt_to_a); + } + } + } + else if (isLeaningRight && curBbox == goal_bbox)//leaning right + { + if (wasLeaningRight) + { + if (!ent->client->body->IsAnimationFinished()&&!(curMove->actionFlags&ACTFLAG_LOOPANIM)) + { + return curMove; + } + else if (curWeapon == ATK_ROCKET) + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleancrt_mid_l); + } + else + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleancrt_mid_a); + } + } + else + { + if (curWeapon == ATK_ROCKET) + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleancrt_to_l); + } + else + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleancrt_to_a); + } + } + } + else + { + if (wasLeaningLeft) + { + if (curWeapon == ATK_ROCKET) + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanclt_frm_l); + } + else + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleanclt_frm_a); + } + } + if (wasLeaningRight) + { + if (curWeapon == ATK_ROCKET) + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleancrt_frm_l); + } + else + { + return ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_playerleancrt_frm_a); + } + } + } + } + return NULL; +} + + +static bool PB_PrecachePlayer(char *playerName) +{ + char modname[100]; + + Com_sprintf(modname, 100, "%s.gpm", playerName); + + + IPlayerModelInfoC *aPlayer=gi.NewPlayerModelInfo(modname); + if (!aPlayer || !aPlayer->IsLoaded()) + { + //what player? + delete aPlayer; + return false; + } + + { + char portname[100]; + Com_sprintf(portname,100, "menus/players/%s.rmf",playerName); + TheGhoul->AddFileForDownLoad(portname); + Com_sprintf(portname,100, "ghoul/pmodels/%s.gpm",playerName); + TheGhoul->AddFileForDownLoad(portname); + Com_sprintf(portname,100, "ghoul/pmodels/portraits/%s.m32",playerName); + TheGhoul->AddFileForDownLoad(portname); + TeamInfoC team; + aPlayer->GetTeamInfo(team); + Com_sprintf(portname,100, "ghoul/pmodels/teamicons/%s.m32",team.name); + TheGhoul->AddFileForDownLoad(portname); + Com_sprintf(portname,100, "pics/menus/teamicons/%s.m32",team.name); + TheGhoul->AddFileForDownLoad(portname); + } + + ggObjC *MyGhoulObj; + ggOinstC* myInstance; + + Matrix4 mat,mat1,mat2; + + SkinInfoC tempSkin; + BoltOnInfoC tempBoltOn; + IPlayerModelInfoC *boltModel; + + edict_t *tempEnt=G_Spawn(); + body_c *tempBody=0; + //this is where the model info should be really gotten + int counter; + + //register stuff here. + + + //game-stuff: allocate appropriate body type + if (!stricmp(aPlayer->GetGameGHB(),"fem_play")) + { + tempBody=new bodyfemale_c(); + } + else + { + tempBody=new bodymeso_c(); + } + + //this creates (or finds, if it's there already) the ghoul object, registers the sequences we'll need + // and remembers which _poff file we'll need (to turn parts off when we create an inst) + + MyGhoulObj=game_ghoul.FindObject(aPlayer->GetGHBDir(),aPlayer->GetSeqGSQ(),false,modname,aPlayer->GetGameGHB()); + + //game-stuff: make sure the body we created is connected to ent + if(tempBody) + { + tempBody->SetOwner(tempEnt); + } + + //if creating (or finding) the object failed, we're screwed. + if (!MyGhoulObj) + { + gi.error("Couldn't find player model %s/%s.\n",aPlayer->GetGHBDir(),aPlayer->GetSeqGSQ()); + } + + //this could get complicated--what with the checking for repeat skins--so only try & register if it's not locked + if (!MyGhoulObj->IsRegistrationLocked()) + { + //game-stuff: register gorezone, cap and alternate face textures. + RegisterPlayerGameSkins(MyGhoulObj, aPlayer->GetFaceSet()); + + MyGhoulObj->RegisterSkin("b", "b_dm_armor"); + + //YEE-HA! check this code out! it makes skins not register twice. + //the story is i couldn't figure out how to make a multi-dimensional, dynamically-sized array, So i just make a big one-dimensional array and use different pieces of it as though they were separate arrays. yick. + if (aPlayer->GetNumSkins()>0) + { + int counter2; + char *skinnames=0; + char *matnames=0; + bool registerThisOne; + + skinnames = new char[aPlayer->GetNumSkins()*100]; + matnames = new char[aPlayer->GetNumSkins()*100]; + //make sure all the skins are registered before we go and create any instances + for (counter = 1; counter <= aPlayer->GetNumSkins(); counter++) + { + registerThisOne=true; + if (aPlayer->GetSkin(counter, tempSkin)) + { + for (counter2=0;counter2RegisterSkin(tempSkin.matName, tempSkin.skinName); + } + else + { + gi.dprintf("Narrowly avoiding re-register on mat \"%s\", skin \"%s\"\n", tempSkin.matName, tempSkin.skinName); + } + strcpy(&skinnames[(counter-1)*100],tempSkin.skinName); + strcpy(&matnames[(counter-1)*100],tempSkin.matName); + } + else + { + skinnames[(counter-1)*100]=0; + matnames[(counter-1)*100]=0; + //ERROR! + } + } + delete [] skinnames; + delete [] matnames; + skinnames=0; + matnames=0; + } + + //game_ghoul has this nice lock on it, so I don't have to worry about + //registering stuff after, say, an inst has been created and then destroyed + MyGhoulObj->RegistrationLock(); + } + + //make the ghoulInst + myInstance = game_ghoul.AddObjectInstance(MyGhoulObj, tempEnt); + + tempEnt->s.renderfx = RF_GHOUL; + + //don't bother setting bolt to quake_ground. + + //don't bother messing w/ the xform--never see this guy anyway. + + //game-stuff: if the body-creation failed, we're screwed + if (!tempBody) + { + delete aPlayer; + G_FreeEdict(tempEnt); + return false; + } + + + //don't bother toggling extra parts from file + + //don't bother setting skins from file + + //don't bother remembering which set of faces to use + + //cache all the bolt stuff from file + for (counter = aPlayer->GetNumBoltOns(); counter>0; counter--) + { + if (aPlayer->GetBoltOn(counter, tempBoltOn)&&(boltModel=gi.NewPlayerModelInfo(tempBoltOn.childModelInfo))) + { + { + char portname[100]; + Com_sprintf(portname,100, "ghoul/pmodels/%s",tempBoltOn.childModelInfo); + TheGhoul->AddFileForDownLoad(portname); + } + if (boltModel->IsLoaded()&&boltModel->GetGameGHB()[0]) + { + boltModel->GetSkin(1, tempSkin); + tempBody->AddBoltedItem(*tempEnt, tempBoltOn.parentBolt, boltModel->GetGHBDir(), boltModel->GetGameGHB(), tempBoltOn.childBolt, myInstance, tempSkin.skinName, tempBoltOn.scale); + } + else + { + //couldn't load bolt-on info file! + } + delete boltModel; + boltModel=NULL; + } + else + { + //ERROR! + } + } + + //game-stuff: add voice stuff + VoiceInfoC tempVoiceInfo; + aPlayer->GetVoiceInfo(tempVoiceInfo); + tempBody->SetVoiceDirectories(*tempEnt, "", 1, DEATHVOICE_PLAYER, tempVoiceInfo.voiceDir); + + tempBody->SetRootBolt(*tempEnt); + + myInstance->GetInstPtr()->SetUserData(tempEnt); + + delete aPlayer; + delete tempBody; + G_FreeEdict(tempEnt); + + return true; +} + +////////////////////////////////////////////////////////////////////// +// Crazily-exported-to-player.dll functions +////////////////////////////////////////////////////////////////////// + +void ShowReload(edict_t *ent) +{ + vec3_t dest, face; + + if (!ent) + { + return; + } + + VectorCopy(ent->velocity, dest); + VectorAdd(dest, ent->s.origin, dest); + AngleVectors(ent->client->ps.viewangles, face, NULL, NULL); + VectorMA(ent->s.origin, 100, face, face); + + PB_PlaySequenceForReload(ent, dest, face); +} + +void ShowItemUse(edict_t *ent, int itemType) +{ + vec3_t dest, face; + + if (!ent) + { + return; + } + + VectorCopy(ent->velocity, dest); + VectorAdd(dest, ent->s.origin, dest); + AngleVectors(ent->client->ps.viewangles, face, NULL, NULL); + VectorMA(ent->s.origin, 100, face, face); + + PB_PlaySequenceForItemUse(ent, dest, face, itemType); +} + +////////////////////////////////////////////////////////////////////// +// Public-use functions +////////////////////////////////////////////////////////////////////// + +void FreeEdictBoltData(edict_t *ed); + +static char defModName[100]; + +void PB_PrecacheAllPlayerModels(void) +{ + defModName[0]=0; + + if (!THIRDPERSON_HACK && (!dm || !dm->isDM())) + { // only see players in deathmatch or for crazy 3rd person camera hack + return; + } + + int i,length; + char *buffer,*s; + + // No pmodel list file specified so just return. + + if(!sv_pmodlistfile->string[0]) + { + gi.error("*************************\nNo pmodel file specified!\n*************************\n"); + + return; + } + + // Ok, try to load the maplist file. + + if((length=gi.FS_LoadFile(va("%s.gpl",sv_pmodlistfile->string),(void **)&buffer))==-1) + { + gi.error("*************************\nCould not open %s.gpl\n*************************\n", + sv_pmodlistfile->string); + + return; + } + + s=buffer; + i=0; + + // Loop through and validate map names, adding valid map names to string in sv_maplist. + + while(s) + { + char shortname[100]; + + strcpy(shortname,COM_Parse(&s)); + + if(strlen(shortname)) + { + if (PB_PrecachePlayer(shortname)&&!defModName[0]) + { + Com_sprintf(defModName, sizeof(defModName), "%s.gpm", shortname); + } + } + } + + // Clean up... + gi.FS_FreeFile(buffer); + + // Now do the alt model list (no worries if we can't find or load it, it's optional)... + + //if the cvar isn't even set, don't worry about it. + if(sv_altpmodlistfile->string[0]) + { + // Ok, try to load the maplist file. + + if((length=gi.FS_LoadFile(va("%s.gpl",sv_altpmodlistfile->string),(void **)&buffer))!=-1) + { + s=buffer; + i=0; + + // Loop through and validate map names, adding valid map names to string in sv_maplist. + + while(s) + { + char shortname[100]; + + strcpy(shortname,COM_Parse(&s)); + + if(strlen(shortname)) + { + if (PB_PrecachePlayer(shortname)&&!defModName[0]) + { + Com_sprintf(defModName, sizeof(defModName), "%s.gpm", shortname); + } + } + } + + // Clean up... + gi.FS_FreeFile(buffer); + } + } + + //eh? no default player? + if (!defModName[0]&&PB_PrecachePlayer("mullins")) + { + strcpy(defModName, "mullins.gpm"); + } +} + + +#define PLAYER_CORPSE_FADE 1.0F + + +void PB_FadeCorpse(edict_t *ent) +{ + IGhoulInst *inst=ent->ghoulInst; + + // See if already fading + if (ent->s.effects & EF_FADE) + { + if (FXA_CheckFade(ent)) + { // Remove that sucker + gi.unlinkentity (ent); + + if (inst) + game_ghoul.RemoveObjectInstances(ent); + + // FIXME: Will probably need to do some more work here... i.e. falling bodies. + + gi.unlinkentity (ent); + ent->s.renderfx=0; + ent->solid=SOLID_NOT; +// ent->owner=g_edicts; + ent->movetype=MOVETYPE_NONE; + ent->takedamage=DAMAGE_NO; + ent->think=NULL; + + gi.linkentity(ent); + + return; + } + else + { // Wait a tiny bit more + ent->nextthink=level.time+0.1F; + + return; + } + } + + // Else set the corpse up to fade. + if(inst) + { + FXA_SetFadeOut(ent, PLAYER_CORPSE_FADE); // Three second fade out time. + + // Come back when we are done fading. + ent->nextthink=level.time+PLAYER_CORPSE_FADE+0.1; + } + else + { // No way to fade, just remove. + + // FIXME: Will probably need to do some more work here... i.e. falling bodies. + + gi.unlinkentity (ent); + ent->s.renderfx=0; + ent->solid=SOLID_NOT; +// ent->owner=g_edicts; + ent->movetype=MOVETYPE_NONE; + ent->takedamage=DAMAGE_NO; + ent->think=NULL; + + gi.linkentity(ent); + } + + return; +} + +/* +void CorpseTrackPostion(edict_t *ent) +{ + if (level.time-ai_corpselife->value > ent->gib_health) + { + ent->think = PB_FadeCorpse; + } + ent->nextthink=level.time+0.1; + if (level.time-ai_corpselife->value*0.1 < ent->gib_health) + { + gi.dprintf("corpse at: %s\n",vtos(ent->s.origin)); + } +} +*/ + +/* +void PB_MakeCorpse (edict_t *ent) +{ + edict_t *body; + ggObjC *parentObj; + + // grab a body que and cycle to the next one + body = &g_edicts[(int)maxclients->value + level.body_que + 1]; + level.body_que = (level.body_que + 1) % BODY_QUEUE_SIZE; + + // FIXME: send an effect on the removed body + + BodyPreUse(ent); + + gi.unlinkentity (ent); + + // kef -- just before we get rid of this joker's body, free any + //knives that are stuck in him. + if (ent && ent->client && ent->client->body) + { + ent->client->body->FreeKnives(*ent); + } + + game_ghoul.RemoveObjectInstances(body); + + gi.unlinkentity (body); + VectorCopy(ent->s.angles, body->s.angles); + body->s.angles[PITCH]=0; + VectorCopy(ent->s.origin, body->s.origin); + body->s.renderfx=ent->s.renderfx; + body->s.number = body - g_edicts; + + //safe, slow way of doing corpseInsts + +// if (ent->ghoulInst && (parentObj=game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()))) +// { +// //HEY!!!! this isn't enough! no bolt-ons, and won't work if client's death anim doesn't end in prone-ish position!!!! +// ggOinstC *newInst=parentObj->CloneInstance(body, ent->ghoulInst); +// ggOinstC *oldInst=parentObj->FindOInst(ent->ghoulInst); +// +// if (newInst&&oldInst) +// { +// oldInst->CopyBoltsTo(newInst); +// } +// } + + + //dangerous, fast way of doing corpse ghoulInsts + if (ent->ghoulInst && (parentObj=game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()))) + { + ggOinstC *oldInst=parentObj->FindOInst(ent->ghoulInst); + if (oldInst) + { + oldInst->ChangeOwnerTo(body); + } + } + + //fast ghoul lighting +// body->s.renderfx |= RF_LIGHT_FASTEST; + + body->svflags = ent->svflags; + VectorCopy (ent->mins, body->mins); + VectorCopy (ent->maxs, body->maxs); + VectorCopy (ent->absmin, body->absmin); + VectorCopy (ent->absmax, body->absmax); + VectorCopy (ent->size, body->size); + body->solid = ent->solid; + body->clipmask = ent->clipmask; + body->owner = ent->owner; + body->movetype = ent->movetype; + body->think = PB_FadeCorpse; + body->nextthink=level.time+ai_corpselife->value; + +// body->think = CorpseTrackPostion; +// body->nextthink=level.time+0.1; +// body->gib_health=level.time; + + body->takedamage = DAMAGE_YES; + + gi.linkentity (body); + + BodyPostUse(ent); +} +*/ + +//working on getting player corpses to use ai--may ditch this attempt as too much work/complexity for too little payoff +void DoNothing(edict_t *ent) +{ + ent->nextthink=level.time+0.1F; +} +/* + +//ai-using corpses--if this worked, we'd be usin' it! +void PB_MakeCorpse (edict_t *ent) +{ + edict_t *body; +// ggObjC *parentObj; + + // grab a body que and cycle to the next one + body = &g_edicts[(int)maxclients->value + level.body_que + 1]; + level.body_que = (level.body_que + 1) % BODY_QUEUE_SIZE; + + // FIXME: send an effect on the removed body + + BodyPreUse(ent); + + gi.unlinkentity (ent); + + gi.unlinkentity (body); + +// body->owner = ent->owner; + body->owner = ent; + + if (body->ai) + { + body->ai.Destroy(); + body->ai=NULL; + } + + ent->mass=1000; + + + body->svflags = ent->svflags; + VectorCopy (ent->mins, body->mins); + VectorCopy (ent->maxs, body->maxs); + + VectorCopy (ent->absmin, body->absmin); + VectorCopy (ent->absmax, body->absmax); + VectorCopy (ent->size, body->size); + VectorCopy (ent->s.origin, body->s.origin); + VectorCopy(ent->s.angles, body->s.angles); + body->s.angles[PITCH]=0; + body->s.renderfx=ent->s.renderfx; + body->s.number = body - g_edicts; + +// body->solid = ent->solid; +// body->clipmask = ent->clipmask; +// body->movetype = ent->movetype; + body->solid = SOLID_BBOX; + body->clipmask = CONTENTS_DEADMONSTER; + body->movetype = MOVETYPE_STEP; + +// body->think = PB_FadeCorpse; + body->think = DoNothing; + body->nextthink=level.time+0.1F; + + body->takedamage = DAMAGE_YES; + + body->ai = ai_c::Create(AI_PLAYERCORPSE, body, "", ""); + + gi.linkentity (body); + + BodyPostUse(ent); +} +*/ +//non-ai-usin corpses--this'll be slowly converted to use ai, hopefully +void PB_MakeCorpse (edict_t *ent) +{ + edict_t *body; + + // grab a body que and cycle to the next one + body = &g_edicts[(int)maxclients->value + level.body_que + 1]; + level.body_que = (level.body_que + 1) % BODY_QUEUE_SIZE; + + // FIXME: send an effect on the removed body + + BodyPreUse(ent); + + gi.unlinkentity (ent); + + // kef -- just before we get rid of this joker's body, free any + //knives that are stuck in him. + if (ent && ent->client && ent->client->body) + { + ent->client->body->FreeKnives(*ent); + } + + // if this edict is a complex model of some sort we need to get rid of its + //bolton-related info + //eh, copied from freeedict, just in case -- sfs + FreeEdictBoltData(body); + + game_ghoul.RemoveObjectInstances(body); + + if (body->ai) + { + body->ai.Destroy(); + } + + gi.unlinkentity (body); + VectorCopy(ent->s.angles, body->s.angles); + body->s.angles[PITCH]=0; + VectorCopy(ent->s.origin, body->s.origin); + body->s.renderfx=ent->s.renderfx; + body->s.number = body - g_edicts; + + //fast ghoul lighting +// body->s.renderfx |= RF_LIGHT_FASTEST; + + body->svflags = ent->svflags; + VectorCopy (ent->mins, body->mins); + VectorCopy (ent->maxs, body->maxs); + VectorCopy (ent->absmin, body->absmin); + VectorCopy (ent->absmax, body->absmax); + VectorCopy (ent->size, body->size); + body->solid = ent->solid; + body->clipmask = ent->clipmask; + body->owner = ent->owner; + body->movetype = ent->movetype; + body->think = PB_FadeCorpse; + body->nextthink=level.time+ai_corpselife->value; + + body->takedamage = DAMAGE_YES; + + body->owner = ent; + body->think = DoNothing; + body->nextthink=level.time+0.1F; + body->ai = ai_c::Create(AI_PLAYERCORPSE, body, "", ""); + + + // If the player was burning, burn the new body too... + if (ent->burntime > level.time + 1.2) + { + if(body->ghoulInst) + { + fxRunner.exec("environ/onfireburst", body, 0); + } + + body->burntime = level.time + 4.0; + body->burninflictor = ent->burninflictor; + } + + // If the player was phosburning, continue the phosburn. + if (ent->phosburntime > level.time + 0.5) + { + if(body->ghoulInst) + { + fxRunner.exec("weapons/world/phosburn", body, 0); + } + + body->burntime = level.time + 2.0; + body->burninflictor = ent->burninflictor; + } + + gi.linkentity (body); + + BodyPostUse(ent); +} + + +void PB_GhoulUpdate(edict_t &ent) +{ + Matrix4 m; + +//normally goes by origin, which doesn't (i don't think) change, so we're all good + if (ent.ghoulInst) + { + ent.ghoulInst->ServerUpdate(level.time); + } + + //this one's only for the third-person camera hack thingy--view goes up & down for crouching +#ifdef __PLAYERTEST_3DPERSON + if (ent.client && ent.client->ps.bod && !ent.ghoulInst) + { + ent.ghoulInst=ent.client->ps.bod; + ent.ghoulInst->ServerUpdate(level.time); + ent.ghoulInst->GetXForm(m); + if (ent.client&&ent.client->ps.pmove.pm_flags & PMF_DUCKED) + { + if (m[3][2]<-26.0) + { + m[3][2]=-24.0f; + ent.ghoulInst->SetXForm(m); + } + } + else + { + if (m[3][2]>-26.0) + { + m[3][2]=-32.0f; + ent.ghoulInst->SetXForm(m); + } + } + ent.ghoulInst=NULL; + } +#endif +} + +void PB_KillBody(edict_t &ent) +{ + if(ent.client->body) + { + delete ent.client->body; + } + +#ifdef __PLAYERTEST_3DPERSON + if (ent.client && ent.client->ps.bod && !ent.ghoulInst) + { + ent.ghoulInst=ent.client->ps.bod; + } +#endif + + ent.client->ps.bod=NULL; + + game_ghoul.RemoveObjectInstances(&ent); + + ent.client->body=NULL; + + ent.s.renderfx &= ~(RF_GHOUL); +} + +void PB_GetActualSkinName(edict_t *ent, char *putSkinHere) +{ + if (!THIRDPERSON_HACK && !dm->isDM()) + { // only see players in deathmatch or for crazy 3rd person camera hack + strcpy(putSkinHere, "mullins"); + return; + } + if (ent && ent->client && ent->client->body && BodyPreUse(ent)) + { + if (ent->ghoulInst) + { + ggObjC *myGhoulObj=game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + if (myGhoulObj) + { + char modname[100]; + int i; + + Com_sprintf(modname, 100, "%s", myGhoulObj->GetSkinName()); + for (i=0;modname[i]!=0 && modname[i]!='.' && i < 100;i++); + modname[i]=0; + + strcpy(putSkinHere, modname); + return; + } + } + BodyPostUse(ent); + } + + strcpy(putSkinHere, "mullins"); +} + +void PB_GetActualTeamName(edict_t *ent, char *putTeamHere) +{ + if (!THIRDPERSON_HACK && !dm->isDM()) + { // only see players in deathmatch or for crazy 3rd person camera hack + strcpy(putTeamHere, "mullins"); + return; + } + if (ent && ent->client && ent->client->body && BodyPreUse(ent)) + { + if (ent->ghoulInst) + { + ggObjC *myGhoulObj=game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + if (myGhoulObj) + { + char modname[100]; + IPlayerModelInfoC *myModel; + + Com_sprintf(modname, 100, "%s", myGhoulObj->GetSkinName()); + + myModel=gi.NewPlayerModelInfo(modname); + + if (myModel && myModel->IsLoaded()) + { + TeamInfoC tteam; + myModel->GetTeamInfo(tteam); + + //a real team: return it + if (stricmp(tteam.name, "Noteam")) + { + strcpy(putTeamHere, tteam.name); + } + //not a real team: return the skin + else + { + int i; + + Com_sprintf(modname, 100, "%s", myGhoulObj->GetSkinName()); + for (i=0;modname[i]!=0 && modname[i]!='.' && i < 100;i++); + modname[i]=0; + + strcpy(putTeamHere, modname); + } + + delete myModel; + return; + } + delete myModel; + myModel=NULL; + } + } + BodyPostUse(ent); + } + + strcpy(putTeamHere, "mullins"); +} + +bool PB_InitBody(edict_t &ent,char *userinfo) +{ + int i; + char meatSound[100]; + bool usingDesiredPMod=true; + + bool b_checkOldStrings=false; + + //fixme: i don't think these are called in dm--the caching should reflect that. + { + for (i=1;i<=3;i++) + { + Com_sprintf(meatSound, sizeof(meatSound), "impact/gore/impact%d.wav", i); + gi.soundindex(meatSound); + } + for (i=1;i<=4;i++) + { + Com_sprintf(meatSound, sizeof(meatSound), "impact/player/hit%d.wav", i); + gi.soundindex(meatSound); + } + gi.soundindex("impact/player/armor.wav"); + gi.soundindex("impact/gore/sizzle.wav"); + } + + if (THIRDPERSON_HACK || dm->isDM()) + { + if (ent.client && ent.client->body) + { + b_checkOldStrings=true; + } + } + + PB_KillBody(ent); + + if (!THIRDPERSON_HACK && !dm->isDM()) + { // only see players in deathmatch or for crazy 3rd person camera hack + return false; + } + + ggObjC *MyGhoulObj; + char modname[100]; + + ggOinstC* myInstance=0; + + Matrix4 mat,mat1,mat2; + + SkinInfoC tempSkin; + BoltOnInfoC tempBoltOn; + IPlayerModelInfoC *boltModel; + + IPlayerModelInfoC *myModel; + bool hasArmor=false; + + if (ent.client && ent.client->inv) + { + hasArmor=(ent.client->inv->getArmorCount()>0); + } + + Com_sprintf(modname, 100, "%s.gpm", Info_ValueForKey (userinfo, "skin")); + + if ((!modname || !(myModel=gi.NewPlayerModelInfo(modname)) || !myModel->IsLoaded())&&defModName[0]) + { + //couldn't find the model file, or it's bad: load up the default guy + if (!defModName[0]) + { + gi.error("No default player model.\n"); + } + strcpy(modname, defModName); + myModel->Init(defModName); + usingDesiredPMod=false; + } + + //this is where the model info should be really gotten + if (myModel) + { + int counter; + + //register stuff, and set up instance here. + + + //game-stuff: allocate appropriate body type + if (!stricmp(myModel->GetGameGHB(),"fem_play")) + { + ent.client->body=new bodyfemale_c(); + } + else + { + ent.client->body=new bodymeso_c(); + } + + //this creates (or finds, if it's there already) the ghoul object, registers the sequences we'll need + // and remembers which _poff file we'll need (to turn parts off when we create an inst) + + MyGhoulObj=game_ghoul.FindObject(myModel->GetGHBDir(),myModel->GetSeqGSQ(),false,modname,myModel->GetGameGHB(),true); + + //if finding the object failed, we're screwed. + if (!MyGhoulObj&&usingDesiredPMod) + { + usingDesiredPMod=false; + + //try falling back to mullins + if (!defModName[0]) + { + gi.error("No default player model.\n"); + } + + strcpy(modname, defModName); + myModel->Init(defModName); + if (!myModel) + { + gi.error("Couldn't find default player model info.\n"); + } + + delete ent.client->body; + ent.client->body=new bodymeso_c(); + + //this creates (or finds, if it's there already) the ghoul object, registers the sequences we'll need + // and remembers which _poff file we'll need (to turn parts off when we create an inst) + + MyGhoulObj=game_ghoul.FindObject(myModel->GetGHBDir(),myModel->GetSeqGSQ(),false,modname,myModel->GetGameGHB(),true); + if (!MyGhoulObj) + { + gi.error("Couldn't set up default player model.\n"); + } + } + + //game-stuff: make sure the body we created is connected to ent + if(ent.client->body) + { + ent.client->body->SetOwner(&ent); + } + + //took the registration out of here--it's done in level precaching. + + //make the ghoulInst + myInstance = game_ghoul.AddObjectInstance(MyGhoulObj, &ent); + + ent.s.renderfx = RF_GHOUL; + + //game-stuff: we bolt players to the quake_ground, so we don't have to fiddle with their bboxes + //actually, this might be a good idea for menus too + ent.ghoulInst->SetMyBolt("quake_ground"); + + //i think x and y are switched between max and sof; anyway, i need to rotate guys like this, or they'll face to the side + ent.ghoulInst->GetXForm(mat); + mat1.Identity(); + mat2=mat; + mat1.Rotate(2,-M_PI*0.5); + mat.Concat(mat1, mat2); + + //adjust for quake_ground--it's at the guy's feet, so we gotta pop im back up + mat[3][2]=-24.0f; + + ent.ghoulInst->SetXForm(mat); + + //game-stuff: if the body-creation failed, we're screwed + if (!ent.client->body) + { + delete myModel; + return false; + } + + + //toggle extra parts from file + ExtraPartToggleInfoC tempPartToggle; + for (counter = myModel->GetNumPartToggles(); counter>0; counter--) + { + if (myModel->GetPartToggle(counter, tempPartToggle)) + { + ent.ghoulInst->SetPartOnOff(tempPartToggle.partName, tempPartToggle.partState); + } + else + { + //ERROR! + } + } + + //set skins from file + for (counter = myModel->GetNumSkins(); counter>0; counter--) + { + if (myModel->GetSkin(counter, tempSkin)) + { + if (tempSkin.partName[0]) + { + //set skin for specific part--doesn't go through body, but does the same thing the body would do anyway. + ent.ghoulInst->SetFrameOverride(tempSkin.matName, tempSkin.skinName, tempSkin.partName); + } + else + { + ent.client->body->ApplySkin(ent, myInstance, tempSkin.matName, tempSkin.skinName); + } + } + else + { + //ERROR! + } + } + + //now set armor (this should prolly be moved elsewhere + if (hasArmor) + { + //female stuff + ent.ghoulInst->SetPartOnOff("_tightchest", 0); + //meso stuff + ent.ghoulInst->SetPartOnOff("_bosschest", 0); + ent.ghoulInst->SetPartOnOff("_maskchest", 0); + ent.ghoulInst->SetPartOnOff("_bulkychest", 0); + ent.ghoulInst->SetPartOnOff("_chest_b_t", 0); + ent.ghoulInst->SetPartOnOff("_armorchest", 1); + + if (ent.ghoulInst->GetPartOnOff("_bosships")) + { + ent.ghoulInst->SetPartOnOff("_CAP_CHEST_HIPS_BULKY", 1); + ent.ghoulInst->SetPartOnOff("_CAP_HIPS_CHEST_BOSS", 1); + } + if (ent.ghoulInst->GetPartOnOff("_tighthips")) + { + ent.ghoulInst->SetPartOnOff("_CAP_CHEST_HIPS_BULKY", 1); + } + //stuff fer everybody + ent.ghoulInst->SetPartOnOff("_armorchest", 1); + ent.ghoulInst->SetFrameOverride("b", "b_dm_armor", "_armorchest"); + } + + //game-stuff: remember which set of faces to use + ent.client->body->SetFace(ent,myModel->GetFaceSet()); + + + //bolt on stuff from file + for (counter = myModel->GetNumBoltOns(); counter>0; counter--) + { + if (myModel->GetBoltOn(counter, tempBoltOn)&&(boltModel=gi.NewPlayerModelInfo(tempBoltOn.childModelInfo))) + { + if (boltModel->IsLoaded()&&boltModel->GetGameGHB()[0]) + { + boltModel->GetSkin(1, tempSkin); + ent.client->body->AddBoltedItem(ent, tempBoltOn.parentBolt, boltModel->GetGHBDir(), boltModel->GetGameGHB(), tempBoltOn.childBolt, myInstance, tempSkin.skinName, tempBoltOn.scale); + } + else + { + //couldn't load bolt-on info file! + } + delete boltModel; + boltModel=NULL; + } + else + { + //ERROR! + } + } + + //game-stuff: add voice stuff + VoiceInfoC tempVoiceInfo; + myModel->GetVoiceInfo(tempVoiceInfo); + ent.client->body->SetVoiceDirectories(ent, "", 1, DEATHVOICE_PLAYER, tempVoiceInfo.voiceDir); + + //make sure the specified teamname is right, too + TeamInfoC tteam; + myModel->GetTeamInfo(tteam); + usingDesiredPMod = usingDesiredPMod && !stricmp(tteam.name,Info_ValueForKey (userinfo, "teamname")); + } + + delete myModel; + + //game-stuff: this sets up a lot of stuff for the body + ent.client->body->SetRootBolt(ent); + + //clients seem to be immune to their own ghoulinsts, so i made it worse than it is. so there. --ss + BodyPostUse(&ent); + ent.client->ps.bod=myInstance->GetInstPtr(); + myInstance->GetInstPtr()->SetUserData(&ent); + + if (b_checkOldStrings) + { + //not really desired model, but everyone should know about it already + if (!stricmp(ent.client->oldSkinRequest, Info_ValueForKey (userinfo, "skin")) + &&!stricmp(ent.client->oldTeamnameRequest, Info_ValueForKey (userinfo, "teamname")) + &&!strcmp(ent.client->oldNetName, ent.client->pers.netname)) + { + usingDesiredPMod=true; + } + //this may be what we want, but make sure everybody knows, because info has changed + else + { + usingDesiredPMod=false; + } + } + //didn't have a body at all before--make sure new info gets sent around + else + { + usingDesiredPMod=false; + } + + if (ent.health <= 0) + { + ent.client->body->SetAnimation(ent, &generic_move_death_lbshotdeath); + } + else + // now add a ctf flag to the player if we need to + if (deathmatch->value == DM_CTF) + { + if (ent.ctf_flags == TEAM1) + { + PB_AddFlag(&ent, "ctf_flag_blue", "flag_hold_idle"); + } + else + if (ent.ctf_flags == TEAM2) + { + PB_AddFlag(&ent, "ctf_flag_red", "flag_hold_idle"); + } + } + + Com_sprintf(ent.client->oldNetName, sizeof(ent.client->oldNetName), "%s", ent.client->pers.netname); + Com_sprintf(ent.client->oldSkinRequest, sizeof(ent.client->oldSkinRequest), "%s", Info_ValueForKey (userinfo, "skin")); + Com_sprintf(ent.client->oldTeamnameRequest, sizeof(ent.client->oldTeamnameRequest), "%s", Info_ValueForKey (userinfo, "teamname")); + return usingDesiredPMod; +} + + + +void PB_PlaySequenceForGesture(edict_t *ent, int gestNum) +{ + if (!THIRDPERSON_HACK && !dm->isDM()) + { // only see players in deathmatch or for crazy 3rd person camera hack + return; + } + + bbox_preset goal_bbox=GetGoalBBox(ent); + + if (ent && ent->client && ent->client->body && BodyPreUse(ent)) + { + mmove_t *painanim=NULL; + mmove_t *idealanim=NULL; + switch(gestNum) + { + default: + gi.cprintf (ent, PRINT_HIGH, "Unrecognized wave value: %d, trying to play 'go'.\n", gestNum); + case 1: + idealanim=&generic_move_playersignal_go; + break; + case 2: + idealanim=&generic_move_playersignal_stop; + break; + case 3: + idealanim=&generic_move_playersignal_taunt; + break; + case 4: + if (ent->client->body->IsAvailableSequence(*ent, &generic_move_touchnuts)) + { + idealanim=&generic_move_touchnuts; + } + else + { + idealanim=&generic_move_pentium_dance; + } + break; + } + assert(idealanim); + + if (!painanim) + { + painanim=ent->client->body->GetSequenceForStand(*ent, vec3_origin, vec3_origin, ACTSUB_NORMAL, goal_bbox, idealanim); + } + + if (painanim) + { + SetAnimSpeed(ent, ent->s.origin, painanim); + ent->client->body->SetAnimation(*ent, painanim); + } + BodyPostUse(ent); + } +} + +static int curPlayerDeath; + +void PB_PlaySequenceForDeath(edict_t *ent, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags) +{ + if (!THIRDPERSON_HACK && !dm->isDM()) + { // only see players in deathmatch or for crazy 3rd person camera hack + return; + } + + bbox_preset goal_bbox=GetGoalBBox(ent); + + if (ent && ent->client && ent->client->body && BodyPreUse(ent)) + { + mmove_t *painanim; + +// while (1) +// { +// curPlayerDeath++; +// if (curPlayerDeath > MMOVE_HUMAN_SIZE-1 || curPlayerDeath < 0) +// { +// curPlayerDeath = 0; +// } +// if (MMoves[curPlayerDeath].suggested_action == ACTCODE_DEATH && ent->client->body->IsAvailableSequence(*ent, &MMoves[curPlayerDeath])) +// break; +// } + +// if (painanim=ent->client->body->GetSequenceForDeath(*ent, inflictor, attacker, damage, point, dflags, goal_bbox, &MMoves[curPlayerDeath])) + if (painanim=ent->client->body->GetSequenceForDeath(*ent, inflictor, attacker, damage, point, dflags, goal_bbox)) + { + SetAnimSpeed(ent, ent->s.origin, painanim); + if (painanim && painanim->suggested_action != ACTCODE_DEATH) + { + gi.dprintf("Death action %s not really a death!\n", painanim->ghoulSeqName); + } +/* + if (painanim != &MMoves[curPlayerDeath]) + { + gi.dprintf("Death action %s doesn't work--using %s!\n", MMoves[curPlayerDeath].ghoulSeqName, painanim->ghoulSeqName); + } + else + { + gi.dprintf("All clear for death action %s!\n", painanim->ghoulSeqName); + } +*/ + ent->client->body->SetAnimation(*ent, painanim); + } + BodyPostUse(ent); + } +} + +void PB_PlaySequenceForPain(edict_t *ent, vec3_t point, vec3_t dest, vec3_t face) +{ + if (!THIRDPERSON_HACK && !dm->isDM()) + { // only see players in deathmatch or for crazy 3rd person camera hack + return; + } + + bbox_preset goal_bbox=GetGoalBBox(ent); + + //eek! first pass at player body! + if (ent && ent->client && ent->client->body && ent->health>0 && BodyPreUse(ent)) + { + mmove_t *painanim; + if (painanim=ent->client->body->GetSequenceForPain(*ent, point, 1.0f /*kick*/, 1 /*damage*/, dest, face, ACTSUB_NORMAL, goal_bbox)) + { + SetAnimSpeed(ent, dest, painanim); + ent->client->body->ForceAnimation(*ent, painanim); + } + BodyPostUse(ent); + } +} + +void PB_PlaySequenceForMovement(edict_t *ent, vec3_t dest, vec3_t face, vec3_t org, vec3_t ang) +{ + if (!THIRDPERSON_HACK && !dm->isDM()) + { // only see players in deathmatch or for crazy 3rd person camera hack + return; + } + +// gi.dprintf("looking for move...\n"); + bbox_preset goal_bbox=GetGoalBBox(ent); + + AdjustDestForSpeed(ent, dest); + + if (ent && ent->client && ent->client->body && + (!ent->client->body->GetMove() || !(!ent->client->body->IsAnimationFinished()&&ent->client->body->GetMove()->actionFlags&ACTFLAG_FULLANIM)) && + ent->health>0 && BodyPreUse(ent)) + { + mmove_t *painanim; + if (!(painanim=GetLeaningSequence(ent, dest, face, goal_bbox))) + { + painanim=ent->client->body->GetSequenceForMovement(*ent, dest, face, org, ang, ACTSUB_NORMAL, goal_bbox); + } + if (painanim) + { + SetAnimSpeed(ent, dest, painanim); + if (painanim==ent->client->body->GetMove()&&ent->client->body->IsAnimationFinished()&&!(ent->client->body->GetMove()->actionFlags&ACTFLAG_LOOPANIM)) + { + ent->client->body->ForceAnimation(*ent, painanim); + } + else + { +// gi.dprintf("setting anim %s; old anim %s\n",painanim->ghoulSeqName,ent->client->body->GetMove()->ghoulSeqName); + ent->client->body->SetAnimation(*ent, painanim); + } + } + BodyPostUse(ent); + } +} + +void PB_PlaySequenceForStand(edict_t *ent, vec3_t dest, vec3_t face) +{ + if (!THIRDPERSON_HACK && !dm->isDM()) + { // only see players in deathmatch or for crazy 3rd person camera hack + return; + } + +// gi.dprintf("looking for stand...\n"); + bbox_preset goal_bbox=GetGoalBBox(ent); + + if (ent && ent->client && ent->client->body && + (!ent->client->body->GetMove() || !(!ent->client->body->IsAnimationFinished()&&ent->client->body->GetMove()->actionFlags&ACTFLAG_FULLANIM)) && + ent->health>0 && BodyPreUse(ent)) + { + mmove_t *painanim; + + if (!(painanim=GetLeaningSequence(ent, dest, face, goal_bbox))) + { + painanim=ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox); + } + + if (painanim) + { +// gi.dprintf("gonna play %s!\n", painanim->ghoulSeqName); + + //oh shit! i'm floppin around! stand up now! + if (painanim==&generic_move_death_lbshotdeath && ent->health > 0) + { +// gi.dprintf("hup!\n"); + painanim=&generic_move_alert_p; + } + + SetAnimSpeed(ent, dest, painanim); + if (painanim==ent->client->body->GetMove()&&ent->client->body->IsAnimationFinished()) + { + ent->client->body->ForceAnimation(*ent, painanim); + } + else + { +// gi.dprintf("setting anim %s; old anim %s\n",painanim->ghoulSeqName,ent->client->body->GetMove()->ghoulSeqName); + ent->client->body->SetAnimation(*ent, painanim); + } + } + BodyPostUse(ent); + } +} + +void PB_PlaySequenceForReload(edict_t *ent, vec3_t dest, vec3_t face) +{ + if (!THIRDPERSON_HACK && !dm->isDM()) + { // only see players in deathmatch or for crazy 3rd person camera hack + return; + } + +// gi.dprintf("looking for reload...\n"); + bbox_preset goal_bbox=GetGoalBBox(ent); + + AdjustDestForSpeed(ent, dest); + + if (ent && ent->client && ent->client->body && + ent->health>0 && /*goal_bbox == BBOX_PRESET_STAND &&*/ BodyPreUse(ent)) + { + mmove_t *painanim; + if (painanim=ent->client->body->GetSequenceForReload(*ent, dest, face, ACTSUB_NORMAL, goal_bbox)) + { + SetAnimSpeed(ent, dest, painanim); + ent->client->body->SetAnimation(*ent, painanim); + } + BodyPostUse(ent); + } +} + +void PB_PlaySequenceForItemUse(edict_t *ent, vec3_t dest, vec3_t face, int itemType) +{ + if (!THIRDPERSON_HACK && !dm->isDM()) + { // only see players in deathmatch or for crazy 3rd person camera hack + return; + } + +// gi.dprintf("looking for reload...\n"); + bbox_preset goal_bbox=GetGoalBBox(ent); + + AdjustDestForSpeed(ent, dest); + + if (ent && ent->client && ent->client->body && + ent->health>0 && goal_bbox == BBOX_PRESET_STAND && BodyPreUse(ent)) + { + mmove_t *painanim; + mmove_t *desiredanim=NULL; + switch (itemType) + { + case SFE_FLASHPACK: + desiredanim=&generic_move_throwitem_player; + break; +// case SFE_NEURAL_GRENADE: +// desiredanim=&generic_move_throwitem_player; + break; + case SFE_C4: + desiredanim=&generic_move_throwitem_player; + break; + case SFE_CLAYMORE: + desiredanim=&generic_move_throwitem_player; + break; + case SFE_GRENADE: + desiredanim=&generic_move_throwitem_player; + break; + case SFE_MEDKIT: + case SFE_LIGHT_GOGGLES: + case SFE_EMPTYSLOT: + default: + break; + } + if (desiredanim) + { + if (painanim=ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, desiredanim)) + { + SetAnimSpeed(ent, dest, painanim); + ent->client->body->ForceAnimation(*ent, painanim); + } + } + BodyPostUse(ent); + } +} + +void PB_PlaySequenceForJump(edict_t *ent, vec3_t dest, vec3_t face) +{ + if (!THIRDPERSON_HACK && !dm->isDM()) + { // only see players in deathmatch or for crazy 3rd person camera hack + return; + } + +// gi.dprintf("looking for jump...\n"); + bbox_preset goal_bbox=GetGoalBBox(ent); + + + AdjustDestForSpeed(ent, dest); + + //eek! first pass at player body! + if (ent && ent->client && ent->client->body && ent->health>0 && + (!ent->client->body->GetMove() || !(!ent->client->body->IsAnimationFinished()&&ent->client->body->GetMove()->suggested_action==ACTCODE_PAIN)) + &&BodyPreUse(ent)) + { + mmove_t *painanim; + vec3_t spot; + vec3_t forward; + vec3_t flatforward; + trace_t trace; + bool ladder = false; + + // check for ladder--nice bag of shit, yes? + AngleVectors(ent->client->ps.viewangles, forward, NULL, NULL); + flatforward[0] = forward[0]; + flatforward[1] = forward[1]; + flatforward[2] = 0; + VectorNormalize (flatforward); + + VectorMA (ent->s.origin, 1, flatforward, spot); + gi.trace(ent->s.origin, ent->mins, ent->maxs, spot, ent, MASK_PLAYERSOLID, &trace); + if ((trace.fraction < 1) && (trace.contents & CONTENTS_LADDER)) + { + ladder = true; + } + //if it's not a ladder: gimme a little safety buffer for falling down before i start in on the anim... + else if (dest[2]-ent->s.origin[2]<1 && dest[2]-ent->s.origin[2]>-5) + { + BodyPostUse(ent); + return; + } + + if (ladder) + { + if (ent->velocity[2] > 2.0) + { + painanim=ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_ladder_up); + SetAnimSpeed(ent, dest, painanim); + + if (painanim==ent->client->body->GetMove()&&ent->client->body->IsAnimationFinished()&&!(ent->client->body->GetMove()->actionFlags&ACTFLAG_LOOPANIM)) + { + ent->client->body->ForceAnimation(*ent, painanim); + } + else + { + ent->client->body->SetAnimation(*ent, painanim); + } + } + else if (ent->velocity[2] < -2.0) + { + painanim=ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_ladder_down); + SetAnimSpeed(ent, dest, painanim); + + if (painanim==ent->client->body->GetMove()&&ent->client->body->IsAnimationFinished()&&!(ent->client->body->GetMove()->actionFlags&ACTFLAG_LOOPANIM)) + { + ent->client->body->ForceAnimation(*ent, painanim); + } + else + { + ent->client->body->SetAnimation(*ent, painanim); + } + } + else + { + painanim=ent->client->body->GetSequenceForStand(*ent, dest, face, ACTSUB_NORMAL, goal_bbox); + SetAnimSpeed(ent, dest, painanim); + + if (painanim) + { + if (painanim==ent->client->body->GetMove()&&ent->client->body->IsAnimationFinished()) + { + ent->client->body->ForceAnimation(*ent, painanim); + } + else + { + ent->client->body->SetAnimation(*ent, painanim); + } + } + } + } + else + { + vec3_t flatvel; + VectorCopy(ent->velocity, flatvel); + flatvel[2]=0; + if (VectorNormalize(flatvel)>250 && DotProduct(flatvel, flatforward)>0.25) + { + painanim=ent->client->body->GetSequenceForJump(*ent, dest, face, ACTSUB_NORMAL, goal_bbox, &generic_move_jump_runfwd); + } + else + { + painanim=ent->client->body->GetSequenceForJump(*ent, dest, face, ACTSUB_NORMAL, goal_bbox); + } + + if (painanim) + { + SetAnimSpeed(ent, dest, painanim); + ent->client->body->SetAnimation(*ent, painanim); + } + } + BodyPostUse(ent); + } +} + +void PB_PlaySequenceForAttack(edict_t *ent, vec3_t dest, vec3_t face, edict_t *target) +{ + if (!THIRDPERSON_HACK && !dm->isDM()) + { // only see players in deathmatch or for crazy 3rd person camera hack + return; + } + +// gi.dprintf("looking for attack...\n"); + bbox_preset goal_bbox=GetGoalBBox(ent); + + AdjustDestForSpeed(ent, dest); + + //eek! first pass at player body! + if (ent && ent->client && ent->client->body && ent->health>0 && + (!ent->client->body->GetMove() || !(!ent->client->body->IsAnimationFinished()&&ent->client->body->GetMove()->suggested_action==ACTCODE_PAIN)) + && BodyPreUse(ent)) + { + mmove_t *painanim; + if (!(painanim=GetLeaningSequence(ent, dest, face, goal_bbox))) + { + painanim=ent->client->body->GetSequenceForAttack(*ent, dest, face, target, ACTSUB_NORMAL, goal_bbox); + } + if (painanim) + { + SetAnimSpeed(ent, dest, painanim); + if (painanim->actionFlags&ACTFLAG_MATCHANIM) + { + ent->client->body->MatchAnimation(*ent, painanim); + } + else if (painanim->suggested_action==ACTCODE_ATTACK) + { + ent->client->body->ForceAnimation(*ent, painanim); + } + else + { + ent->client->body->SetAnimation(*ent, painanim); + } + } + BodyPostUse(ent); + } +} + +void UpdatePlayerFace(edict_t *ent) +{ + if (ent && ent->client && ent->client->body) + { + BodyPreUse(ent); +// gi.dprintf("player height: %f\n",ent->maxs[2]-ent->mins[2]); + ent->client->body->UpdateFace(*ent); + BodyPostUse(ent); + } +} + +void UpdatePlayerWeapon(edict_t *ent) +{ + if (!THIRDPERSON_HACK && !dm->isDM()) + { // only see players in deathmatch or for crazy 3rd person camera hack + return; + } + + if (ent && ent->client && ent->client->body && ent->health > 0) + { + attacks_e newWeap = ATK_NOTHING; + switch(ent->client->inv->getCurWeaponType()) + { + case SFW_KNIFE: + newWeap=ATK_KNIFE; + break; + case SFW_PISTOL2: + newWeap=ATK_PISTOL2; + break; + case SFW_PISTOL1: + newWeap=ATK_PISTOL1; + break; + case SFW_MACHINEPISTOL: + newWeap=ATK_MACHINEPISTOL; + break; + case SFW_SNIPER: + newWeap=ATK_SNIPER; + break; + case SFW_SHOTGUN: + newWeap=ATK_SHOTGUN; + break; + case SFW_MACHINEGUN: + newWeap=ATK_MACHINEGUN; + break; + case SFW_ASSAULTRIFLE: + newWeap=ATK_ASSAULTRIFLE; + break; + case SFW_AUTOSHOTGUN: + newWeap=ATK_AUTOSHOTGUN; + break; + case SFW_ROCKET: + newWeap=ATK_ROCKET; + break; + case SFW_EMPTYSLOT: + newWeap=ATK_NOTHING; + break; + case SFW_MICROWAVEPULSE: + newWeap=ATK_MICROWAVE; + break; + case SFW_FLAMEGUN: + newWeap=ATK_FLAMEGUN; + break; + default: + break; + } + BodyPreUse(ent); + if (newWeap != ent->client->body->GetRightHandWeapon(*ent)) + { + ent->client->body->SetRightHandWeapon(*ent, newWeap); + } + BodyPostUse(ent); + + // if we are carrying a CTF flag, decide whether it should be waving or not + if (ent->ctf_flags) + { + IGhoulObj *game_obj = ent->ghoulInst->GetGhoulObject(); + ggObjC *client_obj = game_ghoul.FindObject(game_obj); + ggOinstC *client_inst = client_obj->FindOInst(ent->ghoulInst); + char *flagname; + vec3_t vel, forward; + + // we are moving forward - set flag to flutter if it isn't already + // this is un-necessarily complicated, but it should work. + VectorCopy (ent->velocity, vel); + VectorNormalize (vel); + + AngleVectors(ent->s.angles, forward, NULL, NULL); + if (DotProduct(vel, forward) > 0.5) + { + GhoulID hip = game_obj->FindPart("abolt_hip_r"); + ggBinstC *bolt = client_inst->GetBoltInstance(hip); + if (bolt) + { + ggObjC *bolton = bolt->GetBolteeObject(); + if (stricmp("flag_run", bolton->GetSubName())) + { + // remove exiting flag + client_inst->RemoveBoltInstance(bolt); + // now add a flag to the player + if (ent->ctf_flags == 1) + { + flagname = "ctf_flag_blue"; + } + else + { + flagname = "ctf_flag_red"; + } + PB_AddFlag(ent, flagname, "flag_run"); + } + + } + } + // not moving forward - set droop + else + { + GhoulID hip = game_obj->FindPart("abolt_hip_r"); + ggBinstC *bolt = client_inst->GetBoltInstance(hip); + if (bolt) + { + ggObjC *bolton = bolt->GetBolteeObject(); + if (stricmp("flag_hold_idle", bolton->GetSubName())) + { + // remove exiting flag + client_inst->RemoveBoltInstance(bolt); + // now add a flag to the player + if (ent->ctf_flags == 1) + { + flagname = "ctf_flag_blue"; + } + else + { + flagname = "ctf_flag_red"; + } + PB_AddFlag(ent, flagname, "flag_hold_idle"); + } + + } + } + } + } +} + +void PlayPlayerHurtSound(edict_t *targ, int damage, int dflags, int mod) +{ + char meatSound[100]; + + if (targ && targ->health<=0) + { + return; + } + + if (targ->client->body) + { + return; + } + + if (mod == MOD_FIRE) + { + gi.sound (targ, CHAN_BODY, gi.soundindex("impact/gore/sizzle.wav"), 1.0, ATTN_NORM, 0); + return; + } + + if (damage > 0) + { + Com_sprintf(meatSound, sizeof(meatSound), "impact/gore/impact%d.wav", gi.irand(1,3)); + gi.sound (targ, CHAN_BODY, gi.soundindex(meatSound), 1.0, ATTN_NORM, 0); + Com_sprintf(meatSound, sizeof(meatSound), "impact/player/hit%d.wav", gi.irand(1,4)); + gi.sound (targ, CHAN_VOICE, gi.soundindex(meatSound), 1.0, ATTN_NORM, 0); + } + else + { + gi.sound (targ, CHAN_BODY, gi.soundindex("impact/player/armor.wav"), 1.0, ATTN_NORM, 0); + } +} + +void PB_Killed(edict_t *ent) +{ + if (!ent || !ent->client) + { + return; + } + + if (!THIRDPERSON_HACK && !dm->isDM()) + { + return; + } + + if (BodyPreUse(ent)) + { + ent->client->inv->addArmor(ent->client->inv->getArmorCount()*-1); + + if(ent->ghoulInst) + { + ggOinstC *MyGhoulInst=game_ghoul.FindOInst(ent->ghoulInst); + GhoulID theHand; + + + if (theHand=ent->ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_r")) + { + MyGhoulInst->RemoveBolt(theHand); + } + if (theHand=ent->ghoulInst->GetGhoulObject()->FindPart("wbolt_hand_l")) + { + MyGhoulInst->RemoveBolt(theHand); + } + } + BodyPostUse(ent); + } +} + +int PB_Damage (edict_t *targ, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb) +{ + if (damage <= 0) + { + return damage; + } + + if (!targ || !targ->client) + { + PlayPlayerHurtSound(targ, damage, dflags, mod); + + return damage; + } + + if (!targ->client->body || !targ->client->ps.bod) + { + if(dflags&DAMAGE_NO_ARMOR) + { + // Ignore protective effects of armour. + PlayPlayerHurtSound(targ, damage, dflags, mod); + + return(damage); + } + else + { + // Adjust damage due to protective effects of armour. + damage = (targ->client->inv->adjustDamageByArmor(damage, penetrate, absorb)); + PlayPlayerHurtSound(targ, damage, dflags, mod); + + return damage; + } + } + + //eh, this shouldn't matter if I don't die here, but it's gotta be set if I do + if (targ->health > 0) + { + targ->client->body->SetInitialKilledTime(level.time); + } + + targ->client->body->SetLastKilledTime(level.time); + + + int take; + + if (THIRDPERSON_HACK || dm->isDM()) + { + bool hadArmor=false; + if (targ && targ->client && targ->client->inv) + { + hadArmor=(targ->client->inv->getArmorCount()>0); + } + BodyPreUse(targ); + + //FIXME: SS iss assuming bullets are fired to get here (think he was gonna fix this). + //This is not much better but it's in the right direction, kinda. + + if(bullet_numHits==0 && (dflags & (DT_PROJECTILE|DT_MELEE))) + { + Matrix4 ToEnt,ToWorld; + Vect3 transform; + + EntToWorldMatrix(targ->s.origin,targ->s.angles,ToWorld); + //but we want to put the ray into ent space, need inverse + ToEnt.Inverse(ToWorld); + + VectorCopy(origin,*((vec3_t*)&transform)); + ToEnt.XFormPoint(bullet_EntStart,transform); + ToEnt.XFormVect(bullet_EntDir,*(Vect3 *)dir); + bullet_EntDir.Norm(); + bullet_numHits = targ->ghoulInst->RayTrace(level.time,bullet_EntStart,bullet_EntDir,bullet_Hits,20); + } + + take = targ->client->body->ShowDamage(*targ, inflictor, attacker, dir, point, origin, damage, knockback, dflags, mod, penetrate, absorb); + + //extra damage for females + if (take > 0 && targ->client->body->GetClassCode()==BODY_FEMALE) + { +// gi.dprintf("More damage, girlie! Start take: %d, ", take); + take+=(float)take*0.5; +// gi.dprintf("End take: %d!\n", take); + } + + if (targ->health>take) + { + vec3_t dest, face; + AngleVectors(targ->client->ps.viewangles, face, NULL, NULL); + VectorMA(targ->s.origin, 100, face, face); + VectorCopy(targ->velocity, dest); + VectorMA(targ->s.origin, 0.025, dest, dest); + + PB_PlaySequenceForPain(targ, point, dest, face); + } + else + { + PB_PlaySequenceForDeath(targ, inflictor, attacker, damage, point, dflags); + } + + BodyPostUse(targ); + PlayPlayerHurtSound(targ, take, dflags, mod); + + bool hasArmor=false; + if (targ && targ->client && targ->client->inv) + { + hasArmor=(targ->client->inv->getArmorCount()>0); + } + if (hadArmor!=hasArmor && targ->health>take) + { + //swap chests here, but don't bother if i'm dead + PB_InitBody(*targ,targ->client->pers.userinfo);//c'mon, we can do better than this! + } + + return take; + } + else + { + if(dflags&DAMAGE_NO_ARMOR) + { + // Ignore protective effects of armour. + PlayPlayerHurtSound(targ, damage, dflags, mod); + + return(damage); + } + else + { + // Adjust damage due to protective effects of armour. + damage = (targ->client->inv->adjustDamageByArmor(damage, penetrate, absorb)); + PlayPlayerHurtSound(targ, damage, dflags, mod); + + return damage; + } + } +} + +int PB_AddArmor(edict_t *ent, int amount) +{ + if (!ent || !ent->client || !ent->client->inv) + { + return 0; + } + + if (!THIRDPERSON_HACK && !dm->isDM()) + { + return ent->client->inv->addArmor(amount); + } + + bool hadArmor=(ent->client->inv->getArmorCount()>0); + int addArmorReturned = ent->client->inv->addArmor(amount); + bool hasArmor=(ent->client->inv->getArmorCount()>0); + + if (hadArmor!=hasArmor) + { + //swap chests here + PB_InitBody(*ent,ent->client->pers.userinfo);//c'mon, we can do better than this! + } + + return addArmorReturned; +} + +void PB_RepairSkin(edict_t *ent, int damagedHealth) +{ + bodyhuman_c *body = (bodyhuman_c*)ent->client->body; + + if (body) + { + body->HealGoreZones(*ent, damagedHealth, ent->health); + } +} + +// add a flag to the main player - Jake +void PB_AddFlag(edict_t *ent, char *FlagSkinName, char* FlagGhoulFile) +{ + // now bolt on a Ghoul object of the flag to the player + ggOinstC* myInstance; + ggObjC* MyGhoulObj = game_ghoul.FindObject(ent->ghoulInst->GetGhoulObject()); + body_c* body = ent->client->body; + // find the Game Ghoul Instance of the Ghoul object hanging off my player + myInstance = MyGhoulObj->FindOInst(ent->ghoulInst); + body->AddBoltedItem(*ent, "abolt_hip_r", "items/ctf_flag", FlagGhoulFile, "to_abolt_hip_r", myInstance, FlagSkinName, 1.0); +} + + +void PB_RemoveFlag(edict_t *ent) +{ + ggOinstC *MyGhoulInst=game_ghoul.FindOInst(ent->ghoulInst); + GhoulID theFlag; + + if (theFlag=ent->ghoulInst->GetGhoulObject()->FindPart("abolt_hip_r")) + { + MyGhoulInst->RemoveBolt(theFlag); + } +} \ No newline at end of file diff --git a/Source/Game/gamecpp/p_body.h b/Source/Game/gamecpp/p_body.h new file mode 100644 index 0000000..8b672a8 --- /dev/null +++ b/Source/Game/gamecpp/p_body.h @@ -0,0 +1,39 @@ +#ifndef _P_BODY_H + +#define _P_BODY_H + + +void PB_KillBody(edict_t &ent); +bool PB_InitBody(edict_t &ent,char *userinfo); + +void PB_GhoulUpdate(edict_t &ent); + +void PB_PlaySequenceForDeath(edict_t *ent, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags); +void PB_PlaySequenceForPain(edict_t *ent, vec3_t point, vec3_t dest=vec3_origin, vec3_t face=vec3_origin); + +void PB_PlaySequenceForMovement(edict_t *ent, vec3_t dest, vec3_t face, vec3_t org, vec3_t ang); +void PB_PlaySequenceForStand(edict_t *ent, vec3_t dest=vec3_origin, vec3_t face=vec3_origin); +void PB_PlaySequenceForJump(edict_t *ent, vec3_t dest, vec3_t face); +void PB_PlaySequenceForAttack(edict_t *ent, vec3_t dest, vec3_t face, edict_t *target); +void PB_PlaySequenceForReload(edict_t *ent, vec3_t dest, vec3_t face); +void PB_PlaySequenceForItemUse(edict_t *ent, vec3_t dest, vec3_t face, int itemType); +void PB_PlaySequenceForGesture(edict_t *ent, int gestNum); + +void PB_GetActualSkinName(edict_t *ent, char *putSkinHere); +void PB_GetActualTeamName(edict_t *ent, char *putTeamHere); + +void UpdatePlayerFace(edict_t *ent); +void UpdatePlayerWeapon(edict_t *ent); + +void PB_Killed(edict_t *ent); +int PB_Damage (edict_t *targ, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb); +int PB_AddArmor(edict_t *ent, int amount); + +void PB_MakeCorpse (edict_t *ent); + +void PB_PrecacheAllPlayerModels(void); + +void PB_RepairSkin(edict_t *ent, int damagedHealth); +void PB_AddFlag(edict_t *ent, char *FlagSkinName, char* FlagGhoulFile); +void PB_RemoveFlag(edict_t *ent); +#endif \ No newline at end of file diff --git a/Source/Game/gamecpp/p_client.cpp b/Source/Game/gamecpp/p_client.cpp new file mode 100644 index 0000000..6caaac5 --- /dev/null +++ b/Source/Game/gamecpp/p_client.cpp @@ -0,0 +1,2390 @@ +#include "g_local.h" +#include "w_weapons.h" +#include "ds.h" + +#include "p_body.h" +#include "ai.h" +#include "m_generic.h" +#include "q_sh_interface.h" +#include "../strings/dm_generic.h" +#include "ef_flags.h" +#include "configstring.h" +#include "music.h" +#include "p_heights.h" + +//yuck :/ +// and how! :< + +void ClientUserinfoChanged (edict_t *ent, char *userinfo, bool not_first_time); +void ClientUserinfoChangedBasic (edict_t *ent, char *userinfo); +void clUse (edict_t *ent); +void clearFireEvent(edict_t *ent); + +bool IsInnocent(edict_t *ent); + +//dunno if this is a good final resting place for these guys, but... + +/*QUAKED info_merc_start (1 .1 .1) (-16 -16 -24) (16 16 32) +Starting point for merc buddies. +-------------------------------- +merctype - the default merc type (can be overridden by player during mission setup) + 0 - GRUNT + 1 - DEMO + 2 - MEDIC + 3 - SNIPER + 4 - HEAVY + 5 - TECH + +mercnum - the merc's id number (0 to 3) +*/ + +/*void SP_info_merc_start(edict_t *self) +{ +// HACK for demo! +// end hack + + generic_monster_spawnnow(self); + + switch (st.merctype) + { + case 1: + self->ai = ai_c::Create(AI_GENERIC_MERC_DEMO, self, "enemy/meso", "mercdemo1");//new merc_demo_ai(self); + self->think = generic_grunt_init; + break; + case 3: + default: + self->ai = ai_c::Create(AI_GENERIC_MERC_SNIPER, self, "enemy/meso", "mercsnipe1");//new merc_sniper_ai(self); + self->think = generic_grunt_init; + break; + } +} +*/ + +/*QUAKED info_player_start (1 0 0) (-16 -16 -24) (16 16 32) +The normal starting point for a level. +*/ + +void SP_info_player_start(edict_t *self) +{ +/* IPathInst *Test; + vec3_t dest, source; + PathPoint_s Point; + + source[0] = -1444.625; + source[1] = 1551.375; + source[2] = 32.125; + dest[0] = -1667.456421; + dest[1] = 968.364624; + dest[2] = 40.03125; + + + Test = (IPathInst *)gi.GetPath(); + + Test->SetSource(source); + Test->SetDest(dest); + if (Test->FindSimplePath()) + { + while( Test->GetPoint(Point)) + { + Com_Printf("[%5.0f %5.0f %5.0f] - [%5.0f %5.0f %5.0f]\n", + Point.points[0][0],Point.points[0][1],Point.points[0][2], + Point.points[1][0],Point.points[1][1],Point.points[1][2]); + } + } +*/ +} + +/*QUAKED info_player_deathmatch (1 0 1) (-16 -16 -24) (16 16 32) +potential spawning position for deathmatch games +*/ + +void SP_info_player_deathmatch(edict_t *self) +{ + if (!dm->isDM()) + { + G_FreeEdict (self); + return; + } + self->solid = SOLID_NOT; + self->svflags |= SVF_NOCLIENT; +} + +/*QUAKED info_player_team1 (1 0 0) (-16 -16 -24) (16 16 32) +potential spawning position for team deathmatch games (team1 players) +*/ + +void SP_info_player_team1(edict_t *self) +{ + if(!dm->isDM()) + { + G_FreeEdict(self); + return; + } + self->solid = SOLID_NOT; + self->svflags |= SVF_NOCLIENT; +} + +/*QUAKED info_player_team2 (1 0 0) (-16 -16 -24) (16 16 32) +potential spawning position for team deathmatch games (team2 players) +*/ + +void SP_info_player_team2(edict_t *self) +{ + if(!dm->isDM()) + { + G_FreeEdict(self); + return; + } + self->solid = SOLID_NOT; + self->svflags |= SVF_NOCLIENT; +} + +/*QUAKED info_player_intermission (1 0 1) (-16 -16 -24) (16 16 32) +The deathmatch intermission point will be at one of these +Use 'angles' instead of 'angle', so you can set pitch or roll as well as yaw. 'pitch yaw roll' +*/ +void script_use(edict_t *ent, edict_t *other, edict_t *activator); + +void SP_info_player_intermission(edict_t *ent) +{ +/* // copied right out of SP_scriptrunner + char temp[MAX_PATH]; + int i; + + sprintf(temp,"ds/%s.os",st.script); + ent->Script = new CScript(temp, ent); + Scripts.push_back(ent->Script); + + for(i=0;iScript->SetParameter(st.parms[i]); + } + else + { + break; + } + } + + ent->movetype = MOVETYPE_NONE; + ent->solid = SOLID_NOT; + ent->svflags |= SVF_NOCLIENT; + ent->use = script_use;*/ +} + +//======================================================================= + +void player_pain (edict_t *self, edict_t *other, float kick, int damage, vec3_t wherehit) +{ + // player pain is handled at the end of the frame in P_DamageFeedback +} + +/* +================== +LookAtKiller +================== +*/ +void LookAtKiller (edict_t *self, edict_t *inflictor, edict_t *attacker) +{ + vec3_t dir; + + if (attacker && attacker != world && attacker != self) + { + VectorSubtract (attacker->s.origin, self->s.origin, dir); + } + else if (inflictor && inflictor != world && inflictor != self) + { + VectorSubtract (inflictor->s.origin, self->s.origin, dir); + } + else + { + self->client->killer_yaw = self->s.angles[YAW]; + + return; + } + + self->client->killer_yaw = 180/M_PI*atan2(dir[1], dir[0]); +} + +/* +================== +player_die +================== +*/ + +void player_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + VectorClear (self->avelocity); + + self->takedamage = DAMAGE_YES; + self->movetype = MOVETYPE_TOSS; + self->solid = SOLID_CORPSE; +// self->clipmask = MASK_SOLID; // Use this only if we want corpses to fall through things... + + self->s.angles[0] = 0; + self->s.angles[2] = 0; + self->s.sound = 0; + + self->maxs[2] = -8; + + self->svflags |= SVF_DEADMONSTER; + + // Even though we are dead - we can still be 'killed' again... so ensure + // some things can only happen the 1st time we are killed. + + if(!self->deadflag) + { + if(dm->isDM()) + self->client->respawn_time = level.time + 1.0; + else + self->client->respawn_time = level.time + RESPAWN_DELAY; + + LookAtKiller(self, inflictor, attacker); + self->client->ps.pmove.pm_type = PM_DEAD; + dm->clientObituary(self, inflictor, attacker); + + sharedEdict_t sh; + sharedEdict_t *saved; + + // Do mod-specific weapon handling on death of player. + + sh.inv=(inven_c *)self->client->inv; + saved=sh.inv->getOwner(); + dm->clientDieWeaponHandler(self); + sh.inv->setOwner(saved); + + // Do mod-specific death stuff. + + sh.inv=(inven_c *)self->client->inv; + saved=sh.inv->getOwner(); + if (!attacker) + { + attacker = self; + } + if (!inflictor) + { + inflictor = self; + } + dm->clientDie(*self, *inflictor, *attacker); + sh.inv->setOwner(saved); + + // Start a death animation. + + self->client->anim_priority = ANIM_DEATH; + + if(dm->isDM()) + { + if(attacker&&attacker->client) + { + // The attacker died. + + if (attacker == self) + { + // The attacker killed himself. + + gi.sound(attacker,CHAN_VOICE,gi.soundindex("dm/selffrag.wav"),1.0,ATTN_STATIC,0,SND_LOCALIZE_CLIENT); + } + else if (OnSameTeam(attacker, self)) + { + // The attacker killed a teammate. + + gi.sound(attacker,CHAN_VOICE,gi.soundindex("dm/selffrag.wav"),1.0,ATTN_STATIC,0,SND_LOCALIZE_CLIENT); + } + else + { + if(deathmatch->value!=2) // Hack - assassin has it's own kill sounds. + { + // Play a "got a kill" sound. + + gi.sound(attacker,CHAN_VOICE,gi.soundindex("dm/frag.wav"),1.0,ATTN_STATIC,0,SND_LOCALIZE_CLIENT); + } + } + } + + // Show scoreboard. + + Cmd_Score_f(self); + } + } + + self->deadflag = DEAD_DEAD; + + gi.linkentity (self); + + // We recycle to fade to black... + + self->health = -1; +} + +//======================================================================= + +/* +============== +InitClientPersistant + +This is only called when the game first initializes in single player, +but is called after each death and level change in deathmatch +============== +*/ + +void InitClientPersistant (gclient_t *client) +{ + memset(&client->pers, 0, sizeof(client->pers)); + + client->pers.health = 100; + client->pers.max_health = 100; + client->pers.curWeaponType = -1; + client->pers.connected = true; +} + +/* +============== +InitClientResp +============== +*/ + +void InitClientResp (gclient_t *client) +{ + // do NOT fuck around with team, since this is set elsewhere + team_t team = client->resp.team; + memset(&client->resp, 0, sizeof(client->resp)); + + client->resp.team = team; + client->resp.enterframe = level.framenum; +} + +/* +================== +PreserveClientData + +Some information that should be persistant, like health, +is still stored in the edict structure, so it needs to +be mirrored out to the client structure before all the +edicts are wiped. +=========1========= +*/ + +void PreserveClientData (void) +{ + int i; + edict_t *ent; + + for(i = 0; i < game.maxclients; i++) + { + ent = g_edicts + i + 1; + if (!ent->inuse) + { + continue; + } + game.clients[i].pers.health = ent->health; + game.clients[i].pers.max_health = ent->max_health; + game.clients[i].pers.curWeaponType = ent->client->inv->getCurWeaponType(); + game.clients[i].pers.fov=ent->client->ps.fov; + } +} + +/* +================== +RestoreClientData +================== +*/ + +void RestoreClientData (edict_t *ent) +{ + ent->health = ent->client->pers.health; + ent->max_health = ent->client->pers.max_health; +} + +/* +======================================================================= + + SelectSpawnPoint + +======================================================================= +*/ + +/* +================ +PlayersRangeFromSpot + +Returns the distance to the nearest player from the given spot +================ +*/ + +float PlayersRangeFromSpot (edict_t *spot) +{ + edict_t *player; + float bestplayerdistance; + vec3_t v; + int n; + float playerdistance; + + + bestplayerdistance = 9999999; + + for (n = 1; n <= (int)maxclients->value; n++) + { + player = &g_edicts[n]; + + if (!player->inuse) + continue; + + if (player->health <= 0) + continue; + + VectorSubtract (spot->s.origin, player->s.origin, v); + playerdistance = VectorLength (v); + + if (playerdistance < bestplayerdistance) + bestplayerdistance = playerdistance; + } + + return bestplayerdistance; +} + +/* +================ +SelectRandomDeathmatchSpawnPoint + +Go to a random point, but NOT the two points closest to other players. +================ +*/ + +edict_t *SelectRandomDeathmatchSpawnPoint (void) +{ + edict_t *spot, *spot1, *spot2; + int count = 0; + int selection; + float range, range1, range2; + + spot = NULL; + range1 = range2 = 99999; + spot1 = spot2 = NULL; + + while ((spot = G_Find (spot, FOFS(classname), "info_player_deathmatch")) != NULL) + { + count++; + range = PlayersRangeFromSpot(spot); + if (range < range1) + { + range1 = range; + spot1 = spot; + } + else if (range < range2) + { + range2 = range; + spot2 = spot; + } + } + + if (!count) + return NULL; + + if (count <= 2) + { + spot1 = spot2 = NULL; + } + else + count -= 2; + + selection = rand() % count; + + spot = NULL; + do + { + spot = G_Find (spot, FOFS(classname), "info_player_deathmatch"); + if (spot == spot1 || spot == spot2) + selection++; + } while(selection--); + + return spot; +} + +/* +================ +SelectFarthestDeathmatchSpawnPoint +================ +*/ + +edict_t *SelectFarthestDeathmatchSpawnPoint (void) +{ + edict_t *bestspot; + float bestdistance, bestplayerdistance; + edict_t *spot; + + + spot = NULL; + bestspot = NULL; + bestdistance = 0; + while ((spot = G_Find (spot, FOFS(classname), "info_player_deathmatch")) != NULL) + { + bestplayerdistance = PlayersRangeFromSpot (spot); + + if (bestplayerdistance > bestdistance) + { + bestspot = spot; + bestdistance = bestplayerdistance; + } + } + + if (bestspot) + { + return bestspot; + } + + // if there is a player just spawned on each and every start spot + // we have no choice to turn one into a telefrag meltdown + spot = G_Find (NULL, FOFS(classname), "info_player_deathmatch"); + + return spot; +} + +/* +================ +SelectTeamDeathmatchSpawnPoint +================ +*/ + +edict_t *SelectTeamDeathmatchSpawnPoint (edict_t *ent) +{ + edict_t *spot, *spot1, *spot2; + int count = 0; + int selection; + float range, range1, range2; + char *teamname,*cname; + + // we may have a team already assigned to us + switch (ent->client->resp.team) + { + case TEAM1: + cname = "info_player_team1"; + break; + + case TEAM2: + cname = "info_player_team2"; + break; + + default: + teamname=Info_ValueForKey(ent->client->pers.userinfo,"teamname"); + if(!stricmp(teamname,"blue")) + cname = "info_player_team1"; + else if(!stricmp(teamname,"red")) + cname = "info_player_team2"; + else + return(SelectRandomDeathmatchSpawnPoint()); + break; + } + + // Same as before.... + + spot = NULL; + range1 = range2 = 99999; + spot1 = spot2 = NULL; + + while ((spot = G_Find (spot, FOFS(classname), cname)) != NULL) + { + count++; + range = PlayersRangeFromSpot(spot); + + if (range < range1) + { + range1 = range; + spot1 = spot; + } + else if (range < range2) + { + range2 = range; + spot2 = spot; + } + } + + if (!count) + return SelectRandomDeathmatchSpawnPoint(); + + // Ok, we know there are spots out there, so let's pick one. + + if (count <= 2) + { + spot1 = spot2 = NULL; + } + else + count -= 2; + + selection = rand() % count; + + spot = NULL; + + do + { + spot = G_Find (spot, FOFS(classname), cname); + + if((spot == spot1 || spot == spot2)) + selection++; + } while(selection--); + + return(spot); +} + +edict_t *SelectDeathmatchSpawnPoint (void) +{ + return SelectFarthestDeathmatchSpawnPoint (); +} + +/* +=========== +SelectSpawnPoint + +Chooses a player start, deathmatch start, coop start, etc +============ +*/ + +void SelectSpawnPoint (edict_t *ent, vec3_t origin, vec3_t angles) +{ + edict_t *spot = NULL; + + if (dm->isDM()) + { + if (dm->arePlayerTeamsOn()) + { + spot = SelectTeamDeathmatchSpawnPoint(ent); + } + else + { + spot = SelectDeathmatchSpawnPoint (); + } + +#ifndef _DEBUG + if(!spot) + { + gi.error ("Couldn't find deathmatch spawn point"); + } +#endif + } + + // Find a single player start spot. + if (!spot) + { + while ((spot = G_Find (spot, FOFS(classname), "info_player_start")) != NULL) + { + if (!game.spawnpoint[0] && !spot->targetname) + break; + + if (!game.spawnpoint[0] || !spot->targetname) + continue; + + if (stricmp(game.spawnpoint, spot->targetname) == 0) + break; + } + + if (!spot) + { + if (!game.spawnpoint[0]) + { + // There wasn't a spawnpoint without a target, so use any. + + spot = G_Find (spot, FOFS(classname), "info_player_start"); + } + + if (!spot) + { + gi.error ("Couldn't find spawn point %s", game.spawnpoint); + } + } + } + + VectorCopy (spot->s.origin, origin); + origin[2] += 9; + VectorCopy (spot->s.angles, angles); +} + +//====================================================================== + +void InitBodyQue (void) +{ + int i; + edict_t *ent; + + level.body_que = 0; + for (i=0; iclassname = "bodyque"; + } +} + +void respawn (edict_t *self) +{ + if (dm->isDM()) + { + PB_MakeCorpse(self); + PutClientInServer (self); + + if(!self->client->pers.spectator) + { + // Add a teleportation effect. + FX_SetEvent(self, EV_PLAYER_TELEPORT); + + // Hold in place briefly. + self->client->ps.pmove.pm_flags = PMF_TIME_TELEPORT; + self->client->ps.pmove.pm_time = 14; + } + + // Kill any existing client effects on the player when dying... + self->s.effects |= EF_KILL_EFT; + + self->client->respawn_time = level.time; + return; + } + + // Restart the entire server. + + gi.AddCommandString ("respawn\n"); +} + +/* +=========== +spectator_respawn + +Called when pers.spectator changes. Note that resp.spectator should be the +opposite of pers.spectator here. +============ +*/ + +void spectator_respawn (edict_t *ent) +{ + int i, numspec; + + // If the user wants to become a spectator, make sure he doesn't exceed + // max_spectators. + + if (ent->client->pers.spectator) + { + char *value = Info_ValueForKey (ent->client->pers.userinfo, "spectator_password"); + + if (*spectator_password->string && strcmp(spectator_password->string, "none") && + strcmp(spectator_password->string, value)) + { + gi.SP_Print(ent,DM_GENERIC_TEXT_SPECTATOR_BAD_PWD); + ent->client->pers.spectator = false; + + // Reset client's spectator var. + + gi.WriteByte (svc_stufftext); + gi.WriteString ("spectator 0\n"); + gi.unicast(ent, true); + + return; + } + + // Count spectators. + + for (i = 1, numspec = 0; i <= (int)maxclients->value; i++) + if (g_edicts[i].inuse && g_edicts[i].client->pers.spectator) + numspec++; + + // Too many? + + if(numspec > maxspectators->value) + { + gi.SP_Print(ent,DM_GENERIC_TEXT_SPECTATOR_LIMIT_FULL); + ent->client->pers.spectator = false; + + // Reset client's spectator var. + + gi.WriteByte (svc_stufftext); + gi.WriteString ("spectator 0\n"); + gi.unicast(ent, true); + + return; + } + } + else + { + // Was a spectator and wants to join the game so must have the right password. + + char *value = Info_ValueForKey (ent->client->pers.userinfo, "password"); + + if (*password->string && strcmp(password->string, "none") && + strcmp(password->string, value)) + { + gi.SP_Print(ent,DM_GENERIC_TEXT_BAD_PWD); + ent->client->pers.spectator = true; + + // Set client's spectator var. + + gi.WriteByte (svc_stufftext); + gi.WriteString ("spectator 1\n"); + gi.unicast(ent, true); + + return; + } + } + + // clear score on respawn + ent->client->resp.score = 0; + + ent->svflags &= ~SVF_NOCLIENT; + PutClientInServer (ent); + + // add a teleportation effect + if (!ent->client->pers.spectator) + { + // Add a teleportation effect. + + FX_SetEvent(ent, EV_PLAYER_TELEPORT); + + // hold in place briefly + ent->client->ps.pmove.pm_flags = PMF_TIME_TELEPORT; + ent->client->ps.pmove.pm_time = 14; + } + + // Kill any existing client effects on the player... + ent->s.effects |= EF_KILL_EFT; + + ent->client->respawn_time = level.time; + + if (ent->client->pers.spectator) + gi.SP_Print(ent,DM_GENERIC_TEXT_SPECTATOR_TO_SIDELINES,ent->s.number); + else + gi.SP_Print(ent,DM_GENERIC_TEXT_SPECTATOR_TO_GAME,ent->s.number); +} + +//============================================================== + +void sendRestartPrediction(edict_t *ent) +{ + ent->client->restart_count++; + + gi.ReliableWriteByteToClient(svc_restart_predn,ent->s.number-1); + gi.ReliableWriteByteToClient(ent->client->restart_count,ent->s.number-1); +} + +void RebuildPredictedClientInv(edict_t *ent) +{ + gi.ReliableWriteByteToClient(svc_rebuild_pred_inv, ent->s.number - 1); + ent->client->inv->NetWrite(ent->s.number - 1); +} + +/* +=========== +PutClientInServer + +Called when a player connects to a server or respawns in a deathmatch. +============ +*/ + +#define RESPAWN_INVULN_TIME 4.0F + +bool PB_InitBody(edict_t &ent,char *userinfo); + +void PutClientInServer (edict_t *ent) +{ + vec3_t mins = {-16, -16, -24}; + vec3_t maxs = {16, 16, 40}; + int index; + vec3_t spawn_origin, spawn_angles; + gclient_t *client; + int i; + client_persistant_t saved; + client_respawn_t resp; + byte saved_restart_count; + invPub_c *savedI; + player_dmInfo_ic *savedDMInfo; + //body info is persistant (sp?) + body_c *savedB; + IGhoulInst *savedG; + byte savedPlayernameColors[MAX_CLIENTS]; + byte savedOldPlayernameColors[MAX_CLIENTS]; + char savedOldName[128]; + char savedOldSkin[MAX_SKINNAME_LENGTH]; + char savedOldTeamname[MAX_TEAMNAME_LENGTH]; + + // Find a spawn point. Do it before setting health back up, so farthest + // ranging doesn't count this client. + + SelectSpawnPoint (ent, spawn_origin, spawn_angles); + + index = ent-g_edicts-1; + client = ent->client; + + // Deathmatch wipes most client data every spawn. + + if (dm->isDM()) + { + char userinfo[MAX_INFO_STRING]; + + resp = client->resp; + memcpy (userinfo, client->pers.userinfo, sizeof(userinfo)); + InitClientPersistant (client); + ClientUserinfoChangedBasic (ent, userinfo ); + } + else + { + memset (&resp, 0, sizeof(resp)); + } + + // Clear everything except the persistant data (pers), dmInfo, inventory, + // body and ghoulinst. NOTE: ghoulinst is restored later, after playerstate + // is cleared - this is only an issue for 3d-person hack). + + saved = client->pers; + savedDMInfo=client->dmInfo; + savedI = client->inv; + savedB = client->body; + savedG = client->ps.bod; + memcpy(savedPlayernameColors,client->playernameColors,sizeof(client->playernameColors)); + memcpy(savedOldPlayernameColors,client->oldPlayernameColors,sizeof(client->oldPlayernameColors)); + memcpy(savedOldName, client->oldNetName, sizeof(client->oldNetName)); + memcpy(savedOldSkin, client->oldSkinRequest, sizeof(client->oldSkinRequest)); + memcpy(savedOldTeamname, client->oldTeamnameRequest, sizeof(client->oldTeamnameRequest)); + saved_restart_count=client->restart_count; + + memset (client, 0, sizeof(*client)); + + memcpy(client->playernameColors,savedPlayernameColors,sizeof(client->playernameColors)); + memcpy(client->oldPlayernameColors,savedOldPlayernameColors,sizeof(client->oldPlayernameColors)); + memcpy(client->oldNetName, savedOldName, sizeof(client->oldNetName)); + memcpy(client->oldSkinRequest, savedOldSkin, sizeof(client->oldSkinRequest)); + memcpy(client->oldTeamnameRequest, savedOldTeamname, sizeof(client->oldTeamnameRequest)); + client->body = savedB; + client->inv = savedI; + client->pers = saved; + client->dmInfo = savedDMInfo; + client->restart_count=saved_restart_count; + + // If we died... + + if (client->pers.health <= 0) + InitClientPersistant(client); + client->resp = resp; + + client->musicTime = -40; + + + // copy some data from the client to the entity + RestoreClientData (ent); + + // clear entity values + ent->groundentity = NULL; + ent->client = &game.clients[index]; + ent->takedamage = DAMAGE_AIM; + ent->movetype = MOVETYPE_WALK; + ent->viewheight = EYEBALL_HEIGHT; + ent->inuse = true; + ent->classname = "player"; + ent->mass = 200; + ent->solid = SOLID_BBOX; + ent->deadflag = DEAD_NO; + ent->gibbed = false; + ent->air_finished = level.time + 12; + ent->clipmask = MASK_PLAYERSOLID; + ent->pain = player_pain; + ent->die = player_die; + ent->waterlevel = 0; + ent->watertype = 0; + ent->flags &= ~FL_NO_KNOCKBACK; + ent->svflags &= ~SVF_DEADMONSTER; + ent->burntime = 0; + ent->phosburntime = 0; + ent->burninflictor = 0; + ent->zapfxtime = 0; + ent->zapdmgtime = 0; + + VectorCopy (mins, ent->mins); + VectorCopy (maxs, ent->maxs); + VectorClear (ent->velocity); + + // clear playerstate values + memset (&ent->client->ps, 0, sizeof(client->ps)); + + //restore ghoulinst Now. + client->ps.bod = savedG; + + client->ps.pmove.origin[0] = spawn_origin[0]*8; + client->ps.pmove.origin[1] = spawn_origin[1]*8; + client->ps.pmove.origin[2] = spawn_origin[2]*8; + + client->ps.remote_id=-1; + + client->ps.fov = 95; + + // Mod specific CP stuff. + + dm->clientHandlePredn(*ent); + + // Mod specific respawn stuff. + + dm->clientRespawn(*ent); + + // Fill up clips for all your weapons from the inventory ammo pool. + + sharedEdict_t sh; + sh.inv = (inven_c *)ent->client->inv; + sh.edict = ent; + sh.inv->setOwner(&sh); + sh.inv->stockWeapons(); + + // Turn all the bits of the ghoul view-weapon model ON. + + IGhoulInst *gun = client->ps.gun; + + if(gun) + gun->SetAllPartsOnOff(true); + + // The game will take it from here. + + ent->client->ps.musicID = MUSIC_UNSET; + + // Clear entity state values. + + FX_ClearEvent(ent); + + ent->s.modelindex = 255; // will use the skin specified model + + // sknum is player num + ent->s.skinnum = ent - g_edicts - 1; + + VectorCopy (spawn_origin, ent->s.origin); + ent->s.origin[2] += 1; // make sure off ground + + // Set the delta angles. + + for(i=0;i<3;i++) + client->ps.pmove.delta_angles[i]=ANGLE2SHORT(spawn_angles[i] - client->resp.cmd_angles[i]); + + ent->s.angles[PITCH] = 0; + ent->s.angles[YAW] = spawn_angles[YAW]; + ent->s.angles[ROLL] = 0; + VectorCopy (ent->s.angles, client->ps.viewangles); + VectorCopy (ent->s.angles, client->v_angle); + + // I'm a spectator? + + if(client->pers.spectator) + { + // Yes. + + client->chase_target = NULL; + client->resp.spectator = true; + + ent->movetype = MOVETYPE_SPECTATOR; + ent->solid = SOLID_NOT; + ent->clipmask = 0; // Prevent spectators from being shot/stabbed/exploded. + + ent->svflags |= SVF_NOCLIENT; + ent->client->ps.gun = 0; + gi.linkentity (ent); + } + else + { + // No. + + ent->svflags &= ~SVF_NOCLIENT; + ent->clipmask = MASK_PLAYERSOLID; // Allow previous spectators to be shot/stabbed/exploded. + + client->resp.spectator = false; + + if (!KillBox (ent)) + { + // could't spawn in? + } + + gi.linkentity (ent); + + // Give me 2 seconds of invulnerable time in deathmatch play. During this + // time I won't be able to fire weapons or use items. + + if(dm->isDM()) + ent->client->respawn_invuln_time=level.time + RESPAWN_INVULN_TIME; + + // If we are playing netplay... + + if(dm->isDM()) + { + // ...confirm that there are no residual effects on the entity after death... + + fxRunner.clearContinualEffects(ent); + ent->s.effects &= ~EF_INVIS_PULSE; + ent->client->ghosted = false; + + // ...then put a spawn effect around the player. + + fxRunner.exec("environ/prespawn", ent->s.origin); + + gi.sound(ent, CHAN_BODY, gi.soundindex("dm/prespawn.wav"), .6, ATTN_NORM, 0); + } + } + + // initialise amount of money the player has (this most likely needs to go into client_persistant) +// client->m_PlayerStats.Init(); +// game.GameStats->AddClientToStatsList(ent); + //for buying stuff before a mission--should start up before the whole dam map gets loaded in, and only do it for appropriate maps. +// game.GameStats->EnterBuyMode(ent); + + // Ensure that the primary fire button works normally. Respawning modifies + // this behaviour. + + client->oktofire=true; + + // Start level music playing. + + if(level.baseSong) + StartMusic(ent, level.baseSong); + + // Reset any damage incurred movement rate reduction. + + ent->client->moveScale=0.0; +} + +/* +===================== +ClientBeginDeathmatch + +A client has just connected to the server in deathmatch mode, so clear +everything out before starting them. +===================== +*/ + +void flushPlayernameColors(edict_t &ent); + +void ClientBeginDeathmatch (edict_t *ent) +{ + G_InitEdict (ent); + + InitClientResp (ent->client); + + // When first connecting, we always want to start with a zero init'd + // inventory and issue a (reliable) instruction to restart the player's + // client-side inventory system. + + W_InitInv(*ent); + sendRestartPrediction(ent); + + // Flush these out. + + flushPlayernameColors((edict_t &)*ent); + + // Special DM mod-dependent stuff - DO NOT FREAKING MOVE THIS OR YOU WILL FEEL MY WRATH!!!! + + dm->clientConnect(*ent); + + // Drop us into the game. + + PB_KillBody(*ent); + + PutClientInServer (ent); + gi.SP_Print(NULL, DM_GENERIC_ENTERED, ent->client->pers.netname); // client might not know this name yet + gi.welcomeprint(ent); + + // Make sure all view stuff is valid. + + ClientEndServerFrame (ent); +} + +/* +=========== +ClientBegin + +Called when a client has finished connecting, and is ready to be placed into +the game. This will happen every level load. +============ +*/ + +void ClientBegin (edict_t *ent) +{ + int i; + + ent->client = game.clients + (ent - g_edicts - 1); + + // Special for DM. + + if (dm->isDM()) + { + ClientBeginDeathmatch (ent); + return; + } + + // 1/11/00 kef -- it was the case that replaying a level would allow you to see the wonderful + //'Mission Objectives Updated' message at the top of the screen during the second showing of + //the intro cinematic. not good. I hope and hope and hope it's okay to zero out the missionStatus + //here, cuz I don't want to have to figure out a way to save it during the intro. + if (level.missionStatus) + { + level.missionStatus = 0; + } + + // If this ever gets written to do anything - do not move this without checking it's + // safe to do so!!! + + dm->clientConnect(*ent); + + // If there is already a body waiting for us (a loadgame), just take it, + // otherwise spawn one from scratch. + + if (ent->inuse) + { + // The client has cleared the client side viewangles upon connecting + // to the server, which is different than the state when the game is + // saved, so we need to compensate with deltaangles. + + for (i=0 ; i<3 ; i++) + ent->client->ps.pmove.delta_angles[i] = ANGLE2SHORT(ent->client->ps.viewangles[i]); + + // Issue a (reliable) instruction to restart the player's client-side + // inventory system then issue a (reliable) instruction to re-sync the + // player's client-side inventory with the player's server side inventory + // system. + + sendRestartPrediction(ent); + RebuildPredictedClientInv(ent); + W_RefreshWeapon(*ent); + ent->client->ps.fov=ent->client->pers.fov; + } + else + { + // A spawn point will completely reinitialize the entity except for the + // persistant data that was initialized at ClientConnect() time. + + G_InitEdict (ent); + ent->classname = "player"; + InitClientResp (ent->client); + + if(!ent->client->inv) + { + // When first connecting, we always want to start with a zero init'd + // inventory and issue a (reliable) instruction to restart the player's + // client-side inventory system. + + W_InitInv(*ent); + sendRestartPrediction(ent); + } + else + { + // Loading from an autosave... we need to restore pers.curWeaponType. + + if(ent->client->inv->getCurWeaponType()) + ent->client->pers.curWeaponType=ent->client->inv->getCurWeaponType(); + } + + // Drop us into the game. + + PutClientInServer (ent); + } + + if (level.intermissiontime) + { + MoveClientToIntermission (ent, false); + } + else + { + // Send welcome message if in a multiplayer game. + if (game.maxclients > 1) + { + gi.welcomeprint(ent); + } + } + + // Make sure all view stuff is valid. + + ClientEndServerFrame (ent); + + extern edict_t* WorldSpawnScriptRunner; + + if (WorldSpawnScriptRunner) // run script specified in worldspawn key/values + { + WorldSpawnScriptRunner->use(WorldSpawnScriptRunner, WorldSpawnScriptRunner, ent); + } + +} + + +/* +=========== +ClientUserInfoChanged + +Called whenever the player updates a userinfo variable. The game can override +any of the settings in place (forcing skins or names, etc) before copying it off. +============ +*/ + +void ClientUserinfoChangedBasic (edict_t *ent, char *userinfo) +{ + char *s; + int playernum; + + // Check for malformed or illegal info strings. + + if (!Info_Validate(userinfo)) + strcpy (userinfo, "\\name\\badinfo\\skin\\mullins"); + + // Set name. + + s = Info_ValueForKey (userinfo, "name"); + strncpy (ent->client->pers.netname, s, sizeof(ent->client->pers.netname)-1); + + // Set spectator mode. + + s = Info_ValueForKey (userinfo, "spectator"); + + if (deathmatch->value && *s && strcmp(s, "0")) + ent->client->pers.spectator = true; + else + ent->client->pers.spectator = false; + + // Save bestweapon value (off, safe or unsafe)? + + s = Info_ValueForKey (userinfo, "bestweap"); + strncpy (ent->client->pers.bestweap,s,sizeof(ent->client->pers.bestweap)-1); + + // Init the player's body. If not everything went as planned, adjust skin + // and teaminfo accordingly. Single player always defaults to mullins, + // regardless of what the client's skin and teamname are set to. + + if((ent->client->pers.connected)||(!dm->isDM())) + { + char skin[128],teamname[128]; + + Com_sprintf(teamname,sizeof(teamname),Info_ValueForKey(userinfo,"teamname")); + Com_sprintf(skin,sizeof(skin),Info_ValueForKey(userinfo,"skin")); + + if(!PB_InitBody(*ent,userinfo)) + { + // Wern't able to use skin / teamname combination, so get correct skin + // and teamname... + + char newSkin[128],newTeamname[128]; + + PB_GetActualSkinName(ent,newSkin); + PB_GetActualTeamName(ent,newTeamname); + + if(dm->isDM()) + { + // ... and make sure skin and teamname are valid on the client + // - flaggin them as corrected (*) in order for the client to + // display a warning message in DM. + + if(stricmp(newSkin,skin)) + { + skin[0]='*'; + skin[1]=0; + strcat(skin+1,newSkin); //FIXME: + Info_SetValueForKey(userinfo,"skin",newSkin); + } + + if(strcmp(newTeamname,teamname)) + { + teamname[0]='*'; + teamname[1]=0; + strcat(teamname+1,newTeamname); //FIXME: + Info_SetValueForKey(userinfo,"teamname",newTeamname); + } + } + else + { + // ... but in Single player we don't care, so just make sure skin + // and teamname are valid on the client. + + strcpy(skin,newSkin); //FIXME: + strcpy(teamname,newTeamname);//FIXME: + Info_SetValueForKey(userinfo,"skin",newSkin); + Info_SetValueForKey(userinfo,"teamname",newTeamname); + } + + // Combine name, teamname and skin into a configstring. + + playernum = ent-g_edicts-1; + + gi.configstring(CS_PLAYERSKINS+playernum,va("%s\\%s\\%s",ent->client->pers.netname,teamname,skin)); + } + } + + + // Save off the userinfo in case we want to check something later. + + strncpy (ent->client->pers.userinfo, userinfo, sizeof(ent->client->pers.userinfo)-1); + + if(ent->client->inv) + { + sharedEdict_t sh; + + sh.inv = (inven_c *)ent->client->inv; + sh.edict = ent; + sh.inv->setOwner(&sh); + + sh.inv->rulesSetBestWeaponMode(Info_ValueForKey(ent->client->pers.userinfo,"bestweap")); + } +} + + + +/* +=========== +ClientUserInfoChanged + +Called whenever the player updates a userinfo variable. The game can override +any of the settings in place (forcing skins or names, etc) before copying it off. +============ +*/ + +void ClientUserinfoChanged (edict_t *ent, char *userinfo, bool not_first_time) +{ + char *s; + int playernum; + char tempSkin[128],tempTeamname[128]; + + // Check for malformed or illegal info strings. + + if (!Info_Validate(userinfo)) + strcpy (userinfo, "\\name\\badinfo\\skin\\mullins"); + + // Set name. + + s = Info_ValueForKey (userinfo, "name"); + if(stricmp(ent->client->pers.netname, s)) + { + strncpy (ent->client->pers.netname, s, sizeof(ent->client->pers.netname)-1); + playernum = ent-g_edicts-1; + + PB_GetActualSkinName(ent,tempSkin); + PB_GetActualTeamName(ent,tempTeamname); + + gi.configstring(CS_PLAYERSKINS+playernum,va("%s\\%s\\%s",ent->client->pers.netname,tempTeamname,tempSkin)); + } + + // Set spectator mode. + + s = Info_ValueForKey (userinfo, "spectator"); + + if (deathmatch->value && *s && strcmp(s, "0")) + ent->client->pers.spectator = true; + else + ent->client->pers.spectator = false; + + // Save bestweapon value (off, safe or unsafe)? + + s = Info_ValueForKey (userinfo, "bestweap"); + strncpy (ent->client->pers.bestweap,s,sizeof(ent->client->pers.bestweap)-1); + + // Init the player's body. If not everything went as planned, adjust skin + // and teaminfo accordingly. Single player always defaults to mullins, + // regardless of what the client's skin and teamname are set to. + + if((ent->client->pers.connected)||(!dm->isDM())) + { + if (dm->isDM() && (deathmatch->value == DM_CTF)) + { + dm->AssignTeam(ent, userinfo); + } + else + { + char skin[128],teamname[128]; + + Com_sprintf(teamname,sizeof(teamname),Info_ValueForKey(userinfo,"teamname")); + Com_sprintf(skin,sizeof(skin),Info_ValueForKey(userinfo,"skin")); + + if(!PB_InitBody(*ent,userinfo)) + { + // Wern't able to use skin / teamname combination, so get correct skin + // and teamname... + + char newSkin[128],newTeamname[128]; + + PB_GetActualSkinName(ent,newSkin); + PB_GetActualTeamName(ent,newTeamname); + + if(dm->isDM()) + { + + // ... and make sure skin and teamname are valid on the client + // - flaggin them as corrected (*) in order for the client to + // display a warning message in DM. + + if(stricmp(newSkin,skin)) + { + skin[0]='*'; + skin[1]=0; + strcat(skin+1,newSkin); //FIXME: + Info_SetValueForKey(userinfo,"skin",newSkin); + } + + if(strcmp(newTeamname,teamname)) + { + teamname[0]='*'; + teamname[1]=0; + strcat(teamname+1,newTeamname); //FIXME: + Info_SetValueForKey(userinfo,"teamname",newTeamname); + } + + // If something changed, and we are in teamplay mode, and it's + // not our first time through AND we're not specatating, then + // we'd better gib the player. + + if ((teamname[0] =='*' || skin[0] == '*') && (dm->dmRule_TEAMPLAY()) && not_first_time && + (ent->client->pers.spectator==false)) + { + ent->flags &= ~FL_GODMODE; + ent->health = 0; + meansOfDeath = MOD_SUICIDE; + player_die (ent, ent, ent, 100000, vec3_origin); + // Don't even bother waiting for death frames before respawning. + ent->deadflag = DEAD_DEAD; + } + } + else + { + // ... but in Single player we don't care, so just make sure skin + // and teamname are valid on the client. + + strcpy(skin,newSkin); //FIXME: + strcpy(teamname,newTeamname);//FIXME: + Info_SetValueForKey(userinfo,"skin",newSkin); + Info_SetValueForKey(userinfo,"teamname",newTeamname); + } + + // Combine name, teamname and skin into a configstring. + + playernum = ent-g_edicts-1; + + gi.configstring(CS_PLAYERSKINS+playernum,va("%s\\%s\\%s",ent->client->pers.netname,teamname,skin)); + } + + // If the teamname changed, and we are in teamplay mode, and it's + // not our first time through AND we're not spectating, then we'd + // better gib the player. + + if (dm->isDM() && (dm->dmRule_TEAMPLAY()) && (not_first_time && teamname[0] == '*') && + (ent->client->pers.spectator==false)) + { + ent->flags &= ~FL_GODMODE; + ent->health = 0; + meansOfDeath = MOD_SUICIDE; + player_die (ent, ent, ent, 100000, vec3_origin); + // Don't even bother waiting for death frames before respawning. + ent->deadflag = DEAD_DEAD; + } + } + } + + // Save off the userinfo in case we want to check something later. + + strncpy (ent->client->pers.userinfo, userinfo, sizeof(ent->client->pers.userinfo)-1); + + if(ent->client->inv) + { + sharedEdict_t sh; + + sh.inv = (inven_c *)ent->client->inv; + sh.edict = ent; + sh.inv->setOwner(&sh); + + sh.inv->rulesSetBestWeaponMode(Info_ValueForKey(ent->client->pers.userinfo,"bestweap")); + } +} + +void W_KillInv(edict_t &ent) +{ + if(ent.client->inv) + pe->KillInv((inven_c *)ent.client->inv); + + ent.client->inv=NULL; +} + +void W_InitInv(edict_t &ent) +{ + W_KillInv(ent); + + ent.client->inv=pe->NewInv(); +} + +void W_RefreshWeapon(edict_t &ent) +{ + sharedEdict_t sh; + + sh.inv = (inven_c *)ent.client->inv; + sh.edict = &ent; + sh.inv->setOwner(&sh); + + pe->RefreshWeapon((inven_c *)ent.client->inv); +} + +/* +=========== +ClientConnect + +Called when a player begins connecting to the server. +The game can refuse entrance to a client by returning false. +If the client is allowed, the connection process will continue +and eventually get to ClientBegin() +Changing levels will NOT cause this to be called again, but +loadgames will. +============ +*/ + +qboolean ClientConnect (edict_t *ent, char *userinfo) +{ + char *value; + + // check to see if they are on the banned IP list + value = Info_ValueForKey (userinfo, "ip"); + if (gi.FilterPacket(value)) + { + Info_SetValueForKey(userinfo, "rejmsg", "rejected_banned"); + return false; + } + + // Check for a spectator. + + value = Info_ValueForKey (userinfo, "spectator"); + + if (deathmatch->value && *value && strcmp(value, "0")) + { + int i, numspec; + + if (*spectator_password->string && strcmp(spectator_password->string, "none") && + strcmp(spectator_password->string, Info_ValueForKey (userinfo, "spectator_password"))) + { + Info_SetValueForKey(userinfo, "rejmsg", "rejected_spectator_password"); + return false; + } + + // Count spectators. + + for (i = numspec = 0; i < (int)maxclients->value; i++) + if (g_edicts[i+1].inuse && g_edicts[i+1].client->pers.spectator) + numspec++; + + if (numspec > maxspectators->value) + { + Info_SetValueForKey(userinfo, "rejmsg", "rejected_spectator_limit_exeeded"); + return false; + } + } + else + { + // Check for a password. + + value = Info_ValueForKey (userinfo, "password"); + + if (*password->string && strcmp(password->string, "none") && + strcmp(password->string, value)) + { + Info_SetValueForKey(userinfo, "rejmsg", "rejected_password"); + return false; + } + } + + // they can connect + ent->client = game.clients + (ent - g_edicts - 1); + + // if there is already a body waiting for us (a loadgame), just + // take it, otherwise spawn one from scratch + if (ent->inuse == false) + { + // clear the respawning variables + ent->client->resp.team = NOTEAM; + InitClientResp (ent->client); + InitClientPersistant (ent->client); + } + + // InitClientPersistant() sets this true - I want it false just this 1st + // time round... it's already set true below anyhow -MW. + ent->client->pers.connected = false; + + ClientUserinfoChanged (ent, userinfo, false); + + if (game.maxclients > 1) + gi.dprintf ("%s connected\n", ent->client->pers.netname); + + ent->client->pers.connected = true; + + return true; +} + +/* +=========== +ClientDisconnect + +Called when a player drops from the server. +Will not be called between levels. +============ +*/ + +void ClientDisconnect (edict_t *ent) +{ + if(!ent->client) + return; + + gi.bprintf(PRINT_HIGH, "%s disconnected\n", ent->client->pers.netname); + + + // Need to drop weapons in Realistic DM before our GhoulInsts are hosed + + dm->clientPreDisconnect(*ent); + + // 1/13/00 kef -- clean up our buddies + RemoveLeanBuddy(ent); + RemoveNugBuddy(ent); + RemoveWeaponBuddy(ent); + + // Remove any ghoul instances I owned. + + PB_KillBody(*ent); + + // Here's the safety-valve remover: + game_ghoul.RemoveObjectInstances(ent); + + // Don't want to be hanging around causing invisible agro do we!! + + gi.unlinkentity(ent); // Unlink me before making change to ent->solid. + ent->solid = SOLID_NOT; // What it says. + gi.linkentity(ent); // Relink to update my world presence. + gi.unlinkentity(ent); // Unlink me again before I say bye-bye to all. + + // Reset any other required stuff. + + ent->s.modelindex = 0; + ent->inuse = false; + ent->classname = "disconnected"; + ent->client->pers.connected = false; + gi.configstring(CS_PLAYERSKINS+ent-g_edicts-1, ""); + + // Do any rules specific disconnect stuff - DO NOT FREAKING MOVE THIS OR YOU WILL FEEL MY WRATH!!!! + + dm->clientDisconnect(*ent); +} + + +//============================================================== + + +edict_t *pm_passent; + +// pmove doesn't need to know about passent and contentmask +trace_t PM_trace (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end) +{ + trace_t trace; + + if (pm_passent->health > 0) + gi.trace (start, mins, maxs, end, pm_passent, MASK_PLAYERSOLID, &trace); + else + gi.trace (start, mins, maxs, end, pm_passent, MASK_DEADSOLID, &trace); + + return(trace); +} + +void runWeapon(edict_t *ent) +{ + sharedEdict_t sh; + + sh.inv = (inven_c *)ent->client->inv; + sh.edict = ent; + sh.inv->setOwner(&sh); + + sh.attack = ((ent->client->latched_buttons|ent->client->buttons)&BUTTON_ATTACK)&&ent->client->oktofire; + sh.altattack = (ent->client->latched_buttons|ent->client->buttons)&BUTTON_ALTATTACK; + sh.weap3 = (ent->client->latched_buttons|ent->client->buttons)&BUTTON_WEAP3; + sh.weap4 = (ent->client->latched_buttons|ent->client->buttons)&BUTTON_WEAP4; + sh.leanLeft = (ent->viewside > 0.0); + sh.leanRight = (ent->viewside < 0.0); + sh.weaponkick_angles=ent->client->weaponkick_angles; + sh.cinematicFreeze = ent->client->ps.cinematicfreeze; + sh.rejectSniper = (ent->client->ps.remote_type != REMOTE_TYPE_FPS); + sh.inv->setClientPredicting(strcmp(Info_ValueForKey(ent->client->pers.userinfo,"predicting"),"0")); + sh.framescale=1.0; + + sh.inv->frameUpdate(); + + // Attacking removes any existing invulnerabilty due to respawning. + + if(dm->isDM()&&(sh.attack|sh.altattack)) + ent->client->respawn_invuln_time=0.0F; +} + +/* +============== +g_checkOnOtherPlayer +============== +*/ + +int g_checkOnOtherPlayer(unsigned int groundEntity) +{ + int entnum=((edict_t *)groundEntity)->s.number; + + if((entnum>=1)&&(entnum<=maxclients->value)) + { + //gi.dprintf("SV: On player %\n",entnum); + return 1; + } + + return 0; +} + +/* +============== +ClientThink + +This will be called once for each client frame, which will +usually be a couple times for each server frame. +============== +*/ + +void ClientThink (edict_t *ent, usercmd_t *ucmd) +{ + gclient_t *client; + edict_t *other; + int i, j; + pmove_t pm; + + level.current_entity = ent; + client = ent->client; + + if (level.intermissiontime) + { + if(ent->client->pers.spectator) + ent->client->ps.pmove.pm_type = PM_SPECTATOR_FREEZE; + else + ent->client->ps.pmove.pm_type = PM_FREEZE; + + // Can exit intermission after ten seconds. + + if (level.time > level.intermissiontime + 10.0 && (ucmd->buttons & BUTTON_ATTACK) ) + level.exitintermission = true; + + return; + } + + pm_passent = ent; + + if (ent->client->chase_target) + { + client->resp.cmd_angles[0] = SHORT2ANGLE(ucmd->angles[0]); + client->resp.cmd_angles[1] = SHORT2ANGLE(ucmd->angles[1]); + client->resp.cmd_angles[2] = SHORT2ANGLE(ucmd->angles[2]); + } + else + { + // Quake2 doesn't handle low client framerates very well. This can be seen + // in the way jumpheights vary depending on framerate. If client framerate + // is <30fps, run some extra simulation steps. Note: this doesn't mean more + // CPU time 'cos if the client was running quick enough to avoid any problems + // with framerate, we'd be getting more move commands and thus doing more + // pmoves anyhow. + + int msec=ucmd->msec; // Save the msec. + int iterations=0; + + if((msec>33)&&ent->velocity[2]) + { + ucmd->msec=10; + iterations=msec/10; + ucmd->msec+=msec%10; + } + else + { + ucmd->msec=msec; + iterations=1; + } + + for(int ic=0;icmovetype == MOVETYPE_NOCLIP) + client->ps.pmove.pm_type = PM_NOCLIP; + else if (ent->movetype == MOVETYPE_SPECTATOR) + client->ps.pmove.pm_type = PM_SPECTATOR; + else if (ent->s.modelindex != 255) + client->ps.pmove.pm_type = PM_GIB; + else if (ent->deadflag) + client->ps.pmove.pm_type = PM_DEAD; + else if (client->ps.remote_type > REMOTE_TYPE_TPS) + { + // We're in a remote camera view, so set pm_type to show this. + client->ps.pmove.pm_type = PM_CAMERA_FREEZE; + } + else + client->ps.pmove.pm_type = PM_NORMAL; + + client->ps.pmove.gravity = sv_gravity->value; + pm.s = client->ps.pmove; + + for (i=0 ; i<3 ; i++) + { + pm.s.origin[i] = ent->s.origin[i]*8; + pm.s.velocity[i] = ent->velocity[i]*8; + } + + if(memcmp(&client->old_pmove, &pm.s, sizeof(pm.s)))//&&(ic==0)) + { + pm.snapinitial = true; + // gi.dprintf ("pmove changed!\n"); + } + + pm.cmd = *ucmd; + + // Handle run key. + + ent->client->running=false; + if((pm.cmd.buttons&BUTTON_RUN)&&(!(ent->client->ps.pmove.pm_flags&PMF_FATIGUED))) + { + pm.cmd.forwardmove*=2; + pm.cmd.sidemove*=2; + pm.cmd.upmove*=2; + ent->client->running=true; + } + + // Handle movement scaling for limping etc. + + float moveScale=((float)((byte)(dm->clientGetMovescale(ent)*255)))/255; + pm.cmd.forwardmove*=moveScale; + pm.cmd.sidemove*=moveScale; + + pm.trace = PM_trace; // adds default parms + pm.pointcontents = gi.pointcontents; + pm.checkOnOtherPlayer = g_checkOnOtherPlayer; + + // Friction can be reduced on the server side by something like a knockback... + if (client->friction_time > level.time) + { + pm.friction_loss = client->friction_time - level.time; + } + + // Do the move. + gi.Pmove (&pm); + + // Save results of pmove. + client->ps.pmove = pm.s; + client->old_pmove = pm.s; + + for (i=0 ; i<3 ; i++) + { + ent->s.origin[i] = pm.s.origin[i]*0.125; + ent->velocity[i] = pm.s.velocity[i]*0.125; + } + + VectorCopy (pm.mins, ent->mins); + VectorCopy (pm.maxs, ent->maxs); + + client->resp.cmd_angles[0] = SHORT2ANGLE(ucmd->angles[0]); + client->resp.cmd_angles[1] = SHORT2ANGLE(ucmd->angles[1]); + client->resp.cmd_angles[2] = SHORT2ANGLE(ucmd->angles[2]); + + if (ent->groundentity && !pm.groundentity && (pm.cmd.upmove >= 10) && (pm.waterlevel == 0)) + { + gi.sound(ent, CHAN_VOICE, gi.soundindex("player/jump.wav"), .6, ATTN_NORM, 0); + // PlayerNoise(ent, ent->s.origin, PNOISE_SELF); + } + + ent->viewside = pm.cmd.lean; + ent->viewheight = pm.viewheight; + ent->waterlevel = pm.waterlevel; + ent->watertype = pm.watertype; + ent->groundentity = pm.groundentity; + if (pm.groundentity) + ent->groundentity_linkcount = pm.groundentity->linkcount; + + if (ent->deadflag) + { + client->ps.viewangles[ROLL] = 40; + client->ps.viewangles[PITCH] = -15; + client->ps.viewangles[YAW] = client->killer_yaw; + } + else// if (client->ps.remote_id < 0) + { + // 1st and 3rd person views, but NOT remote camera views, allow us to mess with the angles. + + VectorCopy (pm.viewangles, client->v_angle); + VectorCopy (pm.viewangles, client->ps.viewangles); + } + + gi.linkentity (ent); + + ent->svflags &= ~SVF_ISHIDING; + + if ((ent->movetype != MOVETYPE_NOCLIP)&&(ent->movetype != MOVETYPE_SPECTATOR)) + G_TouchTriggers (ent); + + // touch other objects + for (i=0 ; itouch) + continue; + other->touch (other, ent, NULL, NULL); + } + + ucmd->msec=10; + } + + ucmd->msec=msec; // Restore the msec. + } + + client->oldbuttons = client->buttons; + client->buttons = ucmd->buttons; + client->latched_buttons |= client->buttons & ~client->oldbuttons; + + if(ucmd->fireEvent) + ent->client->fireEvent=ucmd->fireEvent; + + if(ucmd->altfireEvent) + ent->client->altfireEvent=ucmd->altfireEvent; + + if(!client->oktofire) + { + if((client->buttons&(client->buttons^client->oldbuttons))&BUTTON_ATTACK) + client->oktofire=true; + else + ent->client->fireEvent=0; + } + + // Save light level the player is standing on for monster sighting AI. + + ent->light_level = ucmd->lightlevel; + + IsPlayerTargetSameTeam(ent); + + // Very poorly named! + + clUse(ent); + + if(client->resp.spectator) + { + if(client->latched_buttons & BUTTON_ATTACK) + { + // Toggle between normal spectator mode / chase cam. + + if (client->chase_target) + { + // Ensure we don't get stuck in BSP when coming out of chasecam. + + vec3_t mins={-20,-20,-24},maxs={20,20,40};// Don't screw with these!!! + trace_t trace; + + gi.trace(ent->s.origin,mins,maxs,ent->s.origin,ent,MASK_SOLID,&trace); + + if(trace.startsolid) + VectorCopy(client->chase_target->s.origin,ent->s.origin); + + // Clear chasecam stuff. + + client->chase_target = NULL; + client->ps.pmove.pm_flags &= ~PMF_NO_PREDICTION; + } + else + { + GetChaseTarget(ent); + } + } + else if(client->latched_buttons & BUTTON_USE) + { + // Select next / prev chase cam target (or select one if not in chase cam). + + if (client->chase_target) + ChaseNext(ent); + else + GetChaseTarget(ent); + } + + client->latched_buttons = 0; + } + + // Update chase cam(s) if I'm being followed. + + for(i=1; i <= (int)maxclients->value; i++) + { + other = g_edicts + i; + + if (other->inuse && other->client->chase_target == ent) + UpdateChaseCam(other); + } +} + + +extern int notargglobalcheck; + +/* +============== +ClientBeginServerFrame + +This will be called once for each server frame, before running any other entities +in the world. +============== +*/ + +void ClientBeginServerFrame (edict_t *ent) +{ + gclient_t *client; + int buttonMask; + + if (level.intermissiontime) + return; + + UpdateMusicLevel(ent); + + client = ent->client; + + if(deathmatch->value && + client->pers.spectator != client->resp.spectator && + (level.time - client->respawn_time) >= 5) + { + spectator_respawn(ent); + return; + } + + if (ent->deadflag) + { + // Wait for any button just going down. + + if ( level.time > client->respawn_time) + { + // In deathmatch, only wait for attack button. + + if (dm->isDM()) + buttonMask = BUTTON_ATTACK; + else + buttonMask = -1; + + if((client->latched_buttons & buttonMask)||(dm->isDM()&&dm->dmRule_FORCE_RESPAWN())) + { + respawn(ent); + + client->latched_buttons = 0; + + // When the fire button is depressed to respawn, we need to ensure that + // the respawning player's weapon won't fire at the same time. Only when + // they press the fire button again will weapon firing operate. + + client->oktofire=false; + client->buttons|=BUTTON_ATTACK; + client->oldbuttons|=BUTTON_ATTACK; + } + } + + return; + } + + // Run weapon animations (if not a lactator, er.. spectator I mean). + + if(!client->resp.spectator) + runWeapon(ent); + + if(client->inv) + { + if(client->inv->inDisguise()) + { + ent->flags |= FL_NOTARGET; + } + else if(!notargglobalcheck) + { + ent->flags &= ~(FL_NOTARGET); + } + } + + // Add player trail so monsters can follow. + + if (!dm->isDM()) + if (!gmonster.Visible (ent, PlayerTrail_LastSpot() ) ) + PlayerTrail_Add (ent->s.origin); + + client->latched_buttons = 0; + + // 1/12/00 kef -- update thePickupList every frame. explains the function name, doesn't it? + thePickupList.FrameUpdate(); +} + +void clUse (edict_t *ent) +{ + float useRange; + edict_t *curSearch=NULL; + vec3_t looking; + edict_t *bestSearch = NULL; + vec3_t source; + trace_t tr; + + if (!ent->client)return; + + //this func only gets called when a button is released... + if((!(ent->client->oldbuttons & BUTTON_USE))||(ent->client->buttons & BUTTON_USE))return; + + useRange = 80; + AngleVectors(ent->client->ps.viewangles,looking,NULL,NULL); + + VectorCopy(ent->s.origin, source); + source[2] += ent->client->ps.viewoffset[2]; + + //search around me for the nearest ent that i can use + //gack! this is not ideal for bmodels! +/* CRadiusContent rad(source, useRange); + + for(int i = 0; i < rad.getNumFound(); i++) // this doesn't work here so don't freakin' use it + { + curSearch = rad.foundEdict(i); + +*/ + // first, check if our bbox is intersecting with a trigger + if (curSearch = performTriggerSearch(ent, source, (ent->maxs[0] - ent->mins[0])*0.5)) + { // yup. we're in a trigger. + } + else + { // not in a trigger. check for nearby entities, then. + curSearch = performEntitySearch(ent, source, useRange); + } + bestSearch = curSearch; + + //if i found someone with the search, use im + if (bestSearch && bestSearch->plUse) + { + bestSearch->plUse(bestSearch,ent,ent); + } + else + {//if i didn't find anything, do a traceline to find something to use (to catch bmodels that have weird origins) + VectorScale(looking, 75, looking); + VectorAdd(looking, source, looking); + + gi.trace(source, NULL, NULL, looking, ent, MASK_PLAYERSOLID, &tr); + + if((tr.fraction < 1.0)&&(tr.ent == world)) + { // I would like this to happen only on double taps since use is also a lean sort of thing + FX_StrikeWall(tr.endpos, tr.surface->flags>>24); + PlayerNoise(ent, ent->s.origin, AI_SENSETYPE_SOUND_INVESTIGATE, 0, 400, gmonster.GetClientNode());//base radius off surface type? + } + else if (tr.ent && tr.ent->plUse) + { + tr.ent->plUse(tr.ent,ent,ent); + } + } +} + +/* +============== +GetPlayerStats +============== +*/ +/* +CPlayerStats *GetPlayerStats(edict_t *ent) +{ + return(&ent->client->m_PlayerStats); +} +*/ + +void IsPlayerTargetSameTeam(edict_t *source) +{ + vec3_t start; + vec3_t fwd; + vec3_t end; + + assert(source->client); + + VectorCopy(source->s.origin, start); + start[2] += 26;//? + + vec3_t right; + AngleVectors(source->client->ps.viewangles, fwd, right, 0); + + VectorMA(start, 2.5 * source->client->ps.kick_angles[ROLL], right, start);//account for lean + + VectorMA(start, 2000, fwd, end); + + trace_t tr; + + gi.trace(start, 0, 0, end, source, MASK_PROJ, &tr); + + // 1/5/00 kef -- if our trace hit someone's LeanBuddy(TM) or NugBuddy(TM), treat it like the + //trace actually hit the buddy's owner + if (tr.ent && (tr.ent->svflags & SVF_BUDDY) && GetBuddyOwner(tr.ent)) + { + tr.ent = GetBuddyOwner(tr.ent); + + //make sure the owner of this buddy is really infront of me + vec3_t toBuddyOwnerDir; + VectorSubtract(tr.ent->s.origin, source->s.origin, toBuddyOwnerDir); + VectorNormalize(toBuddyOwnerDir); + //yikes! not in front of me! + if (DotProduct(fwd, toBuddyOwnerDir)<0) + { + source->client->ps.stats[STAT_FLAGS] &= ~(STAT_FLAG_TEAM|STAT_FLAG_HIT); + return ; + } + } + + // If we're looking at a dead thing, we don't wanna color the crosshair. + + if (tr.ent && (tr.ent->health <= 0)) + { + source->client->ps.stats[STAT_FLAGS] &= ~(STAT_FLAG_TEAM|STAT_FLAG_HIT); + return; + } + + if (OnSameTeam(source, tr.ent)) + { + source->client->ps.stats[STAT_FLAGS] |= STAT_FLAG_HIT|STAT_FLAG_TEAM; + return; + } + + // don't color the crosshair for iraqi civilians and the like + if ((IsInnocent(tr.ent))&&(!dm->isDM())) + { + source->client->ps.stats[STAT_FLAGS] &= ~(STAT_FLAG_TEAM|STAT_FLAG_HIT); + return; + } + + if ((tr.ent->takedamage)&&((tr.ent->ai)||(tr.ent->client))) + { + source->client->ps.stats[STAT_FLAGS] &= ~STAT_FLAG_TEAM; + source->client->ps.stats[STAT_FLAGS] |= STAT_FLAG_HIT; + return; + } + source->client->ps.stats[STAT_FLAGS] &= ~(STAT_FLAG_TEAM|STAT_FLAG_HIT); + + return ; +} + +void AddWeaponTypeForPrecache(int type) +{ + level.weaponsAvailable |= (1<client) + { + ent->client->moveScale=((ent->client->moveScale+inc)>0.5)?0.5:ent->client->moveScale+inc; + } +} + +void resetMovescale(edict_t *ent,float newScale) +{ + if (ent && ent->client) + { + ent->client->moveScale=newScale; + } +} + +float getFireEvent(edict_t *ent) +{ + return(ent->client->fireEvent); +} + +void clearFireEvent(edict_t *ent) +{ + ent->client->fireEvent=0; +} + +float getAltfireEvent(edict_t *ent) +{ + return(ent->client->altfireEvent); +} + +void clearAltfireEvent(edict_t *ent) +{ + ent->client->altfireEvent=0; +} \ No newline at end of file diff --git a/Source/Game/gamecpp/p_hud.cpp b/Source/Game/gamecpp/p_hud.cpp new file mode 100644 index 0000000..75bb28e --- /dev/null +++ b/Source/Game/gamecpp/p_hud.cpp @@ -0,0 +1,418 @@ +#include "g_local.h" +#include "q_sh_interface.h" +#include "fields.h" +#include "..\qcommon\ef_flags.h" + +extern float s_levelStatusBegin; // declared in g_cmds.cpp + + +/* +================== +MoveClientToIntermission +================== +*/ + +void MoveClientToIntermission(edict_t *ent, qboolean log_file) +{ + if (dm->isDM()) + ent->client->showscores = true; + + VectorCopy (level.intermission_origin, ent->s.origin); + ent->client->ps.pmove.origin[0] = level.intermission_origin[0]*8; + ent->client->ps.pmove.origin[1] = level.intermission_origin[1]*8; + ent->client->ps.pmove.origin[2] = level.intermission_origin[2]*8; + VectorCopy (level.intermission_angle, ent->client->ps.viewangles); + + if(ent->client->pers.spectator) + ent->client->ps.pmove.pm_type = PM_SPECTATOR_FREEZE; + else + ent->client->ps.pmove.pm_type = PM_FREEZE; + + ent->client->ps.blend[3] = 0; + ent->client->ps.rdflags &= ~RDF_UNDERWATER; + + ent->viewheight = 0; + ent->s.modelindex = 0; + ent->s.effects = 0; + ent->s.sound = 0; + ent->solid = SOLID_NOT; + ent->s.renderfx &= ~(RF_GHOUL); + + // Add the layout. + + if (dm->isDM()) + dm->clientScoreboardMessage(ent,NULL,log_file); + + // Need to clear ps.gun or we'll end up trying to use an invalid ghoul + // instance in SV_BuildClientFrame(). + + ent->client->ps.gun=0; +} + +/* +================== +BeginIntermission +================== +*/ + +void BeginIntermission (edict_t *targ) +{ + int i; + edict_t *ent,*client; + + if (level.intermissiontime) + { + // Intermission already activated. + + return; + } + + game.autosaved = false; + + // Respawn any dead clients. + + for (i=0 ; i < (int)maxclients->value ; i++) + { + client = g_edicts + 1 + i; + + if (!client->inuse) + continue; + + if (client->health <= 0) + respawn(client); + } + + level.intermissiontime = level.time; + level.changemap = targ->map; + + if(strstr(level.changemap, "*")) + { + // New unit started. What are we doing in SoF? New mission? + } + else + { + if (!dm->isDM()) + { + // Go immediately to the next level. + + level.exitintermission = 1; + + // Ensure player's gun is turned off. + + g_edicts[1].client->ps.gun=0; + + return; + } + } + + level.exitintermission = 0; + + // Find an intermission spot. + + ent = G_Find (NULL, FOFS(classname), "info_player_intermission"); + + if (!ent) + { + // The map creator forgot to put in an intermission point. + + ent = G_Find (NULL, FOFS(classname), "info_player_start"); + + if (!ent) + ent = G_Find (NULL, FOFS(classname), "info_player_deathmatch"); + } + else + { + // Chose one of four spots. + + i = rand() & 3; + + while (i--) + { + ent = G_Find (ent, FOFS(classname), "info_player_intermission"); + if (!ent) + { + // Wrap around the list. + + ent = G_Find (ent, FOFS(classname), "info_player_intermission"); + } + } + } + + VectorCopy (ent->s.origin, level.intermission_origin); + VectorCopy (ent->s.angles, level.intermission_angle); + + // Move all clients to the intermission point. + + for (i=0 ; i < (int)maxclients->value ; i++) + { + client = g_edicts + 1 + i; + + if (!client->inuse) + continue; + + if (!i) + MoveClientToIntermission(client, true); + else + MoveClientToIntermission(client, false); + } +} + +/* +================== +Cmd_Score_f + +Display the scoreboard. +================== +*/ + +void Cmd_Score_f (edict_t *ent) +{ + ent->client->showinventory = false; + ent->client->showhelp_time = level.time; + + if(ent->client->showscores) + { + ent->client->showscores = false; + return; + } + + ent->client->showscores = true; + dm->clientScoreboardMessage(ent,ent->enemy,false); +} + +/* +================== +Cmd_Help_f + +Display the help message. +================== +*/ + +void Cmd_Help_f (edict_t *ent) +{ + if(level.intermissiontime) + return; + + ent->client->showinventory = false; + ent->client->showscores = false; + + if(ent->client->showhelp_time > level.time) + { + ent->client->showhelp_time = level.time; + return; + } + + ent->client->showhelp_time = level.time+30.0; + dm->clientHelpMessage(ent); +} + +//======================================================================= + +/* +=============== +G_SetStats +=============== +*/ + +void G_SetStats (edict_t *ent) +{ + float fMaxObjectivesDisplayTime = 5.0; + + vec3_t holdorigin; + trace_t tr; + + // + // health + // + + ent->client->ps.stats[STAT_HEALTH] = ent->health; + + // + // ammo + // + + ent->client->ps.stats[STAT_CLIP_AMMO] = ent->client->inv->getCurClip(); + ent->client->ps.stats[STAT_CLIP_MAX] = ent->client->inv->getClipMax(); + ent->client->ps.stats[STAT_AMMO] = ent->client->inv->getCurAmmo(); + ent->client->ps.stats[STAT_WEAPON] = (!level.intermissiontime)?ent->client->inv->getCurWeaponType():0; + ent->client->ps.stats[STAT_INV_TYPE] = ent->client->inv->getCurItemType(); + ent->client->ps.stats[STAT_INV_COUNT] = ent->client->inv->getCurItemAmount(); + ent->client->ps.stats[STAT_ARMOR] = ent->client->inv->getArmorCount(); + ent->client->ps.stats[STAT_FLAGS] = (ent->client->ps.stats[STAT_FLAGS] & 0xf0) | (ent->client->inv->scopeIsActive() ? STAT_FLAG_SCOPE : 0); + + + // We kill all effects on the entity when respawned. This checks for and releases it. + if (ent->client->respawn_time+0.5 <= level.time && ent->client->RemoteCameraLockCount<=0) + { + ent->s.effects &= ~EF_KILL_EFT; + } + +#if 1 + if(ent->client->respawn_invuln_time>level.time) + { + if(!ent->client->ghosted) + { + IGhoulInst *inst=ent->ghoulInst; + + if(inst) + { + float r,g,b,a; + + inst->GetTint(&r,&g,&b,&a); + a=0.5F; + inst->SetTint(r, g, b, a); + + ent->client->ghosted=true; + } + } + } + else + { + if(ent->client->ghosted) + { + IGhoulInst *inst=ent->ghoulInst; + + if(inst) + { + float r,g,b,a; + + inst->GetTint(&r,&g,&b,&a); + a=1.0F; + inst->SetTint(r, g, b, a); + + ent->client->ghosted=false; + } + } + } + +#else // The fancier client-side version has a problem, since when a faded actor goes out of the PVS, it doesn't unfade. + + // Put the invulnerability effect on the player + if(ent->client->respawn_invuln_time>level.time) + { + if(!ent->client->ghosted) + { + // There may be a chance that we are still in a fade, which would interfere with continual fx. + fxRunner.clearContinualEffects(ent); + + // Add the sparkly invulnerable effect +// fxRunner.execContinualEffect("environ/invuln", ent); + + // Also add the EF_FLAG to make the model pulse. + ent->s.effects |= EF_INVIS_PULSE; + + ent->client->ghosted = true; + } + } + else + { + if(ent->client->ghosted) + { + // Remove the sparkly invulnerable effect +// fxRunner.stopContinualEffect("environ/invuln", ent); + + // Remove the EF_FLAG that makes the model pulse. + ent->s.effects &= ~EF_INVIS_PULSE; + + // Make sure the client side tinting is reset. + FX_SetEvent(ent, EV_TINTCLEAR); + + ent->client->ghosted = false; + } + } +#endif + + // + // layouts + // + + ent->client->ps.stats[STAT_LAYOUTS] = 0; + + if(dm->isDM()) + { + // Dead, or end of game, or showing scoreboard or help layouts? + + if(ent->client->pers.health <= 0 || level.intermissiontime || + ent->client->showscores || ent->client->showhelp_time>level.time) + { + ent->client->ps.stats[STAT_LAYOUTS] |= 1; + } + + // DM ranking (not a layout tho' - part of HUD instead). + + ent->client->ps.stats[STAT_LAYOUTS] |= 2; + } + else + { + // Showing scoreboard, or help layouts? + + if(ent->client->showscores || ent->client->showhelp) + ent->client->ps.stats[STAT_LAYOUTS] |= 1; + } + + // + // frags + // + + ent->client->ps.stats[STAT_FRAGS] = ent->client->resp.score; + +// ent->client->ps.stats[STAT_DAMAGELOC] = (short) (ent->client->ps.damageLoc); + + ent->client->ps.damageLoc = 0; + + ent->client->ps.stats[STAT_DAMAGEDIR] = (short) (ent->client->ps.damageDir); + ent->client->ps.damageDir = 0; + + if (ent->client->ps.stats[STAT_FLAGS]) + { + VectorCopy(ent->s.origin,holdorigin); + holdorigin[2] += 10000; + gi.trace(ent->s.origin, ent->mins, ent->maxs, holdorigin, ent, MASK_MONSTERSOLID, &tr); + + if(tr.surface->flags & SURF_SKY) + { + ent->client->ps.stats[STAT_FLAGS] |= STAT_FLAG_WIND; + } + } + + // "mission failed" + if ((level.maxDeadHostages != -1) && + (level.deadHostages >= level.maxDeadHostages)) + { + ent->client->ps.stats[STAT_FLAGS] |= STAT_FLAG_MISSIONFAIL; + } + + // our countdown timer has reached zero. bad things ensue. + if (level.countdownEnded) + { + ent->client->ps.stats[STAT_FLAGS] |= STAT_FLAG_COUNTDOWN; + } + + // "mission accomplished","nearing end of mission",etc. + switch (level.missionStatus) + { + case MISSION_ACCOMPLISHED: + ent->client->ps.stats[STAT_FLAGS] |= STAT_FLAG_MISSIONACC; + break; + case MISSION_EXIT: + ent->client->ps.stats[STAT_FLAGS] |= STAT_FLAG_MISSIONEXIT; + break; + case MISSION_OBJECTIVES: + if ( (level.time - s_levelStatusBegin) < fMaxObjectivesDisplayTime) + { + ent->client->ps.stats[STAT_FLAGS] |= STAT_FLAG_OBJECTIVES; + } + break; + } + + if(stealth->value) + dm->clientStealthAndFatigueMeter(ent); + + if (level.forceHUD) + { + ent->client->ps.stats[STAT_FORCEHUD] = 1; + } + + if(ent->client->blinding_alpha>0.5) + ent->client->ps.stats[STAT_FLAGS] |= STAT_FLAG_HIDECROSSHAIR; +} diff --git a/Source/Game/gamecpp/p_trail.cpp b/Source/Game/gamecpp/p_trail.cpp new file mode 100644 index 0000000..f7fab61 --- /dev/null +++ b/Source/Game/gamecpp/p_trail.cpp @@ -0,0 +1,127 @@ +#include "g_local.h" + + +/* +============================================================================== + +PLAYER TRAIL + +============================================================================== + +This is a circular list containing the a list of points of where +the player has been recently. It is used by monsters for pursuit. + +.origin the spot +.owner forward link +.aiment backward link +*/ + + +#define TRAIL_LENGTH 8 + +edict_t *trail[TRAIL_LENGTH]; +int trail_head; +qboolean trail_active = false; + +#define NEXT(n) (((n) + 1) & (TRAIL_LENGTH - 1)) +#define PREV(n) (((n) - 1) & (TRAIL_LENGTH - 1)) + + +void PlayerTrail_Init (void) +{ + int n; + + if (dm->isDM() /* FIXME || coop */) + return; + + for (n = 0; n < TRAIL_LENGTH; n++) + { + trail[n] = G_Spawn(); + trail[n]->classname = "player_trail"; + } + + trail_head = 0; + trail_active = true; +} + + +void PlayerTrail_Add (vec3_t spot) +{ + vec3_t temp; + + if (!trail_active) + return; + + VectorCopy (spot, trail[trail_head]->s.origin); + + trail[trail_head]->timestamp = level.time; + + VectorSubtract (spot, trail[PREV(trail_head)]->s.origin, temp); + trail[trail_head]->s.angles[1] = vectoyaw (temp); + + trail_head = NEXT(trail_head); +} + + +void PlayerTrail_New (vec3_t spot) +{ + if (!trail_active) + return; + + PlayerTrail_Init (); + PlayerTrail_Add (spot); +} + + +edict_t *PlayerTrail_PickFirst (edict_t *self) +{ + int marker; + int n; + + if (!trail_active) + return NULL; + + for (marker = trail_head, n = TRAIL_LENGTH; n; n--) + { +// if(trail[marker]->timestamp <= self->monsterinfo.trail_time) +// marker = NEXT(marker); +// else +// break; + } + + if (gmonster.Visible(self, trail[marker])) + { + return trail[marker]; + } + + if (gmonster.Visible(self, trail[PREV(marker)])) + { + return trail[PREV(marker)]; + } + + return trail[marker]; +} + +edict_t *PlayerTrail_PickNext (edict_t *self) +{ + int marker; + int n; + + if (!trail_active) + return NULL; + + for (marker = trail_head, n = TRAIL_LENGTH; n; n--) + { +// if(trail[marker]->timestamp <= self->monsterinfo.trail_time) +// marker = NEXT(marker); +// else +// break; + } + + return trail[marker]; +} + +edict_t *PlayerTrail_LastSpot (void) +{ + return trail[PREV(trail_head)]; +} diff --git a/Source/Game/gamecpp/p_view.cpp b/Source/Game/gamecpp/p_view.cpp new file mode 100644 index 0000000..8103ac4 --- /dev/null +++ b/Source/Game/gamecpp/p_view.cpp @@ -0,0 +1,2119 @@ + +#include "g_local.h" +#include "q_sh_interface.h" +#include "w_weapons.h" + +#include "ai_body.h" +#include "ai_bodynoghoul.h" + +#include "p_body.h" +#include "fields.h" + +#include "g_monster.h" +#include "..\qcommon\ef_flags.h" + +void G_UpdateFrameEffects(edict_t *ent); + +static edict_t *current_player; +static gclient_t *current_client; + +static vec3_t forward, Right, up; +float xyspeed; + +float bobmove; +int bobcycle; // odd cycles are right foot going forward +float bobfracsin; // sin(bobfrac*M_PI) + + +/* +=============== +SV_CalcRoll + +=============== +*/ +float SV_CalcRoll (vec3_t angles, vec3_t velocity) +{ + float sign; + float side; + float value; + + side = DotProduct (velocity, Right); + sign = side < 0 ? -1 : 1; + side = fabs(side); + + value = sv_rollangle->value; + + if (side < sv_rollspeed->value) + side = side * value / sv_rollspeed->value; + else + side = value; + + return side*sign; + +} + +/* +=============== +P_DamageFeedback + +Handles color blends and view kicks +=============== +*/ + +void P_ResetDamageFlags(edict_t *player) +{ + if (player->flags & FL_BODY_DAMAGE) + { + player->flags -= FL_BODY_DAMAGE; + } + if (player->flags & FL_ARMOR_DAMAGE) + { + player->flags -= FL_ARMOR_DAMAGE; + } +} + +extern void remove_camera(edict_t *Self); + +void P_DamageFeedback (edict_t *player) +{ + gclient_t *client; + float side; + float realcount, count, kick; + int r, l; + static vec3_t bcolor={1.0,0.0,0.0}; + + client = player->client; + + // Players must also update burning and the like. + G_UpdateFrameEffects(player); + + // Total points of damage shot at the player this frame? + + if((count=client->damage_blood+client->damage_armor)==0) + { + // Didn't take any damage. + + return; + } + + // Start a pain animation if still in the player model. + // fixme: when it is time to start worrying about player animation, check + // the damage flags if we are going to distinguish between armor and body damage. + if (client->anim_priority < ANIM_PAIN && player->s.modelindex == 255) + { + static int i; + + client->anim_priority = ANIM_PAIN; + + //get forward... + vec3_t dest, face; + AngleVectors(client->ps.viewangles, face, NULL, NULL); + VectorMA(player->s.origin, 100, face, face); + VectorCopy(player->velocity, dest); + VectorNormalize(dest); + VectorMA(player->s.origin, 100, dest, dest); + + //best to do this elsewhere, so undamaged thrownback anim will play too --ss +/* + PB_PlaySequenceForPain(player, vec3_origin, dest, face); +*/ + } + + // Play an apropriate pain sound. + // fixme: distinguish between pain and armor sounds. + if ((level.time > player->pain_debounce_time) && !(player->flags & FL_GODMODE)) + { + r = 1 + (rand()&1); + player->pain_debounce_time = level.time + 0.7; + if (player->health < 25) + l = 25; + else if (player->health < 50) + l = 50; + else if (player->health < 75) + l = 75; + else + l = 100; +// gi.sound (player, CHAN_VOICE, gi.soundindex(va("*pain%i_%i.wav", l, r)), .6, ATTN_NORM, 0); + } + + // Cap damage count. + + realcount=count; + if(count<10) + count=10; // always make a visible effect + + // The total alpha of the blend is always proportional to count. + + if (client->damage_alpha < 0) + client->damage_alpha = 0; + client->damage_alpha += count*0.01; + if (client->damage_alpha < 0.2) + client->damage_alpha = 0.2; + if (client->damage_alpha > 0.6) + client->damage_alpha = 0.6; // don't go too saturated + + // The blend will vary based on how much was absorbed by different armors. + + if(client->damage_blood) + VectorScale(bcolor,(float)client->damage_blood/realcount,client->damage_blend); + + // + // Calculate view angle kicks. + // + + kick = abs(client->damage_knockback); + + if (kick && player->health > 0) // kick of 0 means no view adjust at all + { + kick = kick * 100 / player->health; + + if (kick < count*0.5) + kick = count*0.5; + if (kick > 50) + kick = 50; + + vec3_t v; + + VectorSubtract (client->damage_from, player->s.origin, v); + VectorNormalize (v); + + side = DotProduct (v, Right); + client->v_dmg_roll = -0.35*kick*side; + + side = -DotProduct (v, forward); + client->v_dmg_pitch = 0.35*kick*side; + + client->v_dmg_time = level.time + DAMAGE_TIME; + } + + // + // Clear totals. + // + + client->damage_blood = 0; + client->damage_knockback = 0; + client->damage_armor = 0; + + P_ResetDamageFlags (player); + + // If we're in a remote camera view, get out of it. + + if (client->ps.remote_id >= 0) + { + edict_t *camera; + + camera = NULL; + + do + { + camera = G_Find(camera,FOFS(classname),"func_remote_camera"); + + if(!camera) + { + // No quiero un access violacion. + + break; + } + + if (camera->s.number == client->ps.remote_id) + { + remove_camera(camera); + break; + } + }while(1); + } +} + + + + +/* +=============== +SV_CalcViewOffset + +Auto pitching on slopes? + + fall from 128: 400 = 160000 + fall from 256: 580 = 336400 + fall from 384: 720 = 518400 + fall from 512: 800 = 640000 + fall from 640: 960 = + + damage = deltavelocity*deltavelocity * 0.0001 + +=============== +*/ + +edict_t *MakeLeanEnt(edict_t *ent) +{ + edict_t *newEnt, *tempEnt = NULL; + + newEnt = G_Spawn(); + + newEnt->movetype = MOVETYPE_NONE; + newEnt->solid = SOLID_NOT; + newEnt->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID; + newEnt->svflags = (SVF_BUDDY|SVF_DEADMONSTER); + VectorSet (newEnt->mins, -12, -12, -16);//? + VectorSet (newEnt->maxs, 12, 12, 26); + newEnt->s.modelindex = 0; + gi.linkentity (newEnt); + // we might already have a buddy stored in our owner's targetEnt + tempEnt = ent; + while (tempEnt->targetEnt && (tempEnt->targetEnt != ent)) + { + tempEnt = tempEnt->targetEnt; // owner keeps track of us + } + tempEnt->targetEnt = newEnt; + newEnt->targetEnt = ent; // keep track of our owner + newEnt->flags |= FL_LEAN_PLAYER; + newEnt->owner = ent; // this will keep us from shooting our own buddy (very bad) + + return(newEnt); +} + +edict_t *MakeNugBuddy(edict_t *ent) +{ + edict_t *newEnt = G_Spawn(), *tempEnt = NULL; + + newEnt->movetype = MOVETYPE_NONE; + newEnt->solid = SOLID_NOT; + newEnt->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID; + newEnt->svflags = (SVF_BUDDY|SVF_DEADMONSTER); + VectorSet (newEnt->mins, -12, -12, 0); + VectorSet (newEnt->maxs, 12, 12, 8); + newEnt->s.modelindex = 0; + gi.linkentity (newEnt); + // we might already have a buddy stored in our owner's targetEnt + tempEnt = ent; + while (tempEnt->targetEnt && (tempEnt->targetEnt != ent)) + { + tempEnt = tempEnt->targetEnt; // owner keeps track of us + } + tempEnt->targetEnt = newEnt; + newEnt->targetEnt = ent; // keep track of our owner + newEnt->flags |= FL_NUGBUDDY; + newEnt->owner = ent; // this will keep us from shooting our own buddy (very bad) + + return newEnt; +} + +edict_t *MakeWeaponBuddy(edict_t *ent) +{ + edict_t *newEnt = G_Spawn(), *tempEnt = NULL; + + newEnt->movetype = MOVETYPE_NONE; + newEnt->solid = SOLID_NOT; + newEnt->clipmask = MASK_MONSTERSOLID|MASK_PLAYERSOLID; + newEnt->svflags = (SVF_BUDDY|SVF_DEADMONSTER); + VectorSet (newEnt->mins, -12, -12, -4); + VectorSet (newEnt->maxs, 12, 12, 4); + newEnt->s.modelindex = 0; + gi.linkentity (newEnt); + // we might already have a buddy stored in our owner's targetEnt + tempEnt = ent; + while (tempEnt->targetEnt && (tempEnt->targetEnt != ent)) + { + tempEnt = tempEnt->targetEnt; // owner keeps track of us + } + tempEnt->targetEnt = newEnt; + newEnt->targetEnt = ent; // keep track of our owner + newEnt->flags |= FL_WEAPONBUDDY; + newEnt->owner = ent; // this will keep us from shooting our own buddy (very bad) + + return newEnt; +} + +edict_t *GetLeanBuddy(edict_t *owner) +{ + edict_t *lean = owner; + + while (lean->targetEnt && (lean->targetEnt != owner)) + { + if (lean->targetEnt->flags & FL_LEAN_PLAYER) + { + return lean->targetEnt; + } + lean = lean->targetEnt; + } + // didn't have a lean buddy?!? + return NULL; +} + +edict_t *GetNugBuddy(edict_t *owner) +{ + edict_t *nug = owner; + + while (nug->targetEnt && (nug->targetEnt != owner)) + { + if (nug->targetEnt->flags & FL_NUGBUDDY) + { + return nug->targetEnt; + } + nug = nug->targetEnt; + } + // didn't have a nug buddy?!? + return NULL; +} + +edict_t *GetWeaponBuddy(edict_t *owner) +{ + edict_t *wpn = owner; + + while (wpn->targetEnt && (wpn->targetEnt != owner)) + { + if (wpn->targetEnt->flags & FL_WEAPONBUDDY) + { + return wpn->targetEnt; + } + wpn = wpn->targetEnt; + } + // didn't have a weapon buddy?!? + return NULL; +} + +void UpdateWeaponBuddy(edict_t *owner) +{ + edict_t *wpn = owner?GetWeaponBuddy(owner):NULL; + vec3_t fwd, right, up, boxOrigin, muzzle, viewangles; + float boxBottom = 15, // bottom of the bbox, distance from origin + boxTop = 42, // top of the box, dist from origin + boxHalfWidth = 4,//half of the width of the box + boxLength = 48; // length of the box + + + if (NULL == wpn) + { + return; + } + VectorCopy(owner->client->ps.viewangles, viewangles); + if (owner->client->ps.pmove.pm_flags & PMF_DUCKED) + { + boxBottom -= 16; + boxTop -= 16; + if (viewangles[0] > 28) + { + viewangles[0] = 28; + } + else if (viewangles[0] < -5) + { + viewangles[0] = -5; + } + } + else + { + if (viewangles[0] > 28) + { + viewangles[0] = 28; + } + else if (viewangles[0] < -50) + { + viewangles[0] = -50; + } + } + + AngleVectors(viewangles, fwd, right, up); + // for now, create one giant bbox that'll encompass all weapons, taking into account + //standing and crouching. later, maybe break that down into smaller bboxes for standing vs. crouching, + //for pistols vs. mach guns vs. launcher vs. sniper + + // consider the origin of the box to be the player's origin + VectorCopy(owner->s.origin, boxOrigin); + VectorCopy(boxOrigin, wpn->s.origin); + // find the end of the weapon (basically) and build the box off of that and the origin + VectorMA(boxOrigin, boxLength, fwd, muzzle); + // find mins[2] and maxs[2] (tricky cuz player could be pointing up or down) + if (fwd[2] > 0) + { // pointing up + wpn->mins[2] = boxOrigin[2] + boxBottom; + wpn->maxs[2] = muzzle[2]+32; + } + else + { // pointing down + wpn->mins[2] = muzzle[2]; + wpn->maxs[2] = boxOrigin[2] + boxTop; + } + if (fwd[0] > 0) + { // x-value of the muzzle is our maxs[0] + wpn->maxs[0] = muzzle[0]; + // x-value of our origin, then, is our mins[0] + wpn->mins[0] = boxOrigin[0]; + } + else + { // x-value of the muzzle is our mins[0] + wpn->mins[0] = muzzle[0]; + // x-value of our origin, then, is our maxs[0] + wpn->maxs[0] = boxOrigin[0]; + } + if (fwd[1] > 0) + { // y-value of the muzzle is our maxs[1] + wpn->maxs[1] = muzzle[1]; + // y-value of our origin, then, is our mins[1] + wpn->mins[1] = boxOrigin[1]; + } + else + { // y-value of the muzzle is our mins[1] + wpn->mins[1] = muzzle[1]; + // y-value of our origin, then, is our maxs[1] + wpn->maxs[1] = boxOrigin[1]; + } + // we now have our bbox in worldspace coords. put it relative to our boxOrigin. + VectorSubtract(wpn->maxs, boxOrigin, wpn->maxs); + VectorSubtract(wpn->mins, boxOrigin, wpn->mins); + gi.linkentity(wpn); +} + +// returns the owner of any type of buddy +edict_t *GetBuddyOwner(edict_t *buddy) +{ + bool bBuddy = buddy?( !!(buddy->svflags & SVF_BUDDY) ):false; + edict_t *ent = buddy?buddy->targetEnt:NULL; + + if (!bBuddy) + { + return NULL; + } + while (ent) + { + if ( !(ent->svflags & SVF_BUDDY) ) + { // found our owner + return ent; + } + ent = ent->targetEnt; + } + // bad + return NULL; +} + +void RemoveLeanBuddy(edict_t *owner) +{ + edict_t *tempEnt = owner, *lean = NULL; + + while (tempEnt->targetEnt && (tempEnt->targetEnt != owner)) + { + if (tempEnt->targetEnt->flags & FL_LEAN_PLAYER) + { //tempEnt->targetEnt is our lean buddy + lean = tempEnt->targetEnt; + if ((tempEnt == owner) && (lean == tempEnt)) + { + owner->targetEnt = NULL; + } + else + { + tempEnt->targetEnt = lean->targetEnt; + } + G_FreeEdict(lean); + return; + } + tempEnt = tempEnt->targetEnt; + } + // didn't have a lean buddy +} + +void RemoveNugBuddy(edict_t *owner) +{ + edict_t *tempEnt = owner, *nug = NULL; + + while (tempEnt->targetEnt && (tempEnt->targetEnt != owner)) + { + if (tempEnt->targetEnt->flags & FL_NUGBUDDY) + { //tempEnt->targetEnt is our NugBuddy + nug = tempEnt->targetEnt; + if ((tempEnt == owner) && (nug == tempEnt)) + { + owner->targetEnt = NULL; + } + else + { + tempEnt->targetEnt = nug->targetEnt; + } + G_FreeEdict(nug); + return; + } + tempEnt = tempEnt->targetEnt; + } + // didn't have a nug buddy +} + +void RemoveWeaponBuddy(edict_t *owner) +{ + edict_t *tempEnt = owner, *wpn = NULL; + + while (tempEnt->targetEnt && (tempEnt->targetEnt != owner)) + { + if (tempEnt->targetEnt->flags & FL_WEAPONBUDDY) + { //tempEnt->targetEnt is our WeaponBuddy + wpn = tempEnt->targetEnt; + if ((tempEnt == owner) && (wpn == tempEnt)) + { + owner->targetEnt = NULL; + } + else + { + tempEnt->targetEnt = wpn->targetEnt; + } + G_FreeEdict(wpn); + return; + } + tempEnt = tempEnt->targetEnt; + } + // didn't have a wpn buddy +} + +void debug_drawbox(edict_t* self,vec3_t vOrigin, vec3_t vMins, vec3_t vMaxs, int nColor); + +void SV_CalcViewOffset1stPerson(edict_t *ent) +{ + float *angles; + float bob; + float ratio; + float delta; + vec3_t v; + vec3_t fwd, right, up, test, test2, test3; + vec3_t min = {-8, -8, -8}; + vec3_t max = {8, 8, 8}; + trace_t tr; + + //=================================== + // Calculate kick_angles and weapon_kick angles. + //=================================== + + angles = ent->client->ps.kick_angles; + + VectorClear (angles); + + if (ent->deadflag) + { + // If dead, fix the angle and don't add any weapon kick. + + VectorClear (ent->client->ps.weaponkick_angles); + + ent->client->ps.viewangles[ROLL] = 40; + ent->client->ps.viewangles[PITCH] = -15; + ent->client->ps.viewangles[YAW] = ent->client->killer_yaw; + } + else + { + // Calc angles from weapon kick. + + VectorCopy (ent->client->weaponkick_angles,ent->client->ps.weaponkick_angles); + + // Add angles based on damage kick. + ratio = (ent->client->v_dmg_time - level.time) / DAMAGE_TIME; + if (ratio < 0) + { + ratio = 0; + ent->client->v_dmg_pitch = 0; + ent->client->v_dmg_roll = 0; + } + + angles[PITCH] += ratio * ent->client->v_dmg_pitch; + angles[ROLL] += ratio * ent->client->v_dmg_roll; + + // Add pitch based on fall kick. + + ratio = (ent->client->fall_time - level.time) / FALL_TIME; + if (ratio < 0) + ratio = 0; + angles[PITCH] += ratio * ent->client->fall_value; + + // Add angles based on velocity. + + delta = DotProduct (ent->velocity, forward); + angles[PITCH] += delta*run_pitch->value; + + delta = DotProduct (ent->velocity, Right); + angles[ROLL] += delta*run_roll->value; + + // Add angles based on bob. + + delta = bobfracsin * bob_pitch->value * xyspeed; + if ((ent->client->ps.pmove.pm_flags & (PMF_DUCKED|PMF_ON_GROUND))== (PMF_DUCKED|PMF_ON_GROUND)) + delta *= 6; // crouching + angles[PITCH] += delta; + delta = bobfracsin * bob_roll->value * xyspeed; + if ((ent->client->ps.pmove.pm_flags & (PMF_DUCKED|PMF_ON_GROUND))== (PMF_DUCKED|PMF_ON_GROUND)) + delta *= 6; // crouching + if (bobcycle & 1) + delta = -delta; + angles[ROLL] += delta; + } + + //=================================== + // Calculate kick_origin. + //=================================== + + // Base origin. + + VectorClear (v); + + // Add view height. + + v[2] += ent->viewheight; + + // Add fall height. + + ratio = (ent->client->fall_time - level.time) / FALL_TIME; + if (ratio < 0) + ratio = 0; + v[2] -= ratio * ent->client->fall_value * 0.4; + + // Add bob height. + + bob = bobfracsin * xyspeed * bob_up->value; + if (bob > 6) + bob = 6; + + //gi.DebugGraph (bob *2, 255); + + v[2] += bob; + + // Add kick offset. + + VectorAdd (v, ent->client->kick_origin, v); + + // Absolutely bound offsets so that the view can never be outside the player box. + + if (v[0] < -14) + v[0] = -14; + else if (v[0] > 14) + v[0] = 14; + if (v[1] < -14) + v[1] = -14; + else if (v[1] > 14) + v[1] = 14; + if (v[2] < -11) + v[2] = -11; + else if (v[2] > 40) + v[2] = 40; + + //=================================== + // Handle player leaning left / right - alters kick_angles[ROLL]. + //=================================== + + AngleVectors(ent->client->ps.viewangles, fwd, right, up); + + if((ent->viewside)&&(ent->groundentity)&&(DotProduct(ent->velocity, ent->velocity) < 30.0)&&(ent->health > 0)) + { + // Can only do this while not moving quickly. + + VectorMA(v, -30 * ent->viewside, right, test); + VectorMA(test, -5, up, test); + VectorAdd(ent->s.origin, v, test2); + VectorAdd(ent->s.origin, test, test3); + gi.trace (test2, min, max, test3, ent, MASK_PLAYERSOLID, &tr); + VectorCopy(tr.endpos, v); + VectorSubtract(v, ent->s.origin, v); + + angles[ROLL] -= 8*tr.fraction * ent->viewside; + } + + if(ent->viewside) + { + edict_t *lean = GetLeanBuddy(ent); + if(lean) + { + // If we're leaning already, update our buddy. + VectorCopy(tr.endpos, lean->s.origin); + gi.linkentity(lean); + } + else + { + // Otherwise make our buddy. + lean = MakeLeanEnt(ent); + } + + } + else + { + if(GetLeanBuddy(ent)) + { + // No more leaning - destroy the buddy. + RemoveLeanBuddy(ent); + } + } + + // 1/4/00 kef -- we need a buddy on top of our bbox if we're crouched. and only create it for deathmatch. +#if 1 // keith has fixed. let him know if something further needs to be done. + if (dm->isDM() && ent && ent->client) + { + if (ent->deadflag != DEAD_DEAD)//ent->health > 0) + { + // nug buddy (for crouching) + if (ent->client->ps.pmove.pm_flags & PMF_DUCKED) + { + // we're crouching in deathmatch. if we already have a lean buddy, store our NugBuddy(TM) in our + //lean buddy's targetEnt. otherwise, store it in _our_ targetEnt. + edict_t *nug = GetNugBuddy(ent); + if (nug) + { // already have a nug buddy. update its position. + vec3_t fwd; + AngleVectors(ent->s.angles, fwd, NULL, NULL); + VectorCopy(ent->s.origin, nug->s.origin); + nug->s.origin[2] += ent->maxs[2]; + VectorMA(nug->s.origin, 8, fwd, nug->s.origin); + gi.linkentity(nug); + } + else + { // don't have a nug buddy yet. make one. + nug = MakeNugBuddy(ent); + // put it where we want it + vec3_t fwd; + AngleVectors(ent->s.angles, fwd, NULL, NULL); + VectorCopy(ent->s.origin, nug->s.origin); + nug->s.origin[2] += ent->maxs[2]; + VectorMA(nug->s.origin, 8, fwd, nug->s.origin); + gi.linkentity(nug); + } + } + else + { + // we aren't crouching now, but if we were last frame, we need to get rid of our NugBuddy(TM) + if (GetNugBuddy(ent)) + { // already have a nug buddy. make it go away. + RemoveNugBuddy(ent); + } + } + + // weapon buddy (always on) + edict_t *wpn = GetWeaponBuddy(ent); + if (wpn) + { // we've already got a weapon buddy...update its position + if (ent->client->pers.spectator) + { // no weapon buddy for spectators + RemoveWeaponBuddy(ent); + } + else + { + UpdateWeaponBuddy(ent); + } + } + else if (!ent->client->pers.spectator) + { // need to create a weapon buddy + MakeWeaponBuddy(ent); + UpdateWeaponBuddy(ent); + } + } // if (ent->health > 0) + }// if (dm->isDM() && ent && ent->client) +#endif // keith has fixed. let him know if something further needs to be done. + + // if we're dead, remove all buddies + if (ent->deadflag == DEAD_DEAD)//ent->health <= 0) + { + // make sure our goggles are off + ent->client->goggles_on = false; + + RemoveLeanBuddy(ent); + RemoveNugBuddy(ent); + RemoveWeaponBuddy(ent); + } +/* else + { + if (!(ent->flags & FL_GODMODE)) + { + if (GetLeanBuddy(ent)) + { + debug_drawbox(GetLeanBuddy(ent), NULL, NULL, NULL, 0xFFFFFFFF); + } + if (GetWeaponBuddy(ent)) + { + debug_drawbox(GetWeaponBuddy(ent), NULL, NULL, NULL, 0xFFFFFFFF); + } + if (GetNugBuddy(ent)) + { + debug_drawbox(GetNugBuddy(ent), NULL, NULL, NULL, 0xFFFFFFFF); + } + } + } +*/ + +/* + // Removed this stuff at RJ's request. It needs to be re-implemented if it's going + // to work properly with prediction and also, not clip through walls. -MW + + //=================================== + // Handle pivoting around waist when looking down - sets viewoffset. + //=================================== + + float pitchLen; + + fwd[2] = 0; + VectorNormalize(fwd); + + if ((ent->client->ps.pmove.pm_flags & (PMF_DUCKED|PMF_ON_GROUND))== (PMF_DUCKED|PMF_ON_GROUND)) + { + pitchLen = 12; + } + else + { + pitchLen = 24; + } + + float scale = .05 + ((ent->client->ps.viewangles[PITCH]+90)/180)*.95; + + pitchLen *= scale; + + VectorCopy(v, test); + test[2] -= pitchLen; + VectorMA(test, sin(ent->client->ps.viewangles[PITCH] * M_PI/180) * pitchLen, fwd, test); + test[2] += cos(ent->client->ps.viewangles[PITCH] * M_PI/180) * pitchLen; + VectorAdd(ent->s.origin, v, test2); + VectorAdd(ent->s.origin, test, test3); + gi.trace (test2, min, max, test3, ent, MASK_PLAYERSOLID, &tr); + VectorCopy(tr.endpos, v); + VectorSubtract(v, ent->s.origin, v); +*/ + + VectorCopy (v, ent->client->ps.viewoffset); + //Com_Printf("viewoffset is: %f, %f, %f\n", v[0], v[1], v[2]); +} + +void SV_CalcViewOffset3rdPerson(edict_t *ent) +{ + edict_t *cameraSubject; + vec3_t baseAngles,viewAngles; + static float oldYAW; + vec3_t fwd,right,up; + vec3_t focusLoc,cameraOffset,viewOrg,tempVec; + static vec3_t oldVieworg; + trace_t trace; + vec3_t mins={-1.0,-1.0,-1.0},maxs={1.0,1.0,1.0}; + + // + // Retrieve the entity that our 3rd person camera is chasing... the subject. + // + + if(followenemy->value >= 0) + { + static int lastFollow = -1; + static edict_t *lastSubject = 0;//uh oh... + + int stopChecking = 0; + + if(lastFollow == followenemy->value) + { //unsafe!!! + if(lastSubject && lastSubject->inuse && (lastSubject->health > 0) && lastSubject->ai) + { + cameraSubject = lastSubject; + stopChecking = 1; + } + else + { + cameraSubject = 0; + } + } + + if(!stopChecking) + { + int targs = 1; + cameraSubject=0; + for(int i = 0; (i < followenemy->value) && (targs); i++) + { + edict_t *start = cameraSubject; + do + { + cameraSubject=G_Find (cameraSubject, FOFS(classname), "m_", 2); + if(cameraSubject == start) + { // no infinite loop for you! One year! + cameraSubject = 0; + targs = 0; + break; + } + }while(!cameraSubject || (cameraSubject->health < 1) || (!cameraSubject->ai) || + (!(cameraSubject->ai->IsActive())) || (!cameraSubject->ai->HasHadTarget())); + + } + lastFollow = followenemy->value; + lastSubject = cameraSubject; + } + + if(!cameraSubject) + { + cameraSubject = NULL; + ent->client->CameraIs3rdPerson = false; + ent->client->ps.remote_type = REMOTE_TYPE_FPS; + ent->client->ps.remote_id = -1; + ent->client->MercCameraNumber = 0; + followenemy->value = 0; + return; + } + else + { + cameraSubject->ai->WatchMe(); + } + + } + else if (thirdpersoncam->value) + { + cameraSubject = ent; + } + else + { + cameraSubject = NULL; + ent->client->CameraIs3rdPerson = false; + ent->client->ps.remote_type = REMOTE_TYPE_FPS; + ent->client->ps.remote_id = -1; + ent->client->MercCameraNumber = 0; + return; + } + + if(!cameraSubject) + cameraSubject=ent; + + // + // Derive a camera offset from the player's mouse PITCH and our subject's YAW facing. + // + + // PITCH. + + baseAngles[PITCH]=ent->client->ps.viewangles[PITCH]; + + // YAW. + + baseAngles[YAW]=LerpAngle(oldYAW,cameraSubject->s.angles[YAW],0.25); + oldYAW=baseAngles[YAW]; + + // ROLL. + + baseAngles[ROLL]=0.0; + + // And finally, get the offset. + + AngleVectors(baseAngles,fwd,right,up); + VectorScale(fwd,-camera_viewdist->value,cameraOffset); + + // + // Calculate the focus point. + // + + VectorCopy(cameraSubject->s.origin,focusLoc); + focusLoc[2]+=cameraSubject->viewheight; + + // + // Calculate the viewpoint after damping. + // + + VectorAdd(focusLoc,cameraOffset,viewOrg); + VectorSubtract(viewOrg,oldVieworg,tempVec); + + //making it snap to position faster, so it'll keep up --ss + VectorScale(tempVec,0.5,tempVec); +// VectorScale(tempVec,0.25,tempVec); + + VectorAdd(oldVieworg,tempVec,viewOrg); + + // + // Adjust the viewpoint to prevent the LOS from being obscured by objects. + // + + gi.trace(focusLoc, + mins, + maxs, + viewOrg, + cameraSubject, + MASK_SOLID, + &trace); + + if(trace.fraction!=1.0) + { + VectorCopy(trace.endpos,viewOrg); + } + + // + // Calculate and store away the viewangles. + // + + VectorCopy(cameraOffset,tempVec); + tempVec[0]=-tempVec[0]; + tempVec[1]=-tempVec[1]; + VectorNormalize(tempVec); + vectoangles(tempVec,viewAngles); + viewAngles[PITCH]=-viewAngles[PITCH]; + VectorCopy(viewAngles,ent->client->ps.remote_viewangles); + + // + // Store away the the viewpoint. + // + + VectorScale(viewOrg,8.0,ent->client->ps.remote_vieworigin); + VectorCopy(viewOrg,oldVieworg); +} + +void SV_CalcViewOffset (edict_t *ent) +{ + //for testing right now - 1 and -1 will toggle this on and off, but it would definitely break other stuff... + if(followenemy->value >= 1) + { + ent->client->CameraIs3rdPerson = 1; + ent->client->ps.remote_type = REMOTE_TYPE_TPS; + } + else if(followenemy->value == -1) + { + if (thirdpersoncam->value) + { + ent->client->CameraIs3rdPerson = 1; + ent->client->ps.remote_type = REMOTE_TYPE_TPS; + } + else + { + ent->client->CameraIs3rdPerson = 0; + ent->client->ps.remote_type = REMOTE_TYPE_FPS; + } + } + + if(!ent->client->CameraIs3rdPerson) + { + SV_CalcViewOffset1stPerson(ent); + } + else + { + //yech. i need viewoffset set, and i'm too lazy to dig around for it. + SV_CalcViewOffset1stPerson(ent); + + SV_CalcViewOffset3rdPerson(ent); + } +} + +/* +============= +SV_AddBlend +============= +*/ +void SV_AddBlend (float r, float g, float b, float a, float *v_blend) +{ + float a2, a3; + + if (a <= 0) + return; + a2 = v_blend[3] + (1-v_blend[3])*a; // new total alpha + a3 = v_blend[3]/a2; // fraction of color from old + + v_blend[0] = v_blend[0]*a3 + r*(1-a3); + v_blend[1] = v_blend[1]*a3 + g*(1-a3); + v_blend[2] = v_blend[2]*a3 + b*(1-a3); + v_blend[3] = a2; +} + +/* +============= +SV_CalcBlend +============= +*/ +void SV_CalcBlend (edict_t *ent) +{ + int contents; + vec3_t vieworg; + static float murkiness = 0; + + if(!(rand()%3)) + { // this should be vel driven... + murkiness += gi.flrand(-0.15F, 0.15F); + if(murkiness < 0)murkiness = 0; + if(murkiness > 1.0)murkiness = 1.0; + } + + ent->client->ps.blend[0] = ent->client->ps.blend[1] = + ent->client->ps.blend[2] = ent->client->ps.blend[3] = 0; + + // add for contents + if (ent->client->ps.remote_type == REMOTE_TYPE_FPS) + { + VectorAdd (ent->s.origin, ent->client->ps.viewoffset, vieworg); + contents = gi.pointcontents (vieworg); + } + else if (ent->client->ps.remote_type == REMOTE_TYPE_TPS) + { + contents = 0; + } + else + { + contents = gi.pointcontents (ent->s.origin); + } + + if (contents & (CONTENTS_LAVA|CONTENTS_SLIME|CONTENTS_WATER) ) + ent->client->ps.rdflags |= RDF_UNDERWATER; + else + ent->client->ps.rdflags &= ~RDF_UNDERWATER; + + if ((ent->client->pers.spectator) && (contents & (CONTENTS_LAVA))) + SV_AddBlend (1.0, 0.3, 0.0, 0.6, ent->client->ps.blend); + else if (!(ent->client->pers.spectator) && (contents & (CONTENTS_SOLID|CONTENTS_LAVA))) + SV_AddBlend (1.0, 0.3, 0.0, 0.6, ent->client->ps.blend); + else if (contents & CONTENTS_SLIME) + SV_AddBlend (0.0, 0.1, 0.05, 0.6, ent->client->ps.blend); + else if (contents & CONTENTS_WATER) + //SV_AddBlend (0.03, 0.08, 0.03, .85 + murkiness*.1, ent->client->ps.blend); + SV_AddBlend (0.03, 0.08, 0.03, .2, ent->client->ps.blend); + + // add for damage + if (ent->client->damage_alpha > 0) + SV_AddBlend (ent->client->damage_blend[0],ent->client->damage_blend[1] + ,ent->client->damage_blend[2], ent->client->damage_alpha, ent->client->ps.blend); + + if (ent->client->bonus_alpha > 0) + SV_AddBlend (0.85, 0.7, 0.3, ent->client->bonus_alpha, ent->client->ps.blend); + + if (ent->client->blinding_alpha > 0) + { + // The color of the blend should be different with goggles than without. + if (ent->client->goggles_on) + { + SV_AddBlend (0.5, 1.0, 0.5, ent->client->blinding_alpha, ent->client->ps.blend); + } + else + { + SV_AddBlend (1.0, 1.0, 1.0, ent->client->blinding_alpha, ent->client->ps.blend); + } + } + + if (ent->client->fade_alpha > 0) + { + SV_AddBlend (ent->client->fade_rgb[0], ent->client->fade_rgb[1], ent->client->fade_rgb[2], + ent->client->fade_alpha, ent->client->ps.blend); + } + + if (ent->client->gas_blend) + { + SV_AddBlend(198.0/255.0, 171/255.0, 20.0/255.0, ent->client->gas_blend, ent->client->ps.blend); + } + + if (ent->health < 0) + { + float addVal = -ent->health / 100.0; + +// SV_AddBlend(0, 0, 0, addVal, ent->client->ps.blend); + + ent->health -= 2; + if(ent->health < -100)ent->health = -100;//is this safe at all? + } + + // drop the damage value + ent->client->damage_alpha -= 0.06; + if (ent->client->damage_alpha < 0) + ent->client->damage_alpha = 0; + + // drop the bonus value + ent->client->bonus_alpha -= 0.1; + if (ent->client->bonus_alpha < 0) + ent->client->bonus_alpha = 0; + + if (ent->client->blinding_alpha > 0.995) + ent->client->blinding_alpha = 0.995; + + // The delta is applied in such a way that the alpha fades slowly when the screen is almost white, + // then quicker as it approaches zero. + ent->client->blinding_alpha -= (1.0 - ent->client->blinding_alpha) * ent->client->blinding_alpha_delta; + + if (ent->client->blinding_alpha < 0) + { + ent->client->blinding_alpha = 0; + } + + ent->client->gas_blend *= .88; + if(ent->client->gas_blend < .3) + { + ent->client->gas_blend -= .06; + } + if (ent->client->gas_blend < 0) + { + ent->client->gas_blend = 0; + } + + // Add the goggles render flag if the goggles are on, and we are not in a remote or cinematic camera. + if (ent->client->goggles_on && ent->client->ps.remote_type <= REMOTE_TYPE_TPS) + { + ent->client->ps.rdflags |= RDF_GOGGLES; + } + else + { + ent->client->ps.rdflags &= ~RDF_GOGGLES; + } +} + + +/* +================= +P_FallingDamage +================= +*/ +void P_FallingDamage (edict_t *ent) +{ + float delta; + int damage; + vec3_t dir; + + if (ent->s.modelindex != 255) + return; // not in the player model + + if (ent->movetype == MOVETYPE_NOCLIP) + return; + + if ((ent->client->oldvelocity[2] < 0) && (ent->velocity[2] > ent->client->oldvelocity[2]) && (!ent->groundentity)) + { + delta = ent->client->oldvelocity[2]; + } + else + { + if (!ent->groundentity) + return; + delta = ent->velocity[2] - ent->client->oldvelocity[2]; + } + delta = delta*delta * 0.0001; + + // never take falling damage if completely underwater + if (ent->waterlevel == 3) + return; + if (ent->waterlevel == 2) + delta *= 0.25; + if (ent->waterlevel == 1) + delta *= 0.5; + + if (delta < 1) + return; + + //just put this in for singleplayer, so that client prediction doesn't have to be involved + if(!dm->isDM()) + { + sharedEdict_t sh; + + sh.inv = (inven_c *)ent->client->inv; + sh.edict = ent; + sh.attack = (ent->client->latched_buttons|ent->client->buttons)&BUTTON_ATTACK; + sh.altattack = (ent->client->latched_buttons|ent->client->buttons)&BUTTON_ALTATTACK; + + sh.inv->setOwner(&sh); + + sh.inv->handleFall(); + } + + // make sure force feedback does landing effect + fxRunner.exec("land", ent); + + if (delta < 15) + { + FX_SetEvent(ent, EV_FALLSHORT); + return; + } + + ent->client->fall_value = delta*0.5; + if (ent->client->fall_value > 40) + ent->client->fall_value = 40; + ent->client->fall_time = level.time + FALL_TIME; + + if (delta > 12) + { + if (ent->health > 0) + { + if (delta >= 55) + FX_SetEvent(ent, EV_FALLFAR); + else + FX_SetEvent(ent, EV_FALL); + } + ent->pain_debounce_time = level.time; // no normal pain sound + damage = (delta-24)*2; + if(damage > 0) + { + if (damage < 1) + damage = 1; + VectorSet (dir, 0, 0, 1); + + if (!dm->isDM() || (dm->dmRule_REALISTIC_DAMAGE() || !dm->dmRule_NO_FALLING()) ) + { + T_Damage (ent, world, world, dir, ent->s.origin, ent->s.origin, damage, 0, DAMAGE_NO_ARMOR|DT_FALL, MOD_FALLING); + } + } + } + else + { + FX_SetEvent(ent, EV_FALLSHORT); + return; + } +} + +/* +============= +PlayerNoise +============= +*/ + +int w_lastNoiseTime = 0; + +void PlayerNoise(edict_t *who, vec3_t where, ai_sensetype_e type, edict_t *focus, float rad, int nodeId, int stealthy, int suppress) +{ + edict_t *ent=NULL; + + if (dm->isDM()) + return; + + if (who->flags & FL_NOTARGET) + return; + + if (type == AI_SENSETYPE_SOUND_WHIZ) + { + if (focus) + { + gmonster.MakeSound(focus,where,level.time,who,type); + } + } + else + { + CRadiusContent radList(where, rad, 1, nodeId); + + for(int i = 0; i < radList.getNumFound(); i++) + { + ent = radList.foundEdict(i); + + if(!ent->ai) + { + continue; + } + if(ent->deadflag == DEAD_DEAD) + { + continue; + } + + if(stealthy) + { //these are really more of sight events, but the sound sense still models it better + edict_t *check = who; + + if(focus) + { + check = focus; + } + if(!gmonster.Infront(ent, check)) + { + continue; + } + if(!gmonster.Visible(ent, check)) + { + continue; + } + } + + gmonster.MakeSound(ent,where,level.time,who,type); + + if(suppress) + { + ent->ai->RegisterShotForReply(who->s.origin, who->s.origin, who); + } + } + + //now check for sound triggers as well - stealthy won't work on these... maybe add some more rules here? + if(!stealthy) + { + for(i = gmonster.GetActiveSoundTriggers() - 1; i > -1; i--) + { //warning - saves? + edict_t *test = &g_edicts[gmonster.GetSoundTrigger(i)]; + + if(test&&test->use) + { //this should remove the sound trigger + vec3_t dif; + VectorSubtract(test->s.origin, where, dif); + if(VectorLengthSquared(dif) < test->health) + { + test->use(test, ent, ent); + } + } + } + } + } + + w_lastNoiseTime = 0; +} + +/* +============= +P_WorldEffects +============= +*/ +void P_WorldEffects (void) +{ + int waterlevel, old_waterlevel; + + if (current_player->movetype == MOVETYPE_NOCLIP) + { + current_player->air_finished = level.time + 12; // don't need air + return; + } + + waterlevel = current_player->waterlevel; + old_waterlevel = current_client->old_waterlevel; + current_client->old_waterlevel = waterlevel; + + // + // if just entered a water volume, play a sound + // + if (!old_waterlevel && waterlevel) + { +// PlayerNoise(current_player, current_player->s.origin, PNOISE_SELF); +/* if (current_player->watertype & CONTENTS_LAVA) + gi.sound (current_player, CHAN_BODY, gi.soundindex("player/lava_in.wav"), .6, ATTN_NORM, 0); + else if (current_player->watertype & CONTENTS_SLIME) + gi.sound (current_player, CHAN_BODY, gi.soundindex("player/watr_in.wav"), .6, ATTN_NORM, 0); + else if (current_player->watertype & CONTENTS_WATER) +*/ { + gi.sound (current_player, CHAN_BODY, gi.soundindex("player/land/water.wav"), .6, ATTN_NORM, 0); + } + current_player->flags |= FL_INWATER; + + // clear damage_debounce, so the pain sound will play immediately + current_player->damage_debounce_time = level.time - 1; + } + + // + // if just completely exited a water volume, play a sound + // + if (old_waterlevel && ! waterlevel) + { +// PlayerNoise(current_player, current_player->s.origin, PNOISE_SELF); +// gi.sound (current_player, CHAN_BODY, gi.soundindex("player/watr_out.wav"), .6, ATTN_NORM, 0); + current_player->flags &= ~FL_INWATER; + } + + // + // check for head just going under water + // + if (old_waterlevel != 3 && waterlevel == 3) + { +// gi.sound (current_player, CHAN_BODY, gi.soundindex("player/underwtr/underwtr.wav"), .6, ATTN_NORM, 0);//? + + // kef -- don't start the underwater sound if we've already got a looping sound playing. + if (0 == current_player->s.sound) + { + current_player->s.sound = gi.soundindex("player/underwtr/underwtr.wav"); + current_player->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + } + + // + // check for head just coming out of water + // + if (old_waterlevel == 3 && waterlevel != 3) + { + // kef -- we need to kill the sound we started when we entered the water + if (current_player->s.sound == gi.soundindex("player/underwtr/underwtr.wav")) + { + current_player->s.sound = 0; + } + if (current_player->air_finished < level.time) + { // gasp for air +// gi.sound (current_player, CHAN_VOICE, gi.soundindex("player/gasp1.wav"), .6, ATTN_NORM, 0); +// PlayerNoise(current_player, current_player->s.origin, PNOISE_SELF); + } + else if (current_player->air_finished < level.time + 11) + { // just break surface +// gi.sound (current_player, CHAN_VOICE, gi.soundindex("player/gasp2.wav"), .6, ATTN_NORM, 0); + } + } + + // + // check for drowning + // + if (waterlevel == 3) + { + // if out of air, start drowning + if (current_player->air_finished < level.time) + { // drown! + if (current_player->client->next_drown_time < level.time + && current_player->health > 0) + { + current_player->client->next_drown_time = level.time + 1; + + // take more damage the longer underwater + current_player->dmg += 2; + if (current_player->dmg > 15) + current_player->dmg = 15; + + // play a gurp sound instead of a normal pain sound + if (current_player->health <= current_player->dmg) + gi.sound (current_player, CHAN_VOICE, gi.soundindex("player/drown1.wav"), .6, ATTN_NORM, 0); +// else if (rand()&1) +// gi.sound (current_player, CHAN_VOICE, gi.soundindex("*gurp1.wav"), .6, ATTN_NORM, 0); +// else +// gi.sound (current_player, CHAN_VOICE, gi.soundindex("*gurp2.wav"), .6, ATTN_NORM, 0); + + current_player->pain_debounce_time = level.time; + + T_Damage (current_player, world, world, vec3_origin, current_player->s.origin, current_player->s.origin, current_player->dmg, 0, DAMAGE_NO_ARMOR|DT_WATER, MOD_WATER); + } + } + } + else + { + current_player->air_finished = level.time + 12; + current_player->dmg = 2; + } + + // + // check for sizzle damage + // + if (waterlevel && (current_player->watertype&(CONTENTS_LAVA|CONTENTS_SLIME)) ) + { + if (current_player->watertype & CONTENTS_LAVA) + { + if (current_player->health > 0 + && current_player->pain_debounce_time <= level.time) + { + char meatSound[100]; + Com_sprintf(meatSound, sizeof(meatSound), "impact/player/hit%d.wav", gi.irand(1,4)); + gi.sound (current_player, CHAN_VOICE, gi.soundindex(meatSound), 1.0, ATTN_NORM, 0); + + current_player->pain_debounce_time = level.time + 1; + } + + T_Damage (current_player, world, world, vec3_origin, current_player->s.origin, current_player->s.origin, 3*waterlevel, 0, DT_FIRE, MOD_LAVA); + } + + if (current_player->watertype & CONTENTS_SLIME) + { + T_Damage (current_player, world, world, vec3_origin, current_player->s.origin, current_player->s.origin, 1*waterlevel, 0, DT_WATER, MOD_SLIME); + } + } +} + + +/* +=============== +G_SetClientEffects +=============== +*/ +void G_SetClientEffects (edict_t *ent) +{ + + // Can somebody tell me why this was done? --Pat +// ent->s.effects = 0; + + +// ent->s.renderfx = 0; + + if (ent->health <= 0 || level.intermissiontime) + return; + + // show cheaters!!! + if (ent->flags & FL_GODMODE) + { + } +} + + +/* +=============== +G_SetClientEvent +=============== +*/ +void G_SetClientEvent (edict_t *ent) +{ + int newEvent; + + if(ent->groundentity) + { + if((int)(current_client->bobtime+bobmove) != bobcycle) + { + newEvent = EV_FOOTSTEPLEFT; + if(xyspeed > 225)newEvent += 2; + if(bobcycle & 1)newEvent += 1; + FX_SetEvent(ent, newEvent); + } + } +} + +/* +=============== +G_SetClientSound +=============== +*/ +void G_SetClientSound (edict_t *ent) +{ + char *weap; + + // fixme - this crap should be obliterated + + if (ent->client->resp.game_helpchanged != game.helpchanged) + { + ent->client->resp.game_helpchanged = game.helpchanged; + ent->client->resp.helpchanged = 1; + } + + // help beep (no more than three times) + if (ent->client->resp.helpchanged && ent->client->resp.helpchanged <= 3 && !(level.framenum&63) ) + { + ent->client->resp.helpchanged++; + gi.sound (ent, CHAN_VOICE, gi.soundindex ("misc/pc_up.wav"), .6, ATTN_STATIC, 0); + } + + + weap = ""; + + // why was this here? No looping sounds would have ever worked with this here. +// ent->s.sound = 0; +} + +/* +=============== +G_SetClientFrame +=============== +*/ +#define FRAME_DeathB03 104 +#define FRAME_DeathB08 109 + +void G_SetClientFrame (edict_t *ent) +{ + gclient_t *client; + qboolean duck, run; + + if (ent->s.modelindex != 255) + return; // not in the player model + + client = ent->client; + + if (client->ps.pmove.pm_flags & PMF_DUCKED) + duck = true; + else + duck = false; + if (xyspeed) + run = true; + else + run = false; + + // check for stand/duck and stop/go transitions + if (duck != client->anim_duck && client->anim_priority < ANIM_DEATH) + goto newanim; + if (run != client->anim_run && client->anim_priority == ANIM_BASIC) + goto newanim; + if (!ent->groundentity && client->anim_priority <= ANIM_WAVE) + goto newanim; + + if (ent->s.frame < client->anim_end) + { // continue an animation + ent->s.frame++; + return; + } + + if (client->anim_priority == ANIM_DEATH) + { + PB_PlaySequenceForDeath(ent, NULL, NULL, 0, ent->s.origin, 0); + return; // stay there + } + if (client->anim_priority == ANIM_JUMP) + { + if (!ent->groundentity) + return; // stay there + ent->client->anim_priority = ANIM_WAVE; + ent->s.frame = FRAME_DeathB03; + ent->client->anim_end = FRAME_DeathB08; + return; + } + +newanim: + // return to either a running or standing frame + client->anim_priority = ANIM_BASIC; + client->anim_duck = duck; + client->anim_run = run; + + if (!ent->groundentity) + { + vec3_t dest, face; + AngleVectors(client->ps.viewangles, face, NULL, NULL); + VectorMA(ent->s.origin, 100, face, face); + VectorCopy(ent->velocity, dest); + VectorMA(ent->s.origin, 0.025, dest, dest); + + PB_PlaySequenceForJump(ent, dest, face); + } + else if (run) + { // running + vec3_t dest, face; + AngleVectors(client->ps.viewangles, face, NULL, NULL); + VectorMA(ent->s.origin, 100, face, face); + VectorCopy(ent->velocity, dest); + VectorMA(ent->s.origin, 0.025, dest, dest); + + PB_PlaySequenceForMovement(ent, dest, face, ent->s.origin, ent->s.angles); + } + else + { // standing + vec3_t dest, face; + AngleVectors(client->ps.viewangles, face, NULL, NULL); + VectorMA(ent->s.origin, 100, face, face); + VectorCopy(ent->velocity, dest); + VectorNormalize(dest); + VectorMA(ent->s.origin, 100, dest, dest); + + PB_PlaySequenceForStand(ent, dest, face); + } +} + +/* +============== +flushPlayernameColors +============== +*/ + +void flushPlayernameColors(edict_t &ent) +{ + if(!ent.client) + return; + + memset(ent.client->playernameColors,0,sizeof(ent.client->playernameColors)); + memset(ent.client->oldPlayernameColors,0,sizeof(ent.client->oldPlayernameColors)); +} + +/* +============== +rleClientColors + +Accepts an array of client indexes 'client' sand an array of color indexes +'colors' where there is 1-1 mapping between each array entry. Performs an RLE +derived encoding on clients and colors to combine them into the array +'rleClientColors'.E.g.: + +clients: 0,1,2,3,5,6. colors: 3,7,7,7,12,12. rleClientColors: (3,0), (7|START_RANGE,1,3), (12|START_RANGE,5,6). +A saving of 4 bytes as opposed to sending un-encoded byte pairs: (3,0), (7,1), (7,2), (7,3), (12,5), (12,6). +============== +*/ + +int rleClientColors(int c,byte *clients,byte *colors,byte *rleClientColors) +{ + #define START_RANGE 128 + + int i,ii, + rli, + length; + + i=rli=length=0; + + while(iplayernameColors[i]=6; + + for(i=4;i<=6;i++) + ent.client->playernameColors[i]=3; + + ent.client->playernameColors[7]=21; + ent.client->playernameColors[8]=1; + + for(i=9;i<=10;i++) + ent.client->playernameColors[i]=19; + + ent.client->playernameColors[11]=28; +*/ + ent.client->playernameColors[0]=3; + ent.client->playernameColors[1]=7; + ent.client->playernameColors[2]=7; + ent.client->playernameColors[3]=7; + ent.client->playernameColors[5]=12; + ent.client->playernameColors[6]=12; + } +#endif // _MARCUSTEST_ + + for(i=0,c=0;ioldPlayernameColors[i]!=ent.client->playernameColors[i]) + { + clients[c]=i; + colors[c]=ent.client->playernameColors[i]; + + ent.client->oldPlayernameColors[i]=ent.client->playernameColors[i]; + +#ifdef _MARCUSTEST_ + gi.dprintf("[%i,%i] ",i,ent.client->playernameColors[i]); +#endif // _MARCUSTEST_ + + c++; + } + } + +#ifdef _MARCUSTEST_ + gi.dprintf("\n"); +#endif // _MARCUSTEST_ + + if(c) // c is number of clients/colors. + { + int length=rleClientColors(c,clients,colors,clientColors); + gi.sendPlayernameColors(&ent,length,c,clientColors); + +#ifdef _MARCUSTEST_ + gi.dprintf("length=%i\n",length); +#endif // _MARCUSTEST_ + } +} + +#undef _MARCUSTEST_ + +/* +================= +ClientEndServerFrame + +Called for each player at the end of the server frame +and right after spawning +================= +*/ +void ClientEndServerFrame (edict_t *ent) +{ + float bobtime; + int i; + + current_player = ent; + current_client = ent->client; + + // + // If the origin or velocity have changed since ClientThink(), + // update the pmove values. This will happen when the client + // is pushed by a bmodel or kicked by an explosion. + // + // If it wasn't updated here, the view position would lag a frame + // behind the body position when pushed -- "sinking into plats" + // + for (i=0 ; i<3 ; i++) + { + current_client->ps.pmove.origin[i] = ent->s.origin[i]*8.0; + current_client->ps.pmove.velocity[i] = ent->velocity[i]*8.0; + } + + // Movement scaling stuff. + + current_client->ps.pmove.moveScale=dm->clientGetMovescale(ent)*255; + + // + // If the end of unit layout is displayed, don't give + // the player any normal movement attributes + // + if (level.intermissiontime) + { + // FIXME: add view drifting here? + current_client->ps.blend[3] = 0; + current_client->ps.fov = 95; + G_SetStats (ent); + return; + } + + AngleVectors (ent->client->v_angle, forward, Right, up); + + // burn from lava, etc + P_WorldEffects (); + + // + // set model angles from view angles so other things in + // the world can tell which direction you are looking + // + if (ent->client->v_angle[PITCH] > 180) + ent->s.angles[PITCH] = (-360 + ent->client->v_angle[PITCH])/3; + else + ent->s.angles[PITCH] = ent->client->v_angle[PITCH]/3; + ent->s.angles[YAW] = ent->client->v_angle[YAW]; + ent->s.angles[ROLL] = 0; + ent->s.angles[ROLL] = SV_CalcRoll (ent->s.angles, ent->velocity)*4; + + // + // calculate speed and cycle to be used for + // all cyclic walking effects + // + xyspeed = sqrt(ent->velocity[0]*ent->velocity[0] + ent->velocity[1]*ent->velocity[1]); + + if (xyspeed < 5) + { + bobmove = 0; + current_client->bobtime = 0; // start at beginning of cycle again + } + else if (ent->groundentity) + { // so bobbing only cycles when on ground + if (xyspeed > 210) + { +// bobmove = 0.25; + bobmove = 0.3; + } + //else if (xyspeed > 100) + else if (xyspeed > 10) + { +// bobmove = 0.125; + bobmove = 0.2; + } + else + { +// bobmove = 0.0625; + bobmove = 0.1; + } + } + + bobtime = (current_client->bobtime += bobmove); + + //if ((current_client->ps.pmove.pm_flags & (PMF_DUCKED|PMF_ON_GROUND)) == (PMF_DUCKED|PMF_ON_GROUND)) + // bobtime *= 2; + + bobcycle = (int)bobtime; + bobfracsin = fabs(sin(bobtime*M_PI)); + + // detect hitting the floor + P_FallingDamage (ent); + + // apply all the damage taken this frame + P_DamageFeedback (ent); + + // determine the view offsets + SV_CalcViewOffset (ent); + + // determine the full screen color blend + // must be after viewoffset, so eye contents can be + // accurately determined + // FIXME: with client prediction, the contents + // should be determined by the client + SV_CalcBlend (ent); + + G_SetStats (ent); + + G_SetClientEvent (ent); + + G_SetClientEffects (ent); + + G_SetClientSound (ent); + + G_SetClientFrame (ent); + + UpdatePlayerFace(ent); + + UpdatePlayerWeapon(ent); + + VectorCopy (ent->velocity, ent->client->oldvelocity); + VectorCopy (ent->client->ps.viewangles, ent->client->oldviewangles); + + // Clear weapon kicks (eventually). + + VectorClear (ent->client->kick_origin); + + for (int clr = 0; clr < 3; clr++) + { + if (fabs(ent->client->weaponkick_angles[clr]) < 0.8) + { + ent->client->weaponkick_angles[clr] = 0; + } + else + { + ent->client->weaponkick_angles[clr] *= 0.7; + } + } + + // If the scoreboard is active, update it. + + if (ent->client->showscores && !(level.framenum & 31)) + dm->clientScoreboardMessage(ent,ent->enemy,false); + + // If help is active, update it. + + if (ent->client->showhelp_time>level.time && !(level.framenum & 31)) + dm->clientHelpMessage(ent); + + // ******************************************************************************************** + // Reflect camera views mode in the client's playerstate. + // ******************************************************************************************** + + if(!current_client->CameraIs3rdPerson) + { + if(current_client->RemoteCameraLockCount>0) + { + // Remote camera view, i.e. remote_id always >= 0 (remote camera's edict number). + ent->s.effects |= EF_KILL_EFT; + + current_client->ps.remote_id=current_client->RemoteCameraNumber; + current_client->ps.remote_type=current_client->RemoteCameraType; + } + else + { + // 1st person view. + + current_client->ps.remote_id=-1; + } + } + else + { + // 3rd person view. + ent->client->ps.remote_id=0; + } + + dm->clientEndFrame(ent); + + sendPlayernameColors(*ent); + + { + sharedEdict_t sh; + + sh.inv = (inven_c *)ent->client->inv; + sh.edict = ent; + sh.inv->setOwner(&sh); + + sh.inv->serverWriteRICs(); + sh.inv->serverClearRICs(); + } + + // Ensure prediction synchronisation. + + ent->client->ps.restart_count=ent->client->restart_count; + + if(!ent->client->oktofire) + ent->client->ps.buttons_inhibit|=BUTTON_ATTACK; + else + ent->client->ps.buttons_inhibit&=~BUTTON_ATTACK; + + // Spectator chase target (if I have one). + + if(ent->client->ps.pmove.pm_type!=PM_SPECTATOR_FREEZE) + ent->client->ps.spectatorId=0; + + // Let the client know if we're playing a cinematic. + + current_client->ps.cinematicfreeze = game.cinematicfreeze; +} \ No newline at end of file diff --git a/Source/Game/gamecpp/pcode.h b/Source/Game/gamecpp/pcode.h new file mode 100644 index 0000000..ed4a127 --- /dev/null +++ b/Source/Game/gamecpp/pcode.h @@ -0,0 +1,188 @@ +#define SCRIPT_VERSION 3 + +#define NUM_PARMS 16 + +enum OpCodes +{ + CODE_NEW_GLOBAL = 0, + CODE_NEW_GLOBAL_PLUS_ASSIGNMENT, + CODE_NEW_LOCAL, + CODE_NEW_LOCAL_PLUS_ASSIGNMENT, + CODE_NEW_PARAMETER, + CODE_NEW_PARAMETER_PLUS_DEFAULT, + CODE_FIELD, + CODE_ASSIGNMENT, + CODE_ADD, + CODE_SUBTRACT, + CODE_MULTIPLY, + CODE_DIVIDE, + CODE_ADD_ASSIGNMENT, + CODE_SUBTRACT_ASSIGNMENT, + CODE_MULTIPLY_ASSIGNMENT, + CODE_DIVIDE_ASSIGNMENT, + CODE_GOTO, + CODE_PUSH, + CODE_POP, + CODE_IF, + CODE_EXIT, + CODE_SUSPEND, + CODE_WAIT_SECONDS, + CODE_WAIT_ALL, + CODE_WAIT_ANY, + CODE_MOVE, + CODE_DEBUG, + CODE_USE, + CODE_ROTATE, + CODE_PRINT, + CODE_PLAY_SOUND, + CODE_ENABLE, + CODE_DISABLE, + CODE_ANIMATE, + CODE_DEBUG_STATEMENT, + CODE_CACHE_SOUND, + CODE_COPY_PLAYER_ATTRIBUTES, + CODE_SET_VIEW_ANGLES, + CODE_SET_CACHE_SIZE, + CODE_REMOVE, + CODE_HELICOPTER, + CODE_MOVEROTATE, + CODE_PLAYSONG, + CODE_SETCVAR, + CODE_UNLOAD_SOUND, + CODE_TANK, + CODE_SNOWCAT, + CODE_CACHE_ROFF, + CODE_CACHE_STRING_PACKAGE, + CODE_CONSOLE_COMMAND, + CODE_UNLOAD_ROFF, + CODE_ON, + CODE_RESUME, + CODE_RESET_AI, +}; + +enum PushTypes +{ + PUSH_CONST_INT = 0, + PUSH_CONST_FLOAT, + PUSH_CONST_VECTOR, + PUSH_CONST_ENTITY, + PUSH_CONST_STRING, + PUSH_VAR, + PUSH_VAR_WITH_FIELD, + PUSH_FUNCTION, +}; + +enum ConditionTypes +{ + COND_EQUAL = 0, + COND_LESS_THAN, + COND_LESS_THAN_EQUAL, + COND_GREATER_THAN, + COND_GREATER_THAN_EQUAL, + COND_NOT_EQUAL, +}; + +enum FunctionTypes +{ + FUNC_FIND_ENTITY_WITH_TARGET = 0, + FUNC_SIN, + FUNC_COS, + FUNC_FIND_ENTITY_WITH_SCRIPT, + FUNC_FIND_PLAYER, + FUNC_SPAWN, + FUNC_GET_OTHER, + FUNC_GET_ACTIVATOR, + FUNC_RANDOM, + FUNC_GET_PLAYER, +}; + +enum VariableT +{ + TypeINT = 0, + TypeFLOAT, + TypeVECTOR, + TypeENTITY, + TypeSTRING, + TypeUNKNOWN, +}; + +enum FeatureTypes +{ + FEATURE_TRIGGER = 0, + FEATURE_AMBIENT_SOUNDS, + FEATURE_CINEMATICS, + FEATURE_PLAGUE_SKINS, +}; + +#define VAR_LENGTH 64 + +// Command Flags +// Move +#define MOVE_DURATION 0x01 +#define MOVE_RATE 0x02 +#define MOVE_SIGNALER 0x04 +#define MOVE_ABSOLUTE 0x08 + +// Rotate +#define ROTATE_DURATION 0x01 +#define ROTATE_RATE 0x02 +#define ROTATE_SIGNALER 0x04 +#define ROTATE_ABSOLUTE 0x08 + + +// MoveRotate (disk-file command) +#define MOVEROTATE_SIGNALER 0x01 + +// Wait +#define WAIT_CLEAR 0x80 + +// Print +#define PRINT_ENTITY 0x01 +#define PRINT_CENTERED 0x02 +#define PRINT_LEVEL 0x04 +#define PRINT_CAPTIONED 0x08 + +// Play Sound +#define PLAY_SOUND_ENTITY 0x01 +#define PLAY_SOUND_VOLUME 0x02 +#define PLAY_SOUND_ATTENUATION 0x04 +#define PLAY_SOUND_CHANNEL 0x08 +#define PLAY_SOUND_TIMEDELAY 0x10 + +// Animate +#define ANIMATE_REPEAT 0x001 +#define ANIMATE_TURNING 0x002 +#define ANIMATE_MOVING 0x004 +#define ANIMATE_SIGNALER 0x008 +#define ANIMATE_SOURCE 0x010 +#define ANIMATE_MOVING_ABS 0x020 +#define ANIMATE_HOLD 0x040 +#define ANIMATE_TARGET 0x080 +#define ANIMATE_KILL 0x100 +#define ANIMATE_NULLTARGET 0x200 +#define ANIMATE_EMOTION 0x400 + +// Debug +#define DEBUG_ENABLE 0x01 +#define DEBUG_MOVE 0x02 +#define DEBUG_ROTATE 0x04 +#define DEBUG_TIME 0x08 +#define DEBUG_MOVEROTATE 0x10 + +//Helicopter +#define HELICOPTER_TARG 0x01 +#define HELICOPTER_VECT 0x02 +#define HELICOPTER_FLOAT 0x04 +#define HELICOPTER_SIGNALER 0x08 + +//Tank +#define TANK_TARG 0x01 +#define TANK_VECT 0x02 +#define TANK_FLOAT 0x04 +#define TANK_SIGNALER 0x08 + +//Snowcat +#define SNOWCAT_TARG 0x01 +#define SNOWCAT_VECT 0x02 +#define SNOWCAT_FLOAT 0x04 +#define SNOWCAT_SIGNALER 0x08 diff --git a/Source/Game/gamecpp/pt_listpointer.cpp b/Source/Game/gamecpp/pt_listpointer.cpp new file mode 100644 index 0000000..c0dd27d --- /dev/null +++ b/Source/Game/gamecpp/pt_listpointer.cpp @@ -0,0 +1,143 @@ +#include "g_local.h" +#include "ai_private.h" + +extern mmove_t MMoves[]; + + +ptListTC actionL; +ptListTC decisionL; +ptListTC senseL; +ptListTC bodyL; +ptListTC aiL; + +//ghoul stuff: +ptListTC instL; +ptListTC binstL; +ptListTC objL; + +int ptListTCNextUUID = 1; + +template +void ptListTC::Write1() +{ + int count; + classcode_t ccode; + map::iterator it; + + count = Pointer.size(); + gi.AppendToSavegame('AICT', &count, sizeof(count)); + + for (it = Pointer.begin(); it != Pointer.end(); it++) + { + ccode.uuid = (*it).first; + ccode.code = (*it).second->GetClassCode(); + gi.AppendToSavegame('AICC', &ccode, sizeof(ccode)); + } +} + +template +void ptListTC::Write2() +{ + map::iterator it; + + for (it = Pointer.begin(); it != Pointer.end(); it++) + { + (*it).second->Write(); + } +} + +//just get the info needed to build my list +template +void ptListTC::Read1() +{ + int i, count; + classcode_t ccode; + map::iterator it; + + //make sure the list is empty before loading + for (it = Pointer.begin(); it != Pointer.end(); it++) + { + delete (*it).second; + } + Pointer.clear(); + Index.clear(); + + gi.ReadFromSavegame('AICT', &count, sizeof(count)); + // read the block + for (i = 0; i < count; i++) + { + gi.ReadFromSavegame('AICC', &ccode, sizeof(ccode)); + + T *newT = (T *)T::NewClassForCode(ccode.code); + LoadUUID(ccode.uuid); + + Index[newT] = ccode.uuid; + Pointer[ccode.uuid] = newT; + } +} + +//now fill the list +template +void ptListTC::Read2() +{ + map::iterator it; + + for (it = Pointer.begin(); it != Pointer.end(); it++) + { + (*it).second->Read(); + } +} + +// Save out all the chunks + +void DynListWrite() +{ + objL.Write1(); + // Dependent on obj + binstL.Write1(); + // Dependent on binst + instL.Write1(); + + actionL.Write1(); + decisionL.Write1(); + senseL.Write1(); + bodyL.Write1(); + aiL.Write1(); + + + objL.Write2(); + instL.Write2(); + binstL.Write2(); + + actionL.Write2(); + decisionL.Write2(); + senseL.Write2(); + bodyL.Write2(); + aiL.Write2(); +} + +void DynListRead() +{ + objL.Read1(); + binstL.Read1(); + instL.Read1(); + + actionL.Read1(); + decisionL.Read1(); + senseL.Read1(); + bodyL.Read1(); + aiL.Read1(); + + + objL.Read2(); + instL.Read2(); + binstL.Read2(); + + actionL.Read2(); + decisionL.Read2(); + senseL.Read2(); + bodyL.Read2(); + aiL.Read2(); +} + +// end \ No newline at end of file diff --git a/Source/Game/gamecpp/pt_listpointer.h b/Source/Game/gamecpp/pt_listpointer.h new file mode 100644 index 0000000..3fc4939 --- /dev/null +++ b/Source/Game/gamecpp/pt_listpointer.h @@ -0,0 +1,174 @@ + +class action_c; +class decision_c; +class sense_c; +class body_c; +class ai_public_c; +class ggOinstC; +class ggBinstC; +class ggObjC; + +class scripted_decision; + +void DynListWrite(); +void DynListRead(); + +typedef struct classcode_s +{ + int uuid; + int code; +} classcode_t; + +//couldn't make this a static in a template class. +extern int ptListTCNextUUID; + +template +class ptListTC +{ +private: + int NewUUID() {return ptListTCNextUUID++;} + void LoadUUID(int uuid) {if (ptListTCNextUUID<=uuid) ptListTCNextUUID=uuid+1;} // prevent new thing from conflicting with loaded things. + + map Index; + map Pointer; +public: + int GetIndexFromPointer(T *thing) + { + map::iterator f; + + if (!thing) + { + return(0); + } + f = Index.find(thing); + if (f == Index.end()) + { + return(0); + } + return((*f).second); + } + T *GetPointerFromIndex(int index) + { + map::iterator f; + + if (!index) + { + return(NULL); + } + f = Pointer.find(index); + if (f == Pointer.end()) + { + return(NULL); + } + return((*f).second); + } + void AddElement(T *thing) + { + map::iterator f; + int idx; + + if (!thing) + { + return; + } + f = Index.find(thing); + if (f == Index.end()) + { + idx = NewUUID(); + Index[thing] = idx; + Pointer[idx] = thing; + } + } + void RemoveElement(T *thing) + { + map::iterator f; + map::iterator ff; + + if (!thing) + { + return; + } + f = Index.find(thing); + if (f == Index.end()) + { + return; + } + ff = Pointer.find((*f).second); + assert(ff != Pointer.end()); // maps are corrupted, they should always correspond. + Pointer.erase(ff); + Index.erase(f); + delete thing; + } + + void Write1(); + void Write2(); + void Read1(); + void Read2(); +}; + +extern ptListTC actionL; +extern ptListTC decisionL; +extern ptListTC senseL; +extern ptListTC bodyL; +extern ptListTC aiL; + +//ghoul stuff: +extern ptListTC instL; +extern ptListTC binstL; +extern ptListTC objL; + +//use these wherever you need a pointer and you need to keep track of what's pointed to. they should be used to maintain a list for savegame stuff. + +// requirements for a class being able to used by ptrTC as T: +// needs to have member functions int GetClassCode(void) and T* NewClassForCode(int); +// --they allow saving and loading child classes. if no child classes exist, it doesn't matter +// what getclasscode returns, newclassforcode should always return the base class. +// if there are children, the parent and all the children should return a unique class +// code, and newclassforcode should allocate a new parent, or child, class based on that. +// +// also need Save and Load funcs +// +// then, need to make a content list of the class, and define your ptrTC +// and add the list to the list saving and loading in listpointer.cpp + +template *ptlist> +class ptrTC +{ +protected: + T *this_pointed; +public: + //constructors are for initialization, and for conversion, so you can use action_c_ptr as an argument, and it'll work just like a normal pointer--can pass in NULL, or & + ptrTC(void){this_pointed = NULL;} + //update list on this constructor + ptrTC(const T *a_pointer){this_pointed = (T *)a_pointer; ptlist->AddElement((T *)this_pointed);} + + //assignments--again, works just like a pointer--update list here + const ptrTC &operator= (const T* new_action) {this_pointed = (T *)new_action; ptlist->AddElement((T *)this_pointed); return *this;} + + //so you can access this like, uh, a pointer... + T *operator-> () {return this_pointed;} + + //this is a better way to make me work in logic statements--just treat me exactly like a pointer! + operator T*() {return this_pointed;} + + //this used in place of delete for getting rid of what the pointer is pointing to. update list + void Destroy(void){if (this_pointed) ptlist->RemoveElement(this_pointed); this_pointed = NULL;} + + void MakeIndex(T *orig) { *(int *)&this_pointed = ptlist->GetIndexFromPointer(orig); } + void MakeIndex() { *(int *)&this_pointed = ptlist->GetIndexFromPointer(this_pointed); } + int GetIndex() { return(ptlist->GetIndexFromPointer(this_pointed)); } +// void MakePtr() { this_pointed = ptlist->GetPointerFromIndex((int)this_pointed); } + void MakePtr(int idx) { this_pointed = ptlist->GetPointerFromIndex(idx); } + T *GetPtr(int i) { ptlist->GetPointerFromIndex(i); } +}; + +#define sense_c_ptr ptrTC +#define decision_c_ptr ptrTC +#define action_c_ptr ptrTC +#define ai_c_ptr ptrTC + +#define gg_inst_c_ptr ptrTC +#define gg_binst_c_ptr ptrTC +#define gg_obj_c_ptr ptrTC + +#define body_c_ptr ptrTC diff --git a/Source/Game/gamecpp/q_sh_fx.cpp b/Source/Game/gamecpp/q_sh_fx.cpp new file mode 100644 index 0000000..0089a9a --- /dev/null +++ b/Source/Game/gamecpp/q_sh_fx.cpp @@ -0,0 +1,169 @@ +#include "q_shared.h" +#include "..\qcommon\palette.h" +#include "q_sh_fx.h" + +// wheee! look at me! I'm _sharing_ !!!!! +cl_ghoul_data_t cl_fxg [NUM_CLGHL] = +{ + "Objects/Generic/chunks_brick", "brick", "Brick", 3,// CLGHL_CHUNKBRICK + "Objects/Generic/chunks_glass", "glass_sm", "glass", 3,// CLGHL_CHUNKGLASSSM + "Objects/Generic/chunks_glass", "glass_med", "glass", 3,// CLGHL_CHUNKGLASSMED + "Objects/Generic/chunks_glass", "glass_lrg", "glass", 3,// CLGHL_CHUNKGLASSLRG + "Objects/Generic/chunks_metal", "metal_sm", "metal", 4,// CLGHL_CHUNKMETALSM + "Objects/Generic/chunks_metal", "metal_med", "metal", 4,// CLGHL_CHUNKMETALMED + "Objects/Generic/chunks_metal", "metal_lg", "metal", 4,// CLGHL_CHUNKMETALLRG + "Objects/Generic/chunks_rock", "rock_sm", "rock", 4,// CLGHL_CHUNKROCKSM + "Objects/Generic/chunks_rock", "rock_med", "rock", 4,// CLGHL_CHUNKROCKMED + "Objects/Generic/chunks_rock", "rock_lg", "rock", 4,// CLGHL_CHUNKROCKLRG + "Objects/Generic/chunks_rock", "rock_tiny", "rock", 4,// CLGHL_CHUNKROCKTINY + "Objects/Generic/chunks_wall", "wall_sm", "wall", 4,// CLGHL_CHUNKWALLSM + "Objects/Generic/chunks_wall", "wall_med", "wall", 4,// CLGHL_CHUNKWALLMED + "Objects/Generic/chunks_wall", "wall_lrg", "wall", 4,// CLGHL_CHUNKWALLLRG + "Objects/Generic/chunks_wall", "wall_tiny", "wall", 4,// CLGHL_CHUNKWALLTINY + "Objects/Generic/chunks_wood", "wood_sm", "wood", 3,// CLGHL_CHUNKWOODSM + "Objects/Generic/chunks_wood", "wood_med", "wood", 3,// CLGHL_CHUNKWOODMED + "Objects/Generic/chunks_wood", "wood_large", "wood", 3,// CLGHL_CHUNKWOODLRG + "Items/Projectiles", "shell", NULL, 0,// CLGHL_SHELL + "Effects/explosion", "explode80", "explode", 0,// CLGHL_EXPLODEBIG + "Effects/explosion", "explode20", "explode", 0,// CLGHL_EXPLODESML + "Objects/Generic/soda_can", "can", NULL, 0,// CLGHL_CAN + "Objects/Generic/paper_blowing","paper", NULL, 1,// CLGHL_PAPER + "Effects/explosion", "mushroom", "mushroom", 0,// CLGHL_MUSHROOM + + "this is the end of the list, so dont move it", "yeah", NULL, 0 +}; + +cl_effect_data_t cl_fxs [NUM_CLSFX] = +{ + "Ambient/Gen/Electric/spark1.wav", + "Ambient/Gen/Electric/spark2.wav", + "player/foot/metal/metal1.wav", + "player/foot/metal/metal2.wav", + "player/foot/metal/metal3.wav", + "player/foot/metal/metal4.wav", + "player/foot/snow/snow1.wav", + "player/foot/snow/snow2.wav", + "player/foot/snow/snow3.wav", + "player/foot/snow/snow4.wav", + "player/foot/water/water1.wav", + "player/foot/water/water2.wav", + "player/foot/water/water3.wav", + "player/foot/water/water4.wav", + "player/foot/grass/grass1.wav", + "player/foot/grass/grass2.wav", + "player/foot/grass/grass3.wav", + "player/foot/grass/grass4.wav", + "player/foot/gravel/gravel1.wav", + "player/foot/gravel/gravel2.wav", + "player/foot/gravel/gravel3.wav", + "player/foot/gravel/gravel4.wav", + "player/foot/sand/sand1.wav", + "player/foot/sand/sand2.wav", + "player/foot/sand/sand3.wav", + "player/foot/sand/sand4.wav", + "player/foot/wood/wood1.wav", + "player/foot/wood/wood2.wav", + "player/foot/wood/wood3.wav", + "player/foot/wood/wood4.wav", + "player/foot/stone/stone1.wav", + "player/foot/stone/stone2.wav", + "player/foot/stone/stone3.wav", + "player/foot/stone/stone4.wav", +// "misc/Gore/splat1.wav", +// "misc/Gore/splat2.wav", +// "misc/Gore/splat3.wav", + "Weapons/FX/Rics/ric1.wav", + "Weapons/FX/Rics/ric2.wav", + "Weapons/FX/Rics/ric3.wav", + "Impact/Surfs/stone.wav", + "Impact/Surfs/water.wav", + "Impact/Surfs/wood.wav", + "Impact/Surfs/grass.wav", + "Impact/Surfs/gravel.wav", + "Impact/Surfs/sand.wav", + "Impact/Surfs/snow.wav", + "shouldn't be loaded now", // kef - CLSFX_METALIMPACT should never be loaded now, but it still needs a slot here + "Impact/Gore/impact1.wav", + "Impact/Gore/impact2.wav", + "Impact/Gore/impact3.wav", + "Weapons/FX/FlyBy/FlyBy1.wav", + "Weapons/FX/FlyBy/FlyBy2.wav", + "Weapons/FX/FlyBy/FlyBy3.wav", + "Weapons/FX/FlyBy/FlyBy4.wav", + "Weapons/Glock/fire.wav",// this should be the first shot sound + "ambient/Nature/weather/thnder1.wav",// this should be the first shot sound + "weapons/FlshGren/FlshExp.wav", + "Weapons/Autoshot/fire.wav", + "Enemy/MGun/trnslow.wav", + "Enemy/MGun/trnstop.wav", + "weapons/C4/C4Exp.wav", + "Impact/Chair/Squeak1.wav", + "Impact/Chair/Squeak2.wav", + "Impact/Chair/Squeak3.wav", + "Ambient/Locs/Subway/Train/Brake.wav", + "Ambient/Locs/Subway/Train/Horn2.wav", + "Ambient/Locs/Subway/Train/Impact.wav", + "Ambient/Locs/Subway/Train/Move.wav", + "Weapons/Knife/Swing1.wav", + "Weapons/Knife/Swing2.wav", + "Weapons/Knife/Swing3.wav", + "Weapons/Knife/Impact.wav", + "Weapons/Knife/Throw.wav", + "Player/Land/Grass.wav", + "Player/Land/Gravel.wav", + "Player/Land/Metal.wav", + "Player/Land/Sand.wav", + "Player/Land/Snow.wav", + "Player/Land/Stone.wav", + "Player/Land/Water.wav", + "Player/Land/Wood.wav", +// "Weapons/DesertEagle/Fire.wav", +// "Weapons/Ingram/Fire.wav", +// "Weapons/Jack/Fire.wav", +// "Weapons/flamethrower/Fireball.wav", +// "Weapons/jack/Fire2.wav", +// "Weapons/Sniper/Fire.wav", +// "weapons/spas12/fire.wav", +// "weapons/Spas12/Fire2.wav", +// "weapons/Minimi/Fire2.wav", + "impact/surfs/metal1.wav", + "impact/surfs/metal2.wav", + "impact/surfs/metal3.wav", +// "weapons/Minimi/Fire.wav", +// "weapons/Mgun/explode.wav", + "Impact/GlassBreak/GBBig.wav", + "Impact/GlassBreak/GBMed.wav", + "Impact/GlassBreak/GBSmall.wav", + "Impact/Break/Metal.wav", + "Impact/Break/Stone.wav", + "Impact/Break/Wood.wav", + "Ambient/Gen/Electric/buzz.wav", + "Impact/Explosion/Big.wav", + "Impact/Explosion/Med.wav", + "Impact/Explosion/Small.wav", + "Ambient/Models/Phone/Hit.wav", + "Ambient/Models/TrashCan/LidSpin.wav", + "weapons/FX/Tink/Metal1.wav", + "weapons/FX/Tink/Metal2.wav", + "weapons/FX/Tink/Metal3.wav", + "weapons/FX/Tink/Gen1.wav", + "weapons/FX/Tink/Gen2.wav", + "Impact/Gore/Fall1.wav", + "Impact/Gore/Fall2.wav", + "Impact/Gore/Fall3.wav", + "weapons/FX/Crack/Crack1.wav", + "weapons/FX/Crack/Crack2.wav", + "weapons/FX/Crack/Crack3.wav", + "enemy/Helicopter/Fire1.wav", + "enemy/Helicopter/Fire2.wav", + "enemy/Helicopter/Fire3.wav", + "weapons/FX/Tink/shot1.wav", + "weapons/FX/Tink/shot2.wav", + "weapons/FX/Tink/shot3.wav", + "weapons/FX/Tink/hvy1.wav", + "weapons/FX/Tink/hvy2.wav", + "weapons/FX/Tink/hvy3.wav", + "this is the end of the list, so dont move it", +}; + + diff --git a/Source/Game/gamecpp/q_sh_fx.h b/Source/Game/gamecpp/q_sh_fx.h new file mode 100644 index 0000000..d47f760 --- /dev/null +++ b/Source/Game/gamecpp/q_sh_fx.h @@ -0,0 +1,724 @@ +// q_sh_fx.h + +#ifndef _Q_SH_FX_ +#define _Q_SH_FX_ + +#include "..\ghoul\ighoul.h" + +typedef enum +{ + RI_WORLD, + RI_WORLD_NOSURF, + RI_BMODEL, + RI_ENT, +}relativeInfo_t; + + +#define DEBRIS_YES 'y' +#define DEBRIS_PRECACHE_IMAGE 'p' // kef -- sorry hack. precache image for remote_cameras + +// need debris to be shared so entity spawn functions can register which +//debris types need to be cached +enum +{ + CLGHL_CHUNKBRICK, + CLGHL_CHUNKGLASSSM, + CLGHL_CHUNKGLASSMED, + CLGHL_CHUNKGLASSLRG, + CLGHL_CHUNKMETALSM, + CLGHL_CHUNKMETALMED, + CLGHL_CHUNKMETALLRG, + CLGHL_CHUNKROCKSM, + CLGHL_CHUNKROCKMED, + CLGHL_CHUNKROCKLRG, + CLGHL_CHUNKROCKTINY, + CLGHL_CHUNKWALLSM, + CLGHL_CHUNKWALLMED, + CLGHL_CHUNKWALLLRG, + CLGHL_CHUNKWALLTINY, + CLGHL_CHUNKWOODSM, + CLGHL_CHUNKWOODMED, + CLGHL_CHUNKWOODLRG, + CLGHL_SHELL, + CLGHL_EXPLODEBIG, + CLGHL_EXPLODESML, + CLGHL_CAN, + CLGHL_PAPER, + CLGHL_MUSHROOM, + CLGHL_ENDOFLIST, + NUM_CLGHL, +}; + +typedef struct cl_ghoul_data_s +{ + char *path; + char *file; + char *material; + int partCnt; // Number of parts in model +}cl_ghoul_data_t; + +extern cl_ghoul_data_t cl_fxg [NUM_CLGHL]; + +// need decals to be shared so entity spawn functions can register which +//decals need to be cached +enum +{ + CLMOD_SMOKE = 0, + CLMOD_BLOOD1, + CLMOD_BLOOD2, + CLMOD_BLOOD3, + CLMOD_BLOODPOOL2, + CLMOD_FOOTPRINT, + CLMOD_FOOTPRINT2, + CLMOD_LIGHTNING, + CLMOD_RING, + CLMOD_DIRT, + CLMOD_SPARKPART, + CLMOD_WATER, + CLMOD_POWDER, + CLMOD_BHOLE, + CLMOD_BULLETWHIZ, + CLMOD_SPARKPARTBLUE, + CLMOD_FLARE, + CLMOD_WATERDROP, + CLMOD_GENERIC_DENT, + CLMOD_RAIN, + CLMOD_MFLASH, + CLMOD_SHOCKBLUE, + CLMOD_SHOCK3, + CLMOD_SHOCK4, + CLMOD_BOOM3, + CLMOD_BOOM5, + CLMOD_SCORCH, +// CLMOD_OIL1, +// CLMOD_OIL2, + CLMOD_OOZE, + CLMOD_FIREEXPLODE, + CLMOD_WHITESCORCH, + CLMOD_SNOW, + CLMOD_BUBBLE, + CLMOD_PIPELEFT, + CLMOD_BHOLEGLASS, + CLMOD_SLASH, + CLMOD_RINGBLAST, + CLMOD_BEAM, + CLMOD_MFLASH2, + CLMOD_MFLASH3, + CLMOD_MFLASH4, + CLMOD_FLARE2, + CLMOD_SMOKE2, + CLMOD_BHOLE_METAL, + CLMOD_BHOLE_WD, + CLMOD_MINIMIFLASH1, + CLMOD_MINIMIFLASH2, + CLMOD_MINIMIFLASH3, + CLMOD_EXP_FIRE1, + CLMOD_EXP_FIRE2, + CLMOD_EXP_FIRE3, + CLMOD_EXP_FIRE4, + CLMOD_EXP_SMKGRN, + CLMOD_EXP_SMKGRY, + CLMOD_EXP_SMKWHT, + CLMOD_EXP_FIRESTREAK, + CLMOD_EXP_WHITESTREAK, + CLMOD_PUDDLE, + CLMOD_ENDOFLIST, + NUM_CLMODS +}; + + +// need client sound effects to be shared so entity spawn functions can register which +//sounds need to be cached + +#define NUM_SPLATTERSOUNDS 3 +#define NUM_FOOTSTEPS_PER_GROUP 4 +#define NUM_RICOCHETSOUNDS 3 +#define NUM_PASSBYSOUNDS 4 +#define NUM_FLESHIMPACTS 3 +#define NUM_KNIFESLASHES 3 +#define NUM_GORE_FALLS 3 + +enum +{ + CLSFX_SPARK1 = 0, + CLSFX_SPARK2, + CLSFX_FOOTSTEP_METAL, + CLSFX_FOOTSTEP_SNOW = CLSFX_FOOTSTEP_METAL + NUM_FOOTSTEPS_PER_GROUP, + CLSFX_FOOTSTEP_WATER = CLSFX_FOOTSTEP_SNOW + NUM_FOOTSTEPS_PER_GROUP, + CLSFX_FOOTSTEP_GRASS = CLSFX_FOOTSTEP_WATER + NUM_FOOTSTEPS_PER_GROUP, + CLSFX_FOOTSTEP_GRAVEL = CLSFX_FOOTSTEP_GRASS + NUM_FOOTSTEPS_PER_GROUP, + CLSFX_FOOTSTEP_SAND = CLSFX_FOOTSTEP_GRAVEL + NUM_FOOTSTEPS_PER_GROUP, + CLSFX_FOOTSTEP_WOOD = CLSFX_FOOTSTEP_SAND + NUM_FOOTSTEPS_PER_GROUP, + CLSFX_FOOTSTEP_STONE = CLSFX_FOOTSTEP_WOOD + NUM_FOOTSTEPS_PER_GROUP, +// CLSFX_SPLATTERS = CLSFX_FOOTSTEP_STONE + NUM_FOOTSTEPS_PER_GROUP, + //CLSFX_RICOCHETS = CLSFX_SPLATTERS + NUM_SPLATTERSOUNDS, + CLSFX_RICOCHETS = CLSFX_FOOTSTEP_STONE + NUM_FOOTSTEPS_PER_GROUP, + CLSFX_STONEIMPACT = CLSFX_RICOCHETS + NUM_RICOCHETSOUNDS, + CLSFX_WATERIMPACT, + CLSFX_WOODIMPACT, + CLSFX_GRASSIMPACT, + CLSFX_GRAVELIMPACT, + CLSFX_SANDIMPACT, + CLSFX_SNOWIMPACT, + CLSFX_METALIMPACT, + CLSFX_FLESHIMPACT, + CLSFX_PASSBY = CLSFX_FLESHIMPACT + NUM_FLESHIMPACTS, + CLSFX_SHOT = CLSFX_PASSBY + NUM_PASSBYSOUNDS, + CLSFX_THUNDER, + CLSFX_FLASHPACK, + CLSFX_AUTOGUNFIRE, + CLSFX_AUTOGUNSLOW, + CLSFX_AUTOGUNSTOP, + CLSFX_EXPLODE, + CLSFX_CHAIR_SQUEAK1, + CLSFX_CHAIR_SQUEAK2, + CLSFX_CHAIR_SQUEAK3, + CLSFX_TRAIN_BRAKE, + CLSFX_TRAIN_HORN, + CLSFX_TRAIN_IMPACT, + CLSFX_TRAIN_MOVE, + CLSFX_KNIFE_SLASH, + CLSFX_KNIFE_IMPACT = CLSFX_KNIFE_SLASH + NUM_KNIFESLASHES, + CLSFX_KNIFE_THROW, + CLSFX_LAND_GRASS, + CLSFX_LAND_GRAVEL, + CLSFX_LAND_METAL, + CLSFX_LAND_SAND, + CLSFX_LAND_SNOW, + CLSFX_LAND_STONE, + CLSFX_LAND_WATER, + CLSFX_LAND_WOOD, +// CLSFX_SHOT_EAGLE, +// CLSFX_SHOT_INGRAM, +// CLSFX_SHOT_JACK, +// CLSFX_SHOT_FIREBALL, +// CLSFX_SHOT_JACKALT, +// CLSFX_SHOT_SNIPER, +// CLSFX_SHOT_SPAS, +// CLSFX_SHOT_SPASALT, +// CLSFX_SHOT_MINIMIALT, + CLSFX_METALSTRIKE1, + CLSFX_METALSTRIKE2, + CLSFX_METALSTRIKE3, +// CLSFX_SHOT_MINIMI, +// CLSFX_PHOSGREN, + CLSFX_BREAK_GLASSBIG, + CLSFX_BREAK_GLASSMED, + CLSFX_BREAK_GLASSSMALL, + CLSFX_BREAK_METAL, + CLSFX_BREAK_STONE, + CLSFX_BREAK_WOOD, + CLSFX_ELECTRICARC, + CLSFX_EXP_LARGE, + CLSFX_EXP_MEDIUM, + CLSFX_EXP_SMALL, + CLSFX_PHONE_HIT, + CLSFX_TRASHCAN_FLIP, + CLSFX_METALTINK1, + CLSFX_METALTINK2, + CLSFX_METALTINK3, + CLSFX_GENTINK1, + CLSFX_GENTINK2, + CLSFX_GORE_FALL, + CLSFX_CRACK1 = CLSFX_GORE_FALL + NUM_GORE_FALLS, + CLSFX_CRACK2, + CLSFX_CRACK3, + CLSFX_SHOT_HELI1, + CLSFX_SHOT_HELI2, + CLSFX_SHOT_HELI3, + CLSFX_SHOTGUNTINK1, + CLSFX_SHOTGUNTINK2, + CLSFX_SHOTGUNTINK3, + CLSFX_HEAVYTINK1, + CLSFX_HEAVYTINK2, + CLSFX_HEAVYTINK3, + CLSFX_ENDOFLIST, + NUM_CLSFX, +}; + +typedef struct cl_effect_data_s +{ + char *filename; +}cl_effect_data_t; + +extern cl_effect_data_t cl_fxs [NUM_CLSFX]; + + +// entity_state_t->event values +// ertity events are for effects that take place reletive +// to an existing entities origin. Very network efficient. +typedef enum +{ + EV_NONE, + EV_ITEM_RESPAWN, + EV_PHOSPHUR_EXPLODE, + EV_FOOTSTEPLEFT, + EV_FOOTSTEPRIGHT, + EV_FOOTSTEPLEFTRUN, + EV_FOOTSTEPRIGHTRUN, + EV_FALLSHORT, + EV_FALL, + EV_FALLFAR, + EV_OBJECT_COLLIDE_SHORT, + EV_OBJECT_COLLIDE_MEDIUM, + EV_OBJECT_COLLIDE_FAR, + EV_FOOTSTEPMETALLEFT, + EV_FOOTSTEPMETALRIGHT, + EV_PLAYER_TELEPORT, + EV_CAMERA_SHAKE_VERYLIGHT, + EV_CAMERA_SHAKE_LIGHT, + EV_CAMERA_SHAKE_MEDIUM, + EV_CAMERA_SHAKE_HEAVY, + EV_CAMERA_SHAKE_VERYHEAVY, + EV_BULLETCRACK,//fixme + EV_TINTCLEAR, + EV_NUM +} entity_event_t; + +// attached effects +typedef enum +{ + AE_NOTHING = 0, + AE_STEAM, + AE_ONFIRE, + AE_WATERSTREAM, + AE_LIGHTNING, + AE_SMOKE, + AE_BLOODRAIN, + AE_FOUNTAIN, + AE_WATERDROPS, + AE_SHAKE, + AE_SPRINKLER, + AE_HELISMOKE, + AE_HUMANFLAME, + AE_INFERNO, + AE_CSIDE_ROTATE,//yuck + AE_NUM_AES +} attached_effect_t; + +// If this list is updated, be sure to update bin_nt/sof.mat +enum +{ + SURF_NONE = -1, + SURF_DEFAULT = 0, + SURF_METAL_ALSO, // 2/10/00 kef -- rick wants METAL and METAL_STEAM switched + SURF_SAND_YELLOW, + SURF_SAND_WHITE, + SURF_SAND_LBROWN, + SURF_SAND_DBROWN, // 5 + + SURF_GRAVEL_GREY, + SURF_GRAVEL_DBROWN, + SURF_GRAVEL_LBROWN, + + SURF_SNOW, + + SURF_LIQUID_BLUE, // 10 + SURF_LIQUID_GREEN, + SURF_LIQUID_ORANGE, + SURF_LIQUID_BROWN, + + SURF_WOOD_LBROWN, + SURF_WOOD_DBROWN, // 15 + SURF_WOOD_LGREY, + + SURF_STONE_LGREY, // chunks.tga + SURF_STONE_DGREY, // chunksdrkclgry.tga + SURF_STONE_LBROWN, // chunksbrwn.tga + SURF_STONE_DBROWN, // 20 chunksbrwn.tga + SURF_STONE_WHITE, // chunkswht.tga + SURF_STONE_GREEN, // chunkgreen.tga + SURF_STONE_RED, // chunkred.tga + SURF_STONE_BLACK, // chunkblk.tga + + SURF_GRASS_GREEN, // 25 + SURF_GRASS_BROWN, + + SURF_LIQUID_RED, + + SURF_METAL, // 2/10/00 kef -- rick wants METAL and METAL_STEAM switched + SURF_METAL_WATERJET, + SURF_METAL_OILSPURT, // 30 + SURF_METAL_CHEMSPURT, + SURF_METAL_COMPUTERS, + + SURF_SNOW_LBROWN, + SURF_SNOW_GREY, + SURF_BLOOD, // 35 + SURF_LIQUID_BLACK, + SURF_GLASS, + SURF_GLASS_COMPUTER, + SURF_SODAMACHINE, + SURF_PAPERWALL, // 40 + SURF_NEWSPAPER_DAMAGE, + SURF_METAL_STEAM, + + SURF_NUM +}; + + +// Available materials to throw when an object dies. +enum +{ + MAT_NONE = -1, + MAT_DEFAULT = 0, + + MAT_BRICK_BROWN, + MAT_BRICK_DBROWN, + MAT_BRICK_LBROWN, + MAT_BRICK_LGREY, + MAT_BRICK_DGREY, + MAT_BRICK_RED, + + MAT_GLASS, + + MAT_METAL_LGREY, + MAT_METAL_DGREY, + MAT_METAL_RUSTY, + MAT_METAL_SHINY, + + MAT_ROCK_BROWN, + MAT_ROCK_LBROWN, + MAT_ROCK_DBROWN, + MAT_ROCK_LGREY, + MAT_ROCK_DGREY, + + MAT_WOOD_LBROWN, + MAT_WOOD_DBROWN, + MAT_WOOD_DGREY, + MAT_WOOD_LGREY, + + MAT_WALL_BLACK, + MAT_WALL_BROWN, + MAT_WALL_DARKBROWN, + MAT_WALL_LIGHTBROWN, + MAT_WALL_GREY, + MAT_WALL_DARKGREY, + MAT_WALL_LIGHTGREY, + MAT_WALL_GREEN, + MAT_WALL_ORANGE, + MAT_WALL_RED, + MAT_WALL_WHITE, + MAT_ROCK_FLESH, + MAT_WALL_STRAW, + MAT_ROCK_SNOW, + + MATERIAL_NUM +}; + +// Possible marks weapons can make +typedef enum +{ + DEBRIS_NONE = 0, + DEBRIS_SM, + DEBRIS_MED, + DEBRIS_LRG, + DEBRIS_TINY, +}; + +// Possible marks weapons can make +typedef enum +{ + WMRK_NONE = 0, + WMRK_BULLETHOLE, + WMRK_SLASH, +}; + +// temp entity events +// +// Temp entity events are for things that happen +// at a location seperate from any existing entity. +// Temporary entity messages are explicitly constructed +// and broadcast. +typedef enum +{ + TE_ORANGE_SPARKS, + TE_DUST_PUFF, + TE_EXTINGUISHER_EXPLODE, + TE_BLOODSPRAY, + TE_BLOODPOOL, + TE_EXPLODE, + TE_WALLDAMAGE, + TE_WALLSEVEREDAMAGE, + TE_ELECTRIC_ARC, + TE_WHIZBULLET, + TE_BLUE_SPARKS, + TE_WATER_GLOB, + TE_WATER_SHOCK, + TE_BARREL_EXPLODE, + TE_BARREL_SPARKS, + TE_SCORCHMARK, + TE_SKY_LIGHTNING, + TE_OOZE, + TE_DEBRIS, + TE_C4EXPLODE, + TE_FLASHPACK, + TE_NEURALPULSE, + TE_AUTOGUNMUZZLEFLASH, + TE_WALLSTRIKE, + TE_SHOTGUN, + TE_UNDERWATER_BULLET, + TE_SMOKE_BURST, + TE_TEST_LINE, + TE_PIPELEFT, + TE_WHITESCORCH, + TE_SINKPIPE, + TE_GUMBALLS, + TE_WALLSPARKS, + TE_SHOTGUNMINE, + TE_SPAS, + TE_BLOODSQUIRT, + TE_HELIGUN, + TE_WHITEBURN, + TE_WHITEBLAST, + TE_MINIMISMOKE, + TE_EXPLOSION, + TE_BLOODCLOUD, + TE_HEADEXPLOSION, + TE_BLOODJET, + TE_VEHICLEEXPLOSION, + TE_SMOKE_PUFF, + TE_LITTLEEXPLOSION, + TE_MAKERING, + TE_PAPERCLOUD, + TE_COINS, + TE_SODACANS, + TE_FLOORSPACE, + TE_DUSTBITS, + TE_PUDDLE, + TE_RICOCHET, + TE_MEDIUMEXPLOSION, + TE_LARGEEXPLOSION, + TE_TRACER, + TE_PHONEHIT, + TE_TRASHCANHIT, + TE_DMSHOT, + TE_DMSHOTHIT, + TE_DMSHOTBIGHIT, + TE_DMMUZZLEFLASH, + TE_TESTBOX, + TE_NUM +} temp_event_t; + +typedef struct eft_steam_s +{ + unsigned short color; + byte dir; + byte size; + byte duration; + byte speed; + byte variance; + byte smokeType; + byte offset[3]; // (-128) + byte more; // these next three generate "more" additional smokes + byte moreDir; // originating "moreDist" from the first one in the direction + byte moreDist; // of moreDir +}eft_steam_t; + +typedef struct eft_stream_s +{ + byte vel[3]; // (-128) * 5 + byte offset[3]; // (-128) + byte duration; // how long each water glob lasts - in hundreths of a second... + byte width; + byte color[3]; // color of the stream + byte randomness; + short floor; +}eft_stream_t; + +typedef struct eft_flame_s +{ + byte zoffset; // (-128) + byte size; + byte lifeTime; // Life time in hundreths of a second... +}eft_flame_t; + +typedef struct eft_rain_t +{ + short xrange; + short yrange; + short zrange; + short rainPerSec; + byte lightLevel; + byte rainSpeed; + byte wind; + byte rainLen; +}eft_rain_t; + +typedef struct eft_snow_s +{ + short width; + short length; + short height; + byte snowPerSec; + byte speed; + byte lightLevel; + byte sideSpeed; +}eft_snow_t; + +typedef struct eft_lightning_s +{ + unsigned short color; + byte dir; + byte len; + byte freq; + byte thickness; +}eft_lightning_t; + +typedef struct eft_shake_s +{ + byte amount; +} +eft_shake_t; + +enum animtype +{ + loop, + backandforth, +}; + +enum dir +{ + forth, + back, +}; + +typedef struct eft_anim_s +{ + byte startframe; + byte endframe; + byte fps; // frames per second + byte animtype; + byte dir; +}eft_anim_t; + +typedef struct eft_bloodrain_s +{ + byte offset[3]; // (-128) + byte xrange; + byte yrange; +}eft_bloodrain_t; + +typedef struct eft_waterdrops_s +{ + byte xrange; + byte yrange; + byte frequency;//per sec + byte size; +}eft_waterdrops_t; + +typedef struct eft_missilesmoke_s +{ + byte bob; +}eft_missilesmoke_t; + +typedef struct eft_teargas_s +{ + byte thickness; +}eft_teargas_t; + +typedef struct eft_sprinkler_s +{ + byte vel[3]; // + byte offset[3]; // + byte duration; // how long each water lasts - in hundreths of a second... + byte width; + byte color[3]; // color of the stream + byte randomness; + short floor; +}eft_sprinkler_t; + +typedef struct eft_helismoke_s +{ + GhoulUUID instID; + GhoulID bolt1;//does this work right? + GhoulID bolt2; + byte smoke1Strength; + byte smoke2Strength; +}eft_helismoke_t; + +typedef struct eft_flamethrow_s +{ + GhoulUUID inst; +}eft_flamethrow_t; + +typedef struct eft_humanflame_s +{ + GhoulUUID instID; + byte intense; + byte timeleft; // in tenths of seconds +}eft_humanflame_t; + +typedef struct eft_tripbeam_s +{ + paletteRGBA_t pal; + short offset[3]; + byte width; +}eft_tripbeam_t; + +typedef struct eft_inferno_s +{ + byte intensity; + byte winddir; + byte windspeed; + short xrange; + short yrange; + short zrange; +}eft_inferno_t; + +typedef struct eft_shadow_s +{ + byte size; +}eft_shadow_t; + +typedef struct eft_rotate_s +{ + short buffer;//fixing a problem through hackery. Sigh. + short xRot; + short yRot; + short zRot; + short boltonID; + short boltonID2; + short boltonID3; + short boltonID4; +}eft_rotate_t; + + +typedef struct eft_fade_s +{ + long int startTime; // what time did the fade begin? + short duration; // How many milliseconds does it take to fade? Negative = fade in. +}eft_fade_t; + + +typedef struct eft_marker_s +{ + short markerID; + byte priority; +}eft_marker_t; + +typedef struct eft_normal_s +{ + unsigned char b[29]; +}eft_normal_t; + + +// effect fields that can be sent +#define EFF_SCALE 0x01 +#define EFF_NUMELEMS 0x02 +#define EFF_POS2 0x04 +#define EFF_DIR 0x08 +#define EFF_MIN 0x10 +#define EFF_MAX 0x20 +#define EFF_LIFETIME 0x40 +#define EFF_RADIUS 0x80 + +#define EFAT_POS 0x01 +#define EFAT_ENT 0x02 +#define EFAT_BOLT 0x04 +#define EFAT_BOLTANDINST 0x08 +#define EFAT_POSTOWALL 0x20 // pos2 gets frame updates +#define EFAT_ALTAXIS 0x40 // uses different axis for ghoul stuff +#define EFAT_HASFLAGS 0x80 + +#endif _Q_SH_FX_ \ No newline at end of file diff --git a/Source/Game/gamecpp/q_sh_interface.h b/Source/Game/gamecpp/q_sh_interface.h new file mode 100644 index 0000000..a0f9a0f --- /dev/null +++ b/Source/Game/gamecpp/q_sh_interface.h @@ -0,0 +1,63 @@ + +// q_sh_interface.h -- included by interface program modules + + +// Flags +#define STAT_FLAG_SCOPE 0x0001 +#define STAT_FLAG_INFOTICKER 0x0002 +#define STAT_FLAG_WIND 0x0004 +#define STAT_FLAG_MISSIONFAIL 0x0008 +#define STAT_FLAG_HIT 0x0010 +#define STAT_FLAG_TEAM 0x0020 +#define STAT_FLAG_COUNTDOWN 0x0040 +#define STAT_FLAG_MISSIONACC 0x0080 +#define STAT_FLAG_MISSIONEXIT 0x0100 +#define STAT_FLAG_SHOW_STEALTH 0x0200 +#define STAT_FLAG_OBJECTIVES 0x0400 +#define STAT_FLAG_HIDECROSSHAIR 0x0800 + +// player_state->stats[] indexes +#define STAT_INV_TYPE 0 // cleared each frame +#define STAT_HEALTH 1 +#define STAT_CLIP_AMMO 2 +#define STAT_AMMO 3 +#define STAT_CLIP_MAX 4 +#define STAT_ARMOR 5 +#define STAT_WEAPON 6 +#define STAT_INV_COUNT 7 // # of current inventory item +#define STAT_FLAGS 8 +#define STAT_LAYOUTS 9 +#define STAT_FRAGS 10 +#define STAT_STEALTH 11 +#define STAT_FORCEHUD 12 // draw the HUD regardless of current weapon (tutorial level) + +// UNUSED I BELIEVE +#define STAT_CASH2 12 // cash in bank +#define STAT_CASH3 13 // cash to be awarded upon completion of mission +#define STAT_DAMAGELOC 14 // last damage done to player +#define STAT_DAMAGEDIR 15 // direction of the damage bracket on interface + +// Bit flags for client damage location +#define CLDAM_HEAD 0x00000001 +#define CLDAM_L_ARM 0x00000002 +#define CLDAM_L_LEG 0x00000004 +#define CLDAM_R_ARM 0x00000008 +#define CLDAM_R_LEG 0x00000010 +#define CLDAM_TORSO 0x00000020 + +// Index for client damage locations +#define CL_HEAD 0 +#define CL_L_ARM 1 +#define CL_L_LEG 2 +#define CL_R_ARM 3 +#define CL_R_LEG 4 +#define CL_TORSO 5 +#define MAX_CLDAMAGE 6 + +// Bit flags for client damage brackets +#define CLDAM_T_BRACKET 0x00000001 // Top bracket +#define CLDAM_B_BRACKET 0x00000002 // Bottom bracket +#define CLDAM_R_BRACKET 0x00000004 // Right bracket +#define CLDAM_L_BRACKET 0x00000008 // Left bracket +#define CLDAM_ALL_BRACKET 0x00000010 // All brackets + diff --git a/Source/Game/gamecpp/q_shared.cpp b/Source/Game/gamecpp/q_shared.cpp new file mode 100644 index 0000000..8a37790 --- /dev/null +++ b/Source/Game/gamecpp/q_shared.cpp @@ -0,0 +1,1471 @@ +#include "q_shared.h" +#include "..\qcommon\mathlib.h" + +#if id386 +#include "..\client\amd3d.h" +#endif + +cvar_t *use_amd3d; // user-adjustable +cvar_t *use_mmx; // +cvar_t *cpu_mmx; // *not* user-adjustable +cvar_t *cpu_amd3d; // + +vec3_t vec3_origin = {0,0,0}; +vec3_t vec3_up = {0,0,1}; +vec3_t vec3_down = {0,0,-1}; + +//============================================================================ + +void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees ) +{ + float m[3][3]; + float im[3][3]; + float zrot[3][3]; + float tmpmat[3][3]; + float rot[3][3]; + int i; + vec3_t vr, vup, vf; + + vf[0] = dir[0]; + vf[1] = dir[1]; + vf[2] = dir[2]; + + PerpendicularVector( vr, dir ); + CrossProduct( vr, vf, vup ); + + m[0][0] = vr[0]; + m[1][0] = vr[1]; + m[2][0] = vr[2]; + + m[0][1] = vup[0]; + m[1][1] = vup[1]; + m[2][1] = vup[2]; + + m[0][2] = vf[0]; + m[1][2] = vf[1]; + m[2][2] = vf[2]; + + memcpy( im, m, sizeof( im ) ); + + im[0][1] = m[1][0]; + im[0][2] = m[2][0]; + im[1][0] = m[0][1]; + im[1][2] = m[2][1]; + im[2][0] = m[0][2]; + im[2][1] = m[1][2]; + + memset( zrot, 0, sizeof( zrot ) ); + zrot[0][0] = zrot[1][1] = zrot[2][2] = 1.0F; + + zrot[0][0] = cos( degrees * DEGTORAD ); + zrot[0][1] = sin( degrees * DEGTORAD ); + zrot[1][0] = -sin( degrees * DEGTORAD ); + zrot[1][1] = cos( degrees * DEGTORAD ); + + R_ConcatRotations( m, zrot, tmpmat ); + R_ConcatRotations( tmpmat, im, rot ); + + for ( i = 0; i < 3; i++ ) + { + dst[i] = rot[i][0] * point[0] + rot[i][1] * point[1] + rot[i][2] * point[2]; + } +} + +void AngleVectors (vec3_t angles, vec3_t forward, vec3_t right, vec3_t up) +{ + float angle; + static float sr, sp, sy, cr, cp, cy; + // static to help MS compiler fp bugs + + angle = angles[YAW] * (M_PI*2 / 360); + sy = sin(angle); + cy = cos(angle); + angle = angles[PITCH] * (M_PI*2 / 360); + sp = sin(angle); + cp = cos(angle); + if(right||up) + { // as forward doesn't need these and calcing forward only is a fairly common case + angle = angles[ROLL] * (M_PI*2 / 360); + sr = sin(angle); + cr = cos(angle); + } + + if (forward) + { + forward[0] = cp*cy; + forward[1] = cp*sy; + forward[2] = -sp; + } + if (right) + { + right[0] = (-1*sr*sp*cy+-1*cr*-sy); + right[1] = (-1*sr*sp*sy+-1*cr*cy); + right[2] = -1*sr*cp; + } + if (up) + { + up[0] = (cr*sp*cy+-sr*-sy); + up[1] = (cr*sp*sy+-sr*cy); + up[2] = cr*cp; + } +} + + +static void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal ) +{ + float d; + vec3_t n; + float inv_denom; + + inv_denom = 1.0F / DotProduct( normal, normal ); + + d = DotProduct( normal, p ) * inv_denom; + + n[0] = normal[0] * inv_denom; + n[1] = normal[1] * inv_denom; + n[2] = normal[2] * inv_denom; + + dst[0] = p[0] - d * n[0]; + dst[1] = p[1] - d * n[1]; + dst[2] = p[2] - d * n[2]; +} + +/* +** assumes "src" is normalized +*/ +void PerpendicularVector( vec3_t dst, const vec3_t src ) +{ + int pos; + int i; + float minelem = 1.0F; + vec3_t tempvec; + + /* + ** find the smallest magnitude axially aligned vector + */ + for ( pos = 0, i = 0; i < 3; i++ ) + { + if ( fabs( src[i] ) < minelem ) + { + pos = i; + minelem = fabs( src[i] ); + } + } + tempvec[0] = tempvec[1] = tempvec[2] = 0.0F; + tempvec[pos] = 1.0F; + + /* + ** project the point onto the plane defined by src + */ + ProjectPointOnPlane( dst, tempvec, src ); + + /* + ** normalize the result + */ + VectorNormalize( dst ); +} + + + +/* +================ +R_ConcatRotations +================ +*/ +static void R_ConcatRotations (float in1[3][3], float in2[3][3], float out[3][3]) +{ + out[0][0] = in1[0][0] * in2[0][0] + in1[0][1] * in2[1][0] + + in1[0][2] * in2[2][0]; + out[0][1] = in1[0][0] * in2[0][1] + in1[0][1] * in2[1][1] + + in1[0][2] * in2[2][1]; + out[0][2] = in1[0][0] * in2[0][2] + in1[0][1] * in2[1][2] + + in1[0][2] * in2[2][2]; + out[1][0] = in1[1][0] * in2[0][0] + in1[1][1] * in2[1][0] + + in1[1][2] * in2[2][0]; + out[1][1] = in1[1][0] * in2[0][1] + in1[1][1] * in2[1][1] + + in1[1][2] * in2[2][1]; + out[1][2] = in1[1][0] * in2[0][2] + in1[1][1] * in2[1][2] + + in1[1][2] * in2[2][2]; + out[2][0] = in1[2][0] * in2[0][0] + in1[2][1] * in2[1][0] + + in1[2][2] * in2[2][0]; + out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] + + in1[2][2] * in2[2][1]; + out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] + + in1[2][2] * in2[2][2]; +} + + +/* +================ +R_ConcatTransforms +================ +*/ +static void R_ConcatTransforms (float in1[3][4], float in2[3][4], float out[3][4]) +{ + out[0][0] = in1[0][0] * in2[0][0] + in1[0][1] * in2[1][0] + + in1[0][2] * in2[2][0]; + out[0][1] = in1[0][0] * in2[0][1] + in1[0][1] * in2[1][1] + + in1[0][2] * in2[2][1]; + out[0][2] = in1[0][0] * in2[0][2] + in1[0][1] * in2[1][2] + + in1[0][2] * in2[2][2]; + out[0][3] = in1[0][0] * in2[0][3] + in1[0][1] * in2[1][3] + + in1[0][2] * in2[2][3] + in1[0][3]; + out[1][0] = in1[1][0] * in2[0][0] + in1[1][1] * in2[1][0] + + in1[1][2] * in2[2][0]; + out[1][1] = in1[1][0] * in2[0][1] + in1[1][1] * in2[1][1] + + in1[1][2] * in2[2][1]; + out[1][2] = in1[1][0] * in2[0][2] + in1[1][1] * in2[1][2] + + in1[1][2] * in2[2][2]; + out[1][3] = in1[1][0] * in2[0][3] + in1[1][1] * in2[1][3] + + in1[1][2] * in2[2][3] + in1[1][3]; + out[2][0] = in1[2][0] * in2[0][0] + in1[2][1] * in2[1][0] + + in1[2][2] * in2[2][0]; + out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] + + in1[2][2] * in2[2][1]; + out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] + + in1[2][2] * in2[2][2]; + out[2][3] = in1[2][0] * in2[0][3] + in1[2][1] * in2[1][3] + + in1[2][2] * in2[2][3] + in1[2][3]; +} + + +//============================================================================ + + + + +// this is the slow, general version +static int BoxOnPlaneSide2 (vec3_t emins, vec3_t emaxs, struct cplane_s *p) +{ + int i; + float dist1, dist2; + int sides; + vec3_t corners[2]; + + for (i=0 ; i<3 ; i++) + { + if (p->normal[i] < 0) + { + corners[0][i] = emins[i]; + corners[1][i] = emaxs[i]; + } + else + { + corners[1][i] = emins[i]; + corners[0][i] = emaxs[i]; + } + } + dist1 = DotProduct (p->normal, corners[0]) - p->dist; + dist2 = DotProduct (p->normal, corners[1]) - p->dist; + sides = 0; + if (dist1 >= 0) + sides = 1; + if (dist2 < 0) + sides |= 2; + + return sides; +} + +/* +================== +BoxOnPlaneSide + +Returns 1, 2, or 1 + 2 +================== +*/ +#if !id386 +int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *p) +{ + float dist1, dist2; + int sides; + +// I know this isn't called for the PC, but as a note this case is covered by the calling macro anyway +#if 0 +// fast axial cases + if (p->type < 3) + { + if (p->dist <= emins[p->type]) + return 1; + if (p->dist >= emaxs[p->type]) + return 2; + return 3; + } +#endif + +// general case + switch (p->signbits) + { + case 0: +dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; +dist2 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; + break; + case 1: +dist1 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; +dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; + break; + case 2: +dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; +dist2 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; + break; + case 3: +dist1 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; +dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; + break; + case 4: +dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; +dist2 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; + break; + case 5: +dist1 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; +dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; + break; + case 6: +dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; +dist2 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; + break; + case 7: +dist1 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; +dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; + break; + default: + dist1 = dist2 = 0; // shut up compiler + assert( 0 ); + break; + } + + sides = 0; + if (dist1 >= p->dist) + sides = 1; + if (dist2 < p->dist) + sides |= 2; + + assert( sides != 0 ); + + return sides; +} +#else // #if !id386 + +#pragma warning( disable: 4035 ) +#pragma warning( disable: 4414 ) // "short jump to function converted to near" + +int BoxOnPlaneSide_Intel (vec3_t emins, vec3_t emaxs, struct cplane_s *p); // proto the other version for asm jmp +__declspec( naked ) int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *p) +{ + static int bops_initialized; + static int Ljmptab[8]; + + __asm { + mov eax,[cpu_amd3d] + cmp [eax]cvar_s.value,0 // sneaky, float 0 is same binary as int 0 on Intel/K6 + je BoxOnPlaneSide_Intel + mov eax,[use_amd3d] + cmp [eax]cvar_s.value,0 // sneaky, float 0 is same binary as int 0 on Intel/K6 + je BoxOnPlaneSide_Intel + + // AMD/K6 version... + + push ebx + + cmp bops_initialized, 1 + je initialized + mov bops_initialized, 1 + + mov Ljmptab[0*4], offset Lcase0 + mov Ljmptab[1*4], offset Lcase1 + mov Ljmptab[2*4], offset Lcase2 + mov Ljmptab[3*4], offset Lcase3 + mov Ljmptab[4*4], offset Lcase4 + mov Ljmptab[5*4], offset Lcase5 + mov Ljmptab[6*4], offset Lcase6 + mov Ljmptab[7*4], offset Lcase7 + +initialized: + + // can't do this when function is __declspec( naked )! +// mov ebx,[emins] +// mov ecx,[emaxs] +// mov edx,[p] + + mov ebx,ds:dword ptr[4+4+esp] // emins + mov ecx,ds:dword ptr[4+8+esp] // emaxs + mov edx,ds:dword ptr[4+12+esp] // p + + +// unfortunately since the K6 support is via macros (and C has crap macro handling) then this code is a little longer +// in places than I'd like because I have to put in extra opcodes... +// + femms + movq mm0,[edx]p.normal // mm0 p->normal[1] | p->normal[0] + movq mm5,[ecx] // mm5 emaxs[1] | emaxs[0] + movq mm6,[ebx] // mm6 emins[1] | emins[0] + pfmul (_mm5,_mm0) // mm5 p->normal[1]*emaxs[1] | p->normal[0]*emaxs[0] // keep mm5 + pfmul (_mm6,_mm0) // mm6 p->normal[1]*emins[1] | p->normal[0]*emins[0] // keep mm6 + movd mm7,[edx+8]p.normal // mm7 ... | p->normal[2] + movd mm0,[ecx+8] // mm0 ... | emaxs[2] + punpckldq mm7,mm7 // mm7 p->normal[2] | p->normal[2] + punpckldq mm0,[ebx+8] // mm0 emins[2] | emaxs[2] + movzx eax,[edx]p.signbits + pfmul (_mm7,_mm0) // mm7 p->normal[2]*emins[2] | p->normal[2]*emaxs[2] // keep mm7 + cmp eax,8 + ja Lerror + + jmp dword ptr[Ljmptab+eax*4] + +// mm5 p->normal[1]*emaxs[1] | p->normal[0]*emaxs[0] +// mm6 p->normal[1]*emins[1] | p->normal[0]*emins[0] +// mm7 p->normal[2]*emins[2] | p->normal[2]*emaxs[2] + +//dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; +//dist2 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; + +Lcase0: movq mm0,mm5 // p->normal[1]*emaxs[1] | p->normal[0]*emaxs[0] + movq mm1,mm6 // p->normal[1]*emins[1] | p->normal[0]*emins[0] + pfacc (_mm0,_mm0) // p->normal[1]*emaxs[1] + p->normal[0]*emaxs[0] | p->normal[1]*emaxs[1] + p->normal[0]*emaxs[0] + pfacc (_mm1,_mm1) // p->normal[1]*emins[1] + p->normal[0]*emins[0] | p->normal[1]*emins[1] + p->normal[0]*emins[0] + pfadd (_mm0,_mm7) // mm0.l = dist1 + pfadd (_mm1,_mm7) // mm1.h = dist2 + psrlq mm1,32 // mm1.l = dist2 + + jmp LSetSides + +//dist1 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; +//dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; + +Lcase1: movq mm0,mm6 // ... | p->normal[0]*emins[0] + movq mm1,mm6 // p->normal[1]*emins[1] | ..... + punpckldq mm0,mm7 // p->normal[2]*emaxs[2] | p->normal[0]*emins[0] + punpckhdq mm1,mm7 // p->normal[2]*emins[2] | p->normal[1]*emins[1] + pfacc (_mm0,_mm0) // p->normal[2]*emaxs[2] + p->normal[0]*emins[0] | p->normal[2]*emaxs[2] + p->normal[0]*emins[0] + pfacc (_mm1,_mm1) // p->normal[2]*emins[2] + p->normal[1]*emins[1] | p->normal[2]*emins[2] + p->normal[1]*emins[1] + pfadd (_mm0,_mm5) // mm0.h = dist1 + pfadd (_mm1,_mm5) // mm1.l = dist2 + psrlq mm0,32 // mm0.l = dist1 + + jmp LSetSides + +//dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; +//dist2 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; + +Lcase2: movq mm0,mm5 // | p->normal[0]*emaxs[0] + movq mm1,mm5 // p->normal[1]*emaxs[1] | ... + punpckldq mm0,mm7 // p->normal[2]*emaxs[2] | p->normal[0]*emaxs[0] + punpckhdq mm1,mm7 // p->normal[2]*emins[2] | p->normal[1]*emaxs[1] + pfacc (_mm0,_mm0) // p->normal[2]*emaxs[2] + p->normal[0]*emaxs[0] | p->normal[2]*emaxs[2] + p->normal[0]*emaxs[0] + pfacc (_mm1,_mm1) // p->normal[2]*emins[2] + p->normal[1]*emaxs[1] | p->normal[2]*emins[2] + p->normal[1]*emaxs[1] + pfadd (_mm0,_mm6) // mm0.h = dist1 + pfadd (_mm1,_mm6) // mm1.l = dist2 + psrlq mm0,32 // mm0.l = dist1 + jmp LSetSides + +//dist1 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; +//dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; + +Lcase3: movq mm0,mm6 // p->normal[1]*emins[1] | p->normal[0]*emins[0] + movq mm1,mm5 // p->normal[1]*emaxs[1] | p->normal[0]*emaxs[0] + pfacc (_mm0,_mm0) // p->normal[1]*emins[1] + p->normal[0]*emins[0] | p->normal[1]*emins[1] + p->normal[0]*emins[0] + pfacc (_mm1,_mm1) // p->normal[1]*emaxs[1] + p->normal[0]*emaxs[0] | p->normal[1]*emaxs[1] + p->normal[0]*emaxs[0] + pfadd (_mm0,_mm7) // mm0.l = dist1 + pfadd (_mm1,_mm7) // mm1.h = dist2 + psrlq mm1,32 // mm1.l = dist2 + jmp LSetSides + +//dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; +//dist2 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; + +Lcase4: movq mm0,mm5 // p->normal[1]*emaxs[1] | p->normal[0]*emaxs[0] + movq mm1,mm6 // p->normal[1]*emins[1] | p->normal[0]*emins[0] + pfacc (_mm0,_mm0) // p->normal[1]*emaxs[1] + p->normal[0]*emaxs[0] | p->normal[1]*emaxs[1] + p->normal[0]*emaxs[0] + pfacc (_mm1,_mm1) // p->normal[1]*emins[1] + p->normal[0]*emins[0] | p->normal[1]*emins[1] + p->normal[0]*emins[0] + pfadd (_mm0,_mm7) // mm0.h = dist2 + pfadd (_mm1,_mm7) // mm1.l = dist1 + psrlq mm0,32 // mm0.l = dist2 + + jmp LSetSides + +//dist1 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2]; +//dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2]; + +Lcase5: movq mm0,mm5 // p->normal[1]*emaxs[1] | ... + movq mm1,mm5 // | p->normal[0]*emaxs[0] + punpckhdq mm0,mm7 // p->normal[2]*emins[2] | p->normal[1]*emaxs[1] + punpckldq mm1,mm7 // p->normal[2]*emaxs[2] | p->normal[0]*emaxs[0] + pfacc (_mm0,_mm0) // p->normal[2]*emins[2] + p->normal[1]*emaxs[1] | p->normal[2]*emins[2] + p->normal[1]*emaxs[1] + pfacc (_mm1,_mm1) // p->normal[2]*emaxs[2] + p->normal[0]*emaxs[0] | p->normal[2]*emaxs[2] + p->normal[0]*emaxs[0] + pfadd (_mm0,_mm6) // mm0.l = dist2 + pfadd (_mm1,_mm6) // mm1.h = dist1 + psrlq mm1,32 // mm1.l = dist1 + + jmp LSetSides + +//dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; +//dist2 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; + +Lcase6: movq mm0,mm6 // p->normal[1]*emins[1] | ...... + movq mm1,mm6 // ... | p->normal[0]*emins[0] + punpckhdq mm0,mm7 // p->normal[2]*emins[2] | p->normal[1]*emins[1] + punpckldq mm1,mm7 // p->normal[2]*emaxs[2] | p->normal[0]*emins[0] + pfacc (_mm0,_mm0) // p->normal[2]*emins[2] + p->normal[1]*emins[1] | p->normal[2]*emins[2] + p->normal[1]*emins[1] + pfacc (_mm1,_mm1) // p->normal[2]*emaxs[2] + p->normal[0]*emins[0] | p->normal[2]*emaxs[2] + p->normal[0]*emins[0] + pfadd (_mm0,_mm5) // mm0.l = dist2 + pfadd (_mm1,_mm5) // mm1.h = dist1 + psrlq mm1,32 // mm1.l = dist1 + + jmp LSetSides + +//dist1 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2]; +//dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2]; + +Lcase7: movq mm0,mm6 // p->normal[1]*emins[1] | p->normal[0]*emins[0] + movq mm1,mm5 // p->normal[1]*emaxs[1] | p->normal[0]*emaxs[0] + pfacc (_mm0,_mm0) // p->normal[1]*emins[1] + p->normal[0]*emins[0] | p->normal[1]*emins[1] + p->normal[0]*emins[0] + pfacc (_mm1,_mm1) // p->normal[1]*emaxs[1] + p->normal[0]*emaxs[0] | p->normal[1]*emaxs[1] + p->normal[0]*emaxs[0] + pfadd (_mm0,_mm7) // mm0.h = dist2 + pfadd (_mm1,_mm7) // mm1.l = dist1 + psrlq mm0,32 // mm0.l = dist2 + +// jmp LSetSides + +LSetSides: + // mm0.l = dist1 + // mm1.l = dist2 + + movd mm2,[edx]p.dist // (because of only partial K6 inline support) + pfcmpge (_mm0,_mm2) + pfcmpgt (_mm2,_mm1) + movd ebx,mm0 + movd ecx,mm2 + and ebx,1 + and ecx,2 + mov eax,ebx + or eax,ecx // eax = return val + + femms + + pop ebx + ret +Lerror: emms // rather than 'femms', since this handily stops the compiler complaining about no 'emms' at MMX end (and no speed issue here) + int 3 + } +} +__declspec( naked ) int BoxOnPlaneSide_Intel (vec3_t emins, vec3_t emaxs, struct cplane_s *p) +{ + static int bops_initialized; + static int Ljmptab[8]; + + __asm { + + push ebx + + cmp bops_initialized, 1 + je initialized + mov bops_initialized, 1 + + mov Ljmptab[0*4], offset Lcase0 + mov Ljmptab[1*4], offset Lcase1 + mov Ljmptab[2*4], offset Lcase2 + mov Ljmptab[3*4], offset Lcase3 + mov Ljmptab[4*4], offset Lcase4 + mov Ljmptab[5*4], offset Lcase5 + mov Ljmptab[6*4], offset Lcase6 + mov Ljmptab[7*4], offset Lcase7 + +initialized: + +// fast axial cases +// if (p->type < 3) +// { +// if (p->dist <= emins[p->type]) +// return 1; +// if (p->dist >= emaxs[p->type]) +// return 2; +// return 3; +// } + mov ecx,ds:dword ptr[4+4+esp] // emins + mov ebx,ds:dword ptr[4+8+esp] // emaxs + mov edx,ds:dword ptr[4+12+esp] // p +// This is the code for the fast axial case, I noticed it was missing from the ASM version, unfortunately I then +// spotted that the macro which calls this function does the check itself so this isn't needed - duh! However, you +// should remember to remove the check from the C version above or you're doing duplicate work. +#if 0 + movzx eax,[edx]p.type + cmp eax,3 + jae NoAxialShortcut + + fld [edx]p.dist + shl eax, 2 + add eax, ecx // emins + fcomp DWORD PTR [eax] + fnstsw ax + test ah, 65 ; 00000041H + je SHORT $L2691 + + mov eax,1 + jmp SHORT BoxExit + +$L2691: // if (p->dist >= emaxs[p->type]) + + movzx eax,[edx]p.type + shl eax, 2 + add eax,ebx // emaxs + fld [edx]p.dist + fcomp DWORD PTR [eax] + fnstsw ax + test ah, 1 + mov eax,3 + jne SHORT BoxExit + dec eax + jmp SHORT BoxExit + +NoAxialShortcut: +#endif + +// mov edx,ds:dword ptr[4+12+esp] +// mov ecx,ds:dword ptr[4+4+esp] +// mov ebx,ds:dword ptr[4+8+esp] + movzx eax,ds:byte ptr[17+edx] + cmp eax,8 + ja Lerror + fld ds:dword ptr[0+edx] + fld st(0) + jmp dword ptr[Ljmptab+eax*4] +Lcase0: + fmul ds:dword ptr[ebx] + fld ds:dword ptr[0+4+edx] + fxch st(2) + fmul ds:dword ptr[ecx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[4+ebx] + fld ds:dword ptr[0+8+edx] + fxch st(2) + fmul ds:dword ptr[4+ecx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[8+ebx] + fxch st(5) + faddp st(3),st(0) + fmul ds:dword ptr[8+ecx] + fxch st(1) + faddp st(3),st(0) + fxch st(3) + faddp st(2),st(0) + jmp LSetSides +Lcase1: + fmul ds:dword ptr[ecx] + fld ds:dword ptr[0+4+edx] + fxch st(2) + fmul ds:dword ptr[ebx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[4+ebx] + fld ds:dword ptr[0+8+edx] + fxch st(2) + fmul ds:dword ptr[4+ecx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[8+ebx] + fxch st(5) + faddp st(3),st(0) + fmul ds:dword ptr[8+ecx] + fxch st(1) + faddp st(3),st(0) + fxch st(3) + faddp st(2),st(0) + jmp LSetSides +Lcase2: + fmul ds:dword ptr[ebx] + fld ds:dword ptr[0+4+edx] + fxch st(2) + fmul ds:dword ptr[ecx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[4+ecx] + fld ds:dword ptr[0+8+edx] + fxch st(2) + fmul ds:dword ptr[4+ebx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[8+ebx] + fxch st(5) + faddp st(3),st(0) + fmul ds:dword ptr[8+ecx] + fxch st(1) + faddp st(3),st(0) + fxch st(3) + faddp st(2),st(0) + jmp LSetSides +Lcase3: + fmul ds:dword ptr[ecx] + fld ds:dword ptr[0+4+edx] + fxch st(2) + fmul ds:dword ptr[ebx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[4+ecx] + fld ds:dword ptr[0+8+edx] + fxch st(2) + fmul ds:dword ptr[4+ebx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[8+ebx] + fxch st(5) + faddp st(3),st(0) + fmul ds:dword ptr[8+ecx] + fxch st(1) + faddp st(3),st(0) + fxch st(3) + faddp st(2),st(0) + jmp LSetSides +Lcase4: + fmul ds:dword ptr[ebx] + fld ds:dword ptr[0+4+edx] + fxch st(2) + fmul ds:dword ptr[ecx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[4+ebx] + fld ds:dword ptr[0+8+edx] + fxch st(2) + fmul ds:dword ptr[4+ecx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[8+ecx] + fxch st(5) + faddp st(3),st(0) + fmul ds:dword ptr[8+ebx] + fxch st(1) + faddp st(3),st(0) + fxch st(3) + faddp st(2),st(0) + jmp LSetSides +Lcase5: + fmul ds:dword ptr[ecx] + fld ds:dword ptr[0+4+edx] + fxch st(2) + fmul ds:dword ptr[ebx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[4+ebx] + fld ds:dword ptr[0+8+edx] + fxch st(2) + fmul ds:dword ptr[4+ecx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[8+ecx] + fxch st(5) + faddp st(3),st(0) + fmul ds:dword ptr[8+ebx] + fxch st(1) + faddp st(3),st(0) + fxch st(3) + faddp st(2),st(0) + jmp LSetSides +Lcase6: + fmul ds:dword ptr[ebx] + fld ds:dword ptr[0+4+edx] + fxch st(2) + fmul ds:dword ptr[ecx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[4+ecx] + fld ds:dword ptr[0+8+edx] + fxch st(2) + fmul ds:dword ptr[4+ebx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[8+ecx] + fxch st(5) + faddp st(3),st(0) + fmul ds:dword ptr[8+ebx] + fxch st(1) + faddp st(3),st(0) + fxch st(3) + faddp st(2),st(0) + jmp LSetSides +Lcase7: + fmul ds:dword ptr[ecx] + fld ds:dword ptr[0+4+edx] + fxch st(2) + fmul ds:dword ptr[ebx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[4+ecx] + fld ds:dword ptr[0+8+edx] + fxch st(2) + fmul ds:dword ptr[4+ebx] + fxch st(2) + fld st(0) + fmul ds:dword ptr[8+ecx] + fxch st(5) + faddp st(3),st(0) + fmul ds:dword ptr[8+ebx] + fxch st(1) + faddp st(3),st(0) + fxch st(3) + faddp st(2),st(0) +LSetSides: + faddp st(2),st(0) + fcomp ds:dword ptr[12+edx] + xor ecx,ecx + fnstsw ax + fcomp ds:dword ptr[12+edx] + and ah,1 + xor ah,1 + add cl,ah + fnstsw ax + and ah,1 + add ah,ah + add cl,ah + mov eax,ecx +//BoxExit: + pop ebx + ret +Lerror: + int 3 + } +} +#pragma warning( default: 4414 ) // short jump to function converted to near +#pragma warning( default: 4035 ) +#endif // #if !id386 + +static void ClearBounds (vec3_t mins, vec3_t maxs) +{ + mins[0] = mins[1] = mins[2] = 99999; + maxs[0] = maxs[1] = maxs[2] = -99999; +} + +void AddPointToBounds (vec3_t v, vec3_t mins, vec3_t maxs) +{ + int i; + vec_t val; + + for (i=0 ; i<3 ; i++) + { + val = v[i]; + if (val < mins[i]) + mins[i] = val; + if (val > maxs[i]) + maxs[i] = val; + } +} + +vec_t VectorNormalize (vec3_t v) +{ + float length, ilength; + + length = DotProduct(v, v); + length = sqrt (length); // FIXME + + if (length) + { + ilength = 1/length; + v[0] *= ilength; + v[1] *= ilength; + v[2] *= ilength; + } + + return length; + +} + +float NormalizeAngle (float angle) +{ +// FIXME: make this use fmod + while (angle >= 360) + { + angle -= 360; + } + while (angle < 0) + { + angle += 360; + } + return angle; +} + +void CrossProduct (vec3_t v1, vec3_t v2, vec3_t cross) +{ + cross[0] = v1[1]*v2[2] - v1[2]*v2[1]; + cross[1] = v1[2]*v2[0] - v1[0]*v2[2]; + cross[2] = v1[0]*v2[1] - v1[1]*v2[0]; +} + +double sqrt(double x); + +vec_t VectorLength(vec3_t v) +{ + float length; + + length = DotProduct(v, v); + length = sqrt (length); // FIXME + + return length; +} + +static vec_t VectorSeparation(vec3_t v0, vec3_t v1) +{ + vec3_t v; + float length; + + VectorSubtract(v0, v1, v); + length = DotProduct(v, v); + length = sqrt (length); // FIXME + + return length; +} + +//==================================================================================== + +/* +============ +COM_SkipPath +============ +*/ +char *COM_SkipPath (char *pathname) +{ + char *last; + + last = pathname; + while (*pathname) + { + if (*pathname=='/') + last = pathname+1; + pathname++; + } + return last; +} + +/* +============ +COM_StripExtension +============ +*/ +void COM_StripExtension (char *in, char *out) +{ + while (*in && *in != '.') + *out++ = *in++; + *out = 0; +} + +/* +============ +COM_FileExtension +============ +*/ +char *COM_FileExtension (char *in) +{ + static char exten[8]; + int i; + + while (*in && *in != '.') + in++; + if (!*in) + return ""; + in++; + for (i=0 ; i<7 && *in ; i++,in++) + exten[i] = *in; + exten[i] = 0; + return exten; +} + +/* +============ +COM_FileBase +============ +*/ +static void COM_FileBase (char *in, char *out) +{ + char *s, *s2; + + s = in + strlen(in) - 1; + + while (s != in && *s != '.') + s--; + + for (s2 = s ; s2 != in && *s2 != '/' ; s2--) + ; + + if (s-s2 < 2) + out[0] = 0; + else + { + s--; + strncpy (out,s2+1, s-s2); + out[s-s2] = 0; + } +} + +/* +============ +COM_FilePath + +Returns the path up to, but not including the last / +============ +*/ +void COM_FilePath (char *in, char *out) +{ + char *s; + + s = in + strlen(in) - 1; + + while (s != in && *s != '/') + s--; + + strncpy (out,in, s-in); + out[s-in] = 0; +} + + +/* +================== +COM_DefaultExtension +================== +*/ +static void COM_DefaultExtension (char *path, char *extension) +{ + char *src; +// +// if path doesn't have a .EXT, append extension +// (extension should include the .) +// + src = path + strlen(path) - 1; + + while (*src != '/' && src != path) + { + if (*src == '.') + return; // it has an extension + src--; + } + + strcat (path, extension); +} + +/* +============================================================================ + + BYTE ORDER FUNCTIONS + +============================================================================ +*/ + +// can't just use function pointers, or dll linkage can +// mess up when qcommon is included in multiple places +short (*_BigShort) (short l); +int (*_BigLong) (int l); +float (*_BigFloat) (float l); + +short BigShort(short l){return _BigShort(l);} +int BigLong (int l) {return _BigLong(l);} +float BigFloat (float l) {return _BigFloat(l);} + +static short ShortSwap (short l) +{ + byte b1,b2; + + b1 = l&255; + b2 = (l>>8)&255; + + return (b1<<8) + b2; +} + +static int LongSwap (int l) +{ + byte b1,b2,b3,b4; + + b1 = l&255; + b2 = (l>>8)&255; + b3 = (l>>16)&255; + b4 = (l>>24)&255; + + return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; +} + +static float FloatSwap (float f) +{ + union + { + float f; + byte b[4]; + } dat1, dat2; + + + dat1.f = f; + dat2.b[0] = dat1.b[3]; + dat2.b[1] = dat1.b[2]; + dat2.b[2] = dat1.b[1]; + dat2.b[3] = dat1.b[0]; + return dat2.f; +} + +/* +================ +Swap_Init +================ +*/ +void Swap_Init (void) +{ + _BigShort = ShortSwap; + _BigLong = LongSwap; + _BigFloat = FloatSwap; +} + +/* +============ +va + +does a varargs printf into a temp buffer, so I don't need to have +varargs versions of all text functions. +FIXME: make this buffer size safe someday +============ +*/ +char *va(char *format, ...) +{ + va_list argptr; + static char string[1024]; + + va_start (argptr, format); + vsprintf (string, format,argptr); + va_end (argptr); + + return string; +} + +char com_token[MAX_TOKEN_CHARS]; + +/* +============== +COM_Parse + +Parse a token out of a string +============== +*/ +char *COM_Parse (char **data_p) +{ + int c; + int len; + char *data; + + data = *data_p; + len = 0; + com_token[0] = 0; + + if (!data) + { + *data_p = NULL; + return ""; + } + +// skip whitespace +skipwhite: + while ( (byte)(c = *data) <= ' ') + { + if (c == 0) + { + *data_p = NULL; + return ""; + } + data++; + } + +// skip // comments + if (c=='/' && data[1] == '/') + { + while (*data && *data != '\n') + data++; + goto skipwhite; + } + + +// handle quoted strings specially + if (c == '\"') + { + data++; + while (1) + { + c = *data++; + if (c=='\"' || !c) + { + com_token[len] = 0; + *data_p = data; + return com_token; + } + if (len < MAX_TOKEN_CHARS) + { + com_token[len] = c; + len++; + } + } + } + +// parse a regular word + do + { + if (len < MAX_TOKEN_CHARS) + { + com_token[len] = c; + len++; + } + data++; + c = *data; + } while ((byte)c > 32); + + if (len == MAX_TOKEN_CHARS) + { +// Com_Printf ("Token exceeded %i chars, discarded.\n", MAX_TOKEN_CHARS); + len = 0; + } + com_token[len] = 0; + + *data_p = data; + return com_token; +} + +/* +============================================================================ + + LIBRARY REPLACEMENT FUNCTIONS + +============================================================================ +*/ + + + +void Com_sprintf (char *dest, int size, char *fmt, ...) +{ + int len; + va_list argptr; + char bigbuffer[0x10000]; + + va_start (argptr,fmt); + len = vsprintf (bigbuffer,fmt,argptr); + va_end (argptr); + if (len >= size) + Com_Printf ("Com_sprintf: overflow of %i in %i\n", len, size); + strncpy (dest, bigbuffer, size-1); +} + +/* +===================================================================== + + INFO STRINGS + +===================================================================== +*/ + +const char *Info_NextKey(const char *s, char *key, char *value) +{ + char c; + + assert(key); + assert(value); + + *key = 0; + *value = 0; + + c = *s++; + if((c != '\\') || (c == '\n') || !c) + { + return(NULL); + } + // Get key + while(true) + { + c = *s++; + if(c == '\\') + { + break; + } + if((c == '\n') || !c) + { + return(NULL); + } + *key++ = c; + } + *key++ = 0; + + // Get value + while(true) + { + c = *s; + if(c == '\\') + { + break; + } + if((c == '\n') || !c) + { + break; + } + s++; + *value++ = c; + } + *value++ = 0; + return(s); +} + +/* +=============== +Info_ValueForKey + +Searches the string for the given +key and returns the associated value, or an empty string. +=============== +*/ +char *Info_ValueForKey (const char *s, const char *key) +{ + char pkey[512]; + static char value[2][512]; // use two buffers so compares + // work without stomping on each other + static int valueindex; + char *o; + + valueindex ^= 1; + if (*s == '\\') + s++; + while (1) + { + o = pkey; + while (*s != '\\') + { + if (!*s) + return ""; + *o++ = *s++; + } + *o = 0; + s++; + + o = value[valueindex]; + + while (*s != '\\' && *s) + { + if (!*s) + return ""; + *o++ = *s++; + } + *o = 0; + + if (!strcmp (key, pkey) ) + return value[valueindex]; + + if (!*s) + return ""; + s++; + } +} + +void Info_RemoveKey (char *s, char *key) +{ + char *start; + char pkey[512]; + char value[512]; + char *o; + + if (strstr (key, "\\")) + { +// Com_Printf ("Can't use a key with a \\\n"); + return; + } + + while (1) + { + start = s; + if (*s == '\\') + s++; + o = pkey; + while (*s != '\\') + { + if (!*s) + return; + *o++ = *s++; + } + *o = 0; + s++; + + o = value; + while (*s != '\\' && *s) + { + if (!*s) + return; + *o++ = *s++; + } + *o = 0; + + if (!strcmp (key, pkey) ) + { + strcpy (start, s); // remove this part + return; + } + + if (!*s) + return; + } + +} + + +/* +================== +Info_Validate + +Some characters are illegal in info strings because they +can mess up the server's parsing +================== +*/ +bool Info_Validate (char *s) +{ + if (strstr (s, "\"")) + return false; + if (strstr (s, ";")) + return false; + return true; +} + +void Info_SetValueForKey (char *s, char *key, char *value) +{ + char newi[MAX_INFO_STRING], *v; + int maxsize = MAX_INFO_STRING; + + if (strstr (key, "\\") || strstr (value, "\\") ) + { + Com_Printf ("Can't use keys or values with a \\\n"); + return; + } + + if (strstr (key, ";") ) + { + Com_Printf ("Can't use keys or values with a semicolon\n"); + return; + } + + if (strstr (key, "\"") || strstr (value, "\"") ) + { + Com_Printf ("Can't use keys or values with a \"\n"); + return; + } + + if (strlen(key) > MAX_INFO_KEY-1 || strlen(value) > MAX_INFO_KEY-1) + { + Com_Printf ("Keys and values must be < 64 characters.\n"); + return; + } + Info_RemoveKey (s, key); + if (!value || !strlen(value)) + return; + + Com_sprintf (newi, sizeof(newi), "\\%s\\%s", key, value); + + if (strlen(newi) + strlen(s) > maxsize) + { + Com_Printf ("Info string length exceeded\n"); + return; + } + + // only copy ascii values (which is all 255 chars now with foreign characters) + s += strlen(s); + v = newi; + while (*v) + { + *s++ = *v++; + } + *s = 0; +} + +//==================================================================== diff --git a/Source/Game/gamecpp/q_shared.h b/Source/Game/gamecpp/q_shared.h new file mode 100644 index 0000000..4231916 --- /dev/null +++ b/Source/Game/gamecpp/q_shared.h @@ -0,0 +1,616 @@ +// q_shared.h -- included first by ALL program modules. + +// Prevent multiple inclusion. Why do id never do this? Sloppy. +#pragma once + +#ifdef _WIN32 + +#define WIN32_LEAN_AND_MEAN +#define VC_EXTRALEAN + +// unknown pragmas are SUPPOSED to be ignored, but.... +#pragma warning(disable : 4244) // MIPS +#pragma warning(disable : 4136) // X86 +#pragma warning(disable : 4051) // ALPHA + +#pragma warning(disable : 4018) // signed/unsigned mismatch +#pragma warning(disable : 4305) // truncation from const double to float + +// these happen a lot in level4 +#pragma warning(disable : 4201) // nameless struct/union +#pragma warning(disable : 4214) // bit field +#pragma warning(disable : 4514) // unreferenced inline function has been removed +#pragma warning(disable : 4100) // unreferenced formal parm + +#endif // _WIN32 + +#include +#include +#include +#include +#include +#include +#include +#include + +#pragma warning(disable : 4786) +#include +#include +#include +#include +#include +using namespace std; + +#if defined _M_IX86 && !defined C_ONLY +#define id386 1 +#else +#define id386 0 +#endif + +#if defined _M_ALPHA && !defined C_ONLY +#define idaxp 1 +#else +#define idaxp 0 +#endif + +typedef unsigned char byte; +typedef unsigned short word; +typedef int qboolean; + +#define FLOAT_ZERO_EPSILON 0.0005f + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#ifndef M_PI +#define M_PI 3.14159265358979323846 // matches value in gcc v2 math.h +#endif + +#define DEGTORAD 0.01745329252 +#define RADTODEG 57.295779513 + +// angle indexes +#define PITCH 0 // up / down +#define YAW 1 // left / right +#define ROLL 2 // fall over + +#define ANGLE2SHORT(x) ((int)((x) * 65536 / 360) & 65535) +#define SHORT2ANGLE(x) ((x) * (360.0 / 65536)) + +#define MAX_STRING_CHARS 1024 // max length of a string passed to Cmd_TokenizeString +#define MAX_STRING_TOKENS 80 // max tokens resulting from Cmd_TokenizeString +#define MAX_TOKEN_CHARS 256 // max length of an individual token + +#define MAX_QPATH 64 // max length of a quake game pathname +#define MAX_OSPATH 128 // max length of a filesystem pathname +#define MAX_PATH 260 // Windows max filename length + +#define MAXLIGHTMAPS 4 +// +// per-level limits +// +#define MAX_CLIENTS 32 // absolute limit +#define MAX_EDICTS 1024 // must change protocol to increase more +#define MAX_LIGHTSTYLES 256 +#define MAX_MODELS 256 // these are sent over the net as bytes +#define MAX_SOUNDS 356 // (sounds can be sent over as a word index now) +#define MAX_EFPACKS 256 // so they cannot be blindly increased +#define MAX_IMAGES 256 // +#define MAX_STRING_PACKAGES 30 +#define MAX_PLAYERICONS 16 +#define MAX_GHOULFILES 2048 // just to be sure. + +// game print flags +#define PRINT_LOW 0 // pickup messages +#define PRINT_MEDIUM 1 // death messages +#define PRINT_HIGH 2 // critical messages +#define PRINT_CHAT 3 // chat messages + +#define ERR_FATAL 0 // exit the entire game with a popup window +#define ERR_DROP 1 // print to console and disconnect from game +#define ERR_DISCONNECT 2 // don't kill server + +#define PRINT_ALL 0 +#define PRINT_DEVELOPER 1 // only print when "developer 1" +#define PRINT_EXT_DEVELOPER 2 // only print when "developer & 4" +#define PRINT_ALERT 3 // Bring up a message box + +#define DEF_WIDTH 640 +#define DEF_HEIGHT 480 + +#define GGHOUL_ID_NAME_LEN 55 // Gameghoul stuff that's needed on client and server. + +// destination class for gi.multicast() +typedef enum +{ + MULTICAST_ALL, + MULTICAST_PHS, + MULTICAST_PVS, + MULTICAST_ALL_R, + MULTICAST_PHS_R, + MULTICAST_PVS_R +} multicast_t; + +typedef float vec_t; +typedef vec_t vec3_t[3]; +typedef vec_t vec5_t[5]; + +//============================================= + +char *COM_SkipPath (char *pathname); +void COM_StripExtension (char *in, char *out); +void COM_FileBase (char *in, char *out); +void COM_FilePath (char *in, char *out); +void COM_DefaultExtension (char *path, char *extension); +char *COM_FileExtension (char *in); + +char *COM_Parse (char **data_p); +// data is an in/out parm, returns a parsed out token + +void Com_sprintf (char *dest, int size, char *fmt, ...); + +//============================================= + +#define LittleLong(l) (l) +#define LittleFloat(l) (l) +#define LittleShort(l) (l) + +short BigShort(short l); +int BigLong (int l); +float BigFloat (float l); + +void Swap_Init (void); +char *va(char *format, ...); + +//============================================= + +// +// key / value info strings +// +#define MAX_INFO_KEY 64 +#define MAX_INFO_VALUE 64 +#define MAX_INFO_STRING 512 + +char *Info_ValueForKey (const char *s, const char *key); +const char *Info_NextKey(const char *s, char *key, char *value); +void Info_RemoveKey (char *s, char *key); +void Info_SetValueForKey (char *s, char *key, char *value); +bool Info_Validate (char *s); + +/* +============================================================== + +SYSTEM SPECIFIC + +============================================================== +*/ + +int Sys_Milliseconds (void); +void Sys_Mkdir (char *path); + +/* +** pass in an attribute mask of things you wish to REJECT +*/ +char *Sys_FindFirst (char *path, unsigned musthave, unsigned canthave, struct fileinfo_s *fi = NULL ); +char *Sys_FindNext ( unsigned musthave, unsigned canthave, struct fileinfo_s *fi = NULL ); +void Sys_FindClose (void); + +// this is only here so the functions in q_shared.c and q_shwin.c can link +void Sys_Error (char *error, ...); +void Com_Printf (char *msg, ...); + +/* +========================================================== + +CVARS (console variables) + +========================================================== +*/ + +typedef struct cvar_s cvar_t; + +typedef void (*cvarcommand_t) (cvar_t *cvar); + +#define CVAR_ARCHIVE 0x00000001 // set to cause it to be saved to vars.rc +#define CVAR_USERINFO 0x00000002 // added to userinfo when changed +#define CVAR_SERVERINFO 0x00000004 // added to serverinfo when changed +#define CVAR_NOSET 0x00000008 // don't allow change from console at all, + // but can be set from the command line +#define CVAR_LATCH 0x00000010 // save changes until server restart +#define CVAR_INT 0x00000020 // value is locked to integral +#define CVAR_PLAIN 0x00000040 // can't increment, decrement, or toggle this guy +#define CVAR_INTERNAL 0x00000080 // can only be set internally by the code, never by the user in any way directly + +#define CVAR_WEAPON 0x00000100 // this cvar defines possession of a weapon +#define CVAR_ITEM 0x00000200 // " " " " " " item +#define CVAR_AMMO 0x00000400 // " " " " " " quantity of ammo +#define CVAR_MISC 0x00000800 +#define CVAR_PARENTAL 0x00001000 // this cvar is stored in the registry through special means + +#define CVAR_MENU_MASK (CVAR_WEAPON | CVAR_ITEM | CVAR_AMMO | CVAR_MISC) +#define CVAR_INFO (CVAR_MENU_MASK | CVAR_USERINFO | CVAR_SERVERINFO) + +// nothing outside the Cvar_*() functions should modify these fields! +typedef struct cvar_s +{ + char *name; + char *string; + char *latched_string; // for CVAR_LATCH vars + int flags; + cvarcommand_t command; + qboolean modified; // set each time the cvar is changed + float value; + struct cvar_s * next; +} cvar_t; + +// these need to be seen by all modules (including server because of code like "BoxOnTraceSide()" that exist in both), and GL +extern cvar_t *use_amd3d; // user-adjustable +extern cvar_t *use_mmx; // +extern cvar_t *cpu_mmx; // *not* user-adjustable +extern cvar_t *cpu_amd3d; // + +// Quick version of float to long (trunc/round undefined) + +#pragma warning (disable:4035) +_inline __declspec( naked ) long Q_ftol( float f ) +{ + static int tmp; + __asm fld dword ptr [esp+4] + __asm fistp tmp + __asm mov eax, tmp + __asm ret +} + +_inline float Clamp(float src, float min, float max) +{ + if(src > max) + { + src = max; + } + if(src < min) + { + src = min; + } + return(src); +} + +_inline int ClampI(int src, int min, int max) +{ + if(src > max) + { + src = max; + } + if(src < min) + { + src = min; + } + return(src); +} + +/* +========================================================== + +Definres required to access the bsp tree + +========================================================== +*/ + +// lower bits are stronger, and will eat weaker brushes completely +#define CONTENTS_SOLID 0x00000001 // an eye is never valid in a solid +#define CONTENTS_WINDOW 0x00000002 // translucent, but not watery +#define CONTENTS_AUX 0x00000004 +#define CONTENTS_LAVA 0x00000008 +#define CONTENTS_SLIME 0x00000010 +#define CONTENTS_WATER 0x00000020 +#define CONTENTS_MIST 0x00000040 // 64 +#define CONTENTS_SHOT 0x00000080 +#define CONTENTS_FOG 0x00000100 + +#define CONTENTS_AREAPORTAL 0x8000 +#define CONTENTS_PLAYERCLIP 0x10000 +#define CONTENTS_MONSTERCLIP 0x20000 + +// currents can be added to any other contents, and may be mixed +#define CONTENTS_CURRENT_0 0x40000 +#define CONTENTS_CURRENT_90 0x80000 +#define CONTENTS_CURRENT_180 0x100000 +#define CONTENTS_CURRENT_270 0x200000 +#define CONTENTS_CURRENT_UP 0x400000 +#define CONTENTS_CURRENT_DOWN 0x800000 + +#define CONTENTS_ORIGIN 0x1000000 // removed before bsping an entity + +#define CONTENTS_MONSTER 0x2000000 // should never be on a brush, only in game +#define CONTENTS_DEADMONSTER 0x4000000 +#define CONTENTS_DETAIL 0x8000000 // brushes to be added after vis leafs +#define CONTENTS_TRANSLUCENT 0x10000000 // auto set if any surface has trans +#define CONTENTS_LADDER 0x20000000 + +#define VISIBLE_CONTENTS_MASK (CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_AUX|CONTENTS_LAVA|CONTENTS_SLIME|CONTENTS_WATER|CONTENTS_MIST|CONTENTS_FOG) + +// content masks +#define MASK_ALL (-1) +#define MASK_SOLID (CONTENTS_SOLID | CONTENTS_WINDOW) +#define MASK_PLAYERSOLID (CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER) +#define MASK_DEADSOLID (CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW) +#define MASK_MONSTERSOLID (CONTENTS_SOLID | CONTENTS_MONSTERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER) +#define MASK_WATER (CONTENTS_WATER | CONTENTS_LAVA | CONTENTS_SLIME) +#define MASK_OPAQUE (CONTENTS_SOLID | CONTENTS_SLIME | CONTENTS_LAVA) +#define MASK_SHOT (CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_DEADMONSTER | CONTENTS_SHOT) +#define MASK_CURRENT (CONTENTS_CURRENT_0 | CONTENTS_CURRENT_90 | CONTENTS_CURRENT_180 | CONTENTS_CURRENT_270 | CONTENTS_CURRENT_UP | CONTENTS_CURRENT_DOWN) + +// gi.BoxEdicts() can return a list of either solid or trigger entities +// FIXME: eliminate AREA_ distinction? +#define AREA_SOLID 1 +#define AREA_TRIGGERS 2 + +#define SURF_LIGHT 0x00000001 // value will hold the light strength +#define SURF_SLICK 0x00000002 // effects game physics +#define SURF_SKY 0x00000004 // don't draw, but add to skybox +#define SURF_WARP 0x00000008 // turbulent water warp +#define SURF_TRANS33_DEPREC 0x00000010 // Used to clarify view in the editor - not used in game +#define SURF_TRANS66_DEPREC 0x00000020 // Deprecated - recycle +#define SURF_FLOWING 0x00000040 // scroll towards angle +#define SURF_NODRAW 0x00000080 // don't bother referencing the texture +#define SURF_NO_DETAIL 0x00000400 // face doesn't draw the detail texture normally assigned to it +#define SURF_ALPHA_TEXTURE 0x00000800 // texture has alpha in it, and should show through in bsp process +#define SURF_ANIMSPEED 0x00001000 // value will hold the anim speed in fps +#define SURF_UNDULATE 0x00002000 // rock surface up and down... +#define SURF_SKYREFLECT 0x00004000 // liquid will somewhat reflect the sky - not quite finished.... +#define SURF_MAP 0x00008000 // used for the auto-map +#define SURF_REGION 0x00010000 +#define SURF_SIMPLE_SPHERICAL 0x00020000 + +typedef struct mtexinfo_s +{ + float vecs[2][4]; + int flags; + int numframes; + struct mtexinfo_s *next; // animation chain + struct image_s *image; + struct image_s *origimage; + // Required for server/client loading + struct ctextureinfo_s *textureinfo; + struct ctextureinfo_s *origtextureinfo; + int value; + int Damage; + int DamageLevel; +} mtexinfo_t; + +// plane_t structure +// !!! if this is changed, it must be changed in asm code too !!! +typedef struct cplane_s +{ + vec3_t normal; + float dist; + byte type; // for fast side tests + byte signbits; // signx + (signy<<1) + (signz<<1) +} cplane_t; + +// a trace is returned when a box is swept through the world +typedef struct +{ + bool allsolid; // if true, plane is not valid + bool startsolid; // if true, the initial point was in a solid area + float fraction; // time completed, 1.0 = didn't hit anything + vec3_t endpos; // final position + cplane_t plane; // surface normal at impact + struct mtexinfo_s *surface; // surface hit + int contents; // contents on other side of surface hit + struct edict_s *ent; // not set by CM_*() functions + int leaf_num; // leaf the hit took place in +} trace_t; + + +//============================================== + +typedef struct aEffectInfo_s +{ + short effectId; + short bolt;//actually a ghoul ID + short size; +}aEffectInfo_t; + +#define NUM_EFFECTS 4 + +// entity_state_t is the information conveyed from the server +// in an update message about entities that the client will +// need to render in some way + +typedef struct entity_state_s +{ + int number; // edict index + + vec3_t origin; + vec3_t angles; + vec_t angle_diff; + int modelindex; + int renderindex; + int frame; + int skinnum; + int effects; + int renderfx; + int solid; // For client side prediction, (bits 0-7) is x/y radius + // (bits 8-15) is z down distance, (bits16-23) is z up. + // The msb is unused (and unsent). + // gi.linkentity sets this properly + int sound; // for looping sounds, to guarantee shutoff + int sound_data; // data for volume on looping sound, as well as attenuation + int event; // impulse events -- muzzle flashes, footsteps, etc + int event2; // events only go out for a single frame, they + int event3; // are automatically cleared each frame - 3 just in case... + int data; // data for the event FX + int data2; // most of the time, these are + int data3; // empty + + aEffectInfo_t effectData[NUM_EFFECTS]; +} entity_state_t; + +//============================================== + +class IGhoulInst; +#define MAX_STATS 16 // see q_sh_interface.h + +// pmove_state_t is the information necessary for client side movement +// prediction +typedef enum +{ + // can accelerate and turn + PM_NORMAL, + PM_NOCLIP, + PM_SPECTATOR, + // no acceleration or turning + PM_DEAD, + PM_GIB, // different bounding box + PM_FREEZE, + PM_CAMERA_FREEZE, + PM_SPECTATOR_FREEZE, +} pmtype_t; + +// pmove->pm_flags +#define PMF_DUCKED 1 +#define PMF_JUMP_HELD 2 +#define PMF_ON_GROUND 4 +#define PMF_TIME_WATERJUMP 8 // pm_time is waterjump +#define PMF_TIME_LAND 16 // pm_time is time before rejump +#define PMF_TIME_TELEPORT 32 // pm_time is non-moving time +#define PMF_FATIGUED 64 // player is fatigued and cannot run +#define PMF_NO_PREDICTION 128 // temporarily disables prediction (used for grappling hook) + +// this structure needs to be communicated bit-accurate +// from the server to the client to guarantee that +// prediction stays in sync, so no floats are used. +// if any part of the game code modifies this struct, it +// will result in a prediction error of some degree. +typedef struct +{ + pmtype_t pm_type; + + short origin[3]; // 12.3 + short velocity[3]; // 12.3 + byte pm_flags; // ducked, jump_held, etc + byte pm_time; // each unit = 8 ms + short gravity; + short delta_angles[3];// add to command angles to get view direction + // changed by spawns, rotating objects, and teleporters + byte moveScale; // Global movescale used to facilitate different moverates, + // limping etc. Will not change very often. +} pmove_state_t; + +// Testing new movepeeds -MW. +#define _MOVESPEEDS_ + +// +// button bits +// +#define BUTTON_ATTACK 1 +#define BUTTON_USE 2 +#define BUTTON_ALTATTACK 4 +#define BUTTON_WEAP3 8 +#define BUTTON_WEAP4 16 +#define BUTTON_RUN 32 +#define BUTTON_ACTION 64 +#define BUTTON_ANY 128 // any key whatsoever + +// usercmd_t is sent to the server each client frame +typedef struct usercmd_s +{ + byte msec; + byte buttons; + byte lightlevel; // light level the player is standing on + char lean; // -1 or 1 + short angles[3]; + short forwardmove; + short sidemove; + short upmove; + float fireEvent; + float altfireEvent; +} usercmd_t; + + +#define MAXTOUCH 32 + +typedef struct +{ + // state (in / out) + pmove_state_t s; + + // command (in) + usercmd_t cmd; + qboolean snapinitial; // if s has been changed outside pmove + + // results (out) + int numtouch; + struct edict_s *touchents[MAXTOUCH]; + + vec3_t viewangles; // clamped + float viewheight; + + vec3_t mins, maxs; // bounding box size + + struct edict_s *groundentity; + int watertype; + int waterlevel; + + // callbacks to test the world + trace_t (*trace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end); + int (*pointcontents) (vec3_t point); + int (*checkOnOtherPlayer)(unsigned int groundEntity); + + float friction_loss; +} pmove_t; + +//============================================== + +// remote_type types +#define REMOTE_TYPE_FPS 0x00 // normal fps view -- WOW, it sucks that this is zero... +#define REMOTE_TYPE_TPS 0x01 // third person view +#define REMOTE_TYPE_LETTERBOX 0x02 // show's black boxes above and below (letterbox) +#define REMOTE_TYPE_CAMERA 0x04 // displays a camera graphic border +#define REMOTE_TYPE_NORMAL 0x08 // remote view, nothing fancy +#define REMOTE_TYPE_SNIPER 0x10 // sniper scope + +// memory tags to allow dynamic memory to be cleaned up +#define TAG_TEMP 764 // temporary storage while loading +#define TAG_GAME 765 // clear when unloading the dll +#define TAG_LEVEL 766 // clear when loading a new level +#define TAG_MAP 767 // clear when loading a new level + +#define STANDARD_POINTLIGHTDIR 255 + +// lightstyle that has been consumed for my own nefarious purposes as a sky light effect thing... +#define CL_WORLDSKYLIGHT 13 + +typedef struct sizebuf_s +{ + bool allowoverflow; // if false, do a Com_Error + bool overflowed; // set to true if the buffer size failed + byte *data; + int maxsize; + int cursize; + int readcount; +} sizebuf_t; + +typedef struct paletteRGB_s +{ + struct + { + byte r,g,b; + }; +} paletteRGB_t; + +typedef struct paletteRGBA_s +{ + union + { + struct + { + byte r,g,b,a; + }; + unsigned c; + byte c_array[4]; + }; +} paletteRGBA_t; + +// end \ No newline at end of file diff --git a/Source/Game/gamecpp/test.cpp b/Source/Game/gamecpp/test.cpp new file mode 100644 index 0000000..b76e278 --- /dev/null +++ b/Source/Game/gamecpp/test.cpp @@ -0,0 +1,237 @@ +#include "g_local.h" +#include "callback.h" +#include "..\qcommon\ef_flags.h" +#include + +static bool testSeqEnded; +static int testSeqCounter; + +TestSeqEndCallback theTestSeqEndCallback; + +bool TestSeqEndCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + edict_t *self=(edict_t *)ent; + + testSeqEnded = true; + return true; +} + +void ghoul_model_think (edict_t *self) +{ + GhoulID cshootSeq=0; + ggObjC *cshoot=0; + GhoulID tempNote; + + //see if my end-of sequence callback has fired--if so, get a new sequence + if (testSeqEnded) + { + gi.dprintf("my sequence has ended! hooha!\n"); + + //get my object again, to find sequences & notes + cshoot=game_ghoul.FindObject("enemy/ecto","officer"); + + if (testSeqCounter > 6) + { + //no new sequence--want to get rid of the callback, just to show how to do it if ya want. + } + else + { + //pick a new sequence + switch (testSeqCounter%2) + { + case 0: + //this is stretching anim + cshootSeq = game_ghoul.FindObjectSequence(cshoot,"std_istretch_n_a_a"); + break; + case 1: + default: + //this is a simple breathe anim + cshootSeq = game_ghoul.FindObjectSequence(cshoot,"std_istand_n_a_n"); + break; + } + testSeqCounter++; + } + + //if my new sequence is valid, play it + if (cshootSeq) + { + self->ghoulInst->Play(cshootSeq,level.time,0.0f,true,IGhoulInst::Hold); + testSeqEnded = false; + } + else + { + //see if i've registered the end-of-sequence note + tempNote=cshoot->GetMyObject()->FindNoteToken("EOS"); + + //remove the end-of-sequence callback + if (tempNote) + { + testSeqEnded = false; + self->ghoulInst->RemoveNoteCallBack(&theTestSeqEndCallback,tempNote); + + gi.dprintf("getting rid of seq-end callback\n"); + + //play whatever my first sequence is, just to prove there's no seq-end callback there + cshootSeq = game_ghoul.FindObjectSequence(cshoot,"std_ilooking_n_a_a"); + if (cshootSeq) + { + self->ghoulInst->Play(cshootSeq,level.time,0.0f,true,IGhoulInst::Loop); + testSeqEnded = false; + } + } + } + } + self->nextthink = level.time + FRAMETIME; +} + +void SP_ghoul_model (edict_t *ent) +{ + ggObjC *cshoot=0; + ggObjC *cgun=0; + GhoulID cshootSeq=0; + GhoulID cshootBolt=0; + GhoulID gunSeq=0; + GhoulID gunBolt=0; + ggOinstC *t2; + ggBinstC *gunBolted; + GhoulID tempNote; + + ent->movetype = MOVETYPE_STEP; + ent->solid = SOLID_BBOX; + ent->s.renderfx = RF_GHOUL; + + cshoot = game_ghoul.FindObject("enemy/ecto","officer"); + cgun = game_ghoul.FindObject("enemy/bolt","w_briefcase"); + cshootSeq = game_ghoul.FindObjectSequence(cshoot,"std_ilooking_n_a_a"); + gunSeq = game_ghoul.FindObjectSequence(cgun,"w_briefcase"); + cshootBolt = cshoot->GetMyObject()->FindPart("wbolt_hand_l"); + gunBolt = cgun->GetMyObject()->FindPart("to_wbolt_hand_l"); + + t2 = game_ghoul.AddObjectInstance(cshoot, ent); + + ent->ghoulInst=t2->GetInstPtr(); + ent->ghoulInst->SetUserData(ent); + + if (cshootSeq) + { + ent->ghoulInst->Play(cshootSeq,level.time,0.0f,true,IGhoulInst::Hold); + + //see if i've registered the end-of-sequence note + tempNote=cshoot->GetMyObject()->FindNoteToken("EOS"); + + //add the end-of-sequence callback + if (tempNote) + { + testSeqEnded = false; + testSeqCounter = 0; + ent->ghoulInst->AddNoteCallBack(&theTestSeqEndCallback,tempNote); + } + } + + if (gunSeq && cgun && gunBolt && t2 && cshootBolt) + { + gunBolted=t2->AddBoltInstance(cshootBolt, cgun, gunBolt); + gunBolted->PlaySequence(gunSeq,level.time,0.0,true,IGhoulInst::HoldFrame,false,false); + } + + VectorSet (ent->mins, -16, -16, -32); + VectorSet (ent->maxs, 16, 16, 16); + + ent->think = ghoul_model_think; + ent->nextthink = level.time + FRAMETIME; + + gi.linkentity (ent); +} + + + +class TestCallback :public IGhoulCallBack +{ +public: + bool Execute(IGhoulInst *me,void *ent,float time,const void *matrix); +}; + + +TestCallback theTestCallback; + +bool TestCallback::Execute(IGhoulInst *me,void *ent,float time,const void *matrix) +{ + static DWORD last; + + edict_t *self=(edict_t *)ent; + +// Com_Printf("Diff = %10.2f\n",level.time); +// last = timeGetTime(); + + return true; +} + + + +/*QUAKED test_rj (1 .5 0) (-16 -16 -16) (16 16 16) +RJ testing model +*/ + +void SP_test_rj (edict_t *ent) +{ + + return; + + ent->movetype = MOVETYPE_STEP; + ent->solid = SOLID_BBOX; + + game_ghoul.SetSimpleGhoulModel(ent, "rj", "rj"); +// game_ghoul.SetSimpleGhoulModel(ent, "objects/newyork/gumball", "gumball"); + if (ent->ghoulInst) + { + ent->ghoulInst->AddNoteCallBack(&theTestCallback,"rj"); + } + + + gi.linkentity (ent); + +/* ggObjC *cshoot=0; + ggObjC *cgun=0; + GhoulID cshootSeq=0; + GhoulID cshootBolt=0; + GhoulID gunSeq=0; + GhoulID gunBolt=0; + ggOinstC *t2; + GhoulID tempNote; + + ent->movetype = MOVETYPE_STEP; + ent->solid = SOLID_BBOX; + ent->s.renderfx = RF_GHOUL; + + cshoot = game_ghoul.FindObject("rj","rj"); + cshootSeq = game_ghoul.FindObjectSequence(cshoot,"rj"); + + t2 = game_ghoul.AddObjectInstance(cshoot, ent); + + ent->ghoulInst=t2->GetInstPtr(); + ent->ghoulInst->SetUserData(ent); + + if (cshootSeq) + { + ent->ghoulInst->Play(cshootSeq,level.time,0.0f,true,IGhoulInst::Hold); + + //see if i've registered the end-of-sequence note + tempNote=cshoot->GetMyObject()->FindNoteToken("RJ"); + + //add the end-of-sequence callback + if (tempNote) + { + testSeqEnded = false; + testSeqCounter = 0; + ent->ghoulInst->AddNoteCallBack(&theTestCallback,tempNote); + } + } + + VectorSet (ent->mins, -16, -16, -32); + VectorSet (ent->maxs, 16, 16, 16); + + gi.linkentity (ent);*/ +} + + + diff --git a/Source/Game/gamecpp/w_equip.cpp b/Source/Game/gamecpp/w_equip.cpp new file mode 100644 index 0000000..eb1e896 --- /dev/null +++ b/Source/Game/gamecpp/w_equip.cpp @@ -0,0 +1,489 @@ +// ************************************************************************ +// +// w_equip.cpp +// +// This is for all selectable items. +// While some of these items (like the C4) can still be considered "weapons", +// they don't use the "weapon" code, and so it is useful (and less of a load +// on the overburdened w_fire.cpp module) to separate "equipment" out. +// ************************************************************************ + +#include "g_local.h" +#include "w_weapons.h" +#include "ai_private.h" // so we know what a bodyhuman_c is +#include "../strings/items.h" + +const unsigned short MEDKIT_HEAL_DEFAULT = 25; +const float REALISTIC_MOVESCALE = 0.5625; + + +extern edict_t *SV_TestEntityPosition (edict_t *ent); + +extern void SetProjVel(edict_t &self, edict_t &newEnt, float fwd, float right, float up); +extern void SetProjPhysics(edict_t &self, float friction, float gravity, float airresistance, float bouyancy, float elasticity); + +// need to know about leaning when we toss c4 +extern edict_t *GetLeanBuddy(edict_t *owner); + +//yurg - don't wanna make it like this but the player .dll nonsense is just too annoying to deal with +void cacheForItem(equipment_t curEquip) +{ + switch(curEquip) + { + case SFE_FLASHPACK: + game_ghoul.FindObject("Items/Projectiles", "flashpak")->RegistrationLock(); + gi.soundindex("Weapons/gren/bounce.wav"); + break; +// case SFE_NEURAL_GRENADE: +// gi.effectindex("weapons/world/neural"); + break; + case SFE_C4: + game_ghoul.FindObject("Items/Projectiles", "C4")->RegistrationLock(); + gi.soundindex("Weapons/C4/c4attch.wav"); + gi.soundindex("Weapons/C4/Beep.wav"); + break; + case SFE_LIGHT_GOGGLES: + gi.soundindex("Weapons/Goggles/on.wav"); + gi.soundindex("Weapons/Goggles/off.wav"); + break; + case SFE_CLAYMORE: + game_ghoul.FindObject("Items/Projectiles", "claymore")->RegistrationLock(); + gi.effectindex("weapons/world/claymore"); + gi.soundindex("Weapons/C4/c4attch.wav"); + gi.soundindex("Weapons/Claymore/Beep.wav"); + break; + case SFE_MEDKIT: + break; + case SFE_GRENADE: + game_ghoul.FindObject("Items/Projectiles", "grenade")->RegistrationLock(); + gi.effectindex("weapons/world/grenadeexplode"); + gi.soundindex("Weapons/gren/bounce.wav"); + break; + default: + break; + } +} + + + +//------------------------------------MEDKIT------------------------------------------- +qboolean tryToHeal(edict_t *ent,int amountToHeal); + +bool medkitUse(edict_t &ent, itemSlot_c &slot) +{ + if (dm->dmRule_REALISTIC_DAMAGE()) + { + // heal leg and arm damage, but not health! + bodyhuman_c *body = NULL; + + if (body = (bodyhuman_c*)ent.client->body) + { + body->RemoveLimbDamage(); + resetMovescale(&ent, 0); + } + gi.sound(&ent, CHAN_ITEM, gi.soundindex("dm/healthpu.wav"), 1.0, ATTN_IDLE, 0); + return true; + } + + bool didWeHeal = !!tryToHeal(&ent, MEDKIT_HEAL_DEFAULT); + + if (!didWeHeal) + { + // print the "We're at full health, we don't need this, Bozo!" message + gi.SP_Print(&ent, ITEMS_FULL_HEALTH); + } + return didWeHeal; +} + +//------------------------------------GOGGLES------------------------------------------- + +bool goggleUse(edict_t &ent, itemSlot_c &slot) +{ + if (!ent.client) + return true; + + if (slot.getSlotStatus()) + { // Goggles are on! + ent.client->goggles_on = true; + gi.sound(&ent, CHAN_VOICE, gi.soundindex("Weapons/Goggles/on.wav"), .6, ATTN_IDLE, 0);//fixme + } + else + { + ent.client->goggles_on = false; + if (!game.cinematicfreeze) + { + gi.sound(&ent, CHAN_VOICE, gi.soundindex("Weapons/Goggles/off.wav"), .6, ATTN_IDLE, 0);//fixme + } + } + return true; +} + + +//------------------------------------GRENADE------------------------------------------- + +// Grenades are weapons, used by opponents as well. For this reason, most of the functionality resides in w_fire. +extern void createGrenade(edict_t *owner, vec3_t loc, vec3_t vel, qboolean enemy); + +bool grenadeUse(edict_t &ent, itemSlot_c &slot) +{ + vec3_t fwdV, rightV, upV; + vec3_t vel, pos; + edict_t *leanBuddy = GetLeanBuddy(&ent); + + // Decide on velocity. Start by getting directional vectors. + if(ent.client) + { + AngleVectors(ent.client->ps.viewangles, fwdV, rightV, upV); + } + else + { + AngleVectors(ent.s.angles, fwdV, rightV, upV); + } + + VectorMA(ent.velocity, 475.0, fwdV, vel); + VectorMA(vel, gi.flrand(-15,15), rightV, vel); + VectorMA(vel, gi.flrand(300,350), upV, vel); + + // kef -- take into account player leaning + if (leanBuddy) + { + VectorCopy(leanBuddy->s.origin, pos); + pos[2] = ent.s.origin[2] + ent.viewheight-20.0; + } + else + { + VectorCopy(ent.s.origin, pos); + pos[2] += ent.viewheight-20.0; + } + + createGrenade(&ent, pos, vel, false); + return true; +} + +//------------------------------------FLASHPACK------------------------------------------- + +void flashTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + if(plane && VectorLengthSquared(self->velocity) > 100) + { + gi.sound(self, CHAN_VOICE, gi.soundindex("Weapons/gren/bounce.wav"), .6, 2, 0);//fixme - bounce + } +} + +void flashpackExplode(edict_t *ent) +{ + vec3_t pos; + + // if this thing is trying to explode during a cinematic, just get rid of it + if (!game.cinematicfreeze) + { + VectorCopy(ent->s.origin, pos); + pos[2] += 15; + + ent->solid = SOLID_NOT; + + BlindingLight(pos, 10000, 0.99, 0.15); + + FX_Flashpack(pos); + T_RadiusDamage (ent, ent->owner, 20, ent, 100, MOD_FIRE, 0); + } + G_FreeEdict(ent); + + //this should probably affect enemies as well... +} + +void flashpackFunc(edict_t &ent) +{ + edict_t *flashpack; + edict_t *leanBuddy = GetLeanBuddy(&ent); + + flashpack = G_Spawn(); + SetProjVel(ent, *flashpack, 400, 0, gi.flrand(200, 400)); + SetProjPhysics(*flashpack, .7, 1.0, 0, 0, .7); + // kef -- take into account player leaning + if (leanBuddy) + { + VectorCopy(leanBuddy->s.origin, flashpack->s.origin); + flashpack->s.origin[2] = ent.s.origin[2] + ent.viewheight; + } + else + { + VectorCopy(ent.s.origin, flashpack->s.origin); + flashpack->s.origin[2] += ent.viewheight; + } + + VectorSet (flashpack->mins, -2, -2, -3); + VectorSet (flashpack->maxs, 2, 2, 3); + flashpack->health = 100; + flashpack->think = flashpackExplode; + flashpack->nextthink = level.time + 1.5; + VectorSet(flashpack->avelocity, gi.irand(-300, 300), gi.irand(-300, 300), gi.irand(-300, 300)); + //gi.setmodel(flashpack,"models/objects/generic/chunks_wall/tris.fm"); + game_ghoul.SetSimpleGhoulModel(flashpack, "Items/Projectiles", "flashpak"); + gi.linkentity(flashpack); + flashpack->owner = &ent; + flashpack->touch = flashTouch; + flashpack->flags = FL_THROWN_WPN; + + // Play grenade throwing sound + gi.sound(&ent, CHAN_VOICE, gi.soundindex("Weapons/gren/throw.wav"), .6, 1, 0);//fixme - bounce + + if(SV_TestEntityPosition(flashpack)) + { + flashpack->touch(flashpack, g_edicts, 0, 0); + } + +} + +bool flashpackUse(edict_t &ent, itemSlot_c &slot) +{ + flashpackFunc(ent); + return true; +} + +//--------------------------------NEURAL GRENADE---------------------------------------- + +bool neuralGrenadeUse(edict_t &ent, itemSlot_c &slot) +{ +#ifndef _OEM_ + T_RadiusDamage (&ent, &ent, 400, &ent, 256, MOD_NEURAL_GRENADE, DT_NEURAL|DT_SHOCK|DAMAGE_NO_KNOCKBACK); + gmonster.RadiusDeafen(&ent, 400, 300); + fxRunner.setPos2(ent.s.origin); + fxRunner.exec("weapons/world/emitter", ent.s.origin); +#endif + return true; +} + + +//---------------------------------C4/PLASTIQUE------------------------------------------ + +void c4Explode(edict_t *self) +{ + if(self->health < 104) + { + gmonster.SpookEnemies(self->s.origin, 160, SPOOK_EXPLOSIVE);//hahaha + gi.sound(self, CHAN_VOICE, gi.soundindex("Weapons/C4/Beep.wav"), .6, ATTN_NORM, 0); + self->health++; + self->nextthink = level.time + .4; + } + else + { + if (!game.cinematicfreeze) + { // if we're in a cinematic don't do any of this...just free the edict. + vec3_t fwd, pos; + + AngleVectors(self->s.angles, fwd, NULL, NULL); + VectorMA(self->s.origin, 10, fwd, pos); + + T_RadiusDamage2(self, self->owner, pos, 250, 32, 200, NULL, MOD_C4, DT_MANGLE|DT_DIRECTIONALGORE); + + BlindingLight(self->s.origin, 2500, 0.8, 0.5); + gmonster.RadiusDeafen(self, 300, 300); + + fxRunner.setDir(fwd); + fxRunner.exec("weapons/world/c4explode", self->s.origin); + IncreaseSpawnIntensity(.6); + } + G_FreeEdict(self); + } +} + +void c4Touch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + if(plane) + { + if(plane->normal) + { + if(other == g_edicts) + { + if(self->gravity) + { + gmonster.SpookEnemies(self->s.origin, 160, SPOOK_EXPLOSIVE); + gi.sound(self, CHAN_VOICE, gi.soundindex("Weapons/C4/c4attch.wav"), .6, ATTN_NORM, 0); + self->gravity = 0; + VectorClear(self->velocity); + VectorClear(self->avelocity); + if(plane) + { + vectoangles(plane->normal, self->s.angles); + } + } + } + } + } +} + +bool c4use(edict_t &ent, itemSlot_c &slot) +{ + edict_t *c4; + edict_t *leanBuddy = GetLeanBuddy(&ent); + + c4 = G_Spawn(); + game_ghoul.SetSimpleGhoulModel(c4, "Items/Projectiles", "C4"); + SetProjVel(ent, *c4, 410.0, gi.flrand(-30, 30), gi.flrand(150, 180)); + SetProjPhysics(*c4, 1.0, 1.0, 0, 0, 0.0); + + // kef -- take into account player leaning + if (leanBuddy) + { + VectorCopy(leanBuddy->s.origin, c4->s.origin); + c4->s.origin[2] = ent.s.origin[2] + ent.viewheight; + } + else + { + VectorCopy(ent.s.origin, c4->s.origin); + c4->s.origin[2] += ent.viewheight; + } + + VectorSet (c4->mins, -2, -2, -2); + VectorSet (c4->maxs, 2, 2, 2); + c4->health = 100; + c4->think = c4Explode; + c4->nextthink = level.time + .5; + gi.linkentity(c4); + c4->owner = &ent; + c4->touch = c4Touch; + c4->flags = FL_THROWN_WPN; + VectorSet(c4->avelocity, gi.irand(-300, 300), gi.irand(-300, 300), gi.irand(-300, 300)); + + // Play grenade throwing sound + gi.sound(&ent, CHAN_VOICE, gi.soundindex("Weapons/gren/throw.wav"), .6, 1, 0);//fixme - bounce + + //c4->physicsFlags |= PHYS_ATTACHED|PHYS_ATTACH_COPYANG; + + if(SV_TestEntityPosition(c4)) + { + c4->touch(c4, g_edicts, 0, 0); + } + return true; +} + +//-----------------------------CLAYMORE----------------------------------- + +void claymoreThink(edict_t *self) +{ + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + self->owner = g_edicts; + CRadiusContent rad(self->s.origin, 128); + + if(self->health < 3) + { // play activate sound + gi.sound(self, CHAN_VOICE, gi.soundindex("Weapons/Claymore/Beep.wav"), .6, ATTN_NORM, 0);//fixme + self->health = 3; + } + + for(int i = 0; i < rad.getNumFound(); i++) + { + edict_t *search = rad.foundEdict(i); + + if(search->client || search->ai || (self->gib_health < 1)) + { + if((search->health > 0)||(self->gib_health < 1)) + { + vec3_t pos; + + self->owner = self->targetEnt; + + VectorCopy(self->s.origin, pos); + pos[2] += 10; + + T_RadiusDamage2(self, self->owner, self->s.origin, 300, 150, 100, NULL, MOD_CLAYMORE, DT_MANGLE|DT_DIRECTIONALGORE); + gmonster.RadiusDeafen(self, 300, 300); + +// fxRunner.exec("weapons/world/airexplode", self->s.origin); +// FX_C4Explosion(self); + +// BlindingLight(pos, 5000, 0.8, 0.5); +// ShakeCameras (self->s.origin, 500, 300, 25); + IncreaseSpawnIntensity(.4); + fxRunner.exec("weapons/world/claymore", self->s.origin); + G_FreeEdict(self); + + return; + } + } + } + + self->gib_health--; + self->nextthink += .2; +} + +void claymore_die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point) +{ + if(!self->gib_health) + { //already killed myself. + return; + } + + self->gib_health = 0; + + self->think = claymoreThink; + self->nextthink = level.time + 0.2; +} + +void claymoreTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if(self->health < 2) + { + gi.sound(self, CHAN_VOICE, gi.soundindex("Weapons/C4/c4attch.wav"), .6, ATTN_NORM, 0); + self->health = 2; + } +} + + +bool claymoreUse(edict_t &ent, itemSlot_c &slot) +{ +#ifndef _OEM_ + edict_t *claymore; + + claymore = G_Spawn(); + game_ghoul.SetSimpleGhoulModel(claymore, "Items/Projectiles", "claymore"); + SetProjVel(ent, *claymore, 0.0, 0.0, 0.0); + SetProjPhysics(*claymore, 1.0, 1.0, 0, 0, 0.0); + VectorCopy(ent.s.origin, claymore->s.origin); + claymore->s.origin[2] += 24; + claymore->gib_health = 200;//timer + claymore->health = 10; + claymore->think = claymoreThink; + claymore->nextthink = level.time + 3.0; + claymore->owner = &ent; + claymore->targetEnt = &ent; + claymore->takedamage = 1; + claymore->die = claymore_die; + VectorSet(claymore->s.angles, 270, 90, 90); + claymore->clipmask = CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_SHOT; + VectorSet (claymore->mins, -4, -4, 0); + VectorSet (claymore->maxs, 4, 4, 6); + gi.linkentity(claymore); + claymore->touch = claymoreTouch; + claymore->flags = FL_THROWN_WPN; + claymore->health = 1; +#endif + return true; +} + + +bool DoWeHaveTheFlag(edict_t *ent) +{ + if (ent->ctf_flags) + return true; + return false; +} + diff --git a/Source/Game/gamecpp/w_fire.cpp b/Source/Game/gamecpp/w_fire.cpp new file mode 100644 index 0000000..55719f5 --- /dev/null +++ b/Source/Game/gamecpp/w_fire.cpp @@ -0,0 +1,3506 @@ +#include "g_local.h" +#include "w_weapons.h" +#include "CWeaponInfo.h" + +edict_t *SV_TestEntityPosition (edict_t *ent); + +extern void EntToWorldMatrix(vec3_t org, vec3_t angles, Matrix4 &m); + +static float s_lastHawkShooting = 0; +#define HAWKSHOOTING_DEBOUNCE 10.0 + +#define ENEMY_MWAVE_DELAY .4 + +static int ricochetSounds[6]; +static int flybys[4]; +static int cracks[3]; + +void cacheWeaponCommon(void) +{ + gi.effectindex("environ/onfireburst"); + gi.effectindex("environ/quickfireburst"); + gi.effectindex("spark"); + gi.effectindex("environ/wallspark"); + + // since this seems to be the place to pre-cache effects files, lets add a few more + // How'z about some force feedback effects? + gi.effectindex("land"); + gi.effectindex("gotshot"); + gi.effectindex("exphit"); + gi.effectindex("lighthit"); + + // general shell casing sounds + gi.soundindex("weapons/fx/tink/gen1.wav"); + gi.soundindex("weapons/fx/tink/gen2.wav"); + + // specifically metal shell casing sounds + gi.soundindex("weapons/fx/tink/metal1.wav"); + gi.soundindex("weapons/fx/tink/metal2.wav"); + gi.soundindex("weapons/fx/tink/metal3.wav"); + + // ...and shotgun shell casing sounds + gi.soundindex("weapons/fx/tink/shot1.wav"); + gi.soundindex("weapons/fx/tink/shot2.wav"); + gi.soundindex("weapons/fx/tink/shot3.wav"); + + // ...and heavy shell casing sounds, like the sniper, etc. + gi.soundindex("weapons/fx/tink/hvy1.wav"); + gi.soundindex("weapons/fx/tink/hvy2.wav"); + gi.soundindex("weapons/fx/tink/hvy3.wav"); + + // the infamous "a weapon is being fired at you" crack sounds + cracks[0] = gi.soundindex("weapons/fx/crack/crack1.wav"); + cracks[1] = gi.soundindex("weapons/fx/crack/crack2.wav"); + cracks[2] = gi.soundindex("weapons/fx/crack/crack3.wav"); + + // the not-so-infamous "I'm smoking crack" sound + //gi.soundindex("Keith/is/on/crack.wav"); + + // people-on-fire effect + gi.effectindex("weapons/world/airexplode"); + gi.effectindex("weapons/world/grenadeexplode"); + gi.soundindex ("Weapons/gren/throw.wav"); + gi.effectindex("weapons/world/c4explode"); + + // nearby bullet sounds + flybys[0] = gi.soundindex("Weapons/FX/FlyBy/FlyBy1.wav"); + flybys[1] = gi.soundindex("Weapons/FX/FlyBy/FlyBy2.wav"); + flybys[2] = gi.soundindex("Weapons/FX/FlyBy/FlyBy3.wav"); + flybys[3] = gi.soundindex("Weapons/FX/FlyBy/FlyBy4.wav"); + + // ricochet sounds + ricochetSounds[0] = gi.soundindex("Weapons/FX/Rics/ric1.wav"); + ricochetSounds[1] = gi.soundindex("Weapons/FX/Rics/ric2.wav"); + ricochetSounds[2] = gi.soundindex("Weapons/FX/Rics/ric3.wav"); + ricochetSounds[3] = gi.soundindex("Weapons/FX/Rics/ric4.wav"); + ricochetSounds[4] = gi.soundindex("Weapons/FX/Rics/ric5.wav"); + ricochetSounds[5] = gi.soundindex("Weapons/FX/Rics/ric6.wav"); + + + game_ghoul.FindObject("Items/Projectiles", "shell")->RegistrationLock(); + + // armor pickup + game_ghoul.FindObject("Items/Pick-ups/Armor", "armor")->RegistrationLock(); + // armor pickup sound (used in both single player and DM) + gi.soundindex("dm/armorpu.wav"); + + // health pickup sound (used in both sp and dm) + gi.soundindex("dm/healthpu.wav"); + + gi.soundindex("weapons/gpistol/cock.wav"); + + // even though it's neither a weapon nor common... + gi.soundindex("misc/talk.wav"); + gi.soundindex("misc/type.wav"); + + // flash grenade + gi.soundindex("weapons/FlshGren/FlshExp.wav"); + + char meatSound[100]; + + for (int i=1;i<=3;i++) + { + Com_sprintf(meatSound, sizeof(meatSound), "impact/gore/impact%d.wav", i); + gi.soundindex(meatSound); + } + for (i=1;i<=4;i++) + { + Com_sprintf(meatSound, sizeof(meatSound), "impact/player/hit%d.wav", i); + gi.soundindex(meatSound); + } + gi.soundindex("impact/player/armor.wav"); + gi.soundindex("player/jump.wav"); + + gi.soundindex("misc/padd/warning.wav"); + gi.soundindex("misc/padd/warning2.wav"); + gi.soundindex("misc/padd/max.wav"); + gi.soundindex("weapons/knife/throwloop.wav"); +} + +//any extra resources used by these +void cacheKnife(void) +{ + gi.soundindex("weapons/knife/swing2.wav"); + gi.soundindex("weapons/knife/swing3.wav"); +} + +void cacheKnifeThrow(void) +{ + gi.soundindex("weapons/knife/throwloop.wav"); + gi.soundindex("weapons/knife/impact.wav"); + game_ghoul.FindObject("Enemy/Bolt", "w_knife")->RegistrationLock(); +} + +void cacheStarThrow(void) +{ + gi.soundindex("weapons/knife/throwloop.wav"); + gi.soundindex("weapons/knife/impact.wav"); + gi.effectindex("weapons/world/startrail"); + game_ghoul.FindObject("Enemy/Bolt", "w_throw_star")->RegistrationLock(); +} + +void cachePistol1(void) +{ +// gi.soundindex("weapons/gpistol/fire.wav"); +// gi.effectindex("weapons/playermz/shell_s"); +} + +void cachePistol2(void) +{ +// gi.effectindex("weapons/playermz/shell_l"); +} + +void cacheMPistol(void) +{ +// gi.effectindex("weapons/playermz/shell_s"); +} + +void cacheAssaultR(void) +{ +// gi.effectindex("weapons/playermz/shell"); +} + +void cacheSniper(void) +{ + gi.soundindex("weapons/sniper/zoom.wav"); +// gi.effectindex("weapons/playermz/shell"); + gi.effectindex("weapons/playermz/sniper_alt"); +} + +void cacheAutoShot(void) +{ + //gi.effectindex("weapons/world/hotslug"); + gi.effectindex("weapons/world/slugthrow"); + gi.effectindex("weapons/world/enemyslug"); + gi.effectindex("weapons/world/slughit"); + gi.effectindex("weapons/world/slugexplode"); +} + +void cacheConcGren(void) +{ + game_ghoul.FindObject("Items/Projectiles", "grenade")->RegistrationLock(); + gi.effectindex("weapons/world/sluggren"); + gi.effectindex("weapons/world/conctrail"); + gi.soundindex ("Ambient/Gen/Electric/spark2.wav"); +} + +void cacheShotgun(void) +{ + gi.soundindex("weapons/shotgun/fire.wav"); + gi.effectindex("gore/shotgun"); +// gi.effectindex("weapons/playermz/shellbig"); +} + +void cacheMachinegun(void) +{ +} + +void cachePhosGren(void) +{ + game_ghoul.FindObject("Items/Projectiles", "grenade")->RegistrationLock(); + gi.effectindex("weapons/world/phostrail"); + gi.soundindex("weapons/mgun/explode.wav"); + gi.soundindex("Weapons/gren/bounce.wav"); + gi.effectindex("weapons/world/phosexplode"); + gi.effectindex("weapons/world/phosburn"); +} + +void cacheRocket(void) +{ + game_ghoul.FindObject("Weapon/Projectiles/Rocket", "Rocket")->RegistrationLock(); + gi.effectindex("weapons/world/rocketexplode"); + gi.effectindex("weapons/world/rockettrail2"); + gi.effectindex("weapons/world/rockettrail_p"); + gi.soundindex("Weapons/Rocket/FlyLP.wav"); +// gi.effectindex("weapons/playermz/exhaust"); +} + +void cacheRocketMulti(void) +{ + cacheRocket(); + gi.effectindex("weapons/world/rocketexplode_alt"); + gi.effectindex("weapons/world/rocketsplit"); + gi.effectindex("weapons/world/rockettrail_alt1"); + gi.effectindex("weapons/world/rockettrail_alt2"); +} + +void cacheMicro(void) +{ +// gi.effectindex("weapons/world/mpgpurple"); + gi.effectindex("weapons/world/mpgburst"); +// gi.effectindex("weapons/playermz/mpgcharge"); + gi.effectindex("weapons/othermz/mpgcharge"); + gi.effectindex("weapons/othermz/mpgcharge2"); + gi.effectindex("environ/pulsecook");//cache the gib effects too + gi.effectindex("gore/mpgsplatter"); + + gi.soundindex("Weapons/MPG/Expand.wav"); + gi.soundindex("Weapons/MPG/Burst.wav"); + + gi.soundindex("Weapons/MPG/alt1.wav"); + gi.soundindex("Weapons/MPG/alt2.wav"); + gi.soundindex("Weapons/MPG/alt3.wav"); + gi.soundindex("Weapons/MPG/alt4.wav"); + + gi.soundindex("Weapons/MPG/charge.wav"); +} + +void cacheMicro2(void) +{ +// gi.effectindex("weapons/world/mpglow"); + gi.effectindex("weapons/world/mpgzap"); + gi.effectindex("weapons/othermz/mpgbeam1"); + gi.effectindex("weapons/othermz/mpgbeam2"); + gi.effectindex("environ/onfireburst"); + gi.effectindex("environ/quickfireburst"); +} + +void cacheDekkerMicro(void) +{ + gi.effectindex("weapons/world/gb_dek2"); + gi.effectindex("weapons/othermz/gb_dekmz"); + gi.effectindex("environ/pulsecook");//cache the gib effects too + gi.effectindex("gore/mpgsplatter"); + + gi.soundindex("Enemy/Dekker/Fire.wav"); + gi.soundindex("Weapons/MPG/Expand.wav"); + gi.soundindex("Weapons/MPG/Burst.wav"); + + gi.soundindex("Weapons/MPG/alt1.wav"); + gi.soundindex("Weapons/MPG/alt2.wav"); + gi.soundindex("Weapons/MPG/alt3.wav"); + gi.soundindex("Weapons/MPG/alt4.wav"); + + gi.soundindex("Weapons/MPG/charge.wav"); +} + +void cacheFlameBlast(void) +{ + gi.effectindex("weapons/world/fthrower"); +// gi.effectindex("weapons/world/playerfthrow"); +// gi.effectindex("weapons/playermz/fthrowidle"); +// gi.effectindex("weapons/playermz/fthrowmain"); +// gi.effectindex("weapons/playermz/fthrowupdate"); +// gi.effectindex("weapons/playermz/fthrow1"); +// gi.effectindex("weapons/playermz/fthrow2"); +// gi.effectindex("weapons/playermz/fthrow3"); + gi.effectindex("weapons/world/flamehit"); + gi.effectindex("weapons/world/flamehitwall"); + gi.effectindex("environ/onfireburst"); + gi.effectindex("environ/quickfireburst"); + gi.effectindex("weapons/othermz/flamecharge"); +} + +void cacheFlameGlob(void) +{ + gi.effectindex("weapons/world/fballtrail"); + gi.effectindex("weapons/playermz/flamebuildup"); + gi.effectindex("weapons/playermz/fthrowidle"); + gi.effectindex("weapons/world/fballimpact"); +} + +void cacheGrenade(void) +{ + game_ghoul.FindObject("Items/Projectiles", "grenade")->RegistrationLock(); +} + +void cacheMolitov(void) +{ + gi.effectindex("weapons/world/molitovburst"); + //gi.effectindex("weapons/world/molitovexplode"); + gi.effectindex("weapons/world/molitrail2"); + game_ghoul.FindObject("Items/Projectiles", "w_molitov")->RegistrationLock(); +} + + + + + + + +// +// This stuff gets used by all the AI for accurate damage crap. +// + +HitRecord bullet_Hits[20]; +int bullet_numHits; +Vect3 bullet_EntDir,bullet_EntStart; + +void clearBulletTraceHits(void) +{ + bullet_numHits=0; +} + +int bulletTraceHitCheck(trace_t *tr, vec3_t start, vec3_t end, int clipMask) +{ + vec3_t dir; + edict_t *hit = tr->ent; + bool bSurfaceIsGlass = ((tr->surface->flags>>24) == SURF_GLASS), + bSurfaceIsGlassComputer = ((tr->surface->flags>>24) == SURF_GLASS_COMPUTER), + bMaterialIsGlass = (hit->material == MAT_GLASS), + bContentsWindow = (tr->contents == CONTENTS_WINDOW), + bDidntHitWorld = (hit != world); + + // 1/5/00 kef - if we hit a buddy, actually hit the buddy's owner + if (GetBuddyOwner(tr->ent)) + { + tr->ent = GetBuddyOwner(tr->ent); + hit = tr->ent; + if (!hit) + { + return 0; + } + } + VectorSubtract(end, start, dir); + VectorNormalize(dir); + + bullet_numHits = 0; + +/* if(tr->ent->flags & FL_LEAN_PLAYER) + { + hit = tr->ent->owner; + if(!hit)return 0; + } +*/ +#ifdef __PLAYERTEST_3DPERSON + IGhoulInst *oldInst=hit->ghoulInst; + if (hit->client && hit->client->ps.bod && !dm->isDM()) + { + hit->ghoulInst = hit->client->ps.bod; + } +#endif + + if(hit->ghoulInst) + { + Matrix4 ToEnt,ToWorld; + Vect3 transform; + + EntToWorldMatrix(hit->s.origin,hit->s.angles,ToWorld); + //but we want to put the ray into ent space, need inverse + ToEnt.Inverse(ToWorld); + + VectorCopy(start,*((vec3_t*)&transform)); + ToEnt.XFormPoint(bullet_EntStart,transform); + ToEnt.XFormVect(bullet_EntDir,*(Vect3 *)dir); + bullet_EntDir.Norm(); + + bullet_numHits = hit->ghoulInst->RayTrace(level.time,bullet_EntStart,bullet_EntDir,bullet_Hits,20); + + if(!bullet_numHits) + { //uh oh - going through the bbox + +#ifdef __PLAYERTEST_3DPERSON + hit->ghoulInst = oldInst; +#endif + return 0; + } + else + { + HitRecord &Hit=bullet_Hits[0]; + Vect3 t,t2; + t=bullet_EntDir; + t*=Hit.Distance; + t+=bullet_EntStart; + ToWorld.XFormPoint(t2,t); + *(Vect3 *)tr->endpos=t2; + t=*(Vect3 *)start; + float d=t.Dist(*(Vect3 *)end); + if (d>.01f) + { + tr->fraction=t2.Dist(t)/d; + if (tr->fraction>.99) + tr->fraction=.99f; + } + ToEnt.XFormVectTranspose(*(Vect3 *)tr->plane.normal,Hit.Normal); + } + } + else if( ((bSurfaceIsGlass||bSurfaceIsGlassComputer) && bDidntHitWorld) || + bMaterialIsGlass || + bContentsWindow ) + { + +#ifdef __PLAYERTEST_3DPERSON + hit->ghoulInst = oldInst; +#endif + // gotta make sure we check against our mask. this allows, amongst other things, bulletproof glass. + if ( !(tr->contents & clipMask) ) + { + return 0; + } + } + +#ifdef __PLAYERTEST_3DPERSON + hit->ghoulInst = oldInst; +#endif + + return 1; +} + +void CalcFireDirection(edict_t *self, vec3_t fwd, float waverVal, float maxWaver, attacks_e atkID) +{ + vec3_t fireAngs; + float speed; + float waverAmount = 0; + float multifireWaver; + + VectorCopy(self->client->ps.viewangles, fireAngs); + // kef -- add in our sniper rifle's kick (clamp to 90 cuz you might point straight up and fire?) + if (atkID == ATK_SNIPER) + { + VectorAdd(fireAngs, self->client->weaponkick_angles, fireAngs); + if (fireAngs[PITCH] < -90) + { + fireAngs[PITCH] = -90; + } + } + + // 50000 is roughly 225, a standard running speed, squared + speed = DotProduct(self->velocity, self->velocity); + speed *= 3.0 / 50000.0;//max possible miss fire is 30 degrees +// waverAmount += speed; + multifireWaver = ((inven_c *)self->client->inv)->getAnimInfo()->getFireLoop() * waverVal;//cap this at something?getFireLoop() * waverVal;//cap this at something? + //multifireWaver = wAnim(*self)->getFireLoop() * waverVal;//cap this at something? + if(multifireWaver > maxWaver)multifireWaver = maxWaver; + waverAmount += multifireWaver; + + // in realistic dm mode, running affects your aim. so does arm damage. so does using the sniper rifle + // + // 1/25/00 kef -- also, we want the sniper rifle to waver in all dm modes + if(dm->dmRule_REALISTIC_DAMAGE() || (atkID == ATK_SNIPER) ) + { + waverAmount += dm->clientCalculateWaver(*self, (int)atkID); + } + + fireAngs[0] += gi.flrand(-waverAmount, waverAmount); + fireAngs[1] += gi.flrand(-waverAmount, waverAmount); + fireAngs[2] += gi.flrand(-waverAmount, waverAmount); + AngleVectors(fireAngs, fwd, NULL, NULL); +} + +void SetProjVel(edict_t &self, edict_t &newEnt, float fwd, float right, float up) +{ + vec3_t fwdV, rightV, upV; + + if(self.client) + { + AngleVectors(self.client->ps.viewangles, fwdV, rightV, upV); + } + else + { + AngleVectors(self.s.angles, fwdV, rightV, upV); + } + VectorScale(fwdV, fwd, newEnt.velocity); + VectorMA(newEnt.velocity, right, rightV, newEnt.velocity); + VectorMA(newEnt.velocity, up, upV, newEnt.velocity); +} + +void SetProjPhysics(edict_t &self, float friction, float gravity, float airresistance, float bouyancy, float elasticity) +{ + self.movetype = MOVETYPE_TOUCHNOTSOLID; + self.solid = SOLID_NOT; + self.clipmask = MASK_PROJ2; + self.friction = friction; + self.gravity = gravity; + self.airresistance = airresistance; + self.bouyancy = bouyancy; + self.elasticity = elasticity; +} + + +//-------------------------------------------------------------------------------------------- +// +// Various Weapon Help Funcs +// +//-------------------------------------------------------------------------------------------- + +#define COS_OF_15DEG .9659 + +void PerformWallDamage(trace_t tr, vec3_t dir, int size, int markType,int debris) +{ + if((tr.ent->client)||(tr.ent->ai)||(dm->isDM())) + { + return; + } + FX_MakeWallDamage(tr, dir, size, markType,debris); +} + +void AlertEnemiesForDodge(weaponFireInfo_t &wf, vec3_t end, int sourceNode) +{ + vec3_t dir, start; + + VectorCopy(wf.firePoint, start); + CRadiusContent rad(start, 800, 1, sourceNode); + + + VectorSubtract(end, start, dir); + VectorNormalize(dir); + + for(int i = 0; i < rad.getNumFound(); i++) + { + vec3_t enemyDir; + + if(rad.foundEdict(i)->ai) + { + VectorSubtract(rad.foundEdict(i)->s.origin, start, enemyDir); + VectorNormalize(enemyDir); + + float dp = DotProduct(dir, enemyDir); + + if(dp > .9397)//cos of 20 degrees + { + // kef -- want Hawk to yell, "watch where you're shooting, you stupid honky!" or something like that + if ( (strcmp(rad.foundEdict(i)->classname, "m_x_mmerc") == 0) && + (level.time - s_lastHawkShooting > HAWKSHOOTING_DEBOUNCE) ) + { + s_lastHawkShooting = level.time; + // play sound here + gi.sound(rad.foundEdict(i), CHAN_VOICE, gi.soundindex("impact/Hawk/LookOut.adp"), .9, .3, 0); + } + else + { + rad.foundEdict(i)->ai->RegisterShotForDodge(start, end, wf.ent); + } + } + else if(dp > 0)//45 degrees + { + if(gi.inPVS(rad.foundEdict(i)->s.origin, start) || gi.inPVS(rad.foundEdict(i)->s.origin, end)) + { + rad.foundEdict(i)->ai->RegisterShotForReply(start, end, wf.ent); + } + } + + } + } +} + + + +/* +============ +ProjMoveToStart +============ +*/ +edict_t *ProjMoveToStart(edict_t *missile, vec3_t from, vec3_t to) +{ + trace_t trace; + int mask; + + if (missile->clipmask) + mask = missile->clipmask; + else + mask = MASK_PROJ2; + gi.trace (from, missile->mins, missile->maxs, to, missile->owner, mask, &trace); + + if (trace.startsolid || trace.allsolid) + { + VectorCopy(from, missile->s.origin); + gi.linkentity(missile); + return g_edicts; + } + else if (trace.fraction < 0.99) + { + VectorCopy(trace.endpos, missile->s.origin); + gi.linkentity(missile); + return trace.ent; + } + else + { + VectorCopy(to, missile->s.origin); + gi.linkentity(missile); + return NULL; + } +} + + + + + +//-------------------------------------------------------------------------------------------- +// +// Various Weapon Firing Funcs +// +//-------------------------------------------------------------------------------------------- + +void fireKnife(weaponFireInfo_t &wf) +{ + trace_t tr; + vec3_t tempPos, tempPos2; + int weaponDamage; + + weaponDamage = wf.weapon->getDmg(); + + VectorMA(wf.firePoint, 48, wf.fwd, tempPos); + VectorMA(wf.firePoint, -16, wf.fwd, tempPos2); + + gi.polyTrace(wf.firePoint, NULL, NULL, tempPos, wf.ent, MASK_PROJ, &tr, bulletTraceHitCheck); + gi.trace (tempPos2, NULL, NULL, tempPos, wf.ent, MASK_SHOT| MASK_WATER, &tr); + + // 1/17/00 kef - if we hit a buddy, actually hit the buddy's owner + if (GetBuddyOwner(tr.ent)) + { + tr.ent = GetBuddyOwner(tr.ent); + } + + if(tr.fraction < 1.0) + { + PerformWallDamage(tr, wf.fwd, 6, WMRK_SLASH,false);//fixme + + PlayerNoise(wf.ent, tr.endpos, AI_SENSETYPE_SOUND_WEAPON, NULL, 60, 0); + } + + if(tr.ent) + { + if(tr.ent->takedamage && !tr.ent->gibbed) + { + T_Damage (tr.ent, wf.ent, wf.ent, wf.fwd, tr.endpos, tempPos2, weaponDamage, 1, (DT_MELEE|DT_BACKSTAB), MOD_KNIFE_SLASH, wf.weapon->getPenetrate(), wf.weapon->getAbsorb()); + + if(!(lock_blood)) + { + //make the knife bloody only if you hit something that bleeds + if((wf.ent->client)&&((tr.ent->client)||(tr.ent->ai))) + { + sharedEdict_t sh; + + sh.inv=(inven_c *)wf.ent->client->inv; + sh.edict=wf.ent; + sharedEdict_t *saved=sh.inv->getOwner(); + sh.inv->setOwner(&sh); + sh.inv->setBloodyWeapon(1); + sh.inv->setOwner(saved); + } + } + } + + } + clearBulletTraceHits(); +} + +void handleBulletFX(weaponFireInfo_t &wf, trace_t &tr) +{ + if(!dm->isDM()) + { + if(!(wf.ent->client)) + { //fixme - this should really just cull out of the shooter client. Also whiz sounds? + if(level.sight_client) + { + if(tr.ent == level.sight_client) + { + switch(gi.irand(1,2)) + { + case 1: + FX_MakeBulletWhiz(level.sight_client, vec3_up, vec3_origin, 100, 220); + break; + case 2: + gi.sound (level.sight_client, CHAN_AUTO, cracks[gi.irand(0,2)], 1.0, 0, gi.flrand(.1, .25)); + break; + } + } + else if(pointLineIntersect(wf.firePoint, tr.endpos, level.sight_client->s.origin, 128) || (tr.ent == level.sight_client)) + { + SetActionMusic(*level.sight_client); + + //make whizzing noise... + switch(gi.irand(1,3)) + { + case 1: + gi.positioned_sound (tr.endpos, g_edicts, 0, ricochetSounds[gi.irand(0,5)], 1.0, .5, 0); + break; + case 2: + FX_MakeBulletWhiz(level.sight_client, vec3_up, vec3_origin, 100, 220); + break; + case 3: + gi.sound (level.sight_client, CHAN_AUTO, cracks[gi.irand(0,2)], 1.0, 0, gi.flrand(.1, .25)); + break; + } + } + else + { + if(gi.flrand(0, 1) < .3) + { + gi.positioned_sound (tr.endpos, g_edicts, 0, ricochetSounds[gi.irand(0,5)], 1.0, .5, 0); + } + } + } + } + + if(tr.ent == world) + { + if((!(wf.ent->client))||(dm->isDM())) + { + if(wf.weapon->getTracerEf()) + { + if(rand()&1) + { + fxRunner.setPos2(tr.endpos); + if(wf.gunPointSet) + { + fxRunner.exec(wf.weapon->getTracerEf(), wf.gunPoint); + } + else + { + fxRunner.exec(wf.weapon->getTracerEf(), wf.firePoint); + } + } + } + } + else + { + AlertEnemiesForDodge(wf, tr.endpos, gmonster.GetClientNode()); + } + } + if(tr.fraction < 1.0) + { + PlayerNoise(wf.ent, tr.endpos, AI_SENSETYPE_SOUND_WEAPON, NULL, 60, 1, wf.weapon->getDmgFlags()&DT_STEALTHY); + + } + } + else + { + } +} + +void bulletStrikeSpecialSurfaces(weaponFireInfo_t &wf, trace_t &tr) +{ + trace_t tr2; + + gi.trace(wf.firePoint, NULL, NULL, tr.endpos, wf.ent, CONTENTS_WATER|CONTENTS_WINDOW, &tr2); + + if(tr2.contents & CONTENTS_WINDOW) + { //bmodels? +// bool bValidName = (tr2.surface && tr2.surface->textureinfo && tr2.surface->textureinfo->name)?true:false; + + //I only want this to work with glass 'cause all other surfaces kinda suck for being shot through.... + if( ((tr2.surface->flags>>24) == SURF_GLASS) || + ((tr2.surface->flags>>24) == SURF_GLASS_COMPUTER) || + (tr2.ent->material == MAT_GLASS)/* || + (bValidName && strstr(tr2.surface->textureinfo->name,"grate"))*/ ) // I am so, so sorry. + { + T_Damage (tr2.ent, wf.ent, wf.ent, wf.fwd, tr2.endpos, wf.firePoint, wf.weapon->getDmg(), 1, DT_PROJECTILE|wf.weapon->getDmgFlags(), wf.weapon->getMOD()); + + PlayerNoise(wf.ent, tr2.endpos, AI_SENSETYPE_SOUND_WEAPON, NULL, 60, 0); + PerformWallDamage(tr2, wf.fwd, wf.weapon->getBulletSize(), WMRK_BULLETHOLE,gi.irand(0,1));//fixme + IncreaseSpawnIntensity(.2);//breakin' windows is noisy + } + } + else if(tr2.contents & CONTENTS_WATER) + { +// fxRunner.setDir(tr2.plane.normal); + fxRunner.exec("environ/bulletsplash", tr2.endpos); + } + //also handle bubble trailness +} + +extern int evilHackForInvisAttack;//make weapons do no damage if field is set. Sigh. + +CWeaponInfo wInfo[]; + +float shootTime = 0; + +void fireBullet(weaponFireInfo_t &wf) +{ + trace_t tr; + vec3_t endPos; + bool bTraceEntIsADoor = false; + int othermz, tracerfx; + float dmg; + + dmg = wf.weapon->getDmg(); + + // Check to make sure the gun barrel isn't through a wall. + gi.trace(wf.ent->s.origin, NULL, NULL, wf.firePoint, wf.ent, MASK_PROJ, &tr); + + // If the trace was successful, start the "real one". + if (tr.fraction > 0.99) + { + if(wf.weapon->getEffectiveRange() == 128) + { //irk - keep this from being too powerful in the hands of mere mortals - this is the shotgun + VectorMA(wf.firePoint, 256, wf.fwd, endPos); + } + else + { + VectorMA(wf.firePoint, wf.weapon->getEffectiveRange()*3, wf.fwd, endPos); + } + + gi.polyTrace(wf.firePoint, NULL, NULL, endPos, wf.ent, MASK_PROJ, &tr, bulletTraceHitCheck); + + // If realistic damage is set, use the varying waver rather than the varying damage scale for sniper rifle + // + // 1/25/00 kef -- Kramer asked me to use the full-damage-only-there's-waver-when-not-zoomed stuff in + //standard dm as well as realistic + // + // 1/26/00 kef -- and then, mere hours later, I am asked to make this behavior available in singleplay, too. + + // 2/1/00 dk -- this should never be sniper behavior + /* if( (wf.weapon->getDmgFlags()&DT_SNIPER) && (dm->isDM() && !dm->dmRule_REALISTIC_DAMAGE()) ) + { // ew - make sniper weak when not zoomed in + if(wf.ent->client) + { + vec3_t dist; + float fdist; + float dscale; + + VectorSubtract(tr.endpos, wf.firePoint, dist); + fdist = VectorLength(dist); + + dscale = 1.0 - (fdist / 500.0); + if(dscale > 1.0)dscale = 1.0; + float thresh = .2 + .8 * ((95.0 - wf.ent->client->ps.fov)/95.0); + if(dscale < thresh)dscale = thresh; + dmg *= dscale; + // Com_Printf("Dscale is %f(%f)\n", dscale, dmg*dscale); + } + } + else + */ + if (!(wf.weapon->getDmgFlags()&DT_SNIPER)) // sniper rifle damage NOT changed by range + { // take weapon effective range into account + float vlen = wf.weapon->getEffectiveRange()*2 * tr.fraction; + + if(vlen > wf.weapon->getEffectiveRange()) + { + dmg *= wf.weapon->getEffectiveRange() / vlen; + } + } + } + + // we need to keep the client from putting bullethole decals on things like glass doors, cuz + //the decals don't move when the door does. if we pass in WMRK_NONE instead of WMRK_BULLETHOLE, that + //should do it. so check here and make sure what we just shot wasn't a door of some sort. + if (tr.ent && tr.ent->classname) + { + if (strstr(tr.ent->classname, "door")) + { + bTraceEntIsADoor = true; + } + } + + if(!dm->isDM()) + { + if (bTraceEntIsADoor) + { // don't place a bullethole decal + PerformWallDamage(tr, wf.fwd, wf.weapon->getBulletSize(), WMRK_NONE,gi.irand(0,1)); + } + else + { + PerformWallDamage(tr, wf.fwd, wf.weapon->getBulletSize(), WMRK_BULLETHOLE,gi.irand(0,1)); + } + handleBulletFX(wf, tr); + } + else + {//extra lean special death match version of the above + gi.DamageTexture(tr.surface, 25); + othermz = wf.weapon->getMFlashEfDM(); + tracerfx = wf.weapon->getTracerEf(); + if (tr.ent==world) + { + if (wf.weapon->getBigHit()) + { + FX_HandleDMShotBigHitEffects(wf.firePoint, wf.fwd, tr.endpos, wf.ent, tracerfx, wf.inst, othermz); + } + else + { + FX_HandleDMShotHitEffects(wf.firePoint, wf.fwd, tr.endpos, wf.ent, tracerfx, wf.inst, othermz); + } + } + else + { + FX_HandleDMShotEffects(wf.firePoint, wf.fwd, tr.endpos, wf.ent, tracerfx, wf.inst, othermz); + } + } + + if(!evilHackForInvisAttack) + { // sigh sigh sigh + if( !game.cinematicfreeze && + (OnSameTeam(wf.ent, tr.ent)&&(!wf.ent->client))&&((gi.irand(0,10)>5)||(!pointLineIntersect(wf.firePoint, level.sight_client->s.origin, tr.endpos, 12)))) + { //most of the time, we don't want to hit our chums... we look dumb doing that + } //still, we need to let the player force it occasionally so he can feel cool + else + { + T_Damage (tr.ent, wf.ent, wf.ent, wf.fwd, tr.endpos, wf.firePoint, dmg, dmg, DT_PROJECTILE|wf.weapon->getDmgFlags(), wf.weapon->getMOD(), wf.weapon->getPenetrate(), wf.weapon->getAbsorb()); + } + } + bulletStrikeSpecialSurfaces(wf, tr); + + VectorCopy(tr.endpos, wf.endPos); + clearBulletTraceHits(); +} + + +void DelayedTouchFunction(edict_t *self) +{ + self->touch(self, g_edicts, NULL, NULL); +} + + + +// These are for the small rockets that get split off from the big one in the altfire. +void SlugCollide(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t fwd; + + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + AngleVectors(self->s.angles, fwd, 0, 0); + + // could've hit a buddy + if (GetBuddyOwner(other)) + { + other = GetBuddyOwner(other); + } + + if(surf) + { + vec3_t impactDir; + trace_t tr; + + if(surf->flags & SURF_SKY) + { + G_FreeEdict(self); + return; + } + + //I only want this to work with glass 'cause all other surfaces kinda suck for being shot through.... + if( ((surf->flags>>24) == SURF_GLASS) || + ((surf->flags>>24) == SURF_GLASS_COMPUTER) || + (other->material == MAT_GLASS)) + { + T_Damage (other, self, self->owner, fwd, self->s.origin, self->s.origin, 1000, 1, DT_PROJECTILE|DT_MANGLE, MOD_ROCKET); + + PlayerNoise(self->owner, self->s.origin, AI_SENSETYPE_SOUND_WEAPON, NULL, 60, 0); + IncreaseSpawnIntensity(.2);//breakin' windows is noisy + } + + // Damage any textures we might have collided with... + tr.plane = *plane; + tr.surface = surf; + tr.ent = other; + VectorCopy(self->s.origin, tr.endpos); + + // Make sparky's here... + VectorScale(plane->normal, -1, impactDir); + VectorNormalize(impactDir); + + // I'm not going to use PerformWallDamage because it doesn't do anything in deathmatch + FX_MakeWallDamage(tr, impactDir, 10, WMRK_NONE, false);//fixme + } + + // Damage to the hit target is 100, knockback 100 + T_Damage (other, self, self->owner, fwd, self->s.origin, self->s.origin, 100, 100, DT_SEVER, MOD_AUTOSHOTGUN); + + // Damage to others is 60 max, radius 80 + T_RadiusDamage(self, self->owner, 60, other, 80, MOD_AUTOSHOTGUN, DT_MANGLE|DT_DIRECTIONALGORE); + + if (plane) + { + fxRunner.setDir(plane->normal); + } + else + { + fxRunner.setDir(fwd); + } + fxRunner.exec("weapons/world/slugexplode", self->s.origin); + +// BlindingLight(self->s.origin, 1000, 0.7, 0.5); + + G_FreeEdict(self); +} + + +void fireShotgun(weaponFireInfo_t &wf) +{ + edict_t *missile; + + if (dm->isDM()) + { + // Send off muzzle flash effects. + FX_HandleDMMuzzleFlash(wf.firePoint, wf.fwd, wf.ent, wf.inst, wf.weapon->getMFlashEfDM()); + } + + missile = G_Spawn(); + SetProjPhysics(*missile, 1.0, 0, 0, .7, 0); + + // Enemy slugs are different than player slugs... + if(wf.ent->ai) + { + VectorScale(wf.fwd, 600.0, missile->velocity); + } + else + { + VectorScale(wf.fwd, 1200.0, missile->velocity); + } + VectorSet (missile->mins, -1, -1, -1); + VectorSet (missile->maxs, 1, 1, 1); + missile->health = 100; + missile->think = G_FreeEdict; + missile->nextthink = level.time + 5.0; + missile->touch = SlugCollide; + missile->gravity = 0; + vectoangles(wf.fwd, missile->s.angles); + missile->owner = wf.ent; + //invisible? + + fxRunner.setDir(wf.fwd); + if(wf.ent->ai) + { + fxRunner.exec("weapons/world/enemyslug", wf.firePoint); + } + else + { + fxRunner.exec("weapons/world/slugthrow", wf.firePoint); + } + + if (ProjMoveToStart(missile, wf.ent->s.origin, wf.firePoint)) + { + missile->think = DelayedTouchFunction; + missile->nextthink = level.time + 0.1; + } +} + +#define SHOTGUN_CONE .866 +#define SHOTGUN_SPREAD 5.0/180.0*M_PI + +void fireSpas(weaponFireInfo_t &wf) +{ + vec3_t oldDir; + vec3_t side; + vec3_t up; + + vec3_t ang; + trace_t tr; + + int numGuysHit = 0; + + // kef -- a little strange? definitely. + typedef struct + { + edict_t *guy; + vec3_t dmgPoint; + } hitguyinfo_t; + + hitguyinfo_t hitGuys[12]; + int numHits[12]; + + // Make sure that we aren't shooting through a wall. + gi.trace(wf.ent->s.origin, NULL, NULL, wf.firePoint, wf.ent, MASK_PROJ, &tr); + + if (tr.fraction < 0.99) + { // We hit a wall before even reaching the gun barrel. + VectorCopy(wf.ent->s.origin, wf.firePoint); // Let's fire the bullets from the origin then. + } + + vectoangles(wf.fwd, ang); + AngleVectors(ang, wf.fwd, side, up); + + VectorCopy(wf.fwd, oldDir); + + vec3_t safeFwd; + + VectorCopy(wf.fwd, safeFwd); + + fireBullet(wf); + + for(int i = 0; i < 12; i++) + { + VectorMA(wf.fwd, gi.flrand(-.1, .1), side, oldDir); + VectorMA(oldDir, gi.flrand(-.05, .05), up, oldDir); + + VectorNormalize(oldDir); + VectorMA(wf.firePoint, gi.irand(256, 512), oldDir, oldDir); + + gi.trace(wf.firePoint, 0, 0, oldDir, wf.ent, MASK_PROJ, &tr); + // This used to use PROJ2, which meant that pellets would be stopped by windows, and more importantly, fences. + // If a soul can tell me why this should be, please tell me. --Pat +// gi.trace(wf.firePoint, 0, 0, oldDir, wf.ent, MASK_PROJ2, &tr); + + if(tr.fraction < .99) + { + if(tr.ent && (tr.ent->ai || tr.ent->client)) + { + int test = 0; + int found = 0; + + while((test < numGuysHit)&&(!found)) + { + if(hitGuys[test].guy == tr.ent) + { + numHits[test]++; + found = 1; + } + test++; + } + if(!found) + { + hitGuys[test].guy = tr.ent; + VectorCopy(tr.endpos, hitGuys[test].dmgPoint); + numHits[test] = 1; + numGuysHit++; + } + } + else + { + // 12/29/99 kef -- removed DT_DIRECTIONALGORE from the T_Damage calls. shotgun is now DT_SEVER. + //also, the fifth argument (wasn't that a movie) to T_Damage() used to be wf.firePoint. given that + //the arg in question supposedly represents the worldspace intersection of the damage vector and + //the target's bbox, I felt that the use of tr.endpos was warranted. + T_Damage(tr.ent, wf.ent, wf.ent, wf.fwd, tr.endpos, wf.firePoint, 12, 100, + wf.weapon->getDmgFlags(), wf.weapon->getMOD(), wf.weapon->getPenetrate(), wf.weapon->getAbsorb()); + } + } + } + + for(i = 0; i < numGuysHit; i++) + { + if(wf.ent && wf.ent->client) + { + // 12/29/99 kef -- removed DT_DIRECTIONALGORE from the T_Damage calls. shotgun is now DT_SEVER. + //also, the fifth argument (wasn't that a movie) to T_Damage() used to be wf.firePoint. given that + //the arg in question supposedly represents the worldspace intersection of the damage vector and + //the target's bbox, I felt that the use of tr.endpos was warranted. + T_Damage(hitGuys[i].guy, wf.ent, wf.ent, wf.fwd, hitGuys[i].dmgPoint, wf.firePoint, 14*numHits[i], 100, + wf.weapon->getDmgFlags(), wf.weapon->getMOD(), wf.weapon->getPenetrate(), wf.weapon->getAbsorb()); + } + else + { // not the same? I dont' care + if(OnSameTeam(wf.ent, hitGuys[i].guy)) + { + if((gi.irand(1,10) < 3)&&(!pointLineIntersect(wf.firePoint, level.sight_client->s.origin, hitGuys[i].guy->s.origin, 16))) + { //I'm tired of guys always shooting each other + // 12/29/99 kef -- removed DT_DIRECTIONALGORE from the T_Damage calls. shotgun is now DT_SEVER. + //also, the fifth argument (wasn't that a movie) to T_Damage() used to be wf.firePoint. given that + //the arg in question supposedly represents the worldspace intersection of the damage vector and + //the target's bbox, I felt that the use of tr.endpos was warranted. + T_Damage(hitGuys[i].guy, wf.ent, wf.ent, wf.fwd, hitGuys[i].dmgPoint, wf.firePoint, 10*numHits[i], 100, + wf.weapon->getDmgFlags(), wf.weapon->getMOD(), wf.weapon->getPenetrate(), .2);//armor not as useful + } + } + else + { +// Hey, shouldn't we be using a tr.endpos of some sort here instead of wf.firePoint? + // 12/29/99 kef -- removed DT_DIRECTIONALGORE from the T_Damage calls. shotgun is now DT_SEVER. + //also, the fifth argument (wasn't that a movie) to T_Damage() used to be wf.firePoint. given that + //the arg in question supposedly represents the worldspace intersection of the damage vector and + //the target's bbox, I felt that the use of tr.endpos was warranted. + T_Damage(hitGuys[i].guy, wf.ent, wf.ent, wf.fwd, hitGuys[i].dmgPoint, wf.firePoint, 10*numHits[i], 100, + wf.weapon->getDmgFlags()|DAMAGE_NO_KNOCKBACK, wf.weapon->getMOD(), wf.weapon->getPenetrate(), .2);//armor not as useful + } + } + // + // 2/10/00 kef -- this gore effect doesn't make sense if you shoot a tank, heli, or armored guy. + // pluswhich, I think we've got enough blood and gore effects these days to get by + // without this one. If we decide we want it back, put it in bodyhuman::ShowDamage() +/* + vec3_t efDir; + + VectorCopy(oldDir, efDir); + VectorNormalize(efDir); + VectorScale(efDir, -1, efDir); + + vec3_t spot; + + VectorMA(hitGuys[i].guy->s.origin, 16, efDir, spot); + + if(!(lock_blood)) + { + if((!(dm->dmRule_NO_FRIENDLY_FIRE()))||(!OnSameTeam (hitGuys[i].guy, wf.ent))|| + (!dm->isDM() && hitGuys[i].guy->client))//don't do this is single player as it is expensive + { + fxRunner.setDir(efDir); + fxRunner.exec("gore/shotgun", hitGuys[i].guy); + } + } + */ + } + + gi.WriteByte(svc_temp_entity); + gi.WriteByte(TE_SPAS); + gi.WritePosition(wf.firePoint); + VectorScale(safeFwd, 32.0, oldDir); + gi.WritePosition(oldDir);//fixme - maybe angles/pitch? + gi.multicast(wf.firePoint, MULTICAST_PHS); +} + + +// ************************ +// Grenade weapon/item +// ************************ + +void grenadeExplode(edict_t *self) +{ + vec3_t pos; + + IncreaseSpawnIntensity(.4); + VectorCopy(self->s.origin, pos); + pos[2] += 10; + + T_RadiusDamage2(self, self->owner, pos, 200, 40, 200, NULL, MOD_GRENADE, DT_MANGLE|DT_DIRECTIONALGORE); + + fxRunner.exec("weapons/world/grenadeexplode", pos); + BlindingLight(pos, 2000, 0.8, 0.5); + gmonster.RadiusDeafen(self, 130, 250); + + G_FreeEdict(self); +} + + +void grenadeTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + // could've hit a buddy + if (GetBuddyOwner(other)) + { + other = GetBuddyOwner(other); + } + + // In DM, the grenade should explode upon impact. + if (dm->isDM()) + { + if (other->client) // but only on players. + { + grenadeExplode(self); + return; + } + } + + if((VectorLengthSquared(self->velocity) > 100)&&surf) + { + switch(surf->flags>>24) + { + case SURF_SAND_YELLOW: + case SURF_SAND_WHITE: + case SURF_SAND_LBROWN: + case SURF_SAND_DBROWN: + case SURF_SNOW: + case SURF_LIQUID_BLUE: + case SURF_LIQUID_GREEN: + case SURF_LIQUID_ORANGE: + case SURF_LIQUID_BROWN: + case SURF_GRASS_GREEN: + case SURF_GRASS_BROWN: + case SURF_LIQUID_RED: + case SURF_SNOW_LBROWN: + case SURF_SNOW_GREY: + case SURF_LIQUID_BLACK: + case SURF_PAPERWALL: + + break; + + default: + gi.sound(self, CHAN_VOICE, gi.soundindex("Weapons/gren/bounce.wav"), .6, 2, 0); + } + } +} + + +void grenadeThink(edict_t *self) +{ + if (self->health <= 1) + { + if (game.cinematicfreeze) + { + G_FreeEdict(self); + return; + } + grenadeExplode(self); + } + else + { + gmonster.SpookEnemies(self->s.origin, 160, SPOOK_EXPLOSIVE); //hahaha, scare them! + self->health--; + self->nextthink = level.time + 0.1; // 2 seconds with 21 health. + } +} + + +// Generic grenade creation code, for item or weapon. +void createGrenade(edict_t *owner, vec3_t loc, vec3_t vel, qboolean enemy) +{ + edict_t *grenade; + + grenade = G_Spawn(); + game_ghoul.SetSimpleGhoulModel(grenade, "Items/Projectiles", "grenade"); + + if (enemy) + { // The AI needs a fairly non-bouncy grenade to calculate where it will explode. + // Friction, gravity, airresistance, buoyancy, elasticity + SetProjPhysics(*grenade, .7, 1.0, 0, 0, .15); + } + else + { // The player grenade should bounce around a bit for additional distance and a little more uncertainty. + // Friction, gravity, airresistance, buoyancy, elasticity + SetProjPhysics(*grenade, 0.7, 1.0, 0, 0, 0.5); + } + + VectorCopy(loc, grenade->s.origin); + VectorCopy(vel, grenade->velocity); + VectorSet (grenade->mins, -2, -2, -3); + VectorSet (grenade->maxs, 2, 2, 3); + grenade->health = 21; + grenade->think = grenadeThink; + grenade->nextthink = level.time + 0.1; // 2 seconds with 21 health. + grenade->gravity = 1.0; + +// VectorCopy(wf.ent->s.angles, grenade->s.angles); // Who cares what angle the grenade is at? + gi.linkentity(grenade); + grenade->owner = owner; + grenade->touch = grenadeTouch; + grenade->flags = FL_THROWN_WPN; + VectorSet(grenade->avelocity, gi.irand(-300, 300), gi.irand(-300, 300), gi.irand(-300, 300)); + + // Play grenade throwing sound + gi.sound(owner, CHAN_VOICE, gi.soundindex("Weapons/gren/throw.wav"), .6, 1, 0);//fixme - bounce + + if(SV_TestEntityPosition(grenade)) + { + grenade->touch(grenade, g_edicts, 0, 0); + } +} + +// Grenades are weapons when used by enemies. +void fireGrenade(weaponFireInfo_t &wf) +{ + vec3_t vel; + + VectorScale(wf.fwd, wf.vel, vel); + createGrenade(wf.ent, wf.firePoint, vel, true); +} + + +// ************************* +// Rocket launcher weapon +// ************************* + +void MissileRemove(edict_t *self) +{ + G_FreeEdict(self); +} + + +// Player rocket. +void MissileCollide(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t fwd; + + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + AngleVectors(self->s.angles, fwd, 0, 0); + + // could've hit a buddy + if (GetBuddyOwner(other)) + { + other = GetBuddyOwner(other); + } + + if(surf) + { + vec3_t impactDir; + trace_t tr; + + if(surf->flags & SURF_SKY) + { + G_FreeEdict(self); + return; + } + + //I only want this to work with glass 'cause all other surfaces kinda suck for being shot through.... + if( ((surf->flags>>24) == SURF_GLASS) || + ((surf->flags>>24) == SURF_GLASS_COMPUTER) || + (other->material == MAT_GLASS)) + { + T_Damage (other, self, self->owner, fwd, self->s.origin, self->s.origin, 1000, 1, DT_PROJECTILE|DT_MANGLE, MOD_ROCKET); + + PlayerNoise(self->owner, self->s.origin, AI_SENSETYPE_SOUND_WEAPON, NULL, 128, 0); + IncreaseSpawnIntensity(.2);//breakin' windows is noisy + } + + // Damage any textures we might have collided with... + tr.plane = *plane; + tr.surface = surf; + tr.ent = other; + VectorCopy(self->s.origin, tr.endpos); + + // Make sparky's here... + VectorScale(plane->normal, -1, impactDir); + VectorNormalize(impactDir); + + // I'm not going to use PerformWallDamage because it doesn't do anything in deathmatch + FX_MakeWallDamage(tr, impactDir, 20, WMRK_NONE, false);//fixme + } + + IncreaseSpawnIntensity(.4); + + // Damage to the hit target is 250. + T_Damage (other, self, self->owner, fwd, self->s.origin, self->s.origin, 250, 300, DT_MANGLE, MOD_ROCKET); + + // Damage to others is 225 max, 32 min, radius 175 + T_RadiusDamage2(self, self->owner, self->s.origin, 225, 32, 175, other, MOD_ROCKET_SPLASH, DT_MANGLE|DT_DIRECTIONALGORE); + + fxRunner.setDir(fwd); + fxRunner.exec("weapons/world/rocketexplode", self->s.origin); + gmonster.RadiusDeafen(self, 150, 250); + BlindingLight(self->s.origin, 1500, 0.7, 0.5); + + G_FreeEdict(self); +} + + +void MissileCollide2(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ // this is the enemy rocket + vec3_t fwd; + + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + AngleVectors(self->s.angles, fwd, 0, 0); + + // could've hit a buddy + if (GetBuddyOwner(other)) + { + other = GetBuddyOwner(other); + } + + if(surf) + { + vec3_t impactDir; + trace_t tr; + + if(surf->flags & SURF_SKY) + { + G_FreeEdict(self); + return; + } + + //I only want this to work with glass 'cause all other surfaces kinda suck for being shot through.... + if( ((surf->flags>>24) == SURF_GLASS) || + ((surf->flags>>24) == SURF_GLASS_COMPUTER) || + (other->material == MAT_GLASS)) + { + T_Damage (other, self, self->owner, fwd, self->s.origin, self->s.origin, 1000, 1, DT_PROJECTILE|DT_MANGLE, MOD_ROCKET); + + PlayerNoise(self->owner, self->s.origin, AI_SENSETYPE_SOUND_WEAPON, NULL, 128, 0); + IncreaseSpawnIntensity(.2);//breakin' windows is noisy + } + + // Damage any textures we might have collided with... + tr.plane = *plane; + tr.surface = surf; + tr.ent = other; + VectorCopy(self->s.origin, tr.endpos); + + // Make sparky's here... + VectorScale(plane->normal, -1, impactDir); + VectorNormalize(impactDir); + + // I'm not going to use PerformWallDamage because it doesn't do anything in deathmatch + FX_MakeWallDamage(tr, impactDir, 20, WMRK_NONE, false);//fixme + } + + IncreaseSpawnIntensity(.2); + + // Damage to target and others is 225 max, 32 min, radius 175 + T_RadiusDamage2(self, self->owner, self->s.origin, 225, 32, 175, NULL, MOD_ROCKET_SPLASH, DT_MANGLE|DT_ENEMY_ROCKET|DT_DIRECTIONALGORE); + + fxRunner.setDir(fwd); + fxRunner.exec("weapons/world/rocketexplode", self->s.origin); + gmonster.RadiusDeafen(self, 150, 250); + + G_FreeEdict(self); +} + + +void MissileCountdown(edict_t *self) +{ + self->health--; + + // The check on the velocity is admittedly lame, but there are rockets getting stuck that are still thinking. + if (self->health <= 0) + { + G_FreeEdict(self); + } + else if (Vec3IsZero(self->velocity)) + { + self->touch(self, g_edicts, NULL, NULL); + } + else + { + self->nextthink = level.time + 0.1; + } +} + +extern void DamageKnockBack(edict_t *targ, int dflags, int knockback, vec3_t dir); + +void rocketKickback(edict_t *player, vec3_t dir, float amount) +{ + float pitch, time1, time2; + vec3_t knockdir; + + if (!(player->client)) + return; + + pitch = player->client->v_dmg_pitch - amount; + time1 = level.time + (amount/30.0); + time2 = player->client->v_dmg_time + (amount/30.0); + + if (pitch < -20) + player->client->v_dmg_pitch = -20; + else + player->client->v_dmg_pitch = pitch; + + if (time1 > time2) + player->client->v_dmg_time = time1; + else + player->client->v_dmg_time = time2; + + VectorScale(dir, -1.0, knockdir); + + // Blow the player back just a little bit. + DamageKnockBack(player, 0, amount*12, knockdir); +} + +#define ROCKET_SPEED_PLAYER (800.0F) +#define ROCKET_SPEED_ENEMY (550.0F) + +void fireRocket(weaponFireInfo_t &wf) +{ + edict_t *missile; + trace_t tr2; + vec3_t testmins={-2, -2, -2}, testmaxs={2, 2, 2}; + + if (dm->isDM()) + { + // Send off muzzle flash effects. + FX_HandleDMMuzzleFlash(wf.firePoint, wf.fwd, wf.ent, wf.inst, wf.weapon->getMFlashEfDM()); + } + + missile = G_Spawn(); + SetProjPhysics(*missile, 0, 0, 0, 0, 0); + + VectorScale(wf.fwd, ROCKET_SPEED_PLAYER, missile->velocity); + VectorSet (missile->mins, -1, -1, -1); + VectorSet (missile->maxs, 1, 1, 1); + + // Find the location from which to fire this weapon. +// VectorCopy(wf.firePoint, missile->s.origin); + + // Trace from the player origin to the fire point. Stop if we hit anything. + gi.trace(wf.ent->s.origin, testmins, testmaxs, wf.firePoint, wf.ent, MASK_PROJ, &tr2); + VectorCopy(tr2.endpos, missile->s.origin); + + missile->health = 100; // 10 seconds of time to count down + missile->think = MissileCountdown; + missile->nextthink = level.time + 0.1; + missile->touch = MissileCollide; + vectoangles(wf.fwd, missile->s.angles); + gi.linkentity(missile); + missile->owner = wf.ent; + + game_ghoul.SetSimpleGhoulModel(missile, "Weapon/Projectiles/Rocket", "Rocket"); + + // Enemy rockets are different than player rockets... + if(wf.ent->ai) + { + fxRunner.execContinualEffect("weapons/world/rockettrail2", missile); + + VectorScale(wf.fwd, ROCKET_SPEED_ENEMY, missile->velocity);//enemy rockets are a bit different + missile->touch = MissileCollide2; + } + else + { + fxRunner.execContinualEffect("weapons/world/rockettrail_p", missile); // Faster player rocket effect. + } + + missile->s.sound = gi.soundindex("Weapons/Rocket/FlyLP.wav"); + missile->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + + if(SV_TestEntityPosition(missile)) + { + missile->think = DelayedTouchFunction; + missile->nextthink = level.time + 0.1; + } + + // Players should have their view kicked back. + rocketKickback(wf.ent, wf.fwd, 12.0); +} + + +// Each rocket in the altfire for the launcher will launch and then split in two, resulting in a spread. + +#define ROCKETALT_LAUNCHSPEED 700.0F +#define ROCKETALT_SPLITTIME 0.2F +#define ROCKETALT_SPLITSPEED 800.0F + +// These are for the small rockets that get split off from the big one in the altfire. +void MissileSmallCollide(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t fwd; + + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + // could've hit a buddy + if (GetBuddyOwner(other)) + { + other = GetBuddyOwner(other); + } + + AngleVectors(self->s.angles, fwd, 0, 0); + + if(surf) + { + vec3_t impactDir; + trace_t tr; + + if(surf->flags & SURF_SKY) + { + G_FreeEdict(self); + return; + } + + //I only want this to work with glass 'cause all other surfaces kinda suck for being shot through.... + if( ((surf->flags>>24) == SURF_GLASS) || + ((surf->flags>>24) == SURF_GLASS_COMPUTER) || + (other->material == MAT_GLASS)) + { + T_Damage (other, self, self->owner, fwd, self->s.origin, self->s.origin, 1000, 1, DT_PROJECTILE|DT_MANGLE, MOD_ROCKET); + + PlayerNoise(self->owner, self->s.origin, AI_SENSETYPE_SOUND_WEAPON, NULL, 60, 0); + IncreaseSpawnIntensity(.2);//breakin' windows is noisy + } + + // Damage any textures we might have collided with... + tr.plane = *plane; + tr.surface = surf; + tr.ent = other; + VectorCopy(self->s.origin, tr.endpos); + + // Make sparky's here... + VectorScale(plane->normal, -1, impactDir); + VectorNormalize(impactDir); + + // I'm not going to use PerformWallDamage because it doesn't do anything in deathmatch + FX_MakeWallDamage(tr, impactDir, 10, WMRK_NONE, false);//fixme + } + + IncreaseSpawnIntensity(.2); + + // Damage to the hit target is 150. + T_Damage (other, self, self->owner, fwd, self->s.origin, self->s.origin, 150, 175, DT_MANGLE, MOD_ROCKET); + + // Damage to others is 150 max, 32 min, radius 125 + T_RadiusDamage2(self, self->owner, self->s.origin, 200, 32, 150, other, MOD_ROCKET_SPLASH, DT_MANGLE|DT_DIRECTIONALGORE); + + if (plane) + { + fxRunner.setDir(plane->normal); + } + else + { + fxRunner.setDir(fwd); + } + fxRunner.exec("weapons/world/rocketexplode_alt", self->s.origin); + gmonster.RadiusDeafen(self, 100, 150); + BlindingLight(self->s.origin, 1000, 0.7, 0.5); + + G_FreeEdict(self); +} + + +// Take missle and split it into two. +void MissileSplit(edict_t *ent) +{ + vec3_t fwd, up; + vec3_t newdir; + edict_t *missile; + + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(ent); + return; + } + + ent->s.angles[ROLL] += gi.flrand(0, 180); // Spin in a random direction. + AngleVectors(ent->s.angles, fwd, NULL, up); + + // Spawn two missiles, one on either side of the current missile + for (int i=0; i<2; i++) + { + missile = G_Spawn(); + + switch(i) + { + case 0: // Fire to one side... + VectorMA(ent->s.origin, 6.0, up, missile->s.origin); + VectorMA(ent->velocity, 48.0, up, missile->velocity); + break; + default: // ...then to the other. + VectorMA(ent->s.origin, -6.0, up, missile->s.origin); + VectorMA(ent->velocity, -48.0, up, missile->velocity); + break; + } + + SetProjPhysics(*missile, 0, 0, 0, 0, 0); + VectorSet (missile->mins, -1, -1, -1); + VectorSet (missile->maxs, 1, 1, 1); + missile->health = 100; // 10 seconds of time to count down + missile->think = MissileCountdown; + missile->nextthink = level.time + 0.1; + missile->touch = MissileSmallCollide; + VectorCopy(missile->velocity, newdir); + VectorNormalize(newdir); + vectoangles(newdir, missile->s.angles); + + missile->owner = ent->owner; + + game_ghoul.SetSimpleGhoulModel(missile, "Weapon/Projectiles/Rocket", "Rocket"); + + // Make these into small rockets. + Matrix4 m; + IGhoulInst *inst = missile->ghoulInst; + + inst->GetXForm(m); + m.Scale(0.5); + inst->SetXForm(m); + + gi.linkentity(missile); + + fxRunner.execContinualEffect("weapons/world/rockettrail_alt2", missile); // Faster smaller rockets + + missile->s.sound = gi.soundindex("Weapons/Rocket/FlyLP.wav"); + missile->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + + if(SV_TestEntityPosition(missile)) + { + missile->think = DelayedTouchFunction; + missile->nextthink = level.time + 0.1; + } + } + + // Do the effect for splitting. + fxRunner.setDir(fwd); + fxRunner.exec("weapons/world/rocketsplit", ent->s.origin); + G_FreeEdict(ent); +} + + +void fireRocketMulti(weaponFireInfo_t &wf) +{ + int rocketid=-1; + inven_c *invweapon; + vec3_t testmins={-2, -2, -2}, testmaxs={2, 2, 2}; + vec3_t up={0, 0, 1.0}, right={0, -1.0, 0}; + + // The ID for the rocket (which determines where in the spread it goes) + // is based off how many rockets are left in the clip. + if (wf.ent->client) + { + if (dm->isDM()) + { + // Send off muzzle flash effects. + FX_HandleDMMuzzleFlash(wf.firePoint, wf.fwd, wf.ent, wf.inst, wf.weapon->getMFlashEfDM()); + } + + invweapon = (inven_c *)(wf.ent->client->inv); + if (invweapon) + { + rocketid = invweapon->getCurClip(); + + // Since we were not provided with a nice right vector, we must make one. + // BTW, we make it here because a side vector isn't used for the default weapon firing mode. + CrossProduct(wf.fwd, up, right); + } + } + + // Add a little more randomness... + wf.fwd[0] += gi.flrand(-.1, .1); + wf.fwd[1] += gi.flrand(-.1, .1); + wf.fwd[2] += gi.flrand(-.1, .1); + + VectorNormalize(wf.fwd); + + // Fire Slow rocket that will split into two fast little ones. + + edict_t *missile; + trace_t tr2; + + missile = G_Spawn(); + SetProjPhysics(*missile, 0, 0, 0, 0, 0); + VectorScale(wf.fwd, ROCKETALT_LAUNCHSPEED, missile->velocity); + VectorSet (missile->mins, -1, -1, -1); + VectorSet (missile->maxs, 1, 1, 1); + + // Find the location from which to fire this weapon. +// VectorCopy(wf.firePoint, missile->s.origin); + + // Trace from the player origin to the fire point. Stop if we hit anything. + gi.trace(wf.ent->s.origin, testmins, testmaxs, wf.firePoint, wf.ent, MASK_PROJ, &tr2); + VectorCopy(tr2.endpos, missile->s.origin); + + missile->health = 100; + missile->think = MissileSplit; + missile->nextthink = level.time + ROCKETALT_SPLITTIME; + missile->touch = MissileCollide; // If it hits something before splitting, treat like a normal rocket. + vectoangles(wf.fwd, missile->s.angles); + gi.linkentity(missile); + missile->owner = wf.ent; + + game_ghoul.SetSimpleGhoulModel(missile, "Weapon/Projectiles/Rocket", "Rocket"); + + // Initial trail for the slower rocket. + fxRunner.execContinualEffect("weapons/world/rockettrail_alt1", missile); + + missile->s.sound = gi.soundindex("Weapons/Rocket/FlyLP.wav"); + missile->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + + if(SV_TestEntityPosition(missile)) + { + missile->think = DelayedTouchFunction; + missile->nextthink = level.time + 0.1; + } + + // Players should have their view kicked back. + rocketKickback(wf.ent, wf.fwd, 6.0); +} + +void KnifeThrowCollide(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t impactDir, vTemp; + trace_t tr; + Matrix4 m; + bool bHitBModel = false; + + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + if(surf) + { + if(surf->flags & SURF_SKY) + { + G_FreeEdict(self); + return; + } + } + // kef -- I think it's best for all involved if, as soon as we get into this function, we stop + //the knife's spinning. there've been unsubstantiated reports of knives stopping in mid-air but + //still spinning. + VectorClear(self->avelocity); + + // Handle non-surface collisions... + + if (other == self->owner) + { // don't let our own knives hit us + return; + } + if(self->s.sound == 0) + return;//must've stopped moving... + + self->s.sound = 0; + + // could've hit a buddy + if (GetBuddyOwner(other)) + { + other = GetBuddyOwner(other); + } + if(other) + { + bHitBModel = ((other->solid == SOLID_BSP) && (other != &g_edicts[0])); + if(other->takedamage) + { + self->elasticity = 254; // flag this as being a knife + T_Damage (other, self, self->owner, self->movedir, self->s.origin, self->s.origin, 30, 0, DT_MELEE|DT_STEALTHY, MOD_KNIFE_THROWN); + + if (other->ai || other->client) + { + // 253 means the knife hit armor and was dropped via I_Spawn. don't free it. + + if (253 == self->elasticity) + { + // Very important to reset this. heh. + + self->elasticity = 0; + } + else + { + // Just let me go to the great knife graveyard in tha sky. + + self->gravity = 0.0; + G_FreeEdict(self); + } + + return; + } + } + + // Handle bmodel collisions. + + if( bHitBModel || (other->takedamage && (!other->ai)) ) + { + // Handle non-ai entities like bmodels. + + if (plane && plane->normal) + { + tr.plane = *plane; + tr.surface = surf; + tr.ent = other; + FX_WallSparks(self->s.origin, plane->normal, 3); + //VectorScale(plane->normal, -1, impactDir); + //PerformWallDamage(tr, impactDir, 6, WMRK_NONE,false);//fixme + VectorMA(self->s.origin, 20, plane->normal, self->s.origin); + } + else + { + VectorScale(self->velocity, -1, vTemp); + VectorNormalize(vTemp); // ouch + VectorMA(self->s.origin, 40, vTemp, self->s.origin); + } + + // Zero velocity + + VectorClear(self->velocity); + + // Make sure it's laying flat. + + self->ghoulInst->GetXForm(m); + m.Rotate(0, M_PI*-0.5); + m.CalcFlags(); + self->ghoulInst->SetXForm(m); + self->gravity = 1.0; + self->owner = NULL; + + // DM handles things a bit different. + + if(dm->isDM()) + { + // Can't have knives piling up everywhere. + + self->think = G_FreeEdict; + + if(dm->dmRule_INFINITE_AMMO()) + self->nextthink = level.time + 10.0; + else + self->nextthink = level.time + 30.0; + } + + // Turn the knife into a spawned knife waiting to be picked up. + + self->spawnflags|=DROPPED_ITEM; + I_SpawnKnife(self); + self->elasticity=0; + + return; + } + } + + // Otherwise, must've hit a wall. + + if(plane && plane->normal) + { + FX_WallSparks(self->s.origin, plane->normal, 3); + +// if(Vec3IsZero(self->velocity)) + { + vec3_t wallnormal; + + tr.plane = *plane; + tr.surface = surf; + tr.ent = other; + VectorCopy(self->s.origin, tr.endpos); + + // Make sparky's here... + + VectorScale(plane->normal, -1, impactDir); + VectorNormalize(impactDir); + + // Force pitch to match the wall's normal--is this right for floors? + + vectoangles(impactDir, wallnormal); + self->s.angles[YAW] = 0; + self->s.angles[PITCH] = 0;//wallnormal[PITCH]; + self->s.angles[ROLL] = 0;//gi.irand(0, 360); + + PerformWallDamage(tr, impactDir, 6, WMRK_NONE,false);//fixme + + // Zero velocity + + VectorClear(self->velocity); + + // Push the knife out from the wall a bit. + + VectorMA(self->s.origin, 5, plane->normal, self->s.origin); + + self->gravity = 0; + + // DM handles things a bit different. + + if(dm->isDM()) + { + // Can't have knives piling up everywhere. + + self->think = G_FreeEdict; + + if(dm->dmRule_INFINITE_AMMO()) + self->nextthink = level.time + 10.0; + else + self->nextthink = level.time + 30.0; + } + + // Turn the knife into a spawned knife waiting to be picked up. + + self->spawnflags|=DROPPED_ITEM; + I_SpawnKnife(self); + + if (self->ghoulInst) + { + // I would like to make sure the blade is oriented properly wrt to the axis of rotation. But I don't know how. + self->s.angles[PITCH] = wallnormal[PITCH]; + self->s.angles[YAW] = wallnormal[YAW]; + self->ghoulInst->GetXForm(m); + m.Rotate(2, M_PI*-0.5); + m.CalcFlags(); + self->ghoulInst->SetXForm(m); + } + self->owner = NULL; + self->elasticity=0; + } + } +} + +void fireKnifeThrow(weaponFireInfo_t &wf) +{ + edict_t *knife; + + if (game.cinematicfreeze) + { + return; + } + knife = G_Spawn(); + knife->owner = wf.ent; + SetProjPhysics(*knife, 1.0, .05, 0, .7, .4); + VectorMA(wf.firePoint, 10, wf.fwd, knife->s.origin); + VectorScale(wf.fwd, 800.0, knife->velocity); + VectorSet (knife->mins, -1, -1, -1); + VectorSet (knife->maxs, 1, 1, 1); + knife->health = 31337; + knife->think = G_FreeEdict; + knife->nextthink = level.time + 30; + knife->touch = KnifeThrowCollide; + knife->flags = FL_THROWN_WPN; + VectorCopy(wf.ent->s.angles, knife->s.angles); + knife->avelocity[PITCH] = -360 * 6; + gi.linkentity(knife); + + // I guess knives should obey gravity (shouldn't be able to throw them through the sky) + knife->gravity = 0.7; + + knife->owner = wf.ent; + // save velocity so that, after impact, we know from whence the knife came + VectorCopy(knife->velocity, knife->pos1); + + knife->s.sound = gi.soundindex("weapons/knife/throwloop.wav"); + knife->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + + VectorCopy(knife->velocity, knife->movedir); + VectorNormalize(knife->movedir); + + game_ghoul.SetSimpleGhoulModel(knife, "Enemy/Bolt", "w_knife"); + + knife->s.angles[ROLL] += 90; + + Matrix4 m; + + IGhoulInst *inst = knife->ghoulInst; + inst->GetXForm(m); + m.Scale(2.0); + inst->SetXForm(m); + + { // start off inside of something? + trace_t trace; + int mask; + + if (knife->clipmask) + mask = knife->clipmask; + else + mask = MASK_SOLID; + gi.trace (knife->s.origin, knife->mins, knife->maxs, knife->s.origin, knife, mask, &trace); + + if (trace.ent && (trace.ent->svflags & SVF_BUDDY) && (trace.ent->owner != knife->owner) ) + { + KnifeThrowCollide(knife, GetBuddyOwner(trace.ent), NULL, NULL); + } + } +} + +void StarThrowCollide(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t impactDir; + trace_t tr; + Matrix4 m; + bool bHitBModel = false; + + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + // could've hit a buddy + if (GetBuddyOwner(other)) + { + other = GetBuddyOwner(other); + } + + if(surf) + { + if(surf->flags & SURF_SKY) + { + G_FreeEdict(self); + return; + } + } + + fxRunner.stopContinualEffect("weapons/world/startrail", self); + + VectorClear(self->avelocity); + + // Handle non-surface collisions... + + if(self->s.sound == 0) + return;//must've stopped moving... + + self->s.sound = 0; + + self->solid = SOLID_NOT; + + if(other) + { + bHitBModel = ((other->solid == SOLID_BSP) && (other != &g_edicts[0])); + if(other->takedamage) + { + if (NULL == other->client) + { + self->elasticity = 254; // flag this as being a knife unless we hit a client + } + + T_Damage (other, self, self->owner, self->movedir, self->s.origin, self->s.origin, 30, 0, DT_MELEE|DT_STEALTHY, MOD_STAR_THROWN); + + if (other->ai || other->client) + { + G_FreeEdict(self); + return; + } + } + + // Handle bmodel collisions. + + if( bHitBModel || other->takedamage ) + { + // Handle non-ai entities like bmodels. + + if (plane && plane->normal) + { +// tr.plane = *plane; +// tr.surface = surf; +// tr.ent = other; + FX_WallSparks(self->s.origin, plane->normal, 3); +// VectorMA(self->s.origin, 20, plane->normal, self->s.origin); + } + else + { +// VectorScale(self->velocity, -1, vTemp); +// VectorNormalize(vTemp); // ouch +// VectorMA(self->s.origin, 40, vTemp, self->s.origin); + } + + // Zero velocity + + VectorClear(self->velocity); + + // Make sure it's laying flat. + +/* + if (self->ghoulInst) + { + self->ghoulInst->GetXForm(m); + m.Rotate(0, M_PI*-0.5); + m.CalcFlags(); + self->ghoulInst->SetXForm(m); + } +*/ + self->gravity = 1.0; + self->owner = NULL; + + // Can't have stars piling up everywhere. + self->think = G_FreeEdict; + self->nextthink = level.time + 10.0; + + self->elasticity=0; + + return; + } + } + + // Otherwise, must've hit a wall. + + if(plane && plane->normal) + { + FX_WallSparks(self->s.origin, plane->normal, 3); + +// if(Vec3IsZero(self->velocity)) + { + tr.plane = *plane; + tr.surface = surf; + tr.ent = other; + VectorCopy(self->s.origin, tr.endpos); + + // Make sparky's here... + + VectorScale(plane->normal, -1, impactDir); + VectorNormalize(impactDir); + + // Force pitch to match the wall's normal--is this right for floors? + +// vectoangles(impactDir, wallnormal); +// self->s.angles[PITCH] = wallnormal[PITCH]; +// self->s.angles[ROLL] = gi.irand(0, 360); + + PerformWallDamage(tr, impactDir, 6, WMRK_NONE,false);//fixme + + // Zero velocity + + VectorClear(self->velocity); + + // Push the knife out from the wall a bit. + +// VectorMA(self->s.origin, 5, plane->normal, self->s.origin); + + // Make sure it's laying flat. + +/* + if (self->ghoulInst) + { + self->ghoulInst->GetXForm(m); + m.Rotate(2, M_PI*-0.5); + m.CalcFlags(); + self->ghoulInst->SetXForm(m); + } +*/ + self->gravity = 0; + self->owner = NULL; + + // Can't have stars piling up everywhere. + self->think = G_FreeEdict; + self->nextthink = level.time + 10.0; + + self->elasticity=0; + } + } +} + +void fireStarThrow(weaponFireInfo_t &wf) +{ + edict_t *knife; + + knife = G_Spawn(); + knife->classname = "thrown_star"; + SetProjPhysics(*knife, 0.0, 0.0, 0, 0.0, 0.0); + VectorCopy(wf.firePoint, knife->s.origin); + VectorScale(wf.fwd, 500.0, knife->velocity); + VectorSet (knife->mins, -1, -1, -1); + VectorSet (knife->maxs, 1, 1, 1); + knife->health = 10000; + knife->think = G_FreeEdict; + knife->nextthink = level.time + 3; + knife->touch = StarThrowCollide; + + vectoangles(knife->velocity, knife->s.angles); +// VectorCopy(wf.ent->s.angles, knife->s.angles); +// knife->avelocity[PITCH] = -360 * 6; + gi.linkentity(knife); + + // I guess knives should obey gravity (shouldn't be able to throw them through the sky) +// knife->gravity = 0.7; + + knife->owner = wf.ent; + // save velocity so that, after impact, we know from whence the knife came + VectorCopy(knife->velocity, knife->pos1); + + knife->s.sound = gi.soundindex("Weapons/Knife/ThrowLoop.wav"); + knife->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + + VectorCopy(knife->velocity, knife->movedir); + VectorNormalize(knife->movedir); + + game_ghoul.SetSimpleGhoulModel(knife, "Enemy/Bolt", "w_throw_star"); + +// fxRunner.setDir(wf.fwd); +// fxRunner.setPos2(knife->s.origin); + fxRunner.execContinualEffect("weapons/world/startrail", knife); +// fxRunner.exec("weapons/world/startrail", knife); + +// knife->s.angles[ROLL] = 90; +// knife->s.angles[PITCH] = 90; + +// Matrix4 m; + +// knife->ghoulInst->GetXForm(m); +// m.Scale(2.0); +// knife->ghoulInst->SetXForm(m); +} + +void fireTrueMicrowave(weaponFireInfo_t &wf) +{ + trace_t tr2;// this one will determine who needs to hear a nice whizzing sound + vec3_t lastEndpos; + edict_t *buddy; + int maxTest = 0; + vec3_t end; + vec3_t dir, beammin={-3, -3, -3}, beammax={3,3,3}; + + // First check the validity of the microwave beam's starting location... + gi.trace(wf.ent->s.origin, beammin, beammax, wf.firePoint, wf.ent, MASK_PROJ, &tr2); + if (tr2.startsolid) + { // Do nothing but the muzzle flash... + return; + } + else if (tr2.fraction < 0.99) + { + if (tr2.ent == world) + { // Don't go any farther... + fxRunner.setDir(wf.fwd); + fxRunner.setPos2(tr2.endpos); + fxRunner.exec("weapons/world/mpgburst", wf.ent->s.origin); + return; + } + else if (tr2.ent && tr2.ent->takedamage) + { + T_Damage(tr2.ent, wf.ent, wf.ent, dir, wf.firePoint, wf.firePoint, 240, 100, DT_NEURAL, MOD_MPG, wf.weapon->getPenetrate(), wf.weapon->getAbsorb()); + } + } + + buddy = wf.ent; + VectorCopy(wf.firePoint, lastEndpos); + VectorCopy(wf.fwd, dir); // I do this to protect the contents of wf.fwd, which could have been mangled by T_Damage, though it should be fixed now. Sigh. --Pat + + VectorMA(wf.firePoint, 1024, wf.fwd, end); + + do + { + gi.trace (lastEndpos, beammin, beammax, end, buddy, MASK_PROJ, &tr2); + buddy = tr2.ent; + + maxTest++; + + if(!tr2.ent)continue; + if(!tr2.ent->takedamage)continue; + if(tr2.ent == wf.ent)continue; + +// PerformWallDamage(tr2, wf.fwd, wf.weapon->getBulletSize(), WMRK_NONE,gi.irand(0,1)); + + T_Damage(tr2.ent, wf.ent, wf.ent, dir, wf.firePoint, wf.firePoint, 240, 100, DT_NEURAL, MOD_MPG, wf.weapon->getPenetrate(), wf.weapon->getAbsorb()); + + VectorCopy(tr2.endpos, lastEndpos); + + }while((tr2.fraction < .999)&&(maxTest < 12)&&(tr2.ent != world)); + + fxRunner.setDir(wf.fwd); + fxRunner.setPos2(tr2.endpos); + //fxRunner.exec("weapons/world/mpgpurple", wf.firePoint); + fxRunner.exec("weapons/world/mpgburst", wf.firePoint); + + //vidfxRunner.exec("weapons/world/mpgnew", wf.firePoint); +} + +void SetGenericEffectInfo(edict_t *ent); + +void fireEnemyMWave(edict_t *self) +{ + if(self->owner && self->owner->inuse && self->owner->health > 0) + { + weaponFireInfo_t wf; + + VectorCopy(self->s.origin, wf.firePoint); + VectorCopy(self->s.angles, wf.fwd); + wf.ent = self->owner; + wf.gunPointSet = 0; + wf.weapon = &weapons.getWeapon(ATK_MICROWAVE_ALT); + wf.inst = 0; + + fireTrueMicrowave(wf); + } + G_FreeEdict(self); +} + +void fireMicro(weaponFireInfo_t &wf) +{ + if(wf.ent && wf.ent->client) + { + fireTrueMicrowave(wf); + + if (dm->isDM()) + { + // Send off muzzle flash effects. + FX_HandleDMMuzzleFlash(wf.firePoint, wf.fwd, wf.ent, wf.inst, wf.weapon->getMFlashEfDM()); + } + } + else + {//there needs to be a delay on the guys because otherwise they are not fun nor are they fair + edict_t *newEnt; + + newEnt = G_Spawn(); + SetGenericEffectInfo(newEnt); + newEnt->nextthink = level.time + ENEMY_MWAVE_DELAY; + newEnt->think = fireEnemyMWave; + newEnt->owner = wf.ent; + VectorCopy(wf.firePoint, newEnt->s.origin); + VectorCopy(wf.fwd, newEnt->s.angles); + } +} + +void CharThink(edict_t *self) +{ + IGhoulInst *inst = self->owner->ghoulInst; + + if(!self->owner->inuse) + { + G_FreeEdict(self); + return; + //hopefully this is enough + } + + self->nextthink = level.time + .1; + + if(inst) + { + float r, g, b, a; + + inst->GetTint(&r, &g, &b, &a); + r-=.05; + g-=.05; + b-=.05; + if(r < .1)r = .1; + if(g < .1)g = .1; + if(b < .1)b = .1; + inst->SetTintOnAll(r, g, b, a); + if ((FloatIsZeroEpsilon(r-.1)) && (FloatIsZeroEpsilon(g-.1)) && (FloatIsZeroEpsilon(b-.1))) + { + G_FreeEdict(self); + return; + } + } + + +} + +void WhiteThink(edict_t *self) +{ + edict_t *curSearch = 0; + float dist; + vec3_t diff; + vec3_t exppos; + trace_t tr2; + + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + //FX_WhiteBlast(self->s.origin); + fxRunner.exec("weapons/world/phosexplode", self->s.origin); + + IncreaseSpawnIntensity(.3); + + VectorCopy(self->s.origin, exppos); + exppos[2] += 8; + CRadiusContent rad(exppos, 120); + + for(int i = 0; i < rad.getNumFound(); i++) + { + curSearch = rad.foundEdict(i); + + if(curSearch->client || curSearch->ai) + { + //FX_WhiteBurn(curSearch); + //gi.sound (self, CHAN_BODY, gi.soundindex ("impact/gore/sizzle.wav"), .8, ATTN_NORM, 0); + + gi.trace(exppos, vec3_origin, vec3_origin, curSearch->s.origin, self, MASK_SOLID, &tr2); + if (tr2.fraction < 0.99) + continue; + + // Start a burning, make sure we're not overlapping multiple copies of the same effect. + if (curSearch->phosburntime <= level.time) + { + if (curSearch->ghoulInst) + { + fxRunner.exec("weapons/world/phosburn", curSearch, 0); + } + + curSearch->phosburntime = level.time + 2.0; + } + else + { + curSearch->phosburntime += 0.5; + } + curSearch->burninflictor = self->owner; + + VectorSubtract(self->s.origin, curSearch->s.origin, diff); + dist = VectorLength(diff); + T_Damage(curSearch, self, self->owner, vec3_up, curSearch->s.origin, curSearch->s.origin, + (int)((150.0-dist)*0.5), 1, DT_FIRE, MOD_PHOS_GRENADE); + } + } + + G_FreeEdict(self); +} + +void PhosTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + // could've hit a buddy + if (GetBuddyOwner(other)) + { + other = GetBuddyOwner(other); + } + + if((other->ai)||(other->client)) + { + self->think(self); + } + else if(VectorLength(self->velocity)) + { + gmonster.SpookEnemies(self->s.origin, 160, SPOOK_EXPLOSIVE); + + if(surf) + { + switch(surf->flags>>24) + { + case SURF_SAND_YELLOW: + case SURF_SAND_WHITE: + case SURF_SAND_LBROWN: + case SURF_SAND_DBROWN: + case SURF_SNOW: + case SURF_LIQUID_BLUE: + case SURF_LIQUID_GREEN: + case SURF_LIQUID_ORANGE: + case SURF_LIQUID_BROWN: + case SURF_GRASS_GREEN: + case SURF_GRASS_BROWN: + case SURF_LIQUID_RED: + case SURF_SNOW_LBROWN: + case SURF_SNOW_GREY: + case SURF_LIQUID_BLACK: + case SURF_PAPERWALL: + + break; + + default: + gi.sound(self, CHAN_VOICE, gi.soundindex("Weapons/gren/bounce.wav"), .6, 2, 0); + } + } + } +} + +void firePhosphorusGrenade(weaponFireInfo_t &wf) +{ + edict_t *grenade; + vec3_t ang; + vec3_t up, right; + + if (dm->isDM()) + { + // Send off muzzle flash effects. + FX_HandleDMMuzzleFlash(wf.firePoint, wf.fwd, wf.ent, wf.inst, wf.weapon->getMFlashEfDM()); + } + + vectoangles(wf.fwd, ang); + AngleVectors(ang, NULL, right, up); + + grenade = G_Spawn(); + game_ghoul.SetSimpleGhoulModel(grenade, "Items/Projectiles", "grenade"); + + SetProjPhysics(*grenade, 0.7, 1.0, 0, 0, 0.7); + if(wf.gunPointSet) + { + VectorCopy(wf.gunPoint, grenade->s.origin); + } + else + { + VectorCopy(wf.firePoint, grenade->s.origin); + } + grenade->s.origin[2] -= 16; + VectorScale(wf.fwd, 600.0, grenade->velocity); + VectorMA(grenade->velocity, gi.flrand(100, 300), up, grenade->velocity); + VectorSet (grenade->mins, -2, -2, -3); + VectorSet (grenade->maxs, 2, 2, 3); + grenade->think = WhiteThink; + grenade->nextthink = level.time + 1.5; + VectorCopy(wf.ent->s.angles, grenade->s.angles); + gi.linkentity(grenade); + grenade->owner = wf.ent; + grenade->flags = FL_THROWN_WPN; // Makes it deal with hitting lean buddies. + grenade->touch = PhosTouch; + + fxRunner.execContinualEffect("weapons/world/phostrail", grenade); + + if(SV_TestEntityPosition(grenade)) + { + grenade->touch(grenade, g_edicts, 0, 0); + } +} + +void fireMegaRocket(weaponFireInfo_t &wf) +{ +} + +void concGrenTouch(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + + edict_t *curSearch = 0; + float dist, factor; + vec3_t diff; + int dmg; + vec3_t exppos; + trace_t tr2; + + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + if(surf) + { + if(surf->flags & SURF_SKY) + { + G_FreeEdict(self); + return; + } + } + + if (plane) + { + fxRunner.setDir(plane->normal); + } + fxRunner.exec("weapons/world/sluggren", self->s.origin); + + IncreaseSpawnIntensity(.1); + + if (plane) + VectorMA(self->s.origin, 8.0, plane->normal, exppos); + else + VectorCopy(self->s.origin, exppos); + CRadiusContent rad(exppos, 210); + + for(int i = 0; i < rad.getNumFound(); i++) + { + curSearch = rad.foundEdict(i); + + if(curSearch->client || curSearch->ai || curSearch->takedamage) + { + gi.trace(exppos, vec3_origin, vec3_origin, curSearch->s.origin, self, MASK_SOLID, &tr2); + if (tr2.fraction < 0.99) + continue; + + VectorSubtract(curSearch->s.origin, self->s.origin, diff); + dist = VectorNormalize(diff); + factor = 1.0 - (dist/250.0); + dmg = 400*factor; + + if (curSearch == self->owner) + { // Halve the damage and effect to the owner... + dmg *= 0.5; + } + + if (curSearch->client) + { // People want it to do more damage to players, since they don't get stunned so much. + T_Damage(curSearch, self, self->owner, diff, self->s.origin, curSearch->s.origin, + dmg*0.15, dmg, DAMAGE_ALL_KNOCKBACK, MOD_CONC_GRENADE); + } + else + { + T_Damage(curSearch, self, self->owner, diff, self->s.origin, curSearch->s.origin, + dmg*0.05, dmg*0.6, DAMAGE_ALL_KNOCKBACK, MOD_CONC_GRENADE); + } + + // Blind, shake curSearch. + if (curSearch->client) + { // Was a player! + curSearch->client->blinding_alpha += (0.2 + factor); + if (curSearch->client->blinding_alpha > 0.95) + curSearch->client->blinding_alpha = 0.95; + + if (curSearch->client->blinding_alpha_delta <= 0 || curSearch->client->blinding_alpha_delta > 0.15) + { + curSearch->client->blinding_alpha_delta = 0.15; + } + + FX_SetEvent_Data(curSearch, EV_CAMERA_SHAKE_LIGHT + (int)(3.2*factor), DEFAULT_JITTER_DELTA); + } + else if (curSearch->ai) + { // Tis a monster! + curSearch->ai->MuteSenses(sight_mask, 25, smute_recov_linear, 25); + } + } + } + + G_FreeEdict(self); +} + +void fireConcGrenade(weaponFireInfo_t &wf) +{ + edict_t *missile; + vec3_t ang; + vec3_t up, right; + + if (dm->isDM()) + { + // Send off muzzle flash effects. + FX_HandleDMMuzzleFlash(wf.firePoint, wf.fwd, wf.ent, wf.inst, wf.weapon->getMFlashEfDM()); + } + + vectoangles(wf.fwd, ang); + AngleVectors(ang, NULL, right, up); + + missile = G_Spawn(); + //gi.setmodel(missile,"models/uganda/chainsaw/tris.fm"); + game_ghoul.SetSimpleGhoulModel(missile, "Items/Projectiles", "grenade"); + + SetProjPhysics(*missile, 1.0, 1.0, 0, 0, 0.0); + VectorScale(wf.fwd, 800, missile->velocity); + missile->velocity[2] += 150; + VectorSet (missile->mins, -2, -2, -3); + VectorSet (missile->maxs, 2, 2, 3); + missile->think = G_FreeEdict; + missile->nextthink = level.time + 6; + missile->gravity = 1.0; + VectorCopy(wf.ent->s.angles, missile->s.angles); + missile->owner = wf.ent; + missile->avelocity[PITCH] = 1000; + missile->health = 40; + missile->touch = concGrenTouch; + + fxRunner.execContinualEffect("weapons/world/conctrail", missile); + + if(ProjMoveToStart(missile, wf.ent->s.origin, wf.firePoint)) + { + missile->think = DelayedTouchFunction; + missile->nextthink = level.time + 0.1; + } +} + +void fireMicrowaveCone(weaponFireInfo_t &wf) +{ + trace_t tr2;// this one will determine who needs to hear a nice whizzing sound + vec3_t lastEndpos; + edict_t *buddy; + int maxTest = 0; + vec3_t end, dir, minmove; + int damage; + + // First check the validity of the microwave beam's starting location... + gi.trace(wf.ent->s.origin, vec3_origin, vec3_origin, wf.firePoint, wf.ent, MASK_PROJ, &tr2); + if (tr2.startsolid) + { // Do nothing but the muzzle flash... + return; + } + else if (tr2.fraction < 0.99) + { + if (tr2.ent == world) + { // Don't go any farther... + fxRunner.setDir(wf.fwd); + fxRunner.setPos2(tr2.endpos); + fxRunner.exec("weapons/othermz/mpgbeam1", wf.ent->s.origin, MULTICAST_PHS, wf.ent); + return; + } + else if (tr2.ent && tr2.ent->takedamage) + { + T_Damage(tr2.ent, wf.ent, wf.ent, dir, wf.firePoint, wf.firePoint, 20, 0/*knockback*/, DT_SHOCK, MOD_MPG, wf.weapon->getPenetrate(), wf.weapon->getAbsorb()); + Electrocute(tr2.ent, wf.ent); + } + } + + buddy = wf.ent; + VectorCopy(wf.firePoint, lastEndpos); + VectorCopy(wf.fwd, dir); // I do this to protect the contents of wf.fwd, which could have been mangled by T_Damage, though it should be fixed now. Sigh. --Pat + + VectorMA(wf.firePoint, 1024, wf.fwd, end); + VectorScale(wf.fwd, 8, minmove); + + // Because I'm a lazy bastard, subtract 8 before this test. + VectorSubtract(lastEndpos, minmove, lastEndpos); + do + { + VectorAdd(lastEndpos, minmove, lastEndpos); + + gi.trace (lastEndpos, vec3_origin, vec3_origin, end, buddy, MASK_PROJ, &tr2); + buddy = tr2.ent; + + maxTest++; + + if(!tr2.ent)continue; + if(tr2.ent == wf.ent)continue; + if(!tr2.ent->takedamage)continue; + + if (tr2.ent->zapdmgtime <= level.time) + { + if (dm->isDM()) + { + damage = 4; + tr2.ent->zapdmgtime = level.time + 0.4; + + // Play a sizzle sound, but only when the burn is new... + gi.sound (tr2.ent, CHAN_BODY, gi.soundindex ("Ambient/Gen/Electric/spark2.wav"), 1.0, ATTN_IDLE, 0); + } + else + { + damage = 2; + tr2.ent->zapdmgtime = level.time + 0.2; + } + } + else + { // The longer we hold it on the target, the more damage we do. + if (dm->isDM()) + { + damage = (tr2.ent->zapdmgtime - level.time)*30.0; + tr2.ent->zapdmgtime += 0.4; + } + else + { + damage = (tr2.ent->zapdmgtime - level.time)*15.0; + tr2.ent->zapdmgtime += 0.2; + } + } + + T_Damage(tr2.ent, wf.ent, wf.ent, dir, wf.firePoint, wf.firePoint, damage, 0/*knockback*/, DT_SHOCK, MOD_MPG, wf.weapon->getPenetrate(), wf.weapon->getAbsorb()); + Electrocute(tr2.ent, wf.ent); + + // Bring down friction just a tad so he notices... + if (tr2.ent->client) + { + tr2.ent->client->friction_time = level.time + 0.8; + } + + VectorCopy(tr2.endpos, lastEndpos); + + }while((tr2.fraction < .999)&&(maxTest < 12)&&(tr2.ent != world)); + + fxRunner.setPos2(tr2.endpos); + + if(wf.gunPointSet) + { + fxRunner.setDir(wf.fwd); + + if ((int)(level.time*10)&0x01) + { + fxRunner.exec("weapons/othermz/mpgbeam1", wf.gunPoint, MULTICAST_PHS, wf.ent); + } + else + { + fxRunner.exec("weapons/othermz/mpgbeam2", wf.gunPoint, MULTICAST_PHS, wf.ent); + } + } + else + { + vec3_t gunpoint; + vec3_t newfwd; + + if (dm->isDM() && wf.ent->ghoulInst) + { + GetGhoulPosDir(wf.ent->s.origin, wf.ent->s.angles, wf.ent->ghoulInst, 0, "wbolt_hand_l", gunpoint, 0, 0, 0); + VectorSubtract(tr2.endpos, gunpoint, newfwd); + VectorNormalize(newfwd); + } + else + { + VectorCopy(wf.firePoint, gunpoint); + VectorCopy(wf.fwd, newfwd); + } + + fxRunner.setDir(newfwd); + + if ((int)(level.time*10)&0x01) + { + fxRunner.exec("weapons/othermz/mpgbeam1", gunpoint, MULTICAST_PHS, wf.ent); + } + else + { + fxRunner.exec("weapons/othermz/mpgbeam2", gunpoint, MULTICAST_PHS, wf.ent); + } + } +} + + +void fireballRemove(edict_t *self) +{ + G_FreeEdict(self); +} + +void fireballBurn(edict_t *self) +{ + T_RadiusDamage (self, self->owner, self->health*2, self, 100, MOD_FLAMEGUN_NAPALM, DT_FIRE|DAMAGE_NO_ARMOR); + if (--(self->health) <= 0) + { + G_FreeEdict(self); + } + else + { + self->nextthink = level.time + 0.2; + } +} + +void fireballCollide(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + vec3_t fwd; + + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + if (self->health <= 0 || (plane && plane->normal[2] > 0.5)) + { + if(surf) + { + if(surf->flags & SURF_SKY) + { + G_FreeEdict(self); + return; + } + } + + IncreaseSpawnIntensity(.3); + T_RadiusDamage (self, self->owner, 300, self, 150, MOD_FLAMEGUN_NAPALM, DT_MANGLE|DT_FIRE); + gmonster.RadiusDeafen(self, 300, 300); + + AngleVectors(self->s.angles, fwd, NULL, NULL); + fxRunner.clearContinualEffects(self); + + fxRunner.setDir(fwd); + fxRunner.exec("weapons/world/fballimpact", self->s.origin); + + VectorClear(self->velocity); + self->movetype = MOVETYPE_NONE; + self->think = fireballBurn; + self->health = 15; + self->nextthink = level.time + 0.2; + } + else + { + self->health--; + } +} + + +void flameGlobThink(edict_t *ent) +{ + G_FreeEdict(ent); +} + +void fireFlameGlob(weaponFireInfo_t &wf) +{ + edict_t *fireball; + + vec3_t up, right; + + fireball = G_Spawn(); + SetProjPhysics(*fireball, 1.0, (1300.0/800.0), 0, 0, 0.3); + fireball->clipmask = CONTENTS_SOLID|CONTENTS_WINDOW; + VectorScale(wf.fwd, 600.0, fireball->velocity); + VectorSet (fireball->mins, -2, -2, -3); + VectorSet (fireball->maxs, 2, 2, 3); + fireball->health = 5; + fireball->think = fireballRemove; + fireball->nextthink = level.time + 10.0; + fireball->touch = fireballCollide; + vectoangles(wf.fwd, fireball->s.angles); + + AngleVectors(fireball->s.angles, wf.fwd, right, up); + VectorMA(fireball->velocity, 100, up, fireball->velocity); + + // We want to add extra velocity UP, not the relative up. However, I am meeting this halfway. + fireball->velocity[2] += 150; + fireball->owner = wf.ent; + + // I don't want the client to see this + if(ProjMoveToStart(fireball, wf.ent->s.origin, wf.firePoint)) + { + fireball->think = DelayedTouchFunction; + fireball->nextthink = level.time + 0.1; + } + + fxRunner.execContinualEffect("weapons/world/fballtrail", fireball, 0, 1.0); + + if (dm->isDM()) + { + // Send off muzzle flash effects. + FX_HandleDMMuzzleFlash(wf.firePoint, wf.fwd, wf.ent, wf.inst, wf.weapon->getMFlashEfDM()); + } +} + + +void fireFlameThrower(weaponFireInfo_t &wf) +{ + // need to make the visual effect as well + vec3_t flamemin={-1,-1,-1}, flamemax={1,1,1}; + + fxRunner.setDir(wf.fwd); + if(wf.gunPointSet) + { + fxRunner.exec("weapons/world/fthrower", wf.gunPoint, MULTICAST_PHS, wf.ent); + } + else + { + if (dm->isDM() && wf.ent->ghoulInst) + { + vec3_t gunpoint; + + GetGhoulPosDir(wf.ent->s.origin, wf.ent->s.angles, wf.ent->ghoulInst, 0, "wbolt_hand_l", gunpoint, 0, 0, 0); + fxRunner.exec("weapons/world/fthrower", gunpoint, MULTICAST_PHS, wf.ent); + } + else + { + fxRunner.exec("weapons/world/fthrower", wf.firePoint, MULTICAST_PHS, wf.ent); + } + } + + trace_t tr2;// this one will determine who needs to hear a nice whizzing sound + vec3_t lastEndpos; + edict_t *buddy; + int maxTest = 0; + vec3_t end, diff, dir; + vec3_t minmove; + + buddy = wf.ent; + VectorCopy(wf.firePoint, lastEndpos); + VectorCopy(wf.fwd, dir); // I do this to protect the contents of wf.fwd, which could have been mangled by T_Damage, though it should be fixed now. Sigh. --Pat + + // First check the validity of the flamethrower's starting location... + gi.trace(wf.ent->s.origin, flamemin, flamemax, wf.firePoint, wf.ent, MASK_PROJ, &tr2); + if (tr2.startsolid) + { // Do nothing but the muzzle flash... + return; + } + else if (tr2.fraction < 0.99) + { + if (tr2.ent == world) + { // Don't go any farther... + return; + } + else if (tr2.ent && tr2.ent->takedamage) + { + if (dm->isDM()) + { // In multiplayer, damage is higher. + T_Damage(tr2.ent, wf.ent, wf.ent, dir, wf.firePoint, wf.firePoint, 16, 0, DT_FIRE|DAMAGE_NO_KNOCKBACK, MOD_FLAMEGUN, wf.weapon->getPenetrate(), wf.weapon->getAbsorb()); + } + else + { + T_Damage(tr2.ent, wf.ent, wf.ent, dir, wf.firePoint, wf.firePoint, 10, 0, DT_FIRE|DAMAGE_NO_KNOCKBACK, MOD_FLAMEGUN, wf.weapon->getPenetrate(), wf.weapon->getAbsorb()); + } + } + } + + if (dm->isDM()) + { // Range of FT in DM is 325 + VectorMA(wf.firePoint, 325, wf.fwd, end); + } + else + { // Range of FT is 280 + VectorMA(wf.firePoint, 280, wf.fwd, end); + } + + VectorScale(wf.fwd, 8, minmove); + // Because I am lame, I'm going to subtract 8 here to counteract the first add... + VectorSubtract(lastEndpos, minmove, lastEndpos); + + do + { + VectorAdd(lastEndpos, minmove, lastEndpos); + + gi.trace (lastEndpos, flamemin, flamemax, end, buddy, MASK_PROJ, &tr2); + buddy = tr2.ent; + + maxTest++; + + if(!tr2.ent)continue; + if(tr2.ent == wf.ent)continue; + if(tr2.ent->solid == SOLID_BSP && ((int)(level.time*10))&0x01) // Every other time + { + VectorSubtract(wf.firePoint, tr2.endpos, diff); + if (VectorLength(diff) < 175) // Only do a hit on a wall after 3/4 the distance... + { + fxRunner.setDir(tr2.plane.normal); + fxRunner.exec("weapons/world/flamehitwall", tr2.endpos); + } + } + if(!tr2.ent->takedamage)continue; + + if (dm->isDM()) + { // In multiplayer, damage is higher. + T_Damage(tr2.ent, wf.ent, wf.ent, dir, wf.firePoint, wf.firePoint, 16, 0, DT_FIRE|DAMAGE_NO_KNOCKBACK, MOD_FLAMEGUN, wf.weapon->getPenetrate(), wf.weapon->getAbsorb()); + } + else + { + T_Damage(tr2.ent, wf.ent, wf.ent, dir, wf.firePoint, wf.firePoint, 10, 0, DT_FIRE|DAMAGE_NO_KNOCKBACK, MOD_FLAMEGUN, wf.weapon->getPenetrate(), wf.weapon->getAbsorb()); + } + VectorCopy(tr2.endpos, lastEndpos); + + if (((int)(level.time*10))&0x01) // Every other time + { + Ignite(tr2.ent, wf.ent, 1); + } + }while((tr2.fraction < .999)&&(maxTest < 3)&&(tr2.ent != world)); +} + +void fireDogAttack(weaponFireInfo_t &wf) +{ + trace_t tr; + vec3_t tempPos, tempPos2; + int weaponDamage; + float fNow = level.time; + + weaponDamage = wf.weapon->getDmg(); + + VectorMA(wf.firePoint, 48, wf.fwd, tempPos); + VectorMA(wf.firePoint, -16, wf.fwd, tempPos2); + + gi.trace (tempPos2, NULL, NULL, tempPos, wf.ent, MASK_SHOT| MASK_WATER, &tr); + + if(tr.fraction < 1.0) + { + //PerformWallDamage(tr, wf.fwd, 6, WMRK_SLASH,false);//fixme + } + + if(tr.ent) + { + // let our body know we hit someone + if (tr.fraction < 1.0 && wf.hitfunc) + { + wf.hitfunc(wf.ent, &fNow); + } + + if(tr.ent->takedamage) + { + T_Damage (tr.ent, wf.ent, wf.ent, wf.fwd, tr.endpos, tempPos2, weaponDamage, 100, DT_MELEE, MOD_DOGBITE); + } + } +} + +void molitovCollide(edict_t *self, edict_t *other, cplane_t *plane, mtexinfo_t *surf) +{ + if(game.cinematicfreeze) + { // We are in a cinematic, remove all volatile objects. + G_FreeEdict(self); + return; + } + + //fxRunner.exec("weapons/world/molitovexplode", self->s.origin); + fxRunner.exec("weapons/world/molitovburst", self->s.origin); + + // Do the damage before burning people. + T_RadiusDamage (self, self->owner, 50, self, 150, MOD_FIRE, DT_FIRE); + RadiusBurn(self, 150); + + G_FreeEdict(self); +} + +void MolitovThink(edict_t *self) +{ // this shouldn't happen + G_FreeEdict(self); +} + +void fireMolitov(weaponFireInfo_t &wf) +{ + edict_t *missile; + vec3_t ang; + vec3_t up, right; + + vectoangles(wf.fwd, ang); + AngleVectors(ang, NULL, right, up); + + missile = G_Spawn(); + game_ghoul.SetSimpleGhoulModel(missile, "Items/Projectiles", "w_molitov"); + + SetProjPhysics(*missile, 0.7, 1.0, 0, 0, 0); + VectorCopy(wf.firePoint, missile->s.origin); + VectorScale(wf.fwd, wf.vel, missile->velocity); + VectorSet (missile->mins, -2, -2, -3); + VectorSet (missile->maxs, 2, 2, 3); + missile->think = MolitovThink; + missile->nextthink = level.time + 4.0; + VectorCopy(wf.ent->s.angles, missile->s.angles); + gi.linkentity(missile); + missile->owner = wf.ent; +// missile->avelocity[PITCH] = 300;//? +// missile->avelocity[YAW] = 300;//? + missile->avelocity[ROLL] = 300;//? + missile->touch = molitovCollide; + + //fxRunner.execContinualEffect("weapons/world/molitovtrail", missile); + fxRunner.execContinualEffect("weapons/world/molitrail2", missile); + + if(SV_TestEntityPosition(missile)) + { + missile->think = DelayedTouchFunction; + missile->nextthink = level.time + 0.1; + } +} + +void fireGasGren(weaponFireInfo_t &wf) +{ //fixme + fireGrenade(wf); +} + +void fireMagicBullet(weaponFireInfo_t &wf) +{ +} + +void fireAutogun(weaponFireInfo_t &wf) +{ + fireBullet(wf); +} + +void flashpackFunc(edict_t &ent); + +void fireFlashGren(weaponFireInfo_t &wf) +{ + flashpackFunc(*wf.ent); +} + +void fireMachete(weaponFireInfo_t &wf) +{ + fireKnife(wf); +} + +void fireDekker(weaponFireInfo_t &wf) +{ + trace_t tr2;// this one will determine who needs to hear a nice whizzing sound + vec3_t lastEndpos; + edict_t *buddy; + int maxTest = 0; + vec3_t end; + + buddy = wf.ent; + VectorCopy(wf.firePoint, lastEndpos); + + VectorMA(wf.firePoint, 1024, wf.fwd, end); + + do + { + gi.trace (lastEndpos, vec3_origin, vec3_origin, end, buddy, MASK_PROJ, &tr2); + buddy = tr2.ent; + + maxTest++; + + if(!tr2.ent)continue; + if(!tr2.ent->takedamage)continue; + if(tr2.ent == wf.ent)continue; + + PerformWallDamage(tr2, wf.fwd, wf.weapon->getBulletSize(), WMRK_NONE,gi.irand(0,1)); + + T_Damage(tr2.ent, wf.ent, wf.ent, wf.fwd, wf.firePoint, wf.firePoint, 240, 100, DT_NEURAL|DT_WATERZAP, MOD_MPG, wf.weapon->getPenetrate(), wf.weapon->getAbsorb()); + VectorCopy(tr2.endpos, lastEndpos); + + }while((tr2.fraction < .999)&&(maxTest < 12)&&(tr2.ent != world)); + + fxRunner.setDir(wf.fwd); + fxRunner.setPos2(tr2.endpos); + fxRunner.exec("weapons/world/gb_dek2", wf.firePoint); + gi.sound(wf.ent, CHAN_WEAPON, gi.soundindex("Enemy/Dekker/Fire.wav"), 1.0, ATTN_NONE, 0);//fixme - bounce +} + + + +//------------------------------------------------------------------------------------- + + +// LineIntersectsPlane +// +// Feed it a parametric line (x0 + At, y0 + Bt, z0 + Ct) and a plane (Ax + By + Cz = D) +// and it returns the value of t for which the line intersects the plane. +// To represent the line, use a point (vec3_t pPoint) and a vector parallel to the line +// (vec3_t vParallel), i.e. (pPoint[0] + vParallel[0]t, pPoint[1] + vParallel[1]t, pPoint[2] + vParallel[2]t). +// For the plane, you can use the plane's normal (vec3_t n) and a point on the plane (vec3_t pPlane) to +// represent the plane (n[0]*pPlane[0] + n[1]*pPlane[1] + n[2]*pPlane[2] = D). + +float LineIntersectsPlane(vec3_t pPoint, vec3_t vParallel, vec3_t n, vec3_t pPlane) +{ + float D = DotProduct(n, pPlane); + float P = DotProduct(pPoint, vParallel); + float Q = DotProduct(n, n); + + return (D - P)/Q; +} + +void FireServer(sharedEdict_t &sh, edict_t &ent, inven_c &inven) +{ + vec3_t fwd; + vec3_t firePoint, pPoint; + weaponInfo_c *weaponInfo=&(*(((weaponInfo_c **)pe->weapInfo))[inven.getCurWeaponID()]); + attacks_e attackID = weaponInfo->getAtkID(0); + float noiseRad = weapons.getWeapon(attackID).getNoiseRad(); + +// AngleVectors(ent.client->ps.viewangles, fwd, NULL, NULL); + + VectorAdd(ent.s.origin, ent.client->ps.viewoffset, firePoint); + + // ATTENTION! Fwd is overwritten by this function... + CalcFireDirection(&ent, fwd, weaponInfo->getWaver(0), weaponInfo->getWaverMax(0), attackID); + + if (weaponInfo->fireFromFlash()) + { + // Some weapons can't fire from the player center for visual reasons. + // FIXME: this doesn't work at all for some reason ;(. + + vec3_t srcPoint; + VectorCopy(firePoint, srcPoint); + + vec3_t temp; + + GetGhoulPosDir(firePoint, ent.client->ps.viewangles, inven.getViewModel(), 0, "flash", pPoint, temp, 0, 0); +/* t = LineIntersectsPlane(pPoint, fwd, fwd, ent.s.origin); + firePoint[0] = pPoint[0] + fwd[0]*t; + firePoint[1] = pPoint[1] + fwd[1]*t; + firePoint[2] = pPoint[2] + fwd[2]*t; +*/ + + // We must project back from the fire position, into the body. + { + vec3_t firevect; + float scalefactor; + vec3_t viewpoint; + + VectorAdd(ent.s.origin, ent.client->ps.viewoffset, viewpoint); + + // Start with the vector from the firepoint to the origin. + VectorSubtract(pPoint, viewpoint, firevect); + + // Now project the difference vector onto the fire vector. + scalefactor = DotProduct(firevect, fwd); + VectorMA(pPoint, -scalefactor, fwd, firePoint); + } + + if (weaponInfo->aimAtCrosshair()) + { + vec3_t projEnd; + trace_t tr; + + VectorMA(srcPoint, 2048, fwd, projEnd); + gi.trace(srcPoint, 0, 0, projEnd, &ent, MASK_PROJ, &tr); + VectorSubtract(tr.endpos, firePoint, fwd); + VectorNormalize(fwd); + } + } + + weapons.attack(weaponInfo->getAtkID(0), &ent, firePoint, fwd); + + + PlayerNoise(&ent, firePoint, AI_SENSETYPE_SOUND_WEAPON, NULL, noiseRad, gmonster.GetClientNode()); +} + +void AltfireServer(sharedEdict_t &sh, edict_t &ent, inven_c &inven) +{ + vec3_t fwd; + vec3_t firePoint; + weaponInfo_c *weaponInfo=&(*(((weaponInfo_c **)pe->weapInfo))[inven.getCurWeaponID()]); + attacks_e altAttackID = weaponInfo->getAtkID(1); + float noiseRad = weapons.getWeapon(altAttackID).getNoiseRad(); + +// AngleVectors(ent.client->ps.viewangles, fwd, NULL, NULL); + + VectorAdd(ent.s.origin, ent.client->ps.viewoffset, firePoint); + + // ATTENTION! Fwd is overwritten by this function... + CalcFireDirection(&ent,fwd, weaponInfo->getWaver(1), weaponInfo->getWaverMax(1), altAttackID); + + if (weaponInfo->fireFromFlash()) + { + // Some weapons can't fire from the player center for visual reasons. + vec3_t srcPoint; + VectorCopy(firePoint, srcPoint); + + vec3_t temp; + vec3_t pPoint; + + GetGhoulPosDir(firePoint, ent.client->ps.viewangles, inven.getViewModel(), 0, "flash", pPoint, temp, 0, 0); +/* t = LineIntersectsPlane(pPoint, fwd, fwd, ent.s.origin); + firePoint[0] = pPoint[0] + fwd[0]*t; + firePoint[1] = pPoint[1] + fwd[1]*t; + firePoint[2] = pPoint[2] + fwd[2]*t; +*/ + + // We must project back from the fire position, into the body. + { + vec3_t firevect; + float scalefactor; + vec3_t viewpoint; + + VectorAdd(ent.s.origin, ent.client->ps.viewoffset, viewpoint); + + // Start with the vector from the firepoint to the origin. + VectorSubtract(pPoint, viewpoint, firevect); + + // Now project the difference vector onto the fire vector. + scalefactor = DotProduct(firevect, fwd); + VectorMA(pPoint, -scalefactor, fwd, firePoint); + } + + if (weaponInfo->aimAtCrosshair()) + { + vec3_t projEnd; + trace_t tr; + + VectorMA(srcPoint, 2048, fwd, projEnd); + gi.trace(srcPoint, 0, 0, projEnd, &ent, MASK_PROJ, &tr); + VectorSubtract(tr.endpos, firePoint, fwd); + VectorNormalize(fwd); + } + } + + weapons.attack(weaponInfo->getAtkID(1), &ent, firePoint, fwd); + + PlayerNoise(&ent, firePoint, AI_SENSETYPE_SOUND_WEAPON, NULL, noiseRad, gmonster.GetClientNode()); +} + +void WeaponDropServer(edict_t *ent,int type, int clipSize) +{ + dm->clientDropWeapon(ent,type, clipSize); +} + +void ItemDropServer(edict_t *ent,int type,int ammoCount) +{ + dm->clientDropItem(ent,type,ammoCount); +} + +void CacheAttack(int atkID) +{ + if (atkID!=ATK_NOTHING) + { + weapons.getWeapon(atkID).cache(); + } +} \ No newline at end of file diff --git a/Source/Game/ghoul/ighoul.h b/Source/Game/ghoul/ighoul.h new file mode 100644 index 0000000..a605755 --- /dev/null +++ b/Source/Game/ghoul/ighoul.h @@ -0,0 +1,447 @@ +#if !defined(IGHOUL_INC) +#define IGHOUL_INC + +#include "matrix4.h" +#include "packet.h" +typedef unsigned short int GhoulID; + +const GhoulID NULL_GhoulID(0); +const GhoulID MAX_GhoulID(0xffff); + +struct RenderInfo +{ + float Time; + Vect3 Ambient; + Vect3 AmbientPos; + Vect3 LightPos; + bool UseCamera; + bool UseAmbientPos; + bool UseMapLights; + bool UseSpecular; + bool UseFastLights; + bool UseGlLighting; + bool UseDirectional; + bool UseAttenuation; + bool ForceShadow; + bool ShadowOnly; + bool NoTextureStack; + float ShadowDark; + float ShadowTilt; + float ShadowDist; + float (*ShadowTrace)(float *start,float *end); + int MaxShadows; + int MaxMapLights; + Matrix4 ToWorld; + Vect3 WorldViewPoint; + Vect3 WorldViewDir; + bool UseNoLights; + virtual bool CullBoundBox(const float *box) const {return false;} + RenderInfo() {UseNoLights=false;UseGlLighting=false;ShadowTrace=0;MaxShadows=0;} +}; + +struct QuakeLight +{ + Vect3 Origin; + float Radius; + Vect3 Color; +}; + +typedef short int GhoulUUID; + +class IGhoulCallBack; +class IGhoulInst; + + +struct HitRecord +{ + IGhoulInst *Inst; + GhoulID Mesh; + float Distance; + Vect3 Normal; + Vect3 ContactPoint; +}; + +enum TexChannel +{ + Diffuse=0, + Specular +}; + +enum PartType +{ + ptDummy, + ptMesh, + ptCamera, + ptLight +}; + +enum GhoulSpeed +{ + gs4Over8=0, + gs5Over8, + gs6Over8, + gs7Over8, + gsOne, + gs9Over8, + gs10Over8, + gs11Over8, + gs12Over8, + gs13Over8, + gs14Over8, + gs15Over8, + gs16Over8, + gsEND +}; + +class IGhoul; + +class IGhoulObj +{ +public: + virtual GhoulID RegisterSequence(const char *Filename,bool Subsequences=false)=0; + virtual void RegisterEverything(bool Skins=true)=0; + virtual void PreCache(bool Specular)=0; + virtual GhoulID FindSequence(const char *Filename)=0; + virtual GhoulID NumSequences() const=0; + virtual void GetSequenceName(GhoulID who,char *dest) const=0; + virtual GhoulID RegisterPart(const char *PartName)=0; + virtual GhoulID FindPart(const char *PartName)=0; + virtual GhoulID NumParts() const=0; + virtual PartType GetPartType(GhoulID who) const=0; + virtual void GetPartName(GhoulID who,char *dest) const=0; + virtual GhoulID RegisterNoteToken(const char *Token)=0; + virtual GhoulID FindNoteToken(const char *Token)=0; + virtual GhoulID NumNoteTokens() const=0; + virtual void FireAllNoteCallBacks(IGhoulCallBack *c,GhoulID Token=0)=0; + virtual GhoulID RegisterMaterial(const char *Mat)=0; + virtual GhoulID FindMaterial(const char *Mat)=0; + virtual GhoulID NumMaterials() const=0; + virtual void GetMaterialName(GhoulID who,char *dest) const=0; + virtual GhoulID RegisterSkin(GhoulID Mat,const char *Skin,TexChannel Channel=Diffuse)=0; + virtual GhoulID FindSkin(GhoulID Mat,const char *Skin,TexChannel Channel=Diffuse)=0; + virtual GhoulID NumSkins() const=0; + virtual void GetSkinName(GhoulID who,char *dest) const=0; + virtual GhoulID GetSkinMaterial(GhoulID who) const=0; + virtual IGhoulInst *NewInst()=0; + virtual GhoulUUID MyUUID() const=0; + virtual IGhoul *GetMyGhoul() const=0; + virtual void Destroy()=0; +}; + +class IGhoulCallBack +{ +public: + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data)=0; +}; + +class IGhoulInst +{ +public: + enum EndCondition + { + Loop, + Hold, // hold at end of seq + BackAndForth, + HoldFrame, // hold at PlayPos + EndMarker //do not use + }; + enum MatrixType + { + JacobianLocal, + JacobianEntity, + JacobianLocalInv, + JacobianEntityInv, + Local, + Entity, + LocalInv, + EntityInv + }; + virtual void SetXForm(const float *m)=0; + virtual void GetXForm(float *m)=0; + virtual void SetXForm(const Matrix4 &m)=0; + virtual void GetXForm(Matrix4 &m)=0; + virtual void SetOnOff(bool OnOff,float Now)=0; + virtual bool GetOnOff()=0; + virtual void SetSpeed(GhoulSpeed speed)=0; + virtual GhoulSpeed GetSpeed()=0; + virtual void SetPartOnOff(GhoulID Part,bool OnOff)=0; + virtual bool GetPartOnOff(GhoulID Part)=0; + virtual void SetAllPartsOnOff(bool OnOff)=0; + + virtual void SetFrameOverride(GhoulID Mat,GhoulID Skin,GhoulID Part=0)=0; + virtual GhoulID GetFrameOverride(GhoulID Mat,GhoulID Part=0,TexChannel Channel=Diffuse)=0; + virtual void ClearFrameOverride(GhoulID Mat,GhoulID Part=0,TexChannel Channel=Diffuse)=0; + virtual void SetTint(float r,float g,float b,float a)=0; + virtual void GetTint(float *r,float *g,float *b,float *a)=0; + virtual void SetTintOnAll(float r,float g,float b,float a)=0; + + virtual void Play(GhoulID Seq,float Now,float PlayPos=0.0f,bool Restart=true,EndCondition ec=Loop, bool MatchCurrentPos=false, bool reverseAnim=false)=0; + virtual GhoulID GetPlayingSequence()=0; + virtual void Pause(float Now)=0; + virtual void Resume(float Now)=0; + + virtual void SetUserData(void *user)=0; + virtual void *GetUserData()=0; + virtual void AddNoteCallBack(IGhoulCallBack *c,GhoulID Token=0)=0; + virtual void RemoveNoteCallBack(IGhoulCallBack *c,GhoulID Token=0)=0; + + virtual void AddMatrixCallBack(IGhoulCallBack *c,GhoulID Part=0,MatrixType kind=JacobianLocal)=0; + virtual void RemoveMatrixCallBack(IGhoulCallBack *c,GhoulID Part=0,MatrixType kind=JacobianLocal)=0; + + virtual float GetSequenceLength(GhoulID Seq,EndCondition ec=Loop,float *SecsPerFrame=0)=0; + + virtual void Bolt(GhoulID Bolt,IGhoulInst *Bolted,GhoulID BoltedBolt=0)=0; + virtual void SetMyBolt(GhoulID Bolt=0)=0; + virtual GhoulID GetMyBolt() const=0; + virtual void UnBolt(IGhoulInst *Bolted)=0; + + virtual int GetNumChildren() const=0; + virtual IGhoulInst *GetChild(int Child,GhoulID &bolt) const=0; + virtual IGhoulObj *GetGhoulObject() const=0; + virtual IGhoulInst *GetParent() const=0; + virtual IGhoulInst *Clone(bool CloneChildren=true) const=0; + + virtual int SaveState(unsigned char *buffer,int size,IGhoulCallBack **CallBacks,int NumCallBacks, const char *name) const=0; + virtual GhoulUUID RestoreState(unsigned char *buffer,int size,IGhoulCallBack **CallBacks,int NumCallBacks, const char *name)=0; + + virtual GhoulUUID MyUUID() const =0; + virtual GhoulUUID MyObjUUID() const =0; + + virtual void Render(RenderInfo &r)=0; + virtual void PreCache(bool Specular,bool Textures,bool Verts)=0; + virtual int RayTrace(float Time,const Vect3 &start,const Vect3 &dir,HitRecord *Hits,int MaxHits)=0; + virtual int BoxTrace(float Time,const Matrix4 &ToWorld,const Vect3 &start,const Vect3 &end,const Vect3 &mins,const Vect3 &maxs,HitRecord *Hits,int MaxHits)=0; + + virtual void ServerUpdate(float Time)=0; + virtual void TurnCallBacksOff()=0; + virtual void TurnMatrixCallBacksOff()=0; + virtual void TurnCallBacksOn(float Now)=0; + virtual void TurnMatrixCallBacksOn(float Now)=0; + virtual void GetBoltMatrix(float Time,Matrix4 &m,GhoulID Part=0,MatrixType kind=JacobianLocal,bool ToRoot=true)=0; + virtual void GetBoundBox(float Time,const Matrix4 &ToWorld,Vect3 &mins,Vect3 &maxs,GhoulID Part=0,bool Accurate=false)=0; + virtual int QueueForClient(float dist)=0; + virtual void Destroy()=0; + + virtual GhoulID GetStateSequence()=0; +// string based interface + + bool IsLive() {return (GetPlayingSequence()!=0)&&GetOnOff();} + + bool SetPartOnOff(const char *Part,bool OnOff) + { + GhoulID t=GetGhoulObject()->FindPart(Part); + if (!t) + return false; + SetPartOnOff(t,OnOff); + return true; + } + bool GetPartOnOff(const char *Part) + { + GhoulID t=GetGhoulObject()->FindPart(Part); + if (!t) + return false; + return GetPartOnOff(t); + } + bool SetFrameOverride(const char *Mat,const char *Skin,const char *Part) + { + GhoulID t=GetGhoulObject()->FindPart(Part); + GhoulID m=GetGhoulObject()->FindMaterial(Mat); + if (!m) + return false; + GhoulID s=GetGhoulObject()->FindSkin(m,Skin); + if (!s) + return false; + SetFrameOverride(m,s,t); + return true; + } + bool SetFrameOverride(const char *Mat,const char *Skin,GhoulID Part=0) + { + GhoulID m=GetGhoulObject()->FindMaterial(Mat); + if (!m) + return false; + GhoulID s=GetGhoulObject()->FindSkin(m,Skin); + if (!s) + return false; + SetFrameOverride(m,s,Part); + return true; + } + bool SetFrameOverride(GhoulID Mat,const char *Skin,GhoulID Part=0) + { + if (!Mat) + return false; + GhoulID s=GetGhoulObject()->FindSkin(Mat,Skin); + if (!s) + return false; + SetFrameOverride(Mat,s,Part); + return true; + } + bool SetFrameOverride(const char *Mat,GhoulID Skin,GhoulID Part=0) + { + GhoulID m=GetGhoulObject()->FindMaterial(Mat); + if (!m) + return false; + if (!Skin) + return false; + SetFrameOverride(m,Skin,Part); + return true; + } + GhoulID GetFrameOverride(const char *Mat,const char *Part,TexChannel Channel=Diffuse) + { + GhoulID m=GetGhoulObject()->FindMaterial(Mat); + GhoulID p=GetGhoulObject()->FindPart(Part); + if (!m) + return 0; + return GetFrameOverride(m,p,Channel); + } + GhoulID GetFrameOverride(const char *Mat,GhoulID Part=0,TexChannel Channel=Diffuse) + { + GhoulID m=GetGhoulObject()->FindMaterial(Mat); + if (!m) + return 0; + return GetFrameOverride(m,Part,Channel); + } + bool ClearFrameOverride(const char *Mat,const char *Part,TexChannel Channel) + { + GhoulID m=GetGhoulObject()->FindMaterial(Mat); + GhoulID p=GetGhoulObject()->FindPart(Part); + if (!m) + return false; + ClearFrameOverride(m,p,Channel); + return true; + } + bool Play(const char *Seq,float Now,float PlayPos,bool Restart,EndCondition ec, bool MatchCurrentPos, bool reverseAnim) + { + GhoulID s=GetGhoulObject()->FindSequence(Seq); + if (!s) + return false; + Play(s,Now,PlayPos,Restart,ec,MatchCurrentPos,reverseAnim); + return true; + } + bool AddNoteCallBack(IGhoulCallBack *c,const char *Token) + { + GhoulID t=GetGhoulObject()->FindNoteToken(Token); + AddNoteCallBack(c,t); + return true; + } + bool RemoveNoteCallBack(IGhoulCallBack *c,const char *Token) + { + GhoulID t=GetGhoulObject()->FindNoteToken(Token); + RemoveNoteCallBack(c,t); + return true; + } + bool AddMatrixCallBack(IGhoulCallBack *c,const char *Part,MatrixType kind) + { + GhoulID t=GetGhoulObject()->FindPart(Part); + AddMatrixCallBack(c,t,kind); + return true; + } + bool RemoveMatrixCallBack(IGhoulCallBack *c,const char *Part,MatrixType kind) + { + GhoulID t=GetGhoulObject()->FindPart(Part); + RemoveMatrixCallBack(c,t,kind); + return true; + } + float GetSequenceLength(const char *Seq,EndCondition ec) + { + GhoulID s=GetGhoulObject()->FindSequence(Seq); + if (!s) + return 0.0f; + return GetSequenceLength(s,ec); + } + bool Bolt(const char *bolt, IGhoulInst *Bolted, const char *BoltedBolt) + { + GhoulID b = GetGhoulObject()->FindPart(bolt); + GhoulID bb = Bolted->GetGhoulObject()->FindPart(BoltedBolt); + Bolt(b, Bolted, bb); + return true; + } + bool SetMyBolt(const char *Bolt) + { + GhoulID b=GetGhoulObject()->FindPart(Bolt); + SetMyBolt(b); + return true; + } + bool GetBoltMatrix(float Time,Matrix4 &m,const char *Part,MatrixType kind,bool ToRoot) + { + GhoulID t=GetGhoulObject()->FindPart(Part); + GetBoltMatrix(Time,m,t,kind,ToRoot); + return true; + } + bool GetBoundBox(float Time,const Matrix4 &ToWorld,Vect3 &mins,Vect3 &maxs,const char *Part) + { + GhoulID t=GetGhoulObject()->FindPart(Part); + GetBoundBox(Time,ToWorld,mins,maxs,t); + return true; + } +}; + + +class IGhoul +{ +public: + virtual IGhoulObj *NewObj()=0; + virtual void GlPrep(void *gl=0)=0; //gl is assumed to be an GhoulOpenGL * + virtual void PreCache(bool Specular)=0; + virtual void GlUnprep()=0; + virtual void BeginServerFrame()=0; + virtual void EndServerFrame()=0; + virtual void DestroyAllObjects()=0; + virtual void FlushUnusedFiles()=0; + virtual void Destroy()=0; + + virtual IGhoulInst *FindClientInst(GhoulUUID key)=0; + virtual IGhoulObj *FindClientObj(GhoulUUID key)=0; + + virtual void SetFilenameMapper(void (*Map)(char *dest,const char *src))=0; + + //server + virtual void AddClient(int client)=0; + virtual void RemoveClient(int client)=0; + virtual void FlushClients()=0; + virtual void RemoveAllClients()=0; + virtual bool PackReliable(int client,int packetID,OutPacket &op)=0; + virtual bool NeedReliable(int client)=0; + virtual bool Pack(int client,int packetID,OutPacket &op,float baseTime)=0; + virtual void AckPack(int client,int packetID)=0; + virtual void ReliableHitWire(int client,int packetID)=0; + virtual void GhoulClearClientQueue(int client,int packetID)=0; + virtual void AddFileForDownLoad(const char *name)=0; + + //client + virtual void Precache()=0; + virtual void UnPackReliable(int packetID,InPacket &ip,bool specular)=0; + virtual void UnPack(int packetID,InPacket &ip,float now)=0; + virtual int GetSavedReliableSize() const=0; + virtual const unsigned char *GetSavedReliable()=0; + + virtual int GetNumExportLights()=0; + virtual void GetExportLight(int i,QuakeLight &ql)=0; + virtual void BeginRenderFrame()=0; + virtual void AddImportLight(const QuakeLight &ql)=0; + virtual void EndRenderFrame()=0; + virtual void FlushMeshCache()=0; + + virtual void AddMapLight(const QuakeLight &ql)=0; + virtual void FinishMapLights()=0; + virtual void ClearMapLights()=0; + + virtual void SetGammaTable(unsigned char * table)=0; + virtual void SetMip(int mip)=0; + virtual void SetPolyOffset(float factor,float unit)=0; + + virtual int GetNumTexturesBound()=0; + virtual int GetNumTexturesBoundBytes()=0; + virtual int GetNumMeshesRendered()=0; + virtual int GetNumTrianglesRendered()=0; + virtual int GetNumTrianglesRenderedSpec()=0; + virtual int GetNumVertsRendered()=0; + virtual int GetNumCornersRendered()=0; + virtual int GetNumLightRaysRendered()=0; + virtual void ClearStats()=0; +}; + + +IGhoul *GetGhoul(bool Client=false,bool Menu=false); + + +#endif \ No newline at end of file diff --git a/Source/Game/ghoul/matrix4.cpp b/Source/Game/ghoul/matrix4.cpp new file mode 100644 index 0000000..e065337 --- /dev/null +++ b/Source/Game/ghoul/matrix4.cpp @@ -0,0 +1,1204 @@ +#include "matrix4.h" + +extern const float Pi=3.1415926535f; +extern const float Half_Pi=Pi/2.0; + + +#define MAX_MATRIX (12) + +#define MATRIX_DEBUG 0 + +static void BackSub(float a[][MAX_MATRIX],int *indx,float *b,int sz) +{ + int i,j,ii=-1,ip; + float sum; + for (i=0;i=0) + { + for (j=ii;j=0;i--) + { + sum=b[i]; + for (j=i+1;jbig) + big=temp; + if (big=big) + { + big=dum; + imax=i; + } + } + if (j!=imax) + { + for (k=0;k=0) + { + for (j=ii;j=0;i--) + { + sum=b[i]; + for (j=i+1;jbig) + big=temp; + if (big=big) + { + big=dum; + imax=i; + } + } + if (j!=imax) + { + for (k=0;kMATRIX_TOL) + return 0; + } + else + { + if (fabs(m[i][j])>MATRIX_TOL) + return 0; + } + } + } + flags=MATFLAG_IDENTITY; + return flags; +} + + +void Matrix4::Identity() +{ + int i; + float *f; + for (f=m[0],i=0;i<16;i++,f++) + *f=0; + for (i=0;i<4;i++) + m[i][i]=1.0;; + flags=MATFLAG_IDENTITY; +} + +float Matrix4::MaxAbsElement() +{ + if (flags&MATFLAG_IDENTITY) + { + assert(IntegrityCheck()); + return 1.0f; + } + int i; + float best=-1,*f; + for (f=m[0],i=0;i<16;i++,f++) + { + if (fabs(*f)>best) + best=fabs(*f); + } + return best; +} + +void Matrix4::Zero() +{ + int i; + float *f; + for (f=m[0],i=0;i<16;i++,f++) + *f=0; + flags=0; +} + +float Matrix4::Det() +{ + if (flags&MATFLAG_IDENTITY) + { + assert(IntegrityCheck()); + return 1.0f; + } + float d; + int i,indx[4]; + Matrix4 lu=*this; + if (!LUDecomposition4(lu.m,indx,&d)) + { + assert(0); + } + for (i=0;i<4;i++) + d*=lu.m[i][i]; + return d; +} + + +void Matrix4::Translate(const float tx,const float ty,const float tz) +{ + int i; + float *f; + for (f=m[0],i=0;i<12;i++,f++) + *f=0; + for (i=0;i<4;i++) + m[i][i]=1.0;; + m[3][0]=tx; + m[3][1]=ty; + m[3][2]=tz; + CalcFlags(); +} + +void Matrix4::Translate(const Vect3 &t) +{ + int i; + float *f; + for (f=m[0],i=0;i<12;i++,f++) + *f=0; + for (i=0;i<4;i++) + m[i][i]=1.0;; + m[3][0]=t[0]; + m[3][1]=t[1]; + m[3][2]=t[2]; + CalcFlags(); +} + +void Matrix4::Rotate(int axis,const float theta) +{ + int i; + float *f,s,c; + for (f=m[0],i=0;i<16;i++,f++) + *f=0; + for (i=0;i<4;i++) + m[i][i]=1.0; + s=sin(theta); + c=cos(theta); + switch(axis) + { + case 0: + m[1][1]=c; + m[1][2]=-s; + m[2][1]=s; + m[2][2]=c; + break; + case 1: + m[0][0]=c; + m[0][2]=s; + m[2][0]=-s; + m[2][2]=c; + break; + case 2: + m[0][0]=c; + m[0][1]=-s; + m[1][0]=s; + m[1][1]=c; + break; + } + CalcFlags(); +} + +void Matrix4::Rotate(const float rx,const float ry,const float rz) +{ + Matrix4 x,y,z,t; + x.Rotate(0,rx); + y.Rotate(1,ry); + z.Rotate(2,rz); + t.Concat(y,z); + Concat(x,t); +} + +void Matrix4::Rotate(const Vect3 v) +{ + Matrix4 x,y,z,t; + + x.Rotate(0, v[0]); + y.Rotate(1, v[1]); + z.Rotate(2, v[2]); + + t.Concat(y, z); + Concat(x, t); +} + +void Matrix4::Scale(const float sx,const float sy,const float sz) +{ + int i; + float *f; + for (f=m[0],i=0;i<16;i++,f++) + *f=0; + assert(fabs(sx)>1E-10); + assert(fabs(sy)>1E-10); + assert(fabs(sz)>1E-10); + m[0][0]=sx; + m[1][1]=sy; + m[2][2]=sz; + m[3][3]=1.0; + CalcFlags(); +} + +void Matrix4::Scale(const float sx) +{ + int i; + float *f; + for (f=m[0],i=0;i<16;i++,f++) + *f=0; + assert(fabs(sx)>1E-10); + m[0][0]=sx; + m[1][1]=sx; + m[2][2]=sx; + m[3][3]=1.0; + CalcFlags(); +} + +void Matrix4::Interp(const Matrix4 &m1,float s1,const Matrix4 &m2,float s2) +{ + int i; + const float *f1; + const float *f2; + float *fd; + for (f1=m1.m[0],f2=m2.m[0],fd=m[0],i=0;i<16;i++,f1++,f2++,fd++) + *fd=s1*(*f1)+s2*(*f2); + flags=0; +} + +void Matrix4::Interp(const Matrix4 &m1,const Matrix4 &m2,float s1) +{ + if ((m1.flags&MATFLAG_IDENTITY)&&(m2.flags&MATFLAG_IDENTITY)) + { + assert(m1.IntegrityCheck()); + assert(m2.IntegrityCheck()); + Identity(); + return; + } + int i; + const float *f1; + const float *f2; + float *fd; + for (f1=m1.m[0],f2=m2.m[0],fd=m[0],i=0;i<16;i++,f1++,f2++,fd++) + *fd=s1*((*f1)-(*f2))+(*f2); + flags=0; +} + + +bool Matrix4::operator== (const Matrix4& t) const +{ + if ((flags&MATFLAG_IDENTITY)&&(t.flags&MATFLAG_IDENTITY)) + { + assert(IntegrityCheck()); + assert(t.IntegrityCheck()); + return true; + } + int i,j; + for (i=0;i<4;i++) + { + for (j=0;j<3;j++) + { + if (fabs(m[i][j]-t.m[i][j])>1E-4f) + return false; + } + } + return true; +} + +void Matrix4::Concat(const Matrix4 &m1,const Matrix4 &m2) +{ + if (m1.flags&MATFLAG_IDENTITY) + { + assert(m1.IntegrityCheck()); + *this=m2; + } + else if (m2.flags&MATFLAG_IDENTITY) + { + assert(m2.IntegrityCheck()); + *this=m1; + } + else + { + + assert(this!=&m1&&this!=&m2); + /* + int i,j,k; + float acc=0; + for (i=0;i<4;i++) + { + for (j=0;j<4;j++) + { + for(k=0,acc=0.;k<4;k++) + acc+=m1.m[i][k]*m2.m[k][j]; + m[i][j]=acc; + } + } + */ + m2.HXFormPointND(m[0],m1.m[0]); + m2.HXFormPointND(m[1],m1.m[1]); + m2.HXFormPointND(m[2],m1.m[2]); + m2.HXFormPointND(m[3],m1.m[3]); + flags=0; + } +} + +void Matrix4::XFormPoint(Vect3 &dest,const Vect3 &src) const +{ + if (flags&MATFLAG_IDENTITY) + { + assert(IntegrityCheck()); + dest=src; + return; + } +/* + dest[0]=m[0][0]*src[0]+m[1][0]*src[1]+m[2][0]*src[2]+m[3][0]; + dest[1]=m[0][0]*src[0]+m[1][0]*src[1]+m[2][0]*src[2]+m[3][1]; + dest[2]=m[3][2]; +*/ +/* + int i,j; + dest[0]=m[3][0]; + dest[1]=m[3][1]; + dest[2]=m[3][2]; + for (i=0;i<3;i++) + for (j=0;j<3;j++) + dest[i]+=m[j][i]*src[j]; +*/ + const float *s=&src.x(); + float *d=&dest.x(); + const float *mat=&m[0][0]; + __asm + { + mov ebx,[s] + mov eax,[mat] + mov ecx,[d] + fld [DWORD PTR ebx+8] // z + fld [DWORD PTR ebx+4] // y z + fld [DWORD PTR ebx] // x y z + + fld [DWORD PTR eax] // m00 x y z 1/m33+m23z+m13y+xm03 + fmul st,st(1) // m00x x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+4] // m01 m00x x y z 1/m33+m23z+m13y+xm03 + fmul st,st(2) // m01x m00x x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+8] // m02 m01x m00x x y z 1/m33+m23z+m13y+xm03 + fmulp st(3),st // m01x m00x m02x y z 1/m33+m23z+m13y+xm03 + fxch st(1) // m00x m01x m02x y z 1/m33+m23z+m13y+xm03 + fxch st(2) // m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+16] // m10 m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fmul st,st(4) // m10y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+20] // m11 m10y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + + + fmul st,st(5) // m11y m10y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fxch st(1) // m10y m11y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + faddp st(4),st // m11y m02x m01x m00x+m10y y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+24] // m12 m11y m02x m01x m00x+m10y y z 1/m33+m23z+m13y+xm03 + fmulp st(5),st // m11y m02x m01x m00x+m10y m12y z 1/m33+m23z+m13y+xm03 + + faddp st(2),st // m02x m01x+m11y m00x+m10y m12y z 1/m33+m23z+m13y+xm03 + faddp st(3),st // m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + + fld [DWORD PTR eax+32] // m20 m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + fmul st,st(4) // m20z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+36] // m21 m20z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + + fmul st,st(5) // m21z m20z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + fxch st(1) // m20z m21z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + faddp st(3),st // m21z m01x+m11y m00x+m10y+m20z m12y+m02x z 1/m33+m23z+m13y+xm03 + + fld [DWORD PTR eax+40] // m22 m21z m01x+m11y m00x+m10y+m20z m12y+m02x z 1/m33+m23z+m13y+xm03 + fmulp st(5),st // m21z m01x+m11y m00x+m10y+m20z m12y+m02x m22z 1/m33+m23z+m13y+xm03 + faddp st(1),st // m21z+m01x+m11y m00x+m10y+m20z m12y+m02x m22z 1/m33+m23z+m13y+xm03 + fxch st(3) // m22z m00x+m10y+m20z m12y+m02x m21z+m01x+m11y 1/m33+m23z+m13y+xm03 + faddp st(2),st // m00x+m10y+m20z m22z+m12y+m02x m21z+m01x+m11y 1/m33+m23z+m13y+xm03 + + + fadd [DWORD PTR eax+48] // m00x+m10y+m20z+m30 m22z+m12y+m02x m21z+m01x+m11y 1/m33+m23z+m13y+xm03 + fxch st(2) // m21z+m01x+m11y m22z+m12y+m02x m00x+m10y+m20z+m30 1/m33+m23z+m13y+xm03 + fadd [DWORD PTR eax+52] // m21z+m01x+m11y+m31 m22z+m12y+m02x m00x+m10y+m20z+m30 1/m33+m23z+m13y+xm03 + fxch st(1) // m22z+m12y+m02x m21z+m01x+m11y+m31 m00x+m10y+m20z+m30 1/m33+m23z+m13y+xm03 + fadd [DWORD PTR eax+56] // m22z+m12y+m02x+m32 m21z+m01x+m11y+m31 m00x+m10y+m20z+m30 1/m33+m23z+m13y+xm03 + + fxch st(2) // m00x+m10y+m20z+m30 m21z+m01x+m11y+m31 m22z+m12y+m02x+m32 1/m33+m23z+m13y+xm03 + fstp [DWORD PTR ecx] + fstp [DWORD PTR ecx+4] + fstp [DWORD PTR ecx+8] + } +} + +void Matrix4::XFormVect(Vect3 &dest,const Vect3 &src) const +{ + if (flags&MATFLAG_IDENTITY) + { + dest=src; + return; + } + int i,j; + dest=0.; + for (i=0;i<3;i++) + for (j=0;j<3;j++) + dest[i]+=m[j][i]*src[j]; +} + +void Matrix4::XFormVectTranspose(Vect3 &dest,const Vect3 &src) const +{ + if (flags&MATFLAG_IDENTITY) + { + assert(IntegrityCheck()); + dest=src; + return; + } +/* + int i,j; + dest=0.; + for (i=0;i<3;i++) + for (j=0;j<3;j++) + dest[i]+=m[i][j]*src[j]; +*/ + const float *s=&src.x(); + float *d=&dest.x(); + const float *mat=&m[0][0]; + __asm + { + mov ebx,[s] + mov eax,[mat] + mov ecx,[d] + fld [DWORD PTR ebx+8] // z + fld [DWORD PTR ebx+4] // y z + fld [DWORD PTR ebx] // x y z + + fld [DWORD PTR eax] // m00 x y z 1/m33+m23z+m13y+xm03 + fmul st,st(1) // m00x x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+16] // m01 m00x x y z 1/m33+m23z+m13y+xm03 + fmul st,st(2) // m01x m00x x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+32] // m02 m01x m00x x y z 1/m33+m23z+m13y+xm03 + fmulp st(3),st // m01x m00x m02x y z 1/m33+m23z+m13y+xm03 + fxch st(1) // m00x m01x m02x y z 1/m33+m23z+m13y+xm03 + fxch st(2) // m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+4] // m10 m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fmul st,st(4) // m10y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+20] // m11 m10y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + + + fmul st,st(5) // m11y m10y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fxch st(1) // m10y m11y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + faddp st(4),st // m11y m02x m01x m00x+m10y y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+36] // m12 m11y m02x m01x m00x+m10y y z 1/m33+m23z+m13y+xm03 + fmulp st(5),st // m11y m02x m01x m00x+m10y m12y z 1/m33+m23z+m13y+xm03 + + faddp st(2),st // m02x m01x+m11y m00x+m10y m12y z 1/m33+m23z+m13y+xm03 + faddp st(3),st // m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + + fld [DWORD PTR eax+8] // m20 m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + fmul st,st(4) // m20z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+24] // m21 m20z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + + fmul st,st(5) // m21z m20z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + fxch st(1) // m20z m21z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + faddp st(3),st // m21z m01x+m11y m00x+m10y+m20z m12y+m02x z 1/m33+m23z+m13y+xm03 + + fld [DWORD PTR eax+40] // m22 m21z m01x+m11y m00x+m10y+m20z m12y+m02x z 1/m33+m23z+m13y+xm03 + fmulp st(5),st // m21z m01x+m11y m00x+m10y+m20z m12y+m02x m22z 1/m33+m23z+m13y+xm03 + faddp st(1),st // m21z+m01x+m11y m00x+m10y+m20z m12y+m02x m22z 1/m33+m23z+m13y+xm03 + fxch st(3) // m22z m00x+m10y+m20z m12y+m02x m21z+m01x+m11y 1/m33+m23z+m13y+xm03 + faddp st(2),st // m00x+m10y+m20z m22z+m12y+m02x m21z+m01x+m11y 1/m33+m23z+m13y+xm03 + fstp [DWORD PTR ecx] + fstp [DWORD PTR ecx+8] + fstp [DWORD PTR ecx+4] + } +} + +#pragma warning( disable : 4725) //instruction may be inaccurate on some Pentiums + +float Matrix4::HXFormPoint(Vect3 &dest,const Vect3 &src) const +{ +/* + int i,j; + float h; + h=m[3][3]; + h+=m[0][3]*src[0]; + h+=m[1][3]*src[1]; + h+=m[2][3]*src[2]; + h=1.0f/h; + for (i=0;i<3;i++) + { + dest[i]=m[3][i]; + for (j=0;j<3;j++) + dest[i]+=m[j][i]*src[j]; + dest[i]*=h; + } +// return h; +*/ + static const float one=1.0f; + const float *s=&src.x(); + float *d=&dest.x(); + const float *mat=&m[0][0]; + float tret; + __asm + { + mov ebx,[s] + mov eax,[mat] + mov ecx,[d] + fld [DWORD PTR ebx] // x + fld [DWORD PTR eax+12] // m03 x + fmul st,st(1) // xm03 x + fld [DWORD PTR ebx+4] // y xm03 x + fld [DWORD PTR eax+28] // m13 y xm03 x + fmul st,st(1) // m13y y xm03 x + + fld [DWORD PTR ebx+8] // z m13y y xm03 x + fld [DWORD PTR eax+44] // m23 z m13y y xm03 x + fmul st,st(1) // m23z z m13y y xm03 x + fxch st(2) // m13y z m23z y xm03 x + faddp st(4),st // z m23z y m13y+xm03 x + fxch st(1) // m23z z y m13y+xm03 x + faddp st(3),st // z y m23z+m13y+xm03 x + fxch st(2) // m23z+m13y+xm03 y z x + + fadd [DWORD PTR eax+60] // m33+m23z+m13y+xm03 y z x + fdivr [one] // 1/m33+m23z+m13y+xm03 y z x + fxch st(3) // x y z 1/m33+m23z+m13y+xm03 + mov edx,[DWORD PTR eax] + mov edx,[DWORD PTR ecx] + mov edx,[DWORD PTR ecx+8] + + + + fld [DWORD PTR eax] // m00 x y z 1/m33+m23z+m13y+xm03 + fmul st,st(1) // m00x x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+4] // m01 m00x x y z 1/m33+m23z+m13y+xm03 + fmul st,st(2) // m01x m00x x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+8] // m02 m01x m00x x y z 1/m33+m23z+m13y+xm03 + fmulp st(3),st // m01x m00x m02x y z 1/m33+m23z+m13y+xm03 + fxch st(1) // m00x m01x m02x y z 1/m33+m23z+m13y+xm03 + fxch st(2) // m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+16] // m10 m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fmul st,st(4) // m10y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+20] // m11 m10y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + + + fmul st,st(5) // m11y m10y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fxch st(1) // m10y m11y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + faddp st(4),st // m11y m02x m01x m00x+m10y y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+24] // m12 m11y m02x m01x m00x+m10y y z 1/m33+m23z+m13y+xm03 + fmulp st(5),st // m11y m02x m01x m00x+m10y m12y z 1/m33+m23z+m13y+xm03 + + faddp st(2),st // m02x m01x+m11y m00x+m10y m12y z 1/m33+m23z+m13y+xm03 + faddp st(3),st // m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + + fld [DWORD PTR eax+32] // m20 m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + fmul st,st(4) // m20z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+36] // m21 m20z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + + fmul st,st(5) // m21z m20z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + fxch st(1) // m20z m21z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + faddp st(3),st // m21z m01x+m11y m00x+m10y+m20z m12y+m02x z 1/m33+m23z+m13y+xm03 + + fld [DWORD PTR eax+40] // m22 m21z m01x+m11y m00x+m10y+m20z m12y+m02x z 1/m33+m23z+m13y+xm03 + fmulp st(5),st // m21z m01x+m11y m00x+m10y+m20z m12y+m02x m22z 1/m33+m23z+m13y+xm03 + faddp st(1),st // m21z+m01x+m11y m00x+m10y+m20z m12y+m02x m22z 1/m33+m23z+m13y+xm03 + fxch st(3) // m22z m00x+m10y+m20z m12y+m02x m21z+m01x+m11y 1/m33+m23z+m13y+xm03 + faddp st(2),st // m00x+m10y+m20z m22z+m12y+m02x m21z+m01x+m11y 1/m33+m23z+m13y+xm03 + + + fadd [DWORD PTR eax+48] // m00x+m10y+m20z+m30 m22z+m12y+m02x m21z+m01x+m11y 1/m33+m23z+m13y+xm03 + fxch st(2) // m21z+m01x+m11y m22z+m12y+m02x m00x+m10y+m20z+m30 1/m33+m23z+m13y+xm03 + fadd [DWORD PTR eax+52] // m21z+m01x+m11y+m31 m22z+m12y+m02x m00x+m10y+m20z+m30 1/m33+m23z+m13y+xm03 + fxch st(1) // m22z+m12y+m02x m21z+m01x+m11y+m31 m00x+m10y+m20z+m30 1/m33+m23z+m13y+xm03 + fadd [DWORD PTR eax+56] // m22z+m12y+m02x+m32 m21z+m01x+m11y+m31 m00x+m10y+m20z+m30 1/m33+m23z+m13y+xm03 + + fxch st(2) // m00x+m10y+m20z+m30 m21z+m01x+m11y+m31 m22z+m12y+m02x+m32 1/m33+m23z+m13y+xm03 + fmul st,st(3) // sx m21z+m01x+m11y+m31 m22z+m12y+m02x+m32 1/m33+m23z+m13y+xm03 + fxch st(1) // m21z+m01x+m11y+m31 sx m22z+m12y+m02x+m32 1/m33+m23z+m13y+xm03 + fmul st,st(3) // sy sx m22z+m12y+m02x+m32 1/m33+m23z+m13y+xm03 + fxch st(2) // m22z+m12y+m02x+m32 sx sy 1/m33+m23z+m13y+xm03 + fmul st,st(3) // sz sx sy rhw + fstp [DWORD PTR ecx+8] + fstp [DWORD PTR ecx] + fstp [DWORD PTR ecx+4] + fstp [tret] + } + return tret; +} +#pragma warning( default: 4725) //instruction may be inaccurate on some Pentiums + +void Matrix4::HXFormPointND(float *d,const float *s) const +{ +/* + int i,j; + float h; + h=m[3][3]; + h+=m[0][3]*src[0]; + h+=m[1][3]*src[1]; + h+=m[2][3]*src[2]; + h=1.0f/h; + for (i=0;i<3;i++) + { + dest[i]=m[3][i]; + for (j=0;j<3;j++) + dest[i]+=m[j][i]*src[j]; + dest[i]*=h; + } +// return h; +*/ + const float *mat=&m[0][0]; + __asm + { + mov ebx,[s] + mov eax,[mat] + mov ecx,[d] + fld [DWORD PTR ebx] // x + fld [DWORD PTR eax+12] // m03 x + fmul st,st(1) // xm03 x + fld [DWORD PTR ebx+4] // y xm03 x + fld [DWORD PTR eax+28] // m13 y xm03 x + fmul st,st(1) // m13y y xm03 x + + fld [DWORD PTR ebx+8] // z m13y y xm03 x + fld [DWORD PTR eax+44] // m23 z m13y y xm03 x + fmul st,st(1) // m23z z m13y y xm03 x + fxch st(2) // m13y z m23z y xm03 x + faddp st(4),st // z m23z y m13y+xm03 x + fxch st(1) // m23z z y m13y+xm03 x + faddp st(3),st // z y m23z+m13y+xm03 x + fxch st(2) // m23z+m13y+xm03 y z x + fld [DWORD PTR ebx+12] // m33+m23z+m13y+xm03 y z x + fmul [DWORD PTR eax+60] // m33+m23z+m13y+xm03 y z x + faddp st(1),st + fxch st(3) // x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax] // m00 x y z 1/m33+m23z+m13y+xm03 + fmul st,st(1) // m00x x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+4] // m01 m00x x y z 1/m33+m23z+m13y+xm03 + fmul st,st(2) // m01x m00x x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+8] // m02 m01x m00x x y z 1/m33+m23z+m13y+xm03 + fmulp st(3),st // m01x m00x m02x y z 1/m33+m23z+m13y+xm03 + fxch st(1) // m00x m01x m02x y z 1/m33+m23z+m13y+xm03 + fxch st(2) // m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+16] // m10 m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fmul st,st(4) // m10y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+20] // m11 m10y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + + + fmul st,st(5) // m11y m10y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + fxch st(1) // m10y m11y m02x m01x m00x y z 1/m33+m23z+m13y+xm03 + faddp st(4),st // m11y m02x m01x m00x+m10y y z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+24] // m12 m11y m02x m01x m00x+m10y y z 1/m33+m23z+m13y+xm03 + fmulp st(5),st // m11y m02x m01x m00x+m10y m12y z 1/m33+m23z+m13y+xm03 + + faddp st(2),st // m02x m01x+m11y m00x+m10y m12y z 1/m33+m23z+m13y+xm03 + faddp st(3),st // m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + + fld [DWORD PTR eax+32] // m20 m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + fmul st,st(4) // m20z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+36] // m21 m20z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + + fmul st,st(5) // m21z m20z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + fxch st(1) // m20z m21z m01x+m11y m00x+m10y m12y+m02x z 1/m33+m23z+m13y+xm03 + faddp st(3),st // m21z m01x+m11y m00x+m10y+m20z m12y+m02x z 1/m33+m23z+m13y+xm03 + + fld [DWORD PTR eax+40] // m22 m21z m01x+m11y m00x+m10y+m20z m12y+m02x z 1/m33+m23z+m13y+xm03 + fmulp st(5),st // m21z m01x+m11y m00x+m10y+m20z m12y+m02x m22z 1/m33+m23z+m13y+xm03 + faddp st(1),st // m21z+m01x+m11y m00x+m10y+m20z m12y+m02x m22z 1/m33+m23z+m13y+xm03 + fxch st(3) // m22z m00x+m10y+m20z m12y+m02x m21z+m01x+m11y 1/m33+m23z+m13y+xm03 + faddp st(2),st // m00x+m10y+m20z m22z+m12y+m02x m21z+m01x+m11y 1/m33+m23z+m13y+xm03 + + +// fadd [DWORD PTR eax+48] // m00x+m10y+m20z+m30 m22z+m12y+m02x m21z+m01x+m11y 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+48] + fmul [DWORD PTR ebx+12] + faddp st(1),st + fxch st(2) // m21z+m01x+m11y m22z+m12y+m02x m00x+m10y+m20z+m30 1/m33+m23z+m13y+xm03 + + fld [DWORD PTR eax+52] + fmul [DWORD PTR ebx+12] + faddp st(1),st + fxch st(1) // m22z+m12y+m02x m21z+m01x+m11y+m31 m00x+m10y+m20z+m30 1/m33+m23z+m13y+xm03 + fld [DWORD PTR eax+56] + fmul [DWORD PTR ebx+12] + faddp st(1),st + + fstp [DWORD PTR ecx+8] + fstp [DWORD PTR ecx+4] + fstp [DWORD PTR ecx] + fstp [DWORD PTR ecx+12] + } +} + + + + + +void Matrix4::SetRow(int i,const Vect3 &t) +{ + m[i][0]=t[0]; + m[i][1]=t[1]; + m[i][2]=t[2]; + flags=0; +} + +void Matrix4::SetColumn(int i,const Vect3 &t) +{ + m[0][i]=t[0]; + m[1][i]=t[1]; + m[2][i]=t[2]; + flags=0; +} + +void Matrix4::SetRow(int i) +{ + m[i][0]=0; + m[i][1]=0; + m[i][2]=0; + flags=0; +} + +void Matrix4::SetColumn(int i) +{ + m[0][i]=0; + m[1][i]=0; + m[2][i]=0; + flags=0; +} + +void Matrix4::SetFromDouble(double *d) +{ + int i; + float *f; + for (f=m[0],i=0;i<16;i++,f++,d++) + *f=(float)*d; + flags=0; +} + + +void Matrix4::MultiplyColumn(int i,float f) +{ + m[0][i]*=f; + m[1][i]*=f; + m[2][i]*=f; + flags=0; +} + +float Matrix4::GetColumnLen(int i) +{ + float d; + d=m[0][i]*m[0][i]+m[1][i]*m[1][i]+m[2][i]*m[2][i]; + assert(d>EPS_MATRIX); + return sqrt(d); +} + +void Matrix4::Transpose() +{ + int i,j; + float swap; + for (i=0;i<4;i++) + { + for (j=i+1;j<4;j++) + { + swap=m[i][j]; + m[i][j]=m[j][i]; + m[j][i]=swap; + } + } +} + diff --git a/Source/Game/ghoul/matrix4.h b/Source/Game/ghoul/matrix4.h new file mode 100644 index 0000000..207986b --- /dev/null +++ b/Source/Game/ghoul/matrix4.h @@ -0,0 +1,77 @@ +#if !defined(MATRIX4_INC) +#define MATRIX4_INC + +#include "vect3.h" +#include +#include + +#pragma warning( disable : 4244) +extern const float Pi; +extern const float Half_Pi; + + +#define MATFLAG_IDENTITY (1) +class Matrix4 +{ + float m[4][4]; + int flags; +public: + Matrix4() {flags=0;} + Matrix4(const Matrix4 &o); + float* operator[](int i) {return m[i];flags=0;} + const float* operator[](int i) const {return m[i];} + void SetElem(int r,int c,float v) {m[r][c]=v;flags=0;} + const float &Elem(int r,int c) const {return m[r][c];} + void SetFromMem(const float *mem) {memcpy(m,mem,sizeof(float)*16);CalcFlags();} + void GetFromMem(float *mem) const {memcpy(mem,m,sizeof(float)*16);} + void Identity(); + void Zero(); + int CalcFlags(); + int GetFlags() const {return flags;} + bool IntegrityCheck() const; + void Translate(const float tx,const float ty,const float tz); + void Translate(const Vect3 &t); + void Rotate(int axis,const float theta); + void Rotate(const float rx,const float ry,const float rz); + void Rotate(const Vect3 v); + void Scale(const float sx,const float sy,const float sz); + void Scale(const float sx); + void Concat(const Matrix4 &m1,const Matrix4 &m2); + void Interp(const Matrix4 &m1,float s1,const Matrix4 &m2,float s2); + void Interp(const Matrix4 &m1,const Matrix4 &m2,float s1); + void XFormPoint(Vect3 &dest,const Vect3 &src) const; + float HXFormPoint(Vect3 &dest,const Vect3 &src) const; + void HXFormPointND(float *dest,const float *src) const; + void XFormVect(Vect3 &dest,const Vect3 &src) const; + void XFormVectTranspose(Vect3 &dest,const Vect3 &src) const; + void SetRow(int i,const Vect3 &t); + void SetColumn(int i,const Vect3 &t); + void SetRow(int i); + void SetColumn(int i); + void SetFromDouble(double *d); + void MultiplyColumn(int i,float f); + float GetColumnLen(int i); + void Inverse(const Matrix4 &old); + void OrthoNormalInverse(const Matrix4 &old); + void FindFromPoints(const Vect3 base1[4],const Vect3 base2[4]); + void MakeEquiscalar(); + float Det(); + float MaxAbsElement(); + void GetRow(int r,Vect3 &v) const {v.x()=m[r][0];v.y()=m[r][1];v.z()=m[r][2];} + void GetColumn(int r,Vect3 &v) const {v.x()=m[0][r];v.y()=m[1][r];v.z()=m[2][r];} + void Transpose(); + bool operator== (const Matrix4& t) const; +}; + + +int GetTextureSystem( + const Vect3 &p0,const Vect3 &uv0, //vertex 0 + const Vect3 &p1,const Vect3 &uv1, //vertex 1 + const Vect3 &p2,const Vect3 &uv2, //vertex 2 + const Vect3 &n, // normal vector for triangle + Vect3 &M, // returned gradient wrt u + Vect3 &N, // returned gradient wrt v + Vect3 &P); // returned location in world space where u=v=0 + + +#endif \ No newline at end of file diff --git a/Source/Game/ghoul/packet.h b/Source/Game/ghoul/packet.h new file mode 100644 index 0000000..9c5d26b --- /dev/null +++ b/Source/Game/ghoul/packet.h @@ -0,0 +1,226 @@ +#if !defined(PACKET_INC) +#define PACKET_INC + +#include +#include +using namespace std; + +class InPacket; +class OutPacket +{ + int InitialSize; + int CheckPoint; + friend class InPacket; + vector Data; + int BitPos; +public: + OutPacket(int initialSize); + bool SetCheckPoint(); + void PutBits(const void *x,int NumBits); + void PutBool(bool t) {PutBits(&t,1);} + int SizeBytes() const {return Data.size();} + int SizeBits() const {return BitPos;} + int RemainingBytes() const {return InitialSize-(BitPos+7)/8;} + const unsigned char *Buffer() const {return &Data[0];} + void PutBytes(const void *x,int NumBytes) {PutBits(x,NumBytes*8);} + void Concat(const OutPacket &c) {PutBits(&c.Data[0],c.BitPos);} + void PutString(const string &x) {PutString(x.c_str());} + void PutString(const char *x); + template void Put(T &x) {PutBytes(&x,sizeof(T));} + template void PutVRS(const T &x) + { + if (!x) + { + PutBool(false); + return; + } + PutBool(true); + T xx=x; + if (xx<0) + { + PutBool(true); + xx=-xx; + } + else + PutBool(false); + int blocksize=sizeof(T)*2; + T m; + int num; + for (num=0,m=1<=m;m<<=blocksize,num++) + ; + assert(num<4); + PutBits(&num,2); + PutBits(&xx,(num+1)*blocksize); + } + template void PutVRU(const T &x) + { + static const int zero=0; + static const int one=1; + assert(x>=0); + if (!x) + { + PutBool(false); + return; + } + PutBool(true); + int blocksize=sizeof(T)*2; + T m; + int num; + for (num=0,m=1<=m;m<<=blocksize,num++) + ; + assert(num<4); + PutBits(&num,2); + PutBits(&x,(num+1)*blocksize); + } + template void Delta(const T &x,const T &old) + { + if (x==old) + PutBool(false); + else + { + PutBool(true); + Put(x); + } + } + template void DeltaVRS(const T &x,const T &old) + { + if (x==old) + PutBool(false); + else + { + PutBool(true); + PutVRS(x); + } + } + template void DeltaVRU(const T &x,const T &old) + { + if (x==old) + PutBool(false); + else + { + PutBool(true); + PutVRU(x); + } + } + template void PutBU(const T &x,int bits) + { + if (!bits) + return; + PutBits(&x,bits); + } + template void DeltaBU(const T &x,const T &old,int bits) + { + if (!bits) + return; + if (x==old) + PutBool(false); + else + { + PutBool(true); + PutBU(x,bits); + } + } +}; + +class InPacket +{ + vector Data; + int BitPos; + bool Underflowed; +public: + InPacket(const unsigned char *buffer,int size); + InPacket(const OutPacket &op); + int BytePos() {return (BitPos+7)/8;} + bool GetBits(void *x,int NumBits); + bool SkipBits(int NumBits); + bool GetBool() {bool t;GetBits(&t,1);return t;} + bool UnderFlow() const {return Underflowed;} + + int SizeBytes() const {return Data.size();} + const unsigned char *GetData() const {return &Data[0];} + bool GetBytes(void *x,int NumBytes) {return GetBits(x,NumBytes*8);} + bool GetString(string &x); + template bool Get(T &x) {return GetBytes(&x,sizeof(T));} + template bool GetVRS(T &x) + { + int blocksize=sizeof(T)*2; + unsigned char num=0; + bool sign; + x=0; + if (GetBool()) + { + sign=GetBool(); + GetBits(&num,2); + assert(num<4); + GetBits(&x,(num+1)*blocksize); + if (sign) + x=-x; + } + return Underflowed; + } + template bool GetVRU(T &x) + { + int blocksize=sizeof(T)*2; + unsigned char num=0; + x=0; + if (GetBool()) + { + GetBits(&num,2); + assert(num<4); + GetBits(&x,(num+1)*blocksize); + assert(x>=0); + } + return Underflowed; + } + template bool Delta(T &x) + { + if (GetBool()) + { + Get(x); + return true; + } + return false; + } + template bool DeltaVRS(T &x) + { + if (GetBool()) + { + GetVRS(x); + return true; + } + return false; + } + template bool DeltaVRU(T &x) + { + if (GetBool()) + { + GetVRU(x); + return true; + } + return false; + } + template bool GetBU(T &x,int bits) + { + x=T(0); + if (!bits) + return Underflowed; + GetBits(&x,bits); + return Underflowed; + } + template bool DeltaBU(T &x,int bits) + { + if (!bits) + { + x=T(0); + return false; + } + if (GetBool()) + { + GetBU(x,bits); + return true; + } + return false; + } +}; + +#endif \ No newline at end of file diff --git a/Source/Game/ghoul/vect3.cpp b/Source/Game/ghoul/vect3.cpp new file mode 100644 index 0000000..7a5f137 --- /dev/null +++ b/Source/Game/ghoul/vect3.cpp @@ -0,0 +1,107 @@ +#include "vect3.h" + + +const Vect3 Vect3X(1.f,0.f,0.f); +const Vect3 Vect3Y(0.f,1.f,0.f); +const Vect3 Vect3Z(0.f,0.f,1.f); +const Vect3 Vect3negX(-1.f,0.f,0.f); +const Vect3 Vect3negY(0.f,-1.f,0.f); +const Vect3 Vect3negZ(0.f,0.f,-1.f); +const Vect3 Vect3Zero(0.f,0.f,0.f); + +const Vect3 &Vect3::operator/= (const float d) +{ + float inv=1.f/d; + return (*this)*=inv; +} + +void Vect3::Cross(const Vect3& p) +{ + Vect3 t=*this; + v[0]=t.v[1]*p.v[2]-t.v[2]*p.v[1]; + v[1]=t.v[2]*p.v[0]-t.v[0]*p.v[2]; + v[2]=t.v[0]*p.v[1]-t.v[1]*p.v[0]; +} + +void Vect3::NegCross(const Vect3& p) +{ + Vect3 t=*this; + v[0]=p.v[1]*t.v[2]-p.v[2]*t.v[1]; + v[1]=p.v[2]*t.v[0]-p.v[0]*t.v[2]; + v[2]=p.v[0]*t.v[1]-p.v[1]*t.v[0]; +} + +float Vect3::Dist(const Vect3& p) const +{ + Vect3 t=*this; + t-=p; + return t.Len(); +} + +float Vect3::Dist2(const Vect3& p) const +{ + Vect3 t=*this; + t-=p; + return t^t; +} + +void Vect3::Perp() +{ + float rlen,tlen; + Vect3 r,t; + r=*this; + r.Cross(Vect3X); + rlen=r.Len(); + t=*this; + t.Cross(Vect3Y); + tlen=t.Len(); + if (tlen>rlen) + { + r=t; + rlen=tlen; + } + t=*this; + t.Cross(Vect3Z); + tlen=t.Len(); + if (tlen>rlen) + { + r=t; + rlen=tlen; + } + *this=r; +} + +void Vect3::Min(const Vect3& p) +{ + if (p.v[0]v[0]) + v[0]=p.v[0]; + if (p.v[1]>v[1]) + v[1]=p.v[1]; + if (p.v[2]>v[2]) + v[2]=p.v[2]; +} + +float Vect3::MaxElement() const +{ + return v[MaxElementIndex()]; +} + +int Vect3::MaxElementIndex() const +{ + if (fabs(v[0])>fabs(v[1])&&fabs(v[0])>fabs(v[2])) + return 0; + if (fabs(v[1])>fabs(v[2])) + return 1; + return 2; +} + diff --git a/Source/Game/ghoul/vect3.h b/Source/Game/ghoul/vect3.h new file mode 100644 index 0000000..0cdee4f --- /dev/null +++ b/Source/Game/ghoul/vect3.h @@ -0,0 +1,91 @@ +#if !defined(VECT3_INC) +#define VECT3_INC + +#include +#include + +class Vect3 +{ + float v[3]; +public: + Vect3(const float val) {v[0]=val;v[1]=val;v[2]=val;} + Vect3() {}//never put anything in here! too slow} + Vect3(const float x,const float y,const float z) {v[0]=x;v[1]=y;v[2]=z;} + Vect3(const Vect3& t) {v[0]=t.v[0];v[1]=t.v[1];v[2]=t.v[2];} + Vect3(const float *t) {v[0]=t[0];v[1]=t[1];v[2]=t[2];} + float& operator[](int i) {return v[i];} + float& x() {return v[0];} + float& y() {return v[1];} + float& z() {return v[2];} + const float& operator[](int i) const {return v[i];} + const float& x() const {return v[0];} + const float& y() const {return v[1];} + const float& z() const {return v[2];} + void Set(const float x,const float y,const float z) {v[0]=x;v[1]=y;v[2]=z;} + + float Len() const {return (float)sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);} + float Len2() const {return v[0]*v[0]+v[1]*v[1]+v[2]*v[2];} + void Norm() {(*this)/=this->Len();} + bool ZeroNorm() {float d=this->Len();if (d>1E-10) {(*this)/=d;return true;} (*this)=0.0f; return false;} + void SafeNorm() {assert(this->Len()>1E-10);(*this)/=this->Len();} + + const Vect3 &operator= (const float d) {v[0]=d;v[1]=d;v[2]=d; return *this; } + const Vect3 &operator= (const Vect3& t) {v[0]=t.v[0];v[1]=t.v[1];v[2]=t.v[2]; return *this; } + + const Vect3 &operator+= (const float d) {v[0]+=d;v[1]+=d;v[2]+=d; return *this; } + const Vect3 &operator+= (const Vect3& t) {v[0]+=t.v[0];v[1]+=t.v[1];v[2]+=t.v[2]; return *this; } + + const Vect3 &operator-= (const float d) {v[0]-=d;v[1]-=d;v[2]-=d; return *this; } + const Vect3 &operator-= (const Vect3& t) {v[0]-=t.v[0];v[1]-=t.v[1];v[2]-=t.v[2]; return *this; } + + const Vect3 &operator*= (const float d) {v[0]*=d;v[1]*=d;v[2]*=d; return *this; } + const Vect3 &operator*= (const Vect3& t) {v[0]*=t.v[0];v[1]*=t.v[1];v[2]*=t.v[2]; return *this; } + + const Vect3 &operator/= (const float d); + const Vect3 &operator/= (const Vect3& t) {v[0]/=t.v[0];v[1]/=t.v[1];v[2]/=t.v[2]; return *this; } + + float operator^ (const Vect3& t) const {return v[0]*t.v[0]+v[1]*t.v[1]+v[2]*t.v[2];} + + float Dist(const Vect3&) const; + float Dist2(const Vect3&) const; + void Cross(const Vect3&); + void NegCross(const Vect3&); + void Perp(); + void Min(const Vect3&); + void Max(const Vect3&); + float MaxElement() const; + int MaxElementIndex() const; + + void Interp(const Vect3 &v1,const Vect3 &v2,float t) {*this=v1;*this-=v2;*this*=t;*this+=v2;} + bool operator== (const Vect3& t) const {return v[0]==t.v[0]&&v[1]==t.v[1]&&v[2]==t.v[2];} + bool operator< (const Vect3& t) const {assert(0);return false;} + bool operator!= (const Vect3& t) const {return !(v[0]==t.v[0]&&v[1]==t.v[1]&&v[2]==t.v[2]);} + bool operator> (const Vect3& t) const {assert(0);return false;} + + inline Vect3 operator +(const Vect3 &rhs) const { return Vect3(v[0]+rhs.v[0], v[1]+rhs.v[1], v[2]+rhs.v[2]); } + inline Vect3 operator -(const Vect3 &rhs) const { return Vect3(v[0]-rhs.v[0], v[1]-rhs.v[1], v[2]-rhs.v[2]); } + inline Vect3 operator *(const Vect3 &rhs) const { return Vect3(v[0]*rhs.v[0], v[1]*rhs.v[1], v[2]*rhs.v[2]); } + inline Vect3 operator *(const float scalar) const { return Vect3(v[0]*scalar, v[1]*scalar, v[2]*scalar); } + inline friend Vect3 operator *(const float scalar, const Vect3 &rhs); + inline Vect3 operator /(const Vect3 &rhs) const { return Vect3(v[0]/rhs.v[0], v[1]/rhs.v[1], v[2]/rhs.v[2]); } + inline Vect3 operator /(const float scalar) const { return Vect3(v[0]/scalar, v[1]/scalar, v[2]/scalar); } +}; + +inline Vect3 operator *(const float scalar, const Vect3 &rhs) +{ + return Vect3(scalar*rhs.v[0], scalar*rhs.v[1], scalar*rhs.v[2]); +} + + +extern const Vect3 Vect3X; +extern const Vect3 Vect3Y; +extern const Vect3 Vect3Z; +extern const Vect3 Vect3negX; +extern const Vect3 Vect3negY; +extern const Vect3 Vect3negZ; +extern const Vect3 Vect3Zero; + + + + +#endif \ No newline at end of file diff --git a/Source/Game/player/player.cpp b/Source/Game/player/player.cpp new file mode 100644 index 0000000..5d460aa --- /dev/null +++ b/Source/Game/player/player.cpp @@ -0,0 +1,71 @@ +// player.cpp : Defines the entry point for the DLL application. +// + +#include "q_shared.h" +#include "..\ghoul\ighoul.h" +#include "w_public.h" +#include "w_types.h" +#include "w_weapons.h" +#include "w_utils.h" +#include "player.h" + +player_com_import_t picom; +player_cl_import_t picl; +player_sv_import_t pisv; +player_export_t pe; + +int isClient; + +extern inven_c *W_NewInv(void); +extern void W_KillInv(inven_c *inven); +extern void RefreshWeapon(inven_c *inven); + +extern weaponInfo_c *weapInfo[SFW_NUM_WEAPONS]; +extern int fireEvent; +extern int altfireEvent; + +qboolean P_Init(void) +{ + return(true); +} + +void P_Shutdown(void) +{ +} + +void InitExports(void) +{ + pe.api_version = PLAYER_API_VERSION; + + pe.Init=P_Init; + pe.Shutdown=P_Shutdown; + pe.isClient=&isClient; + pe.weapInfo=(void **)weapInfo; + pe.fireEvent=&fireEvent; + pe.altfireEvent=&altfireEvent; + pe.PrecacheViewWeaponModels=W_PrecacheViewWeaponModels; + pe.UncacheViewWeaponModels=W_UncacheViewWeaponModels; + pe.NewInv=W_NewInv; + pe.KillInv=W_KillInv; + pe.RefreshWeapon=RefreshWeapon; +} + +player_export_t *GetPlayerClientAPI(player_com_import_t *pimpcom,player_cl_import_t *pimpcl) +{ + picom=*pimpcom; + picl=*pimpcl; + + InitExports(); + + return(&pe); +} + +player_export_t *GetPlayerServerAPI(player_com_import_t *pimpcom,player_sv_import_t *pimpsv) +{ + picom=*pimpcom; + pisv=*pimpsv; + + InitExports(); + + return(&pe); +} \ No newline at end of file diff --git a/Source/Game/player/player.def b/Source/Game/player/player.def new file mode 100644 index 0000000..97e31d8 --- /dev/null +++ b/Source/Game/player/player.def @@ -0,0 +1,3 @@ +EXPORTS + GetPlayerClientAPI + GetPlayerServerAPI diff --git a/Source/Game/player/player.dsp b/Source/Game/player/player.dsp new file mode 100644 index 0000000..ee323d8 --- /dev/null +++ b/Source/Game/player/player.dsp @@ -0,0 +1,276 @@ +# Microsoft Developer Studio Project File - Name="player" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=player - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "player.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "player.mak" CFG="player - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "player - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "player - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "player - Win32 Final Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName ""$/SOF/Code2/player", UDWAAAAA" +# PROP Scc_LocalPath "." +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "player - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\Release" +# PROP Intermediate_Dir ".\Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /Zi /O2 /Ob2 /I "..\gamecpp" /I "..\qcommon" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# SUBTRACT CPP /Fr +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x40000000" /subsystem:windows /dll /profile /debug /machine:I386 +# SUBTRACT LINK32 /map + +!ELSEIF "$(CFG)" == "player - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\gamecpp" /I "..\qcommon" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"../Debug/player.dll" /pdbtype:sept + +!ELSEIF "$(CFG)" == "player - Win32 Final Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "player___Win32_Final_Release" +# PROP BASE Intermediate_Dir "player___Win32_Final_Release" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Final" +# PROP Intermediate_Dir "Final" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /Zi /O2 /I "..\gamecpp" /I "..\qcommon" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FR /YX /FD /c +# ADD CPP /nologo /W3 /Gi /GX /O2 /Ob2 /I "..\gamecpp" /I "..\qcommon" /D "NDEBUG" /D "_FINAL_" /D "WIN32" /D "_WINDOWS" /YX /FD /c +# SUBTRACT CPP /Fr +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 ../smartheap/shlw32m.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /map:"..\Release/player.map" /debug /machine:I386 /out:"../Release/player.dll" +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x40000000" /subsystem:windows /dll /pdb:none /map:"..\Final/player.map" /machine:I386 /out:"../Final/player.dll" +# SUBTRACT LINK32 /debug + +!ENDIF + +# Begin Target + +# Name "player - Win32 Release" +# Name "player - Win32 Debug" +# Name "player - Win32 Final Release" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\player.cpp +# End Source File +# Begin Source File + +SOURCE=..\smartheap\SMRTHEAP.C + +!IF "$(CFG)" == "player - Win32 Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "player - Win32 Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "player - Win32 Final Release" + +# PROP BASE Exclude_From_Build 1 +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\w_equip_attack.cpp +# End Source File +# Begin Source File + +SOURCE=.\w_equip_misc.cpp +# End Source File +# Begin Source File + +SOURCE=.\w_equipment.cpp +# End Source File +# Begin Source File + +SOURCE=.\w_inven.cpp +# End Source File +# Begin Source File + +SOURCE=.\w_models.cpp +# End Source File +# Begin Source File + +SOURCE=.\w_network.cpp +# End Source File +# Begin Source File + +SOURCE=.\w_utils.cpp +# End Source File +# Begin Source File + +SOURCE=.\w_weapons.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\qcommon\Angles.h +# End Source File +# Begin Source File + +SOURCE=..\gamecpp\game.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\GSQFile.h +# End Source File +# Begin Source File + +SOURCE=..\ghoul\ighoul.h +# End Source File +# Begin Source File + +SOURCE=..\strings\items.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\matrix4.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\palette.h +# End Source File +# Begin Source File + +SOURCE=.\player.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\pmove.h +# End Source File +# Begin Source File + +SOURCE=..\gamecpp\q_shared.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\qcommon.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\qfiles.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\snd_common.h +# End Source File +# Begin Source File + +SOURCE=..\qcommon\vect3.h +# End Source File +# Begin Source File + +SOURCE=.\w_equipment.h +# End Source File +# Begin Source File + +SOURCE=.\w_network.h +# End Source File +# Begin Source File + +SOURCE=.\w_public.h +# End Source File +# Begin Source File + +SOURCE=.\w_types.h +# End Source File +# Begin Source File + +SOURCE=.\w_utils.h +# End Source File +# Begin Source File + +SOURCE=.\w_weapons.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\player.def +# End Source File +# End Group +# End Target +# End Project diff --git a/Source/Game/player/player.dsw b/Source/Game/player/player.dsw new file mode 100644 index 0000000..03edbd9 --- /dev/null +++ b/Source/Game/player/player.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "player"=.\player.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/Source/Game/player/player.h b/Source/Game/player/player.h new file mode 100644 index 0000000..f44efa5 --- /dev/null +++ b/Source/Game/player/player.h @@ -0,0 +1,234 @@ +#ifndef __PLAYER_H +#define __PLAYER_H + +#include "GSQFile.h" +#include "qcommon.h" + +#define PLAYER_API_VERSION 1 + +typedef struct edict_s edict_t; +typedef struct sharedEdict_s sharedEdict_t; +class inven_c; +class itemSlot_c; + +// +// These are the functions exported by the player dll module. +// + +typedef struct +{ + // If api_version is different, the dll cannot be used. + + int api_version; + + // + + int *isClient; + + // Called when the dll is loaded / unloaded. + + qboolean (*Init)(void); + void (*Shutdown)(void); + + // Pointer to weapInfo array. + + void **weapInfo; + + // Fire event pointers. + + int *fireEvent; + int *altfireEvent; + + // View weapon model caching. Should only ever be called from server. + + void (*PrecacheViewWeaponModels)(int types); + void (*UncacheViewWeaponModels)(void); + + // Creates a new inventory. + + inven_c *(*NewInv)(void); + void (*KillInv)(inven_c *inven); + void (*RefreshWeapon)(inven_c *inven); +} player_export_t; + +// +// These are the functions imported by the player dll module when it is called +// from the client or server. +// + +typedef struct +{ + // Cvar stuff. + + cvar_t *(*Cvar_Get)(const char *name, const char *value, int flags, cvarcommand_t command = NULL); + cvar_t *(*Cvar_Set)(const char *name, const char *value ); + void (*Cvar_SetValue)(const char *name, float value ); + + // Command processing. + + int (*Cmd_Argc) (void); + char *(*Cmd_Argv) (int i); + char *(*Cmd_Args) (void); + + // Output to console, etc. + + void (*Com_Printf) (char *str, ...); + void (*Com_Sprintf) (char *dest, int size, char *fmt, ...); + void (*Com_DPrintf) (char *fmt, ...); + + // File handling. + + int (*FS_LoadFile) (char *name, void **buf, bool OverridePak = false); + void (*FS_FreeFile) (void *buf); + + // Misc + + int (*irand)(int min, int max); + + // Ghoul stuff. + + cvar_t *ghl_specular; + IPlayerModelInfoC *(*NewPlayerModelInfo)(char *modelname); + int (*FindGSQFile)(char *gsqdir, char *gsqfile, void **buffer); + bool (*ReadGsqEntry)(int &filesize, char **tdata, char *seqname); + void (*PrecacheGSQFile)(char *dirname, char *gsq_file, IGhoulObj *object); + int (*RegisterGSQSequences)(char *gsqdir, char *subclass, IGhoulObj *object); + void (*TurnOffPartsFromGSQFile)(char *dirname, char *poff_file, IGhoulObj *this_object, IGhoulInst *this_inst); +} player_com_import_t; + +// +// These are the functions imported by the player dll module when it is called +// from the client. +// + +typedef struct +{ + // So we can grab the Ghoul pointer we need so badly. + + void *(*GetGhoul)(); + + // Getting level.time for weapon prediction. + + float *levelTime; + + // Helper functions for weapon firing. + + void (*FireHelper)(sharedEdict_t &sh, edict_t &ent, inven_c &inven); + void (*AltfireHelper)(sharedEdict_t &sh, edict_t &ent, inven_c &inven); + void (*WeapSoundHelper)(const void *data); + void (*WeapSoundKill)(void); + void (*WeaponEffectHelper)(const void *data); + + // Network stuff. + + int (*ReadByte)(void); + int (*ReadShort)(void); + int (*ReadLong)(void); + int (*ReadByteSizebuf)(sizebuf_t *sz); + int (*ReadShortSizebuf)(sizebuf_t *sz); + int (*ReadLongSizebuf)(sizebuf_t *sz); + void (*ReadDataSizebuf)(sizebuf_t *sz, unsigned char *addr, int len); + void (*WriteByteSizebuf)(sizebuf_t *sz,int b); + void (*WriteShortSizebuf)(sizebuf_t *sz,int s); + void (*WriteLongSizebuf)(sizebuf_t *sz,int i); + + // Sizebuf stuff. + + void (*SZ_Init)(sizebuf_t *buf, byte *data, int length); + void (*SZ_Clear)(sizebuf_t *buf); + void (*SZ_Write)(sizebuf_t *buf, const void *data, int length); +} player_cl_import_t; + +// +// These are the functions imported by the player dll module when it is called +// from the server. +// + +typedef struct +{ + // So we can grab the Ghoul pointer we need so badly. + + void *(*GetGhoul)(); + + // Getting level.time for weapon prediction. + + float *levelTime; + + // Helper functions for weapon firing, reloading etc. + + void (*FireHelper)(sharedEdict_t &sh, edict_t &ent, inven_c &inven); + void (*AltfireHelper)(sharedEdict_t &sh, edict_t &ent, inven_c &inven); + void (*ShowReload)(edict_t *ent); + void (*WeaponDrop)(edict_t *ent,int type, int clipSize); + void (*ShowItemUse)(edict_t *ent, int itemType); + void (*ItemDrop)(edict_t *ent,int type,int ammoCount); + + // Helper functions for caching + + void (*CacheAttack)(int atkID); + + // Helper functions for sound stuff. + + int (*EffectIndex)(const char *name); + int (*SoundIndex)(const char *name); + void (*Sound)(edict_t *ent, int channel, int soundindex, float volume, float attenuation, float timeofs, int localize); + + // Helper functions for ctf sound stuff. + + bool (*DoWeHaveTheFlag)(edict_t *ent); + + // Weapon fire synching shit. + + float (*getFireEvent)(edict_t *ent); + void (*clearFireEvent)(edict_t *ent); + float (*getAltfireEvent)(edict_t *ent); + void (*clearAltfireEvent)(edict_t *ent); + + // Console stuff, used for level changning + + void (*AddCommand)(const char *name); + char *(*CvarInfo)(int flag); + + // Output to console, etc. + + void (*SP_Print)(edict_t *ent, unsigned short ID, ...); + const char *(*SP_GetStringText)(unsigned short ID); +// void (*SP_ColorPrint)(char *color, edict_t *ent, unsigned short ID, ...); + + // Helper functions for equipment useage. + + bool (*flashpackUse)(edict_t &ent, itemSlot_c &slot); + bool (*neuralGrenadeUse)(edict_t &ent, itemSlot_c &slot); + bool (*c4use)(edict_t &ent, itemSlot_c &slot); + bool (*claymoreuse)(edict_t &ent, itemSlot_c &slot); + bool (*medkituse)(edict_t &ent, itemSlot_c &slot); + bool (*grenadeuse)(edict_t &ent, itemSlot_c &slot); + bool (*goggleuse)(edict_t &ent, itemSlot_c &slot); + + // Network stuff. + + void (*WriteByteSizebuf)(sizebuf_t *sz,int c); + void (*WriteShortSizebuf)(sizebuf_t *sz,int s); + void (*WriteLongSizebuf)(sizebuf_t *sz,int i); + void (*ReliableWriteByteToClient)(byte b,int clientNum); + void (*ReliableWriteDataToClient)(const void *data,int length,int clientNum); + + // Sizebuf stuff. + + void (*SZ_Init)(sizebuf_t *buf, byte *data, int length); + void (*SZ_Clear)(sizebuf_t *buf); + void (*SZ_Write)(sizebuf_t *buf, const void *data, int length); + + // Savegame stuff + + qboolean (*AppendToSavegame)(unsigned long chid, void *data, int length); + int (*ReadFromSavegame)(unsigned long chid, void *address, int length, void **addressptr = NULL); +} player_sv_import_t; + +// +// This is the only function actually exported at the linker level. +// + +typedef player_export_t (*GetPlayerAPI_t) (player_com_import_t*,player_cl_import_t*,player_sv_import_t*); + +#endif // __PLAYER_H \ No newline at end of file diff --git a/Source/Game/player/w_equip_attack.cpp b/Source/Game/player/w_equip_attack.cpp new file mode 100644 index 0000000..0e62587 --- /dev/null +++ b/Source/Game/player/w_equip_attack.cpp @@ -0,0 +1,93 @@ +#include "q_shared.h" +#include "..\ghoul\ighoul.h" +#include "w_public.h" +#include "w_types.h" +#include "w_weapons.h" +#include "w_utils.h" +#include "player.h" +#include "../gamecpp/game.h" +#include "w_equipment.h" + +extern player_com_import_t picom; +extern player_cl_import_t picl; +extern player_sv_import_t pisv; + +extern int isClient; + +//none of these do anything... +flashpackInfo::flashpackInfo(void):itemInfo_c() +{ +} + +neuralGrenadeInfo::neuralGrenadeInfo(void):itemInfo_c() +{ +} + +c4Info::c4Info(void):itemInfo_c() +{ +} + +claymoreInfo::claymoreInfo(void):itemInfo_c() +{ +} + +grenadeInfo::grenadeInfo(void):itemInfo_c() +{ +} + +flagInfo::flagInfo(void):itemInfo_c() +{ +} + + +//------------------------------------------------------------------------------------ + +bool flashpackInfo::use(edict_t &ent, itemSlot_c &slot) +{ + if(!isClient) + return pisv.flashpackUse(ent,slot); + else + return true; +} + +//------------------------------------------------------------------------------------ + +bool neuralGrenadeInfo::use(edict_t &ent, itemSlot_c &slot) +{ + if(!isClient) + return pisv.neuralGrenadeUse(ent,slot); + else + return true; +} + +//------------------------------------------------------------------------------------ + +bool c4Info::use(edict_t &ent, itemSlot_c &slot) +{ + if(!isClient) + return pisv.c4use(ent,slot); + else + return true; +} + + +//------------------------------------------------------------------------------------ + +bool claymoreInfo::use(edict_t &ent, itemSlot_c &slot) +{ + if(!isClient) + return pisv.claymoreuse(ent, slot); + else + return true; +} + +//------------------------------------------------------------------------------------ + +bool grenadeInfo::use(edict_t &ent, itemSlot_c &slot) +{ + if(!isClient) + return pisv.grenadeuse(ent, slot); + else + return true; +} + diff --git a/Source/Game/player/w_equip_misc.cpp b/Source/Game/player/w_equip_misc.cpp new file mode 100644 index 0000000..3de4a8b --- /dev/null +++ b/Source/Game/player/w_equip_misc.cpp @@ -0,0 +1,118 @@ +#include "q_shared.h" +#include "..\ghoul\ighoul.h" +#include "w_public.h" +#include "w_types.h" +#include "w_weapons.h" +#include "w_utils.h" +#include "player.h" +#include "../gamecpp/game.h" +#include "w_equipment.h" + +extern player_com_import_t picom; +extern player_cl_import_t picl; +extern player_sv_import_t pisv; + +extern int isClient; + +//------------------------------------------------------------------------------------ +#define GOGGLE_MAX_POWER 100 +#define GOGGLE_DRAIN_TIME 0.3 +#define GOGGLE_CHARGE_TIME 0.5 + +lightGogglesInfo::lightGogglesInfo(void):itemInfo_c(){} + +void lightGogglesInfo::frameUpdate(sharedEdict_t &ent, itemSlot_c &slot) +{ + int power; + float nextupdate; + + // Obviously we only care if the client has the goggles on. If it isn't the client, it doesn't matter much. + if (!isClient) + { + if (slot.getSlotStatus()) + { // If the goggles are on. + nextupdate = slot.getSlotUpdateTime(); + + if (*(pisv.levelTime) > nextupdate) + { + power = slot.getSlotCount(); + power--; + if (power<=0) + { // Out of power, turn the goggles off. + slot.setSlotStatus(0); + slot.setSlotCount(0); + pisv.goggleuse(*(ent.edict), slot); + return; // Don't keep draining energy. + } + slot.setSlotCount(power); + nextupdate = *(pisv.levelTime) + GOGGLE_DRAIN_TIME; + slot.setSlotUpdateTime(nextupdate); + } + } + else + { // The goggles are off. + nextupdate = slot.getSlotUpdateTime(); + + while (*(pisv.levelTime) > nextupdate) + { + power = slot.getSlotCount(); + if (powergetName()); + } + */ + return; + } + + ammo--; + if(ammo <= 0) + { + if(!isClient) + pisv.SP_Print(ent.edict, ITEMS_AMMO_GONE, itInfo[itemType]->getName()); + + itemType = SFE_EMPTYSLOT; + status = 0; + inven(ent)->getItems()->setNextCommand(PEC_ITEMNEXT); + } + else + { + if(!isClient) + pisv.SP_Print(ent.edict, ITEMS_AMMO_COUNT, ammo, itInfo[itemType]->getName()); + } +} + +void itemSlot_c::clear(void) +{ + itemType = SFE_EMPTYSLOT; + ammo = 0; + status = 0; + nextupdate=0.0; +} + +//------------------------------------------------------------------------------------ + +item_c::item_c(void) +{ + curSlotNum = 0; + nextCommand = PEC_NOCOMMAND; + lastUseTime = 0; +} + +int item_c::getSlotNumFromName(char *itemName) +{ + int type=-1; + + if(!stricmp (itemName,"fpak")) + type=SFE_FLASHPACK; + else if(!stricmp (itemName,"c4")) + type=SFE_C4; + else if(!stricmp (itemName,"goggles")) + type=SFE_LIGHT_GOGGLES; + else if(!stricmp (itemName,"medkit")) + type=SFE_MEDKIT; + else if(!stricmp (itemName,"grenade")) + type=SFE_GRENADE; + else if(!stricmp (itemName,"ctf_flag")) + type=SFE_CTFFLAG; + + if(type<0) + return(-2); + + for(int i = 0; i < MAXITEMS; i++) + if(slots[i].getSlotType() == type) + return(i); + + return(-1); +} + +int item_c::addItemType(int type, int amount, int maxAmount) +{ + int i; + + for(i = 0; i < MAXITEMS; i++) + { + if(slots[i].getSlotType() == type) + { + // Do some tests to see if this many can actually be held. + if (maxAmount != -1) // Do we have a defined maximum? + { + if ((slots[i].getSlotCount() + amount) > maxAmount) // we can't pick up ALL of these + { + if(slots[i].getSlotCount() < maxAmount) // but we can pick up SOME of them + { + slots[i].setSlotCount(maxAmount); + return 1; + } + else // nope, no room at the inn, we're full + { + return 0; + } + } + } + + slots[i].setSlotCount(slots[i].getSlotCount() + amount); + return 1; + } + } + for(i = 0; i < MAXITEMS; i++) + { + // Okay, add it to an empty slot then. + + + if(slots[i].getSlotType() == SFE_EMPTYSLOT) + { + slots[i].setSlotType(type); + + // Do some tests to see if this many can actually be held. In this case, we're checking in case for SOME reason + // we don't have ANY of an item, but the item pickup actually has MORE than we are allowed to carry. Proper design + // should render this test unnecessary, but... + + if (maxAmount != -1) // Do we have a defined maximum? + { + if ((slots[i].getSlotCount() + amount) > maxAmount) // we can't pick up ALL of these + { + if(slots[i].getSlotCount() < maxAmount) // but we can pick up SOME of them + { + slots[i].setSlotCount(maxAmount); + return 1; + } + else // nope, no room at the inn, we're full + { + return 0; + } + } + } + + slots[i].setSlotCount(amount); + return 1; + } + } + return 0; +} + +int item_c::hasItemType(int type) +{ + for(int i = 0; i < MAXITEMS; i++) + { + if(slots[i].getSlotType() == type) + return 1; + } + + return(0); +} + +void item_c::HandleInput(sharedEdict_t &ent) +{ + int startSlot; + + if(nextCommand == PEC_NOCOMMAND) + return; + + startSlot = curSlotNum; + + if(nextCommand == PEC_DROP) + { + if(getCurSlot()->getSlotType()!=SFE_EMPTYSLOT) + { + // Handle deactivation of item, where required. + + itInfo[getCurSlot()->getSlotType()]->deactivate(*(ent.edict), *getCurSlot()); + + // Some items like the light-goggles are unique in the inventory but + // have ammo / charge so we need to ensure the dropped item has this much ammo. + // Other items like flahsbangs exist in multiples and we just drop one at a time. + + int amount=(itInfo[getCurSlot()->getSlotType()]->itemExistsAsUnique())?getCurSlot()->getSlotCount():1; + + // Drop an in-world entity. + + if(!isClient) + pisv.ItemDrop(inven(ent)->getOwner()->edict,getCurSlot()->getSlotType(),amount); + + if(itInfo[getCurSlot()->getSlotType()]->itemExistsAsUnique()) + { + // Claer the item slot 'cos we just dropped a unique item (e.g. light-goggles). + + getCurSlot()->clear(); + + // Select the next item slot. + + nextCommand = PEC_ITEMNEXT; + } + else + { + // Decrement the ammo count for the slot by 1 as we just dropped one :). + + getCurSlot()->useAmmo(ent); + } + + } + } + + if((nextCommand >= PEC_USEITEM)&&(nextCommand < PEC_USEITEMFIRST + MAXITEMS)) + { + if(!isClient) + { + if(lastUseTime + ITEM_USE_TIME > *pisv.levelTime) + { + // Can't mash on the item_c use button. + + return; + } + } + else + { + if(lastUseTime + ITEM_USE_TIME > *picl.levelTime) + { + // Can't mash on the item_c use button. + + return; + } + } + + itemSlot_c *slot; + + if(nextCommand == PEC_USEITEM) + { + slot=getCurSlot(); + } + else + { + slot=&slots[nextCommand-PEC_USEITEMFIRST]; + } + + if(slot->getSlotCount()) + { + if(ent.inv->inDisguise()) + { + // If we try to use anything other than medkit whilst disguised, + // we toggle outa disguise! + + if(slot->getSlotType() != SFE_MEDKIT) + ent.inv->becomeDisguised(); + } + + // Can't use the CTF FLAG!! + if (slot->getSlotType() == SFE_CTFFLAG) + return; + + if (!isClient) + pisv.ShowItemUse(ent.edict, slot->getSlotType()); + + int lastCmd=nextCommand; + + if (itInfo[slot->getSlotType()]->use(*(ent.edict), *slot)) + slot->useAmmo(ent); + + if((nextCommand==PEC_ITEMNEXT)&&(lastCmd>PEC_USEITEM)&&(slot!=getCurSlot())) + { + // PEC_ITEMNEXT can be issued if all slot's ammo was used. Don't + // want this though if a shortcut was used and it wasn't the current + // slot. + + nextCommand=PEC_NOCOMMAND; + } + } + + if(!isClient) + lastUseTime = *pisv.levelTime; + else + lastUseTime = *picl.levelTime; + } + + if(nextCommand == PEC_ITEMNEXT) + { + do + { + curSlotNum++; + if(curSlotNum >= MAXITEMS) + { + curSlotNum = 0; + } + }while((curSlotNum != startSlot)&&(getCurSlot()->getSlotType() == SFE_EMPTYSLOT)); + } + else if(nextCommand == PEC_ITEMPREV) + { + do + { + curSlotNum--; + if(curSlotNum < 0) + { + curSlotNum = MAXITEMS - 1; + } + }while((curSlotNum != startSlot)&&(getCurSlot()->getSlotType() == SFE_EMPTYSLOT)); + } + + nextCommand = PEC_NOCOMMAND; +} + +void item_c::frameUpdate(sharedEdict_t &ent) +{ + int i; + + HandleInput(ent); + + for(i = 0; i < MAXITEMS; i++) + { + itInfo[slots[i].getSlotType()]->frameUpdate(ent, slots[i]); + } +} + +int item_c::handleDamage(sharedEdict_t &ent, int initDamage) +{ + int i; + int curDamage = initDamage; + + for(i = 0; i < MAXITEMS; i++) + { + // FIXME: Will this change? + + curDamage = itInfo[slots[i].getSlotType()]->handleDamage(ent, curDamage, slots[i]); + } + return curDamage; +} + +void item_c::deactivate(sharedEdict_t &ent) +{ + for(int i = 0; i < MAXITEMS; i++) + { + itInfo[slots[i].getSlotType()]->deactivate(*(ent.edict), *getCurSlot()); + } +} diff --git a/Source/Game/player/w_equipment.h b/Source/Game/player/w_equipment.h new file mode 100644 index 0000000..69b180f --- /dev/null +++ b/Source/Game/player/w_equipment.h @@ -0,0 +1,122 @@ +#ifndef __W_EQUIPMENT_H_ +#define __W_EQUIPMENT_H_ + +#include "w_weapons.h" +#include "../strings/items.h" + +class itemInfo_c +{ +private: +public: + itemInfo_c(void){} + ~itemInfo_c(void){} + + virtual void setupModelInfo(void){}; + virtual void frameUpdate(sharedEdict_t &ent, itemSlot_c &slot){} + virtual bool use(edict_t &ent, itemSlot_c &slot){return true;} + virtual void deactivate(edict_t &ent, itemSlot_c &slot){} + virtual int handleDamage(sharedEdict_t &ent, int curDamage, itemSlot_c &slot){return curDamage;} + virtual char *getName(void){return "";} + virtual int getNameIndex(void){return 0;} + virtual int itemExistsAsUnique(void){return 0;} +}; + +extern itemInfo_c *itInfo[SFE_NUMITEMS]; + +//------------------------------------------------------------------------------------ +// +// Item Stuff +// +//------------------------------------------------------------------------------------ + +class flashpackInfo : public itemInfo_c +{ +private: +public: + flashpackInfo(void); + bool use(edict_t &ent, itemSlot_c &slot); + char *getName(void){return "Flash Packs";} // naughty! should have been string packaged! + int getNameIndex(void){return ITEMS_FLASHPACK;} +}; + +class neuralGrenadeInfo : public itemInfo_c +{ +private: +public: + neuralGrenadeInfo(void); + bool use(edict_t &ent, itemSlot_c &slot); + char *getName(void){return "Neural Pulse Grenades";} + int getNameIndex(void){return ITEMS_NEURAL_GRENADE;} +}; + +class c4Info : public itemInfo_c +{ +private: +public: + c4Info(void); + bool use(edict_t &ent, itemSlot_c &slot); + char *getName(void){return "C4";} + int getNameIndex(void){return ITEMS_C4;} + +}; + +class lightGogglesInfo : public itemInfo_c +{ +private: +public: + lightGogglesInfo(void); + void frameUpdate(sharedEdict_t &ent, itemSlot_c &slot); + bool use(edict_t &ent, itemSlot_c &slot); + void deactivate(edict_t &ent, itemSlot_c &slot); + char *getName(void){return "Light Amplification Goggles";} + int itemExistsAsUnique(void){return 1;} + int getNameIndex(void){return ITEMS_LIGHT_GOGGLES;} + +}; + +class claymoreInfo : public itemInfo_c +{ +private: +public: + claymoreInfo(void); + bool use(edict_t &ent, itemSlot_c &slot); + char *getName(void){return "Claymore";} + int getNameIndex(void){return ITEMS_CLAYMORE;} + +}; + +class medkitInfo : public itemInfo_c +{ +private: +public: + medkitInfo(void); + void frameUpdate(sharedEdict_t &ent, itemSlot_c &slot); + bool use(edict_t &ent, itemSlot_c &slot); + char *getName(void){return "Medkit";} + int getNameIndex(void){return ITEMS_MEDKIT;} +}; + +class grenadeInfo : public itemInfo_c +{ +private: +public: + grenadeInfo(void); + bool use(edict_t &ent, itemSlot_c &slot); + char *getName(void){return "Grenade";} + int getNameIndex(void){return ITEMS_GRENADE;} +}; + +class flagInfo : public itemInfo_c +{ +private: +public: + flagInfo(void); + bool use(edict_t &ent, itemSlot_c &slot){return true;} + char *getName(void){return "Flag";} + int itemExistsAsUnique(void){return 1;} + int getNameIndex(void){return ITEMS_CTF_FLAG;} +}; + + + +#endif // __W_EQUIPMENT_H_ \ No newline at end of file diff --git a/Source/Game/player/w_inven.cpp b/Source/Game/player/w_inven.cpp new file mode 100644 index 0000000..13d426e --- /dev/null +++ b/Source/Game/player/w_inven.cpp @@ -0,0 +1,2898 @@ +#include "q_shared.h" +#include "..\ghoul\ighoul.h" +#include "w_public.h" +#include "w_types.h" +#include "w_weapons.h" +#include "w_utils.h" +#include "w_network.h" +#include "player.h" +#include "../gamecpp/game.h" + +extern player_com_import_t picom; +extern player_cl_import_t picl; +extern player_sv_import_t pisv; + +extern int isClient; + +int fireEvent; +int altfireEvent; + +void inven_c::getServerState(void) +{ + // Clip. + + curWeapon()->setClip(owner->edict->client->ps.gunClip); + + // Ammo pool. + + weapon_c *weaponToFill=&weapons[curWeaponSlot]; + int type = weaponToFill->getWeaponInfo()->getAmmoType(0); + ammo[type]=owner->edict->client->ps.gunAmmo; +} + +void inven_c::setServerState(void) +{ + // Clip. + + owner->edict->client->ps.gunClip=curWeapon()->getClip(); + + // Ammo pool. + + owner->edict->client->ps.gunAmmo=getCurAmmo(); +} + +inven_c::inven_c(void) +{ + canHandleInput = 1; + setCurWeapon(0); + setReadiedWeapon(0); + setWInfo(1); + setDroppingWeapon(-1); + model = 0; + readyModel = 0; + memset(&gunEnd, 0, sizeof(Matrix4)); // Should really be gunEnd.Zero() + wAnim.setHandsInUse(2); + wAnim.setWeaponLifted(0); + wAnim.setTransition(1); + wAnim.setBloody(0); + wAnim.setHandSide(0); + wAnim.setDown(0); + wAnim.setFirstShot(1); + wAnim.setInZoom(0); + wAnim.setInZoomView(0); + wAnim.setInteresting(0); + wAnim.setRezoom(0); + wAnim.setKnifeStatus(0); + wAnim.setDisguise(0); + wAnim.setlastShootTime(0); + nextCommand = PWC_NOCOMMAND; + clientOverrideCmd=0; + newInstRxd=0; + rulesWeaponsUseAmmo=-1; + rulesDropWeapons=-1; + rulesNonDroppableWeaponTypes=(1<setOwner(this); + } + else + { + clientRICBuffer=new clientRICBuf; + clientRICBuffer->setOwner(this); + } + + int i; + + if(isClient) + { + // Client always has all the weapons available. + + for(i=SFW_KNIFE;iedict->s.origin, owner->edict->client->ps.viewoffset, worldSpot); +#else + Matrix4 etow,null2world; + Vect3 NullPos; + vec3_t pos; + + gunEnd.GetRow(3, NullPos); + VectorAdd(owner->s.origin, owner->client->ps.viewoffset, pos); + + EntToWorldMatrix(pos,owner->client->ps.viewangles,etow); + null2world.Concat(gunEnd,etow); + + Vect3 curPos(0,0,0); + null2world.XFormPoint(NullPos,curPos); + + worldSpot[0] = NullPos.x(); + worldSpot[1] = NullPos.y(); + worldSpot[2] = NullPos.z(); +#endif +*/ +} + +void inven_c::initNewWeapon(void) +{ + if(!isClient) + { + owner->edict->client->ps.gunType=curWeaponID; + owner->edict->client->ps.gunClip=curWeapon()->getClip(); + owner->edict->client->ps.gunAmmo=getCurAmmo(); + } + + SetVWeapGhoul(owner, getViewModelName()); + + if(!wAnim.disguised()) + idle(); + + if(rulesDoWeaponsUseAmmo()) + { + if(!isClient) + curWeapon()->getWeaponInfo()->turnOffAmmoParts(*owner,curWeapon()->getClip(),true); + else + curWeapon()->getWeaponInfo()->turnOffAmmoParts(*owner,owner->edict->client->ps.gunClip,true); + } +} + +int inven_c::addWeaponType(int weapon, int fullClip) +{ + int i; + + // See if there already is one in our inventory. + + for(i = 0; i < MAXWEAPONS; i++) + { + if(weapons[i].getType() == weapon) + { + return 0; + } + } + + // Ok, don't have one, so add it to the correct slot. + + static int weaponBinds[]= + { + SFW_KNIFE, + SFW_PISTOL1, + SFW_PISTOL2, + SFW_SHOTGUN, + SFW_SNIPER, + SFW_MACHINEPISTOL, + SFW_ASSAULTRIFLE, + SFW_MACHINEGUN, + SFW_AUTOSHOTGUN, + SFW_ROCKET, + SFW_FLAMEGUN, + SFW_MICROWAVEPULSE, + SFW_HURTHAND, + SFW_THROWHAND, + SFW_NUM_WEAPONS + }; + + i=0; + + while(weaponBinds[i]!=SFW_NUM_WEAPONS) + { + if(weaponBinds[i]==weapon) + { + if(!rulesDoWeaponsUseAmmo()) + fullClip=0; + + weapons[i].setType(weapon, fullClip); + addWeaponToOwnList(weapon); + return(1); + } + + i++; + } + + return(0); +} + +int inven_c::getEncumbrance(void) +{ + int encumbrance=0; + + for(int i=0; igetSlotsNeeded(); + + return(encumbrance); +} + +int inven_c::getEncumbranceByType(int weapon) +{ + return(weapInfo[weapon]->getSlotsNeeded()); +} + +int inven_c::addItem(int type, int amount, int maxAmount/*= -1*/) +{ + bool bWasEmpty = items.getCurSlot()?(items.getCurSlot()->getSlotType()==SFE_EMPTYSLOT):true; + int nRet = items.addItemType(type, amount, maxAmount); + + if(bWasEmpty && !!nRet) + items.setNextCommand(PEC_ITEMNEXT); + + return nRet; +} + +void inven_c::readyNextWeapon(void) +{ + if(nextSelectSlot == -1) + return; + + readiedWeaponID = weapons[nextSelectSlot].getType(); + setReadiedWeapon(nextSelectSlot); + setReadiedWInfo(readiedWeapon()->getWeaponInfo()->getType()); + readiedWeaponSlot = nextSelectSlot; + + ReadyVWeapGhoulServer(owner, getReadyModelName()); + + // Needed to 'kick-start' the new inst to the client straight-away. + + idleReadied(); + + // Needed by client. + + owner->edict->client->ps.gunType=readiedWeaponID; + owner->edict->client->ps.gunClip=readiedWeapon()->getClip(); + owner->edict->client->ps.gunAmmo=getReadiedAmmo(); +} + +void inven_c::SelectRediedWeapon(void) +{ + SetReadiedVWeapGhoulServer(owner,""); + + curWeaponID = readiedWeaponID; + setCurWeapon(readiedWeaponSlot); + setWInfo(readiedWeapon()->getWeaponInfo()->getType()); + selectedWeaponSlot = readiedWeaponSlot; + readiedWeaponID=0; +} + +void inven_c::selectNULLWeapon(void) +{ + if(!isClient) + { + owner->edict->client->ps.gun=0; + owner->edict->client->ps.gunType=0; + owner->edict->client->ps.gunClip=0; + owner->edict->client->ps.gunAmmo=0; + } + + setCurWeapon(0); + setReadiedWeapon(0); + setWInfo(1); + model = 0; + readyModel = 0; + selectedWeaponSlot = -1; + wAnim.clearFireLoop(); + nextSelectSlot = 0; + curWeaponID = 0; + readiedWeaponID = 0; + readiedWeaponType = 0; + pendingChange = 0; + wAnim.setAnimType(WANIM_NORMAL); + wAnim.setSeqName("unused viewmodel"); +} + +void inven_c::SelectPendingWeapon(void) +{ + if(nextSelectSlot == -1)return; + + curWeaponID = weapons[nextSelectSlot].getType(); + setCurWeapon(nextSelectSlot); + setWInfo(curWeapon()->getWeaponInfo()->getType()); + selectedWeaponSlot = nextSelectSlot; + + initNewWeapon(); +} + +int inven_c::selectWeapon(int weapon) +{ + int i; + + for(i = 0; i < MAXSELECTABLEWEAPONS; i++) + { + if(weapons[i].getType() == weapon) + { + curWeaponID = weapon; + setCurWeapon(i); + setWInfo(weapons[i].getWeaponInfo()->getType()); + selectedWeaponSlot = i; + + initNewWeapon(); + return 1; + } + } + return 0; +} + +void inven_c::selectWeaponSlot(int weaponNum) +{ + curWeaponID = weapons[weaponNum].getType(); + setCurWeapon(weaponNum); + setWInfo(curWeaponID); + selectedWeaponSlot = weaponNum; + + initNewWeapon(); +} + +void inven_c::selectBestWeapon(void) +{ + selectWeaponSlot(getBestSlot(!strcmp(rulesGetBestWeaponMode(),"safe"))); +} + +void inven_c::takeOutWeapon(int type) +{ + for(int i=0; i= ammoMaxes[type]) + { + // NO PICK UP!!! + + return 0; + } + + if(curClip+amount>ammoMaxes[type]) + amount=ammoMaxes[type] - curClip; + + weapons[10].setClip(curClip+amount); + + return 1; + } + + if(ammo[type] >= ammoMaxes[type]) + { + // NO PICK UP!!! + + return 0; + } + + if(ammo[type] + amount > ammoMaxes[type]) + amount = ammoMaxes[type] - ammo[type]; + + ammo[type] += amount; + + return 1; +} + +int ammoMinPickup[] = +{ + 0, //AMMO_NONE = 0, + 1, //AMMO_KNIFE, + 4, //AMMO_44, + 5, //AMMO_9MM, + 2, //AMMO_SHELLS, + 15, //AMMO_556, + 1, //AMMO_ROCKET, + 5, //AMMO_MWAVE, + 5, //AMMO_FTHROWER, + 5, //AMMO_SLUG, + 8, //special 9mm machine pistol ammo AMMO_MACHPIS9MM +}; + +int ammoMaxPickup[] = +{ + 0, //AMMO_NONE = 0, + 1, //AMMO_KNIFE, + 9, //AMMO_44, + 8, //AMMO_9MM, + 4, //AMMO_SHELLS, + 20, //AMMO_556, + 3, //AMMO_ROCKET, + 10, //AMMO_MWAVE, + 10, //AMMO_FTHROWER, + 10, //AMMO_SLUG, + 15, //special 9mm machine pistol ammo AMMO_MACHPIS9MM +}; + +int inven_c::addAmmoByGunType(int type, int amount) +{ + // Default to one, I guess. + + int ammoType = weapInfo[type]->getAmmoType(0); + + int addedAmount; + + if(amount) + { + addedAmount = amount; + } + else if(type == SFW_MACHINEPISTOL) + { + ammoType = AMMO_MACHPIS9MM; // special amount for machine pistol 9mm + addedAmount = ClientServerRand(ammoMinPickup[ammoType],ammoMaxPickup[ammoType]); + return addAmmoType(AMMO_9MM, addedAmount); + } + else + { + addedAmount = ClientServerRand(ammoMinPickup[ammoType],ammoMaxPickup[ammoType]); + } + + return addAmmoType(ammoType, addedAmount); +} + +int inven_c::stripAmmoFromGun(int type, int amount) +{ + // For single player + // Default to one, I guess. + + int ammoType = weapInfo[type]->getAmmoType(0); + + return addAmmoType(ammoType, amount); +} + +void inven_c::clearInv(bool ctf_remove) +{ + int i; + + for(i=0; igetSlotType() != SFE_CTFFLAG)) + { + items.clearSlot(i); + } + } + + armor=0; + + nextCommand=PWC_NOCOMMAND; +} + +void inven_c::removeSpecificItem(int type) +{ + int i; + for(i=0; igetSlotType() == type) + { + items.clearSlot(i); + } + } +} + + +void inven_c::handlePlayerDeath(void) +{ + if(isClient) + return; + + deactivateInventory(); + + if(curWeaponID!=SFW_EMPTYSLOT) + { + // This will stop weapons that are looping their firing sequences. + + idle(); + + // Shut down current. + + curInfo()->shutdownWeapon(*owner); + } + + // Drop current weapon(s)? PWC_DROP can only be set if: + // a) rulesCanDropWeapons() returns non-zero or + // b) removeCurrentWeapon() has been called. + + if(rulesCanDropWeapons()||(nextCommand==PWC_DROP)) + { + if(curWeaponID!=SFW_EMPTYSLOT) + { + // Ensure we drop any weapon we are in the process of dropping or losing. + + if((nextCommand==PWC_DROP)||(nextCommand==PWC_LOSE)) + setDroppingWeapon(curWeaponSlot); + + // Ensure we drop current weapon if we haven't already started dropping it. + + if(!droppingWeapon()) + setDroppingWeapon(curWeaponSlot); + + // Actually drop it. + + if(!(rulesGetNonDroppableWeaponTypes()&(1<getType()))) + pisv.WeaponDrop(this->owner->edict,droppingWeapon()->getType(), droppingWeapon()->getClip()); + + removeWeaponFromOwnList(droppingWeapon()->getType()); + droppingWeapon()->setType(SFW_EMPTYSLOT); + + setDroppingWeapon(-1); + } + + // In realistic DM, we need to drop any special weapons in our inventory. + + if(rulesCanDropInvenOnDeath()) + { + dropAllWeapons(); + } + } +} + +void inven_c::dropAllWeapons(void) +{ + if(isClient) + return; + + for(int i = 0; i < MAXSELECTABLEWEAPONS; i++) + { + if(weapons[i].getType()!=SFW_EMPTYSLOT) + { + if(!(rulesGetNonDroppableWeaponTypes()&(1<owner->edict,weapons[i].getType(), weapons[i].getClip()); + + removeWeaponFromOwnList(weapons[i].getType()); + weapons[i].setType(SFW_EMPTYSLOT); + } + } +} + +int inven_c::removeCurrentWeapon(void) +{ + if(isClient) + return(0); + + nextCommand = PWC_DROP; + return(1); +} + +int inven_c::countWeapons(void) +{ + int i; + int val = 0; + + for(i = 0; i < MAXSELECTABLEWEAPONS; i++) + { + if(weapons[i].getType() != SFW_EMPTYSLOT)val++; + } + + return(val); +} + +void inven_c::deactivateCurrentWeapon(void) +{ + curInfo()->shutdownWeapon(*owner); +} + +void inven_c::deactivateInventory(void) +{ + items.deactivate(*owner); +} + +int inven_c::refillCurClip(int curSlot, int ignoreSingle, int noFillForSingle) +{ + weapon_c *weaponToFill = &weapons[curSlot]; + int type = weaponToFill->getWeaponInfo()->getAmmoType(0); + + if(type == AMMO_NONE)return 0; + + if(ammo[type] == 0)return 0; + + if(weaponToFill->getWeaponInfo()->isSingleReload() && (!ignoreSingle) && rulesDoWeaponsReload()) + { + if(weaponToFill->getClip() >= weaponToFill->getWeaponInfo()->getClipSize()) + { + // Already full. + + return 0; + } + + if(noFillForSingle) + { + // Strangeness with shotgun. + + return 1; + } + + if(ammo[type]) + { + ammo[type] --; + weaponToFill->setClip(weaponToFill->getClip() + 1); + } + } + else + { + if(rulesDoReloadEmptiesWeapon()) + { + // Clip simulator for realistic stuff. + + if(ammo[type] > weaponToFill->getWeaponInfo()->getClipSize()) + { + ammo[type] -= weaponToFill->getWeaponInfo()->getClipSize(); + weaponToFill->setClip(weaponToFill->getWeaponInfo()->getClipSize()); + } + else + { + weaponToFill->setClip(ammo[type]); + ammo[type] = 0; + } + } + else if(ammo[type] > weaponToFill->getWeaponInfo()->getClipSize() - weaponToFill->getClip()) + { + ammo[type] -= weaponToFill->getWeaponInfo()->getClipSize() - weaponToFill->getClip(); + weaponToFill->setClip(weaponToFill->getWeaponInfo()->getClipSize()); + } + else + { + weaponToFill->setClip(weaponToFill->getClip() + ammo[type]); + ammo[type] = 0; + } + } + return 1; +} + +int inven_c::adjustDamageByArmor(int initDamage, float penetrate, float absorb) +{ + if(!armor) + { + return initDamage; + } + + // Take absorbtion into account. + + initDamage -= (initDamage * absorb); + + if(penetrate) + { + int extraDmg = initDamage * 2; + + if(armor > extraDmg) + { + armor -= extraDmg; + extraDmg = 0; + } + else + { + extraDmg -= armor; + armor = 0; + } + + // So it just does well against armor, that's all. + + return extraDmg * .5; + } + else + { + if(armor > initDamage) + { + armor -= initDamage; + initDamage = 0; + } + else + { + initDamage -= armor; + armor = 0; + } + return initDamage; + } + + return 0; +} + +void inven_c::becomeDisguised(void) +{ + if(!isClient) + serverRICBuffer->AddRIC(RIC_HIDEWEAPONFORDISGUISE,""); + + if(wAnim.disguised()) + { + // 'Tis a toggle. + + wAnim.setDisguise(0); + } + else + { + wAnim.setDisguise(1); + putAway(); + + // In case we pull it right back out. + + nextSelectSlot = selectedWeaponSlot; + } +} + +//------------------------------------------------------------------------------------------------------------------------ +// ANIM FUNCS +//------------------------------------------------------------------------------------------------------------------------ + +int inven_c::fire(void) +{ + char *fireSeq; + + if((fireSeq = curInfo()->getFireSeq(*owner)) == NULL) + return 0; + + if((!curWeapon()->handleAmmo(*owner, 0))) + { + if((!isClient)&&isClientPredicting()) + pisv.clearFireEvent(owner->edict); + + if(isClient) + fireEvent=1; + + return 1; + } + + // If ammo is okay, initiate the firing seq. + + setInputStatus(0); + wAnim.setAnimType(WANIM_FIRE); + + if(!isClient) + { + if(isClientPredicting()) + { + if((curWeaponID==SFW_ASSAULTRIFLE)||(curWeaponID==SFW_MACHINEPISTOL)) + RunVWeapAnim(owner, fireSeq, getCurWeapon()->getWeaponInfo()->getLoopType()); + else + RunVWeapAnim(owner, fireSeq, getCurWeapon()->getWeaponInfo()->getLoopType(),pisv.getFireEvent(owner->edict)); + + pisv.clearFireEvent(owner->edict); + } + else + { + RunVWeapAnim(owner, fireSeq, getCurWeapon()->getWeaponInfo()->getLoopType()); + } + } + else + { + RunVWeapAnim(owner, fireSeq, getCurWeapon()->getWeaponInfo()->getLoopType()); + fireEvent=1; + } + + return 1; +} + +int inven_c::altFire(void) +{ + if(!curInfo()->hasAltFire()) + { + // Well, not everything can do this. + + return 0; + } + + char *altFireSeq; + + if((altFireSeq = curInfo()->getAltFireSeq(*owner)) == NULL) + return 0; + + if(!curWeapon()->handleAmmo(*owner, 1)) + { + if((!isClient)&&isClientPredicting()) + pisv.clearAltfireEvent(owner->edict); + + if(isClient) + altfireEvent=1; + + return 1; + } + + // If ammo is okay, initiate the altfiring seq. + + setInputStatus(0); + wAnim.setAnimType(WANIM_ALTFIRE); + + if(!isClient) + { + if(isClientPredicting()) + { + if(curWeaponID==SFW_ROCKET) + RunVWeapAnim(owner, altFireSeq, IGhoulInst::Hold); + else + RunVWeapAnim(owner, altFireSeq, IGhoulInst::Hold,pisv.getAltfireEvent(owner->edict)); + + pisv.clearAltfireEvent(owner->edict); + } + else + { + RunVWeapAnim(owner, altFireSeq, IGhoulInst::Hold); + } + } + else + { + RunVWeapAnim(owner, altFireSeq, IGhoulInst::Hold); + altfireEvent=1; + } + + return 1; +} + +int inven_c::clientReload(void) +{ + fireEvent=0; + altfireEvent=0; + + char *reloadSeq; + + if((reloadSeq = curInfo()->getReloadSeq(*owner)) == NULL) + return 0; + + // Reloading recenters the weapon. + + wAnim.clearFireLoop(); + + if(curInfo()->testReloadAtInit(*owner)) + { + if(!refillCurClip(curWeaponSlot)) + { + dryfire(); + + if(!curWeapon()->getClip()) + { + // Totally out of ammo, so do nothing and wait for server to + // change our weapon. + + ; + } + + return 0; + } + } + + if(rulesDoWeaponsReload()) + { + if(!isClient) + pisv.ShowReload(owner->edict); + + setInputStatus(0); + wAnim.setAnimType(WANIM_RELOAD); + RunVWeapAnim(owner, reloadSeq, IGhoulInst::Hold); + } + else + idle(); + + return 1; +} + +int inven_c::reload(void) +{ + if(isClient) + { + // Client always told to do this via clientReload(). + + return 0; + } + + pisv.clearFireEvent(owner->edict); + pisv.clearAltfireEvent(owner->edict); + + char *reloadSeq; + + if((curWeapon()->getClip() == curInfo()->getClipSize()) && (!rulesDoReloadEmptiesWeapon())) + { + // Already full.... + + return 0; + } + + if((reloadSeq = curInfo()->getReloadSeq(*owner)) == NULL) + return 0; + + // Reloading recenters the weapon. + + wAnim.clearFireLoop(); + + if(curInfo()->testReloadAtInit(*owner)) + { + if(!refillCurClip(curWeaponSlot)) + { + dryfire(); + + if(!curWeapon()->getClip()) + { + // Totally out of ammo, so change weapons (if possible). + + addCommand("weaponbestsafe",true); + if(getWeaponNum(nextCommand)!=-1) + return 0; + } + + // Tell client to reload. + + owner->edict->client->ps.gunReload++; + + return 0; + } + } + + if(rulesDoWeaponsReload()) + { + if(!isClient) + pisv.ShowReload(owner->edict); + + setInputStatus(0); + wAnim.setAnimType(WANIM_RELOAD); + RunVWeapAnim(owner, reloadSeq, IGhoulInst::Hold); + } + else + idle(); + + // Tell client to reload. + + owner->edict->client->ps.gunReload++; + + return 1; +} + +int inven_c::putAway(void) +{ + curInfo()->shutdownWeapon(*owner); + + char *putAwaySeq; + + if((putAwaySeq = curInfo()->getPutAwaySeq(*owner)) == NULL) + { + SelectPendingWeapon(); + takeOut(); + return 0; + } + + if((!isClient)&&isClientPredicting()) + readyNextWeapon(); + + setInputStatus(0); + wAnim.setAnimType(WANIM_PUTAWAY); + RunVWeapAnim(owner, putAwaySeq, IGhoulInst::Hold); + + return 1; +} + +int inven_c::takeOut(void) +{ + // Ensure no weapon fires on taking new weapon out. + + if(!isClient) + { + pisv.clearFireEvent(getOwner()->edict); + pisv.clearAltfireEvent(getOwner()->edict); + } + else + { + fireEvent=0; + altfireEvent=0; + } + + if(isClient) + newInstRxd=0; + + char *takeOutSeq; + + if((takeOutSeq = curInfo()->getTakeOutSeq(*owner)) == NULL) + { + idle(); + return 0; + } + + setInputStatus(0); + wAnim.setAnimType(WANIM_NORMAL); + RunVWeapAnim(owner, takeOutSeq, IGhoulInst::Hold); + + return 1; +} + +int inven_c::idle(void) +{ + char *idleSeq; + + if((idleSeq = curInfo()->getIdleSeq(*owner)) == NULL) + return 0; + + setInputStatus(1); + wAnim.setAnimType(WANIM_NORMAL); + RunVWeapAnim(owner, idleSeq, IGhoulInst::Hold); + + return 1; +} + +void inven_c::idleReadied(void) +{ + char *idleSeq; + + if((idleSeq = weapInfo[readiedWeaponType]->getIdleSeq(*owner)) == NULL) + return; + + setInputStatus(1); + wAnim.setAnimType(WANIM_NORMAL); + RunReadiedVWeapAnim(owner, idleSeq, IGhoulInst::Hold); +} + +int inven_c::dryfire(void) +{ + char *dryfireSeq; + + if((dryfireSeq = curInfo()->getDryfireSeq(*owner)) == NULL) + { + idle(); + return 1; + } + + setInputStatus(0); + wAnim.setAnimType(WANIM_NORMAL); + RunVWeapAnim(owner, dryfireSeq, IGhoulInst::Hold); + + return 1; +} + +int inven_c::loseWeapon(void) +{ + curInfo()->shutdownWeapon(*owner); + + // Drop what we're holding. + + setDroppingWeapon(curWeaponSlot); + if(!isClient) + pisv.WeaponDrop(this->owner->edict,droppingWeapon()->getType(), droppingWeapon()->getClip()); + + if(!isClient) + { + removeWeaponFromOwnList(droppingWeapon()->getType()); + droppingWeapon()->setType(SFW_EMPTYSLOT); + } + + setDroppingWeapon(-1); + + // Select 'hand-pain' weapon. + + SelectPendingWeapon(); + + // Make sure client is ready for next weapon when it comes down the wire. + + if(isClient) + newInstRxd=0; + + // Play the takeout sequence for this weapon. On the server ONLY, this ends + // with the issue of a PWC_NEXTWEAP. + + char *takeOutSeq = curInfo()->getTakeOutSeq(*owner); + + setInputStatus(0); + wAnim.setAnimType(WANIM_LOSE); + RunVWeapAnim(owner, takeOutSeq, IGhoulInst::Hold); + + // So we know we are now empty handed. + + curWeaponID=0; + + return 1; +} + +static int weaponPrioritySafe[]= +{ + SFW_MICROWAVEPULSE, + SFW_MACHINEGUN, + SFW_ASSAULTRIFLE, + SFW_MACHINEPISTOL, + SFW_SHOTGUN, + SFW_PISTOL2, + SFW_PISTOL1, + SFW_SNIPER, + SFW_KNIFE, + SFW_ROCKET, + SFW_AUTOSHOTGUN, + SFW_FLAMEGUN, + SFW_EMPTYSLOT +}; + +static int weaponPriorityUnsafe[]= +{ + SFW_MICROWAVEPULSE, + SFW_ROCKET, + SFW_AUTOSHOTGUN, + SFW_FLAMEGUN, + SFW_MACHINEGUN, + SFW_ASSAULTRIFLE, + SFW_MACHINEPISTOL, + SFW_SHOTGUN, + SFW_PISTOL2, + SFW_PISTOL1, + SFW_SNIPER, + SFW_KNIFE, + SFW_EMPTYSLOT +}; + +static int weaponUnsafeList[]= +{ + SFW_ROCKET, + SFW_AUTOSHOTGUN, + SFW_FLAMEGUN, + SFW_EMPTYSLOT +}; + +int inven_c::getBestSlot(int safe) +{ + int curTest = 0; + int returnWeap = -1; + int *weaponPriority; + qboolean unsafe=false; + + // Okay, here's the scoop. If the "safe" param is >= 2, then we've got a + // pickup situation. In that case, the pickups act like a "safe best" + // weapon pick, except if there is an unsafe weapon up, don't override it. + if (safe >= 2) + { + // Check if the current weapon is unsafe first. + while((weaponUnsafeList[curTest] != SFW_EMPTYSLOT) && (!unsafe)) + { + if (getCurWeaponType() == weaponUnsafeList[curTest]) + { + unsafe=true; + } + + curTest++; + } + + if (unsafe) + { + // Return the current weapon... + return getCurSlot(); + } + else + { + // Otherwise act like a safe weapon. + curTest = 0; + while((weaponPrioritySafe[curTest] != SFW_EMPTYSLOT) && (returnWeap == -1)) + { + for(int i = 0; (i < MAXSELECTABLEWEAPONS) && (returnWeap == -1); i++) + { + if(weapons[i].canSelect(*owner)) + { + if(weapons[i].getType() == weaponPrioritySafe[curTest]) + { + returnWeap = i; + } + } + } + + curTest++; + } + } + } + else + { + weaponPriority=(safe)?weaponPrioritySafe:weaponPriorityUnsafe; + + while((weaponPriority[curTest] != SFW_EMPTYSLOT) && (returnWeap == -1)) + { + for(int i = 0; (i < MAXSELECTABLEWEAPONS) && (returnWeap == -1); i++) + { + if(weapons[i].canSelect(*owner)) + { + if(weapons[i].getType() == weaponPriority[curTest]) + { + returnWeap = i; + } + } + } + + curTest++; + } + } + + return returnWeap; +} + +int inven_c::getBestWeaponType(void) +{ + if (!strcmp(rulesGetBestWeaponMode(),"safe")) + { + // The mode is for the unusual safe selection. + return(weapons[getBestSlot(2)].getType()); + } + else + { + // Go for non-safe weaponry normally. + return(weapons[getBestSlot(0)].getType()); + } +} + +int inven_c::getClipMaxByType(int weapon) +{ + return(weapInfo[weapon]->getClipSize()); +} + +int inven_c::getWeaponNum(int cmd) +{ + if(!isClient) + { + // No point finding a new-weap if we have no weapons. + + if(!(weaponsOwned&((1<=MAXSELECTABLEWEAPONS)?0:selectedWeaponSlot; + returnWeap=startWeap; + + if(cmd == PWC_WEAPNEXT) + { + do + { + returnWeap++; + if(returnWeap >= MAXSELECTABLEWEAPONS) + { + returnWeap = 0; + } + }while((!weapons[returnWeap].canSelect(*owner,rulesCanSelectWithNoAmmo()))&&(returnWeap != startWeap)); + } + else if(cmd == PWC_WEAPPREV) + { + do + { + returnWeap--; + if(returnWeap <= -1) + { + returnWeap = MAXSELECTABLEWEAPONS - 1; + } + }while((!weapons[returnWeap].canSelect(*owner,rulesCanSelectWithNoAmmo()))&&(returnWeap != startWeap)); + } + else if(cmd == PWC_WEAPONBEST_SAFE) + { + returnWeap = getBestSlot(1); + } + else if(cmd == PWC_WEAPONBEST_UNSAFE) + { + returnWeap = getBestSlot(0); + } + else if(cmd == PWC_LOSE) + { + returnWeap=MAXSELECTABLEWEAPONS; + } + else if(cmd == PWC_DROP) + { + returnWeap=MAXSELECTABLEWEAPONS+1; + } + else + { + // Then must be a raw weapon number. + + returnWeap = cmd - PWC_WEAPSELECTFIRST; + if(!weapons[returnWeap].canSelect(*owner,1)) + { + returnWeap = -1; + } + } + + // New weapon same as old? + + if((startWeap==selectedWeaponSlot)&&(returnWeap==startWeap)) + { + // Ok, no change. + + returnWeap = -1; + } + + return returnWeap; +} + +int inven_c::checkCommandInput(void) +{ + if(nextCommand == PWC_NOCOMMAND) + return 0; + + int retVal=0; + + if(nextCommand == PWC_RELOAD) + { + // This will only happen on the server. + + if(rulesDoWeaponsReload()&&reload()) + retVal=1; + } + else if((nextCommand >= PWC_WEAPNEXT)&&(nextCommand < PWC_WEAPSELECTFIRST + MAXSELECTABLEWEAPONS)) + { + if(isClient&&(!clientOverrideCmd)) + { + idle(); + + return(0); + } + else + { + if(isClient) + clientOverrideCmd=0; + + int weaponNum=getWeaponNum(nextCommand); + + if(curWeaponID) + { + // Ok, we currently have a weapon out... + + if(weaponNum!=-1) + { + // ...and we have a valid next weapon so proceed. + + nextSelectSlot = weaponNum; + + switch(nextCommand) + { + case PWC_LOSE: + case PWC_DROP: + + if(rulesGetNonDroppableWeaponTypes()&(1<attack)||(owner->altattack)) + { + wAnim.setDisguise(0); + } + else + { + // Swap stuff around properly. + + if((nextCommand >= PWC_WEAPNEXT)&&(nextCommand < PWC_WEAPSELECTFIRST + MAXSELECTABLEWEAPONS)) + { + switch(nextCommand) + { + case PWC_LOSE: + case PWC_DROP: + + break; + + default: + + int weaponNum=getWeaponNum(nextCommand); + + if(weaponNum != -1) + nextSelectSlot = weaponNum; + + break; + } + + nextCommand=PWC_NOCOMMAND; + } + } + } + + if(owner->cinematicFreeze) + { + // Clear out input to make everything behave. + + owner->altattack = 0; + owner->attack = 0; + owner->leanLeft = 0; + owner->leanRight = 0; + owner->weap3 = 0; + owner->weap4 = 0; + } + + curInfo()->testInput(*owner); + + // Always return during cinematics. + + if(owner->cinematicFreeze) + return; + + // Active sequences (e.g. fire) may prevent command input. + + if(!isClient) + { + // Server always wants to return if this is the case... + + if(!canHandleInput) + return; + } + else + { + // Client may need to overide current predicted sequence (e.g. fire) if + // instructed to do so by server. + + if((!clientOverrideCmd)&&(!canHandleInput)) + return; + } + + if(checkCommandInput()) + { + // Check for inventory command input. + + return; + } + + if(!model) + return; + + // Check for attack. + + qboolean doAttack=false; + + if((!isClient)&&(!isClientPredicting())) + { + if(owner->attack) + doAttack=true; + } + else + { + if((isClient&&(owner->attack))||((!isClient)&&(pisv.getFireEvent(owner->edict)))) + doAttack=true; + } + + if(doAttack) + { + if(fire()) + return; + } + + // Check for altattack. + + qboolean doAltAttack=false; + + if((!isClient)&&(!isClientPredicting())) + { + if(owner->altattack) + doAltAttack=true; + } + else + { + if((isClient&&(owner->altattack))||((!isClient)&&(pisv.getAltfireEvent(owner->edict)))) + doAltAttack=true; + } + + if(doAltAttack) + { + if(altFire()) + return; + } +} + +void inven_c::handleModelChange() +{ + if(wAnim.disguised()) + { + // Can't get out our new weapon until we are no longer being sneaky. + + return; + } + + if(isClient) + { + // Client side version... + + if(((IGhoul *)picl.GetGhoul())->FindClientInst(owner->edict->client->ps.gunUUID)) + { + // We need this test because of the latency involved in receiving new + // ghoul instances from server. I.e. we want to be sure that we have + // the new instance from the server before proceeding to create a new + // PRIVATE client view weapon (by cloning the server owned instance). + // In the event that the new instance has not been recieved yet, the + // weapon code will remain in a 'supended' state as long as the member + // variable 'pendingChange' is non zero. + + if(!owner->edict->client->ps.gun->GetUserData()) + { + if(pendingChange) + { + // The new weapon has been selected (and the previous one + // put away), so take out the new weapon. + + SelectPendingWeapon(); + takeOut(); + pendingChange = 0; + + if(droppingWeapon()) + setDroppingWeapon(-1); + } + else if(newInstRxd==0) + { + // We have just gotten a new weapon instance from the server, so + // issue a command to select this weapon. + + if(owner->edict->client->ps.gunTypeedict->client->ps.gunType) + break; + } + + weapon_c *weaponToFill = &weapons[i]; + int type = weaponToFill->getWeaponInfo()->getAmmoType(0); + ammo[type]=owner->edict->client->ps.gunAmmo; + weaponToFill->setClip(owner->edict->client->ps.gunClip); + nextCommand=PWC_WEAPSELECTFIRST+i; + } + else + { + // Special "throw weapon away" animation. + + nextCommand=PWC_LOSE+(owner->edict->client->ps.gunType-SFW_HURTHAND); + } + + clientOverrideCmd=1; + newInstRxd=1; + + if(model) + idle(); + + } + } + } + } + else + { + // Server side version... + + if(pendingChange) + { + if(isClientPredicting()) + SelectRediedWeapon(); + else + SelectPendingWeapon(); + + takeOut(); + pendingChange = 0; + + if(droppingWeapon()) + { + if(!isClient) + pisv.WeaponDrop(this->owner->edict,droppingWeapon()->getType(), droppingWeapon()->getClip()); + + removeWeaponFromOwnList(droppingWeapon()->getType()); + droppingWeapon()->setType(SFW_EMPTYSLOT); + setDroppingWeapon(-1); + } + } + } +} + +void inven_c::frameUpdate(void) +{ + if(isClient) + { + fireEvent=0; + altfireEvent=0; + + if(owner->doReload) + { + owner->doReload=0; + clientReload(); + } + + getServerState(); + } + + handleModelChange(); + handleInput(); + + sharedEdict_t *saved=owner; + + sharedEdict_t sh; + sh.inv=(inven_c *)this; + + if(model) + { + if(!isClient) + model->ServerUpdate(*(pisv.levelTime) + .001); + else + model->ServerUpdate(*(picl.levelTime) + .001); + } + + sh.inv->setOwner(saved); + + if((!isClient)&&(!readiedWeaponID)) + setServerState(); + + items.frameUpdate(*owner); +} + +int inven_c::addCommand(char *string,qboolean internal) +{ + char *s=picom.Cmd_Args(); + + if(!isClient) + { + // Server... + + if(getInputStatus()<0) + { + // Don't want any crappy messages popping up as chat, just 'cos the + // system isn't ready to accept inventory commands. + + return 1; + } + + // Sometimes we want to prevent sources outside of the player.dll from + // executing weapon select commands (e.g. arsenal). + + int denied=((!internal)&&(!rulesCanFreelySelectWeapon()))?-1:0; + + if (stricmp (string, "reload") == 0) + { + nextCommand = PWC_RELOAD; + } + else if (stricmp (string, "weapprev") == 0) + { + if(denied) + return 1; + + nextCommand = PWC_WEAPPREV; + } + else if (stricmp (string, "weapnext") == 0) + { + if(denied) + return 1; + + nextCommand = PWC_WEAPNEXT; + } + else if (stricmp (string, "weaponselect") == 0) + { + if(denied) + return 1; + + if(s[0]) + nextCommand = PWC_WEAPSELECTFIRST + atoi(s)-1; + } + else if (stricmp (string, "weapondrop") == 0) + { + if(rulesCanDropWeapons()) + { + nextCommand = PWC_DROP; + } + else + { + // Command weapondrop is valid but not allowed to drop weapons. + // So we don't want anything printed as an unrecognised command. + + return 1; + } + } + else if (stricmp (string, "weaponlose") == 0) + { + if(rulesCanDropWeapons()) + { + nextCommand = PWC_LOSE; + } + else + { + // Command weaponloose is valid but not allowed to drop weapons. + // So we don't want anything printed as an unrecognised command. + + return 1; + } + } + else if (stricmp (string, "weaponbestsafe") == 0) + { + if(denied) + return 1; + + nextCommand = PWC_WEAPONBEST_SAFE; + } + else if (stricmp (string, "weaponbestunsafe") == 0) + { + if(denied) + return 1; + + nextCommand = PWC_WEAPONBEST_UNSAFE; + } + else if (stricmp (string, "itemuse") == 0) + { + if(s[0]) + { + // Try to use named item (shortcut key). + + int i=items.getSlotNumFromName(s); + + if(i>=0) + { + // Ok, use specified item. + + items.setNextCommand(PEC_USEITEMFIRST+i); + } + else if(i==-2) + { + // Named item doesn't exist (no such item type). + + return 0; + } + } + else + { + // Use currently selected item. + + items.setNextCommand(PEC_USEITEM); + } + } + else if (stricmp (string, "itemnext") == 0) + { + items.setNextCommand(PEC_ITEMNEXT); + } + else if (stricmp (string, "itemprev") == 0) + { + items.setNextCommand(PEC_ITEMPREV); + } + else if (stricmp (string, "itemdrop") == 0) + { + items.setNextCommand(PEC_DROP); + } + else + { + return 0; + } + } + else + { + // Client... (does nowt). + + return 0; + } + + return 1; +} + +/* +List of weapons (with ammo) +Knife - aknife +Pistol1 - a9mm +Pistol2 - a9mm (possibly a44) +Mpistol - a9mm +Assault - a556 +Sniper - a556 +Slugger - Shells +Shotgun - Shells +Machinegun - a556 +Flamegun - Fuel +Rocket - Rockets +Mpg - Battery + +Items +Flashpak +C4 +Armor +Neural +Claymore +goggles + +Ammo +aknife +a9mm +a556 +a44 +Shells +Rockets +Battery +Fuel +*/ + +char *weaponList[] = +{ "nothing", + "knife", + "pistol2", + "pistol1", + "mpistol", + "assault", + "sniper", + "slugger", + "shotgun", + "machinegun", + "rocket", + "mpg", + "flamegun", + 0 +}; + + //AMMO_NONE = 0, + //AMMO_KNIFE, + //AMMO_44, + //AMMO_9MM, + //AMMO_SHELLS, + //AMMO_556, + //AMMO_ROCKET, + //AMMO_MWAVE, + //AMMO_FTHROWER, + //AMMO_SLUG, + + +char *ammoList[] = +{ "nothing", + "aknife", + "a44", + "a9mm", + "shells", + "a556", + "rockets", + "battery", + "fuel", + "slug", + 0 +}; + +//armor is a special case, I suppose +char *itemList[] = +{ "nothing", + "fpak", +// "neural", + "c4", + "goggles", + "claymore", + "medkit", + "grenade", + 0 +}; + +#define ORDERLISTSIZE 12 + +int weaponOrder[] = +{ + SFW_KNIFE, + SFW_PISTOL1, + SFW_PISTOL2, + SFW_SHOTGUN, + SFW_SNIPER, + SFW_MACHINEPISTOL, + SFW_ASSAULTRIFLE, + SFW_MACHINEGUN, + SFW_AUTOSHOTGUN, + SFW_ROCKET, + SFW_MICROWAVEPULSE, + SFW_FLAMEGUN, +}; + +//health parm is the health extracted from the menu as we don't have access to the game-side health edict field +int inven_c::extractInvFromMenu(int *weaponsAvailable, int *health) +{ + char *curSpot; + char *curTokSpot; + char token[256]; + char temp[256]; + int value; + int weaponsToAdd = 0; + char buffer[1024]; + + if(isClient) + { + return 0; // None of this for you!! + } + + //assume curSpot is somewhere decent + + curSpot = pisv.CvarInfo(CVAR_WEAPON | CVAR_ITEM | CVAR_AMMO | CVAR_MISC); + + if(!curSpot || (!strcmp(curSpot, ""))) + { // if there is nothing, plug in the defaults + return 0; + } + + while(*curSpot) + { + curTokSpot = token; + + if(*curSpot == '\\') + { + curSpot++; + } + + while(*curSpot && (*curSpot != '\\')) + { + *curTokSpot++ = *curSpot++; + } + *curTokSpot = 0; + + assert(*curSpot); + + if(*curSpot == '\\') + { + curSpot++; + } + + curTokSpot = temp; + while((*curSpot) && (*curSpot != '\\')) + { + *curTokSpot++ = *curSpot++; + } + *curTokSpot = 0; + value = atoi(temp); + + // okay, we have the two tokens... let's do stuff with them now... + + + char *testString; + int curCheck; + int found = 0; + + + + // look for weapons + + curCheck = 0; + + do + { + testString = weaponList[curCheck]; + + if(!stricmp(token, testString)) + { // hey, I have one of these! Cool! + if(value) + {// add the weapon + //addWeaponType(curCheck); + weaponsToAdd |= (1<getAmmoType(0) < MAXAMMOS); + assert(weapons[i].getWeaponInfo()->getAmmoType(0) > -1); + if(includeClipAmmo) + { //end of level needs this - within level does not + ammo[weapons[i].getWeaponInfo()->getAmmoType(0)] += weapons[i].getClip(); + } + + sprintf(buffer, "set %s 1 w;", weaponList[curWeapType]); + + pisv.AddCommand(buffer); + } + } + + + // now list what ammo is currently being carried + for(i = 1; i < MAXAMMOS; i++) + { + sprintf(buffer, "set %s %d a;", ammoList[i], ammo[i]); + pisv.AddCommand(buffer); + } + + + // now list what items, and their amounts, are being carried + + for(i = 0; i < MAXITEMS; i++) + { + itemSlot_c *curSlot = items.getSlot(i); + + if(curSlot->getSlotType() != SFE_EMPTYSLOT) + { + sprintf(buffer, "set %s %d i;", itemList[curSlot->getSlotType()], + curSlot->getSlotCount()); + pisv.AddCommand(buffer); + } + } + + // write out armor too, I suppose + sprintf(buffer, "set armor %d i;", armor); + pisv.AddCommand(buffer); + + // write out health too, I suppose + sprintf(buffer, "set health %d m;", health); + pisv.AddCommand(buffer); + +} + +int inven_c::extractInvFromString(int *weaponsAvailable,char *invString) +{ + char *curSpot; + char *curTokSpot; + char token[256]; + char temp[256]; + int value; + int weaponsToAdd = 0; + + if(isClient) + { + // None of this for you Mr Client side!! + + return 0; + } + + curSpot = invString; + + if(!curSpot || (!strcmp(curSpot, ""))) + { + // If there is nothing, do nothing. + + return 0; + } + + while(*curSpot) + { + curTokSpot = token; + + if(*curSpot == '\\') + { + curSpot++; + } + + while(*curSpot && (*curSpot != '\\')) + { + *curTokSpot++ = *curSpot++; + } + *curTokSpot = 0; + + if(*curSpot == '\\') + { + curSpot++; + } + + curTokSpot = temp; + while((*curSpot) && (*curSpot != '\\')) + { + *curTokSpot++ = *curSpot++; + } + *curTokSpot = 0; + value = atoi(temp); + + // Okay, we have the two tokens... let's do stuff with them now... + + char *testString; + int curCheck; + int found = 0; + + // Look for weapons. + + curCheck = 0; + + do + { + testString = weaponList[curCheck]; + + if(!stricmp(token, testString)) + { + // Hey, I have one of these! Cool! + + if(value) + { + // Add the weapon. + + weaponsToAdd |= (1<getAmmoType(0) < MAXAMMOS); + assert(weapons[i].getWeaponInfo()->getAmmoType(0) > -1); + ammo[weapons[i].getWeaponInfo()->getAmmoType(0)] += weapons[i].getClip(); + + sprintf(buffer, "%s\\1\\", weaponList[curWeapType]); + strcat(string,buffer); //FIXME + } + } + } + + if(xtractAmmo) + { + // Now list what ammo is currently being carried. + + for(int i = 1; i < MAXAMMOS; i++) + { + sprintf(buffer, "%s\\%d\\", ammoList[i], ammo[i]); + strcat(string,buffer);//FIXME + } + } + + if(xtractItems) + { + // Now list what items, and their amounts, are being carried. + + for(int i = 0; i < MAXITEMS; i++) + { + itemSlot_c *curSlot = items.getSlot(i); + + if(curSlot->getSlotType() != SFE_EMPTYSLOT) + { + sprintf(buffer, "%s\\%d\\", itemList[curSlot->getSlotType()], + curSlot->getSlotCount()); + + strcat(string,buffer);//FIXME + } + } + } + + if(xtractArmor) + { + // Write out armor too, I suppose. + + sprintf(buffer, "armor\\%d\\", armor); + strcat(string,buffer);//FIXME + } +} + +void inven_c::stockWeapons(void) +{ + // Go through all your possessions and ensure that they are filled with tasty ammo. + + for(int i = 0; i < MAXSELECTABLEWEAPONS; i++) + { + if(weapons[i].getType() != SFW_EMPTYSLOT) + refillCurClip(i, 1, 0); + } +} + +void inven_c::setBloodyWeapon(int isBloody) +{ + if(!wAnim.getBloody()) + { + if(!isClient) + serverRICBuffer->AddRIC(RIC_SETBLOODYWEAPON,"i",isBloody); + + curInfo()->setBloody(owner); + wAnim.setBloody(1); + } +} + +int inven_c::rulesDoWeaponsUseAmmo(void) +{ + return(rulesWeaponsUseAmmo); +} + +void inven_c::rulesSetWeaponsUseAmmo(int useAmmo) +{ + if(!isClient) + serverRICBuffer->AddRIC(RIC_RULESSETWEAPONSUSEAMMO,"i",useAmmo); + + rulesWeaponsUseAmmo=useAmmo; +} + +int inven_c::rulesCanDropWeapons(void) +{ + return(rulesDropWeapons); +} + +void inven_c::rulesSetDropWeapons(int dropWeapons) +{ + rulesDropWeapons=dropWeapons; +} + +int inven_c::rulesGetNonDroppableWeaponTypes(void) +{ + return(rulesNonDroppableWeaponTypes); +} + +void inven_c::rulesSetNonDroppableWeaponTypes(int nonDropMask) +{ + rulesNonDroppableWeaponTypes=(nonDropMask|(1<AddRIC(RIC_RULESSETWEAPONSRELOAD,"i",weaponsReload); + + rulesWeaponsReload=weaponsReload; +} + +int inven_c::rulesIsWeaponReloadAutomatic(void) +{ + return(rulesWeaponReloadAutomatic); +} + +void inven_c::rulesSetWeaponReloadAutomatic(int reloadAutomatic) +{ + if(!isClient) + serverRICBuffer->AddRIC(RIC_RULESSETWEAPONRELOADAUTOMATIC,"i",reloadAutomatic); + + rulesWeaponReloadAutomatic=reloadAutomatic; +} + +int inven_c::rulesDoReloadEmptiesWeapon(void) +{ + return(rulesReloadEmptiesWeapon); +} + +void inven_c::rulesSetReloadEmptiesWeapon(int reloadEmptiesWeapon) +{ + if(!isClient) + serverRICBuffer->AddRIC(RIC_RULESSETRELOADEMPTIESWEAPON,"i",reloadEmptiesWeapon); + + rulesReloadEmptiesWeapon=reloadEmptiesWeapon; +} + +char *inven_c::rulesGetBestWeaponMode(void) +{ + return(rulesBestWeaponMode); +} + +void inven_c::rulesSetBestWeaponMode(char *bestWeaponMode) +{ + int len=strlen(bestWeaponMode); + len=(len<5)?len:4; + memcpy(rulesBestWeaponMode,bestWeaponMode,len); + rulesBestWeaponMode[len]=0; +} + +int inven_c::rulesCanDropInvenOnDeath(void) +{ + return(rulesDropInvenOnDeath); +} + +void inven_c::rulesSetDropInvenOnDeath(int dropInvenOnDeath) +{ + rulesDropInvenOnDeath=dropInvenOnDeath; +} + +int inven_c::rulesCanSelectWithNoAmmo(void) +{ + return(rulesSelectWithNoAmmo); +} + +void inven_c::rulesSetSelectWithNoAmmo(int selectWithNoAmmo) +{ + rulesSelectWithNoAmmo=selectWithNoAmmo; +} + +int inven_c::rulesCanFreelySelectWeapon(void) +{ + return(rulesFreelySelectWeapon); +} + +void inven_c::rulesSetFreelySelectWeapon(int freelySelectWeapon) +{ + rulesFreelySelectWeapon=freelySelectWeapon; +} + +weaponInfo_c *inven_c::curInfo(void) +{ + return weapInfo[curWeaponType]; +} + +weaponInfo_c *inven_c::readiedInfo(void) +{ + return weapInfo[readiedWeaponType]; +} + +weapon_c *inven_c::curWeapon(void) +{ + return &weapons[curWeaponSlot]; +} + +weapon_c *inven_c::readiedWeapon(void) +{ + return &weapons[readiedWeaponSlot]; +} + +void inven_c::clientClearRICs(void) +{ + clientRICBuffer->ClearRICs(); +} + +void inven_c::clientReadRICs(void) +{ + clientRICBuffer->ReadRICs(); +} + +void inven_c::clientProcessRICs(void) +{ + clientRICBuffer->ProcessRICs(); +} + +void inven_c::serverClearRICs(void) +{ + serverRICBuffer->ClearRICs(); +} + +void inven_c::serverWriteRICs(void) +{ + serverRICBuffer->WriteRICs(); +} + +inven_c *W_NewInv(void) +{ + return(new inven_c); +} + +void W_KillInv(inven_c *inven) +{ + delete(inven); +} + +void RefreshWeapon(inven_c *inven) +{ + if(isClient) + return; + + // Set object to NULL to force a reload. + + inven->getCurWeapon()->getWeaponInfo()->setGhoulObj(NULL); + + // Reload weapon. + + inven->initNewWeapon(); + + // Hack for sniper rifle. I don't care anymore thankyou. + + IGhoulInst *gun=inven->getViewModel(); + + if(gun) + gun->SetAllPartsOnOff(inven->scopeIsActive()?false:true); +} + +inven_c::inven_c(inven_c *orig) +{ + int i; + + nextCommand = orig->nextCommand; + clientOverrideCmd = orig->clientOverrideCmd; + newInstRxd = orig->newInstRxd; + nextSelectSlot = orig->nextSelectSlot; + curWeaponID = orig->curWeaponID; + curWeaponType = orig->curWeaponType; + curWeaponSlot = orig->curWeaponSlot; + readiedWeaponID = orig->readiedWeaponID; + readiedWeaponType = orig->readiedWeaponType; + readiedWeaponSlot = orig->readiedWeaponSlot; + droppingSlot = orig->droppingSlot; + + for(i = 0; i < MAXWEAPONS; i++) + { + weapons[i] = orig->weapons[i]; + } + rulesWeaponsUseAmmo = orig->rulesWeaponsUseAmmo; + rulesDropWeapons = orig->rulesDropWeapons; + rulesNonDroppableWeaponTypes = orig->rulesNonDroppableWeaponTypes; + rulesWeaponsReload = orig->rulesWeaponsReload; + rulesReloadEmptiesWeapon = orig->rulesReloadEmptiesWeapon; + rulesWeaponReloadAutomatic = orig->rulesWeaponReloadAutomatic; + rulesDropInvenOnDeath = orig->rulesDropInvenOnDeath; + rulesSelectWithNoAmmo = orig->rulesSelectWithNoAmmo; + for(i = 0; i < 5; i++) + { + rulesBestWeaponMode[i] = orig->rulesBestWeaponMode[i]; + } + rulesFreelySelectWeapon = orig->rulesFreelySelectWeapon; + + for(i = 0; i < MAXAMMOS; i++) + { + ammo[i] = orig->ammo[i]; + } + canHandleInput = orig->canHandleInput; + model = NULL; // This is always recreated from scratch + readyModel = NULL; + selectedWeaponSlot = orig->selectedWeaponSlot; + armor = orig->armor; + weaponsOwned = orig->weaponsOwned; + pendingChange = orig->pendingChange; + clientPredicting = orig->clientPredicting; + + gunEnd = orig->gunEnd; + owner = NULL; + + items = orig->items; + + wAnim = orig->wAnim; + + clientRICBuffer = NULL; + serverRICBuffer = NULL; +} + +void inven_c::Evaluate(inven_c *orig) +{ + int i; + + nextCommand = orig->nextCommand; + clientOverrideCmd = orig->clientOverrideCmd; + newInstRxd = orig->newInstRxd; + nextSelectSlot = orig->nextSelectSlot; + curWeaponID = orig->curWeaponID; + curWeaponType = orig->curWeaponType; + curWeaponSlot = orig->curWeaponSlot; + readiedWeaponID = orig->readiedWeaponID; + readiedWeaponType = orig->readiedWeaponType; + readiedWeaponSlot = orig->readiedWeaponSlot; + droppingSlot = orig->droppingSlot; + + for(i = 0; i < MAXWEAPONS; i++) + { + weapons[i] = orig->weapons[i]; + } + rulesWeaponsUseAmmo = orig->rulesWeaponsUseAmmo; + rulesDropWeapons = orig->rulesDropWeapons; + rulesNonDroppableWeaponTypes = orig->rulesNonDroppableWeaponTypes; + rulesWeaponsReload = orig->rulesWeaponsReload; + rulesReloadEmptiesWeapon = orig->rulesReloadEmptiesWeapon; + rulesWeaponReloadAutomatic = orig->rulesWeaponReloadAutomatic; + rulesDropInvenOnDeath = orig->rulesDropInvenOnDeath; + rulesSelectWithNoAmmo = orig->rulesSelectWithNoAmmo; + for(i = 0; i < 5; i++) + { + rulesBestWeaponMode[i] = orig->rulesBestWeaponMode[i]; + } + rulesFreelySelectWeapon = orig->rulesFreelySelectWeapon; + + for(i = 0; i < MAXAMMOS; i++) + { + ammo[i] = orig->ammo[i]; + } + canHandleInput = orig->canHandleInput; + model = NULL; // This is always recreated from scratch + readyModel = NULL; + selectedWeaponSlot = orig->selectedWeaponSlot; + armor = orig->armor; + weaponsOwned = orig->weaponsOwned; + pendingChange = orig->pendingChange; + clientPredicting = orig->clientPredicting; + + gunEnd = orig->gunEnd; + owner = NULL; + + items = orig->items; + + wAnim = orig->wAnim; +} + +void inven_c::NetRead(sizebuf_t *net_message_ptr) +{ + char loaded[sizeof(inven_c)]; + + picl.ReadDataSizebuf(net_message_ptr, (byte *)(loaded + INVEN_SAVE_START), sizeof(inven_c) - INVEN_SAVE_START); + Evaluate((inven_c *)loaded); + clientPredicting=0; + + // FIXME: check for other fields that need to be cleared out (so that the + // system will settle back into a stable state). + + model=0; + readyModel=0; +} + +void inven_c::NetWrite(int clientnum) +{ + inven_c *tosend; + byte *save_start; + + tosend = new inven_c(this); + save_start = (byte *)this; + pisv.ReliableWriteDataToClient(save_start + INVEN_SAVE_START, sizeof(*this) - INVEN_SAVE_START, clientnum); + delete tosend; +} + +void inven_c::Read(void) +{ + char loaded[sizeof(inven_c)]; + + pisv.ReadFromSavegame('INVN', loaded + INVEN_SAVE_START, sizeof(inven_c) - INVEN_SAVE_START); + Evaluate((inven_c *)loaded); +} + +void inven_c::Write(void) +{ + inven_c *savable; + byte *save_start; + + savable = new inven_c(this); + save_start = (byte *)savable; + pisv.AppendToSavegame('INVN', save_start + INVEN_SAVE_START, sizeof(*this) - INVEN_SAVE_START); + delete savable; +} + +// end \ No newline at end of file diff --git a/Source/Game/player/w_models.cpp b/Source/Game/player/w_models.cpp new file mode 100644 index 0000000..62497f2 --- /dev/null +++ b/Source/Game/player/w_models.cpp @@ -0,0 +1,2653 @@ +#include "q_shared.h" +#include "..\ghoul\ighoul.h" +#include "w_public.h" +#include "w_types.h" +#include "w_weapons.h" +#include "w_utils.h" +#include "player.h" +#include "../gamecpp/game.h" + +extern player_com_import_t picom; +extern player_sv_import_t pisv; +extern player_cl_import_t picl; + +#define LEANINGLEFT(a) (a.viewside > 0.0) +#define LEANINGRIGHT(a) (a.viewside < 0.0) + +extern int isClient; +extern int fireEvent; +extern int altfireEvent; + +//---------------------------------------------------------------------------------------------------- + +knifeInfo::knifeInfo(weaponInfoExtra_t *w):weaponInfo_c(w){} + +void knifeInfo::precacheResources(void) +{ + weaponInfo_c::precacheResources(); +} + +void knifeInfo::setBloody(sharedEdict_t *self) +{ + SetWSkin(self,"knife","knifeblood"); +} + +char *knifeInfo::getSlashLeft(void) +{ + int rVal = ClientServerRand(0, 100); + + if(rVal < 33) + { + return "fire1_2sl_to_sr"; + } + else if(rVal < 67) + { + return "fire1_2dl_to_ur"; + } + else + { + return "fire1_2ul_to_dr"; + } + return NULL; +} + +char *knifeInfo::getSlashRight(void) +{ + int rVal = ClientServerRand(0, 100); + + if(rVal < 33) + { + return "fire1_2sr_to_sl"; + } + else if(rVal < 67) + { + return "fire1_2dr_to_ul"; + } + else + { + return "fire1_2ur_to_dl"; + } + return NULL; +} + +char *knifeInfo::getFireSeq(sharedEdict_t &ent) +{ + if(ClientServerRand(0, 100) < 75) + { + return "fire1_2a"; + } + else + { + return "fire1_1a"; + } +} + +char *knifeInfo::getIdleSeq(sharedEdict_t &ent) +{ + int rVal = ClientServerRand(0, 100); + + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setInteresting(0); + return "idle"; + } + + if(rVal < 20) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_1"; + } + else if (rVal < 40) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_2"; + } + else if (rVal < 60) + { + if(wAnim(ent)->getBloody()) + { + wAnim(ent)->setInteresting(1); + return "idleclean"; + } + wAnim(ent)->setInteresting(0); + return "idle"; + } + else + { + return "idle"; + } + + return NULL; +} + +char *knifeInfo::getAltFireSeq(sharedEdict_t &ent) +{ + return "fire2_1"; +} + +char *knifeInfo::getReloadSeq(sharedEdict_t &ent) +{ + return NULL; +} + +char *knifeInfo::getTakeOutSeq(sharedEdict_t &ent) +{ + return "ready"; +} + +char *knifeInfo::getPutAwaySeq(sharedEdict_t &ent) +{ + if(wAnim(ent)->getBloody()) + wAnim(ent)->setBloody(0); + + return "done"; +} + +int knifeInfo::handleEOS(sharedEdict_t &ent) +{ + char *newAnim = NULL; + char *curAnim = wAnim(ent)->getSeqName(); + + if(!strcmp(curAnim, "fire1_1a")) + { + newAnim = "fire1_1b"; + } + else if(!strcmp(curAnim, "fire2_1")) + { + wAnim(ent)->setBloody(0); + + SetWSkin(&ent, "knife", "knife"); + newAnim = "fire2_2"; + } + else if(!strcmp(curAnim, "fire1_2a")) + { + // So that the looping mechanism works correctly. + wAnim(ent)->clearFireLoop(); + + newAnim = getSlashRight(); + } + else if(!strcmp(curAnim, "fire1_2l_to_idle")) + { + newAnim = "fire1_2a"; + } + else if(!strcmp(curAnim, "fire2_2")) + { + if(inven(ent)->rulesDoWeaponsUseAmmo()) + { + if(inven(ent)->getAmmoAmount(AMMO_KNIFE) <= 1) + inven(ent)->idle(); + } + } + + if(newAnim) + { + RunVWeapAnim(&ent, newAnim, IGhoulInst::Hold); + return 1; + } + + return 0; +} + +void knifeInfo::handleFireLoop(sharedEdict_t &ent) +{ + char *newAnim = NULL; + + if(!strcmp(wAnim(ent)->getSeqName(), "fire1_1b")) + { + RunVWeapAnim(&ent, getFireSeq(ent), IGhoulInst::Hold); + return; + } + + switch(wAnim(ent)->getFireLoop()%2) + { + case 1: + newAnim = getSlashLeft(); + break; + case 0: + case 2: + newAnim = getSlashRight(); + break; +// case 3: +// newAnim = "fire1_2l_to_idle"; + break; + } + + RunVWeapAnim(&ent, newAnim, IGhoulInst::Hold); +} + +void knifeInfo::handleAltfireLoop(sharedEdict_t &ent) +{ + if(wAnim(ent)->getKnifeStatus() > 0) + { + RunVWeapAnim(&ent, getAltFireSeq(ent), IGhoulInst::Hold); + } + else + { + // If out of ammo, just idle. + + inven(ent)->idle(); + } +} + +void knifeInfo::handleSpecialNotes(char *string, sharedEdict_t &ent) +{ + if(wAnim(ent)->getBloody()) + { + wAnim(ent)->setBloody(0); + SetWSkin(&ent, "knife", "knife"); + } +} + +//---------------------------------------------------------------------------------------------------- + +pistol2Info::pistol2Info(weaponInfoExtra_t *w):weaponInfo_c(w){} + +void pistol2Info::precacheResources(void) +{ + weaponInfo_c::precacheResources(); + pisv.EffectIndex("weapons/playermz/pistol2"); +} + + +char *pistol2Info::getFireSeq(sharedEdict_t &ent) +{ + wAnim(ent)->setWeaponLifted(0); + if(wAnim(ent)->getHandSide()) + { + return "fire1_c"; + } + return "fire1_a"; +} + +char *pistol2Info::getDryfireSeq(sharedEdict_t &ent) +{ + wAnim(ent)->setWeaponLifted(0); + if(wAnim(ent)->getHandSide()) + { + return "dryfire_lhand"; + } + return "dryfire_rhand"; +} + +char *pistol2Info::getIdleSeq(sharedEdict_t &ent) +{ + int rVal = ClientServerRand(0, 100); + + if(ent.leanLeft) + { + // Left. + + if(!(wAnim(ent)->getHandSide())) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setWeaponLifted(0); + wAnim(ent)->setHandSide(1); + return "idle_a_to_idle_c"; + } + } + else if(ent.leanRight) + { + // Right. + + if(wAnim(ent)->getHandSide() == 1) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setHandSide(0); + wAnim(ent)->setWeaponLifted(0); + return "idle_c_to_idle_a"; + } + } + + if(wAnim(ent)->getHandSide()) + { + // Anims for the left side. + + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setTransition(0); + wAnim(ent)->setInteresting(0); + return "idle_c"; + } + + if(rVal < 80) + { + wAnim(ent)->setInteresting(0); + wAnim(ent)->setTransition(0); + return "idle_c"; + } + else + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(0); + return "idlefinger_c"; + } + } + if(wAnim(ent)->getWeaponLifted()) + { + // Idle anims for lifted on the right. + + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setInteresting(0); + wAnim(ent)->setTransition(0); + return "idle_d"; + } + + if(rVal < 10) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setWeaponLifted(0); + return "idle_d_to_idle_a"; + + } + else + { + wAnim(ent)->setInteresting(0); + wAnim(ent)->setTransition(0); + return "idle_d"; + } + } + else + { + // Idle anims for the right side when not lifted. + + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setTransition(0); + wAnim(ent)->setInteresting(0); + return "idle_a"; + } + + if(rVal < 10) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setWeaponLifted(1); + return "idle_a_to_idle_d"; + } + else if(rVal < 90) + { + wAnim(ent)->setInteresting(0); + wAnim(ent)->setTransition(0); + return "idle_a"; + } + else + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(0); + return "idlefinger_a"; + } + } + return "idle_a"; +} + +char *pistol2Info::getAltFireSeq(sharedEdict_t &ent) +{ + return NULL; +} + +char *pistol2Info::getReloadSeq(sharedEdict_t &ent) +{ + wAnim(ent)->setWeaponLifted(0); + if(wAnim(ent)->getHandSide()) + { + return "reload_c"; + } + return "reload_a"; +} + +char *pistol2Info::getTakeOutSeq(sharedEdict_t &ent) +{ + wAnim(ent)->setWeaponLifted(0); + wAnim(ent)->setHandSide(0); + return "ready_a"; +} + +char *pistol2Info::getPutAwaySeq(sharedEdict_t &ent) +{ + if(wAnim(ent)->getHandSide()) + { + return "done_c"; + } + return "done_a"; +} + +//---------------------------------------------------------------------------------------------------- + +pistol1Info::pistol1Info(weaponInfoExtra_t *w):weaponInfo_c(w){} + +void pistol1Info::precacheResources(void) +{ + weaponInfo_c::precacheResources(); + pisv.EffectIndex("weapons/playermz/pistol1"); +} + + +char *pistol1Info::getFireSeq(sharedEdict_t &ent) +{ + wAnim(ent)->setWeaponLifted(0); + return (wAnim(ent)->getHandsInUse() == 1) ? "fire1_a" : "fire1_b"; +} + +char *pistol1Info::getAltFireSeq(sharedEdict_t &ent) +{ + return "fire1_a"; +} + +char *pistol1Info::getDryfireSeq(sharedEdict_t &ent) +{ + wAnim(ent)->setWeaponLifted(0); + return (wAnim(ent)->getHandsInUse() == 1) ? "dryfire_1hand" : "dryfire_2hands"; +} + +char *pistol1Info::getIdleSeq(sharedEdict_t &ent) +{ + int rVal = ClientServerRand(0, 100); + + if(ent.leanLeft) + { // left + if((wAnim(ent)->getHandsInUse() == 1)||(wAnim(ent)->getWeaponLifted())) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setHandsInUse(2); + wAnim(ent)->setWeaponLifted(0); + return "idle_a_to_idle_b"; + } + } + else if(ent.leanRight) + { + if(wAnim(ent)->getHandsInUse() == 2) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setHandsInUse(1); + return "idle_b_to_idle_a"; + } + } + + if(wAnim(ent)->getWeaponLifted() == 1) + { + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setTransition(0); + wAnim(ent)->setInteresting(0); + return "idle_c"; + } + + if((rVal < 30)&&(!wAnim(ent)->getJustTransitioned())&&(!ent.leanLeft)) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setHandsInUse(2); + wAnim(ent)->setWeaponLifted(0); + return "idle_c_to_idle_b"; + } + else if(rVal < 90) + { + wAnim(ent)->setInteresting(0); + wAnim(ent)->setTransition(0); + return "idle_c"; + } + else + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(0); + return "idlefinger_c"; + } + } + else if(wAnim(ent)->getHandsInUse() == 1) + { + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setTransition(0); + wAnim(ent)->setInteresting(0); + return "idle_a"; + } + + if((rVal < 20)&&(!wAnim(ent)->getJustTransitioned())&&(!(ent.leanLeft))) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setHandsInUse(2); + return "idle_a_to_idle_b"; + } + else if(rVal < 80) + { + wAnim(ent)->setInteresting(0); + wAnim(ent)->setTransition(0); + return "idle_a"; + } + else + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(0); + return "idlefinger_a"; + } + } + else + { + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setTransition(0); + wAnim(ent)->setInteresting(0); + return "idle_b"; + } + + if((rVal < 10)&&(!wAnim(ent)->getJustTransitioned())&&(!(ent.leanRight))) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setWeaponLifted(1); + return "idle_b_to_idle_c"; + } + else if((rVal < 30)&&(!wAnim(ent)->getJustTransitioned())&&(!(ent.leanRight))) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setHandsInUse(1); + return "idle_b_to_idle_a"; + } + else if(rVal < 95) + { + wAnim(ent)->setTransition(0); + return "idle_b"; + } + else + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(0); + return "idlefinger_b"; + } + } + return NULL; +} + +char *pistol1Info::getReloadSeq(sharedEdict_t &ent) +{ + return (wAnim(ent)->getHandsInUse() == 1) ? "reload_a":"reload_b"; +} + +char *pistol1Info::getTakeOutSeq(sharedEdict_t &ent) +{ + wAnim(ent)->setHandsInUse(1); + wAnim(ent)->setWeaponLifted(0); + return "ready_a"; +} + +int pistol1Info::handleEOS(sharedEdict_t &ent) +{ + return 0; +} + +void pistol1Info::handleAltfireLoop(sharedEdict_t &ent) +{ + wAnim(ent)->setFirstShot(1); + inven(ent)->altFire(); +} + +char *pistol1Info::getPutAwaySeq(sharedEdict_t &ent) +{ + return (wAnim(ent)->getHandsInUse() == 1) ? "done_a":"done_b"; +} + + +int pistol1Info::atMomentOfFire(sharedEdict_t &ent) +{ + if(strcmp(wAnim(ent)->getSeqName(), "fire2_b")) + return 1; + + int val = wAnim(ent)->firstShot(); + wAnim(ent)->setFirstShot(0); + if(val) + return 1; + + inven(ent)->getAnimInfo()->incFireLoop(); + return(inven(ent)->getCurWeapon()->handleAmmo(ent, 0)); +} + +//---------------------------------------------------------------------------------------------------- + +machinePistolInfo::machinePistolInfo(weaponInfoExtra_t *w):weaponInfo_c(w){} + +void machinePistolInfo::precacheResources(void) +{ + weaponInfo_c::precacheResources(); + pisv.EffectIndex("weapons/playermz/machinepistol"); +} + +char *machinePistolInfo::getFireSeq(sharedEdict_t &ent) +{ + return "fire2_1"; +} + +char *machinePistolInfo::getIdleSeq(sharedEdict_t &ent) +{ + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setInteresting(0); + return "idle"; + } + + if(ClientServerRand(0, 100) < 20) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_a"; + } + else + { + wAnim(ent)->setInteresting(0); + return "idle"; + } +} + +char *machinePistolInfo::getAltFireSeq(sharedEdict_t &ent) +{ + return "fire1"; + +} + +char *machinePistolInfo::getReloadSeq(sharedEdict_t &ent) +{ + return "reload"; +} + +char *machinePistolInfo::getTakeOutSeq(sharedEdict_t &ent) +{ + return "ready"; +} + +char *machinePistolInfo::getDryfireSeq(sharedEdict_t &ent) +{ + return "dryfire"; +} + +int machinePistolInfo::handleEOS(sharedEdict_t &ent) +{ + if(!strcmp(wAnim(ent)->getSeqName(), "fire2_1")) + { + if(!ent.attack) + { + RunVWeapAnim(&ent, "fire2_2", IGhoulInst::Hold); + return 1; + } + } + return 0; +} + +char *machinePistolInfo::getPutAwaySeq(sharedEdict_t &ent) +{ + return "done"; +} + +void machinePistolInfo::handleFireLoop(sharedEdict_t &ent) +{ + wAnim(ent)->setFirstShot(1); +} + +int machinePistolInfo::atMomentOfFire(sharedEdict_t &ent) +{ + float curTime; + + if(!isClient) + curTime = *pisv.levelTime; + else + curTime = *picl.levelTime; + + if(wAnim(ent)->getlastShootTime() == curTime) + return 0; + + wAnim(ent)->setlastShootTime(curTime); + int val = wAnim(ent)->firstShot(); + wAnim(ent)->setFirstShot(0); + if(val) + return 1; + + inven(ent)->getAnimInfo()->incFireLoop(); + return (inven(ent)->getCurWeapon()->handleAmmo(ent, 0)); +} + +int machinePistolInfo::testInput(sharedEdict_t &ent) +{ + if(wAnim(ent)->getAnimType() == WANIM_FIRE) + { + if(!ent.attack) + { + // Stopped firing - interrupt anim. + + inven(ent)->idle(); + } + } + + return 1; +} + + +//---------------------------------------------------------------------------------------------------- + +assaultRifleInfo::assaultRifleInfo(weaponInfoExtra_t *w):weaponInfo_c(w){} + +void assaultRifleInfo::precacheResources(void) +{ + weaponInfo_c::precacheResources(); + pisv.EffectIndex("weapons/playermz/assaultrifle"); +} + +char *assaultRifleInfo::getFireSeq(sharedEdict_t &ent) +{ + wAnim(ent)->setFirstShot(1); + + if(wAnim(ent)->getDown()) + { + return "fire1_b"; + } + else + { + return "fire1_a"; + } + + return "fire1_a"; +} + +char *assaultRifleInfo::getIdleSeq(sharedEdict_t &ent) +{ + int rVal = ClientServerRand(0, 100); + + if(ent.leanRight) + { + // Right. + + if(wAnim(ent)->getDown()) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setDown(0); + return "idle_b_to_idle_a"; + } + } + else if(ent.leanLeft) + { + // Left. + + if(!wAnim(ent)->getDown()) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setDown(1); + return "idle_a_to_idle_b"; + } + } + + + if(wAnim(ent)->getDown()) + { + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setTransition(0); + wAnim(ent)->setInteresting(0); + return "idle_b"; + } + + if((rVal < 30)&&(!wAnim(ent)->getJustTransitioned())) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setDown(0); + wAnim(ent)->setTransition(1); + return "idle_b_to_idle_a"; + } + else if(rVal < 50) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(0); + return "idlefinger_b"; + } + else + { + wAnim(ent)->setInteresting(0); + wAnim(ent)->setTransition(0); + return "idle_b"; + } + } + else + { + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setTransition(0); + wAnim(ent)->setInteresting(0); + return "idle_a"; + } + + if((rVal < 10)&&(!wAnim(ent)->getJustTransitioned())) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setDown(1); + return "idle_a_to_idle_b"; + } + else if(rVal < 20) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(0); + return "idlefinger_a"; + } + else + { + wAnim(ent)->setInteresting(0); + wAnim(ent)->setTransition(0); + return "idle_a"; + } + } + return "idle_a"; +} + +char *assaultRifleInfo::getAltFireSeq(sharedEdict_t &ent) +{ + return NULL; +} + +char *assaultRifleInfo::getReloadSeq(sharedEdict_t &ent) +{ + if(wAnim(ent)->getDown()) + { + return "reload_b"; + } + else + { + return "reload_a"; + } + return "reload"; +} + +char *assaultRifleInfo::getTakeOutSeq(sharedEdict_t &ent) +{ + return "ready"; +} + +char *assaultRifleInfo::getPutAwaySeq(sharedEdict_t &ent) +{ + if(wAnim(ent)->getDown()) + { + return "done_b"; + } + else + { + return "done_a"; + } + return "done"; +} + +char *assaultRifleInfo::getDryfireSeq(sharedEdict_t &ent) +{ + if(wAnim(ent)->getDown()) + { + return "dryfire_side"; + } + else + { + return "dryfire_up"; + } + + return "dryfire"; +} + +int assaultRifleInfo::atMomentOfFire(sharedEdict_t &ent) +{ + float curTime; + + if(!isClient) + curTime = *pisv.levelTime; + else + curTime = *picl.levelTime; + + if(wAnim(ent)->getlastShootTime() == curTime) + { + return 0; + } + wAnim(ent)->setlastShootTime(curTime); + + int val = wAnim(ent)->firstShot(); + wAnim(ent)->setFirstShot(0); + if(val)return 1; + + inven(ent)->getAnimInfo()->incFireLoop(); + return (inven(ent)->getCurWeapon()->handleAmmo(ent, 0)); +} + +int assaultRifleInfo::testInput(sharedEdict_t &ent) +{ + if(wAnim(ent)->getAnimType() == WANIM_FIRE) + { + if(!ent.attack) + { + // Stopped firing - interrupt anim. + + inven(ent)->idle(); + } + } + else + { + if(!inven(ent)->getInputStatus())return 1; + if(wAnim(ent)->getJustTransitioned())return 1; + + if(ent.weap3) + { + if(!wAnim(ent)->getDown()) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setDown(1); + RunVWeapAnim(&ent, "idle_a_to_idle_b", IGhoulInst::Hold); + } + } + if(ent.weap4) + { + if(wAnim(ent)->getDown()) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setDown(0); + RunVWeapAnim(&ent, "idle_b_to_idle_a", IGhoulInst::Hold); + } + } + return 1; + + } + return 1; +} + +void assaultRifleInfo::turnOffAmmoParts(sharedEdict_t &ent,int clipLeft,qboolean forceAll) +{ + IGhoulInst *inst=(!isClient)?ent.edict->client->ps.gun:ent.inv->getViewModel(); + + if(!inst) + return; + + IGhoulObj *obj=inst->GetGhoulObject(); + + if(!obj) + return; + + char buf[32]; + GhoulID part; + + if((clipLeft>2)&&(clipLeft<16)) + { + if((!isClient)&&(!forceAll)) + { + sprintf(buf, "%d", clipLeft + 1); + + if(part=obj->FindPart(buf)) + inst->SetPartOnOff(part, false); + } + else + { + for(;clipLeft<16;clipLeft++) + { + sprintf(buf, "%d", clipLeft + 1); + + if(part=obj->FindPart(buf)) + inst->SetPartOnOff(part, false); + } + } + } +} + +int assaultRifleInfo::useAmmo1(sharedEdict_t &ent, int *skipIdle) +{ + int retVal=weaponInfo_c::useAmmo1(ent); + + if(inven(ent)->rulesDoWeaponsUseAmmo()) + turnOffAmmoParts(ent,inven(ent)->getCurWeapon()->getClip()); + + return(retVal); +} + +void assaultRifleInfo::handleSpecialNotes(char *string, sharedEdict_t &ent) +{ + IGhoulInst *inst=(!isClient)?ent.edict->client->ps.gun:ent.inv->getViewModel(); + + if(!inst) + return; + + IGhoulObj *obj= inst->GetGhoulObject(); + + if(!obj) + return; + + GhoulID part; + + int clip; + + if(inven(ent)->rulesDoWeaponsUseAmmo()) + clip=inven(ent)->getCurClip(); + else + clip=16; + + for(int i=4; (i<17)&&(i<=clip); i++) + { + char buf[10]; + + sprintf(buf, "%d", i); + part = obj->FindPart(buf); + if(part)inst->SetPartOnOff(part, true); + } +} + +//---------------------------------------------------------------------------------------------------- + +sniperInfo::sniperInfo(weaponInfoExtra_t *w):weaponInfo_c(w){} + +void sniperInfo::precacheResources(void) +{ + weaponInfo_c::precacheResources(); + pisv.EffectIndex("weapons/playermz/sniper"); +} + + +char *sniperInfo::getFireSeq(sharedEdict_t &ent) +{ + return "fire1"; +} + +char *sniperInfo::getDryfireSeq(sharedEdict_t &ent) +{ + return "dryfire"; +} + +char *sniperInfo::getIdleSeq(sharedEdict_t &ent) +{ + int rVal = ClientServerRand(0, 100); + + if(wAnim(ent)->getDown()) + { + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setInteresting(0); + return "idle_a"; + } + + else if(rVal < 20) + { + wAnim(ent)->setInteresting(1); + return "idlefinger"; + } + else + { + wAnim(ent)->setInteresting(0); + return "idle_a"; + } + } + + return "idle_a"; +} + +char *sniperInfo::getAltFireSeq(sharedEdict_t &ent) +{ + if(wAnim(ent)->getInZoom())return NULL; + + if(ent.edict->client->ps.fov < 95) + { + IGhoulInst *gun; + + if(!isClient) + gun = ent.edict->client->ps.gun; + else + gun = ent.inv->getViewModel(); + + if(gun) + { + gun->SetAllPartsOnOff(true); + } + + ent.edict->client->ps.fov = 95; + wAnim(ent)->setRezoom(0); + wAnim(ent)->setInZoomView(0); + return "scopeout"; + } + else + { + return "scopein"; + } + + return "scopein"; +} + +char *sniperInfo::getReloadSeq(sharedEdict_t &ent) +{ + if(!inven(ent)->rulesDoWeaponsReload()) + return "idle"; + + IGhoulInst *gun; + + wAnim(ent)->setDown(1); + wAnim(ent)->setTransition(1); + + if(ent.edict->client->ps.fov < 95) + { + if(!isClient) + gun = ent.edict->client->ps.gun; + else + gun = ent.inv->getViewModel(); + + if(gun) + { + gun->SetAllPartsOnOff(true); + } + + ent.edict->client->ps.fov = 95; + wAnim(ent)->setInZoomView(0); + } + + return "reload"; +} + +char *sniperInfo::getTakeOutSeq(sharedEdict_t &ent) +{ + wAnim(ent)->setDown(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setRezoom(0); + return "ready"; +} + +int sniperInfo::handleEOS(sharedEdict_t &ent) +{ + char *newSeq = 0; + IGhoulInst *gun; + + if(!strcmp(wAnim(ent)->getSeqName(), "scopein")) + { + ent.edict->client->ps.fov = 60; + wAnim(ent)->setInZoom(1); + wAnim(ent)->setInZoomView(1); + wAnim(ent)->setRezoom(ent.edict->client->ps.fov); + + if(!isClient) + gun = ent.edict->client->ps.gun; + else + gun = ent.inv->getViewModel(); + + if(gun) + { + gun->SetAllPartsOnOff(false); + } + + inven(ent)->idle(); //fixme change + return 1; + } + else if(!strcmp(wAnim(ent)->getSeqName(), "scopeout")) + { + inven(ent)->idle(); + return 1; + } + else if(!strcmp(wAnim(ent)->getSeqName(), "reload")) + { + if(wAnim(ent)->getRezoom()) + { + ent.edict->client->ps.fov = wAnim(ent)->getRezoom(); + wAnim(ent)->setInZoom(1); + wAnim(ent)->setInZoomView(1); + + if(!isClient) + gun = ent.edict->client->ps.gun; + else + gun = ent.inv->getViewModel(); + + if(gun) + { + gun->SetAllPartsOnOff(false); + } + + inven(ent)->idle(); + } + } + + if(newSeq) + { + RunVWeapAnim(&ent, newSeq, IGhoulInst::Hold); + return 1; + } + return 0; +} + +void sniperInfo::handleFireLoop(sharedEdict_t &ent) +{ + RunVWeapAnim(&ent, getFireSeq(ent), IGhoulInst::Hold); +} + +void sniperInfo::handleAltfireLoop(sharedEdict_t &ent) +{ + inven(ent)->idle(); +} + +char *sniperInfo::getPutAwaySeq(sharedEdict_t &ent) +{ + if(wAnim(ent)->getDown())return "done_a"; + return "done_b"; +} + + +//---------------------------------------------------------------------------------------------------- + +autoshotgunInfo::autoshotgunInfo(weaponInfoExtra_t *w):weaponInfo_c(w){} + +void autoshotgunInfo::precacheResources(void) +{ + weaponInfo_c::precacheResources(); + pisv.EffectIndex("weapons/playermz/autoshotgun"); +} + + +char *autoshotgunInfo::getFireSeq(sharedEdict_t &ent) +{ + // Set the firing speed, the autoshot is slower than the input anim... +// ent.inv->getViewModel()->SetSpeed(getFireSpeed()); + + return "fire1"; +} + +char *autoshotgunInfo::getIdleSeq(sharedEdict_t &ent) +{ + int rVal = ClientServerRand(0, 130); + + if(!strcmp(ent.inv->getAnimInfo()->getSeqName(), "ready")) + { + // Special idle that only ever follows the ready animation. + + wAnim(ent)->setInteresting(1); + return "ready_idle"; + } + + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setInteresting(0); + return "idle"; + } + + if(rVal < 10) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_a"; + } + else if(rVal < 25) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_b"; + } + else + { + wAnim(ent)->setInteresting(0); + return "idle"; + } + return "idle"; +} + +char *autoshotgunInfo::getAltFireSeq(sharedEdict_t &ent) +{ + return "fire2"; +} + +char *autoshotgunInfo::getDryfireSeq(sharedEdict_t &ent) +{ + return "dryfire"; +} + +char *autoshotgunInfo::getReloadSeq(sharedEdict_t &ent) +{ + return "reload"; +} + +int autoshotgunInfo::handleEOS(sharedEdict_t &ent) +{ + // Reset to normal speed, because the autoshot's mainfire is slowed. +// ent.inv->getViewModel()->SetSpeed(gsOne); + + return 0; +} + +char *autoshotgunInfo::getTakeOutSeq(sharedEdict_t &ent) +{ + return "ready"; +} + +char *autoshotgunInfo::getPutAwaySeq(sharedEdict_t &ent) +{ + return "done"; +} + +//---------------------------------------------------------------------------------------------------- + +shotgunInfo::shotgunInfo(weaponInfoExtra_t *w):weaponInfo_c(w){} + +void shotgunInfo::precacheResources(void) +{ + weaponInfo_c::precacheResources(); + pisv.EffectIndex("weapons/playermz/shotgun"); +} + + +char *shotgunInfo::getFireSeq(sharedEdict_t &ent) +{ + return "fire1"; +} + +char *shotgunInfo::getDryfireSeq(sharedEdict_t &ent) +{ + return "dryfire"; +} + +char *shotgunInfo::getIdleSeq(sharedEdict_t &ent) +{ + int rVal = ClientServerRand(0, 100); + + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setInteresting(0); + return "idle"; + } + + if(rVal < 10) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_a"; + } + else + { + wAnim(ent)->setInteresting(0); + return "idle"; + } + return "idle"; +} + +char *shotgunInfo::getAltFireSeq(sharedEdict_t &ent) +{ + return "fire2"; +} + +char *shotgunInfo::getReloadSeq(sharedEdict_t &ent) +{ + return "reload_1"; +} + +int shotgunInfo::handleEOS(sharedEdict_t &ent) +{ + if(!strcmp(wAnim(ent)->getSeqName(), "reload_loop")) + { + if(inven(ent)->refillCurClip(inven(ent)->getCurSlot(), 0, 0)) + { + RunVWeapAnim(&ent, "reload_loop", IGhoulInst::Hold); + + // Looping reload sequence can be interrupted at any time. + inven(ent)->setInputStatus(1); + } + else + { + RunVWeapAnim(&ent, "reload_2", IGhoulInst::Hold); + } + return 1; + } + else if(!strcmp(wAnim(ent)->getSeqName(), "reload_1")) + { + RunVWeapAnim(&ent, "reload_loop", IGhoulInst::Hold); + return 1; + } + + return 0; +} + +char *shotgunInfo::getTakeOutSeq(sharedEdict_t &ent) +{ + return "ready"; +} + +char *shotgunInfo::getPutAwaySeq(sharedEdict_t &ent) +{ + return "done"; +} + +int shotgunInfo::useAmmo1(sharedEdict_t &ent, int *skipIdle) +{ + if(!inven(ent)->rulesDoWeaponsUseAmmo()) + return 1; + + if(!inven(ent)->getCurClip()) + { + if(inven(ent)->rulesIsWeaponReloadAutomatic()) + inven(ent)->reload(); + else + inven(ent)->dryfire(); + + return 0; + } + + inven(ent)->setCurClip(inven(ent)->getCurClip() - 1); + return 1; +} + +//---------------------------------------------------------------------------------------------------- + +machinegunInfo::machinegunInfo(weaponInfoExtra_t *w):weaponInfo_c(w){} + +void machinegunInfo::precacheResources(void) +{ + weaponInfo_c::precacheResources(); + pisv.EffectIndex("weapons/playermz/machinegun"); +} + + +char *machinegunInfo::getFireSeq(sharedEdict_t &ent) +{ + wAnim(ent)->setFirstShot(1);//great + + // Set the firing speed, which might be slower or fast on some weapons. +// ent.inv->getViewModel()->SetSpeed(getFireSpeed()); + + return "fire1_1"; +} + +char *machinegunInfo::getDryfireSeq(sharedEdict_t &ent) +{ + return "dryfire"; +} + +char *machinegunInfo::getIdleSeq(sharedEdict_t &ent) +{ + int rVal = ClientServerRand(0, 100); + + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setInteresting(0); + return "idle"; + } + + if(rVal < 20) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_a"; + } + else if(rVal < 40) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_b"; + } + else + { + wAnim(ent)->setInteresting(0); + return "idle"; + } + return "idle_a"; +} + +char *machinegunInfo::getAltFireSeq(sharedEdict_t &ent) +{ + + // Reset to normal speed, because the machinegun's mainfire is accelerated. +// ent.inv->getViewModel()->SetSpeed(gsOne); + + return "fire2"; +} + +char *machinegunInfo::getReloadSeq(sharedEdict_t &ent) +{ + + // Reset to normal speed, because the machinegun's mainfire is accelerated. +// ent.inv->getViewModel()->SetSpeed(gsOne); + + return "reload"; +} + +char *machinegunInfo::getTakeOutSeq(sharedEdict_t &ent) +{ + return "ready"; +} + +int machinegunInfo::handleEOS(sharedEdict_t &ent) +{ + if(!strcmp(wAnim(ent)->getSeqName(), "fire1_1")) + { + wAnim(ent)->setFirstShot(1);//great + + if(!ent.attack) + { + RunVWeapAnim(&ent, "fire1_2", IGhoulInst::Hold); + return 1; + } + + // Reset to normal speed, because the machinegun's mainfire is accelerated. +// ent.inv->getViewModel()->SetSpeed(gsOne); + + } + else if(!strcmp(wAnim(ent)->getSeqName(), "fire1_2")) + { + inven(ent)->idle(); + + // Reset to normal speed, because the machinegun's mainfire is accelerated. +// ent.inv->getViewModel()->SetSpeed(gsOne); + + } + + return 0; +} + +char *machinegunInfo::getPutAwaySeq(sharedEdict_t &ent) +{ + return "done"; +} + +void machinegunInfo::handleSpecialNotes(char *string, sharedEdict_t &ent) +{ + IGhoulInst *inst=(!isClient)?ent.edict->client->ps.gun:ent.inv->getViewModel(); + IGhoulObj *obj; + GhoulID part; + + if(!inst)return; + + obj = inst->GetGhoulObject(); + + if(!obj)return; + + int clip; + + if(inven(ent)->rulesDoWeaponsUseAmmo()) + clip=inven(ent)->getCurClip(); + else + clip=8; + + for(int i=1; (i<9)&&(i<=clip); i++) + { + char buf[256]; + sprintf(buf, "BULLET%d", i); + + part = obj->FindPart(buf); + if(part)inst->SetPartOnOff(part, true); + } +} + +int machinegunInfo::atMomentOfFire(sharedEdict_t &ent) +{ + float curTime; + + if(!isClient) + curTime = *pisv.levelTime; + else + curTime = *picl.levelTime; + + if(wAnim(ent)->getlastShootTime() >= curTime - .195) + { + return 0; + } + wAnim(ent)->setlastShootTime(curTime); + + + if(wAnim(ent)->getAnimType() == WANIM_FIRE) + { + int val = wAnim(ent)->firstShot(); + wAnim(ent)->setFirstShot(0); + if(val) + { + return 1; + } + + inven(ent)->getAnimInfo()->incFireLoop(); + return (inven(ent)->getCurWeapon()->handleAmmo(ent, 0)); + } + else + { + return 1; + } +} + +int machinegunInfo::testInput(sharedEdict_t &ent) +{ + if(wAnim(ent)->getAnimType() == WANIM_FIRE) + { + if(!ent.attack) + { + // Stopped firing - interrupt anim. + + inven(ent)->idle(); + } + } + + return 1; +} + + +//---------------------------------------------------------------------------------------------------- + +rocketInfo::rocketInfo(weaponInfoExtra_t *w):weaponInfo_c(w){} + +void rocketInfo::precacheResources(void) +{ + weaponInfo_c::precacheResources(); + pisv.EffectIndex("weapons/playermz/rocket"); + pisv.EffectIndex("weapons/playermz/rocket_alt"); +} + + +char *rocketInfo::getFireSeq(sharedEdict_t &ent) +{ + return "fire1"; +} + +char *rocketInfo::getIdleSeq(sharedEdict_t &ent) +{ + int rVal = ClientServerRand(0, 100); + + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setInteresting(0); + return "idle"; + } + + if(rVal < 10) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_a"; + } + else if(rVal < 20) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_b"; + } + else + { + wAnim(ent)->setInteresting(0); + return "idle"; + } + return "idle"; +} + +char *rocketInfo::getAltFireSeq(sharedEdict_t &ent) +{ + wAnim(ent)->setFirstShot(1); + return "fire2"; +} + +char *rocketInfo::getDryfireSeq(sharedEdict_t &ent) +{ + return "dryfire"; +} + +char *rocketInfo::getReloadSeq(sharedEdict_t &ent) +{ + return "reload"; +} + +char *rocketInfo::getTakeOutSeq(sharedEdict_t &ent) +{ + return "ready"; +} + +char *rocketInfo::getPutAwaySeq(sharedEdict_t &ent) +{ + return "done"; +} + +void rocketInfo::handleFireLoop(sharedEdict_t &ent) +{ + wAnim(ent)->setFirstShot(1); +} + +int rocketInfo::atMomentOfFire(sharedEdict_t &ent) +{ //grrr....... + float curTime; + if(!isClient) + curTime = *pisv.levelTime; + else + curTime = *picl.levelTime; + + if(wAnim(ent)->getlastShootTime() == curTime) + { + return 0; + } + wAnim(ent)->setlastShootTime(curTime); + + + if(wAnim(ent)->getAnimType() == WANIM_ALTFIRE) + { + int val = wAnim(ent)->firstShot(); + wAnim(ent)->setFirstShot(0); + if(val)return 1; + + inven(ent)->getAnimInfo()->incFireLoop(); + return (inven(ent)->getCurWeapon()->handleAmmo(ent, 1)); + } + else + { + return 1; + } +} + + +//---------------------------------------------------------------------------------------------------- + +microInfo::microInfo(weaponInfoExtra_t *w):weaponInfo_c(w){} + +void microInfo::precacheResources(void) +{ + weaponInfo_c::precacheResources(); + pisv.EffectIndex("weapons/playermz/mpg"); +} + + +char *microInfo::getFireSeq(sharedEdict_t &ent) +{ + if(!strcmp(wAnim(ent)->getSeqName(), "fire2")) + { + return "fire2_loop"; + } + if(!strcmp(wAnim(ent)->getSeqName(), "fire2_loop")) + { + return "fire2_loop"; + } + return "fire2"; +} + +char *microInfo::getIdleSeq(sharedEdict_t &ent) +{ + int rVal = ClientServerRand(0, 100); + + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setInteresting(0); + return "idle"; + } + + if(rVal < 15) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_a"; + } + else if(rVal < 30) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_b"; + } + else + { + wAnim(ent)->setInteresting(0); + return "idle"; + } + return "idle"; +} + +char *microInfo::getAltFireSeq(sharedEdict_t &ent) +{ + return "fire1"; +} + +char *microInfo::getReloadSeq(sharedEdict_t &ent) +{ + return "reload"; +} + +char *microInfo::getDryfireSeq(sharedEdict_t &ent) +{ + return "dryfire"; +} + +int microInfo::handleEOS(sharedEdict_t &ent) +{ + if(!strcmp(ent.inv->getAnimInfo()->getSeqName(), "fire1")) + { + RunVWeapAnim(&ent, "charge", IGhoulInst::Hold); + return 1; + } + return 0; +} + +char *microInfo::getTakeOutSeq(sharedEdict_t &ent) +{ + return "ready"; +} + +char *microInfo::getPutAwaySeq(sharedEdict_t &ent) +{ + return "done"; +} + +int microInfo::testInput(sharedEdict_t &ent) +{ + if(wAnim(ent)->getAnimType() == WANIM_FIRE) + { + if(!ent.attack) + { + // Stopped firing - interrupt anim. + + inven(ent)->idle(); + RunVWeapAnim(&ent, "fire2_end", IGhoulInst::Hold); + } +/* else if(!strcmp(ent.inv->getAnimInfo()->getSeqName(), "fire2_loop")) + { + // Still looping through this - should fire the weak beam. + // FIXME:Does this use ammo? + + if(!isClient) + pisv.AltfireHelper(ent, *ent.edict, *ent.inv); + } +*/ + } + + return 1; +} + +int microInfo::useAmmo2(sharedEdict_t &ent, int *skipIdle) +{ + if(!inven(ent)->rulesDoWeaponsUseAmmo()) + return 1; + + if(inven(ent)->getCurClip() < 10 ) + { + if(inven(ent)->rulesIsWeaponReloadAutomatic()) + { + inven(ent)->reload(); + if(skipIdle) + { + // This makes the relaod work right for the grenades. + + //*skipIdle = 1; + } + } + else + { + inven(ent)->dryfire(); + } + + return 0; + } + + inven(ent)->setCurClip(inven(ent)->getCurClip() - 10); + return 1; +} + +/* +void microInfo::frameUpdate(sharedEdict_t &ent) +{ + static float lastidle=0; + float difftime; + + if(wAnim(ent)->getAnimType() == WANIM_NORMAL) + { + if (isClient) + { + difftime = *picl.levelTime - lastidle; + if (difftime < -1.5) + { + difftime = 1.6; + } + + if (difftime > 1.5) + { + picl.WeaponEffectHelper("weapons/playermz/mpgcharge flash"); + } + else + { + picl.WeaponEffectHelper("weapons/playermz/mpgcharge flash", (difftime/1.5)); + } + lastidle = *picl.levelTime; + + if(difftime > 1.35) + { + float tVal = difftime - 1.35;//this should be the amount of time idling + + if(!((int)(tVal*10)%7))//eh? + { + picl.WeapSoundHelper ("weapons/mpg/idle.wav"); + } + } + + if(difftime < 0.2) + { + // picl.WeapSoundHelper (NULL); + } + } + } +} +*/ + +//---------------------------------------------------------------------------------------------------- + +flamegunInfo::flamegunInfo(weaponInfoExtra_t *w):weaponInfo_c(w){} + +void flamegunInfo::precacheResources(void) +{ + weaponInfo_c::precacheResources(); +} + + +char *flamegunInfo::getFireSeq(sharedEdict_t &ent) +{ + if(!strcmp(wAnim(ent)->getSeqName(), "fire1_1")) + { + return "fire1_idle"; + } + else if(!strcmp(wAnim(ent)->getSeqName(), "fire1_idle")) + { + return "fire1_idle"; + } + + if (!isClient) + { + ent.edict->s.sound = pisv.SoundIndex("weapons/flamegun/fire.wav"); + ent.edict->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + + return "fire1_1"; +} + +char *flamegunInfo::getIdleSeq(sharedEdict_t &ent) +{ + int rVal = ClientServerRand(0, 100); + + // Make sure to kill any sounds that are engaged during the idle. + if(!isClient) + { + // If we have the CTF flag, then resume the klaxon. + if (pisv.DoWeHaveTheFlag(ent.edict)) + { + ent.edict->s.sound = pisv.SoundIndex("player/flaglp.wav"); + ent.edict->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + else + { + ent.edict->s.sound = 0; + ent.edict->s.sound_data = 0; + } + } + + if(wAnim(ent)->getLastWasInteresting()) + { + wAnim(ent)->setInteresting(0); + return "idle"; + } + + if(rVal < 10) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_a"; + } + else if(rVal < 20) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_b"; + } + else if(rVal < 30) + { + wAnim(ent)->setInteresting(1); + return "idlefinger_c"; + } + else + { + wAnim(ent)->setInteresting(0); + return "idle"; + } + + return "idle_a"; +} + +char *flamegunInfo::getAltFireSeq(sharedEdict_t &ent) +{ + return "fire2_1"; +} + +char *flamegunInfo::getReloadSeq(sharedEdict_t &ent) +{ + return "reload_a";//doesn't happen +} + +char *flamegunInfo::getTakeOutSeq(sharedEdict_t &ent) +{ + return "ready"; +} + +char *flamegunInfo::getPutAwaySeq(sharedEdict_t &ent) +{ + if (!isClient) + { + if (pisv.DoWeHaveTheFlag(ent.edict)) + { + ent.edict->s.sound = pisv.SoundIndex("player/flaglp.wav"); + ent.edict->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + else + { + ent.edict->s.sound = 0; + ent.edict->s.sound_data = 0; + } + } + + return "done"; +} + +char *flamegunInfo::getDryfireSeq(sharedEdict_t &ent) +{ + return "dryfire"; +} + + +int flamegunInfo::handleEOS(sharedEdict_t &ent) +{ + if(!strcmp(wAnim(ent)->getSeqName(), "fire2_2")) + { + inven(ent)->idle(); + return 1; + } + + if(!strcmp(wAnim(ent)->getSeqName(), "fire2_1")) + { + RunVWeapAnim(&ent, "fire2_2", IGhoulInst::Hold); + return 1; + } + + if(!strcmp(wAnim(ent)->getSeqName(), "fire2_idle")) + { + RunVWeapAnim(&ent, "fire2_2", IGhoulInst::Hold); + + return 1; + } + + return 0; +} + +void flamegunInfo::handleFireLoop(sharedEdict_t &ent) +{ + return; +} + +void flamegunInfo::handleAltfireLoop(sharedEdict_t &ent) +{ + if(!strcmp(wAnim(ent)->getSeqName(), "fire2_1")) + { + RunVWeapAnim(&ent, "fire2_2", IGhoulInst::Hold); + } + else if(!strcmp(wAnim(ent)->getSeqName(), "fire2_2")) + { + RunVWeapAnim(&ent, "fire2_1", IGhoulInst::Hold); + } +} + +int flamegunInfo::useAmmo1(sharedEdict_t &ent, int *skipIdle) +{ + if(!inven(ent)->rulesDoWeaponsUseAmmo()) + return 1; + + if(!inven(ent)->getCurClip()) + { + if(!isClient) + { + // If we have the CTF flag, then resume the klaxon. + + if (pisv.DoWeHaveTheFlag(ent.edict)) + { + ent.edict->s.sound = pisv.SoundIndex("player/flaglp.wav"); + ent.edict->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + else + { + ent.edict->s.sound = 0; + ent.edict->s.sound_data = 0; + } + } + + if(inven(ent)->rulesIsWeaponReloadAutomatic()) + { + // Totally out of ammo, so change weapons (if possible). + + inven(ent)->addCommand("weaponbestsafe",true); + } + else + { + inven(ent)->dryfire(); + } + + return 0; + } + + inven(ent)->setCurClip(inven(ent)->getCurClip() - 1); + return 1; +} + +int flamegunInfo::useAmmo2(sharedEdict_t &ent, int *skipIdle) +{ + if(!inven(ent)->rulesDoWeaponsUseAmmo()) + return 1; + + if(inven(ent)->getCurClip() < 6) + { + if(inven(ent)->rulesIsWeaponReloadAutomatic()) + { + if(inven(ent)->getCurClip()<=0) + { + // Totally out of ammo, so change weapons (if possible). + + if(!isClient) + inven(ent)->addCommand("weaponbestsafe",true); + } + } + + inven(ent)->dryfire(); + + return 0; + } + + inven(ent)->setCurClip(inven(ent)->getCurClip() - 6); + return 1; +} + +int flamegunInfo::testInput(sharedEdict_t &ent) +{ + if(wAnim(ent)->getAnimType() == WANIM_FIRE) + { + if(!ent.attack) + { + // Stopped firing - interrupt anim. + + noattack(ent); + inven(ent)->idle(); + RunVWeapAnim(&ent, "fire1_2", IGhoulInst::Loop); + if(!isClient) + { + // If we have the CTF flag, then resume the klaxon. + + if (pisv.DoWeHaveTheFlag(ent.edict)) + { + ent.edict->s.sound = pisv.SoundIndex("player/flaglp.wav"); + ent.edict->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + else + { + ent.edict->s.sound = 0; + ent.edict->s.sound_data = 0; + } + } + else + { + // No sound generated on the client anymore. + // picl.WeapSoundKill(); + } + } +/* else + { + if(!isClient) + { + ent.edict->s.sound = pisv.SoundIndex("Weapons/flamegun/Fire.wav"); + ent.edict->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + } +*/ + } + + if(!ent.attack) + { + // Stopped firing - interrupt anim. + + /* + if(!isClient) + { + // If we have the CTF flag, then resume the klaxon. + + if (pisv.DoWeHaveTheFlag(ent.edict)) + { + ent.edict->s.sound = pisv.SoundIndex("player/flaglp.wav"); + ent.edict->s.sound_data = (255 & ENT_VOL_MASK) | SND_LOOPATTN; + } + else + { + ent.edict->s.sound = 0; + ent.edict->s.sound_data = 0; + } + } + */ + +// picl.WeapSoundKill(); + } + + + return 1; +} + + +/* +void flamegunInfo::frameUpdate(sharedEdict_t &ent) +{ + if(wAnim(ent)->getAnimType() == WANIM_FIRE) + { + if (!isClient) + { + pisv.FireHelper(ent, *(ent.edict), *(ent.inv)); + } + } +} +*/ + + + +//---------------------------------------------------------------------------------------------------------- +int pistol2Info::testInput(sharedEdict_t &ent) +{ + // The two extra buttons will let the player swap weapon hands. + + if(!inven(ent)->getInputStatus())return 1; + if(wAnim(ent)->getJustTransitioned())return 1; + + if(ent.weap3) + { + if(!(wAnim(ent)->getHandSide())) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setWeaponLifted(0); + wAnim(ent)->setHandSide(1); + RunVWeapAnim(&ent, "idle_a_to_idle_c", IGhoulInst::Hold); + return 1; + } + + } + if(ent.weap4) + { + if(wAnim(ent)->getHandSide() == 1) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setHandSide(0); + wAnim(ent)->setWeaponLifted(1); + RunVWeapAnim(&ent, "idle_c_to_idle_a", IGhoulInst::Hold); + } + } + return 1; +} + +int knifeInfo::testInput(sharedEdict_t &ent) +{ + if(!inven(ent)->getInputStatus())return 1; + + if(ent.weap3) + { + if(!strcmp(wAnim(ent)->getSeqName(), "idlefinger_1"))return 1; + if(!strcmp(wAnim(ent)->getSeqName(), "idleclean"))return 1; + RunVWeapAnim(&ent, "idlefinger_1", IGhoulInst::Hold); + + return 1; + } + if(ent.weap4) + { + if(!strcmp(wAnim(ent)->getSeqName(), "idlefinger_1"))return 1; + if(!strcmp(wAnim(ent)->getSeqName(), "idleclean"))return 1; + RunVWeapAnim(&ent, "idleclean", IGhoulInst::Hold); + return 1; + } + return 1; +} + +void sniperInfo::shutdownWeapon(sharedEdict_t &ent) +{ + ent.edict->client->ps.fov = 95; + wAnim(ent)->setInZoomView(0); + wAnim(ent)->setInZoom(0); + wAnim(ent)->setRezoom(0); +} + +int pistol1Info::testInput(sharedEdict_t &ent) +{ + if(wAnim(ent)->getAnimType() == WANIM_ALTFIRE) + { + if(!strcmp(wAnim(ent)->getSeqName(), "fire2_b")) + { + if(!ent.altattack) + { + // Stopped firing - interrupt anim. + + inven(ent)->idle(); + } + } + } + + // The two extra buttons will let the player swap weapon hands. + + if(!inven(ent)->getInputStatus())return 1; + if(wAnim(ent)->getJustTransitioned())return 1; + + if(ent.weap3) + { + if((wAnim(ent)->getHandsInUse() == 1)||(wAnim(ent)->getWeaponLifted())) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setHandsInUse(2); + wAnim(ent)->setWeaponLifted(0); + RunVWeapAnim(&ent, "idle_a_to_idle_b", IGhoulInst::Hold); + return 1; + } + } + if(ent.weap4) + { + if(wAnim(ent)->getHandsInUse() == 2) + { + wAnim(ent)->setInteresting(1); + wAnim(ent)->setTransition(1); + wAnim(ent)->setHandsInUse(1); + RunVWeapAnim(&ent, "idle_b_to_idle_a", IGhoulInst::Hold); + } + } + + return 1; +} + +int sniperInfo::testInput(sharedEdict_t &ent) +{ + float zoomVal = 0; + + if(ent.rejectSniper) + { + if(ent.edict->client->ps.fov < 95) + { + IGhoulInst *gun; + + if(!isClient) + gun = ent.edict->client->ps.gun; + else + gun = ent.inv->getViewModel(); + + if(gun) + { + gun->SetAllPartsOnOff(true); + } + + ent.edict->client->ps.fov = 95; + wAnim(ent)->setRezoom(0); + wAnim(ent)->setInZoomView(0); + } + + return 1; + } + + if(wAnim(ent)->getInZoomView()) + { + if(ent.weap3) + { + zoomVal += 2*ent.framescale; + } + + if(ent.weap4) + { + zoomVal -= 2*ent.framescale; + } + } + + if((wAnim(ent)->getInZoom())&&(wAnim(ent)->getInZoomView())) + { + if(!ent.altattack) + { + wAnim(ent)->setInZoom(0); + } + else + { + zoomVal += 5*ent.framescale; + } + } + + if(!zoomVal)return 1; + + if (zoomVal > 0) + ent.edict->client->ps.fov -= 5*ent.framescale; + else + ent.edict->client->ps.fov += 5*ent.framescale; + + if (ent.edict->client->ps.fov < 6) + { + ent.edict->client->ps.fov = 6; + } + + if (ent.edict->client->ps.fov > 60) + { + ent.edict->client->ps.fov = 60; + } + + wAnim(ent)->setRezoom(ent.edict->client->ps.fov); + + return 1; +} + +int shotgunInfo::testInput(sharedEdict_t &ent) +{ + if(!inven(ent)->getInputStatus())return 1; + + if(ent.weap3) + { + if(!strcmp(wAnim(ent)->getSeqName(), "idlefinger_b"))return 1; + if(!strcmp(wAnim(ent)->getSeqName(), "idlefinger_c"))return 1; + RunVWeapAnim(&ent, "idlefinger_b", IGhoulInst::Hold); + + return 1; + } + if(ent.weap4) + { + if(!strcmp(wAnim(ent)->getSeqName(), "idlefinger_b"))return 1; + if(!strcmp(wAnim(ent)->getSeqName(), "idlefinger_c"))return 1; + RunVWeapAnim(&ent, "idlefinger_c", IGhoulInst::Hold); + return 1; + } + return 1; +} + +void flamegunInfo::shutdownWeapon(sharedEdict_t &ent) +{ + if (!isClient) + { + ent.edict->s.sound = 0; + ent.edict->s.sound_data = 0; + } +} + +void flamegunInfo::noattack(sharedEdict_t &ent) +{ +} + +int knifeInfo::useAmmo2(sharedEdict_t &ent, int *skipIdle) +{ + if(inven(ent)->rulesDoWeaponsUseAmmo()) + { + if(inven(ent)->getAmmoAmount(AMMO_KNIFE) <= 1) + { + wAnim(ent)->setKnifeStatus(0); + + // All because of the split format of the sequences here. + + return 0; + } + } + + wAnim(ent)->setKnifeStatus(1); + + if(inven(ent)->rulesDoWeaponsUseAmmo()) + inven(ent)->setAmmoAmount(AMMO_KNIFE, inven(ent)->getAmmoAmount(AMMO_KNIFE)-1); + + return 1; +} + +int autoshotgunInfo::useAmmo2(sharedEdict_t &ent, int *skipIdle) +{ + if(!inven(ent)->rulesDoWeaponsUseAmmo()) + return 1; + + if(inven(ent)->getCurClip() < 2) + { + if(inven(ent)->rulesIsWeaponReloadAutomatic()) + { + inven(ent)->reload(); + if(skipIdle) + { + // This makes the relaod work right for the grenades. + + //*skipIdle = 1; + } + } + else + { + inven(ent)->dryfire(); + } + + return 0; + } + + inven(ent)->setCurClip(inven(ent)->getCurClip() - 2); + return 1; +} + +void machinegunInfo::turnOffAmmoParts(sharedEdict_t &ent,int clipLeft,qboolean forceAll) +{ + IGhoulInst *inst=(!isClient)?ent.edict->client->ps.gun:ent.inv->getViewModel(); + + if(!inst) + return; + + IGhoulObj *obj=inst->GetGhoulObject(); + + if(!obj) + return; + + char buf[32]; + GhoulID part; + + if((clipLeft>=0)&&(clipLeft<=7)) + { + if((!isClient)&&(!forceAll)) + { + sprintf(buf, "BULLET%d", clipLeft + 1); + + if(part=obj->FindPart(buf)) + inst->SetPartOnOff(part, false); + } + else + { + for(;clipLeft<8;clipLeft++) + { + sprintf(buf, "BULLET%d", clipLeft + 1); + + if(part=obj->FindPart(buf)) + inst->SetPartOnOff(part, false); + } + } + } +} + +int machinegunInfo::useAmmo1(sharedEdict_t &ent, int *skipIdle) +{ + int retVal=weaponInfo_c::useAmmo1(ent); + + if(inven(ent)->rulesDoWeaponsUseAmmo()) + turnOffAmmoParts(ent,inven(ent)->getCurWeapon()->getClip()); + + return(retVal); +} + +int machinegunInfo::useAmmo2(sharedEdict_t &ent, int *skipIdle) +{ + if(!inven(ent)->rulesDoWeaponsUseAmmo()) + return 1; + + if(inven(ent)->getCurClip() < 10) + { + if(inven(ent)->rulesIsWeaponReloadAutomatic()) + { + inven(ent)->reload(); + if(skipIdle) + { + // This makes the relaod work right for the grenades. + + //*skipIdle = 1; + } + } + else + { + inven(ent)->dryfire(); + } + + return 0; + } + + inven(ent)->setCurClip(inven(ent)->getCurClip() - 10); + return 1; +} + +void machinegunInfo::handleFall(sharedEdict_t &ent) +{ + if(inven(ent)->getInputStatus()) + { + RunVWeapAnim(&ent, "land", IGhoulInst::Loop); + } +} + + +//---------------------------------------------------------------------------------------------------------- + +hurthandInfo::hurthandInfo(weaponInfoExtra_t *w):weaponInfo_c(w){} + +int hurthandInfo::handleEOS(sharedEdict_t &ent) +{ + if(!strcmp(wAnim(ent)->getSeqName(), "hurthand")) + { + if(!isClient) + { + if(!strcmp(inven(ent)->rulesGetBestWeaponMode(),"")) + inven(ent)->addCommand("weapnext",true); + else + inven(ent)->takeOutBestWeapon(); + } + + RunVWeapAnim(&ent, getIdleSeq(ent), IGhoulInst::Hold); + inven(ent)->setInputStatus(-1); + } + else + inven(ent)->idle(); + + return 1; +} + +char *hurthandInfo::getIdleSeq(sharedEdict_t &ent) +{ + return NULL; +} + +char *hurthandInfo::getTakeOutSeq(sharedEdict_t &ent) +{ + return "hurthand"; +} + +//---------------------------------------------------------------------------------------------------------- + +throwhandInfo::throwhandInfo(weaponInfoExtra_t *w):weaponInfo_c(w){} + +int throwhandInfo::handleEOS(sharedEdict_t &ent) +{ + if(!strcmp(wAnim(ent)->getSeqName(), "throwhand")) + { + if(!isClient) + { + if(!strcmp(inven(ent)->rulesGetBestWeaponMode(),"")) + inven(ent)->addCommand("weapnext",true); + else + inven(ent)->takeOutBestWeapon(); + } + + RunVWeapAnim(&ent, getIdleSeq(ent), IGhoulInst::Hold); + inven(ent)->setInputStatus(-1); + } + else + inven(ent)->idle(); + + return 1; +} + +char *throwhandInfo::getIdleSeq(sharedEdict_t &ent) +{ + return NULL; +} + +char *throwhandInfo::getTakeOutSeq(sharedEdict_t &ent) +{ + return "throwhand"; +} \ No newline at end of file diff --git a/Source/Game/player/w_network.cpp b/Source/Game/player/w_network.cpp new file mode 100644 index 0000000..34fd294 --- /dev/null +++ b/Source/Game/player/w_network.cpp @@ -0,0 +1,339 @@ +#include "q_shared.h" +#include "..\ghoul\ighoul.h" +#include "w_public.h" +#include "w_types.h" +#include "w_weapons.h" +#include "w_utils.h" +#include "w_network.h" +#include "player.h" +#include "../gamecpp/game.h" +#include "w_equipment.h" +#include "qcommon.h" + +#define ARG_SIZE_8 0 // Argument fits in 8 bits. +#define ARG_SIZE_16 1 // Argument fits in 16 bits. +#define ARG_SIZE_24 2 // Argument fits in 24 bits. +#define ARG_SIZE_32 3 // Argument fits in 32 bits. +#define ARG_SIZE_MASK 0x3 // Argument's ARG_SIZE size is encoded in 2 adjacent bits. +#define ARG_SIZE_SHIFT 4 + +extern player_com_import_t picom; +extern player_cl_import_t picl; +extern player_sv_import_t pisv; + +clientRICBuf::clientRICBuf(void) +{ + numRICs=0; + owner=NULL; + picl.SZ_Init(&sizebuf,(unsigned char *)sizebufData,sizeof(sizebufData)); +} + +void clientRICBuf::ClearRICs(void) +{ + numRICs=0; + + picl.SZ_Clear(&sizebuf); + + sizebuf.readcount=0; +} + +void HandleArg(int argNum,byte argsFlags,sizebuf_t *sizebuf) +{ + assert((argNum>=1)&&(argNum<=2)); + + byte argSize=(argsFlags>>((argNum-1)*2))&ARG_SIZE_MASK; + + switch(argSize) + { + case ARG_SIZE_8: + picl.WriteByteSizebuf(sizebuf,picl.ReadByte()); + break; + case ARG_SIZE_16: + picl.WriteShortSizebuf(sizebuf,picl.ReadShort()); + break; + case ARG_SIZE_24: + picl.WriteShortSizebuf(sizebuf,picl.ReadShort()); + picl.WriteByteSizebuf(sizebuf,picl.ReadByte()); + break; + case ARG_SIZE_32: + picl.WriteLongSizebuf(sizebuf,picl.ReadLong()); + break; + + default: + break; + } +} + +void clientRICBuf::ReadRICs(void) +{ + int r,rmax; + byte RIC; + byte argsFlags=0; + + // Get number of RICs to read from the network stream. + + rmax=picl.ReadByte(); + picl.WriteByteSizebuf(&sizebuf,rmax); + + for(r=0;r>ARG_SIZE_SHIFT; + picl.WriteByteSizebuf(&sizebuf,RIC); + RIC&=0x0f; + + // Get parameters and save them. + + switch(RIC) + { + case RIC_RULESSETWEAPONSUSEAMMO: + + HandleArg(1,argsFlags,&sizebuf); + break; + + case RIC_RULESSETWEAPONRELOADAUTOMATIC: + + HandleArg(1,argsFlags,&sizebuf); + break; + + case RIC_RULESSETWEAPONSRELOAD: + + HandleArg(1,argsFlags,&sizebuf); + break; + + case RIC_RULESSETRELOADEMPTIESWEAPON: + + HandleArg(1,argsFlags,&sizebuf); + break; + + case RIC_SETBLOODYWEAPON: + + HandleArg(1,argsFlags,&sizebuf); + break; + + case RIC_HIDEWEAPONFORDISGUISE: + + break; + } + + numRICs++; + } +} + +int RetrieveArg(int argNum,byte argsFlags,sizebuf_t *sizebuf) +{ + assert((argNum>=1)&&(argNum<=2)); + + byte argSize; + int arg; + + argSize=(argsFlags>>((argNum-1)*2))&ARG_SIZE_MASK; + + switch(argSize) + { + case ARG_SIZE_8: + arg=picl.ReadByteSizebuf(sizebuf); + break; + case ARG_SIZE_16: + arg=picl.ReadShortSizebuf(sizebuf); + break; + case ARG_SIZE_24: + arg=picl.ReadShortSizebuf(sizebuf); + arg|=((int)(picl.ReadByteSizebuf(sizebuf)))<<16; + break; + case ARG_SIZE_32: + arg=picl.ReadLongSizebuf(sizebuf); + break; + + default: + break; + } + + return(arg); +} + +void clientRICBuf::ProcessRICs(void) +{ + int r,rmax, + param1; + byte RIC; + byte argsFlags=0; + + // Get number of RICs to read from local storage. + + rmax=picl.ReadByteSizebuf(&sizebuf); + + for(r=0;r>ARG_SIZE_SHIFT; + RIC&=0x0f; + + // Get parameters and call the appropriate method for the RIC. + + switch(RIC) + { + case RIC_RULESSETWEAPONSUSEAMMO: + + param1=RetrieveArg(1,argsFlags,&sizebuf); + owner->rulesSetWeaponsUseAmmo(param1); + break; + + case RIC_RULESSETWEAPONRELOADAUTOMATIC: + + param1=RetrieveArg(1,argsFlags,&sizebuf); + owner->rulesSetWeaponReloadAutomatic(param1); + break; + + case RIC_RULESSETWEAPONSRELOAD: + + param1=RetrieveArg(1,argsFlags,&sizebuf); + owner->rulesSetWeaponsReload(param1); + break; + + case RIC_RULESSETRELOADEMPTIESWEAPON: + + param1=RetrieveArg(1,argsFlags,&sizebuf); + owner->rulesSetReloadEmptiesWeapon(param1); + + break; + + case RIC_SETBLOODYWEAPON: + + param1=RetrieveArg(1,argsFlags,&sizebuf); + owner->setBloodyWeapon(param1); + break; + + case RIC_HIDEWEAPONFORDISGUISE: + + owner->becomeDisguised(); + break; + } + + numRICs--; + } +} + +serverRICBuf::serverRICBuf(void) +{ + numRICs=0; + owner=NULL; + pisv.SZ_Init(&sizebuf,(unsigned char *)sizebufData,sizeof(sizebufData)); +} + +void serverRICBuf::ClearRICs(void) +{ + numRICs=0; + + pisv.SZ_Clear(&sizebuf); +} + +void serverRICBuf::AddRIC(RIC_t RIC,char *argsFormat,...) +{ + // Only allowed 16 different RIC types, else error. + + assert((RIC>=0)&&(RIC<=15)); + + // Retrieve the RIC's arguments. + + int argc=0; + int args[2]; + byte argsFlags=0; + + va_list argPtr; + + va_start(argPtr,argsFormat); + + for(char *p=argsFormat;*p;p++) + { + switch(*p) + { + case 'i': + + // Grab arg and save it. + + int arg; + + arg=va_arg(argPtr,int); + args[argc]=arg; + argc++; + + // Determine argument size for arg - to be packed in with the RIC byte. + + if(!(arg&~0xff)) + argsFlags|=ARG_SIZE_8<<(argc-1)*2; + else if(!(arg&~0xffff)) + argsFlags|=ARG_SIZE_16<<(argc-1)*2; + else if(!(arg&~0xffffff)) + argsFlags|=ARG_SIZE_24<<(argc-1)*2; + else + argsFlags|=ARG_SIZE_32<<(argc-1)*2; + + break; + + default: + + break; + } + + // 2 arguments maximum, else error. + + assert(argc<=2); + } + + // Write the RIC to the network layer... + + pisv.WriteByteSizebuf(&sizebuf,RIC|(argsFlags<>16)); + } + else + pisv.WriteLongSizebuf(&sizebuf,arg); + } + + // Update number of RICs in buffer. + + numRICs++; +} + +void serverRICBuf::WriteRICs(void) +{ + if(numRICs) + { + int clientNum; + + clientNum=owner->getOwner()->edict->s.number-1; + + // Write the svc_ric header byte. + + pisv.ReliableWriteByteToClient(svc_ric,clientNum); + + + // Now write the number of RICs. + + pisv.ReliableWriteByteToClient(numRICs,clientNum); + + // And finally, the RICs themselves. + + pisv.ReliableWriteDataToClient(sizebuf.data,sizebuf.cursize,clientNum); + } +} \ No newline at end of file diff --git a/Source/Game/player/w_network.h b/Source/Game/player/w_network.h new file mode 100644 index 0000000..c0b0f19 --- /dev/null +++ b/Source/Game/player/w_network.h @@ -0,0 +1,78 @@ +#ifndef __W_NETWORK_H_ +#define __W_NETWORK_H_ + +#include "qcommon.h" + +// **************************************************************************** +// RICs (Remote Inventory Commands) +// -------------------------------- +// Issued by server (i.e. game.dll) and read by clients. Allows the server to +// remotely instruct a client's view-weapon prediction to add ammo, weapons, +// items etc. to it's (predicted) inventory. +// **************************************************************************** + +typedef enum +{ + RIC_RULESSETWEAPONSUSEAMMO, + RIC_RULESSETWEAPONSRELOAD, + RIC_RULESSETWEAPONRELOADAUTOMATIC, + RIC_RULESSETRELOADEMPTIESWEAPON, + RIC_SETBLOODYWEAPON, + RIC_HIDEWEAPONFORDISGUISE, +} RIC_t; + +// **************************************************************************** +// RICBuf +// ------ +// **************************************************************************** + +#define RIC_BUFFERSIZE 256 + +class RICBuf +{ +protected: + + int numRICs; + sizebuf_t sizebuf; + char sizebufData[RIC_BUFFERSIZE]; + inven_c *owner; + +public: + + inven_c *getOwner(){return owner;} + void setOwner(inven_c *inv){owner=inv;} +}; + +// **************************************************************************** +// clientRICBuf +// ------------ +// **************************************************************************** + +class clientRICBuf:public RICBuf +{ +public: + + clientRICBuf(void); + + void ClearRICs(void); + void ReadRICs(void); + void ProcessRICs(void); +}; + +// **************************************************************************** +// serverRICBuf +// ------------ +// **************************************************************************** + +class serverRICBuf:public RICBuf +{ +public: + + serverRICBuf(void); + + void ClearRICs(void); + void AddRIC(RIC_t RIC,char *argsFormat,...); + void WriteRICs(void); +}; + +#endif __W_NETWORK_H_ \ No newline at end of file diff --git a/Source/Game/player/w_public.h b/Source/Game/player/w_public.h new file mode 100644 index 0000000..bbc7d85 --- /dev/null +++ b/Source/Game/player/w_public.h @@ -0,0 +1,138 @@ +#ifndef __W_PUBLIC_H_ +#define __W_PUBLIC_H_ + +typedef enum +{ + ATK_NOTHING, + ATK_KNIFE, + ATK_KNIFE_ALT, + ATK_PISTOL1, + ATK_PISTOL2, + ATK_MACHINEPISTOL, + ATK_ASSAULTRIFLE, + ATK_SNIPER, + ATK_SNIPER_ALT, + ATK_AUTOSHOTGUN, + ATK_AUTOSHOTGUN_ALT, + ATK_SHOTGUN, + ATK_MACHINEGUN, + ATK_MACHINEGUN_ALT, + ATK_ROCKET, + ATK_ROCKET_ALT, + ATK_MICROWAVE, + ATK_MICROWAVE_ALT, + ATK_FLAMEGUN, + ATK_FLAMEGUN_ALT, + ATK_DOG_ATTACK, + ATK_AUTOGUN, + ATK_GRENADE, + ATK_MOLITOV, + ATK_GASGREN, + ATK_MAGICBULLET, + ATK_FLASHGREN, + ATK_MACHETE, + ATK_HELIGUN, + ATK_DEKKER, + ATK_THROWSTAR, + ATK_NUMWEAPONS +}attacks_e; + +class invPub_c +{ +private: +public: + virtual void clearInv(bool){} + virtual void removeSpecificItem(int type){} + + virtual void handlePlayerDeath(void){} + virtual void frameUpdate(void){} + + virtual int addCommand(char *string,qboolean internal=false){return 0;} + virtual void stockWeapons(void){} + + virtual int selectWeapon(int type){return 0;} + virtual void selectWeaponSlot(int weaponNum){} + virtual void selectBestWeapon(void){} + virtual void takeOutWeapon(int type){} + virtual void takeOutWeaponSlot(int weaponNum){} + virtual void takeOutBestWeapon(void){} + + virtual int addAmmoType(int type, int amount){return 0;} + virtual int addAmmoByGunType(int type, int amount){return 0;} + virtual int stripAmmoFromGun(int type, int amount){return 0;} + virtual int addWeaponType(int type, int fullClip = 0){return 0;} + virtual int getEncumbrance(void){return 0;}; + virtual int getEncumbranceByType(int weapon){return 0;}; + virtual int addItem(int type, int amount, int maxAmount = -1){return 0;} + virtual int addArmor(int amount){return 0;} + virtual int hasItemType(int type){return 0;} + + virtual int hasWeaponType(int type){return 0;} + virtual int getCurWeaponType(void){return 0;} + virtual int getBestWeaponType(void){return 0;} + virtual int getCurItemType(void){return 0;} + virtual int getCurItemAmount(void){return 0;} + virtual int getCurAmmo(void){return 0;} + virtual int getCurClip(void){return 0;} + virtual int getClipMax(void){return 0;} + virtual int getClipMaxByType(int weapon){return 0;} + virtual int adjustDamageByArmor(int initDamage, float penetrate, float absorb){return 0;} + virtual int getArmorCount(void){return 0;} + + virtual int scopeIsActive(void){return 0;} + virtual void setBloodyWeapon(int isBloody){} + virtual int inDisguise(void){return 0;} + virtual void becomeDisguised(void){} + + virtual int rulesDoWeaponsUseAmmo(void){return 0;} + virtual void rulesSetWeaponsUseAmmo(int useAmmo){} + virtual int rulesCanDropWeapons(void){return 0;} + virtual void rulesSetDropWeapons(int dropWeapons){} + virtual int rulesGetNonDroppableWeaponTypes(void){return 0;} + virtual void rulesSetNonDroppableWeaponTypes(int nonDropMask){} + virtual int rulesDoWeaponsReload(void){return 0;} + virtual void rulesSetWeaponsReload(int weaponsReload){} + virtual int rulesIsWeaponReloadAutomatic(void){return 0;} + virtual void rulesSetWeaponReloadAutomatic(int reloadAutomatic){} + virtual int rulesDoReloadEmptiesWeapon(void){return 0;} + virtual void rulesSetReloadEmptiesWeapon(int reloadEmptiesWeapon){} + virtual char *rulesGetBestWeaponMode(void){return "";} + virtual void rulesSetBestWeaponMode(char *bestWeaponMode){} + virtual int rulesCanDropInvenOnDeath(void){return 0;} + virtual void rulesSetDropInvenOnDeath(int dropInvenOnDeath){} + virtual int rulesCanSelectWithNoAmmo(void){return 0;} + virtual void rulesSetSelectWithNoAmmo(int selectWithNoAmmo){} + virtual int rulesCanFreelySelectWeapon(void){return 0;} + virtual void rulesSetFreelySelectWeapon(int freelySelectWeapon){} + + virtual int removeCurrentWeapon(void){return 0;} + virtual void deactivateCurrentWeapon(void){} + virtual void deactivateInventory(void){} + virtual int countWeapons(void){return 0;} + virtual void setOwner(void *owner){} + virtual void dropAllWeapons(void){} + + virtual void handleFall(void){} + + virtual int extractInvFromMenu(int *weaponsAvailable, int *health){return 0;} + virtual void buildInvForMenu(int includeClipAmmo, int health){} + + virtual int extractInvFromString(int *weaponsAvailable,char *invString){return(0);} + virtual void buildInvString(char *string,qboolean xtractWeapons,qboolean xtractAmmo,qboolean xtractItems,qboolean xtractArmor){} + + virtual void clientClearRICs(void){} + virtual void clientReadRICs(void){} + virtual void clientProcessRICs(void){} + virtual void serverClearRICs(void){} + virtual void serverWriteRICs(void){} + + virtual void setClientPredicting(int predicting){} + virtual int isClientPredicting(void){return 0;} + + virtual void Write(void){} + virtual void Read(void){} + virtual void NetRead(struct sizebuf_s *net_message_ptr){} + virtual void NetWrite(int clientnum){} +}; + +#endif // __W_PUBLIC_H_ \ No newline at end of file diff --git a/Source/Game/player/w_types.h b/Source/Game/player/w_types.h new file mode 100644 index 0000000..57a1b4c --- /dev/null +++ b/Source/Game/player/w_types.h @@ -0,0 +1,74 @@ +#ifndef __W_TYPES_H +#define __W_TYPES_H + +typedef enum +{ + AMMO_NONE = 0, + AMMO_KNIFE, + AMMO_44, + AMMO_9MM, + AMMO_SHELLS, + AMMO_556, + AMMO_ROCKET, + AMMO_MWAVE, + AMMO_FTHROWER, + AMMO_SLUG, + AMMO_MACHPIS9MM, + MAXAMMOS +} ammos_t; + +#define SFW_BESTWEAPONPOSSIBLE -1 + +typedef enum +{ + SFW_EMPTYSLOT = 0, + SFW_KNIFE, + SFW_PISTOL2, + SFW_PISTOL1, + SFW_MACHINEPISTOL, + SFW_ASSAULTRIFLE, + SFW_SNIPER, + SFW_AUTOSHOTGUN, + SFW_SHOTGUN, + SFW_MACHINEGUN, + SFW_ROCKET, + SFW_MICROWAVEPULSE, + SFW_FLAMEGUN, + SFW_HURTHAND, + SFW_THROWHAND, + SFW_NUM_WEAPONS +} weapons_t; + +typedef enum +{ + SFE_EMPTYSLOT = 0, + SFE_FLASHPACK, +// SFE_NEURAL_GRENADE, + SFE_C4, + SFE_LIGHT_GOGGLES, + SFE_CLAYMORE, + SFE_MEDKIT, + SFE_GRENADE, + SFE_CTFFLAG, + SFE_NUMITEMS +} equipment_t; + +/* +typedef enum +{ + CTF_FLAG = 0, +} ctf_t; +*/ + +typedef enum +{ + SFC_CASH = 0, +} cash_t; + +typedef enum +{ + SFH_SMALL_HEALTH = 0, + SFH_LARGE_HEALTH, +} health_t; + +#endif // __W_TYPES_H diff --git a/Source/Game/player/w_utils.cpp b/Source/Game/player/w_utils.cpp new file mode 100644 index 0000000..d130f6f --- /dev/null +++ b/Source/Game/player/w_utils.cpp @@ -0,0 +1,401 @@ +#include "q_shared.h" +#include "..\ghoul\ighoul.h" +#include "w_public.h" +#include "w_types.h" +#include "w_weapons.h" +#include "w_utils.h" +#include "player.h" +#include "../gamecpp/game.h" + +extern player_com_import_t picom; +extern player_cl_import_t picl; +extern player_sv_import_t pisv; + +extern int isClient; + +//------------------------------------------------------------------------ +// +// SetWSkin +// +//------------------------------------------------------------------------ + +void SetWSkin(sharedEdict_t *self, char *matName, char *skinName) +{ + IGhoulObj *obj = inven(*self)->getCurWeapon()->getWeaponInfo()->getGhoulObj(); + + if(!obj) + return; + + GhoulID mat = obj->FindMaterial(matName); + + if(!mat) + return; + + GhoulID skin = obj->FindSkin(mat, skinName); + + if(!skin) + return; + + if(!inven(*self)->getViewModel()) + return; + + inven(*self)->getViewModel()->SetFrameOverride(mat, skin); +} + +//------------------------------------------------------------------------ +// +// AddNoteCallbacks +// +//------------------------------------------------------------------------ + +void AddNoteCallbacks(IGhoulInst *inst, IGhoulObj *obj) +{ + GhoulID id; + + id = obj->FindNoteToken("sound"); + if(id) + { + inst->AddNoteCallBack(&theWeapSoundCallback, id); + } + + id = obj->FindNoteToken("fire"); + if(id) + { + inst->AddNoteCallBack(&theGunFireCallback, id); + } + + id = obj->FindNoteToken("altfire"); + if(id) + { + inst->AddNoteCallBack(&theAltfireCallback, id); + } + + id = obj->FindNoteToken("eos"); + if(id) + { + inst->AddNoteCallBack(&theEOSCallback, id); + } + + id = obj->FindNoteToken("cleanblood"); + if(id) + { + inst->AddNoteCallBack(&theKnifeCleanCallback, id); + } + + id = obj->FindNoteToken("shellbullets"); + if(id) + { + inst->AddNoteCallBack(&theMinimiReloadCallback, id); + } + + id = obj->FindNoteToken("effect"); + if(id) + { + inst->AddNoteCallBack(&theEffectCallback, id); + } +} + +//------------------------------------------------------------------------ +// +// SetVWeapGhoulClient +// +//------------------------------------------------------------------------ + +void SetVWeapGhoulClient(sharedEdict_t *self, char *modelName) +{ + IGhoulInst *inst; + IGhoulObj *obj; + + // Destroy previous gun instance. + + if(inst = inven(*self)->getViewModel()) + inst->Destroy(); + + // Now create a new gun instance by cloning the server owned gun instance. + // Hence it will be PRIVATE to the client - which is what we want, else the + // server owned instance will interfere with our predicted gun. + + inst=self->edict->client->ps.gun->Clone(true); + + inven(*self)->setViewModel(inst); + + // Add our callbacks and set the callback's user data. + + obj=inst->GetGhoulObject(); + + if(!inven(*self)->getCurWeapon()->getWeaponInfo()->getGhoulObj()) + inven(*self)->getCurWeapon()->getWeaponInfo()->setGhoulObj(obj); + + // register all of the possible note tokens for weapons... + + AddNoteCallbacks(inst, obj); + + inst->SetUserData(self->inv); + + // Flag the server owned gun instance so that we know it is no longer new. + + self->edict->client->ps.gun->SetUserData(self->inv); +} + +//------------------------------------------------------------------------ +// +// ReadyVWeapGhoulServer +// +//------------------------------------------------------------------------ + +void ReadyVWeapGhoulServer(sharedEdict_t *self, char *modelName) +{ + char buffer[256]; + float mat[16]; + + picom.Com_Sprintf(buffer, sizeof(buffer), "Weapon/Inview/%s", modelName); + + IGhoulObj *obj; + + obj = inven(*self)->getReadiedWeapon()->getWeaponInfo()->getGhoulObj(); + + if(!obj) + { + obj = ((IGhoul *)pisv.GetGhoul())->NewObj(); + + if(!obj) + return; + + picom.RegisterGSQSequences(buffer, modelName, obj); + + obj->RegisterEverything(); + + inven(*self)->getReadiedWeapon()->getWeaponInfo()->setGhoulObj(obj); + } + + IGhoulInst *inst = obj->NewInst(); + + inven(*self)->setReadyModel(inst); + + // register all of the possible note tokens for weapons... + + AddNoteCallbacks(inst, obj); + + //fixme - temp for the demo + GhoulID part; + + part = obj->FindPart("_R_FOREARM"); + if(part)inst->SetPartOnOff(part, false); + part = obj->FindPart("_L_FOREARM"); + if(part)inst->SetPartOnOff(part, false); + part = obj->FindPart("_R_SLEEVE_FOREARM"); + if(part)inst->SetPartOnOff(part, true); + part = obj->FindPart("_L_SLEEVE_FOREARM"); + if(part)inst->SetPartOnOff(part, true); + + SetWSkin(self, "arms", "arms_sleeve"); + + inst->GetXForm(mat); + mat[0]=0; + mat[1]=1; + mat[4]=-1; + mat[5]=0; + mat[14]=0; + inst->SetXForm(mat); + + self->edict->client->ps.gun=inst; + inst->SetUserData(self->inv); +} + +//------------------------------------------------------------------------ +// +// SetReadiedVWeapGhoulServer +// +//------------------------------------------------------------------------ + +void SetReadiedVWeapGhoulServer(sharedEdict_t *self, char *modelName) +{ + IGhoulInst *inst = inven(*self)->getViewModel(); + + if(inst) + inst->Destroy(); + + inven(*self)->setViewModel(inven(*self)->getReadyModel()); +} + +//------------------------------------------------------------------------ +// +// SetVWeapGhoulServer +// +//------------------------------------------------------------------------ + +void SetVWeapGhoulServer(sharedEdict_t *self, char *modelName) +{ + char buffer[256]; + float mat[16]; + + picom.Com_Sprintf(buffer, sizeof(buffer), "Weapon/Inview/%s", modelName); + + IGhoulObj *obj; + + obj = inven(*self)->getCurWeapon()->getWeaponInfo()->getGhoulObj(); + + if(!obj) + { + obj = ((IGhoul *)pisv.GetGhoul())->NewObj(); + + if(!obj) + return; + + picom.RegisterGSQSequences(buffer, modelName, obj); + + obj->RegisterEverything(); + + inven(*self)->getCurWeapon()->getWeaponInfo()->setGhoulObj(obj); + } + + IGhoulInst *inst = inven(*self)->getViewModel(); + + if(inst)inst->Destroy(); + + inst = obj->NewInst(); + + inven(*self)->setViewModel(inst); + + // register all of the possible note tokens for weapons... + + AddNoteCallbacks(inst, obj); + + //fixme - temp for the demo + GhoulID part; + + part = obj->FindPart("_R_FOREARM"); + if(part)inst->SetPartOnOff(part, false); + part = obj->FindPart("_L_FOREARM"); + if(part)inst->SetPartOnOff(part, false); + part = obj->FindPart("_R_SLEEVE_FOREARM"); + if(part)inst->SetPartOnOff(part, true); + part = obj->FindPart("_L_SLEEVE_FOREARM"); + if(part)inst->SetPartOnOff(part, true); + + SetWSkin(self, "arms", "arms_sleeve"); + + inst->GetXForm(mat); + mat[0]=0; + mat[1]=1; + mat[4]=-1; + mat[5]=0; + mat[14]=0; + inst->SetXForm(mat); + + self->edict->client->ps.gun=inst; + inst->SetUserData(self->inv); +} + +//------------------------------------------------------------------------ +// +// SetVWeapGhoul +// +//------------------------------------------------------------------------ + +void SetVWeapGhoul(sharedEdict_t *self, char *modelName) +{ + if(!isClient) + SetVWeapGhoulServer(self,modelName); + else + SetVWeapGhoulClient(self,modelName); +} + +//------------------------------------------------------------------------ +// +// RunVWeapAnim +// +//------------------------------------------------------------------------ + +void RunVWeapAnim(sharedEdict_t *self, char *seqName, IGhoulInst::EndCondition loopType,float timeOffset) +{ + char buffer[256]; + + IGhoulObj *obj = inven(*self)->getCurWeapon()->getWeaponInfo()->getGhoulObj(); + + // SFW_NOWEAPON has no corresponding ghoul object. + + if(!obj) + return; + + picom.Com_Sprintf(buffer, sizeof(buffer), "Ghoul/Weapon/Inview/%s/%s.ghl", inven(*self)->getViewModelName(), seqName); + GhoulID seq = obj->FindSequence(buffer); + + if(!seq) + return; + + wAnim(*self)->setSeqName(seqName); + + assert(inven(*self)->getViewModel()); + + if(!isClient) + { + if(timeOffset!=0.0) + { + float diff=(*pisv.levelTime)-timeOffset; + //picom.Com_DPrintf("SV - CL timediff = %f.\n",diff); + inven(*self)->getViewModel()->Play(seq, (*pisv.levelTime)-diff, 0.0f, true, loopType); + } + else + { + inven(*self)->getViewModel()->Play(seq, *pisv.levelTime, 0.0f, true, loopType); + } + } + else + { + inven(*self)->getViewModel()->Play(seq, *picl.levelTime, 0.0f, true, loopType); + } +} + +void RunReadiedVWeapAnim(sharedEdict_t *self, char *seqName, IGhoulInst::EndCondition loopType) +{ + char buffer[256]; + + IGhoulObj *obj = inven(*self)->getReadiedWeapon()->getWeaponInfo()->getGhoulObj(); + + // SFW_NOWEAPON has no corresponding ghoul object. + + if(!obj) + return; + + picom.Com_Sprintf(buffer, sizeof(buffer), "Ghoul/Weapon/Inview/%s/%s.ghl", inven(*self)->getReadyModelName(), seqName); + GhoulID seq = obj->FindSequence(buffer); + + if(!seq) + return; + + wAnim(*self)->setSeqName(seqName); + + assert(inven(*self)->getReadyModel()); + + if(!isClient) + inven(*self)->getReadyModel()->Play(seq, *pisv.levelTime, 0.0f, true, loopType); + else + inven(*self)->getReadyModel()->Play(seq, *picl.levelTime, 0.0f, true, loopType); +} + +//------------------------------------------------------------------------ +// +// ClientServerRand +// +//------------------------------------------------------------------------ + +int ClientServerRand(int mn,int mx) +{ + int t; + + if(mn>=mx) + return(mn); + + if(!isClient) + t=(int)((*pisv.levelTime)*10.0f); + else + t=(int)((*picl.levelTime)*10.0f); + + t=t*t; + t&=(t>>7)^(t>>12)^(t>>4); + t%=(1+mx-mn); + + return(t+mn); +} + diff --git a/Source/Game/player/w_utils.h b/Source/Game/player/w_utils.h new file mode 100644 index 0000000..01801a6 --- /dev/null +++ b/Source/Game/player/w_utils.h @@ -0,0 +1,14 @@ +#ifndef __W_UTILS_H_ +#define __W_UTILS_H_ + +#include "w_weapons.h" + +void SetWSkin(sharedEdict_t *self, char *matName, char *skinName); +void SetVWeapGhoul(sharedEdict_t *self, char *modelName); +void ReadyVWeapGhoulServer(sharedEdict_t *self, char *modelName); +void SetReadiedVWeapGhoulServer(sharedEdict_t *self, char *modelName); +void RunVWeapAnim(sharedEdict_t *self, char *seqName, IGhoulInst::EndCondition loopType,float timeOffset=0); +void RunReadiedVWeapAnim(sharedEdict_t *self, char *seqName, IGhoulInst::EndCondition loopType); +int ClientServerRand(int mn,int mx); + +#endif // __W_UTILS_H_ \ No newline at end of file diff --git a/Source/Game/player/w_weapons.cpp b/Source/Game/player/w_weapons.cpp new file mode 100644 index 0000000..ad57259 --- /dev/null +++ b/Source/Game/player/w_weapons.cpp @@ -0,0 +1,758 @@ +#include "q_shared.h" +#include "..\ghoul\ighoul.h" +#include "w_public.h" +#include "w_types.h" +#include "w_weapons.h" +#include "w_utils.h" +#include "player.h" +#include "../gamecpp/game.h" + +extern player_com_import_t picom; +extern player_cl_import_t picl; +extern player_sv_import_t pisv; + +extern int isClient; +extern int fireEvent; +extern int altfireEvent; + +// noiserad does NOT belong here... + +attackInfoExtra_t attacks[] = +{ + //ammo noiseRad waver waverMax kickamount AttackID + {AMMO_NONE, 0.0, 0.0, 0.0, 0.0, ATK_NOTHING}, //SFW_EMPTYSLOT + {AMMO_KNIFE, 0.0, 0.0, 0.0, 0.0, ATK_KNIFE}, //SFW_KNIFE, + {AMMO_KNIFE, 0.0, 0.0, 0.0, 0.0, ATK_KNIFE_ALT}, //SFW_KNIFE, + {AMMO_44, 900.0, 0.2, 0.8, 5.0, ATK_PISTOL2}, //SFW_PISTOL2, + {AMMO_9MM, 600.0, 0.3, 1.5, 1.0, ATK_PISTOL1}, //SFW_PISTOL1, + {AMMO_9MM, 10.0, 0.6, 3.5, 0.0, ATK_MACHINEPISTOL}, //SFW_MACHINEPISTOL, + {AMMO_556, 800.0, 0.4, 1.8, 0.0, ATK_ASSAULTRIFLE}, //SFW_ASSAULTRIFLE, + {AMMO_556, 0.0, 0.0, 0.0, 2.0, ATK_SNIPER}, //SFW_SNIPER, ->sniper rifle + {AMMO_NONE, 0.0, 0.0, 0.0, 0.0, ATK_SNIPER_ALT}, //SFW_SNIPER, ->sniper rifle + {AMMO_SLUG, 1200.0, 1.5, 1.5, 4.0, ATK_AUTOSHOTGUN}, //SFW_AUTOSHOTGUN, ->shotgun + {AMMO_SLUG, 0.0, 0.0, 0.0, 4.0, ATK_AUTOSHOTGUN_ALT}, //SFW_AUTOSHOTGUN, ->shotgun + {AMMO_SHELLS, 1200.0, 0.0, 0.0, 5.0, ATK_SHOTGUN}, //SFW_SHOTGUN, ->shotgun + {AMMO_556, 1500.0, 0.1, 0.4, 0.0, ATK_MACHINEGUN}, //SFW_MACHINEGUN, -> machinegun + {AMMO_556, 500.0, 0.0, 0.0, 0.0, ATK_MACHINEGUN_ALT}, //SFW_MACHINEGUN, -> machinegun + {AMMO_ROCKET, 0.0, 0.0, 0.0, 0.0, ATK_ROCKET}, //SFW_ROCKET, -> rocketlauncher + {AMMO_ROCKET, 0.0, 0.0, 0.0, 0.0, ATK_ROCKET_ALT}, //SFW_ROCKET, -> rocketlauncher + {AMMO_MWAVE, 0.0, 0.0, 0.0, 0.0, ATK_MICROWAVE}, //SFW_MICROWAVEPULSE, + {AMMO_MWAVE, 0.0, 0.0, 0.0, 0.0, ATK_MICROWAVE_ALT}, //SFW_MICROWAVEPULSE, + {AMMO_FTHROWER, 0.0, 0.0, 0.0, 0.0, ATK_FLAMEGUN}, //SFW_FLAMETHROWER, + {AMMO_FTHROWER, 0.0, 0.0, 0.0, 0.0, ATK_FLAMEGUN_ALT}, //SFW_FLAMETHROWER, +}; + +WeapSoundCallBack theWeapSoundCallback; +GunFireCallBack theGunFireCallback; +AltfireCallBack theAltfireCallback; +EOSCallBack theEOSCallback; +KnifeCleanCallBack theKnifeCleanCallback; +MinimiReloadCallBack theMinimiReloadCallback; +EffectCallBack theEffectCallback; + +weaponInfoExtra_t extraInfo[] = +{ // name slotsNeeded clipsize attack1 attack2 + {"", 0, -1, &attacks[0], &attacks[0]}, //SFW_EMPTYSLOT + {"Knife", 0, 0, &attacks[1], &attacks[2]}, //SFW_KNIFE, + {"Pistol2", 1, 9, &attacks[3], &attacks[0]}, //SFW_PISTOL2, + {"Pistol1", 1, 18, &attacks[4], &attacks[0]}, //SFW_PISTOL1, + {"MPistol", 2, 32, &attacks[5], &attacks[0]}, //SFW_MACHINEPISTOL, + {"Assaultrifle", 2, 40, &attacks[6], &attacks[0]}, //SFW_ASSAULTRIFLE, + {"SniperRifle", 2, 6, &attacks[7], &attacks[8]}, //SFW_SNIPER, ->sniper rifle + {"Autoshotgun", 2, 10, &attacks[9], &attacks[10]}, //SFW_AUTOSHOTGUN, ->shotgun + {"Shotgun", 2, 8, &attacks[11], &attacks[0]}, //SFW_SHOTGUN, ->shotgun + {"Machinegun", 2, 40, &attacks[12], &attacks[13]}, //SFW_MACHINEGUN, -> machinegun + {"Rocket", 3, 4, &attacks[14], &attacks[15]}, //SFW_ROCKET, -> rocketlauncher + {"MPG", 3, 30, &attacks[16], &attacks[17]}, //SFW_MICROWAVEPULSE, + {"Flamegun", 3, 60, &attacks[18], &attacks[19]}, //SFW_FLAMETHROWER, + {"Hurthand", 0, 0, &attacks[0], &attacks[0]}, //SFW_HURTHAND, + {"Throwhand", 0, 0, &attacks[0], &attacks[0]}, //SFW_THROWHAND, +}; + +weaponInfo_c noweap(&extraInfo[0]); +knifeInfo knife(&extraInfo[1]); +pistol2Info eagle(&extraInfo[2]); +pistol1Info glock(&extraInfo[3]); +machinePistolInfo ingram(&extraInfo[4]); +assaultRifleInfo hk53(&extraInfo[5]); +sniperInfo sig(&extraInfo[6]); +autoshotgunInfo jhammer(&extraInfo[7]); +shotgunInfo spas(&extraInfo[8]); +machinegunInfo minimi(&extraInfo[9]); +rocketInfo m202a2(&extraInfo[10]); +microInfo micro(&extraInfo[11]); +flamegunInfo fthrow(&extraInfo[12]); +hurthandInfo hhand(&extraInfo[13]); +throwhandInfo thand(&extraInfo[14]); + +weaponInfo_c *weapInfo[SFW_NUM_WEAPONS] = +{ + &noweap, + &knife, + &eagle, + &glock, + &ingram, + &hk53, + &sig, + &jhammer, + &spas, + &minimi, + &m202a2, + µ, + &fthrow, + &hhand, + &thand, +}; + +weaponInfo_c::weaponInfo_c(weaponInfoExtra_t *w) +{ + clip = w->clipsize; + slotsNeeded = w->slotsNeeded; + ammoType[0] = w->a1->ammoType; + ammoType[1] = w->a2->ammoType; + noiseRad[0] = w->a1->noiseRad; + noiseRad[1] = w->a2->noiseRad; + waver[0] = w->a1->waver; + waver[1] = w->a2->waver; + waverMax[0] = w->a1->waverMax; + waverMax[1] = w->a2->waverMax; + + kick[0] = w->a1->kickAmount; + kick[1] = w->a2->kickAmount; + + strcpy(modelName, w->name); + + atkID[0] = w->a1->id; + atkID[1] = w->a2->id; + + soundToken = NULL_GhoulID; +} + +int weaponInfo_c::useAmmo1(sharedEdict_t &ent, int *skipIdle) +{ + weapon_c *weap = inven(ent)->getCurWeapon(); + + if(getAmmoType(0) == AMMO_NONE) + return 1; + + if(!inven(ent)->rulesDoWeaponsUseAmmo()) + return 1; + + if(!weap->getClip()) + { + if(inven(ent)->rulesIsWeaponReloadAutomatic()) + inven(ent)->reload(); + else + inven(ent)->dryfire(); + + return 0; + } + + weap->setClip(weap->getClip() - 1); + return 1; +} + +int weaponInfo_c::useAmmo2(sharedEdict_t &ent, int *skipIdle) +{ + weapon_c *weap = inven(ent)->getCurWeapon(); + + if(getAmmoType(1) == AMMO_NONE) + return 1; + + if(!inven(ent)->rulesDoWeaponsUseAmmo()) + return 1; + + if(!weap->getClip()) + { + if(inven(ent)->rulesIsWeaponReloadAutomatic()) + inven(ent)->reload(); + else + inven(ent)->dryfire(); + + return 0; + } + + weap->setClip(weap->getClip() - 1); + return 1; +} + +int weaponInfo_c::checkReloadAtEOS(sharedEdict_t &ent) +{ + if((wAnim(ent)->getAnimType() == WANIM_FIRE)||(wAnim(ent)->getAnimType() == WANIM_ALTFIRE)) + { + if(!inven(ent)->rulesDoWeaponsUseAmmo()) + return 0; + + if(!inven(ent)->getCurClip()) + { + if(inven(ent)->rulesIsWeaponReloadAutomatic()) + { + inven(ent)->reload(); + return 1; + } + else + { + return 0; + } + } + } + + return 0; +} + +void weaponInfo_c::precacheResources() +{ + if(getAtkID(0) != ATK_NOTHING) + { + pisv.CacheAttack((int)getAtkID(0)); + } + if(getAtkID(1) != ATK_NOTHING) + { + pisv.CacheAttack((int)getAtkID(1)); + } +} +//------------------------------------------------------------------------ + +weapon_c::weapon_c(void) +{ + curClip = 0; + cannotFire = 0; + type = SFW_EMPTYSLOT; +} + +weapon_c::weapon_c(weaponInfo_c *wInfo) +{ + curClip = getWeaponInfo()->getClipSize(); + cannotFire = 0; + type = SFW_EMPTYSLOT; +} + +void weapon_c::setType(int newType, int startWithFullClip) +{ + type = newType; + + if(startWithFullClip == -1) + { + curClip = getWeaponInfo()->getClipSize(); + } + else if(startWithFullClip) + { + curClip = startWithFullClip; + } + else + { + curClip = 0; + } +} + +int weapon_c::handleAmmo(sharedEdict_t &ent, int mode, int *skipIdle) +{ + return((mode) ? getWeaponInfo()->useAmmo2(ent, skipIdle) : getWeaponInfo()->useAmmo1(ent, skipIdle)); +} + +weaponInfo_c *weapon_c::getWeaponInfo(void) +{ + return weapInfo[type]; +} + +int weapon_c::canSelect(sharedEdict_t &ent,int withNoAmmo) +{ + if(type == SFW_EMPTYSLOT) + return 0; + + if(isClient) + { + // Client is always able to select any weapon. + return(1); + } + + if(!withNoAmmo) + { + if((curClip == 0)&&(inven(ent)->rulesDoWeaponsUseAmmo())) + { + if((inven(ent)->hasAmmo(weapInfo[type]->getAmmoType(0)) == 0)&&(!weapInfo[type]->canSelectWithNoAmmo())) + return 0; + } + } + + return(1); +} + +//--------------------------------------------------------------------------------------------- +// +// wrapper funcs +// +//--------------------------------------------------------------------------------------------- + +void Fire(sharedEdict_t &sh, edict_t &ent, inven_c &inven) +{ + if(!inven.getCurWeapon()->getWeaponInfo()->atMomentOfFire(sh)) + return; + + if(wAnim(sh)->getAnimType() != WANIM_FIRE) + return; + + if(!isClient) + pisv.FireHelper(sh, ent, inven); + else + picl.FireHelper(sh, ent, inven); + + sh.weaponkick_angles[PITCH]=-(inven.getCurWeapon()->getWeaponInfo()->getKick(0)); +} + +void Altfire(sharedEdict_t &sh, edict_t &ent, inven_c &inven) +{ + if(!inven.getCurWeapon()->getWeaponInfo()->atMomentOfFire(sh)) + return; + + if(wAnim(sh)->getAnimType() != WANIM_ALTFIRE) + return; + + if(!isClient) + pisv.AltfireHelper(sh, ent, inven); + else + picl.AltfireHelper(sh, ent, inven); + + sh.weaponkick_angles[PITCH]=-(inven.getCurWeapon()->getWeaponInfo()->getKick(1)); +} + +void EOS(sharedEdict_t &ent, inven_c &inven) +{ + if(inven.getCurWeapon()->getWeaponInfo()->handleEOS(ent)) + { + // Special end of sequence stuff handled by weapon specific EOS. + return; + } + + if(inven.getCurWeapon()->getWeaponInfo()->checkReloadAtEOS(ent)) + { + // Do we need to reload now? + return; + } + + switch(wAnim(ent)->getAnimType()) + { + case WANIM_NORMAL: + case WANIM_RELOAD: + inven.idle(); + break; + + case WANIM_FIRE: + if(!(inven.pendingCommand())) + { + qboolean doAttack=false; + + if(!isClient) + { + if(!inven.isClientPredicting()) + { + if(ent.attack) + doAttack=true; + } + else + { + if((inven.getCurWeaponID()==SFW_FLAMEGUN)|| + (inven.getCurWeaponID()==SFW_KNIFE)|| + (inven.getCurWeaponID()==SFW_MICROWAVEPULSE)) + { + // Yuck!! Sigh!! + + if(ent.attack) + doAttack=true; + } + else + { + if(pisv.getFireEvent(inven.getOwner()->edict)) + doAttack=true; + } + } + } + else + { + if(ent.attack) + doAttack=true; + } + + if(doAttack) + { + inven.getAnimInfo()->incFireLoop(); + int skipIdle = 0; + if(!inven.getCurWeapon()->handleAmmo(ent, 0, &skipIdle)) + { + if(!skipIdle) + { + inven.idle(); + } + return; + } + + if(!isClient) + { + if(inven.isClientPredicting()) + { + if((inven.getCurWeaponID()==SFW_FLAMEGUN)|| + (inven.getCurWeaponID()==SFW_KNIFE)|| + (inven.getCurWeaponID()==SFW_ASSAULTRIFLE)|| + (inven.getCurWeaponID()==SFW_MACHINEPISTOL)|| + (inven.getCurWeaponID()==SFW_MICROWAVEPULSE)) + { + // Yuck!! Sigh!! + + RunVWeapAnim(&ent, + inven.getCurWeapon()->getWeaponInfo()->getFireSeq(ent), + inven.getCurWeapon()->getWeaponInfo()->getLoopType()); + } + else + { + RunVWeapAnim(&ent, + inven.getCurWeapon()->getWeaponInfo()->getFireSeq(ent), + inven.getCurWeapon()->getWeaponInfo()->getLoopType(), + pisv.getFireEvent(inven.getOwner()->edict)); + } + + pisv.clearFireEvent(inven.getOwner()->edict); + } + else + { + RunVWeapAnim(&ent, + inven.getCurWeapon()->getWeaponInfo()->getFireSeq(ent), + inven.getCurWeapon()->getWeaponInfo()->getLoopType()); + } + } + else + { + RunVWeapAnim(&ent, + inven.getCurWeapon()->getWeaponInfo()->getFireSeq(ent), + inven.getCurWeapon()->getWeaponInfo()->getLoopType()); + + fireEvent=1; + } + + // Some weapons don't just loop their anim. + inven.getCurWeapon()->getWeaponInfo()->handleFireLoop(ent); + + return; + } + } + inven.getAnimInfo()->clearFireLoop(); + inven.idle(); + break; + + case WANIM_ALTFIRE: + if(!inven.pendingCommand()) + { + qboolean doAltAttack=false; + + if(!isClient) + { + if(!inven.isClientPredicting()) + { + if(ent.altattack) + doAltAttack=true; + } + else + { + if(pisv.getAltfireEvent(inven.getOwner()->edict)) + doAltAttack=true; + } + } + else + { + if(ent.altattack) + doAltAttack=true; + } + + if(doAltAttack) + { + inven.getAnimInfo()->incFireLoop(); + int skipIdle = 0; + if(!inven.getCurWeapon()->handleAmmo(ent, 1, &skipIdle)) + { + if(!skipIdle) + { + inven.idle(); + } + return; + } + + if(!isClient) + { + if(inven.isClientPredicting()) + { + if(inven.getCurWeaponID()==SFW_ROCKET) + { + // Yuck!! Sigh!! + + RunVWeapAnim(&ent, + inven.getCurWeapon()->getWeaponInfo()->getAltFireSeq(ent), + IGhoulInst::Hold); + } + else + { + RunVWeapAnim(&ent, + inven.getCurWeapon()->getWeaponInfo()->getAltFireSeq(ent), + IGhoulInst::Hold, + pisv.getAltfireEvent(inven.getOwner()->edict)); + } + + pisv.clearAltfireEvent(inven.getOwner()->edict); + } + else + { + RunVWeapAnim(&ent, + inven.getCurWeapon()->getWeaponInfo()->getAltFireSeq(ent), + IGhoulInst::Hold); + } + } + else + { + RunVWeapAnim(&ent, + inven.getCurWeapon()->getWeaponInfo()->getAltFireSeq(ent), + IGhoulInst::Hold); + + altfireEvent=1; + } + + // Some weapons don't just loop their anim! + inven.getCurWeapon()->getWeaponInfo()->handleAltfireLoop(ent); + + return; + } + } + inven.getAnimInfo()->clearFireLoop(); + inven.idle(); + break; + + case WANIM_PUTAWAY: + // Set new weapon to take out. + inven.setPendingChange(); + break; + + case WANIM_LOSE: + inven.idle(); + break; + } +} + +//------------------------------------------------------------------------ + +bool WeapSoundCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + inven_c *inv = (inven_c *)user; + sharedEdict_t *ent = inv->getOwner(); + + if(isClient) + picl.WeapSoundHelper(data); + + return true; +} + +bool GunFireCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + inven_c *inv = (inven_c *)user; + sharedEdict_t *ent = inv->getOwner(); + + Fire(*ent, *ent->edict, *inv); + + if (data && *((char *)data)=='1') + { // Use ammo during this fire. + if (!inv->getCurWeapon()->getWeaponInfo()->useAmmo1(*ent)) + { + EOS(*ent, *inv); + } + } + + return true; +} + +bool AltfireCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + inven_c *inv = (inven_c *)user; + sharedEdict_t *ent = inv->getOwner(); + + Altfire(*ent, *ent->edict, *inv); + return true; +} + +bool EOSCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + inven_c *inv = (inven_c *)user; + sharedEdict_t *ent = inv->getOwner(); + + EOS(*ent, *inv); + return true; +} + +bool KnifeCleanCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + inven_c *inv = (inven_c *)user; + sharedEdict_t *ent = inv->getOwner(); + + inv->getCurWeapon()->getWeaponInfo()->handleSpecialNotes((char *)data, *ent); + + return true; +} + +bool MinimiReloadCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + inven_c *inv = (inven_c *)user; + sharedEdict_t *ent = inv->getOwner(); + + inv->getCurWeapon()->getWeaponInfo()->handleSpecialNotes((char *)data, *ent); + + return true; +} + +bool EffectCallBack::Execute(IGhoulInst *me,void *user,float now,const void *data) +{ + inven_c *inv = (inven_c *)user; + sharedEdict_t *ent = inv->getOwner(); + + if(isClient) + picl.WeaponEffectHelper(data); + + return true; +} + + +class EffectPrecacheCallBack: public IGhoulCallBack +{ + public:virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data) + { + char effectstr[256], *effectname; + + strcpy(effectstr, (char *)data); + effectname = strtok(effectstr, " "); + pisv.EffectIndex(effectname); + return true; + } +}; + +EffectPrecacheCallBack effectPrecacher; + + + +//------------------------------------------------------------------------ + +class SoundPrecacheCallBack: public IGhoulCallBack +{ + public:virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data) + { + char buffer[256], soundname[256], *soundtok, *numtok; + int i,c; + + strcpy(soundname, (char *)data); + soundtok = strtok(soundname, " "); + numtok = strtok(NULL, " "); + if (!numtok) + { + c=0; + } + else + { + c=atoi(numtok); + } + + if (c>0) + { + for (i=1; i<=c; i++) + { + picom.Com_Sprintf(buffer, sizeof(buffer), "%s%d.wav", soundtok, i); + pisv.SoundIndex(buffer); + } + } + else + { + picom.Com_Sprintf(buffer, sizeof(buffer), "%s.wav", soundtok); + pisv.SoundIndex(buffer); + } + return true; + } +}; + +SoundPrecacheCallBack soundPrecacher; + +//------------------------------------------------------------------------ + +void W_UncacheViewWeaponModels(void) +{ + int i; + + for(i = 0; i < SFW_NUM_WEAPONS; i++) + { + if(weapInfo[i]->getGhoulObj()) + { + weapInfo[i]->setGhoulObj(NULL); + } + } +} + +void W_PrecacheViewWeaponModels(int types) +{ + // types is a bitflag of all the weapon types that should be precached + + char buffer[256]; + + for(int i = SFW_EMPTYSLOT + 1; i < SFW_NUM_WEAPONS; i++) + { + if(!(types & (1<getGhoulObj())continue;//only need to precache if this weapon isn't already loaded, of course + + obj = ((IGhoul *)pisv.GetGhoul())->NewObj(); + + if(!obj) + { + // This is real bad - should not happen right? + + assert(obj); + continue; + } + + picom.RegisterGSQSequences(buffer, extraInfo[i].name, obj); + obj->RegisterEverything(); + obj->PreCache(picom.ghl_specular->value>0.0f); + + // Precache all the weapon sounds. + + GhoulID id = obj->FindNoteToken("sound"); + + if(id) + { + obj->FireAllNoteCallBacks(&soundPrecacher,id); + } + + // Precache all effect calls. + + id = obj->FindNoteToken("effect"); + + if(id) + { + obj->FireAllNoteCallBacks(&effectPrecacher,id); + } + + // Precache all other resources. + + weapInfo[i]->setGhoulObj(obj); + weapInfo[i]->precacheResources(); + } +} diff --git a/Source/Game/player/w_weapons.h b/Source/Game/player/w_weapons.h new file mode 100644 index 0000000..17445d6 --- /dev/null +++ b/Source/Game/player/w_weapons.h @@ -0,0 +1,1140 @@ +#ifndef __W_WEAPONS_H +#define __W_WEAPONS_H + +#include "w_public.h" + +#define MASK_PROJ (CONTENTS_SOLID|CONTENTS_MONSTER|CONTENTS_DEADMONSTER|CONTENTS_SHOT) +#define MASK_PROJ2 (MASK_PROJ|CONTENTS_WINDOW) + +typedef struct sharedEdict_s sharedEdict_t; +typedef struct edict_s edict_t; + +class clientRICBuf; +class serverRICBuf; + +const int MAXWEAPONS = 14; +const int MAXSELECTABLEWEAPONS = 12; +const int MAXITEMS = 6; +const float ITEM_USE_TIME = .4; + +enum +{ + WANIM_NORMAL, + WANIM_RELOAD, + WANIM_FIRE, + WANIM_ALTFIRE, + WANIM_PUTAWAY, + WANIM_LOSE, + WANIM_TYPES +}; + +typedef enum +{ + PWC_NOCOMMAND, + PWC_RELOAD, + PWC_WEAPNEXT, + PWC_WEAPPREV, + PWC_WEAPONBEST_SAFE, + PWC_WEAPONBEST_UNSAFE, + PWC_LOSE, + PWC_DROP, + PWC_WEAPSELECTFIRST, + PWC_NUMCMDS = PWC_WEAPSELECTFIRST + MAXSELECTABLEWEAPONS, +} pweapCmds_t; + +typedef enum +{ + PEC_NOCOMMAND, + PEC_ITEMNEXT, + PEC_ITEMPREV, + PEC_DROP, + PEC_USEITEM, + PEC_USEITEMFIRST, + PEC_NUMCMDS = PEC_USEITEMFIRST + MAXITEMS, +} pequipCmds_t; + +typedef struct attackInfoExtra_s +{ + int ammoType; + float noiseRad; + float waver; // waver should be in terms of degrees per consecutive shot... + float waverMax; + float kickAmount; + attacks_e id; +}attackInfoExtra_t; + +typedef struct weaponInfoExtra_s +{ + char *name; + int slotsNeeded; + int clipsize; + attackInfoExtra_t *a1; + attackInfoExtra_t *a2; +} weaponInfoExtra_t; + +enum +{ + FIRE_NORMAL = 0, + FIRE_ALT, +}; + +//------------------------------------------------------------------------ +// +// weaponInfo_c +// +//------------------------------------------------------------------------ + +class weaponInfo_c +{ +private: +protected: + + int clip; + int slotsNeeded; + int ammoType[2]; + float noiseRad[2]; + float waver[2]; + float waverMax[2]; + char modelName[128];//hardcodedness... + GhoulID soundToken; + float kick[2]; + attacks_e atkID[2]; + IGhoulObj *obj; + +public: + + weaponInfo_c(void){soundToken = NULL_GhoulID;obj = 0;} + weaponInfo_c(weaponInfoExtra_t *w); + ~weaponInfo_c(void){} + + int getClipSize(void) {return clip;} + int getSlotsNeeded(void) {return slotsNeeded;} + int getAmmoType(int mode) {return ammoType[mode];} + float getWaver(int mode){return waver[mode];} + float getWaverMax(int mode){return waverMax[mode];} + float getKick(int mode){return kick[mode];} + attacks_e getAtkID(int mode){return atkID[mode];} + + char *getWeaponName(void){return modelName;} + + virtual char *getFireSeq(sharedEdict_t &ent){return NULL;} + virtual char *getAltFireSeq(sharedEdict_t &ent){return NULL;} + virtual char *getIdleSeq(sharedEdict_t &ent){return NULL;} + virtual char *getReloadSeq(sharedEdict_t &ent){return NULL;} + virtual char *getTakeOutSeq(sharedEdict_t &ent){return NULL;} + virtual char *getPutAwaySeq(sharedEdict_t &ent){return NULL;} + virtual char *getDryfireSeq(sharedEdict_t &ent){return NULL;} + + virtual char *getName(void){return "";} + virtual GhoulSpeed getFireSpeed(void){return gsOne;} + + virtual void shutdownWeapon(sharedEdict_t &ent){}; + virtual void noattack(sharedEdict_t &ent){}; + + virtual int handleEOS(sharedEdict_t &ent){return 0;} + virtual void handleFireLoop(sharedEdict_t &ent){} + virtual void handleAltfireLoop(sharedEdict_t &ent){} + virtual void handleSpecialNotes(char *string, sharedEdict_t &ent){} + + virtual int useAmmo1(sharedEdict_t &ent, int *skipIdle = 0); + virtual int useAmmo2(sharedEdict_t &ent, int *skipIdle = 0); + virtual void turnOffAmmoParts(sharedEdict_t &ent,int clipLeft,qboolean forceAll=false){}; + + virtual int canSelectWithNoAmmo(void){return 0;} + + virtual void setBloody(sharedEdict_t *self){} + + virtual int testInput(sharedEdict_t &ent){return 0;} + + void setSoundToken(GhoulID newID){soundToken = newID;} + GhoulID getSoundToken(void){return soundToken;} + void setGhoulObj(IGhoulObj *newObj){obj = newObj;} + IGhoulObj *getGhoulObj(void){return obj;} + + virtual int atMomentOfFire(sharedEdict_t &ent){return 1;} + virtual int isSingleReload(void){return 0;} + + float getNoiseVal(int num){return noiseRad[num];} + + virtual void handleFall(sharedEdict_t &ent){}; + virtual int testReloadAtInit(sharedEdict_t &ent){return 1;} + virtual int checkReloadAtEOS(sharedEdict_t &ent); + + virtual int hasAltFire(void){return 0;} + virtual int getType(void){return SFW_EMPTYSLOT;} + virtual int fireFromFlash(void){return 0;} + virtual qboolean aimAtCrosshair(void){return true;} + virtual void precacheResources(void); + + virtual IGhoulInst::EndCondition getLoopType(void){return IGhoulInst::Hold;} + +// virtual void frameUpdate(sharedEdict_t &ent){}; +}; + +//------------------------------------------------------------------------ +// +// weapon_c +// +//------------------------------------------------------------------------ + +class weapon_c +{ +private: + + int curClip; + int type; + int cannotFire; + +public: + + weapon_c(void); + weapon_c(weaponInfo_c *wInfo); + ~weapon_c(void){}; + + int getType(void){return type;} + void setType(int newType, int startWithFullClip = 0); + weaponInfo_c *getWeaponInfo(void); + int handleAmmo(sharedEdict_t &ent, int mode, int *skipIdle = 0); + int canSelect(sharedEdict_t &ent,int withNoAmmo=0); + int getClip(void){return curClip;} + void setClip(int clip){curClip = clip;} +}; + +//------------------------------------------------------------------------ +// +// itemSlot_c +// +//------------------------------------------------------------------------ + +class itemSlot_c +{ +private: + + int itemType; + int ammo; + int status; + float nextupdate; + +public: + + itemSlot_c(void); + ~itemSlot_c(void){} + + void clear(void); + int getSlotType(void){return itemType;} + int getSlotCount(void){return ammo;} + int getSlotStatus(void){return status;} + float getSlotUpdateTime(void){return nextupdate;} + + void setSlotType(int newVal){itemType = newVal;} + void setSlotCount(int newVal){ammo = newVal;} + void setSlotStatus(int newVal){status = newVal;} + void setSlotUpdateTime(float newFloat){nextupdate = newFloat;} + + void useAmmo(sharedEdict_t &ent); +}; + +//------------------------------------------------------------------------ +// +// item_c +// +//------------------------------------------------------------------------ + +class item_c +{ +private: + + int curSlotNum; + int nextCommand; + int lastUseTime; + itemSlot_c slots[MAXITEMS]; + + void HandleInput(sharedEdict_t &ent); + +public: + + item_c(void); + ~item_c(void){} + + itemSlot_c *getCurSlot(void){return &slots[curSlotNum];} + itemSlot_c *getSlot(int i){return &slots[i];} + int getSlotNumFromName(char *itemName); + void frameUpdate(sharedEdict_t &ent); + void deactivate(sharedEdict_t &ent); + int addItemType(int type, int amount, int maxAmount); + int hasItemType(int type); + void setNextCommand(int cmd){nextCommand = cmd;} + int handleDamage(sharedEdict_t &ent, int initDamage); + void clearSlot(int slotNum){slots[slotNum].setSlotType(SFE_EMPTYSLOT);slots[slotNum].setSlotCount(0);} + int getCurType(void){return getCurSlot()->getSlotType();} + int getCurAmmo(void){return getCurSlot()->getSlotCount();} + int getNextCommand(void){return nextCommand;} +}; + +//------------------------------------------------------------------------ +// +// wAnim_c +// +//------------------------------------------------------------------------ + +class wAnim_c +{ +private: + + int handsOnWeapon; + int weaponLifted; + int justTransitioned; + int bloodyKnife; + int handSide; + char curSeqName[MAX_QPATH]; + int fireLoopNum; + int animType; + int knifeThrow; // needed because of the split knife throwing anim... + int isDown; + int firstShotInSeq; // for damn ingram + int inZoom; + int inZoomView; + int interesting; + int rezoom; + int inDisguise; + float lastShootTime; //can't shoot twice in a frame + +public: + + int getJustTransitioned(void){return justTransitioned;} + void setTransition(int val){assert(val > -1);assert(val < 2);justTransitioned = val;} + int getHandsInUse(void){return handsOnWeapon;} + void setHandsInUse(int val){assert(val > 0);assert(val < 3);handsOnWeapon = val;} + int getWeaponLifted(void){return weaponLifted;} + void setWeaponLifted(int val){assert(val > -1);assert(val < 2);weaponLifted = val;} + void setBloody(int state){bloodyKnife = state;} + int getBloody(void){return bloodyKnife;} + void setHandSide(int newSide){handSide = newSide;} + int getHandSide(void){return handSide;} + void setSeqName(char *name){strncpy(curSeqName, name, MAX_QPATH);} + char *getSeqName(void){return curSeqName;}//eh? + int getFireLoop(void){return fireLoopNum;} + void incFireLoop(void){fireLoopNum++;} + void clearFireLoop(void){fireLoopNum = 0;} + int getAnimType(void){return animType;} + void setAnimType(int val){assert(val < WANIM_TYPES);assert(val > -1);animType = val;} + int getKnifeStatus(void){return knifeThrow;} + void setKnifeStatus(int val){knifeThrow = val;} + int getDown(void){return isDown;} + void setDown(int val){isDown = val;} + int firstShot(void){return firstShotInSeq;} + void setFirstShot(int val){firstShotInSeq = val;} + int getInZoom(void){return inZoom;} + void setInZoom(int val){inZoom = val;} + int getInZoomView(void){return inZoomView;} + void setInZoomView(int val){inZoomView = val;} + int getLastWasInteresting(void){return interesting;} + void setInteresting(int val){(val) ? interesting = 2:interesting--; if(interesting < 0)interesting = 0;} + int getRezoom(void){return rezoom;} + void setRezoom(int val){rezoom = val;} + int disguised(void){return inDisguise;} + void setDisguise(int val){inDisguise = val;} + void setlastShootTime(float val){lastShootTime = val;} + float getlastShootTime(void){return lastShootTime;} +}; + +//------------------------------------------------------------------------ +// +// inven_c +// +//------------------------------------------------------------------------ + +class inven_c:public invPub_c +{ +private: + + clientRICBuf *clientRICBuffer; + serverRICBuf *serverRICBuffer; + +#define INVEN_SAVE_START offsetof(inven_c, nextCommand) + + int nextCommand; + int clientOverrideCmd; + int newInstRxd; + int nextSelectSlot; + int curWeaponID; + int curWeaponType; + int curWeaponSlot; + + int readiedWeaponID; + int readiedWeaponType; + int readiedWeaponSlot; + + int droppingSlot; + weapon_c weapons[MAXWEAPONS]; + qboolean rulesWeaponsUseAmmo; + qboolean rulesDropWeapons; + int rulesNonDroppableWeaponTypes; + qboolean rulesWeaponsReload; + qboolean rulesReloadEmptiesWeapon; + qboolean rulesWeaponReloadAutomatic; + qboolean rulesDropInvenOnDeath; + qboolean rulesSelectWithNoAmmo; + char rulesBestWeaponMode[5]; + qboolean rulesFreelySelectWeapon; + int ammo[MAXAMMOS]; + int canHandleInput; + IGhoulInst *model; + + IGhoulInst *readyModel; + + int selectedWeaponSlot; + int armor; + int weaponsOwned; + int pendingChange; + int clientPredicting; + + Matrix4 gunEnd; + sharedEdict_t *owner; + + item_c items; + + wAnim_c wAnim; + + void handleInput(void); + void handleModelChange(void); + int getWeaponNum(int cmd); + +public: + + inven_c(void); + ~inven_c(void); + + // ------------------- + // Inherited functions + // ------------------- + // These are the interface to the invenory / weapon system and are callable + // outside the player DLL. + // ------------------- + + void initNewWeapon(void); + void clearInv(bool); + void removeSpecificItem(int type); + + void handlePlayerDeath(void); + void frameUpdate(void); + + int addCommand(char *string,qboolean internal=false); + void stockWeapons(void); + + int selectWeapon(int type); + void selectWeaponSlot(int weaponNum); + void selectBestWeapon(void); + void takeOutWeapon(int type); + void takeOutWeaponSlot(int weaponNum); + void takeOutBestWeapon(void); + + int addAmmoByGunType(int type, int amount); + int stripAmmoFromGun(int type, int amount); + int addAmmoType(int type, int amount); + int addWeaponType(int type, int fullClip = 0); + int getEncumbrance(void); + int getEncumbranceByType(int weapon); + int addItem(int type, int amount, int maxAmount = -1);//{return items.addItemType(type, amount, maxAmount);} + int addArmor(int amount){if((armor==100&&amount>=0)||(armor==0&&amount<=0))return 0;armor += amount;if(armor>100)armor=100;else if(armor<0)armor=0;return armor;} // Biessman sez, "max of 100" + + int hasWeaponType(int type){return (weaponsOwned & (1<getType();} + + int getReadiedWeaponType(void){return readiedWeapon()->getType();} + + int getBestWeaponType(void); + int getCurItemType(void){return items.getCurType();} + int getCurItemAmount(void){return items.getCurAmmo();} + int getCurAmmo(void){return ammo[curInfo()->getAmmoType(0)];} + int getReadiedAmmo(void){return ammo[readiedInfo()->getAmmoType(0)];} + int getCurClip(void){return curWeapon()->getClip();} + int getClipMax(void){return curInfo()->getClipSize();} + int getClipMaxByType(int weapon); + int adjustDamageByArmor(int initDamage, float penetrate, float absorb); + int getArmorCount(void){return armor;} + + int scopeIsActive(void){return wAnim.getInZoomView();} + void setBloodyWeapon(int isBloody); + int inDisguise(void){return wAnim.disguised();} + void becomeDisguised(void); + + int rulesDoWeaponsUseAmmo(void); + void rulesSetWeaponsUseAmmo(int useAmmo); + int rulesCanDropWeapons(void); + void rulesSetDropWeapons(int dropWeapons); + int rulesGetNonDroppableWeaponTypes(void); + void rulesSetNonDroppableWeaponTypes(int nonDropMask); + int rulesDoWeaponsReload(void); + void rulesSetWeaponsReload(int weaponsReload); + int rulesIsWeaponReloadAutomatic(void); + void rulesSetWeaponReloadAutomatic(int reloadAutomatic); + int rulesDoReloadEmptiesWeapon(void); + void rulesSetReloadEmptiesWeapon(int reloadEmptiesWeapon); + char *rulesGetBestWeaponMode(void); + void rulesSetBestWeaponMode(char *bestWeaponMode); + int rulesCanDropInvenOnDeath(void); + void rulesSetDropInvenOnDeath(int dropInvenOnDeath); + int rulesCanSelectWithNoAmmo(void); + void rulesSetSelectWithNoAmmo(int selectWithNoAmmo); + int rulesCanFreelySelectWeapon(void); + void rulesSetFreelySelectWeapon(int freelySelectWeapon); + + int removeCurrentWeapon(void); + int countWeapons(void); + void setOwner(void *newOwner){owner = (sharedEdict_t *)newOwner;} + void dropAllWeapons(void); + + void handleFall(void){curInfo()->handleFall(*owner);} + + int extractInvFromMenu(int *weaponsAvailable, int *health); + void buildInvForMenu(int includeClipAmmo, int health); + + int extractInvFromString(int *weaponsAvailable,char *invString); + void buildInvString(char *string,qboolean xtractWeapons,qboolean xtractAmmo,qboolean xtractItems,qboolean xtractArmor); + + void clientClearRICs(void); + void clientReadRICs(void); + void clientProcessRICs(void); + void serverClearRICs(void); + void serverWriteRICs(void); + + void setClientPredicting(int predicting){clientPredicting=predicting;} + int isClientPredicting(void){return(clientPredicting);} + + // --------------- + // Everything else + // --------------- + // IMPORTANT! Do not call these functions outside of the player DLL! Doing + // so will totally screw any chance of the weapon / inventory system being + // portable to the client. + // --------------- + + // general weapon stuff + + weapon_c *getCurWeapon(void){return curWeapon();}//legacy... sigh... + int getCurWeaponID(void) {return curWeaponID;} + + weapon_c *getReadiedWeapon(void){return readiedWeapon();}//legacy... sigh... + int getReadiedWeaponID(void) {return readiedWeaponID;} + + item_c *getItems(void) {return &items;} + void addWeaponToOwnList(int weapon){weaponsOwned |= (1<getWeaponInfo()->getWeaponName();} + + IGhoulInst *getReadyModel(void){return readyModel;} + void setReadyModel(IGhoulInst *newInst){readyModel = newInst;} + char *getReadyModelName(void){return readiedWeapon()->getWeaponInfo()->getWeaponName();} + + void setGunEnd(Matrix4 &source){gunEnd = source;}//fixme + void getGunEnd(vec3_t worldSpot); + + // ammo stuff + + int refillCurClip(int curSlot, int ignoreSingle = 0, int noFillForSingle = 1); + int hasAmmo(int type){ assert(type >= 0); assert(type < MAXAMMOS); return (ammo[type] != 0);} + int getAmmoAmount(int type){assert(type >= 0); assert(type < MAXAMMOS); return(ammo[type]);} + void setAmmoAmount(int type, int newVal){assert(type >= 0); assert(type < MAXAMMOS); ammo[type] = newVal;} + void setCurClip(int val){curWeapon()->setClip(val);} + + // armor stuff + + void setArmor(int amount){armor = amount;} + + // attack funcs + + int fire(); // return value indicates whether the weapon can actually fire at this point + int altFire(); // ditto + int reload(); + int clientReload(); + int putAway(); + int takeOut(); + int idle(void); + void idleReadied(void); + int dryfire(void); + int loseWeapon(void); + + wAnim_c *getAnimInfo(void){return &wAnim;} + + weaponInfo_c *curInfo(void); + void setWInfo(int newType){curWeaponType = newType;} + weapon_c *curWeapon(void); + void setCurWeapon(int slot){curWeaponSlot = slot;} + + weaponInfo_c *readiedInfo(void); + void setReadiedWInfo(int newType){readiedWeaponType = newType;} + weapon_c *readiedWeapon(void); + void setReadiedWeapon(int slot){readiedWeaponSlot = slot;} + + weapon_c *droppingWeapon(void){if(droppingSlot== -1)return 0; return &weapons[droppingSlot];} + void setDroppingWeapon(int slot){droppingSlot = slot;} + int getCurSlot(void){return curWeaponSlot;} + int getBestSlot(int safe); + + inven_c(inven_c *orig); + void Evaluate(inven_c *orig); + void Write(void); + void Read(void); + void NetRead(struct sizebuf_s *net_message_ptr); + void NetWrite(int clientnum); + void getServerState(void); + void setServerState(void); +}; + +//------------------------------------------------------------------------ +// +// Callback Declarations +// +//------------------------------------------------------------------------ + +class WeapSoundCallBack:public IGhoulCallBack +{ +public: + + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +class GunFireCallBack:public IGhoulCallBack +{ +public: + + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +class AltfireCallBack:public IGhoulCallBack +{ +public: + + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +class EOSCallBack:public IGhoulCallBack +{ +public: + + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +class KnifeCleanCallBack:public IGhoulCallBack +{ +public: + + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +class MinimiReloadCallBack:public IGhoulCallBack +{ +public: + + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +class EffectCallBack:public IGhoulCallBack +{ +public: + + virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data); +}; + +//------------------------------------------------------------------------ +// +// External Callbacks +// +//------------------------------------------------------------------------ + +extern WeapSoundCallBack theWeapSoundCallback; +extern GunFireCallBack theGunFireCallback; +extern AltfireCallBack theAltfireCallback; +extern EOSCallBack theEOSCallback; +extern KnifeCleanCallBack theKnifeCleanCallback; +extern MinimiReloadCallBack theMinimiReloadCallback; +extern EffectCallBack theEffectCallback; + +//------------------------------------------------------------------------ +// +// Inherited Weapon Definitions +// +//------------------------------------------------------------------------ + +class knifeInfo : public weaponInfo_c +{ +private: +public: + + knifeInfo(weaponInfoExtra_t *w); + + char *getFireSeq(sharedEdict_t &ent); + char *getIdleSeq(sharedEdict_t &ent); + char *getAltFireSeq(sharedEdict_t &ent); + char *getReloadSeq(sharedEdict_t &ent); + char *getTakeOutSeq(sharedEdict_t &ent); + char *getPutAwaySeq(sharedEdict_t &ent); + + char *getName(void){return "Knife";} + + int useAmmo1(sharedEdict_t &ent, int *skipIdle = 0){return 1;} + int useAmmo2(sharedEdict_t &ent, int *skipIdle = 0); + + int handleEOS(sharedEdict_t &ent); + void handleFireLoop(sharedEdict_t &ent); + void handleAltfireLoop(sharedEdict_t &ent); + int checkReloadAtEOS(sharedEdict_t &ent){return 0;}//this is silly. No. + + void handleSpecialNotes(char *string, sharedEdict_t &ent); + + char *getSlashLeft(void); + char *getSlashRight(void); + + int canSelectWithNoAmmo(void){return 1;} + + void setBloody(sharedEdict_t *self); + + int getType(void){return SFW_KNIFE;} + + int hasAltFire(void){return 1;} + void precacheResources(void); + + int testInput(sharedEdict_t &ent); +}; + +class pistol2Info : public weaponInfo_c +{ +private: +public: + + pistol2Info(weaponInfoExtra_t *w); + + char *getFireSeq(sharedEdict_t &ent); + char *getIdleSeq(sharedEdict_t &ent); + char *getAltFireSeq(sharedEdict_t &ent); + char *getReloadSeq(sharedEdict_t &ent); + char *getTakeOutSeq(sharedEdict_t &ent); + char *getPutAwaySeq(sharedEdict_t &ent); + char *getDryfireSeq(sharedEdict_t &ent); + + char *getName(void){return "Desert Eagle";} + + int testInput(sharedEdict_t &ent); + + int getType(void){return SFW_PISTOL2;} + + int canSelectWithNoAmmo(void){return 0;} + void precacheResources(void); +}; + +class pistol1Info: public weaponInfo_c +{ +private: +public: + + pistol1Info(weaponInfoExtra_t *w); + + char *getFireSeq(sharedEdict_t &ent); + char *getIdleSeq(sharedEdict_t &ent); + char *getAltFireSeq(sharedEdict_t &ent); + char *getReloadSeq(sharedEdict_t &ent); + char *getTakeOutSeq(sharedEdict_t &ent); + char *getPutAwaySeq(sharedEdict_t &ent); + char *getDryfireSeq(sharedEdict_t &ent); + + char *getName(void){return "Glock 9mm";} + + int handleEOS(sharedEdict_t &ent); + void handleAltfireLoop(sharedEdict_t &ent); + + int getType(void){return SFW_PISTOL1;} + + int atMomentOfFire(sharedEdict_t &ent); + int testInput(sharedEdict_t &ent); + void precacheResources(void); +}; + +class machinePistolInfo : public weaponInfo_c +{ +private: +public: + + machinePistolInfo(weaponInfoExtra_t *w); + + char *getFireSeq(sharedEdict_t &ent); + char *getIdleSeq(sharedEdict_t &ent); + char *getAltFireSeq(sharedEdict_t &ent); + char *getReloadSeq(sharedEdict_t &ent); + char *getTakeOutSeq(sharedEdict_t &ent); + char *getPutAwaySeq(sharedEdict_t &ent); + char *getDryfireSeq(sharedEdict_t &ent); + + char *getName(void){return "Ingram m11";} + + int handleEOS(sharedEdict_t &ent); + void handleFireLoop(sharedEdict_t &ent); + int atMomentOfFire(sharedEdict_t &ent); + + int getType(void){return SFW_MACHINEPISTOL;} + + int testInput(sharedEdict_t &ent); + void precacheResources(void); + + IGhoulInst::EndCondition getLoopType(void){return IGhoulInst::Hold;} +}; + +class assaultRifleInfo : public weaponInfo_c +{ +private: +public: + + assaultRifleInfo(weaponInfoExtra_t *w); + + char *getFireSeq(sharedEdict_t &ent); + char *getIdleSeq(sharedEdict_t &ent); + char *getAltFireSeq(sharedEdict_t &ent); + char *getReloadSeq(sharedEdict_t &ent); + char *getTakeOutSeq(sharedEdict_t &ent); + char *getPutAwaySeq(sharedEdict_t &ent); + char *getDryfireSeq(sharedEdict_t &ent); + + char *getName(void){return "HK53";} + + int getType(void){return SFW_ASSAULTRIFLE;} + + int atMomentOfFire(sharedEdict_t &ent); + + int useAmmo1(sharedEdict_t &ent, int *skipIdle = 0); + void turnOffAmmoParts(sharedEdict_t &ent,int clipLeft,qboolean forceAll=false); + + void handleSpecialNotes(char *string, sharedEdict_t &ent); + + int testInput(sharedEdict_t &ent); + void precacheResources(void); + + IGhoulInst::EndCondition getLoopType(void){return IGhoulInst::Hold;} +}; + +class sniperInfo : public weaponInfo_c +{ +private: +public: + + sniperInfo(weaponInfoExtra_t *w); + + void shutdownWeapon(sharedEdict_t &ent); + + char *getFireSeq(sharedEdict_t &ent); + char *getIdleSeq(sharedEdict_t &ent); + char *getAltFireSeq(sharedEdict_t &ent); + char *getReloadSeq(sharedEdict_t &ent); + char *getTakeOutSeq(sharedEdict_t &ent); + char *getPutAwaySeq(sharedEdict_t &ent); + char *getDryfireSeq(sharedEdict_t &ent); + + char *getName(void){return "Sig2000G";} + + int handleEOS(sharedEdict_t &ent); + void handleFireLoop(sharedEdict_t &ent); + void handleAltfireLoop(sharedEdict_t &ent); + + int testInput(sharedEdict_t &ent); + + int getType(void){return SFW_SNIPER;} + + int hasAltFire(void){return 1;} + + void precacheResources(void); +}; + +class autoshotgunInfo : public weaponInfo_c +{ +private: +public: + + autoshotgunInfo(weaponInfoExtra_t *w); + + char *getFireSeq(sharedEdict_t &ent); + char *getIdleSeq(sharedEdict_t &ent); + char *getAltFireSeq(sharedEdict_t &ent); + char *getReloadSeq(sharedEdict_t &ent); + char *getTakeOutSeq(sharedEdict_t &ent); + char *getPutAwaySeq(sharedEdict_t &ent); + char *getDryfireSeq(sharedEdict_t &ent); + + char *getName(void){return "Jackhammer";} + GhoulSpeed getFireSpeed(void){return gsOne;} + + int useAmmo2(sharedEdict_t &ent, int *skipIdle = 0); + + int handleEOS(sharedEdict_t &ent); + + int getType(void){return SFW_AUTOSHOTGUN;} + + int hasAltFire(void){return 1;} + int fireFromFlash(void){return 1;} + void precacheResources(void); +}; + +class shotgunInfo : public weaponInfo_c +{ +private: +public: + + shotgunInfo(weaponInfoExtra_t *w); + + char *getFireSeq(sharedEdict_t &ent); + char *getIdleSeq(sharedEdict_t &ent); + char *getAltFireSeq(sharedEdict_t &ent); + char *getReloadSeq(sharedEdict_t &ent); + char *getTakeOutSeq(sharedEdict_t &ent); + char *getPutAwaySeq(sharedEdict_t &ent); + char *getDryfireSeq(sharedEdict_t &ent); + + char *getName(void){return "Spas15";} + int useAmmo1(sharedEdict_t &ent, int *skipIdle =0); + + int isSingleReload(void){return 1;} + int handleEOS(sharedEdict_t &ent); + + int getType(void){return SFW_SHOTGUN;} + + int testInput(sharedEdict_t &ent); + int testReloadAtInit(sharedEdict_t &ent){return 1;} + void precacheResources(void); +}; + +class machinegunInfo : public weaponInfo_c +{ +private: +public: + + machinegunInfo(weaponInfoExtra_t *w); + + char *getFireSeq(sharedEdict_t &ent); + char *getIdleSeq(sharedEdict_t &ent); + char *getAltFireSeq(sharedEdict_t &ent); + char *getReloadSeq(sharedEdict_t &ent); + char *getTakeOutSeq(sharedEdict_t &ent); + char *getPutAwaySeq(sharedEdict_t &ent); + char *getDryfireSeq(sharedEdict_t &ent); + + char *getName(void){return "Minimi";} + GhoulSpeed getFireSpeed(void){return gsOne;} + + int handleEOS(sharedEdict_t &ent); + int useAmmo1(sharedEdict_t &ent, int *skipIdle = 0); + int useAmmo2(sharedEdict_t &ent, int *skipIdle = 0); + void turnOffAmmoParts(sharedEdict_t &ent,int clipLeft,qboolean forceAll=false); + + void handleSpecialNotes(char *string, sharedEdict_t &ent); + + void handleFall(sharedEdict_t &ent); + + int getType(void){return SFW_MACHINEGUN;} + + int atMomentOfFire(sharedEdict_t &ent); + int testInput(sharedEdict_t &ent); + + int hasAltFire(void){return 1;} + void precacheResources(void); + + IGhoulInst::EndCondition getLoopType(void){return IGhoulInst::Hold;} +}; + +class rocketInfo : public weaponInfo_c +{ +private: +public: + + rocketInfo(weaponInfoExtra_t *w); + + char *getFireSeq(sharedEdict_t &ent); + char *getIdleSeq(sharedEdict_t &ent); + char *getAltFireSeq(sharedEdict_t &ent); + char *getReloadSeq(sharedEdict_t &ent); + char *getTakeOutSeq(sharedEdict_t &ent); + char *getPutAwaySeq(sharedEdict_t &ent); + char *getDryfireSeq(sharedEdict_t &ent); + + char *getName(void){return "M202A2";} + + int getType(void){return SFW_ROCKET;} + + int hasAltFire(void){return 1;} + void handleFireLoop(sharedEdict_t &ent); + int atMomentOfFire(sharedEdict_t &ent); + + int fireFromFlash(void){return 1;} + void precacheResources(void); +}; + +class microInfo : public weaponInfo_c +{ +private: +public: + + microInfo(weaponInfoExtra_t *w); + + char *getFireSeq(sharedEdict_t &ent); + char *getIdleSeq(sharedEdict_t &ent); + char *getAltFireSeq(sharedEdict_t &ent); + char *getReloadSeq(sharedEdict_t &ent); + char *getTakeOutSeq(sharedEdict_t &ent); + char *getPutAwaySeq(sharedEdict_t &ent); + char *getDryfireSeq(sharedEdict_t &ent); + + char *getName(void){return "Microwave Pulse";} + + int getType(void){return SFW_MICROWAVEPULSE;} + + int hasAltFire(void){return 1;} + + int useAmmo2(sharedEdict_t &ent, int *skipIdle = 0); + + int handleEOS(sharedEdict_t &ent); + int testInput(sharedEdict_t &ent); + + int fireFromFlash(void){return 1;} + qboolean aimAtCrosshair(void){return false;} + void precacheResources(void); +}; + +class flamegunInfo : public weaponInfo_c +{ +private: +public: + + flamegunInfo(weaponInfoExtra_t *w); + + void shutdownWeapon(sharedEdict_t &ent); + void noattack(sharedEdict_t &ent); + + char *getFireSeq(sharedEdict_t &ent); + char *getIdleSeq(sharedEdict_t &ent); + char *getAltFireSeq(sharedEdict_t &ent); + char *getReloadSeq(sharedEdict_t &ent); + char *getTakeOutSeq(sharedEdict_t &ent); + char *getPutAwaySeq(sharedEdict_t &ent); + char *getDryfireSeq(sharedEdict_t &ent); + + char *getName(void){return "Flamethrower";} + + int useAmmo1(sharedEdict_t &ent, int *skipIdle = 0); + int useAmmo2(sharedEdict_t &ent, int *skipIdle = 0); + + int handleEOS(sharedEdict_t &ent); + void handleFireLoop(sharedEdict_t &ent); + void handleAltfireLoop(sharedEdict_t &ent); + int checkReloadAtEOS(sharedEdict_t &ent){return 0;} + + int testInput(sharedEdict_t &ent); + + int getType(void){return SFW_FLAMEGUN;} + + int hasAltFire(void){return 1;} + int fireFromFlash(void){return 1;} + qboolean aimAtCrosshair(void){return false;} + void precacheResources(void); + +// void frameUpdate(sharedEdict_t &ent); +}; + + +class hurthandInfo : public weaponInfo_c +{ +private: +public: + + hurthandInfo(weaponInfoExtra_t *w); + + char *getIdleSeq(sharedEdict_t &ent); + char *getTakeOutSeq(sharedEdict_t &ent); + char *getName(void){return "Hurthand";} + int getType(void){return SFW_HURTHAND;} + int handleEOS(sharedEdict_t &ent); +}; + +class throwhandInfo : public weaponInfo_c +{ +private: +public: + + throwhandInfo(weaponInfoExtra_t *w); + + char *getIdleSeq(sharedEdict_t &ent); + char *getTakeOutSeq(sharedEdict_t &ent); + char *getName(void){return "Throwhand";} + int getType(void){return SFW_THROWHAND;} + int handleEOS(sharedEdict_t &ent); +}; + +//------------------------------------------------------------------------ +// +// sharedEdict_s +// +//------------------------------------------------------------------------ + +struct sharedEdict_s +{ + inven_c *inv; + edict_t *edict; + int attack; + int altattack; + int weap3; + int weap4; + int leanLeft; + int leanRight; + int cinematicFreeze; + int rejectSniper; + float *weaponkick_angles; // Really, a vec3_t. + float framescale; + int doReload; +}; + +//------------------------------------------------------------------------ +// +// Weapon inline access type funcs... +// +//------------------------------------------------------------------------ + +_inline inven_c *inven(sharedEdict_t &ent) +{ + return ent.inv; +} + +_inline wAnim_c *wAnim(sharedEdict_t &ent) +{ + return inven(ent)->getAnimInfo(); +} + +//------------------------------------------------------------------------ +// +// Misc +// +//------------------------------------------------------------------------ + +void W_PrecacheViewWeaponModels(int types); +void W_UncacheViewWeaponModels(void); + +extern weaponInfo_c *weapInfo[SFW_NUM_WEAPONS]; + +#endif // __W_WEAPONS_H diff --git a/Source/Game/qcommon/GSQFile.h b/Source/Game/qcommon/GSQFile.h new file mode 100644 index 0000000..02cdbac --- /dev/null +++ b/Source/Game/qcommon/GSQFile.h @@ -0,0 +1,125 @@ +#ifndef __GSQFILE_H_ +#define __GSQFILE_H_ + +// Glurk - do something about this mess - it's vile -MW. +class IGhoulObj; +typedef unsigned short int GhoulID; +class IGhoulInst; + +/* +============================================================== + +GHOUL FILESYSTEM STUFF + +============================================================== +*/ + +int FindGSQFile(char *gsqdir, char *gsqfile, void **buffer); +bool ReadGsqEntry(int &filesize, char **tdata, char *seqname); +void PrecacheGSQFile(char *dirname, char *gsq_file, IGhoulObj *object); +int RegisterGSQSequences(char *gsqdir, char *subclass, IGhoulObj *object); +void TurnOffPartsFromGSQFile(char *dirname, char *poff_file, IGhoulObj *this_object, IGhoulInst *this_inst); + + + +#define MAX_TEAMNAME_LENGTH 50 +#define MAX_MATERIALNAME_LENGTH 50 +#define MAX_SKINNAME_LENGTH 100 +#define MAX_PARTNAME_LENGTH 50 +#define MAX_MODELINFONAME_LENGTH 100 +#define MAX_GHBNAME_LENGTH 100 +#define MAX_GSQNAME_LENGTH 100 +#define MAX_FACESETNAME_LENGTH 50 +#define MAX_DIRECTORYNAME_LENGTH 100 +#define MAX_MENUSTRING_LENGTH 200 + +//public player-model textfile stuff (sorry, i didn't want to make a GPMFile_public.h): +class TeamInfoC +{ +public: + char name[MAX_TEAMNAME_LENGTH]; +}; + +//i'm not sure how this is going to be handled--a directory should be enough, but in case there's more i'm separating it out now. +class VoiceInfoC +{ +public: + char voiceDir[MAX_DIRECTORYNAME_LENGTH];//injury & death directory +}; + +class SkinInfoC +{ +public: + char matName[MAX_MATERIALNAME_LENGTH]; + char skinName[MAX_SKINNAME_LENGTH]; + char partName[MAX_PARTNAME_LENGTH];//this may have to be taken out because it could blow texture memory through the ceiling, but it's just too cool for me to leave it off to begin with. i'll demonstrate shortly. +}; + +//some of the player types require twiddling with a part or two beyond what the typical guy of the same general type would have on/off (e.g. mohawks) +class ExtraPartToggleInfoC +{ +public: + char partName[MAX_PARTNAME_LENGTH]; + bool partState;//true=on;false=off +}; + +class BoltOnInfoC +{ +public: + float scale; + char parentBolt[MAX_PARTNAME_LENGTH];//bolts are parts + char childBolt[MAX_PARTNAME_LENGTH];//bolts are parts + char childModelInfo[MAX_MODELINFONAME_LENGTH];//this should be the name of a modelinfo file. maybe .gbm instead of .gpm? +}; + +//Don't ever new one of these! This is just the interface class to let you call the functions that are available in the class that's really returned by NewPlayerModelInfo. +class IPlayerModelInfoC +{ +public: + //will load the player description textfile, and set all info according to that. called by constructor, but should be able to recall for a new model. + virtual void Init(char *newFileName){} + + // Returns and sets the object associated with this model + virtual IGhoulObj *GetObject(void) const { return(NULL); } + virtual void SetObject(IGhoulObj *obj) { } + + //the number of skins that need to be set for this guy + virtual int GetNumSkins(void){return 0;} + //the number of bolt-ons available for this guy + virtual int GetNumBoltOns(void){return 0;} + //the number of extra twiddles to part on/off state that need to be done for this guy + virtual int GetNumPartToggles(void){return 0;} + + //the ghb's and the gsq's should be in this directory--this is mostly to be game_ghoul-friendly + virtual char *GetGHBDir(void){return "";} + //this is the ghb the menu can use (if we can get the menu using the game ghb, this is meaningless) + virtual char *GetMenuGHB(void){return "";} + //this is the ghb the game needs to load (the menu might be able to use it too, but we'll not hold our breath on that) + virtual char *GetGameGHB(void){return "";} + + //this is the gsq file listing the sequences to register--use this to get the _poff .gsq too(game ghb only) + virtual char *GetSeqGSQ(void){return "";} + //this is the face base, to be used by the body for changing expressions + virtual char *GetFaceSet(void){return "";} + + //these guys return true if they filled the class passed in, false if they failed for some reason + virtual bool GetTheMenuString(char *putstringhere){return false;} + virtual bool GetTeamInfo(TeamInfoC &putteamhere){return false;} + virtual bool GetVoiceInfo(VoiceInfoC &putvoiceinfohere){return false;} + virtual bool GetSkin(int skinnum, SkinInfoC &putskinhere){return false;} + virtual bool GetBoltOn(int boltonnum, BoltOnInfoC &putboltonhere){return false;} + virtual bool GetPartToggle(int togglenum, ExtraPartToggleInfoC &puttogglehere){return false;} + + virtual bool IsLoaded(void){return false;} + + virtual ~IPlayerModelInfoC(){} +}; + + + //if you pass in a NULL pointer to this, it won't set anything up (no file-loading, nothing) + //so if you want to create one of these guys but don't know the file yet, pass in NULL, don't pass in trash + +//urh! you need to delete this when you're done with it! +IPlayerModelInfoC *NewPlayerModelInfo(char *modelname); + +#endif // __GSQFILE_H_ \ No newline at end of file diff --git a/Source/Game/qcommon/configstring.h b/Source/Game/qcommon/configstring.h new file mode 100644 index 0000000..d047fad --- /dev/null +++ b/Source/Game/qcommon/configstring.h @@ -0,0 +1,46 @@ +#pragma once + +// +// config strings are a general means of communication from +// the server to all connected clients. +// Each config string can be at most MAX_QPATH characters. +// +#define CS_NAME 0 +#define CS_CDTRACK 1 +#define CS_SKY 2 +#define CS_SKYAXIS 3 // %f %f %f format +#define CS_SKYROTATE 4 +#define CS_SKYCOLOR 5 +#define CS_MAPCHECKSUM 6 // checksum string + +#define CS_CTF_BLUE_STAT 8 +#define CS_CTF_RED_STAT 9 +#define CS_CTF_BLUE_TEAM 10 +#define CS_CTF_RED_TEAM 11 +#define CS_AMBSET 12 +#define CS_MUSICSET 13 +#define CS_TERRAINNAME 14 +#define CS_SCREENEFFECT 15 +#define CS_DEBRISPRECACHE 16 + +#define CS_MAXCLIENTS 31 + +#define CS_SHOWNAMES 32 +#define CS_SHOWTEAMS 33 +#define CS_SHOWINFOINDARK 34 + +#define CS_MODELS 35 + +#define CS_SOUNDS (CS_MODELS+MAX_MODELS) +#define CS_EFFECTS (CS_SOUNDS+MAX_SOUNDS) +#define CS_IMAGES (CS_EFFECTS+MAX_EFPACKS) +#define CS_LIGHTS (CS_IMAGES+MAX_IMAGES) +#define CS_PLAYERSKINS (CS_LIGHTS+MAX_LIGHTSTYLES) +#define CS_PLAYERICONS (CS_PLAYERSKINS+MAX_CLIENTS) +#define CS_STRING_PACKAGES (CS_PLAYERICONS+MAX_PLAYERICONS) +#define CS_WELCOME (CS_STRING_PACKAGES+MAX_STRING_PACKAGES) +#define CS_GHOULFILES (CS_WELCOME + 4) +#define CS_CONTROL_FLAGS (CS_GHOULFILES+MAX_GHOULFILES) +#define MAX_CONFIGSTRINGS (CS_CONTROL_FLAGS+10) + +// end \ No newline at end of file diff --git a/Source/Game/qcommon/ef_flags.h b/Source/Game/qcommon/ef_flags.h new file mode 100644 index 0000000..2d3495c --- /dev/null +++ b/Source/Game/qcommon/ef_flags.h @@ -0,0 +1,57 @@ +#pragma once + +// entity_state_t->effects +// Effects are things handled on the client side (lights, particles, frame animations) +// that happen constantly on the given entity. +// An entity that has effects will be sent to the client +// even if it has a zero index model. +#define EF_ROTATE 0x00000001 // object (inc. boltons) roates with specifed ang velocities. +#define EF_ANIM01 0x00000008 // automatically cycle between frames 0 and 1 at 2 hz +#define EF_ANIM23 0x00000010 // automatically cycle between frames 2 and 3 at 2 hz +#define EF_ANIM_ALL 0x00000020 // automatically cycle through all frames at 2hz +#define EF_ANIM_ALLFAST 0x00000040 // automatically cycle through all frames at 10hz +#define EF_TELEPORTER 0x00000080 // particle fountain +#define EF_AMB_SOUND_SET 0x00000100 // this object has an ambient sound set attached to it... + // interpret the s.sound field as the set index number +#define EF_NO_BULLET 0x00000200 // bmodel leaves no bullet hole +#define EF_EXPLODING 0x00000400 // obj is exploding +#define EF_INVIS_PULSE 0x00000800 // For invulnerability +#define EF_NOTQUAD 0x00001000 // 2 frame buttons rather than the default 4 +#define EF_SIMPLEROTATE 0x00002000 // For simple objects that rotate about Z with const. ang. vel. + +#define EF_KILL_EFT 0x00004000 // Signal Nathan's effect system to kill all effects on this entity. +#define EF_FADE 0x00008000 // For corpse fading + +// entity_state_t->renderfx flags +#define RF_MINLIGHT 0x00000001 // allways have some light (viewmodel) +#define RF_VIEWERMODEL 0x00000002 // don't draw through eyes, only mirrors +#define RF_WEAPONMODEL 0x00000004 // only draw through eyes +#define RF_FULLBRIGHT 0x00000008 // allways draw full intensity +#define RF_DEPTHHACK 0x00000010 // for view weapon Z crunching +#define RF_TRANSLUCENT 0x00000020 +#define RF_FRAMELERP 0x00000040 + +#define RF_SOUNDONLY 0x00000080 // don't draw this - sent to the client solely for sound purposes + +#define RF_CUSTOMSKIN 0x00000100 // skin is an index in image_precache +#define RF_GLOW 0x00000200 // pulse lighting for bonus items +#define RF_BMODEL 0x00000400 // Set if this is a bmodel +#define RF_ALPHA_BMODEL 0x00000800 // Set if bmodel has alpha textures + +#define RF_GHOUL_SHADOW 0x00001000 // This ghoul model should always have a shadow associated with it + +#define RF_GHOUL 0x00400000 // Ghoul model +#define RF_STATICLIT 0x01000000 // world light doesn't need to be re-calced... +#define RF_LIGHTONCE 0x04000000 // New lighting options for speed reasons... +#define RF_NO_DYNA 0x08000000 // "" +#define RF_LIGHT_FASTEST 0x10000000 // "" +#define RF_LIGHT_BEST 0x20000000 // "" +#define RF_LIGHT_FROM_TINT 0x40000000 // "" + +#define RF_TRANS_ANY (RF_TRANSLUCENT | RF_ALPHA_BMODEL) + +// player_state_t->refdef flags +#define RDF_UNDERWATER 0x01 // warp the screen as apropriate +#define RDF_NOWORLDMODEL 0x02 // used for player configuration screen +#define RDF_GOGGLES 0x04 // Low light goggles. + diff --git a/Source/Game/qcommon/fields.h b/Source/Game/qcommon/fields.h new file mode 100644 index 0000000..c23aefd --- /dev/null +++ b/Source/Game/qcommon/fields.h @@ -0,0 +1,53 @@ +#pragma once + +// +// fields are needed for spawning from the entity string +// and saving / loading games +// +#define FFL_SPAWNTEMP 1 +#define MAX_GHOULINST_SIZE 16384 + +#define FOFS(x) (int)&(((edict_t *)0)->x) +#define STOFS(x) (int)&(((spawn_temp_t *)0)->x) +#define LLOFS(x) (int)&(((level_locals_t *)0)->x) +#define CLOFS(x) (int)&(((gclient_t *)0)->x) + +typedef enum +{ + F_INT, + F_SHORT, + F_FLOAT, + F_STRING, // string + F_VECTOR, + F_ANGLEHACK, // One var, presumed to be index 1 of vector + F_NULL, // A ptr to null out + F_EDICT, // Edict pointer handling + F_ITEM, // Item pointer handling + F_MMOVE, // Mmove pointer handling + F_OSD, // ObjectSpawnData object handling + F_CLIENT, // Client pointer handling + F_BOOLPTR, // Generic pointer that is recreated later + + F_THINK_F, // All types of function pointers + F_BLOCKED_F, + F_TOUCH_F, + F_USE_F, + F_PLUSE_F, + F_PAIN_F, + F_DIE_F, + F_RESPAWN_F, + + F_IGNORE +} fieldtype_t; + +typedef struct +{ + char *name; + int ofs; + fieldtype_t type; + int flags; +} field_t; + +extern field_t fields[]; + +// end diff --git a/Source/Game/qcommon/mathlib.h b/Source/Game/qcommon/mathlib.h new file mode 100644 index 0000000..d5cfcbe --- /dev/null +++ b/Source/Game/qcommon/mathlib.h @@ -0,0 +1,283 @@ +#pragma once + +/* +============================================================== + +MATHLIB + +============================================================== +*/ + +extern vec3_t vec3_origin; +extern vec3_t vec3_up; +extern vec3_t vec3_down; + +#define Macro_VectorCopy(a,b) (b[0]=a[0],b[1]=a[1],b[2]=a[2]) + +_inline void VectorSubtract(vec3_t a, vec3_t b, vec3_t c) +{ + c[0] = a[0] - b[0]; + c[1] = a[1] - b[1]; + c[2] = a[2] - b[2]; +} + +_inline void VectorAdd(vec3_t a, vec3_t b, vec3_t c) +{ + c[0] = a[0] + b[0]; + c[1] = a[1] + b[1]; + c[2] = a[2] + b[2]; +} + +_inline void VectorMakePos(vec3_t in, vec3_t out) +{ + out[0] = fabs(in[0]); + out[1] = fabs(in[1]); + out[2] = fabs(in[2]); +} + +_inline void VectorCopy(vec3_t in, vec3_t out) +{ + out[0] = in[0]; + out[1] = in[1]; + out[2] = in[2]; +} + +__inline vec_t DotProduct (const vec3_t v1, const vec3_t v2) +{ + return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]; +} + +_inline vec_t VectorLengthSquared(vec3_t v) +{ + float length; + + length = DotProduct(v, v); + + return length; +} + +_inline void VectorClear (vec3_t in) +{ + in[0] = 0; + in[1] = 0; + in[2] = 0; +} + +_inline void VectorSet (vec3_t in, vec_t x, vec_t y, vec_t z) +{ + in[0] = x; + in[1] = y; + in[2] = z; +} + +_inline void VectorInverse (vec3_t v) +{ + v[0] = -v[0]; + v[1] = -v[1]; + v[2] = -v[2]; +} + +_inline void VectorNegate (vec3_t in, vec3_t out) +{ + out[0] = -in[0]; + out[1] = -in[1]; + out[2] = -in[2]; +} + +_inline void VectorScale (vec3_t in, vec_t scale, vec3_t out) +{ + out[0] = in[0] * scale; + out[1] = in[1] * scale; + out[2] = in[2] * scale; +} + +_inline void VectorRadiansToDegrees (vec3_t in, vec3_t out) +{ + out[0] = in[0] * RADTODEG; + out[1] = in[1] * RADTODEG; + out[2] = in[2] * RADTODEG; +} + +_inline void VectorDegreesToRadians (vec3_t in, vec3_t out) +{ + out[0] = in[0] * DEGTORAD; + out[1] = in[1] * DEGTORAD; + out[2] = in[2] * DEGTORAD; +} + +_inline void VectorScaleByVector (vec3_t in, vec3_t scale, vec3_t out) +{ + out[0] = in[0] * scale[0]; + out[1] = in[1] * scale[1]; + out[2] = in[2] * scale[2]; +} + +_inline void Vec3SubtractAssign(vec3_t value, vec3_t subFrom) +{ + subFrom[0] -= value[0]; + subFrom[1] -= value[1]; + subFrom[2] -= value[2]; +} + +_inline void Vec3AddAssign(vec3_t value, vec3_t addTo) +{ + addTo[0] += value[0]; + addTo[1] += value[1]; + addTo[2] += value[2]; +} + +_inline void Vec3MultAssign(vec3_t value, vec3_t multBy) +{ + multBy[0] *= value[0]; + multBy[1] *= value[1]; + multBy[2] *= value[2]; +} + +_inline void Vec3ScaleAssign(vec_t value, vec3_t scaleBy) +{ + scaleBy[0] *= value; + scaleBy[1] *= value; + scaleBy[2] *= value; +} + +_inline VectorAverage(vec3_t mins, vec3_t maxs, vec3_t average) +{ + average[0] = (mins[0] + maxs[0]) * 0.5f; + average[1] = (mins[1] + maxs[1]) * 0.5f; + average[2] = (mins[2] + maxs[2]) * 0.5f; +} + +_inline bool FloatIsZeroEpsilon(float f) +{ + return (fabs(f) < FLOAT_ZERO_EPSILON); +} + +_inline bool FloatIsZero(float f, float epsilon) +{ + return (fabs(f) < epsilon); +} + +_inline bool Vec3EqualsEpsilon(vec3_t v1, vec3_t v2) +{ + if(!FloatIsZeroEpsilon(v1[0] - v2[0]) || !FloatIsZeroEpsilon(v1[1] - v2[1]) || !FloatIsZeroEpsilon(v1[2] - v2[2])) + { + return false; + } + return true; +} + +_inline bool Vec3IsZero(vec3_t vec) +{ + return !( vec[0] != 0.0 || vec[1] != 0.0 || vec[2] != 0.0 ); +} + +_inline bool Vec3NotZero(vec3_t vec) +{ + return ( vec[0] != 0.0 || vec[1] != 0.0 || vec[2] != 0.0 ); +} + +_inline bool VectorCompare (vec3_t v1, vec3_t v2) +{ + if (v1[0] != v2[0] || v1[1] != v2[1] || v1[2] != v2[2]) + { + return(false); + } + return(true); +} + +_inline void Vector_GetHalfWayPoint(vec3_t start, vec3_t end, vec3_t halfway) +{ + halfway[0] = ((end[0] - start[0])/2) + start[0]; + halfway[1] = ((end[1] - start[1])/2) + start[1]; + halfway[2] = ((end[2] - start[2])/2) + start[2]; +} + +_inline void VectorMA (vec3_t veca, float scale, vec3_t vecb, vec3_t vecc) +{ + vecc[0] = veca[0] + scale * vecb[0]; + vecc[1] = veca[1] + scale * vecb[1]; + vecc[2] = veca[2] + scale * vecb[2]; +} + +float flrand(float min, float max); +int irand(int min, int max); + +void ClearBounds (vec3_t mins, vec3_t maxs); +void AddPointToBounds (vec3_t v, vec3_t mins, vec3_t maxs); +vec_t VectorLength (vec3_t v); +void CrossProduct (vec3_t v1, vec3_t v2, vec3_t cross); +vec_t VectorNormalize (vec3_t v); // returns vector length +vec_t VectorSeparation(vec3_t v0, vec3_t v1); + +void R_ConcatRotations (float in1[3][3], float in2[3][3], float out[3][3]); +void R_ConcatTransforms (float in1[3][4], float in2[3][4], float out[3][4]); + +void AngleVectors (vec3_t angles, vec3_t forward, vec3_t right, vec3_t up); +int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *plane); +float NormalizeAngle(float angle); + +_inline float LerpAngle (float a2, float a1, float frac) +{ + if (a1 - a2 > 180) + { + a1 -= 360; + } + else if (a1 - a2 < -180) + { + a1 += 360; + } + + return a2 + frac * (a1 - a2); +} + +_inline float anglemod(float a) +{ + return (360.0/65536) * ((int)(a*(65536/360.0)) & 65535); +} + +_inline int minimum(int x, int y) +{ + if(x < y) + { + return(x); + } + else + { + return(y); + } +} + +_inline int maximum(int x, int y) +{ + if(x > y) + { + return(x); + } + else + { + return(y); + } +} + +#define BOX_ON_PLANE_SIDE(emins, emaxs, p) \ + (((p)->type < 3)? \ + ( \ + ((p)->dist <= (emins)[(p)->type])? \ + 1 \ + : \ + ( \ + ((p)->dist >= (emaxs)[(p)->type])?\ + 2 \ + : \ + 3 \ + ) \ + ) \ + : \ + BoxOnPlaneSide( (emins), (emaxs), (p))) + + +void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal ); +void PerpendicularVector( vec3_t dst, const vec3_t src ); +void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees ); + +// end \ No newline at end of file diff --git a/Source/Game/qcommon/matrix4.h b/Source/Game/qcommon/matrix4.h new file mode 100644 index 0000000..207986b --- /dev/null +++ b/Source/Game/qcommon/matrix4.h @@ -0,0 +1,77 @@ +#if !defined(MATRIX4_INC) +#define MATRIX4_INC + +#include "vect3.h" +#include +#include + +#pragma warning( disable : 4244) +extern const float Pi; +extern const float Half_Pi; + + +#define MATFLAG_IDENTITY (1) +class Matrix4 +{ + float m[4][4]; + int flags; +public: + Matrix4() {flags=0;} + Matrix4(const Matrix4 &o); + float* operator[](int i) {return m[i];flags=0;} + const float* operator[](int i) const {return m[i];} + void SetElem(int r,int c,float v) {m[r][c]=v;flags=0;} + const float &Elem(int r,int c) const {return m[r][c];} + void SetFromMem(const float *mem) {memcpy(m,mem,sizeof(float)*16);CalcFlags();} + void GetFromMem(float *mem) const {memcpy(mem,m,sizeof(float)*16);} + void Identity(); + void Zero(); + int CalcFlags(); + int GetFlags() const {return flags;} + bool IntegrityCheck() const; + void Translate(const float tx,const float ty,const float tz); + void Translate(const Vect3 &t); + void Rotate(int axis,const float theta); + void Rotate(const float rx,const float ry,const float rz); + void Rotate(const Vect3 v); + void Scale(const float sx,const float sy,const float sz); + void Scale(const float sx); + void Concat(const Matrix4 &m1,const Matrix4 &m2); + void Interp(const Matrix4 &m1,float s1,const Matrix4 &m2,float s2); + void Interp(const Matrix4 &m1,const Matrix4 &m2,float s1); + void XFormPoint(Vect3 &dest,const Vect3 &src) const; + float HXFormPoint(Vect3 &dest,const Vect3 &src) const; + void HXFormPointND(float *dest,const float *src) const; + void XFormVect(Vect3 &dest,const Vect3 &src) const; + void XFormVectTranspose(Vect3 &dest,const Vect3 &src) const; + void SetRow(int i,const Vect3 &t); + void SetColumn(int i,const Vect3 &t); + void SetRow(int i); + void SetColumn(int i); + void SetFromDouble(double *d); + void MultiplyColumn(int i,float f); + float GetColumnLen(int i); + void Inverse(const Matrix4 &old); + void OrthoNormalInverse(const Matrix4 &old); + void FindFromPoints(const Vect3 base1[4],const Vect3 base2[4]); + void MakeEquiscalar(); + float Det(); + float MaxAbsElement(); + void GetRow(int r,Vect3 &v) const {v.x()=m[r][0];v.y()=m[r][1];v.z()=m[r][2];} + void GetColumn(int r,Vect3 &v) const {v.x()=m[0][r];v.y()=m[1][r];v.z()=m[2][r];} + void Transpose(); + bool operator== (const Matrix4& t) const; +}; + + +int GetTextureSystem( + const Vect3 &p0,const Vect3 &uv0, //vertex 0 + const Vect3 &p1,const Vect3 &uv1, //vertex 1 + const Vect3 &p2,const Vect3 &uv2, //vertex 2 + const Vect3 &n, // normal vector for triangle + Vect3 &M, // returned gradient wrt u + Vect3 &N, // returned gradient wrt v + Vect3 &P); // returned location in world space where u=v=0 + + +#endif \ No newline at end of file diff --git a/Source/Game/qcommon/music.h b/Source/Game/qcommon/music.h new file mode 100644 index 0000000..c6efb0d --- /dev/null +++ b/Source/Game/qcommon/music.h @@ -0,0 +1,10 @@ +#pragma once + +#define MUSIC_UNSET 0 +#define MUSIC_NONE 1 +#define MUSIC_WANDER 2 +#define MUSIC_ACTION 3 +#define MUSIC_OFFSET 3 +#define MIN_ACTION_MUSIC_TIME 4 + +// end \ No newline at end of file diff --git a/Source/Game/qcommon/p_heights.h b/Source/Game/qcommon/p_heights.h new file mode 100644 index 0000000..dccfde4 --- /dev/null +++ b/Source/Game/qcommon/p_heights.h @@ -0,0 +1,20 @@ +#pragma once + +#define EYEBALL_HEIGHT 35 //26 //22 <-- old values +#define DUCK_EYEHEIGHT 0 + + +/* +dk -- 2/4/00 + +To change the view height: + +The viewheight is sent from the client to the server via MSG_WriteChar and and MSG_ReadChar, which write/read +signed bytes. Thus, we have a range of -128 - 127. The view height in actual world units is defined above. Then there is +some clamping done in SV_CalcViewOffset1stPerson in p_view.cpp. The relevant variable is v. I've got it set up now to clamp +between -11 and 40. Now to transmit this from server to client, I subtract 14.6 on the serer side, and then multiply by 5. +This gives us the desired range of -128 to 127. Of course, on the client, I then multiply by .2 and add 14.6. + +*/ +// end + diff --git a/Source/Game/qcommon/palette.h b/Source/Game/qcommon/palette.h new file mode 100644 index 0000000..25f82d8 --- /dev/null +++ b/Source/Game/qcommon/palette.h @@ -0,0 +1,86 @@ +#pragma once + +/************************************************************** + * palette info + **************************************************************/ + +class paletteRGBA_c +{ +public: + paletteRGBA_t color; + + paletteRGBA_c(void) { color.c = 0xffffffff; } + paletteRGBA_c(byte r, byte g, byte b) { color.r = r; color.g = g; color.b = b; color.a = 0xff; } + paletteRGBA_c(byte r, byte g, byte b, byte a) { color.r = r; color.g = g; color.b = b; color.a = a; } + paletteRGBA_c(unsigned c) { color.c = c; } + paletteRGBA_c(byte *c) { color.r = c[0]; color.g = c[1]; color.b = c[2]; color.a = c[3]; } + paletteRGBA_c(paletteRGBA_t c) { color = c; } + paletteRGBA_c(char *s) { color.c = strtoul(s, NULL, 0); } + paletteRGBA_c(const char *s) { color.c = strtoul(s, NULL, 0); } + paletteRGBA_c(float *shade) + { + color.r = Q_ftol(shade[0] * 255.0); + color.g = Q_ftol(shade[1] * 255.0); + color.b = Q_ftol(shade[2] * 255.0); + color.a = 255; + } + paletteRGBA_c brighten() + { + paletteRGBA_c col; + + col.color.r = ClampI(color.r * 1.30, 0, 255); + col.color.g = ClampI(color.g * 1.30, 0, 255); + col.color.b = ClampI(color.b * 1.30, 0, 255); + col.color.a = color.a; + return(col); + } + paletteRGBA_c darken() + { + paletteRGBA_c col; + + col.color.r = ClampI(color.r * 0.70, 0, 255); + col.color.g = ClampI(color.g * 0.70, 0, 255); + col.color.b = ClampI(color.b * 0.70, 0, 255); + col.color.a = color.a; + return(col); + } +}; + +#define P_DONT_USE0 "\000" /* DONT USE !! */ + +#define P_WHITE "\001" +#define P_RED "\002" +#define P_GREEN "\003" +#define P_YELLOW "\004" +#define P_BLUE "\005" +#define P_PURPLE "\006" +#define P_CYAN "\007" + +#define P_BLACK "\010" +#define P_HWHITE "\011" +#define P_DONT_USE1 "\012" /* DONT USE !! */ +#define P_HRED "\013" +#define P_HGREEN "\014" +#define P_DONT_USE2 "\015" /* DONT USE !! */ +#define P_HYELLOW "\016" +#define P_HBLUE "\017" + +#define P_CAMOBROWN "\020" +#define P_CAMOGREEN "\021" +#define P_SEAGREEN "\022" +#define P_SEABLUE "\023" +#define P_METAL "\024" +#define P_DBLUE "\025" +#define P_DPURPLE "\026" +#define P_DGREY "\027" + +#define P_PINK "\030" +#define P_BLOODRED "\031" +#define P_RUSSET "\032" +#define P_BROWN "\033" +#define P_TEXT "\034" +#define P_BAIGE "\035" +#define P_LBROWN "\036" +#define P_ORANGE "\037" + +// end \ No newline at end of file diff --git a/Source/Game/qcommon/pmove.h b/Source/Game/qcommon/pmove.h new file mode 100644 index 0000000..679c7d7 --- /dev/null +++ b/Source/Game/qcommon/pmove.h @@ -0,0 +1,63 @@ +#pragma once + +// player_state_t is the information needed in addition to pmove_state_t +// to rendered a view. There will only be 10 player_state_t sent each second, +// but the number of pmove_state_t changes will be relative to client +// frame rates + +typedef struct +{ + pmove_state_t pmove; // for prediction + + // These fields do not need to be communicated bit-precise. + + vec3_t viewangles; // for fixed views + vec3_t viewoffset; // add to pmovestate->origin + vec3_t kick_angles; // add to view direction to get render angles, set by falling, pain effects, etc + vec3_t weaponkick_angles; // add to view direction to get render angles, set by weapons + + // For remote camera views. + + vec3_t remote_vieworigin, + remote_viewangles; + int remote_id; + byte remote_type; + + // View weapon stuff. + + IGhoulInst *gun; + short gunUUID; // n/w friendly GHOUL instance 'pointer' + short gunType; // SFW_xxx + short gunClip; // ammo in clip + short gunAmmo; // total ammo for gun + byte gunReload; // reloaded gun + byte restart_count; // needed to detect restart of weapon predn. + byte buttons_inhibit; // mask of buttons to inhibit (for weapon CP) + + //apologies to all for the mess--testing player body technique --ss + IGhoulInst *bod; + short bodUUID; // bleah + + // View effect stuff. + + float blend[4]; // rgba full screen effect + float fov; // horizontal field of view + int rdflags; // refdef flags + + // sound state stuff + short soundID; // General ambient sounds + byte musicID; // ID of the music to play + + // Staus bar stuff. + + short damageLoc; // for damage location + short damageDir; // for damage direction for brackets + short stats[MAX_STATS]; // fast status bar updates + byte dmRank; // Rank in DM. + byte dmRankedPlyrs; // No of ranked players in DM (i.e. excl. spectators). + byte spectatorId; // Index [1-(MAXCLIENTS-1)] of who we're chasing in spectator chasecam. + + byte cinematicfreeze; // Shows if currently in a cinematic +} player_state_t; + +// end \ No newline at end of file diff --git a/Source/Game/qcommon/qcommon.h b/Source/Game/qcommon/qcommon.h new file mode 100644 index 0000000..74291c8 --- /dev/null +++ b/Source/Game/qcommon/qcommon.h @@ -0,0 +1,828 @@ +// qcommon.h -- definitions common between client and server, but not game.dll + +#ifndef __QCOMMON +#define __QCOMMON + +#include "../gamecpp/q_shared.h" +#include "pmove.h" +#include "vect3.h" + +//============================================================================ + +void SZ_Init (sizebuf_t *buf, byte *data, int length); +void SZ_Clear (sizebuf_t *buf); +void *SZ_GetSpace (sizebuf_t *buf, int length); +void SZ_Write (sizebuf_t *buf, const void *data, int length); +void SZ_Print (sizebuf_t *buf, char *data); // strcats onto the sizebuf + +//============================================================================ + +struct usercmd_s; +struct entity_state_s; + +void MSG_WriteChar (sizebuf_t *sb, int c); +void MSG_WriteByte (sizebuf_t *sb, int c); +void MSG_WriteShort (sizebuf_t *sb, int c); +void MSG_WriteWord (sizebuf_t *sb, int c); +void MSG_WriteLong (sizebuf_t *sb, int c); +void MSG_WriteFloat (sizebuf_t *sb, float f); +void MSG_WriteString (sizebuf_t *sb, char *s); +void MSG_WriteCoord (sizebuf_t *sb, float f); +void MSG_WritePos (sizebuf_t *sb, vec3_t pos); +void MSG_WriteAngle (sizebuf_t *sb, float f); +void MSG_WriteAngle16 (sizebuf_t *sb, float f); +void MSG_WriteDeltaUsercmd (sizebuf_t *sb, struct usercmd_s *from, struct usercmd_s *cmd); +void WriteBits(sizebuf_t *msg, int bits); +void MSG_WriteDeltaEntity (struct entity_state_s *from, struct entity_state_s *to + , sizebuf_t *msg, qboolean force); +void MSG_WriteDir (sizebuf_t *sb, vec3_t vector); +void MSG_WriteData (sizebuf_t *sb, unsigned char *data, int size); + +int GetNearestByteNormal(vec3_t dir); + +void MSG_BeginReading (sizebuf_t *sb); + +int MSG_ReadChar (sizebuf_t *sb); +int MSG_ReadByte (sizebuf_t *sb); +int MSG_ReadShort (sizebuf_t *sb); +int MSG_ReadWord (sizebuf_t *sb); +int MSG_ReadLong (sizebuf_t *sb); +float MSG_ReadFloat (sizebuf_t *sb); +char *MSG_ReadString (sizebuf_t *sb); +char *MSG_ReadStringLine (sizebuf_t *sb); + +float MSG_ReadCoord (sizebuf_t *sb); +void MSG_ReadPos (sizebuf_t *sb, vec3_t pos); +float MSG_ReadAngle (sizebuf_t *sb); +float MSG_ReadAngle16 (sizebuf_t *sb); +void MSG_ReadDeltaUsercmd (sizebuf_t *sb, struct usercmd_s *from, struct usercmd_s *cmd); + +void MSG_ReadDir (sizebuf_t *sb, vec3_t vector); +void MSG_ReadData (sizebuf_t *sb, unsigned char *buffer, int size); + +//============================================================================ + +extern short BigShort (short l); +extern int BigLong (int l); +extern float BigFloat (float l); + +//============================================================================ + + +int COM_Argc (void); +char *COM_Argv (int arg); // range and null checked +void COM_ClearArgv (int arg); +int COM_CheckParm (char *parm); +void COM_AddParm (char *parm); + +void COM_Init (void); +void COM_InitArgv (int argc, char **argv); + +char *CopyString (const char *in); + +//============================================================================ + +void Info_Print (char *s); + + +/* crc.h */ + +void CRC_Init(unsigned short *crcvalue); +void CRC_ProcessByte(unsigned short *crcvalue, byte data); +unsigned short CRC_Value(unsigned short crcvalue); +int CRC_Block (byte *start, int count); + + + + +/* +============================================================== + +PROTOCOL + +============================================================== +*/ + +// protocol.h -- communications protocols + +#define PROTOCOL_VERSION 32 + +/* +--------------------------------------------- +Legend to help explain PORT designations -MW. + +Ims = id master server +Q2c = Q2 game client +Q2s = Q2 game server + +where -> indicates direction of comms. +--------------------------------------------- +*/ + +// SOF +#define PORT_CLIENT 28901 // Opened on Q2c. Q2s -> Q2c : frame updates etc. +#define PORT_SERVER 28910 // Opened on Q2s. Q2c -> Q2s : client commands, user info etc. +#define PORT_GAMESPY 28911 // Used as default port for GameSpy + +extern cvar_t *public_server; // should heartbeats be sent +extern struct sockaddr server_address; +extern int server_address_length; + + +typedef enum ChallengeTypes +{ + CHALLENGE_FREE = 0, + CHALLENGE_WAITING, + CHALLENGE_INIT, + CHALLENGE_RESPONSE1, + CHALLENGE_RESPONSE2, + CHALLENGE_OK +}; + +//========================================= + +#define UPDATE_BACKUP 16 // copies of entity_state_t to keep buffered + // must be power of two +#define UPDATE_MASK (UPDATE_BACKUP-1) + + + +//================== +// the svc_strings[] array in cl_parse.c should mirror this +//================== + +// +// server to client +// +enum svc_ops_e +{ + svc_bad, + + // these ops are known to the game dll + svc_temp_entity, + svc_layout, + svc_UNUSED, + svc_sound_info, + svc_effect, + svc_equip, // buying, equipping items messages + + // the rest are private to the client and server + svc_nop, + svc_disconnect, + svc_reconnect, + svc_sound, // + svc_print, // [byte] id [string] null terminated string + svc_nameprint, // [byte] client num, [byte] team num, [string] null terminated string + svc_stufftext, // [string] stuffed into client's console buffer, should be \n terminated + svc_serverdata, // [long] protocol ... + svc_configstring, // [short] [string] + svc_spawnbaseline, + svc_centerprint, // [string] to put in center of the screen + svc_captionprint, // line number of [string] in strings.txt file -- ACTUALLY, JUST THE STRING + svc_download, // [short] size [size bytes] + svc_playerinfo, // variable + svc_packetentities, // [...] + svc_deltapacketentities, // [...] + svc_frame, + svc_culledEvent, + svc_damagetexture, // [short] surface index [byte] level + svc_ghoulreliable, // [short] size [size bytes] + svc_ghoulunreliable, // [short] size [size bytes] + svc_ric, // [byte] num of RICs [...] the actual RICs + svc_restart_predn, // [byte] restarts prediction + svc_rebuild_pred_inv, // [byte] [inven_c] syncs client inven to server one + svc_countdown, // [byte] time to countdown + svc_cinprint, // + svc_playernamecols, // [byte] num of bytes [string] array of (client,color) pairs + svc_sp_print, // [short] string index [color] + svc_removeconfigstring, // [short] + svc_sp_print_data_1, // [short] string index [byte] count of data bytes [data bytes] [color] + svc_sp_print_data_2, // [short] string index [short] count of data bytes [data bytes] [color] + svc_welcomeprint, // sent down so welcome message is displayed at entry to a deathmatch server + svc_sp_print_obit, // send down the obituaries. Same format as svc_sp_print_data_1, but needs to be different packet type for client filter + svc_force_con_notify, // force a console clear - required for CTF when the game is over +}; + +//============================================== + +// +// client to server +// +enum clc_ops_e +{ + clc_bad, + clc_nop, + clc_move, // [[usercmd_t] + clc_userinfo, // [[userinfo string] + clc_stringcmd, // [string] message +}; + +//============================================== + +// plyer_state_t communication + +// please delta the gunUUID when we are forced to add more bits here (or if a bit frees up) + +#define PS_M_TYPE (1<<0) +#define PS_M_ORIGIN (1<<1) +#define PS_M_VELOCITY (1<<2) +#define PS_M_TIME (1<<3) +#define PS_M_FLAGS (1<<4) +#define PS_M_GRAVITY (1<<5) +#define PS_M_DELTA_ANGLES (1<<6) +#define PS_VIEWOFFSET (1<<7) +#define PS_VIEWANGLES (1<<8) +#define PS_KICKANGLES (1<<9) +#define PS_BLEND (1<<10) +#define PS_FOV (1<<11) +#define PS_REMOTE_VIEWORIGIN (1<<12) +#define PS_REMOTE_ID (1<<13) +#define PS_RDFLAGS (1<<14) +#define PS_REMOTE_VIEWANGLES (1<<15) +#define PS_GUN (1<<16) +#define PS_GUN_CLIP (1<<17) +#define PS_GUN_AMMO (1<<18) +#define PS_WEAPONKICKANGLES (1<<19) +#define PS_BOD (1<<20)//this should be temporary--player body in progress!--ss +#define PS_PIV (1<<21) +#define PS_CINEMATICFREEZE (1<<22) +#define PS_MUSICID (1<<23) +#define PS_AMBSOUNDID (1<<24) +#define PS_DMRANK (1<<25) +#define PS_SPECTATORID (1<<26) +#define PS_M_MOVESCALE (1<<27) +#define PS_RESTART_COUNT (1<<28) +#define PS_BUTTONS_INHIBIT (1<<29) +#define PS_GUN_RELOAD (1<<30) + +//============================================== + +// user_cmd_t communication + +// ms and light allways sent, the others are optional +#define CM_ANGLE1 (1 << 0) +#define CM_ANGLE2 (1 << 1) +#define CM_ANGLE3 (1 << 2) +#define CM_FORWARD (1 << 3) +#define CM_SIDE (1 << 4) +#define CM_UP (1 << 5) +#define CM_BUTTONS (1 << 6) +#define CM_16BIT (1 << 7) +#define CM_LEAN (1 << 8) + +//============================================== + +// a sound without an ent or pos will be a local only sound +#define SND_VOLUME (1 << 0) // a byte +#define SND_ATTENUATION (1 << 1) // a byte +#define SND_POS (1 << 2) // three coordinates +#define SND_ENT (1 << 3) // a short 0-2: channel, 3-12: entity +#define SND_OFFSET (1 << 4) // a byte, msec offset from frame start +#define SND_HI (1 << 5) // indicates the 9th bit of the sound index (up to 512 sounds) + +#define DEFAULT_SOUND_PACKET_VOLUME 1.0 +#define DEFAULT_SOUND_PACKET_ATTENUATION 1.0 + +//============================================== + +// entity_state_t communication + +// try to pack the common update flags into the first byte + +// !!! be sure to update bit_names in cl_ents.cpp +#define U_ORIGIN1 (1<<0) +#define U_ORIGIN2 (1<<1) +#define U_ANGLE2 (1<<2) +#define U_ANGLE3 (1<<3) +#define U_ANGLE1 (1<<4) +#define U_ORIGIN3 (1<<5) +#define U_EVENT (1<<6) +#define U_MOREBITS1 (1<<7) // read one additional byte + +// second byte +#define U_RENDERFX16 (1<<8) // 8 + 16 = 32 +#define U_RENDERMODEL (1<<9) // this was defined as "(1<<21)" before, same as U_MODEL2, which was presumably wrong (slc) +#define U_RENDERFX8 (1<<10) // fullbright, etc +#define U_REMOVE (1<<11) // REMOVE this entity, don't add it +#define U_FRAME16 (1<<12) // frame is a short +#define U_EFFECT (1<<13) +#define U_EFFECTS16 (1<<14) // 8 + 16 = 32 +#define U_MOREBITS2 (1<<15) // read one additional byte + +// third byte +#define U_EFFECTS8 (1<<16) // autorotate, trails, etc +#define U_FRAME8 (1<<17) // frame is a byte +#define U_SOLID (1<<18) +#define U_SKIN8 (1<<19) +#define U_MODEL (1<<20) +#define U_SOUND (1<<21) +#define U_SOUND_HI (1<<22) // Extra bit for sound field (up to 512 max sounds) +#define U_MOREBITS3 (1<<23) // read one additional byte + +// fourth byte +#define U_NUMBER16 (1<<24) // NUMBER8 is implicit if not set +#define U_SKIN16 (1<<25) +#define U_ANGLEDIFF (1<<26) + +/* +============================================================== + +CMD + +Command text buffering and command execution + +============================================================== +*/ + +/* + +Any number of commands can be added in a frame, from several different sources. +Most commands come from either keybindings or console line input, but remote +servers can also send across commands and entire text files can be execed. + +The + command line options are also added to the command buffer. + +The game starts with a Cbuf_AddText ("exec quake.rc\n"); Cbuf_Execute (); + +*/ + +#define EXEC_NOW 0 // don't return until completed +#define EXEC_INSERT 1 // insert at current position, but don't run yet +#define EXEC_APPEND 2 // add to end of the command buffer + +void Cbuf_Init (void); +// allocates an initial text buffer that will grow as needed + +void Cbuf_AddText (const char *text); +// as new commands are generated from the console or keybindings, +// the text is added to the end of the command buffer. + +void Cbuf_InsertText (const char *text); +// when a command wants to issue other commands immediately, the text is +// inserted at the beginning of the buffer, before any remaining unexecuted +// commands. + +void Cbuf_ExecuteText (int exec_when, const char *text); +// this can be used in place of either Cbuf_AddText or Cbuf_InsertText + +void Cbuf_AddEarlyCommands (qboolean clear); +// adds all the +set commands from the command line + +qboolean Cbuf_AddLateCommands (void); +// adds all the remaining + commands from the command line +// Returns true if any late commands were added, which +// will keep the demoloop from immediately starting + +void Cbuf_Execute (void); +// Pulls off \n terminated lines of text from the command buffer and sends +// them through Cmd_ExecuteString. Stops when the buffer is empty. +// Normally called once per frame, but may be explicitly invoked. +// Do not call inside a command function! + +void Cbuf_CopyToDefer (void); +void Cbuf_InsertFromDefer (void); +// These two functions are used to defer any pending commands while a map +// is being loaded + +//=========================================================================== + +/* + +Command execution takes a null terminated string, breaks it into tokens, +then searches for a command or variable that matches the first token. + +*/ + +typedef void (*xcommand_t) (void); + +void Cmd_Init (void); + +void Cmd_AddCommand (char *cmd_name, xcommand_t function); +// called by the init functions of other parts of the program to +// register commands and functions to call for them. +// The cmd_name is referenced later, so it should not be in temp memory +// if function is NULL, the command will be forwarded to the server +// as a clc_stringcmd instead of executed locally +void Cmd_RemoveCommand (char *cmd_name); + +qboolean Cmd_Exists (char *cmd_name); +// used by the cvar code to check for cvar / command name overlap + +char *Cmd_CompleteCommand (char *partial); +char *Cmd_CompleteCommandNext (char *partial, char *last); +// attempts to match a partial command for automatic command line completion +// returns NULL if nothing fits + +int Cmd_Argc (void); +char *Cmd_Argv (int arg); +char *Cmd_Args (void); +// The functions that execute commands get their parameters with these +// functions. Cmd_Argv () will return an empty string, not a NULL +// if arg > argc, so string operations are allways safe. + +void Cmd_TokenizeString (const char *text, qboolean macroExpand); +// Takes a null terminated string. Does not need to be /n terminated. +// breaks the string up into arg tokens. + +void Cmd_ExecuteString (const char *text); +// Parses a single line of text into arguments and tries to execute it +// as if it was typed at the console + +void Cmd_ForwardToServer (void); +// adds the current command line as a clc_stringcmd to the client message. +// things like godmode, noclip, etc, are commands directed to the server, +// so when they are typed in at the console, they will need to be forwarded. + + +/* +============================================================== + +CVAR + +============================================================== +*/ + +/* + +cvar_t variables are used to hold scalar or string variables that can be changed or displayed at the console or prog code as well as accessed directly +in C code. + +The user can access cvars from the console in three ways: +r_draworder prints the current value +r_draworder 0 sets the current value to 0 +set r_draworder 0 as above, but creates the cvar if not present +Cvars are restricted from having the same names as commands to keep this +interface from being ambiguous. +*/ + +extern cvar_t *cvar_vars; + +void Cvar_SetInternal(bool new_internal); + +cvar_t *Cvar_Get (const char *var_name, const char *value, int flags, cvarcommand_t command = NULL); +// creates the variable if it doesn't exist, or returns the existing one +// if it exists, the value will not be changed, but flags will be ORed in +// that allows variables to be unarchived without needing bitflags + +cvar_t *Cvar_Set (const char *var_name, const char *value); +// will create the variable if it doesn't exist + +cvar_t *Cvar_ForceSet (const char *var_name, const char *value); +// will set the variable even if NOSET or LATCH + +cvar_t *Cvar_FullSet (const char *var_name, const char *value, int flags); + +void Cvar_SetValue (const char *var_name, float value); +// expands value to a string and calls Cvar_Set + +float Cvar_VariableValue (const char *var_name); +// returns 0 if not defined or non numeric + +char *Cvar_VariableString (const char *var_name); +// returns an empty string if not defined + +char *Cvar_CompleteVariable (char *partial); +char *Cvar_CompleteVariableNext (char *partial, char *last); +// attempts to match a partial variable name for command line completion +// returns NULL if nothing fits + +void Cvar_GetLatchedVars (void); +// any CVAR_LATCHED variables that have been set will now take effect + +qboolean Cvar_Command (void); +// called by Cmd_ExecuteString when Cmd_Argv(0) doesn't match a known +// command. Returns true if the command was a variable reference that +// was handled. (print or change) + +void Cvar_WriteVariables (const char *path); +// appends lines containing "set variable value" for all variables +// with the archive flag set to true. + +void Cvar_Init (void); + +// returns an info string containing all the flags +// Flags can be CVAR_USERINFO, CVAR_SERVERINFO, CVAR_WEAPON, CVAR_ITEM, CVAR_AMMO, CVAR_MISC +char *Cvar_Info (int flags); + +extern qboolean userinfo_modified; +// this is set each time a CVAR_USERINFO variable is changed +// so that the client knows to send it to the server + +/* +============================================================== + +NET + +============================================================== +*/ + +// net.h -- quake's interface to the networking layer + +#define PORT_ANY -1 + +#define MAX_MSGLEN_MAX (16384) // max length of any message +extern int MaxMsgLen; // current max msg len + +#define PACKET_HEADER 10 // two ints and a short + +typedef enum {NA_LOOPBACK, NA_BROADCAST, NA_IP, NA_IPX, NA_BROADCAST_IPX} netadrtype_t; + +typedef enum {NS_CLIENT, NS_SERVER} netsrc_t; + +typedef struct netadr_s +{ + netadrtype_t type; + + byte ip[4]; + byte ipx[10]; + + unsigned short port; +} netadr_t; + +void NET_Init (void); +void NET_Shutdown (void); + +void NET_Config (qboolean multiplayer); + +qboolean NET_GetPacket (netsrc_t sock, netadr_t *net_from, sizebuf_t *net_message); +void NET_SendPacket (netsrc_t sock, int length, void *data, netadr_t to); + +bool NET_CompareAdr (netadr_t a, netadr_t b); +qboolean NET_CompareBaseAdr (netadr_t a, netadr_t b); +qboolean NET_IsLocalAddress (netadr_t adr); +char *NET_AdrToString (netadr_t a); +qboolean NET_StringToAdr (char *s, netadr_t *a); + +int NET_GetConnections (int sock); +qboolean NET_SendData (int sock, int length, void *data); +qboolean NET_GetData (int sock, sizebuf_t *net_message); +qboolean NET_CloseConnection (int sock); + +//============================================================================ + +#define OLD_AVG 0.99 // total = oldtotal*OLD_AVG + new*(1-OLD_AVG) + +#define MAX_LATENT 32 + +typedef struct +{ + qboolean fatal_error; + + netsrc_t sock; + + int dropped; // between last packet and previous + + int last_received; // for timeouts + int last_sent; // for retransmits + + netadr_t remote_address; + int qport; // qport value to write when transmitting + +// sequencing variables + int incoming_sequence; + int incoming_acknowledged; + int incoming_reliable_acknowledged; // single bit + + int incoming_reliable_sequence; // single bit, maintained local + + int outgoing_sequence; + int reliable_sequence; // single bit + int last_reliable_sequence; // sequence number of last send + +// reliable staging and holding areas + sizebuf_t message; // writing buffer to send to server + byte message_buf[MAX_MSGLEN_MAX-16]; // leave space for header + +// message is copied to this buffer when it is first transfered + int reliable_length; + byte reliable_buf[MAX_MSGLEN_MAX-16]; // unacked reliable message +} netchan_t; + +extern netadr_t net_from; +extern sizebuf_t net_message; +extern byte net_message_buffer[MAX_MSGLEN_MAX]; + + +void Netchan_Init (void); +void Netchan_Setup (netsrc_t sock, netchan_t *chan, netadr_t adr, int qport); + +qboolean Netchan_NeedReliable (netchan_t *chan); +void Netchan_Transmit (netchan_t *chan, int length, byte *data); +void Netchan_OutOfBand (int net_socket, netadr_t adr, int length, byte *data); +void Netchan_OutOfBandPrint (int net_socket, netadr_t adr, char *format, ...); +qboolean Netchan_Process (netchan_t *chan, sizebuf_t *msg); + +qboolean Netchan_CanReliable (netchan_t *chan); + + +/* +============================================================== + +CMODEL + +============================================================== +*/ + + +#include "../qcommon/qfiles.h" + +void CM_RefreshMapData(qboolean clientload); +int CM_NumClusters (void); +int CM_NumInlineModels (void); +char *CM_EntityString (void); + +// creates a clipping hull for an arbitrary box +int CM_HeadnodeForBox (vec3_t mins, vec3_t maxs); + + +// returns an ORed contents mask +int CM_PointContents (vec3_t p, int headnode); +int CM_TransformedPointContents (vec3_t p, int headnode, vec3_t origin, vec3_t angles); + +float CM_ShadowTrace(vec3_t start,vec3_t end); + +trace_t CM_BoxTrace (vec3_t start, vec3_t end, + vec3_t mins, vec3_t maxs, + int headnode, int brushmask); +trace_t CM_TransformedBoxTrace (vec3_t start, vec3_t end, + vec3_t mins, vec3_t maxs, + int headnode, int brushmask, + vec3_t origin, vec3_t angles); + +byte *CM_ClusterPVS (int cluster); +byte *CM_ClusterPHS (int cluster); + +int CM_PointLeafnum (vec3_t p); + +// call with topnode set to the headnode, returns with topnode +// set to the first node that splits the box +int CM_BoxLeafnums (vec3_t mins, vec3_t maxs, int *boxlist, int listsize, int *topnode); + +int CM_LeafContents (int leafnum); +int CM_LeafCluster (int leafnum); +int CM_LeafArea (int leafnum); + +void CM_SetAreaPortalState (int portalnum, qboolean open); +qboolean CM_AreasConnected (int area1, int area2); + +int CM_WriteAreaBits (byte *buffer, int area); +qboolean CM_HeadnodeVisible (int headnode, byte *visbits); + +void CM_WritePortalState (); +void CM_ReadPortalState (); + +void CM_UnloadMapLumps(void); +void CM_ClearMap(void); +bool CM_MapDataValid(void); +void CM_CreateMapChecksum(char *name, char *checkstring); +bsplumps_t *CM_GetLumpbase(char *name, int lump, void (*callback)(void *cm_out, void *cm_in) = NULL); + +int CM_BoxLeafnums_headnode (vec3_t mins, vec3_t maxs, int *boxlist, int listsize, int headnode, int *topnode); +void CM_TestInLeaf (int leafnum); + +qboolean PF_inPVS (vec3_t p1, vec3_t p2); +float SV_CheckRegionDistance(vec3_t vert); + +/* +============================================================== + +PLAYER MOVEMENT CODE + +Common between server and client so prediction matches + +============================================================== +*/ + +#define MAX_CMD_PACKETSIZE 64 + +void Pmove (pmove_t *pmove); + +/* +============================================================== + +MISC + +============================================================== +*/ + + +#define ERR_FATAL 0 // exit the entire game with a popup window +#define ERR_DROP 1 // print to console and disconnect from game +#define ERR_QUIT 2 // not an error, just a normal exit + +#define EXEC_NOW 0 // don't return until completed +#define EXEC_INSERT 1 // insert at current position, but don't run yet +#define EXEC_APPEND 2 // add to end of the command buffer + +#define PRINT_ALL 0 +#define PRINT_DEVELOPER 1 // only print when "developer & 1" +#define PRINT_EXT_DEVELOPER 2 // only print when "developer & 4" +#define PRINT_ALERT 3 // bring up a message box + +void Com_BeginRedirect (int target, char *buffer, int buffersize, void (*flush)); +void Com_EndRedirect (void); +void Com_Printf (char *fmt, ...); +void Com_DPrintf (char *fmt, ...); +void Com_EPrintf (char *fmt, ...); +void Com_Error (int code, const char *fmt, ...); +void Com_Quit (void); + +int Com_ServerState (void); // this should have just been a cvar... +void Com_SetServerState (int state); + +unsigned Com_BlockChecksum (void *buffer, int length); +byte COM_BlockSequenceCheckByte (byte *base, int length, int sequence); + +extern cvar_t *developer; +extern cvar_t *dedicated; +extern cvar_t *host_speeds; +extern cvar_t *log_stats; + +extern FILE *log_stats_file; + +// host_speeds times +extern int time_before_game; +extern int time_after_game; +extern int time_before_ref; +extern int time_after_ref; + +void Z_Free (void *ptr); +void Z_Touch (void *ptr); +void *Z_Malloc (int size); // returns 0 filled memory +void *Z_TagMalloc (int size, int tag); +void Z_FreeTags (int tag); + +void Qcommon_Init (int argc, char **argv); +void Qcommon_Frame (int msec); +void Qcommon_Shutdown (void); + +#define NUMVERTEXNORMALS 250 +extern vec3_t bytedirs[NUMVERTEXNORMALS]; + +// this is in the client code, but can be used for debugging from server +void SCR_DebugGraph (float v1, int c1, float v2 = 0.0, int c2 = -1, float v3 = 0.0, int c3 = -1, float v4 = 0.0, int c4 = -1, float v5 = 0.0, int c5 = -1); + + +/* +============================================================== + +NON-PORTABLE SYSTEM SERVICES + +============================================================== +*/ + +void Sys_Init (void); + +void Sys_AppActivate (void); + +// Loads the game dll and calls the api init function. + +void Sys_UnloadGame (void); +void *Sys_GetGameAPI (void *parms); + +// Loads the player dll and calls the api init function. + +void Sys_UnloadPlayer (int isClient); +void *Sys_GetPlayerAPI (void *parmscom,void *parmscl,void *parmssv,int isClient); + +char *Sys_ConsoleInput (void); +void Sys_ConsoleOutput (char *string); +void Sys_SendKeyEvents (void); +void Sys_Error (char *error, ...); +void Sys_Quit (void); +char *Sys_GetClipboardData( void ); +void Sys_CopyProtect (void); + +#ifndef _FINAL_ +char *GetSymbol(void *addr); +#endif + +/* +============================================================== + +CLIENT / SERVER SYSTEMS + +============================================================== +*/ + +#define SG_SCR_WIDTH 128 +#define SG_SCR_HEIGHT 128 +#define SG_SCR_DISPLAYHEIGHT (SG_SCR_HEIGHT * 3 / 4) + +void CL_Init (void); +void CL_Drop (bool setmsg = true); +void CL_Shutdown (void); +void CL_Frame (int msec); +void SCR_BeginLoadingPlaque (qboolean noPlaque); +byte *CL_GetScreenshot(); +void CL_SetScreenshot(const char *name, int w, int h, byte *data); + +void SV_Init (void); +void SV_Shutdown (char *finalmsg, qboolean reconnect); +void SV_Frame (int msec); + +extern int curtime; // time returned by last Sys_Milliseconds + +int HasAttachedEffects(entity_state_t *curState); + +#endif // __QCOMMON diff --git a/Source/Game/qcommon/qfiles.h b/Source/Game/qcommon/qfiles.h new file mode 100644 index 0000000..26aca6c --- /dev/null +++ b/Source/Game/qcommon/qfiles.h @@ -0,0 +1,379 @@ +#include "palette.h" +// +// qfiles.h: quake file formats +// This file must be identical in the quake and utils directories +// + +/* +============================================================================== + + .M8 texture file format + +============================================================================== +*/ + +#define MIP_VERSION 2 +#define PAL_SIZE 256 +#define MIPLEVELS 16 + +typedef struct miptex_s +{ + int version; + char name[32]; + unsigned width[MIPLEVELS], height[MIPLEVELS]; + unsigned offsets[MIPLEVELS]; // four mip maps stored + char animname[32]; // next frame in animation chain + paletteRGB_t palette[PAL_SIZE]; + int flags; + int contents; + int value; +} miptex_t; + +#define MIP32_VERSION 4 + +// flags2 definitions +#define MIP32_NOMIP_FLAG2 0x00000001 +#define MIP32_DETAILER_FLAG2 0x00000002 +#define MIP32_PARENTAL_FLAG2 0x00000004 +#define MIP32_SPHERICAL_FLAG2 0x00000008 + +typedef struct miptex32_s +{ + int version; + char name[MAX_OSPATH]; + char altname[MAX_OSPATH]; // texture substitution + char animname[MAX_OSPATH]; // next frame in animation chain + char damagename[MAX_OSPATH]; // image that should be shown when damaged + unsigned width[MIPLEVELS], height[MIPLEVELS]; + unsigned offsets[MIPLEVELS]; + int flags; + int contents; + int value; + float scale_x, scale_y; + int mip_scale; + + // detail texturing info + char dt_name[MAX_OSPATH]; // detailed texture name + float dt_scale_x, dt_scale_y; + float dt_u, dt_v; + float dt_alpha; + int dt_src_blend_mode, dt_dst_blend_mode; + + int flags2; + float damage_health; + + int unused[18]; // future expansion to maintain compatibility with h2 +} miptex32_t; + + +/* +============================================================================== + + .BSP file format + +============================================================================== +*/ + +#define IDBSPHEADER (('P'<<24)+('S'<<16)+('B'<<8)+'I') + // little-endian "IBSP" + +// differs from 44 in the extra lightmip fields in struct dface_t -slc +#define BSPVERSION 46 + + +// upper design bounds +// leaffaces, leafbrushes, planes, and verts are still bounded by +// 16 bit short limits + +// If any lump has more than 4 million entries, then we have a problem :) +#define MAX_MAP_ANYTHING (4 * 1024 * 1024) + +#define MAX_MAP_MODELS 1024 +#define MAX_MAP_BRUSHES 8192 +#define MAX_MAP_ENTITIES 2048 +#define MAX_MAP_ENTSTRING 0x40000 +#define MAX_MAP_TEXINFO 8192 + +#define MAX_MAP_AREAS 256 +#define MAX_MAP_AREAPORTALS 1024 +#define MAX_MAP_PLANES 65536 +#define MAX_MAP_NODES 65536 +#define MAX_MAP_BRUSHSIDES 65536 +#define MAX_MAP_LEAFS 65536 +#define MAX_MAP_VERTS 65536 +#define MAX_MAP_FACES 65536 +#define MAX_MAP_LEAFFACES 65536 +#define MAX_MAP_LEAFBRUSHES 65536 +#define MAX_MAP_PORTALS 65536 +#define MAX_MAP_EDGES 128000 +#define MAX_MAP_SURFEDGES 256000 +#define MAX_MAP_VISIBILITY 0x180000 + +// key / value pair sizes + +#define MAX_KEY 32 +#define MAX_VALUE 1024 + +//============================================================================= + +typedef struct +{ + int fileofs, filelen; +} lump_t; + +#define LUMP_ENTITIES 0 +#define LUMP_PLANES 1 +#define LUMP_VERTEXES 2 +#define LUMP_VISIBILITY 3 +#define LUMP_NODES 4 +#define LUMP_TEXINFO 5 +#define LUMP_FACES 6 +#define LUMP_LIGHTING 7 +#define LUMP_LEAFS 8 +#define LUMP_LEAFFACES 9 +#define LUMP_LEAFBRUSHES 10 +#define LUMP_EDGES 11 +#define LUMP_SURFEDGES 12 +#define LUMP_MODELS 13 +#define LUMP_BRUSHES 14 +#define LUMP_BRUSHSIDES 15 +#define LUMP_POP 16 +#define LUMP_AREAS 17 +#define LUMP_AREAPORTALS 18 +#define LUMP_REGIONFACES 19 +#define LUMP_LIGHTS 20 +#define LUMP_REGIONS 21 +#define HEADER_LUMPS 22 + +typedef struct +{ + int ident; + int version; + lump_t lumps[HEADER_LUMPS]; +} dheader_t; + +typedef struct bsplumps +{ + void *in_addr; + void *out_addr; + int count; + int min; + int max; + int additional; + char *lumpname; + int insize; + int outsize; + void (*Process)(void *in, void *oout, int count, void (*callback)(void *cm_out, void *cm_in) = NULL); + bool checksummed; + byte checksum; +} bsplumps_t; + +typedef struct +{ + float mins[3], maxs[3]; + float origin[3]; // for sounds or lights + int headnode; + int firstface, numfaces; // submodels just draw faces + // without walking the bsp tree +} dmodel_t; + + +typedef struct +{ + float point[3]; +} dvertex_t; + + +// 0-2 are axial planes +#define PLANE_X 0 +#define PLANE_Y 1 +#define PLANE_Z 2 + +// 3-5 are non-axial planes snapped to the nearest +#define PLANE_ANYX 3 +#define PLANE_ANYY 4 +#define PLANE_ANYZ 5 + +// planes (x&~1) and (x&~1)+1 are allways opposites + +typedef struct +{ + float normal[3]; + float dist; + int type; // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate +} dplane_t; + +typedef struct +{ + int planenum; + int children[2]; // negative numbers are -(leafs+1), not nodes + short mins[3]; // for frustom culling + short maxs[3]; + unsigned short firstface; + unsigned short numfaces; // counting both sides +} dnode_t; + + +typedef struct texinfo_s +{ + float vecs[2][4]; // [s/t][xyz offset] + int flags; // miptex flags + overrides + int value; // light emission, etc + char texture[32]; // texture name (textures/*.wal) + int nexttexinfo; // for animations, -1 = end of chain +} texinfo_t; + + +// note that edge 0 is never used, because negative edge nums are used for +// counterclockwise use of the edge in a face +typedef struct +{ + unsigned short v[2]; // vertex numbers +} dedge_t; + +typedef struct +{ + unsigned short planenum; + short side; + + int firstedge; // we must support > 64k edges + short numedges; + short texinfo; + + short region; + int first_regionface; + short num_regionfaces; + + byte styles[MAXLIGHTMAPS]; + + int lightofs; // start of [numstyles*surfsize] samples + byte lightmip_smax,lightmip_tmax,lightmip_X,lightmip_Y; // int lightmip; + + short texturemins[2]; + short extents[2]; +} dface_t; + +typedef struct +{ + int firstedge; + short numedges; +} dregionface_t; + +typedef struct +{ + int contents; // OR of all brushes (not needed?) + + short cluster; + short area; + short region; + + short mins[3]; // for frustum culling + short maxs[3]; + + unsigned short firstleafface; + unsigned short numleaffaces; + + unsigned short firstleafbrush; + unsigned short numleafbrushes; +} dleaf_t; + +typedef struct +{ + unsigned short planenum; // facing out of the leaf + short texinfo; +} dbrushside_t; + +typedef struct +{ + int firstside; + int numsides; + int contents; +} dbrush_t; + +#define ANGLE_UP -1 +#define ANGLE_DOWN -2 + + +// the visibility lump consists of a header with a count, then +// byte offsets for the PVS and PHS of each cluster, then the raw +// compressed bit vectors +#define DVIS_PVS 0 +#define DVIS_PHS 1 +typedef struct +{ + int numclusters; + int bitofs[8][2]; // bitofs[numclusters][2] +} dvis_t; + +// each area has a list of portals that lead into other areas +// when portals are closed, other areas may not be visible or +// hearable even if the vis info says that it should be +typedef struct +{ + int portalnum; + int otherarea; +} dareaportal_t; + +typedef struct +{ + int numareaportals; + int firstareaportal; +} darea_t; + +typedef struct +{ + int connecting_face; + int height_change; + vec3_t points[2]; +} dpathpoint_t; + +typedef struct +{ + int start_point; + int num_points; + vec3_t center; + float radius; +} dpathinfo_t; + +typedef enum +{ + emit_surface, + emit_point, + emit_spotlight, + emit_sunlight // Argh! - sunlight +} emittype_t; + +typedef struct +{ + vec3_t origin; + vec3_t color; + float intensity; + emittype_t type; + int falloff; // falloff type: 0=linear, 1=inverse, 2=invsquare +} light_t; + +// Fog Flags +#define FOG_PULSATE 0x00000001 +#define FOG_HEIGHT 0x00000002 + +typedef struct +{ + union + { + struct + { + int mode; + float density; + float density_range; + float start; + float end; + float height; + byte color[4]; + unsigned long flags; + float time; + float distance_cull; + float chop_size; + float expansion[8]; + } fog; + }; +} dregion_t; diff --git a/Source/Game/qcommon/snd_common.h b/Source/Game/qcommon/snd_common.h new file mode 100644 index 0000000..a2533ba --- /dev/null +++ b/Source/Game/qcommon/snd_common.h @@ -0,0 +1,52 @@ +#pragma once + +// sound channels +// channel 0 never willingly overrides +// other channels (1-7) allways override a playing sound on that channel +#define CHAN_AUTO 0 +#define CHAN_WEAPON 1 +#define CHAN_VOICE 2 +#define CHAN_ITEM 3 +#define CHAN_BODY 4 +#define CHAN_ENT1 5 +#define CHAN_ENT2 6 +// modifier flags +#define CHAN_NO_PHS_ADD 8 // send to all clients, not just ones in PHS (ATTN 0 will also do this) +#define CHAN_RELIABLE 16 // send by reliable message, not datagram + + +// sound attenuation values +#define ATTN_NONE 0 // full volume the entire level +#define ATTN_NORM 1 +#define ATTN_IDLE 2 +#define ATTN_STATIC 3 // diminish very rapidly with distance + + +#define SND_LOCALIZE_GLOBAL 0 // Default, means that the sound is projected into the world as normal. +#define SND_LOCALIZE_CLIENT 1 // Means to ONLY play the sound on the associated client. + +// sound info fields +#define SIF_MUSIC_STATE 0x01 +#define SIF_DESIGNER_MUSIC 0x02 +#define SIF_AMB_GEN_SET 0x04 +#define SIF_SOUND_EFFECT 0x08 + +enum +{ + SPE_NORMAL, + SPE_WATER, + SPE_NUM_PROC_TYPES +}; + +// volume mask for ent->sound_data - makes room for attn value in the lower bits +#define ENT_VOL_MASK 0xf8 + +enum +{ + SND_LOOPATTN, + SND_NEARATTN, + SND_NORMATTN, + SND_FARATTN, + SND_VERYFARATTN, + SND_MAXATTN +}; diff --git a/Source/Game/qcommon/strip.h b/Source/Game/qcommon/strip.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Game/qcommon/vect3.h b/Source/Game/qcommon/vect3.h new file mode 100644 index 0000000..0cdee4f --- /dev/null +++ b/Source/Game/qcommon/vect3.h @@ -0,0 +1,91 @@ +#if !defined(VECT3_INC) +#define VECT3_INC + +#include +#include + +class Vect3 +{ + float v[3]; +public: + Vect3(const float val) {v[0]=val;v[1]=val;v[2]=val;} + Vect3() {}//never put anything in here! too slow} + Vect3(const float x,const float y,const float z) {v[0]=x;v[1]=y;v[2]=z;} + Vect3(const Vect3& t) {v[0]=t.v[0];v[1]=t.v[1];v[2]=t.v[2];} + Vect3(const float *t) {v[0]=t[0];v[1]=t[1];v[2]=t[2];} + float& operator[](int i) {return v[i];} + float& x() {return v[0];} + float& y() {return v[1];} + float& z() {return v[2];} + const float& operator[](int i) const {return v[i];} + const float& x() const {return v[0];} + const float& y() const {return v[1];} + const float& z() const {return v[2];} + void Set(const float x,const float y,const float z) {v[0]=x;v[1]=y;v[2]=z;} + + float Len() const {return (float)sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);} + float Len2() const {return v[0]*v[0]+v[1]*v[1]+v[2]*v[2];} + void Norm() {(*this)/=this->Len();} + bool ZeroNorm() {float d=this->Len();if (d>1E-10) {(*this)/=d;return true;} (*this)=0.0f; return false;} + void SafeNorm() {assert(this->Len()>1E-10);(*this)/=this->Len();} + + const Vect3 &operator= (const float d) {v[0]=d;v[1]=d;v[2]=d; return *this; } + const Vect3 &operator= (const Vect3& t) {v[0]=t.v[0];v[1]=t.v[1];v[2]=t.v[2]; return *this; } + + const Vect3 &operator+= (const float d) {v[0]+=d;v[1]+=d;v[2]+=d; return *this; } + const Vect3 &operator+= (const Vect3& t) {v[0]+=t.v[0];v[1]+=t.v[1];v[2]+=t.v[2]; return *this; } + + const Vect3 &operator-= (const float d) {v[0]-=d;v[1]-=d;v[2]-=d; return *this; } + const Vect3 &operator-= (const Vect3& t) {v[0]-=t.v[0];v[1]-=t.v[1];v[2]-=t.v[2]; return *this; } + + const Vect3 &operator*= (const float d) {v[0]*=d;v[1]*=d;v[2]*=d; return *this; } + const Vect3 &operator*= (const Vect3& t) {v[0]*=t.v[0];v[1]*=t.v[1];v[2]*=t.v[2]; return *this; } + + const Vect3 &operator/= (const float d); + const Vect3 &operator/= (const Vect3& t) {v[0]/=t.v[0];v[1]/=t.v[1];v[2]/=t.v[2]; return *this; } + + float operator^ (const Vect3& t) const {return v[0]*t.v[0]+v[1]*t.v[1]+v[2]*t.v[2];} + + float Dist(const Vect3&) const; + float Dist2(const Vect3&) const; + void Cross(const Vect3&); + void NegCross(const Vect3&); + void Perp(); + void Min(const Vect3&); + void Max(const Vect3&); + float MaxElement() const; + int MaxElementIndex() const; + + void Interp(const Vect3 &v1,const Vect3 &v2,float t) {*this=v1;*this-=v2;*this*=t;*this+=v2;} + bool operator== (const Vect3& t) const {return v[0]==t.v[0]&&v[1]==t.v[1]&&v[2]==t.v[2];} + bool operator< (const Vect3& t) const {assert(0);return false;} + bool operator!= (const Vect3& t) const {return !(v[0]==t.v[0]&&v[1]==t.v[1]&&v[2]==t.v[2]);} + bool operator> (const Vect3& t) const {assert(0);return false;} + + inline Vect3 operator +(const Vect3 &rhs) const { return Vect3(v[0]+rhs.v[0], v[1]+rhs.v[1], v[2]+rhs.v[2]); } + inline Vect3 operator -(const Vect3 &rhs) const { return Vect3(v[0]-rhs.v[0], v[1]-rhs.v[1], v[2]-rhs.v[2]); } + inline Vect3 operator *(const Vect3 &rhs) const { return Vect3(v[0]*rhs.v[0], v[1]*rhs.v[1], v[2]*rhs.v[2]); } + inline Vect3 operator *(const float scalar) const { return Vect3(v[0]*scalar, v[1]*scalar, v[2]*scalar); } + inline friend Vect3 operator *(const float scalar, const Vect3 &rhs); + inline Vect3 operator /(const Vect3 &rhs) const { return Vect3(v[0]/rhs.v[0], v[1]/rhs.v[1], v[2]/rhs.v[2]); } + inline Vect3 operator /(const float scalar) const { return Vect3(v[0]/scalar, v[1]/scalar, v[2]/scalar); } +}; + +inline Vect3 operator *(const float scalar, const Vect3 &rhs) +{ + return Vect3(scalar*rhs.v[0], scalar*rhs.v[1], scalar*rhs.v[2]); +} + + +extern const Vect3 Vect3X; +extern const Vect3 Vect3Y; +extern const Vect3 Vect3Z; +extern const Vect3 Vect3negX; +extern const Vect3 Vect3negY; +extern const Vect3 Vect3negZ; +extern const Vect3 Vect3Zero; + + + + +#endif \ No newline at end of file diff --git a/Source/Game/qcommon/w_types.h b/Source/Game/qcommon/w_types.h new file mode 100644 index 0000000..4cab907 --- /dev/null +++ b/Source/Game/qcommon/w_types.h @@ -0,0 +1,140 @@ +#ifndef __W_TYPES_H +#define __W_TYPES_H + +// 12/27/99 kef -- enum objType_t (OBJ_NONE...MAX_ITM_OBJS) can be used as indices into the +//array of items known as thePickupList which represents every item the player can pick up...armor, +//weapons, health, single player or multiplayer. the declaration of thePickupList is, sadly, in CWeaponInfo.h +typedef enum +{ + OBJ_NONE = 0, + OBJ_AMMO_KNIFE, // please don't EVER make this equal to anything less than 1. search for OBJ_AMMO_KNIFE - 1 and find out why. + OBJ_AMMO_PISTOL,//these are now grossly misnamed - but they get the job done + OBJ_AMMO_SHOTGUN, + OBJ_AMMO_PISTOL2, // this is .44 ammo + OBJ_AMMO_AUTO, + OBJ_AMMO_MPG, + OBJ_AMMO_GAS, + OBJ_AMMO_ROCKET, + OBJ_AMMO_SLUG, + + // single player only + OBJ_AMMO_SINGLE_PISTOL, + OBJ_AMMO_SINGLE_SHOTGUN, + OBJ_AMMO_SINGLE_PISTOL2, + OBJ_AMMO_SINGLE_AUTO, + OBJ_AMMO_SINGLE_MPG, + OBJ_AMMO_SINGLE_GAS, + OBJ_AMMO_SINGLE_ROCKET, + OBJ_AMMO_SINGLE_SLUG, + + OBJ_WPN_PISTOL2, + OBJ_WPN_PISTOL1, + OBJ_WPN_MACHINEPISTOL, + OBJ_WPN_ASSAULTRIFLE, + OBJ_WPN_SNIPER, + OBJ_WPN_AUTOSHOTGUN, + OBJ_WPN_SHOTGUN, + OBJ_WPN_MACHINEGUN, + OBJ_WPN_ROCKET, + OBJ_WPN_MICROWAVE, + OBJ_WPN_FLAMEGUN, + + OBJ_ARMOR, + + OBJ_ITM_FLASHPACK, +// OBJ_ITM_NEURALGRENADE, + OBJ_ITM_C4, + OBJ_ITM_LIGHTGOGGLES, + OBJ_ITM_MINE, + OBJ_ITM_MEDKIT, + OBJ_ITM_GRENADE, + OBJ_CTF_FLAG, + + OBJ_HLTH_SM, + OBJ_HLTH_LRG, + + MAX_ITM_OBJS +} objType_t; + + +// 12/27/99 kef -- these are used by thePickupList (specifically, by class Pickup). see CWeaponInfo.h +typedef enum +{ + PU_UNKNOWN = -1, + PU_AMMO, + PU_WEAPON, + PU_ARMOR, + PU_INV, + PU_CASH, + PU_HEALTH, +} pickup_t; + +typedef enum +{ + AMMO_NONE = 0, + AMMO_KNIFE, + AMMO_44, + AMMO_9MM, + AMMO_SHELLS, + AMMO_556, + AMMO_ROCKET, + AMMO_MWAVE, + AMMO_FTHROWER, + AMMO_SLUG, + AMMO_MACHPIS9MM, + MAXAMMOS +} ammos_t; + +// for weapon selection + +typedef enum +{ + SFW_EMPTYSLOT = 0, + SFW_KNIFE, + SFW_PISTOL2, + SFW_PISTOL1, + SFW_MACHINEPISTOL, + SFW_ASSAULTRIFLE, + SFW_SNIPER, + SFW_AUTOSHOTGUN, + SFW_SHOTGUN, + SFW_MACHINEGUN, + SFW_ROCKET, + SFW_MICROWAVEPULSE, + SFW_FLAMEGUN, + SFW_HURTHAND, + SFW_THROWHAND, + SFW_NUM_WEAPONS +} weapons_t; + +typedef enum +{ + SFE_EMPTYSLOT = 0, + SFE_FLASHPACK, +// SFE_NEURAL_GRENADE, + SFE_C4, + SFE_LIGHT_GOGGLES, + SFE_CLAYMORE, + SFE_MEDKIT, + SFE_GRENADE, + SFE_CTFFLAG, + SFE_NUMITEMS +} equipment_t; +/* +typedef enum +{ + CTF_FLAG = 0, +} ctf_t; +*/ +typedef enum +{ + SFC_CASH = 0, +} cash_t; + +typedef enum +{ + SFH_SMALL_HEALTH = 0, + SFH_LARGE_HEALTH, +} health_t; + +#endif // __W_TYPES_H diff --git a/Source/Game/strings/dm_arsenal.h b/Source/Game/strings/dm_arsenal.h new file mode 100644 index 0000000..86de44d --- /dev/null +++ b/Source/Game/strings/dm_arsenal.h @@ -0,0 +1,22 @@ +#ifndef __dm_arsenal_h +#define __dm_arsenal_h + + +/******************************************************************************** + +Arsenal DM text strings. + +********************************************************************************/ + + +#define PACKAGE_DM_ARSENAL 0x09 + +enum +{ + DM_ARSENAL_TEXT_BIG_WINNER = 0x0900, + DM_ARSENAL_TEXT_LAST_WEAPON = 0x0901, + DM_ARSENAL_LAYOUT_STATUS = 0x0902 +}; + + +#endif // __dm_arsenal_h diff --git a/Source/Game/strings/dm_assassin.h b/Source/Game/strings/dm_assassin.h new file mode 100644 index 0000000..e57303f --- /dev/null +++ b/Source/Game/strings/dm_assassin.h @@ -0,0 +1,23 @@ +#ifndef __dm_assassin_h +#define __dm_assassin_h + + +/******************************************************************************** + +Assassin DM strings. + +********************************************************************************/ + + +#define PACKAGE_DM_ASSASSIN 0x08 + +enum +{ + DM_ASSASSIN_TEXT_LOST_FRAG = 0x0800, + DM_ASSASSIN_LAYOUT_TARGET = 0x0801, + DM_ASSASSIN_LAYOUT_NO_TARGET = 0x0802, + DM_ASSASSIN_LAYOUT_NUM_ENEMIES = 0x0803 +}; + + +#endif // __dm_assassin_h diff --git a/Source/Game/strings/dm_generic.h b/Source/Game/strings/dm_generic.h new file mode 100644 index 0000000..4d05fd5 --- /dev/null +++ b/Source/Game/strings/dm_generic.h @@ -0,0 +1,90 @@ +#ifndef __dm_generic_h +#define __dm_generic_h + + +/******************************************************************************** + +All generic DM text strings. + +********************************************************************************/ + + +#define PACKAGE_DM_GENERIC 0x00 + +enum +{ + DM_GENERIC_TEXT_DROPPED_WEAPON = 0x0000, + DM_GENERIC_TEXT_OBT_MOD_WATER = 0x0001, + DM_GENERIC_TEXT_OBT_MOD_SLIME = 0x0002, + DM_GENERIC_TEXT_OBT_MOD_CRUSH = 0x0003, + DM_GENERIC_TEXT_OBT_MOD_FALLING = 0x0004, + DM_GENERIC_TEXT_OBT_MOD_SUICIDE = 0x0005, + DM_GENERIC_TEXT_OBT_MOD_EXPLOSIVE = 0x0006, + DM_GENERIC_TEXT_OBT_MOD_FIRE = 0x0007, + DM_GENERIC_TEXT_OBT_MOD_LAVA = 0x0008, + DM_GENERIC_TEXT_OBT_MOD_EXIT = 0x0009, + DM_GENERIC_TEXT_OBT_MOD_BARBWIRE = 0x000a, + DM_GENERIC_TEXT_OBT_MOD_DOGBITE = 0x000b, + DM_GENERIC_TEXT_OBT_MOD_PHOS_GRENADE = 0x000c, + DM_GENERIC_TEXT_OBT_MOD_ROCKET_SPLASH_F = 0x000d, + DM_GENERIC_TEXT_OBT_MOD_ROCKET_SPLASH_M = 0x000e, + DM_GENERIC_TEXT_OBT_MOD_C4_F = 0x000f, + DM_GENERIC_TEXT_OBT_MOD_C4_M = 0x0010, + DM_GENERIC_TEXT_OBT_MOD_CLAYMORE = 0x0011, + DM_GENERIC_TEXT_OBT_MOD_NEURAL_GRENADE_F = 0x0012, + DM_GENERIC_TEXT_OBT_MOD_NEURAL_GRENADE_M = 0x0013, + DM_GENERIC_TEXT_OBT_F = 0x0014, + DM_GENERIC_TEXT_OBT_M = 0x0015, + DM_GENERIC_TEXT_OBT_MOD_KNIFE_SLASH = 0x0016, + DM_GENERIC_TEXT_OBT_MOD_KNIFE_THROWN = 0x0017, + DM_GENERIC_TEXT_OBT_MOD_PISTOL1 = 0x0018, + DM_GENERIC_TEXT_OBT_MOD_PISTOL2 = 0x0019, + DM_GENERIC_TEXT_OBT_MOD_MPISTOL = 0x001a, + DM_GENERIC_TEXT_OBT_MOD_ASSAULTRIFLE = 0x001b, + DM_GENERIC_TEXT_OBT_MOD_SNIPERRIFLE = 0x001c, + DM_GENERIC_TEXT_OBT_MOD_AUTOSHOTGUN = 0x001d, + DM_GENERIC_TEXT_OBT_MOD_SHOTGUN = 0x001e, + DM_GENERIC_TEXT_OBT_MOD_MACHINEGUN = 0x001f, + DM_GENERIC_TEXT_OBT_MOD_PHOS_GRENADE_2 = 0x0020, + DM_GENERIC_TEXT_OBT_MOD_ROCKET = 0x0021, + DM_GENERIC_TEXT_OBT_MOD_ROCKET_SPLASH = 0x0022, + DM_GENERIC_TEXT_OBT_MOD_MPG = 0x0023, + DM_GENERIC_TEXT_OBT_MOD_FLAMEGUN = 0x0024, + DM_GENERIC_TEXT_OBT_MOD_FLAMEGUN_NAPALM = 0x0025, + DM_GENERIC_TEXT_OBT_MOD_C4 = 0x0026, + DM_GENERIC_TEXT_OBT_MOD_CLAYMORE_2 = 0x0027, + DM_GENERIC_TEXT_OBT_MOD_NEURAL_GRENADE = 0x0028, + DM_GENERIC_TEXT_OBT_MOD_TELEFRAG = 0x0029, + DM_GENERIC_TEXT_OBT_DIED = 0x002a, + DM_GENERIC_LAYOUT_RESET = 0x002b, + DM_GENERIC_LAYOUT_SCOREBAORD_CLIENT = 0x002c, + DM_GENERIC_LAYOUT_SCOREBOARD_TEAM = 0x002d, + DM_GENERIC_TEXT_OBT_MOD_GRENADE_M = 0x002e, + DM_GENERIC_TEXT_OBT_MOD_GRENADE_F = 0x002f, + DM_GENERIC_TEXT_OBT_MOD_GRENADE_2 = 0x0030, + DM_GENERIC_TEXT_SPECTATOR_BAD_PWD = 0x0031, + DM_GENERIC_TEXT_SPECTATOR_LIMIT_FULL = 0x0032, + DM_GENERIC_TEXT_BAD_PWD = 0x0033, + DM_GENERIC_TEXT_SPECTATOR_TO_SIDELINES = 0x0034, + DM_GENERIC_TEXT_SPECTATOR_TO_GAME = 0x0035, + DM_GENERIC_TEXT_NO_MORE_CHASE = 0x0036, + DM_GENERIC_LAYOUT_SCOREBAORD_SPECTATOR = 0x0037, + DM_GENERIC_TEXT_OBT_MOD_CONC_GRENADE = 0x0038, + DM_GENERIC_LAYOUT_CTF_CLIENT = 0x0039, + DM_GENERIC_FRAGS = 0x003a, + DM_GENERIC_FRAG_LIMIT_HIT = 0x003b, + DM_GENERIC_TIME_LIMIT_HIT = 0x003c, + DM_GENERIC_ENTERED = 0x003d, + DM_GENERIC_TEXT_SCORE = 0x003e, + DM_GENERIC_TEXT_PING = 0x003f, + DM_GENERIC_TEXT_TIME = 0x0040, + DM_GENERIC_TEXT_SPECTATOR = 0x0041, + DM_GENERIC_TEXT_FLAG_CAPTURES = 0x0042, + DM_GENERIC_TEXT_CONTROL_POINTS = 0x0043, + DM_GENERIC_CONTROL_TEAM_RED_SCORE = 0x0044, + DM_GENERIC_CONTROL_TEAM_BLUE_SCORE = 0x0045, + DM_GENERIC_CONTROL_TEAM_SCORE = 0x0046 +}; + + +#endif // __dm_generic_h diff --git a/Source/Game/strings/general.h b/Source/Game/strings/general.h new file mode 100644 index 0000000..07e827d --- /dev/null +++ b/Source/Game/strings/general.h @@ -0,0 +1,42 @@ +#ifndef __general_h +#define __general_h + + +/******************************************************************************** + +General Strings + +********************************************************************************/ + + +#define PACKAGE_GENERAL 0x04 + +enum +{ + GENERAL_TEXT_SAY = 0x0400, + GENERAL_TEXT_SAY_TEAM = 0x0401, + GENERAL_TEXT_LOADING_TIME_OUT = 0x0402, + GENERAL_TEXT_INVALID_SKIN_AND_TEAM = 0x0403, + GENERAL_TEXT_INVALID_SKIN = 0x0404, + GENERAL_TEXT_INVALID_TEAM = 0x0405, + GENERAL_TEXT_SHUT_UP = 0x0406, + GENERAL_TEXT_NOKILL = 0x0407, + GENERAL_PAUSED = 0x0408, + GENERAL_MIDSAVE = 0x0409, + GENERAL_KICKED = 0x040a, + GENERAL_TIMEDOUT = 0x040b, + GENERAL_OVERFLOWED = 0x040c, + GENERAL_DISCONNECTED = 0x040d, + GENERAL_BADREAD = 0x040e, + GENERAL_UNKNOWN = 0x040f, + GENERAL_SQUIT = 0x0410, + GENERAL_NEED = 0x0411, + GENERAL_STO = 0x0412, + GENERAL_GLFAILED = 0x0413, + GENERAL_MPMF = 0x0414, + GENERAL_LMDFS = 0x0415, + GENERAL_MMF = 0x0416 +}; + + +#endif // __general_h diff --git a/Source/Game/strings/items.h b/Source/Game/strings/items.h new file mode 100644 index 0000000..7346819 --- /dev/null +++ b/Source/Game/strings/items.h @@ -0,0 +1,92 @@ +#ifndef __items_h +#define __items_h + + +/******************************************************************************** + +General Item Strings + +********************************************************************************/ + + +#define PACKAGE_ITEMS 0x03 + +enum +{ + ITEMS_C4 = 0x0300, + ITEMS_FLASHPACK = 0x0301, + ITEMS_NEURAL_GRENADE = 0x0302, + ITEMS_LIGHT_GOGGLES = 0x0303, + ITEMS_CLAYMORE = 0x0304, + ITEMS_NONE = 0x0305, + ITEMS_FLASHPACK_PICKUP = 0x0306, + ITEMS_NEURALGRENADE_PICKUP = 0x0307, + ITEMS_ARMOR_PICKUP = 0x0308, + ITEMS_ARMOR_ALREADY_FULL = 0x0309, + ITEMS_FLASHPACK_FULL = 0x030a, + ITEMS_C4_FULL = 0x030b, + ITEMS_HEALTH_PICKUP = 0x030c, + ITEMS_AMMO_GONE = 0x030d, + ITEMS_AMMO_COUNT = 0x030e, + ITEMS_KNIFE_PICKUP = 0x030f, + ITEMS_9MM_AMMO_PICKUP = 0x0310, + ITEMS_12_GAUGE_AMMO_PICKUP = 0x0311, + ITEMS_44_AMMO_PICKUP = 0x0312, + ITEMS_556_AMMO_PICKUP = 0x0313, + ITEMS_BATTERY_PICKUP = 0x0314, + ITEMS_GAS_PICKUP = 0x0315, + ITEMS_ROCKET_AMMO_PICKUP = 0x0316, + ITEMS_44_PISTOL_PICKUP = 0x0317, + ITEMS_9MM_PISTOL_PICKUP = 0x0318, + ITEMS_9MM_SMG_PICKUP = 0x0319, + ITEMS_556_SMG_PICKUP = 0x031a, + ITEMS_556_SNIPER_PICKUP = 0x031b, + ITEMS_SLUGTHROWER_PICKUP = 0x031c, + ITEMS_12_GAUGE_SHOTGUN_PICKUP = 0x031d, + ITEMS_HEAVY_MACHINEGUN_PICKUP = 0x031e, + ITEMS_ROCKET_LAUNCHER_PICKUP = 0x031f, + ITEMS_MICROWAVE_PULSE_PICKUP = 0x0320, + ITEMS_FLAME_GUN_PICKUP = 0x0321, + ITEMS_C4_PICKUP = 0x0322, + ITEMS_LIGHTGOGGLES_PICKUP = 0x0323, + ITEMS_CLAYMORE_PICKUP = 0x0324, + ITEMS_SLUGS_PICKUP = 0x0325, + ITEMS_KNIFE_FULL = 0x0326, + ITEMS_9MM_AMMO_FULL = 0x0327, + ITEMS_12_GAUGE_AMMO_FULL = 0x0328, + ITEMS_44_AMMO_FULL = 0x0329, + ITEMS_556_AMMO_FULL = 0x032a, + ITEMS_BATTERY_FULL = 0x032b, + ITEMS_GAS_FULL = 0x032c, + ITEMS_ROCKET_AMMO_FULL = 0x032d, + ITEMS_SLUGS_FULL = 0x032e, + ITEMS_LIGHTGOGGLES_FULL = 0x032f, + ITEMS_CLAYMORE_FULL = 0x0330, + ITEMS_NEURALGRENADE_FULL = 0x0331, + ITEMS_ENCUMBERED = 0x0332, + ITEMS_MEDKIT_PICKUP = 0x0333, + ITEMS_MEDKIT_FULL = 0x0334, + ITEMS_MEDKIT = 0x0335, + ITEMS_GRENADE = 0x0336, + ITEMS_GRENADE_PICKUP = 0x0337, + ITEMS_GRENADE_FULL = 0x0338, + ITEMS_CTF_FLAG = 0x0339, + ITEMS_CTF_FLAG_PICKUP = 0x033a, + ITEMS_CTF_FLAG_PICKUP_2 = 0x033b, + ITEMS_ALREADY_HAVE_THIS = 0x033c, + ITEMS_FULL_HEALTH = 0x033d, + ITEMS_DROPPED_44PISTOL = 0x033e, + ITEMS_DROPPED_9MMPISTOL = 0x033f, + ITEMS_DROPPED_9MMSUPSMG = 0x0340, + ITEMS_DROPPED_556SMG = 0x0341, + ITEMS_DROPPED_SLUGTHROWER = 0x0342, + ITEMS_DROPPED_SHOTGUN = 0x0343, + ITEMS_DROPPED_HVYMACH = 0x0344, + ITEMS_DROPPED_ROCKETLAUNCHER = 0x0345, + ITEMS_DROPPED_MPG = 0x0346, + ITEMS_DROPPED_FLAMEGUN = 0x0347, + ITEMS_DROPPED_SNIPER = 0x0349 +}; + + +#endif // __items_h diff --git a/Source/Game/strings/singleplr.h b/Source/Game/strings/singleplr.h new file mode 100644 index 0000000..1432875 --- /dev/null +++ b/Source/Game/strings/singleplr.h @@ -0,0 +1,33 @@ +#ifndef __singleplr_h +#define __singleplr_h + + +/******************************************************************************** + +single player only string packages + +********************************************************************************/ + + +#define PACKAGE_SINGLEPLR 0x06 + +enum +{ + SINGLEPLR_HOSTAGE_HIT = 0x0600, + SINGLEPLR_BUDDY_HIT = 0x0601, + SINGLEPLR_SAVES_NO_MORE = 0x0602, + SINGLEPLR_SAVES_ONE_LEFT = 0x0603, + SINGLEPLR_SAVES_N_LEFT = 0x0604, + SINGLEPLR_SAVES_USED_UP = 0x0605, + SINGLEPLR_MISSION_FAILED = 0x0606, + SINGLEPLR_FRIENDLY_CASUALTIES = 0x0607, + SINGLEPLR_MISSION_ACCOMPLISHED = 0x0608, + SINGLEPLR_OBJECTIVES_UPDATED = 0x0609, + SINGLEPLR_MISSION_EXIT = 0x060a, + SINGLEPLR_MORE_TO_GO = 0x060b, + SINGLEPLR_SEQUENCE_COMPLETED = 0x060c, + SINGLEPLR_UNLIMITED = 0x060d +}; + + +#endif // __singleplr_h diff --git a/Source/Tools/SoFData/Angles.h b/Source/Tools/SoFData/Angles.h new file mode 100644 index 0000000..dc65d53 --- /dev/null +++ b/Source/Tools/SoFData/Angles.h @@ -0,0 +1,54 @@ +// Angles in radians + +#define ANGLE_0 0.0F +#define ANGLE_1 0.017453292F +#define ANGLE_5 0.087266462F +#define ANGLE_10 0.174532925F +#define ANGLE_15 0.261799387F +#define ANGLE_20 0.392699081F +#define ANGLE_30 0.523598775F +#define ANGLE_45 0.785398163F +#define ANGLE_60 1.047197551F +#define ANGLE_72 1.256637061F +#define ANGLE_90 1.570796327F +#define ANGLE_120 2.094395102F +#define ANGLE_135 2.35619449F +#define ANGLE_144 2.513274123F +#define ANGLE_180 3.141592653F +#define ANGLE_225 3.926990817F +#define ANGLE_270 4.71238898F +#define ANGLE_315 5.497787144F +#define ANGLE_360 6.283185307F + +// Angles in degrees + +#define DEGREE_0 0.0F +#define DEGREE_180 180.0F +#define DEGREE_45 (DEGREE_180 / 4.0F) +#define DEGREE_90 (DEGREE_180 / 2.0F) +#define DEGREE_135 (DEGREE_90 + DEGREE_45) +#define DEGREE_270 (DEGREE_180 + DEGREE_90) +#define DEGREE_360 (DEGREE_180 * 2.0F) + +#define DEGREE_225 (DEGREE_180 + DEGREE_45) +#define DEGREE_315 (DEGREE_270 + DEGREE_45) + +#define DEGREE_30 (DEGREE_180 / 6.0F) +#define DEGREE_60 (DEGREE_180 / 3.0F) +#define DEGREE_120 (DEGREE_360 / 3.0F) + +#define DEGREE_1 (DEGREE_180 / 180.0F) +#define DEGREE_5 (DEGREE_180 / 36.0F) +#define DEGREE_10 (DEGREE_180 / 18.0F) +#define DEGREE_15 (DEGREE_180 / 12.0F) +#define DEGREE_20 (DEGREE_180 / 8.0F) + +// Conversion routines + +#define ANGLE_TO_RAD ANGLE_1 +#define RAD_TO_ANGLE (180.0F / ANGLE_180) + +#define SHORT_TO_ANGLE (360.0/65536) + + +#pragma warning(disable : 4305) // 'initializing' : truncation from 'const double ' to 'float ' diff --git a/Source/Tools/SoFData/Basetsd.h b/Source/Tools/SoFData/Basetsd.h new file mode 100644 index 0000000..69b07bf --- /dev/null +++ b/Source/Tools/SoFData/Basetsd.h @@ -0,0 +1,173 @@ +/*++ + +Copyright (c) 1997-1998 Microsoft Corporation + +Module Name: + + basetsd.h + +Abstract: + + Type definitions for the basic sized types. + +Author: + + Jeff Havens (jhavens) 23-Oct-1997 + +Revision History: + +--*/ + +#ifndef _BASETSD_H_ +#define _BASETSD_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +// +// The following types are guaranteed to be signed and 32 bits wide. +// + +typedef int LONG32, *PLONG32; +typedef int INT32, *PINT32; + +// +// The following types are guaranteed to be unsigned and 32 bits wide. +// + +typedef unsigned int ULONG32, *PULONG32; +typedef unsigned int DWORD32, *PDWORD32; +typedef unsigned int UINT32, *PUINT32; + +// +// The INT_PTR is guaranteed to be the same size as a pointer. Its +// size with change with pointer size (32/64). It should be used +// anywhere that a pointer is cast to an integer type. UINT_PTR is +// the unsigned variation. +// +// HALF_PTR is half the size of a pointer it intended for use with +// within strcuture which contain a pointer and two small fields. +// UHALF_PTR is the unsigned variation. +// + +#ifdef _WIN64 + +typedef __int64 INT_PTR, *PINT_PTR; +typedef unsigned __int64 UINT_PTR, *PUINT_PTR; + +#define MAXINT_PTR (0x7fffffffffffffffI64) +#define MININT_PTR (0x8000000000000000I64) +#define MAXUINT_PTR (0xffffffffffffffffUI64) + +typedef unsigned int UHALF_PTR, *PUHALF_PTR; +typedef int HALF_PTR, *PHALF_PTR; + +#define MAXUHALF_PTR (0xffffffffUL) +#define MAXHALF_PTR (0x7fffffffL) +#define MINHALF_PTR (0x80000000L) + +#pragma warning(disable:4311) // type cast truncation + +#if !defined(__midl) +__inline +unsigned long +HandleToUlong( + void *h + ) +{ + return((unsigned long) h ); +} + +__inline +unsigned long +PtrToUlong( + void *p + ) +{ + return((unsigned long) p ); +} + +__inline +unsigned short +PtrToUshort( + void *p + ) +{ + return((unsigned short) p ); +} + +__inline +long +PtrToLong( + void *p + ) +{ + return((long) p ); +} + +__inline +short +PtrToShort( + void *p + ) +{ + return((short) p ); +} +#endif +#pragma warning(3:4311) // type cast truncation + +#else + + +typedef long INT_PTR, *PINT_PTR; +typedef unsigned long UINT_PTR, *PUINT_PTR; + +#define MAXINT_PTR (0x7fffffffL) +#define MININT_PTR (0x80000000L) +#define MAXUINT_PTR (0xffffffffUL) + +typedef unsigned short UHALF_PTR, *PUHALF_PTR; +typedef short HALF_PTR, *PHALF_PTR; + +#define MAXUHALF_PTR 0xffff +#define MAXHALF_PTR 0x7fff +#define MINHALF_PTR 0x8000 + +#define HandleToUlong( h ) ((ULONG) (h) ) +#define PtrToUlong( p ) ((ULONG) (p) ) +#define PtrToLong( p ) ((LONG) (p) ) +#define PtrToUshort( p ) ((unsigned short) (p) ) +#define PtrToShort( p ) ((short) (p) ) + +#endif + +// +// SIZE_T used for counts or ranges which need to span the range of +// of a pointer. SSIZE_T is the signed variation. +// + +typedef UINT_PTR SIZE_T, *PSIZE_T; +typedef INT_PTR SSIZE_T, *PSSIZE_T; + +// +// The following types are guaranteed to be signed and 64 bits wide. +// + +typedef __int64 LONG64, *PLONG64; +typedef __int64 INT64, *PINT64; + + +// +// The following types are guaranteed to be unsigned and 64 bits wide. +// + +typedef unsigned __int64 ULONG64, *PULONG64; +typedef unsigned __int64 DWORD64, *PDWORD64; +typedef unsigned __int64 UINT64, *PUINT64; + +#ifdef __cplusplus +} +#endif + +#endif // _BASETSD_H_ diff --git a/Source/Tools/SoFData/Resource.rc b/Source/Tools/SoFData/Resource.rc new file mode 100644 index 0000000..028d39f --- /dev/null +++ b/Source/Tools/SoFData/Resource.rc @@ -0,0 +1,72 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_ICON1 ICON DISCARDABLE "icon1.ico" +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/Source/Tools/SoFData/SoFData.dsp b/Source/Tools/SoFData/SoFData.dsp new file mode 100644 index 0000000..7994e58 --- /dev/null +++ b/Source/Tools/SoFData/SoFData.dsp @@ -0,0 +1,192 @@ +# Microsoft Developer Studio Project File - Name="SoFData" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=SoFData - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "SoFData.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "SoFData.mak" CFG="SoFData - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "SoFData - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "SoFData - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName ""$/SOF/Utils3/SoFData", CLPAAAAA" +# PROP Scc_LocalPath "." +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "SoFData - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "SoFData - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "SoFData - Win32 Release" +# Name "SoFData - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\cmdlib.c +# End Source File +# Begin Source File + +SOURCE=.\images.c +# End Source File +# Begin Source File + +SOURCE=.\lbmlib.c +# End Source File +# Begin Source File + +SOURCE=.\mathlib.c +# End Source File +# Begin Source File + +SOURCE=.\md4.c +# End Source File +# Begin Source File + +SOURCE=.\qdata.c +# End Source File +# Begin Source File + +SOURCE=.\qfiles.c +# End Source File +# Begin Source File + +SOURCE=.\scriplib.c +# End Source File +# Begin Source File + +SOURCE=.\threads.c +# End Source File +# Begin Source File + +SOURCE=.\tmix.c +# End Source File +# Begin Source File + +SOURCE=.\token.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\Angles.h +# End Source File +# Begin Source File + +SOURCE=.\cmdlib.h +# End Source File +# Begin Source File + +SOURCE=.\lbmlib.h +# End Source File +# Begin Source File + +SOURCE=.\mathlib.h +# End Source File +# Begin Source File + +SOURCE=.\q_Typedef.h +# End Source File +# Begin Source File + +SOURCE=.\qdata.h +# End Source File +# Begin Source File + +SOURCE=.\qfiles.h +# End Source File +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# Begin Source File + +SOURCE=.\scriplib.h +# End Source File +# Begin Source File + +SOURCE=.\threads.h +# End Source File +# Begin Source File + +SOURCE=.\token.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\icon1.ico +# End Source File +# Begin Source File + +SOURCE=.\Resource.rc +# End Source File +# End Group +# End Target +# End Project diff --git a/Source/Tools/SoFData/SoFData.dsw b/Source/Tools/SoFData/SoFData.dsw new file mode 100644 index 0000000..1127686 --- /dev/null +++ b/Source/Tools/SoFData/SoFData.dsw @@ -0,0 +1,37 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "SoFData"=.\SoFData.dsp - Package Owner=<4> + +Package=<5> +{{{ + begin source code control + "$/SOF/Utils3/SoFData", CLPAAAAA + . + end source code control +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ + begin source code control + "$/SOF/Utils3/SoFData", CLPAAAAA + . + end source code control +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/Source/Tools/SoFData/cmdlib.c b/Source/Tools/SoFData/cmdlib.c new file mode 100644 index 0000000..d1f9927 --- /dev/null +++ b/Source/Tools/SoFData/cmdlib.c @@ -0,0 +1,1228 @@ +// cmdlib.c + +#include "cmdlib.h" +#include +#include +#include +#include + + +#ifdef WIN32 +#include +#include +#endif + +#define BASEDIRNAME "base" +#define PATHSEPERATOR '/' + +// set these before calling CheckParm +int myargc; +char **myargv; + +char com_token[1024]; +qboolean com_eof; + +qboolean archive; +char archivedir[1024]; + +qboolean g_dokeypress = false; + +qboolean g_nomkdir = false; + + +void *qmalloc (int size) +{ + void *b; + b = malloc(size); + memset (b, 0, size); + return b; +} + +/* +=================== +ExpandWildcards + +Mimic unix command line expansion +=================== +*/ +#define MAX_EX_ARGC 1024 +int ex_argc; +char *ex_argv[MAX_EX_ARGC]; +#ifdef _WIN32 +#include "io.h" +void ExpandWildcards (int *argc, char ***argv) +{ + struct _finddata_t fileinfo; + int handle; + int i; + char filename[1024]; + char filebase[1024]; + char *path; + + ex_argc = 0; + for (i=0 ; i<*argc ; i++) + { + path = (*argv)[i]; + if ( path[0] == '-' + || ( !strstr(path, "*") && !strstr(path, "?") ) ) + { + ex_argv[ex_argc++] = path; + continue; + } + + handle = _findfirst (path, &fileinfo); + if (handle == -1) + return; + + ExtractFilePath (path, filebase); + + do + { + sprintf (filename, "%s%s", filebase, fileinfo.name); + ex_argv[ex_argc++] = copystring (filename); + } while (_findnext( handle, &fileinfo ) != -1); + + _findclose (handle); + } + + *argc = ex_argc; + *argv = ex_argv; +} +#else +void ExpandWildcards (int *argc, char ***argv) +{ +} +#endif + +#ifdef WIN_ERROR +#include +/* +================= +Error + +For abnormal program terminations in windowed apps +================= +*/ +void Error (char *error, ...) +{ + va_list argptr; + char text[1024]; + char text2[1024]; + int err; + + err = GetLastError (); + + va_start (argptr,error); + vsprintf (text, error,argptr); + va_end (argptr); + + sprintf (text2, "%s\nGetLastError() = %i", text, err); + MessageBox(NULL, text2, "Error", 0 /* MB_OK */ ); + + DebugBreak(); + exit (1); +} + +#else +/* +================= +Error + +For abnormal program terminations in console apps +================= +*/ +void Error (char *error, ...) +{ + va_list argptr; + + printf ("\n************ ERROR ************\n"); + + va_start (argptr,error); + vprintf (error,argptr); + va_end (argptr); + printf ("\n"); + + if (g_dokeypress) + { + _cputs("Failure! ... Hit a key: "); + getch(); + } + exit (1); +} +#endif + +// only printf if in verbose mode +qboolean verbose = false; +void qprintf (char *format, ...) +{ + va_list argptr; + + if (!verbose) + return; + + va_start (argptr,format); + vprintf (format,argptr); + va_end (argptr); +} + + +/* + +qdir will hold the path up to the quake directory, including the slash + + f:\quake\ + /raid/quake/ + +gamedir will hold qdir + the game directory (id1, id2, etc) + + */ + +char qdir[1024]; +char gamedir[1024]; + +#define ARTDIRNAME "art" +char g_publishDir[1024]; +extern char *g_outputDir; + +void SetQdirFromPath (char *path) +{ + char temp[1024]; + char *c; + int len; + + if (!(path[0] == '/' || path[0] == '\\' || path[1] == ':')) + { // path is partial + Q_getwd (temp); + strcat (temp, path); + path = temp; + } + + // search for "quake2" in path +#if 1 + len = strlen(BASEDIRNAME); + + for (c=path+strlen(path)-1 ; c != path ; c--) + { + if ((*(c-1)=='/' || *(c-1)=='\\')&&!Q_strncasecmp (c, BASEDIRNAME, len)) + { + strncpy (qdir, path, c-path); + qprintf ("qdir: %s\n", qdir); + + while (*c) + { + if (*c == '/' || *c == '\\') + { + strncpy (gamedir, path, c+1-path); + qprintf ("gamedir: %s\n", gamedir); + g_outputDir = gamedir; + return; + } + + c++; + } + + assert(0); + Error ("Gamedir at root in %s", path); + + return; + } + } + + len = strlen(ARTDIRNAME); + + for (c=path+strlen(path)-1 ; c != path ; c--) + { + int qdirlen; + + if ((*(c-1)=='/' || *(c-1)=='\\')&&!Q_strncasecmp (c, ARTDIRNAME, len)) + { + qdirlen = c-path; + strncpy (qdir, path, qdirlen); // Copy the path before the ARTDIRNAME to qdir. + + while (*c) + { + if (*c == '/' || *c == '\\') + { + strncpy(gamedir, path, c+1-path); // Set the gamedir to the path including the "ART/" or "ART\" + + // Now, we need an alternate directory with BASE instead of ART. + strncpy(g_publishDir, qdir, qdirlen); + c = g_publishDir + qdirlen; + strncpy(c, BASEDIRNAME, strlen(BASEDIRNAME)); + c += strlen(BASEDIRNAME); + strcpy(c, "/"); + + printf("Publishdir = '%s'\n", g_publishDir); + printf("Gamedir = '%s'\n", gamedir); + + g_outputDir = g_publishDir; + return; + } + + c++; + } + + assert(0); + Error ("Gamedir at root in %s", path); + + return; + } + } + + assert(0); + Error ("SetQdirFromPath: no '%s' in %s", BASEDIRNAME, path); +#else + len = strlen(BASEDIRNAME); + for (c=path+strlen(path)-1 ; c != path ; c--) + if (!Q_strncasecmp (c, BASEDIRNAME, len)) + { + strncpy (qdir, path, c+len+1-path); + qprintf ("qdir: %s\n", qdir); + c += len+1; + while (*c) + { + if (*c == '/' || *c == '\\') + { + strncpy (gamedir, path, c+1-path); + qprintf ("gamedir: %s\n", gamedir); + return; + } + c++; + } + Error ("No gamedir in %s", path); + return; + } + Error ("SetQdirFromPath: no '%s' in %s", BASEDIRNAME, path); +#endif +} + +char *ExpandArg (char *path) +{ + static char full[1024]; + + if (path[0] != '/' && path[0] != '\\' && path[1] != ':') + { + Q_getwd (full); + strcat (full, path); + } + else + strcpy (full, path); + return full; +} + +char *ExpandPath (char *path) +{ + static char full[1024]; + if (!qdir) + Error ("ExpandPath called without qdir set"); + if (path[0] == '/' || path[0] == '\\' || path[1] == ':') + return path; + sprintf (full, "%s%s", qdir, path); + return full; +} + +char *ExpandPathAndArchive (char *path) +{ + char *expanded; + char archivename[1024]; + + expanded = ExpandPath (path); + + if (archive) + { + sprintf (archivename, "%s/%s", archivedir, path); + QCopyFile (expanded, archivename); + } + return expanded; +} + + +char *copystring(char *s) +{ + char *b; + b = SafeMalloc(strlen(s)+1, "copystring"); + strcpy (b, s); + return b; +} + + + +/* +================ +I_FloatTime +================ +*/ +double I_FloatTime (void) +{ + time_t t; + + time (&t); + + return t; +#if 0 +// more precise, less portable + struct timeval tp; + struct timezone tzp; + static int secbase; + + gettimeofday(&tp, &tzp); + + if (!secbase) + { + secbase = tp.tv_sec; + return tp.tv_usec/1000000.0; + } + + return (tp.tv_sec - secbase) + tp.tv_usec/1000000.0; +#endif +} + +void Q_getwd (char *out) +{ +#ifdef WIN32 + _getcwd (out, 256); + strcat (out, "\\"); +#else + getwd (out); + strcat (out, "/"); +#endif +} + + +void Q_mkdir (char *path) +{ +#ifdef WIN32 + if (_mkdir (path) != -1) + return; +#else + if (mkdir (path, 0777) != -1) + return; +#endif + if (errno != EEXIST) + Error ("mkdir %s: %s",path, strerror(errno)); +} + +/* +============ +FileTime + +returns -1 if not present +============ +*/ +int FileTime (char *path) +{ + struct stat buf; + + if (stat (path,&buf) == -1) + return -1; + + return buf.st_mtime; +} + + + +/* +============== +COM_Parse + +Parse a token out of a string +============== +*/ +char *COM_Parse (char *data) +{ + int c; + int len; + + len = 0; + com_token[0] = 0; + + if (!data) + return NULL; + +// skip whitespace +skipwhite: + while ( (c = *data) <= ' ') + { + if (c == 0) + { + com_eof = true; + return NULL; // end of file; + } + data++; + } + +// skip // comments + if (c=='/' && data[1] == '/') + { + while (*data && *data != '\n') + data++; + goto skipwhite; + } + + +// handle quoted strings specially + if (c == '\"') + { + data++; + do + { + c = *data++; + if (c=='\"') + { + com_token[len] = 0; + return data; + } + com_token[len] = c; + len++; + } while (1); + } + +// parse single characters + if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c==':') + { + com_token[len] = c; + len++; + com_token[len] = 0; + return data+1; + } + +// parse a regular word + do + { + com_token[len] = c; + data++; + len++; + c = *data; + if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c==':') + break; + } while (c>32); + + com_token[len] = 0; + return data; +} + + +int Q_strncasecmp (char *s1, char *s2, int n) +{ + int c1, c2; + + do + { + c1 = *s1++; + c2 = *s2++; + + if (!n--) + return 0; // strings are equal until end point + + if (c1 != c2) + { + if (c1 >= 'a' && c1 <= 'z') + c1 -= ('a' - 'A'); + if (c2 >= 'a' && c2 <= 'z') + c2 -= ('a' - 'A'); + if (c1 != c2) + return -1; // strings not equal + } + } while (c1); + + return 0; // strings are equal +} + +int Q_strcasecmp (char *s1, char *s2) +{ + return Q_strncasecmp (s1, s2, 99999); +} + + +char *Q_strupr (char *start) +{ + char *in; + in = start; + while (*in) + { + *in = toupper(*in); + in++; + } + return start; +} + +char *Q_strlower (char *start) +{ + char *in; + in = start; + while (*in) + { + *in = tolower(*in); + in++; + } + return start; +} + + +/* +============================================================================= + + MISC FUNCTIONS + +============================================================================= +*/ + +int argc; +char *argv[MAX_NUM_ARGVS]; + +/* +============ +ParseCommandLine +============ +*/ +void ParseCommandLine (char *lpCmdLine) +{ + argc = 1; + argv[0] = "programname"; + + while (*lpCmdLine && (argc < MAX_NUM_ARGVS)) + { + while (*lpCmdLine && ((*lpCmdLine <= 32) || (*lpCmdLine > 126))) + lpCmdLine++; + + if (*lpCmdLine) + { + argv[argc] = lpCmdLine; + argc++; + + while (*lpCmdLine && ((*lpCmdLine > 32) && (*lpCmdLine <= 126))) + lpCmdLine++; + + if (*lpCmdLine) + { + *lpCmdLine = 0; + lpCmdLine++; + } + + } + } +} + + +/* +================= +CheckParm + +Checks for the given parameter in the program's command line arguments +Returns the argument number (1 to argc-1) or 0 if not present +================= +*/ +int CheckParm (char *check) +{ + int i; + + for (i = 1;i 0 && path[length] != PATHSEPERATOR) + length--; + path[length] = 0; +} + +void StripExtension (char *path) +{ + int length; + + length = strlen(path)-1; + while (length > 0 && path[length] != '.') + { + length--; + if (path[length] == '/') + return; // no extension + } + if (length) + path[length] = 0; +} + + +/* +==================== +Extract file parts +==================== +*/ +// FIXME: should include the slash, otherwise +// backing to an empty path will be wrong when appending a slash +void ExtractFilePath (char *path, char *dest) +{ + char *src; + + src = path + strlen(path) - 1; + +// +// back up until a \ or the start +// + while (src != path && *(src-1) != '\\' && *(src-1) != '/') + src--; + + memcpy (dest, path, src-path); + dest[src-path] = 0; +} + +void ExtractFileName (char *path, char *dest) +{ + char *src; + + src = path + strlen(path) - 1; + +// +// back up until a \ or the start +// + while (src != path && *(src-1) != '/' + && *(src-1) != '\\' ) + src--; + + while (*src) + { + *dest++ = *src++; + } + *dest = 0; +} + +void ExtractFileBase (char *path, char *dest) +{ + char *src; + + src = path + strlen(path) - 1; + +// +// back up until a \ or the start +// + while (src != path && *(src-1) != PATHSEPERATOR) + src--; + + while (*src && *src != '.') + { + *dest++ = *src++; + } + *dest = 0; +} + +void ExtractFileExtension (char *path, char *dest) +{ + char *src; + + src = path + strlen(path) - 1; + +// +// back up until a . or the start +// + while (src != path && *(src-1) != '.') + src--; + if (src == path) + { + *dest = 0; // no extension + return; + } + + strcpy (dest,src); +} + + +/* +============== +ParseNum / ParseHex +============== +*/ +int ParseHex (char *hex) +{ + char *str; + int num; + + num = 0; + str = hex; + + while (*str) + { + num <<= 4; + if (*str >= '0' && *str <= '9') + num += *str-'0'; + else if (*str >= 'a' && *str <= 'f') + num += 10 + *str-'a'; + else if (*str >= 'A' && *str <= 'F') + num += 10 + *str-'A'; + else + Error ("Bad hex number: %s",hex); + str++; + } + + return num; +} + + +int ParseNum (char *str) +{ + if (str[0] == '$') + return ParseHex (str+1); + if (str[0] == '0' && str[1] == 'x') + return ParseHex (str+2); + return atol (str); +} + + + +/* +============================================================================ + + BYTE ORDER FUNCTIONS + +============================================================================ +*/ + +#ifdef _SGI_SOURCE +#define __BIG_ENDIAN__ +#endif + +#ifdef __BIG_ENDIAN__ + +short LittleShort (short l) +{ + byte b1,b2; + + b1 = l&255; + b2 = (l>>8)&255; + + return (b1<<8) + b2; +} + +short BigShort (short l) +{ + return l; +} + + +int LittleLong (int l) +{ + byte b1,b2,b3,b4; + + b1 = l&255; + b2 = (l>>8)&255; + b3 = (l>>16)&255; + b4 = (l>>24)&255; + + return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; +} + +int BigLong (int l) +{ + return l; +} + + +float LittleFloat (float l) +{ + union {byte b[4]; float f;} in, out; + + in.f = l; + out.b[0] = in.b[3]; + out.b[1] = in.b[2]; + out.b[2] = in.b[1]; + out.b[3] = in.b[0]; + + return out.f; +} + +float BigFloat (float l) +{ + return l; +} + + +#else + + +short BigShort (short l) +{ + byte b1,b2; + + b1 = l&255; + b2 = (l>>8)&255; + + return (b1<<8) + b2; +} + +short LittleShort (short l) +{ + return l; +} + + +int BigLong (int l) +{ + byte b1,b2,b3,b4; + + b1 = l&255; + b2 = (l>>8)&255; + b3 = (l>>16)&255; + b4 = (l>>24)&255; + + return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; +} + +int LittleLong (int l) +{ + return l; +} + +float BigFloat (float l) +{ + union {byte b[4]; float f;} in, out; + + in.f = l; + out.b[0] = in.b[3]; + out.b[1] = in.b[2]; + out.b[2] = in.b[1]; + out.b[3] = in.b[0]; + + return out.f; +} + +float LittleFloat (float l) +{ + return l; +} + + +#endif + + +//======================================================= + + +// FIXME: byte swap? + +// this is a 16 bit, non-reflected CRC using the polynomial 0x1021 +// and the initial and final xor values shown below... in other words, the +// CCITT standard CRC used by XMODEM + +#define CRC_INIT_VALUE 0xffff +#define CRC_XOR_VALUE 0x0000 + +static unsigned short crctable[256] = +{ + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 +}; + +void CRC_Init(unsigned short *crcvalue) +{ + *crcvalue = CRC_INIT_VALUE; +} + +void CRC_ProcessByte(unsigned short *crcvalue, byte data) +{ + *crcvalue = (*crcvalue << 8) ^ crctable[(*crcvalue >> 8) ^ data]; +} + +unsigned short CRC_Value(unsigned short crcvalue) +{ + return crcvalue ^ CRC_XOR_VALUE; +} +//============================================================================= + +/* +============ +CreatePath +============ +*/ +void CreatePath (char *path) +{ + char *ofs, c; + + if (g_nomkdir) + return; // Running a mkdir unecessarily on a server with no file creation rights can halt qdata. + + if (path[1] == ':') + path += 2; + + for (ofs = path+1 ; *ofs ; ofs++) + { + c = *ofs; + if (c == '/' || c == '\\') + { // create the directory + *ofs = 0; + Q_mkdir (path); + *ofs = c; + } + } +} + + +/* +============ +QCopyFile + + Used to archive source files +============ +*/ +void QCopyFile (char *from, char *to) +{ + void *buffer; + int length; + + length = LoadFile (from, &buffer); + CreatePath (to); + SaveFile (to, buffer, length); + free (buffer); +} + +void *SafeMalloc(size_t n, char *desc) +{ + void *p; + + if((p = malloc(n)) == NULL) + { + Error("Failed to allocate %d bytes for '%s'.\n", n, desc); + } + memset(p, 0, n); + return p; +} diff --git a/Source/Tools/SoFData/cmdlib.h b/Source/Tools/SoFData/cmdlib.h new file mode 100644 index 0000000..b723f5e --- /dev/null +++ b/Source/Tools/SoFData/cmdlib.h @@ -0,0 +1,129 @@ +// cmdlib.h + +#ifndef __CMDLIB__ +#define __CMDLIB__ + +#ifdef _WIN32 +#pragma warning(disable : 4244) // MIPS +#pragma warning(disable : 4136) // X86 +#pragma warning(disable : 4051) // ALPHA + +#pragma warning(disable : 4018) // signed/unsigned mismatch +#pragma warning(disable : 4305) // truncate from double to float +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "q_typedef.h" + +// the dec offsetof macro doesnt work very well... +#define myoffsetof(type,identifier) ((size_t)&((type *)0)->identifier) + + +// set these before calling CheckParm +extern int myargc; +extern char **myargv; + +char *Q_strupr (char *in); +char *Q_strlower (char *in); +int Q_strncasecmp (char *s1, char *s2, int n); +int Q_strcasecmp (char *s1, char *s2); +void Q_getwd (char *out); + +int Q_filelength (FILE *f); +int FileTime (char *path); + +void Q_mkdir (char *path); + +extern char qdir[1024]; +extern char gamedir[1024]; +void SetQdirFromPath (char *path); +char *ExpandArg (char *path); // from cmd line +char *ExpandPath (char *path); // from scripts +char *ExpandPathAndArchive (char *path); + + +double I_FloatTime (void); + +void Error (char *error, ...); +int CheckParm (char *check); +void ParseCommandLine (char *lpCmdLine); + +FILE *SafeOpenWrite (char *filename); +FILE *SafeOpenRead (char *filename); +void SafeRead (FILE *f, void *buffer, int count); +void SafeWrite (FILE *f, void *buffer, int count); + +int LoadFile (char *filename, void **bufferptr); +int TryLoadFile (char *filename, void **bufferptr); +int LoadFileNoCrash (char *filename, void **bufferptr); +void SaveFile (char *filename, void *buffer, int count); +qboolean FileExists (char *filename); + +void DefaultExtension (char *path, char *extension); +void DefaultPath (char *path, char *basepath); +void StripFilename (char *path); +void StripExtension (char *path); + +void ExtractFilePath (char *path, char *dest); +void ExtractFileName (char *path, char *dest); +void ExtractFileBase (char *path, char *dest); +void ExtractFileExtension (char *path, char *dest); + +int ParseNum (char *str); + +short BigShort (short l); +short LittleShort (short l); +int BigLong (int l); +int LittleLong (int l); +float BigFloat (float l); +float LittleFloat (float l); + + +char *COM_Parse (char *data); + +extern char com_token[1024]; +extern qboolean com_eof; + +#define MAX_NUM_ARGVS 32 +extern int argc; +extern char *argv[MAX_NUM_ARGVS]; + +char *copystring(char *s); + + +void CRC_Init(unsigned short *crcvalue); +void CRC_ProcessByte(unsigned short *crcvalue, byte data); +unsigned short CRC_Value(unsigned short crcvalue); + +void CreatePath (char *path); +void QCopyFile (char *from, char *to); +void *SafeMalloc(size_t n, char *desc); + +extern qboolean archive; +extern char archivedir[1024]; + + +extern qboolean verbose; +void qprintf (char *format, ...); + +void ExpandWildcards (int *argc, char ***argv); + + +// for compression routines +typedef struct +{ + byte *data; + int count; +} cblock_t; + + +extern qboolean g_dokeypress; + +#endif diff --git a/Source/Tools/SoFData/icon1.ico b/Source/Tools/SoFData/icon1.ico new file mode 100644 index 0000000..f557375 Binary files /dev/null and b/Source/Tools/SoFData/icon1.ico differ diff --git a/Source/Tools/SoFData/images.c b/Source/Tools/SoFData/images.c new file mode 100644 index 0000000..8988fbb --- /dev/null +++ b/Source/Tools/SoFData/images.c @@ -0,0 +1,672 @@ +#include "qdata.h" +#include +#include + +extern char *g_outputDir; + +char out_dir[1024]; +char mip_prefix[1024]; // directory to dump the textures in + +unsigned *longimage; +int longimagewidth, longimageheight; + +unsigned total_x = 0; +unsigned total_y = 0; +unsigned total_textures = 0; + +#define MAX_IMAGE_SIZE 1024 + +unsigned bufferl[MAX_IMAGE_SIZE*MAX_IMAGE_SIZE]; +unsigned scaled[MAX_IMAGE_SIZE*MAX_IMAGE_SIZE]; +unsigned out[MAX_IMAGE_SIZE*MAX_IMAGE_SIZE]; + +// ******************************************************************** +// ** Mip Map Pre-Processing Routines +// ******************************************************************** + +void GL_ResampleTexture (unsigned *in, int inwidth, int inheight, unsigned *out, int outwidth, int outheight) +{ + int i, j; + unsigned *inrow, *inrow2; + unsigned frac, fracstep; + unsigned p1[1024], p2[1024]; + byte *pix1, *pix2, *pix3, *pix4; + + fracstep = inwidth*0x10000/outwidth; + + frac = fracstep>>2; + for (i=0 ; i>16); + frac += fracstep; + } + frac = 3*(fracstep>>2); + for (i=0 ; i>16); + frac += fracstep; + } + + for (i=0 ; i> 1; + for (j=0 ; j>2; + ((byte *)(out+j))[1] = (pix1[1] + pix2[1] + pix3[1] + pix4[1])>>2; + ((byte *)(out+j))[2] = (pix1[2] + pix2[2] + pix3[2] + pix4[2])>>2; + ((byte *)(out+j))[3] = (pix1[3] + pix2[3] + pix3[3] + pix4[3])>>2; + } + } +} + +byte *PixelAddr(byte *in, int width, int height, int x, int y) +{ + return in+((y%height)*width+(x%width))*4; +} + +void GL_MipMap (byte *out, byte *in, int width, int height) +{ + int i, j, k, l; + byte *src; + byte *dest; + int newwidth,newheight; + int temp[4]; + + newwidth=width>>1; + if (newwidth<1) + newwidth=1; + newheight=height>>1; + if (newheight<1) + newheight=1; + + for (i=0;i>1)); + for (k=0;k<4;k++) + { + temp[k]+=(int)src[k]; + } + } + dest=PixelAddr(out,newwidth,newheight,j,i); + for (k=0;k<4;k++) + dest[k]=(byte)((temp[k]+2)>>2); + } + } +} + +miptex32_t *CreateMip32(unsigned *data, unsigned width, unsigned height, int *FinalSize, qboolean mip) +{ + int scaled_width, scaled_height; + int miplevel; + miptex32_t *mp; + byte *pos; + int size; + paletteRGBA_t *test; + + for (scaled_width = 1 ; scaled_width < width ; scaled_width<<=1) + ; + if (1 && scaled_width > width && 1) + scaled_width >>= 1; + for (scaled_height = 1 ; scaled_height < height ; scaled_height<<=1) + ; + if (1 && scaled_height > height && 1) + scaled_height >>= 1; + + // don't ever bother with >256 textures + if (scaled_width > MAX_IMAGE_SIZE) + scaled_width = MAX_IMAGE_SIZE; + if (scaled_height > MAX_IMAGE_SIZE) + scaled_height = MAX_IMAGE_SIZE; + + if (scaled_width < 1) + scaled_width = 1; + if (scaled_height < 1) + scaled_height = 1; + + size = sizeof(*mp) + (scaled_width*scaled_height*3*4); + mp = (miptex32_t *)SafeMalloc(size, "CreateMip"); + memset(mp,0,size); + + mp->version = MIP32_VERSION; + + size = width*height; + test = (paletteRGBA_t *)data; + while(size) + { + if (test->a != 255) + { + mp->flags |= LittleLong(SURF_ALPHA_TEXTURE); + break; + } + + size--; + test++; + } + + if (scaled_width == width && scaled_height == height) + { + memcpy (scaled, data, width*height*4); + } + else + GL_ResampleTexture (data, width, height, scaled, scaled_width, scaled_height); + + pos = (byte *)(mp + 1); + miplevel = 0; + + + while ((!miplevel || scaled_width > 1 || scaled_height > 1) && (miplevel <= MIPLEVELS-1)) + { + if (miplevel > 0) + { + GL_MipMap((byte *)out, (byte *)scaled, scaled_width, scaled_height); + scaled_width >>= 1; + scaled_height >>= 1; + if (scaled_width < 1) + scaled_width = 1; + if (scaled_height < 1) + scaled_height = 1; + } + else + { + memcpy(out, scaled, MAX_IMAGE_SIZE * MAX_IMAGE_SIZE * 4); + } + + + mp->width[miplevel] = scaled_width; + mp->height[miplevel] = scaled_height; + mp->offsets[miplevel] = pos - ((byte *)(mp)); + memcpy(pos, out, scaled_width * scaled_height * 4); + memcpy(scaled, out, MAX_IMAGE_SIZE * MAX_IMAGE_SIZE * 4); + pos += scaled_width * scaled_height * 4; + + // If no mipping specified, and texture size is always valid, break out + if(!mip && (scaled_width <= 256) && (scaled_height <= 256)) + { + break; + } + + miplevel++; + } + + *FinalSize = pos - ((byte *)(mp)); + + return mp; +} + +/* +============================================================================= + +MIPTEX GRABBING + +============================================================================= +*/ + +typedef enum +{ + pt_contents, + pt_flags, + pt_animvalue, + pt_altnamevalue, + pt_damagenamevalue, + pt_flagvalue, + pt_materialvalue, + pt_scale, + pt_mip, + pt_detail, + pt_gl, + pt_nomip, + pt_detailer, + pt_parental, + pt_spherical, + pt_sphericaler, +} parmtype_t; + +typedef struct +{ + char *name; + int flags; + parmtype_t type; +} mipparm_t; + +mipparm_t mipparms[] = +{ + // utility content attributes + {"pushpull",CONTENTS_PUSHPULL, pt_contents}, + {"water", CONTENTS_WATER, pt_contents}, + {"slime", CONTENTS_SLIME, pt_contents}, // mildly damaging + {"lava", CONTENTS_LAVA, pt_contents}, // very damaging + {"window", CONTENTS_WINDOW, pt_contents}, // solid, but doesn't eat internal textures + {"mist", CONTENTS_MIST, pt_contents}, // non-solid window + {"origin", CONTENTS_ORIGIN, pt_contents}, // center of rotating brushes + {"playerclip", CONTENTS_PLAYERCLIP, pt_contents}, + {"monsterclip", CONTENTS_MONSTERCLIP, pt_contents}, + + // utility surface attributes + {"hint", SURF_HINT, pt_flags}, + {"skip", SURF_SKIP, pt_flags}, + {"light", SURF_LIGHT, pt_flagvalue}, // value is the light quantity + + {"animspeed",SURF_ANIMSPEED, pt_flagvalue}, // value will hold the anim speed in fps + + // texture chaining + {"anim", 0, pt_animvalue}, // animname is the next animation + {"alt", 0, pt_altnamevalue}, // altname is the alternate texture + {"damage", 0, pt_damagenamevalue}, // damagename is the damage texture + {"scale", 0, pt_scale}, // next two values are for scale + {"mip", 0, pt_mip}, + {"detail", 0, pt_detail}, + {"spherical", 0, pt_spherical}, + + {"GL_ZERO", GL_ZERO, pt_gl}, + {"GL_ONE", GL_ONE, pt_gl}, + {"GL_SRC_COLOR", GL_SRC_COLOR, pt_gl}, + {"GL_ONE_MINUS_SRC_COLOR", GL_ONE_MINUS_SRC_COLOR, pt_gl}, + {"GL_DST_COLOR", GL_DST_COLOR, pt_gl}, + {"GL_ONE_MINUS_DST_COLOR", GL_ONE_MINUS_DST_COLOR, pt_gl}, + {"GL_SRC_ALPHA", GL_SRC_ALPHA, pt_gl}, + {"GL_ONE_MINUS_SRC_ALPHA", GL_ONE_MINUS_SRC_ALPHA, pt_gl}, + {"GL_DST_ALPHA", GL_DST_ALPHA, pt_gl}, + {"GL_ONE_MINUS_DST_ALPHA", GL_ONE_MINUS_DST_ALPHA, pt_gl}, + {"GL_SRC_ALPHA_SATURATE", GL_SRC_ALPHA_SATURATE, pt_gl}, + + // server attributes + {"slick", SURF_SLICK, pt_flags}, + + // drawing attributes + {"sky", SURF_SKY, pt_flags}, + {"warping", SURF_WARP, pt_flags}, // only valid with 64x64 textures + {"trans33", SURF_TRANS33, pt_flags}, // translucent should allso set fullbright + {"trans66", SURF_TRANS66, pt_flags}, + {"flowing", SURF_FLOWING, pt_flags}, // flow direction towards angle 0 + {"nodraw", SURF_NODRAW, pt_flags}, // for clip textures and trigger textures + {"alpha", SURF_ALPHA_TEXTURE, pt_flags}, + {"undulate", SURF_UNDULATE, pt_flags}, // rock surface up and down... + {"skyreflect", SURF_SKYREFLECT, pt_flags}, // liquid will somewhat reflect the sky - not quite finished.... + + {"material", SURF_MATERIAL, pt_materialvalue}, + {"metal", SURF_TYPE_METAL, pt_flags}, + {"stone", SURF_TYPE_STONE, pt_flags}, + {"wood", SURF_TYPE_WOOD, pt_flags}, + + {"m_nomip", 0, pt_nomip}, + {"m_detail", 0, pt_detailer}, + {"m_spherical", 0, pt_sphericaler}, + {"m_parental", 0, pt_parental}, + + {NULL, 0, pt_contents} +}; + +void CopyStringRemoveExt(char *dst, char *src, char *ext) +{ + strcpy(dst, src); + strlwr(dst); + strlwr(ext); + // If extension - remove it + if(strstr(dst, ext)) + { + dst[strlen(dst) - 4] = 0; + } +} + +/* +============== +Cmd_Mip + +$mip filename x y width height +must be multiples of sixteen +SURF_WINDOW +============== +*/ + +void Cmd_Mip (void) +{ + int xl,yl,xh,yh,w,h; + int flags, value, contents; + mipparm_t *mp; + char lumpname[128]; + char altname[128]; + char animname[128]; + char damagename[128]; + float damage_health; + materialtype_t *mat; + char filename[1024]; + unsigned *destl, *sourcel; + int linedelta, x, y; + int size; + miptex32_t *qtex32; + float scale_x, scale_y; + int mip_scale; + // detail texturing + char dt_name[128]; + float dt_scale_x, dt_scale_y; + float dt_u, dt_v; + float dt_alpha; + int dt_src_blend_mode, dt_dst_blend_mode; + int flags2; + + + GetScriptToken (false); + CopyStringRemoveExt(lumpname, token, ".m32"); + + GetScriptToken (false); + xl = atoi (token); + GetScriptToken (false); + yl = atoi (token); + GetScriptToken (false); + w = atoi (token); + GetScriptToken (false); + h = atoi (token); + + total_x += w; + total_y += h; + total_textures++; + + if ( (w & 7) || (h & 7) ) + Error ("line %i: miptex sizes must be multiples of 8", scriptline); + + flags = 0; + flags2 = 0; + contents = 0; + value = 0; + mip_scale = 0; + + altname[0] = animname[0] = damagename[0] = 0; + + damage_health = 0.0; + scale_x = scale_y = 0.5; + + // detail texturing + dt_name[0] = 0; + dt_scale_x = dt_scale_y = 0.0; + dt_u = dt_v = 0.0; + dt_alpha = 0.0; + dt_src_blend_mode = dt_dst_blend_mode = 0; + + // get optional flags and values + while (ScriptTokenAvailable ()) + { + GetScriptToken (false); + + for (mp=mipparms ; mp->name ; mp++) + { + if (!strcmp(mp->name, token)) + { + switch (mp->type) + { + case pt_animvalue: + GetScriptToken (false); // specify the next animation frame + CopyStringRemoveExt(animname, token, ".m32"); + break; + case pt_altnamevalue: + GetScriptToken (false); // specify the alternate texture + CopyStringRemoveExt(altname, token, ".m32"); + break; + case pt_damagenamevalue: + GetScriptToken (false); // specify the damage texture + CopyStringRemoveExt(damagename, token, ".m32"); + GetScriptToken (false); // specify the damage health + damage_health = atof(token); + break; + case pt_flags: + flags |= mp->flags; + break; + case pt_contents: + contents |= mp->flags; + break; + case pt_flagvalue: + flags |= mp->flags; + GetScriptToken (false); // specify the light value + value = atoi(token); + break; + case pt_materialvalue: + GetScriptToken(false); + for (mat=materialtypes ; mat->name ; mat++) + { + if (!strcmp(mat->name, token)) + { + // assumes SURF_MATERIAL is in top 8 bits + flags = (flags & 0x0FFFFFF) | (mat->value << 24); + break; + } + } + break; + case pt_scale: + GetScriptToken (false); // specify the x scale + scale_x = atof(token); + GetScriptToken (false); // specify the y scale + scale_y = atof(token); + break; + + case pt_mip: + mip_scale = 1; + break; + + case pt_detailer: + flags2 |= MIP32_DETAILER_FLAG2; + break; + + case pt_sphericaler: + flags2 |= MIP32_SPHERICAL_FLAG2; + break; + + case pt_nomip: + flags2 |= MIP32_NOMIP_FLAG2; + break; + + case pt_parental: + flags2 |= MIP32_PARENTAL_FLAG2; + break; + + case pt_spherical: + GetScriptToken(false); + CopyStringRemoveExt(dt_name, token, ".m32"); + break; + + case pt_detail: + GetScriptToken(false); + CopyStringRemoveExt(dt_name, token, ".m32"); + GetScriptToken(false); + dt_scale_x = atof(token); + GetScriptToken(false); + dt_scale_y = atof(token); + GetScriptToken(false); + dt_u = atof(token); + GetScriptToken(false); + dt_v = atof(token); + GetScriptToken(false); + dt_alpha = atof(token); + GetScriptToken(false); + for (mp=mipparms ; mp->name ; mp++) + { + if (!strcmp(mp->name, token)) + { + if (mp->type == pt_gl) + { + dt_src_blend_mode = mp->flags; + break; + } + } + } + if (!mp->name) + { + Error ("line %i: invalid gl blend mode %s", scriptline, token); + } + GetScriptToken (false); + for (mp=mipparms ; mp->name ; mp++) + { + if (!strcmp(mp->name, token)) + { + if (mp->type == pt_gl) + { + dt_dst_blend_mode = mp->flags; + break; + } + } + } + if (!mp->name) + { + Error ("line %i: invalid gl blend mode %s", scriptline, token); + } + break; + } + break; + } + } + if (!mp->name) + Error ("line %i: unknown parm %s", scriptline, token); + } + + if (g_release) + { + return; // textures are only released by $maps + } + + xh = xl+w; + yh = yl+h; + if (xh*yh > MAX_IMAGE_SIZE*MAX_IMAGE_SIZE) + { + Error("line %i image %s: image is too big!", scriptline, lumpname); + } + + if (xl >= longimagewidth || xh > longimagewidth || + yl >= longimageheight || yh > longimageheight) + { + Error ("line %i image %s: bad clip dimmensions (%d,%d) (%d,%d) > image (%d,%d)", scriptline, lumpname, xl,yl,w,h,longimagewidth,longimageheight); + } + + sourcel = longimage + (yl*longimagewidth) + xl; + destl = bufferl; + linedelta = (longimagewidth - w); + + for (y=yl ; yflags |= LittleLong(flags); + qtex32->flags2 |= LittleLong(flags2); + qtex32->contents = LittleLong(contents); + qtex32->value = LittleLong(value); + qtex32->scale_x = scale_x; + qtex32->scale_y = scale_y; + qtex32->mip_scale = mip_scale; + sprintf (qtex32->name, "%s/%s", mip_prefix, lumpname); + if (animname[0]) + { + sprintf (qtex32->animname, "%s/%s", mip_prefix, animname); + } + if (altname[0]) + { + sprintf (qtex32->altname, "%s/%s", mip_prefix, altname); + } + if (damagename[0]) + { + sprintf (qtex32->damagename, "%s/%s", mip_prefix, damagename); + qtex32->damage_health = damage_health; + } + if (dt_name[0] && ((flags2 & (MIP32_DETAILER_FLAG2|MIP32_SPHERICAL_FLAG2)) == 0)) + { + sprintf (qtex32->dt_name, "%s/%s", mip_prefix, dt_name); + qtex32->dt_scale_x = dt_scale_x; + qtex32->dt_scale_y = dt_scale_y; + qtex32->dt_u = dt_u; + qtex32->dt_v = dt_v; + qtex32->dt_alpha = dt_alpha; + qtex32->dt_src_blend_mode = dt_src_blend_mode; + qtex32->dt_dst_blend_mode = dt_dst_blend_mode; + } + +// +// write it out +// + sprintf (filename, "%s/%s/%s.m32", out_dir, mip_prefix, lumpname); + if(qtex32->flags & (SURF_ALPHA_TEXTURE)) + printf ("writing %s with ALPHA\n", filename); + else + printf ("writing %s\n", filename); + SaveFile (filename, (byte *)qtex32, size); + + free (qtex32); +} + +/* +=============== +Cmd_Mipdir +=============== +*/ +void Cmd_Mipdir (void) +{ + char filename[1024]; + + GetScriptToken (false); + strcpy (mip_prefix, token); + // create the directory if needed + sprintf (filename, "%stextures", g_outputDir); + Q_mkdir (filename); + strcpy(out_dir, filename); + sprintf (filename, "%stextures/%s", g_outputDir, mip_prefix); + Q_mkdir (filename); +} + +/* +=============== +Cmd_picdir +=============== +*/ +void Cmd_Picdir (void) +{ + char filename[1024]; + + GetScriptToken (false); + strcpy (mip_prefix, token); + // create the directory if needed + sprintf (filename, "%s", g_outputDir); + Q_mkdir (filename); + strcpy(out_dir, filename); + sprintf (filename, "%s/%s", g_outputDir, mip_prefix); + Q_mkdir (filename); +} + +/* +=============== +Cmd_Load +=============== +*/ +void Cmd_Load (void) +{ + char *name; + + GetScriptToken (false); + + if (g_release) + return; + + name = ExpandPathAndArchive(token); + + // load the image + printf ("loading %s\n", name); + if(!LoadAnyImage (name, &longimage, &longimagewidth, &longimageheight)) + { + Error ("Texture must be true colour"); + } +} + diff --git a/Source/Tools/SoFData/lbmlib.c b/Source/Tools/SoFData/lbmlib.c new file mode 100644 index 0000000..f3db8d9 --- /dev/null +++ b/Source/Tools/SoFData/lbmlib.c @@ -0,0 +1,287 @@ +// lbmlib.c + +#include "cmdlib.h" +#include "lbmlib.h" + +/* +============================================================================ + +TARGA IMAGE + +============================================================================ +*/ + +typedef struct _TargaHeader +{ + unsigned char id_length, colormap_type, image_type; + unsigned short colormap_index, colormap_length; + unsigned char colormap_size; + unsigned short x_origin, y_origin, width, height; + unsigned char pixel_size, attributes; +} TargaHeader; + +int fgetLittleShort (FILE *f) +{ + byte b1, b2; + + b1 = fgetc(f); + b2 = fgetc(f); + + return((short)(b1 + (b2 << 8))); +} + +int fgetLittleLong (FILE *f) +{ + byte b1, b2, b3, b4; + + b1 = fgetc(f); + b2 = fgetc(f); + b3 = fgetc(f); + b4 = fgetc(f); + + return(b1 + (b2 << 8) + (b3 << 16) + (b4 << 24)); +} + + +/* +============= +LoadTGA +============= +*/ +void LoadTGA(char *name, byte **pixels, int *width, int *height) +{ + int columns, rows, numPixels; + byte *pixbuf; + byte *rowBuf; + int row, column; + FILE *fin; + byte *targa_rgba; + TargaHeader targa_header; + unsigned char red, green, blue, alphabyte; + unsigned char packetHeader, packetSize, j; + int flip; + int mirror; + int rowOffset; + int pixDirection; + + fin = fopen(name, "rb"); + if (!fin) + Error ("Couldn't read %s", name); + + targa_header.id_length = fgetc(fin); + targa_header.colormap_type = fgetc(fin); + targa_header.image_type = fgetc(fin); + + targa_header.colormap_index = fgetLittleShort(fin); + targa_header.colormap_length = fgetLittleShort(fin); + targa_header.colormap_size = fgetc(fin); + targa_header.x_origin = fgetLittleShort(fin); + targa_header.y_origin = fgetLittleShort(fin); + targa_header.width = fgetLittleShort(fin); + targa_header.height = fgetLittleShort(fin); + targa_header.pixel_size = fgetc(fin); + targa_header.attributes = fgetc(fin); + flip = (targa_header.attributes & 0x020) == 0; + mirror = (targa_header.attributes & 0x010) != 0; + + if ((targa_header.image_type != 2) && (targa_header.image_type != 10)) + Error ("LoadTGA: Only type 2 and 10 targa RGB images supported\n"); + + if (targa_header.colormap_type || ((targa_header.pixel_size != 32) && (targa_header.pixel_size != 24))) + Error ("Texture_LoadTGA: Only 32 or 24 bit images supported (no colormaps)\n"); + + columns = targa_header.width; + rows = targa_header.height; + numPixels = columns * rows; + + if (width) + *width = columns; + if (height) + *height = rows; + + if(!pixels) + return; + + targa_rgba = malloc(numPixels * 4); + *pixels = targa_rgba; + + if (flip) + { + pixbuf = targa_rgba + ((rows - 1) * columns * 4); + rowOffset = -columns * 4; + } + else + { + pixbuf = targa_rgba; + rowOffset = columns * 4; + } + if (mirror) + { + pixDirection = -4; + pixbuf += ((columns - 1) * 4); + } + else + { + pixDirection = 4; + } + + if (targa_header.id_length) + fseek(fin, targa_header.id_length, SEEK_CUR); // skip TARGA image comment + + if (targa_header.image_type == 2) + { // Uncompressed, RGB images + for(row = 0; row < rows; row++) + { + rowBuf = pixbuf; + for(column = 0; column < columns; column++) + { + switch (targa_header.pixel_size) + { + case 24: + blue = getc(fin); + green = getc(fin); + red = getc(fin); + rowBuf[0] = red; + rowBuf[1] = green; + rowBuf[2] = blue; + rowBuf[3] = 255; + rowBuf += pixDirection; + break; + case 32: + blue = getc(fin); + green = getc(fin); + red = getc(fin); + alphabyte = getc(fin); + rowBuf[0] = red; + rowBuf[1] = green; + rowBuf[2] = blue; + rowBuf[3] = alphabyte; + rowBuf += pixDirection; + break; + } + } + pixbuf += rowOffset; + } + } + else if(targa_header.image_type == 10) + { // Runlength encoded RGB images + for(row = 0; row < rows; row++) + { + rowBuf = pixbuf; + for(column = 0; column < columns; ) + { + packetHeader = getc(fin); + packetSize = 1 + (packetHeader & 0x7f); + if (packetHeader & 0x80) + { // run-length packet + switch (targa_header.pixel_size) + { + case 24: + blue = getc(fin); + green = getc(fin); + red = getc(fin); + alphabyte = 255; + break; + case 32: + blue = getc(fin); + green = getc(fin); + red = getc(fin); + alphabyte = getc(fin); + break; + } + + for(j = 0; j < packetSize; j++) + { + rowBuf[0] = red; + rowBuf[1] = green; + rowBuf[2] = blue; + rowBuf[3] = alphabyte; + rowBuf += pixDirection; + column++; + if(column == columns) + { // run spans across rows + column = 0; + row++; + if (row >= rows) + goto breakOut; + pixbuf += rowOffset; + rowBuf = pixbuf; + } + } + } + else + { // non run-length packet + for(j = 0; j < packetSize; j++) + { + switch (targa_header.pixel_size) + { + case 24: + blue = getc(fin); + green = getc(fin); + red = getc(fin); + rowBuf[0] = red; + rowBuf[1] = green; + rowBuf[2] = blue; + rowBuf[3] = 255; + rowBuf += pixDirection; + break; + case 32: + blue = getc(fin); + green = getc(fin); + red = getc(fin); + alphabyte = getc(fin); + rowBuf[0] = red; + rowBuf[1] = green; + rowBuf[2] = blue; + rowBuf[3] = alphabyte; + rowBuf += pixDirection; + break; + } + column++; + if (column == columns) + { // pixel packet run spans across rows + column = 0; + row++; + if (row >= rows) + goto breakOut; + pixbuf += rowOffset; + rowBuf = pixbuf; + } + } + } + } + breakOut:; + pixbuf += rowOffset; + } + } + fclose(fin); +} + +/* +============== +LoadAnyImage + +Return Value: + false: paletted texture + true: true color RGBA image (no palette) +============== +*/ +qboolean LoadAnyImage (char *name, unsigned int **pixels, int *width, int *height) +{ + char ext[128]; + + ExtractFileExtension (name, ext); + + if(!Q_strcasecmp (ext, "tga")) + { + LoadTGA(name, (byte **)pixels, width, height); + return true; + } + else + { + Error ("%s doesn't have a known image extension", name); + } + + return false; +} + diff --git a/Source/Tools/SoFData/lbmlib.h b/Source/Tools/SoFData/lbmlib.h new file mode 100644 index 0000000..91ab43e --- /dev/null +++ b/Source/Tools/SoFData/lbmlib.h @@ -0,0 +1,4 @@ +// piclib.h + +void LoadTGA (char *filename, byte **pixels, int *width, int *height); +qboolean LoadAnyImage (char *name, unsigned int **pixels, int *width, int *height); diff --git a/Source/Tools/SoFData/mathlib.c b/Source/Tools/SoFData/mathlib.c new file mode 100644 index 0000000..c5347d1 --- /dev/null +++ b/Source/Tools/SoFData/mathlib.c @@ -0,0 +1,150 @@ +// mathlib.c -- math primitives + +#include "cmdlib.h" +#include "mathlib.h" + +vec3_t vec3_origin = {0,0,0}; + + +double VectorLength(vec3_t v) +{ + int i; + double length; + + length = 0; + for (i=0 ; i< 3 ; i++) + length += v[i]*v[i]; + length = sqrt (length); // FIXME + + return length; +} + +qboolean VectorCompare (vec3_t v1, vec3_t v2) +{ + int i; + + for (i=0 ; i<3 ; i++) + if (fabs(v1[i]-v2[i]) > EQUAL_EPSILON) + return false; + + return true; +} + +vec_t Q_rint (vec_t in) +{ + return floor (in + 0.5); +} + +void VectorMA (vec3_t va, double scale, vec3_t vb, vec3_t vc) +{ + vc[0] = va[0] + scale*vb[0]; + vc[1] = va[1] + scale*vb[1]; + vc[2] = va[2] + scale*vb[2]; +} + +void CrossProduct (vec3_t v1, vec3_t v2, vec3_t cross) +{ + cross[0] = v1[1]*v2[2] - v1[2]*v2[1]; + cross[1] = v1[2]*v2[0] - v1[0]*v2[2]; + cross[2] = v1[0]*v2[1] - v1[1]*v2[0]; +} + +vec_t _DotProduct (vec3_t v1, vec3_t v2) +{ + return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]; +} + +void _VectorSubtract (vec3_t va, vec3_t vb, vec3_t out) +{ + out[0] = va[0]-vb[0]; + out[1] = va[1]-vb[1]; + out[2] = va[2]-vb[2]; +} + +void _VectorAdd (vec3_t va, vec3_t vb, vec3_t out) +{ + out[0] = va[0]+vb[0]; + out[1] = va[1]+vb[1]; + out[2] = va[2]+vb[2]; +} + +void _VectorCopy (vec3_t in, vec3_t out) +{ + out[0] = in[0]; + out[1] = in[1]; + out[2] = in[2]; +} + +void _VectorScale (vec3_t v, vec_t scale, vec3_t out) +{ + out[0] = v[0] * scale; + out[1] = v[1] * scale; + out[2] = v[2] * scale; +} + +vec_t VectorNormalize (vec3_t in, vec3_t out) +{ + vec_t length, ilength; + + length = sqrt (in[0]*in[0] + in[1]*in[1] + in[2]*in[2]); + if (length == 0) + { + VectorClear (out); + return 0; + } + + ilength = 1.0/length; + out[0] = in[0]*ilength; + out[1] = in[1]*ilength; + out[2] = in[2]*ilength; + + return length; +} + +vec_t ColorNormalize (vec3_t in, vec3_t out) +{ + float max, scale; + + max = in[0]; + if (in[1] > max) + max = in[1]; + if (in[2] > max) + max = in[2]; + + if (max == 0) + return 0; + + scale = 1.0 / max; + + VectorScale (in, scale, out); + + return max; +} + +void VectorInverse (vec3_t v) +{ + v[0] = -v[0]; + v[1] = -v[1]; + v[2] = -v[2]; +} + +void ClearBounds (vec3_t mins, vec3_t maxs) +{ + mins[0] = mins[1] = mins[2] = 99999; + maxs[0] = maxs[1] = maxs[2] = -99999; +} + +void AddPointToBounds (vec3_t v, vec3_t mins, vec3_t maxs) +{ + int i; + vec_t val; + + for (i=0 ; i<3 ; i++) + { + val = v[i]; + if (val < mins[i]) + mins[i] = val; + if (val > maxs[i]) + maxs[i] = val; + } +} diff --git a/Source/Tools/SoFData/mathlib.h b/Source/Tools/SoFData/mathlib.h new file mode 100644 index 0000000..0788a8b --- /dev/null +++ b/Source/Tools/SoFData/mathlib.h @@ -0,0 +1,55 @@ +#ifndef __MATHLIB__ +#define __MATHLIB__ + +// mathlib.h + +#include + +#ifdef DOUBLEVEC_T +typedef double vec_t; +#else +typedef float vec_t; +#endif +typedef vec_t vec3_t[3]; + +#define SIDE_FRONT 0 +#define SIDE_ON 2 +#define SIDE_BACK 1 +#define SIDE_CROSS -2 + +#define Q_PI 3.14159265358979323846 + +extern vec3_t vec3_origin; + +#define EQUAL_EPSILON 0.001 + +qboolean VectorCompare (vec3_t v1, vec3_t v2); + +#define DotProduct(x,y) (x[0]*y[0]+x[1]*y[1]+x[2]*y[2]) +#define VectorSubtract(a,b,c) {c[0]=a[0]-b[0];c[1]=a[1]-b[1];c[2]=a[2]-b[2];} +#define VectorAdd(a,b,c) {c[0]=a[0]+b[0];c[1]=a[1]+b[1];c[2]=a[2]+b[2];} +#define VectorCopy(a,b) {b[0]=a[0];b[1]=a[1];b[2]=a[2];} +#define VectorScale(a,b,c) {c[0]=b*a[0];c[1]=b*a[1];c[2]=b*a[2];} +#define VectorClear(x) {x[0] = x[1] = x[2] = 0;} +#define VectorNegate(x) {x[0]=-x[0];x[1]=-x[1];x[2]=-x[2];} + +vec_t Q_rint (vec_t in); +vec_t _DotProduct (vec3_t v1, vec3_t v2); +void _VectorSubtract (vec3_t va, vec3_t vb, vec3_t out); +void _VectorAdd (vec3_t va, vec3_t vb, vec3_t out); +void _VectorCopy (vec3_t in, vec3_t out); +void _VectorScale (vec3_t v, vec_t scale, vec3_t out); + +double VectorLength(vec3_t v); + +void VectorMA (vec3_t va, double scale, vec3_t vb, vec3_t vc); + +void CrossProduct (vec3_t v1, vec3_t v2, vec3_t cross); +vec_t VectorNormalize (vec3_t in, vec3_t out); +vec_t ColorNormalize (vec3_t in, vec3_t out); +void VectorInverse (vec3_t v); + +void ClearBounds (vec3_t mins, vec3_t maxs); +void AddPointToBounds (vec3_t v, vec3_t mins, vec3_t maxs); + +#endif diff --git a/Source/Tools/SoFData/md4.c b/Source/Tools/SoFData/md4.c new file mode 100644 index 0000000..37de7f7 --- /dev/null +++ b/Source/Tools/SoFData/md4.c @@ -0,0 +1,277 @@ +/* GLOBAL.H - RSAREF types and constants */ + +#include + +/* POINTER defines a generic pointer type */ +typedef unsigned char *POINTER; + +/* UINT2 defines a two byte word */ +typedef unsigned short int UINT2; + +/* UINT4 defines a four byte word */ +typedef unsigned long int UINT4; + + +/* MD4.H - header file for MD4C.C */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. + +All rights reserved. + +License to copy and use this software is granted provided that it is identified as the “RSA Data Security, Inc. MD4 Message-Digest Algorithm” in all material mentioning or referencing this software or this function. +License is also granted to make and use derivative works provided that such works are identified as “derived from the RSA Data Security, Inc. MD4 Message-Digest Algorithm” in all material mentioning or referencing the derived work. +RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided “as is” without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this documentation and/or software. */ + +/* MD4 context. */ +typedef struct { + UINT4 state[4]; /* state (ABCD) */ + UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ + unsigned char buffer[64]; /* input buffer */ +} MD4_CTX; + +void MD4Init (MD4_CTX *); +void MD4Update (MD4_CTX *, unsigned char *, unsigned int); +void MD4Final (unsigned char [16], MD4_CTX *); + + + +/* MD4C.C - RSA Data Security, Inc., MD4 message-digest algorithm */ +/* Copyright (C) 1990-2, RSA Data Security, Inc. All rights reserved. + +License to copy and use this software is granted provided that it is identified as the +RSA Data Security, Inc. MD4 Message-Digest Algorithm + in all material mentioning or referencing this software or this function. +License is also granted to make and use derivative works provided that such works are identified as +derived from the RSA Data Security, Inc. MD4 Message-Digest Algorithm +in all material mentioning or referencing the derived work. +RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided +as is without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this documentation and/or software. */ + +/* Constants for MD4Transform routine. */ +#define S11 3 +#define S12 7 +#define S13 11 +#define S14 19 +#define S21 3 +#define S22 5 +#define S23 9 +#define S24 13 +#define S31 3 +#define S32 9 +#define S33 11 +#define S34 15 + +static void MD4Transform (UINT4 [4], unsigned char [64]); +static void Encode (unsigned char *, UINT4 *, unsigned int); +static void Decode (UINT4 *, unsigned char *, unsigned int); +static void MD4_memcpy (POINTER, POINTER, unsigned int); +static void MD4_memset (POINTER, int, unsigned int); + +static unsigned char PADDING[64] = { +0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G and H are basic MD4 functions. */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) + +/* ROTATE_LEFT rotates x left n bits. */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +/* FF, GG and HH are transformations for rounds 1, 2 and 3 */ +/* Rotation is separate from addition to prevent recomputation */ +#define FF(a, b, c, d, x, s) {(a) += F ((b), (c), (d)) + (x); (a) = ROTATE_LEFT ((a), (s));} + +#define GG(a, b, c, d, x, s) {(a) += G ((b), (c), (d)) + (x) + (UINT4)0x5a827999; (a) = ROTATE_LEFT ((a), (s));} + +#define HH(a, b, c, d, x, s) {(a) += H ((b), (c), (d)) + (x) + (UINT4)0x6ed9eba1; (a) = \ +ROTATE_LEFT ((a), (s)); } + + +/* MD4 initialization. Begins an MD4 operation, writing a new context. */ +void MD4Init (MD4_CTX *context) +{ + context->count[0] = context->count[1] = 0; + +/* Load magic initialization constants.*/ +context->state[0] = 0x67452301; +context->state[1] = 0xefcdab89; +context->state[2] = 0x98badcfe; +context->state[3] = 0x10325476; +} + +/* MD4 block update operation. Continues an MD4 message-digest operation, processing another message block, and updating the context. */ +void MD4Update (MD4_CTX *context, unsigned char *input, unsigned int inputLen) +{ + unsigned int i, index, partLen; + + /* Compute number of bytes mod 64 */ + index = (unsigned int)((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + if ((context->count[0] += ((UINT4)inputLen << 3))< ((UINT4)inputLen << 3)) + context->count[1]++; + + context->count[1] += ((UINT4)inputLen >> 29); + + partLen = 64 - index; + + /* Transform as many times as possible.*/ + if (inputLen >= partLen) + { + memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen); + MD4Transform (context->state, context->buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) + MD4Transform (context->state, &input[i]); + + index = 0; + } + else + i = 0; + + /* Buffer remaining input */ + memcpy ((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i); +} + + +/* MD4 finalization. Ends an MD4 message-digest operation, writing the the message digest and zeroizing the context. */ +void MD4Final (unsigned char digest[16], MD4_CTX *context) +{ + unsigned char bits[8]; + unsigned int index, padLen; + + /* Save number of bits */ + Encode (bits, context->count, 8); + + /* Pad out to 56 mod 64.*/ + index = (unsigned int)((context->count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + MD4Update (context, PADDING, padLen); + + /* Append length (before padding) */ + MD4Update (context, bits, 8); + + /* Store state in digest */ + Encode (digest, context->state, 16); + + /* Zeroize sensitive information.*/ + memset ((POINTER)context, 0, sizeof (*context)); +} + + +/* MD4 basic transformation. Transforms state based on block. */ +static void MD4Transform (UINT4 state[4], unsigned char block[64]) +{ + UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + Decode (x, block, 64); + +/* Round 1 */ +FF (a, b, c, d, x[ 0], S11); /* 1 */ +FF (d, a, b, c, x[ 1], S12); /* 2 */ +FF (c, d, a, b, x[ 2], S13); /* 3 */ +FF (b, c, d, a, x[ 3], S14); /* 4 */ +FF (a, b, c, d, x[ 4], S11); /* 5 */ +FF (d, a, b, c, x[ 5], S12); /* 6 */ +FF (c, d, a, b, x[ 6], S13); /* 7 */ +FF (b, c, d, a, x[ 7], S14); /* 8 */ +FF (a, b, c, d, x[ 8], S11); /* 9 */ +FF (d, a, b, c, x[ 9], S12); /* 10 */ +FF (c, d, a, b, x[10], S13); /* 11 */ +FF (b, c, d, a, x[11], S14); /* 12 */ +FF (a, b, c, d, x[12], S11); /* 13 */ +FF (d, a, b, c, x[13], S12); /* 14 */ +FF (c, d, a, b, x[14], S13); /* 15 */ +FF (b, c, d, a, x[15], S14); /* 16 */ + +/* Round 2 */ +GG (a, b, c, d, x[ 0], S21); /* 17 */ +GG (d, a, b, c, x[ 4], S22); /* 18 */ +GG (c, d, a, b, x[ 8], S23); /* 19 */ +GG (b, c, d, a, x[12], S24); /* 20 */ +GG (a, b, c, d, x[ 1], S21); /* 21 */ +GG (d, a, b, c, x[ 5], S22); /* 22 */ +GG (c, d, a, b, x[ 9], S23); /* 23 */ +GG (b, c, d, a, x[13], S24); /* 24 */ +GG (a, b, c, d, x[ 2], S21); /* 25 */ +GG (d, a, b, c, x[ 6], S22); /* 26 */ +GG (c, d, a, b, x[10], S23); /* 27 */ +GG (b, c, d, a, x[14], S24); /* 28 */ +GG (a, b, c, d, x[ 3], S21); /* 29 */ +GG (d, a, b, c, x[ 7], S22); /* 30 */ +GG (c, d, a, b, x[11], S23); /* 31 */ +GG (b, c, d, a, x[15], S24); /* 32 */ + +/* Round 3 */ +HH (a, b, c, d, x[ 0], S31); /* 33 */ +HH (d, a, b, c, x[ 8], S32); /* 34 */ +HH (c, d, a, b, x[ 4], S33); /* 35 */ +HH (b, c, d, a, x[12], S34); /* 36 */ +HH (a, b, c, d, x[ 2], S31); /* 37 */ +HH (d, a, b, c, x[10], S32); /* 38 */ +HH (c, d, a, b, x[ 6], S33); /* 39 */ +HH (b, c, d, a, x[14], S34); /* 40 */ +HH (a, b, c, d, x[ 1], S31); /* 41 */ +HH (d, a, b, c, x[ 9], S32); /* 42 */ +HH (c, d, a, b, x[ 5], S33); /* 43 */ +HH (b, c, d, a, x[13], S34); /* 44 */ +HH (a, b, c, d, x[ 3], S31); /* 45 */ +HH (d, a, b, c, x[11], S32); /* 46 */ +HH (c, d, a, b, x[ 7], S33); /* 47 */ +HH (b, c, d, a, x[15], S34); /* 48 */ + +state[0] += a; +state[1] += b; +state[2] += c; +state[3] += d; + + /* Zeroize sensitive information.*/ + memset ((POINTER)x, 0, sizeof (x)); +} + + +/* Encodes input (UINT4) into output (unsigned char). Assumes len is a multiple of 4. */ +static void Encode (unsigned char *output, UINT4 *input, unsigned int len) +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) { + output[j] = (unsigned char)(input[i] & 0xff); + output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); + output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); + output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); + } +} + + +/* Decodes input (unsigned char) into output (UINT4). Assumes len is a multiple of 4. */ +static void Decode (UINT4 *output, unsigned char *input, unsigned int len) +{ +unsigned int i, j; + +for (i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); +} + +//=================================================================== + +unsigned Com_BlockChecksum (void *buffer, int length) +{ + int digest[4]; + unsigned val; + MD4_CTX ctx; + + MD4Init (&ctx); + MD4Update (&ctx, (unsigned char *)buffer, length); + MD4Final ( (unsigned char *)digest, &ctx); + + val = digest[0] ^ digest[1] ^ digest[2] ^ digest[3]; + + return val; +} diff --git a/Source/Tools/SoFData/q_Typedef.h b/Source/Tools/SoFData/q_Typedef.h new file mode 100644 index 0000000..7dfa676 --- /dev/null +++ b/Source/Tools/SoFData/q_Typedef.h @@ -0,0 +1,39 @@ +#ifndef Q_TYPEDEF_H +#define Q_TYPEDEF_H + +typedef float vec_t; +typedef vec_t vec2_t[2]; +typedef vec_t vec3_t[3]; +typedef double vec3d_t[3]; +typedef vec_t vec5_t[5]; + +typedef float matrix3_t[3][3]; +typedef float matrix3d_t[3][3]; + +typedef int fixed4_t; +typedef int fixed8_t; +typedef int fixed16_t; + +typedef unsigned char byte; +#ifndef __cplusplus +typedef enum {false, true} qboolean; +#else +typedef int qboolean; +#endif + +typedef struct edict_s edict_t; + +typedef struct paletteRGBA_s +{ + union + { + struct + { + byte r,g,b,a; + }; + unsigned c; + byte c_array[4]; + }; +} paletteRGBA_t; + +#endif \ No newline at end of file diff --git a/Source/Tools/SoFData/qdata.c b/Source/Tools/SoFData/qdata.c new file mode 100644 index 0000000..4a492e9 --- /dev/null +++ b/Source/Tools/SoFData/qdata.c @@ -0,0 +1,541 @@ +#include "qdata.h" +#include + +void TK_Init(); + +qboolean g_release; // don't grab, copy output data to new tree +char g_releasedir[1024]; // c:\quake2\baseq2, etc + +qboolean g_pak; // if true, copy to pak instead of release +char g_only[256]; // if set, only grab this cd + +char g_materialFile[256] = "none"; // default for Heretic2 +char *g_outputDir; +extern char *g_publishDir; + +extern qboolean g_nomkdir; + +/* +======================================================= + + PAK FILES + +======================================================= +*/ + +unsigned Com_BlockChecksum (void *buffer, int length); + +typedef struct +{ + char name[56]; + int filepos, filelen; +} packfile_t; + +typedef struct +{ + char id[4]; + int dirofs; + int dirlen; +} packheader_t; + +packfile_t pfiles[16384]; +FILE *pakfile; +packfile_t *pf; +packheader_t pakheader; + + + +/* +============== +BeginPak +============== +*/ +void BeginPak (char *outname) +{ + if (!g_pak) + return; + + pakfile = SafeOpenWrite (outname); + + // leave space for header + SafeWrite (pakfile, &pakheader, sizeof(pakheader)); + + pf = pfiles; +} + + +/* +============== +ReleaseFile + +Filename should be gamedir reletive. +Either copies the file to the release dir, or adds it to +the pak file. +============== +*/ +void ReleaseFile (char *filename) +{ + int len; + byte *buf; + char source[1024]; + char dest[1024]; + + if (!g_release) + return; + + sprintf (source, "%s%s", gamedir, filename); + + if (!g_pak) + { // copy it + sprintf (dest, "%s/%s", g_releasedir, filename); + printf ("copying to %s\n", dest); + QCopyFile (source, dest); + return; + } + + // pak it + printf ("paking %s\n", filename); + if (strlen(filename) >= sizeof(pf->name)) + Error ("Filename too long for pak: %s", filename); + + len = LoadFile (source, (void **)&buf); + + // segment moved to old.c + + strcpy (pf->name, filename); + pf->filepos = LittleLong(ftell(pakfile)); + pf->filelen = LittleLong(len); + pf++; + + SafeWrite (pakfile, buf, len); + + free (buf); +} + + +/* +============== +FinishPak +============== +*/ +void FinishPak (void) +{ + int dirlen; + int d; + int i; + unsigned checksum; + + if (!g_pak) + return; + + pakheader.id[0] = 'P'; + pakheader.id[1] = 'A'; + pakheader.id[2] = 'C'; + pakheader.id[3] = 'K'; + dirlen = (byte *)pf - (byte *)pfiles; + pakheader.dirofs = LittleLong(ftell(pakfile)); + pakheader.dirlen = LittleLong(dirlen); + + checksum = Com_BlockChecksum ( (void *)pfiles, dirlen ); + + SafeWrite (pakfile, pfiles, dirlen); + + i = ftell (pakfile); + + fseek (pakfile, 0, SEEK_SET); + SafeWrite (pakfile, &pakheader, sizeof(pakheader)); + fclose (pakfile); + + d = pf - pfiles; + printf ("%i files packed in %i bytes\n",d, i); + printf ("checksum: 0x%x\n", checksum); +} + + +/* +=============== +Cmd_File + +This is only used to cause a file to be copied during a release +build (default.cfg, maps, etc) +=============== +*/ +void Cmd_File (void) +{ + GetScriptToken (false); + ReleaseFile (token); +} + +/* +=============== +PackDirectory_r + +=============== +*/ +#ifdef _WIN32 +#include "io.h" +void PackDirectory_r (char *dir) +{ + struct _finddata_t fileinfo; + int handle; + char dirstring[1024]; + char filename[1024]; + + sprintf (dirstring, "%s%s/*.*", gamedir, dir); + + handle = _findfirst (dirstring, &fileinfo); + if (handle == -1) + return; + + do + { + sprintf (filename, "%s/%s", dir, fileinfo.name); + if (fileinfo.attrib & _A_SUBDIR) + { // directory + if (fileinfo.name[0] != '.') // don't pak . and .. + PackDirectory_r (filename); + continue; + } + // copy or pack the file + ReleaseFile (filename); + } while (_findnext( handle, &fileinfo ) != -1); + + _findclose (handle); +} +#else + +#include +#ifdef NeXT +#include +#else +#include +#endif + +void PackDirectory_r (char *dir) +{ +#ifdef NeXT + struct direct **namelist, *ent; +#else + struct dirent **namelist, *ent; +#endif + int count; + struct stat st; + int i; + int len; + char fullname[1024]; + char dirstring[1024]; + char *name; + + sprintf (dirstring, "%s%s", gamedir, dir); + count = scandir(dirstring, &namelist, NULL, NULL); + + for (i=0 ; id_name; + + if (name[0] == '.') + continue; + + sprintf (fullname, "%s/%s", dir, name); + sprintf (dirstring, "%s%s/%s", gamedir, dir, name); + + if (stat (dirstring, &st) == -1) + Error ("fstating %s", pf->name); + if (st.st_mode & S_IFDIR) + { // directory + PackDirectory_r (fullname); + continue; + } + + // copy or pack the file + ReleaseFile (fullname); + } +} +#endif + + +/* +=============== +Cmd_Dir + +This is only used to cause a directory to be copied during a +release build (sounds, etc) +=============== +*/ +void Cmd_Dir (void) +{ + GetScriptToken (false); + PackDirectory_r (token); +} + +//======================================================================== + +#define MAX_RTEX 16384 +int numrtex; +char rtex[MAX_RTEX][64]; + +void ReleaseTexture (char *name) +{ + int i; + char path[1024]; + + for (i=0 ; i= argc) + { + Error ("usage: qdata [-archive ]\n" + " [-release ]\n" + " [-base ]\n" + " [-compress]\n" + " [-pak ]\n" + " [-only ]\n" + " [-keypress]\n" + " [-3ds]\n" + " [-materialfile ]\n" + " [-noopts]\n" + " [-md2]\n" + " [-fm]\n" + " [-verbose]\n" + " [-ignoreUV]\n" + " [-oldskin]\n" +// " [-publish]\n" + " [-nomkdir]\n" + " file.qdt\n" + "or\n" + " qdata -genskin "); + } + + for ( ; i +#include +#include +#include +#include + +#include "cmdlib.h" +#include "scriplib.h" +#include "mathlib.h" +#include "lbmlib.h" +#include "threads.h" +#include "qfiles.h" + +void Cmd_Load (void); + +void Cmd_Grab (void); +void Cmd_Mip (void); + +void Cmd_File (void); +void Cmd_Dir (void); +void Cmd_StartWad (void); +void Cmd_EndWad (void); +void Cmd_Mipdir (void); +void Cmd_Picdir (void); + +void Cmd_TextureMix (void); +void Cmd_TMixdir (); + +void ReleaseFile (char *filename); + +extern unsigned *longimage; +extern int longimagewidth, longimageheight; + +extern qboolean g_release; // don't grab, copy output data to new tree +extern char g_releasedir[1024]; // c:\quake2\baseq2, etc + +extern qboolean g_pak; // if true, copy to pak instead of release +extern char g_only[256]; // if set, only grab this cd + +extern char g_materialFile[256]; + +extern unsigned total_x; +extern unsigned total_y; +extern unsigned total_textures; + +miptex32_t *CreateMip32(unsigned *data, unsigned width, unsigned height, int *FinalSize, qboolean mip); diff --git a/Source/Tools/SoFData/qfiles.c b/Source/Tools/SoFData/qfiles.c new file mode 100644 index 0000000..987617a --- /dev/null +++ b/Source/Tools/SoFData/qfiles.c @@ -0,0 +1,61 @@ +#include "qfiles.h" +#include "scriplib.h" +#include + +materialtype_t defaultmaterialtypes[] = +{ + {"gravel", MATERIAL_GRAVEL}, + {"metal", MATERIAL_METAL}, + {"stone", MATERIAL_STONE}, + {"wood", MATERIAL_WOOD}, + {NULL, 0} +}; + +materialtype_t *materialtypes; + +void QFile_ReadMaterialTypes(char* filename) +{ + int i; + FILE *f; + + f = fopen (filename, "rb"); + if (!f) + { + materialtypes = defaultmaterialtypes; + return; + } + fclose (f); + + free(materialtypes); + materialtypes = (materialtype_t*)malloc(256 * sizeof(materialtype_t)); + + LoadScriptFile(filename); + i = 0; + + while (i < 255) + { + GetScriptToken (true); + if (endofscript) + { + break; + } + if (strcmp(token, "material") != 0) + { + while (ScriptTokenAvailable()) + { + GetScriptToken(false); + } + } + else + { + GetScriptToken(false); + materialtypes[i].name = (char*)malloc(strlen(token) + 1); + strcpy(materialtypes[i].name, token); + GetScriptToken (false); + materialtypes[i].value = atoi(token); + } + i++; + } + materialtypes[i].name = NULL; + materialtypes[i].value = 0; +} diff --git a/Source/Tools/SoFData/qfiles.h b/Source/Tools/SoFData/qfiles.h new file mode 100644 index 0000000..f185fce --- /dev/null +++ b/Source/Tools/SoFData/qfiles.h @@ -0,0 +1,580 @@ + +#include "q_Typedef.h" + +// +// qfiles.h: quake file formats +// This file must be identical in the quake and utils directories +// + +/* +======================================================================== + +The .pak files are just a linear collapse of a directory tree + +======================================================================== +*/ + +#define IDPAKHEADER (('K'<<24)+('C'<<16)+('A'<<8)+'P') + +typedef struct +{ + char name[56]; + int filepos, filelen; +} dpackfile_t; + +typedef struct +{ + int ident; // == IDPAKHEADER + int dirofs; + int dirlen; +} dpackheader_t; + +#define MAX_FILES_IN_PACK 4096 + + +/* +======================================================================== + +PCX files are used for as many images as possible + +======================================================================== +*/ + +typedef struct +{ + char manufacturer; + char version; + char encoding; + char bits_per_pixel; + unsigned short xmin,ymin,xmax,ymax; + unsigned short hres,vres; + unsigned char palette[48]; + char reserved; + char color_planes; + unsigned short bytes_per_line; + unsigned short palette_type; + char filler[58]; + unsigned char data; // unbounded +} pcx_t; + + +/* +======================================================================== + +.MD2 compressed triangle model file format + +======================================================================== +*/ +#define IDJOINTEDALIASHEADER (('2'<<24)+('J'<<16)+('D'<<8)+'I') + +/* +======================================================================== + +.MD2 triangle model file format + +======================================================================== +*/ + +#define IDALIASHEADER (('2'<<24)+('P'<<16)+('D'<<8)+'I') +#define ALIAS_VERSION 8 + +#define MAX_TRIANGLES 2048 +#define MAX_VERTS 2048 +#define MAX_FRAMES 512 +#define MAX_MD2SKINS 64 +#define MAX_SKINNAME 64 + +typedef struct +{ + short s; + short t; +} dstvert_t; + +typedef struct +{ + short index_xyz[3]; + short index_st[3]; +} dtriangle_t; + +typedef struct +{ + byte v[3]; // scaled byte to fit in frame mins/maxs + byte lightnormalindex; +} dtrivertx_t; + +#define DTRIVERTX_V0 0 +#define DTRIVERTX_V1 1 +#define DTRIVERTX_V2 2 +#define DTRIVERTX_LNI 3 +#define DTRIVERTX_SIZE 4 + +typedef struct +{ + float scale[3]; // multiply byte verts by this + float translate[3]; // then add this + char name[16]; // frame name from grabbing + dtrivertx_t verts[1]; // variable sized +} daliasframe_t; + + +// the glcmd format: +// a positive integer starts a tristrip command, followed by that many +// vertex structures. +// a negative integer starts a trifan command, followed by -x vertexes +// a zero indicates the end of the command list. +// a vertex consists of a floating point s, a floating point t, +// and an integer vertex index. + + +typedef struct +{ + int ident; + int version; + + int skinwidth; + int skinheight; + int framesize; // byte size of each frame + + int num_skins; + int num_xyz; + int num_st; // greater than num_xyz for seams + int num_tris; + int num_glcmds; // dwords in strip/fan command list + int num_frames; + + int ofs_skins; // each skin is a MAX_SKINNAME string + int ofs_st; // byte offset from start for stverts + int ofs_tris; // offset for dtriangles + int ofs_frames; // offset for first frame + int ofs_glcmds; + int ofs_end; // end of file + +} dmdl_t; + +/* +======================================================================== + +.BK file format + +======================================================================== +*/ + +#define IDBOOKHEADER (('K'<<24)+('O'<<16)+('O'<<8)+'B') +#define BOOK_VERSION 2 + +typedef struct bookframe_s +{ + int x; + int y; + int w; + int h; + char name[MAX_SKINNAME]; // name of gfx file +} bookframe_t; + +typedef struct bookheader_s +{ + unsigned int ident; + unsigned int version; + int num_segments; + int total_w; + int total_h; +} bookheader_t; + +typedef struct book_s +{ + bookheader_t bheader; + bookframe_t bframes[MAX_MD2SKINS]; +} book_t; + +/* +======================================================================== + +.SP2 sprite file format + +======================================================================== +*/ + +#define IDSPRITEHEADER (('2'<<24)+('S'<<16)+('D'<<8)+'I') + // little-endian "IDS2" +#define SPRITE_VERSION 2 + +typedef struct +{ + int width, height; + int origin_x, origin_y; // raster coordinates inside pic + char name[MAX_SKINNAME]; // name of pcx file +} dsprframe_t; + +typedef struct { + int ident; + int version; + int numframes; + dsprframe_t frames[1]; // variable sized +} dsprite_t; + +/* +============================================================================== + + .M8 texture file format + +============================================================================== +*/ + +typedef struct palette_s +{ + union + { + struct + { + byte r,g,b; + }; + }; +} palette_t; + +#define MIP_VERSION 2 +#define PAL_SIZE 256 +#define MIPLEVELS 16 + +typedef struct miptex_s +{ + int version; + char name[32]; + unsigned width[MIPLEVELS], height[MIPLEVELS]; + unsigned offsets[MIPLEVELS]; // four mip maps stored + char animname[32]; // next frame in animation chain + palette_t palette[PAL_SIZE]; + int flags; + int contents; + int value; +} miptex_t; + + +#define MIP32_VERSION 4 + +// SOF Specific +#define MIP32_NOMIP_FLAG2 0x00000001 +#define MIP32_DETAILER_FLAG2 0x00000002 +#define MIP32_PARENTAL_FLAG2 0x00000004 +#define MIP32_SPHERICAL_FLAG2 0x00000008 + +typedef struct miptex32_s +{ + int version; + char name[128]; + char altname[128]; // texture substitution + char animname[128]; // next frame in animation chain + char damagename[128]; // image that should be shown when damaged + unsigned width[MIPLEVELS], height[MIPLEVELS]; + unsigned offsets[MIPLEVELS]; + int flags; + int contents; + int value; + float scale_x, scale_y; + int mip_scale; + + // detail texturing info + char dt_name[128]; // detailed texture name + float dt_scale_x, dt_scale_y; + float dt_u, dt_v; + float dt_alpha; + int dt_src_blend_mode, dt_dst_blend_mode; + + int flags2; + float damage_health; + + int unused[18]; // future expansion to maintain compatibility with h2 +} miptex32_t; + + + +/* +============================================================================== + + .BSP file format + +============================================================================== +*/ + +#define IDBSPHEADER (('P'<<24)+('S'<<16)+('B'<<8)+'I') + // little-endian "IBSP" + +#define BSPVERSION 38 + + +// upper design bounds +// leaffaces, leafbrushes, planes, and verts are still bounded by +// 16 bit short limits +#define MAX_MAP_MODELS 1024 +#define MAX_MAP_BRUSHES 8192 +#define MAX_MAP_ENTITIES 2048 +#define MAX_MAP_ENTSTRING 0x40000 +#define MAX_MAP_TEXINFO 8192 + +#define MAX_MAP_AREAS 256 +#define MAX_MAP_AREAPORTALS 1024 +#define MAX_MAP_PLANES 65536 +#define MAX_MAP_NODES 65536 +#define MAX_MAP_BRUSHSIDES 65536 +#define MAX_MAP_LEAFS 65536 +#define MAX_MAP_VERTS 65536 +#define MAX_MAP_FACES 65536 +#define MAX_MAP_LEAFFACES 65536 +#define MAX_MAP_LEAFBRUSHES 65536 +#define MAX_MAP_PORTALS 65536 +#define MAX_MAP_EDGES 128000 +#define MAX_MAP_SURFEDGES 256000 +#define MAX_MAP_LIGHTING 0x200000 +#define MAX_MAP_VISIBILITY 0x180000 + +// key / value pair sizes + +#define MAX_KEY 32 +#define MAX_VALUE 1024 + +//============================================================================= + +typedef struct +{ + int fileofs, filelen; +} lump_t; + +#define LUMP_ENTITIES 0 +#define LUMP_PLANES 1 +#define LUMP_VERTEXES 2 +#define LUMP_VISIBILITY 3 +#define LUMP_NODES 4 +#define LUMP_TEXINFO 5 +#define LUMP_FACES 6 +#define LUMP_LIGHTING 7 +#define LUMP_LEAFS 8 +#define LUMP_LEAFFACES 9 +#define LUMP_LEAFBRUSHES 10 +#define LUMP_EDGES 11 +#define LUMP_SURFEDGES 12 +#define LUMP_MODELS 13 +#define LUMP_BRUSHES 14 +#define LUMP_BRUSHSIDES 15 +#define LUMP_POP 16 +#define LUMP_AREAS 17 +#define LUMP_AREAPORTALS 18 +#define HEADER_LUMPS 19 + +typedef struct +{ + int ident; + int version; + lump_t lumps[HEADER_LUMPS]; +} dheader_t; + +typedef struct +{ + float mins[3], maxs[3]; + float origin[3]; // for sounds or lights + int headnode; + int firstface, numfaces; // submodels just draw faces + // without walking the bsp tree +} dmodel_t; + + +typedef struct +{ + float point[3]; +} dvertex_t; + + +// 0-2 are axial planes +#define PLANE_X 0 +#define PLANE_Y 1 +#define PLANE_Z 2 + +// 3-5 are non-axial planes snapped to the nearest +#define PLANE_ANYX 3 +#define PLANE_ANYY 4 +#define PLANE_ANYZ 5 + +// planes (x&~1) and (x&~1)+1 are allways opposites + +typedef struct +{ + float normal[3]; + float dist; + int type; // PLANE_X - PLANE_ANYZ ?remove? trivial to regenerate +} dplane_t; + + +// contents flags are seperate bits +// a given brush can contribute multiple content bits +// multiple brushes can be in a single leaf + +// these definitions also need to be in q_shared.h! + +// lower bits are stronger, and will eat weaker brushes completely +#define CONTENTS_SOLID 0x00000001 // an eye is never valid in a solid +#define CONTENTS_WINDOW 0x00000002 // translucent, but not watery +#define CONTENTS_PUSHPULL 0x00000004 +#define CONTENTS_LAVA 0x00000008 +#define CONTENTS_SLIME 0x00000010 +#define CONTENTS_WATER 0x00000020 +#define CONTENTS_MIST 0x00000040 // 64 +#define LAST_VISIBLE_CONTENTS 64 // this one worries me a bit JKH + +// remaining contents are non-visible, and don't eat brushes + +#define CONTENTS_AREAPORTAL 0x00008000 + +#define CONTENTS_PLAYERCLIP 0x00010000 +#define CONTENTS_MONSTERCLIP 0x00020000 + +// currents can be added to any other contents, and may be mixed +#define CONTENTS_CURRENT_0 0x00040000 +#define CONTENTS_CURRENT_90 0x00080000 +#define CONTENTS_CURRENT_180 0x00100000 +#define CONTENTS_CURRENT_270 0x00200000 +#define CONTENTS_CURRENT_UP 0x00400000 +#define CONTENTS_CURRENT_DOWN 0x00800000 + +#define CONTENTS_ORIGIN 0x01000000 // removed before bsping an entity + +#define CONTENTS_MONSTER 0x02000000 // should never be on a brush, only in game +#define CONTENTS_DEADMONSTER 0x04000000 +#define CONTENTS_DETAIL 0x08000000 // brushes to be added after vis leafs +#define CONTENTS_TRANSLUCENT 0x10000000 // auto set if any surface has trans +#define CONTENTS_LADDER 0x20000000 + + + +#define SURF_LIGHT 0x00000001 // value will hold the light strength + +#define SURF_SLICK 0x00000002 // effects game physics + +#define SURF_SKY 0x00000004 // don't draw, but add to skybox +#define SURF_WARP 0x00000008 // turbulent water warp +#define SURF_TRANS33 0x00000010 +#define SURF_TRANS66 0x00000020 +#define SURF_FLOWING 0x00000040 // scroll towards angle +#define SURF_NODRAW 0x00000080 // don't bother referencing the texture + +#define SURF_HINT 0x00000100 // make a primary bsp splitter +#define SURF_SKIP 0x00000200 // completely ignore, allowing non-closed brushes + +#define SURF_ALPHA_TEXTURE 0x00000800 // texture has alpha in it, and should show through in bsp process +#define SURF_ANIMSPEED 0x00001000 // value will hold the anim speed in fps + +#define SURF_UNDULATE 0x00002000 // rock surface up and down... +#define SURF_SKYREFLECT 0x00004000 // liquid will somewhat reflect the sky - not quite finished.... + +#define SURF_TYPE_GRAVEL 0x00000000 +#define SURF_TYPE_METAL 0x01000000 +#define SURF_TYPE_STONE 0x02000000 +#define SURF_TYPE_WOOD 0x03000000 +#define SURF_MATERIAL 0xFF000000 + + + +typedef struct +{ + int planenum; + int children[2]; // negative numbers are -(leafs+1), not nodes + short mins[3]; // for frustom culling + short maxs[3]; + unsigned short firstface; + unsigned short numfaces; // counting both sides +} dnode_t; + + +typedef struct texinfo_s +{ + float vecs[2][4]; // [s/t][xyz offset] + int flags; // miptex flags + overrides + int value; // light emission, etc + char texture[32]; // texture name (textures/*.wal) + int nexttexinfo; // for animations, -1 = end of chain +} texinfo_t; + + +// note that edge 0 is never used, because negative edge nums are used for +// counterclockwise use of the edge in a face +typedef struct +{ + unsigned short v[2]; // vertex numbers +} dedge_t; + +typedef struct +{ + int contents; // OR of all brushes (not needed?) + + short cluster; + short area; + + short mins[3]; // for frustum culling + short maxs[3]; + + unsigned short firstleafface; + unsigned short numleaffaces; + + unsigned short firstleafbrush; + unsigned short numleafbrushes; +} dleaf_t; + +typedef struct +{ + unsigned short planenum; // facing out of the leaf + short texinfo; +} dbrushside_t; + +typedef struct +{ + int firstside; + int numsides; + int contents; +} dbrush_t; + +#define ANGLE_UP -1 +#define ANGLE_DOWN -2 + + +// the visibility lump consists of a header with a count, then +// byte offsets for the PVS and PHS of each cluster, then the raw +// compressed bit vectors +#define DVIS_PVS 0 +#define DVIS_PHS 1 +typedef struct +{ + int numclusters; + int bitofs[8][2]; // bitofs[numclusters][2] +} dvis_t; + +// each area has a list of portals that lead into other areas +// when portals are closed, other areas may not be visible or +// hearable even if the vis info says that it should be +typedef struct +{ + int portalnum; + int otherarea; +} dareaportal_t; + + +typedef struct +{ + int numareaportals; + int firstareaportal; +} darea_t; + +typedef struct +{ + char *name; + int value; +} materialtype_t; + +enum +{ + MATERIAL_GRAVEL, + MATERIAL_METAL, + MATERIAL_STONE, + MATERIAL_WOOD, +}; + +materialtype_t *materialtypes; + +void QFile_ReadMaterialTypes(char* filename); + diff --git a/Source/Tools/SoFData/resource.h b/Source/Tools/SoFData/resource.h new file mode 100644 index 0000000..c3ccf08 --- /dev/null +++ b/Source/Tools/SoFData/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by Resource.rc +// +#define IDI_ICON1 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Source/Tools/SoFData/scriplib.c b/Source/Tools/SoFData/scriplib.c new file mode 100644 index 0000000..5e90b4a --- /dev/null +++ b/Source/Tools/SoFData/scriplib.c @@ -0,0 +1,275 @@ +// scriplib.c + +#include "cmdlib.h" +#include "scriplib.h" + +/* +============================================================================= + + PARSING STUFF + +============================================================================= +*/ + +typedef struct +{ + char filename[1024]; + char *buffer,*script_p,*end_p; + int line; +} script_t; + +#define MAX_INCLUDES 8 +script_t scriptstack[MAX_INCLUDES]; +script_t *script; +int scriptline; + +char token[MAXTOKEN]; +qboolean endofscript; +qboolean tokenready; // only true if UnGetScriptToken was just called + +/* +============== +AddScriptToStack +============== +*/ +void AddScriptToStack (char *filename) +{ + int size; + + script++; + if (script == &scriptstack[MAX_INCLUDES]) + Error ("script file exceeded MAX_INCLUDES"); + strcpy (script->filename, ExpandPath (filename) ); + + size = LoadFile (script->filename, (void **)&script->buffer); + + printf ("entering %s\n", script->filename); + + script->line = 1; + + script->script_p = script->buffer; + script->end_p = script->buffer + size; +} + + +/* +============== +LoadScriptFile +============== +*/ +void LoadScriptFile (char *filename) +{ + script = scriptstack; + AddScriptToStack (filename); + + endofscript = false; + tokenready = false; +} + + +/* +============== +ParseFromMemory +============== +*/ +void ParseFromMemory (char *buffer, int size) +{ + script = scriptstack; + script++; + if (script == &scriptstack[MAX_INCLUDES]) + Error ("script file exceeded MAX_INCLUDES"); + strcpy (script->filename, "memory buffer" ); + + script->buffer = buffer; + script->line = 1; + script->script_p = script->buffer; + script->end_p = script->buffer + size; + + endofscript = false; + tokenready = false; +} + + +/* +============== +UnGetScriptToken + +Signals that the current token was not used, and should be reported +for the next GetScriptToken. Note that + +GetScriptToken (true); +UnGetScriptToken (); +GetScriptToken (false); + +could cross a line boundary. +============== +*/ +void UnGetScriptToken (void) +{ + tokenready = true; +} + + +qboolean EndOfScript (qboolean crossline) +{ + if (!crossline) + Error ("Line %i is incomplete\n",scriptline); + + if (!strcmp (script->filename, "memory buffer")) + { + endofscript = true; + return false; + } + + free (script->buffer); + if (script == scriptstack+1) + { + endofscript = true; + return false; + } + script--; + scriptline = script->line; + printf ("returning to %s\n", script->filename); + return GetScriptToken (crossline); +} + +/* +============== +GetScriptToken +============== +*/ +qboolean GetScriptToken (qboolean crossline) +{ + char *token_p; + + if (tokenready) // is a token allready waiting? + { + tokenready = false; + return true; + } + + if (script->script_p >= script->end_p) + return EndOfScript (crossline); + +// +// skip space +// +skipspace: + while (*script->script_p <= 32) + { + if (script->script_p >= script->end_p) + return EndOfScript (crossline); + if (*script->script_p++ == '\n') + { + if (!crossline) + Error ("Line %i is incomplete\n",scriptline); + scriptline = script->line++; + } + } + + if (script->script_p >= script->end_p) + return EndOfScript (crossline); + + // ; # // comments + if (*script->script_p == ';' || *script->script_p == '#' + || ( script->script_p[0] == '/' && script->script_p[1] == '/') ) + { + if (!crossline) + Error ("Line %i is incomplete\n",scriptline); + while (*script->script_p++ != '\n') + if (script->script_p >= script->end_p) + return EndOfScript (crossline); + goto skipspace; + } + + // /* */ comments + if (script->script_p[0] == '/' && script->script_p[1] == '*') + { + if (!crossline) + Error ("Line %i is incomplete\n",scriptline); + script->script_p+=2; + while (script->script_p[0] != '*' && script->script_p[1] != '/') + { + script->script_p++; + if (script->script_p >= script->end_p) + return EndOfScript (crossline); + } + script->script_p += 2; + goto skipspace; + } + +// +// copy token +// + token_p = token; + + if (*script->script_p == '"') + { + // quoted token + script->script_p++; + while (*script->script_p != '"') + { + *token_p++ = *script->script_p++; + if (script->script_p == script->end_p) + break; + if (token_p == &token[MAXTOKEN]) + Error ("Token too large on line %i\n",scriptline); + } + script->script_p++; + } + else // regular token + while ( *script->script_p > 32 && *script->script_p != ';') + { + *token_p++ = *script->script_p++; + if (script->script_p == script->end_p) + break; + if (token_p == &token[MAXTOKEN]) + Error ("Token too large on line %i\n",scriptline); + } + + *token_p = 0; + + if (!strcmp (token, "$include")) + { + GetScriptToken (false); + AddScriptToStack (token); + return GetScriptToken (crossline); + } + + return true; +} + + +/* +============== +ScriptTokenAvailable + +Returns true if there is another token on the line +============== +*/ +qboolean ScriptTokenAvailable (void) +{ + char *search_p; + + search_p = script->script_p; + + if (search_p >= script->end_p) + return false; + + while ( *search_p <= 32) + { + if (*search_p == '\n') + return false; + search_p++; + if (search_p == script->end_p) + return false; + + } + + if (*search_p == ';') + return false; + + return true; +} + + diff --git a/Source/Tools/SoFData/scriplib.h b/Source/Tools/SoFData/scriplib.h new file mode 100644 index 0000000..a132e8a --- /dev/null +++ b/Source/Tools/SoFData/scriplib.h @@ -0,0 +1,23 @@ +// scriplib.h + +#ifndef __CMDLIB__ +#include "cmdlib.h" +#endif + +#define MAXTOKEN 1024 + +extern char token[MAXTOKEN]; +extern char *scriptbuffer,*script_p,*scriptend_p; +extern int grabbed; +extern int scriptline; +extern qboolean endofscript; + + +void LoadScriptFile (char *filename); +void ParseFromMemory (char *buffer, int size); + +qboolean GetScriptToken (qboolean crossline); +void UnGetScriptToken (void); +qboolean ScriptTokenAvailable (void); + + diff --git a/Source/Tools/SoFData/svdcmp.cpp b/Source/Tools/SoFData/svdcmp.cpp new file mode 100644 index 0000000..a629aa4 --- /dev/null +++ b/Source/Tools/SoFData/svdcmp.cpp @@ -0,0 +1,467 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; + +static double at,bt,ct; +#define PYTHAG(a,b) ((at=fabs(a)) > (bt=fabs(b)) ? \ + (ct=bt/at,at*sqrt(1.0+ct*ct)) : (bt ? (ct=at/bt,bt*sqrt(1.0+ct*ct)): 0.0)) + + static double maxarg1,maxarg2; +#define MAX(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1) > (maxarg2) ?\ + (maxarg1) : (maxarg2)) +#define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a)) + +void ntrerror(char *s) +{ + printf("%s\n",s); + DebugBreak(); + exit(1); +} + +double *allocVect(int sz) +{ + double *ret=new double[sz]; + ret--; + return ret; +} + +void freeVect(double *ret) +{ + ret++; + delete[] ret; +} + +double **allocMatrix(int r,int c) +{ + double **ret=new double *[r]; + int i; + for (i=0;i=1;i--) { + if (i < n) { + if (g) { + for (j=l;j<=n;j++) + v[j][i]=(a[i][j]/a[i][l])/g; + for (j=l;j<=n;j++) { + for (s=0.0,k=l;k<=n;k++) s += a[i][k]*v[k][j]; + for (k=l;k<=n;k++) v[k][j] += s*v[k][i]; + } + } + for (j=l;j<=n;j++) v[i][j]=v[j][i]=0.0; + } + v[i][i]=1.0; + g=rv1[i]; + l=i; + } + for (i=n;i>=1;i--) { + l=i+1; + g=w[i]; + if (i < n) + for (j=l;j<=n;j++) a[i][j]=0.0; + if (g) { + g=1.0/g; + if (i != n) { + for (j=l;j<=n;j++) { + for (s=0.0,k=l;k<=m;k++) s += a[k][i]*a[k][j]; + f=(s/a[i][i])*g; + for (k=i;k<=m;k++) a[k][j] += f*a[k][i]; + } + } + for (j=i;j<=m;j++) a[j][i] *= g; + } else { + for (j=i;j<=m;j++) a[j][i]=0.0; + } + ++a[i][i]; + } + for (k=n;k>=1;k--) { + for (its=1;its<=30;its++) { + flag=1; + for (l=k;l>=1;l--) { + nm=l-1; + if (fabs(rv1[l])+anorm == anorm) { + flag=0; + break; + } + if (fabs(w[nm])+anorm == anorm) break; + } + if (flag) { + c=0.0; + s=1.0; + for (i=l;i<=k;i++) { + f=s*rv1[i]; + if (fabs(f)+anorm != anorm) { + g=w[i]; + h=PYTHAG(f,g); + w[i]=h; + h=1.0/h; + c=g*h; + s=(-f*h); + for (j=1;j<=m;j++) { + y=a[j][nm]; + z=a[j][i]; + a[j][nm]=y*c+z*s; + a[j][i]=z*c-y*s; + } + } + } + } + z=w[k]; + if (l == k) { + if (z < 0.0) { + w[k] = -z; + for (j=1;j<=n;j++) v[j][k]=(-v[j][k]); + } + break; + } + if (its == 30) ntrerror("No convergence in 30 SVDCMP iterations"); + x=w[l]; + nm=k-1; + y=w[nm]; + g=rv1[nm]; + h=rv1[k]; + f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y); + g=PYTHAG(f,1.0); + f=((x-z)*(x+z)+h*((y/(f+SIGN(g,f)))-h))/x; + c=s=1.0; + for (j=l;j<=nm;j++) { + i=j+1; + g=rv1[i]; + y=w[i]; + h=s*g; + g=c*g; + z=PYTHAG(f,h); + rv1[j]=z; + c=f/z; + s=h/z; + f=x*c+g*s; + g=g*c-x*s; + h=y*s; + y=y*c; + for (jj=1;jj<=n;jj++) { + x=v[jj][j]; + z=v[jj][i]; + v[jj][j]=x*c+z*s; + v[jj][i]=z*c-x*s; + } + z=PYTHAG(f,h); + w[j]=z; + if (z) { + z=1.0/z; + c=f*z; + s=h*z; + } + f=(c*g)+(s*y); + x=(c*y)-(s*g); + for (jj=1;jj<=m;jj++) { + y=a[jj][j]; + z=a[jj][i]; + a[jj][j]=y*c+z*s; + a[jj][i]=z*c-y*s; + } + } + rv1[l]=0.0; + rv1[k]=f; + w[k]=x; + } + } + freeVect(rv1); +} + + + +void svbksb(double** u, double* w, double** v,int m, int n, double* b, double* x) +{ + int jj,j,i; + double s,*tmp; + tmp=allocVect(n); + for (j=1;j<=n;j++) + { + s=0.0; + if (w[j]) + { + for (i=1;i<=m;i++) + s += u[i][j]*b[i]; + s /= w[j]; + } + tmp[j]=s; + } + for (j=1;j<=n;j++) + { + s=0.0; + for (jj=1;jj<=n;jj++) + s += v[j][jj]*tmp[jj]; + x[j]=s; + } + freeVect(tmp); +} + +#undef SIGN +#undef MAX +#undef PYTHAG + + +#if 1 +void DOsvd(float *a,float *res,float *comp,float *values,int nframes,int framesize,int compressedsize) +{ + int *remap; + int i,j; + double **da=allocMatrix(framesize,nframes); + double **v=allocMatrix(nframes,nframes); + double *w=allocVect(nframes); + bool DOFerr = false; + for (i=0;imx) + { + mx=fabs(w[i+1]); + bestat=i; + } + } + + if(mx>0) + { + remap[bestat]=j; + } + else + { + DOFerr = true; + } + } + + if(DOFerr) + { + printf("Warning: To many degrees of freedom! File size may increase\n"); + + for (i=0;imx) + { + mx=fabs(w[i+1]); + bestat=i; + } + } + assert(mx>-.5f); + remap[bestat]=j; + } + // josh **DO NOT** put your dof>nframes mod here + for (i=0;i=3); + base[0]=pnts[0]; + base[1]=pnts[1]; + base[2]=pnts[2]; + for (i=1;i + +int numthreads = -1; +CRITICAL_SECTION crit; +static int enter; + +void ThreadSetDefault (void) +{ + SYSTEM_INFO info; + + if (numthreads == -1) // not set manually + { + GetSystemInfo (&info); + numthreads = info.dwNumberOfProcessors; + if (numthreads < 1 || numthreads > 32) + numthreads = 1; + } + + qprintf ("%i threads\n", numthreads); +} + + +void ThreadLock (void) +{ + if (!threaded) + return; + EnterCriticalSection (&crit); + if (enter) + Error ("Recursive ThreadLock\n"); + enter = 1; +} + +void ThreadUnlock (void) +{ + if (!threaded) + return; + if (!enter) + Error ("ThreadUnlock without lock\n"); + enter = 0; + LeaveCriticalSection (&crit); +} + +/* +============= +RunThreadsOn +============= +*/ +void RunThreadsOn (int workcnt, qboolean showpacifier, void(*func)(int)) +{ + int threadid[MAX_THREADS]; + HANDLE threadhandle[MAX_THREADS]; + int i; + int start, end; + + start = I_FloatTime (); + dispatch = 0; + workcount = workcnt; + oldf = -1; + pacifier = showpacifier; + + + // + // run threads in parallel + // + InitializeCriticalSection (&crit); + + if (numthreads == 1) + { // use same thread + threaded = false; + func (0); + } + else + { + threaded = true; + for (i=0 ; i + +pthread_mutex_t *my_mutex; + +void ThreadLock (void) +{ + if (my_mutex) + pthread_mutex_lock (my_mutex); +} + +void ThreadUnlock (void) +{ + if (my_mutex) + pthread_mutex_unlock (my_mutex); +} + + +/* +============= +RunThreadsOn +============= +*/ +void RunThreadsOn (int workcnt, qboolean showpacifier, void(*func)(int)) +{ + int i; + pthread_t work_threads[MAX_THREADS]; + pthread_addr_t status; + pthread_attr_t attrib; + pthread_mutexattr_t mattrib; + int start, end; + + start = I_FloatTime (); + dispatch = 0; + workcount = workcnt; + oldf = -1; + pacifier = showpacifier; + threaded = true; + + if (pacifier) + setbuf (stdout, NULL); + + if (!my_mutex) + { + my_mutex = malloc (sizeof(*my_mutex)); + if (pthread_mutexattr_create (&mattrib) == -1) + Error ("pthread_mutex_attr_create failed"); + if (pthread_mutexattr_setkind_np (&mattrib, MUTEX_FAST_NP) == -1) + Error ("pthread_mutexattr_setkind_np failed"); + if (pthread_mutex_init (my_mutex, mattrib) == -1) + Error ("pthread_mutex_init failed"); + } + + if (pthread_attr_create (&attrib) == -1) + Error ("pthread_attr_create failed"); + if (pthread_attr_setstacksize (&attrib, 0x100000) == -1) + Error ("pthread_attr_setstacksize failed"); + + for (i=0 ; i +#include +#include +#include + + +int numthreads = -1; +abilock_t lck; + +void ThreadSetDefault (void) +{ + if (numthreads == -1) + numthreads = prctl(PR_MAXPPROCS); + printf ("%i threads\n", numthreads); +//@@ + usconfig (CONF_INITUSERS, numthreads); +} + + +void ThreadLock (void) +{ + spin_lock (&lck); +} + +void ThreadUnlock (void) +{ + release_lock (&lck); +} + + +/* +============= +RunThreadsOn +============= +*/ +void RunThreadsOn (int workcnt, qboolean showpacifier, void(*func)(int)) +{ + int i; + int pid[MAX_THREADS]; + int start, end; + + start = I_FloatTime (); + dispatch = 0; + workcount = workcnt; + oldf = -1; + pacifier = showpacifier; + threaded = true; + + if (pacifier) + setbuf (stdout, NULL); + + init_lock (&lck); + + for (i=0 ; ix / xcharsize) + ((coord->y / ycharsize) * outinf.cw); + + for (y = 0; y < coord->ch; y++, mapitem += outinf.cw - coord->cw) + { + for (x = 0; x < coord->cw; x++) + { + if (entry |= *mapitem++ & 8) + { + return(entry); + } + } + } + return(entry); +} + +void SetMap(Coords *coord) +{ + int x, y; + byte *mapitem; + + mapitem = map + (coord->x / xcharsize) + ((coord->y / ycharsize) * outinf.cw); + + for (y = 0; y < coord->ch; y++, mapitem += outinf.cw - coord->cw) + for (x = 0; x < coord->cw; x++) + *mapitem++ |= 8; +} + +////////////////////////////////////////////////// +// Setting the pixel based usage map // +////////////////////////////////////////////////// + +void CheckOverlap(Coords *coord) +{ + int x; + int y; + long *dest; + + x = coord->x; + y = coord->y; + + dest = (long *)(usagemap + x + (y * outinf.w)); + + for (y = 0; y < coord->h; y++, dest += outinf.w - coord->w) + { + for (x = 0; x < coord->w; x++) + { + if (*dest++) + { + overlap++; + return; + } + } + } +} + +void SetUsageMap(Coords *coord) +{ + int x; + int y; + long *dest; + + x = coord->x; + y = coord->y; + + dest = (long *)(usagemap + x + (y * outinf.w)); + + for (y = 0; y < coord->h; y++, dest += outinf.w - coord->w) + { + for (x = 0; x < coord->w; x++) + { + *dest++ = coord->col; + } + } +} + +////////////////////////////////////////////////// +// Flips the BMP image to the correct way up // +////////////////////////////////////////////////// + +void CopyLine(byte *dest, byte *src, int size) +{ + int x; + + for (x = 0; x < size; x++) + *dest++ = *src++; +} + +/****************************************************/ +/* Printing headers etc */ +/****************************************************/ + +void RemoveLeading(char *name) +{ + int i; + char temp[128]; + + for(i = strlen(name) - 1; i > 0; i--) + { + if((name[i] == '\\') || (name[i] == '/')) + { + strcpy(temp, name + i + 1); + strcpy(name, temp); + return; + } + } +} + +void RemoveExt(char *name) +{ + while ((*name != '.') && *name) + name++; + *name = 0; +} + +/****************************************************/ +/* Misc calcualtions */ +/****************************************************/ + +int TotalArea() +{ + int i; + int total = 0; + + for (i = 0; i < (filenum + 2); i++) + total += in[i].w * in[i].h; + + return(total); +} + +/****************************************************/ +/* Setup and checking of all info */ +/****************************************************/ + +void InitVars() +{ + filenum = 0; + valid = 0; + dosort = 0; + missed = 0; + overlap = 0; + nobaseline = 0; + + memset(outscript, 0, sizeof(outscript)); + memset(outscript, 0, sizeof(sourcedir)); + memset(outscript, 0, sizeof(outusage)); + memset(outscript, 0, sizeof(root)); + + memset(in, 0, sizeof(in)); + memset(&outinf, 0, sizeof(outinf)); +} +void Cleanup() +{ + if (pixels) + free(pixels); + if (usagemap) + free(usagemap); + if (outpixels) + free(outpixels); + if (bmptemp) + free(bmptemp); + if (map) + free(map); +} + +typedef struct glxy_s +{ + float xl, yt, xr, yb; + int w, h, baseline; +} glxy_t; + +int SaveScript(char *name) +{ + FILE *fp; + int i, j; + glxy_t buff; + + if(fp = fopen(name, "wb")) + { + for (j = 0; j < filenum; j++) + { + for (i = 0; i < filenum; i++) + { + if (in[i].index == j) + { + if (in[i].depth) + { + buff.xl = (float)in[i].x / (float)outinf.w; + buff.yt = (float)in[i].y / (float)outinf.h; + buff.xr = ((float)in[i].w + (float)in[i].x) / (float)outinf.w; + buff.yb = ((float)in[i].h + (float)in[i].y) / (float)outinf.h; + buff.w = in[i].w; + buff.h = in[i].h; + buff.baseline = in[i].baseline; + } + else + { + memset(&buff, 0, sizeof(glxy_t)); + } + fwrite(&buff, 1, sizeof(glxy_t), fp); + i = filenum; + } + } + } + fclose(fp); + return(true); + } + else + return(false); +} + +int GetScriptInfo(char *name) +{ + FILE *fp; + char buffer[256]; + char tempbuff[256]; + char delims[] = {" \t,\n"}; + + printf("Opening script file %s.\n", name); + + if (fp = fopen(name, "r")) + { + while(fgets(buffer, 256, fp)) + { + if (strncmp(buffer, "//", 2) && strncmp(buffer, "\n", 1)) + { + strupr(buffer); + strcpy(tempbuff, buffer); + if (strcmp(strtok(tempbuff, delims), "OUTPUT") == 0) + { + strcpy(outinf.name, strtok(NULL, delims)); + strlwr(outinf.name); + } + + strcpy(tempbuff, buffer); + if (strcmp(strtok(tempbuff, delims), "SOURCEDIR") == 0) + { + strcpy(tempbuff, strtok(NULL, delims)); + strcpy(sourcedir, ExpandPathAndArchive(tempbuff)); + } + + strcpy(tempbuff, buffer); + if (strcmp(strtok(tempbuff, delims), "DOSORT") == 0) + dosort = 1; + + strcpy(tempbuff, buffer); + if (strcmp(strtok(tempbuff, delims), "XCHARSIZE") == 0) + xcharsize = strtol(strtok(NULL, delims), NULL, 0); + + strcpy(tempbuff, buffer); + if (strcmp(strtok(tempbuff, delims), "YCHARSIZE") == 0) + ycharsize = strtol(strtok(NULL, delims), NULL, 0); + + strcpy(tempbuff, buffer); + if (strcmp(strtok(tempbuff, delims), "OUTSCRIPT") == 0) + { + strcpy(outscript, strtok(NULL, delims)); + strlwr(outscript); + } + + strcpy(tempbuff, buffer); + if (strcmp(strtok(tempbuff, delims), "OUTUSAGE") == 0) + strcpy(outusage, strtok(NULL, delims)); + + strcpy(tempbuff, buffer); + if (strcmp(strtok(tempbuff, delims), "POS") == 0) + { + outinf.w = strtol(strtok(NULL, delims), NULL, 0); + outinf.h = strtol(strtok(NULL, delims), NULL, 0); + } + + strcpy(tempbuff, buffer); + if (strcmp(strtok(tempbuff, delims), "FILE") == 0) + { + strcpy(in[filenum].name, strtok(NULL, delims)); + in[filenum].x = strtol(strtok(NULL, delims), NULL, 0); + in[filenum].y = strtol(strtok(NULL, delims), NULL, 0); + in[filenum].col = strtol(strtok(NULL, delims), NULL, 0); + filenum++; + } + } + } + fclose(fp); + return(true); + } + else + { + printf("ERROR : Could not open script file.\n"); + return(false); + } +} + +int CheckVars() +{ + int i; + + if (outinf.name[0] == 0) + { + printf("ERROR : No output name specified.\n"); + return(false); + } + if ((outinf.w <= 0) || (outinf.h <= 0)) + { + printf("ERROR : Invalid VRAM coordinates.\n"); + return(false); + } + if (filenum == 0) + { + printf("ERROR : No input files specified.\n"); + return(false); + } + for (i = 0; i < filenum; i++) + if (in[i].name[0] == 0) + { + printf("ERROR : Input filename invalid.\n"); + return(false); + } + return(true); +} + +// Makes sure texture is totally within the output area + +int CheckCoords(Coords *coord) +{ + if ((coord->x + coord->w) > outinf.w) + return(false); + if ((coord->y + coord->h) > outinf.h) + return(false); + + return(true); +} +// Gets the width, height, palette width and palette height of each BMP file + +int GetFileDimensions() +{ + int i; + int width, height; + char name[128]; + + for (i = 0; i < filenum; i++) + { + in[i].index = i; + + strcpy(name, sourcedir); + strcat(name, in[i].name); + printf("Getting file dimensions, file : %s \r", in[i].name); + if(FileExists(name)) + { + LoadAnyImage(name, NULL, &width, &height); + in[i].depth = 32; + in[i].rw = width; + in[i].w = width; // makes it width in + in[i].h = height; + in[i].cw = (in[i].w + (xcharsize - 1)) / xcharsize; + in[i].ch = (in[i].h + (ycharsize - 1)) / ycharsize; + + if (!CheckCoords(&in[i]) && (in[i].x >= 0)) + { + printf("Error : texture %s outinf of bounds.\n", in[i].name); + return(false); + } + valid++; + } + else + { + in[i].depth = 0; + in[i].x = -1; + in[i].y = -1; + in[i].w = 0; + in[i].h = 0; + } + } + printf("\n\n"); + return(true); +} + +// Sorts files into order for optimal space finding +// Fixed position ones first, followed by the others in descending size +// The theory being that it is easier to find space for smaller textures. +// size = (width + height) +// For space finding it is easier to place a 32x32 than a 128x2 + +#define WEIGHT 0x8000 + +void Swap(Coords *a, Coords *b) +{ + Coords c; + + c = *a; + *a = *b; + *b = c; +} + +void SortInNames() +{ + int i, j; + int largest, largcount; + int size; + + printf("Sorting filenames by size.\n\n"); + + for (j = 0; j < filenum; j++) + { + largest = -1; + largcount = -1; + + for (i = j; i < filenum; i++) + { + if (in[i].depth) + { + size = in[i].w + in[i].h; + + if ((in[i].x < 0) && (size > largest)) + { + largcount = i; + largest = size; + } + } + } + if ((largcount >= 0) && (largcount != j)) + Swap(&in[j], &in[largcount]); + } +} + +int SetVars(char *name) +{ + if (!GetScriptInfo(name)) + return(false); + + if (!CheckVars()) + return(false); + + destsize = outinf.w * outinf.h; + + outinf.cw = outinf.w / xcharsize; + outinf.ch = outinf.h / ycharsize; + + if ((usagemap = (long *)SafeMalloc(destsize * 4, "")) == NULL) + return(false); + if ((outpixels = (long *)SafeMalloc(destsize * 4, "")) == NULL) + return(false); + if ((bmptemp = (void *)SafeMalloc(destsize * 4, "")) == NULL) + return(false); + if ((map = (byte *)SafeMalloc(destsize / (xcharsize * ycharsize), "")) == NULL) + return(false); + + if (GetFileDimensions() == false) + return(false); + + if (dosort) + SortInNames(); + + return(true); +} +/****************************************************/ +/* Actual copying routines */ +/****************************************************/ + +int FindCoords(Coords *coord) +{ + int tx, ty; + + if (coord->x >= 0) + { + SetMap(coord); + return(true); + } + else + { + for (ty = 0; ty < outinf.ch; ty++) + { + for (tx = 0; tx < outinf.cw; tx++) + { + coord->x = (tx * xcharsize); + coord->y = (ty * ycharsize); + + if (CheckCoords(coord) && !TryPlace(coord)) + { + SetMap(coord); + return(true); + } + } + } + } + coord->x = -1; + coord->y = -1; + + return(false); +} + +void CheckBaseline(int i) +{ + int y; + long *pix; + + in[i].baseline = -1; + pix = (long *)pixels; + + for(y = 0; y < in[i].h; y++, pix += in[i].w) + { + if((*pix & 0x00ffffff) == 0x00ff00ff) + { + in[i].baseline = y; + break; + } + } + pix = (long *)pixels; + for(y = 0; y < in[i].w * in[i].h; y++, pix++) + { + if((*pix & 0x00ffffff) == 0x00ff00ff) + { + *pix = 0; + } + } + + if(in[i].baseline == -1) + { + printf("\nERROR : %s has no baseline\n", in[i].name); + nobaseline++; + } +} + +void CopyToMain32(Coords *coord) +{ + int x; + int y; + long *source; + long *dest; + + x = coord->x; + y = coord->y; + + source = (long *)pixels; + dest = (long *)(outpixels + x + (y * outinf.w)); + + for (y = 0; y < coord->h; y++, dest += outinf.w - coord->w) + { + for (x = 0; x < coord->w; x++) + { + *dest++ = *source++; + } + } +} + +void CreateMain() +{ + int i, count; + int width, height; + char name[128]; + + for (i = 0, count = 0; i < filenum; i++) + { + if (in[i].depth) + { + printf("\rProcessing %d of %d (%d missed, %d overlapping, %d nobase)\r", count + 1, valid, missed, overlap, nobaseline); + count++; + if (!FindCoords(&in[i])) + missed++; + else + { + strcpy(name, sourcedir); + strcat(name, in[i].name); + LoadAnyImage(name, (unsigned int **)&pixels, &width, &height); + CheckBaseline(i); + CheckOverlap(&in[i]); + CopyToMain32(&in[i]); + SetUsageMap(&in[i]); + } + } + } +} + +void Cmd_TextureMix() +{ + miptex32_t *qtex32; + char filename[1024]; + int size; + + InitVars(); + + GetScriptToken (false); + + strcpy(root, token); + RemoveExt(root); + RemoveLeading(root); + + strcpy(filename, ExpandPathAndArchive(token)); + if (SetVars(filename)) + { + // Create combined texture + percent = ((TotalArea() * 100) / (outinf.w * outinf.h)); + printf("Total area consumed : %d%%\n", percent); + printf("Texture resolution : %dx%d pixels.\n", xcharsize, ycharsize); + CreateMain(); + + // Save image as m32 + sprintf (filename, "%s/%s/%s.m32", out_dir, tmix_prefix, outinf.name); + qtex32 = CreateMip32((unsigned long *)outpixels, outinf.w, outinf.h, &size, false); + + qtex32->contents = 0; + qtex32->flags2 = MIP32_NOMIP_FLAG2; + qtex32->value = 0; + qtex32->scale_x = 1.0; + qtex32->scale_y = 1.0; + sprintf (qtex32->name, "%s/%s.m32", tmix_prefix, outinf.name); + + printf ("\n\nwriting %s\n", filename); + SaveFile (filename, (byte *)qtex32, size); + free (qtex32); + + // Save outinf script file + sprintf (filename, "%s/%s/%s.fnt", out_dir, tmix_prefix, outscript); + printf("Writing %s as script file\n", filename); + if (!SaveScript(filename)) + { + printf("Unable to save output script.\n"); + } + } + printf("Everythings groovy.\n"); + Cleanup(); +} + +/* +=============== +Cmd_TMixdir +=============== +*/ +void Cmd_TMixdir (void) +{ + char filename[1024]; + + GetScriptToken (false); + strcpy (tmix_prefix, token); + // create the directory if needed + sprintf (filename, "%s", g_outputDir); + Q_mkdir (filename); + strcpy(out_dir, filename); + sprintf (filename, "%s%s", g_outputDir, tmix_prefix); + Q_mkdir (filename); +} + +// end + diff --git a/Source/Tools/SoFData/token.c b/Source/Tools/SoFData/token.c new file mode 100644 index 0000000..d2a9ccb --- /dev/null +++ b/Source/Tools/SoFData/token.c @@ -0,0 +1,528 @@ + +//************************************************************************** +//** +//** token.c +//** +//************************************************************************** + +// HEADER FILES ------------------------------------------------------------ + +#include "token.h" + +// MACROS ------------------------------------------------------------------ + +// TYPES ------------------------------------------------------------------- + +typedef enum +{ + CHR_EOF, + CHR_LETTER, + CHR_NUMBER, + CHR_QUOTE, + CHR_SPECIAL +} chr_t; + +// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- + +// PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- + +// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- + +static void ProcessLetterToken(void); +static void ProcessNumberToken(void); +static void ProcessQuoteToken(void); +static void ProcessSpecialToken(void); +static qboolean CheckForKeyword(void); +static void NextChr(void); + +// EXTERNAL DATA DECLARATIONS ---------------------------------------------- + +// PUBLIC DATA DEFINITIONS ------------------------------------------------- + +tokenType_t tk_Token; +int tk_Line; +int tk_IntNumber; +float tk_FloatNumber; +char *tk_String; +char tk_SourceName[MAX_FILE_NAME_LENGTH]; + +// PRIVATE DATA DEFINITIONS ------------------------------------------------ + +static char Chr; +static char *FileStart; +static char *FilePtr; +static char *FileEnd; +static qboolean SourceOpen; +static char ASCIIToChrCode[256]; +static char TokenStringBuffer[MAX_QUOTED_LENGTH]; +static qboolean IncLineNumber; +static char TempBuffer[2048]; + +static struct +{ + char *name; + tokenType_t token; +} Keywords[] = +{ + "model", TK_MODEL, + "mesh", TK_MESH, + "vertices", TK_VERTICES, + "edges", TK_EDGES, + "position", TK_POSITION, + "polygons", TK_POLYGONS, + "nodes", TK_NODES, + "rotation", TK_ROTATION, + "scaling", TK_SCALING, + "translation", TK_TRANSLATION, + "vertex", TK_VERTEX, + "HRCH", TK_HRCH, + "Softimage", TK_SOFTIMAGE, + "material", TK_MATERIAL, + "spline", TK_SPLINE, + + "Named", TK_C_NAMED, + "object", TK_OBJECT, + "Tri", TK_C_TRI, + "Vertices", TK_C_VERTICES, + "Faces", TK_C_FACES, + "Vertex", TK_C_VERTEX, + "list", TK_LIST, + "Face", TK_C_FACE, + + "Hexen", TK_C_HEXEN, + "Triangles", TK_C_TRIANGLES, + "Version", TK_C_VERSION, + "faces", TK_FACES, + "face", TK_FACE, + "origin", TK_ORIGIN, + + "DK_clusters", TK_CLUSTERS, + "DK_cluster_ncvs", TK_NUM_CLUSTER_VERTICES, + "name", TK_NAME, + "DK_cluster_name", TK_CLUSTER_NAME, + "DK_cluster_state", TK_CLUSTER_STATE, + + "actor_data", TK_ACTOR_DATA, + "uvTexture", TK_UVTEXTURE, + + NULL, -1 +}; + +static char *TokenNames[] = +{ + "", + "", + "", + "", + "", + "", + "", + "(", + ")", + "{", + "}", + "[", + "]", + ":", + "mesh", + "model", + "nodes", + "rotation", + "scaling", + "translation", + "polygons", + "position", + "vertex", + "vertices", + "HRCH", + "Softimage" +}; + +// CODE -------------------------------------------------------------------- + +//========================================================================== +// +// TK_Init +// +//========================================================================== + +void TK_Init(void) +{ + int i; + + for(i = 0; i < 256; i++) + { + ASCIIToChrCode[i] = CHR_SPECIAL; + } + for(i = '0'; i <= '9'; i++) + { + ASCIIToChrCode[i] = CHR_NUMBER; + } + for(i = 'A'; i <= 'Z'; i++) + { + ASCIIToChrCode[i] = CHR_LETTER; + } + for(i = 'a'; i <= 'z'; i++) + { + ASCIIToChrCode[i] = CHR_LETTER; + } + ASCIIToChrCode[ASCII_QUOTE] = CHR_QUOTE; + ASCIIToChrCode[ASCII_UNDERSCORE] = CHR_LETTER; + ASCIIToChrCode[EOF_CHARACTER] = CHR_EOF; + tk_String = TokenStringBuffer; + IncLineNumber = FALSE; + SourceOpen = FALSE; +} + +//========================================================================== +// +// TK_OpenSource +// +//========================================================================== + +void TK_OpenSource(char *fileName) +{ + int size; + + TK_CloseSource(); + size = LoadFile(fileName, (void **)&FileStart); + strcpy(tk_SourceName, fileName); + SourceOpen = TRUE; + FileEnd = FileStart+size; + FilePtr = FileStart; + tk_Line = 1; + tk_Token = TK_NONE; + NextChr(); +} + +//========================================================================== +// +// TK_CloseSource +// +//========================================================================== + +void TK_CloseSource(void) +{ + if(SourceOpen) + { + free(FileStart); + SourceOpen = FALSE; + } +} + +//========================================================================== +// +// TK_Fetch +// +//========================================================================== + +tokenType_t TK_Fetch(void) +{ + while(Chr == ASCII_SPACE) + { + NextChr(); + } + if(Chr == '-') + { + ProcessNumberToken(); + } + else switch(ASCIIToChrCode[(byte)Chr]) + { + case CHR_EOF: + tk_Token = TK_EOF; + break; + case CHR_LETTER: + ProcessLetterToken(); + break; + case CHR_NUMBER: + ProcessNumberToken(); + break; + case CHR_QUOTE: + ProcessQuoteToken(); + break; + default: + ProcessSpecialToken(); + break; + } + return tk_Token; +} + +//========================================================================== +// +// TK_Require +// +//========================================================================== + +void TK_Require(tokenType_t tokType) +{ + if(tokType == TK_FLOATNUMBER && tk_Token == TK_INTNUMBER) + { + tk_FloatNumber = (float)tk_IntNumber; + tk_Token = TK_FLOATNUMBER; + return; + } + if(tk_Token != tokType) + { + Error("File '%s', line %d:\nExpected '%s', found '%s'.\n", + tk_SourceName, tk_Line, TokenNames[tokType], + TokenNames[tk_Token]); + } +} + +void TK_FetchRequire(tokenType_t tokType) +{ + TK_Fetch(); + TK_Require(tokType); +} + +tokenType_t TK_RequireFetch(tokenType_t tokType) +{ + TK_Require(tokType); + return TK_Fetch(); +} + +tokenType_t TK_FetchRequireFetch(tokenType_t tokType) +{ + TK_Fetch(); + TK_Require(tokType); + return TK_Fetch(); +} + +tokenType_t TK_Beyond(tokenType_t tokType) +{ + while(tk_Token != tokType) + { + if(TK_Fetch() == TK_EOF) + { + Error("File '%s':\nCould not find token '%s'.\n", // FIXME: TokenNames table not big enuff + tk_SourceName, TokenNames[tokType]); + } + } + return TK_Fetch(); +} + +void TK_BeyondRequire(tokenType_t bTok, tokenType_t rTok) +{ + TK_Beyond(bTok); + TK_Require(rTok); +} + +tokenType_t TK_Search(tokenType_t tokType) +{ + while(tk_Token != tokType) + { + if(TK_Fetch() == TK_EOF) + { + return TK_EOF; + } + } + return TK_Fetch(); +} + +tokenType_t TK_Get(tokenType_t tokType) +{ + while(tk_Token != tokType) + { + if(TK_Fetch() == TK_EOF) + { + Error("File '%s':\nCould not find token '%s'.\n", + tk_SourceName, TokenNames[tokType]); + } + } + return tk_Token; +} + +//========================================================================== +// +// ProcessLetterToken +// +//========================================================================== + +static void ProcessLetterToken(void) +{ + int i; + char *text; + + i = 0; + text = TokenStringBuffer; + while(ASCIIToChrCode[(byte)Chr] == CHR_LETTER + || ASCIIToChrCode[(byte)Chr] == CHR_NUMBER) + { + if(++i == MAX_IDENTIFIER_LENGTH) + { + Error("File '%s', line %d:\nIdentifier too long.\n", + tk_SourceName, tk_Line); + } + *text++ = Chr; + NextChr(); + } + *text = 0; + if(CheckForKeyword() == FALSE) + { + tk_Token = TK_IDENTIFIER; + } +} + +//========================================================================== +// +// CheckForKeyword +// +//========================================================================== + +static qboolean CheckForKeyword(void) +{ + int i; + + for(i = 0; Keywords[i].name != NULL; i++) + { + if(strcmp(tk_String, Keywords[i].name) == 0) + { + tk_Token = Keywords[i].token; + return TRUE; + } + } + return FALSE; +} + +//========================================================================== +// +// ProcessNumberToken +// +//========================================================================== + +static void ProcessNumberToken(void) +{ + char *buffer; + + buffer = TempBuffer; + *buffer++ = Chr; + NextChr(); + while(ASCIIToChrCode[(byte)Chr] == CHR_NUMBER) + { + *buffer++ = Chr; + NextChr(); + } + if(Chr == '.') + { // Float + *buffer++ = Chr; + NextChr(); // Skip period + while(ASCIIToChrCode[(byte)Chr] == CHR_NUMBER) + { + *buffer++ = Chr; + NextChr(); + } + *buffer = 0; + tk_FloatNumber = (float)atof(TempBuffer); + tk_Token = TK_FLOATNUMBER; + return; + } + + // Integer + *buffer = 0; + tk_IntNumber = atoi(TempBuffer); + tk_Token = TK_INTNUMBER; +} + +//========================================================================== +// +// ProcessQuoteToken +// +//========================================================================== + +static void ProcessQuoteToken(void) +{ + int i; + char *text; + + i = 0; + text = TokenStringBuffer; + NextChr(); + while(Chr != ASCII_QUOTE) + { + if(Chr == EOF_CHARACTER) + { + Error("File '%s', line %d:\n inside string.\n", + tk_SourceName, tk_Line); + } + if(++i > MAX_QUOTED_LENGTH-1) + { + Error("File '%s', line %d:\nString literal too long.\n", + tk_SourceName, tk_Line); + } + *text++ = Chr; + NextChr(); + } + *text = 0; + NextChr(); + tk_Token = TK_STRING; +} + +//========================================================================== +// +// ProcessSpecialToken +// +//========================================================================== + +static void ProcessSpecialToken(void) +{ + char c; + + c = Chr; + NextChr(); + switch(c) + { + case '(': + tk_Token = TK_LPAREN; + break; + case ')': + tk_Token = TK_RPAREN; + break; + case '{': + tk_Token = TK_LBRACE; + break; + case '}': + tk_Token = TK_RBRACE; + break; + case '[': + tk_Token = TK_LBRACKET; + break; + case ']': + tk_Token = TK_RBRACKET; + break; + case ':': + tk_Token = TK_COLON; + break; + default: + tk_Token = TK_UNKNOWNCHAR; + break; + } +} + +//========================================================================== +// +// NextChr +// +//========================================================================== + +static void NextChr(void) +{ + if(FilePtr >= FileEnd) + { + Chr = EOF_CHARACTER; + return; + } + if(IncLineNumber == TRUE) + { + tk_Line++; + IncLineNumber = FALSE; + } + Chr = *FilePtr++; + if(Chr < ASCII_SPACE) + { + if(Chr == '\n') + { + IncLineNumber = TRUE; + } + Chr = ASCII_SPACE; + } +} diff --git a/Source/Tools/SoFData/token.h b/Source/Tools/SoFData/token.h new file mode 100644 index 0000000..ff32aea --- /dev/null +++ b/Source/Tools/SoFData/token.h @@ -0,0 +1,111 @@ + +//************************************************************************** +//** +//** token.h +//** +//************************************************************************** + +#ifndef __TOKEN_H__ +#define __TOKEN_H__ + +#include "cmdlib.h" + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef YES +#define YES 1 +#endif +#ifndef NO +#define NO 0 +#endif +#define ASCII_SPACE 32 +#define ASCII_QUOTE 34 +#define ASCII_UNDERSCORE 95 +#define EOF_CHARACTER 127 +#define MAX_IDENTIFIER_LENGTH 64 +#define MAX_QUOTED_LENGTH 1024 +#define MAX_FILE_NAME_LENGTH 1024 + +typedef enum +{ + TK_NONE, + TK_UNKNOWNCHAR, + TK_EOF, + TK_IDENTIFIER, // VALUE: (char *) tk_String + TK_STRING, // VALUE: (char *) tk_String + TK_INTNUMBER, // VALUE: (int) tk_IntNumber + TK_FLOATNUMBER, // VALUE: (float) tk_FloatNumber + TK_LPAREN, + TK_RPAREN, + TK_LBRACE, + TK_RBRACE, // 10 + TK_LBRACKET, + TK_RBRACKET, + TK_COLON, + TK_MESH, + TK_MODEL, // 15 + TK_NODES, + TK_ROTATION, + TK_SCALING, + TK_TRANSLATION, + TK_POLYGONS, // 20 + TK_POSITION, + TK_VERTEX, + TK_VERTICES, + TK_EDGES, + TK_HRCH, // 25 + TK_SOFTIMAGE, + TK_MATERIAL, + TK_SPLINE, // 28 + + TK_C_NAMED, + TK_OBJECT, // 30 + TK_C_TRI, + TK_C_VERTICES, + TK_C_FACES, + TK_C_VERTEX, + TK_LIST, // 35 + TK_C_FACE, + + TK_C_HEXEN, + TK_C_TRIANGLES, + TK_C_VERSION, + TK_FACES, // 40 + TK_FACE, + TK_ORIGIN, + + TK_CLUSTERS, + TK_NUM_CLUSTER_VERTICES, + TK_NAME, // 45 + TK_CLUSTER_NAME, + TK_CLUSTER_STATE, + + TK_ACTOR_DATA, + TK_UVTEXTURE, +} tokenType_t; + +void TK_Init(void); +void TK_OpenSource(char *fileName); +void TK_CloseSource(void); +tokenType_t TK_Fetch(void); +void TK_Require(tokenType_t tokType); +void TK_FetchRequire(tokenType_t tokType); +tokenType_t TK_RequireFetch(tokenType_t tokType); +tokenType_t TK_FetchRequireFetch(tokenType_t tokType); +tokenType_t TK_Beyond(tokenType_t tokType); +void TK_BeyondRequire(tokenType_t bTok, tokenType_t rTok); +tokenType_t TK_Search(tokenType_t tokType); +tokenType_t TK_Get(tokenType_t tokType); + +extern tokenType_t tk_Token; +extern int tk_Line; +extern int tk_IntNumber; +extern float tk_FloatNumber; +extern char *tk_String; +extern char tk_SourceName[MAX_FILE_NAME_LENGTH]; + +#endif